@requence/task 0.7.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.
Files changed (97) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +383 -0
  3. package/build/chunk-b4h2we9a.js +35 -0
  4. package/build/chunk-b4h2we9a.js.map +10 -0
  5. package/build/cli.js +76 -0
  6. package/build/cli.js.map +10 -0
  7. package/build/index.js +1134 -0
  8. package/build/index.js.map +28 -0
  9. package/build/types/helpers/src/files/RequenceFile.d.ts +40 -0
  10. package/build/types/helpers/src/files/RequenceFile.d.ts.map +1 -0
  11. package/build/types/helpers/src/files/RequenceStream.d.ts +32 -0
  12. package/build/types/helpers/src/files/RequenceStream.d.ts.map +1 -0
  13. package/build/types/helpers/src/files/fileObject.d.ts +16 -0
  14. package/build/types/helpers/src/files/fileObject.d.ts.map +1 -0
  15. package/build/types/helpers/src/files/index.d.ts +7 -0
  16. package/build/types/helpers/src/files/index.d.ts.map +1 -0
  17. package/build/types/helpers/src/files/isValidMimeType.d.ts +5 -0
  18. package/build/types/helpers/src/files/isValidMimeType.d.ts.map +1 -0
  19. package/build/types/helpers/src/files/mapOutput.d.ts +10 -0
  20. package/build/types/helpers/src/files/mapOutput.d.ts.map +1 -0
  21. package/build/types/helpers/src/files/streamObject.d.ts +14 -0
  22. package/build/types/helpers/src/files/streamObject.d.ts.map +1 -0
  23. package/build/types/helpers/src/files/types.d.ts +4 -0
  24. package/build/types/helpers/src/files/types.d.ts.map +1 -0
  25. package/build/types/helpers/src/index.d.ts +13 -0
  26. package/build/types/helpers/src/index.d.ts.map +1 -0
  27. package/build/types/helpers/src/jsonschema/mapSchema.d.ts +20 -0
  28. package/build/types/helpers/src/jsonschema/mapSchema.d.ts.map +1 -0
  29. package/build/types/helpers/src/jsonschema/types.d.ts +13 -0
  30. package/build/types/helpers/src/jsonschema/types.d.ts.map +1 -0
  31. package/build/types/helpers/src/jsonschema/validate.d.ts +32 -0
  32. package/build/types/helpers/src/jsonschema/validate.d.ts.map +1 -0
  33. package/build/types/helpers/src/jsonschema/zod.d.ts +17 -0
  34. package/build/types/helpers/src/jsonschema/zod.d.ts.map +1 -0
  35. package/build/types/helpers/src/protocol/NodeTree.d.ts +510 -0
  36. package/build/types/helpers/src/protocol/NodeTree.d.ts.map +1 -0
  37. package/build/types/helpers/src/protocol/command.d.ts +507 -0
  38. package/build/types/helpers/src/protocol/command.d.ts.map +1 -0
  39. package/build/types/helpers/src/protocol/helpers.d.ts +7 -0
  40. package/build/types/helpers/src/protocol/helpers.d.ts.map +1 -0
  41. package/build/types/helpers/src/protocol/index.d.ts +8 -0
  42. package/build/types/helpers/src/protocol/index.d.ts.map +1 -0
  43. package/build/types/helpers/src/protocol/nodeType.d.ts +187 -0
  44. package/build/types/helpers/src/protocol/nodeType.d.ts.map +1 -0
  45. package/build/types/helpers/src/protocol/taskOptions.d.ts +23 -0
  46. package/build/types/helpers/src/protocol/taskOptions.d.ts.map +1 -0
  47. package/build/types/helpers/src/protocol/templateNodeTypes.d.ts +267 -0
  48. package/build/types/helpers/src/protocol/templateNodeTypes.d.ts.map +1 -0
  49. package/build/types/helpers/src/protocol/treeNodes.d.ts +874 -0
  50. package/build/types/helpers/src/protocol/treeNodes.d.ts.map +1 -0
  51. package/build/types/helpers/src/protocol/update.d.ts +406 -0
  52. package/build/types/helpers/src/protocol/update.d.ts.map +1 -0
  53. package/build/types/helpers/src/utils/callbackToAsyncIterator.d.ts +3 -0
  54. package/build/types/helpers/src/utils/callbackToAsyncIterator.d.ts.map +1 -0
  55. package/build/types/helpers/src/utils/clone.d.ts +3 -0
  56. package/build/types/helpers/src/utils/clone.d.ts.map +1 -0
  57. package/build/types/helpers/src/utils/createObjectProxy.d.ts +2 -0
  58. package/build/types/helpers/src/utils/createObjectProxy.d.ts.map +1 -0
  59. package/build/types/helpers/src/utils/debounce.d.ts +4 -0
  60. package/build/types/helpers/src/utils/debounce.d.ts.map +1 -0
  61. package/build/types/helpers/src/utils/guards.d.ts +3 -0
  62. package/build/types/helpers/src/utils/guards.d.ts.map +1 -0
  63. package/build/types/helpers/src/utils/mapData.d.ts +18 -0
  64. package/build/types/helpers/src/utils/mapData.d.ts.map +1 -0
  65. package/build/types/helpers/src/utils/matchSchema.d.ts +4 -0
  66. package/build/types/helpers/src/utils/matchSchema.d.ts.map +1 -0
  67. package/build/types/helpers/src/utils/obfuscate.d.ts +4 -0
  68. package/build/types/helpers/src/utils/obfuscate.d.ts.map +1 -0
  69. package/build/types/helpers/src/utils/obj.d.ts +4 -0
  70. package/build/types/helpers/src/utils/obj.d.ts.map +1 -0
  71. package/build/types/helpers/src/utils/requenceCallback.d.ts +17 -0
  72. package/build/types/helpers/src/utils/requenceCallback.d.ts.map +1 -0
  73. package/build/types/helpers/src/utils/resolveRequenceTypes.d.ts +8 -0
  74. package/build/types/helpers/src/utils/resolveRequenceTypes.d.ts.map +1 -0
  75. package/build/types/helpers/src/utils/types.d.ts +7 -0
  76. package/build/types/helpers/src/utils/types.d.ts.map +1 -0
  77. package/build/types/task/src/abortTask.d.ts +8 -0
  78. package/build/types/task/src/abortTask.d.ts.map +1 -0
  79. package/build/types/task/src/ackTask.d.ts +7 -0
  80. package/build/types/task/src/ackTask.d.ts.map +1 -0
  81. package/build/types/task/src/createTask.d.ts +21 -0
  82. package/build/types/task/src/createTask.d.ts.map +1 -0
  83. package/build/types/task/src/getTask.d.ts +26 -0
  84. package/build/types/task/src/getTask.d.ts.map +1 -0
  85. package/build/types/task/src/index.d.ts +9 -0
  86. package/build/types/task/src/index.d.ts.map +1 -0
  87. package/build/types/task/src/protectTask.d.ts +7 -0
  88. package/build/types/task/src/protectTask.d.ts.map +1 -0
  89. package/build/types/task/src/recreateTask.d.ts +10 -0
  90. package/build/types/task/src/recreateTask.d.ts.map +1 -0
  91. package/build/types/task/src/types.d.ts +243 -0
  92. package/build/types/task/src/types.d.ts.map +1 -0
  93. package/build/types/task/src/utils/getAccessToken.d.ts +5 -0
  94. package/build/types/task/src/utils/getAccessToken.d.ts.map +1 -0
  95. package/build/types/task/src/watchTasks.d.ts +21 -0
  96. package/build/types/task/src/watchTasks.d.ts.map +1 -0
  97. package/package.json +36 -0
