@trigger.dev/core 4.2.0 → 4.3.1
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/commonjs/v3/apiClient/errors.d.ts +25 -0
- package/dist/commonjs/v3/apiClient/errors.js +29 -1
- package/dist/commonjs/v3/apiClient/errors.js.map +1 -1
- package/dist/commonjs/v3/apiClient/index.d.ts +54 -2
- package/dist/commonjs/v3/apiClient/index.js +280 -0
- package/dist/commonjs/v3/apiClient/index.js.map +1 -1
- package/dist/commonjs/v3/apiClient/streamBatchItems.test.d.ts +1 -0
- package/dist/commonjs/v3/apiClient/streamBatchItems.test.js +369 -0
- package/dist/commonjs/v3/apiClient/streamBatchItems.test.js.map +1 -0
- package/dist/commonjs/v3/idempotencyKeys.d.ts +5 -0
- package/dist/commonjs/v3/idempotencyKeys.js +10 -1
- package/dist/commonjs/v3/idempotencyKeys.js.map +1 -1
- package/dist/commonjs/v3/schemas/api.d.ts +403 -10
- package/dist/commonjs/v3/schemas/api.js +126 -5
- package/dist/commonjs/v3/schemas/api.js.map +1 -1
- package/dist/commonjs/v3/schemas/messages.d.ts +2 -2
- package/dist/commonjs/v3/schemas/runEngine.d.ts +1 -0
- package/dist/commonjs/v3/schemas/runEngine.js +1 -0
- package/dist/commonjs/v3/schemas/runEngine.js.map +1 -1
- package/dist/commonjs/v3/types/tasks.d.ts +53 -4
- package/dist/commonjs/v3/zodSocket.js +1 -1
- package/dist/commonjs/v3/zodSocket.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/apiClient/errors.d.ts +25 -0
- package/dist/esm/v3/apiClient/errors.js +27 -0
- package/dist/esm/v3/apiClient/errors.js.map +1 -1
- package/dist/esm/v3/apiClient/index.d.ts +54 -2
- package/dist/esm/v3/apiClient/index.js +282 -2
- package/dist/esm/v3/apiClient/index.js.map +1 -1
- package/dist/esm/v3/apiClient/streamBatchItems.test.d.ts +1 -0
- package/dist/esm/v3/apiClient/streamBatchItems.test.js +367 -0
- package/dist/esm/v3/apiClient/streamBatchItems.test.js.map +1 -0
- package/dist/esm/v3/idempotencyKeys.d.ts +5 -0
- package/dist/esm/v3/idempotencyKeys.js +9 -1
- package/dist/esm/v3/idempotencyKeys.js.map +1 -1
- package/dist/esm/v3/schemas/api.d.ts +403 -10
- package/dist/esm/v3/schemas/api.js +123 -2
- package/dist/esm/v3/schemas/api.js.map +1 -1
- package/dist/esm/v3/schemas/messages.d.ts +2 -2
- package/dist/esm/v3/schemas/runEngine.d.ts +1 -0
- package/dist/esm/v3/schemas/runEngine.js +1 -0
- package/dist/esm/v3/schemas/runEngine.js.map +1 -1
- package/dist/esm/v3/types/tasks.d.ts +53 -4
- package/dist/esm/v3/zodSocket.js +1 -1
- package/dist/esm/v3/zodSocket.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
|
@@ -52,3 +52,28 @@ export declare class ApiSchemaValidationError extends ApiError {
|
|
|
52
52
|
headers: APIHeaders | undefined;
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Error thrown when a batch stream completes but the batch was not sealed.
|
|
57
|
+
* This indicates that not all expected items were received by the server.
|
|
58
|
+
* The client should retry sending all items, or investigate the mismatch.
|
|
59
|
+
*/
|
|
60
|
+
export declare class BatchNotSealedError extends Error {
|
|
61
|
+
readonly name = "BatchNotSealedError";
|
|
62
|
+
/** The batch ID that was not sealed */
|
|
63
|
+
readonly batchId: string;
|
|
64
|
+
/** Number of items currently enqueued on the server */
|
|
65
|
+
readonly enqueuedCount: number;
|
|
66
|
+
/** Number of items expected to complete the batch */
|
|
67
|
+
readonly expectedCount: number;
|
|
68
|
+
/** Number of items accepted in this request */
|
|
69
|
+
readonly itemsAccepted: number;
|
|
70
|
+
/** Number of items deduplicated in this request */
|
|
71
|
+
readonly itemsDeduplicated: number;
|
|
72
|
+
constructor(options: {
|
|
73
|
+
batchId: string;
|
|
74
|
+
enqueuedCount: number;
|
|
75
|
+
expectedCount: number;
|
|
76
|
+
itemsAccepted: number;
|
|
77
|
+
itemsDeduplicated: number;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
@@ -130,6 +130,33 @@ export class ApiSchemaValidationError extends ApiError {
|
|
|
130
130
|
this.rawBody = rawBody;
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Error thrown when a batch stream completes but the batch was not sealed.
|
|
135
|
+
* This indicates that not all expected items were received by the server.
|
|
136
|
+
* The client should retry sending all items, or investigate the mismatch.
|
|
137
|
+
*/
|
|
138
|
+
export class BatchNotSealedError extends Error {
|
|
139
|
+
name = "BatchNotSealedError";
|
|
140
|
+
/** The batch ID that was not sealed */
|
|
141
|
+
batchId;
|
|
142
|
+
/** Number of items currently enqueued on the server */
|
|
143
|
+
enqueuedCount;
|
|
144
|
+
/** Number of items expected to complete the batch */
|
|
145
|
+
expectedCount;
|
|
146
|
+
/** Number of items accepted in this request */
|
|
147
|
+
itemsAccepted;
|
|
148
|
+
/** Number of items deduplicated in this request */
|
|
149
|
+
itemsDeduplicated;
|
|
150
|
+
constructor(options) {
|
|
151
|
+
const message = `Batch ${options.batchId} was not sealed: received ${options.enqueuedCount} of ${options.expectedCount} expected items (accepted: ${options.itemsAccepted}, deduplicated: ${options.itemsDeduplicated})`;
|
|
152
|
+
super(message);
|
|
153
|
+
this.batchId = options.batchId;
|
|
154
|
+
this.enqueuedCount = options.enqueuedCount;
|
|
155
|
+
this.expectedCount = options.expectedCount;
|
|
156
|
+
this.itemsAccepted = options.itemsAccepted;
|
|
157
|
+
this.itemsDeduplicated = options.itemsDeduplicated;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
133
160
|
function castToError(err) {
|
|
134
161
|
if (err instanceof Error)
|
|
135
162
|
return err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/v3/apiClient/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/v3/apiClient/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { AddTagsRequestBody, ApiDeploymentListOptions, BatchTaskRunExecutionResult, BatchTriggerTaskV3RequestBody, CompleteWaitpointTokenRequestBody, CreateEnvironmentVariableRequestBody, CreateScheduleOptions, CreateWaitpointTokenRequestBody, CreateWaitpointTokenResponseBody, ListQueueOptions, ListRunResponseItem, ListScheduleOptions, RescheduleRunRequestBody, RetrieveQueueParam, TaskRunExecutionResult, TriggerTaskRequestBody, UpdateEnvironmentVariableRequestBody, UpdateMetadataRequestBody, UpdateScheduleOptions, WaitForDurationRequestBody, WaitpointTokenItem } from "../schemas/index.js";
|
|
2
|
+
import { AddTagsRequestBody, ApiDeploymentListOptions, BatchItemNDJSON, BatchTaskRunExecutionResult, BatchTriggerTaskV3RequestBody, CompleteWaitpointTokenRequestBody, CreateBatchRequestBody, CreateBatchResponse, CreateEnvironmentVariableRequestBody, CreateScheduleOptions, CreateWaitpointTokenRequestBody, CreateWaitpointTokenResponseBody, ListQueueOptions, ListRunResponseItem, ListScheduleOptions, RescheduleRunRequestBody, RetrieveQueueParam, StreamBatchItemsResponse, TaskRunExecutionResult, TriggerTaskRequestBody, UpdateEnvironmentVariableRequestBody, UpdateMetadataRequestBody, UpdateScheduleOptions, WaitForDurationRequestBody, WaitpointTokenItem } from "../schemas/index.js";
|
|
3
3
|
import { AsyncIterableStream } from "../streams/asyncIterableStream.js";
|
|
4
4
|
import { AnyRunTypes, TriggerJwtOptions } from "../types/tasks.js";
|
|
5
5
|
import { Prettify } from "../types/utils.js";
|
|
@@ -10,6 +10,9 @@ import { ApiClientConfiguration } from "../apiClientManager-api.js";
|
|
|
10
10
|
export type CreateWaitpointTokenResponse = Prettify<CreateWaitpointTokenResponseBody & {
|
|
11
11
|
publicAccessToken: string;
|
|
12
12
|
}>;
|
|
13
|
+
export type CreateBatchApiResponse = Prettify<CreateBatchResponse & {
|
|
14
|
+
publicAccessToken: string;
|
|
15
|
+
}>;
|
|
13
16
|
export type { CreateEnvironmentVariableParams, ImportEnvironmentVariablesParams, SubscribeToRunsQueryParams, UpdateEnvironmentVariableParams, RealtimeRunSkipColumns, };
|
|
14
17
|
export type ClientTriggerOptions = {
|
|
15
18
|
spanParentAsLink?: boolean;
|
|
@@ -55,6 +58,43 @@ export declare class ApiClient {
|
|
|
55
58
|
id: string;
|
|
56
59
|
runCount: number;
|
|
57
60
|
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Phase 1 of 2-phase batch API: Create a batch
|
|
63
|
+
*
|
|
64
|
+
* Creates a new batch and returns its ID. For batchTriggerAndWait,
|
|
65
|
+
* the parent run is blocked immediately on batch creation.
|
|
66
|
+
*
|
|
67
|
+
* @param body - The batch creation parameters
|
|
68
|
+
* @param clientOptions - Options for trace context handling
|
|
69
|
+
* @param clientOptions.spanParentAsLink - If true, child runs will have separate trace IDs with a link to parent
|
|
70
|
+
* @param requestOptions - Optional request options
|
|
71
|
+
* @returns The created batch with ID and metadata
|
|
72
|
+
*/
|
|
73
|
+
createBatch(body: CreateBatchRequestBody, clientOptions?: ClientTriggerOptions, requestOptions?: TriggerRequestOptions): Promise<{
|
|
74
|
+
publicAccessToken: string;
|
|
75
|
+
id: string;
|
|
76
|
+
isCached: boolean;
|
|
77
|
+
runCount: number;
|
|
78
|
+
idempotencyKey?: string | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Phase 2 of 2-phase batch API: Stream batch items
|
|
82
|
+
*
|
|
83
|
+
* Streams batch items as NDJSON to the server. Each item is enqueued
|
|
84
|
+
* as it arrives. The batch is automatically sealed when the stream completes.
|
|
85
|
+
*
|
|
86
|
+
* Includes automatic retry with exponential backoff. Since items are deduplicated
|
|
87
|
+
* by index on the server, retrying the entire stream is safe.
|
|
88
|
+
*
|
|
89
|
+
* Uses ReadableStream.tee() for retry capability without buffering all items
|
|
90
|
+
* upfront - only items consumed before a failure are buffered for retry.
|
|
91
|
+
*
|
|
92
|
+
* @param batchId - The batch ID from createBatch
|
|
93
|
+
* @param items - Array or async iterable of batch items
|
|
94
|
+
* @param requestOptions - Optional request options
|
|
95
|
+
* @returns Summary of items accepted and deduplicated
|
|
96
|
+
*/
|
|
97
|
+
streamBatchItems(batchId: string, items: BatchItemNDJSON[] | AsyncIterable<BatchItemNDJSON>, requestOptions?: ApiRequestOptions): Promise<StreamBatchItemsResponse>;
|
|
58
98
|
createUploadPayloadUrl(filename: string, requestOptions?: ZodFetchOptions): ApiPromise<{
|
|
59
99
|
presignedUrl: string;
|
|
60
100
|
}>;
|
|
@@ -240,6 +280,9 @@ export declare class ApiClient {
|
|
|
240
280
|
cancelRun(runId: string, requestOptions?: ZodFetchOptions): ApiPromise<{
|
|
241
281
|
id: string;
|
|
242
282
|
}>;
|
|
283
|
+
resetIdempotencyKey(taskIdentifier: string, idempotencyKey: string, requestOptions?: ZodFetchOptions): ApiPromise<{
|
|
284
|
+
id: string;
|
|
285
|
+
}>;
|
|
243
286
|
rescheduleRun(runId: string, body: RescheduleRunRequestBody, requestOptions?: ZodFetchOptions): ApiPromise<{
|
|
244
287
|
status: "PENDING_VERSION" | "QUEUED" | "DEQUEUED" | "EXECUTING" | "WAITING" | "COMPLETED" | "CANCELED" | "FAILED" | "CRASHED" | "SYSTEM_FAILURE" | "DELAYED" | "EXPIRED" | "TIMED_OUT";
|
|
245
288
|
id: string;
|
|
@@ -842,12 +885,21 @@ export declare class ApiClient {
|
|
|
842
885
|
}>;
|
|
843
886
|
generateJWTClaims(requestOptions?: ZodFetchOptions): Promise<Record<string, any>>;
|
|
844
887
|
retrieveBatch(batchId: string, requestOptions?: ZodFetchOptions): ApiPromise<{
|
|
845
|
-
status: "COMPLETED" | "PENDING";
|
|
888
|
+
status: "COMPLETED" | "PENDING" | "PROCESSING" | "PARTIAL_FAILED" | "ABORTED";
|
|
846
889
|
id: string;
|
|
847
890
|
createdAt: Date;
|
|
848
891
|
updatedAt: Date;
|
|
849
892
|
runs: string[];
|
|
850
893
|
runCount: number;
|
|
894
|
+
processing: {
|
|
895
|
+
errors: {
|
|
896
|
+
error: string;
|
|
897
|
+
taskIdentifier: string;
|
|
898
|
+
index: number;
|
|
899
|
+
errorCode?: string | undefined;
|
|
900
|
+
}[];
|
|
901
|
+
completedAt?: Date | undefined;
|
|
902
|
+
};
|
|
851
903
|
idempotencyKey?: string | undefined;
|
|
852
904
|
}>;
|
|
853
905
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { VERSION } from "../../version.js";
|
|
3
3
|
import { generateJWT } from "../jwt.js";
|
|
4
|
-
import { ApiDeploymentListResponseItem, AppendToStreamResponseBody, BatchTaskRunExecutionResult, BatchTriggerTaskV3Response, CanceledRunResponse, CompleteWaitpointTokenResponseBody, CreateStreamResponseBody, CreateUploadPayloadUrlResponseBody, CreateWaitpointTokenResponseBody, DeletedScheduleObject, EnvironmentVariableResponseBody, EnvironmentVariableWithSecret, ListRunResponseItem, QueueItem, ReplayRunResponse, RetrieveBatchV2Response, RetrieveRunResponse, RetrieveRunTraceResponseBody, ScheduleObject, TaskRunExecutionResult, TriggerTaskResponse, UpdateMetadataResponseBody, WaitForDurationResponseBody, WaitForWaitpointTokenResponseBody, WaitpointRetrieveTokenResponse, WaitpointTokenItem, } from "../schemas/index.js";
|
|
4
|
+
import { ApiDeploymentListResponseItem, AppendToStreamResponseBody, BatchTaskRunExecutionResult, BatchTriggerTaskV3Response, CanceledRunResponse, CompleteWaitpointTokenResponseBody, CreateBatchResponse, CreateStreamResponseBody, CreateUploadPayloadUrlResponseBody, CreateWaitpointTokenResponseBody, DeletedScheduleObject, EnvironmentVariableResponseBody, EnvironmentVariableWithSecret, ListRunResponseItem, QueueItem, ReplayRunResponse, ResetIdempotencyKeyResponse, RetrieveBatchV2Response, RetrieveRunResponse, RetrieveRunTraceResponseBody, ScheduleObject, StreamBatchItemsResponse, TaskRunExecutionResult, TriggerTaskResponse, UpdateMetadataResponseBody, WaitForDurationResponseBody, WaitForWaitpointTokenResponseBody, WaitpointRetrieveTokenResponse, WaitpointTokenItem, } from "../schemas/index.js";
|
|
5
5
|
import { taskContext } from "../task-context-api.js";
|
|
6
6
|
import { isRequestOptions, zodfetch, zodfetchCursorPage, zodfetchOffsetLimitPage, } from "./core.js";
|
|
7
|
-
import { ApiError } from "./errors.js";
|
|
7
|
+
import { ApiConnectionError, ApiError, BatchNotSealedError } from "./errors.js";
|
|
8
|
+
import { calculateNextRetryDelay } from "../utils/retries.js";
|
|
8
9
|
import { SSEStreamSubscriptionFactory, SSEStreamSubscription, runShapeStream, } from "./runStream.js";
|
|
9
10
|
import { API_VERSION, API_VERSION_HEADER_NAME } from "./version.js";
|
|
10
11
|
import { getEnvVar } from "../utils/getEnv.js";
|
|
@@ -132,6 +133,165 @@ export class ApiClient {
|
|
|
132
133
|
};
|
|
133
134
|
});
|
|
134
135
|
}
|
|
136
|
+
/**
|
|
137
|
+
* Phase 1 of 2-phase batch API: Create a batch
|
|
138
|
+
*
|
|
139
|
+
* Creates a new batch and returns its ID. For batchTriggerAndWait,
|
|
140
|
+
* the parent run is blocked immediately on batch creation.
|
|
141
|
+
*
|
|
142
|
+
* @param body - The batch creation parameters
|
|
143
|
+
* @param clientOptions - Options for trace context handling
|
|
144
|
+
* @param clientOptions.spanParentAsLink - If true, child runs will have separate trace IDs with a link to parent
|
|
145
|
+
* @param requestOptions - Optional request options
|
|
146
|
+
* @returns The created batch with ID and metadata
|
|
147
|
+
*/
|
|
148
|
+
createBatch(body, clientOptions, requestOptions) {
|
|
149
|
+
return zodfetch(CreateBatchResponse, `${this.baseUrl}/api/v3/batches`, {
|
|
150
|
+
method: "POST",
|
|
151
|
+
headers: this.#getHeaders(clientOptions?.spanParentAsLink ?? false),
|
|
152
|
+
body: JSON.stringify(body),
|
|
153
|
+
}, mergeRequestOptions(this.defaultRequestOptions, requestOptions))
|
|
154
|
+
.withResponse()
|
|
155
|
+
.then(async ({ data, response }) => {
|
|
156
|
+
const claimsHeader = response.headers.get("x-trigger-jwt-claims");
|
|
157
|
+
const claims = claimsHeader ? JSON.parse(claimsHeader) : undefined;
|
|
158
|
+
const jwt = await generateJWT({
|
|
159
|
+
secretKey: this.accessToken,
|
|
160
|
+
payload: {
|
|
161
|
+
...claims,
|
|
162
|
+
scopes: [`read:batch:${data.id}`],
|
|
163
|
+
},
|
|
164
|
+
expirationTime: requestOptions?.publicAccessToken?.expirationTime ?? "1h",
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
...data,
|
|
168
|
+
publicAccessToken: jwt,
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Phase 2 of 2-phase batch API: Stream batch items
|
|
174
|
+
*
|
|
175
|
+
* Streams batch items as NDJSON to the server. Each item is enqueued
|
|
176
|
+
* as it arrives. The batch is automatically sealed when the stream completes.
|
|
177
|
+
*
|
|
178
|
+
* Includes automatic retry with exponential backoff. Since items are deduplicated
|
|
179
|
+
* by index on the server, retrying the entire stream is safe.
|
|
180
|
+
*
|
|
181
|
+
* Uses ReadableStream.tee() for retry capability without buffering all items
|
|
182
|
+
* upfront - only items consumed before a failure are buffered for retry.
|
|
183
|
+
*
|
|
184
|
+
* @param batchId - The batch ID from createBatch
|
|
185
|
+
* @param items - Array or async iterable of batch items
|
|
186
|
+
* @param requestOptions - Optional request options
|
|
187
|
+
* @returns Summary of items accepted and deduplicated
|
|
188
|
+
*/
|
|
189
|
+
async streamBatchItems(batchId, items, requestOptions) {
|
|
190
|
+
// Convert input to ReadableStream for uniform handling and tee() support
|
|
191
|
+
const stream = createNdjsonStream(items);
|
|
192
|
+
const retryOptions = {
|
|
193
|
+
...DEFAULT_STREAM_BATCH_RETRY_OPTIONS,
|
|
194
|
+
...requestOptions?.retry,
|
|
195
|
+
};
|
|
196
|
+
return this.#streamBatchItemsWithRetry(batchId, stream, retryOptions);
|
|
197
|
+
}
|
|
198
|
+
async #streamBatchItemsWithRetry(batchId, stream, retryOptions, attempt = 1) {
|
|
199
|
+
const headers = this.#getHeaders(false);
|
|
200
|
+
headers["Content-Type"] = "application/x-ndjson";
|
|
201
|
+
// Tee the stream: one branch for this attempt, one for potential retry
|
|
202
|
+
// tee() internally buffers data consumed from one branch for the other,
|
|
203
|
+
// so we only buffer what's been sent before a failure occurs
|
|
204
|
+
const [forRequest, forRetry] = stream.tee();
|
|
205
|
+
try {
|
|
206
|
+
const response = await fetch(`${this.baseUrl}/api/v3/batches/${batchId}/items`, {
|
|
207
|
+
method: "POST",
|
|
208
|
+
headers,
|
|
209
|
+
body: forRequest,
|
|
210
|
+
// @ts-expect-error - duplex is required for streaming body but not in types
|
|
211
|
+
duplex: "half",
|
|
212
|
+
});
|
|
213
|
+
if (!response.ok) {
|
|
214
|
+
const retryResult = shouldRetryStreamBatchItems(response, attempt, retryOptions);
|
|
215
|
+
if (retryResult.retry) {
|
|
216
|
+
// Cancel the request stream before retry to prevent tee() from buffering
|
|
217
|
+
await forRequest.cancel();
|
|
218
|
+
await sleep(retryResult.delay);
|
|
219
|
+
// Use the backup stream for retry
|
|
220
|
+
return this.#streamBatchItemsWithRetry(batchId, forRetry, retryOptions, attempt + 1);
|
|
221
|
+
}
|
|
222
|
+
// Not retrying - cancel the backup stream
|
|
223
|
+
await forRetry.cancel();
|
|
224
|
+
const errText = await response.text().catch((e) => e.message);
|
|
225
|
+
let errJSON;
|
|
226
|
+
try {
|
|
227
|
+
errJSON = JSON.parse(errText);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// ignore
|
|
231
|
+
}
|
|
232
|
+
const errMessage = errJSON ? undefined : errText;
|
|
233
|
+
const responseHeaders = Object.fromEntries(response.headers.entries());
|
|
234
|
+
throw ApiError.generate(response.status, errJSON, errMessage, responseHeaders);
|
|
235
|
+
}
|
|
236
|
+
const result = await response.json();
|
|
237
|
+
const parsed = StreamBatchItemsResponse.safeParse(result);
|
|
238
|
+
if (!parsed.success) {
|
|
239
|
+
// Cancel backup stream since we're throwing
|
|
240
|
+
await forRetry.cancel();
|
|
241
|
+
throw new Error(`Invalid response from server for batch ${batchId}: ${parsed.error.message}`);
|
|
242
|
+
}
|
|
243
|
+
// Check if the batch was sealed
|
|
244
|
+
if (!parsed.data.sealed) {
|
|
245
|
+
// Not all items were received - treat as retryable condition
|
|
246
|
+
const delay = calculateNextRetryDelay(retryOptions, attempt);
|
|
247
|
+
if (delay) {
|
|
248
|
+
// Cancel the request stream before retry to prevent tee() from buffering
|
|
249
|
+
await forRequest.cancel();
|
|
250
|
+
// Retry with the backup stream
|
|
251
|
+
await sleep(delay);
|
|
252
|
+
return this.#streamBatchItemsWithRetry(batchId, forRetry, retryOptions, attempt + 1);
|
|
253
|
+
}
|
|
254
|
+
// No more retries - cancel backup stream and throw descriptive error
|
|
255
|
+
await forRetry.cancel();
|
|
256
|
+
throw new BatchNotSealedError({
|
|
257
|
+
batchId,
|
|
258
|
+
enqueuedCount: parsed.data.enqueuedCount ?? 0,
|
|
259
|
+
expectedCount: parsed.data.expectedCount ?? 0,
|
|
260
|
+
itemsAccepted: parsed.data.itemsAccepted,
|
|
261
|
+
itemsDeduplicated: parsed.data.itemsDeduplicated,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// Success - cancel the backup stream to release resources
|
|
265
|
+
await forRetry.cancel();
|
|
266
|
+
return parsed.data;
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
// Don't retry BatchNotSealedError (retries already exhausted)
|
|
270
|
+
if (error instanceof BatchNotSealedError) {
|
|
271
|
+
throw error;
|
|
272
|
+
}
|
|
273
|
+
// Don't retry ApiErrors (already handled above with backup stream cancelled)
|
|
274
|
+
if (error instanceof ApiError) {
|
|
275
|
+
throw error;
|
|
276
|
+
}
|
|
277
|
+
// Retry connection errors using the backup stream
|
|
278
|
+
const delay = calculateNextRetryDelay(retryOptions, attempt);
|
|
279
|
+
if (delay) {
|
|
280
|
+
// Cancel the request stream before retry to prevent tee() from buffering
|
|
281
|
+
await forRequest.cancel();
|
|
282
|
+
await sleep(delay);
|
|
283
|
+
return this.#streamBatchItemsWithRetry(batchId, forRetry, retryOptions, attempt + 1);
|
|
284
|
+
}
|
|
285
|
+
// No more retries - cancel the backup stream
|
|
286
|
+
await forRetry.cancel();
|
|
287
|
+
// Wrap in a more descriptive error
|
|
288
|
+
const cause = error instanceof Error ? error : new Error(String(error));
|
|
289
|
+
throw new ApiConnectionError({
|
|
290
|
+
cause,
|
|
291
|
+
message: `Failed to stream batch items for batch ${batchId}: ${cause.message}`,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
135
295
|
createUploadPayloadUrl(filename, requestOptions) {
|
|
136
296
|
return zodfetch(CreateUploadPayloadUrlResponseBody, `${this.baseUrl}/api/v1/packets/${filename}`, {
|
|
137
297
|
method: "PUT",
|
|
@@ -195,6 +355,13 @@ export class ApiClient {
|
|
|
195
355
|
headers: this.#getHeaders(false),
|
|
196
356
|
}, mergeRequestOptions(this.defaultRequestOptions, requestOptions));
|
|
197
357
|
}
|
|
358
|
+
resetIdempotencyKey(taskIdentifier, idempotencyKey, requestOptions) {
|
|
359
|
+
return zodfetch(ResetIdempotencyKeyResponse, `${this.baseUrl}/api/v1/idempotencyKeys/${encodeURIComponent(idempotencyKey)}/reset`, {
|
|
360
|
+
method: "POST",
|
|
361
|
+
headers: this.#getHeaders(false),
|
|
362
|
+
body: JSON.stringify({ taskIdentifier }),
|
|
363
|
+
}, mergeRequestOptions(this.defaultRequestOptions, requestOptions));
|
|
364
|
+
}
|
|
198
365
|
rescheduleRun(runId, body, requestOptions) {
|
|
199
366
|
return zodfetch(RetrieveRunResponse, `${this.baseUrl}/api/v1/runs/${runId}/reschedule`, {
|
|
200
367
|
method: "POST",
|
|
@@ -721,6 +888,119 @@ function createSearchQueryForListWaitpointTokens(query) {
|
|
|
721
888
|
}
|
|
722
889
|
return searchParams;
|
|
723
890
|
}
|
|
891
|
+
// ============================================================================
|
|
892
|
+
// Stream Batch Items Retry Helpers
|
|
893
|
+
// ============================================================================
|
|
894
|
+
/**
|
|
895
|
+
* Default retry options for streaming batch items.
|
|
896
|
+
* Uses higher values than the default zodfetch retry since batch operations
|
|
897
|
+
* are more expensive to repeat from scratch.
|
|
898
|
+
*/
|
|
899
|
+
const DEFAULT_STREAM_BATCH_RETRY_OPTIONS = {
|
|
900
|
+
maxAttempts: 5,
|
|
901
|
+
factor: 2,
|
|
902
|
+
minTimeoutInMs: 1000,
|
|
903
|
+
maxTimeoutInMs: 30_000,
|
|
904
|
+
randomize: true,
|
|
905
|
+
};
|
|
906
|
+
/**
|
|
907
|
+
* Determines if a failed stream batch items request should be retried.
|
|
908
|
+
* Follows similar logic to zodfetch's shouldRetry but specific to batch streaming.
|
|
909
|
+
*/
|
|
910
|
+
function shouldRetryStreamBatchItems(response, attempt, retryOptions) {
|
|
911
|
+
function shouldRetryForOptions() {
|
|
912
|
+
const delay = calculateNextRetryDelay(retryOptions, attempt);
|
|
913
|
+
if (delay) {
|
|
914
|
+
return { retry: true, delay };
|
|
915
|
+
}
|
|
916
|
+
return { retry: false };
|
|
917
|
+
}
|
|
918
|
+
// Check x-should-retry header - server can explicitly control retry behavior
|
|
919
|
+
const shouldRetryHeader = response.headers.get("x-should-retry");
|
|
920
|
+
if (shouldRetryHeader === "true")
|
|
921
|
+
return shouldRetryForOptions();
|
|
922
|
+
if (shouldRetryHeader === "false")
|
|
923
|
+
return { retry: false };
|
|
924
|
+
// Retry on request timeouts
|
|
925
|
+
if (response.status === 408)
|
|
926
|
+
return shouldRetryForOptions();
|
|
927
|
+
// Retry on lock timeouts
|
|
928
|
+
if (response.status === 409)
|
|
929
|
+
return shouldRetryForOptions();
|
|
930
|
+
// Retry on rate limits with special handling for Retry-After
|
|
931
|
+
if (response.status === 429) {
|
|
932
|
+
if (attempt >= retryOptions.maxAttempts) {
|
|
933
|
+
return { retry: false };
|
|
934
|
+
}
|
|
935
|
+
// x-ratelimit-reset is the unix timestamp in milliseconds when the rate limit will reset
|
|
936
|
+
const resetAtUnixEpochMs = response.headers.get("x-ratelimit-reset");
|
|
937
|
+
if (resetAtUnixEpochMs) {
|
|
938
|
+
const resetAtUnixEpoch = parseInt(resetAtUnixEpochMs, 10);
|
|
939
|
+
const delay = resetAtUnixEpoch - Date.now() + Math.floor(Math.random() * 1000);
|
|
940
|
+
if (delay > 0) {
|
|
941
|
+
return { retry: true, delay };
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
// Fall back to Retry-After header (seconds)
|
|
945
|
+
const retryAfter = response.headers.get("retry-after");
|
|
946
|
+
if (retryAfter) {
|
|
947
|
+
const retryAfterSeconds = parseInt(retryAfter, 10);
|
|
948
|
+
if (!isNaN(retryAfterSeconds)) {
|
|
949
|
+
return { retry: true, delay: retryAfterSeconds * 1000 };
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
return shouldRetryForOptions();
|
|
953
|
+
}
|
|
954
|
+
// Retry on server errors (5xx)
|
|
955
|
+
if (response.status >= 500)
|
|
956
|
+
return shouldRetryForOptions();
|
|
957
|
+
// Don't retry client errors (4xx) except those handled above
|
|
958
|
+
return { retry: false };
|
|
959
|
+
}
|
|
960
|
+
/**
|
|
961
|
+
* Simple sleep utility for retry delays.
|
|
962
|
+
*/
|
|
963
|
+
function sleep(ms) {
|
|
964
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
965
|
+
}
|
|
966
|
+
// ============================================================================
|
|
967
|
+
// NDJSON Stream Helpers
|
|
968
|
+
// ============================================================================
|
|
969
|
+
/**
|
|
970
|
+
* Creates a ReadableStream that emits NDJSON (newline-delimited JSON) from items.
|
|
971
|
+
* Handles both arrays and async iterables for streaming large batches.
|
|
972
|
+
*/
|
|
973
|
+
function createNdjsonStream(items) {
|
|
974
|
+
const encoder = new TextEncoder();
|
|
975
|
+
// Check if items is an array
|
|
976
|
+
if (Array.isArray(items)) {
|
|
977
|
+
let index = 0;
|
|
978
|
+
return new ReadableStream({
|
|
979
|
+
pull(controller) {
|
|
980
|
+
if (index >= items.length) {
|
|
981
|
+
controller.close();
|
|
982
|
+
return;
|
|
983
|
+
}
|
|
984
|
+
const item = items[index++];
|
|
985
|
+
const line = JSON.stringify(item) + "\n";
|
|
986
|
+
controller.enqueue(encoder.encode(line));
|
|
987
|
+
},
|
|
988
|
+
});
|
|
989
|
+
}
|
|
990
|
+
// Handle async iterable
|
|
991
|
+
const iterator = items[Symbol.asyncIterator]();
|
|
992
|
+
return new ReadableStream({
|
|
993
|
+
async pull(controller) {
|
|
994
|
+
const { value, done } = await iterator.next();
|
|
995
|
+
if (done) {
|
|
996
|
+
controller.close();
|
|
997
|
+
return;
|
|
998
|
+
}
|
|
999
|
+
const line = JSON.stringify(value) + "\n";
|
|
1000
|
+
controller.enqueue(encoder.encode(line));
|
|
1001
|
+
},
|
|
1002
|
+
});
|
|
1003
|
+
}
|
|
724
1004
|
export function mergeRequestOptions(defaultOptions, options) {
|
|
725
1005
|
if (!options) {
|
|
726
1006
|
return defaultOptions;
|