snapreq 0.0.3 → 0.0.5
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/README.md +12 -0
- package/{types → build}/capabilities.d.ts +1 -0
- package/build/capabilities.d.ts.map +1 -0
- package/{src → build}/capabilities.js +11 -12
- package/{types → build}/errors.d.ts +18 -0
- package/build/errors.d.ts.map +1 -0
- package/build/errors.js +82 -0
- package/{types → build}/headers.d.ts +1 -0
- package/build/headers.d.ts.map +1 -0
- package/build/headers.js +89 -0
- package/{types → build}/request.d.ts +1 -0
- package/build/request.d.ts.map +1 -0
- package/build/request.js +89 -0
- package/{types → build}/response.d.ts +21 -1
- package/build/response.d.ts.map +1 -0
- package/build/response.js +171 -0
- package/{types → build}/retry.d.ts +1 -0
- package/build/retry.d.ts.map +1 -0
- package/build/retry.js +95 -0
- package/{types → build}/snap-req.d.ts +72 -1
- package/build/snap-req.d.ts.map +1 -0
- package/build/snap-req.js +349 -0
- package/{types → build}/transports/fetch-transport.d.ts +1 -0
- package/build/transports/fetch-transport.d.ts.map +1 -0
- package/build/transports/fetch-transport.js +116 -0
- package/build/transports/fetch.d.ts +2 -0
- package/build/transports/fetch.d.ts.map +1 -0
- package/build/transports/fetch.js +3 -0
- package/{types → build}/transports/node-transport.d.ts +1 -0
- package/build/transports/node-transport.d.ts.map +1 -0
- package/build/transports/node-transport.js +287 -0
- package/build/transports/proxy-bounce-transport.d.ts +27 -0
- package/build/transports/proxy-bounce-transport.d.ts.map +1 -0
- package/build/transports/proxy-bounce-transport.js +116 -0
- package/{types → build}/transports/select.d.ts +1 -0
- package/build/transports/select.d.ts.map +1 -0
- package/build/transports/select.js +69 -0
- package/{types → build}/transports/xhr-transport.d.ts +1 -0
- package/build/transports/xhr-transport.d.ts.map +1 -0
- package/build/transports/xhr-transport.js +93 -0
- package/build/transports/xhr.d.ts +2 -0
- package/build/transports/xhr.d.ts.map +1 -0
- package/build/transports/xhr.js +3 -0
- package/{types → build}/websocket/websocket-channel.d.ts +1 -0
- package/build/websocket/websocket-channel.d.ts.map +1 -0
- package/build/websocket/websocket-channel.js +162 -0
- package/{types → build}/websocket/websocket-client.d.ts +1 -0
- package/build/websocket/websocket-client.d.ts.map +1 -0
- package/build/websocket/websocket-client.js +920 -0
- package/{types → build}/websocket/websocket-connection.d.ts +1 -0
- package/build/websocket/websocket-connection.d.ts.map +1 -0
- package/build/websocket/websocket-connection.js +148 -0
- package/build/websocket.d.ts +3 -0
- package/build/websocket.d.ts.map +1 -0
- package/build/websocket.js +4 -0
- package/package.json +20 -23
- package/src/errors.js +0 -69
- package/src/headers.js +0 -92
- package/src/request.js +0 -104
- package/src/response.js +0 -156
- package/src/retry.js +0 -105
- package/src/snap-req.js +0 -248
- package/src/transports/fetch-transport.js +0 -128
- package/src/transports/node-transport.js +0 -323
- package/src/transports/select.js +0 -73
- package/src/transports/xhr-transport.js +0 -112
- package/src/websocket/websocket-channel.js +0 -176
- package/src/websocket/websocket-client.js +0 -1034
- package/src/websocket/websocket-connection.js +0 -154
package/README.md
CHANGED
|
@@ -63,6 +63,7 @@ new SnapReq({
|
|
|
63
63
|
headers, // default headers — object or a factory `() => ({...})` for dynamic auth
|
|
64
64
|
retry, // default retry policy (see below)
|
|
65
65
|
throwOnError, // throw SnapReqHttpError on non-2xx (default false)
|
|
66
|
+
timeoutMs, // default request/body timeout in milliseconds; per-request 0 disables it
|
|
66
67
|
credentials, // fetch credentials mode: "omit" | "same-origin" | "include"
|
|
67
68
|
transport, // "auto" (default) | "node" | "fetch" | "xhr" | a transport instance
|
|
68
69
|
|
|
@@ -73,6 +74,17 @@ new SnapReq({
|
|
|
73
74
|
})
|
|
74
75
|
```
|
|
75
76
|
|
|
77
|
+
### Timeouts
|
|
78
|
+
|
|
79
|
+
Set `timeoutMs` on the client or a single request to abort stalled requests. The timeout covers the response headers and body reads through `json()`, `text()`, `bytes()`, `buffer()`, or `stream()`. A timed-out request rejects with `SnapReqTimeoutError`.
|
|
80
|
+
|
|
81
|
+
```js
|
|
82
|
+
const client = new SnapReq({baseUrl: "https://api.example.com", timeoutMs: 120000})
|
|
83
|
+
|
|
84
|
+
await client.get("/slow", {timeoutMs: 5000})
|
|
85
|
+
await client.get("/long-running", {timeoutMs: 0}) // disable the client default for this call
|
|
86
|
+
```
|
|
87
|
+
|
|
76
88
|
### Retry
|
|
77
89
|
|
|
78
90
|
Retries transient network errors and retryable HTTP statuses (502/503/504 by default). Only applies to buffered requests — never to streamed bodies.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,6CAHW,OAAO,CAAC,qBAAqB,CAAC,GAC5B,qBAAqB,CAajC;;;;;gBA1Ba,OAAO;;;;mBACP,OAAO;;;;wBACP,OAAO;;;;uBACP,OAAO;;;;sBACP,OAAO;;;;eACP,OAAO;;;;WACP,OAAO"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
|
|
3
2
|
/**
|
|
4
3
|
* @typedef {object} TransportCapabilities
|
|
5
4
|
* @property {boolean} unixSocket - Connect over a Unix domain socket.
|
|
@@ -10,7 +9,6 @@
|
|
|
10
9
|
* @property {boolean} keepAlive - Reuse connections across requests (HTTP keep-alive).
|
|
11
10
|
* @property {boolean} abort - Cancel an in-flight request via an `AbortSignal`.
|
|
12
11
|
*/
|
|
13
|
-
|
|
14
12
|
/**
|
|
15
13
|
* Builds a fully-populated capability object so callers can read every flag
|
|
16
14
|
* without undefined checks.
|
|
@@ -18,14 +16,15 @@
|
|
|
18
16
|
* @returns {TransportCapabilities} - Complete capability flags.
|
|
19
17
|
*/
|
|
20
18
|
export function buildCapabilities(overrides) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
19
|
+
return {
|
|
20
|
+
unixSocket: false,
|
|
21
|
+
tlsClientCert: false,
|
|
22
|
+
requestCompression: false,
|
|
23
|
+
responseStreaming: false,
|
|
24
|
+
requestStreaming: false,
|
|
25
|
+
keepAlive: false,
|
|
26
|
+
abort: false,
|
|
27
|
+
...overrides
|
|
28
|
+
};
|
|
31
29
|
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsU0FBUztJQUN6QyxPQUFPO1FBQ0wsVUFBVSxFQUFFLEtBQUs7UUFDakIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsa0JBQWtCLEVBQUUsS0FBSztRQUN6QixpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCLGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsU0FBUyxFQUFFLEtBQUs7UUFDaEIsS0FBSyxFQUFFLEtBQUs7UUFDWixHQUFHLFNBQVM7S0FDYixDQUFBO0FBQ0gsQ0FBQyJ9
|
|
@@ -62,3 +62,21 @@ export class SnapReqAbortError extends SnapReqError {
|
|
|
62
62
|
/** @param {string} [message] - Human readable description. */
|
|
63
63
|
constructor(message?: string);
|
|
64
64
|
}
|
|
65
|
+
/** Thrown when a request exceeds its configured timeout. */
|
|
66
|
+
export class SnapReqTimeoutError extends SnapReqError {
|
|
67
|
+
/**
|
|
68
|
+
* @param {object} options - Error metadata.
|
|
69
|
+
* @param {string} options.method - HTTP method used for the request.
|
|
70
|
+
* @param {string} options.url - Fully resolved request URL.
|
|
71
|
+
* @param {number} options.timeoutMs - Timeout in milliseconds.
|
|
72
|
+
*/
|
|
73
|
+
constructor({ method, url, timeoutMs }: {
|
|
74
|
+
method: string;
|
|
75
|
+
url: string;
|
|
76
|
+
timeoutMs: number;
|
|
77
|
+
});
|
|
78
|
+
method: string;
|
|
79
|
+
url: string;
|
|
80
|
+
timeoutMs: number;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.js"],"names":[],"mappings":"AAEA,oDAAoD;AACpD;IACE,4DAA4D;IAC5D,qBADY,MAAM,EAIjB;CACF;AAED;;;;;GAKG;AACH;IACE;;;;;;;;;OASG;IACH,kFARG;QAAwB,OAAO,EAAvB,MAAM;QACU,MAAM,EAAtB,MAAM;QACU,GAAG,EAAnB,MAAM;QACU,MAAM,EAAtB,MAAM;QACW,UAAU,GAA3B,MAAM;QACW,YAAY,GAA7B,MAAM;QACoC,QAAQ,GAAlD,OAAO,eAAe,EAAE,OAAO;KACzC,EAUA;IANC,eAAoB;IACpB,YAAc;IACd,eAAoB;IACpB,mBAA4B;IAC5B,qBAAgC;IAChC,0CAAwB;CAE3B;AAED;;;;;GAKG;AACH;IACE;;;;;OAKG;IACH,4CAJG;QAAwB,OAAO,EAAvB,MAAM;QACU,SAAS,EAAzB,MAAM;QACW,MAAM,GAAvB,MAAM;KAChB,EAMA;IAFC,gBAAsB;IACtB,kBAA0B;CAE7B;AAED,6DAA6D;AAC7D;IACE,8DAA8D;IAC9D,sBADY,MAAM,EAIjB;CACF;AAED,4DAA4D;AAC5D;IACE;;;;;OAKG;IACH,wCAJG;QAAwB,MAAM,EAAtB,MAAM;QACU,GAAG,EAAnB,MAAM;QACU,SAAS,EAAzB,MAAM;KAChB,EAOA;IAHC,eAAoB;IACpB,YAAc;IACd,kBAA0B;CAE7B"}
|
package/build/errors.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/** Base class for every error thrown by snapreq. */
|
|
3
|
+
export class SnapReqError extends Error {
|
|
4
|
+
/** @param {string} message - Human readable description. */
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "SnapReqError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Thrown when a request completes with a non-2xx status and the caller asked
|
|
12
|
+
* snapreq to treat error statuses as failures (`throwOnError`, the default for
|
|
13
|
+
* the high-level helpers). Carries enough metadata to build a friendly message
|
|
14
|
+
* without re-reading the response.
|
|
15
|
+
*/
|
|
16
|
+
export class SnapReqHttpError extends SnapReqError {
|
|
17
|
+
/**
|
|
18
|
+
* @param {object} options - Error metadata.
|
|
19
|
+
* @param {string} options.message - Human readable description.
|
|
20
|
+
* @param {string} options.method - HTTP method used for the request.
|
|
21
|
+
* @param {string} options.url - Fully resolved request URL.
|
|
22
|
+
* @param {number} options.status - HTTP status code returned by the server.
|
|
23
|
+
* @param {string} [options.statusText] - HTTP status text returned by the server.
|
|
24
|
+
* @param {string} [options.responseText] - Decoded response body, when available.
|
|
25
|
+
* @param {import("./response.js").default} [options.response] - The response that failed.
|
|
26
|
+
*/
|
|
27
|
+
constructor({ message, method, url, status, statusText, responseText, response }) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "SnapReqHttpError";
|
|
30
|
+
this.method = method;
|
|
31
|
+
this.url = url;
|
|
32
|
+
this.status = status;
|
|
33
|
+
this.statusText = statusText;
|
|
34
|
+
this.responseText = responseText;
|
|
35
|
+
this.response = response;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Thrown when a request asks for a capability the active transport cannot
|
|
40
|
+
* provide on the current platform (for example a Unix socket or request-body
|
|
41
|
+
* compression in a browser). The API stays identical across platforms; this
|
|
42
|
+
* error is how snapreq tells you a specific feature had to be left out.
|
|
43
|
+
*/
|
|
44
|
+
export class SnapReqUnsupportedFeatureError extends SnapReqError {
|
|
45
|
+
/**
|
|
46
|
+
* @param {object} options - Error metadata.
|
|
47
|
+
* @param {string} options.feature - The capability that is not supported.
|
|
48
|
+
* @param {string} options.transport - Name of the active transport.
|
|
49
|
+
* @param {string} [options.detail] - Optional extra context.
|
|
50
|
+
*/
|
|
51
|
+
constructor({ feature, transport, detail }) {
|
|
52
|
+
super(`The "${transport}" transport does not support ${feature}${detail ? `: ${detail}` : ""}.`);
|
|
53
|
+
this.name = "SnapReqUnsupportedFeatureError";
|
|
54
|
+
this.feature = feature;
|
|
55
|
+
this.transport = transport;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Thrown when a request is aborted via an `AbortSignal`. */
|
|
59
|
+
export class SnapReqAbortError extends SnapReqError {
|
|
60
|
+
/** @param {string} [message] - Human readable description. */
|
|
61
|
+
constructor(message = "Request aborted.") {
|
|
62
|
+
super(message);
|
|
63
|
+
this.name = "SnapReqAbortError";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Thrown when a request exceeds its configured timeout. */
|
|
67
|
+
export class SnapReqTimeoutError extends SnapReqError {
|
|
68
|
+
/**
|
|
69
|
+
* @param {object} options - Error metadata.
|
|
70
|
+
* @param {string} options.method - HTTP method used for the request.
|
|
71
|
+
* @param {string} options.url - Fully resolved request URL.
|
|
72
|
+
* @param {number} options.timeoutMs - Timeout in milliseconds.
|
|
73
|
+
*/
|
|
74
|
+
constructor({ method, url, timeoutMs }) {
|
|
75
|
+
super(`Request timed out after ${timeoutMs}ms: ${method} ${url}`);
|
|
76
|
+
this.name = "SnapReqTimeoutError";
|
|
77
|
+
this.method = method;
|
|
78
|
+
this.url = url;
|
|
79
|
+
this.timeoutMs = timeoutMs;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosb0RBQW9EO0FBQ3BELE1BQU0sT0FBTyxZQUFhLFNBQVEsS0FBSztJQUNyQyw0REFBNEQ7SUFDNUQsWUFBWSxPQUFPO1FBQ2pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFBO0lBQzVCLENBQUM7Q0FDRjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFlBQVk7SUFDaEQ7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBQztRQUM1RSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFBO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sOEJBQStCLFNBQVEsWUFBWTtJQUM5RDs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQztRQUN0QyxLQUFLLENBQUMsUUFBUSxTQUFTLGdDQUFnQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ2hHLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0NBQWdDLENBQUE7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7SUFDNUIsQ0FBQztDQUNGO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBQ2pELDhEQUE4RDtJQUM5RCxZQUFZLE9BQU8sR0FBRyxrQkFBa0I7UUFDdEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2QsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQTtJQUNqQyxDQUFDO0NBQ0Y7QUFFRCw0REFBNEQ7QUFDNUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFlBQVk7SUFDbkQ7Ozs7O09BS0c7SUFDSCxZQUFZLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUM7UUFDbEMsS0FBSyxDQUFDLDJCQUEyQixTQUFTLE9BQU8sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDakUsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQTtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0lBQzVCLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../src/headers.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH;IACE;;OAEG;IACH,mBAFW,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,cAAc,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAqBlG;IAlBC,sFAAsF;IACtF,MADW,GAAG,CAAC,MAAM,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC,CAChC;IAmBvB;;;;OAIG;IACH,UAJW,MAAM,SACN,MAAM,GAAG,MAAM,GACb,IAAI,CAIhB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,MAAM,GAAG,IAAI,CAIzB;IAED;;;OAGG;IACH,UAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAIhB;IAED;;;OAGG;IACH,WAFa,gBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAI9C;IAED,mFAAmF;IACnF,WADc,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAG/B;IAED;;;;OAIG;IACH,YAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASlC;CACF"}
|
package/build/headers.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* A tiny case-insensitive header bag. Works the same on every platform and
|
|
4
|
+
* avoids depending on the DOM `Headers` global (absent in some runtimes) or on
|
|
5
|
+
* Node's header handling. Header values are always stored as strings.
|
|
6
|
+
*/
|
|
7
|
+
export default class SnapReqHeaders {
|
|
8
|
+
/**
|
|
9
|
+
* @param {Record<string, string | number | string[]> | SnapReqHeaders | Iterable<[string, string]>} [init] - Initial headers.
|
|
10
|
+
*/
|
|
11
|
+
constructor(init) {
|
|
12
|
+
/** @type {Map<string, {name: string, value: string}>} - Keyed by lower-cased name. */
|
|
13
|
+
this._map = new Map();
|
|
14
|
+
if (!init)
|
|
15
|
+
return;
|
|
16
|
+
if (init instanceof SnapReqHeaders) {
|
|
17
|
+
for (const [name, value] of init.entries())
|
|
18
|
+
this.set(name, value);
|
|
19
|
+
}
|
|
20
|
+
else if (typeof ( /** @type {any} */(init)[Symbol.iterator]) === "function") {
|
|
21
|
+
for (const [name, value] of /** @type {Iterable<[string, string]>} */ (init))
|
|
22
|
+
this.set(name, value);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
for (const [name, value] of Object.entries(init)) {
|
|
26
|
+
if (Array.isArray(value)) {
|
|
27
|
+
this.set(name, value.join(", "));
|
|
28
|
+
}
|
|
29
|
+
else if (value !== undefined && value !== null) {
|
|
30
|
+
this.set(name, String(value));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @param {string} name - Header name (case-insensitive).
|
|
37
|
+
* @param {string | number} value - Header value.
|
|
38
|
+
* @returns {void}
|
|
39
|
+
*/
|
|
40
|
+
set(name, value) {
|
|
41
|
+
this._map.set(name.toLowerCase(), { name, value: String(value) });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @param {string} name - Header name (case-insensitive).
|
|
45
|
+
* @returns {string | null} - The header value or null when absent.
|
|
46
|
+
*/
|
|
47
|
+
get(name) {
|
|
48
|
+
return this._map.get(name.toLowerCase())?.value ?? null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @param {string} name - Header name (case-insensitive).
|
|
52
|
+
* @returns {boolean} - Whether the header is present.
|
|
53
|
+
*/
|
|
54
|
+
has(name) {
|
|
55
|
+
return this._map.has(name.toLowerCase());
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* @param {string} name - Header name (case-insensitive).
|
|
59
|
+
* @returns {void}
|
|
60
|
+
*/
|
|
61
|
+
delete(name) {
|
|
62
|
+
this._map.delete(name.toLowerCase());
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @yields {[string, string]} - Name/value pair preserving original casing.
|
|
66
|
+
* @returns {IterableIterator<[string, string]>} - Name/value pairs preserving original casing.
|
|
67
|
+
*/
|
|
68
|
+
*entries() {
|
|
69
|
+
for (const { name, value } of this._map.values())
|
|
70
|
+
yield [name, value];
|
|
71
|
+
}
|
|
72
|
+
/** @returns {[string, string][]} - Name/value pairs preserving original casing. */
|
|
73
|
+
toArray() {
|
|
74
|
+
return [...this.entries()];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Plain object form keyed by the original header casing. Suitable for
|
|
78
|
+
* passing straight to `http.request` or `fetch`.
|
|
79
|
+
* @returns {Record<string, string>} - Header object.
|
|
80
|
+
*/
|
|
81
|
+
toObject() {
|
|
82
|
+
/** @type {Record<string, string>} */
|
|
83
|
+
const object = {};
|
|
84
|
+
for (const { name, value } of this._map.values())
|
|
85
|
+
object[name] = value;
|
|
86
|
+
return object;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWFkZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFjO0lBQ2pDOztPQUVHO0lBQ0gsWUFBWSxJQUFJO1FBQ2Qsc0ZBQXNGO1FBQ3RGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUVyQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU07UUFFakIsSUFBSSxJQUFJLFlBQVksY0FBYyxFQUFFLENBQUM7WUFDbkMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDbkUsQ0FBQzthQUFNLElBQUksT0FBTyxFQUFDLGtCQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzlFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSx5Q0FBeUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNyRyxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7Z0JBQ2xDLENBQUM7cUJBQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7Z0JBQy9CLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFBO0lBQ2pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQTtJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsSUFBSTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxDQUFDLE9BQU87UUFDTixLQUFLLE1BQU0sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsT0FBTztRQUNMLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUTtRQUNOLHFDQUFxQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7UUFFakIsS0FBSyxNQUFNLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUVwRSxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../src/request.js"],"names":[],"mappings":"AAgBA;;;;;;;GAOG;AACH,kCALW,MAAM,GAAG,SAAS,QAClB,MAAM,SACN,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,SAAS,GACtE,MAAM,CA2BlB;AAED;;;;GAIG;AACH,mCAHW,OAAO,GACL,OAAO,CAUnB;AAED;;;;;;GAMG;AACH,oCAJW,OAAO,WACP,cAAc,GACZ,cAAc,CAgC1B;kCAlGY,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM;;;;;UAK9C,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ;;;;WACpC,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,IAAI;;2BATzC,cAAc"}
|
package/build/request.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import SnapReqHeaders from "./headers.js";
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {"identity" | "gzip" | "deflate" | "br" | "zstd"} CompressionEncoding
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {object} NormalizedBody
|
|
8
|
+
* @property {"none" | "text" | "bytes" | "stream"} kind - Shape of the body payload.
|
|
9
|
+
* @property {string | Uint8Array | AsyncIterable<Uint8Array> | null} value - The payload itself.
|
|
10
|
+
*/
|
|
11
|
+
const ABSOLUTE_URL_REGEX = /^[a-z][a-z0-9+.-]*:\/\//i;
|
|
12
|
+
/**
|
|
13
|
+
* Joins a base URL and a path and appends query parameters. `path` may be a
|
|
14
|
+
* fully-qualified URL, in which case the base is ignored.
|
|
15
|
+
* @param {string | undefined} baseUrl - Origin (and optional base path).
|
|
16
|
+
* @param {string} path - Path or absolute URL.
|
|
17
|
+
* @param {Record<string, string | number | boolean | null | undefined> | undefined} query - Query parameters.
|
|
18
|
+
* @returns {string} - Resolved absolute URL.
|
|
19
|
+
*/
|
|
20
|
+
export function buildUrl(baseUrl, path, query) {
|
|
21
|
+
/** @type {string} */
|
|
22
|
+
let resolved;
|
|
23
|
+
if (ABSOLUTE_URL_REGEX.test(path)) {
|
|
24
|
+
resolved = path;
|
|
25
|
+
}
|
|
26
|
+
else if (baseUrl) {
|
|
27
|
+
resolved = `${baseUrl.replace(/\/$/, "")}/${path.replace(/^\//, "")}`;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
resolved = path;
|
|
31
|
+
}
|
|
32
|
+
if (!query)
|
|
33
|
+
return resolved;
|
|
34
|
+
const params = new URLSearchParams();
|
|
35
|
+
for (const [key, value] of Object.entries(query)) {
|
|
36
|
+
if (value !== undefined && value !== null)
|
|
37
|
+
params.append(key, String(value));
|
|
38
|
+
}
|
|
39
|
+
const queryString = params.toString();
|
|
40
|
+
if (!queryString)
|
|
41
|
+
return resolved;
|
|
42
|
+
return resolved.includes("?") ? `${resolved}&${queryString}` : `${resolved}?${queryString}`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Determines whether a value should be sent as a streamed request body.
|
|
46
|
+
* @param {unknown} body - Candidate body value.
|
|
47
|
+
* @returns {boolean} - Whether the body is a stream.
|
|
48
|
+
*/
|
|
49
|
+
export function isStreamBody(body) {
|
|
50
|
+
return Boolean(body &&
|
|
51
|
+
typeof body === "object" &&
|
|
52
|
+
!(body instanceof Uint8Array) &&
|
|
53
|
+
!(body instanceof ArrayBuffer) &&
|
|
54
|
+
(typeof ( /** @type {any} */(body).pipe) === "function" || typeof ( /** @type {any} */(body)[Symbol.asyncIterator]) === "function"));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Normalizes a user-supplied body into one of a small set of shapes and applies
|
|
58
|
+
* a default `Content-Type` header when the caller did not set one.
|
|
59
|
+
* @param {unknown} body - Raw body value.
|
|
60
|
+
* @param {SnapReqHeaders} headers - Headers to receive a default `Content-Type`.
|
|
61
|
+
* @returns {NormalizedBody} - Normalized body descriptor.
|
|
62
|
+
*/
|
|
63
|
+
export function normalizeBody(body, headers) {
|
|
64
|
+
if (body === undefined || body === null) {
|
|
65
|
+
return { kind: "none", value: null };
|
|
66
|
+
}
|
|
67
|
+
if (body instanceof Uint8Array) {
|
|
68
|
+
if (!headers.has("content-type"))
|
|
69
|
+
headers.set("Content-Type", "application/octet-stream");
|
|
70
|
+
return { kind: "bytes", value: body };
|
|
71
|
+
}
|
|
72
|
+
if (body instanceof ArrayBuffer) {
|
|
73
|
+
if (!headers.has("content-type"))
|
|
74
|
+
headers.set("Content-Type", "application/octet-stream");
|
|
75
|
+
return { kind: "bytes", value: new Uint8Array(body) };
|
|
76
|
+
}
|
|
77
|
+
if (isStreamBody(body)) {
|
|
78
|
+
if (!headers.has("content-type"))
|
|
79
|
+
headers.set("Content-Type", "application/octet-stream");
|
|
80
|
+
return { kind: "stream", value: /** @type {AsyncIterable<Uint8Array>} */ (body) };
|
|
81
|
+
}
|
|
82
|
+
if (typeof body === "string") {
|
|
83
|
+
return { kind: "text", value: body };
|
|
84
|
+
}
|
|
85
|
+
if (!headers.has("content-type"))
|
|
86
|
+
headers.set("Content-Type", "application/json");
|
|
87
|
+
return { kind: "text", value: JSON.stringify(body) };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZXF1ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSxjQUFjLENBQUE7QUFFekM7O0dBRUc7QUFFSDs7OztHQUlHO0FBRUgsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQTtBQUVyRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUs7SUFDM0MscUJBQXFCO0lBQ3JCLElBQUksUUFBUSxDQUFBO0lBRVosSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQ2pCLENBQUM7U0FBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ25CLFFBQVEsR0FBRyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUE7SUFDdkUsQ0FBQztTQUFNLENBQUM7UUFDTixRQUFRLEdBQUcsSUFBSSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sUUFBUSxDQUFBO0lBRTNCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUE7SUFFcEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7WUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUM5RSxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcs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
|
|
@@ -15,8 +15,10 @@ export default class SnapReqResponse {
|
|
|
15
15
|
* @param {Uint8Array} [options.bytes] - Fully-read body, when the transport already buffered it.
|
|
16
16
|
* @param {AsyncIterable<Uint8Array>} [options.stream] - Streamed body, when the transport supports streaming.
|
|
17
17
|
* @param {import("node:stream").Readable} [options.nodeStream] - Raw Node stream, when available, for advanced consumers.
|
|
18
|
+
* @param {() => void} [options.onBodyDone] - Callback fired when body reading finishes or fails.
|
|
19
|
+
* @param {(error: unknown) => unknown} [options.mapBodyError] - Maps body read errors before rethrowing.
|
|
18
20
|
*/
|
|
19
|
-
constructor({ url, method, status, statusText, headers, bytes, stream, nodeStream }: {
|
|
21
|
+
constructor({ url, method, status, statusText, headers, bytes, stream, nodeStream, onBodyDone, mapBodyError }: {
|
|
20
22
|
url: string;
|
|
21
23
|
method: string;
|
|
22
24
|
status: number;
|
|
@@ -25,6 +27,8 @@ export default class SnapReqResponse {
|
|
|
25
27
|
bytes?: Uint8Array;
|
|
26
28
|
stream?: AsyncIterable<Uint8Array>;
|
|
27
29
|
nodeStream?: import("node:stream").Readable;
|
|
30
|
+
onBodyDone?: () => void;
|
|
31
|
+
mapBodyError?: (error: unknown) => unknown;
|
|
28
32
|
});
|
|
29
33
|
url: string;
|
|
30
34
|
method: string;
|
|
@@ -38,6 +42,9 @@ export default class SnapReqResponse {
|
|
|
38
42
|
/** @type {import("node:stream").Readable | undefined} */
|
|
39
43
|
nodeStream: import("node:stream").Readable | undefined;
|
|
40
44
|
_streamConsumed: boolean;
|
|
45
|
+
_bodyDone: boolean;
|
|
46
|
+
_onBodyDone: () => void;
|
|
47
|
+
_mapBodyError: (error: unknown) => unknown;
|
|
41
48
|
/** @returns {boolean} - Whether the status is in the 2xx range. */
|
|
42
49
|
get ok(): boolean;
|
|
43
50
|
/**
|
|
@@ -70,5 +77,18 @@ export default class SnapReqResponse {
|
|
|
70
77
|
* @returns {Promise<any>} - The parsed JSON body.
|
|
71
78
|
*/
|
|
72
79
|
json(): Promise<any>;
|
|
80
|
+
/**
|
|
81
|
+
* @param {AsyncIterable<Uint8Array>} source - Source response stream.
|
|
82
|
+
* @returns {AsyncIterable<Uint8Array>} - Stream with cleanup/error mapping.
|
|
83
|
+
*/
|
|
84
|
+
_wrappedStream(source: AsyncIterable<Uint8Array>): AsyncIterable<Uint8Array>;
|
|
85
|
+
/**
|
|
86
|
+
* @param {unknown} error - Body read error.
|
|
87
|
+
* @returns {unknown} - Error to rethrow.
|
|
88
|
+
*/
|
|
89
|
+
_mappedBodyError(error: unknown): unknown;
|
|
90
|
+
/** @returns {void} */
|
|
91
|
+
_finishBody(): void;
|
|
73
92
|
}
|
|
74
93
|
import SnapReqHeaders from "./headers.js";
|
|
94
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../src/response.js"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH;IACE;;;;;;;;;;;;OAYG;IACH,+GAXG;QAAwB,GAAG,EAAnB,MAAM;QACU,MAAM,EAAtB,MAAM;QACU,MAAM,EAAtB,MAAM;QACW,UAAU,GAA3B,MAAM;QACmB,OAAO,GAAhC,cAAc;QACO,KAAK,GAA1B,UAAU;QAC0B,MAAM,GAA1C,aAAa,CAAC,UAAU,CAAC;QACgB,UAAU,GAAnD,OAAO,aAAa,EAAE,QAAQ;QACT,UAAU,GAA/B,MAAM,IAAI;QAC4B,YAAY,GAAlD,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO;KACrC,EAmBA;IAjBC,YAAc;IACd,eAAoB;IACpB,eAAoB;IACpB,mBAA4B;IAC5B,wBAA8C;IAC9C,gCAAgC;IAChC,QADW,UAAU,GAAG,IAAI,CACD;IAC3B,+CAA+C;IAC/C,SADW,aAAa,CAAC,UAAU,CAAC,GAAG,IAAI,CACd;IAC7B,yDAAyD;IACzD,YADW,OAAO,aAAa,EAAE,QAAQ,GAAG,SAAS,CACzB;IAC5B,yBAA4B;IAC5B,mBAAsB;IACtB,mBAjBe,IAAI,CAiBU;IAC7B,uBAjBiB,OAAO,KAAK,OAAO,CAiBH;IAKnC,mEAAmE;IACnE,UADc,OAAO,CAGpB;IAED;;;;OAIG;IACH,UAFa,aAAa,CAAC,UAAU,CAAC,CAcrC;IAED,iGAAiG;IACjG,kBADc,OAAO,CAGpB;IAED;;;OAGG;IACH,SAFa,OAAO,CAAC,UAAU,CAAC,CAsB/B;IAED;;;;OAIG;IACH,UAFa,OAAO,CAAC,MAAM,CAAC,CAU3B;IAED;;;OAGG;IACH,QAFa,OAAO,CAAC,MAAM,CAAC,CAM3B;IAED;;;;OAIG;IACH,QAFa,OAAO,CAAC,GAAG,CAAC,CAQxB;IAED;;;OAGG;IACH,uBAHW,aAAa,CAAC,UAAU,CAAC,GACvB,aAAa,CAAC,UAAU,CAAC,CAgBrC;IAED;;;OAGG;IACH,wBAHW,OAAO,GACL,OAAO,CAMnB;IAED,sBAAsB;IACtB,eADc,IAAI,CAOjB;CACF;2BAlM0B,cAAc"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import SnapReqHeaders from "./headers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Concatenates a list of byte chunks into a single `Uint8Array`.
|
|
5
|
+
* @param {Uint8Array[]} chunks - Byte chunks in order.
|
|
6
|
+
* @returns {Uint8Array} - The concatenated bytes.
|
|
7
|
+
*/
|
|
8
|
+
function concatChunks(chunks) {
|
|
9
|
+
let total = 0;
|
|
10
|
+
for (const chunk of chunks)
|
|
11
|
+
total += chunk.byteLength;
|
|
12
|
+
const result = new Uint8Array(total);
|
|
13
|
+
let offset = 0;
|
|
14
|
+
for (const chunk of chunks) {
|
|
15
|
+
result.set(chunk, offset);
|
|
16
|
+
offset += chunk.byteLength;
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A platform-agnostic response. Transports build it with either a fully-read
|
|
22
|
+
* body (`bytes`) or a `stream` (an async iterable of `Uint8Array`) that the
|
|
23
|
+
* read helpers buffer on first use. The body can be read exactly once as a
|
|
24
|
+
* stream; the buffering helpers may be called repeatedly because they cache.
|
|
25
|
+
*/
|
|
26
|
+
export default class SnapReqResponse {
|
|
27
|
+
/**
|
|
28
|
+
* @param {object} options - Response data.
|
|
29
|
+
* @param {string} options.url - Fully resolved request URL.
|
|
30
|
+
* @param {string} options.method - HTTP method used for the request.
|
|
31
|
+
* @param {number} options.status - HTTP status code.
|
|
32
|
+
* @param {string} [options.statusText] - HTTP status text.
|
|
33
|
+
* @param {SnapReqHeaders} [options.headers] - Response headers.
|
|
34
|
+
* @param {Uint8Array} [options.bytes] - Fully-read body, when the transport already buffered it.
|
|
35
|
+
* @param {AsyncIterable<Uint8Array>} [options.stream] - Streamed body, when the transport supports streaming.
|
|
36
|
+
* @param {import("node:stream").Readable} [options.nodeStream] - Raw Node stream, when available, for advanced consumers.
|
|
37
|
+
* @param {() => void} [options.onBodyDone] - Callback fired when body reading finishes or fails.
|
|
38
|
+
* @param {(error: unknown) => unknown} [options.mapBodyError] - Maps body read errors before rethrowing.
|
|
39
|
+
*/
|
|
40
|
+
constructor({ url, method, status, statusText = "", headers, bytes, stream, nodeStream, onBodyDone, mapBodyError }) {
|
|
41
|
+
this.url = url;
|
|
42
|
+
this.method = method;
|
|
43
|
+
this.status = status;
|
|
44
|
+
this.statusText = statusText;
|
|
45
|
+
this.headers = headers || new SnapReqHeaders();
|
|
46
|
+
/** @type {Uint8Array | null} */
|
|
47
|
+
this._bytes = bytes ?? null;
|
|
48
|
+
/** @type {AsyncIterable<Uint8Array> | null} */
|
|
49
|
+
this._stream = stream ?? null;
|
|
50
|
+
/** @type {import("node:stream").Readable | undefined} */
|
|
51
|
+
this.nodeStream = nodeStream;
|
|
52
|
+
this._streamConsumed = false;
|
|
53
|
+
this._bodyDone = false;
|
|
54
|
+
this._onBodyDone = onBodyDone;
|
|
55
|
+
this._mapBodyError = mapBodyError;
|
|
56
|
+
if (bytes !== undefined)
|
|
57
|
+
this._finishBody();
|
|
58
|
+
}
|
|
59
|
+
/** @returns {boolean} - Whether the status is in the 2xx range. */
|
|
60
|
+
get ok() {
|
|
61
|
+
return this.status >= 200 && this.status < 300;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the response body as an async iterable of byte chunks. Can only be
|
|
65
|
+
* called once and only when the transport provided a stream.
|
|
66
|
+
* @returns {AsyncIterable<Uint8Array>} - The streamed body.
|
|
67
|
+
*/
|
|
68
|
+
stream() {
|
|
69
|
+
if (!this._stream) {
|
|
70
|
+
throw new Error("This response has no readable stream (the body was already buffered by the transport).");
|
|
71
|
+
}
|
|
72
|
+
if (this._streamConsumed) {
|
|
73
|
+
throw new Error("This response stream has already been consumed.");
|
|
74
|
+
}
|
|
75
|
+
this._streamConsumed = true;
|
|
76
|
+
return this._wrappedStream(this._stream);
|
|
77
|
+
}
|
|
78
|
+
/** @returns {boolean} - Whether the body is available as a stream that has not been read yet. */
|
|
79
|
+
get streamable() {
|
|
80
|
+
return Boolean(this._stream) && !this._streamConsumed;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Reads the whole body into a `Uint8Array`, buffering the stream if needed.
|
|
84
|
+
* @returns {Promise<Uint8Array>} - The full response body.
|
|
85
|
+
*/
|
|
86
|
+
async bytes() {
|
|
87
|
+
if (this._bytes)
|
|
88
|
+
return this._bytes;
|
|
89
|
+
if (!this._stream) {
|
|
90
|
+
this._bytes = new Uint8Array(0);
|
|
91
|
+
this._finishBody();
|
|
92
|
+
return this._bytes;
|
|
93
|
+
}
|
|
94
|
+
/** @type {Uint8Array[]} */
|
|
95
|
+
const chunks = [];
|
|
96
|
+
for await (const chunk of this.stream()) {
|
|
97
|
+
chunks.push(chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk));
|
|
98
|
+
}
|
|
99
|
+
this._bytes = concatChunks(chunks);
|
|
100
|
+
return this._bytes;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Reads the whole body as a Node `Buffer`. Node-only convenience; throws when
|
|
104
|
+
* the `Buffer` global is unavailable.
|
|
105
|
+
* @returns {Promise<Buffer>} - The full response body as a Buffer.
|
|
106
|
+
*/
|
|
107
|
+
async buffer() {
|
|
108
|
+
if (typeof Buffer === "undefined") {
|
|
109
|
+
throw new Error("Buffer is not available on this platform; use bytes() instead.");
|
|
110
|
+
}
|
|
111
|
+
const bytes = await this.bytes();
|
|
112
|
+
return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Reads the whole body and decodes it as a UTF-8 string.
|
|
116
|
+
* @returns {Promise<string>} - The decoded response body.
|
|
117
|
+
*/
|
|
118
|
+
async text() {
|
|
119
|
+
const bytes = await this.bytes();
|
|
120
|
+
return new TextDecoder("utf-8").decode(bytes);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Reads the whole body and parses it as JSON. Returns `null` for an empty
|
|
124
|
+
* body.
|
|
125
|
+
* @returns {Promise<any>} - The parsed JSON body.
|
|
126
|
+
*/
|
|
127
|
+
async json() {
|
|
128
|
+
const text = await this.text();
|
|
129
|
+
if (!text)
|
|
130
|
+
return null;
|
|
131
|
+
return JSON.parse(text);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @param {AsyncIterable<Uint8Array>} source - Source response stream.
|
|
135
|
+
* @returns {AsyncIterable<Uint8Array>} - Stream with cleanup/error mapping.
|
|
136
|
+
*/
|
|
137
|
+
_wrappedStream(source) {
|
|
138
|
+
const response = this;
|
|
139
|
+
return (async function* () {
|
|
140
|
+
try {
|
|
141
|
+
for await (const chunk of source) {
|
|
142
|
+
yield chunk;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw response._mappedBodyError(error);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
response._finishBody();
|
|
150
|
+
}
|
|
151
|
+
})();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* @param {unknown} error - Body read error.
|
|
155
|
+
* @returns {unknown} - Error to rethrow.
|
|
156
|
+
*/
|
|
157
|
+
_mappedBodyError(error) {
|
|
158
|
+
if (this._mapBodyError)
|
|
159
|
+
return this._mapBodyError(error);
|
|
160
|
+
return error;
|
|
161
|
+
}
|
|
162
|
+
/** @returns {void} */
|
|
163
|
+
_finishBody() {
|
|
164
|
+
if (this._bodyDone)
|
|
165
|
+
return;
|
|
166
|
+
this._bodyDone = true;
|
|
167
|
+
if (this._onBodyDone)
|
|
168
|
+
this._onBodyDone();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVzcG9uc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sY0FBYyxNQUFNLGNBQWMsQ0FBQTtBQUV6Qzs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBTTtJQUMxQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7SUFFYixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU07UUFBRSxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQTtJQUVyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNwQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFFZCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFBO0lBQzVCLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZTtJQUNsQzs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxZQUFZLEVBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBQztRQUM5RyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJ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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AAEH;;;;;;GAMG;AAEH;;;;;GAKG;AACH,6CAHW,OAAO,GACL,OAAO,CAYnB;AAED;;;;;GAKG;AACH,6CAHW,OAAO,GAAG,YAAY,GAAG,SAAS,GAChC,sBAAsB,GAAG,IAAI,CAezC;AAUD;;;;;;;GAOG;AACH,sCAJW,MAAM,OAAO,CAAC,OAAO,eAAe,EAAE,OAAO,CAAC,SAC9C,sBAAsB,GACpB,OAAO,CAAC,OAAO,eAAe,EAAE,OAAO,CAAC,CA8BpD;;;;;YAjGa,MAAM;;;;aACN,MAAM;;;;wBACN,MAAM,EAAE;;;;kBACR,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO;;;;;;WAK5C,MAAM;;;;YACN,MAAM;;;;uBACN,MAAM,EAAE;;;;iBACR,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO"}
|