@compose-market/sdk 0.1.1 → 0.3.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/LICENSE +21 -0
  3. package/README.md +158 -35
  4. package/dist/errors.d.ts +145 -0
  5. package/dist/errors.d.ts.map +1 -0
  6. package/dist/errors.js +152 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/events.d.ts +75 -0
  9. package/dist/events.d.ts.map +1 -0
  10. package/dist/events.js +68 -0
  11. package/dist/events.js.map +1 -0
  12. package/dist/http.d.ts +98 -0
  13. package/dist/http.d.ts.map +1 -0
  14. package/dist/http.js +350 -0
  15. package/dist/http.js.map +1 -0
  16. package/dist/index.d.ts +206 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +340 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/resources/inference.d.ts +175 -0
  21. package/dist/resources/inference.d.ts.map +1 -0
  22. package/dist/resources/inference.js +740 -0
  23. package/dist/resources/inference.js.map +1 -0
  24. package/dist/resources/instrumentation.d.ts +28 -0
  25. package/dist/resources/instrumentation.d.ts.map +1 -0
  26. package/dist/resources/instrumentation.js +43 -0
  27. package/dist/resources/instrumentation.js.map +1 -0
  28. package/dist/resources/keys.d.ts +54 -0
  29. package/dist/resources/keys.d.ts.map +1 -0
  30. package/dist/resources/keys.js +164 -0
  31. package/dist/resources/keys.js.map +1 -0
  32. package/dist/resources/models.d.ts +26 -0
  33. package/dist/resources/models.d.ts.map +1 -0
  34. package/dist/resources/models.js +52 -0
  35. package/dist/resources/models.js.map +1 -0
  36. package/dist/resources/session-events.d.ts +46 -0
  37. package/dist/resources/session-events.d.ts.map +1 -0
  38. package/dist/resources/session-events.js +199 -0
  39. package/dist/resources/session-events.js.map +1 -0
  40. package/dist/resources/webhooks.d.ts +27 -0
  41. package/dist/resources/webhooks.d.ts.map +1 -0
  42. package/dist/resources/webhooks.js +78 -0
  43. package/dist/resources/webhooks.js.map +1 -0
  44. package/dist/resources/x402.d.ts +37 -0
  45. package/dist/resources/x402.d.ts.map +1 -0
  46. package/dist/resources/x402.js +72 -0
  47. package/dist/resources/x402.js.map +1 -0
  48. package/dist/storage.d.ts +27 -0
  49. package/dist/storage.d.ts.map +1 -0
  50. package/dist/storage.js +46 -0
  51. package/dist/storage.js.map +1 -0
  52. package/dist/streaming/budget.d.ts +22 -0
  53. package/dist/streaming/budget.d.ts.map +1 -0
  54. package/dist/streaming/budget.js +40 -0
  55. package/dist/streaming/budget.js.map +1 -0
  56. package/dist/streaming/receipt.d.ts +25 -0
  57. package/dist/streaming/receipt.d.ts.map +1 -0
  58. package/dist/streaming/receipt.js +92 -0
  59. package/dist/streaming/receipt.js.map +1 -0
  60. package/dist/streaming/sse.d.ts +29 -0
  61. package/dist/streaming/sse.d.ts.map +1 -0
  62. package/dist/streaming/sse.js +125 -0
  63. package/dist/streaming/sse.js.map +1 -0
  64. package/dist/types/index.d.ts +540 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +10 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/version.d.ts +9 -0
  69. package/dist/version.d.ts.map +1 -0
  70. package/dist/version.js +9 -0
  71. package/dist/version.js.map +1 -0
  72. package/package.json +32 -21
  73. package/index.d.ts +0 -244
  74. package/index.js +0 -397
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Typed event bus emitted by `ComposeSDK`.
3
+ *
4
+ * The event bus is the canonical way for application code to react to
5
+ * out-of-band signals from the Compose backend that arrive as a side effect
6
+ * of HTTP calls or SSE subscriptions:
7
+ *
8
+ * - `budget` — session-budget snapshot parsed from response headers
9
+ * on every billable call.
10
+ * - `sessionInvalid` — `x-compose-session-invalid` header was set, the
11
+ * session must be torn down.
12
+ * - `sessionExpired` — SSE `session-expired` frame arrived from
13
+ * `/api/session/events`.
14
+ * - `sessionActive` — SSE `session-active` heartbeat frame arrived.
15
+ * - `receipt` — settlement receipt parsed from `X-Compose-Receipt`
16
+ * (or the SSE `event: compose.receipt` frame).
17
+ *
18
+ * Listeners are registered with `.on(event, listener)`. The bus is in-memory,
19
+ * single-process, unordered across listeners, and never blocks the caller —
20
+ * listener exceptions are logged via the SDK logger and discarded.
21
+ */
22
+ import type { ComposeReceipt, SessionActiveEvent, SessionBudgetSnapshot, SessionExpiredEvent, SessionInvalidReason } from "./types/index.js";
23
+ export interface BudgetEvent {
24
+ userAddress: string | null;
25
+ chainId: number | null;
26
+ snapshot: SessionBudgetSnapshot;
27
+ /** Request that produced this snapshot. Matches `X-Request-Id`. */
28
+ requestId: string | null;
29
+ }
30
+ export interface SessionInvalidEvent {
31
+ userAddress: string | null;
32
+ chainId: number | null;
33
+ reason: SessionInvalidReason;
34
+ requestId: string | null;
35
+ }
36
+ export interface ReceiptEvent {
37
+ userAddress: string | null;
38
+ chainId: number | null;
39
+ receipt: ComposeReceipt;
40
+ requestId: string | null;
41
+ /**
42
+ * Which code path produced the receipt:
43
+ * - "response-header" — decoded from `X-Compose-Receipt` on a normal
44
+ * JSON response.
45
+ * - "stream" — parsed from the `event: compose.receipt` SSE
46
+ * frame on a streaming inference call.
47
+ * - "body" — mirrored from the `compose_receipt` field on
48
+ * the JSON body (fallback).
49
+ */
50
+ source: "response-header" | "stream" | "body";
51
+ }
52
+ export interface ComposeEventMap {
53
+ budget: BudgetEvent;
54
+ sessionInvalid: SessionInvalidEvent;
55
+ sessionActive: SessionActiveEvent;
56
+ sessionExpired: SessionExpiredEvent;
57
+ receipt: ReceiptEvent;
58
+ }
59
+ export type ComposeEventName = keyof ComposeEventMap;
60
+ export type ComposeEventListener<E extends ComposeEventName> = (event: ComposeEventMap[E]) => void | Promise<void>;
61
+ export interface ComposeEventBus {
62
+ on<E extends ComposeEventName>(event: E, listener: ComposeEventListener<E>): () => void;
63
+ once<E extends ComposeEventName>(event: E, listener: ComposeEventListener<E>): () => void;
64
+ off<E extends ComposeEventName>(event: E, listener: ComposeEventListener<E>): void;
65
+ emit<E extends ComposeEventName>(event: E, payload: ComposeEventMap[E]): void;
66
+ }
67
+ interface InternalBusOptions {
68
+ logger?: {
69
+ warn?: (msg: string, meta?: Record<string, unknown>) => void;
70
+ error?: (msg: string, meta?: Record<string, unknown>) => void;
71
+ };
72
+ }
73
+ export declare function createEventBus(options?: InternalBusOptions): ComposeEventBus;
74
+ export {};
75
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACR,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,WAAW;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;;;OAQG;IACH,MAAM,EAAE,iBAAiB,GAAG,QAAQ,GAAG,MAAM,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,mBAAmB,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC;IAClC,cAAc,EAAE,mBAAmB,CAAC;IACpC,OAAO,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC;AAErD,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,gBAAgB,IAAI,CAC3D,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KACxB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,WAAW,eAAe;IAC5B,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IACxF,IAAI,CAAC,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAC1F,GAAG,CAAC,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACnF,IAAI,CAAC,CAAC,SAAS,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CACjF;AAED,UAAU,kBAAkB;IACxB,MAAM,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC7D,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;KACjE,CAAC;CACL;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,eAAe,CA8ChF"}
package/dist/events.js ADDED
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Typed event bus emitted by `ComposeSDK`.
3
+ *
4
+ * The event bus is the canonical way for application code to react to
5
+ * out-of-band signals from the Compose backend that arrive as a side effect
6
+ * of HTTP calls or SSE subscriptions:
7
+ *
8
+ * - `budget` — session-budget snapshot parsed from response headers
9
+ * on every billable call.
10
+ * - `sessionInvalid` — `x-compose-session-invalid` header was set, the
11
+ * session must be torn down.
12
+ * - `sessionExpired` — SSE `session-expired` frame arrived from
13
+ * `/api/session/events`.
14
+ * - `sessionActive` — SSE `session-active` heartbeat frame arrived.
15
+ * - `receipt` — settlement receipt parsed from `X-Compose-Receipt`
16
+ * (or the SSE `event: compose.receipt` frame).
17
+ *
18
+ * Listeners are registered with `.on(event, listener)`. The bus is in-memory,
19
+ * single-process, unordered across listeners, and never blocks the caller —
20
+ * listener exceptions are logged via the SDK logger and discarded.
21
+ */
22
+ export function createEventBus(options = {}) {
23
+ const listeners = new Map();
24
+ const logger = options.logger;
25
+ const register = (event, listener) => {
26
+ const existing = listeners.get(event) ?? new Set();
27
+ existing.add(listener);
28
+ listeners.set(event, existing);
29
+ return () => off(event, listener);
30
+ };
31
+ const off = (event, listener) => {
32
+ const set = listeners.get(event);
33
+ if (!set)
34
+ return;
35
+ set.delete(listener);
36
+ if (set.size === 0)
37
+ listeners.delete(event);
38
+ };
39
+ const emit = (event, payload) => {
40
+ const set = listeners.get(event);
41
+ if (!set || set.size === 0)
42
+ return;
43
+ // Iterate a snapshot so listeners that unsubscribe inside their own
44
+ // handler do not mutate the iteration order.
45
+ for (const listener of Array.from(set)) {
46
+ try {
47
+ const result = listener(payload);
48
+ if (result && typeof result.catch === "function") {
49
+ result.catch((err) => {
50
+ logger?.error?.(`[events] async listener for ${event} threw`, { err });
51
+ });
52
+ }
53
+ }
54
+ catch (err) {
55
+ logger?.error?.(`[events] listener for ${event} threw`, { err });
56
+ }
57
+ }
58
+ };
59
+ const once = (event, listener) => {
60
+ const wrapped = (payload) => {
61
+ off(event, wrapped);
62
+ return listener(payload);
63
+ };
64
+ return register(event, wrapped);
65
+ };
66
+ return { on: register, once, off, emit };
67
+ }
68
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAsEH,MAAM,UAAU,cAAc,CAAC,UAA8B,EAAE;IAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiE,CAAC;IAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE9B,MAAM,QAAQ,GAAG,CAA6B,KAAQ,EAAE,QAAiC,EAAgB,EAAE;QACvG,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QACnD,QAAQ,CAAC,GAAG,CAAC,QAAkD,CAAC,CAAC;QACjE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,MAAM,GAAG,GAAG,CAA6B,KAAQ,EAAE,QAAiC,EAAQ,EAAE;QAC1F,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,MAAM,CAAC,QAAkD,CAAC,CAAC;QAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAA6B,KAAQ,EAAE,OAA2B,EAAQ,EAAE;QACrF,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,oEAAoE;QACpE,6CAA6C;QAC7C,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC;gBACD,MAAM,MAAM,GAAI,QAAoC,CAAC,OAAO,CAAC,CAAC;gBAC9D,IAAI,MAAM,IAAI,OAAQ,MAAwB,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBACjE,MAAwB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBACpC,MAAM,EAAE,KAAK,EAAE,CAAC,+BAA+B,KAAK,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;oBAC3E,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,EAAE,KAAK,EAAE,CAAC,yBAAyB,KAAK,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAA6B,KAAQ,EAAE,QAAiC,EAAgB,EAAE;QACnG,MAAM,OAAO,GAA4B,CAAC,OAAO,EAAE,EAAE;YACjD,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACpB,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,98 @@
1
+ /**
2
+ * HTTP client core for the Compose Market SDK.
3
+ *
4
+ * Responsibilities:
5
+ * - Build canonical headers (Authorization / x-session-user-address / x-chain-id /
6
+ * PAYMENT-SIGNATURE / x-x402-max-amount-wei / x-idempotency-key / User-Agent).
7
+ * - Apply retries with exponential backoff + jitter (default 2 retries, honor
8
+ * Retry-After).
9
+ * - Attach an AbortSignal for caller-driven cancellation and an internal
10
+ * timeout.
11
+ * - Parse error envelopes + PaymentRequired into typed error classes.
12
+ * - Return an `APIPromise<T>` that exposes `.asResponse()` and `.withResponse()`
13
+ * so callers can read headers (receipts, request-id, tx hash) without parsing.
14
+ *
15
+ * Zero runtime dependencies. Uses the platform `fetch`.
16
+ */
17
+ export type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
18
+ export interface RetryPolicy {
19
+ maxRetries: number;
20
+ initialDelayMs: number;
21
+ maxDelayMs: number;
22
+ jitter: boolean;
23
+ }
24
+ export interface HttpClientOptions {
25
+ baseUrl: string;
26
+ fetch: FetchLike;
27
+ timeoutMs: number;
28
+ defaultHeaders: Record<string, string>;
29
+ retry: RetryPolicy;
30
+ userAgent: string;
31
+ logger?: {
32
+ debug?: (msg: string, meta?: Record<string, unknown>) => void;
33
+ warn?: (msg: string, meta?: Record<string, unknown>) => void;
34
+ error?: (msg: string, meta?: Record<string, unknown>) => void;
35
+ };
36
+ }
37
+ export interface HeaderBagInput {
38
+ authJwt?: string;
39
+ composeKey?: string | null;
40
+ userAddress?: string | null;
41
+ chainId?: number | null;
42
+ paymentSignature?: string;
43
+ x402MaxAmountWei?: string;
44
+ idempotencyKey?: string;
45
+ composeRunId?: string;
46
+ requestId?: string;
47
+ extra?: Record<string, string | undefined>;
48
+ }
49
+ export interface RequestOptions {
50
+ method: string;
51
+ path: string;
52
+ query?: Record<string, string | number | boolean | null | undefined>;
53
+ body?: unknown;
54
+ bodyType?: "json" | "form-data" | "raw";
55
+ rawBody?: BodyInit;
56
+ headers?: HeaderBagInput;
57
+ /** Override for streaming responses — skip JSON parsing. */
58
+ expectStream?: boolean;
59
+ signal?: AbortSignal;
60
+ /** Caller-provided per-call timeout (ms). */
61
+ timeoutMs?: number;
62
+ /** Caller-provided per-call retry policy. */
63
+ retry?: Partial<RetryPolicy>;
64
+ /**
65
+ * Treat this call as NOT retryable on network errors; useful for non-
66
+ * idempotent mutations the caller knows should only be attempted once.
67
+ */
68
+ doNotRetry?: boolean;
69
+ }
70
+ export interface APIPromise<T> extends PromiseLike<T> {
71
+ /** Return the raw `Response` without consuming the body. */
72
+ asResponse(): Promise<Response>;
73
+ /** Return `{ data, response }` with the parsed body and raw response. */
74
+ withResponse(): Promise<{
75
+ data: T;
76
+ response: Response;
77
+ }>;
78
+ /** Standard promise `catch`. */
79
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
80
+ /** Standard promise `finally`. */
81
+ finally(onfinally?: (() => void) | null): Promise<T>;
82
+ }
83
+ export declare function buildHeaders(input: HeaderBagInput & {
84
+ defaultHeaders: Record<string, string>;
85
+ userAgent: string;
86
+ bodyType?: "json" | "form-data" | "raw";
87
+ }): Headers;
88
+ export declare class HttpClient {
89
+ private readonly options;
90
+ constructor(options: HttpClientOptions);
91
+ request<T>(config: RequestOptions): APIPromise<T>;
92
+ private execute;
93
+ private computeBackoff;
94
+ private encodeBody;
95
+ private parseResponseBody;
96
+ private safeReadJson;
97
+ }
98
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/http.js ADDED
@@ -0,0 +1,350 @@
1
+ /**
2
+ * HTTP client core for the Compose Market SDK.
3
+ *
4
+ * Responsibilities:
5
+ * - Build canonical headers (Authorization / x-session-user-address / x-chain-id /
6
+ * PAYMENT-SIGNATURE / x-x402-max-amount-wei / x-idempotency-key / User-Agent).
7
+ * - Apply retries with exponential backoff + jitter (default 2 retries, honor
8
+ * Retry-After).
9
+ * - Attach an AbortSignal for caller-driven cancellation and an internal
10
+ * timeout.
11
+ * - Parse error envelopes + PaymentRequired into typed error classes.
12
+ * - Return an `APIPromise<T>` that exposes `.asResponse()` and `.withResponse()`
13
+ * so callers can read headers (receipts, request-id, tx hash) without parsing.
14
+ *
15
+ * Zero runtime dependencies. Uses the platform `fetch`.
16
+ */
17
+ import { BadRequestError, buildApiError, ComposeConnectionError, ComposeTimeoutError, RateLimitError, } from "./errors.js";
18
+ const RETRYABLE_STATUSES = new Set([408, 409, 425, 429, 500, 502, 503, 504]);
19
+ function delay(ms, signal) {
20
+ return new Promise((resolve, reject) => {
21
+ const timer = setTimeout(() => {
22
+ signal?.removeEventListener("abort", onAbort);
23
+ resolve();
24
+ }, ms);
25
+ const onAbort = () => {
26
+ clearTimeout(timer);
27
+ reject(new ComposeTimeoutError({ message: "request aborted" }));
28
+ };
29
+ if (signal) {
30
+ if (signal.aborted) {
31
+ clearTimeout(timer);
32
+ reject(new ComposeTimeoutError({ message: "request aborted" }));
33
+ return;
34
+ }
35
+ signal.addEventListener("abort", onAbort, { once: true });
36
+ }
37
+ });
38
+ }
39
+ function combineSignals(a, b) {
40
+ if (!a)
41
+ return b ?? new AbortController().signal;
42
+ if (!b)
43
+ return a;
44
+ const controller = new AbortController();
45
+ const forward = () => controller.abort();
46
+ if (a.aborted || b.aborted)
47
+ controller.abort();
48
+ a.addEventListener("abort", forward, { once: true });
49
+ b.addEventListener("abort", forward, { once: true });
50
+ return controller.signal;
51
+ }
52
+ function buildQueryString(query) {
53
+ if (!query)
54
+ return "";
55
+ const params = new URLSearchParams();
56
+ for (const [key, value] of Object.entries(query)) {
57
+ if (value === undefined || value === null)
58
+ continue;
59
+ params.append(key, String(value));
60
+ }
61
+ const encoded = params.toString();
62
+ return encoded.length > 0 ? `?${encoded}` : "";
63
+ }
64
+ function normalizeUserAddress(value) {
65
+ const trimmed = value.trim().toLowerCase();
66
+ if (!/^0x[a-f0-9]{40}$/.test(trimmed)) {
67
+ throw new BadRequestError({ message: "userAddress must be a valid 0x-prefixed EVM address" });
68
+ }
69
+ return trimmed;
70
+ }
71
+ export function buildHeaders(input) {
72
+ const headers = new Headers();
73
+ for (const [key, value] of Object.entries(input.defaultHeaders)) {
74
+ headers.set(key, value);
75
+ }
76
+ if (input.bodyType === "json") {
77
+ headers.set("Content-Type", "application/json");
78
+ }
79
+ // For "form-data" we let the runtime set the multipart boundary; we do not
80
+ // set Content-Type manually. For "raw" the caller sets it.
81
+ if (input.authJwt) {
82
+ headers.set("Authorization", `Bearer ${input.authJwt}`);
83
+ }
84
+ else if (input.composeKey) {
85
+ headers.set("Authorization", `Bearer ${input.composeKey}`);
86
+ }
87
+ if (input.userAddress) {
88
+ headers.set("x-session-user-address", normalizeUserAddress(input.userAddress));
89
+ }
90
+ if (typeof input.chainId === "number" && Number.isInteger(input.chainId) && input.chainId > 0) {
91
+ headers.set("x-chain-id", String(input.chainId));
92
+ }
93
+ if (input.paymentSignature) {
94
+ headers.set("PAYMENT-SIGNATURE", input.paymentSignature);
95
+ }
96
+ if (input.x402MaxAmountWei) {
97
+ headers.set("x-x402-max-amount-wei", input.x402MaxAmountWei);
98
+ }
99
+ if (input.idempotencyKey) {
100
+ headers.set("x-idempotency-key", input.idempotencyKey);
101
+ }
102
+ if (input.composeRunId) {
103
+ headers.set("x-compose-run-id", input.composeRunId);
104
+ }
105
+ if (input.requestId) {
106
+ headers.set("x-request-id", input.requestId);
107
+ }
108
+ headers.set("User-Agent", input.userAgent);
109
+ if (input.extra) {
110
+ for (const [key, value] of Object.entries(input.extra)) {
111
+ if (typeof value === "string" && value.length > 0) {
112
+ headers.set(key, value);
113
+ }
114
+ }
115
+ }
116
+ return headers;
117
+ }
118
+ function parseErrorBody(body) {
119
+ if (body && typeof body === "object") {
120
+ const envelope = body;
121
+ if (envelope.error && typeof envelope.error === "object") {
122
+ return {
123
+ code: envelope.error.code || "internal_error",
124
+ message: typeof envelope.error.message === "string" ? envelope.error.message : "Request failed",
125
+ details: envelope.error.details,
126
+ };
127
+ }
128
+ // Raw PaymentRequired body served directly as the 402 body (the x402
129
+ // core facilitator spec shape). Infer `payment_required` as the code.
130
+ const pr = body;
131
+ if (pr.x402Version === 2 && Array.isArray(pr.accepts)) {
132
+ const rawError = typeof pr.error === "string" ? pr.error : "Payment required";
133
+ return { code: "payment_required", message: rawError };
134
+ }
135
+ // Legacy shapes
136
+ const legacy = body;
137
+ if (typeof legacy.error === "string") {
138
+ return { code: (typeof legacy.code === "string" ? legacy.code : "internal_error"), message: legacy.error };
139
+ }
140
+ if (typeof legacy.message === "string") {
141
+ return { code: "internal_error", message: legacy.message };
142
+ }
143
+ }
144
+ return { code: "internal_error", message: "Request failed" };
145
+ }
146
+ function extractPaymentRequired(body, header) {
147
+ if (typeof header === "string" && header.length > 0) {
148
+ try {
149
+ const normalized = header.replace(/-/g, "+").replace(/_/g, "/");
150
+ const padding = normalized.length % 4 === 0 ? "" : "=".repeat(4 - (normalized.length % 4));
151
+ const decoded = typeof globalThis.atob === "function"
152
+ ? globalThis.atob(normalized + padding)
153
+ : Buffer.from(normalized + padding, "base64").toString("utf-8");
154
+ const bytes = new Uint8Array(decoded.length);
155
+ for (let i = 0; i < decoded.length; i += 1)
156
+ bytes[i] = decoded.charCodeAt(i);
157
+ const text = new TextDecoder("utf-8").decode(bytes);
158
+ const parsed = JSON.parse(text);
159
+ if (parsed && parsed.x402Version === 2 && Array.isArray(parsed.accepts)) {
160
+ return parsed;
161
+ }
162
+ }
163
+ catch {
164
+ // fall through
165
+ }
166
+ }
167
+ if (body && typeof body === "object") {
168
+ const record = body;
169
+ if (record.x402Version === 2 && Array.isArray(record.accepts) && record.resource) {
170
+ return record;
171
+ }
172
+ }
173
+ return null;
174
+ }
175
+ export class HttpClient {
176
+ options;
177
+ constructor(options) {
178
+ this.options = options;
179
+ }
180
+ request(config) {
181
+ // The promise is built lazily: `execute()` only runs when the caller
182
+ // awaits (or calls `.asResponse()` / `.withResponse()`). Awaiting the
183
+ // wrapper directly consumes the body; calling `.asResponse()` leaves
184
+ // the body intact so the caller can stream it.
185
+ let cachedJson = null;
186
+ let cachedStream = null;
187
+ const runJson = () => {
188
+ if (!cachedJson)
189
+ cachedJson = this.execute(config);
190
+ return cachedJson;
191
+ };
192
+ const runStream = () => {
193
+ if (!cachedStream)
194
+ cachedStream = this.execute({ ...config, expectStream: true });
195
+ return cachedStream;
196
+ };
197
+ const wrapper = {
198
+ then: (onFulfilled, onRejected) => runJson().then(({ data }) => data).then(onFulfilled, onRejected),
199
+ catch: (onRejected) => runJson().then(({ data }) => data).catch(onRejected),
200
+ finally: (onFinally) => runJson().then(({ data }) => data).finally(onFinally),
201
+ asResponse: async () => (await runStream()).response,
202
+ withResponse: async () => runJson(),
203
+ };
204
+ return wrapper;
205
+ }
206
+ async execute(config) {
207
+ const query = buildQueryString(config.query);
208
+ const url = `${this.options.baseUrl}${config.path}${query}`;
209
+ const bodyType = config.bodyType
210
+ ?? (config.rawBody !== undefined ? "raw" : "json");
211
+ const retry = { ...this.options.retry, ...(config.retry ?? {}) };
212
+ const timeoutMs = config.timeoutMs ?? this.options.timeoutMs;
213
+ const headers = buildHeaders({
214
+ ...(config.headers ?? {}),
215
+ defaultHeaders: this.options.defaultHeaders,
216
+ userAgent: this.options.userAgent,
217
+ bodyType,
218
+ });
219
+ const body = this.encodeBody(config, bodyType);
220
+ let attempt = 0;
221
+ let lastError = null;
222
+ while (true) {
223
+ attempt += 1;
224
+ const attemptController = new AbortController();
225
+ const timeoutHandle = setTimeout(() => attemptController.abort(), timeoutMs);
226
+ const signal = combineSignals(config.signal, attemptController.signal);
227
+ let response;
228
+ try {
229
+ response = await this.options.fetch(url, {
230
+ method: config.method,
231
+ headers,
232
+ body,
233
+ signal,
234
+ });
235
+ }
236
+ catch (fetchError) {
237
+ clearTimeout(timeoutHandle);
238
+ const isAbort = signal.aborted || (fetchError instanceof Error && (fetchError.name === "AbortError" || fetchError.message.includes("aborted")));
239
+ if (isAbort && config.signal?.aborted) {
240
+ throw new ComposeTimeoutError({ message: "request aborted" });
241
+ }
242
+ if (isAbort) {
243
+ lastError = new ComposeTimeoutError({
244
+ message: `request timed out after ${timeoutMs}ms`,
245
+ });
246
+ }
247
+ else {
248
+ lastError = new ComposeConnectionError({
249
+ message: fetchError instanceof Error ? fetchError.message : String(fetchError),
250
+ cause: fetchError,
251
+ });
252
+ }
253
+ if (config.doNotRetry || attempt > retry.maxRetries)
254
+ throw lastError;
255
+ await delay(this.computeBackoff(attempt, retry), config.signal);
256
+ continue;
257
+ }
258
+ clearTimeout(timeoutHandle);
259
+ if (response.ok) {
260
+ const data = config.expectStream ? undefined : await this.parseResponseBody(response);
261
+ return { data, response };
262
+ }
263
+ const errorBody = await this.safeReadJson(response);
264
+ const parsed = parseErrorBody(errorBody);
265
+ const requestId = response.headers.get("x-request-id") ?? response.headers.get("X-Request-Id") ?? undefined;
266
+ const retryAfterHeader = response.headers.get("retry-after");
267
+ const retryAfter = retryAfterHeader ? Math.max(0, parseInt(retryAfterHeader, 10)) : undefined;
268
+ const paymentRequired = response.status === 402
269
+ ? extractPaymentRequired(errorBody, response.headers.get("payment-required") ?? response.headers.get("PAYMENT-REQUIRED"))
270
+ : null;
271
+ const apiError = buildApiError({
272
+ status: response.status,
273
+ code: parsed.code,
274
+ message: parsed.message,
275
+ details: parsed.details,
276
+ requestId: requestId ?? undefined,
277
+ headers: headersToRecord(response.headers),
278
+ body: errorBody,
279
+ paymentRequired,
280
+ paymentRequiredHeader: response.headers.get("payment-required") ?? response.headers.get("PAYMENT-REQUIRED"),
281
+ retryAfter,
282
+ });
283
+ const isRetryable = RETRYABLE_STATUSES.has(response.status) && !config.doNotRetry;
284
+ if (isRetryable && attempt <= retry.maxRetries) {
285
+ const wait = apiError instanceof RateLimitError && apiError.retryAfter
286
+ ? apiError.retryAfter * 1000
287
+ : this.computeBackoff(attempt, retry);
288
+ await delay(wait, config.signal);
289
+ continue;
290
+ }
291
+ throw apiError;
292
+ }
293
+ }
294
+ computeBackoff(attempt, retry) {
295
+ const base = Math.min(retry.initialDelayMs * (2 ** (attempt - 1)), retry.maxDelayMs);
296
+ if (!retry.jitter)
297
+ return base;
298
+ // Full jitter — uniformly between 0 and base.
299
+ return Math.random() * base;
300
+ }
301
+ encodeBody(config, bodyType) {
302
+ if (config.method === "GET" || config.method === "HEAD")
303
+ return undefined;
304
+ if (config.rawBody !== undefined)
305
+ return config.rawBody;
306
+ if (bodyType === "json" && config.body !== undefined)
307
+ return JSON.stringify(config.body);
308
+ return undefined;
309
+ }
310
+ async parseResponseBody(response) {
311
+ const contentType = response.headers.get("content-type") || "";
312
+ if (contentType.includes("application/json")) {
313
+ const text = await response.text();
314
+ if (!text)
315
+ return undefined;
316
+ return JSON.parse(text);
317
+ }
318
+ if (contentType.startsWith("text/")) {
319
+ return (await response.text());
320
+ }
321
+ // Binary responses (audio/speech, etc.) return the raw Response via
322
+ // asResponse(); the generic T is set to undefined for callers who do
323
+ // not ask for the Response directly.
324
+ return undefined;
325
+ }
326
+ async safeReadJson(response) {
327
+ try {
328
+ const text = await response.text();
329
+ if (!text)
330
+ return null;
331
+ try {
332
+ return JSON.parse(text);
333
+ }
334
+ catch {
335
+ return text;
336
+ }
337
+ }
338
+ catch {
339
+ return null;
340
+ }
341
+ }
342
+ }
343
+ function headersToRecord(headers) {
344
+ const record = {};
345
+ headers.forEach((value, key) => {
346
+ record[key] = value;
347
+ });
348
+ return record;
349
+ }
350
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}