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.
Files changed (69) hide show
  1. package/README.md +12 -0
  2. package/{types → build}/capabilities.d.ts +1 -0
  3. package/build/capabilities.d.ts.map +1 -0
  4. package/{src → build}/capabilities.js +11 -12
  5. package/{types → build}/errors.d.ts +18 -0
  6. package/build/errors.d.ts.map +1 -0
  7. package/build/errors.js +82 -0
  8. package/{types → build}/headers.d.ts +1 -0
  9. package/build/headers.d.ts.map +1 -0
  10. package/build/headers.js +89 -0
  11. package/{types → build}/request.d.ts +1 -0
  12. package/build/request.d.ts.map +1 -0
  13. package/build/request.js +89 -0
  14. package/{types → build}/response.d.ts +21 -1
  15. package/build/response.d.ts.map +1 -0
  16. package/build/response.js +171 -0
  17. package/{types → build}/retry.d.ts +1 -0
  18. package/build/retry.d.ts.map +1 -0
  19. package/build/retry.js +95 -0
  20. package/{types → build}/snap-req.d.ts +72 -1
  21. package/build/snap-req.d.ts.map +1 -0
  22. package/build/snap-req.js +349 -0
  23. package/{types → build}/transports/fetch-transport.d.ts +1 -0
  24. package/build/transports/fetch-transport.d.ts.map +1 -0
  25. package/build/transports/fetch-transport.js +116 -0
  26. package/build/transports/fetch.d.ts +2 -0
  27. package/build/transports/fetch.d.ts.map +1 -0
  28. package/build/transports/fetch.js +3 -0
  29. package/{types → build}/transports/node-transport.d.ts +1 -0
  30. package/build/transports/node-transport.d.ts.map +1 -0
  31. package/build/transports/node-transport.js +287 -0
  32. package/build/transports/proxy-bounce-transport.d.ts +27 -0
  33. package/build/transports/proxy-bounce-transport.d.ts.map +1 -0
  34. package/build/transports/proxy-bounce-transport.js +116 -0
  35. package/{types → build}/transports/select.d.ts +1 -0
  36. package/build/transports/select.d.ts.map +1 -0
  37. package/build/transports/select.js +69 -0
  38. package/{types → build}/transports/xhr-transport.d.ts +1 -0
  39. package/build/transports/xhr-transport.d.ts.map +1 -0
  40. package/build/transports/xhr-transport.js +93 -0
  41. package/build/transports/xhr.d.ts +2 -0
  42. package/build/transports/xhr.d.ts.map +1 -0
  43. package/build/transports/xhr.js +3 -0
  44. package/{types → build}/websocket/websocket-channel.d.ts +1 -0
  45. package/build/websocket/websocket-channel.d.ts.map +1 -0
  46. package/build/websocket/websocket-channel.js +162 -0
  47. package/{types → build}/websocket/websocket-client.d.ts +1 -0
  48. package/build/websocket/websocket-client.d.ts.map +1 -0
  49. package/build/websocket/websocket-client.js +920 -0
  50. package/{types → build}/websocket/websocket-connection.d.ts +1 -0
  51. package/build/websocket/websocket-connection.d.ts.map +1 -0
  52. package/build/websocket/websocket-connection.js +148 -0
  53. package/build/websocket.d.ts +3 -0
  54. package/build/websocket.d.ts.map +1 -0
  55. package/build/websocket.js +4 -0
  56. package/package.json +20 -23
  57. package/src/errors.js +0 -69
  58. package/src/headers.js +0 -92
  59. package/src/request.js +0 -104
  60. package/src/response.js +0 -156
  61. package/src/retry.js +0 -105
  62. package/src/snap-req.js +0 -248
  63. package/src/transports/fetch-transport.js +0 -128
  64. package/src/transports/node-transport.js +0 -323
  65. package/src/transports/select.js +0 -73
  66. package/src/transports/xhr-transport.js +0 -112
  67. package/src/websocket/websocket-channel.js +0 -176
  68. package/src/websocket/websocket-client.js +0 -1034
  69. package/src/websocket/websocket-connection.js +0 -154
