@pureq/pureq 1.1.6 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/fetchAdapter.d.ts.map +1 -0
- package/dist/adapters/fetchAdapter.js.map +1 -0
- package/dist/adapters/instrumentedAdapter.d.ts.map +1 -0
- package/dist/adapters/instrumentedAdapter.js.map +1 -0
- package/dist/adapters/storage/encryptedStorage.d.ts.map +1 -0
- package/dist/adapters/storage/encryptedStorage.js.map +1 -0
- package/dist/adapters/storage/indexedDBAdapter.d.ts.map +1 -0
- package/dist/adapters/storage/indexedDBAdapter.js.map +1 -0
- package/dist/client/createClient.d.ts.map +1 -0
- package/dist/client/createClient.js.map +1 -0
- package/dist/executor/execute.d.ts.map +1 -0
- package/dist/executor/execute.js.map +1 -0
- package/dist/index.d.ts +42 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/authRefresh.d.ts.map +1 -0
- package/dist/middleware/authRefresh.js.map +1 -0
- package/dist/middleware/circuitBreaker.d.ts.map +1 -0
- package/dist/middleware/circuitBreaker.js.map +1 -0
- package/dist/middleware/circuitBreakerKeys.d.ts.map +1 -0
- package/dist/middleware/circuitBreakerKeys.js.map +1 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/concurrencyLimit.d.ts.map +1 -0
- package/dist/middleware/concurrencyLimit.js.map +1 -0
- package/dist/middleware/deadline.d.ts.map +1 -0
- package/dist/middleware/deadline.js.map +1 -0
- package/dist/middleware/dedupe.d.ts.map +1 -0
- package/dist/middleware/dedupe.js.map +1 -0
- package/dist/middleware/defaultTimeout.d.ts.map +1 -0
- package/dist/middleware/defaultTimeout.js.map +1 -0
- package/dist/middleware/diagnostics.d.ts.map +1 -0
- package/dist/middleware/diagnostics.js.map +1 -0
- package/dist/middleware/diagnosticsExporters.d.ts.map +1 -0
- package/dist/middleware/diagnosticsExporters.js.map +1 -0
- package/dist/middleware/fallback.d.ts.map +1 -0
- package/dist/middleware/fallback.js.map +1 -0
- package/dist/middleware/hedge.d.ts.map +1 -0
- package/dist/middleware/hedge.js.map +1 -0
- package/dist/middleware/httpCache.d.ts.map +1 -0
- package/dist/middleware/httpCache.js.map +1 -0
- package/dist/middleware/idempotencyKey.d.ts.map +1 -0
- package/dist/middleware/idempotencyKey.js.map +1 -0
- package/dist/middleware/offlineQueue.d.ts.map +1 -0
- package/dist/middleware/offlineQueue.js.map +1 -0
- package/dist/middleware/presets.d.ts.map +1 -0
- package/dist/middleware/presets.js.map +1 -0
- package/dist/middleware/retry.d.ts.map +1 -0
- package/dist/middleware/retry.js.map +1 -0
- package/dist/middleware/stalePolicy.d.ts.map +1 -0
- package/dist/middleware/stalePolicy.js.map +1 -0
- package/dist/middleware/validation.d.ts.map +1 -0
- package/dist/middleware/validation.js.map +1 -0
- package/dist/node/fsAdapter.d.ts.map +1 -0
- package/dist/node/fsAdapter.js.map +1 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js.map +1 -0
- package/dist/observability/otelMapping.d.ts.map +1 -0
- package/dist/observability/otelMapping.js.map +1 -0
- package/dist/observability/otelProfiles.d.ts.map +1 -0
- package/dist/observability/otelProfiles.js.map +1 -0
- package/dist/observability/redaction.d.ts.map +1 -0
- package/dist/observability/redaction.js.map +1 -0
- package/dist/policy/guardrails.d.ts.map +1 -0
- package/dist/policy/guardrails.js.map +1 -0
- package/dist/response/response.d.ts.map +1 -0
- package/dist/response/response.js.map +1 -0
- package/dist/serializers/formUrlEncodedSerializer.d.ts.map +1 -0
- package/dist/serializers/formUrlEncodedSerializer.js.map +1 -0
- package/dist/serializers/jsonBodySerializer.d.ts.map +1 -0
- package/dist/serializers/jsonBodySerializer.js.map +1 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/{src/types → types}/events.js.map +1 -1
- package/dist/types/http.d.ts.map +1 -0
- package/dist/{src/types → types}/http.js.map +1 -1
- package/dist/types/internal.d.ts.map +1 -0
- package/dist/types/internal.js.map +1 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js.map +1 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/policyTrace.d.ts.map +1 -0
- package/dist/utils/policyTrace.js.map +1 -0
- package/dist/utils/stableKey.d.ts.map +1 -0
- package/dist/utils/stableKey.js.map +1 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +19 -19
- package/README.md +0 -88
- package/dist/scripts/benchmark.d.ts +0 -2
- package/dist/scripts/benchmark.d.ts.map +0 -1
- package/dist/scripts/benchmark.js +0 -69
- package/dist/scripts/benchmark.js.map +0 -1
- package/dist/scripts/edge-smoke-entry.d.ts +0 -8
- package/dist/scripts/edge-smoke-entry.d.ts.map +0 -1
- package/dist/scripts/edge-smoke-entry.js +0 -23
- package/dist/scripts/edge-smoke-entry.js.map +0 -1
- package/dist/src/adapters/fetchAdapter.d.ts.map +0 -1
- package/dist/src/adapters/fetchAdapter.js.map +0 -1
- package/dist/src/adapters/instrumentedAdapter.d.ts.map +0 -1
- package/dist/src/adapters/instrumentedAdapter.js.map +0 -1
- package/dist/src/adapters/storage/encryptedStorage.d.ts.map +0 -1
- package/dist/src/adapters/storage/encryptedStorage.js.map +0 -1
- package/dist/src/adapters/storage/indexedDBAdapter.d.ts.map +0 -1
- package/dist/src/adapters/storage/indexedDBAdapter.js.map +0 -1
- package/dist/src/client/createClient.d.ts.map +0 -1
- package/dist/src/client/createClient.js.map +0 -1
- package/dist/src/executor/execute.d.ts.map +0 -1
- package/dist/src/executor/execute.js.map +0 -1
- package/dist/src/index.d.ts +0 -43
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -42
- package/dist/src/index.js.map +0 -1
- package/dist/src/middleware/authRefresh.d.ts.map +0 -1
- package/dist/src/middleware/authRefresh.js.map +0 -1
- package/dist/src/middleware/circuitBreaker.d.ts.map +0 -1
- package/dist/src/middleware/circuitBreaker.js.map +0 -1
- package/dist/src/middleware/circuitBreakerKeys.d.ts.map +0 -1
- package/dist/src/middleware/circuitBreakerKeys.js.map +0 -1
- package/dist/src/middleware/compose.d.ts.map +0 -1
- package/dist/src/middleware/compose.js.map +0 -1
- package/dist/src/middleware/concurrencyLimit.d.ts.map +0 -1
- package/dist/src/middleware/concurrencyLimit.js.map +0 -1
- package/dist/src/middleware/deadline.d.ts.map +0 -1
- package/dist/src/middleware/deadline.js.map +0 -1
- package/dist/src/middleware/dedupe.d.ts.map +0 -1
- package/dist/src/middleware/dedupe.js.map +0 -1
- package/dist/src/middleware/defaultTimeout.d.ts.map +0 -1
- package/dist/src/middleware/defaultTimeout.js.map +0 -1
- package/dist/src/middleware/diagnostics.d.ts.map +0 -1
- package/dist/src/middleware/diagnostics.js.map +0 -1
- package/dist/src/middleware/diagnosticsExporters.d.ts.map +0 -1
- package/dist/src/middleware/diagnosticsExporters.js.map +0 -1
- package/dist/src/middleware/fallback.d.ts.map +0 -1
- package/dist/src/middleware/fallback.js.map +0 -1
- package/dist/src/middleware/hedge.d.ts.map +0 -1
- package/dist/src/middleware/hedge.js.map +0 -1
- package/dist/src/middleware/httpCache.d.ts.map +0 -1
- package/dist/src/middleware/httpCache.js.map +0 -1
- package/dist/src/middleware/idempotencyKey.d.ts.map +0 -1
- package/dist/src/middleware/idempotencyKey.js.map +0 -1
- package/dist/src/middleware/offlineQueue.d.ts.map +0 -1
- package/dist/src/middleware/offlineQueue.js.map +0 -1
- package/dist/src/middleware/presets.d.ts.map +0 -1
- package/dist/src/middleware/presets.js.map +0 -1
- package/dist/src/middleware/retry.d.ts.map +0 -1
- package/dist/src/middleware/retry.js.map +0 -1
- package/dist/src/middleware/stalePolicy.d.ts.map +0 -1
- package/dist/src/middleware/stalePolicy.js.map +0 -1
- package/dist/src/middleware/validation.d.ts.map +0 -1
- package/dist/src/middleware/validation.js.map +0 -1
- package/dist/src/node/fsAdapter.d.ts.map +0 -1
- package/dist/src/node/fsAdapter.js.map +0 -1
- package/dist/src/node/index.d.ts.map +0 -1
- package/dist/src/node/index.js.map +0 -1
- package/dist/src/observability/otelMapping.d.ts.map +0 -1
- package/dist/src/observability/otelMapping.js.map +0 -1
- package/dist/src/observability/otelProfiles.d.ts.map +0 -1
- package/dist/src/observability/otelProfiles.js.map +0 -1
- package/dist/src/observability/redaction.d.ts.map +0 -1
- package/dist/src/observability/redaction.js.map +0 -1
- package/dist/src/policy/guardrails.d.ts.map +0 -1
- package/dist/src/policy/guardrails.js.map +0 -1
- package/dist/src/response/response.d.ts.map +0 -1
- package/dist/src/response/response.js.map +0 -1
- package/dist/src/serializers/formUrlEncodedSerializer.d.ts.map +0 -1
- package/dist/src/serializers/formUrlEncodedSerializer.js.map +0 -1
- package/dist/src/serializers/jsonBodySerializer.d.ts.map +0 -1
- package/dist/src/serializers/jsonBodySerializer.js.map +0 -1
- package/dist/src/types/events.d.ts.map +0 -1
- package/dist/src/types/http.d.ts.map +0 -1
- package/dist/src/types/internal.d.ts.map +0 -1
- package/dist/src/types/internal.js.map +0 -1
- package/dist/src/types/result.d.ts.map +0 -1
- package/dist/src/types/result.js.map +0 -1
- package/dist/src/utils/crypto.d.ts.map +0 -1
- package/dist/src/utils/crypto.js.map +0 -1
- package/dist/src/utils/policyTrace.d.ts.map +0 -1
- package/dist/src/utils/policyTrace.js.map +0 -1
- package/dist/src/utils/stableKey.d.ts.map +0 -1
- package/dist/src/utils/stableKey.js.map +0 -1
- package/dist/src/utils/url.d.ts.map +0 -1
- package/dist/src/utils/url.js.map +0 -1
- package/dist/tests/adapter-serializer.test.d.ts +0 -2
- package/dist/tests/adapter-serializer.test.d.ts.map +0 -1
- package/dist/tests/adapter-serializer.test.js +0 -59
- package/dist/tests/adapter-serializer.test.js.map +0 -1
- package/dist/tests/auth-refresh.test.d.ts +0 -2
- package/dist/tests/auth-refresh.test.d.ts.map +0 -1
- package/dist/tests/auth-refresh.test.js +0 -75
- package/dist/tests/auth-refresh.test.js.map +0 -1
- package/dist/tests/browser-runtime.smoke.test.d.ts +0 -2
- package/dist/tests/browser-runtime.smoke.test.d.ts.map +0 -1
- package/dist/tests/browser-runtime.smoke.test.js +0 -17
- package/dist/tests/browser-runtime.smoke.test.js.map +0 -1
- package/dist/tests/chaos-heavy.test.d.ts +0 -2
- package/dist/tests/chaos-heavy.test.d.ts.map +0 -1
- package/dist/tests/chaos-heavy.test.js +0 -164
- package/dist/tests/chaos-heavy.test.js.map +0 -1
- package/dist/tests/circuit-breaker.test.d.ts +0 -2
- package/dist/tests/circuit-breaker.test.d.ts.map +0 -1
- package/dist/tests/circuit-breaker.test.js +0 -184
- package/dist/tests/circuit-breaker.test.js.map +0 -1
- package/dist/tests/client.integration.test.d.ts +0 -2
- package/dist/tests/client.integration.test.d.ts.map +0 -1
- package/dist/tests/client.integration.test.js +0 -63
- package/dist/tests/client.integration.test.js.map +0 -1
- package/dist/tests/compose.test.d.ts +0 -2
- package/dist/tests/compose.test.d.ts.map +0 -1
- package/dist/tests/compose.test.js +0 -25
- package/dist/tests/compose.test.js.map +0 -1
- package/dist/tests/concurrency-limit.test.d.ts +0 -2
- package/dist/tests/concurrency-limit.test.d.ts.map +0 -1
- package/dist/tests/concurrency-limit.test.js +0 -87
- package/dist/tests/concurrency-limit.test.js.map +0 -1
- package/dist/tests/crypto-utils.test.d.ts +0 -2
- package/dist/tests/crypto-utils.test.d.ts.map +0 -1
- package/dist/tests/crypto-utils.test.js +0 -39
- package/dist/tests/crypto-utils.test.js.map +0 -1
- package/dist/tests/deadline-middleware.test.d.ts +0 -2
- package/dist/tests/deadline-middleware.test.d.ts.map +0 -1
- package/dist/tests/deadline-middleware.test.js +0 -38
- package/dist/tests/deadline-middleware.test.js.map +0 -1
- package/dist/tests/dedupe-middleware.test.d.ts +0 -2
- package/dist/tests/dedupe-middleware.test.d.ts.map +0 -1
- package/dist/tests/dedupe-middleware.test.js +0 -56
- package/dist/tests/dedupe-middleware.test.js.map +0 -1
- package/dist/tests/default-timeout.test.d.ts +0 -2
- package/dist/tests/default-timeout.test.d.ts.map +0 -1
- package/dist/tests/default-timeout.test.js +0 -28
- package/dist/tests/default-timeout.test.js.map +0 -1
- package/dist/tests/diagnostics-exporters.test.d.ts +0 -2
- package/dist/tests/diagnostics-exporters.test.d.ts.map +0 -1
- package/dist/tests/diagnostics-exporters.test.js +0 -41
- package/dist/tests/diagnostics-exporters.test.js.map +0 -1
- package/dist/tests/diagnostics.test.d.ts +0 -2
- package/dist/tests/diagnostics.test.d.ts.map +0 -1
- package/dist/tests/diagnostics.test.js +0 -38
- package/dist/tests/diagnostics.test.js.map +0 -1
- package/dist/tests/error-metadata.test.d.ts +0 -2
- package/dist/tests/error-metadata.test.d.ts.map +0 -1
- package/dist/tests/error-metadata.test.js +0 -23
- package/dist/tests/error-metadata.test.js.map +0 -1
- package/dist/tests/execute-timeout.test.d.ts +0 -2
- package/dist/tests/execute-timeout.test.d.ts.map +0 -1
- package/dist/tests/execute-timeout.test.js +0 -30
- package/dist/tests/execute-timeout.test.js.map +0 -1
- package/dist/tests/fallback-validation-stale-policy.test.d.ts +0 -2
- package/dist/tests/fallback-validation-stale-policy.test.d.ts.map +0 -1
- package/dist/tests/fallback-validation-stale-policy.test.js +0 -138
- package/dist/tests/fallback-validation-stale-policy.test.js.map +0 -1
- package/dist/tests/form-serializer.test.d.ts +0 -2
- package/dist/tests/form-serializer.test.d.ts.map +0 -1
- package/dist/tests/form-serializer.test.js +0 -16
- package/dist/tests/form-serializer.test.js.map +0 -1
- package/dist/tests/hedge.test.d.ts +0 -2
- package/dist/tests/hedge.test.d.ts.map +0 -1
- package/dist/tests/hedge.test.js +0 -45
- package/dist/tests/hedge.test.js.map +0 -1
- package/dist/tests/http-cache.test.d.ts +0 -2
- package/dist/tests/http-cache.test.d.ts.map +0 -1
- package/dist/tests/http-cache.test.js +0 -60
- package/dist/tests/http-cache.test.js.map +0 -1
- package/dist/tests/idempotency-key.test.d.ts +0 -2
- package/dist/tests/idempotency-key.test.d.ts.map +0 -1
- package/dist/tests/idempotency-key.test.js +0 -31
- package/dist/tests/idempotency-key.test.js.map +0 -1
- package/dist/tests/instrumented-adapter.test.d.ts +0 -2
- package/dist/tests/instrumented-adapter.test.d.ts.map +0 -1
- package/dist/tests/instrumented-adapter.test.js +0 -33
- package/dist/tests/instrumented-adapter.test.js.map +0 -1
- package/dist/tests/interceptor-order.test.d.ts +0 -2
- package/dist/tests/interceptor-order.test.d.ts.map +0 -1
- package/dist/tests/interceptor-order.test.js +0 -38
- package/dist/tests/interceptor-order.test.js.map +0 -1
- package/dist/tests/invariant-fuzz.test.d.ts +0 -2
- package/dist/tests/invariant-fuzz.test.d.ts.map +0 -1
- package/dist/tests/invariant-fuzz.test.js +0 -149
- package/dist/tests/invariant-fuzz.test.js.map +0 -1
- package/dist/tests/json-helper.test.d.ts +0 -2
- package/dist/tests/json-helper.test.d.ts.map +0 -1
- package/dist/tests/json-helper.test.js +0 -42
- package/dist/tests/json-helper.test.js.map +0 -1
- package/dist/tests/observability.test.d.ts +0 -2
- package/dist/tests/observability.test.d.ts.map +0 -1
- package/dist/tests/observability.test.js +0 -59
- package/dist/tests/observability.test.js.map +0 -1
- package/dist/tests/offline-queue.test.d.ts +0 -2
- package/dist/tests/offline-queue.test.d.ts.map +0 -1
- package/dist/tests/offline-queue.test.js +0 -35
- package/dist/tests/offline-queue.test.js.map +0 -1
- package/dist/tests/otel-mapping.test.d.ts +0 -2
- package/dist/tests/otel-mapping.test.d.ts.map +0 -1
- package/dist/tests/otel-mapping.test.js +0 -20
- package/dist/tests/otel-mapping.test.js.map +0 -1
- package/dist/tests/policy-guardrails.test.d.ts +0 -2
- package/dist/tests/policy-guardrails.test.d.ts.map +0 -1
- package/dist/tests/policy-guardrails.test.js +0 -25
- package/dist/tests/policy-guardrails.test.js.map +0 -1
- package/dist/tests/presets.test.d.ts +0 -2
- package/dist/tests/presets.test.d.ts.map +0 -1
- package/dist/tests/presets.test.js +0 -41
- package/dist/tests/presets.test.js.map +0 -1
- package/dist/tests/public-api.contract.test.d.ts +0 -2
- package/dist/tests/public-api.contract.test.d.ts.map +0 -1
- package/dist/tests/public-api.contract.test.js +0 -25
- package/dist/tests/public-api.contract.test.js.map +0 -1
- package/dist/tests/redaction.test.d.ts +0 -2
- package/dist/tests/redaction.test.d.ts.map +0 -1
- package/dist/tests/redaction.test.js +0 -23
- package/dist/tests/redaction.test.js.map +0 -1
- package/dist/tests/resilience-shock.test.d.ts +0 -2
- package/dist/tests/resilience-shock.test.d.ts.map +0 -1
- package/dist/tests/resilience-shock.test.js +0 -114
- package/dist/tests/resilience-shock.test.js.map +0 -1
- package/dist/tests/retry-after-budget.test.d.ts +0 -2
- package/dist/tests/retry-after-budget.test.d.ts.map +0 -1
- package/dist/tests/retry-after-budget.test.js +0 -72
- package/dist/tests/retry-after-budget.test.js.map +0 -1
- package/dist/tests/retry-policy-trace.test.d.ts +0 -2
- package/dist/tests/retry-policy-trace.test.d.ts.map +0 -1
- package/dist/tests/retry-policy-trace.test.js +0 -35
- package/dist/tests/retry-policy-trace.test.js.map +0 -1
- package/dist/tests/retry-policy.test.d.ts +0 -2
- package/dist/tests/retry-policy.test.d.ts.map +0 -1
- package/dist/tests/retry-policy.test.js +0 -51
- package/dist/tests/retry-policy.test.js.map +0 -1
- package/dist/tests/retry.stress.test.d.ts +0 -2
- package/dist/tests/retry.stress.test.d.ts.map +0 -1
- package/dist/tests/retry.stress.test.js +0 -21
- package/dist/tests/retry.stress.test.js.map +0 -1
- package/dist/tests/storage-adapters.test.d.ts +0 -2
- package/dist/tests/storage-adapters.test.d.ts.map +0 -1
- package/dist/tests/storage-adapters.test.js +0 -109
- package/dist/tests/storage-adapters.test.js.map +0 -1
- package/dist/tests/traffic-load.test.d.ts +0 -2
- package/dist/tests/traffic-load.test.d.ts.map +0 -1
- package/dist/tests/traffic-load.test.js +0 -91
- package/dist/tests/traffic-load.test.js.map +0 -1
- /package/dist/{src/adapters → adapters}/fetchAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/fetchAdapter.js +0 -0
- /package/dist/{src/adapters → adapters}/instrumentedAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/instrumentedAdapter.js +0 -0
- /package/dist/{src/adapters → adapters}/storage/encryptedStorage.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/storage/encryptedStorage.js +0 -0
- /package/dist/{src/adapters → adapters}/storage/indexedDBAdapter.d.ts +0 -0
- /package/dist/{src/adapters → adapters}/storage/indexedDBAdapter.js +0 -0
- /package/dist/{src/client → client}/createClient.d.ts +0 -0
- /package/dist/{src/client → client}/createClient.js +0 -0
- /package/dist/{src/executor → executor}/execute.d.ts +0 -0
- /package/dist/{src/executor → executor}/execute.js +0 -0
- /package/dist/{src/middleware → middleware}/authRefresh.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/authRefresh.js +0 -0
- /package/dist/{src/middleware → middleware}/circuitBreaker.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/circuitBreaker.js +0 -0
- /package/dist/{src/middleware → middleware}/circuitBreakerKeys.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/circuitBreakerKeys.js +0 -0
- /package/dist/{src/middleware → middleware}/compose.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/compose.js +0 -0
- /package/dist/{src/middleware → middleware}/concurrencyLimit.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/concurrencyLimit.js +0 -0
- /package/dist/{src/middleware → middleware}/deadline.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/deadline.js +0 -0
- /package/dist/{src/middleware → middleware}/dedupe.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/dedupe.js +0 -0
- /package/dist/{src/middleware → middleware}/defaultTimeout.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/defaultTimeout.js +0 -0
- /package/dist/{src/middleware → middleware}/diagnostics.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/diagnostics.js +0 -0
- /package/dist/{src/middleware → middleware}/diagnosticsExporters.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/diagnosticsExporters.js +0 -0
- /package/dist/{src/middleware → middleware}/fallback.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/fallback.js +0 -0
- /package/dist/{src/middleware → middleware}/hedge.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/hedge.js +0 -0
- /package/dist/{src/middleware → middleware}/httpCache.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/httpCache.js +0 -0
- /package/dist/{src/middleware → middleware}/idempotencyKey.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/idempotencyKey.js +0 -0
- /package/dist/{src/middleware → middleware}/offlineQueue.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/offlineQueue.js +0 -0
- /package/dist/{src/middleware → middleware}/presets.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/presets.js +0 -0
- /package/dist/{src/middleware → middleware}/retry.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/retry.js +0 -0
- /package/dist/{src/middleware → middleware}/stalePolicy.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/stalePolicy.js +0 -0
- /package/dist/{src/middleware → middleware}/validation.d.ts +0 -0
- /package/dist/{src/middleware → middleware}/validation.js +0 -0
- /package/dist/{src/node → node}/fsAdapter.d.ts +0 -0
- /package/dist/{src/node → node}/fsAdapter.js +0 -0
- /package/dist/{src/node → node}/index.d.ts +0 -0
- /package/dist/{src/node → node}/index.js +0 -0
- /package/dist/{src/observability → observability}/otelMapping.d.ts +0 -0
- /package/dist/{src/observability → observability}/otelMapping.js +0 -0
- /package/dist/{src/observability → observability}/otelProfiles.d.ts +0 -0
- /package/dist/{src/observability → observability}/otelProfiles.js +0 -0
- /package/dist/{src/observability → observability}/redaction.d.ts +0 -0
- /package/dist/{src/observability → observability}/redaction.js +0 -0
- /package/dist/{src/policy → policy}/guardrails.d.ts +0 -0
- /package/dist/{src/policy → policy}/guardrails.js +0 -0
- /package/dist/{src/response → response}/response.d.ts +0 -0
- /package/dist/{src/response → response}/response.js +0 -0
- /package/dist/{src/serializers → serializers}/formUrlEncodedSerializer.d.ts +0 -0
- /package/dist/{src/serializers → serializers}/formUrlEncodedSerializer.js +0 -0
- /package/dist/{src/serializers → serializers}/jsonBodySerializer.d.ts +0 -0
- /package/dist/{src/serializers → serializers}/jsonBodySerializer.js +0 -0
- /package/dist/{src/types → types}/events.d.ts +0 -0
- /package/dist/{src/types → types}/events.js +0 -0
- /package/dist/{src/types → types}/http.d.ts +0 -0
- /package/dist/{src/types → types}/http.js +0 -0
- /package/dist/{src/types → types}/internal.d.ts +0 -0
- /package/dist/{src/types → types}/internal.js +0 -0
- /package/dist/{src/types → types}/result.d.ts +0 -0
- /package/dist/{src/types → types}/result.js +0 -0
- /package/dist/{src/utils → utils}/crypto.d.ts +0 -0
- /package/dist/{src/utils → utils}/crypto.js +0 -0
- /package/dist/{src/utils → utils}/policyTrace.d.ts +0 -0
- /package/dist/{src/utils → utils}/policyTrace.js +0 -0
- /package/dist/{src/utils → utils}/stableKey.d.ts +0 -0
- /package/dist/{src/utils → utils}/stableKey.js +0 -0
- /package/dist/{src/utils → utils}/url.d.ts +0 -0
- /package/dist/{src/utils → utils}/url.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-timeout.test.js","sourceRoot":"","sources":["../../tests/execute-timeout.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,SAAS,GAAG,EAAE;aACjB,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC;aAC1B,kBAAkB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;YAC9B,OAAO,IAAI,OAAO,CAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBACzC,IAAI,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;oBACnD,OAAO;gBACT,CAAC;gBACD,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC3C,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEL,MAAM,OAAO,GAAG,OAAO,CAAC;YACtB,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,qBAAqB;YAC1B,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fallback-validation-stale-policy.test.d.ts","sourceRoot":"","sources":["../../tests/fallback-validation-stale-policy.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { fallback } from "../src/middleware/fallback";
|
|
3
|
-
import { validation } from "../src/middleware/validation";
|
|
4
|
-
import { resolveStalePolicy } from "../src/middleware/stalePolicy";
|
|
5
|
-
import { HttpResponse } from "../src/response/response";
|
|
6
|
-
import { getPolicyTrace } from "../src/utils/policyTrace";
|
|
7
|
-
describe("fallback middleware", () => {
|
|
8
|
-
it("returns fallback value on thrown error", async () => {
|
|
9
|
-
const mw = fallback({
|
|
10
|
-
value: new HttpResponse(new Response("fallback", { status: 200 })),
|
|
11
|
-
});
|
|
12
|
-
const req = { method: "GET", url: "/unstable" };
|
|
13
|
-
const res = await mw(req, async () => {
|
|
14
|
-
throw new Error("boom");
|
|
15
|
-
});
|
|
16
|
-
expect(res.status).toBe(200);
|
|
17
|
-
expect(await res.text()).toBe("fallback");
|
|
18
|
-
expect(getPolicyTrace(req)).toHaveLength(1);
|
|
19
|
-
});
|
|
20
|
-
it("can fallback on non-ok response when when() returns true", async () => {
|
|
21
|
-
const mw = fallback({
|
|
22
|
-
when: (trigger) => trigger.type === "response" && trigger.response.status === 503,
|
|
23
|
-
value: ({ type }) => new HttpResponse(new Response(`from-${type}`, { status: 200 })),
|
|
24
|
-
});
|
|
25
|
-
const res = await mw({ method: "GET", url: "/service" }, async () => {
|
|
26
|
-
return new HttpResponse(new Response("down", { status: 503 }));
|
|
27
|
-
});
|
|
28
|
-
expect(res.status).toBe(200);
|
|
29
|
-
expect(await res.text()).toBe("from-response");
|
|
30
|
-
});
|
|
31
|
-
it("does not fallback on non-ok response by default", async () => {
|
|
32
|
-
const mw = fallback({
|
|
33
|
-
value: new HttpResponse(new Response("fallback", { status: 200 })),
|
|
34
|
-
});
|
|
35
|
-
const res = await mw({ method: "GET", url: "/service" }, async () => {
|
|
36
|
-
return new HttpResponse(new Response("bad", { status: 500 }));
|
|
37
|
-
});
|
|
38
|
-
expect(res.status).toBe(500);
|
|
39
|
-
});
|
|
40
|
-
it("rethrows error when when() returns false", async () => {
|
|
41
|
-
const mw = fallback({
|
|
42
|
-
when: () => false,
|
|
43
|
-
value: new HttpResponse(new Response("fallback", { status: 200 })),
|
|
44
|
-
});
|
|
45
|
-
await expect(mw({ method: "GET", url: "/x" }, async () => {
|
|
46
|
-
throw new Error("boom");
|
|
47
|
-
})).rejects.toThrow("boom");
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe("validation middleware", () => {
|
|
51
|
-
it("passes when validate succeeds", async () => {
|
|
52
|
-
const validate = vi.fn(async (data) => {
|
|
53
|
-
expect(data).toEqual({ ok: true });
|
|
54
|
-
return true;
|
|
55
|
-
});
|
|
56
|
-
const mw = validation({ validate });
|
|
57
|
-
const res = await mw({ method: "GET", url: "/x" }, async () => {
|
|
58
|
-
return new HttpResponse(new Response(JSON.stringify({ ok: true }), {
|
|
59
|
-
status: 200,
|
|
60
|
-
headers: { "content-type": "application/json" },
|
|
61
|
-
}));
|
|
62
|
-
});
|
|
63
|
-
expect(res.status).toBe(200);
|
|
64
|
-
expect(validate).toHaveBeenCalledTimes(1);
|
|
65
|
-
});
|
|
66
|
-
it("skips validation for non-ok responses", async () => {
|
|
67
|
-
const validate = vi.fn(() => true);
|
|
68
|
-
const mw = validation({ validate });
|
|
69
|
-
const res = await mw({ method: "GET", url: "/x" }, async () => {
|
|
70
|
-
return new HttpResponse(new Response("bad", { status: 500 }));
|
|
71
|
-
});
|
|
72
|
-
expect(res.status).toBe(500);
|
|
73
|
-
expect(validate).not.toHaveBeenCalled();
|
|
74
|
-
});
|
|
75
|
-
it("throws wrapped validation error with custom message factory", async () => {
|
|
76
|
-
const mw = validation({
|
|
77
|
-
validate: () => false,
|
|
78
|
-
message: (data) => `invalid:${JSON.stringify(data)}`,
|
|
79
|
-
});
|
|
80
|
-
await expect(mw({ method: "GET", url: "/x" }, async () => {
|
|
81
|
-
return new HttpResponse(new Response(JSON.stringify({ id: "u1" }), {
|
|
82
|
-
status: 200,
|
|
83
|
-
headers: { "content-type": "application/json" },
|
|
84
|
-
}));
|
|
85
|
-
})).rejects.toMatchObject({
|
|
86
|
-
message: "invalid:{\"id\":\"u1\"}",
|
|
87
|
-
code: "PUREQ_VALIDATION_ERROR",
|
|
88
|
-
kind: "validation-error",
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
it("returns response in silent mode when validation fails", async () => {
|
|
92
|
-
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
93
|
-
const mw = validation({
|
|
94
|
-
validate: () => null,
|
|
95
|
-
silent: true,
|
|
96
|
-
});
|
|
97
|
-
const res = await mw({ method: "GET", url: "/x" }, async () => {
|
|
98
|
-
return new HttpResponse(new Response(JSON.stringify({ id: "u1" }), {
|
|
99
|
-
status: 200,
|
|
100
|
-
headers: { "content-type": "application/json" },
|
|
101
|
-
}));
|
|
102
|
-
});
|
|
103
|
-
expect(res.status).toBe(200);
|
|
104
|
-
expect(warnSpy).toHaveBeenCalled();
|
|
105
|
-
warnSpy.mockRestore();
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
describe("resolveStalePolicy", () => {
|
|
109
|
-
it("marks fresh and stale-if-error within bounds", () => {
|
|
110
|
-
const result = resolveStalePolicy({
|
|
111
|
-
storedAt: 100,
|
|
112
|
-
now: 150,
|
|
113
|
-
ttlMs: 60,
|
|
114
|
-
staleIfErrorMs: 20,
|
|
115
|
-
});
|
|
116
|
-
expect(result.ageMs).toBe(50);
|
|
117
|
-
expect(result.isFresh).toBe(true);
|
|
118
|
-
expect(result.canServeStaleOnError).toBe(true);
|
|
119
|
-
});
|
|
120
|
-
it("clamps negative age and expires stale-if-error after window", () => {
|
|
121
|
-
const futureStored = resolveStalePolicy({
|
|
122
|
-
storedAt: 200,
|
|
123
|
-
now: 100,
|
|
124
|
-
ttlMs: 10,
|
|
125
|
-
staleIfErrorMs: 5,
|
|
126
|
-
});
|
|
127
|
-
expect(futureStored.ageMs).toBe(0);
|
|
128
|
-
const expired = resolveStalePolicy({
|
|
129
|
-
storedAt: 100,
|
|
130
|
-
now: 130,
|
|
131
|
-
ttlMs: 10,
|
|
132
|
-
staleIfErrorMs: 5,
|
|
133
|
-
});
|
|
134
|
-
expect(expired.isFresh).toBe(false);
|
|
135
|
-
expect(expired.canServeStaleOnError).toBe(false);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
//# sourceMappingURL=fallback-validation-stale-policy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fallback-validation-stale-policy.test.js","sourceRoot":"","sources":["../../tests/fallback-validation-stale-policy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-serializer.test.d.ts","sourceRoot":"","sources":["../../tests/form-serializer.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { createFormUrlEncodedSerializer } from "../src/serializers/formUrlEncodedSerializer";
|
|
3
|
-
describe("form urlencoded serializer", () => {
|
|
4
|
-
it("serializes object with repeated array keys by default", () => {
|
|
5
|
-
const serializer = createFormUrlEncodedSerializer();
|
|
6
|
-
const result = serializer.serialize({ a: 1, tags: ["x", "y"] });
|
|
7
|
-
expect(result.contentType).toBe("application/x-www-form-urlencoded");
|
|
8
|
-
expect(result.payload).toBe("a=1&tags=x&tags=y");
|
|
9
|
-
});
|
|
10
|
-
it("serializes arrays as comma-separated when configured", () => {
|
|
11
|
-
const serializer = createFormUrlEncodedSerializer({ arrayMode: "comma" });
|
|
12
|
-
const result = serializer.serialize({ tags: ["x", "y"] });
|
|
13
|
-
expect(result.payload).toBe("tags=x%2Cy");
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
//# sourceMappingURL=form-serializer.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form-serializer.test.js","sourceRoot":"","sources":["../../tests/form-serializer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAE7F,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,UAAU,GAAG,8BAA8B,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,UAAU,GAAG,8BAA8B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hedge.test.d.ts","sourceRoot":"","sources":["../../tests/hedge.test.ts"],"names":[],"mappings":""}
|
package/dist/tests/hedge.test.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { hedge } from "../src/middleware/hedge";
|
|
3
|
-
import { HttpResponse } from "../src/response/response";
|
|
4
|
-
describe("hedge middleware", () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
vi.restoreAllMocks();
|
|
7
|
-
vi.useRealTimers();
|
|
8
|
-
});
|
|
9
|
-
it("launches a hedged request after the configured delay and returns the first success", async () => {
|
|
10
|
-
vi.useFakeTimers();
|
|
11
|
-
let firstResolve;
|
|
12
|
-
const firstPromise = new Promise((resolve) => {
|
|
13
|
-
firstResolve = resolve;
|
|
14
|
-
});
|
|
15
|
-
const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async () => {
|
|
16
|
-
if (fetchMock.mock.calls.length === 1) {
|
|
17
|
-
return firstPromise;
|
|
18
|
-
}
|
|
19
|
-
return new Response(JSON.stringify({ id: "fast" }), {
|
|
20
|
-
status: 200,
|
|
21
|
-
headers: { "content-type": "application/json" },
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
const mw = hedge({ hedgeAfterMs: 25 });
|
|
25
|
-
const request = mw({
|
|
26
|
-
method: "GET",
|
|
27
|
-
url: "https://example.com/users/:id",
|
|
28
|
-
params: { id: "u1" },
|
|
29
|
-
}, async (req) => new HttpResponse(await fetch(req.url, {
|
|
30
|
-
method: req.method,
|
|
31
|
-
...(req.signal !== undefined ? { signal: req.signal } : {}),
|
|
32
|
-
})));
|
|
33
|
-
await vi.advanceTimersByTimeAsync(25);
|
|
34
|
-
await Promise.resolve();
|
|
35
|
-
firstResolve(new Response(JSON.stringify({ id: "slow" }), {
|
|
36
|
-
status: 200,
|
|
37
|
-
headers: { "content-type": "application/json" },
|
|
38
|
-
}));
|
|
39
|
-
const response = await request;
|
|
40
|
-
expect(response.status).toBe(200);
|
|
41
|
-
expect(await response.json()).toEqual({ id: "fast" });
|
|
42
|
-
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
//# sourceMappingURL=hedge.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hedge.test.js","sourceRoot":"","sources":["../../tests/hedge.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,IAAI,YAAwC,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,EAAE;YACrD,YAAY,GAAG,OAAO,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;YAC5E,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;gBAClD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,EAAE,CAChB;YACE,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,+BAA+B;YACpC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,CACZ,IAAI,YAAY,CACd,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACnB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CACH,CACJ,CAAC;QAEF,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAExB,YAAY,CACV,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;YAC3C,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACH,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http-cache.test.d.ts","sourceRoot":"","sources":["../../tests/http-cache.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { httpCache } from "../src/middleware/httpCache";
|
|
3
|
-
import { HttpResponse } from "../src/response/response";
|
|
4
|
-
describe("http cache middleware", () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
vi.restoreAllMocks();
|
|
7
|
-
vi.useRealTimers();
|
|
8
|
-
});
|
|
9
|
-
it("serves fresh cached responses without calling the downstream handler again", async () => {
|
|
10
|
-
const mw = httpCache({ ttlMs: 1000 });
|
|
11
|
-
let calls = 0;
|
|
12
|
-
const first = await mw({
|
|
13
|
-
method: "GET",
|
|
14
|
-
url: "https://example.com/users/1",
|
|
15
|
-
}, async () => {
|
|
16
|
-
calls += 1;
|
|
17
|
-
return new HttpResponse(new Response(JSON.stringify({ id: 1 }), {
|
|
18
|
-
status: 200,
|
|
19
|
-
headers: {
|
|
20
|
-
"content-type": "application/json",
|
|
21
|
-
etag: '"v1"',
|
|
22
|
-
},
|
|
23
|
-
}));
|
|
24
|
-
});
|
|
25
|
-
const second = await mw({
|
|
26
|
-
method: "GET",
|
|
27
|
-
url: "https://example.com/users/1",
|
|
28
|
-
}, async () => {
|
|
29
|
-
calls += 1;
|
|
30
|
-
return new HttpResponse(new Response("should not run", { status: 500 }));
|
|
31
|
-
});
|
|
32
|
-
expect(calls).toBe(1);
|
|
33
|
-
expect(await first.json()).toEqual({ id: 1 });
|
|
34
|
-
expect(await second.json()).toEqual({ id: 1 });
|
|
35
|
-
});
|
|
36
|
-
it("falls back to stale cache when the upstream request fails", async () => {
|
|
37
|
-
vi.useFakeTimers();
|
|
38
|
-
vi.setSystemTime(0);
|
|
39
|
-
const mw = httpCache({ ttlMs: 1, staleIfErrorMs: 1000 });
|
|
40
|
-
let calls = 0;
|
|
41
|
-
await mw({
|
|
42
|
-
method: "GET",
|
|
43
|
-
url: "https://example.com/users/1",
|
|
44
|
-
}, async () => {
|
|
45
|
-
calls += 1;
|
|
46
|
-
return new HttpResponse(new Response(JSON.stringify({ id: 1 }), { status: 200 }));
|
|
47
|
-
});
|
|
48
|
-
await vi.advanceTimersByTimeAsync(5);
|
|
49
|
-
const response = await mw({
|
|
50
|
-
method: "GET",
|
|
51
|
-
url: "https://example.com/users/1",
|
|
52
|
-
}, async () => {
|
|
53
|
-
calls += 1;
|
|
54
|
-
throw new TypeError("network fail");
|
|
55
|
-
});
|
|
56
|
-
expect(calls).toBe(2);
|
|
57
|
-
expect(await response.json()).toEqual({ id: 1 });
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
//# sourceMappingURL=http-cache.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http-cache.test.js","sourceRoot":"","sources":["../../tests/http-cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-key.test.d.ts","sourceRoot":"","sources":["../../tests/idempotency-key.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { createClient } from "../src/client/createClient";
|
|
3
|
-
import { idempotencyKey } from "../src/middleware/idempotencyKey";
|
|
4
|
-
describe("idempotency key middleware", () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
vi.restoreAllMocks();
|
|
7
|
-
});
|
|
8
|
-
it("adds idempotency key header for mutation requests", async () => {
|
|
9
|
-
const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("ok", { status: 200 }));
|
|
10
|
-
const client = createClient().use(idempotencyKey({
|
|
11
|
-
keyFactory: () => "idem-123",
|
|
12
|
-
}));
|
|
13
|
-
await client.post("https://api.example.com/orders", { itemId: "p1" });
|
|
14
|
-
const init = fetchMock.mock.calls[0]?.[1];
|
|
15
|
-
const headers = (init?.headers ?? {});
|
|
16
|
-
expect(headers["Idempotency-Key"]).toBe("idem-123");
|
|
17
|
-
});
|
|
18
|
-
it("does not override existing idempotency key", async () => {
|
|
19
|
-
const fetchMock = vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("ok", { status: 200 }));
|
|
20
|
-
const client = createClient().use(idempotencyKey({
|
|
21
|
-
keyFactory: () => "idem-generated",
|
|
22
|
-
}));
|
|
23
|
-
await client.post("/orders", { itemId: "p1" }, {
|
|
24
|
-
headers: { "Idempotency-Key": "idem-existing" },
|
|
25
|
-
});
|
|
26
|
-
const init = fetchMock.mock.calls[0]?.[1];
|
|
27
|
-
const headers = (init?.headers ?? {});
|
|
28
|
-
expect(headers["Idempotency-Key"]).toBe("idem-existing");
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
//# sourceMappingURL=idempotency-key.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency-key.test.js","sourceRoot":"","sources":["../../tests/idempotency-key.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,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEvG,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAC/B,cAAc,CAAC;YACb,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU;SAC7B,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QACrE,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAA2B,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEvG,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,GAAG,CAC/B,cAAc,CAAC;YACb,UAAU,EAAE,GAAG,EAAE,CAAC,gBAAgB;SACnC,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7C,OAAO,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE;SAChD,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QACrE,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAA2B,CAAC;QAChE,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented-adapter.test.d.ts","sourceRoot":"","sources":["../../tests/instrumented-adapter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
|
2
|
-
import { createInstrumentedAdapter } from "../src/adapters/instrumentedAdapter";
|
|
3
|
-
describe("instrumented adapter", () => {
|
|
4
|
-
it("emits start and success hooks", async () => {
|
|
5
|
-
const starts = [];
|
|
6
|
-
const successes = [];
|
|
7
|
-
const adapter = createInstrumentedAdapter(async () => new Response("ok", { status: 200 }), {
|
|
8
|
-
onStart(event) {
|
|
9
|
-
starts.push(event.url);
|
|
10
|
-
},
|
|
11
|
-
onSuccess(event) {
|
|
12
|
-
successes.push(event.response.status);
|
|
13
|
-
},
|
|
14
|
-
});
|
|
15
|
-
const response = await adapter("https://api.example.com/ok", { method: "GET" });
|
|
16
|
-
expect(response.status).toBe(200);
|
|
17
|
-
expect(starts).toEqual(["https://api.example.com/ok"]);
|
|
18
|
-
expect(successes).toEqual([200]);
|
|
19
|
-
});
|
|
20
|
-
it("emits error hook and rethrows", async () => {
|
|
21
|
-
const errors = [];
|
|
22
|
-
const adapter = createInstrumentedAdapter(async () => {
|
|
23
|
-
throw new Error("boom");
|
|
24
|
-
}, {
|
|
25
|
-
onError(event) {
|
|
26
|
-
errors.push(String(event.error));
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
await expect(adapter("https://api.example.com/fail", { method: "GET" })).rejects.toThrow("boom");
|
|
30
|
-
expect(errors.length).toBe(1);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
//# sourceMappingURL=instrumented-adapter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instrumented-adapter.test.js","sourceRoot":"","sources":["../../tests/instrumented-adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAEhF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,MAAM,OAAO,GAAG,yBAAyB,CACvC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAC/C;YACE,OAAO,CAAC,KAAK;gBACX,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YACD,SAAS,CAAC,KAAK;gBACb,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;SACF,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,OAAO,GAAG,yBAAyB,CACvC,KAAK,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,EACD;YACE,OAAO,CAAC,KAAK;gBACX,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACnC,CAAC;SACF,CACF,CAAC;QAEF,MAAM,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor-order.test.d.ts","sourceRoot":"","sources":["../../tests/interceptor-order.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi, afterEach } from "vitest";
|
|
2
|
-
import { createClient } from "../src/client/createClient";
|
|
3
|
-
describe("interceptor order", () => {
|
|
4
|
-
afterEach(() => {
|
|
5
|
-
vi.restoreAllMocks();
|
|
6
|
-
});
|
|
7
|
-
it("applies request interceptors by descending priority", async () => {
|
|
8
|
-
const callOrder = [];
|
|
9
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("{}", { status: 200, headers: { "content-type": "application/json" } }));
|
|
10
|
-
const client = createClient()
|
|
11
|
-
.useRequestInterceptor((req) => {
|
|
12
|
-
callOrder.push("low");
|
|
13
|
-
return req;
|
|
14
|
-
}, { priority: 1 })
|
|
15
|
-
.useRequestInterceptor((req) => {
|
|
16
|
-
callOrder.push("high");
|
|
17
|
-
return req;
|
|
18
|
-
}, { priority: 10 });
|
|
19
|
-
await client.get("https://example.com");
|
|
20
|
-
expect(callOrder).toEqual(["high", "low"]);
|
|
21
|
-
});
|
|
22
|
-
it("applies response interceptors by descending priority", async () => {
|
|
23
|
-
const callOrder = [];
|
|
24
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("{}", { status: 200 }));
|
|
25
|
-
const client = createClient()
|
|
26
|
-
.useResponseInterceptor((res) => {
|
|
27
|
-
callOrder.push("low");
|
|
28
|
-
return res;
|
|
29
|
-
}, { priority: 1 })
|
|
30
|
-
.useResponseInterceptor((res) => {
|
|
31
|
-
callOrder.push("high");
|
|
32
|
-
return res;
|
|
33
|
-
}, { priority: 10 });
|
|
34
|
-
await client.get("https://example.com");
|
|
35
|
-
expect(callOrder).toEqual(["high", "low"]);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
//# sourceMappingURL=interceptor-order.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interceptor-order.test.js","sourceRoot":"","sources":["../../tests/interceptor-order.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAC7C,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CACrF,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,EAAE;aAC1B,qBAAqB,CACpB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB;aACA,qBAAqB,CACpB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjB,CAAC;QAEJ,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAExC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,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;aAC1B,sBAAsB,CACrB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB;aACA,sBAAsB,CACrB,CAAC,GAAG,EAAE,EAAE;YACN,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjB,CAAC;QAEJ,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAExC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invariant-fuzz.test.d.ts","sourceRoot":"","sources":["../../tests/invariant-fuzz.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { execute } from "../src/executor/execute";
|
|
3
|
-
import { compose } from "../src/middleware/compose";
|
|
4
|
-
import { dedupe } from "../src/middleware/dedupe";
|
|
5
|
-
import { retry } from "../src/middleware/retry";
|
|
6
|
-
import { concurrencyLimit } from "../src/middleware/concurrencyLimit";
|
|
7
|
-
import { stableKeyValues, stableQuery } from "../src/utils/stableKey";
|
|
8
|
-
import { HttpResponse } from "../src/response/response";
|
|
9
|
-
import { INTERNAL_MIDDLEWARES } from "../src/types/internal";
|
|
10
|
-
function makePrng(seed = 0xdecafbad) {
|
|
11
|
-
let value = seed >>> 0;
|
|
12
|
-
return () => {
|
|
13
|
-
value = (value * 1664525 + 1013904223) >>> 0;
|
|
14
|
-
return value / 0x100000000;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function pick(prng, chars, min, max) {
|
|
18
|
-
const len = min + Math.floor(prng() * (max - min + 1));
|
|
19
|
-
let out = "";
|
|
20
|
-
for (let i = 0; i < len; i++) {
|
|
21
|
-
const idx = Math.floor(prng() * chars.length);
|
|
22
|
-
out += chars[idx] ?? "x";
|
|
23
|
-
}
|
|
24
|
-
return out;
|
|
25
|
-
}
|
|
26
|
-
function sleep(ms) {
|
|
27
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
28
|
-
}
|
|
29
|
-
describe("invariant/fuzz: URL and query construction", () => {
|
|
30
|
-
it("preserves parameter/query information under randomized inputs", async () => {
|
|
31
|
-
const prng = makePrng(7);
|
|
32
|
-
const chars = "abcdefghijklmnopqrstuvwxyz0123456789-_ .~";
|
|
33
|
-
for (let i = 0; i < 160; i++) {
|
|
34
|
-
const p1 = pick(prng, chars, 1, 8);
|
|
35
|
-
const p2 = pick(prng, chars, 1, 8);
|
|
36
|
-
const k1 = `k${Math.floor(prng() * 10)}`;
|
|
37
|
-
const k2 = `m${Math.floor(prng() * 10)}`;
|
|
38
|
-
const v1 = pick(prng, chars, 1, 6);
|
|
39
|
-
const arrCount = 1 + Math.floor(prng() * 4);
|
|
40
|
-
const v2 = Array.from({ length: arrCount }, () => pick(prng, chars, 1, 6));
|
|
41
|
-
let capturedUrl = "";
|
|
42
|
-
await execute({
|
|
43
|
-
method: "GET",
|
|
44
|
-
url: "/f/:p1/:p2",
|
|
45
|
-
params: { p1, p2 },
|
|
46
|
-
query: {
|
|
47
|
-
[k1]: v1,
|
|
48
|
-
[k2]: v2,
|
|
49
|
-
},
|
|
50
|
-
}, {
|
|
51
|
-
adapter: async (url) => {
|
|
52
|
-
capturedUrl = url;
|
|
53
|
-
return new Response("ok", { status: 200 });
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
const parsed = new URL(capturedUrl, "http://localhost");
|
|
57
|
-
const pathParts = parsed.pathname.split("/").slice(-2).map(decodeURIComponent);
|
|
58
|
-
expect(pathParts).toEqual([p1, p2]);
|
|
59
|
-
expect(parsed.searchParams.get(k1)).toBe(v1);
|
|
60
|
-
expect(parsed.searchParams.getAll(k2).sort()).toEqual([...v2].sort());
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
describe("invariant/fuzz: mixed fault traffic convergence", () => {
|
|
65
|
-
it("always settles randomized fault traffic without violating concurrency ceiling", async () => {
|
|
66
|
-
const prng = makePrng(11);
|
|
67
|
-
let inFlight = 0;
|
|
68
|
-
let maxInFlight = 0;
|
|
69
|
-
const executor = async (req) => {
|
|
70
|
-
inFlight += 1;
|
|
71
|
-
maxInFlight = Math.max(maxInFlight, inFlight);
|
|
72
|
-
try {
|
|
73
|
-
await sleep(Math.floor(prng() * 3));
|
|
74
|
-
if (req.signal?.aborted) {
|
|
75
|
-
throw req.signal.reason ?? new DOMException("Aborted", "AbortError");
|
|
76
|
-
}
|
|
77
|
-
const r = prng();
|
|
78
|
-
if (r < 0.1) {
|
|
79
|
-
throw new TypeError("chaos-network");
|
|
80
|
-
}
|
|
81
|
-
if (r < 0.3) {
|
|
82
|
-
return new HttpResponse(new Response("retry", { status: 503 }));
|
|
83
|
-
}
|
|
84
|
-
return new HttpResponse(new Response("ok", { status: 200 }));
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
inFlight -= 1;
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
const run = compose([
|
|
91
|
-
concurrencyLimit({ maxConcurrent: 12 }),
|
|
92
|
-
dedupe(),
|
|
93
|
-
retry({
|
|
94
|
-
maxRetries: 1,
|
|
95
|
-
delay: 0,
|
|
96
|
-
backoff: false,
|
|
97
|
-
retryOnStatus: [503],
|
|
98
|
-
retryOnNetworkError: true,
|
|
99
|
-
}),
|
|
100
|
-
], executor);
|
|
101
|
-
const total = 260;
|
|
102
|
-
const tasks = Array.from({ length: total }, (_, i) => {
|
|
103
|
-
const ac = new AbortController();
|
|
104
|
-
const shouldAbort = prng() < 0.15;
|
|
105
|
-
if (shouldAbort) {
|
|
106
|
-
ac.abort(new DOMException("Aborted", "AbortError"));
|
|
107
|
-
}
|
|
108
|
-
return run({
|
|
109
|
-
method: "GET",
|
|
110
|
-
url: `https://fuzz.local/r/${i % 50}`,
|
|
111
|
-
signal: ac.signal,
|
|
112
|
-
[INTERNAL_MIDDLEWARES]: [],
|
|
113
|
-
}).then(() => ({ ok: true }), () => ({ ok: false }));
|
|
114
|
-
});
|
|
115
|
-
const settled = await Promise.all(tasks);
|
|
116
|
-
const success = settled.filter((x) => x.ok).length;
|
|
117
|
-
const failure = settled.length - success;
|
|
118
|
-
console.info("[pureq][fuzz-metrics]", {
|
|
119
|
-
scenario: "mixed-fault-convergence",
|
|
120
|
-
total,
|
|
121
|
-
success,
|
|
122
|
-
failure,
|
|
123
|
-
maxInFlight,
|
|
124
|
-
});
|
|
125
|
-
expect(settled).toHaveLength(total);
|
|
126
|
-
expect(maxInFlight).toBeLessThanOrEqual(12);
|
|
127
|
-
expect(success).toBeGreaterThan(0);
|
|
128
|
-
expect(failure).toBeGreaterThan(0);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
describe("invariant/fuzz: stable key generation", () => {
|
|
132
|
-
it("is insensitive to insertion order for equivalent maps", () => {
|
|
133
|
-
const leftHeaders = { b: "2", a: "1", c: "3" };
|
|
134
|
-
const rightHeaders = { c: "3", a: "1", b: "2" };
|
|
135
|
-
expect(stableKeyValues(leftHeaders)).toBe(stableKeyValues(rightHeaders));
|
|
136
|
-
const leftQuery = {
|
|
137
|
-
z: [3, 1, 2],
|
|
138
|
-
a: "x",
|
|
139
|
-
m: true,
|
|
140
|
-
};
|
|
141
|
-
const rightQuery = {
|
|
142
|
-
m: true,
|
|
143
|
-
a: "x",
|
|
144
|
-
z: [3, 1, 2],
|
|
145
|
-
};
|
|
146
|
-
expect(stableQuery(leftQuery)).toBe(stableQuery(rightQuery));
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
//# sourceMappingURL=invariant-fuzz.test.js.map
|