@pureq/pureq 1.0.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/LICENSE.md +21 -0
- package/README.md +932 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/benchmark.d.ts +2 -0
- package/dist/scripts/benchmark.d.ts.map +1 -0
- package/dist/scripts/benchmark.js +69 -0
- package/dist/scripts/benchmark.js.map +1 -0
- package/dist/scripts/edge-smoke-entry.d.ts +8 -0
- package/dist/scripts/edge-smoke-entry.d.ts.map +1 -0
- package/dist/scripts/edge-smoke-entry.js +23 -0
- package/dist/scripts/edge-smoke-entry.js.map +1 -0
- package/dist/src/adapters/fetchAdapter.d.ts +3 -0
- package/dist/src/adapters/fetchAdapter.d.ts.map +1 -0
- package/dist/src/adapters/fetchAdapter.js +4 -0
- package/dist/src/adapters/fetchAdapter.js.map +1 -0
- package/dist/src/adapters/instrumentedAdapter.d.ts +21 -0
- package/dist/src/adapters/instrumentedAdapter.d.ts.map +1 -0
- package/dist/src/adapters/instrumentedAdapter.js +25 -0
- package/dist/src/adapters/instrumentedAdapter.js.map +1 -0
- package/dist/src/client/createClient.d.ts +193 -0
- package/dist/src/client/createClient.d.ts.map +1 -0
- package/dist/src/client/createClient.js +310 -0
- package/dist/src/client/createClient.js.map +1 -0
- package/dist/src/executor/execute.d.ts +19 -0
- package/dist/src/executor/execute.d.ts.map +1 -0
- package/dist/src/executor/execute.js +121 -0
- package/dist/src/executor/execute.js.map +1 -0
- package/dist/src/index.d.ts +37 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +36 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/middleware/circuitBreaker.d.ts +77 -0
- package/dist/src/middleware/circuitBreaker.d.ts.map +1 -0
- package/dist/src/middleware/circuitBreaker.js +246 -0
- package/dist/src/middleware/circuitBreaker.js.map +1 -0
- package/dist/src/middleware/circuitBreakerKeys.d.ts +5 -0
- package/dist/src/middleware/circuitBreakerKeys.d.ts.map +1 -0
- package/dist/src/middleware/circuitBreakerKeys.js +30 -0
- package/dist/src/middleware/circuitBreakerKeys.js.map +1 -0
- package/dist/src/middleware/compose.d.ts +9 -0
- package/dist/src/middleware/compose.d.ts.map +1 -0
- package/dist/src/middleware/compose.js +45 -0
- package/dist/src/middleware/compose.js.map +1 -0
- package/dist/src/middleware/concurrencyLimit.d.ts +11 -0
- package/dist/src/middleware/concurrencyLimit.d.ts.map +1 -0
- package/dist/src/middleware/concurrencyLimit.js +126 -0
- package/dist/src/middleware/concurrencyLimit.js.map +1 -0
- package/dist/src/middleware/deadline.d.ts +10 -0
- package/dist/src/middleware/deadline.d.ts.map +1 -0
- package/dist/src/middleware/deadline.js +99 -0
- package/dist/src/middleware/deadline.js.map +1 -0
- package/dist/src/middleware/dedupe.d.ts +13 -0
- package/dist/src/middleware/dedupe.d.ts.map +1 -0
- package/dist/src/middleware/dedupe.js +46 -0
- package/dist/src/middleware/dedupe.js.map +1 -0
- package/dist/src/middleware/defaultTimeout.d.ts +6 -0
- package/dist/src/middleware/defaultTimeout.d.ts.map +1 -0
- package/dist/src/middleware/defaultTimeout.js +23 -0
- package/dist/src/middleware/defaultTimeout.js.map +1 -0
- package/dist/src/middleware/diagnostics.d.ts +28 -0
- package/dist/src/middleware/diagnostics.d.ts.map +1 -0
- package/dist/src/middleware/diagnostics.js +131 -0
- package/dist/src/middleware/diagnostics.js.map +1 -0
- package/dist/src/middleware/diagnosticsExporters.d.ts +27 -0
- package/dist/src/middleware/diagnosticsExporters.d.ts.map +1 -0
- package/dist/src/middleware/diagnosticsExporters.js +45 -0
- package/dist/src/middleware/diagnosticsExporters.js.map +1 -0
- package/dist/src/middleware/hedge.d.ts +17 -0
- package/dist/src/middleware/hedge.d.ts.map +1 -0
- package/dist/src/middleware/hedge.js +125 -0
- package/dist/src/middleware/hedge.js.map +1 -0
- package/dist/src/middleware/httpCache.d.ts +14 -0
- package/dist/src/middleware/httpCache.d.ts.map +1 -0
- package/dist/src/middleware/httpCache.js +126 -0
- package/dist/src/middleware/httpCache.js.map +1 -0
- package/dist/src/middleware/idempotencyKey.d.ts +12 -0
- package/dist/src/middleware/idempotencyKey.d.ts.map +1 -0
- package/dist/src/middleware/idempotencyKey.js +33 -0
- package/dist/src/middleware/idempotencyKey.js.map +1 -0
- package/dist/src/middleware/offlineQueue.d.ts +78 -0
- package/dist/src/middleware/offlineQueue.d.ts.map +1 -0
- package/dist/src/middleware/offlineQueue.js +189 -0
- package/dist/src/middleware/offlineQueue.js.map +1 -0
- package/dist/src/middleware/presets.d.ts +31 -0
- package/dist/src/middleware/presets.d.ts.map +1 -0
- package/dist/src/middleware/presets.js +122 -0
- package/dist/src/middleware/presets.js.map +1 -0
- package/dist/src/middleware/retry.d.ts +27 -0
- package/dist/src/middleware/retry.d.ts.map +1 -0
- package/dist/src/middleware/retry.js +189 -0
- package/dist/src/middleware/retry.js.map +1 -0
- package/dist/src/middleware/stalePolicy.d.ts +14 -0
- package/dist/src/middleware/stalePolicy.d.ts.map +1 -0
- package/dist/src/middleware/stalePolicy.js +13 -0
- package/dist/src/middleware/stalePolicy.js.map +1 -0
- package/dist/src/observability/otelMapping.d.ts +13 -0
- package/dist/src/observability/otelMapping.d.ts.map +1 -0
- package/dist/src/observability/otelMapping.js +31 -0
- package/dist/src/observability/otelMapping.js.map +1 -0
- package/dist/src/observability/otelProfiles.d.ts +16 -0
- package/dist/src/observability/otelProfiles.d.ts.map +1 -0
- package/dist/src/observability/otelProfiles.js +66 -0
- package/dist/src/observability/otelProfiles.js.map +1 -0
- package/dist/src/observability/redaction.d.ts +39 -0
- package/dist/src/observability/redaction.d.ts.map +1 -0
- package/dist/src/observability/redaction.js +112 -0
- package/dist/src/observability/redaction.js.map +1 -0
- package/dist/src/policy/guardrails.d.ts +14 -0
- package/dist/src/policy/guardrails.d.ts.map +1 -0
- package/dist/src/policy/guardrails.js +36 -0
- package/dist/src/policy/guardrails.js.map +1 -0
- package/dist/src/response/response.d.ts +58 -0
- package/dist/src/response/response.d.ts.map +1 -0
- package/dist/src/response/response.js +91 -0
- package/dist/src/response/response.js.map +1 -0
- package/dist/src/serializers/formUrlEncodedSerializer.d.ts +6 -0
- package/dist/src/serializers/formUrlEncodedSerializer.d.ts.map +1 -0
- package/dist/src/serializers/formUrlEncodedSerializer.js +38 -0
- package/dist/src/serializers/formUrlEncodedSerializer.js.map +1 -0
- package/dist/src/serializers/jsonBodySerializer.d.ts +3 -0
- package/dist/src/serializers/jsonBodySerializer.d.ts.map +1 -0
- package/dist/src/serializers/jsonBodySerializer.js +24 -0
- package/dist/src/serializers/jsonBodySerializer.js.map +1 -0
- package/dist/src/types/events.d.ts +49 -0
- package/dist/src/types/events.d.ts.map +1 -0
- package/dist/src/types/events.js +2 -0
- package/dist/src/types/events.js.map +1 -0
- package/dist/src/types/http.d.ts +78 -0
- package/dist/src/types/http.d.ts.map +1 -0
- package/dist/src/types/http.js +2 -0
- package/dist/src/types/http.js.map +1 -0
- package/dist/src/types/internal.d.ts +20 -0
- package/dist/src/types/internal.d.ts.map +1 -0
- package/dist/src/types/internal.js +2 -0
- package/dist/src/types/internal.js.map +1 -0
- package/dist/src/types/result.d.ts +32 -0
- package/dist/src/types/result.d.ts.map +1 -0
- package/dist/src/types/result.js +66 -0
- package/dist/src/types/result.js.map +1 -0
- package/dist/src/utils/crypto.d.ts +8 -0
- package/dist/src/utils/crypto.d.ts.map +1 -0
- package/dist/src/utils/crypto.js +21 -0
- package/dist/src/utils/crypto.js.map +1 -0
- package/dist/src/utils/policyTrace.d.ts +17 -0
- package/dist/src/utils/policyTrace.d.ts.map +1 -0
- package/dist/src/utils/policyTrace.js +34 -0
- package/dist/src/utils/policyTrace.js.map +1 -0
- package/dist/src/utils/stableKey.d.ts +17 -0
- package/dist/src/utils/stableKey.d.ts.map +1 -0
- package/dist/src/utils/stableKey.js +41 -0
- package/dist/src/utils/stableKey.js.map +1 -0
- package/dist/src/utils/url.d.ts +22 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +2 -0
- package/dist/src/utils/url.js.map +1 -0
- package/dist/tests/adapter-serializer.test.d.ts +2 -0
- package/dist/tests/adapter-serializer.test.d.ts.map +1 -0
- package/dist/tests/adapter-serializer.test.js +59 -0
- package/dist/tests/adapter-serializer.test.js.map +1 -0
- package/dist/tests/browser-runtime.smoke.test.d.ts +2 -0
- package/dist/tests/browser-runtime.smoke.test.d.ts.map +1 -0
- package/dist/tests/browser-runtime.smoke.test.js +17 -0
- package/dist/tests/browser-runtime.smoke.test.js.map +1 -0
- package/dist/tests/circuit-breaker.test.d.ts +2 -0
- package/dist/tests/circuit-breaker.test.d.ts.map +1 -0
- package/dist/tests/circuit-breaker.test.js +184 -0
- package/dist/tests/circuit-breaker.test.js.map +1 -0
- package/dist/tests/client.integration.d.ts +2 -0
- package/dist/tests/client.integration.d.ts.map +1 -0
- package/dist/tests/client.integration.js +44 -0
- package/dist/tests/client.integration.js.map +1 -0
- package/dist/tests/client.integration.test.d.ts +2 -0
- package/dist/tests/client.integration.test.d.ts.map +1 -0
- package/dist/tests/client.integration.test.js +63 -0
- package/dist/tests/client.integration.test.js.map +1 -0
- package/dist/tests/compose.test.d.ts +2 -0
- package/dist/tests/compose.test.d.ts.map +1 -0
- package/dist/tests/compose.test.js +24 -0
- package/dist/tests/compose.test.js.map +1 -0
- package/dist/tests/concurrency-limit.test.d.ts +2 -0
- package/dist/tests/concurrency-limit.test.d.ts.map +1 -0
- package/dist/tests/concurrency-limit.test.js +87 -0
- package/dist/tests/concurrency-limit.test.js.map +1 -0
- package/dist/tests/deadline-middleware.test.d.ts +2 -0
- package/dist/tests/deadline-middleware.test.d.ts.map +1 -0
- package/dist/tests/deadline-middleware.test.js +38 -0
- package/dist/tests/deadline-middleware.test.js.map +1 -0
- package/dist/tests/dedupe-middleware.test.d.ts +2 -0
- package/dist/tests/dedupe-middleware.test.d.ts.map +1 -0
- package/dist/tests/dedupe-middleware.test.js +56 -0
- package/dist/tests/dedupe-middleware.test.js.map +1 -0
- package/dist/tests/default-timeout.test.d.ts +2 -0
- package/dist/tests/default-timeout.test.d.ts.map +1 -0
- package/dist/tests/default-timeout.test.js +28 -0
- package/dist/tests/default-timeout.test.js.map +1 -0
- package/dist/tests/diagnostics-exporters.test.d.ts +2 -0
- package/dist/tests/diagnostics-exporters.test.d.ts.map +1 -0
- package/dist/tests/diagnostics-exporters.test.js +41 -0
- package/dist/tests/diagnostics-exporters.test.js.map +1 -0
- package/dist/tests/diagnostics.test.d.ts +2 -0
- package/dist/tests/diagnostics.test.d.ts.map +1 -0
- package/dist/tests/diagnostics.test.js +38 -0
- package/dist/tests/diagnostics.test.js.map +1 -0
- package/dist/tests/error-metadata.test.d.ts +2 -0
- package/dist/tests/error-metadata.test.d.ts.map +1 -0
- package/dist/tests/error-metadata.test.js +23 -0
- package/dist/tests/error-metadata.test.js.map +1 -0
- package/dist/tests/execute-timeout.test.d.ts +2 -0
- package/dist/tests/execute-timeout.test.d.ts.map +1 -0
- package/dist/tests/execute-timeout.test.js +30 -0
- package/dist/tests/execute-timeout.test.js.map +1 -0
- package/dist/tests/form-serializer.test.d.ts +2 -0
- package/dist/tests/form-serializer.test.d.ts.map +1 -0
- package/dist/tests/form-serializer.test.js +16 -0
- package/dist/tests/form-serializer.test.js.map +1 -0
- package/dist/tests/hedge.test.d.ts +2 -0
- package/dist/tests/hedge.test.d.ts.map +1 -0
- package/dist/tests/hedge.test.js +45 -0
- package/dist/tests/hedge.test.js.map +1 -0
- package/dist/tests/http-cache.test.d.ts +2 -0
- package/dist/tests/http-cache.test.d.ts.map +1 -0
- package/dist/tests/http-cache.test.js +60 -0
- package/dist/tests/http-cache.test.js.map +1 -0
- package/dist/tests/idempotency-key.test.d.ts +2 -0
- package/dist/tests/idempotency-key.test.d.ts.map +1 -0
- package/dist/tests/idempotency-key.test.js +31 -0
- package/dist/tests/idempotency-key.test.js.map +1 -0
- package/dist/tests/instrumented-adapter.test.d.ts +2 -0
- package/dist/tests/instrumented-adapter.test.d.ts.map +1 -0
- package/dist/tests/instrumented-adapter.test.js +33 -0
- package/dist/tests/instrumented-adapter.test.js.map +1 -0
- package/dist/tests/interceptor-order.test.d.ts +2 -0
- package/dist/tests/interceptor-order.test.d.ts.map +1 -0
- package/dist/tests/interceptor-order.test.js +38 -0
- package/dist/tests/interceptor-order.test.js.map +1 -0
- package/dist/tests/json-helper.test.d.ts +2 -0
- package/dist/tests/json-helper.test.d.ts.map +1 -0
- package/dist/tests/json-helper.test.js +42 -0
- package/dist/tests/json-helper.test.js.map +1 -0
- package/dist/tests/observability.test.d.ts +2 -0
- package/dist/tests/observability.test.d.ts.map +1 -0
- package/dist/tests/observability.test.js +59 -0
- package/dist/tests/observability.test.js.map +1 -0
- package/dist/tests/offline-queue.test.d.ts +2 -0
- package/dist/tests/offline-queue.test.d.ts.map +1 -0
- package/dist/tests/offline-queue.test.js +35 -0
- package/dist/tests/offline-queue.test.js.map +1 -0
- package/dist/tests/otel-mapping.test.d.ts +2 -0
- package/dist/tests/otel-mapping.test.d.ts.map +1 -0
- package/dist/tests/otel-mapping.test.js +20 -0
- package/dist/tests/otel-mapping.test.js.map +1 -0
- package/dist/tests/policy-guardrails.test.d.ts +2 -0
- package/dist/tests/policy-guardrails.test.d.ts.map +1 -0
- package/dist/tests/policy-guardrails.test.js +25 -0
- package/dist/tests/policy-guardrails.test.js.map +1 -0
- package/dist/tests/presets.test.d.ts +2 -0
- package/dist/tests/presets.test.d.ts.map +1 -0
- package/dist/tests/presets.test.js +41 -0
- package/dist/tests/presets.test.js.map +1 -0
- package/dist/tests/public-api.contract.d.ts +2 -0
- package/dist/tests/public-api.contract.d.ts.map +1 -0
- package/dist/tests/public-api.contract.js +14 -0
- package/dist/tests/public-api.contract.js.map +1 -0
- package/dist/tests/public-api.contract.test.d.ts +2 -0
- package/dist/tests/public-api.contract.test.d.ts.map +1 -0
- package/dist/tests/public-api.contract.test.js +25 -0
- package/dist/tests/public-api.contract.test.js.map +1 -0
- package/dist/tests/redaction.test.d.ts +2 -0
- package/dist/tests/redaction.test.d.ts.map +1 -0
- package/dist/tests/redaction.test.js +23 -0
- package/dist/tests/redaction.test.js.map +1 -0
- package/dist/tests/retry-after-budget.test.d.ts +2 -0
- package/dist/tests/retry-after-budget.test.d.ts.map +1 -0
- package/dist/tests/retry-after-budget.test.js +72 -0
- package/dist/tests/retry-after-budget.test.js.map +1 -0
- package/dist/tests/retry-policy-trace.test.d.ts +2 -0
- package/dist/tests/retry-policy-trace.test.d.ts.map +1 -0
- package/dist/tests/retry-policy-trace.test.js +35 -0
- package/dist/tests/retry-policy-trace.test.js.map +1 -0
- package/dist/tests/retry-policy.test.d.ts +2 -0
- package/dist/tests/retry-policy.test.d.ts.map +1 -0
- package/dist/tests/retry-policy.test.js +51 -0
- package/dist/tests/retry-policy.test.js.map +1 -0
- package/dist/tests/retry.stress.d.ts +2 -0
- package/dist/tests/retry.stress.d.ts.map +1 -0
- package/dist/tests/retry.stress.js +21 -0
- package/dist/tests/retry.stress.js.map +1 -0
- package/dist/tests/retry.stress.test.d.ts +2 -0
- package/dist/tests/retry.stress.test.d.ts.map +1 -0
- package/dist/tests/retry.stress.test.js +21 -0
- package/dist/tests/retry.stress.test.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { retry } from "../src/middleware/retry";
|
|
3
|
+
import { HttpResponse } from "../src/response/response";
|
|
4
|
+
describe("retry rate limit awareness", () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.useRealTimers();
|
|
7
|
+
vi.restoreAllMocks();
|
|
8
|
+
});
|
|
9
|
+
it("honors Retry-After when it is longer than the base delay", async () => {
|
|
10
|
+
vi.useFakeTimers();
|
|
11
|
+
let attempts = 0;
|
|
12
|
+
const retryEvents = [];
|
|
13
|
+
const mw = retry({
|
|
14
|
+
maxRetries: 1,
|
|
15
|
+
delay: 10,
|
|
16
|
+
backoff: false,
|
|
17
|
+
retryOnStatus: [429],
|
|
18
|
+
respectRetryAfter: true,
|
|
19
|
+
onRetry: (event) => {
|
|
20
|
+
retryEvents.push({
|
|
21
|
+
waitTime: event.waitTime,
|
|
22
|
+
...(event.retryAfterMs !== undefined ? { retryAfterMs: event.retryAfterMs } : {}),
|
|
23
|
+
source: event.source,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
const promise = mw({
|
|
28
|
+
method: "GET",
|
|
29
|
+
url: "https://example.com",
|
|
30
|
+
}, async () => {
|
|
31
|
+
attempts += 1;
|
|
32
|
+
if (attempts === 1) {
|
|
33
|
+
return new HttpResponse(new Response("rate limited", {
|
|
34
|
+
status: 429,
|
|
35
|
+
headers: { "Retry-After": "1" },
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
return new HttpResponse(new Response("ok", { status: 200 }));
|
|
39
|
+
});
|
|
40
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
41
|
+
const response = await promise;
|
|
42
|
+
expect(attempts).toBe(2);
|
|
43
|
+
expect(response.status).toBe(200);
|
|
44
|
+
expect(retryEvents).toEqual([
|
|
45
|
+
{ waitTime: 1000, retryAfterMs: 1000, source: "status" },
|
|
46
|
+
]);
|
|
47
|
+
});
|
|
48
|
+
it("stops retrying when retry budget would be exceeded", async () => {
|
|
49
|
+
let attempts = 0;
|
|
50
|
+
const retryEvents = [];
|
|
51
|
+
const mw = retry({
|
|
52
|
+
maxRetries: 3,
|
|
53
|
+
delay: 50,
|
|
54
|
+
backoff: false,
|
|
55
|
+
retryBudgetMs: 10,
|
|
56
|
+
onRetry: (event) => {
|
|
57
|
+
retryEvents.push(event.waitTime);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
const response = await mw({
|
|
61
|
+
method: "GET",
|
|
62
|
+
url: "https://example.com",
|
|
63
|
+
}, async () => {
|
|
64
|
+
attempts += 1;
|
|
65
|
+
return new HttpResponse(new Response("temporary", { status: 500 }));
|
|
66
|
+
});
|
|
67
|
+
expect(attempts).toBe(1);
|
|
68
|
+
expect(response.status).toBe(500);
|
|
69
|
+
expect(retryEvents).toEqual([]);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=retry-after-budget.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-after-budget.test.js","sourceRoot":"","sources":["../../tests/retry-after-budget.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy-trace.test.d.ts","sourceRoot":"","sources":["../../tests/retry-policy-trace.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createClient, retry } from "../src/index";
|
|
3
|
+
import { createMiddlewareDiagnostics } from "../src/middleware/diagnostics";
|
|
4
|
+
describe("retry policy trace", () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.restoreAllMocks();
|
|
7
|
+
});
|
|
8
|
+
it("surfaces retry decisions through diagnostics events", async () => {
|
|
9
|
+
let attempts = 0;
|
|
10
|
+
const diagnostics = createMiddlewareDiagnostics();
|
|
11
|
+
const client = createClient()
|
|
12
|
+
.use(diagnostics.middleware)
|
|
13
|
+
.use(retry({
|
|
14
|
+
maxRetries: 1,
|
|
15
|
+
delay: 1,
|
|
16
|
+
backoff: false,
|
|
17
|
+
retryOnStatus: [500],
|
|
18
|
+
}));
|
|
19
|
+
const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async () => {
|
|
20
|
+
attempts += 1;
|
|
21
|
+
if (attempts === 1) {
|
|
22
|
+
return new Response("temporary", { status: 500 });
|
|
23
|
+
}
|
|
24
|
+
return new Response("ok", { status: 200 });
|
|
25
|
+
});
|
|
26
|
+
const response = await client.get("https://example.com/ping");
|
|
27
|
+
expect(response.status).toBe(200);
|
|
28
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
29
|
+
const snapshot = diagnostics.snapshot();
|
|
30
|
+
const event = snapshot.recentEvents[snapshot.recentEvents.length - 1];
|
|
31
|
+
expect(event?.policyTrace?.[0]?.policy).toBe("retry");
|
|
32
|
+
expect(event?.policyTrace?.[0]?.decision).toBe("retry");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=retry-policy-trace.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy-trace.test.js","sourceRoot":"","sources":["../../tests/retry-policy-trace.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,2BAA2B,EAAE,CAAC;QAElD,MAAM,MAAM,GAAG,YAAY,EAAE;aAC1B,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC;aAC3B,GAAG,CACF,KAAK,CAAC;YACJ,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,CAAC,GAAG,CAAC;SACrB,CAAC,CACH,CAAC;QAEJ,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC5E,QAAQ,IAAI,CAAC,CAAC;YACd,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC9D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy.test.d.ts","sourceRoot":"","sources":["../../tests/retry-policy.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { retry } from "../src/middleware/retry";
|
|
3
|
+
import { HttpResponse } from "../src/response/response";
|
|
4
|
+
describe("retry policy", () => {
|
|
5
|
+
it("retries on 5xx by default", async () => {
|
|
6
|
+
let attempts = 0;
|
|
7
|
+
const mw = retry({ maxRetries: 2, delay: 1, backoff: false });
|
|
8
|
+
const response = await mw({
|
|
9
|
+
method: "GET",
|
|
10
|
+
url: "https://example.com",
|
|
11
|
+
}, async () => {
|
|
12
|
+
attempts += 1;
|
|
13
|
+
if (attempts < 3) {
|
|
14
|
+
return new HttpResponse(new Response("err", { status: 500 }));
|
|
15
|
+
}
|
|
16
|
+
return new HttpResponse(new Response("ok", { status: 200 }));
|
|
17
|
+
});
|
|
18
|
+
expect(attempts).toBe(3);
|
|
19
|
+
expect(response.status).toBe(200);
|
|
20
|
+
});
|
|
21
|
+
it("does not retry 4xx by default", async () => {
|
|
22
|
+
let attempts = 0;
|
|
23
|
+
const mw = retry({ maxRetries: 3, delay: 1, backoff: false });
|
|
24
|
+
const response = await mw({
|
|
25
|
+
method: "GET",
|
|
26
|
+
url: "https://example.com",
|
|
27
|
+
}, async () => {
|
|
28
|
+
attempts += 1;
|
|
29
|
+
return new HttpResponse(new Response("bad", { status: 400 }));
|
|
30
|
+
});
|
|
31
|
+
expect(attempts).toBe(1);
|
|
32
|
+
expect(response.status).toBe(400);
|
|
33
|
+
});
|
|
34
|
+
it("retries only configured status when retryOnStatus is set", async () => {
|
|
35
|
+
let attempts = 0;
|
|
36
|
+
const mw = retry({ maxRetries: 3, delay: 1, backoff: false, retryOnStatus: [429] });
|
|
37
|
+
const response = await mw({
|
|
38
|
+
method: "GET",
|
|
39
|
+
url: "https://example.com",
|
|
40
|
+
}, async () => {
|
|
41
|
+
attempts += 1;
|
|
42
|
+
if (attempts < 2) {
|
|
43
|
+
return new HttpResponse(new Response("too many", { status: 429 }));
|
|
44
|
+
}
|
|
45
|
+
return new HttpResponse(new Response("ok", { status: 200 }));
|
|
46
|
+
});
|
|
47
|
+
expect(attempts).toBe(2);
|
|
48
|
+
expect(response.status).toBe(200);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=retry-policy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-policy.test.js","sourceRoot":"","sources":["../../tests/retry-policy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.stress.d.ts","sourceRoot":"","sources":["../../tests/retry.stress.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createClient, retry } from "../src/index";
|
|
3
|
+
describe("stress: retry loop", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("handles repeated request cycles without state leakage", async () => {
|
|
8
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("ok", { status: 200 }));
|
|
9
|
+
const client = createClient().use(retry({
|
|
10
|
+
maxRetries: 1,
|
|
11
|
+
delay: 0,
|
|
12
|
+
backoff: false,
|
|
13
|
+
}));
|
|
14
|
+
const iterations = 200;
|
|
15
|
+
for (let i = 0; i < iterations; i++) {
|
|
16
|
+
const result = await client.getResult("https://example.com/ping");
|
|
17
|
+
expect(result.ok).toBe(true);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=retry.stress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.stress.js","sourceRoot":"","sources":["../../tests/retry.stress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAEnD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAC/B,KAAK,CAAC;YACJ,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;QAEF,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.stress.test.d.ts","sourceRoot":"","sources":["../../tests/retry.stress.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createClient, retry } from "../src/index";
|
|
3
|
+
describe("stress: retry loop", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("handles repeated request cycles without state leakage", async () => {
|
|
8
|
+
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("ok", { status: 200 }));
|
|
9
|
+
const client = createClient().use(retry({
|
|
10
|
+
maxRetries: 1,
|
|
11
|
+
delay: 0,
|
|
12
|
+
backoff: false,
|
|
13
|
+
}));
|
|
14
|
+
const iterations = 200;
|
|
15
|
+
for (let i = 0; i < iterations; i++) {
|
|
16
|
+
const result = await client.getResult("https://example.com/ping");
|
|
17
|
+
expect(result.ok).toBe(true);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=retry.stress.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.stress.test.js","sourceRoot":"","sources":["../../tests/retry.stress.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAEnD,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAErF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAC/B,KAAK,CAAC;YACJ,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,KAAK;SACf,CAAC,CACH,CAAC;QAEF,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pureq/pureq",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Functional, immutable, and type-safe HTTP client layer with middleware composition.",
|
|
5
|
+
"main": "./dist/src/index.js",
|
|
6
|
+
"types": "./dist/src/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/src/index.d.ts",
|
|
10
|
+
"import": "./dist/src/index.js",
|
|
11
|
+
"default": "./dist/src/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"directories": {
|
|
18
|
+
"doc": "docs"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
23
|
+
"benchmark": "tsx ./scripts/benchmark.ts",
|
|
24
|
+
"test:browser": "vitest run tests/browser-runtime.smoke.test.ts --environment jsdom",
|
|
25
|
+
"test:edge": "esbuild scripts/edge-smoke-entry.ts --bundle --format=iife --platform=browser --outfile=.tmp/edge-smoke.bundle.js && node ./scripts/run-edge-smoke.mjs",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:watch": "vitest",
|
|
28
|
+
"test:unit": "vitest run tests --exclude tests/*.integration.test.ts --exclude tests/*.contract.test.ts --exclude tests/*.stress.test.ts",
|
|
29
|
+
"test:integration": "vitest run tests/client.integration.test.ts",
|
|
30
|
+
"test:contract": "vitest run tests/public-api.contract.test.ts",
|
|
31
|
+
"test:stress": "vitest run tests/retry.stress.test.ts",
|
|
32
|
+
"test:ci": "npm run test:unit && npm run test:integration && npm run test:contract && npm run test:stress && npm run typecheck"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"http",
|
|
36
|
+
"fetch",
|
|
37
|
+
"client",
|
|
38
|
+
"middleware",
|
|
39
|
+
"retry",
|
|
40
|
+
"circuit-breaker",
|
|
41
|
+
"typescript"
|
|
42
|
+
],
|
|
43
|
+
"author": "shiro-shihi",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/shiro-shihi/pureq.git"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/shiro-shihi/pureq/issues"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/shiro-shihi/pureq#readme",
|
|
53
|
+
"type": "module",
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@edge-runtime/vm": "^5.0.0",
|
|
56
|
+
"@types/node": "^24.5.2",
|
|
57
|
+
"esbuild": "^0.25.11",
|
|
58
|
+
"jsdom": "^27.0.0",
|
|
59
|
+
"tsx": "^4.20.6",
|
|
60
|
+
"typescript": "^6.0.2",
|
|
61
|
+
"vitest": "^3.2.4"
|
|
62
|
+
}
|
|
63
|
+
}
|