@worldlabsai/client 0.2.0 → 0.4.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/README.md +18 -8
- package/dist/core/assets.d.ts +9 -0
- package/dist/core/assets.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/network-error.d.ts +6 -0
- package/dist/core/network-error.d.ts.map +1 -0
- package/dist/core/network-error.js +8 -0
- package/dist/core/network-error.js.map +1 -0
- package/dist/core/operations.d.ts +3 -0
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +5 -0
- package/dist/core/operations.js.map +1 -1
- package/dist/core/tasks.d.ts +6 -6
- package/dist/core/tasks.d.ts.map +1 -1
- package/dist/core/tasks.js +5 -5
- package/dist/core/tasks.js.map +1 -1
- package/dist/core/transport.d.ts +1 -1
- package/dist/core/transport.d.ts.map +1 -1
- package/dist/core/transport.js +44 -21
- package/dist/core/transport.js.map +1 -1
- package/dist/generated/developer-api.gen.d.ts +513 -83
- package/dist/generated/developer-api.gen.d.ts.map +1 -1
- package/dist/generated/tasks.gen.d.ts +6 -6
- package/dist/generated/tasks.gen.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/core/index.ts +1 -0
- package/src/core/network-error.ts +8 -0
- package/src/core/operations.ts +6 -0
- package/src/core/tasks.ts +7 -7
- package/src/core/transport.ts +61 -24
- package/src/generated/developer-api.gen.ts +513 -83
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -14,6 +14,9 @@ Install with `npm install @worldlabsai/client`.
|
|
|
14
14
|
Methods marked `@beta` require beta access for your World Labs account.
|
|
15
15
|
Use a World Labs Developer API key to authenticate API requests.
|
|
16
16
|
|
|
17
|
+
Before choosing model inputs or combining tasks, read
|
|
18
|
+
[How To Use Atlas](https://marble5.worldlabs.ai/docs/how-to-use-atlas).
|
|
19
|
+
|
|
17
20
|
## Usage
|
|
18
21
|
|
|
19
22
|
The client provides `assets` for uploads, `tasks` for submissions, and
|
|
@@ -59,24 +62,31 @@ A finished task can still have `result.error`; check that field before using
|
|
|
59
62
|
`result.response`, as in the example above.
|
|
60
63
|
|
|
61
64
|
HTTP failures reject with `ApiError`. Its `response.status` and `body` provide
|
|
62
|
-
the status code and error details. Network failures
|
|
63
|
-
underlying error
|
|
65
|
+
the status code and error details. Network failures from JSON API requests reject
|
|
66
|
+
with `NetworkError`, with the underlying error in `cause`. Aborts reject with the
|
|
67
|
+
signal's reason.
|
|
64
68
|
|
|
65
69
|
Aborting stops the local request or polling; it does not cancel the server-side
|
|
66
70
|
task. Keep `operation.id` to check its status later with `operations.get(id)`.
|
|
67
71
|
Polling has no default overall timeout. `pollIntervalMs` sets the pause between
|
|
68
72
|
incomplete polls and defaults to 1,000 milliseconds.
|
|
69
73
|
|
|
70
|
-
`operations.wait`
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
With `{ retryNetworkErrors: true }`, `operations.wait` keeps polling the same
|
|
75
|
+
operation after network failures until it completes or the caller's signal
|
|
76
|
+
aborts, including a signal with a timeout. Network failures reject by default.
|
|
77
|
+
It retries HTTP 502, 503, and 504 polling failures up to three times in a row,
|
|
78
|
+
with `pollIntervalMs` between attempts. A successful poll resets the retry count.
|
|
79
|
+
Other failures, including authentication and HTTP 429 rate limits, reject without
|
|
80
|
+
retrying. Network retries also use `pollIntervalMs` between attempts.
|
|
74
81
|
|
|
75
82
|
Task submissions retry network failures and HTTP 429, 502, 503, and 504 up to
|
|
76
83
|
three times. Every attempt sends the same idempotency key and body. Retries use
|
|
77
84
|
exponential backoff with jitter and wait at least as long as `Retry-After` when
|
|
78
|
-
the server supplies it.
|
|
79
|
-
|
|
85
|
+
the server supplies it. A response naming a wait longer than ten seconds, such
|
|
86
|
+
as a concurrency cap or an hourly quota, rejects at once so you can surface it.
|
|
87
|
+
Aborting the submission also stops retries. Validation and authentication
|
|
88
|
+
failures are not retried. Pass `{ retry: false }` to disable
|
|
89
|
+
submission retries.
|
|
80
90
|
|
|
81
91
|
If you call the task method again yourself, reuse its `idempotencyKey`. Each
|
|
82
92
|
method call otherwise generates a new key. Passing `{ wait: true }` when
|
package/dist/core/assets.d.ts
CHANGED
|
@@ -47,7 +47,9 @@ export declare const createAssets: (transport: Transport, assetsPath: string) =>
|
|
|
47
47
|
[key: string]: unknown;
|
|
48
48
|
} | null;
|
|
49
49
|
producedBy?: import("../generated/developer-api.gen.ts").components["schemas"]["ProducedBy"] | null;
|
|
50
|
+
transient?: boolean;
|
|
50
51
|
contentPath?: string | null;
|
|
52
|
+
url?: string | null;
|
|
51
53
|
}>;
|
|
52
54
|
/** Create an asset record. Use `upload` to create and upload a single file in one call. */
|
|
53
55
|
create: (asset: AssetCreate, options?: Pick<RequestInit, "signal">) => Promise<{
|
|
@@ -66,7 +68,9 @@ export declare const createAssets: (transport: Transport, assetsPath: string) =>
|
|
|
66
68
|
[key: string]: unknown;
|
|
67
69
|
} | null;
|
|
68
70
|
producedBy?: import("../generated/developer-api.gen.ts").components["schemas"]["ProducedBy"] | null;
|
|
71
|
+
transient?: boolean;
|
|
69
72
|
contentPath?: string | null;
|
|
73
|
+
url?: string | null;
|
|
70
74
|
uploads?: import("../generated/developer-api.gen.ts").components["schemas"]["UploadGrant"][];
|
|
71
75
|
}>;
|
|
72
76
|
/**
|
|
@@ -102,11 +106,14 @@ export declare const createAssets: (transport: Transport, assetsPath: string) =>
|
|
|
102
106
|
[key: string]: unknown;
|
|
103
107
|
} | null;
|
|
104
108
|
producedBy?: import("../generated/developer-api.gen.ts").components["schemas"]["ProducedBy"] | null;
|
|
109
|
+
transient?: boolean;
|
|
105
110
|
contentPath?: string | null;
|
|
111
|
+
url?: string | null;
|
|
106
112
|
}>;
|
|
107
113
|
/** Return one page of assets. Pass the response's `nextPageToken` to retrieve the next page. */
|
|
108
114
|
list: ({ pageSize, pageToken, state, ...options }?: ListAssetsOptions) => Promise<{
|
|
109
115
|
assets?: import("../generated/developer-api.gen.ts").components["schemas"]["Asset"][];
|
|
116
|
+
groups?: import("../generated/developer-api.gen.ts").components["schemas"]["AssetGroup"][];
|
|
110
117
|
nextPageToken?: string;
|
|
111
118
|
}>;
|
|
112
119
|
/**
|
|
@@ -134,7 +141,9 @@ export declare const createAssets: (transport: Transport, assetsPath: string) =>
|
|
|
134
141
|
[key: string]: unknown;
|
|
135
142
|
} | null;
|
|
136
143
|
producedBy?: import("../generated/developer-api.gen.ts").components["schemas"]["ProducedBy"] | null;
|
|
144
|
+
transient?: boolean;
|
|
137
145
|
contentPath?: string | null;
|
|
146
|
+
url?: string | null;
|
|
138
147
|
}>;
|
|
139
148
|
};
|
|
140
149
|
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/core/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EACX,qBAAqB,EAKrB,SAAS,EACV,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,0CAA0C;AAC1C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAChE,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IACpE,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+DAA+D;AAC/D,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,MAAkB,CAAC;AAE1D,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,KAAG,SAA0C,CAAC;AAWnF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,EAAE,YAAY,MAAM;IAuBjE;;;;OAIG;yBAhBC,MAAM,SACJ,qBAAqB,YAClB,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;;;;gBAoG+
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/core/assets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,WAAW,EACX,qBAAqB,EAKrB,SAAS,EACV,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,0CAA0C;AAC1C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAChE,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IACpE,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+DAA+D;AAC/D,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,MAAkB,CAAC;AAE1D,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,KAAG,SAA0C,CAAC;AAWnF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,EAAE,YAAY,MAAM;IAuBjE;;;;OAIG;yBAhBC,MAAM,SACJ,qBAAqB,YAClB,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;;;;gBAoG+uJ,iEAAsB;;;;;;;gBAA2qC,iEAAsB;;;;qBAAkV,iEAAsB;;;;;IAnFl1M,2FAA2F;oBACrE,WAAW,YAAW,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;;;;gBAkFux/C,iEAAsB;;;;;;;gBAA2qC,iEAAsB;;;;qBAAkV,iEAAsB;;;;kBAAq9C,iEAAsB;;IA/Ex4lD;;;OAGG;wBACuB,MAAM,YAAW,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;;;;IAOtE;;;OAGG;iBACgB,MAAM,YAAW,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAI/D;;;OAGG;cACa,MAAM,YAAW,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;;;;gBAwDutJ,iEAAsB;;;;;;;gBAA2qC,iEAAsB;;;;qBAAkV,iEAAsB;;;;;IArDl1M,gGAAgG;wDACvC,iBAAiB;iBAoDm8jE,iEAAsB;iBAAsS,iEAAsB;;;IA9C/1kE;;;;;;;;OAQG;mBACkB,IAAI,GAAG,YAAY,qCAAqC,aAAa;;;;gBAqCyrJ,iEAAsB;;;;;;;gBAA2qC,iEAAsB;;;;qBAAkV,iEAAsB;;;;;CADr1M,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { assetId, assetRef, createAssets, type ListAssetsOptions, type UploadOptions, } from "./assets.ts";
|
|
2
|
+
export { NetworkError } from "./network-error.ts";
|
|
2
3
|
export { createOperations, type DoneOperation, type Operation, waitForOperation, type WaitOptions, } from "./operations.ts";
|
|
3
4
|
export { type SubmitOptions, submitTask } from "./tasks.ts";
|
|
4
5
|
export { ApiError, type ApiKey, apiKeyAuth, createTransport, type Fetch, type Middleware, type RequestOptions, type Transport, type TransportOptions, withHeader, } from "./transport.ts";
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,QAAQ,EACR,KAAK,MAAM,EACX,UAAU,EACV,eAAe,EACf,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,QAAQ,EACR,KAAK,MAAM,EACX,UAAU,EACV,eAAe,EACf,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,UAAU,GACX,MAAM,gBAAgB,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { assetId, assetRef, createAssets, } from "./assets.js";
|
|
2
|
+
export { NetworkError } from "./network-error.js";
|
|
2
3
|
export { createOperations, waitForOperation, } from "./operations.js";
|
|
3
4
|
export { submitTask } from "./tasks.js";
|
|
4
5
|
export { ApiError, apiKeyAuth, createTransport, withHeader, } from "./transport.js";
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,YAAY,GAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAGhB,gBAAgB,GAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAsB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,QAAQ,EAER,UAAU,EACV,eAAe,EAMf,UAAU,GACX,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,YAAY,GAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,gBAAgB,EAGhB,gBAAgB,GAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAsB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,QAAQ,EAER,UAAU,EACV,eAAe,EAMf,UAAU,GACX,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-error.d.ts","sourceRoot":"","sources":["../../src/core/network-error.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qBAAa,YAAa,SAAQ,SAAS;IAChC,IAAI,SAAkB;gBAEnB,KAAK,EAAE,SAAS;CAG7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-error.js","sourceRoot":"","sources":["../../src/core/network-error.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,OAAO,YAAa,SAAQ,SAAS;IAChC,IAAI,GAAG,cAAc,CAAC;IAE/B,YAAY,KAAgB;QAC1B,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -16,6 +16,8 @@ export type DoneOperation<TResponse> = Operation<TResponse> & {
|
|
|
16
16
|
export interface WaitOptions extends Pick<RequestInit, "signal"> {
|
|
17
17
|
/** Delay after an incomplete poll, in milliseconds. Defaults to 1,000 ms. */
|
|
18
18
|
pollIntervalMs?: number;
|
|
19
|
+
/** Retry network failures in `operations.wait` until cancellation. Defaults to false. */
|
|
20
|
+
retryNetworkErrors?: boolean;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
23
|
* Poll an operation until it reports `done`.
|
|
@@ -40,6 +42,7 @@ export declare const createOperations: (transport: Transport, operationPath: str
|
|
|
40
42
|
*
|
|
41
43
|
* An operation can finish with an API-reported task error; inspect `error` before
|
|
42
44
|
* reading `response`. Aborting stops local waiting without canceling the task.
|
|
45
|
+
* With `retryNetworkErrors`, network failures resume polling until cancellation.
|
|
43
46
|
* HTTP 502, 503, and 504 polling failures are retried up to three times in a row;
|
|
44
47
|
* a successful poll resets the retry count.
|
|
45
48
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAIpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,MAAM,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG;IAC7F,QAAQ,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,wFAAwF;AACxF,MAAM,MAAM,aAAa,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAE7E,uFAAuF;AACvF,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC9D,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAID;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAAU,SAAS,EAC9C,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAC9E,6BAAuD,WAAgB,KACtE,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAWlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,SAAS,EAAE,eAAe,MAAM;IAYxE,yDAAyD;uBAChC,MAAM,YAAW,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;IAGrE;;;;;;;;;;;;;OAaG;WACU,SAAS,aAAa,SAAS,CAAC,SAAS,CAAC,YAAY,WAAW;CAgCjF,CAAC"}
|
package/dist/core/operations.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { NetworkError } from "./network-error.js";
|
|
1
2
|
import { sleep } from "./sleep.js";
|
|
2
3
|
import { ApiError } from "./transport.js";
|
|
3
4
|
const DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
@@ -41,6 +42,7 @@ export const createOperations = (transport, operationPath) => {
|
|
|
41
42
|
*
|
|
42
43
|
* An operation can finish with an API-reported task error; inspect `error` before
|
|
43
44
|
* reading `response`. Aborting stops local waiting without canceling the task.
|
|
45
|
+
* With `retryNetworkErrors`, network failures resume polling until cancellation.
|
|
44
46
|
* HTTP 502, 503, and 504 polling failures are retried up to three times in a row;
|
|
45
47
|
* a successful poll resets the retry count.
|
|
46
48
|
*
|
|
@@ -64,6 +66,9 @@ export const createOperations = (transport, operationPath) => {
|
|
|
64
66
|
return current;
|
|
65
67
|
}
|
|
66
68
|
catch (error) {
|
|
69
|
+
signal?.throwIfAborted();
|
|
70
|
+
if (options?.retryNetworkErrors && error instanceof NetworkError)
|
|
71
|
+
return operation;
|
|
67
72
|
// A gateway timeout does not cancel the task. Resume the same read;
|
|
68
73
|
// the caller's signal still bounds the entire wait, including retries.
|
|
69
74
|
gatewayErrors += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/core/operations.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tasks.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Transport } from "./transport.ts";
|
|
2
|
-
export interface SubmitOptions extends Pick<
|
|
1
|
+
import type { RequestOptions, Transport } from "./transport.ts";
|
|
2
|
+
export interface SubmitOptions extends Pick<RequestOptions, "signal" | "retry"> {
|
|
3
3
|
/**
|
|
4
4
|
* Ask the server to wait up to its time limit. The returned operation may still
|
|
5
5
|
* be running; use `operations.wait` to await completion. Defaults to false.
|
|
@@ -13,15 +13,15 @@ export interface SubmitOptions extends Pick<RequestInit, "signal"> {
|
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Submit a task request and return its operation resource.
|
|
16
|
-
*
|
|
17
|
-
* same key and body. Uses jittered
|
|
16
|
+
* By default, retries network failures and HTTP 429/502/503/504 up to three times
|
|
17
|
+
* with the same key and body. Uses jittered backoff and honors Retry-After.
|
|
18
18
|
*
|
|
19
19
|
* @param transport - Transport used to send the request.
|
|
20
20
|
* @param path - Task submission path.
|
|
21
21
|
* @param body - Task-specific request payload.
|
|
22
|
-
* @param options - Server wait, idempotency key, and
|
|
22
|
+
* @param options - Server wait, idempotency key, retry, and cancellation settings.
|
|
23
23
|
* @returns The operation created for the task.
|
|
24
24
|
* @throws {ApiError} If the API rejects the submission or retries are exhausted.
|
|
25
25
|
*/
|
|
26
|
-
export declare const submitTask: <TOperation>(transport: Transport, path: string, body: unknown, { idempotencyKey, signal, wait }?: SubmitOptions) => Promise<TOperation>;
|
|
26
|
+
export declare const submitTask: <TOperation>(transport: Transport, path: string, body: unknown, { idempotencyKey, signal, wait, retry }?: SubmitOptions) => Promise<TOperation>;
|
|
27
27
|
//# sourceMappingURL=tasks.d.ts.map
|
package/dist/core/tasks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/core/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/core/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC7E;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,GAAU,UAAU,EACzC,WAAW,SAAS,EACpB,MAAM,MAAM,EACZ,MAAM,OAAO,EACb,0CAAsE,aAAkB,KACvF,OAAO,CAAC,UAAU,CAYpB,CAAC"}
|
package/dist/core/tasks.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Submit a task request and return its operation resource.
|
|
3
|
-
*
|
|
4
|
-
* same key and body. Uses jittered
|
|
3
|
+
* By default, retries network failures and HTTP 429/502/503/504 up to three times
|
|
4
|
+
* with the same key and body. Uses jittered backoff and honors Retry-After.
|
|
5
5
|
*
|
|
6
6
|
* @param transport - Transport used to send the request.
|
|
7
7
|
* @param path - Task submission path.
|
|
8
8
|
* @param body - Task-specific request payload.
|
|
9
|
-
* @param options - Server wait, idempotency key, and
|
|
9
|
+
* @param options - Server wait, idempotency key, retry, and cancellation settings.
|
|
10
10
|
* @returns The operation created for the task.
|
|
11
11
|
* @throws {ApiError} If the API rejects the submission or retries are exhausted.
|
|
12
12
|
*/
|
|
13
|
-
export const submitTask = async (transport, path, body, { idempotencyKey = crypto.randomUUID(), signal, wait } = {}) => {
|
|
13
|
+
export const submitTask = async (transport, path, body, { idempotencyKey = crypto.randomUUID(), signal, wait, retry = true } = {}) => {
|
|
14
14
|
if (idempotencyKey.trim() === "") {
|
|
15
15
|
throw new Error("Idempotency key must not be empty");
|
|
16
16
|
}
|
|
@@ -19,7 +19,7 @@ export const submitTask = async (transport, path, body, { idempotencyKey = crypt
|
|
|
19
19
|
headers: { "Idempotency-Key": idempotencyKey },
|
|
20
20
|
method: "POST",
|
|
21
21
|
query: { wait },
|
|
22
|
-
retry
|
|
22
|
+
retry,
|
|
23
23
|
...(signal ? { signal } : {}),
|
|
24
24
|
});
|
|
25
25
|
};
|
package/dist/core/tasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/core/tasks.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,SAAoB,EACpB,IAAY,EACZ,IAAa,EACb,EAAE,cAAc,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,KAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/core/tasks.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,SAAoB,EACpB,IAAY,EACZ,IAAa,EACb,EAAE,cAAc,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,KAAoB,EAAE,EACnE,EAAE;IACvB,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,SAAS,CAAC,OAAO,CAAa,IAAI,EAAE;QAC/C,IAAI;QACJ,OAAO,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,EAAE,IAAI,EAAE;QACf,KAAK;QACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC,CAAC"}
|
package/dist/core/transport.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type Fetch = (request: Request) => Promise<Response>;
|
|
|
5
5
|
* without calling `next`, call `next` more than once for retries, or inspect the response.
|
|
6
6
|
* Clone requests before sending them if a retry may need to reuse the body.
|
|
7
7
|
*/
|
|
8
|
-
export type Middleware = (request: Request, next: Fetch) => Promise<Response>;
|
|
8
|
+
export type Middleware = (request: Request, next: Fetch, options?: Pick<RequestOptions, "retry">) => Promise<Response>;
|
|
9
9
|
/** Values accepted in a request query. `null` and `undefined` are omitted. */
|
|
10
10
|
export type QueryValue = string | number | boolean | null | undefined;
|
|
11
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"AAGA,4FAA4F;AAC5F,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5D;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,KACpC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;IAC/D,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,sCAAsC;IACtC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,yFAAyF;IACzF,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,oEAAoE;IACpE,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1B,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AA+BD,sEAAsE;AACtE,qBAAa,QAAS,SAAQ,KAAK;IACxB,IAAI,SAAc;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO;CAM9C;AA2DD,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,wFAAwF;IACxF,IAAI,EAAE,KAAK,CAAC;IACZ;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,gBAAgB,KAAG,SAiF3D,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,EAAE,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,OAI1E,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GACpB,QAAQ,MAAM,KAAG,UAKjB,CAAC"}
|
package/dist/core/transport.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
import { NetworkError } from "./network-error.js";
|
|
1
2
|
import { sleep } from "./sleep.js";
|
|
2
|
-
/** FastAPI
|
|
3
|
+
/** One FastAPI validation issue, `{ loc: ["body", "frames"], msg: "Field required" }`. */
|
|
4
|
+
const validationIssue = (issue) => {
|
|
5
|
+
const location = typeof issue === "object" && issue !== null ? Reflect.get(issue, "loc") : undefined;
|
|
6
|
+
const message = typeof issue === "object" && issue !== null ? Reflect.get(issue, "msg") : issue;
|
|
7
|
+
return Array.isArray(location) ? `${location.join(".")}: ${String(message)}` : String(message);
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* FastAPI puts its reason under `detail`, as a list of validation issues for a
|
|
11
|
+
* 422; operation and storage errors use `message`.
|
|
12
|
+
*/
|
|
3
13
|
const errorDetail = (body) => {
|
|
4
14
|
if (typeof body !== "object" || body === null) {
|
|
5
15
|
return undefined;
|
|
@@ -9,6 +19,9 @@ const errorDetail = (body) => {
|
|
|
9
19
|
if (typeof value === "string" && value !== "") {
|
|
10
20
|
return value;
|
|
11
21
|
}
|
|
22
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
23
|
+
return value.map((issue) => validationIssue(issue)).join("; ");
|
|
24
|
+
}
|
|
12
25
|
}
|
|
13
26
|
return undefined;
|
|
14
27
|
};
|
|
@@ -36,11 +49,11 @@ const fillPath = (path, params) => path.replaceAll(/\{(?<name>\w+)\}/gu, (_, nam
|
|
|
36
49
|
}
|
|
37
50
|
return encodeURIComponent(value);
|
|
38
51
|
});
|
|
39
|
-
const compose = (middleware, fetch) => {
|
|
52
|
+
const compose = (middleware, fetch, options) => {
|
|
40
53
|
let next = fetch;
|
|
41
54
|
for (const layer of middleware.toReversed()) {
|
|
42
55
|
const inner = next;
|
|
43
|
-
next = async (request) => await layer(request, inner);
|
|
56
|
+
next = async (request) => await layer(request, inner, options);
|
|
44
57
|
}
|
|
45
58
|
return next;
|
|
46
59
|
};
|
|
@@ -57,15 +70,22 @@ const parseBody = async (response) => {
|
|
|
57
70
|
}
|
|
58
71
|
};
|
|
59
72
|
const RETRYABLE_STATUS_CODES = new Set([429, 502, 503, 504]);
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Longest `Retry-After` a retry waits out. A concurrency cap, an hourly quota,
|
|
75
|
+
* or a closed task names minutes to hours, which the caller has to surface
|
|
76
|
+
* rather than sit through.
|
|
77
|
+
*/
|
|
78
|
+
const MAX_RETRY_AFTER_MS = 10_000;
|
|
79
|
+
/** The wait a response names in `Retry-After`, as seconds or an HTTP date. */
|
|
80
|
+
const retryAfterMs = (error) => {
|
|
62
81
|
const value = error instanceof ApiError ? error.response.headers.get("retry-after")?.trim() : undefined;
|
|
63
82
|
if (!value) {
|
|
64
|
-
return
|
|
83
|
+
return undefined;
|
|
65
84
|
}
|
|
66
85
|
const delay = /^\d+$/u.test(value) ? Number(value) * 1000 : Date.parse(value) - Date.now();
|
|
67
|
-
return
|
|
86
|
+
return Number.isFinite(delay) ? Math.max(0, delay) : undefined;
|
|
68
87
|
};
|
|
88
|
+
const retryDelay = (error, attempt) => Math.max(1000 * 2 ** attempt * (0.5 + Math.random() / 2), retryAfterMs(error) ?? 0);
|
|
69
89
|
/**
|
|
70
90
|
* Create a JSON-over-fetch transport for an API surface.
|
|
71
91
|
*
|
|
@@ -83,7 +103,8 @@ export const createTransport = (options) => {
|
|
|
83
103
|
return {
|
|
84
104
|
fetch,
|
|
85
105
|
send,
|
|
86
|
-
request: async (path,
|
|
106
|
+
request: async (path, requestOptions = {}) => {
|
|
107
|
+
const { body, params, query, retry = false, ...init } = requestOptions;
|
|
87
108
|
const url = new URL(baseUrl + fillPath(path, { ...boundParams, ...params }));
|
|
88
109
|
for (const [key, value] of Object.entries(query ?? {})) {
|
|
89
110
|
if (value !== undefined && value !== null) {
|
|
@@ -101,17 +122,15 @@ export const createTransport = (options) => {
|
|
|
101
122
|
});
|
|
102
123
|
// Provider and middleware TypeErrors must not be mistaken for network failures.
|
|
103
124
|
let networkError;
|
|
104
|
-
const sendRequest =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
})
|
|
114
|
-
: send;
|
|
125
|
+
const sendRequest = compose(options.middleware ?? [], async (attempt) => {
|
|
126
|
+
try {
|
|
127
|
+
return await fetch(attempt);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
networkError = error;
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}, requestOptions);
|
|
115
134
|
// oxlint-disable no-await-in-loop -- retries are sequential and preserve the original request
|
|
116
135
|
for (let attempt = 0;; attempt += 1) {
|
|
117
136
|
request.signal.throwIfAborted();
|
|
@@ -137,10 +156,14 @@ export const createTransport = (options) => {
|
|
|
137
156
|
}
|
|
138
157
|
catch (error) {
|
|
139
158
|
request.signal.throwIfAborted();
|
|
159
|
+
const networkFailure = error instanceof TypeError && error === networkError;
|
|
140
160
|
const transient = error instanceof ApiError
|
|
141
|
-
? RETRYABLE_STATUS_CODES.has(error.response.status)
|
|
142
|
-
|
|
161
|
+
? RETRYABLE_STATUS_CODES.has(error.response.status) &&
|
|
162
|
+
(retryAfterMs(error) ?? 0) <= MAX_RETRY_AFTER_MS
|
|
163
|
+
: networkFailure;
|
|
143
164
|
if (!retry || attempt >= 3 || !transient) {
|
|
165
|
+
if (networkFailure)
|
|
166
|
+
throw new NetworkError(error);
|
|
144
167
|
throw error;
|
|
145
168
|
}
|
|
146
169
|
await sleep(retryDelay(error, attempt), request.signal);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"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"}
|