@codespar/sdk 0.11.0 → 0.12.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 (73) hide show
  1. package/README.md +69 -0
  2. package/dist/__tests__/abort.test.d.ts +2 -0
  3. package/dist/__tests__/abort.test.d.ts.map +1 -0
  4. package/dist/__tests__/abort.test.js +70 -0
  5. package/dist/__tests__/abort.test.js.map +1 -0
  6. package/dist/__tests__/api-client.test.d.ts +7 -0
  7. package/dist/__tests__/api-client.test.d.ts.map +1 -0
  8. package/dist/__tests__/api-client.test.js +286 -0
  9. package/dist/__tests__/api-client.test.js.map +1 -0
  10. package/dist/__tests__/close-timeout.test.d.ts +2 -0
  11. package/dist/__tests__/close-timeout.test.d.ts.map +1 -0
  12. package/dist/__tests__/close-timeout.test.js +57 -0
  13. package/dist/__tests__/close-timeout.test.js.map +1 -0
  14. package/dist/__tests__/codespar.test.js +11 -0
  15. package/dist/__tests__/codespar.test.js.map +1 -1
  16. package/dist/__tests__/connections-timeout.test.d.ts +2 -0
  17. package/dist/__tests__/connections-timeout.test.d.ts.map +1 -0
  18. package/dist/__tests__/connections-timeout.test.js +58 -0
  19. package/dist/__tests__/connections-timeout.test.js.map +1 -0
  20. package/dist/__tests__/fetch-timeout.test.d.ts +2 -0
  21. package/dist/__tests__/fetch-timeout.test.d.ts.map +1 -0
  22. package/dist/__tests__/fetch-timeout.test.js +137 -0
  23. package/dist/__tests__/fetch-timeout.test.js.map +1 -0
  24. package/dist/__tests__/openapi-snapshot.test.d.ts +13 -0
  25. package/dist/__tests__/openapi-snapshot.test.d.ts.map +1 -0
  26. package/dist/__tests__/openapi-snapshot.test.js +79 -0
  27. package/dist/__tests__/openapi-snapshot.test.js.map +1 -0
  28. package/dist/__tests__/shop.test.js +1 -1
  29. package/dist/__tests__/shop.test.js.map +1 -1
  30. package/dist/__tests__/stream-timeout.test.d.ts +2 -0
  31. package/dist/__tests__/stream-timeout.test.d.ts.map +1 -0
  32. package/dist/__tests__/stream-timeout.test.js +335 -0
  33. package/dist/__tests__/stream-timeout.test.js.map +1 -0
  34. package/dist/api/client.d.ts +56 -0
  35. package/dist/api/client.d.ts.map +1 -0
  36. package/dist/api/client.js +221 -0
  37. package/dist/api/client.js.map +1 -0
  38. package/dist/api/types.d.ts +110 -0
  39. package/dist/api/types.d.ts.map +1 -0
  40. package/dist/api/types.js +10 -0
  41. package/dist/api/types.js.map +1 -0
  42. package/dist/errors.d.ts +5 -0
  43. package/dist/errors.d.ts.map +1 -1
  44. package/dist/errors.js +9 -0
  45. package/dist/errors.js.map +1 -1
  46. package/dist/generated/openapi.d.ts +22004 -0
  47. package/dist/generated/openapi.d.ts.map +1 -0
  48. package/dist/generated/openapi.js +2 -0
  49. package/dist/generated/openapi.js.map +1 -0
  50. package/dist/generated/operations.d.ts +1084 -0
  51. package/dist/generated/operations.d.ts.map +1 -0
  52. package/dist/generated/operations.js +225 -0
  53. package/dist/generated/operations.js.map +1 -0
  54. package/dist/index.d.ts +24 -4
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +32 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/internal/abort.d.ts +18 -0
  59. package/dist/internal/abort.d.ts.map +1 -0
  60. package/dist/internal/abort.js +42 -0
  61. package/dist/internal/abort.js.map +1 -0
  62. package/dist/internal/fetch.d.ts +23 -0
  63. package/dist/internal/fetch.d.ts.map +1 -0
  64. package/dist/internal/fetch.js +57 -0
  65. package/dist/internal/fetch.js.map +1 -0
  66. package/dist/session.d.ts +3 -2
  67. package/dist/session.d.ts.map +1 -1
  68. package/dist/session.js +339 -161
  69. package/dist/session.js.map +1 -1
  70. package/dist/types.d.ts +3 -0
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/types.js.map +1 -1
  73. package/package.json +7 -3
