@pureq/pureq 1.0.0 → 1.1.1
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 +142 -13
- package/dist/src/adapters/storage/encryptedStorage.d.ts +16 -0
- package/dist/src/adapters/storage/encryptedStorage.d.ts.map +1 -0
- package/dist/src/adapters/storage/encryptedStorage.js +77 -0
- package/dist/src/adapters/storage/encryptedStorage.js.map +1 -0
- package/dist/src/adapters/storage/indexedDBAdapter.d.ts +16 -0
- package/dist/src/adapters/storage/indexedDBAdapter.d.ts.map +1 -0
- package/dist/src/adapters/storage/indexedDBAdapter.js +75 -0
- package/dist/src/adapters/storage/indexedDBAdapter.js.map +1 -0
- package/dist/src/client/createClient.d.ts.map +1 -1
- package/dist/src/client/createClient.js +15 -14
- package/dist/src/client/createClient.js.map +1 -1
- package/dist/src/executor/execute.d.ts.map +1 -1
- package/dist/src/executor/execute.js +108 -27
- package/dist/src/executor/execute.js.map +1 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/authRefresh.d.ts +26 -0
- package/dist/src/middleware/authRefresh.d.ts.map +1 -0
- package/dist/src/middleware/authRefresh.js +53 -0
- package/dist/src/middleware/authRefresh.js.map +1 -0
- package/dist/src/middleware/circuitBreaker.d.ts +19 -2
- package/dist/src/middleware/circuitBreaker.d.ts.map +1 -1
- package/dist/src/middleware/circuitBreaker.js +64 -26
- package/dist/src/middleware/circuitBreaker.js.map +1 -1
- package/dist/src/middleware/compose.d.ts.map +1 -1
- package/dist/src/middleware/compose.js +2 -1
- package/dist/src/middleware/compose.js.map +1 -1
- package/dist/src/middleware/diagnostics.d.ts.map +1 -1
- package/dist/src/middleware/diagnostics.js +1 -4
- package/dist/src/middleware/diagnostics.js.map +1 -1
- package/dist/src/middleware/fallback.d.ts +27 -0
- package/dist/src/middleware/fallback.d.ts.map +1 -0
- package/dist/src/middleware/fallback.js +42 -0
- package/dist/src/middleware/fallback.js.map +1 -0
- package/dist/src/middleware/hedge.js +3 -3
- package/dist/src/middleware/hedge.js.map +1 -1
- package/dist/src/middleware/offlineQueue.d.ts +9 -0
- package/dist/src/middleware/offlineQueue.d.ts.map +1 -1
- package/dist/src/middleware/offlineQueue.js +62 -23
- package/dist/src/middleware/offlineQueue.js.map +1 -1
- package/dist/src/middleware/retry.d.ts +17 -1
- package/dist/src/middleware/retry.d.ts.map +1 -1
- package/dist/src/middleware/retry.js +39 -14
- package/dist/src/middleware/retry.js.map +1 -1
- package/dist/src/middleware/validation.d.ts +24 -0
- package/dist/src/middleware/validation.d.ts.map +1 -0
- package/dist/src/middleware/validation.js +52 -0
- package/dist/src/middleware/validation.js.map +1 -0
- package/dist/src/node/fsAdapter.d.ts +16 -0
- package/dist/src/node/fsAdapter.d.ts.map +1 -0
- package/dist/src/node/fsAdapter.js +72 -0
- package/dist/src/node/fsAdapter.js.map +1 -0
- package/dist/src/node/index.d.ts +6 -0
- package/dist/src/node/index.d.ts.map +1 -0
- package/dist/src/node/index.js +6 -0
- package/dist/src/node/index.js.map +1 -0
- package/dist/src/policy/guardrails.d.ts +1 -1
- package/dist/src/policy/guardrails.d.ts.map +1 -1
- package/dist/src/types/http.d.ts +8 -0
- package/dist/src/types/http.d.ts.map +1 -1
- package/dist/src/types/internal.d.ts +5 -5
- package/dist/src/types/internal.d.ts.map +1 -1
- package/dist/src/types/internal.js +4 -1
- package/dist/src/types/internal.js.map +1 -1
- package/dist/src/types/result.d.ts +3 -1
- package/dist/src/types/result.d.ts.map +1 -1
- package/dist/src/types/result.js +27 -6
- package/dist/src/types/result.js.map +1 -1
- package/dist/src/utils/crypto.d.ts +9 -0
- package/dist/src/utils/crypto.d.ts.map +1 -1
- package/dist/src/utils/crypto.js +44 -0
- package/dist/src/utils/crypto.js.map +1 -1
- package/dist/src/utils/policyTrace.d.ts +7 -9
- package/dist/src/utils/policyTrace.d.ts.map +1 -1
- package/dist/src/utils/policyTrace.js +31 -12
- package/dist/src/utils/policyTrace.js.map +1 -1
- package/dist/tests/circuit-breaker.test.js +6 -6
- package/dist/tests/circuit-breaker.test.js.map +1 -1
- package/dist/tests/compose.test.js +2 -1
- package/dist/tests/compose.test.js.map +1 -1
- package/package.json +8 -2
- package/dist/tests/client.integration.d.ts +0 -2
- package/dist/tests/client.integration.d.ts.map +0 -1
- package/dist/tests/client.integration.js +0 -44
- package/dist/tests/client.integration.js.map +0 -1
- package/dist/tests/public-api.contract.d.ts +0 -2
- package/dist/tests/public-api.contract.d.ts.map +0 -1
- package/dist/tests/public-api.contract.js +0 -14
- package/dist/tests/public-api.contract.js.map +0 -1
- package/dist/tests/retry.stress.d.ts +0 -2
- package/dist/tests/retry.stress.d.ts.map +0 -1
- package/dist/tests/retry.stress.js +0 -21
- package/dist/tests/retry.stress.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/middleware/compose.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/middleware/compose.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,OAAO,CACrB,WAAkC,EAClC,WAAkE,OAAO;IAEzE,OAAO,UAAU,GAA0B;QACzC,SAAS,QAAQ,CAAC,CAAS,EAAE,aAAoC;YAC/D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAElC,8CAA8C;YAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,QAAQ,CAAC,aAAa,CAAC,CAAC;YACjC,CAAC;YAED,wEAAwE;YACxE,mEAAmE;YACnE,gEAAgE;YAChE,4EAA4E;YAC5E,IAAI,YAAY,GAAG,KAAK,CAAC;YAEzB,IAAI,CAAC;gBACH,OAAO,UAAU,CAAC,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;oBACpD,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;oBACpF,CAAC;oBAED,YAAY,GAAG,IAAI,CAAC;oBACpB,MAAM,OAAO,GAA0B;wBACrC,GAAG,aAAa;wBAChB,GAAG,UAAU;wBACb,CAAC,oBAAoB,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC;qBAC5D,CAAC;oBAEF,IAAI,CAAC;wBACH,OAAO,MAAM,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;oBACxC,CAAC;4BAAS,CAAC;wBACT,YAAY,GAAG,KAAK,CAAC;oBACvB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/middleware/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG;IAC7C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,mBAAmB,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CACrD;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/middleware/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG;IAC7C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,SAAS,eAAe,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,mBAAmB,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CACrD;AAyBD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kBAAuB,GAAG,qBAAqB,CA2GnG"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { toPureqError } from "../types/result";
|
|
2
2
|
function getMetaValue(req, key) {
|
|
3
|
-
|
|
4
|
-
return undefined;
|
|
5
|
-
}
|
|
6
|
-
const meta = req._meta;
|
|
3
|
+
const meta = req.meta;
|
|
7
4
|
if (!meta) {
|
|
8
5
|
return undefined;
|
|
9
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/middleware/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA4B/C,SAAS,YAAY,CAAC,GAAkB,EAAE,GAAW;IACnD,
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/middleware/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Middleware, RequestConfig } from "../types/http";
|
|
2
|
+
import type { HttpResponse } from "../response/response";
|
|
3
|
+
export type FallbackTrigger = {
|
|
4
|
+
readonly type: "error";
|
|
5
|
+
readonly error: unknown;
|
|
6
|
+
} | {
|
|
7
|
+
readonly type: "response";
|
|
8
|
+
readonly response: HttpResponse;
|
|
9
|
+
};
|
|
10
|
+
export interface FallbackOptions {
|
|
11
|
+
/**
|
|
12
|
+
* The fallback value to return when an error occurs.
|
|
13
|
+
* Can be a static HttpResponse or a function that returns one.
|
|
14
|
+
*/
|
|
15
|
+
readonly value: HttpResponse | ((trigger: FallbackTrigger, req: RequestConfig) => HttpResponse | Promise<HttpResponse>);
|
|
16
|
+
/**
|
|
17
|
+
* Filters fallback activation for both error and non-OK response cases.
|
|
18
|
+
* Receives a FallbackTrigger and RequestConfig; return true to invoke fallback.
|
|
19
|
+
*/
|
|
20
|
+
readonly when?: (trigger: FallbackTrigger, req: RequestConfig) => boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* pureq fallback middleware.
|
|
24
|
+
* Implements graceful degradation by returning a default value or cached data on failure.
|
|
25
|
+
*/
|
|
26
|
+
export declare function fallback(options: FallbackOptions): Middleware;
|
|
27
|
+
//# sourceMappingURL=fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../../src/middleware/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIzD,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IACxH;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;CAC3E;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CA4C7D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { markPolicyMiddleware } from "../policy/guardrails";
|
|
2
|
+
import { appendPolicyTrace } from "../utils/policyTrace";
|
|
3
|
+
/**
|
|
4
|
+
* pureq fallback middleware.
|
|
5
|
+
* Implements graceful degradation by returning a default value or cached data on failure.
|
|
6
|
+
*/
|
|
7
|
+
export function fallback(options) {
|
|
8
|
+
const middleware = async (req, next) => {
|
|
9
|
+
try {
|
|
10
|
+
const response = await next(req);
|
|
11
|
+
const trigger = { type: "response", response };
|
|
12
|
+
// We can also trigger fallback for specific status codes (optional)
|
|
13
|
+
if (!response.ok && options.when?.(trigger, req)) {
|
|
14
|
+
return resolveFallback(options.value, trigger, req, "status");
|
|
15
|
+
}
|
|
16
|
+
return response;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
const trigger = { type: "error", error };
|
|
20
|
+
if (!options.when || options.when(trigger, req)) {
|
|
21
|
+
return resolveFallback(options.value, trigger, req, "error");
|
|
22
|
+
}
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
async function resolveFallback(value, trigger, req, source) {
|
|
27
|
+
const finalResponse = typeof value === "function" ? await value(trigger, req) : value;
|
|
28
|
+
appendPolicyTrace(req, {
|
|
29
|
+
policy: "fallback",
|
|
30
|
+
decision: "fallback",
|
|
31
|
+
at: Date.now(),
|
|
32
|
+
reason: source === "error" ? "request failed" : "unsuccessful status",
|
|
33
|
+
source,
|
|
34
|
+
});
|
|
35
|
+
return finalResponse;
|
|
36
|
+
}
|
|
37
|
+
return markPolicyMiddleware(middleware, {
|
|
38
|
+
name: "fallback",
|
|
39
|
+
kind: "fallback",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../../src/middleware/fallback.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAmBzD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAwB;IAC/C,MAAM,UAAU,GAAe,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,OAAO,GAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YAEhE,oEAAoE;YACpE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;gBACjD,OAAO,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YAChE,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAoB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC1D,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;gBAChD,OAAO,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,UAAU,eAAe,CAC5B,KAA+B,EAC/B,OAAwB,EACxB,GAAkB,EAClB,MAA0B;QAE1B,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEtF,iBAAiB,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,UAAU;YACpB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB;YACrE,MAAM;SACP,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,oBAAoB,CAAC,UAAU,EAAE;QACtC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;KACjB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -44,13 +44,13 @@ export function hedge(options) {
|
|
|
44
44
|
}
|
|
45
45
|
const key = keyBuilder(req);
|
|
46
46
|
const startedAt = Date.now();
|
|
47
|
-
// Each fork gets its own deep-copied
|
|
47
|
+
// Each fork gets its own deep-copied meta to prevent
|
|
48
48
|
// cross-fork trace pollution (race condition prevention).
|
|
49
49
|
const primaryFork = forkSignal(req.signal);
|
|
50
50
|
const primaryReq = {
|
|
51
51
|
...req,
|
|
52
52
|
signal: primaryFork.signal,
|
|
53
|
-
|
|
53
|
+
meta: deepCopyMeta(req),
|
|
54
54
|
};
|
|
55
55
|
const primaryPromise = next(primaryReq);
|
|
56
56
|
// Track how many promises are actually in flight for the rejection threshold.
|
|
@@ -67,7 +67,7 @@ export function hedge(options) {
|
|
|
67
67
|
const hedgedReq = {
|
|
68
68
|
...req,
|
|
69
69
|
signal: hedgeFork.signal,
|
|
70
|
-
|
|
70
|
+
meta: deepCopyMeta(req),
|
|
71
71
|
};
|
|
72
72
|
appendPolicyTrace(hedgedReq, {
|
|
73
73
|
policy: "hedge",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hedge.js","sourceRoot":"","sources":["../../../src/middleware/hedge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AASvE;;;GAGG;AACH,SAAS,UAAU,CAAC,MAA+B;IACjD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAEpG,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,OAAqB;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;IAE1D,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,
|
|
1
|
+
{"version":3,"file":"hedge.js","sourceRoot":"","sources":["../../../src/middleware/hedge.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,14 +26,21 @@ export interface OfflineQueueOptions {
|
|
|
26
26
|
readonly methods?: readonly RequestConfig["method"][];
|
|
27
27
|
readonly isOffline?: () => boolean;
|
|
28
28
|
readonly maxQueueSize?: number;
|
|
29
|
+
readonly ttlMs?: number;
|
|
29
30
|
readonly hooks?: OfflineQueueHooks;
|
|
30
31
|
readonly storage?: OfflineQueueStorageAdapter;
|
|
31
32
|
readonly generateId?: () => number | Promise<number>;
|
|
33
|
+
/**
|
|
34
|
+
* Optional lock name for cross-tab coordination (Web Locks API).
|
|
35
|
+
* If provided, only one tab will be able to flush the queue at a time.
|
|
36
|
+
*/
|
|
37
|
+
readonly lockName?: string;
|
|
32
38
|
}
|
|
33
39
|
export interface QueuedRequest {
|
|
34
40
|
readonly id: number;
|
|
35
41
|
readonly req: RequestConfig;
|
|
36
42
|
readonly queuedAt: number;
|
|
43
|
+
readonly expiresAt?: number;
|
|
37
44
|
}
|
|
38
45
|
export interface OfflineQueueStorageAdapter {
|
|
39
46
|
readonly push: (item: QueuedRequest) => Promise<void> | void;
|
|
@@ -57,6 +64,8 @@ export interface OfflineQueueSnapshot {
|
|
|
57
64
|
readonly method: RequestConfig["method"];
|
|
58
65
|
readonly url: string;
|
|
59
66
|
readonly queuedAt: number;
|
|
67
|
+
readonly expiresAt?: number;
|
|
68
|
+
readonly priority: number;
|
|
60
69
|
}[];
|
|
61
70
|
}
|
|
62
71
|
export interface OfflineQueueController {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offlineQueue.d.ts","sourceRoot":"","sources":["../../../src/middleware/offlineQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;KACzB,KAAK,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,0BAA0B,CAAC;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"offlineQueue.d.ts","sourceRoot":"","sources":["../../../src/middleware/offlineQueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,11 +21,8 @@ export class InMemoryQueueStorageAdapter {
|
|
|
21
21
|
return this.queue.length;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
// appendPolicyTrace is imported from ../utils/policyTrace
|
|
25
24
|
/**
|
|
26
25
|
* Creates a serializable copy of the request suitable for offline storage.
|
|
27
|
-
* Deliberately excludes AbortSignal since it is not serializable and
|
|
28
|
-
* would reference a stale controller upon replay.
|
|
29
26
|
*/
|
|
30
27
|
function cloneRequestForQueue(req) {
|
|
31
28
|
return {
|
|
@@ -36,6 +33,8 @@ function cloneRequestForQueue(req) {
|
|
|
36
33
|
...(req.body !== undefined ? { body: req.body } : {}),
|
|
37
34
|
...(req.headers !== undefined ? { headers: { ...req.headers } } : {}),
|
|
38
35
|
...(req.timeout !== undefined ? { timeout: req.timeout } : {}),
|
|
36
|
+
...(req.priority !== undefined ? { priority: req.priority } : {}),
|
|
37
|
+
...(req.meta !== undefined ? { meta: { ...req.meta } } : {}),
|
|
39
38
|
};
|
|
40
39
|
}
|
|
41
40
|
/**
|
|
@@ -44,6 +43,8 @@ function cloneRequestForQueue(req) {
|
|
|
44
43
|
export function createOfflineQueue(options = {}) {
|
|
45
44
|
const methods = new Set(options.methods ?? ["POST", "PUT", "PATCH", "DELETE"]);
|
|
46
45
|
const maxQueueSize = options.maxQueueSize ?? 500;
|
|
46
|
+
const ttlMs = options.ttlMs;
|
|
47
|
+
const lockName = options.lockName;
|
|
47
48
|
const isOffline = options.isOffline ?? (() => {
|
|
48
49
|
if (typeof navigator === "undefined") {
|
|
49
50
|
return false;
|
|
@@ -60,15 +61,23 @@ export function createOfflineQueue(options = {}) {
|
|
|
60
61
|
}
|
|
61
62
|
const currentSize = await storage.size();
|
|
62
63
|
if (currentSize >= maxQueueSize) {
|
|
63
|
-
|
|
64
|
+
const error = new Error("pureq: offline queue is full");
|
|
65
|
+
error.code = "PUREQ_OFFLINE_QUEUE_FULL";
|
|
66
|
+
error.kind = "storage-error";
|
|
67
|
+
throw error;
|
|
64
68
|
}
|
|
65
69
|
const id = await generateId();
|
|
66
70
|
const queuedAt = Date.now();
|
|
67
|
-
|
|
71
|
+
const expiresAt = ttlMs !== undefined ? queuedAt + ttlMs : undefined;
|
|
72
|
+
const item = {
|
|
68
73
|
id,
|
|
69
74
|
req: cloneRequestForQueue(req),
|
|
70
75
|
queuedAt,
|
|
71
|
-
}
|
|
76
|
+
};
|
|
77
|
+
if (expiresAt !== undefined) {
|
|
78
|
+
item.expiresAt = expiresAt;
|
|
79
|
+
}
|
|
80
|
+
await storage.push(item);
|
|
72
81
|
appendPolicyTrace(req, {
|
|
73
82
|
policy: "offline-queue",
|
|
74
83
|
decision: "queued",
|
|
@@ -77,25 +86,40 @@ export function createOfflineQueue(options = {}) {
|
|
|
77
86
|
key: `${req.method}:${req.url}`,
|
|
78
87
|
});
|
|
79
88
|
hooks?.onQueued?.({ id, method: req.method, url: req.url, at: queuedAt });
|
|
80
|
-
return new PureqHttpResponse(new Response(JSON.stringify({ queued: true, queueId: id }), {
|
|
89
|
+
return new PureqHttpResponse(new Response(JSON.stringify({ queued: true, queueId: id, expiresAt }), {
|
|
81
90
|
status: 202,
|
|
82
91
|
headers: { "content-type": "application/json" },
|
|
83
92
|
}));
|
|
84
93
|
};
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
const
|
|
94
|
+
const performFlush = async (replay, flushOptions) => {
|
|
95
|
+
const rawPending = await storage.getAll();
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
// 1. Filter out expired requests
|
|
98
|
+
const expiredIds = [];
|
|
99
|
+
const pendingWithTtl = rawPending.filter((item) => {
|
|
100
|
+
if (item.expiresAt !== undefined && item.expiresAt < now) {
|
|
101
|
+
expiredIds.push(item.id);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
});
|
|
106
|
+
await Promise.all(expiredIds.map((id) => storage.remove(id)));
|
|
107
|
+
// 2. Sort by priority (descending) and then by queuedAt (ascending)
|
|
108
|
+
const pending = [...pendingWithTtl].sort((a, b) => {
|
|
109
|
+
const priorityA = a.req.priority ?? 0;
|
|
110
|
+
const priorityB = b.req.priority ?? 0;
|
|
111
|
+
if (priorityA !== priorityB) {
|
|
112
|
+
return priorityB - priorityA;
|
|
113
|
+
}
|
|
114
|
+
return a.queuedAt - b.queuedAt;
|
|
115
|
+
});
|
|
116
|
+
const concurrency = flushOptions?.concurrency ?? 1;
|
|
88
117
|
const responses = [];
|
|
89
118
|
if (concurrency <= 1) {
|
|
90
|
-
// Sequential replay (default, safest for ordering guarantees)
|
|
91
119
|
for (const item of pending) {
|
|
92
120
|
try {
|
|
93
121
|
const response = await replay(item.req);
|
|
94
122
|
responses.push(response);
|
|
95
|
-
// Remove from queue only after successful replay.
|
|
96
|
-
// NOTE: If the app crashes between successful replay and this removal,
|
|
97
|
-
// the request might be replayed again upon restart. It is strongly recommended
|
|
98
|
-
// to use `idempotencyKey` middleware to prevent duplicate operations on the backend.
|
|
99
123
|
await storage.remove(item.id);
|
|
100
124
|
hooks?.onReplayed?.({
|
|
101
125
|
id: item.id,
|
|
@@ -106,7 +130,6 @@ export function createOfflineQueue(options = {}) {
|
|
|
106
130
|
});
|
|
107
131
|
}
|
|
108
132
|
catch (error) {
|
|
109
|
-
// Leave in storage on failure (defer to next flush or retry budgets)
|
|
110
133
|
hooks?.onReplayError?.({
|
|
111
134
|
id: item.id,
|
|
112
135
|
method: item.req.method,
|
|
@@ -118,7 +141,7 @@ export function createOfflineQueue(options = {}) {
|
|
|
118
141
|
}
|
|
119
142
|
}
|
|
120
143
|
else {
|
|
121
|
-
// Concurrent replay in batches
|
|
144
|
+
// Concurrent replay in batches
|
|
122
145
|
for (let i = 0; i < pending.length; i += concurrency) {
|
|
123
146
|
const batch = pending.slice(i, i + concurrency);
|
|
124
147
|
const results = await Promise.allSettled(batch.map(async (item) => {
|
|
@@ -155,16 +178,32 @@ export function createOfflineQueue(options = {}) {
|
|
|
155
178
|
}
|
|
156
179
|
return responses;
|
|
157
180
|
};
|
|
181
|
+
const flush = async (replay, flushOptions) => {
|
|
182
|
+
// If Web Locks API is available and lockName is provided, wrap in a lock
|
|
183
|
+
if (lockName && typeof navigator !== "undefined" && navigator.locks) {
|
|
184
|
+
return navigator.locks.request(lockName, async () => {
|
|
185
|
+
return performFlush(replay, flushOptions);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return performFlush(replay, flushOptions);
|
|
189
|
+
};
|
|
158
190
|
const snapshot = async () => {
|
|
159
191
|
const items = await storage.getAll();
|
|
160
192
|
return {
|
|
161
193
|
size: items.length,
|
|
162
|
-
items: items.map((item) =>
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
194
|
+
items: items.map((item) => {
|
|
195
|
+
const result = {
|
|
196
|
+
id: item.id,
|
|
197
|
+
method: item.req.method,
|
|
198
|
+
url: item.req.url,
|
|
199
|
+
queuedAt: item.queuedAt,
|
|
200
|
+
priority: item.req.priority ?? 0,
|
|
201
|
+
};
|
|
202
|
+
if (item.expiresAt !== undefined) {
|
|
203
|
+
result.expiresAt = item.expiresAt;
|
|
204
|
+
}
|
|
205
|
+
return result;
|
|
206
|
+
}),
|
|
168
207
|
};
|
|
169
208
|
};
|
|
170
209
|
const clear = async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offlineQueue.js","sourceRoot":"","sources":["../../../src/middleware/offlineQueue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"offlineQueue.js","sourceRoot":"","sources":["../../../src/middleware/offlineQueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,27 @@
|
|
|
1
|
-
import type { Middleware } from "../types/http";
|
|
1
|
+
import type { Middleware, RequestConfig } from "../types/http";
|
|
2
2
|
export interface RetryOptions {
|
|
3
3
|
readonly maxRetries: number;
|
|
4
4
|
readonly delay?: number;
|
|
5
5
|
readonly backoff?: boolean;
|
|
6
6
|
readonly maxDelay?: number;
|
|
7
7
|
readonly retryBudgetMs?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Status codes that trigger a retry.
|
|
10
|
+
* Default: 5xx errors.
|
|
11
|
+
*/
|
|
8
12
|
readonly retryOnStatus?: readonly number[];
|
|
13
|
+
/**
|
|
14
|
+
* Whether to retry on network-level errors (DNS, connection reset, etc.)
|
|
15
|
+
*/
|
|
9
16
|
readonly retryOnNetworkError?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* HTTP methods allowed to be retried.
|
|
19
|
+
* Default: Idempotent methods ['GET', 'HEAD', 'PUT', 'DELETE', 'OPTIONS']
|
|
20
|
+
*/
|
|
21
|
+
readonly methods?: readonly RequestConfig["method"][];
|
|
10
22
|
readonly respectRetryAfter?: boolean;
|
|
11
23
|
readonly retryAfterHeaderName?: string;
|
|
24
|
+
readonly jitter?: boolean;
|
|
12
25
|
readonly onRetry?: (event: {
|
|
13
26
|
readonly attempt: number;
|
|
14
27
|
readonly waitTime: number;
|
|
@@ -22,6 +35,9 @@ export interface RetryOptions {
|
|
|
22
35
|
/**
|
|
23
36
|
* pureq Retry Middleware
|
|
24
37
|
* Implements exponential backoff strategy for network failures or configured status codes.
|
|
38
|
+
*
|
|
39
|
+
* SAFETY: By default, only idempotent methods are retried.
|
|
40
|
+
* To retry POST/PATCH, ensure the server supports idempotency and provide an idempotency key.
|
|
25
41
|
*/
|
|
26
42
|
export declare function retry(options: RetryOptions): Middleware;
|
|
27
43
|
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/middleware/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/middleware/retry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK/D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C;;OAEG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;KACvC,KAAK,IAAI,CAAC;CACZ;AA4DD;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,CA4LvD"}
|
|
@@ -51,40 +51,53 @@ async function sleep(ms, signal) {
|
|
|
51
51
|
/**
|
|
52
52
|
* pureq Retry Middleware
|
|
53
53
|
* Implements exponential backoff strategy for network failures or configured status codes.
|
|
54
|
+
*
|
|
55
|
+
* SAFETY: By default, only idempotent methods are retried.
|
|
56
|
+
* To retry POST/PATCH, ensure the server supports idempotency and provide an idempotency key.
|
|
54
57
|
*/
|
|
55
58
|
export function retry(options) {
|
|
56
59
|
if (!Number.isInteger(options.maxRetries) || options.maxRetries < 0) {
|
|
57
60
|
throw new Error("pureq: retry requires maxRetries to be a non-negative integer");
|
|
58
61
|
}
|
|
59
|
-
const { maxRetries, delay = 300, backoff = true, maxDelay = 5000, retryBudgetMs, retryOnStatus, retryOnNetworkError = true, respectRetryAfter = true, retryAfterHeaderName = "retry-after", onRetry, } = options;
|
|
62
|
+
const { maxRetries, delay = 300, backoff = true, maxDelay = 5000, retryBudgetMs, retryOnStatus, retryOnNetworkError = true, methods = ["GET", "HEAD", "PUT", "DELETE", "OPTIONS"], respectRetryAfter = true, retryAfterHeaderName = "retry-after", jitter, onRetry, } = options;
|
|
63
|
+
const retryableMethods = new Set(methods.map((method) => method.toUpperCase()));
|
|
64
|
+
const shouldJitter = jitter ?? backoff;
|
|
60
65
|
const middleware = async (req, next) => {
|
|
61
66
|
let attempts = 0;
|
|
62
67
|
let totalWaitMs = 0;
|
|
63
68
|
const hasBudget = retryBudgetMs !== undefined && Number.isFinite(retryBudgetMs) && retryBudgetMs > 0;
|
|
64
69
|
const withRetryMeta = () => {
|
|
65
|
-
const
|
|
66
|
-
const currentMeta =
|
|
67
|
-
? (req._meta ?? {})
|
|
68
|
-
: {};
|
|
70
|
+
const mutableReq = req;
|
|
71
|
+
const currentMeta = (mutableReq.meta ?? (mutableReq.meta = {}));
|
|
69
72
|
currentMeta.retryCount = attempts;
|
|
70
|
-
|
|
71
|
-
return req;
|
|
72
|
-
}
|
|
73
|
-
return {
|
|
74
|
-
...req,
|
|
75
|
-
_meta: currentMeta,
|
|
76
|
-
};
|
|
73
|
+
return mutableReq;
|
|
77
74
|
};
|
|
78
75
|
const executeWithRetry = async () => {
|
|
76
|
+
const method = req.method.toUpperCase();
|
|
77
|
+
const isMethodSafe = retryableMethods.has(method);
|
|
79
78
|
try {
|
|
80
79
|
const res = await next(withRetryMeta());
|
|
81
80
|
if (isRetryableStatus(res.status, retryOnStatus) && attempts < maxRetries) {
|
|
81
|
+
if (!isMethodSafe) {
|
|
82
|
+
appendPolicyTrace(req, {
|
|
83
|
+
policy: "retry",
|
|
84
|
+
decision: "skip",
|
|
85
|
+
at: Date.now(),
|
|
86
|
+
reason: `method ${req.method} is not idempotent and not in allowlist`,
|
|
87
|
+
status: res.status,
|
|
88
|
+
});
|
|
89
|
+
return res;
|
|
90
|
+
}
|
|
82
91
|
attempts++;
|
|
83
92
|
const baseWait = backoff ? Math.min(delay * 2 ** (attempts - 1), maxDelay) : delay;
|
|
84
93
|
const retryAfterMs = respectRetryAfter
|
|
85
94
|
? parseRetryAfter(res.headers.get(retryAfterHeaderName), Date.now())
|
|
86
95
|
: undefined;
|
|
87
|
-
|
|
96
|
+
let waitTime = Math.max(baseWait, retryAfterMs ?? 0);
|
|
97
|
+
if (shouldJitter && waitTime > 0 && retryAfterMs === undefined) {
|
|
98
|
+
// Full Jitter strategy
|
|
99
|
+
waitTime = Math.round(Math.random() * waitTime);
|
|
100
|
+
}
|
|
88
101
|
const budgetRemainingMs = hasBudget ? Math.max(0, retryBudgetMs - totalWaitMs) : undefined;
|
|
89
102
|
if (budgetRemainingMs !== undefined && waitTime > budgetRemainingMs) {
|
|
90
103
|
appendPolicyTrace(req, {
|
|
@@ -132,8 +145,20 @@ export function retry(options) {
|
|
|
132
145
|
throw error;
|
|
133
146
|
}
|
|
134
147
|
if (attempts < maxRetries) {
|
|
148
|
+
if (!isMethodSafe) {
|
|
149
|
+
appendPolicyTrace(req, {
|
|
150
|
+
policy: "retry",
|
|
151
|
+
decision: "skip",
|
|
152
|
+
at: Date.now(),
|
|
153
|
+
reason: `method ${req.method} is not idempotent (network error suppressed)`,
|
|
154
|
+
});
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
135
157
|
attempts++;
|
|
136
|
-
|
|
158
|
+
let waitTime = backoff ? Math.min(delay * 2 ** (attempts - 1), maxDelay) : delay;
|
|
159
|
+
if (shouldJitter && waitTime > 0) {
|
|
160
|
+
waitTime = Math.round(Math.random() * waitTime);
|
|
161
|
+
}
|
|
137
162
|
const budgetRemainingMs = hasBudget ? Math.max(0, retryBudgetMs - totalWaitMs) : undefined;
|
|
138
163
|
if (budgetRemainingMs !== undefined && waitTime > budgetRemainingMs) {
|
|
139
164
|
appendPolicyTrace(req, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/middleware/retry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/middleware/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Middleware } from "../types/http";
|
|
2
|
+
export interface ValidationOptions<T> {
|
|
3
|
+
/**
|
|
4
|
+
* Data validation function.
|
|
5
|
+
* Can be a simple type guard (data is T) or a schema validator (Zod.parse).
|
|
6
|
+
* Should throw an error or return false/null to indicate failure.
|
|
7
|
+
*/
|
|
8
|
+
readonly validate: (data: unknown) => T | Promise<T> | boolean | null;
|
|
9
|
+
/**
|
|
10
|
+
* Optional custom error message or factory.
|
|
11
|
+
*/
|
|
12
|
+
readonly message?: string | ((data: unknown) => string);
|
|
13
|
+
/**
|
|
14
|
+
* If true, validation failure returns the original data instead of throwing.
|
|
15
|
+
* Useful for soft-fail or logging-only scenarios.
|
|
16
|
+
*/
|
|
17
|
+
readonly silent?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* pureq validation middleware.
|
|
21
|
+
* Provides a zero-dependency bridge to schemas (Zod, Valibot) or custom type guards.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validation<T = unknown>(options: ValidationOptions<T>): Middleware;
|
|
24
|
+
//# sourceMappingURL=validation.d.ts.map
|