@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
|
@@ -10,7 +10,6 @@ function buildFullURL(url, params, query) {
|
|
|
10
10
|
// Replace path parameters (e.g., /users/:id)
|
|
11
11
|
if (params) {
|
|
12
12
|
for (const [key, value] of Object.entries(params)) {
|
|
13
|
-
// Use replaceAll to handle multiple occurrences of the same parameter
|
|
14
13
|
finalUrl = finalUrl.replaceAll(`:${key}`, encodeURIComponent(value));
|
|
15
14
|
}
|
|
16
15
|
}
|
|
@@ -19,53 +18,130 @@ function buildFullURL(url, params, query) {
|
|
|
19
18
|
if (unreplaced) {
|
|
20
19
|
throw new Error(`pureq: unresolved path parameters: ${unreplaced.join(", ")}`);
|
|
21
20
|
}
|
|
22
|
-
//
|
|
21
|
+
// Use URL API for robust query parameter handling
|
|
22
|
+
// We use a dummy base for relative URLs to allow URL parsing.
|
|
23
|
+
const isAbsolute = /^[a-z][a-z\d+.-]*:/i.test(finalUrl) || finalUrl.startsWith("//");
|
|
24
|
+
const urlObj = isAbsolute ? new URL(finalUrl) : new URL(finalUrl, "http://localhost");
|
|
23
25
|
if (query) {
|
|
24
|
-
const searchParams = new URLSearchParams();
|
|
25
26
|
for (const [key, value] of Object.entries(query)) {
|
|
26
27
|
if (Array.isArray(value)) {
|
|
27
|
-
|
|
28
|
+
for (const v of value)
|
|
29
|
+
urlObj.searchParams.append(key, String(v));
|
|
28
30
|
}
|
|
29
31
|
else {
|
|
30
|
-
searchParams.append(key, String(value));
|
|
32
|
+
urlObj.searchParams.append(key, String(value));
|
|
31
33
|
}
|
|
32
34
|
}
|
|
33
|
-
const queryString = searchParams.toString();
|
|
34
|
-
if (queryString) {
|
|
35
|
-
finalUrl += (finalUrl.includes("?") ? "&" : "?") + queryString;
|
|
36
|
-
}
|
|
37
35
|
}
|
|
38
|
-
|
|
36
|
+
if (isAbsolute) {
|
|
37
|
+
return urlObj.toString();
|
|
38
|
+
}
|
|
39
|
+
// For relative URLs, return path + search + hash
|
|
40
|
+
const relative = urlObj.pathname + urlObj.search + urlObj.hash;
|
|
41
|
+
if (finalUrl.startsWith("/")) {
|
|
42
|
+
return relative;
|
|
43
|
+
}
|
|
44
|
+
return relative.startsWith("/") ? relative.slice(1) : relative;
|
|
39
45
|
}
|
|
40
46
|
const defaultBodySerializer = jsonBodySerializer;
|
|
41
47
|
function buildManagedSignal(externalSignal, timeoutMs) {
|
|
42
|
-
const
|
|
48
|
+
const signals = [];
|
|
49
|
+
let timeoutTriggered = false;
|
|
50
|
+
if (externalSignal) {
|
|
51
|
+
signals.push(externalSignal);
|
|
52
|
+
}
|
|
43
53
|
let timeoutId;
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
let timeoutSignal;
|
|
55
|
+
let timeoutController;
|
|
56
|
+
const onTimeoutAbort = () => {
|
|
57
|
+
timeoutTriggered = true;
|
|
46
58
|
};
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
|
|
59
|
+
if (timeoutMs !== undefined && timeoutMs > 0) {
|
|
60
|
+
// Note: AbortSignal.timeout(ms) is preferred in modern environments.
|
|
61
|
+
// However, to keep better error messaging and cleanup control, we can also use it via AbortSignal.any.
|
|
62
|
+
timeoutSignal = AbortSignal.timeout
|
|
63
|
+
? AbortSignal.timeout(timeoutMs)
|
|
64
|
+
: undefined;
|
|
65
|
+
if (timeoutSignal) {
|
|
66
|
+
if (timeoutSignal.aborted) {
|
|
67
|
+
timeoutTriggered = true;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
timeoutSignal.addEventListener("abort", onTimeoutAbort, { once: true });
|
|
71
|
+
}
|
|
72
|
+
signals.push(timeoutSignal);
|
|
50
73
|
}
|
|
51
74
|
else {
|
|
52
|
-
|
|
75
|
+
// Fallback for older environments if needed
|
|
76
|
+
const controller = new AbortController();
|
|
77
|
+
timeoutController = controller;
|
|
78
|
+
timeoutId = setTimeout(() => {
|
|
79
|
+
timeoutTriggered = true;
|
|
80
|
+
controller.abort(new Error(`pureq: request timeout after ${timeoutMs}ms`));
|
|
81
|
+
}, timeoutMs);
|
|
82
|
+
signals.push(controller.signal);
|
|
53
83
|
}
|
|
54
84
|
}
|
|
55
|
-
|
|
56
|
-
timeoutId = setTimeout(() => {
|
|
57
|
-
controller.abort(new Error(`pureq: request timeout after ${timeoutMs}ms`));
|
|
58
|
-
}, timeoutMs);
|
|
59
|
-
}
|
|
60
|
-
const cleanup = () => {
|
|
85
|
+
const cleanupTimeoutArtifacts = () => {
|
|
61
86
|
if (timeoutId) {
|
|
62
87
|
clearTimeout(timeoutId);
|
|
63
88
|
}
|
|
64
|
-
if (
|
|
65
|
-
|
|
89
|
+
if (timeoutSignal) {
|
|
90
|
+
timeoutSignal.removeEventListener("abort", onTimeoutAbort);
|
|
91
|
+
}
|
|
92
|
+
if (timeoutController?.signal.aborted) {
|
|
93
|
+
timeoutTriggered = true;
|
|
66
94
|
}
|
|
67
95
|
};
|
|
68
|
-
|
|
96
|
+
if (signals.length === 0) {
|
|
97
|
+
return {
|
|
98
|
+
signal: new AbortController().signal,
|
|
99
|
+
cleanup: cleanupTimeoutArtifacts,
|
|
100
|
+
isTimeoutTriggered: () => timeoutTriggered,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (signals.length === 1) {
|
|
104
|
+
return {
|
|
105
|
+
signal: signals[0],
|
|
106
|
+
cleanup: cleanupTimeoutArtifacts,
|
|
107
|
+
isTimeoutTriggered: () => timeoutTriggered,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const combinedSignal = AbortSignal.any
|
|
111
|
+
? AbortSignal.any(signals)
|
|
112
|
+
: undefined;
|
|
113
|
+
if (combinedSignal) {
|
|
114
|
+
return {
|
|
115
|
+
signal: combinedSignal,
|
|
116
|
+
cleanup: cleanupTimeoutArtifacts,
|
|
117
|
+
isTimeoutTriggered: () => timeoutTriggered,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// Legacy manual polyfill for AbortSignal.any if it doesn't exist
|
|
121
|
+
const controller = new AbortController();
|
|
122
|
+
const onAbort = (e) => {
|
|
123
|
+
controller.abort(e.target.reason);
|
|
124
|
+
cleanup();
|
|
125
|
+
};
|
|
126
|
+
const cleanup = () => {
|
|
127
|
+
cleanupTimeoutArtifacts();
|
|
128
|
+
for (const s of signals) {
|
|
129
|
+
s.removeEventListener("abort", onAbort);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
for (const s of signals) {
|
|
133
|
+
if (s.aborted) {
|
|
134
|
+
controller.abort(s.reason);
|
|
135
|
+
cleanup();
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
s.addEventListener("abort", onAbort, { once: true });
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
signal: controller.signal,
|
|
142
|
+
cleanup,
|
|
143
|
+
isTimeoutTriggered: () => timeoutTriggered,
|
|
144
|
+
};
|
|
69
145
|
}
|
|
70
146
|
/**
|
|
71
147
|
* Performs actual HTTP execution using the global fetch API.
|
|
@@ -76,7 +152,7 @@ export async function execute(req, options = {}) {
|
|
|
76
152
|
const serializer = options.bodySerializer ?? defaultBodySerializer;
|
|
77
153
|
const fullUrl = buildFullURL(req.url, req.params, req.query);
|
|
78
154
|
const { payload, contentType } = serializer.serialize(req.body);
|
|
79
|
-
const { signal, cleanup } = buildManagedSignal(req.signal, req.timeout);
|
|
155
|
+
const { signal, cleanup, isTimeoutTriggered } = buildManagedSignal(req.signal, req.timeout);
|
|
80
156
|
const init = {
|
|
81
157
|
method: req.method,
|
|
82
158
|
headers: req.headers ?? {},
|
|
@@ -100,6 +176,11 @@ export async function execute(req, options = {}) {
|
|
|
100
176
|
}
|
|
101
177
|
catch (error) {
|
|
102
178
|
cleanup();
|
|
179
|
+
const isNativeTimeoutError = error instanceof Error &&
|
|
180
|
+
(error.name === "TimeoutError" || error.message.includes("request timeout"));
|
|
181
|
+
if (req.timeout !== undefined && req.timeout > 0 && (isTimeoutTriggered() || isNativeTimeoutError)) {
|
|
182
|
+
throw new Error(`pureq: request timeout after ${req.timeout}ms`);
|
|
183
|
+
}
|
|
103
184
|
// These are execution errors (network, DNS, timeout etc.), NOT status errors.
|
|
104
185
|
throw error;
|
|
105
186
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/executor/execute.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,EAAmB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE;;;GAGG;AACH,SAAS,YAAY,CACnB,GAAW,EACX,MAAyC,EACzC,KAA8B;IAE9B,IAAI,QAAQ,GAAG,GAAG,CAAC;IAEnB,6CAA6C;IAC7C,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/executor/execute.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export * from "./middleware/concurrencyLimit";
|
|
|
16
16
|
export * from "./middleware/circuitBreaker";
|
|
17
17
|
export * from "./middleware/circuitBreakerKeys";
|
|
18
18
|
export * from "./middleware/idempotencyKey";
|
|
19
|
+
export * from "./middleware/validation";
|
|
20
|
+
export * from "./middleware/fallback";
|
|
19
21
|
export * from "./middleware/diagnostics";
|
|
20
22
|
export * from "./middleware/diagnosticsExporters";
|
|
21
23
|
export * from "./middleware/presets";
|
|
@@ -32,6 +34,10 @@ export * from "./adapters/instrumentedAdapter";
|
|
|
32
34
|
export * from "./serializers/jsonBodySerializer";
|
|
33
35
|
export * from "./serializers/formUrlEncodedSerializer";
|
|
34
36
|
export type { ExtractParams, TypedRequestOptions } from "./utils/url";
|
|
37
|
+
export * from "./middleware/authRefresh";
|
|
38
|
+
export * from "./adapters/storage/encryptedStorage";
|
|
39
|
+
export * from "./adapters/storage/indexedDBAdapter";
|
|
35
40
|
export { generateSecureId } from "./utils/crypto";
|
|
41
|
+
export { encrypt, decrypt } from "./utils/crypto";
|
|
36
42
|
export { redactUrlQueryParams, type UrlRedactionOptions } from "./observability/redaction";
|
|
37
43
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACtE,cAAc,0BAA0B,CAAC;AACzC,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -16,6 +16,8 @@ export * from "./middleware/concurrencyLimit";
|
|
|
16
16
|
export * from "./middleware/circuitBreaker";
|
|
17
17
|
export * from "./middleware/circuitBreakerKeys";
|
|
18
18
|
export * from "./middleware/idempotencyKey";
|
|
19
|
+
export * from "./middleware/validation";
|
|
20
|
+
export * from "./middleware/fallback";
|
|
19
21
|
export * from "./middleware/diagnostics";
|
|
20
22
|
export * from "./middleware/diagnosticsExporters";
|
|
21
23
|
export * from "./middleware/presets";
|
|
@@ -31,6 +33,10 @@ export * from "./adapters/fetchAdapter";
|
|
|
31
33
|
export * from "./adapters/instrumentedAdapter";
|
|
32
34
|
export * from "./serializers/jsonBodySerializer";
|
|
33
35
|
export * from "./serializers/formUrlEncodedSerializer";
|
|
36
|
+
export * from "./middleware/authRefresh";
|
|
37
|
+
export * from "./adapters/storage/encryptedStorage";
|
|
38
|
+
export * from "./adapters/storage/indexedDBAdapter";
|
|
34
39
|
export { generateSecureId } from "./utils/crypto";
|
|
40
|
+
export { encrypt, decrypt } from "./utils/crypto";
|
|
35
41
|
export { redactUrlQueryParams } from "./observability/redaction";
|
|
36
42
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,0BAA0B,CAAC;AACzC,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Middleware, RequestConfig } from "../types/http";
|
|
2
|
+
export interface AuthRefreshOptions {
|
|
3
|
+
/**
|
|
4
|
+
* The status code that triggers the refresh (default: 401).
|
|
5
|
+
*/
|
|
6
|
+
readonly status?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Function to refresh the token. Should return the new token string.
|
|
9
|
+
*/
|
|
10
|
+
readonly refresh: () => Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Function to update the original request with the new token.
|
|
13
|
+
* Default: updates 'Authorization' header.
|
|
14
|
+
*/
|
|
15
|
+
readonly updateRequest?: (req: RequestConfig, newToken: string) => RequestConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Max number of refresh attempts per request (default: 1).
|
|
18
|
+
*/
|
|
19
|
+
readonly maxAttempts?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Middleware for automatic authentication token refreshing.
|
|
23
|
+
* Handles concurrent 401 errors by queuing them during a refresh operation.
|
|
24
|
+
*/
|
|
25
|
+
export declare function authRefresh(options: AuthRefreshOptions): Middleware;
|
|
26
|
+
//# sourceMappingURL=authRefresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authRefresh.d.ts","sourceRoot":"","sources":["../../../src/middleware/authRefresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,KAAK,aAAa,CAAC;IACjF;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAsDnE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { markPolicyMiddleware } from "../policy/guardrails";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware for automatic authentication token refreshing.
|
|
4
|
+
* Handles concurrent 401 errors by queuing them during a refresh operation.
|
|
5
|
+
*/
|
|
6
|
+
export function authRefresh(options) {
|
|
7
|
+
const triggerStatus = options.status ?? 401;
|
|
8
|
+
const maxAttempts = options.maxAttempts ?? 1;
|
|
9
|
+
const updateRequest = options.updateRequest ?? ((req, token) => ({
|
|
10
|
+
...req,
|
|
11
|
+
headers: {
|
|
12
|
+
...req.headers,
|
|
13
|
+
"Authorization": `Bearer ${token}`,
|
|
14
|
+
},
|
|
15
|
+
}));
|
|
16
|
+
let refreshPromise = null;
|
|
17
|
+
const middleware = async (req, next) => {
|
|
18
|
+
let attempts = 0;
|
|
19
|
+
let currentReq = req;
|
|
20
|
+
while (attempts <= maxAttempts) {
|
|
21
|
+
const response = await next(currentReq);
|
|
22
|
+
if (response.status !== triggerStatus || attempts >= maxAttempts) {
|
|
23
|
+
return response;
|
|
24
|
+
}
|
|
25
|
+
attempts++;
|
|
26
|
+
// Prevent thundering herd: only one refresh at a time
|
|
27
|
+
if (!refreshPromise) {
|
|
28
|
+
refreshPromise = options.refresh().finally(() => {
|
|
29
|
+
refreshPromise = null;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const newToken = await refreshPromise;
|
|
34
|
+
currentReq = updateRequest(currentReq, newToken);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// If refresh itself fails, return the original unauthorized response
|
|
38
|
+
// or throw a wrapped error.
|
|
39
|
+
const authError = new Error(`pureq: token refresh failed`);
|
|
40
|
+
authError.code = "PUREQ_AUTH_REFRESH_FAILED";
|
|
41
|
+
authError.kind = "auth-error";
|
|
42
|
+
authError.cause = error;
|
|
43
|
+
throw authError;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw new Error("pureq: auth refresh loop exited unexpectedly");
|
|
47
|
+
};
|
|
48
|
+
return markPolicyMiddleware(middleware, {
|
|
49
|
+
name: "authRefresh",
|
|
50
|
+
kind: "auth",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=authRefresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authRefresh.js","sourceRoot":"","sources":["../../../src/middleware/authRefresh.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAsB5D;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;IAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/D,GAAG,GAAG;QACN,OAAO,EAAE;YACP,GAAG,GAAG,CAAC,OAAO;YACd,eAAe,EAAE,UAAU,KAAK,EAAE;SACnC;KACF,CAAC,CAAC,CAAC;IAEJ,IAAI,cAAc,GAA2B,IAAI,CAAC;IAElD,MAAM,UAAU,GAAe,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACjD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,UAAU,GAAG,GAAG,CAAC;QAErB,OAAO,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;YAExC,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACjE,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,QAAQ,EAAE,CAAC;YAEX,sDAAsD;YACtD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC9C,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC;gBACtC,UAAU,GAAG,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,qEAAqE;gBACrE,4BAA4B;gBAC5B,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC1D,SAAiB,CAAC,IAAI,GAAG,2BAA2B,CAAC;gBACrD,SAAiB,CAAC,IAAI,GAAG,YAAY,CAAC;gBACtC,SAAiB,CAAC,KAAK,GAAG,KAAK,CAAC;gBACjC,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,OAAO,oBAAoB,CAAC,UAAU,EAAE;QACtC,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,MAAM;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -39,8 +39,25 @@ export interface CircuitBreakerOptions {
|
|
|
39
39
|
readonly error?: unknown;
|
|
40
40
|
}) => boolean;
|
|
41
41
|
readonly hooks?: CircuitBreakerHooks;
|
|
42
|
+
readonly store?: CircuitStateStore;
|
|
43
|
+
}
|
|
44
|
+
export interface CircuitStateStore {
|
|
45
|
+
get(key: string): Promise<CircuitEntry | undefined> | CircuitEntry | undefined;
|
|
46
|
+
set(key: string, entry: CircuitEntry): Promise<void> | void;
|
|
47
|
+
delete(key: string): Promise<void> | void;
|
|
48
|
+
entries(): Promise<Iterable<[string, CircuitEntry]>> | Iterable<[string, CircuitEntry]>;
|
|
49
|
+
clear?(): Promise<void> | void;
|
|
42
50
|
}
|
|
43
51
|
type State = "closed" | "open" | "half-open";
|
|
52
|
+
interface CircuitEntry {
|
|
53
|
+
state: State;
|
|
54
|
+
failureCount: number;
|
|
55
|
+
successCount: number;
|
|
56
|
+
openedAt: number;
|
|
57
|
+
halfOpenProbeInFlight: boolean;
|
|
58
|
+
lastChangedAt: number;
|
|
59
|
+
lastAccessedAt: number;
|
|
60
|
+
}
|
|
44
61
|
export interface CircuitSnapshotEntry {
|
|
45
62
|
readonly key: string;
|
|
46
63
|
readonly state: State;
|
|
@@ -61,8 +78,8 @@ export interface CircuitSnapshot {
|
|
|
61
78
|
}
|
|
62
79
|
export interface CircuitBreakerController {
|
|
63
80
|
readonly middleware: Middleware;
|
|
64
|
-
readonly snapshot: () => CircuitSnapshot
|
|
65
|
-
readonly reset: (key?: string) => void
|
|
81
|
+
readonly snapshot: () => Promise<CircuitSnapshot>;
|
|
82
|
+
readonly reset: (key?: string) => Promise<void>;
|
|
66
83
|
}
|
|
67
84
|
/**
|
|
68
85
|
* Circuit breaker middleware for downstream dependency protection.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuitBreaker.d.ts","sourceRoot":"","sources":["../../../src/middleware/circuitBreaker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,wBAAwB;gBAEzB,OAAO,SAAmC;CAIvD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;QACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QACrB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,MAAM,CAAC;IAC/D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;QACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;KAC1B,KAAK,OAAO,CAAC;IACd,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"circuitBreaker.d.ts","sourceRoot":"","sources":["../../../src/middleware/circuitBreaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,40 +52,66 @@ export function createCircuitBreaker(options = {}) {
|
|
|
52
52
|
const keyBuilder = options.keyBuilder ?? defaultKeyBuilder;
|
|
53
53
|
const maxEntries = options.maxEntries ?? Number.POSITIVE_INFINITY;
|
|
54
54
|
const entryTtlMs = options.entryTtlMs;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
// Use provided store or default to in-memory Map
|
|
56
|
+
const internalMap = new Map();
|
|
57
|
+
const store = options.store ?? {
|
|
58
|
+
get: (key) => internalMap.get(key),
|
|
59
|
+
set: (key, entry) => { internalMap.set(key, entry); },
|
|
60
|
+
delete: (key) => { internalMap.delete(key); },
|
|
61
|
+
entries: () => internalMap.entries(),
|
|
62
|
+
clear: () => internalMap.clear(),
|
|
63
|
+
};
|
|
64
|
+
async function evictOldestEntry() {
|
|
65
|
+
const allEntries = await store.entries();
|
|
66
|
+
const oldestKey = allEntries[Symbol.iterator]().next().value?.[0];
|
|
58
67
|
if (oldestKey !== undefined) {
|
|
59
|
-
|
|
68
|
+
await store.delete(oldestKey);
|
|
60
69
|
}
|
|
61
70
|
}
|
|
62
|
-
function pruneExpiredEntries(now) {
|
|
71
|
+
async function pruneExpiredEntries(now) {
|
|
63
72
|
if (entryTtlMs === undefined || entryTtlMs <= 0) {
|
|
64
73
|
return;
|
|
65
74
|
}
|
|
66
|
-
|
|
75
|
+
const allEntries = await store.entries();
|
|
76
|
+
for (const [key, entry] of allEntries) {
|
|
67
77
|
if (now - entry.lastAccessedAt >= entryTtlMs) {
|
|
68
|
-
|
|
78
|
+
await store.delete(key);
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
81
|
}
|
|
72
|
-
function touchEntry(key, entry, now) {
|
|
82
|
+
async function touchEntry(key, entry, now) {
|
|
73
83
|
entry.lastAccessedAt = now;
|
|
74
|
-
|
|
75
|
-
|
|
84
|
+
// For Map-based stores, we delete and re-set to maintain insertion order for eviction
|
|
85
|
+
if (!options.store) {
|
|
86
|
+
internalMap.delete(key);
|
|
87
|
+
internalMap.set(key, entry);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
await store.set(key, entry);
|
|
91
|
+
}
|
|
76
92
|
}
|
|
77
|
-
function getEntry(key, now) {
|
|
78
|
-
pruneExpiredEntries(now);
|
|
79
|
-
const existing =
|
|
93
|
+
async function getEntry(key, now) {
|
|
94
|
+
await pruneExpiredEntries(now);
|
|
95
|
+
const existing = await store.get(key);
|
|
80
96
|
if (existing) {
|
|
81
|
-
touchEntry(key, existing, now);
|
|
97
|
+
await touchEntry(key, existing, now);
|
|
82
98
|
return existing;
|
|
83
99
|
}
|
|
84
|
-
|
|
85
|
-
|
|
100
|
+
let currentSize = 0;
|
|
101
|
+
if (!options.store) {
|
|
102
|
+
currentSize = internalMap.size;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
const all = await store.entries();
|
|
106
|
+
for (const _ of all)
|
|
107
|
+
currentSize++;
|
|
108
|
+
}
|
|
109
|
+
while (currentSize >= maxEntries) {
|
|
110
|
+
await evictOldestEntry();
|
|
111
|
+
currentSize--;
|
|
86
112
|
}
|
|
87
113
|
const created = createEntry(now);
|
|
88
|
-
|
|
114
|
+
await store.set(key, created);
|
|
89
115
|
return created;
|
|
90
116
|
}
|
|
91
117
|
function openCircuit(key, entry, now) {
|
|
@@ -130,8 +156,8 @@ export function createCircuitBreaker(options = {}) {
|
|
|
130
156
|
const middleware = async (req, next) => {
|
|
131
157
|
const now = Date.now();
|
|
132
158
|
const key = keyBuilder(req);
|
|
133
|
-
const entry = getEntry(key, now);
|
|
134
|
-
touchEntry(key, entry, now);
|
|
159
|
+
const entry = await getEntry(key, now);
|
|
160
|
+
await touchEntry(key, entry, now);
|
|
135
161
|
if (entry.state === "open") {
|
|
136
162
|
if (now - entry.openedAt < cooldownMs) {
|
|
137
163
|
throw new PureqCircuitOpenError();
|
|
@@ -157,6 +183,7 @@ export function createCircuitBreaker(options = {}) {
|
|
|
157
183
|
openCircuit(key, entry, Date.now());
|
|
158
184
|
}
|
|
159
185
|
}
|
|
186
|
+
await store.set(key, entry);
|
|
160
187
|
return response;
|
|
161
188
|
}
|
|
162
189
|
if (entry.state === "half-open") {
|
|
@@ -168,6 +195,7 @@ export function createCircuitBreaker(options = {}) {
|
|
|
168
195
|
else {
|
|
169
196
|
entry.failureCount = 0;
|
|
170
197
|
}
|
|
198
|
+
await store.set(key, entry);
|
|
171
199
|
return response;
|
|
172
200
|
}
|
|
173
201
|
catch (error) {
|
|
@@ -184,22 +212,24 @@ export function createCircuitBreaker(options = {}) {
|
|
|
184
212
|
openCircuit(key, entry, Date.now());
|
|
185
213
|
}
|
|
186
214
|
}
|
|
215
|
+
await store.set(key, entry);
|
|
187
216
|
throw error;
|
|
188
217
|
}
|
|
189
218
|
finally {
|
|
190
219
|
if (entry.state === "half-open") {
|
|
191
220
|
entry.halfOpenProbeInFlight = false;
|
|
192
221
|
}
|
|
193
|
-
touchEntry(key, entry, Date.now());
|
|
222
|
+
await touchEntry(key, entry, Date.now());
|
|
194
223
|
}
|
|
195
224
|
};
|
|
196
|
-
const snapshot = () => {
|
|
197
|
-
pruneExpiredEntries(Date.now());
|
|
225
|
+
const snapshot = async () => {
|
|
226
|
+
await pruneExpiredEntries(Date.now());
|
|
198
227
|
const result = [];
|
|
199
228
|
let closed = 0;
|
|
200
229
|
let open = 0;
|
|
201
230
|
let halfOpen = 0;
|
|
202
|
-
|
|
231
|
+
const allEntries = await store.entries();
|
|
232
|
+
for (const [key, entry] of allEntries) {
|
|
203
233
|
if (entry.state === "closed") {
|
|
204
234
|
closed += 1;
|
|
205
235
|
}
|
|
@@ -230,12 +260,20 @@ export function createCircuitBreaker(options = {}) {
|
|
|
230
260
|
entries: result,
|
|
231
261
|
};
|
|
232
262
|
};
|
|
233
|
-
const reset = (key) => {
|
|
263
|
+
const reset = async (key) => {
|
|
234
264
|
if (key === undefined) {
|
|
235
|
-
|
|
265
|
+
if (store.clear) {
|
|
266
|
+
await store.clear();
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const allEntries = await store.entries();
|
|
270
|
+
const entryKeys = Array.from(allEntries, ([entryKey]) => entryKey);
|
|
271
|
+
for (const entryKey of entryKeys) {
|
|
272
|
+
await store.delete(entryKey);
|
|
273
|
+
}
|
|
236
274
|
return;
|
|
237
275
|
}
|
|
238
|
-
|
|
276
|
+
await store.delete(key);
|
|
239
277
|
};
|
|
240
278
|
return {
|
|
241
279
|
middleware,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuitBreaker.js","sourceRoot":"","sources":["../../../src/middleware/circuitBreaker.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAG9C,YAAY,OAAO,GAAG,gCAAgC;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAG,oBAAoB,CAAC;QAInC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"circuitBreaker.js","sourceRoot":"","sources":["../../../src/middleware/circuitBreaker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/middleware/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/middleware/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD;;;GAGG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,QAAQ,GAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC,YAAY,CAAW,IAExD,KAAK,qBAAqB,KAAG,OAAO,CAAC,YAAY,CAAC,CAyCpE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { INTERNAL_MIDDLEWARES } from "../types/internal";
|
|
1
2
|
import { execute } from "../executor/execute";
|
|
2
3
|
/**
|
|
3
4
|
* Composes multiple middlewares into a single executable function.
|
|
@@ -25,7 +26,7 @@ export function compose(middlewares, executor = execute) {
|
|
|
25
26
|
const nextReq = {
|
|
26
27
|
...currentConfig,
|
|
27
28
|
...nextConfig,
|
|
28
|
-
|
|
29
|
+
[INTERNAL_MIDDLEWARES]: currentConfig[INTERNAL_MIDDLEWARES],
|
|
29
30
|
};
|
|
30
31
|
try {
|
|
31
32
|
return await dispatch(i + 1, nextReq);
|