package/build/index.js ADDED
@@ -0,0 +1,1134 @@
1
+ import {
2
+ deobfuscate
3
+ } from "./chunk-b4h2we9a.js";
4
+
5
+ // ../helpers/src/utils/callbackToAsyncIterator.ts
6
+ function callbackToAsyncIterator(subscribe) {
7
+ const pullQueue = [];
8
+ const pushQueue = [];
9
+ let done = false;
10
+ const pushValue = (value) => {
11
+ if (pullQueue.length !== 0) {
12
+ const resolver = pullQueue.shift();
13
+ resolver(value);
14
+ } else {
15
+ pushQueue.push(value);
16
+ }
17
+ };
18
+ const pullValue = () => new Promise((resolve) => {
19
+ if (pushQueue.length !== 0) {
20
+ resolve(pushQueue.shift());
21
+ } else {
22
+ pullQueue.push(resolve);
23
+ }
24
+ });
25
+ const cleanup = subscribe((value) => {
26
+ if (!done) {
27
+ pushValue({ value });
28
+ }
29
+ }, (error) => {
30
+ if (!done) {
31
+ pushValue({ error });
32
+ }
33
+ }, () => {
34
+ if (!done) {
35
+ pushValue({ done: true });
36
+ }
37
+ });
38
+ return {
39
+ async next() {
40
+ if (done) {
41
+ return { value: undefined, done: true };
42
+ }
43
+ const value = await pullValue();
44
+ if (value.done) {
45
+ done = true;
46
+ return { value: undefined, done: true };
47
+ }
48
+ if (value.error) {
49
+ done = true;
50
+ throw value.error;
51
+ }
52
+ return { value: value.value, done: false };
53
+ },
54
+ async return() {
55
+ if (!done) {
56
+ done = true;
57
+ if (typeof cleanup === "function") {
58
+ cleanup();
59
+ }
60
+ while (pullQueue.length > 0) {
61
+ const resolver = pullQueue.shift();
62
+ resolver({ done: true });
63
+ }
64
+ }
65
+ return { value: undefined, done: true };
66
+ }
67
+ };
68
+ }
69
+ function callbackToAsyncIterable(...args) {
70
+ let iterator;
71
+ return {
72
+ [Symbol.asyncIterator]() {
73
+ iterator ??= callbackToAsyncIterator(...args);
74
+ return iterator;
75
+ }
76
+ };
77
+ }
78
+
79
+ // ../helpers/src/utils/guards.ts
80
+ import { z } from "zod/v4";
81
+ var recordSchema = z.record(z.string(), z.unknown());
82
+ function isRecord(data) {
83
+ return recordSchema.safeParse(data).success;
84
+ }
85
+ var uuidSchema = z.uuid();
86
+
87
+ // ../helpers/src/utils/mapData.ts
88
+ function resolve(value, onResolve) {
89
+ if (value instanceof Promise) {
90
+ return Promise.resolve().then(() => value).then(onResolve);
91
+ }
92
+ return onResolve(value);
93
+ }
94
+ function notUndefined(value, fallback) {
95
+ return resolve(value, (resolvedValue) => typeof resolvedValue === "undefined" ? fallback : resolvedValue);
96
+ }
97
+
98
+ class AbortMapData extends Error {
99
+ }
100
+ function mapData(data, visitors) {
101
+ let aborted = false;
102
+ const traverseData = (data2, path) => {
103
+ if (aborted) {
104
+ return data2;
105
+ }
106
+ try {
107
+ if (Array.isArray(data2)) {
108
+ return resolve(visitors.Array?.(data2, path), (resolvedData) => {
109
+ if (resolvedData) {
110
+ return resolvedData;
111
+ }
112
+ const items = data2.map((item, index) => traverseData(item, [...path, index]));
113
+ if (items.some((item) => item instanceof Promise)) {
114
+ return Promise.all(items);
115
+ }
116
+ return items;
117
+ });
118
+ }
119
+ if (data2 === null) {
120
+ return notUndefined(visitors.Null?.(data2, path), data2);
121
+ }
122
+ if (typeof Buffer !== "undefined" && Buffer.isBuffer(data2)) {
123
+ return notUndefined(visitors.Buffer?.(data2, path), data2);
124
+ }
125
+ if (typeof data2 === "string") {
126
+ return notUndefined(visitors.String?.(data2, path), data2);
127
+ }
128
+ if (typeof data2 === "number") {
129
+ return notUndefined(visitors.Number?.(data2, path), data2);
130
+ }
131
+ if (typeof data2 === "symbol") {
132
+ return notUndefined(visitors.Symbol?.(data2, path), data2);
133
+ }
134
+ if (typeof data2 === "function") {
135
+ return notUndefined(visitors.Function?.(data2, path), data2);
136
+ }
137
+ if (isRecord(data2)) {
138
+ return resolve(visitors.Object?.(structuredClone(data2), path), (resolvedData) => {
139
+ const nextData = resolvedData ?? data2;
140
+ if (!isRecord(nextData)) {
141
+ return nextData;
142
+ }
143
+ const entries = Object.entries(nextData).map(([key, value]) => [
144
+ key,
145
+ traverseData(value, [...path, key])
146
+ ]);
147
+ if (entries.some(([, value]) => value instanceof Promise)) {
148
+ return Promise.all(entries.map(([key, value]) => Promise.resolve().then(() => value).then((resolvedValue) => [key, resolvedValue]))).then((entries2) => Object.fromEntries(entries2));
149
+ }
150
+ return Object.fromEntries(entries);
151
+ });
152
+ }
153
+ if (typeof data2 === "object" && data2) {
154
+ return notUndefined(visitors.Object?.(data2, path), data2);
155
+ }
156
+ return data2;
157
+ } catch (error) {
158
+ if (error instanceof AbortMapData) {
159
+ aborted = true;
160
+ return data2;
161
+ }
162
+ throw error;
163
+ }
164
+ };
165
+ return traverseData(data, []);
166
+ }
167
+ mapData.abort = () => {
168
+ throw new AbortMapData;
169
+ };
170
+
171
+ // ../helpers/src/utils/requenceCallback.ts
172
+ import { z as z2 } from "zod/v4";
173
+ var callbackObjectSchema = z2.object({
174
+ sourceId: z2.string(),
175
+ outputName: z2.string().nullable(),
176
+ propertyPath: z2.array(z2.union([z2.string(), z2.int()])),
177
+ callbackId: z2.uuid(),
178
+ __REQUENCE_type: z2.literal("RequenceCallback")
179
+ });
180
+ function isCallbackObject(data) {
181
+ return callbackObjectSchema.safeParse(data).success;
182
+ }
183
+
184
+ // ../helpers/src/files/fileObject.ts
185
+ import { z as z3 } from "zod/v4";
186
+ var fileObjectSchema = z3.object({
187
+ size: z3.int().positive(),
188
+ mime: z3.string(),
189
+ url: z3.url(),
190
+ __REQUENCE_type: z3.literal("RequenceFile")
191
+ });
192
+ function toFileObject(fileInfo) {
193
+ return {
194
+ ...fileInfo,
195
+ __REQUENCE_type: "RequenceFile"
196
+ };
197
+ }
198
+ function isFileObject(data) {
199
+ return fileObjectSchema.safeParse(data).success;
200
+ }
201
+
202
+ // ../helpers/src/files/RequenceFile.ts
203
+ class RequenceFile {
204
+ #data;
205
+ #file = null;
206
+ constructor(blobParts, options) {
207
+ this.#data = new Blob(blobParts, options);
208
+ }
209
+ static fromFileObject(file) {
210
+ const instance = new this([], { type: "x/x" });
211
+ instance.#file = file;
212
+ return instance;
213
+ }
214
+ get fileObject() {
215
+ return this.#file;
216
+ }
217
+ get size() {
218
+ return this.#file?.size ?? this.#data.size;
219
+ }
220
+ get mimeType() {
221
+ return this.#file?.mime ?? this.#data.type;
222
+ }
223
+ get mainMimeType() {
224
+ return this.mimeType.split("/")[0];
225
+ }
226
+ get subMimeType() {
227
+ return this.mimeType.split("/")[1];
228
+ }
229
+ async text() {
230
+ if (this.#file) {
231
+ return fetch(this.#file.url).then((response) => response.text());
232
+ }
233
+ return this.#data.text();
234
+ }
235
+ async json() {
236
+ if (this.#file) {
237
+ return fetch(this.#file.url).then((response) => response.json());
238
+ }
239
+ return JSON.parse(await this.text());
240
+ }
241
+ async blob() {
242
+ if (this.#file) {
243
+ return fetch(this.#file.url).then((response) => response.blob());
244
+ }
245
+ return this.#data;
246
+ }
247
+ async arrayBuffer() {
248
+ if (this.#file) {
249
+ return fetch(this.#file.url).then((response) => response.arrayBuffer());
250
+ }
251
+ return this.#data.arrayBuffer();
252
+ }
253
+ toString() {
254
+ return `RequenceFile<${this.mimeType}>`;
255
+ }
256
+ toJSON() {
257
+ return `RequenceFile<${this.mimeType}>`;
258
+ }
259
+ }
260
+
261
+ // ../helpers/src/files/RequenceStream.ts
262
+ class RequenceStream {
263
+ #data;
264
+ #stream = null;
265
+ #options;
266
+ constructor(stream, options) {
267
+ this.#data = stream;
268
+ this.#options = options;
269
+ }
270
+ static fromStreamObject(stream) {
271
+ const instance = new this(null, {
272
+ type: "x/x"
273
+ });
274
+ instance.#stream = stream;
275
+ return instance;
276
+ }
277
+ get streamObject() {
278
+ return this.#stream;
279
+ }
280
+ get mimeType() {
281
+ return this.#stream?.mime ?? this.#options.type;
282
+ }
283
+ get mainMimeType() {
284
+ return this.mimeType.split("/")[0];
285
+ }
286
+ get subMimeType() {
287
+ return this.mimeType.split("/")[1];
288
+ }
289
+ stream() {
290
+ if (this.#stream) {
291
+ const { readable, writable } = new TransformStream;
292
+ fetch(this.#stream.url).then((response) => response.body?.pipeTo(writable));
293
+ return readable;
294
+ }
295
+ return this.#data;
296
+ }
297
+ asyncIterable() {
298
+ const reader = this.stream().getReader();
299
+ return {
300
+ [Symbol.asyncIterator]() {
301
+ return {
302
+ async next() {
303
+ return reader.read();
304
+ },
305
+ async return() {
306
+ reader.cancel();
307
+ reader.releaseLock();
308
+ return { done: true, value: null };
309
+ }
310
+ };
311
+ }
312
+ };
313
+ }
314
+ toString() {
315
+ return `RequenceStream<${this.mimeType}>`;
316
+ }
317
+ toJSON() {
318
+ return `RequenceStream<${this.mimeType}>`;
319
+ }
320
+ }
321
+
322
+ // ../helpers/src/files/streamObject.ts
323
+ import { z as z4 } from "zod/v4";
324
+ var streamObjectSchema = z4.object({
325
+ mime: z4.string(),
326
+ url: z4.string().url(),
327
+ __REQUENCE_type: z4.literal("RequenceStream")
328
+ });
329
+ function isStreamObject(data) {
330
+ return streamObjectSchema.safeParse(data).success;
331
+ }
332
+ function toStreamObject(streamInfo) {
333
+ return {
334
+ ...streamInfo,
335
+ __REQUENCE_type: "RequenceStream"
336
+ };
337
+ }
338
+
339
+ // ../helpers/src/files/mapOutput.ts
340
+ async function upload(uploadUrl, body, signal, contentType) {
341
+ const uploadResponse = await fetch(uploadUrl, {
342
+ method: "POST",
343
+ signal,
344
+ headers: contentType ? {
345
+ "Content-Type": contentType
346
+ } : {},
347
+ body
348
+ });
349
+ const data = await uploadResponse.json();
350
+ if (!data || typeof data !== "object") {
351
+ throw new Error("invalid upload response");
352
+ }
353
+ return toFileObject(data);
354
+ }
355
+ async function stream(streamUrl, stream2, signal, contentType) {
356
+ const [testStream, dataStream] = stream2.tee();
357
+ const reader = testStream.getReader();
358
+ const dataPromise = reader.read().then(({ done: done2 }) => {
359
+ if (done2) {
360
+ throw new Error("No streaming date received");
361
+ }
362
+ reader.cancel();
363
+ });
364
+ const streamResponse = await fetch(streamUrl, {
365
+ method: "POST",
366
+ signal,
367
+ headers: contentType ? { "Content-Type": contentType } : {}
368
+ });
369
+ const data = await streamResponse.json();
370
+ if (!data || typeof data !== "object") {
371
+ throw new Error("invalid stream response");
372
+ }
373
+ const { mime, url } = data;
374
+ await dataPromise;
375
+ const done = fetch(url, {
376
+ method: "POST",
377
+ signal,
378
+ duplex: "half",
379
+ body: dataStream
380
+ });
381
+ return [toStreamObject({ mime, url }), done];
382
+ }
383
+ async function mapOutput(params) {
384
+ const streamPromises = [];
385
+ const mapped = await mapData(params.value, {
386
+ async Object(obj) {
387
+ if (obj instanceof Blob || obj instanceof RequenceFile) {
388
+ if (obj instanceof RequenceFile && obj.fileObject) {
389
+ return obj.fileObject;
390
+ }
391
+ if (params.options.uploadUrl) {
392
+ try {
393
+ if (obj instanceof Blob) {
394
+ return await upload(params.options.uploadUrl, obj, params.signal, obj.type);
395
+ }
396
+ if (obj instanceof RequenceFile) {
397
+ return await upload(params.options.uploadUrl, await obj.blob(), params.signal, obj.mimeType);
398
+ }
399
+ } catch (error) {
400
+ if (!(error instanceof Error)) {
401
+ throw error;
402
+ }
403
+ params.onFail?.(error);
404
+ return null;
405
+ }
406
+ } else {
407
+ params.onSkip?.();
408
+ return null;
409
+ }
410
+ }
411
+ if (obj instanceof Response || obj instanceof RequenceStream) {
412
+ if (obj instanceof RequenceStream && obj.streamObject) {
413
+ return obj.streamObject;
414
+ }
415
+ if (params.options.streamUrl) {
416
+ try {
417
+ if (obj instanceof Response && obj.body) {
418
+ const [streamObject, streamPromise] = await stream(params.options.streamUrl, obj.body, params.signal, obj.headers.get("Content-Type"));
419
+ streamPromises.push(streamPromise);
420
+ return streamObject;
421
+ }
422
+ if (obj instanceof RequenceStream) {
423
+ const [streamObject, streamPromise] = await stream(params.options.streamUrl, obj.stream(), params.signal, obj.mimeType);
424
+ streamPromises.push(streamPromise);
425
+ return streamObject;
426
+ }
427
+ } catch (error) {
428
+ if (!(error instanceof Error)) {
429
+ throw error;
430
+ }
431
+ params.onFail?.(error);
432
+ return null;
433
+ }
434
+ } else {
435
+ params.onSkip?.();
436
+ return null;
437
+ }
438
+ }
439
+ }
440
+ });
441
+ Promise.allSettled(streamPromises).then(() => params.onDone?.());
442
+ return mapped;
443
+ }
444
+
445
+ // ../helpers/src/utils/resolveRequenceTypes.ts
446
+ function resolveRequenceTypes(data, onCallback) {
447
+ return mapData(data, {
448
+ Object(obj) {
449
+ if (isFileObject(obj)) {
450
+ return RequenceFile.fromFileObject(obj);
451
+ }
452
+ if (isStreamObject(obj)) {
453
+ return RequenceStream.fromStreamObject(obj);
454
+ }
455
+ if (isCallbackObject(obj)) {
456
+ return (arg) => {
457
+ onCallback?.({ ...obj, arg });
458
+ };
459
+ }
460
+ }
461
+ });
462
+ }
463
+
464
+ // src/createTask.ts
465
+ import chalk from "chalk";
466
+ import { createEventSource } from "eventsource-client";
467
+
468
+ // src/utils/getAccessToken.ts
469
+ import { readFileSync } from "node:fs";
470
+ function getAccessToken(accessToken) {
471
+ let token = accessToken ?? process.env.REQUENCE_TASK_ACCESS_TOKEN ?? process.env.REQUENCE_ACCESS_TOKEN;
472
+ if (!token) {
473
+ const pkgJson = JSON.parse(readFileSync("package.json", "utf-8"));
474
+ token = pkgJson.requence?.task?.accessToken ?? pkgJson.requence?.accessToken;
475
+ }
476
+ if (!token) {
477
+ throw new Error(`No access token found
478
+ You can provide the access token as argument to createTask,
479
+ as environment variable REQUENCE_ACCESS_TOKEN or
480
+ in your package.json in requence.accessToken`);
481
+ }
482
+ const parts = deobfuscate(token);
483
+ if (parts.length < 2 || parts[0] !== "api") {
484
+ throw new Error("Invalid access token");
485
+ }
486
+ return {
487
+ token: parts[1],
488
+ apiBaseUrl: parts[2]
489
+ };
490
+ }
491
+
492
+ // src/abortTask.ts
493
+ class TaskAbortError extends Error {
494
+ taskId;
495
+ constructor(message, taskId) {
496
+ super(message);
497
+ this.taskId = taskId;
498
+ }
499
+ }
500
+ async function abortTask(options) {
501
+ const { apiBaseUrl, token } = getAccessToken(options.accessToken);
502
+ const abortUrl = `${apiBaseUrl}/task/abort/${options.taskId}`;
503
+ const response = await fetch(abortUrl, {
504
+ method: "POST",
505
+ body: options.reason ?? "",
506
+ headers: {
507
+ Authorization: `Bearer ${token}`
508
+ }
509
+ });
510
+ if (!response.ok) {
511
+ throw new TaskAbortError(await response.text(), options.taskId);
512
+ }
513
+ }
514
+
515
+ // src/ackTask.ts
516
+ async function ackTask(options) {
517
+ const { apiBaseUrl, token } = getAccessToken(options.accessToken);
518
+ const response = await fetch(`${apiBaseUrl}/task/ack/${options.taskId}`, {
519
+ method: "POST",
520
+ headers: {
521
+ Authorization: `Bearer ${token}`
522
+ }
523
+ });
524
+ if (!response.ok) {
525
+ throw new Error(`Failed to acknowledge task delivery: ${await response.text()}`);
526
+ }
527
+ }
528
+
529
+ // src/protectTask.ts
530
+ class TaskProtectError extends Error {
531
+ taskId;
532
+ constructor(message, taskId) {
533
+ super(message);
534
+ this.taskId = taskId;
535
+ }
536
+ }
537
+ async function protectTask(options) {
538
+ const { apiBaseUrl, token } = getAccessToken(options.accessToken);
539
+ const protectUrl = `${apiBaseUrl}/task/protect/${options.taskId}`;
540
+ const response = await fetch(protectUrl, {
541
+ method: "POST",
542
+ headers: {
543
+ Authorization: `Bearer ${token}`
544
+ }
545
+ });
546
+ if (!response.ok) {
547
+ throw new TaskProtectError(await response.text(), options.taskId);
548
+ }
549
+ }
550
+
551
+ // src/types.ts
552
+ import { z as z5 } from "zod/v4";
553
+ var nodeInfoSchema = z5.object({
554
+ id: z5.uuid(),
555
+ type: z5.literal(["service", "logic", "or", "reference"]),
556
+ alias: z5.string().optional()
557
+ });
558
+ var baseUpdate = z5.object({
559
+ timestamp: z5.coerce.date(),
560
+ taskId: z5.uuid(),
561
+ name: z5.string(),
562
+ updateId: z5.uuid()
563
+ });
564
+ var taskStartUpdateSchema = baseUpdate.extend({
565
+ type: z5.literal("taskStart"),
566
+ input: z5.unknown(),
567
+ rootTaskId: z5.uuid().nullable().default(null)
568
+ });
569
+ var taskErrorUpdateSchema = baseUpdate.extend({
570
+ type: z5.literal("taskError"),
571
+ reason: z5.string().optional(),
572
+ requireAck: z5.boolean().optional()
573
+ });
574
+ var taskAbortUpdateSchema = baseUpdate.extend({
575
+ type: z5.literal("taskAborted"),
576
+ reason: z5.string().optional(),
577
+ requireAck: z5.boolean().optional()
578
+ });
579
+ var taskEndUpdateSchema = baseUpdate.extend({
580
+ type: z5.literal("taskEnd"),
581
+ result: z5.record(z5.string(), z5.any()),
582
+ exit: z5.string().nullable(),
583
+ requireAck: z5.boolean().optional()
584
+ });
585
+ var nodeStartUpdateSchema = baseUpdate.extend({
586
+ type: z5.literal("nodeStart"),
587
+ node: nodeInfoSchema
588
+ });
589
+ var nodeUpdateUpdateSchema = baseUpdate.extend({
590
+ type: z5.literal("nodeUpdate"),
591
+ node: nodeInfoSchema,
592
+ data: z5.unknown(),
593
+ output: z5.union([z5.null(), z5.string()])
594
+ });
595
+ var nodeErrorUpdateSchema = baseUpdate.extend({
596
+ type: z5.literal("nodeError"),
597
+ node: nodeInfoSchema,
598
+ error: z5.string()
599
+ });
600
+ var nodeDeferUpdateSchema = baseUpdate.extend({
601
+ type: z5.literal("nodeDefer"),
602
+ node: nodeInfoSchema,
603
+ reason: z5.string().optional()
604
+ });
605
+ var nodeEndUpdateSchema = baseUpdate.extend({
606
+ type: z5.literal("nodeEnd"),
607
+ node: nodeInfoSchema
608
+ });
609
+ var updateSchema = z5.discriminatedUnion("type", [
610
+ taskStartUpdateSchema,
611
+ taskErrorUpdateSchema,
612
+ taskAbortUpdateSchema,
613
+ taskEndUpdateSchema,
614
+ nodeStartUpdateSchema,
615
+ nodeUpdateUpdateSchema,
616
+ nodeErrorUpdateSchema,
617
+ nodeDeferUpdateSchema,
618
+ nodeEndUpdateSchema
619
+ ]);
620
+ var eventSchema = z5.object({ event: z5.string(), data: z5.string() }).transform((event) => ({ type: event.event, ...JSON.parse(event.data) })).pipe(updateSchema);
621
+ var prioritySchema = z5.int("priority has to be an integer").min(0, "min priority is 0").max(4, "max priority is 4").default(2).transform((value) => Math.round((4 - value) * 10 / 4));
622
+
623
+ // src/createTask.ts
624
+ class TaskPrepareError extends Error {
625
+ taskTemplate;
626
+ constructor(message, taskTemplate) {
627
+ super(message);
628
+ this.taskTemplate = taskTemplate;
629
+ }
630
+ }
631
+
632
+ class TaskError extends TaskPrepareError {
633
+ taskTemplate;
634
+ taskId;
635
+ constructor(message, taskTemplate, taskId) {
636
+ super(message, taskTemplate);
637
+ this.taskTemplate = taskTemplate;
638
+ this.taskId = taskId;
639
+ }
640
+ }
641
+ function createTask(options, onUpdate) {
642
+ const taskUpdateHandlers = new Set;
643
+ const priority = prioritySchema.parse(options.priority);
644
+ const { apiBaseUrl, token } = getAccessToken(options.accessToken);
645
+ const prepareUrl = `${apiBaseUrl}/task/prepare/${options.taskTemplate}`;
646
+ const payloadPromiseWithResolvers = Promise.withResolvers();
647
+ let isMonitoring = false;
648
+ const startMonitoring = async () => {
649
+ if (isMonitoring) {
650
+ return;
651
+ }
652
+ isMonitoring = true;
653
+ const payload = await payloadPromiseWithResolvers.promise;
654
+ if (!payload.urls) {
655
+ resultPromiseWithResolvers.resolve({
656
+ input: options.input,
657
+ taskId: payload.taskId,
658
+ taskUrl: "",
659
+ result: null,
660
+ getNodeData(_alias) {
661
+ return null;
662
+ },
663
+ getNodeError(_alias) {
664
+ return null;
665
+ }
666
+ });
667
+ return;
668
+ }
669
+ const taskStorage = { input: null, data: {}, errors: {}, result: null };
670
+ let since = null;
671
+ let lastPosition = null;
672
+ let lastResponse;
673
+ const customFetch = async (url, init) => {
674
+ const response = await fetch(url, init);
675
+ lastResponse = response;
676
+ return response;
677
+ };
678
+ const eventSource = createEventSource({
679
+ method: "POST",
680
+ fetch: customFetch,
681
+ url: payload.urls.watch,
682
+ headers: {
683
+ Authorization: `Bearer ${token}`,
684
+ "Content-Type": "application/json"
685
+ },
686
+ get body() {
687
+ return JSON.stringify({
688
+ since: since ? since.toISOString() : null,
689
+ lastPosition
690
+ });
691
+ },
692
+ onScheduleReconnect() {
693
+ if (lastPosition === null) {
694
+ since = new Date;
695
+ }
696
+ },
697
+ async onDisconnect() {
698
+ if (lastResponse.status === 200) {
699
+ eventSource.close();
700
+ }
701
+ },
702
+ onMessage({ id, event, data }) {
703
+ if (id) {
704
+ lastPosition = Number(id);
705
+ }
706
+ const updateResult = eventSchema.safeParse({ event, data });
707
+ if (!updateResult.success) {
708
+ eventSource.close();
709
+ resultPromiseWithResolvers.reject(new TaskError(`Invalid ${event} update received`, options.taskTemplate, payload.taskId));
710
+ return;
711
+ }
712
+ const update = updateResult.data;
713
+ switch (update.type) {
714
+ case "taskStart": {
715
+ taskStorage.input = resolveRequenceTypes(update.input, () => {
716
+ throw new Error("input may not have callbacks");
717
+ });
718
+ break;
719
+ }
720
+ case "nodeUpdate": {
721
+ if (update.node.alias) {
722
+ taskStorage.data[update.node.alias] = resolveRequenceTypes(update.data);
723
+ }
724
+ break;
725
+ }
726
+ case "nodeError": {
727
+ if (update.node.alias) {
728
+ taskStorage.errors[update.node.alias] = update.error;
729
+ }
730
+ break;
731
+ }
732
+ case "taskEnd": {
733
+ taskStorage.result = resolveRequenceTypes(update.result);
734
+ eventSource.close();
735
+ if (update.requireAck) {
736
+ ackTask({
737
+ taskId: payload.taskId,
738
+ accessToken: options.accessToken
739
+ }).catch(() => {});
740
+ }
741
+ break;
742
+ }
743
+ case "taskError":
744
+ case "taskAborted": {
745
+ eventSource.close();
746
+ if (update.requireAck) {
747
+ ackTask({
748
+ taskId: payload.taskId,
749
+ accessToken: options.accessToken
750
+ }).catch(() => {});
751
+ }
752
+ break;
753
+ }
754
+ }
755
+ const context = {
756
+ taskId: update.taskId,
757
+ input: taskStorage.input,
758
+ getNodeData(alias) {
759
+ return taskStorage.data[alias] ?? null;
760
+ },
761
+ getNodeError(alias) {
762
+ return taskStorage.errors[alias] ?? null;
763
+ },
764
+ result: taskStorage.result
765
+ };
766
+ const contextUpdate = {
767
+ ...update,
768
+ context
769
+ };
770
+ if (contextUpdate.type === "taskEnd") {
771
+ resultPromiseWithResolvers.resolve({
772
+ ...context,
773
+ taskUrl: payload.urls?.show ?? ""
774
+ });
775
+ }
776
+ if (contextUpdate.type === "taskError" || contextUpdate.type === "taskAborted") {
777
+ resultPromiseWithResolvers.reject(new TaskError(contextUpdate.reason ?? (contextUpdate.type === "taskError" ? "Task failed" : "Task aborted"), options.taskTemplate, payload.taskId));
778
+ }
779
+ taskUpdateHandlers.forEach((handler) => handler(contextUpdate));
780
+ }
781
+ });
782
+ };
783
+ const taskIdPromiseWithResolvers = Promise.withResolvers();
784
+ const taskUrlPromiseWithResolvers = Promise.withResolvers();
785
+ const resultPromiseWithResolvers = Promise.withResolvers();
786
+ const finalizedPromiseWithResolvers = Promise.withResolvers();
787
+ finalizedPromiseWithResolvers.promise.catch(() => {});
788
+ let rejectTaskIdPromise = false;
789
+ let rejectTaskUrlPromise = false;
790
+ (async () => {
791
+ const prepareResponse = await fetch(prepareUrl, {
792
+ method: "POST",
793
+ headers: {
794
+ Authorization: `Bearer ${token}`
795
+ }
796
+ });
797
+ if (!prepareResponse.ok) {
798
+ const error = new TaskPrepareError(await prepareResponse.text(), options.taskTemplate);
799
+ finalizedPromiseWithResolvers.reject(error);
800
+ if (rejectTaskIdPromise) {
801
+ taskIdPromiseWithResolvers.reject(error);
802
+ }
803
+ if (rejectTaskUrlPromise) {
804
+ taskUrlPromiseWithResolvers.reject(error);
805
+ }
806
+ if (isMonitoring) {
807
+ resultPromiseWithResolvers.reject(error);
808
+ }
809
+ return;
810
+ }
811
+ const prepareData = await prepareResponse.json();
812
+ if (prepareData.branch !== "live" && !options.suppressBranchWarning) {
813
+ console.warn(chalk.hex("#eab308")("task is executed in", chalk.bold(prepareData.branch), "branch"));
814
+ }
815
+ taskIdPromiseWithResolvers.resolve(prepareData.taskId);
816
+ const mappedParams = await mapOutput({
817
+ value: {
818
+ name: options.name,
819
+ input: options.input,
820
+ priority,
821
+ requireAck: options.requireAck ?? false
822
+ },
823
+ options: {
824
+ uploadUrl: prepareData.fileUrls?.uploadUrl,
825
+ streamUrl: prepareData.fileUrls?.streamUrl
826
+ }
827
+ });
828
+ const finalizeResponse = await fetch(prepareData.finalizeUrl, {
829
+ method: "POST",
830
+ body: JSON.stringify(mappedParams),
831
+ headers: {
832
+ Authorization: `Bearer ${token}`,
833
+ "Content-Type": "application/json"
834
+ }
835
+ });
836
+ if (!finalizeResponse.ok) {
837
+ const error = new TaskError(await finalizeResponse.text(), options.taskTemplate, prepareData.taskId);
838
+ finalizedPromiseWithResolvers.reject(error);
839
+ if (rejectTaskUrlPromise) {
840
+ taskUrlPromiseWithResolvers.reject(error);
841
+ }
842
+ if (isMonitoring) {
843
+ resultPromiseWithResolvers.reject(error);
844
+ }
845
+ return;
846
+ }
847
+ const payload = await finalizeResponse.json();
848
+ finalizedPromiseWithResolvers.resolve(prepareData.taskId);
849
+ taskUrlPromiseWithResolvers.resolve(payload.urls?.show ?? null);
850
+ payloadPromiseWithResolvers.resolve(payload);
851
+ if (onUpdate) {
852
+ taskUpdateHandlers.add(onUpdate);
853
+ startMonitoring();
854
+ }
855
+ })();
856
+ const asyncIterable = callbackToAsyncIterable((push, _fail, done) => {
857
+ const handleUpdate = (update) => {
858
+ push(update);
859
+ if (update.type === "taskEnd" || update.type === "taskError" || update.type === "taskAborted") {
860
+ done();
861
+ taskUpdateHandlers.delete(handleUpdate);
862
+ }
863
+ };
864
+ taskUpdateHandlers.add(handleUpdate);
865
+ startMonitoring();
866
+ return () => {
867
+ taskUpdateHandlers.delete(handleUpdate);
868
+ };
869
+ });
870
+ const methods = {
871
+ get catch() {
872
+ startMonitoring();
873
+ return resultPromiseWithResolvers.promise.catch.bind(resultPromiseWithResolvers.promise);
874
+ },
875
+ get finally() {
876
+ startMonitoring();
877
+ return resultPromiseWithResolvers.promise.finally.bind(resultPromiseWithResolvers.promise);
878
+ },
879
+ get then() {
880
+ startMonitoring();
881
+ return resultPromiseWithResolvers.promise.then.bind(resultPromiseWithResolvers.promise);
882
+ },
883
+ async getTaskId() {
884
+ rejectTaskIdPromise = true;
885
+ return taskIdPromiseWithResolvers.promise;
886
+ },
887
+ async getTaskUrl() {
888
+ rejectTaskUrlPromise = true;
889
+ return taskUrlPromiseWithResolvers.promise;
890
+ },
891
+ async abort(reason) {
892
+ const taskId = await taskIdPromiseWithResolvers.promise;
893
+ await abortTask({
894
+ taskId,
895
+ accessToken: options.accessToken,
896
+ reason
897
+ });
898
+ },
899
+ async protect() {
900
+ const taskId = await taskIdPromiseWithResolvers.promise;
901
+ await protectTask({
902
+ taskId,
903
+ accessToken: options.accessToken
904
+ });
905
+ },
906
+ async finalized() {
907
+ return finalizedPromiseWithResolvers.promise;
908
+ }
909
+ };
910
+ return Object.defineProperties(asyncIterable, Object.getOwnPropertyDescriptors(methods));
911
+ }
912
+ // src/watchTasks.ts
913
+ import { createEventSource as createEventSource2 } from "eventsource-client";
914
+ function watchTasks(options) {
915
+ const { apiBaseUrl, token } = getAccessToken(options.accessToken);
916
+ const taskUpdateHandlers = new Set;
917
+ if (options.onUpdate) {
918
+ taskUpdateHandlers.add(options.onUpdate);
919
+ }
920
+ const taskStorage = new Map;
921
+ let startDate = options.since;
922
+ let lastPosition = null;
923
+ let lastResponse;
924
+ const customFetch = async (url, init) => {
925
+ const response = await fetch(url, init);
926
+ lastResponse = response;
927
+ return response;
928
+ };
929
+ const eventSource = createEventSource2({
930
+ url: new URL(`${apiBaseUrl}/task/watch-all`),
931
+ fetch: customFetch,
932
+ headers: {
933
+ Authorization: `Bearer ${token}`,
934
+ "Content-Type": "application/json"
935
+ },
936
+ get body() {
937
+ return JSON.stringify({
938
+ since: startDate.toISOString(),
939
+ lastPosition,
940
+ filter: options.filter
941
+ });
942
+ },
943
+ method: "POST",
944
+ onScheduleReconnect() {
945
+ if (lastPosition === null) {
946
+ startDate = new Date;
947
+ }
948
+ options.onReconnecting?.();
949
+ },
950
+ onConnect() {
951
+ options.onConnect?.();
952
+ },
953
+ async onDisconnect() {
954
+ if (lastResponse) {
955
+ options.onError?.(lastResponse.status, lastResponse.statusText);
956
+ }
957
+ },
958
+ onMessage({ id, event, data }) {
959
+ if (id) {
960
+ lastPosition = Number(id);
961
+ }
962
+ const updateResult = eventSchema.safeParse({ event, data });
963
+ if (!updateResult.success) {
964
+ eventSource.close();
965
+ throw new Error("invalid update");
966
+ }
967
+ const update = updateResult.data;
968
+ if (!taskStorage.has(update.taskId)) {
969
+ taskStorage.set(update.taskId, {
970
+ input: null,
971
+ data: {},
972
+ errors: {},
973
+ result: null,
974
+ incomplete: true,
975
+ rootTaskId: null
976
+ });
977
+ }
978
+ const storageEntry = taskStorage.get(update.taskId);
979
+ switch (update.type) {
980
+ case "taskStart": {
981
+ storageEntry.input = resolveRequenceTypes(update.input, () => {
982
+ throw new Error("input may not have callbacks");
983
+ });
984
+ storageEntry.incomplete = false;
985
+ storageEntry.rootTaskId = update.rootTaskId;
986
+ break;
987
+ }
988
+ case "nodeUpdate": {
989
+ if (update.node.alias) {
990
+ storageEntry.data[update.node.alias] = resolveRequenceTypes(update.data);
991
+ }
992
+ break;
993
+ }
994
+ case "nodeError": {
995
+ if (update.node.alias) {
996
+ storageEntry.errors[update.node.alias] = update.error;
997
+ }
998
+ break;
999
+ }
1000
+ case "taskEnd": {
1001
+ storageEntry.result = resolveRequenceTypes(update.result);
1002
+ taskStorage.delete(update.taskId);
1003
+ if (update.requireAck) {
1004
+ ackTask({
1005
+ taskId: update.taskId,
1006
+ accessToken: options.accessToken
1007
+ }).catch(() => {});
1008
+ }
1009
+ break;
1010
+ }
1011
+ case "taskError":
1012
+ case "taskAborted": {
1013
+ taskStorage.delete(update.taskId);
1014
+ if (update.requireAck) {
1015
+ ackTask({
1016
+ taskId: update.taskId,
1017
+ accessToken: options.accessToken
1018
+ }).catch(() => {});
1019
+ }
1020
+ break;
1021
+ }
1022
+ }
1023
+ const context = {
1024
+ taskId: update.taskId,
1025
+ input: storageEntry.input,
1026
+ getNodeData(alias) {
1027
+ return storageEntry.data[alias] ?? null;
1028
+ },
1029
+ getNodeError(alias) {
1030
+ return storageEntry.errors[alias] ?? null;
1031
+ },
1032
+ result: storageEntry.result
1033
+ };
1034
+ const contextUpdate = {
1035
+ ...update,
1036
+ context,
1037
+ updateId: id,
1038
+ incomplete: storageEntry.incomplete,
1039
+ rootTaskId: storageEntry.rootTaskId
1040
+ };
1041
+ taskUpdateHandlers.forEach((handler) => handler(contextUpdate));
1042
+ }
1043
+ });
1044
+ const asyncIterable = callbackToAsyncIterable((push) => {
1045
+ taskUpdateHandlers.add(push);
1046
+ return () => {
1047
+ taskUpdateHandlers.delete(push);
1048
+ };
1049
+ });
1050
+ const stopWatching = () => {
1051
+ eventSource.close();
1052
+ };
1053
+ return Object.assign(stopWatching, asyncIterable);
1054
+ }
1055
+ // src/getTask.ts
1056
+ import { z as z6 } from "zod/v4";
1057
+ var taskSchema = z6.object({
1058
+ status: z6.literal([
1059
+ "SUCCESSFUL",
1060
+ "FAILED",
1061
+ "IDLE",
1062
+ "PENDING",
1063
+ "RUNNING",
1064
+ "STOPPED",
1065
+ "AWAITING_DELIVERY"
1066
+ ]),
1067
+ statusText: z6.string().nullable(),
1068
+ input: z6.unknown(),
1069
+ result: z6.unknown(),
1070
+ taskTemplate: z6.string(),
1071
+ name: z6.string(),
1072
+ nodesData: z6.array(z6.object({ alias: z6.string(), data: z6.unknown() })),
1073
+ nodesError: z6.array(z6.object({ alias: z6.string(), error: z6.string() })),
1074
+ branch: z6.union([z6.literal("live"), z6.string()])
1075
+ });
1076
+ async function getTask(taskIdOrOptions) {
1077
+ const taskId = typeof taskIdOrOptions === "string" ? taskIdOrOptions : taskIdOrOptions.taskId;
1078
+ const { apiBaseUrl, token } = getAccessToken(typeof taskIdOrOptions === "string" ? undefined : taskIdOrOptions.accessToken);
1079
+ const response = await fetch(new URL(`${apiBaseUrl}/task/${taskId}`), {
1080
+ headers: {
1081
+ Authorization: `Bearer ${token}`
1082
+ }
1083
+ });
1084
+ if (!response.ok) {
1085
+ throw new Error("Task not found");
1086
+ }
1087
+ const taskData = taskSchema.parse(await response.json());
1088
+ const context = {
1089
+ taskId,
1090
+ input: resolveRequenceTypes(taskData.input, () => {
1091
+ throw new Error("input may not have callbacks");
1092
+ }),
1093
+ getNodeData(alias) {
1094
+ return resolveRequenceTypes(taskData.nodesData.find((d) => d.alias === alias)?.data);
1095
+ },
1096
+ getNodeError(alias) {
1097
+ return taskData.nodesError.find((d) => d.alias === alias)?.error ?? null;
1098
+ },
1099
+ result: resolveRequenceTypes(taskData.result)
1100
+ };
1101
+ return {
1102
+ status: taskData.status,
1103
+ statusText: taskData.statusText,
1104
+ taskTemplate: taskData.taskTemplate,
1105
+ name: taskData.name,
1106
+ branch: taskData.branch,
1107
+ context
1108
+ };
1109
+ }
1110
+ // src/recreateTask.ts
1111
+ async function recreateTask(options, onUpdate) {
1112
+ const task = await getTask(options.taskId);
1113
+ return createTask({
1114
+ taskTemplate: task.taskTemplate,
1115
+ accessToken: options.accessToken,
1116
+ name: options.name ?? task.name,
1117
+ priority: options.priority,
1118
+ input: task.context.input
1119
+ }, onUpdate);
1120
+ }
1121
+ export {
1122
+ watchTasks,
1123
+ recreateTask,
1124
+ protectTask,
1125
+ getTask,
1126
+ createTask,
1127
+ abortTask,
1128
+ TaskError,
1129
+ RequenceStream,
1130
+ RequenceFile
1131
+ };
1132
+
1133
+ //# debugId=72085AB5595C0E1D64756E2164756E21
1134
+ //# sourceMappingURL=index.js.map