@famir/http-tools 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +4 -0
  2. package/dist/body.d.ts +28 -0
  3. package/dist/body.js +127 -0
  4. package/dist/body.js.map +1 -0
  5. package/dist/cheerio.d.ts +4 -0
  6. package/dist/cheerio.js +5 -0
  7. package/dist/cheerio.js.map +1 -0
  8. package/dist/content-type.d.ts +9 -0
  9. package/dist/content-type.js +17 -0
  10. package/dist/content-type.js.map +1 -0
  11. package/dist/cookies.d.ts +17 -0
  12. package/dist/cookies.js +97 -0
  13. package/dist/cookies.js.map +1 -0
  14. package/dist/headers.d.ts +37 -0
  15. package/dist/headers.js +196 -0
  16. package/dist/headers.js.map +1 -0
  17. package/dist/index.d.ts +14 -0
  18. package/dist/index.js +15 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/isbot.d.ts +1 -0
  21. package/dist/isbot.js +2 -0
  22. package/dist/isbot.js.map +1 -0
  23. package/dist/method.d.ts +12 -0
  24. package/dist/method.js +29 -0
  25. package/dist/method.js.map +1 -0
  26. package/dist/misc.d.ts +5 -0
  27. package/dist/misc.js +2 -0
  28. package/dist/misc.js.map +1 -0
  29. package/dist/query-string.d.ts +6 -0
  30. package/dist/query-string.js +8 -0
  31. package/dist/query-string.js.map +1 -0
  32. package/dist/rewrite-url.d.ts +8 -0
  33. package/dist/rewrite-url.js +23 -0
  34. package/dist/rewrite-url.js.map +1 -0
  35. package/dist/status.d.ts +19 -0
  36. package/dist/status.js +60 -0
  37. package/dist/status.js.map +1 -0
  38. package/dist/transforms.d.ts +8 -0
  39. package/dist/transforms.js +25 -0
  40. package/dist/transforms.js.map +1 -0
  41. package/dist/ua-parser.d.ts +1 -0
  42. package/dist/ua-parser.js +2 -0
  43. package/dist/ua-parser.js.map +1 -0
  44. package/dist/url.d.ts +37 -0
  45. package/dist/url.js +158 -0
  46. package/dist/url.js.map +1 -0
  47. package/package.json +50 -0
