@gauts/ft 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/dist/client.js ADDED
@@ -0,0 +1,354 @@
1
+ import { DEFAULTS, FORWARD_HEADERS } from "./config.js";
2
+ import { HTTPError, NetworkError, TimeoutError } from "./errors.js";
3
+ import { getBodySize, trackResponse, trackStream } from "./progress.js";
4
+ import { canRetry, getRetryDelay, resolveRetry, sleep } from "./retry.js";
5
+ import { resolveUrl } from "./url.js";
6
+ const CONFIG_KEYS = new Set([
7
+ "afterResponse",
8
+ "baseUrl",
9
+ "beforeRequest",
10
+ "forwardHeaders",
11
+ "getHeaders",
12
+ "headers",
13
+ "onError",
14
+ "onRetry",
15
+ "onStatus",
16
+ "prefix",
17
+ "retry",
18
+ "searchParams",
19
+ "throwHttpErrors",
20
+ "timeout",
21
+ ]);
22
+ const REQUEST_KEYS = new Set([
23
+ "afterResponse",
24
+ "beforeRequest",
25
+ "headers",
26
+ "json",
27
+ "onDownloadProgress",
28
+ "onError",
29
+ "onRetry",
30
+ "onStatus",
31
+ "onUploadProgress",
32
+ "retry",
33
+ "searchParams",
34
+ "throwHttpErrors",
35
+ "timeout",
36
+ ]);
37
+ const toError = (error) => {
38
+ return error instanceof Error ? error : new Error("Request failed", { cause: error });
39
+ };
40
+ const isStream = (body) => {
41
+ return typeof ReadableStream !== "undefined" && body instanceof ReadableStream;
42
+ };
43
+ const isRuntimeBaseUrl = (baseUrl) => {
44
+ return typeof baseUrl === "object" && !(baseUrl instanceof URL);
45
+ };
46
+ const getBaseUrl = (baseUrl) => {
47
+ if (!isRuntimeBaseUrl(baseUrl))
48
+ return baseUrl;
49
+ return typeof window === "undefined" ? baseUrl.server : baseUrl.client;
50
+ };
51
+ const getForwardedHeaders = async (config) => {
52
+ if (!config.forwardHeaders || typeof window !== "undefined")
53
+ return undefined;
54
+ if (!config.getHeaders) {
55
+ throw new TypeError("getHeaders is required when forwardHeaders is enabled on the server");
56
+ }
57
+ const source = new Headers(await config.getHeaders());
58
+ const names = new Set(FORWARD_HEADERS);
59
+ if (typeof config.forwardHeaders === "object") {
60
+ for (const name of config.forwardHeaders.extra) {
61
+ const normalized = name.trim().toLowerCase();
62
+ if (normalized)
63
+ names.add(normalized);
64
+ }
65
+ }
66
+ const headers = new Headers();
67
+ for (const name of names) {
68
+ const value = source.get(name);
69
+ if (value?.trim())
70
+ headers.set(name, value);
71
+ }
72
+ return headers;
73
+ };
74
+ const mergeHeaders = (...values) => {
75
+ const headers = new Headers();
76
+ for (const value of values) {
77
+ if (!value)
78
+ continue;
79
+ for (const [name, headerValue] of new Headers(value))
80
+ headers.set(name, headerValue);
81
+ }
82
+ return headers;
83
+ };
84
+ const getInit = (value, keys) => {
85
+ return Object.fromEntries(Object.entries(value).filter(([key]) => !keys.has(key)));
86
+ };
87
+ const getBody = (options, headers) => {
88
+ if (!("json" in options))
89
+ return options.body;
90
+ if (options.body !== null && options.body !== undefined) {
91
+ throw new TypeError("json and body cannot be used together");
92
+ }
93
+ if (options.json === undefined)
94
+ throw new TypeError("json cannot be undefined");
95
+ const body = JSON.stringify(options.json);
96
+ if (!headers.has("content-type"))
97
+ headers.set("content-type", "application/json");
98
+ return body;
99
+ };
100
+ const buildRequest = ({ config, forwardedHeaders, input, method, options, signal, }) => {
101
+ const requestInput = input instanceof Request
102
+ ? input
103
+ : resolveUrl({
104
+ baseUrl: getBaseUrl(config.baseUrl),
105
+ input,
106
+ prefix: config.prefix,
107
+ requestSearchParams: options.searchParams,
108
+ searchParams: config.searchParams,
109
+ });
110
+ const inputHeaders = input instanceof Request ? input.headers : undefined;
111
+ const headers = mergeHeaders(forwardedHeaders, config.headers, inputHeaders, options.headers);
112
+ const body = getBody(options, headers);
113
+ const hasBody = body !== undefined || "body" in options;
114
+ const init = {
115
+ ...getInit(config, CONFIG_KEYS),
116
+ ...getInit(options, REQUEST_KEYS),
117
+ headers,
118
+ method,
119
+ signal,
120
+ ...(hasBody ? { body } : {}),
121
+ };
122
+ const requestInit = isStream(body)
123
+ ? { ...init, duplex: "half" }
124
+ : init;
125
+ let request = new Request(requestInput, requestInit);
126
+ if (options.onUploadProgress && request.body) {
127
+ const headerSize = Number(request.headers.get("content-length"));
128
+ const total = getBodySize(body) ?? (Number.isFinite(headerSize) ? headerSize : null);
129
+ const tracked = trackStream({
130
+ onProgress: options.onUploadProgress,
131
+ stream: request.body,
132
+ total,
133
+ });
134
+ const trackedInit = {
135
+ body: tracked,
136
+ duplex: "half",
137
+ };
138
+ request = new Request(request, trackedInit);
139
+ }
140
+ return { replayable: !isStream(body) && !(input instanceof Request && input.body), request };
141
+ };
142
+ const createOperation = ({ signal, timeout, }) => {
143
+ const controller = new AbortController();
144
+ let timedOut = false;
145
+ let timer;
146
+ const abort = () => controller.abort(signal?.reason);
147
+ if (signal?.aborted)
148
+ abort();
149
+ else
150
+ signal?.addEventListener("abort", abort, { once: true });
151
+ if (timeout !== false) {
152
+ if (!Number.isFinite(timeout) || timeout <= 0) {
153
+ throw new TypeError("timeout must be a positive number or false");
154
+ }
155
+ timer = setTimeout(() => {
156
+ timedOut = true;
157
+ controller.abort();
158
+ }, timeout);
159
+ }
160
+ return {
161
+ cleanup: () => {
162
+ if (timer)
163
+ clearTimeout(timer);
164
+ signal?.removeEventListener("abort", abort);
165
+ },
166
+ didTimeout: () => timedOut,
167
+ signal: controller.signal,
168
+ timeout,
169
+ };
170
+ };
171
+ class Task {
172
+ #promise;
173
+ constructor(run) {
174
+ this.#promise = run();
175
+ }
176
+ then(onFulfilled, onRejected) {
177
+ return this.#promise.then(onFulfilled, onRejected);
178
+ }
179
+ catch(onRejected) {
180
+ return this.#promise.catch(onRejected);
181
+ }
182
+ finally(onFinally) {
183
+ return this.#promise.finally(onFinally ?? undefined);
184
+ }
185
+ response() {
186
+ return this.#promise;
187
+ }
188
+ async json() {
189
+ return (await this.#promise).json();
190
+ }
191
+ async text() {
192
+ return (await this.#promise).text();
193
+ }
194
+ async blob() {
195
+ return (await this.#promise).blob();
196
+ }
197
+ async arrayBuffer() {
198
+ return (await this.#promise).arrayBuffer();
199
+ }
200
+ async bytes() {
201
+ return (await this.#promise).bytes();
202
+ }
203
+ async formData() {
204
+ return (await this.#promise).formData();
205
+ }
206
+ }
207
+ const createMethod = (config, method) => (input = "", options = {}) => new Task(async () => {
208
+ const timeout = options.timeout ?? config.timeout ?? DEFAULTS.timeout;
209
+ const operation = createOperation({
210
+ signal: options.signal ?? (input instanceof Request ? input.signal : undefined),
211
+ timeout,
212
+ });
213
+ const retry = resolveRetry(options.retry ?? config.retry);
214
+ const beforeRequest = options.beforeRequest ?? config.beforeRequest;
215
+ const afterResponse = options.afterResponse ?? config.afterResponse;
216
+ const onRetry = options.onRetry ?? config.onRetry;
217
+ const onError = options.onError ?? config.onError;
218
+ const onStatus = options.onStatus ?? config.onStatus;
219
+ const throwHttpErrors = options.throwHttpErrors ?? config.throwHttpErrors ?? DEFAULTS.throwHttpErrors;
220
+ let attempt = 0;
221
+ let lastRequest = null;
222
+ const handleError = async (error) => {
223
+ const current = toError(error);
224
+ const changed = await onError?.({ attempt, error: current, request: lastRequest });
225
+ return changed ?? current;
226
+ };
227
+ const getTimeoutError = () => new TimeoutError(operation.timeout === false ? 0 : operation.timeout, lastRequest);
228
+ try {
229
+ let forwardedHeaders;
230
+ try {
231
+ forwardedHeaders = await getForwardedHeaders(config);
232
+ }
233
+ catch (error) {
234
+ throw await handleError(error);
235
+ }
236
+ if (operation.didTimeout())
237
+ throw await handleError(getTimeoutError());
238
+ for (;;) {
239
+ attempt += 1;
240
+ const built = buildRequest({
241
+ config,
242
+ forwardedHeaders,
243
+ input,
244
+ method,
245
+ options,
246
+ signal: operation.signal,
247
+ });
248
+ lastRequest = built.request;
249
+ try {
250
+ await beforeRequest?.({ attempt, request: built.request });
251
+ }
252
+ catch (error) {
253
+ throw await handleError(error);
254
+ }
255
+ let response;
256
+ try {
257
+ response = await fetch(built.request);
258
+ }
259
+ catch (error) {
260
+ if (operation.didTimeout()) {
261
+ throw await handleError(getTimeoutError());
262
+ }
263
+ if (operation.signal.aborted)
264
+ throw await handleError(error);
265
+ const networkError = new NetworkError(error, built.request);
266
+ if (!canRetry({
267
+ attempt,
268
+ config: retry,
269
+ method,
270
+ replayable: built.replayable,
271
+ })) {
272
+ throw await handleError(networkError);
273
+ }
274
+ const delay = getRetryDelay({ attempt, config: retry, response: null });
275
+ try {
276
+ await onRetry?.({
277
+ attempt,
278
+ delay,
279
+ error: networkError,
280
+ request: built.request,
281
+ response: null,
282
+ });
283
+ await sleep(delay, operation.signal);
284
+ }
285
+ catch (retryError) {
286
+ throw await handleError(operation.didTimeout() ? getTimeoutError() : retryError);
287
+ }
288
+ continue;
289
+ }
290
+ try {
291
+ response =
292
+ (await afterResponse?.({
293
+ attempt,
294
+ request: built.request,
295
+ response,
296
+ })) ?? response;
297
+ }
298
+ catch (error) {
299
+ throw await handleError(error);
300
+ }
301
+ if (operation.didTimeout())
302
+ throw await handleError(getTimeoutError());
303
+ const shouldRetry = retry?.statusCodes.includes(response.status) &&
304
+ canRetry({
305
+ attempt,
306
+ config: retry,
307
+ method,
308
+ replayable: built.replayable,
309
+ });
310
+ if (shouldRetry && retry) {
311
+ const error = new HTTPError(response, built.request);
312
+ const delay = getRetryDelay({ attempt, config: retry, response });
313
+ try {
314
+ await onRetry?.({
315
+ attempt,
316
+ delay,
317
+ error,
318
+ request: built.request,
319
+ response,
320
+ });
321
+ await response.body?.cancel();
322
+ await sleep(delay, operation.signal);
323
+ }
324
+ catch (retryError) {
325
+ throw await handleError(operation.didTimeout() ? getTimeoutError() : retryError);
326
+ }
327
+ continue;
328
+ }
329
+ response = trackResponse(response, options.onDownloadProgress);
330
+ const context = {
331
+ attempt,
332
+ request: built.request,
333
+ response,
334
+ };
335
+ await onStatus?.[response.status]?.(context);
336
+ if (!response.ok && throwHttpErrors) {
337
+ throw await handleError(new HTTPError(response, built.request));
338
+ }
339
+ return response;
340
+ }
341
+ }
342
+ finally {
343
+ operation.cleanup();
344
+ }
345
+ });
346
+ export const createFetcher = (config = {}) => ({
347
+ delete: createMethod(config, "DELETE"),
348
+ get: createMethod(config, "GET"),
349
+ head: createMethod(config, "HEAD"),
350
+ patch: createMethod(config, "PATCH"),
351
+ post: createMethod(config, "POST"),
352
+ put: createMethod(config, "PUT"),
353
+ });
354
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { HttpMethod } from "./types.js";
2
+ export declare const DEFAULTS: {
3
+ readonly retry: {
4
+ readonly baseDelay: 300;
5
+ readonly jitter: true;
6
+ readonly limit: 2;
7
+ readonly maxDelay: 30000;
8
+ readonly methods: readonly HttpMethod[];
9
+ readonly statusCodes: readonly number[];
10
+ };
11
+ readonly throwHttpErrors: true;
12
+ readonly timeout: false;
13
+ };
14
+ export declare const FORWARD_HEADERS: readonly ["accept-language", "cf-connecting-ip", "origin", "referer", "sec-ch-ua", "sec-ch-ua-mobile", "sec-ch-ua-platform", "sec-fetch-dest", "sec-fetch-mode", "sec-fetch-site", "sec-fetch-user", "true-client-ip", "user-agent", "x-forwarded-for", "x-forwarded-host", "x-forwarded-port", "x-forwarded-proto", "x-real-ip"];
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,QAAQ;;;;;;0BAMe,SAAS,UAAU,EAAE;8BACF,SAAS,MAAM,EAAE;;;;CAI9D,CAAC;AAEX,eAAO,MAAM,eAAe,mUAmBlB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,33 @@
1
+ export const DEFAULTS = {
2
+ retry: {
3
+ baseDelay: 300,
4
+ jitter: true,
5
+ limit: 2,
6
+ maxDelay: 30_000,
7
+ methods: ["GET", "HEAD"],
8
+ statusCodes: [408, 429, 500, 502, 503, 504],
9
+ },
10
+ throwHttpErrors: true,
11
+ timeout: false,
12
+ };
13
+ export const FORWARD_HEADERS = [
14
+ "accept-language",
15
+ "cf-connecting-ip",
16
+ "origin",
17
+ "referer",
18
+ "sec-ch-ua",
19
+ "sec-ch-ua-mobile",
20
+ "sec-ch-ua-platform",
21
+ "sec-fetch-dest",
22
+ "sec-fetch-mode",
23
+ "sec-fetch-site",
24
+ "sec-fetch-user",
25
+ "true-client-ip",
26
+ "user-agent",
27
+ "x-forwarded-for",
28
+ "x-forwarded-host",
29
+ "x-forwarded-port",
30
+ "x-forwarded-proto",
31
+ "x-real-ip",
32
+ ];
33
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,KAAK,EAAE;QACH,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAA0B;QACjD,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAsB;KACnE;IACD,eAAe,EAAE,IAAI;IACrB,OAAO,EAAE,KAAK;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,iBAAiB;IACjB,kBAAkB;IAClB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,kBAAkB;IAClB,oBAAoB;IACpB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,WAAW;CACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare class FetchError extends Error {
2
+ readonly request: Request | null;
3
+ constructor(message: string, request: Request | null, options?: ErrorOptions);
4
+ }
5
+ export declare class HTTPError extends FetchError {
6
+ readonly response: Response;
7
+ constructor(response: Response, request: Request);
8
+ }
9
+ export declare class NetworkError extends FetchError {
10
+ constructor(error: unknown, request: Request | null);
11
+ }
12
+ export declare class TimeoutError extends FetchError {
13
+ readonly timeout: number;
14
+ constructor(timeout: number, request: Request | null);
15
+ }
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;gBAErB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,YAAY;CAK/E;AAED,qBAAa,SAAU,SAAQ,UAAU;IACrC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAEhB,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO;CAQnD;AAED,qBAAa,YAAa,SAAQ,UAAU;gBAC5B,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAMtD;AAED,qBAAa,YAAa,SAAQ,UAAU;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAKvD"}
package/dist/errors.js ADDED
@@ -0,0 +1,32 @@
1
+ export class FetchError extends Error {
2
+ request;
3
+ constructor(message, request, options) {
4
+ super(message, options);
5
+ this.name = "FetchError";
6
+ this.request = request;
7
+ }
8
+ }
9
+ export class HTTPError extends FetchError {
10
+ response;
11
+ constructor(response, request) {
12
+ super(`Request failed with status ${String(response.status)} ${response.statusText}`.trim(), request);
13
+ this.name = "HTTPError";
14
+ this.response = response;
15
+ }
16
+ }
17
+ export class NetworkError extends FetchError {
18
+ constructor(error, request) {
19
+ const message = error instanceof Error ? error.message : "Network request failed";
20
+ super(message, request, { cause: error });
21
+ this.name = "NetworkError";
22
+ }
23
+ }
24
+ export class TimeoutError extends FetchError {
25
+ timeout;
26
+ constructor(timeout, request) {
27
+ super(`Request timed out after ${String(timeout)}ms`, request);
28
+ this.name = "TimeoutError";
29
+ this.timeout = timeout;
30
+ }
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACxB,OAAO,CAAiB;IAEjC,YAAY,OAAe,EAAE,OAAuB,EAAE,OAAsB;QACxE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;CACJ;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IAC5B,QAAQ,CAAW;IAE5B,YAAY,QAAkB,EAAE,OAAgB;QAC5C,KAAK,CACD,8BAA8B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EACrF,OAAO,CACV,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;CACJ;AAED,MAAM,OAAO,YAAa,SAAQ,UAAU;IACxC,YAAY,KAAc,EAAE,OAAuB;QAC/C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;QAElF,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC/B,CAAC;CACJ;AAED,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC/B,OAAO,CAAS;IAEzB,YAAY,OAAe,EAAE,OAAuB;QAChD,KAAK,CAAC,2BAA2B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;CACJ"}
@@ -0,0 +1,7 @@
1
+ import type { Ft } from "./types.js";
2
+ export { createFetcher } from "./client.js";
3
+ export { FetchError, HTTPError, NetworkError, TimeoutError } from "./errors.js";
4
+ export type { AfterResponse, BeforeRequest, ErrorContext, Fetcher, FetcherConfig, FetchMethod, FetchTask, Ft, ForwardHeaders, GetHeaders, HttpMethod, OnError, OnRetry, OnStatus, Progress, RequestContext, RequestInput, RequestOptions, ResponseContext, RetryConfig, RetryContext, RetryOption, RuntimeBaseUrl, SearchParams, SearchValue, StatusHandlers, } from "./types.js";
5
+ declare const ft: Ft;
6
+ export default ft;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EACR,aAAa,EACb,aAAa,EACb,YAAY,EACZ,OAAO,EACP,aAAa,EACb,WAAW,EACX,SAAS,EACT,EAAE,EACF,cAAc,EACd,UAAU,EACV,UAAU,EACV,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,GACjB,MAAM,YAAY,CAAC;AAIpB,QAAA,MAAM,EAAE,EAAE,EAGT,CAAC;AAEF,eAAe,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ import { createFetcher } from "./client.js";
2
+ export { createFetcher } from "./client.js";
3
+ export { FetchError, HTTPError, NetworkError, TimeoutError } from "./errors.js";
4
+ const client = createFetcher();
5
+ const ft = {
6
+ ...client,
7
+ create: createFetcher,
8
+ };
9
+ export default ft;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA8BhF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;AAE/B,MAAM,EAAE,GAAO;IACX,GAAG,MAAM;IACT,MAAM,EAAE,aAAa;CACxB,CAAC;AAEF,eAAe,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Progress } from "./types.js";
2
+ type TrackStreamInput = {
3
+ onProgress: (progress: Progress) => void;
4
+ stream: ReadableStream<Uint8Array>;
5
+ total: number | null;
6
+ };
7
+ export declare const getBodySize: (body: BodyInit | null | undefined) => number | null;
8
+ export declare const trackStream: ({ onProgress, stream, total }: TrackStreamInput) => ReadableStream<Uint8Array<ArrayBufferLike>>;
9
+ export declare const trackResponse: (response: Response, onProgress?: (progress: Progress) => void) => Response;
10
+ export {};
11
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,KAAK,gBAAgB,GAAG;IACpB,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAQF,eAAO,MAAM,WAAW,GAAI,MAAM,QAAQ,GAAG,IAAI,GAAG,SAAS,KAAG,MAAM,GAAG,IAUxE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,+BAA+B,gBAAgB,gDAiB1E,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,aAe1F,CAAC"}
@@ -0,0 +1,49 @@
1
+ const getProgress = (transferred, total) => ({
2
+ percent: total === null ? null : total === 0 ? 1 : transferred / total,
3
+ total,
4
+ transferred,
5
+ });
6
+ export const getBodySize = (body) => {
7
+ if (typeof body === "string")
8
+ return new TextEncoder().encode(body).byteLength;
9
+ if (body instanceof URLSearchParams) {
10
+ return new TextEncoder().encode(body.toString()).byteLength;
11
+ }
12
+ if (body instanceof Blob)
13
+ return body.size;
14
+ if (body instanceof ArrayBuffer)
15
+ return body.byteLength;
16
+ if (ArrayBuffer.isView(body))
17
+ return body.byteLength;
18
+ return null;
19
+ };
20
+ export const trackStream = ({ onProgress, stream, total }) => {
21
+ let transferred = 0;
22
+ onProgress(getProgress(0, total));
23
+ return stream.pipeThrough(new TransformStream({
24
+ flush: () => {
25
+ if (transferred === 0)
26
+ onProgress(getProgress(0, total ?? 0));
27
+ },
28
+ transform: (chunk, controller) => {
29
+ transferred += chunk.byteLength;
30
+ onProgress(getProgress(transferred, total));
31
+ controller.enqueue(chunk);
32
+ },
33
+ }));
34
+ };
35
+ export const trackResponse = (response, onProgress) => {
36
+ if (!onProgress || !response.body)
37
+ return response;
38
+ const length = Number(response.headers.get("content-length"));
39
+ const total = Number.isFinite(length) && length >= 0 ? length : null;
40
+ const body = trackStream({ onProgress, stream: response.body, total });
41
+ const tracked = new Response(body, response);
42
+ Object.defineProperties(tracked, {
43
+ redirected: { value: response.redirected },
44
+ type: { value: response.type },
45
+ url: { value: response.url },
46
+ });
47
+ return tracked;
48
+ };
49
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { HttpMethod, RetryConfig, RetryOption } from "./types.js";
2
+ export type ResolvedRetry = Required<RetryConfig>;
3
+ type CanRetryInput = {
4
+ attempt: number;
5
+ config: ResolvedRetry | null;
6
+ method: HttpMethod;
7
+ replayable: boolean;
8
+ };
9
+ type GetRetryDelayInput = {
10
+ attempt: number;
11
+ config: ResolvedRetry;
12
+ response: Response | null;
13
+ };
14
+ export declare const resolveRetry: (retry?: RetryOption) => ResolvedRetry | null;
15
+ export declare const canRetry: ({ attempt, config, method, replayable }: CanRetryInput) => boolean;
16
+ export declare const getRetryDelay: ({ attempt, config, response }: GetRetryDelayInput) => number;
17
+ export declare const sleep: (delay: number, signal: AbortSignal) => Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAElD,KAAK,aAAa,GAAG;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC7B,CAAC;AAQF,eAAO,MAAM,YAAY,GAAI,QAAQ,WAAW,KAAG,aAAa,GAAG,IAkBlE,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,yCAAyC,aAAa,YACgB,CAAC;AAchG,eAAO,MAAM,aAAa,GAAI,+BAA+B,kBAAkB,WAM9E,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,QAAQ,WAAW,kBAqBlD,CAAC"}