@atproto-labs/fetch 0.0.1 → 0.1.0
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.
- package/CHANGELOG.md +7 -5
- package/dist/fetch-error.d.ts +1 -12
- package/dist/fetch-error.d.ts.map +1 -1
- package/dist/fetch-error.js +24 -39
- package/dist/fetch-error.js.map +1 -1
- package/dist/fetch-request.d.ts +9 -5
- package/dist/fetch-request.d.ts.map +1 -1
- package/dist/fetch-request.js +39 -13
- package/dist/fetch-request.js.map +1 -1
- package/dist/fetch-response.d.ts +30 -12
- package/dist/fetch-response.d.ts.map +1 -1
- package/dist/fetch-response.js +134 -81
- package/dist/fetch-response.js.map +1 -1
- package/dist/fetch-wrap.d.ts +42 -9
- package/dist/fetch-wrap.d.ts.map +1 -1
- package/dist/fetch-wrap.js +92 -61
- package/dist/fetch-wrap.js.map +1 -1
- package/dist/fetch.d.ts +8 -1
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +13 -0
- package/dist/fetch.js.map +1 -1
- package/dist/transformed-response.d.ts.map +1 -1
- package/dist/transformed-response.js +5 -2
- package/dist/transformed-response.js.map +1 -1
- package/dist/util.d.ts +45 -14
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +115 -24
- package/dist/util.js.map +1 -1
- package/package.json +6 -5
- package/src/fetch-error.ts +26 -44
- package/src/fetch-request.ts +52 -20
- package/src/fetch-response.ts +177 -111
- package/src/fetch-wrap.ts +104 -83
- package/src/fetch.ts +38 -3
- package/src/transformed-response.ts +5 -2
- package/src/util.ts +135 -25
- package/tsconfig.build.json +8 -0
- package/tsconfig.json +2 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-response.js","sourceRoot":"","sources":["../src/fetch-response.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"fetch-response.js","sourceRoot":"","sources":["../src/fetch-response.ts"],"names":[],"mappings":"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"}
|
package/dist/fetch-wrap.d.ts
CHANGED
|
@@ -1,10 +1,43 @@
|
|
|
1
|
-
import { Fetch } from './fetch.js';
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
}
|
|
5
|
-
export declare const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { Fetch, FetchContext } from './fetch.js';
|
|
2
|
+
export declare function loggedFetch<C = FetchContext>(fetch?: Fetch<C>): ((this: C, input: string | URL | Request, init?: RequestInit | undefined) => Promise<Response>) & {
|
|
3
|
+
bind(context: C): (input: string | URL | Request, init?: RequestInit | undefined) => Promise<Response>;
|
|
4
|
+
};
|
|
5
|
+
export declare const timedFetch: <C = FetchContext>(timeout?: number, fetch?: Fetch<C>) => Fetch<C>;
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a fetch function to bind it to a specific context, and wrap any thrown
|
|
8
|
+
* errors into a FetchRequestError.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* class MyClient {
|
|
14
|
+
* constructor(private fetch = globalThis.fetch) {}
|
|
15
|
+
*
|
|
16
|
+
* async get(url: string) {
|
|
17
|
+
* // This will generate an error, because the context used is not a
|
|
18
|
+
* // FetchContext (it's a MyClient instance).
|
|
19
|
+
* return this.fetch(url)
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* class MyClient {
|
|
28
|
+
* private fetch: Fetch<unknown>
|
|
29
|
+
*
|
|
30
|
+
* constructor(fetch = globalThis.fetch) {
|
|
31
|
+
* this.fetch = bindFetch(fetch)
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* async get(url: string) {
|
|
35
|
+
* return this.fetch(url) // no more error
|
|
36
|
+
* }
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare function bindFetch<C = FetchContext>(fetch?: Fetch<C>, context?: C): ((this: unknown, input: string | URL | Request, init?: RequestInit | undefined) => Promise<Response>) & {
|
|
41
|
+
bind(context: unknown): (input: string | URL | Request, init?: RequestInit | undefined) => Promise<Response>;
|
|
42
|
+
};
|
|
10
43
|
//# sourceMappingURL=fetch-wrap.d.ts.map
|
package/dist/fetch-wrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-wrap.d.ts","sourceRoot":"","sources":["../src/fetch-wrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch-wrap.d.ts","sourceRoot":"","sources":["../src/fetch-wrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAwB,MAAM,YAAY,CAAA;AAItE,wBAAgB,WAAW,CAAC,CAAC,GAAG,YAAY,EAC1C,KAAK,GAAE,KAAK,CAAC,CAAC,CAAoB;;EA0BnC;AAED,eAAO,MAAM,UAAU,+CAEd,MAAM,CAAC,CAAC,KACd,MAAM,CAAC,CAqCT,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,YAAY,EACxC,KAAK,GAAE,KAAK,CAAC,CAAC,CAAoB,EAClC,OAAO,GAAE,CAAmB;;EAS7B"}
|
package/dist/fetch-wrap.js
CHANGED
|
@@ -1,73 +1,104 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.bindFetch = exports.timedFetch = exports.loggedFetch = void 0;
|
|
4
|
+
const fetch_request_js_1 = require("./fetch-request.js");
|
|
5
|
+
const fetch_js_1 = require("./fetch.js");
|
|
4
6
|
const transformed_response_js_1 = require("./transformed-response.js");
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
console.error(`< Error:`, error);
|
|
22
|
-
throw error;
|
|
23
|
-
}
|
|
7
|
+
const util_js_1 = require("./util.js");
|
|
8
|
+
function loggedFetch(fetch = globalThis.fetch) {
|
|
9
|
+
return (0, fetch_js_1.toRequestTransformer)(async function (request) {
|
|
10
|
+
const requestMessage = await (0, util_js_1.stringifyMessage)(request);
|
|
11
|
+
console.info(`> ${request.method} ${request.url}\n${(0, util_js_1.padLines)(requestMessage, ' ')}`);
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetch.call(this, request);
|
|
14
|
+
const responseMessage = await (0, util_js_1.stringifyMessage)(response.clone());
|
|
15
|
+
console.info(`< HTTP/1.1 ${response.status} ${response.statusText}\n${(0, util_js_1.padLines)(responseMessage, ' ')}`);
|
|
16
|
+
return response;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
console.error(`< Error:`, error);
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
24
23
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
.join('\n ') + '\n ';
|
|
28
|
-
const stringifyHeaders = (headers) => Array.from(headers)
|
|
29
|
-
.map(([name, value]) => ` ${name}: ${value}\n`)
|
|
30
|
-
.join('');
|
|
31
|
-
const stringifyBody = (body) => body ? `\n ${body.replace(/\r?\n/g, '\\n')}` : '';
|
|
32
|
-
const timeoutFetchWrap = ({ fetch = globalThis.fetch, timeout = 60e3, } = {}) => {
|
|
24
|
+
exports.loggedFetch = loggedFetch;
|
|
25
|
+
const timedFetch = (timeout = 60e3, fetch = globalThis.fetch) => {
|
|
33
26
|
if (timeout === Infinity)
|
|
34
27
|
return fetch;
|
|
35
28
|
if (!Number.isFinite(timeout) || timeout <= 0) {
|
|
36
29
|
throw new TypeError('Timeout must be positive');
|
|
37
30
|
}
|
|
38
|
-
return async function (request) {
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
return (0, fetch_js_1.toRequestTransformer)(async function (request) {
|
|
32
|
+
const controller = new AbortController();
|
|
33
|
+
const signal = controller.signal;
|
|
34
|
+
const abort = () => {
|
|
35
|
+
controller.abort();
|
|
36
|
+
};
|
|
37
|
+
const cleanup = () => {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
request.signal?.removeEventListener('abort', abort);
|
|
40
|
+
};
|
|
41
|
+
const timer = setTimeout(abort, timeout);
|
|
42
|
+
if (typeof timer === 'object')
|
|
43
|
+
timer.unref?.(); // only on node
|
|
44
|
+
request.signal?.addEventListener('abort', abort);
|
|
45
|
+
signal.addEventListener('abort', cleanup);
|
|
46
|
+
const response = await fetch.call(this, request, { signal });
|
|
47
|
+
if (!response.body) {
|
|
48
|
+
cleanup();
|
|
49
|
+
return response;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Cleanup the timer & event listeners when the body stream is closed
|
|
53
|
+
const transform = new TransformStream({ flush: cleanup });
|
|
54
|
+
return new transformed_response_js_1.TransformedResponse(response, transform);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
41
57
|
};
|
|
42
|
-
exports.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
58
|
+
exports.timedFetch = timedFetch;
|
|
59
|
+
/**
|
|
60
|
+
* Wraps a fetch function to bind it to a specific context, and wrap any thrown
|
|
61
|
+
* errors into a FetchRequestError.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* class MyClient {
|
|
67
|
+
* constructor(private fetch = globalThis.fetch) {}
|
|
68
|
+
*
|
|
69
|
+
* async get(url: string) {
|
|
70
|
+
* // This will generate an error, because the context used is not a
|
|
71
|
+
* // FetchContext (it's a MyClient instance).
|
|
72
|
+
* return this.fetch(url)
|
|
73
|
+
* }
|
|
74
|
+
* }
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* class MyClient {
|
|
81
|
+
* private fetch: Fetch<unknown>
|
|
82
|
+
*
|
|
83
|
+
* constructor(fetch = globalThis.fetch) {
|
|
84
|
+
* this.fetch = bindFetch(fetch)
|
|
85
|
+
* }
|
|
86
|
+
*
|
|
87
|
+
* async get(url: string) {
|
|
88
|
+
* return this.fetch(url) // no more error
|
|
89
|
+
* }
|
|
90
|
+
* }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
function bindFetch(fetch = globalThis.fetch, context = globalThis) {
|
|
94
|
+
return (0, fetch_js_1.toRequestTransformer)(async (request) => {
|
|
95
|
+
try {
|
|
96
|
+
return await fetch.call(context, request);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
throw fetch_request_js_1.FetchRequestError.from(request, err);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
71
102
|
}
|
|
72
|
-
exports.
|
|
103
|
+
exports.bindFetch = bindFetch;
|
|
73
104
|
//# sourceMappingURL=fetch-wrap.js.map
|
package/dist/fetch-wrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-wrap.js","sourceRoot":"","sources":["../src/fetch-wrap.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fetch-wrap.js","sourceRoot":"","sources":["../src/fetch-wrap.ts"],"names":[],"mappings":"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"}
|
package/dist/fetch.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { ThisParameterOverride } from './util.js';
|
|
2
|
+
export type FetchContext = void | null | typeof globalThis;
|
|
3
|
+
export type FetchBound = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
4
|
+
export type Fetch<C = FetchContext> = ThisParameterOverride<C, FetchBound>;
|
|
5
|
+
export type SimpleFetchBound = (input: Request) => Promise<Response>;
|
|
6
|
+
export type SimpleFetch<C = FetchContext> = ThisParameterOverride<C, SimpleFetchBound>;
|
|
7
|
+
export declare function toRequestTransformer<C, O>(requestTransformer: (this: C, input: Request) => O): ThisParameterOverride<C, (input: string | URL | Request, init?: RequestInit) => O>;
|
|
8
|
+
export declare function asRequest(input: string | URL | Request, init?: RequestInit): Request;
|
|
2
9
|
//# sourceMappingURL=fetch.d.ts.map
|
package/dist/fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAEjD,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,UAAU,CAAA;AAE1D,MAAM,MAAM,UAAU,GAAG,CACvB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAA;AAMtB,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,YAAY,IAAI,qBAAqB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;AAE1E,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AACpE,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,YAAY,IAAI,qBAAqB,CAC/D,CAAC,EACD,gBAAgB,CACjB,CAAA;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EACvC,kBAAkB,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,CAAC,GACjD,qBAAqB,CACtB,CAAC,EACD,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,CAAC,CACzD,CAIA;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC7B,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAGT"}
|
package/dist/fetch.js
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.asRequest = exports.toRequestTransformer = void 0;
|
|
4
|
+
function toRequestTransformer(requestTransformer) {
|
|
5
|
+
return function (input, init) {
|
|
6
|
+
return requestTransformer.call(this, asRequest(input, init));
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
exports.toRequestTransformer = toRequestTransformer;
|
|
10
|
+
function asRequest(input, init) {
|
|
11
|
+
if (!init && input instanceof Request)
|
|
12
|
+
return input;
|
|
13
|
+
return new Request(input, init);
|
|
14
|
+
}
|
|
15
|
+
exports.asRequest = asRequest;
|
|
3
16
|
//# sourceMappingURL=fetch.js.map
|
package/dist/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":";;;AAqBA,SAAgB,oBAAoB,CAClC,kBAAkD;IAKlD,OAAO,UAAmB,KAAK,EAAE,IAAI;QACnC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAA;AACH,CAAC;AATD,oDASC;AAED,SAAgB,SAAS,CACvB,KAA6B,EAC7B,IAAkB;IAElB,IAAI,CAAC,IAAI,IAAI,KAAK,YAAY,OAAO;QAAE,OAAO,KAAK,CAAA;IACnD,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AACjC,CAAC;AAND,8BAMC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformed-response.d.ts","sourceRoot":"","sources":["../src/transformed-response.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,QAAQ;;gBAGnC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe;
|
|
1
|
+
{"version":3,"file":"transformed-response.d.ts","sourceRoot":"","sources":["../src/transformed-response.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,QAAQ;;gBAGnC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe;IAiB1D;;OAEG;IACH,IAAI,GAAG,WAEN;IACD,IAAI,UAAU,YAEb;IACD,IAAI,IAAI,iBAEP;IACD,IAAI,UAAU,WAEb;CACF"}
|
|
@@ -15,10 +15,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.TransformedResponse = void 0;
|
|
16
16
|
class TransformedResponse extends Response {
|
|
17
17
|
constructor(response, transform) {
|
|
18
|
-
if (response.body
|
|
18
|
+
if (!response.body) {
|
|
19
|
+
throw new TypeError('Response body is not available');
|
|
20
|
+
}
|
|
21
|
+
if (response.bodyUsed) {
|
|
19
22
|
throw new TypeError('Response body is already used');
|
|
20
23
|
}
|
|
21
|
-
super(response.body
|
|
24
|
+
super(response.body.pipeThrough(transform), {
|
|
22
25
|
status: response.status,
|
|
23
26
|
statusText: response.statusText,
|
|
24
27
|
headers: response.headers,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformed-response.js","sourceRoot":"","sources":["../src/transformed-response.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,MAAa,mBAAoB,SAAQ,QAAQ;IAG/C,YAAY,QAAkB,EAAE,SAA0B;QACxD,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"transformed-response.js","sourceRoot":"","sources":["../src/transformed-response.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,MAAa,mBAAoB,SAAQ,QAAQ;IAG/C,YAAY,QAAkB,EAAE,SAA0B;QACxD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAA;QACtD,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;YAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAA;QAdJ,gDAAmB;QAgBjB,uBAAA,IAAI,iCAAa,QAAQ,MAAA,CAAA;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,uBAAA,IAAI,qCAAU,CAAC,GAAG,CAAA;IAC3B,CAAC;IACD,IAAI,UAAU;QACZ,OAAO,uBAAA,IAAI,qCAAU,CAAC,UAAU,CAAA;IAClC,CAAC;IACD,IAAI,IAAI;QACN,OAAO,uBAAA,IAAI,qCAAU,CAAC,IAAI,CAAA;IAC5B,CAAC;IACD,IAAI,UAAU;QACZ,OAAO,uBAAA,IAAI,qCAAU,CAAC,UAAU,CAAA;IAClC,CAAC;CACF;AAnCD,kDAmCC"}
|
package/dist/util.d.ts
CHANGED
|
@@ -6,19 +6,50 @@ export type JsonObject = {
|
|
|
6
6
|
[key: string]: Json;
|
|
7
7
|
};
|
|
8
8
|
export type JsonArray = Json[];
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
}
|
|
9
|
+
export type ThisParameterOverride<C, Fn extends (...a: any) => any> = Fn extends (...args: infer P) => infer R ? ((this: C, ...args: P) => R) & {
|
|
10
|
+
bind(context: C): (...args: P) => R;
|
|
11
|
+
} : never;
|
|
14
12
|
export declare function isIp(hostname: string): boolean;
|
|
15
|
-
export declare const ifObject: <V>(v
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
export declare
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
export declare const ifObject: <V>(v: V) => (V extends symbol | Function | JsonScalar | JsonArray ? never : V extends Json ? V : Record<string, unknown>) | undefined;
|
|
14
|
+
export declare const ifString: <V>(v: V) => (V & string) | undefined;
|
|
15
|
+
export declare class MaxBytesTransformStream extends TransformStream<Uint8Array, Uint8Array> {
|
|
16
|
+
constructor(maxBytes: number);
|
|
17
|
+
}
|
|
18
|
+
export declare function padLines(input: string, pad: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* @param [onCancellationError] - Callback that will trigger to asynchronously
|
|
21
|
+
* handle any error that occurs while cancelling the response body. Providing
|
|
22
|
+
* this will speed up the process and avoid potential deadlocks. Defaults to
|
|
23
|
+
* awaiting the cancellation operation. use `"log"` to log the error.
|
|
24
|
+
* @see {@link https://undici.nodejs.org/#/?id=garbage-collection}
|
|
25
|
+
* @note awaiting this function's result, when no `onCancellationError` is
|
|
26
|
+
* provided, might result in a dead lock. Indeed, if the response was cloned(),
|
|
27
|
+
* the response.body.cancel() method will not resolve until the other response's
|
|
28
|
+
* body is consumed/cancelled.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* // Make sure response was not cloned, or that every cloned response was
|
|
33
|
+
* // consumed/cancelled before awaiting this function's result.
|
|
34
|
+
* await cancelBody(response)
|
|
35
|
+
* ```
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* await cancelBody(response, (err) => {
|
|
39
|
+
* // No biggie, let's just log the error
|
|
40
|
+
* console.warn('Failed to cancel response body', err)
|
|
41
|
+
* })
|
|
42
|
+
* ```
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* // Will generate an "unhandledRejection" if an error occurs while cancelling
|
|
46
|
+
* // the response body. This will likely crash the process.
|
|
47
|
+
* await cancelBody(response, (err) => { throw err })
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function cancelBody(body: Body, onCancellationError?: 'log' | ((err: unknown) => void)): Promise<void>;
|
|
51
|
+
export declare function logCancellationError(err: unknown): void;
|
|
52
|
+
export declare function stringifyMessage(input: Body & {
|
|
53
|
+
headers: Headers;
|
|
54
|
+
}): Promise<string>;
|
|
24
55
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AACzD,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,IAAI,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;CAAE,CAAA;AAC5E,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAA;AAChD,MAAM,MAAM,SAAS,GAAG,IAAI,EAAE,CAAA;AAE9B,
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAA;AACzD,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,IAAI,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAA;CAAE,CAAA;AAC5E,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAA;AAChD,MAAM,MAAM,SAAS,GAAG,IAAI,EAAE,CAAA;AAE9B,MAAM,MAAM,qBAAqB,CAC/B,CAAC,EACD,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,IAC3B,EAAE,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GACxC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;CACpC,GACD,KAAK,CAAA;AAET,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,WAQpC;AAGD,eAAO,MAAM,QAAQ,SAAU,CAAC,8HAe/B,CAAA;AAED,eAAO,MAAM,QAAQ,SAAU,CAAC,6BAA4C,CAAA;AAE5E,qBAAa,uBAAwB,SAAQ,eAAe,CAC1D,UAAU,EACV,UAAU,CACX;gBACa,QAAQ,EAAE,MAAM;CAqB7B;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAGlD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,EACV,mBAAmB,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC,GACrD,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAEvD;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,IAAI,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,mBAQxE"}
|
package/dist/util.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// TODO: Move to a shared package ?
|
|
2
|
+
// @TODO: Move some of these to a shared package ?
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
4
|
+
exports.stringifyMessage = exports.logCancellationError = exports.cancelBody = exports.padLines = exports.MaxBytesTransformStream = exports.ifString = exports.ifObject = exports.isIp = void 0;
|
|
5
5
|
function isIp(hostname) {
|
|
6
6
|
// IPv4
|
|
7
7
|
if (hostname.match(/^\d+\.\d+\.\d+\.\d+$/))
|
|
@@ -12,7 +12,6 @@ function isIp(hostname) {
|
|
|
12
12
|
return false;
|
|
13
13
|
}
|
|
14
14
|
exports.isIp = isIp;
|
|
15
|
-
// TODO: Move to a shared package ?
|
|
16
15
|
const plainObjectProto = Object.prototype;
|
|
17
16
|
const ifObject = (v) => {
|
|
18
17
|
if (typeof v === 'object' && v != null && !Array.isArray(v)) {
|
|
@@ -25,27 +24,119 @@ const ifObject = (v) => {
|
|
|
25
24
|
return undefined;
|
|
26
25
|
};
|
|
27
26
|
exports.ifObject = ifObject;
|
|
28
|
-
const ifArray = (v) => (Array.isArray(v) ? v : undefined);
|
|
29
|
-
exports.ifArray = ifArray;
|
|
30
|
-
const ifScalar = (v) => {
|
|
31
|
-
switch (typeof v) {
|
|
32
|
-
case 'string':
|
|
33
|
-
case 'number':
|
|
34
|
-
case 'boolean':
|
|
35
|
-
return v;
|
|
36
|
-
default:
|
|
37
|
-
if (v === null)
|
|
38
|
-
return null;
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
exports.ifScalar = ifScalar;
|
|
43
|
-
const ifBoolean = (v) => (typeof v === 'boolean' ? v : undefined);
|
|
44
|
-
exports.ifBoolean = ifBoolean;
|
|
45
27
|
const ifString = (v) => (typeof v === 'string' ? v : undefined);
|
|
46
28
|
exports.ifString = ifString;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
29
|
+
class MaxBytesTransformStream extends TransformStream {
|
|
30
|
+
constructor(maxBytes) {
|
|
31
|
+
// Note: negation accounts for invalid value types (NaN, non numbers)
|
|
32
|
+
if (!(maxBytes >= 0)) {
|
|
33
|
+
throw new TypeError('maxBytes must be a non-negative number');
|
|
34
|
+
}
|
|
35
|
+
let bytesRead = 0;
|
|
36
|
+
super({
|
|
37
|
+
transform: (chunk, ctrl) => {
|
|
38
|
+
if ((bytesRead += chunk.length) <= maxBytes) {
|
|
39
|
+
ctrl.enqueue(chunk);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
ctrl.error(new Error('Response too large'));
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.MaxBytesTransformStream = MaxBytesTransformStream;
|
|
49
|
+
const LINE_BREAK = /\r?\n/g;
|
|
50
|
+
function padLines(input, pad) {
|
|
51
|
+
if (!input)
|
|
52
|
+
return input;
|
|
53
|
+
return pad + input.replace(LINE_BREAK, `$&${pad}`);
|
|
54
|
+
}
|
|
55
|
+
exports.padLines = padLines;
|
|
56
|
+
/**
|
|
57
|
+
* @param [onCancellationError] - Callback that will trigger to asynchronously
|
|
58
|
+
* handle any error that occurs while cancelling the response body. Providing
|
|
59
|
+
* this will speed up the process and avoid potential deadlocks. Defaults to
|
|
60
|
+
* awaiting the cancellation operation. use `"log"` to log the error.
|
|
61
|
+
* @see {@link https://undici.nodejs.org/#/?id=garbage-collection}
|
|
62
|
+
* @note awaiting this function's result, when no `onCancellationError` is
|
|
63
|
+
* provided, might result in a dead lock. Indeed, if the response was cloned(),
|
|
64
|
+
* the response.body.cancel() method will not resolve until the other response's
|
|
65
|
+
* body is consumed/cancelled.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* // Make sure response was not cloned, or that every cloned response was
|
|
70
|
+
* // consumed/cancelled before awaiting this function's result.
|
|
71
|
+
* await cancelBody(response)
|
|
72
|
+
* ```
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* await cancelBody(response, (err) => {
|
|
76
|
+
* // No biggie, let's just log the error
|
|
77
|
+
* console.warn('Failed to cancel response body', err)
|
|
78
|
+
* })
|
|
79
|
+
* ```
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* // Will generate an "unhandledRejection" if an error occurs while cancelling
|
|
83
|
+
* // the response body. This will likely crash the process.
|
|
84
|
+
* await cancelBody(response, (err) => { throw err })
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
async function cancelBody(body, onCancellationError) {
|
|
88
|
+
if (body.body &&
|
|
89
|
+
!body.bodyUsed &&
|
|
90
|
+
!body.body.locked &&
|
|
91
|
+
// Support for alternative fetch implementations
|
|
92
|
+
typeof body.body.cancel === 'function') {
|
|
93
|
+
if (typeof onCancellationError === 'function') {
|
|
94
|
+
void body.body.cancel().catch(onCancellationError);
|
|
95
|
+
}
|
|
96
|
+
else if (onCancellationError === 'log') {
|
|
97
|
+
void body.body.cancel().catch(logCancellationError);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
await body.body.cancel();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.cancelBody = cancelBody;
|
|
105
|
+
function logCancellationError(err) {
|
|
106
|
+
console.warn('Failed to cancel response body', err);
|
|
107
|
+
}
|
|
108
|
+
exports.logCancellationError = logCancellationError;
|
|
109
|
+
async function stringifyMessage(input) {
|
|
110
|
+
try {
|
|
111
|
+
const headers = stringifyHeaders(input.headers);
|
|
112
|
+
const payload = await stringifyBody(input);
|
|
113
|
+
return headers && payload ? `${headers}\n${payload}` : headers || payload;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
void cancelBody(input, 'log');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.stringifyMessage = stringifyMessage;
|
|
120
|
+
function stringifyHeaders(headers) {
|
|
121
|
+
return Array.from(headers)
|
|
122
|
+
.map(([name, value]) => `${name}: ${value}`)
|
|
123
|
+
.join('\n');
|
|
124
|
+
}
|
|
125
|
+
async function stringifyBody(body) {
|
|
126
|
+
try {
|
|
127
|
+
const blob = await body.blob();
|
|
128
|
+
if (blob.type?.startsWith('text/')) {
|
|
129
|
+
const text = await blob.text();
|
|
130
|
+
return JSON.stringify(text);
|
|
131
|
+
}
|
|
132
|
+
if (/application\/(?:\w+\+)?json/.test(blob.type)) {
|
|
133
|
+
const text = await blob.text();
|
|
134
|
+
return text.includes('\n') ? JSON.stringify(JSON.parse(text)) : text;
|
|
135
|
+
}
|
|
136
|
+
return `[Body size: ${blob.size}, type: ${JSON.stringify(blob.type)} ]`;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return '[Body could not be read]';
|
|
140
|
+
}
|
|
141
|
+
}
|
|
51
142
|
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|