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