@xpert-ai/xpert-sdk 0.14.0 → 0.16.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/dist/client.d.ts +12 -5
- package/dist/client.js +18 -10
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +18 -10
- package/dist/client.mjs.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/schema.d.ts +13 -3
- package/dist/schema.js.map +1 -1
- package/dist/schema.mjs.map +1 -1
- package/dist/tests/group-workbench-files.test.d.ts +1 -0
- package/dist/tests/group-workbench-files.test.js +107 -0
- package/dist/tests/group-workbench-files.test.js.map +1 -0
- package/dist/tests/group-workbench-files.test.mjs +107 -0
- package/dist/tests/group-workbench-files.test.mjs.map +1 -0
- package/dist/tests/recovery-read.test.d.ts +1 -0
- package/dist/tests/recovery-read.test.js +39 -0
- package/dist/tests/recovery-read.test.js.map +1 -0
- package/dist/tests/recovery-read.test.mjs +39 -0
- package/dist/tests/recovery-read.test.mjs.map +1 -0
- package/dist/tests/run-display-snapshot.test.d.ts +1 -0
- package/dist/tests/run-display-snapshot.test.js +20 -0
- package/dist/tests/run-display-snapshot.test.js.map +1 -0
- package/dist/tests/run-display-snapshot.test.mjs +20 -0
- package/dist/tests/run-display-snapshot.test.mjs.map +1 -0
- package/dist/tests/thread-control.test.js +29 -2
- package/dist/tests/thread-control.test.js.map +1 -1
- package/dist/tests/thread-control.test.mjs +29 -2
- package/dist/tests/thread-control.test.mjs.map +1 -1
- package/dist/utils/async_caller.d.ts +13 -0
- package/dist/utils/async_caller.js +14 -5
- package/dist/utils/async_caller.js.map +1 -1
- package/dist/utils/async_caller.mjs +14 -5
- package/dist/utils/async_caller.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { Client } from "../client.mjs";
|
|
3
|
+
describe('group Workbench native files', () => {
|
|
4
|
+
it.each([
|
|
5
|
+
'https://example.test/api/ai',
|
|
6
|
+
'https://example.test/api/ai/',
|
|
7
|
+
'https://example.test/bosi/api/ai/',
|
|
8
|
+
])('uses the original authenticated file transport for %s', async (apiUrl) => {
|
|
9
|
+
const fetch = vi.fn().mockImplementation(async (url) => {
|
|
10
|
+
if (url.pathname.endsWith('/download')) {
|
|
11
|
+
return new Response(new Uint8Array([0, 255, 1]));
|
|
12
|
+
}
|
|
13
|
+
return new Response('{}', { headers: { 'content-type': 'application/json' } });
|
|
14
|
+
});
|
|
15
|
+
const onRequest = vi.fn((_url, init) => {
|
|
16
|
+
const headers = new Headers(init.headers);
|
|
17
|
+
headers.set('Authorization', 'Bearer test-session');
|
|
18
|
+
return { ...init, headers, credentials: 'include' };
|
|
19
|
+
});
|
|
20
|
+
const client = new Client({
|
|
21
|
+
apiUrl,
|
|
22
|
+
apiKey: 'test-api-key',
|
|
23
|
+
defaultHeaders: { 'organization-id': 'test-org', 'tenant-id': 'test-tenant' },
|
|
24
|
+
callerOptions: { fetch, maxRetries: 0 },
|
|
25
|
+
onRequest,
|
|
26
|
+
});
|
|
27
|
+
const group = client.forGroupWorkbench('group/1');
|
|
28
|
+
const scope = { kind: 'conversation', conversationId: 'conversation/2' };
|
|
29
|
+
const signal = new AbortController().signal;
|
|
30
|
+
const options = { signal };
|
|
31
|
+
const path = 'reports/a #1.txt';
|
|
32
|
+
const base = apiUrl.replace(/\/+$/, '');
|
|
33
|
+
const workspace = `${base}/conversations/conversation%2F2/workspace`;
|
|
34
|
+
await group.workbench.listFiles(scope, '', options);
|
|
35
|
+
await group.workbench.readFile(scope, path, options);
|
|
36
|
+
const download = await group.workbench.downloadFile(scope, path, options);
|
|
37
|
+
await group.workbench.saveFile(scope, path, 'updated', options);
|
|
38
|
+
await group.workbench.uploadFile(scope, 'reports', new Blob(['upload']), 'a.txt', options);
|
|
39
|
+
await group.workbench.saveBinaryFile(scope, 'reports/a.bin', new Blob(['binary']), options);
|
|
40
|
+
await group.workbench.deleteFile(scope, path, options);
|
|
41
|
+
expect(fetch.mock.calls.map(([url, init]) => [
|
|
42
|
+
url.origin + url.pathname,
|
|
43
|
+
init?.method ?? 'GET',
|
|
44
|
+
])).toEqual([
|
|
45
|
+
[`${workspace}/files`, 'GET'],
|
|
46
|
+
[`${workspace}/file`, 'GET'],
|
|
47
|
+
[`${workspace}/file/download`, 'GET'],
|
|
48
|
+
[`${workspace}/file`, 'PUT'],
|
|
49
|
+
[`${workspace}/file/upload`, 'POST'],
|
|
50
|
+
[`${workspace}/file/upload`, 'POST'],
|
|
51
|
+
[`${workspace}/file`, 'DELETE'],
|
|
52
|
+
]);
|
|
53
|
+
expect(fetch.mock.calls[0][0].searchParams.get('path')).toBe('');
|
|
54
|
+
for (const index of [1, 2, 6]) {
|
|
55
|
+
expect(fetch.mock.calls[index][0].searchParams.get('path')).toBe(path);
|
|
56
|
+
}
|
|
57
|
+
expect(new Uint8Array(await download.arrayBuffer())).toEqual(new Uint8Array([0, 255, 1]));
|
|
58
|
+
expect(JSON.parse(fetch.mock.calls[3][1]?.body)).toEqual({
|
|
59
|
+
path,
|
|
60
|
+
content: 'updated',
|
|
61
|
+
});
|
|
62
|
+
for (const [index, filename, contents] of [
|
|
63
|
+
[4, 'a.txt', 'upload'],
|
|
64
|
+
[5, 'a.bin', 'binary'],
|
|
65
|
+
]) {
|
|
66
|
+
const form = fetch.mock.calls[index][1]?.body;
|
|
67
|
+
expect(form.get('path')).toBe('reports');
|
|
68
|
+
const file = form.get('file');
|
|
69
|
+
expect(file.name).toBe(filename);
|
|
70
|
+
expect(await file.text()).toBe(contents);
|
|
71
|
+
}
|
|
72
|
+
for (const [, init] of fetch.mock.calls)
|
|
73
|
+
expect(init?.signal).toBe(signal);
|
|
74
|
+
// Scoping Views must not mutate the parent client or the native file routes.
|
|
75
|
+
await client.workbench.listFiles(scope);
|
|
76
|
+
expect(fetch.mock.calls.at(-1)[0].href).toBe(`${workspace}/files?path=`);
|
|
77
|
+
await group.viewHosts.getData('agent', 'main', 'tasks', {}, {
|
|
78
|
+
runtimeScope: { conversationId: 'conversation/2', projectId: 'project' },
|
|
79
|
+
});
|
|
80
|
+
const [viewUrl, viewInit] = fetch.mock.calls.at(-1);
|
|
81
|
+
expect(viewUrl.href).toContain(`${base}/groups/group%2F1/workbench/agent/main/`);
|
|
82
|
+
expect(new Headers(viewInit?.headers).get('x-xpert-view-conversation-id')).toBe('conversation/2');
|
|
83
|
+
expect(onRequest).toHaveBeenCalledTimes(fetch.mock.calls.length);
|
|
84
|
+
for (const [, init] of fetch.mock.calls) {
|
|
85
|
+
const headers = new Headers(init?.headers);
|
|
86
|
+
expect(headers.get('Authorization')).toBe('Bearer test-session');
|
|
87
|
+
expect(headers.get('x-api-key')).toBe('test-api-key');
|
|
88
|
+
expect(headers.get('organization-id')).toBe('test-org');
|
|
89
|
+
expect(headers.get('tenant-id')).toBe('test-tenant');
|
|
90
|
+
expect(headers.has('x-group-session')).toBe(false);
|
|
91
|
+
expect(init?.credentials).toBe('include');
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
it.each([401, 403])('propagates a server denial (%s) without falling back to another route', async (status) => {
|
|
95
|
+
const fetch = vi
|
|
96
|
+
.fn()
|
|
97
|
+
.mockImplementation(async () => new Response('Access denied', { status }));
|
|
98
|
+
const group = new Client({
|
|
99
|
+
apiUrl: 'https://example.test/api/ai',
|
|
100
|
+
callerOptions: { fetch, maxRetries: 0 },
|
|
101
|
+
}).forGroupWorkbench('group');
|
|
102
|
+
await expect(group.workbench.listFiles({ kind: 'conversation', conversationId: 'other' })).rejects.toThrow();
|
|
103
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
104
|
+
expect(fetch.mock.calls[0][0].pathname).toBe('/api/ai/conversations/other/workspace/files');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=group-workbench-files.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-workbench-files.test.mjs","sourceRoot":"","sources":["../../src/tests/group-workbench-files.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { Client, HTTPError } from "../index.js";
|
|
3
|
+
describe('caller-managed recovery reads', () => {
|
|
4
|
+
it.each(['30', new Date(Date.now() + 60_000).toUTCString()])('exposes Retry-After %s after exactly one configured attempt', async (retryAfter) => {
|
|
5
|
+
const fetch = vi
|
|
6
|
+
.fn()
|
|
7
|
+
.mockResolvedValue(new Response('temporary outage', { status: 503, headers: { 'Retry-After': retryAfter } }));
|
|
8
|
+
const client = new Client({
|
|
9
|
+
apiUrl: 'https://test.example',
|
|
10
|
+
callerOptions: { fetch, maxRetries: 0 },
|
|
11
|
+
});
|
|
12
|
+
const error = await client.threads.get('thread').catch((error) => error);
|
|
13
|
+
expect(error).toBeInstanceOf(HTTPError);
|
|
14
|
+
expect(error.retryAfterMs).toBeGreaterThan(29_000);
|
|
15
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
16
|
+
});
|
|
17
|
+
it('forwards cancellation on status and final-message reads without starting a run', async () => {
|
|
18
|
+
const fetch = vi
|
|
19
|
+
.fn()
|
|
20
|
+
.mockImplementation(async () => Response.json({}));
|
|
21
|
+
const client = new Client({
|
|
22
|
+
apiUrl: 'https://test.example',
|
|
23
|
+
callerOptions: { fetch, maxRetries: 0 },
|
|
24
|
+
});
|
|
25
|
+
const signal = new AbortController().signal;
|
|
26
|
+
await client.threads.get('thread', { signal });
|
|
27
|
+
await client.runs.get('thread', 'run', { signal });
|
|
28
|
+
await client.conversations.get('conversation', { signal });
|
|
29
|
+
await client.conversations.searchMessages('conversation', { where: { executionId: 'run' } }, { signal });
|
|
30
|
+
expect(fetch.mock.calls.every(([, options]) => options?.signal === signal)).toBe(true);
|
|
31
|
+
expect(fetch.mock.calls.map(([url]) => new URL(String(url)).pathname)).toEqual([
|
|
32
|
+
'/threads/thread',
|
|
33
|
+
'/threads/thread/runs/run',
|
|
34
|
+
'/conversations/conversation',
|
|
35
|
+
'/conversations/conversation/messages/search',
|
|
36
|
+
]);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=recovery-read.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-read.test.js","sourceRoot":"","sources":["../../src/tests/recovery-read.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { Client, HTTPError } from "../index.mjs";
|
|
3
|
+
describe('caller-managed recovery reads', () => {
|
|
4
|
+
it.each(['30', new Date(Date.now() + 60_000).toUTCString()])('exposes Retry-After %s after exactly one configured attempt', async (retryAfter) => {
|
|
5
|
+
const fetch = vi
|
|
6
|
+
.fn()
|
|
7
|
+
.mockResolvedValue(new Response('temporary outage', { status: 503, headers: { 'Retry-After': retryAfter } }));
|
|
8
|
+
const client = new Client({
|
|
9
|
+
apiUrl: 'https://test.example',
|
|
10
|
+
callerOptions: { fetch, maxRetries: 0 },
|
|
11
|
+
});
|
|
12
|
+
const error = await client.threads.get('thread').catch((error) => error);
|
|
13
|
+
expect(error).toBeInstanceOf(HTTPError);
|
|
14
|
+
expect(error.retryAfterMs).toBeGreaterThan(29_000);
|
|
15
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
16
|
+
});
|
|
17
|
+
it('forwards cancellation on status and final-message reads without starting a run', async () => {
|
|
18
|
+
const fetch = vi
|
|
19
|
+
.fn()
|
|
20
|
+
.mockImplementation(async () => Response.json({}));
|
|
21
|
+
const client = new Client({
|
|
22
|
+
apiUrl: 'https://test.example',
|
|
23
|
+
callerOptions: { fetch, maxRetries: 0 },
|
|
24
|
+
});
|
|
25
|
+
const signal = new AbortController().signal;
|
|
26
|
+
await client.threads.get('thread', { signal });
|
|
27
|
+
await client.runs.get('thread', 'run', { signal });
|
|
28
|
+
await client.conversations.get('conversation', { signal });
|
|
29
|
+
await client.conversations.searchMessages('conversation', { where: { executionId: 'run' } }, { signal });
|
|
30
|
+
expect(fetch.mock.calls.every(([, options]) => options?.signal === signal)).toBe(true);
|
|
31
|
+
expect(fetch.mock.calls.map(([url]) => new URL(String(url)).pathname)).toEqual([
|
|
32
|
+
'/threads/thread',
|
|
33
|
+
'/threads/thread/runs/run',
|
|
34
|
+
'/conversations/conversation',
|
|
35
|
+
'/conversations/conversation/messages/search',
|
|
36
|
+
]);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=recovery-read.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-read.test.mjs","sourceRoot":"","sources":["../../src/tests/recovery-read.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { Client } from "../index.js";
|
|
3
|
+
describe('run display snapshot transport', () => {
|
|
4
|
+
it.each([false, true])('opts into display snapshots explicitly: %s', async (enabled) => {
|
|
5
|
+
const payload = { type: 'stream_snapshot', snapshot: { cursor: '30-0' }, continuous: true };
|
|
6
|
+
const fetch = vi.fn().mockResolvedValue(new Response(`id: 30-0\nevent: message\ndata: ${JSON.stringify(payload)}\n\nid: 31-0\nevent: message\ndata: {"type":"message","data":"tail"}\n\n`, { headers: { 'content-type': 'text/event-stream' } }));
|
|
7
|
+
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
8
|
+
const events = [];
|
|
9
|
+
for await (const event of client.runs.joinStream('thread', 'run', { lastEventId: '10-0', displaySnapshot: enabled }))
|
|
10
|
+
events.push(event);
|
|
11
|
+
expect(events.map((e) => e.id)).toEqual(['30-0', '31-0']);
|
|
12
|
+
expect(events[0].data).toEqual(payload);
|
|
13
|
+
const headers = new Headers(fetch.mock.calls[0][1]?.headers);
|
|
14
|
+
expect(headers.get('Last-Event-ID')).toBe('10-0');
|
|
15
|
+
expect(headers.get('X-Xpert-Display-Snapshot')).toBe(enabled ? '1' : null);
|
|
16
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
17
|
+
expect(fetch.mock.calls[0][1]?.method).toBe('GET');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=run-display-snapshot.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-display-snapshot.test.js","sourceRoot":"","sources":["../../src/tests/run-display-snapshot.test.ts"],"names":[],"mappings":"OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ;OAC1C,EAAE,MAAM,EAAE;AAEjB,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,4CAA4C,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACrF,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC5F,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAA2B,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAC3E,mCAAmC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,0EAA0E,EACpI,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,EAAE,CACrD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,8BAA8B,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChG,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { Client } from "../index.mjs";
|
|
3
|
+
describe('run display snapshot transport', () => {
|
|
4
|
+
it.each([false, true])('opts into display snapshots explicitly: %s', async (enabled) => {
|
|
5
|
+
const payload = { type: 'stream_snapshot', snapshot: { cursor: '30-0' }, continuous: true };
|
|
6
|
+
const fetch = vi.fn().mockResolvedValue(new Response(`id: 30-0\nevent: message\ndata: ${JSON.stringify(payload)}\n\nid: 31-0\nevent: message\ndata: {"type":"message","data":"tail"}\n\n`, { headers: { 'content-type': 'text/event-stream' } }));
|
|
7
|
+
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
8
|
+
const events = [];
|
|
9
|
+
for await (const event of client.runs.joinStream('thread', 'run', { lastEventId: '10-0', displaySnapshot: enabled }))
|
|
10
|
+
events.push(event);
|
|
11
|
+
expect(events.map((e) => e.id)).toEqual(['30-0', '31-0']);
|
|
12
|
+
expect(events[0].data).toEqual(payload);
|
|
13
|
+
const headers = new Headers(fetch.mock.calls[0][1]?.headers);
|
|
14
|
+
expect(headers.get('Last-Event-ID')).toBe('10-0');
|
|
15
|
+
expect(headers.get('X-Xpert-Display-Snapshot')).toBe(enabled ? '1' : null);
|
|
16
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
17
|
+
expect(fetch.mock.calls[0][1]?.method).toBe('GET');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=run-display-snapshot.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-display-snapshot.test.mjs","sourceRoot":"","sources":["../../src/tests/run-display-snapshot.test.ts"],"names":[],"mappings":"OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ;OAC1C,EAAE,MAAM,EAAE;AAEjB,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,4CAA4C,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACrF,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC5F,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAA2B,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAC3E,mCAAmC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,0EAA0E,EACpI,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,EAAE,CACrD,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,8BAA8B,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChG,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
2
|
import { Client } from "../index.js";
|
|
3
3
|
describe('thread run control', () => {
|
|
4
|
+
it.each([true, false])('reads retry availability (%s) without submitting a run', async (canRetry) => {
|
|
5
|
+
const fetch = vi.fn().mockImplementation(async () => new Response(JSON.stringify({ canRetry })));
|
|
6
|
+
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
7
|
+
expect(await client.threads.getCapabilities('branch/id')).toEqual({ canRetry });
|
|
8
|
+
expect(fetch.mock.calls.map(([url, init]) => [url.pathname, init?.method ?? 'GET', init?.body])).toEqual([
|
|
9
|
+
['/api/ai/threads/branch%2Fid/capabilities', 'GET', undefined],
|
|
10
|
+
]);
|
|
11
|
+
});
|
|
12
|
+
it('keeps the sealed side-chat mode and retry key in the copy request', async () => {
|
|
13
|
+
const fetch = vi
|
|
14
|
+
.fn()
|
|
15
|
+
.mockImplementation(async () => new Response(JSON.stringify({ thread_id: 'side' })));
|
|
16
|
+
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
17
|
+
const input = { mode: 'latest-sealed-reply', requestId: 'same-attempt' };
|
|
18
|
+
await client.threads.copy('source', input);
|
|
19
|
+
await client.threads.copy('source', input);
|
|
20
|
+
expect(fetch.mock.calls.map(([url, init]) => [
|
|
21
|
+
url.pathname,
|
|
22
|
+
JSON.parse(init.body),
|
|
23
|
+
])).toEqual([
|
|
24
|
+
['/api/ai/threads/source/copy', input],
|
|
25
|
+
['/api/ai/threads/source/copy', input],
|
|
26
|
+
]);
|
|
27
|
+
});
|
|
4
28
|
it('uses the SDK transport and preserves the source message and pause identity', async () => {
|
|
5
29
|
const fetch = vi.fn().mockImplementation(async () => new Response('{}', {
|
|
6
30
|
headers: { 'content-type': 'application/json' },
|
|
@@ -28,7 +52,9 @@ describe('thread run control', () => {
|
|
|
28
52
|
});
|
|
29
53
|
it('acknowledges immediately without serializing legacy display data', async () => {
|
|
30
54
|
const acknowledgement = { executionId: 'run', state: 'pausing', pauseId: 'token' };
|
|
31
|
-
const fetch = vi
|
|
55
|
+
const fetch = vi
|
|
56
|
+
.fn()
|
|
57
|
+
.mockResolvedValue(new Response(JSON.stringify(acknowledgement)));
|
|
32
58
|
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
33
59
|
const legacy = { displaySnapshot: 'x'.repeat(3 * 1024 * 1024) };
|
|
34
60
|
expect(await client.runs.pause('thread', 'run', { ...legacy, pollTimeoutMs: 0 })).toEqual(acknowledgement);
|
|
@@ -38,7 +64,8 @@ describe('thread run control', () => {
|
|
|
38
64
|
it('optionally observes the durable checkpoint without requiring display metadata', async () => {
|
|
39
65
|
const pausing = { executionId: 'run', state: 'pausing', pauseId: 'token' };
|
|
40
66
|
const paused = { ...pausing, state: 'paused' };
|
|
41
|
-
const fetch = vi
|
|
67
|
+
const fetch = vi
|
|
68
|
+
.fn()
|
|
42
69
|
.mockResolvedValueOnce(new Response(JSON.stringify(pausing)))
|
|
43
70
|
.mockResolvedValueOnce(new Response(JSON.stringify({ runControl: paused })));
|
|
44
71
|
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-control.test.js","sourceRoot":"","sources":["../../src/tests/thread-control.test.ts"],"names":[],"mappings":"OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ;OAC1C,EAAE,MAAM,EAAE;AAEjB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAA2B,CAAC,kBAAkB,CAC/D,KAAK,IAAI,EAAE,CACT,IAAI,QAAQ,CAAC,IAAI,EAAE;YACjB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACL,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,8BAA8B,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAE,GAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACrE,6BAA6B;YAC7B,uCAAuC;YACvC,wCAAwC;YACxC,4CAA4C;YAC5C,8CAA8C;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YACnE,eAAe,EAAE,OAAO;YACxB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,eAAe,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"thread-control.test.js","sourceRoot":"","sources":["../../src/tests/thread-control.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
2
|
import { Client } from "../index.mjs";
|
|
3
3
|
describe('thread run control', () => {
|
|
4
|
+
it.each([true, false])('reads retry availability (%s) without submitting a run', async (canRetry) => {
|
|
5
|
+
const fetch = vi.fn().mockImplementation(async () => new Response(JSON.stringify({ canRetry })));
|
|
6
|
+
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
7
|
+
expect(await client.threads.getCapabilities('branch/id')).toEqual({ canRetry });
|
|
8
|
+
expect(fetch.mock.calls.map(([url, init]) => [url.pathname, init?.method ?? 'GET', init?.body])).toEqual([
|
|
9
|
+
['/api/ai/threads/branch%2Fid/capabilities', 'GET', undefined],
|
|
10
|
+
]);
|
|
11
|
+
});
|
|
12
|
+
it('keeps the sealed side-chat mode and retry key in the copy request', async () => {
|
|
13
|
+
const fetch = vi
|
|
14
|
+
.fn()
|
|
15
|
+
.mockImplementation(async () => new Response(JSON.stringify({ thread_id: 'side' })));
|
|
16
|
+
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
17
|
+
const input = { mode: 'latest-sealed-reply', requestId: 'same-attempt' };
|
|
18
|
+
await client.threads.copy('source', input);
|
|
19
|
+
await client.threads.copy('source', input);
|
|
20
|
+
expect(fetch.mock.calls.map(([url, init]) => [
|
|
21
|
+
url.pathname,
|
|
22
|
+
JSON.parse(init.body),
|
|
23
|
+
])).toEqual([
|
|
24
|
+
['/api/ai/threads/source/copy', input],
|
|
25
|
+
['/api/ai/threads/source/copy', input],
|
|
26
|
+
]);
|
|
27
|
+
});
|
|
4
28
|
it('uses the SDK transport and preserves the source message and pause identity', async () => {
|
|
5
29
|
const fetch = vi.fn().mockImplementation(async () => new Response('{}', {
|
|
6
30
|
headers: { 'content-type': 'application/json' },
|
|
@@ -28,7 +52,9 @@ describe('thread run control', () => {
|
|
|
28
52
|
});
|
|
29
53
|
it('acknowledges immediately without serializing legacy display data', async () => {
|
|
30
54
|
const acknowledgement = { executionId: 'run', state: 'pausing', pauseId: 'token' };
|
|
31
|
-
const fetch = vi
|
|
55
|
+
const fetch = vi
|
|
56
|
+
.fn()
|
|
57
|
+
.mockResolvedValue(new Response(JSON.stringify(acknowledgement)));
|
|
32
58
|
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
33
59
|
const legacy = { displaySnapshot: 'x'.repeat(3 * 1024 * 1024) };
|
|
34
60
|
expect(await client.runs.pause('thread', 'run', { ...legacy, pollTimeoutMs: 0 })).toEqual(acknowledgement);
|
|
@@ -38,7 +64,8 @@ describe('thread run control', () => {
|
|
|
38
64
|
it('optionally observes the durable checkpoint without requiring display metadata', async () => {
|
|
39
65
|
const pausing = { executionId: 'run', state: 'pausing', pauseId: 'token' };
|
|
40
66
|
const paused = { ...pausing, state: 'paused' };
|
|
41
|
-
const fetch = vi
|
|
67
|
+
const fetch = vi
|
|
68
|
+
.fn()
|
|
42
69
|
.mockResolvedValueOnce(new Response(JSON.stringify(pausing)))
|
|
43
70
|
.mockResolvedValueOnce(new Response(JSON.stringify({ runControl: paused })));
|
|
44
71
|
const client = new Client({ apiUrl: 'https://xpert.example/api/ai', callerOptions: { fetch } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-control.test.mjs","sourceRoot":"","sources":["../../src/tests/thread-control.test.ts"],"names":[],"mappings":"OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ;OAC1C,EAAE,MAAM,EAAE;AAEjB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAA2B,CAAC,kBAAkB,CAC/D,KAAK,IAAI,EAAE,CACT,IAAI,QAAQ,CAAC,IAAI,EAAE;YACjB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACL,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,8BAA8B,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACvD,MAAM,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAE,GAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACrE,6BAA6B;YAC7B,uCAAuC;YACvC,wCAAwC;YACxC,4CAA4C;YAC5C,8CAA8C;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YACnE,eAAe,EAAE,OAAO;YACxB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAc,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,eAAe,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"thread-control.test.mjs","sourceRoot":"","sources":["../../src/tests/thread-control.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,19 @@ export interface AsyncCallerParams {
|
|
|
21
21
|
export interface AsyncCallerCallOptions {
|
|
22
22
|
signal?: AbortSignal;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Utility error to properly handle failed requests
|
|
26
|
+
*/
|
|
27
|
+
export declare class HTTPError extends Error {
|
|
28
|
+
readonly retryAfterMs?: number;
|
|
29
|
+
status: number;
|
|
30
|
+
text: string;
|
|
31
|
+
response?: Response;
|
|
32
|
+
constructor(status: number, message: string, response?: Response, includeResponse?: boolean);
|
|
33
|
+
static fromResponse(response: Response, options?: {
|
|
34
|
+
includeResponse?: boolean;
|
|
35
|
+
}): Promise<HTTPError>;
|
|
36
|
+
}
|
|
24
37
|
/**
|
|
25
38
|
* A class that can be used to make async calls with concurrency and retry logic.
|
|
26
39
|
*
|
|
@@ -27,22 +27,31 @@ function isResponse(x) {
|
|
|
27
27
|
/**
|
|
28
28
|
* Utility error to properly handle failed requests
|
|
29
29
|
*/
|
|
30
|
-
class HTTPError extends Error {
|
|
30
|
+
export class HTTPError extends Error {
|
|
31
|
+
retryAfterMs;
|
|
31
32
|
status;
|
|
32
33
|
text;
|
|
33
34
|
response;
|
|
34
|
-
constructor(status, message, response) {
|
|
35
|
+
constructor(status, message, response, includeResponse = true) {
|
|
35
36
|
super(`HTTP ${status}: ${message}`);
|
|
36
37
|
this.status = status;
|
|
37
38
|
this.text = message;
|
|
38
|
-
this.response = response;
|
|
39
|
+
this.response = includeResponse ? response : undefined;
|
|
40
|
+
const retryAfter = response?.headers.get("Retry-After");
|
|
41
|
+
if (retryAfter) {
|
|
42
|
+
const duration = /^\d+(\.\d+)?$/.test(retryAfter)
|
|
43
|
+
? Number(retryAfter) * 1000
|
|
44
|
+
: Date.parse(retryAfter) - Date.now();
|
|
45
|
+
if (Number.isFinite(duration))
|
|
46
|
+
this.retryAfterMs = Math.max(0, duration);
|
|
47
|
+
}
|
|
39
48
|
}
|
|
40
49
|
static async fromResponse(response, options) {
|
|
41
50
|
try {
|
|
42
|
-
return new HTTPError(response.status, await response.text(), options?.includeResponse
|
|
51
|
+
return new HTTPError(response.status, await response.text(), response, options?.includeResponse === true);
|
|
43
52
|
}
|
|
44
53
|
catch {
|
|
45
|
-
return new HTTPError(response.status, response.statusText, options?.includeResponse
|
|
54
|
+
return new HTTPError(response.status, response.statusText, response, options?.includeResponse === true);
|
|
46
55
|
}
|
|
47
56
|
}
|
|
48
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async_caller.js","sourceRoot":"","sources":["../../src/utils/async_caller.ts"],"names":[],"mappings":"OAAO,MAAM,MAAM,SAAS;OACrB,SAAS,MAAM,SAAS;OACxB,EAAE,uBAAuB,EAAE;AAElC,MAAM,eAAe,GAAG;IACtB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,gCAAgC;IACrC,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,8EAA8E;IACnF,GAAG,EAAE,uBAAuB;CAC7B,CAAC;AA8BF;;;GAGG;AACH,SAAS,UAAU,CAAC,CAAU;IAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,QAAQ,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,SAAU,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"async_caller.js","sourceRoot":"","sources":["../../src/utils/async_caller.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,22 +27,31 @@ function isResponse(x) {
|
|
|
27
27
|
/**
|
|
28
28
|
* Utility error to properly handle failed requests
|
|
29
29
|
*/
|
|
30
|
-
class HTTPError extends Error {
|
|
30
|
+
export class HTTPError extends Error {
|
|
31
|
+
retryAfterMs;
|
|
31
32
|
status;
|
|
32
33
|
text;
|
|
33
34
|
response;
|
|
34
|
-
constructor(status, message, response) {
|
|
35
|
+
constructor(status, message, response, includeResponse = true) {
|
|
35
36
|
super(`HTTP ${status}: ${message}`);
|
|
36
37
|
this.status = status;
|
|
37
38
|
this.text = message;
|
|
38
|
-
this.response = response;
|
|
39
|
+
this.response = includeResponse ? response : undefined;
|
|
40
|
+
const retryAfter = response?.headers.get("Retry-After");
|
|
41
|
+
if (retryAfter) {
|
|
42
|
+
const duration = /^\d+(\.\d+)?$/.test(retryAfter)
|
|
43
|
+
? Number(retryAfter) * 1000
|
|
44
|
+
: Date.parse(retryAfter) - Date.now();
|
|
45
|
+
if (Number.isFinite(duration))
|
|
46
|
+
this.retryAfterMs = Math.max(0, duration);
|
|
47
|
+
}
|
|
39
48
|
}
|
|
40
49
|
static async fromResponse(response, options) {
|
|
41
50
|
try {
|
|
42
|
-
return new HTTPError(response.status, await response.text(), options?.includeResponse
|
|
51
|
+
return new HTTPError(response.status, await response.text(), response, options?.includeResponse === true);
|
|
43
52
|
}
|
|
44
53
|
catch {
|
|
45
|
-
return new HTTPError(response.status, response.statusText, options?.includeResponse
|
|
54
|
+
return new HTTPError(response.status, response.statusText, response, options?.includeResponse === true);
|
|
46
55
|
}
|
|
47
56
|
}
|
|
48
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async_caller.mjs","sourceRoot":"","sources":["../../src/utils/async_caller.ts"],"names":[],"mappings":"OAAO,MAAM,MAAM,SAAS;OACrB,SAAS,MAAM,SAAS;OACxB,EAAE,uBAAuB,EAAE;AAElC,MAAM,eAAe,GAAG;IACtB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,gCAAgC;IACrC,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,8EAA8E;IACnF,GAAG,EAAE,uBAAuB;CAC7B,CAAC;AA8BF;;;GAGG;AACH,SAAS,UAAU,CAAC,CAAU;IAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,QAAQ,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,SAAU,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"async_caller.mjs","sourceRoot":"","sources":["../../src/utils/async_caller.ts"],"names":[],"mappings":"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"}
|