@vereda/http 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 +21 -0
- package/README.md +604 -0
- package/dist/adapters/zod.d.ts +14 -0
- package/dist/adapters/zod.d.ts.map +1 -0
- package/dist/adapters/zod.js +14 -0
- package/dist/adapters/zod.js.map +1 -0
- package/dist/core/backoff.d.ts +9 -0
- package/dist/core/backoff.d.ts.map +1 -0
- package/dist/core/backoff.js +23 -0
- package/dist/core/backoff.js.map +1 -0
- package/dist/core/client.d.ts +98 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +781 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/errors.d.ts +87 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +140 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/listeners.d.ts +14 -0
- package/dist/core/listeners.d.ts.map +1 -0
- package/dist/core/listeners.js +27 -0
- package/dist/core/listeners.js.map +1 -0
- package/dist/core/metrics.d.ts +33 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +24 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/nanoid.d.ts +2 -0
- package/dist/core/nanoid.d.ts.map +1 -0
- package/dist/core/nanoid.js +11 -0
- package/dist/core/nanoid.js.map +1 -0
- package/dist/core/redact.d.ts +12 -0
- package/dist/core/redact.d.ts.map +1 -0
- package/dist/core/redact.js +42 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/types.d.ts +261 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +41 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/validate.d.ts +19 -0
- package/dist/core/validate.d.ts.map +1 -0
- package/dist/core/validate.js +135 -0
- package/dist/core/validate.js.map +1 -0
- package/dist/middleware/index.d.ts +26 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +55 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/queue/bulkhead.d.ts +63 -0
- package/dist/queue/bulkhead.d.ts.map +1 -0
- package/dist/queue/bulkhead.js +192 -0
- package/dist/queue/bulkhead.js.map +1 -0
- package/dist/queue/circuit-breaker.d.ts +81 -0
- package/dist/queue/circuit-breaker.d.ts.map +1 -0
- package/dist/queue/circuit-breaker.js +283 -0
- package/dist/queue/circuit-breaker.js.map +1 -0
- package/dist/queue/executor.d.ts +67 -0
- package/dist/queue/executor.d.ts.map +1 -0
- package/dist/queue/executor.js +273 -0
- package/dist/queue/executor.js.map +1 -0
- package/dist/queue/policy.d.ts +26 -0
- package/dist/queue/policy.d.ts.map +1 -0
- package/dist/queue/policy.js +37 -0
- package/dist/queue/policy.js.map +1 -0
- package/dist/queue/retry.d.ts +58 -0
- package/dist/queue/retry.d.ts.map +1 -0
- package/dist/queue/retry.js +259 -0
- package/dist/queue/retry.js.map +1 -0
- package/dist/queue/semaphore.d.ts +32 -0
- package/dist/queue/semaphore.d.ts.map +1 -0
- package/dist/queue/semaphore.js +83 -0
- package/dist/queue/semaphore.js.map +1 -0
- package/dist/ticket/ticket.d.ts +77 -0
- package/dist/ticket/ticket.d.ts.map +1 -0
- package/dist/ticket/ticket.js +186 -0
- package/dist/ticket/ticket.js.map +1 -0
- package/package.json +85 -0
- package/src/adapters/zod.ts +16 -0
- package/src/core/backoff.ts +26 -0
- package/src/core/client.ts +1048 -0
- package/src/core/errors.ts +194 -0
- package/src/core/index.ts +56 -0
- package/src/core/listeners.ts +28 -0
- package/src/core/metrics.ts +42 -0
- package/src/core/nanoid.ts +11 -0
- package/src/core/redact.ts +46 -0
- package/src/core/types.ts +306 -0
- package/src/core/validate.ts +163 -0
- package/src/middleware/index.ts +63 -0
- package/src/queue/bulkhead.ts +243 -0
- package/src/queue/circuit-breaker.ts +373 -0
- package/src/queue/executor.ts +355 -0
- package/src/queue/policy.ts +49 -0
- package/src/queue/retry.ts +380 -0
- package/src/queue/semaphore.ts +91 -0
- package/src/ticket/ticket.ts +246 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BackoffFn, BackoffOptions } from "./types.ts";
|
|
2
|
+
/** Default base delay in ms for exponential backoff. */
|
|
3
|
+
export declare const DEFAULT_BASE_DELAY_MS = 200;
|
|
4
|
+
/** Default max delay cap in ms for exponential backoff. */
|
|
5
|
+
export declare const DEFAULT_MAX_DELAY_MS = 30000;
|
|
6
|
+
/** Default jitter setting for exponential backoff. */
|
|
7
|
+
export declare const DEFAULT_JITTER = true;
|
|
8
|
+
export declare function buildBackoffFn(config?: BackoffFn | BackoffOptions): BackoffFn;
|
|
9
|
+
//# sourceMappingURL=backoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/core/backoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C,sDAAsD;AACtD,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAgB7E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Default base delay in ms for exponential backoff. */
|
|
2
|
+
export const DEFAULT_BASE_DELAY_MS = 200;
|
|
3
|
+
/** Default max delay cap in ms for exponential backoff. */
|
|
4
|
+
export const DEFAULT_MAX_DELAY_MS = 30_000;
|
|
5
|
+
/** Default jitter setting for exponential backoff. */
|
|
6
|
+
export const DEFAULT_JITTER = true;
|
|
7
|
+
export function buildBackoffFn(config) {
|
|
8
|
+
if (typeof config === "function") {
|
|
9
|
+
return config;
|
|
10
|
+
}
|
|
11
|
+
const baseDelayMs = config?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
|
|
12
|
+
const maxDelayMs = config?.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
|
|
13
|
+
const jitter = config?.jitter ?? DEFAULT_JITTER;
|
|
14
|
+
return (attempt) => {
|
|
15
|
+
const exponential = baseDelayMs * 2 ** attempt;
|
|
16
|
+
const capped = Math.min(exponential, maxDelayMs);
|
|
17
|
+
if (!jitter)
|
|
18
|
+
return capped;
|
|
19
|
+
// Full jitter: random value in [0, capped]
|
|
20
|
+
return Math.random() * capped;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=backoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backoff.js","sourceRoot":"","sources":["../../src/core/backoff.ts"],"names":[],"mappings":"AAEA,wDAAwD;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC3C,sDAAsD;AACtD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,MAAM,UAAU,cAAc,CAAC,MAAmC;IACjE,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,IAAI,qBAAqB,CAAC;IACjE,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,oBAAoB,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,cAAc,CAAC;IAEhD,OAAO,CAAC,OAAe,EAAU,EAAE;QAClC,MAAM,WAAW,GAAG,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC;QAC3B,2CAA2C;QAC3C,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC;IAC/B,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type BulkheadSnapshot } from "../queue/bulkhead.ts";
|
|
2
|
+
import { type MiddlewareFn } from "../queue/executor.ts";
|
|
3
|
+
import { type Ticket } from "../ticket/ticket.ts";
|
|
4
|
+
import type { ClientConfig, CloseOptions, LifecycleEventMap, ParsedRequestOptions, ParseFn, RequestOptions, UnparsedRequestOptions } from "./types.ts";
|
|
5
|
+
export declare class HttpClient {
|
|
6
|
+
private readonly config;
|
|
7
|
+
private readonly emitter;
|
|
8
|
+
private readonly middlewares;
|
|
9
|
+
private readonly bulkheads;
|
|
10
|
+
private readonly circuitBreakers;
|
|
11
|
+
private readonly partitionConfigs;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
private readonly metrics;
|
|
14
|
+
private readonly redactQuery;
|
|
15
|
+
private readonly customFetch;
|
|
16
|
+
private _closed;
|
|
17
|
+
private _closing;
|
|
18
|
+
private readonly _inflightTickets;
|
|
19
|
+
private constructor();
|
|
20
|
+
static create(config: ClientConfig): HttpClient;
|
|
21
|
+
use(middleware: MiddlewareFn): this;
|
|
22
|
+
on<K extends keyof LifecycleEventMap>(event: K, listener: (data: LifecycleEventMap[K]) => void): this;
|
|
23
|
+
off<K extends keyof LifecycleEventMap>(event: K, listener: (data: LifecycleEventMap[K]) => void): this;
|
|
24
|
+
/** Send a request. With `parse`, `data` is whatever `parse` returns; without
|
|
25
|
+
* it, the body is left unread on `raw` and `data` is `undefined`. When
|
|
26
|
+
* `parse` may or may not be set, `data` is `T | undefined`. */
|
|
27
|
+
request<T>(url: string, options: ParsedRequestOptions<T>): Ticket<T>;
|
|
28
|
+
request(url: string, options?: UnparsedRequestOptions): Ticket<undefined>;
|
|
29
|
+
request<T>(url: string, options?: RequestOptions<T>): Ticket<T | undefined>;
|
|
30
|
+
private send;
|
|
31
|
+
private _fireFirstAttempt;
|
|
32
|
+
/** Apply the unified retry gate after the first attempt failed (attempt 0).
|
|
33
|
+
* Returns true if the request must NOT be retried — the ticket is resolved
|
|
34
|
+
* with the raw error and must not be queued. */
|
|
35
|
+
private vetoed;
|
|
36
|
+
private _scheduleInBulkhead;
|
|
37
|
+
/** GET request. */
|
|
38
|
+
get<T>(url: string, options: Omit<ParsedRequestOptions<T>, "method">): Ticket<T>;
|
|
39
|
+
get(url: string, options?: Omit<UnparsedRequestOptions, "method">): Ticket<undefined>;
|
|
40
|
+
/** HEAD request. */
|
|
41
|
+
head<T>(url: string, options: Omit<ParsedRequestOptions<T>, "method">): Ticket<T>;
|
|
42
|
+
head(url: string, options?: Omit<UnparsedRequestOptions, "method">): Ticket<undefined>;
|
|
43
|
+
/** OPTIONS request. */
|
|
44
|
+
options<T>(url: string, options: Omit<ParsedRequestOptions<T>, "method">): Ticket<T>;
|
|
45
|
+
options(url: string, options?: Omit<UnparsedRequestOptions, "method">): Ticket<undefined>;
|
|
46
|
+
/** POST request. */
|
|
47
|
+
post<T>(url: string, body: BodyInit | (() => BodyInit) | undefined, options: Omit<ParsedRequestOptions<T>, "method" | "body">): Ticket<T>;
|
|
48
|
+
post(url: string, body?: BodyInit | (() => BodyInit), options?: Omit<UnparsedRequestOptions, "method" | "body">): Ticket<undefined>;
|
|
49
|
+
/** PUT request. */
|
|
50
|
+
put<T>(url: string, body: BodyInit | (() => BodyInit) | undefined, options: Omit<ParsedRequestOptions<T>, "method" | "body">): Ticket<T>;
|
|
51
|
+
put(url: string, body?: BodyInit | (() => BodyInit), options?: Omit<UnparsedRequestOptions, "method" | "body">): Ticket<undefined>;
|
|
52
|
+
/** PATCH request. */
|
|
53
|
+
patch<T>(url: string, body: BodyInit | (() => BodyInit) | undefined, options: Omit<ParsedRequestOptions<T>, "method" | "body">): Ticket<T>;
|
|
54
|
+
patch(url: string, body?: BodyInit | (() => BodyInit), options?: Omit<UnparsedRequestOptions, "method" | "body">): Ticket<undefined>;
|
|
55
|
+
/** DELETE request. */
|
|
56
|
+
delete<T>(url: string, options: Omit<ParsedRequestOptions<T>, "method">): Ticket<T>;
|
|
57
|
+
delete(url: string, options?: Omit<UnparsedRequestOptions, "method">): Ticket<undefined>;
|
|
58
|
+
/** Return a snapshot of all active bulkhead partitions.
|
|
59
|
+
* Each entry includes the partition name, running/queued counts,
|
|
60
|
+
* and configured concurrency/maxQueueSize limits. */
|
|
61
|
+
partitions(): BulkheadSnapshot[];
|
|
62
|
+
/** Close the client. New requests throw `ConfigurationError("client closed")`.
|
|
63
|
+
* When `drain` is true, in-flight tickets are awaited up to `timeoutMs`
|
|
64
|
+
* before the promise resolves, then remaining tickets are cancelled.
|
|
65
|
+
* When `drain` is false (default), all in-flight tickets are cancelled
|
|
66
|
+
* immediately.
|
|
67
|
+
*
|
|
68
|
+
* `timeoutMs` is required when `drain` is true to prevent indefinite
|
|
69
|
+
* hangs — use a value that fits your shutdown budget. */
|
|
70
|
+
close(opts?: CloseOptions): Promise<void>;
|
|
71
|
+
private _close;
|
|
72
|
+
/** The partition `_fireFirstAttempt` will use, or undefined when the URL
|
|
73
|
+
* can't be resolved (that path surfaces the error on the ticket). */
|
|
74
|
+
private tryResolvePartition;
|
|
75
|
+
private resolveUrl;
|
|
76
|
+
private mergeTimeout;
|
|
77
|
+
private mergeRetry;
|
|
78
|
+
/** Returns the URL for logging, redacted if redactQuery is enabled. */
|
|
79
|
+
private logUrl;
|
|
80
|
+
/** Never throws: listener and metrics-sink errors are isolated (B3), since
|
|
81
|
+
* callers emit mid-transition — e.g. `success` right before `markDone`. */
|
|
82
|
+
private emit;
|
|
83
|
+
private emitMetrics;
|
|
84
|
+
/** Push current queue-depth gauges: per-partition bulkhead backlog and the
|
|
85
|
+
* global semaphore backlog (the D1 cap devs most need visibility into).
|
|
86
|
+
* Polled from emit()'s request-start/terminal-event hooks rather than
|
|
87
|
+
* pushed on the semaphore's own enqueue/dequeue, so a single request that
|
|
88
|
+
* is briefly queued and released between those two hooks can land on
|
|
89
|
+
* neither poll and never register — reliable for a sustained backlog,
|
|
90
|
+
* not for a lone momentary wait (see docs/operations.md). `queuedMs` on
|
|
91
|
+
* the lifecycle events has no such gap; it's measured, not polled. */
|
|
92
|
+
private emitQueueDepthGauges;
|
|
93
|
+
}
|
|
94
|
+
/** Parse JSON response body without validation.
|
|
95
|
+
* Useful when you just need the raw parsed JSON object/array.
|
|
96
|
+
* Unlike `parse` with Zod, this does not validate the shape. */
|
|
97
|
+
export declare function json<T>(): ParseFn<T>;
|
|
98
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
|