@@ -0,0 +1,335 @@
1
+ import { describe, it, expect, afterEach, vi } from "vitest";
2
+ import { CodeSpar } from "../index.js";
3
+ import { TimeoutError } from "../errors.js";
4
+ const realFetch = globalThis.fetch;
5
+ afterEach(() => { globalThis.fetch = realFetch; vi.useRealTimers(); });
6
+ function sse(chunks, gapMs) {
7
+ const enc = new TextEncoder();
8
+ let i = 0;
9
+ return new ReadableStream({
10
+ pull(ctrl) {
11
+ if (i >= chunks.length)
12
+ return new Promise(() => { }); // then idle forever
13
+ const c = chunks[i++];
14
+ return new Promise((r) => setTimeout(() => { ctrl.enqueue(enc.encode(c)); r(); }, gapMs));
15
+ },
16
+ });
17
+ }
18
+ function sessionCreate() {
19
+ return { ok: true, status: 201, text: async () => "", json: async () => ({
20
+ id: "ses_s", org_id: "o", user_id: "u", servers: [],
21
+ status: "active", created_at: new Date().toISOString(), closed_at: null,
22
+ }) };
23
+ }
24
+ function trackedSse(chunks, gapMs) {
25
+ const enc = new TextEncoder();
26
+ let i = 0;
27
+ const state = { cancelled: false };
28
+ const stream = new ReadableStream({
29
+ pull(ctrl) {
30
+ if (i >= chunks.length)
31
+ return new Promise(() => { });
32
+ const c = chunks[i++];
33
+ return new Promise((r) => setTimeout(() => { ctrl.enqueue(enc.encode(c)); r(); }, gapMs));
34
+ },
35
+ cancel() { state.cancelled = true; },
36
+ });
37
+ return { stream, state };
38
+ }
39
+ describe("stream idle timeout", () => {
40
+ it("delivers TimeoutError even when reader.cancel() never resolves", async () => {
41
+ // Pathological/degraded stream: cancel() returns a promise that
42
+ // never settles. Parser cleanup must not block delivery of the
43
+ // timeout to the caller.
44
+ const enc = new TextEncoder();
45
+ let sent = false;
46
+ const stream = new ReadableStream({
47
+ pull(ctrl) {
48
+ if (sent)
49
+ return new Promise(() => { }); // idle forever after 1 event
50
+ sent = true;
51
+ ctrl.enqueue(enc.encode('event: assistant_text\ndata: {"content":"hi","iteration":1}\n\n'));
52
+ },
53
+ cancel() { return new Promise(() => { }); }, // never resolves
54
+ });
55
+ globalThis.fetch = ((url) => {
56
+ if (String(url).endsWith("/v1/sessions"))
57
+ return Promise.resolve(sessionCreate());
58
+ return Promise.resolve({ ok: true, body: stream });
59
+ });
60
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 50 });
61
+ const session = await cs.create("u");
62
+ await expect(async () => {
63
+ for await (const _ of session.sendStream("hi")) { /* drain */ }
64
+ }).rejects.toBeInstanceOf(TimeoutError);
65
+ }, 5000);
66
+ it("sendStream throws TimeoutError when the stream goes idle past the window", async () => {
67
+ globalThis.fetch = ((url) => {
68
+ if (String(url).endsWith("/v1/sessions"))
69
+ return Promise.resolve(sessionCreate());
70
+ return Promise.resolve({ ok: true, body: sse(['event: assistant_text\ndata: {"content":"hi","iteration":1}\n\n'], 0) });
71
+ });
72
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 50 });
73
+ const session = await cs.create("u");
74
+ await expect(async () => {
75
+ for await (const _ of session.sendStream("hi")) { /* drain; stream idles after 1 event */ }
76
+ }).rejects.toBeInstanceOf(TimeoutError);
77
+ }, 5000);
78
+ it("sendStream times out when the initial fetch never returns headers/body", async () => {
79
+ // Backend accepts the connection but never sends SSE headers/body.
80
+ // Mirrors native fetch: hangs until the signal aborts, then rejects
81
+ // with the signal reason.
82
+ globalThis.fetch = ((url, init) => {
83
+ if (String(url).endsWith("/v1/sessions"))
84
+ return Promise.resolve(sessionCreate());
85
+ return new Promise((_res, rej) => {
86
+ init?.signal?.addEventListener("abort", () => rej(init.signal.reason), { once: true });
87
+ });
88
+ });
89
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 50 });
90
+ const session = await cs.create("u");
91
+ await expect(async () => {
92
+ for await (const _ of session.sendStream("hi")) { /* never reached */ }
93
+ }).rejects.toBeInstanceOf(TimeoutError);
94
+ }, 5000);
95
+ it("paymentStatusStream times out when the initial fetch never returns headers/body", async () => {
96
+ globalThis.fetch = ((url, init) => {
97
+ if (String(url).endsWith("/v1/sessions"))
98
+ return Promise.resolve(sessionCreate());
99
+ return new Promise((_res, rej) => {
100
+ init?.signal?.addEventListener("abort", () => rej(init.signal.reason), { once: true });
101
+ });
102
+ });
103
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 10_000 });
104
+ const session = await cs.create("u");
105
+ await expect(session.paymentStatusStream("tc1", { timeout: 50, onUpdate() { } })).rejects.toBeInstanceOf(TimeoutError);
106
+ }, 5000);
107
+ it("paymentStatusStream stays alive while only heartbeat frames arrive", async () => {
108
+ // Healthy long-pending flow: snapshot, then several SSE comment
109
+ // heartbeats spaced below the idle window across more than one
110
+ // window, then a terminal done. Heartbeats are complete frames —
111
+ // they must keep the stream alive (parity with Python httpx, whose
112
+ // read timeout is reset by any incoming bytes).
113
+ const snapshot = 'event: snapshot\ndata: {"tool_call_id":"tc1","payment_status":"pending","idempotency_key":null,"original_status":"success","hosted_url":null,"events":[]}\n\n';
114
+ const done = 'event: done\ndata: {}\n\n';
115
+ const enc = new TextEncoder();
116
+ let stopped = false;
117
+ let step = 0;
118
+ // timeout 80ms; heartbeat every 40ms × 5 = 200ms (> 2 windows).
119
+ const stream = new ReadableStream({
120
+ pull(ctrl) {
121
+ return new Promise((r) => setTimeout(() => {
122
+ if (stopped)
123
+ return r();
124
+ if (step === 0)
125
+ ctrl.enqueue(enc.encode(snapshot));
126
+ else if (step <= 5)
127
+ ctrl.enqueue(enc.encode(":heartbeat\n\n"));
128
+ else {
129
+ ctrl.enqueue(enc.encode(done));
130
+ ctrl.close();
131
+ }
132
+ step++;
133
+ r();
134
+ }, step === 0 ? 0 : 40));
135
+ },
136
+ cancel() { stopped = true; },
137
+ });
138
+ globalThis.fetch = ((url) => {
139
+ if (String(url).endsWith("/v1/sessions"))
140
+ return Promise.resolve(sessionCreate());
141
+ return Promise.resolve({ ok: true, body: stream });
142
+ });
143
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 10_000 });
144
+ const session = await cs.create("u");
145
+ const result = await session.paymentStatusStream("tc1", { timeout: 80, onUpdate() { } });
146
+ expect(result.payment_status).toBe("pending");
147
+ }, 5000);
148
+ it("cancels the response body when the idle timeout fires", async () => {
149
+ const { stream, state } = trackedSse(['event: assistant_text\ndata: {"content":"hi","iteration":1}\n\n'], 0);
150
+ globalThis.fetch = ((url) => {
151
+ if (String(url).endsWith("/v1/sessions"))
152
+ return Promise.resolve(sessionCreate());
153
+ return Promise.resolve({ ok: true, body: stream });
154
+ });
155
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 50 });
156
+ const session = await cs.create("u");
157
+ await expect(async () => {
158
+ for await (const _ of session.sendStream("hi")) { /* drain */ }
159
+ }).rejects.toBeInstanceOf(TimeoutError);
160
+ expect(state.cancelled).toBe(true);
161
+ }, 5000);
162
+ it("propagates the caller's abort reason (not TimeoutError) and cancels the body", async () => {
163
+ const { stream, state } = trackedSse([], 0); // never emits
164
+ globalThis.fetch = ((url) => {
165
+ if (String(url).endsWith("/v1/sessions"))
166
+ return Promise.resolve(sessionCreate());
167
+ return Promise.resolve({ ok: true, body: stream });
168
+ });
169
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 10_000 });
170
+ const session = await cs.create("u");
171
+ const ac = new AbortController();
172
+ const reason = new DOMException("user cancelled", "AbortError");
173
+ const iterate = (async () => {
174
+ // CallOptions is part of the public Session contract — no cast needed.
175
+ for await (const _ of session.sendStream("hi", { signal: ac.signal })) { /* drain */ }
176
+ })();
177
+ queueMicrotask(() => ac.abort(reason));
178
+ await expect(iterate).rejects.toBe(reason);
179
+ expect(state.cancelled).toBe(true);
180
+ }, 5000);
181
+ it("paymentStatusStream: per-call timeout overrides the client default", async () => {
182
+ // Stream emits one snapshot frame then idles forever.
183
+ const snapshotFrame = 'event: snapshot\ndata: {"tool_call_id":"tc1","payment_status":"pending","idempotency_key":null,"original_status":"success","hosted_url":null,"events":[]}\n\n';
184
+ globalThis.fetch = ((url) => {
185
+ if (String(url).endsWith("/v1/sessions"))
186
+ return Promise.resolve(sessionCreate());
187
+ // Any payment-status/stream URL: emit one frame then idle forever.
188
+ return Promise.resolve({ ok: true, body: sse([snapshotFrame], 0) });
189
+ });
190
+ // Client default is intentionally large; per-call override is 50 ms.
191
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 10_000 });
192
+ const session = await cs.create("u");
193
+ await expect(session.paymentStatusStream("tc1", { timeout: 50, onUpdate() { } })).rejects.toBeInstanceOf(TimeoutError);
194
+ }, 5000);
195
+ it("drains a steady multi-frame stream without timing out", async () => {
196
+ const frames = Array.from({ length: 12 }, (_, n) => `event: assistant_text\ndata: {"content":"c${n}","iteration":${n}}\n\n`);
197
+ // Use a stream that closes (ctrl.close()) after all frames so the parser
198
+ // sees done=true rather than idling forever post-last-frame.
199
+ const enc = new TextEncoder();
200
+ let fi = 0;
201
+ const closingStream = new ReadableStream({
202
+ pull(ctrl) {
203
+ if (fi >= frames.length) {
204
+ ctrl.close();
205
+ return;
206
+ }
207
+ const c = frames[fi++];
208
+ return new Promise((r) => setTimeout(() => { ctrl.enqueue(enc.encode(c)); r(); }, 5));
209
+ },
210
+ });
211
+ globalThis.fetch = ((url) => {
212
+ if (String(url).endsWith("/v1/sessions"))
213
+ return Promise.resolve(sessionCreate());
214
+ return Promise.resolve({ ok: true, body: closingStream });
215
+ });
216
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 500 });
217
+ const session = await cs.create("u");
218
+ let count = 0;
219
+ for await (const ev of session.sendStream("hi")) {
220
+ if (ev.type === "assistant_text")
221
+ count++;
222
+ }
223
+ expect(count).toBe(12);
224
+ }, 5000);
225
+ it("does not time out when the consumer is slow between events", async () => {
226
+ // Network delivers two frames promptly; the consumer spends longer
227
+ // than the idle window processing the first one. The idle timer is
228
+ // a TRANSPORT idle timeout — consumer processing time must not count
229
+ // against it, otherwise healthy streams with heavy per-event work
230
+ // false-timeout.
231
+ const enc = new TextEncoder();
232
+ const frames = [
233
+ 'event: assistant_text\ndata: {"content":"a","iteration":0}\n\n',
234
+ 'event: assistant_text\ndata: {"content":"b","iteration":1}\n\n',
235
+ ];
236
+ let fi = 0;
237
+ // highWaterMark 0 → pull only fires on an actual read(), so the
238
+ // post-sleep read genuinely waits on the network instead of
239
+ // replaying a pre-buffered frame (which would mask the bug).
240
+ const closing = new ReadableStream({
241
+ pull(ctrl) {
242
+ if (fi >= frames.length) {
243
+ ctrl.close();
244
+ return;
245
+ }
246
+ const c = frames[fi++];
247
+ return new Promise((r) => setTimeout(() => { ctrl.enqueue(enc.encode(c)); r(); }, 10));
248
+ },
249
+ }, { highWaterMark: 0 });
250
+ globalThis.fetch = ((url) => {
251
+ if (String(url).endsWith("/v1/sessions"))
252
+ return Promise.resolve(sessionCreate());
253
+ return Promise.resolve({ ok: true, body: closing });
254
+ });
255
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 80 });
256
+ const session = await cs.create("u");
257
+ let count = 0;
258
+ for await (const ev of session.sendStream("hi")) {
259
+ if (ev.type === "assistant_text") {
260
+ count++;
261
+ // Heavy per-event work, longer than the 80ms idle window.
262
+ await new Promise((r) => setTimeout(r, 160));
263
+ }
264
+ }
265
+ expect(count).toBe(2);
266
+ }, 5000);
267
+ it("handles a final unterminated frame with a slow consumer without firing the idle timer", async () => {
268
+ // Last frame has no trailing "\n\n"; the stream then closes, so the
269
+ // event is emitted from the buffer.trim() branch. A slow consumer
270
+ // there must not trip the idle timer (no unhandled rejection / no
271
+ // false timeout) — the trailing yield pauses idle too.
272
+ const enc = new TextEncoder();
273
+ const chunks = [
274
+ 'event: assistant_text\ndata: {"content":"a","iteration":0}\n\n',
275
+ 'event: assistant_text\ndata: {"content":"b","iteration":1}', // no \n\n
276
+ ];
277
+ let ci = 0;
278
+ const closing = new ReadableStream({
279
+ pull(ctrl) {
280
+ if (ci >= chunks.length) {
281
+ ctrl.close();
282
+ return;
283
+ }
284
+ const c = chunks[ci++];
285
+ return new Promise((r) => setTimeout(() => { ctrl.enqueue(enc.encode(c)); r(); }, 10));
286
+ },
287
+ }, { highWaterMark: 0 });
288
+ globalThis.fetch = ((url) => {
289
+ if (String(url).endsWith("/v1/sessions"))
290
+ return Promise.resolve(sessionCreate());
291
+ return Promise.resolve({ ok: true, body: closing });
292
+ });
293
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 60 });
294
+ const session = await cs.create("u");
295
+ let count = 0;
296
+ for await (const ev of session.sendStream("hi")) {
297
+ if (ev.type === "assistant_text") {
298
+ count++;
299
+ await new Promise((r) => setTimeout(r, 120)); // > idle window
300
+ }
301
+ }
302
+ expect(count).toBe(2);
303
+ }, 5000);
304
+ it("times out on a byte trickle that never completes an SSE frame", async () => {
305
+ // Server dribbles bytes faster than the idle window but never emits
306
+ // a complete "\n\n" frame. The idle timer must reset per PARSED
307
+ // event, not per raw read — otherwise the trickle resets it forever
308
+ // and the hang is never detected.
309
+ const enc = new TextEncoder();
310
+ const partial = "event: assistant_text\n"; // no blank line → no frame
311
+ let stopped = false;
312
+ const trickle = new ReadableStream({
313
+ pull(ctrl) {
314
+ return new Promise((r) => setTimeout(() => {
315
+ if (stopped)
316
+ return r();
317
+ ctrl.enqueue(enc.encode(partial));
318
+ r();
319
+ }, 20));
320
+ },
321
+ cancel() { stopped = true; },
322
+ });
323
+ globalThis.fetch = ((url) => {
324
+ if (String(url).endsWith("/v1/sessions"))
325
+ return Promise.resolve(sessionCreate());
326
+ return Promise.resolve({ ok: true, body: trickle });
327
+ });
328
+ const cs = new CodeSpar({ apiKey: "csk_live_t", baseUrl: "https://x", timeout: 120 });
329
+ const session = await cs.create("u");
330
+ await expect(async () => {
331
+ for await (const _ of session.sendStream("hi")) { /* never a full frame */ }
332
+ }).rejects.toBeInstanceOf(TimeoutError);
333
+ }, 5000);
334
+ });
335
+ //# sourceMappingURL=stream-timeout.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-timeout.test.js","sourceRoot":"","sources":["../../src/__tests__/stream-timeout.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Thin REST client typed by path and method from the served OpenAPI
3
+ * document. There is no per-route code here: the route list, the
4
+ * parameter shapes and the response shapes all come from the generated
5
+ * files under ../generated/, and the only runtime knowledge per
6
+ * operation is the generated table row (body/accept content types).
7
+ *
8
+ * Errors follow the rest of the SDK: `request()` throws
9
+ * `CodesparApiError` on a non-2xx status (the parsed body is on
10
+ * `e.body`), network failures surface as `status: 0`, and timeouts as
11
+ * `TimeoutError`. `response()` returns every documented status as a
12
+ * value instead, for routes where a 402/403/422 body is an outcome to
13
+ * branch on (wallet execute, for one) rather than a failure.
14
+ */
15
+ import type { ApiMethod, ApiOperation, ApiPath, ApiPathsFor, ApiRequestArgs, ApiResponse, ApiSuccess } from "./types.js";
16
+ export interface ApiClientConfig {
17
+ baseUrl: string;
18
+ apiKey: string;
19
+ projectId?: string;
20
+ /** Default per-call timeout in milliseconds. */
21
+ timeout: number;
22
+ }
23
+ export declare class ApiClient {
24
+ private readonly baseUrl;
25
+ private readonly headers;
26
+ private readonly timeout;
27
+ constructor(config: ApiClientConfig);
28
+ /** Every `METHOD /path` the generated client can reach, in document order. */
29
+ static operations(): ReadonlyArray<{
30
+ method: ApiMethod;
31
+ path: ApiPath;
32
+ }>;
33
+ /**
34
+ * Call an operation and return the documented 2xx data. Non-2xx
35
+ * statuses throw `CodesparApiError` with the parsed body on `e.body`.
36
+ * `text/event-stream` operations resolve to the raw `Response` once
37
+ * headers arrive; its body stays bound to `signal`, not to `timeout`.
38
+ */
39
+ request<M extends ApiMethod, P extends ApiPathsFor<M>>(method: M, path: P, ...args: ApiRequestArgs<ApiOperation<P, M>>): Promise<ApiSuccess<ApiOperation<P, M>>>;
40
+ /**
41
+ * Call an operation and return whatever documented status came back,
42
+ * as `{ status, ok, data, response }` discriminated on `status`. Only
43
+ * transport failures (network, timeout, abort) throw.
44
+ */
45
+ response<M extends ApiMethod, P extends ApiPathsFor<M>>(method: M, path: P, ...args: ApiRequestArgs<ApiOperation<P, M>>): Promise<ApiResponse<ApiOperation<P, M>>>;
46
+ get<P extends ApiPathsFor<"get">>(path: P, ...args: ApiRequestArgs<ApiOperation<P, "get">>): Promise<ApiSuccess<ApiOperation<P, "get">>>;
47
+ post<P extends ApiPathsFor<"post">>(path: P, ...args: ApiRequestArgs<ApiOperation<P, "post">>): Promise<ApiSuccess<ApiOperation<P, "post">>>;
48
+ put<P extends ApiPathsFor<"put">>(path: P, ...args: ApiRequestArgs<ApiOperation<P, "put">>): Promise<ApiSuccess<ApiOperation<P, "put">>>;
49
+ patch<P extends ApiPathsFor<"patch">>(path: P, ...args: ApiRequestArgs<ApiOperation<P, "patch">>): Promise<ApiSuccess<ApiOperation<P, "patch">>>;
50
+ delete<P extends ApiPathsFor<"delete">>(path: P, ...args: ApiRequestArgs<ApiOperation<P, "delete">>): Promise<ApiSuccess<ApiOperation<P, "delete">>>;
51
+ private dispatch;
52
+ private stream;
53
+ private transportError;
54
+ }
55
+ export declare function createApiClient(config: ApiClientConfig): ApiClient;
56
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACX,MAAM,YAAY,CAAC;AASpB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AAoFD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,eAAe;IAQnC,8EAA8E;IAC9E,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAIxE;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EACnD,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,CAAC,EACP,GAAG,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC1C,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAM1C;;;;OAIG;IACH,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EACpD,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,CAAC,EACP,GAAG,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC1C,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAM3C,GAAG,CAAC,CAAC,SAAS,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAG1F,IAAI,CAAC,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAG7F,GAAG,CAAC,CAAC,SAAS,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAG1F,KAAK,CAAC,CAAC,SAAS,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAGhG,MAAM,CAAC,CAAC,SAAS,WAAW,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAIrF,QAAQ;YA0DR,MAAM;IA6BpB,OAAO,CAAC,cAAc;CAMvB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Thin REST client typed by path and method from the served OpenAPI
3
+ * document. There is no per-route code here: the route list, the
4
+ * parameter shapes and the response shapes all come from the generated
5
+ * files under ../generated/, and the only runtime knowledge per
6
+ * operation is the generated table row (body/accept content types).
7
+ *
8
+ * Errors follow the rest of the SDK: `request()` throws
9
+ * `CodesparApiError` on a non-2xx status (the parsed body is on
10
+ * `e.body`), network failures surface as `status: 0`, and timeouts as
11
+ * `TimeoutError`. `response()` returns every documented status as a
12
+ * value instead, for routes where a 402/403/422 body is an outcome to
13
+ * branch on (wallet execute, for one) rather than a failure.
14
+ */
15
+ import { API_OPERATIONS } from "../generated/operations.js";
16
+ import { fetchWithTimeout, validateTimeout } from "../internal/fetch.js";
17
+ import { CodesparApiError, TimeoutError, networkErrorToApiError, throwFromResponse, } from "../errors.js";
18
+ const OPERATION_INDEX = new Map(API_OPERATIONS.map((row) => [`${row.method} ${row.path}`, row]));
19
+ const SSE = "text/event-stream";
20
+ const FORM = "application/x-www-form-urlencoded";
21
+ function appendQuery(url, query) {
22
+ if (!query || typeof query !== "object")
23
+ return;
24
+ for (const [key, value] of Object.entries(query)) {
25
+ if (value === undefined || value === null)
26
+ continue;
27
+ const values = Array.isArray(value) ? value : [value];
28
+ for (const v of values) {
29
+ if (v === undefined || v === null)
30
+ continue;
31
+ url.searchParams.append(key, typeof v === "object" ? JSON.stringify(v) : String(v));
32
+ }
33
+ }
34
+ }
35
+ /**
36
+ * Expand `{name}` segments with encoded values. A missing value throws
37
+ * before any request is made: an unexpanded `{id}` would reach the
38
+ * backend as a literal and 404 in a way that reads like a data problem.
39
+ */
40
+ function expandPath(template, params) {
41
+ const values = (params ?? {});
42
+ const missing = [];
43
+ const expanded = template.replace(/\{([^}]+)\}/g, (_, name) => {
44
+ const v = values[name];
45
+ if (v === undefined || v === null || v === "") {
46
+ missing.push(name);
47
+ return "";
48
+ }
49
+ return encodeURIComponent(String(v));
50
+ });
51
+ if (missing.length) {
52
+ throw new Error(`${template}: missing path parameter${missing.length > 1 ? "s" : ""} ${missing.join(", ")}`);
53
+ }
54
+ return expanded;
55
+ }
56
+ function serialiseBody(contentType, body) {
57
+ if (body === undefined)
58
+ return undefined;
59
+ if (contentType === FORM) {
60
+ const form = new URLSearchParams();
61
+ for (const [k, v] of Object.entries(body)) {
62
+ if (v !== undefined && v !== null)
63
+ form.append(k, String(v));
64
+ }
65
+ return form;
66
+ }
67
+ return JSON.stringify(body);
68
+ }
69
+ async function readBody(res) {
70
+ if (res.status === 204 || res.status === 205)
71
+ return undefined;
72
+ const text = await res.text();
73
+ if (text === "")
74
+ return undefined;
75
+ const type = res.headers.get("content-type") ?? "";
76
+ if (/\bjson\b/i.test(type)) {
77
+ try {
78
+ return JSON.parse(text);
79
+ }
80
+ catch {
81
+ return text;
82
+ }
83
+ }
84
+ return text;
85
+ }
86
+ export class ApiClient {
87
+ baseUrl;
88
+ headers;
89
+ timeout;
90
+ constructor(config) {
91
+ validateTimeout(config.timeout);
92
+ this.baseUrl = config.baseUrl.replace(/\/+$/, "");
93
+ this.timeout = config.timeout;
94
+ this.headers = { Authorization: `Bearer ${config.apiKey}` };
95
+ if (config.projectId)
96
+ this.headers["x-codespar-project"] = config.projectId;
97
+ }
98
+ /** Every `METHOD /path` the generated client can reach, in document order. */
99
+ static operations() {
100
+ return API_OPERATIONS.map((row) => ({ method: row.method, path: row.path }));
101
+ }
102
+ /**
103
+ * Call an operation and return the documented 2xx data. Non-2xx
104
+ * statuses throw `CodesparApiError` with the parsed body on `e.body`.
105
+ * `text/event-stream` operations resolve to the raw `Response` once
106
+ * headers arrive; its body stays bound to `signal`, not to `timeout`.
107
+ */
108
+ request(method, path, ...args) {
109
+ return this.dispatch(method, path, args[0], "throw");
110
+ }
111
+ /**
112
+ * Call an operation and return whatever documented status came back,
113
+ * as `{ status, ok, data, response }` discriminated on `status`. Only
114
+ * transport failures (network, timeout, abort) throw.
115
+ */
116
+ response(method, path, ...args) {
117
+ return this.dispatch(method, path, args[0], "return");
118
+ }
119
+ get(path, ...args) {
120
+ return this.request("get", path, ...args);
121
+ }
122
+ post(path, ...args) {
123
+ return this.request("post", path, ...args);
124
+ }
125
+ put(path, ...args) {
126
+ return this.request("put", path, ...args);
127
+ }
128
+ patch(path, ...args) {
129
+ return this.request("patch", path, ...args);
130
+ }
131
+ delete(path, ...args) {
132
+ return this.request("delete", path, ...args);
133
+ }
134
+ async dispatch(method, path, options, mode) {
135
+ const row = OPERATION_INDEX.get(`${method} ${path}`);
136
+ if (!row) {
137
+ throw new Error(`${method.toUpperCase()} ${path} is not an operation of the OpenAPI document this client was generated from`);
138
+ }
139
+ const what = `${method.toUpperCase()} ${path}`;
140
+ const opts = (options ?? {});
141
+ const timeout = opts.timeout ?? this.timeout;
142
+ validateTimeout(timeout);
143
+ const url = new URL(this.baseUrl + expandPath(path, opts.path));
144
+ appendQuery(url, opts.query);
145
+ const headers = { ...this.headers };
146
+ if (row.accept)
147
+ headers.Accept = row.accept;
148
+ if (row.body && opts.body !== undefined)
149
+ headers["Content-Type"] = row.body;
150
+ for (const [k, v] of Object.entries((opts.header ?? {}))) {
151
+ if (v !== undefined && v !== null)
152
+ headers[k] = String(v);
153
+ }
154
+ const init = {
155
+ method: method.toUpperCase(),
156
+ headers,
157
+ body: row.body ? serialiseBody(row.body, opts.body) : undefined,
158
+ };
159
+ if (row.accept === SSE) {
160
+ return this.stream(url, init, what, timeout, opts.signal, mode);
161
+ }
162
+ try {
163
+ return await fetchWithTimeout(url.toString(), init, { timeout, signal: opts.signal }, async (res) => {
164
+ if (mode === "throw") {
165
+ if (!res.ok)
166
+ await throwFromResponse(res, what);
167
+ return readBody(res);
168
+ }
169
+ return { status: res.status, ok: res.ok, data: await readBody(res), response: res };
170
+ });
171
+ }
172
+ catch (cause) {
173
+ throw this.transportError(cause, what, opts.signal);
174
+ }
175
+ }
176
+ // An SSE response is returned as soon as headers arrive. The timeout
177
+ // covers connect + headers only (a stream has no natural end for a
178
+ // total budget); the caller's signal stays attached so aborting it
179
+ // still cancels the body. Mirrors session.paymentStatusStream, which
180
+ // remains the ergonomic path for the two status streams.
181
+ async stream(url, init, what, timeout, signal, mode) {
182
+ const ac = new AbortController();
183
+ const timer = setTimeout(() => ac.abort(new TimeoutError(timeout)), timeout);
184
+ const onAbort = () => ac.abort(signal?.reason);
185
+ if (signal?.aborted)
186
+ onAbort();
187
+ else
188
+ signal?.addEventListener("abort", onAbort, { once: true });
189
+ try {
190
+ const res = await fetch(url.toString(), { ...init, signal: ac.signal });
191
+ if (mode === "throw") {
192
+ if (!res.ok)
193
+ await throwFromResponse(res, what);
194
+ return res;
195
+ }
196
+ const data = res.ok ? res : await readBody(res);
197
+ return { status: res.status, ok: res.ok, data, response: res };
198
+ }
199
+ catch (cause) {
200
+ if (ac.signal.reason instanceof TimeoutError && !signal?.aborted)
201
+ throw ac.signal.reason;
202
+ throw this.transportError(cause, what, signal);
203
+ }
204
+ finally {
205
+ clearTimeout(timer);
206
+ }
207
+ }
208
+ transportError(cause, what, signal) {
209
+ if (cause instanceof TimeoutError)
210
+ return cause;
211
+ if (cause instanceof CodesparApiError)
212
+ return cause;
213
+ if (signal?.aborted)
214
+ return cause;
215
+ return networkErrorToApiError(cause, what);
216
+ }
217
+ }
218
+ export function createApiClient(config) {
219
+ return new ApiClient(config);
220
+ }
221
+ //# sourceMappingURL=client.js.map