@gcmdev/faxios 0.1.0 → 0.2.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/README.md +40 -1774
- package/dist/index.d.ts +8 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/adapters/fetch.js +23 -3
- package/dist/lib/adapters/fetch.js.map +1 -1
- package/dist/lib/cancel/isCancel.d.ts +2 -1
- package/dist/lib/cancel/isCancel.js +3 -0
- package/dist/lib/cancel/isCancel.js.map +1 -1
- package/dist/lib/core/Faxios.d.ts +5 -17
- package/dist/lib/core/Faxios.js +144 -76
- package/dist/lib/core/Faxios.js.map +1 -1
- package/dist/lib/core/FaxiosError.d.ts +18 -6
- package/dist/lib/core/FaxiosError.js +16 -1
- package/dist/lib/core/FaxiosError.js.map +1 -1
- package/dist/lib/core/FaxiosHeaders.d.ts +11 -8
- package/dist/lib/core/FaxiosHeaders.js +1 -0
- package/dist/lib/core/FaxiosHeaders.js.map +1 -1
- package/dist/lib/core/define.d.ts +2 -2
- package/dist/lib/core/define.js.map +1 -1
- package/dist/lib/core/dispatchRequest.js +4 -0
- package/dist/lib/core/dispatchRequest.js.map +1 -1
- package/dist/lib/core/prepareRequest.js +1 -20
- package/dist/lib/core/prepareRequest.js.map +1 -1
- package/dist/lib/core/route.d.ts +2 -2
- package/dist/lib/defaults/index.js +3 -3
- package/dist/lib/defaults/index.js.map +1 -1
- package/dist/lib/defaults/transitional.d.ts +0 -1
- package/dist/lib/defaults/transitional.js +0 -1
- package/dist/lib/defaults/transitional.js.map +1 -1
- package/dist/lib/env/data.d.ts +1 -1
- package/dist/lib/env/data.js +1 -1
- package/dist/lib/env/data.js.map +1 -1
- package/dist/lib/faxios.d.ts +94 -48
- package/dist/lib/faxios.js +14 -2
- package/dist/lib/faxios.js.map +1 -1
- package/dist/lib/helpers/FaxiosURLSearchParams.d.ts +2 -1
- package/dist/lib/helpers/FaxiosURLSearchParams.js.map +1 -1
- package/dist/lib/helpers/buildURL.js +7 -1
- package/dist/lib/helpers/buildURL.js.map +1 -1
- package/dist/lib/helpers/cloneConfig.d.ts +3 -0
- package/dist/lib/helpers/cloneConfig.js +21 -0
- package/dist/lib/helpers/cloneConfig.js.map +1 -0
- package/dist/lib/helpers/composeSignals.js +8 -1
- package/dist/lib/helpers/composeSignals.js.map +1 -1
- package/dist/lib/helpers/isFaxiosError.d.ts +7 -2
- package/dist/lib/helpers/isFaxiosError.js +5 -1
- package/dist/lib/helpers/isFaxiosError.js.map +1 -1
- package/dist/lib/platform.d.ts +1 -1
- package/dist/lib/plugins/attempt.d.ts +1 -0
- package/dist/lib/plugins/attempt.js +4 -0
- package/dist/lib/plugins/attempt.js.map +1 -0
- package/dist/lib/plugins/authBearer.d.ts +30 -0
- package/dist/lib/plugins/authBearer.js +99 -0
- package/dist/lib/plugins/authBearer.js.map +1 -0
- package/dist/lib/plugins/definePlugin.d.ts +21 -0
- package/dist/lib/plugins/definePlugin.js +14 -0
- package/dist/lib/plugins/definePlugin.js.map +1 -0
- package/dist/lib/plugins/retry.d.ts +65 -0
- package/dist/lib/plugins/retry.js +168 -0
- package/dist/lib/plugins/retry.js.map +1 -0
- package/dist/lib/plugins/timing.d.ts +31 -0
- package/dist/lib/plugins/timing.js +53 -0
- package/dist/lib/plugins/timing.js.map +1 -0
- package/dist/lib/types.d.ts +113 -34
- package/package.json +41 -19
- package/skills/configure-requests/SKILL.md +338 -0
- package/skills/configure-requests/references/axios-differences.md +67 -0
- package/skills/configure-requests/references/plugins.md +110 -0
- package/LICENSE +0 -7
- package/dist/lib/core/InterceptorManager.d.ts +0 -9
- package/dist/lib/core/InterceptorManager.js +0 -28
- package/dist/lib/core/InterceptorManager.js.map +0 -1
package/dist/lib/faxios.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import CanceledError from "./cancel/CanceledError.js";
|
|
4
4
|
import isCancel from "./cancel/isCancel.js";
|
|
5
|
-
import Faxios from "./core/Faxios.js";
|
|
5
|
+
import Faxios, { ejectMiddleware, useMiddleware } from "./core/Faxios.js";
|
|
6
6
|
import FaxiosError from "./core/FaxiosError.js";
|
|
7
7
|
import FaxiosHeaders from "./core/FaxiosHeaders.js";
|
|
8
8
|
import mergeConfig from "./core/mergeConfig.js";
|
|
@@ -29,13 +29,25 @@ function createInstance(defaultConfig) {
|
|
|
29
29
|
utils.extend(target, Faxios.prototype, context, { allOwnKeys: true });
|
|
30
30
|
// Copy context to instance
|
|
31
31
|
utils.extend(target, context, null, { allOwnKeys: true });
|
|
32
|
+
// use() and eject() aren't Faxios members, so the instance gets them here. use() returns the
|
|
33
|
+
// callable instance for chaining. At runtime it only registers the middleware; the plugin rules
|
|
34
|
+
// live in FaxiosInstance["use"], so the cast is the single place the phantom TOpts/TCaps
|
|
35
|
+
// refinement meets the untyped registry.
|
|
36
|
+
const use = (middleware) => {
|
|
37
|
+
useMiddleware(context, middleware);
|
|
38
|
+
return instance;
|
|
39
|
+
};
|
|
40
|
+
instance.use = use;
|
|
41
|
+
instance.eject = (middleware) => {
|
|
42
|
+
ejectMiddleware(context, middleware);
|
|
43
|
+
};
|
|
32
44
|
// Factory for creating new instances
|
|
33
45
|
instance.create = function create(instanceConfig) {
|
|
34
46
|
return createInstance(mergeConfig(defaultConfig, instanceConfig));
|
|
35
47
|
};
|
|
36
48
|
return instance;
|
|
37
49
|
}
|
|
38
|
-
// Create the default instance to be exported
|
|
50
|
+
// Create the default instance to be exported; the statics are attached below.
|
|
39
51
|
const faxios = createInstance(defaults);
|
|
40
52
|
// Expose Faxios class to allow class inheritance
|
|
41
53
|
faxios.Faxios = Faxios;
|
package/dist/lib/faxios.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"faxios.js","sourceRoot":"","sources":["../../src/lib/faxios.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,YAAY,CAAC;AAEb,OAAO,aAAa,kCAAkC;AACtD,OAAO,QAAQ,6BAA6B;
|
|
1
|
+
{"version":3,"file":"faxios.js","sourceRoot":"","sources":["../../src/lib/faxios.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { ParamEncoder } from "../types.js";
|
|
1
2
|
declare class FaxiosURLSearchParams {
|
|
2
3
|
#private;
|
|
3
4
|
constructor(params?: unknown, options?: unknown);
|
|
4
5
|
append(name: string, value: unknown): void;
|
|
5
|
-
toString(encoder?:
|
|
6
|
+
toString(encoder?: ParamEncoder): string;
|
|
6
7
|
}
|
|
7
8
|
export default FaxiosURLSearchParams;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FaxiosURLSearchParams.js","sourceRoot":"","sources":["../../../src/lib/helpers/FaxiosURLSearchParams.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"FaxiosURLSearchParams.js","sourceRoot":"","sources":["../../../src/lib/helpers/FaxiosURLSearchParams.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,UAAU,wBAAwB;AAEzC;;;;;;;GAOG;AACH,SAAS,MAAM,CAAC,GAAW;IACzB,MAAM,OAAO,GAA2B;QACtC,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,GAAG;KACX,CAAC;IACF,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,SAAS,QAAQ,CAAC,KAAa;QACpF,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,qBAAqB;IACzB,MAAM,GAA6B,EAAE,CAAC;IAEtC,YAAY,MAAgB,EAAE,OAAiB;QAC7C,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,OAAkC,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,KAAc;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAE,IAAI,EAAE,KAAK,CAAE,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,OAAsB;QAC7B,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC;YAC3D,CAAC,CAAC,MAAM,CAAC;QAEX,OAAO,IAAI,CAAC,MAAM;aACf,GAAG,CAAC,SAAS,IAAI,CAAC,IAAuB;YACxC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;QACpE,CAAC,EAAE,EAAE,CAAC;aACL,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;CACF;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -16,6 +16,11 @@ export function encode(val) {
|
|
|
16
16
|
.replace(/%2C/gi, ",")
|
|
17
17
|
.replace(/%20/g, "+");
|
|
18
18
|
}
|
|
19
|
+
// The request path validates `paramsSerializer.encode` as a function; this
|
|
20
|
+
// guard narrows the untyped option to ParamEncoder without asserting it.
|
|
21
|
+
function isParamEncoder(value) {
|
|
22
|
+
return typeof value === "function";
|
|
23
|
+
}
|
|
19
24
|
/**
|
|
20
25
|
* Build a URL by appending params to the end
|
|
21
26
|
*
|
|
@@ -37,7 +42,8 @@ export default function buildURL(url, params, options) {
|
|
|
37
42
|
// Read serializer options pollution-safely: own properties and methods on a
|
|
38
43
|
// class/template prototype are honored, but values injected onto a polluted
|
|
39
44
|
// Object.prototype are ignored.
|
|
40
|
-
const
|
|
45
|
+
const customEncode = utils.getSafeProp(_options, "encode");
|
|
46
|
+
const _encode = isParamEncoder(customEncode) ? customEncode : encode;
|
|
41
47
|
const serializeFn = utils.getSafeProp(_options, "serialize");
|
|
42
48
|
let serializedParams;
|
|
43
49
|
if (serializeFn) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildURL.js","sourceRoot":"","sources":["../../../src/lib/helpers/buildURL.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"buildURL.js","sourceRoot":"","sources":["../../../src/lib/helpers/buildURL.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,KAAK,oBAAoB;AAChC,OAAO,qBAAqB,mCAAmC;AAE/D;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW;IAChC,OAAO,kBAAkB,CAAC,GAAG,CAAC;SAC3B,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC;AACrC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAgB,EAAE,OAAiB;IAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;QACxC,CAAC,CAAC;YACA,SAAS,EAAE,OAAO;SACnB;QACD,CAAC,CAAC,OAAO,CAAC;IAEZ,4EAA4E;IAC5E,4EAA4E;IAC5E,gCAAgC;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAiB,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;IACnF,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAgE,CAAC;IAE5H,IAAI,gBAAoC,CAAC;IAEzC,IAAI,WAAW,EAAE,CAAC;QAChB,gBAAgB,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;SACI,CAAC;QACJ,gBAAgB,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAChD,CAAC,CAAE,MAAsC,CAAC,QAAQ,EAAE;YACpD,CAAC,CAAC,IAAI,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACpC,CAAC;QACD,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;IAClE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const DANGEROUS_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
2
|
+
// ponytail: null-proto shallow clone; replaces mergeConfig({}, config) which ran the full
|
|
3
|
+
// two-config merge machinery just to get a defensive copy. Security invariants preserved:
|
|
4
|
+
// null-proto so fetch.ts destructuring can't inherit Object.prototype gadgets, and
|
|
5
|
+
// dangerous keys filtered to block prototype-pollution write paths.
|
|
6
|
+
export default function cloneConfig(src) {
|
|
7
|
+
const dst = Object.create(null);
|
|
8
|
+
Object.defineProperty(dst, "hasOwnProperty", Object.assign(Object.create(null), {
|
|
9
|
+
value: Object.prototype.hasOwnProperty,
|
|
10
|
+
writable: true,
|
|
11
|
+
configurable: true,
|
|
12
|
+
enumerable: false,
|
|
13
|
+
}));
|
|
14
|
+
for (const key of Object.keys(src)) {
|
|
15
|
+
if (!DANGEROUS_KEYS.has(key)) {
|
|
16
|
+
dst[key] = src[key];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return dst;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=cloneConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloneConfig.js","sourceRoot":"","sources":["../../../src/lib/helpers/cloneConfig.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAE,WAAW,EAAE,aAAa,EAAE,WAAW,CAAE,CAAC,CAAC;AAEnF,0FAA0F;AAC1F,0FAA0F;AAC1F,mFAAmF;AACnF,oEAAoE;AACpE,MAAM,CAAC,OAAO,UAAU,WAAW,CAAgC,GAAM;IACvE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAgC,CAAC;IAC/D,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAuB,EAAE;QACpG,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,cAAc;QACtC,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC,CAAC;IACJ,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,GAA+B,CAAC,GAAG,CAAC,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -39,7 +39,14 @@ const composeSignals = (signals, timeout, timeoutMessage) => {
|
|
|
39
39
|
});
|
|
40
40
|
activeSignals = null;
|
|
41
41
|
};
|
|
42
|
-
|
|
42
|
+
// An already-aborted input never fires "abort" again, so propagate it now.
|
|
43
|
+
for (const signal of activeSignals) {
|
|
44
|
+
if (signal.aborted) {
|
|
45
|
+
onabort.call(signal, signal.reason);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
signal.addEventListener("abort", onabort);
|
|
49
|
+
}
|
|
43
50
|
const { signal } = controller;
|
|
44
51
|
signal.unsubscribe = () => utils.asap(unsubscribe);
|
|
45
52
|
return signal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composeSignals.js","sourceRoot":"","sources":["../../../src/lib/helpers/composeSignals.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,mCAAmC;AACvD,OAAO,WAAW,+BAA+B;AACjD,OAAO,KAAK,oBAAoB;AAahC,MAAM,cAAc,GAAG,CAAC,OAA0C,EAAE,OAAgB,EAAE,cAAuB,EAAmC,EAAE;IAChJ,IAAI,aAAa,GAA6B,OAAO,CAAC,CAAC,CAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5G,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,OAAO,GAAiB,UAAqD,MAAe;QAChG,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,GAA0B,CAAC;YAChF,MAAM,QAAQ,GAAG,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACpG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,KAAK,GACP,OAAO;QACL,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;YAChB,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,cAAc,IAAI,cAAc,OAAO,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAChI,CAAC,EAAE,OAAO,CAAC;QACX,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;QACnC,KAAK,GAAG,IAAI,CAAC;QACb,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC7B,MAAM,CAAC,WAAW;gBAChB,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBAC/B,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF,aAAa,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"composeSignals.js","sourceRoot":"","sources":["../../../src/lib/helpers/composeSignals.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,mCAAmC;AACvD,OAAO,WAAW,+BAA+B;AACjD,OAAO,KAAK,oBAAoB;AAahC,MAAM,cAAc,GAAG,CAAC,OAA0C,EAAE,OAAgB,EAAE,cAAuB,EAAmC,EAAE;IAChJ,IAAI,aAAa,GAA6B,OAAO,CAAC,CAAC,CAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5G,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,OAAO,GAAiB,UAAqD,MAAe;QAChG,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,GAA0B,CAAC;YAChF,MAAM,QAAQ,GAAG,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACpG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,KAAK,GACP,OAAO;QACL,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;YAChB,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,cAAc,IAAI,cAAc,OAAO,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAChI,CAAC,EAAE,OAAO,CAAC;QACX,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;QACnC,KAAK,GAAG,IAAI,CAAC;QACb,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC7B,MAAM,CAAC,WAAW;gBAChB,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBAC/B,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF,2EAA2E;IAC3E,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,MAAgC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM;QACR,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;IAE7B,MAA8B,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE5E,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import type FaxiosError from "../core/FaxiosError.js";
|
|
1
2
|
/**
|
|
2
|
-
* Determines whether the payload is an error thrown by Faxios
|
|
3
|
+
* Determines whether the payload is an error thrown by Faxios.
|
|
4
|
+
*
|
|
5
|
+
* Checks the `isFaxiosError` brand, not `instanceof`, so errors from another
|
|
6
|
+
* copy of faxios still match. `T` and `D` type `response.data` and
|
|
7
|
+
* `config.data`; they are not checked at runtime.
|
|
3
8
|
*
|
|
4
9
|
* @param {*} payload The value to test
|
|
5
10
|
*
|
|
6
11
|
* @returns {boolean} True if the payload is an error thrown by Faxios, otherwise false
|
|
7
12
|
*/
|
|
8
|
-
export default function isFaxiosError(payload: unknown):
|
|
13
|
+
export default function isFaxiosError<T = unknown, D = unknown>(payload: unknown): payload is FaxiosError<T, D>;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import utils from "../utils.js";
|
|
3
3
|
/**
|
|
4
|
-
* Determines whether the payload is an error thrown by Faxios
|
|
4
|
+
* Determines whether the payload is an error thrown by Faxios.
|
|
5
|
+
*
|
|
6
|
+
* Checks the `isFaxiosError` brand, not `instanceof`, so errors from another
|
|
7
|
+
* copy of faxios still match. `T` and `D` type `response.data` and
|
|
8
|
+
* `config.data`; they are not checked at runtime.
|
|
5
9
|
*
|
|
6
10
|
* @param {*} payload The value to test
|
|
7
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isFaxiosError.js","sourceRoot":"","sources":["../../../src/lib/helpers/isFaxiosError.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"isFaxiosError.js","sourceRoot":"","sources":["../../../src/lib/helpers/isFaxiosError.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,KAAK,oBAAoB;AAEhC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAA2B,OAAgB;IAC9E,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAK,OAAmC,CAAC,aAAa,KAAK,IAAI,CAAC;AAChG,CAAC"}
|
package/dist/lib/platform.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ declare const _default: {
|
|
|
6
6
|
new (init?: string[][] | Record<string, string> | string | URLSearchParams): URLSearchParams;
|
|
7
7
|
prototype: URLSearchParams;
|
|
8
8
|
} | typeof FaxiosURLSearchParams;
|
|
9
|
-
FormData: (new (
|
|
9
|
+
FormData: (new () => object) | null;
|
|
10
10
|
Blob: (new (...args: Array<unknown>) => object) | null;
|
|
11
11
|
};
|
|
12
12
|
protocols: string[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const RETRY_ATTEMPT: unique symbol;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// Shared only by the built-in plugins; not exported from any entry point. retry writes the number
|
|
2
|
+
// of the try it is about to make under this key of ctx.state, and timing reads it.
|
|
3
|
+
export const RETRY_ATTEMPT = Symbol("faxios.retry.attempt");
|
|
4
|
+
//# sourceMappingURL=attempt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt.js","sourceRoot":"","sources":["../../../src/lib/plugins/attempt.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,mFAAmF;AACnF,MAAM,CAAC,MAAM,aAAa,GAAkB,MAAM,CAAC,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FaxiosPlugin } from "../types.js";
|
|
2
|
+
/** What `authBearer` provides to plugins installed after it. */
|
|
3
|
+
export type AuthBearerCapability = {
|
|
4
|
+
auth: {
|
|
5
|
+
getToken: () => Promise<string>;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
export type AuthBearerOptions = {
|
|
9
|
+
/** Replace a header the request already has. Default `false`: an explicit header is kept. */
|
|
10
|
+
overwrite?: boolean;
|
|
11
|
+
/** Put before the token, separated by a space. Default `"Bearer"`; `""` sends the bare token. */
|
|
12
|
+
scheme?: string;
|
|
13
|
+
/** The header to set. Default `"Authorization"`. */
|
|
14
|
+
header?: string;
|
|
15
|
+
/**
|
|
16
|
+
* The origins (`"https://api.example.com"`) that get the token, replacing the default rule:
|
|
17
|
+
* with an absolute `baseURL`, only its origin; otherwise only relative request URLs.
|
|
18
|
+
*/
|
|
19
|
+
origins?: Array<string>;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Sets `Authorization: Bearer <token>` on requests to the API it guards, asking `getToken` each
|
|
23
|
+
* time, and provides the `auth` capability so later plugins (for example a token-refresh plugin)
|
|
24
|
+
* can ask for a token too. A header the request already has is kept unless `overwrite` is set.
|
|
25
|
+
* The token goes only to the `baseURL` origin when `baseURL` is absolute, otherwise only to
|
|
26
|
+
* relative request URLs; `origins` replaces that rule.
|
|
27
|
+
*/
|
|
28
|
+
export declare function authBearer(getToken: () => string | Promise<string>, options?: AuthBearerOptions): FaxiosPlugin<{
|
|
29
|
+
provides: AuthBearerCapability;
|
|
30
|
+
}>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// @ts-self-types="./authBearer.d.ts" — required for Deno: maps built .js to adjacent .d.ts in dist/
|
|
2
|
+
import buildFullPath from "../core/buildFullPath.js";
|
|
3
|
+
import FaxiosError from "../core/FaxiosError.js";
|
|
4
|
+
import FaxiosHeaders from "../core/FaxiosHeaders.js";
|
|
5
|
+
import isAbsoluteURL from "../helpers/isAbsoluteURL.js";
|
|
6
|
+
import validator from "../helpers/validator.js";
|
|
7
|
+
import utils from "../utils.js";
|
|
8
|
+
import { definePlugin } from "./definePlugin.js";
|
|
9
|
+
// A header name is a token (RFC 9110 §5.6.2).
|
|
10
|
+
const TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
11
|
+
// A bare origin, optionally with a trailing slash. A path would look like a narrower limit than
|
|
12
|
+
// the origin the token is really sent to.
|
|
13
|
+
function originOf(value) {
|
|
14
|
+
if (typeof value !== "string")
|
|
15
|
+
return null;
|
|
16
|
+
try {
|
|
17
|
+
const { origin } = new URL(value);
|
|
18
|
+
return origin !== "null" && (value === origin || value === `${origin}/`) ? origin : null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const optionsSchema = {
|
|
25
|
+
overwrite: validator.validators["boolean"],
|
|
26
|
+
scheme: (value) => (typeof value === "string" && !/[\r\n]/.test(value)) || "a string without line breaks",
|
|
27
|
+
header: (value) => (typeof value === "string" && TOKEN.test(value)) || "a header name",
|
|
28
|
+
origins: (value) => (Array.isArray(value) && value.every(o => originOf(o) !== null)) || "an array of origins such as \"https://api.example.com\"",
|
|
29
|
+
};
|
|
30
|
+
const own = (source, key) => (utils.hasOwnProp(source, key) ? source[key] : undefined);
|
|
31
|
+
// Resolves a relative URL the way a page would, without ever matching a real origin, so a URL
|
|
32
|
+
// that leaves the page (`//host`, `/\host`) is told apart from one that stays on it.
|
|
33
|
+
const SAME_ORIGIN = "https://same-origin.invalid";
|
|
34
|
+
function resolvedOrigin(url, base) {
|
|
35
|
+
try {
|
|
36
|
+
return new URL(url, base).origin;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// A relative URL goes to the page's origin, which only a browser has.
|
|
43
|
+
function pageHref() {
|
|
44
|
+
const location = "location" in globalThis ? globalThis.location : undefined;
|
|
45
|
+
if (location && typeof location === "object" && "href" in location && typeof location.href === "string")
|
|
46
|
+
return location.href;
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
function sendsTokenTo(config, origins) {
|
|
50
|
+
const baseURL = own(config, "baseURL");
|
|
51
|
+
const url = buildFullPath(baseURL, own(config, "url"), own(config, "allowAbsoluteUrls"), config);
|
|
52
|
+
if (origins) {
|
|
53
|
+
const origin = resolvedOrigin(url, isAbsoluteURL(url) ? undefined : pageHref());
|
|
54
|
+
return origin !== null && origins.includes(origin);
|
|
55
|
+
}
|
|
56
|
+
if (typeof baseURL === "string" && isAbsoluteURL(baseURL)) {
|
|
57
|
+
return resolvedOrigin(url, baseURL) === resolvedOrigin(baseURL, undefined);
|
|
58
|
+
}
|
|
59
|
+
return !isAbsoluteURL(url) && resolvedOrigin(url, SAME_ORIGIN) === SAME_ORIGIN;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Sets `Authorization: Bearer <token>` on requests to the API it guards, asking `getToken` each
|
|
63
|
+
* time, and provides the `auth` capability so later plugins (for example a token-refresh plugin)
|
|
64
|
+
* can ask for a token too. A header the request already has is kept unless `overwrite` is set.
|
|
65
|
+
* The token goes only to the `baseURL` origin when `baseURL` is absolute, otherwise only to
|
|
66
|
+
* relative request URLs; `origins` replaces that rule.
|
|
67
|
+
*/
|
|
68
|
+
export function authBearer(getToken, options = {}) {
|
|
69
|
+
if (typeof getToken !== "function") {
|
|
70
|
+
throw new FaxiosError("authBearer: getToken must be a function", FaxiosError.ERR_BAD_OPTION_VALUE);
|
|
71
|
+
}
|
|
72
|
+
// Callers without TypeScript can pass anything.
|
|
73
|
+
const given = options;
|
|
74
|
+
if (given === null || typeof given !== "object") {
|
|
75
|
+
throw new FaxiosError("authBearer options must be an object", FaxiosError.ERR_BAD_OPTION_VALUE);
|
|
76
|
+
}
|
|
77
|
+
validator.assertOptions(options, optionsSchema, false);
|
|
78
|
+
const overwrite = own(options, "overwrite") ?? false;
|
|
79
|
+
const scheme = own(options, "scheme") ?? "Bearer";
|
|
80
|
+
const header = own(options, "header") ?? "Authorization";
|
|
81
|
+
const origins = own(options, "origins")?.map(o => originOf(o)) ?? null;
|
|
82
|
+
const auth = { getToken: async () => getToken() };
|
|
83
|
+
return definePlugin({
|
|
84
|
+
name: "authBearer",
|
|
85
|
+
provides: { auth },
|
|
86
|
+
middleware: async (ctx, next) => {
|
|
87
|
+
if ((!overwrite && ctx.config.headers.has(header)) || !sendsTokenTo(ctx.config, origins))
|
|
88
|
+
return next(ctx);
|
|
89
|
+
const token = await auth.getToken();
|
|
90
|
+
// On a copy: middleware that calls next() again (retry installed before this plugin) comes
|
|
91
|
+
// back through here without the header, so every try asks for a fresh token.
|
|
92
|
+
const headers = new FaxiosHeaders(ctx.config.headers).set(header, scheme ? `${scheme} ${token}` : token, true);
|
|
93
|
+
const config = { ...ctx.config };
|
|
94
|
+
config.headers = headers;
|
|
95
|
+
return next({ ...ctx, config });
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=authBearer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authBearer.js","sourceRoot":"","sources":["../../../src/lib/plugins/authBearer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FaxiosMiddleware, FaxiosPlugin } from "../types.js";
|
|
2
|
+
type Slot<T> = [keyof T] extends [never] ? unknown : T;
|
|
3
|
+
type RequiredCapabilities<TCapabilities, TProvides> = [keyof TProvides] extends [never] ? Slot<TCapabilities> : Slot<{
|
|
4
|
+
[K in keyof TCapabilities as K extends keyof TProvides ? never : K]: TCapabilities[K];
|
|
5
|
+
}>;
|
|
6
|
+
/**
|
|
7
|
+
* Builds a plugin for `use()` and infers its `FaxiosPlugin` slots from the object: `provides` from
|
|
8
|
+
* the `provides` value, `options` and `requires` from the context type the middleware annotates
|
|
9
|
+
* (`ctx: FaxiosContext<Options, Capabilities>`). Capabilities the plugin provides itself don't
|
|
10
|
+
* count as required. Returns the same object.
|
|
11
|
+
*/
|
|
12
|
+
export declare function definePlugin<TProvides = {}, TOptions = {}, TCapabilities = TProvides>(plugin: {
|
|
13
|
+
name: string;
|
|
14
|
+
provides?: TProvides & NoInfer<Pick<TCapabilities, keyof TProvides & keyof TCapabilities>>;
|
|
15
|
+
middleware: FaxiosMiddleware<TOptions, TCapabilities>;
|
|
16
|
+
}): FaxiosPlugin<{
|
|
17
|
+
requires: RequiredCapabilities<TCapabilities, TProvides>;
|
|
18
|
+
provides: Slot<TProvides>;
|
|
19
|
+
options: Slot<TOptions>;
|
|
20
|
+
}>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// @ts-self-types="./definePlugin.d.ts" — required for Deno: maps built .js to adjacent .d.ts in dist/
|
|
2
|
+
// The `@gcmdev/faxios/plugins` entry point. The built-in plugins have their own subpaths.
|
|
3
|
+
/**
|
|
4
|
+
* Builds a plugin for `use()` and infers its `FaxiosPlugin` slots from the object: `provides` from
|
|
5
|
+
* the `provides` value, `options` and `requires` from the context type the middleware annotates
|
|
6
|
+
* (`ctx: FaxiosContext<Options, Capabilities>`). Capabilities the plugin provides itself don't
|
|
7
|
+
* count as required. Returns the same object.
|
|
8
|
+
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- `{}`: no capabilities or options, as in FaxiosContext
|
|
10
|
+
export function definePlugin(plugin) {
|
|
11
|
+
// Only the types change: use() reads the fields at install time, as it does for any plugin.
|
|
12
|
+
return plugin;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=definePlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definePlugin.js","sourceRoot":"","sources":["../../../src/lib/plugins/definePlugin.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,0FAA0F;AAY1F;;;;;GAKG;AACH,4HAA4H;AAC5H,MAAM,UAAU,YAAY,CAA2D,MAMtF;IAKC,4FAA4F;IAC5F,OAAO,MAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { FaxiosPlugin, Method } from "../types.js";
|
|
2
|
+
export type RetryOptions = {
|
|
3
|
+
/** Total tries, counting the first request. Default 3. */
|
|
4
|
+
attempts?: number;
|
|
5
|
+
/**
|
|
6
|
+
* Whether the try that just failed should be retried. `attempt` counts from 1.
|
|
7
|
+
* Default: network errors, timeouts and the `statuses`; never a cancellation. A custom `retryOn`
|
|
8
|
+
* replaces that whole predicate, so `statuses` is ignored when both are set. retryOn decides
|
|
9
|
+
* only within `methods`; to retry POST, list it in `methods`.
|
|
10
|
+
*/
|
|
11
|
+
retryOn?: (error: unknown, attempt: number) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Response statuses the default predicate retries. Default 408, 429, 500, 502, 503 and 504.
|
|
14
|
+
* Ignored when `retryOn` is set.
|
|
15
|
+
*/
|
|
16
|
+
statuses?: ReadonlyArray<number>;
|
|
17
|
+
/**
|
|
18
|
+
* Milliseconds to wait before the next try, or a function of the try that failed. Default 100ms,
|
|
19
|
+
* doubling. Capped at `maxDelay`, then jittered. A 429 or 503 with a `Retry-After` header waits
|
|
20
|
+
* that long instead, unless `respectRetryAfter` is `false`.
|
|
21
|
+
*/
|
|
22
|
+
delay?: number | ((attempt: number, error: unknown) => number);
|
|
23
|
+
/** The most the computed backoff waits, in milliseconds. Default 30 000. Doesn't apply to `Retry-After`. */
|
|
24
|
+
maxDelay?: number;
|
|
25
|
+
/**
|
|
26
|
+
* `"full"` (default) waits a random time between 0 and the capped backoff, so clients that failed
|
|
27
|
+
* together don't retry together; `"none"` waits the capped backoff. Doesn't apply to `Retry-After`.
|
|
28
|
+
*/
|
|
29
|
+
jitter?: "full" | "none";
|
|
30
|
+
/**
|
|
31
|
+
* The longest `Retry-After` (seconds or an HTTP date, on a 429 or 503) to wait, in milliseconds.
|
|
32
|
+
* Default 300 000 (5 minutes). A longer one rejects with the response's error instead of retrying.
|
|
33
|
+
* Ignored when `respectRetryAfter` is `false`.
|
|
34
|
+
*/
|
|
35
|
+
maxRetryAfter?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Whether a 429 or 503's `Retry-After` header sets the wait. Default `true`. With `false`, every
|
|
38
|
+
* retry waits the computed backoff and `maxRetryAfter` doesn't apply; which requests retry doesn't
|
|
39
|
+
* change. Turn it off when another plugin, such as a queue throttle, honours `Retry-After` itself.
|
|
40
|
+
*/
|
|
41
|
+
respectRetryAfter?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Called before each wait with the error, the try that failed and the wait in milliseconds. If it
|
|
44
|
+
* throws, the request rejects with that error and stops retrying.
|
|
45
|
+
*/
|
|
46
|
+
onRetry?: (error: unknown, attempt: number, delayMs: number) => void;
|
|
47
|
+
/**
|
|
48
|
+
* HTTP methods that may be retried, in any case. Default: GET, HEAD, OPTIONS, PUT, DELETE and
|
|
49
|
+
* QUERY. POST and PATCH aren't idempotent, so add them only if your API dedupes repeats. A request
|
|
50
|
+
* whose method isn't listed is never retried, whatever `retryOn` or `statuses` say.
|
|
51
|
+
*/
|
|
52
|
+
methods?: ReadonlyArray<Method>;
|
|
53
|
+
};
|
|
54
|
+
/** Per-request override: `false` turns retries off, an object overrides the plugin's options. */
|
|
55
|
+
export type RetryRequestOptions = {
|
|
56
|
+
retry?: RetryOptions | false;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Retries failed requests by calling `next` again. Each `next` dispatches its own copy of the
|
|
60
|
+
* config, so every try starts from the same input. Install it inside middleware that should run
|
|
61
|
+
* once per request (for example `timing` installed first measures all tries together).
|
|
62
|
+
*/
|
|
63
|
+
export declare function retry(options?: RetryOptions): FaxiosPlugin<{
|
|
64
|
+
options: RetryRequestOptions;
|
|
65
|
+
}>;
|