package/build/retry.js ADDED
@@ -0,0 +1,95 @@
1
+ // @ts-check
2
+ import { SnapReqHttpError, SnapReqTimeoutError } from "./errors.js";
3
+ const RETRYABLE_ERROR_CODES = new Set(["ECONNREFUSED", "ECONNRESET", "EHOSTUNREACH", "ENOENT", "ETIMEDOUT", "EPIPE"]);
4
+ const DEFAULT_RETRYABLE_STATUSES = [502, 503, 504];
5
+ /**
6
+ * @typedef {object} RetryOptions
7
+ * @property {number} [tries] - Maximum number of attempts. Defaults to 3.
8
+ * @property {number} [waitMs] - Delay between attempts in milliseconds. Defaults to 500.
9
+ * @property {number[]} [retryableStatuses] - HTTP status codes that should be retried. Defaults to 502/503/504.
10
+ * @property {(error: unknown, attempt: number) => boolean} [shouldRetry] - Override the retryable-error classifier.
11
+ */
12
+ /**
13
+ * @typedef {object} NormalizedRetryOptions
14
+ * @property {number} tries - Maximum number of attempts.
15
+ * @property {number} waitMs - Delay between attempts in milliseconds.
16
+ * @property {number[]} retryableStatuses - HTTP status codes that should be retried.
17
+ * @property {(error: unknown, attempt: number) => boolean} shouldRetry - Retryable-error classifier.
18
+ */
19
+ /**
20
+ * The default network-error classifier. Exposed so callers can compose extra
21
+ * rules on top of it (for example matching server-specific 500 messages).
22
+ * @param {unknown} error - Error thrown by a transport.
23
+ * @returns {boolean} - Whether the error is a transient network failure.
24
+ */
25
+ export function defaultRetryableError(error) {
26
+ if (error instanceof SnapReqTimeoutError)
27
+ return true;
28
+ if (!error || typeof error !== "object")
29
+ return false;
30
+ if ("code" in error && typeof error.code === "string" && RETRYABLE_ERROR_CODES.has(error.code)) {
31
+ return true;
32
+ }
33
+ return error instanceof Error && error.message === "socket hang up";
34
+ }
35
+ /**
36
+ * Normalizes the `retry` option into a complete set of retry settings, or
37
+ * `null` when retries are disabled.
38
+ * @param {boolean | RetryOptions | undefined} retry - Retry configuration.
39
+ * @returns {NormalizedRetryOptions | null} - Normalized retry settings.
40
+ */
41
+ export function normalizeRetryOptions(retry) {
42
+ if (!retry)
43
+ return null;
44
+ const options = retry === true ? {} : retry;
45
+ const retryableStatuses = options.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES;
46
+ const shouldRetry = options.shouldRetry ?? ((/** @type {unknown} */ error) => defaultRetryableError(error));
47
+ return {
48
+ tries: options.tries ?? 3,
49
+ waitMs: options.waitMs ?? 500,
50
+ retryableStatuses,
51
+ shouldRetry
52
+ };
53
+ }
54
+ /**
55
+ * @param {number} waitMs - Delay in milliseconds.
56
+ * @returns {Promise<void>} - Resolves after the delay.
57
+ */
58
+ function wait(waitMs) {
59
+ return new Promise((resolve) => setTimeout(resolve, waitMs));
60
+ }
61
+ /**
62
+ * Runs a request attempt, retrying transient network errors and retryable HTTP
63
+ * statuses. Retries are only used for buffered requests — the caller must not
64
+ * apply this to streamed responses.
65
+ * @param {() => Promise<import("./response.js").default>} attempt - Performs one request attempt.
66
+ * @param {NormalizedRetryOptions} retry - Normalized retry settings.
67
+ * @returns {Promise<import("./response.js").default>} - The successful (or final) response.
68
+ */
69
+ export async function runWithRetry(attempt, retry) {
70
+ for (let tryNumber = 1; tryNumber <= retry.tries; tryNumber += 1) {
71
+ /** @type {import("./response.js").default} */
72
+ let response;
73
+ try {
74
+ response = await attempt();
75
+ }
76
+ catch (error) {
77
+ if (tryNumber >= retry.tries || !retry.shouldRetry(error, tryNumber))
78
+ throw error;
79
+ await wait(retry.waitMs);
80
+ continue;
81
+ }
82
+ if (tryNumber < retry.tries && retry.retryableStatuses.includes(response.status)) {
83
+ await wait(retry.waitMs);
84
+ continue;
85
+ }
86
+ return response;
87
+ }
88
+ throw new SnapReqHttpError({
89
+ message: "Retry loop exited without a response.",
90
+ method: "",
91
+ url: "",
92
+ status: 0
93
+ });
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmV0cnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUVqRSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ3JILE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBRWxEOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEtBQUs7SUFDekMsSUFBSSxLQUFLLFlBQVksbUJBQW1CO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFckQsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFckQsSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUkscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQy9GLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE9BQU8sS0FBSyxZQUFZLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLGdCQUFnQixDQUFBO0FBQ3JFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUFLO0lBQ3pDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFdkIsTUFBTSxPQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDM0MsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksMEJBQTBCLENBQUE7SUFDakYsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBRTNHLE9BQU87UUFDTCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDO1FBQ3pCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEdBQUc7UUFDN0IsaUJBQWlCO1FBQ2pCLFdBQVc7S0FDWixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsSUFBSSxDQUFDLE1BQU07SUFDbEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQzlELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDL0MsS0FBSyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pFLDhDQUE4QztRQUM5QyxJQUFJLFFBQVEsQ0FBQTtRQUVaLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLE9BQU8sRUFBRSxDQUFBO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQztnQkFBRSxNQUFNLEtBQUssQ0FBQTtZQUVqRixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDeEIsU0FBUTtRQUNWLENBQUM7UUFFRCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakYsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3hCLFNBQVE7UUFDVixDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVELE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQztRQUN6QixPQUFPLEVBQUUsdUNBQXVDO1FBQ2hELE1BQU0sRUFBRSxFQUFFO1FBQ1YsR0FBRyxFQUFFLEVBQUU7UUFDUCxNQUFNLEVBQUUsQ0FBQztLQUNWLENBQUMsQ0FBQTtBQUNKLENBQUMifQ==
@@ -9,6 +9,7 @@
9
9
  * @property {import("./request.js").NormalizedBody} body - Normalized request body.
10
10
  * @property {CompressionEncoding} bodyCompression - Request body compression.
11
11
  * @property {AbortSignal} [signal] - Abort signal.
12
+ * @property {number} [timeoutMs] - Request timeout in milliseconds.
12
13
  * @property {string} [credentials] - Fetch credentials mode ("omit" | "same-origin" | "include").
13
14
  */
14
15
  /**
@@ -21,10 +22,18 @@
21
22
  * @property {any} [body] - Request body: string, object (JSON), Uint8Array/ArrayBuffer, or a stream/async-iterable.
22
23
  * @property {CompressionEncoding} [bodyCompression] - Compress the request body (Node transport only).
23
24
  * @property {AbortSignal} [signal] - Abort signal for the request.
25
+ * @property {number} [timeoutMs] - Request timeout in milliseconds. Set to `0` to disable a client default.
24
26
  * @property {string} [credentials] - Fetch credentials mode.
25
27
  * @property {boolean | import("./retry.js").RetryOptions} [retry] - Retry transient failures.
26
28
  * @property {boolean} [throwOnError] - Throw `SnapReqHttpError` on non-2xx responses.
27
29
  */
30
+ /**
31
+ * @typedef {object} RequestTimeout
32
+ * @property {AbortSignal | undefined} signal - Signal to use for the request.
33
+ * @property {() => void} clear - Clears timeout resources.
34
+ * @property {(response: import("./response.js").default, request: NormalizedRequest) => import("./response.js").default} response - Attaches timeout handling to a response.
35
+ * @property {(error: unknown, request: NormalizedRequest) => unknown} error - Maps a thrown error.
36
+ */
28
37
  /**
29
38
  * A cross-platform HTTP client with one API across Node, web, Expo and React
30
39
  * Native. The right transport is chosen at runtime; features a platform cannot
@@ -41,10 +50,11 @@ export default class SnapReq {
41
50
  * @param {Record<string, string | number> | (() => Record<string, string | number>)} [config.headers] - Default headers (object or factory).
42
51
  * @param {boolean | import("./retry.js").RetryOptions} [config.retry] - Default retry policy.
43
52
  * @param {boolean} [config.throwOnError] - Throw `SnapReqHttpError` on non-2xx responses by default. Defaults to false.
53
+ * @param {number} [config.timeoutMs] - Default request timeout in milliseconds. Set per-request `timeoutMs: 0` to disable.
44
54
  * @param {string} [config.credentials] - Default fetch credentials mode.
45
55
  * @param {import("./transports/select.js").TransportName | import("./transports/select.js").Transport} [config.transport] - Transport preference or instance. Defaults to "auto".
46
56
  */
47
- constructor({ baseUrl, socketPath, tls, keepAlive, headers, retry, throwOnError, credentials, transport }?: {
57
+ constructor({ baseUrl, socketPath, tls, keepAlive, headers, retry, throwOnError, timeoutMs, credentials, transport }?: {
48
58
  baseUrl?: string;
49
59
  socketPath?: string;
50
60
  tls?: {
@@ -57,6 +67,7 @@ export default class SnapReq {
57
67
  headers?: Record<string, string | number> | (() => Record<string, string | number>);
58
68
  retry?: boolean | import("./retry.js").RetryOptions;
59
69
  throwOnError?: boolean;
70
+ timeoutMs?: number;
60
71
  credentials?: string;
61
72
  transport?: import("./transports/select.js").TransportName | import("./transports/select.js").Transport;
62
73
  });
@@ -64,6 +75,7 @@ export default class SnapReq {
64
75
  defaultHeaders: Record<string, string | number> | (() => Record<string, string | number>);
65
76
  defaultRetry: boolean | import("./retry.js").RetryOptions;
66
77
  throwOnError: boolean;
78
+ timeoutMs: number;
67
79
  credentials: string;
68
80
  _transportPreference: import("./transports/select.js").TransportName | import("./transports/select.js").Transport;
69
81
  _nodeConfig: {
@@ -91,6 +103,32 @@ export default class SnapReq {
91
103
  * @returns {NormalizedRequest} - The normalized request.
92
104
  */
93
105
  _normalize(options: RequestOptions): NormalizedRequest;
106
+ /**
107
+ * @param {RequestOptions} options - Request options.
108
+ * @returns {RequestTimeout} - Timeout handling for one request attempt.
109
+ */
110
+ _requestTimeout(options: RequestOptions): RequestTimeout;
111
+ /**
112
+ * @param {AbortSignal | undefined} callerSignal - Caller-supplied signal.
113
+ * @param {AbortSignal} timeoutSignal - Timeout signal.
114
+ * @returns {{signal: AbortSignal, clear: () => void}} - Signal that aborts when either source aborts.
115
+ */
116
+ _composeSignal(callerSignal: AbortSignal | undefined, timeoutSignal: AbortSignal): {
117
+ signal: AbortSignal;
118
+ clear: () => void;
119
+ };
120
+ /**
121
+ * @param {(() => void) | undefined} existing - Existing body-done callback.
122
+ * @param {() => void} next - Callback to add.
123
+ * @returns {() => void} - Combined callback.
124
+ */
125
+ _chainBodyDone(existing: (() => void) | undefined, next: () => void): () => void;
126
+ /**
127
+ * @param {((error: unknown) => unknown) | undefined} existing - Existing error mapper.
128
+ * @param {(error: unknown) => unknown} next - Mapper to add.
129
+ * @returns {(error: unknown) => unknown} - Combined mapper.
130
+ */
131
+ _chainBodyError(existing: ((error: unknown) => unknown) | undefined, next: (error: unknown) => unknown): (error: unknown) => unknown;
94
132
  /**
95
133
  * Performs a request and buffers nothing eagerly — read the body via the
96
134
  * returned response (`json()`, `text()`, `bytes()`). Retries transient
@@ -107,6 +145,12 @@ export default class SnapReq {
107
145
  * @returns {Promise<import("./response.js").default>} - The streaming response.
108
146
  */
109
147
  requestStream(options: RequestOptions): Promise<import("./response.js").default>;
148
+ /**
149
+ * @param {RequestOptions} options - Request options.
150
+ * @param {(request: NormalizedRequest) => Promise<import("./response.js").default>} performRequest - Transport request runner.
151
+ * @returns {Promise<import("./response.js").default>} - Response with timeout handling attached.
152
+ */
153
+ _requestWithTimeout(options: RequestOptions, performRequest: (request: NormalizedRequest) => Promise<import("./response.js").default>): Promise<import("./response.js").default>;
110
154
  /**
111
155
  * @param {string} path - Request path or absolute URL.
112
156
  * @param {RequestOptions} [options] - Request options.
@@ -178,6 +222,10 @@ export type NormalizedRequest = {
178
222
  * - Abort signal.
179
223
  */
180
224
  signal?: AbortSignal;
225
+ /**
226
+ * - Request timeout in milliseconds.
227
+ */
228
+ timeoutMs?: number;
181
229
  /**
182
230
  * - Fetch credentials mode ("omit" | "same-origin" | "include").
183
231
  */
@@ -216,6 +264,10 @@ export type RequestOptions = {
216
264
  * - Abort signal for the request.
217
265
  */
218
266
  signal?: AbortSignal;
267
+ /**
268
+ * - Request timeout in milliseconds. Set to `0` to disable a client default.
269
+ */
270
+ timeoutMs?: number;
219
271
  /**
220
272
  * - Fetch credentials mode.
221
273
  */
@@ -229,5 +281,24 @@ export type RequestOptions = {
229
281
  */
230
282
  throwOnError?: boolean;
231
283
  };
284
+ export type RequestTimeout = {
285
+ /**
286
+ * - Signal to use for the request.
287
+ */
288
+ signal: AbortSignal | undefined;
289
+ /**
290
+ * - Clears timeout resources.
291
+ */
292
+ clear: () => void;
293
+ /**
294
+ * - Attaches timeout handling to a response.
295
+ */
296
+ response: (response: import("./response.js").default, request: NormalizedRequest) => import("./response.js").default;
297
+ /**
298
+ * - Maps a thrown error.
299
+ */
300
+ error: (error: unknown, request: NormalizedRequest) => unknown;
301
+ };
232
302
  import { SnapReqHttpError } from "./errors.js";
233
303
  import SnapReqHeaders from "./headers.js";
304
+ //# sourceMappingURL=snap-req.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snap-req.d.ts","sourceRoot":"","sources":["../src/snap-req.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,349 @@
1
+ // @ts-check
2
+ import { SnapReqHttpError, SnapReqTimeoutError, SnapReqUnsupportedFeatureError } from "./errors.js";
3
+ import SnapReqHeaders from "./headers.js";
4
+ import { buildUrl, normalizeBody } from "./request.js";
5
+ import { normalizeRetryOptions, runWithRetry } from "./retry.js";
6
+ import { selectTransport } from "./transports/select.js";
7
+ /**
8
+ * @typedef {import("./request.js").CompressionEncoding} CompressionEncoding
9
+ */
10
+ /**
11
+ * @typedef {object} NormalizedRequest
12
+ * @property {string} method - Upper-cased HTTP method.
13
+ * @property {string} url - Fully resolved request URL.
14
+ * @property {SnapReqHeaders} headers - Request headers.
15
+ * @property {import("./request.js").NormalizedBody} body - Normalized request body.
16
+ * @property {CompressionEncoding} bodyCompression - Request body compression.
17
+ * @property {AbortSignal} [signal] - Abort signal.
18
+ * @property {number} [timeoutMs] - Request timeout in milliseconds.
19
+ * @property {string} [credentials] - Fetch credentials mode ("omit" | "same-origin" | "include").
20
+ */
21
+ /**
22
+ * @typedef {object} RequestOptions
23
+ * @property {string} [method] - HTTP method. Defaults to GET.
24
+ * @property {string} [path] - Request path (joined with the client `baseUrl`) or absolute URL.
25
+ * @property {string} [url] - Alias for `path`.
26
+ * @property {Record<string, string | number | boolean | null | undefined>} [query] - Query parameters.
27
+ * @property {Record<string, string | number> | SnapReqHeaders} [headers] - Per-request headers.
28
+ * @property {any} [body] - Request body: string, object (JSON), Uint8Array/ArrayBuffer, or a stream/async-iterable.
29
+ * @property {CompressionEncoding} [bodyCompression] - Compress the request body (Node transport only).
30
+ * @property {AbortSignal} [signal] - Abort signal for the request.
31
+ * @property {number} [timeoutMs] - Request timeout in milliseconds. Set to `0` to disable a client default.
32
+ * @property {string} [credentials] - Fetch credentials mode.
33
+ * @property {boolean | import("./retry.js").RetryOptions} [retry] - Retry transient failures.
34
+ * @property {boolean} [throwOnError] - Throw `SnapReqHttpError` on non-2xx responses.
35
+ */
36
+ /**
37
+ * @typedef {object} RequestTimeout
38
+ * @property {AbortSignal | undefined} signal - Signal to use for the request.
39
+ * @property {() => void} clear - Clears timeout resources.
40
+ * @property {(response: import("./response.js").default, request: NormalizedRequest) => import("./response.js").default} response - Attaches timeout handling to a response.
41
+ * @property {(error: unknown, request: NormalizedRequest) => unknown} error - Maps a thrown error.
42
+ */
43
+ /**
44
+ * A cross-platform HTTP client with one API across Node, web, Expo and React
45
+ * Native. The right transport is chosen at runtime; features a platform cannot
46
+ * provide raise `SnapReqUnsupportedFeatureError` rather than silently changing
47
+ * behaviour.
48
+ */
49
+ export default class SnapReq {
50
+ /**
51
+ * @param {object} [config] - Client configuration.
52
+ * @param {string} [config.baseUrl] - Origin (and optional base path) prepended to relative paths.
53
+ * @param {string} [config.socketPath] - Unix domain socket path (Node transport only).
54
+ * @param {{ca?: string | Buffer, cert?: string | Buffer, key?: string | Buffer, rejectUnauthorized?: boolean}} [config.tls] - TLS material (Node transport only).
55
+ * @param {boolean} [config.keepAlive] - Reuse connections across requests (Node transport only). Defaults to true.
56
+ * @param {Record<string, string | number> | (() => Record<string, string | number>)} [config.headers] - Default headers (object or factory).
57
+ * @param {boolean | import("./retry.js").RetryOptions} [config.retry] - Default retry policy.
58
+ * @param {boolean} [config.throwOnError] - Throw `SnapReqHttpError` on non-2xx responses by default. Defaults to false.
59
+ * @param {number} [config.timeoutMs] - Default request timeout in milliseconds. Set per-request `timeoutMs: 0` to disable.
60
+ * @param {string} [config.credentials] - Default fetch credentials mode.
61
+ * @param {import("./transports/select.js").TransportName | import("./transports/select.js").Transport} [config.transport] - Transport preference or instance. Defaults to "auto".
62
+ */
63
+ constructor({ baseUrl, socketPath, tls, keepAlive = true, headers, retry, throwOnError = false, timeoutMs, credentials, transport = "auto" } = {}) {
64
+ this.baseUrl = baseUrl;
65
+ this.defaultHeaders = headers;
66
+ this.defaultRetry = retry;
67
+ this.throwOnError = throwOnError;
68
+ this.timeoutMs = timeoutMs;
69
+ this.credentials = credentials;
70
+ this._transportPreference = transport;
71
+ this._nodeConfig = { socketPath, tls, keepAlive };
72
+ /** @type {Promise<import("./transports/select.js").Transport> | null} */
73
+ this._transportPromise = null;
74
+ /** @type {import("./transports/select.js").Transport | null} */
75
+ this._transport = null;
76
+ }
77
+ /** @returns {Promise<import("./transports/select.js").Transport>} - The resolved transport. */
78
+ async _resolveTransport() {
79
+ this._transportPromise || (this._transportPromise = selectTransport(this._transportPreference, this._nodeConfig));
80
+ this._transport = await this._transportPromise;
81
+ return this._transport;
82
+ }
83
+ /** @returns {Promise<import("./capabilities.js").TransportCapabilities>} - The active transport's capabilities. */
84
+ async capabilities() {
85
+ return (await this._resolveTransport()).capabilities;
86
+ }
87
+ /** @returns {Promise<string>} - The active transport's name. */
88
+ async transportName() {
89
+ const transport = await this._resolveTransport();
90
+ return /** @type {any} */ (transport.constructor)?.transportName || "custom";
91
+ }
92
+ /**
93
+ * @param {RequestOptions} options - Request options.
94
+ * @returns {NormalizedRequest} - The normalized request.
95
+ */
96
+ _normalize(options) {
97
+ const headers = new SnapReqHeaders();
98
+ const defaults = typeof this.defaultHeaders === "function" ? this.defaultHeaders() : this.defaultHeaders;
99
+ if (defaults)
100
+ for (const [name, value] of new SnapReqHeaders(defaults).entries())
101
+ headers.set(name, value);
102
+ if (options.headers)
103
+ for (const [name, value] of new SnapReqHeaders(options.headers).entries())
104
+ headers.set(name, value);
105
+ const url = buildUrl(this.baseUrl, options.path ?? options.url ?? "", options.query);
106
+ const body = normalizeBody(options.body, headers);
107
+ return {
108
+ method: (options.method || "GET").toUpperCase(),
109
+ url,
110
+ headers,
111
+ body,
112
+ bodyCompression: options.bodyCompression || "identity",
113
+ signal: options.signal,
114
+ timeoutMs: options.timeoutMs ?? this.timeoutMs,
115
+ credentials: options.credentials ?? this.credentials
116
+ };
117
+ }
118
+ /**
119
+ * @param {RequestOptions} options - Request options.
120
+ * @returns {RequestTimeout} - Timeout handling for one request attempt.
121
+ */
122
+ _requestTimeout(options) {
123
+ const timeoutMs = options.timeoutMs ?? this.timeoutMs;
124
+ if (!timeoutMs || timeoutMs <= 0) {
125
+ return {
126
+ signal: options.signal,
127
+ clear: () => { },
128
+ response: (response) => response,
129
+ error: (error) => error
130
+ };
131
+ }
132
+ const timeoutController = new AbortController();
133
+ const composedSignal = this._composeSignal(options.signal, timeoutController.signal);
134
+ let timedOut = false;
135
+ const timer = setTimeout(() => {
136
+ timedOut = true;
137
+ timeoutController.abort();
138
+ }, timeoutMs);
139
+ if (typeof timer.unref === "function")
140
+ timer.unref();
141
+ const clear = () => {
142
+ clearTimeout(timer);
143
+ composedSignal.clear();
144
+ };
145
+ const toError = (error, request) => {
146
+ if (timedOut) {
147
+ return new SnapReqTimeoutError({
148
+ method: request.method,
149
+ url: request.url,
150
+ timeoutMs
151
+ });
152
+ }
153
+ return error;
154
+ };
155
+ return {
156
+ signal: composedSignal.signal,
157
+ clear,
158
+ response: (response, request) => {
159
+ if (response._bodyDone) {
160
+ clear();
161
+ return response;
162
+ }
163
+ response._onBodyDone = this._chainBodyDone(response._onBodyDone, clear);
164
+ response._mapBodyError = this._chainBodyError(response._mapBodyError, (error) => toError(error, request));
165
+ return response;
166
+ },
167
+ error: toError
168
+ };
169
+ }
170
+ /**
171
+ * @param {AbortSignal | undefined} callerSignal - Caller-supplied signal.
172
+ * @param {AbortSignal} timeoutSignal - Timeout signal.
173
+ * @returns {{signal: AbortSignal, clear: () => void}} - Signal that aborts when either source aborts.
174
+ */
175
+ _composeSignal(callerSignal, timeoutSignal) {
176
+ if (!callerSignal)
177
+ return { signal: timeoutSignal, clear: () => { } };
178
+ const controller = new AbortController();
179
+ const abort = () => controller.abort();
180
+ if (callerSignal.aborted || timeoutSignal.aborted) {
181
+ controller.abort();
182
+ }
183
+ else {
184
+ callerSignal.addEventListener("abort", abort, { once: true });
185
+ timeoutSignal.addEventListener("abort", abort, { once: true });
186
+ }
187
+ return {
188
+ signal: controller.signal,
189
+ clear: () => {
190
+ callerSignal.removeEventListener("abort", abort);
191
+ timeoutSignal.removeEventListener("abort", abort);
192
+ }
193
+ };
194
+ }
195
+ /**
196
+ * @param {(() => void) | undefined} existing - Existing body-done callback.
197
+ * @param {() => void} next - Callback to add.
198
+ * @returns {() => void} - Combined callback.
199
+ */
200
+ _chainBodyDone(existing, next) {
201
+ return () => {
202
+ if (existing)
203
+ existing();
204
+ next();
205
+ };
206
+ }
207
+ /**
208
+ * @param {((error: unknown) => unknown) | undefined} existing - Existing error mapper.
209
+ * @param {(error: unknown) => unknown} next - Mapper to add.
210
+ * @returns {(error: unknown) => unknown} - Combined mapper.
211
+ */
212
+ _chainBodyError(existing, next) {
213
+ return (error) => next(existing ? existing(error) : error);
214
+ }
215
+ /**
216
+ * Performs a request and buffers nothing eagerly — read the body via the
217
+ * returned response (`json()`, `text()`, `bytes()`). Retries transient
218
+ * failures when a retry policy is configured (never for streamed bodies).
219
+ * @param {RequestOptions} options - Request options.
220
+ * @returns {Promise<import("./response.js").default>} - The response.
221
+ */
222
+ async request(options) {
223
+ const transport = await this._resolveTransport();
224
+ const throwOnError = options.throwOnError ?? this.throwOnError;
225
+ const retry = normalizeRetryOptions(options.retry ?? this.defaultRetry);
226
+ const body = normalizeBody(options.body, new SnapReqHeaders(options.headers));
227
+ const canRetry = retry && body.kind !== "stream";
228
+ const attempt = async () => this._requestWithTimeout(options, (request) => transport.performRequest(request));
229
+ const response = canRetry ? await runWithRetry(attempt, /** @type {any} */ (retry)) : await attempt();
230
+ if (throwOnError && !response.ok)
231
+ throw await this._httpError(response, this._normalize(options));
232
+ return response;
233
+ }
234
+ /**
235
+ * Performs a request and returns the response with its body available as a
236
+ * stream (`response.stream()`). Requires a transport that supports response
237
+ * streaming; never retries.
238
+ * @param {RequestOptions} options - Request options.
239
+ * @returns {Promise<import("./response.js").default>} - The streaming response.
240
+ */
241
+ async requestStream(options) {
242
+ const transport = await this._resolveTransport();
243
+ if (!transport.capabilities.responseStreaming) {
244
+ throw new SnapReqUnsupportedFeatureError({
245
+ feature: "response streaming",
246
+ transport: /** @type {any} */ (transport.constructor)?.transportName || "custom"
247
+ });
248
+ }
249
+ const response = await this._requestWithTimeout(options, (request) => transport.performRequest(request));
250
+ if ((options.throwOnError ?? this.throwOnError) && !response.ok) {
251
+ throw await this._httpError(response, this._normalize(options));
252
+ }
253
+ return response;
254
+ }
255
+ /**
256
+ * @param {RequestOptions} options - Request options.
257
+ * @param {(request: NormalizedRequest) => Promise<import("./response.js").default>} performRequest - Transport request runner.
258
+ * @returns {Promise<import("./response.js").default>} - Response with timeout handling attached.
259
+ */
260
+ async _requestWithTimeout(options, performRequest) {
261
+ const timeout = this._requestTimeout(options);
262
+ const normalized = this._normalize({ ...options, signal: timeout.signal });
263
+ try {
264
+ const response = await performRequest(normalized);
265
+ return timeout.response(response, normalized);
266
+ }
267
+ catch (error) {
268
+ timeout.clear();
269
+ throw timeout.error(error, normalized);
270
+ }
271
+ }
272
+ /**
273
+ * @param {string} path - Request path or absolute URL.
274
+ * @param {RequestOptions} [options] - Request options.
275
+ * @returns {Promise<import("./response.js").default>} - The response.
276
+ */
277
+ get(path, options = {}) {
278
+ return this.request({ ...options, method: "GET", path });
279
+ }
280
+ /**
281
+ * @param {string} path - Request path or absolute URL.
282
+ * @param {any} [body] - Request body.
283
+ * @param {RequestOptions} [options] - Request options.
284
+ * @returns {Promise<import("./response.js").default>} - The response.
285
+ */
286
+ post(path, body, options = {}) {
287
+ return this.request({ ...options, method: "POST", path, body });
288
+ }
289
+ /**
290
+ * @param {string} path - Request path or absolute URL.
291
+ * @param {any} [body] - Request body.
292
+ * @param {RequestOptions} [options] - Request options.
293
+ * @returns {Promise<import("./response.js").default>} - The response.
294
+ */
295
+ put(path, body, options = {}) {
296
+ return this.request({ ...options, method: "PUT", path, body });
297
+ }
298
+ /**
299
+ * @param {string} path - Request path or absolute URL.
300
+ * @param {any} [body] - Request body.
301
+ * @param {RequestOptions} [options] - Request options.
302
+ * @returns {Promise<import("./response.js").default>} - The response.
303
+ */
304
+ patch(path, body, options = {}) {
305
+ return this.request({ ...options, method: "PATCH", path, body });
306
+ }
307
+ /**
308
+ * @param {string} path - Request path or absolute URL.
309
+ * @param {RequestOptions} [options] - Request options.
310
+ * @returns {Promise<import("./response.js").default>} - The response.
311
+ */
312
+ delete(path, options = {}) {
313
+ return this.request({ ...options, method: "DELETE", path });
314
+ }
315
+ /**
316
+ * @param {import("./response.js").default} response - The failed response.
317
+ * @param {NormalizedRequest} request - The request that produced it.
318
+ * @returns {Promise<SnapReqHttpError>} - An error describing the failure.
319
+ */
320
+ async _httpError(response, request) {
321
+ let responseText = "";
322
+ try {
323
+ responseText = await response.text();
324
+ }
325
+ catch (error) {
326
+ if (error instanceof SnapReqTimeoutError)
327
+ throw error;
328
+ // Body unavailable (already streamed or read error) — fall back to status text.
329
+ }
330
+ const detail = responseText || response.statusText || "";
331
+ return new SnapReqHttpError({
332
+ message: `HTTP ${response.status} ${request.method} ${request.url}${detail ? `: ${detail}` : ""}`,
333
+ method: request.method,
334
+ url: request.url,
335
+ status: response.status,
336
+ statusText: response.statusText,
337
+ responseText,
338
+ response
339
+ });
340
+ }
341
+ /**
342
+ * Releases transport resources (for example Node keep-alive sockets).
343
+ * @returns {void}
344
+ */
345
+ close() {
346
+ this._transport?.close?.();
347
+ }
348
+ }
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC1yZXEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc25hcC1yZXEuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSw4QkFBOEIsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUNqRyxPQUFPLGNBQWMsTUFBTSxjQUFjLENBQUE7QUFDekMsT0FBTyxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDcEQsT0FBTyxFQUFDLHFCQUFxQixFQUFFLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUM5RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFdEQ7O0dBRUc7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sT0FBTztJQUMxQjs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxZQUFZLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRyxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsTUFBTSxFQUFDLEdBQUcsRUFBRTtRQUM3SSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQTtRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQTtRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxD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
@@ -33,3 +33,4 @@ export default class FetchTransport {
33
33
  }
34
34
  import SnapReqResponse from "../response.js";
35
35
  import SnapReqHeaders from "../headers.js";
36
+ //# sourceMappingURL=fetch-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-transport.d.ts","sourceRoot":"","sources":["../../src/transports/fetch-transport.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH;IACE,0CAA0C;IAC1C,4BADc,MAAM,CAGnB;IAED,sFAAsF;IACtF,sBADc,OAAO,CAGpB;IAED,8FAA8F;IAC9F,oBADc,OAAO,oBAAoB,EAAE,qBAAqB,CAM/D;IAED;;;OAGG;IACH,wBAHW,OAAO,gBAAgB,EAAE,iBAAiB,GACxC,OAAO,CAAC,eAAe,CAAC,CA6CpC;IAED;;;OAGG;IACH,2BAHW,QAAQ,GACN,cAAc,CAQ1B;IAED;;;;;;OAMG;IACH,0BAHW,QAAQ,GACN,aAAa,CAAC,UAAU,CAAC,CA2BrC;CACF;4BA1H2B,gBAAgB;2BADjB,eAAe"}