package/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # @famir/http-tools
2
+
3
+ Various HTTP-specific tools.
4
+
package/dist/body.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { HttpFormatQueryStringOptions, HttpParseQueryStringOptions, HttpQueryString } from './query-string.js';
2
+ export type HttpBody = Buffer;
3
+ export type HttpText = string;
4
+ export type HttpJson = NonNullable<unknown>;
5
+ export declare class HttpBodyWrap {
6
+ #private;
7
+ static fromScratch(): HttpBodyWrap;
8
+ constructor(body: HttpBody);
9
+ clone(): HttpBodyWrap;
10
+ get isFrozen(): boolean;
11
+ freeze(): this;
12
+ get length(): number;
13
+ get(): HttpBody;
14
+ set(body: HttpBody): this;
15
+ getBase64(): string;
16
+ setBase64(base64: string): this;
17
+ getText(charset?: string): HttpText;
18
+ setText(text: HttpText, charset?: string): this;
19
+ getJson(charset?: string): HttpJson;
20
+ setJson(json: HttpJson, charset?: string): this;
21
+ readonly parseQueryStringOptions: HttpParseQueryStringOptions;
22
+ readonly formatQueryStringOptions: HttpFormatQueryStringOptions;
23
+ getQueryString(charset?: string): HttpQueryString;
24
+ setQueryString(queryString: HttpQueryString, charset?: string): this;
25
+ reset(): this;
26
+ protected sureNotFrozen(name: string): void;
27
+ protected invalidateCacheAll(): void;
28
+ }
package/dist/body.js ADDED
@@ -0,0 +1,127 @@
1
+ import * as iconv from 'iconv-lite';
2
+ import { formatQueryString, parseQueryString } from './query-string.js';
3
+ export class HttpBodyWrap {
4
+ static fromScratch() {
5
+ return new HttpBodyWrap(Buffer.alloc(0));
6
+ }
7
+ #body;
8
+ constructor(body) {
9
+ this.#body = body;
10
+ }
11
+ clone() {
12
+ return new HttpBodyWrap(Buffer.from(this.#body));
13
+ }
14
+ #isFrozen = false;
15
+ get isFrozen() {
16
+ return this.#isFrozen;
17
+ }
18
+ freeze() {
19
+ this.#isFrozen = true;
20
+ return this;
21
+ }
22
+ get length() {
23
+ return this.#body.length;
24
+ }
25
+ get() {
26
+ return this.#body;
27
+ }
28
+ set(body) {
29
+ this.sureNotFrozen('set');
30
+ this.invalidateCacheAll();
31
+ this.#body = body;
32
+ return this;
33
+ }
34
+ #cacheBase64 = null;
35
+ getBase64() {
36
+ if (this.#cacheBase64 != null) {
37
+ return this.#cacheBase64;
38
+ }
39
+ const base64 = this.get().toString('base64');
40
+ this.#cacheBase64 = base64;
41
+ return base64;
42
+ }
43
+ setBase64(base64) {
44
+ this.sureNotFrozen('setBase64');
45
+ this.set(Buffer.from(base64, 'base64'));
46
+ this.#cacheBase64 = base64;
47
+ return this;
48
+ }
49
+ #cacheText = null;
50
+ getText(charset = 'utf8') {
51
+ if (this.#cacheText != null) {
52
+ return this.#cacheText;
53
+ }
54
+ const text = iconv.decode(this.get(), charset);
55
+ this.#cacheText = text;
56
+ return text;
57
+ }
58
+ setText(text, charset = 'utf8') {
59
+ this.sureNotFrozen('setText');
60
+ this.set(iconv.encode(text, charset));
61
+ this.#cacheText = text;
62
+ return this;
63
+ }
64
+ #cacheJson = null;
65
+ getJson(charset) {
66
+ if (this.#cacheJson != null) {
67
+ return this.#cacheJson;
68
+ }
69
+ const text = this.getText(charset);
70
+ const json = JSON.parse(text);
71
+ if (json == null) {
72
+ throw new Error(`Body wrong json`);
73
+ }
74
+ this.#cacheJson = json;
75
+ return json;
76
+ }
77
+ setJson(json, charset) {
78
+ this.sureNotFrozen('setJson');
79
+ const text = JSON.stringify(json);
80
+ this.setText(text, charset);
81
+ this.#cacheJson = json;
82
+ return this;
83
+ }
84
+ parseQueryStringOptions = {};
85
+ formatQueryStringOptions = {};
86
+ #cacheQueryString = null;
87
+ getQueryString(charset) {
88
+ if (this.#cacheQueryString != null) {
89
+ return this.#cacheQueryString;
90
+ }
91
+ const text = this.getText(charset);
92
+ const queryString = parseQueryString(text, {
93
+ ...this.parseQueryStringOptions,
94
+ ignoreQueryPrefix: true
95
+ });
96
+ this.#cacheQueryString = queryString;
97
+ return queryString;
98
+ }
99
+ setQueryString(queryString, charset) {
100
+ this.sureNotFrozen('setQueryString');
101
+ const text = formatQueryString(queryString, {
102
+ ...this.formatQueryStringOptions,
103
+ addQueryPrefix: true
104
+ });
105
+ this.setText(text, charset);
106
+ this.#cacheQueryString = queryString;
107
+ return this;
108
+ }
109
+ reset() {
110
+ this.sureNotFrozen('reset');
111
+ this.invalidateCacheAll();
112
+ this.set(Buffer.alloc(0));
113
+ return this;
114
+ }
115
+ sureNotFrozen(name) {
116
+ if (this.isFrozen) {
117
+ throw new Error(`Body frozen on ${name}`);
118
+ }
119
+ }
120
+ invalidateCacheAll() {
121
+ this.#cacheBase64 = null;
122
+ this.#cacheText = null;
123
+ this.#cacheJson = null;
124
+ this.#cacheQueryString = null;
125
+ }
126
+ }
127
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import * as cheerio from 'cheerio';
2
+ export type CheerioAPI = cheerio.CheerioAPI;
3
+ export type CheerioOptions = cheerio.CheerioOptions;
4
+ export declare function cheerioLoad(value: string, options?: CheerioOptions, isDocument?: boolean): CheerioAPI;
@@ -0,0 +1,5 @@
1
+ import * as cheerio from 'cheerio';
2
+ export function cheerioLoad(value, options, isDocument) {
3
+ return cheerio.load(value, options, isDocument);
4
+ }
5
+ //# sourceMappingURL=cheerio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cheerio.js","sourceRoot":"","sources":["../src/cheerio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAKlC,MAAM,UAAU,WAAW,CACzB,KAAa,EACb,OAAwB,EACxB,UAAoB;IAEpB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;AACjD,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface HttpContentType {
2
+ type: string;
3
+ parameters: Record<string, string>;
4
+ }
5
+ export declare const HTTP_CONTENT_TYPE_NAMES: readonly ["text", "html", "css", "javascript", "json", "xml", "urlEncoded"];
6
+ export type HttpContentTypeName = (typeof HTTP_CONTENT_TYPE_NAMES)[number];
7
+ export type HttpContentTypes = Record<HttpContentTypeName, string[]>;
8
+ export declare function parseContentType(value: string): HttpContentType;
9
+ export declare function formatContentType(contentType: HttpContentType): string;
@@ -0,0 +1,17 @@
1
+ import contenttype from 'content-type';
2
+ export const HTTP_CONTENT_TYPE_NAMES = [
3
+ 'text',
4
+ 'html',
5
+ 'css',
6
+ 'javascript',
7
+ 'json',
8
+ 'xml',
9
+ 'urlEncoded'
10
+ ];
11
+ export function parseContentType(value) {
12
+ return contenttype.parse(value.trim());
13
+ }
14
+ export function formatContentType(contentType) {
15
+ return contenttype.format(contentType);
16
+ }
17
+ //# sourceMappingURL=content-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-type.js","sourceRoot":"","sources":["../src/content-type.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,cAAc,CAAA;AAOtC,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,MAAM;IACN,MAAM;IACN,KAAK;IACL,YAAY;IACZ,MAAM;IACN,KAAK;IACL,YAAY;CACJ,CAAA;AAIV,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAA4B;IAC5D,OAAO,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;AACxC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type HttpCookie = string;
2
+ export type HttpCookies = Record<string, HttpCookie | undefined>;
3
+ export interface HttpSetCookie {
4
+ value: string;
5
+ expires?: number;
6
+ maxAge?: number;
7
+ path?: string;
8
+ domain?: string;
9
+ secure?: boolean;
10
+ httpOnly?: boolean;
11
+ sameSite?: string;
12
+ }
13
+ export type HttpSetCookies = Record<string, HttpSetCookie | undefined>;
14
+ export declare function parseCookies(values: string[]): HttpCookies;
15
+ export declare function formatCookies(cookies: HttpCookies): string;
16
+ export declare function parseSetCookies(values: string[]): HttpSetCookies;
17
+ export declare function formatSetCookies(cookies: HttpSetCookies): string[];
@@ -0,0 +1,97 @@
1
+ import { Cookie as ToughCookie } from 'tough-cookie';
2
+ export function parseCookies(values) {
3
+ const cookies = {};
4
+ values
5
+ .join(';')
6
+ .split(';')
7
+ .forEach((rawCookie) => {
8
+ const toughCookie = ToughCookie.parse(rawCookie.trim());
9
+ if (toughCookie) {
10
+ cookies[toughCookie.key] = toughCookie.value;
11
+ }
12
+ });
13
+ return cookies;
14
+ }
15
+ export function formatCookies(cookies) {
16
+ const toughCookies = [];
17
+ Object.entries(cookies).forEach(([name, value]) => {
18
+ if (value != null) {
19
+ const toughCookie = new ToughCookie({
20
+ key: name,
21
+ value: value
22
+ });
23
+ toughCookies.push(toughCookie);
24
+ }
25
+ });
26
+ return toughCookies.map((toughCookie) => toughCookie.cookieString()).join(';');
27
+ }
28
+ export function parseSetCookies(values) {
29
+ const cookies = {};
30
+ values.forEach((rawCookie) => {
31
+ const toughCookie = ToughCookie.parse(rawCookie.trim());
32
+ if (!toughCookie) {
33
+ return;
34
+ }
35
+ const name = toughCookie.key;
36
+ cookies[name] = {
37
+ value: toughCookie.value
38
+ };
39
+ if (toughCookie.expires instanceof Date) {
40
+ cookies[name].expires = toughCookie.expires.getTime();
41
+ }
42
+ if (typeof toughCookie.maxAge === 'number') {
43
+ cookies[name].maxAge = toughCookie.maxAge;
44
+ }
45
+ if (toughCookie.path != null) {
46
+ cookies[name].path = toughCookie.path;
47
+ }
48
+ if (toughCookie.domain != null) {
49
+ cookies[name].domain = toughCookie.domain;
50
+ }
51
+ if (toughCookie.secure != null) {
52
+ cookies[name].secure = toughCookie.secure;
53
+ }
54
+ if (toughCookie.httpOnly != null) {
55
+ cookies[name].httpOnly = toughCookie.httpOnly;
56
+ }
57
+ if (toughCookie.sameSite != null) {
58
+ cookies[name].sameSite = toughCookie.sameSite;
59
+ }
60
+ });
61
+ return cookies;
62
+ }
63
+ export function formatSetCookies(cookies) {
64
+ const toughCookies = [];
65
+ Object.entries(cookies).forEach(([name, cookie]) => {
66
+ if (cookie != null) {
67
+ const toughCookie = new ToughCookie({
68
+ key: name,
69
+ value: cookie.value
70
+ });
71
+ if (cookie.expires != null) {
72
+ toughCookie.expires = new Date(cookie.expires);
73
+ }
74
+ if (cookie.maxAge != null) {
75
+ toughCookie.maxAge = cookie.maxAge;
76
+ }
77
+ if (cookie.path != null) {
78
+ toughCookie.path = cookie.path;
79
+ }
80
+ if (cookie.domain != null) {
81
+ toughCookie.domain = cookie.domain;
82
+ }
83
+ if (cookie.secure != null) {
84
+ toughCookie.secure = cookie.secure;
85
+ }
86
+ if (cookie.httpOnly != null) {
87
+ toughCookie.httpOnly = cookie.httpOnly;
88
+ }
89
+ if (cookie.sameSite != null) {
90
+ toughCookie.sameSite = cookie.sameSite;
91
+ }
92
+ toughCookies.push(toughCookie);
93
+ }
94
+ });
95
+ return toughCookies.map((toughCookie) => toughCookie.toString());
96
+ }
97
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../src/cookies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { HttpContentType } from './content-type.js';
2
+ import { HttpCookies, HttpSetCookies } from './cookies.js';
3
+ export type HttpHeader = string | string[];
4
+ export type HttpHeaders = Record<string, HttpHeader | undefined>;
5
+ export type HttpStrictHeaders = Record<string, HttpHeader>;
6
+ export declare class HttpHeadersWrap {
7
+ #private;
8
+ static fromReq(req: {
9
+ headers: HttpHeaders;
10
+ }): HttpHeadersWrap;
11
+ static fromScratch(): HttpHeadersWrap;
12
+ constructor(headers: HttpHeaders);
13
+ clone(): HttpHeadersWrap;
14
+ get isFrozen(): boolean;
15
+ freeze(): this;
16
+ get(name: string): HttpHeader | undefined;
17
+ getString(name: string): string | undefined;
18
+ getArray(name: string): string[] | undefined;
19
+ set(name: string, value: HttpHeader): this;
20
+ add(name: string, value: string): this;
21
+ has(name: string): boolean;
22
+ delete(arg: string | string[]): this;
23
+ merge(headers: HttpHeaders): this;
24
+ getContentType(): HttpContentType | null;
25
+ setContentType(contentType: HttpContentType): this;
26
+ getCookies(): HttpCookies | null;
27
+ setCookies(cookies: HttpCookies): this;
28
+ getSetCookies(): HttpSetCookies | null;
29
+ setSetCookies(setCookies: HttpSetCookies): this;
30
+ toObject(): HttpStrictHeaders;
31
+ entries(): Array<[string, HttpHeader]>;
32
+ forEach(cb: (name: string, value: HttpHeader) => void): this;
33
+ reset(): this;
34
+ protected sureNotFrozen(name: string): void;
35
+ protected invalidateCacheFor(name: string): void;
36
+ protected invalidateCacheAll(): void;
37
+ }
@@ -0,0 +1,196 @@
1
+ import { formatContentType, parseContentType } from './content-type.js';
2
+ import { formatCookies, formatSetCookies, parseCookies, parseSetCookies } from './cookies.js';
3
+ export class HttpHeadersWrap {
4
+ static fromReq(req) {
5
+ return new HttpHeadersWrap(req.headers);
6
+ }
7
+ static fromScratch() {
8
+ return new HttpHeadersWrap({});
9
+ }
10
+ #headers;
11
+ constructor(headers) {
12
+ this.#headers = headers;
13
+ }
14
+ clone() {
15
+ return new HttpHeadersWrap({ ...this.#headers });
16
+ }
17
+ #isFrozen = false;
18
+ get isFrozen() {
19
+ return this.#isFrozen;
20
+ }
21
+ freeze() {
22
+ this.#isFrozen = true;
23
+ return this;
24
+ }
25
+ get(name) {
26
+ const normName = name.toLowerCase();
27
+ return this.#headers[normName];
28
+ }
29
+ getString(name) {
30
+ const value = this.get(name);
31
+ if (value == null) {
32
+ return undefined;
33
+ }
34
+ if (Array.isArray(value)) {
35
+ return value[0] != null ? value[0] : undefined;
36
+ }
37
+ return value;
38
+ }
39
+ getArray(name) {
40
+ const value = this.get(name);
41
+ if (value == null) {
42
+ return undefined;
43
+ }
44
+ if (Array.isArray(value)) {
45
+ return value;
46
+ }
47
+ return [value];
48
+ }
49
+ set(name, value) {
50
+ this.sureNotFrozen('set');
51
+ const normName = name.toLowerCase();
52
+ this.invalidateCacheFor(normName);
53
+ this.#headers[normName] = value;
54
+ return this;
55
+ }
56
+ add(name, value) {
57
+ this.sureNotFrozen('add');
58
+ const curValue = this.get(name);
59
+ if (curValue == null) {
60
+ this.set(name, value);
61
+ }
62
+ else if (Array.isArray(curValue)) {
63
+ this.set(name, [...curValue, value]);
64
+ }
65
+ else {
66
+ this.set(name, [curValue, value]);
67
+ }
68
+ return this;
69
+ }
70
+ has(name) {
71
+ const normName = name.toLowerCase();
72
+ return normName in this.#headers;
73
+ }
74
+ delete(arg) {
75
+ this.sureNotFrozen('delete');
76
+ const names = Array.isArray(arg) ? arg : [arg];
77
+ names.forEach((name) => {
78
+ const normName = name.toLowerCase();
79
+ this.invalidateCacheFor(normName);
80
+ this.#headers[normName] = undefined;
81
+ });
82
+ return this;
83
+ }
84
+ merge(headers) {
85
+ this.sureNotFrozen('merge');
86
+ Object.entries(headers).forEach(([name, value]) => {
87
+ if (value != null) {
88
+ this.set(name, value);
89
+ }
90
+ });
91
+ return this;
92
+ }
93
+ #cacheContentType = null;
94
+ getContentType() {
95
+ if (this.#cacheContentType != null) {
96
+ return this.#cacheContentType;
97
+ }
98
+ const value = this.getString('Content-Type');
99
+ if (value == null) {
100
+ return null;
101
+ }
102
+ this.#cacheContentType = parseContentType(value);
103
+ return this.#cacheContentType;
104
+ }
105
+ setContentType(contentType) {
106
+ this.sureNotFrozen('setContentType');
107
+ const value = formatContentType(contentType);
108
+ this.set('Content-Type', value);
109
+ this.#cacheContentType = contentType;
110
+ return this;
111
+ }
112
+ #cacheCookies = null;
113
+ getCookies() {
114
+ if (this.#cacheCookies != null) {
115
+ return this.#cacheCookies;
116
+ }
117
+ const values = this.getArray('Cookie');
118
+ if (values == null) {
119
+ return null;
120
+ }
121
+ this.#cacheCookies = parseCookies(values);
122
+ return this.#cacheCookies;
123
+ }
124
+ setCookies(cookies) {
125
+ this.sureNotFrozen('setCookies');
126
+ const value = formatCookies(cookies);
127
+ this.set('Cookie', value);
128
+ this.#cacheCookies = cookies;
129
+ return this;
130
+ }
131
+ #cacheSetCookies = null;
132
+ getSetCookies() {
133
+ if (this.#cacheSetCookies != null) {
134
+ return this.#cacheSetCookies;
135
+ }
136
+ const values = this.getArray('Set-Cookie');
137
+ if (values == null) {
138
+ return null;
139
+ }
140
+ this.#cacheSetCookies = parseSetCookies(values);
141
+ return this.#cacheSetCookies;
142
+ }
143
+ setSetCookies(setCookies) {
144
+ this.sureNotFrozen('setSetCookies');
145
+ const values = formatSetCookies(setCookies);
146
+ this.set('Set-Cookie', values);
147
+ this.#cacheSetCookies = setCookies;
148
+ return this;
149
+ }
150
+ toObject() {
151
+ const strictHeaders = {};
152
+ Object.entries(this.#headers).forEach(([name, value]) => {
153
+ if (value != null) {
154
+ strictHeaders[name] = value;
155
+ }
156
+ });
157
+ return strictHeaders;
158
+ }
159
+ entries() {
160
+ return Object.entries(this.toObject());
161
+ }
162
+ forEach(cb) {
163
+ this.entries().forEach(([name, value]) => {
164
+ cb(name, value);
165
+ });
166
+ return this;
167
+ }
168
+ reset() {
169
+ this.sureNotFrozen('reset');
170
+ this.invalidateCacheAll();
171
+ this.#headers = {};
172
+ return this;
173
+ }
174
+ sureNotFrozen(name) {
175
+ if (this.isFrozen) {
176
+ throw new Error(`Headers frozen on ${name}`);
177
+ }
178
+ }
179
+ invalidateCacheFor(name) {
180
+ if (name === 'content-type') {
181
+ this.#cacheContentType = null;
182
+ }
183
+ else if (name === 'cookie') {
184
+ this.#cacheCookies = null;
185
+ }
186
+ else if (name === 'set-cookie') {
187
+ this.#cacheSetCookies = null;
188
+ }
189
+ }
190
+ invalidateCacheAll() {
191
+ this.#cacheContentType = null;
192
+ this.#cacheCookies = null;
193
+ this.#cacheSetCookies = null;
194
+ }
195
+ }
196
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../src/headers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export * from './body.js';
2
+ export * from './cheerio.js';
3
+ export * from './content-type.js';
4
+ export * from './cookies.js';
5
+ export * from './headers.js';
6
+ export * from './isbot.js';
7
+ export * from './method.js';
8
+ export * from './misc.js';
9
+ export * from './query-string.js';
10
+ export * from './rewrite-url.js';
11
+ export * from './status.js';
12
+ export * from './transforms.js';
13
+ export * from './ua-parser.js';
14
+ export * from './url.js';
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export * from './body.js';
2
+ export * from './cheerio.js';
3
+ export * from './content-type.js';
4
+ export * from './cookies.js';
5
+ export * from './headers.js';
6
+ export * from './isbot.js';
7
+ export * from './method.js';
8
+ export * from './misc.js';
9
+ export * from './query-string.js';
10
+ export * from './rewrite-url.js';
11
+ export * from './status.js';
12
+ export * from './transforms.js';
13
+ export * from './ua-parser.js';
14
+ export * from './url.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA"}
@@ -0,0 +1 @@
1
+ export { isbot } from 'isbot';
package/dist/isbot.js ADDED
@@ -0,0 +1,2 @@
1
+ export { isbot } from 'isbot';
2
+ //# sourceMappingURL=isbot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isbot.js","sourceRoot":"","sources":["../src/isbot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA"}
@@ -0,0 +1,12 @@
1
+ export declare const HTTP_METHODS: readonly ["HEAD", "GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"];
2
+ export type HttpMethod = (typeof HTTP_METHODS)[number];
3
+ export declare class HttpMethodWrap {
4
+ #private;
5
+ static fromReq(req: {
6
+ method?: string | undefined;
7
+ }): HttpMethodWrap;
8
+ static fromString(value: string): HttpMethodWrap;
9
+ constructor(method: HttpMethod);
10
+ get(): HttpMethod;
11
+ is(arg: HttpMethod | HttpMethod[]): boolean;
12
+ }
package/dist/method.js ADDED
@@ -0,0 +1,29 @@
1
+ import { arrayIncludes } from '@famir/common';
2
+ export const HTTP_METHODS = ['HEAD', 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'];
3
+ export class HttpMethodWrap {
4
+ static fromReq(req) {
5
+ if (req.method == null) {
6
+ throw new Error(`Method not defined`);
7
+ }
8
+ return HttpMethodWrap.fromString(req.method);
9
+ }
10
+ static fromString(value) {
11
+ const normValue = value.toUpperCase();
12
+ if (!arrayIncludes(HTTP_METHODS, normValue)) {
13
+ throw new Error(`Method not known`);
14
+ }
15
+ return new HttpMethodWrap(normValue);
16
+ }
17
+ #method;
18
+ constructor(method) {
19
+ this.#method = method;
20
+ }
21
+ get() {
22
+ return this.#method;
23
+ }
24
+ is(arg) {
25
+ const methods = Array.isArray(arg) ? arg : [arg];
26
+ return methods.includes(this.#method);
27
+ }
28
+ }
29
+ //# sourceMappingURL=method.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"method.js","sourceRoot":"","sources":["../src/method.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAA;AAGjG,MAAM,OAAO,cAAc;IACzB,MAAM,CAAC,OAAO,CAAC,GAAoC;QACjD,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACvC,CAAC;QAED,OAAO,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;QAErC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACrC,CAAC;QAED,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,CAAY;IAEnB,YAAY,MAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,EAAE,CAAC,GAA8B;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAChD,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;CACF"}
package/dist/misc.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare const HTTP_KINDS: readonly ["simple", "stream-request", "stream-response"];
2
+ export type HttpKind = (typeof HTTP_KINDS)[number];
3
+ export type HttpConnection = Record<string, number | string | null | undefined>;
4
+ export type HttpPayload = Record<string, unknown>;
5
+ export type HttpError = readonly [object, ...string[]];
package/dist/misc.js ADDED
@@ -0,0 +1,2 @@
1
+ export const HTTP_KINDS = ['simple', 'stream-request', 'stream-response'];
2
+ //# sourceMappingURL=misc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.js","sourceRoot":"","sources":["../src/misc.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,CAAU,CAAA"}
@@ -0,0 +1,6 @@
1
+ import qs from 'qs';
2
+ export type HttpQueryString = Record<string, unknown>;
3
+ export type HttpParseQueryStringOptions = qs.IParseBaseOptions;
4
+ export type HttpFormatQueryStringOptions = qs.IStringifyBaseOptions;
5
+ export declare function parseQueryString(value: string, options: HttpParseQueryStringOptions): HttpQueryString;
6
+ export declare function formatQueryString(queryString: HttpQueryString, options: HttpFormatQueryStringOptions): string;
@@ -0,0 +1,8 @@
1
+ import qs from 'qs';
2
+ export function parseQueryString(value, options) {
3
+ return qs.parse(value.trim(), options);
4
+ }
5
+ export function formatQueryString(queryString, options) {
6
+ return qs.stringify(queryString, options);
7
+ }
8
+ //# sourceMappingURL=query-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-string.js","sourceRoot":"","sources":["../src/query-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAMnB,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,OAAoC;IAEpC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,WAA4B,EAC5B,OAAqC;IAErC,OAAO,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;AAC3C,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface RewriteUrlTarget {
2
+ donorSecure: boolean;
3
+ donorHost: string;
4
+ mirrorSecure: boolean;
5
+ mirrorHost: string;
6
+ }
7
+ export type RewriteUrlScheme = [string, boolean];
8
+ export declare function rewriteUrl(text: string, rev: boolean, targets: RewriteUrlTarget[], schemes: RewriteUrlScheme[]): string;
@@ -0,0 +1,23 @@
1
+ export function rewriteUrl(text, rev, targets, schemes) {
2
+ targets.forEach((target) => {
3
+ const [oldSecure, newSecure] = rev
4
+ ? [target.mirrorSecure, target.donorSecure]
5
+ : [target.donorSecure, target.mirrorSecure];
6
+ const oldProto = oldSecure ? 'https' : 'http';
7
+ const newProto = newSecure ? 'https' : 'http';
8
+ const [oldHost, newHost] = rev
9
+ ? [target.mirrorHost, target.donorHost]
10
+ : [target.donorHost, target.mirrorHost];
11
+ schemes.forEach(([separator, withProto]) => {
12
+ const pattern = withProto
13
+ ? [oldProto, separator, oldHost].join('')
14
+ : [separator, oldHost].join('');
15
+ const replacement = withProto
16
+ ? [newProto, separator, newHost].join('')
17
+ : [separator, newHost].join('');
18
+ text = text.replaceAll(pattern, replacement);
19
+ });
20
+ });
21
+ return text;
22
+ }
23
+ //# sourceMappingURL=rewrite-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewrite-url.js","sourceRoot":"","sources":["../src/rewrite-url.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,GAAY,EACZ,OAA2B,EAC3B,OAA2B;IAE3B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACzB,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,GAAG;YAChC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC;YAC3C,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;QAE7C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;QAE7C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,GAAG;YAC5B,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC;YACvC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QAEzC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE;YACzC,MAAM,OAAO,GAAG,SAAS;gBACvB,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAEjC,MAAM,WAAW,GAAG,SAAS;gBAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAEjC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare class HttpStatusWrap {
2
+ #private;
3
+ static fromScratch(): HttpStatusWrap;
4
+ constructor(status: number);
5
+ clone(): HttpStatusWrap;
6
+ get isFrozen(): boolean;
7
+ freeze(): this;
8
+ get(): number;
9
+ set(status: number): this;
10
+ isInformation(): boolean;
11
+ isSuccess(): boolean;
12
+ isRedirect(): boolean;
13
+ isClientError(): boolean;
14
+ isServerError(): boolean;
15
+ isUnknown(): boolean;
16
+ reset(): this;
17
+ protected sureNotFrozen(name: string): void;
18
+ protected between(min: number, max: number): boolean;
19
+ }
package/dist/status.js ADDED
@@ -0,0 +1,60 @@
1
+ export class HttpStatusWrap {
2
+ static fromScratch() {
3
+ return new HttpStatusWrap(0);
4
+ }
5
+ #status;
6
+ constructor(status) {
7
+ this.#status = status;
8
+ }
9
+ clone() {
10
+ return new HttpStatusWrap(this.#status);
11
+ }
12
+ #isFrozen = false;
13
+ get isFrozen() {
14
+ return this.#isFrozen;
15
+ }
16
+ freeze() {
17
+ this.#isFrozen = true;
18
+ return this;
19
+ }
20
+ get() {
21
+ return this.#status;
22
+ }
23
+ set(status) {
24
+ this.sureNotFrozen('set');
25
+ this.#status = status;
26
+ return this;
27
+ }
28
+ isInformation() {
29
+ return this.between(100, 200);
30
+ }
31
+ isSuccess() {
32
+ return this.between(200, 300);
33
+ }
34
+ isRedirect() {
35
+ return this.between(300, 400);
36
+ }
37
+ isClientError() {
38
+ return this.between(400, 500);
39
+ }
40
+ isServerError() {
41
+ return this.between(500, 600);
42
+ }
43
+ isUnknown() {
44
+ return !this.between(100, 600);
45
+ }
46
+ reset() {
47
+ this.sureNotFrozen('reset');
48
+ this.#status = 0;
49
+ return this;
50
+ }
51
+ sureNotFrozen(name) {
52
+ if (this.isFrozen) {
53
+ throw new Error(`Status frozen on ${name}`);
54
+ }
55
+ }
56
+ between(min, max) {
57
+ return this.#status >= min && this.#status < max;
58
+ }
59
+ }
60
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAc;IACzB,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,CAAQ;IAEf,YAAY,MAAc;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,SAAS,GAAY,KAAK,CAAA;IAE1B,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QAErB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAEzB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QAErB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,SAAS;QACP,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAE3B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAEhB,OAAO,IAAI,CAAA;IACb,CAAC;IAES,aAAa,CAAC,IAAY;QAClC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAES,OAAO,CAAC,GAAW,EAAE,GAAW;QACxC,OAAO,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,GAAG,CAAA;IAClD,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { Transform, TransformCallback } from 'node:stream';
2
+ export declare class LimiterTransform extends Transform {
3
+ protected readonly sizeLimit: number;
4
+ protected totalSize: number;
5
+ protected limitExceeded: boolean;
6
+ constructor(sizeLimit: number);
7
+ _transform(chunk: Buffer, encoding: BufferEncoding, callback: TransformCallback): void;
8
+ }
@@ -0,0 +1,25 @@
1
+ import { Transform } from 'node:stream';
2
+ export class LimiterTransform extends Transform {
3
+ sizeLimit;
4
+ totalSize = 0;
5
+ limitExceeded = false;
6
+ constructor(sizeLimit) {
7
+ super();
8
+ this.sizeLimit = sizeLimit;
9
+ }
10
+ _transform(chunk, encoding, callback) {
11
+ if (this.limitExceeded) {
12
+ callback();
13
+ return;
14
+ }
15
+ if (this.totalSize + chunk.length > this.sizeLimit) {
16
+ this.limitExceeded = true;
17
+ callback();
18
+ return;
19
+ }
20
+ this.push(chunk);
21
+ this.totalSize += chunk.length;
22
+ callback();
23
+ }
24
+ }
25
+ //# sourceMappingURL=transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.js","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAA;AAE1D,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAId;IAHrB,SAAS,GAAW,CAAC,CAAA;IACrB,aAAa,GAAY,KAAK,CAAA;IAExC,YAA+B,SAAiB;QAC9C,KAAK,EAAE,CAAA;QADsB,cAAS,GAAT,SAAS,CAAQ;IAEhD,CAAC;IAEQ,UAAU,CAAC,KAAa,EAAE,QAAwB,EAAE,QAA2B;QACtF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,QAAQ,EAAE,CAAA;YAEV,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YAEzB,QAAQ,EAAE,CAAA;YAEV,OAAM;QACR,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAEhB,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAA;QAE9B,QAAQ,EAAE,CAAA;IACZ,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export { UAParser, IResult as UAResult } from 'ua-parser-js';
@@ -0,0 +1,2 @@
1
+ export { UAParser } from 'ua-parser-js';
2
+ //# sourceMappingURL=ua-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ua-parser.js","sourceRoot":"","sources":["../src/ua-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAuB,MAAM,cAAc,CAAA"}
package/dist/url.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ import { HttpFormatQueryStringOptions, HttpParseQueryStringOptions, HttpQueryString } from './query-string.js';
2
+ export interface HttpUrl {
3
+ protocol: string;
4
+ hostname: string;
5
+ port: string;
6
+ pathname: string;
7
+ search: string;
8
+ hash: string;
9
+ }
10
+ export declare class HttpUrlWrap {
11
+ #private;
12
+ static fromReq(req: {
13
+ url?: string | undefined;
14
+ }): HttpUrlWrap;
15
+ static fromRelative(value: string): HttpUrlWrap;
16
+ static fromAbsolute(value: string): HttpUrlWrap;
17
+ constructor(url: HttpUrl);
18
+ clone(): HttpUrlWrap;
19
+ get isFrozen(): boolean;
20
+ freeze(): this;
21
+ get<K extends keyof HttpUrl>(name: K): HttpUrl[K];
22
+ set<K extends keyof HttpUrl>(name: K, value: HttpUrl[K]): this;
23
+ merge(url: Partial<HttpUrl>): this;
24
+ getHost(): string;
25
+ readonly parseQueryStringOptions: HttpParseQueryStringOptions;
26
+ readonly formatQueryStringOptions: HttpFormatQueryStringOptions;
27
+ getQueryString(): HttpQueryString;
28
+ setQueryString(queryString: HttpQueryString): this;
29
+ isPath(value: string | RegExp): boolean;
30
+ toObject(): HttpUrl;
31
+ toRelative(): string;
32
+ toAbsolute(): string;
33
+ reset(): this;
34
+ protected sureNotFrozen(name: string): void;
35
+ protected invalidateCacheFor(name: keyof HttpUrl): void;
36
+ protected invalidateCacheAll(): void;
37
+ }
package/dist/url.js ADDED
@@ -0,0 +1,158 @@
1
+ import { formatQueryString, parseQueryString } from './query-string.js';
2
+ export class HttpUrlWrap {
3
+ static fromReq(req) {
4
+ if (req.url == null) {
5
+ throw new Error(`Url not defined`);
6
+ }
7
+ return HttpUrlWrap.fromRelative(req.url);
8
+ }
9
+ static fromRelative(value) {
10
+ const parsedUrl = URL.parse(value, 'http://localhost');
11
+ if (!parsedUrl) {
12
+ throw new Error(`Url parse error`);
13
+ }
14
+ return new HttpUrlWrap({
15
+ protocol: 'http:',
16
+ hostname: 'localhost',
17
+ port: '',
18
+ pathname: parsedUrl.pathname,
19
+ search: parsedUrl.search,
20
+ hash: parsedUrl.hash
21
+ });
22
+ }
23
+ static fromAbsolute(value) {
24
+ const parsedUrl = URL.parse(value);
25
+ if (!parsedUrl) {
26
+ throw new Error(`Url parse error`);
27
+ }
28
+ return new HttpUrlWrap({
29
+ protocol: parsedUrl.protocol,
30
+ hostname: parsedUrl.hostname,
31
+ port: parsedUrl.port,
32
+ pathname: parsedUrl.pathname,
33
+ search: parsedUrl.search,
34
+ hash: parsedUrl.hash
35
+ });
36
+ }
37
+ #url;
38
+ constructor(url) {
39
+ this.#url = url;
40
+ }
41
+ clone() {
42
+ return new HttpUrlWrap({ ...this.#url });
43
+ }
44
+ #isFrozen = false;
45
+ get isFrozen() {
46
+ return this.#isFrozen;
47
+ }
48
+ freeze() {
49
+ this.#isFrozen = true;
50
+ return this;
51
+ }
52
+ get(name) {
53
+ return this.#url[name];
54
+ }
55
+ set(name, value) {
56
+ this.sureNotFrozen('set');
57
+ this.invalidateCacheFor(name);
58
+ this.#url[name] = value;
59
+ return this;
60
+ }
61
+ merge(url) {
62
+ this.sureNotFrozen('merge');
63
+ Object.entries(url).forEach(([name, value]) => {
64
+ this.set(name, value);
65
+ });
66
+ return this;
67
+ }
68
+ getHost() {
69
+ const { protocol, hostname, port } = this.#url;
70
+ if (!port ||
71
+ (protocol === 'http:' && port === '80') ||
72
+ (protocol === 'https:' && port === '443')) {
73
+ return hostname;
74
+ }
75
+ else {
76
+ return [hostname, port].join(':');
77
+ }
78
+ }
79
+ parseQueryStringOptions = {};
80
+ formatQueryStringOptions = {};
81
+ #cacheQueryString = null;
82
+ getQueryString() {
83
+ if (this.#cacheQueryString != null) {
84
+ return this.#cacheQueryString;
85
+ }
86
+ const value = this.get('search');
87
+ const queryString = parseQueryString(value, {
88
+ ...this.parseQueryStringOptions,
89
+ ignoreQueryPrefix: true
90
+ });
91
+ this.#cacheQueryString = queryString;
92
+ return queryString;
93
+ }
94
+ setQueryString(queryString) {
95
+ this.sureNotFrozen('setQueryString');
96
+ const value = formatQueryString(queryString, {
97
+ ...this.formatQueryStringOptions,
98
+ addQueryPrefix: true
99
+ });
100
+ this.set('search', value);
101
+ this.#cacheQueryString = queryString;
102
+ return this;
103
+ }
104
+ isPath(value) {
105
+ if (typeof value === 'string') {
106
+ return value === this.#url.pathname;
107
+ }
108
+ else if (value instanceof RegExp) {
109
+ return value.test(this.#url.pathname);
110
+ }
111
+ else {
112
+ throw new Error(`Test path unknown value`);
113
+ }
114
+ }
115
+ toObject() {
116
+ return { ...this.#url };
117
+ }
118
+ toRelative() {
119
+ return [this.#url.pathname, this.#url.search, this.#url.hash].join('');
120
+ }
121
+ toAbsolute() {
122
+ return [
123
+ this.#url.protocol,
124
+ '//',
125
+ this.getHost(),
126
+ this.#url.pathname,
127
+ this.#url.search,
128
+ this.#url.hash
129
+ ].join('');
130
+ }
131
+ reset() {
132
+ this.sureNotFrozen('reset');
133
+ this.invalidateCacheAll();
134
+ this.#url = {
135
+ protocol: 'http:',
136
+ hostname: 'localhost',
137
+ port: '',
138
+ pathname: '/',
139
+ search: '',
140
+ hash: ''
141
+ };
142
+ return this;
143
+ }
144
+ sureNotFrozen(name) {
145
+ if (this.isFrozen) {
146
+ throw new Error(`Url frozen on ${name}`);
147
+ }
148
+ }
149
+ invalidateCacheFor(name) {
150
+ if (name === 'search') {
151
+ this.#cacheQueryString = null;
152
+ }
153
+ }
154
+ invalidateCacheAll() {
155
+ this.#cacheQueryString = null;
156
+ }
157
+ }
158
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@famir/http-tools",
3
+ "type": "module",
4
+ "version": "0.0.1",
5
+ "description": "Famir HTTP tools module",
6
+ "keywords": [
7
+ "famir",
8
+ "fake-mirrors",
9
+ "man-in-the-middle",
10
+ "phishing",
11
+ "reverse-proxy"
12
+ ],
13
+ "author": "Dmitry Krutikov <d.krutikov@gmail.com>",
14
+ "license": "Apache-2.0",
15
+ "main": "dist/index.js",
16
+ "types": "dist/index.d.ts",
17
+ "scripts": {
18
+ "format": "prettier -w \"src/**/*.ts\"",
19
+ "lint": "eslint \"src/**/*.ts\"",
20
+ "test": "node --test dist/**/*.test.js",
21
+ "build": "tsc -b"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md"
26
+ ],
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/bitnoize/famir.git",
30
+ "directory": "packages/http-tools"
31
+ },
32
+ "bugs": {
33
+ "url": "https://github.com/bitnoize/famir/issues"
34
+ },
35
+ "homepage": "https://github.com/bitnoize/famir",
36
+ "dependencies": {
37
+ "@famir/common": "*",
38
+ "cheerio": "^1.2.0",
39
+ "content-type": "^1.0.5",
40
+ "iconv-lite": "^0.7.2",
41
+ "isbot": "^5.1.36",
42
+ "qs": "^6.15.0",
43
+ "tough-cookie": "^6.0.1",
44
+ "ua-parser-js": "^2.0.9"
45
+ },
46
+ "devDependencies": {
47
+ "@types/content-type": "^1.1.9",
48
+ "@types/qs": "^6.15.0"
49
+ }
50
+ }