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