@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.
- package/CHANGELOG.md +64 -0
- package/LICENSE +21 -0
- package/README.md +158 -35
- package/dist/errors.d.ts +145 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +152 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +75 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +68 -0
- package/dist/events.js.map +1 -0
- package/dist/http.d.ts +98 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +350 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +206 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +340 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/inference.d.ts +175 -0
- package/dist/resources/inference.d.ts.map +1 -0
- package/dist/resources/inference.js +740 -0
- package/dist/resources/inference.js.map +1 -0
- package/dist/resources/instrumentation.d.ts +28 -0
- package/dist/resources/instrumentation.d.ts.map +1 -0
- package/dist/resources/instrumentation.js +43 -0
- package/dist/resources/instrumentation.js.map +1 -0
- package/dist/resources/keys.d.ts +54 -0
- package/dist/resources/keys.d.ts.map +1 -0
- package/dist/resources/keys.js +164 -0
- package/dist/resources/keys.js.map +1 -0
- package/dist/resources/models.d.ts +26 -0
- package/dist/resources/models.d.ts.map +1 -0
- package/dist/resources/models.js +52 -0
- package/dist/resources/models.js.map +1 -0
- package/dist/resources/session-events.d.ts +46 -0
- package/dist/resources/session-events.d.ts.map +1 -0
- package/dist/resources/session-events.js +199 -0
- package/dist/resources/session-events.js.map +1 -0
- package/dist/resources/webhooks.d.ts +27 -0
- package/dist/resources/webhooks.d.ts.map +1 -0
- package/dist/resources/webhooks.js +78 -0
- package/dist/resources/webhooks.js.map +1 -0
- package/dist/resources/x402.d.ts +37 -0
- package/dist/resources/x402.d.ts.map +1 -0
- package/dist/resources/x402.js +72 -0
- package/dist/resources/x402.js.map +1 -0
- package/dist/storage.d.ts +27 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +46 -0
- package/dist/storage.js.map +1 -0
- package/dist/streaming/budget.d.ts +22 -0
- package/dist/streaming/budget.d.ts.map +1 -0
- package/dist/streaming/budget.js +40 -0
- package/dist/streaming/budget.js.map +1 -0
- package/dist/streaming/receipt.d.ts +25 -0
- package/dist/streaming/receipt.d.ts.map +1 -0
- package/dist/streaming/receipt.js +92 -0
- package/dist/streaming/receipt.js.map +1 -0
- package/dist/streaming/sse.d.ts +29 -0
- package/dist/streaming/sse.d.ts.map +1 -0
- package/dist/streaming/sse.js +125 -0
- package/dist/streaming/sse.js.map +1 -0
- package/dist/types/index.d.ts +540 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +9 -0
- package/dist/version.js.map +1 -0
- package/package.json +32 -21
- package/index.d.ts +0 -244
- package/index.js +0 -397
package/dist/events.d.ts
ADDED
|
@@ -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
|
package/dist/http.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|