@requence/service 1.0.0-alpha.3 → 1.0.0-alpha.30
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 +163 -0
- package/build/{chunk-0x9092n4.js → chunk-6w7td62p.js} +5 -44
- package/build/chunk-6w7td62p.js.map +10 -0
- package/build/cli.js +14 -9
- package/build/cli.js.map +3 -3
- package/build/index.js +801 -792
- package/build/index.js.map +17 -16
- 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 +10 -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 +12 -0
- package/build/types/helpers/src/jsonschema/types.d.ts.map +1 -0
- package/build/types/helpers/src/jsonschema/validate.d.ts +29 -0
- package/build/types/helpers/src/jsonschema/validate.d.ts.map +1 -0
- package/build/types/helpers/src/jsonschema/zod.d.ts +12 -0
- package/build/types/helpers/src/jsonschema/zod.d.ts.map +1 -0
- package/build/types/helpers/src/protocol/NodeTree.d.ts +441 -0
- package/build/types/helpers/src/protocol/NodeTree.d.ts.map +1 -0
- package/build/types/helpers/src/protocol/command.d.ts +420 -0
- package/build/types/helpers/src/protocol/command.d.ts.map +1 -0
- package/build/types/helpers/src/protocol/helpers.d.ts +5 -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 +283 -0
- package/build/types/helpers/src/protocol/nodeType.d.ts.map +1 -0
- package/build/types/helpers/src/protocol/targetNodes.d.ts +253 -0
- package/build/types/helpers/src/protocol/targetNodes.d.ts.map +1 -0
- package/build/types/helpers/src/protocol/taskOptions.d.ts +17 -0
- package/build/types/helpers/src/protocol/taskOptions.d.ts.map +1 -0
- package/build/types/helpers/src/protocol/treeNodes.d.ts +606 -0
- package/build/types/helpers/src/protocol/treeNodes.d.ts.map +1 -0
- package/build/types/helpers/src/protocol/update.d.ts +354 -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/service/src/createAmqpConnection.d.ts +19 -20
- package/build/types/service/src/createAmqpConnection.d.ts.map +1 -1
- package/build/types/service/src/helpers.d.ts +56 -100
- package/build/types/service/src/helpers.d.ts.map +1 -1
- package/build/types/service/src/index.d.ts +8 -5
- package/build/types/service/src/index.d.ts.map +1 -1
- package/build/types/service/src/macro.d.ts +2 -0
- package/build/types/service/src/macro.d.ts.map +1 -0
- package/build/types/service/src/mapInput.d.ts +2 -0
- package/build/types/service/src/mapInput.d.ts.map +1 -0
- package/package.json +7 -8
- package/build/chunk-0x9092n4.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/helpers/src/{obfuscate.d.ts → utils/obfuscate.d.ts} +0 -0
package/build/index.js
CHANGED
|
@@ -1,675 +1,446 @@
|
|
|
1
1
|
import {
|
|
2
|
-
clone,
|
|
3
|
-
createObjectProxy,
|
|
4
2
|
deobfuscate,
|
|
5
3
|
obfuscate
|
|
6
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6w7td62p.js";
|
|
7
5
|
|
|
8
6
|
// src/index.ts
|
|
9
|
-
import
|
|
10
|
-
import { z as z8 } from "zod";
|
|
7
|
+
import fs from "node:fs";
|
|
11
8
|
|
|
12
|
-
// ../helpers/src/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return contextHelper[internalKey];
|
|
28
|
-
}
|
|
29
|
-
function createContextHelper(context, nodes) {
|
|
30
|
-
const results = new Map(nodes.map((node) => [
|
|
31
|
-
node.id,
|
|
32
|
-
{
|
|
33
|
-
node,
|
|
34
|
-
executionDate: node.id in context.dates ? new Date(context.dates[node.id]) : null,
|
|
35
|
-
data: context.data[node.id] ?? null,
|
|
36
|
-
error: context.errors[node.id] ?? null
|
|
37
|
-
}
|
|
38
|
-
]));
|
|
39
|
-
const lookUpMap = new Map;
|
|
40
|
-
for (const node of nodes) {
|
|
41
|
-
const alias = typeof node.meta?.mapAlias === "string" ? node.meta.mapAlias : ("alias" in node) && node.alias;
|
|
42
|
-
if (alias) {
|
|
43
|
-
if (lookUpMap.has(alias)) {
|
|
44
|
-
lookUpMap.get(alias).push(node.id);
|
|
45
|
-
} else {
|
|
46
|
-
lookUpMap.set(alias, [node.id]);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
const name = typeof node.meta?.mapName === "string" ? node.meta.mapName : node.type === "service" && node.name;
|
|
50
|
-
if (name) {
|
|
51
|
-
if (lookUpMap.has(name)) {
|
|
52
|
-
lookUpMap.get(name).push(node.id);
|
|
53
|
-
} else {
|
|
54
|
-
lookUpMap.set(name, [node.id]);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
[internalKey]: {
|
|
60
|
-
results
|
|
61
|
-
},
|
|
62
|
-
getInput() {
|
|
63
|
-
return context.input;
|
|
64
|
-
},
|
|
65
|
-
getMeta() {
|
|
66
|
-
return context.meta;
|
|
67
|
-
},
|
|
68
|
-
getData(alias) {
|
|
69
|
-
if (alias) {
|
|
70
|
-
const nodeIds = lookUpMap.get(alias);
|
|
71
|
-
if (!nodeIds) {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
const combinedData = nodeIds.map((nodeId) => results.get(nodeId)?.data).filter(Boolean);
|
|
75
|
-
if (combinedData.length === 0) {
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
if (combinedData.length === 1) {
|
|
79
|
-
return combinedData[0];
|
|
80
|
-
}
|
|
81
|
-
if (combinedData.every(isRecord)) {
|
|
82
|
-
return combinedData.reduce((acc, data) => ({ ...acc, ...data }), {});
|
|
9
|
+
// ../helpers/src/utils/createRemotePromise.ts
|
|
10
|
+
function createRemotePromise(onAwait) {
|
|
11
|
+
let resolvePromise;
|
|
12
|
+
let rejectPromise;
|
|
13
|
+
const internalPromise = new Promise((resolve, reject) => {
|
|
14
|
+
resolvePromise = resolve;
|
|
15
|
+
rejectPromise = reject;
|
|
16
|
+
});
|
|
17
|
+
let isAwaited = false;
|
|
18
|
+
const wrappedPromise = new Proxy(internalPromise, {
|
|
19
|
+
get(target, property) {
|
|
20
|
+
if (property === "then" || property === "catch" || property === "finally") {
|
|
21
|
+
if (!isAwaited && onAwait) {
|
|
22
|
+
isAwaited = true;
|
|
23
|
+
onAwait(resolvePromise, rejectPromise);
|
|
83
24
|
}
|
|
84
|
-
return
|
|
85
|
-
}
|
|
86
|
-
return Array.from(results.values()).filter((result) => result.executionDate && isRecord(result.data)).toSorted((a, b) => a.executionDate.getTime() - b.executionDate.getTime()).reduce((acc, result) => ({
|
|
87
|
-
...acc,
|
|
88
|
-
...result.data
|
|
89
|
-
}), isRecord(context.input) ? { ...context.input } : {});
|
|
90
|
-
},
|
|
91
|
-
getError(alias) {
|
|
92
|
-
const nodeIds = lookUpMap.get(alias);
|
|
93
|
-
if (!nodeIds) {
|
|
94
|
-
return null;
|
|
25
|
+
return target[property].bind(target);
|
|
95
26
|
}
|
|
96
|
-
return
|
|
97
|
-
`);
|
|
27
|
+
return target[property];
|
|
98
28
|
}
|
|
99
|
-
};
|
|
29
|
+
});
|
|
30
|
+
return Object.assign(wrappedPromise, {
|
|
31
|
+
resolve: resolvePromise,
|
|
32
|
+
reject: rejectPromise,
|
|
33
|
+
promise: wrappedPromise
|
|
34
|
+
});
|
|
100
35
|
}
|
|
101
|
-
// ../helpers/src/protocol/command.ts
|
|
102
|
-
import { z as z5 } from "zod";
|
|
103
36
|
|
|
104
|
-
// ../helpers/src/
|
|
105
|
-
import {
|
|
37
|
+
// ../helpers/src/utils/isRecord.ts
|
|
38
|
+
import { z } from "zod/v4";
|
|
39
|
+
var recordSchema = z.record(z.string(), z.unknown());
|
|
40
|
+
function isRecord(data) {
|
|
41
|
+
return recordSchema.safeParse(data).success;
|
|
42
|
+
}
|
|
106
43
|
|
|
107
|
-
// ../helpers/src/
|
|
108
|
-
function
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
for (const output of outputs) {
|
|
112
|
-
if (output.exit) {
|
|
113
|
-
outputTargets.add("__exit__");
|
|
114
|
-
} else {
|
|
115
|
-
outputTargets.add(output.target);
|
|
116
|
-
}
|
|
44
|
+
// ../helpers/src/utils/mapData.ts
|
|
45
|
+
function resolve(value, onResolve) {
|
|
46
|
+
if (value instanceof Promise) {
|
|
47
|
+
return Promise.resolve().then(() => value).then(onResolve);
|
|
117
48
|
}
|
|
118
|
-
return
|
|
49
|
+
return onResolve(value);
|
|
50
|
+
}
|
|
51
|
+
function notUndefined(value, fallback) {
|
|
52
|
+
return resolve(value, (resolvedValue) => typeof resolvedValue === "undefined" ? fallback : resolvedValue);
|
|
119
53
|
}
|
|
120
54
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
for (const node of nodes) {
|
|
129
|
-
nodesByIdMap.set(node.id, node);
|
|
130
|
-
if ("alias" in node && node.alias) {
|
|
131
|
-
nodesByNameOrAlias.set(node.alias, node);
|
|
132
|
-
}
|
|
133
|
-
if ("name" in node && node.name) {
|
|
134
|
-
nodesByNameOrAlias.set(node.name, node);
|
|
55
|
+
class AbortMapData extends Error {
|
|
56
|
+
}
|
|
57
|
+
function mapData(data, visitors) {
|
|
58
|
+
let aborted = false;
|
|
59
|
+
const traverseData = (data2, path) => {
|
|
60
|
+
if (aborted) {
|
|
61
|
+
return data2;
|
|
135
62
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
63
|
+
try {
|
|
64
|
+
if (Array.isArray(data2)) {
|
|
65
|
+
return resolve(visitors.Array?.(data2, path), (resolvedData) => {
|
|
66
|
+
if (resolvedData) {
|
|
67
|
+
return resolvedData;
|
|
68
|
+
}
|
|
69
|
+
const items = data2.map((item, index) => traverseData(item, [...path, index]));
|
|
70
|
+
if (items.some((item) => item instanceof Promise)) {
|
|
71
|
+
return Promise.all(items);
|
|
72
|
+
}
|
|
73
|
+
return items;
|
|
74
|
+
});
|
|
141
75
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
return {
|
|
146
|
-
getInputs(node) {
|
|
147
|
-
if (typeof node === "string") {
|
|
148
|
-
return inputsNodeMap.get(node) ?? [];
|
|
76
|
+
if (data2 === null) {
|
|
77
|
+
return notUndefined(visitors.Null?.(data2, path), data2);
|
|
149
78
|
}
|
|
150
|
-
if (
|
|
151
|
-
return
|
|
79
|
+
if (typeof Buffer !== "undefined" && Buffer.isBuffer(data2)) {
|
|
80
|
+
return notUndefined(visitors.Buffer?.(data2, path), data2);
|
|
152
81
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
82
|
+
if (typeof data2 === "string") {
|
|
83
|
+
return notUndefined(visitors.String?.(data2, path), data2);
|
|
84
|
+
}
|
|
85
|
+
if (typeof data2 === "number") {
|
|
86
|
+
return notUndefined(visitors.Number?.(data2, path), data2);
|
|
87
|
+
}
|
|
88
|
+
if (typeof data2 === "symbol") {
|
|
89
|
+
return notUndefined(visitors.Symbol?.(data2, path), data2);
|
|
90
|
+
}
|
|
91
|
+
if (typeof data2 === "function") {
|
|
92
|
+
return notUndefined(visitors.Function?.(data2, path), data2);
|
|
93
|
+
}
|
|
94
|
+
if (isRecord(data2)) {
|
|
95
|
+
return resolve(visitors.Object?.(structuredClone(data2), path), (resolvedData) => {
|
|
96
|
+
const nextData = resolvedData ?? data2;
|
|
97
|
+
if (!isRecord(nextData)) {
|
|
98
|
+
return nextData;
|
|
99
|
+
}
|
|
100
|
+
const entries = Object.entries(nextData).map(([key, value]) => [
|
|
101
|
+
key,
|
|
102
|
+
traverseData(value, [...path, key])
|
|
103
|
+
]);
|
|
104
|
+
if (entries.some(([, value]) => value instanceof Promise)) {
|
|
105
|
+
return Promise.all(entries.map(([key, value]) => Promise.resolve().then(() => value).then((resolvedValue) => [key, resolvedValue]))).then((entries2) => Object.fromEntries(entries2));
|
|
106
|
+
}
|
|
107
|
+
return Object.fromEntries(entries);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (typeof data2 === "object" && data2) {
|
|
111
|
+
return notUndefined(visitors.Object?.(data2, path), data2);
|
|
112
|
+
}
|
|
113
|
+
return data2;
|
|
114
|
+
} catch (error) {
|
|
115
|
+
if (error instanceof AbortMapData) {
|
|
116
|
+
aborted = true;
|
|
117
|
+
return data2;
|
|
118
|
+
}
|
|
119
|
+
throw error;
|
|
160
120
|
}
|
|
161
121
|
};
|
|
122
|
+
return traverseData(data, []);
|
|
162
123
|
}
|
|
124
|
+
mapData.abort = () => {
|
|
125
|
+
throw new AbortMapData;
|
|
126
|
+
};
|
|
163
127
|
|
|
164
|
-
// ../helpers/src/
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
128
|
+
// ../helpers/src/utils/requenceCallback.ts
|
|
129
|
+
import { z as z2 } from "zod/v4";
|
|
130
|
+
var callbackObjectSchema = z2.object({
|
|
131
|
+
sourceId: z2.string(),
|
|
132
|
+
outputName: z2.string().nullable(),
|
|
133
|
+
propertyPath: z2.array(z2.union([z2.string(), z2.int()])),
|
|
134
|
+
callbackId: z2.uuid(),
|
|
135
|
+
__REQUENCE_type: z2.literal("RequenceCallback")
|
|
136
|
+
});
|
|
137
|
+
function isCallbackObject(data) {
|
|
138
|
+
return callbackObjectSchema.safeParse(data).success;
|
|
139
|
+
}
|
|
140
|
+
function createCallback(callback) {
|
|
141
|
+
let resolvePromise;
|
|
142
|
+
const promise = new Promise((resolve2) => {
|
|
143
|
+
resolvePromise = resolve2;
|
|
144
|
+
});
|
|
145
|
+
const executor = (arg) => {
|
|
146
|
+
resolvePromise(arg);
|
|
147
|
+
callback?.(arg);
|
|
148
|
+
};
|
|
149
|
+
return Object.assign(executor, {
|
|
150
|
+
response() {
|
|
151
|
+
return promise;
|
|
174
152
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
153
|
+
});
|
|
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");
|
|
180
178
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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;
|
|
207
|
+
}
|
|
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
|
+
}
|
|
186
227
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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;
|
|
191
254
|
}
|
|
192
|
-
usedSet.add(inputNodeId);
|
|
193
255
|
}
|
|
194
|
-
followPath(inputNodeId, usedSet);
|
|
195
256
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
};
|
|
200
|
-
const set = new Set(["__exit__"]);
|
|
201
|
-
sets.add(set);
|
|
202
|
-
followPath("__exit__", set);
|
|
203
|
-
return Array.from(sets, (set2) => Array.from(set2).toReversed());
|
|
257
|
+
});
|
|
258
|
+
Promise.allSettled(streamPromises).then(() => params.onDone?.());
|
|
259
|
+
return mapped;
|
|
204
260
|
}
|
|
205
261
|
|
|
206
|
-
// ../helpers/src/
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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);
|
|
210
268
|
}
|
|
211
|
-
|
|
212
|
-
|
|
269
|
+
static fromFileObject(file) {
|
|
270
|
+
const instance = new this([], { type: "x/x" });
|
|
271
|
+
instance.#file = file;
|
|
272
|
+
return instance;
|
|
213
273
|
}
|
|
214
|
-
|
|
215
|
-
return
|
|
274
|
+
get fileObject() {
|
|
275
|
+
return this.#file;
|
|
216
276
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return `Unknown[${nodeId}]`;
|
|
277
|
+
get size() {
|
|
278
|
+
return this.#file?.size ?? this.#data.size;
|
|
220
279
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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());
|
|
227
292
|
}
|
|
228
|
-
|
|
229
|
-
|
|
293
|
+
return this.#data.text();
|
|
294
|
+
}
|
|
295
|
+
async json() {
|
|
296
|
+
if (this.#file) {
|
|
297
|
+
return fetch(this.#file.url).then((response) => response.json());
|
|
230
298
|
}
|
|
231
|
-
|
|
232
|
-
|
|
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());
|
|
233
304
|
}
|
|
234
|
-
|
|
235
|
-
|
|
305
|
+
return this.#data;
|
|
306
|
+
}
|
|
307
|
+
async arrayBuffer() {
|
|
308
|
+
if (this.#file) {
|
|
309
|
+
return fetch(this.#file.url).then((response) => response.arrayBuffer());
|
|
236
310
|
}
|
|
311
|
+
return this.#data.arrayBuffer();
|
|
237
312
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
// ../helpers/src/protocol/node.ts
|
|
241
|
-
import { z as z3 } from "zod";
|
|
242
|
-
|
|
243
|
-
// ../helpers/src/protocol/jsonSchema.ts
|
|
244
|
-
import { z as z2 } from "zod";
|
|
245
|
-
var jsonSchema7Schema = z2.lazy(() => z2.object({
|
|
246
|
-
$id: z2.string().optional(),
|
|
247
|
-
$schema: z2.string().optional(),
|
|
248
|
-
$ref: z2.string().optional(),
|
|
249
|
-
title: z2.string().optional(),
|
|
250
|
-
description: z2.string().optional(),
|
|
251
|
-
type: z2.union([
|
|
252
|
-
z2.literal("string"),
|
|
253
|
-
z2.literal("number"),
|
|
254
|
-
z2.literal("integer"),
|
|
255
|
-
z2.literal("boolean"),
|
|
256
|
-
z2.literal("object"),
|
|
257
|
-
z2.literal("array"),
|
|
258
|
-
z2.literal("null")
|
|
259
|
-
]).optional(),
|
|
260
|
-
enum: z2.array(z2.union([z2.string(), z2.number(), z2.boolean(), z2.null()])).optional(),
|
|
261
|
-
const: z2.union([z2.string(), z2.number(), z2.boolean(), z2.null()]).optional(),
|
|
262
|
-
multipleOf: z2.number().positive().optional(),
|
|
263
|
-
maximum: z2.number().optional(),
|
|
264
|
-
exclusiveMaximum: z2.number().optional(),
|
|
265
|
-
minimum: z2.number().optional(),
|
|
266
|
-
exclusiveMinimum: z2.number().optional(),
|
|
267
|
-
maxLength: z2.number().int().nonnegative().optional(),
|
|
268
|
-
minLength: z2.number().int().nonnegative().optional(),
|
|
269
|
-
pattern: z2.string().optional(),
|
|
270
|
-
additionalItems: z2.boolean().optional(),
|
|
271
|
-
items: z2.union([z2.lazy(() => jsonSchema7Schema), z2.array(jsonSchema7Schema)]).optional(),
|
|
272
|
-
maxItems: z2.number().int().nonnegative().optional(),
|
|
273
|
-
minItems: z2.number().int().nonnegative().optional(),
|
|
274
|
-
uniqueItems: z2.boolean().optional(),
|
|
275
|
-
contains: z2.lazy(() => jsonSchema7Schema).optional(),
|
|
276
|
-
maxProperties: z2.number().int().nonnegative().optional(),
|
|
277
|
-
minProperties: z2.number().int().nonnegative().optional(),
|
|
278
|
-
required: z2.array(z2.string()).optional(),
|
|
279
|
-
properties: z2.record(jsonSchema7Schema).optional(),
|
|
280
|
-
patternProperties: z2.record(jsonSchema7Schema).optional(),
|
|
281
|
-
additionalProperties: z2.union([z2.boolean(), z2.lazy(() => jsonSchema7Schema)]).optional(),
|
|
282
|
-
dependencies: z2.record(z2.union([z2.array(z2.string()), jsonSchema7Schema])).optional(),
|
|
283
|
-
propertyNames: z2.lazy(() => jsonSchema7Schema).optional(),
|
|
284
|
-
if: z2.lazy(() => jsonSchema7Schema).optional(),
|
|
285
|
-
then: z2.lazy(() => jsonSchema7Schema).optional(),
|
|
286
|
-
else: z2.lazy(() => jsonSchema7Schema).optional(),
|
|
287
|
-
allOf: z2.array(jsonSchema7Schema).optional(),
|
|
288
|
-
anyOf: z2.array(jsonSchema7Schema).optional(),
|
|
289
|
-
oneOf: z2.array(jsonSchema7Schema).optional(),
|
|
290
|
-
not: z2.lazy(() => jsonSchema7Schema).optional(),
|
|
291
|
-
definitions: z2.record(jsonSchema7Schema).optional(),
|
|
292
|
-
format: z2.string().optional(),
|
|
293
|
-
contentMediaType: z2.string().optional(),
|
|
294
|
-
contentEncoding: z2.string().optional()
|
|
295
|
-
}));
|
|
296
|
-
var jsonSchema7ObjectSchema = z2.object({
|
|
297
|
-
type: z2.literal("object"),
|
|
298
|
-
properties: z2.record(jsonSchema7Schema),
|
|
299
|
-
required: z2.array(z2.string()).optional(),
|
|
300
|
-
description: z2.string().optional(),
|
|
301
|
-
maxProperties: z2.number().int().nonnegative().optional(),
|
|
302
|
-
minProperties: z2.number().int().nonnegative().optional(),
|
|
303
|
-
additionalProperties: z2.boolean().optional()
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
// ../helpers/src/protocol/node.ts
|
|
307
|
-
var outputDefinitionSchema = z3.object({
|
|
308
|
-
schema: jsonSchema7Schema.nullable().optional()
|
|
309
|
-
}).and(z3.union([
|
|
310
|
-
z3.object({
|
|
311
|
-
default: z3.literal(false).default(false),
|
|
312
|
-
name: z3.string().min(1)
|
|
313
|
-
}),
|
|
314
|
-
z3.object({
|
|
315
|
-
default: z3.literal(true).default(true)
|
|
316
|
-
})
|
|
317
|
-
])).and(z3.union([
|
|
318
|
-
z3.object({
|
|
319
|
-
exit: z3.literal(false).default(false),
|
|
320
|
-
target: z3.string().min(1)
|
|
321
|
-
}),
|
|
322
|
-
z3.object({ exit: z3.literal(true) })
|
|
323
|
-
]));
|
|
324
|
-
var defaultOutputSchema = z3.union([
|
|
325
|
-
z3.string().min(1),
|
|
326
|
-
z3.object({ default: z3.literal(true).default(true), exit: z3.literal(true) }),
|
|
327
|
-
z3.object({
|
|
328
|
-
default: z3.literal(true).default(true),
|
|
329
|
-
exit: z3.literal(false).default(false),
|
|
330
|
-
target: z3.string().min(1)
|
|
331
|
-
})
|
|
332
|
-
]).transform((output) => {
|
|
333
|
-
if (typeof output === "string") {
|
|
334
|
-
return {
|
|
335
|
-
default: true,
|
|
336
|
-
exit: false,
|
|
337
|
-
target: output
|
|
338
|
-
};
|
|
313
|
+
toString() {
|
|
314
|
+
return `RequenceFile<${this.mimeType}>`;
|
|
339
315
|
}
|
|
340
|
-
|
|
341
|
-
}
|
|
342
|
-
var outputSchema = z3.union([z3.string().min(1), outputDefinitionSchema]).transform((output) => {
|
|
343
|
-
if (typeof output === "string") {
|
|
344
|
-
return {
|
|
345
|
-
default: true,
|
|
346
|
-
exit: false,
|
|
347
|
-
target: output
|
|
348
|
-
};
|
|
316
|
+
toJSON() {
|
|
317
|
+
return `RequenceFile<${this.mimeType}>`;
|
|
349
318
|
}
|
|
350
|
-
return output;
|
|
351
|
-
});
|
|
352
|
-
function validateOutputs(outputs, ctx) {
|
|
353
|
-
const exitOutputs = new Set(outputs.filter((output) => output.exit).map((output) => output.default ? "__default__" : output.name));
|
|
354
|
-
outputs.filter((output) => !output.exit).forEach((output) => {
|
|
355
|
-
const name = output.default ? "__default__" : output.name;
|
|
356
|
-
if (exitOutputs.has(name)) {
|
|
357
|
-
ctx.addIssue({
|
|
358
|
-
code: "custom",
|
|
359
|
-
message: output.default ? `default exit output cannot be mixed with target output "${output.target}"` : `named exit output "${name}" cannot be mixed with target output "${output.target}"`
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
const targets = new Map;
|
|
364
|
-
outputs.forEach((output) => {
|
|
365
|
-
const name = output.default ? "__default__" : output.name;
|
|
366
|
-
const target = output.exit ? "__exit__" : output.target;
|
|
367
|
-
if (!targets.has(name)) {
|
|
368
|
-
targets.set(name, new Set);
|
|
369
|
-
}
|
|
370
|
-
const knownTargets = targets.get(name);
|
|
371
|
-
if (knownTargets.has(target)) {
|
|
372
|
-
ctx.addIssue({
|
|
373
|
-
code: "custom",
|
|
374
|
-
message: [
|
|
375
|
-
output.default ? "duplicate default output" : `duplicate named output "${name}"`,
|
|
376
|
-
output.exit ? "for exit" : `for target "${target}"`
|
|
377
|
-
].join(" ")
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
knownTargets.add(target);
|
|
381
|
-
});
|
|
382
319
|
}
|
|
383
|
-
var defaultOutputsSchema = z3.array(defaultOutputSchema).default([]).superRefine(validateOutputs);
|
|
384
|
-
var outputsSchema = z3.array(outputSchema).default([]).superRefine(validateOutputs);
|
|
385
|
-
var idSchema = z3.string().uuid().default(() => crypto.randomUUID());
|
|
386
|
-
var metaSchema = z3.record(z3.any()).optional();
|
|
387
|
-
var entryNodeSchema = z3.object({
|
|
388
|
-
type: z3.literal("entry"),
|
|
389
|
-
id: z3.literal("__entry__").default("__entry__"),
|
|
390
|
-
output: defaultOutputsSchema,
|
|
391
|
-
inputSchema: jsonSchema7Schema.nullable().optional(),
|
|
392
|
-
metaSchema: jsonSchema7Schema.nullable().optional(),
|
|
393
|
-
meta: metaSchema
|
|
394
|
-
});
|
|
395
|
-
var serviceNodeSchema = z3.object({
|
|
396
|
-
type: z3.literal("service"),
|
|
397
|
-
output: outputsSchema,
|
|
398
|
-
inputSchema: jsonSchema7ObjectSchema.nullable().optional(),
|
|
399
|
-
id: idSchema,
|
|
400
|
-
name: z3.string(),
|
|
401
|
-
version: z3.string(),
|
|
402
|
-
configuration: z3.any().optional(),
|
|
403
|
-
configurationSchema: jsonSchema7Schema.nullable().optional(),
|
|
404
|
-
alias: z3.string().optional(),
|
|
405
|
-
ttl: z3.number().int().min(1).optional(),
|
|
406
|
-
retry: z3.number().int().min(1).optional(),
|
|
407
|
-
retryDelay: z3.number().int().min(100).optional(),
|
|
408
|
-
meta: metaSchema
|
|
409
|
-
});
|
|
410
|
-
var catchNodeSchema = z3.object({
|
|
411
|
-
type: z3.literal("catch"),
|
|
412
|
-
output: outputsSchema,
|
|
413
|
-
id: idSchema,
|
|
414
|
-
subject: z3.string(),
|
|
415
|
-
meta: metaSchema
|
|
416
|
-
});
|
|
417
|
-
var logicNodeSchema = z3.object({
|
|
418
|
-
type: z3.literal("logic"),
|
|
419
|
-
alias: z3.string().optional(),
|
|
420
|
-
inputSchema: jsonSchema7ObjectSchema.nullable().optional(),
|
|
421
|
-
output: outputsSchema,
|
|
422
|
-
id: idSchema,
|
|
423
|
-
script: z3.string(),
|
|
424
|
-
concurrency: z3.boolean().default(true),
|
|
425
|
-
language: z3.enum(["javascript", "python", "typescript"]).default("javascript"),
|
|
426
|
-
maxExecutionTime: z3.number().int().min(0).default(200),
|
|
427
|
-
meta: metaSchema
|
|
428
|
-
});
|
|
429
|
-
var orNodeSchema = z3.object({
|
|
430
|
-
id: idSchema,
|
|
431
|
-
type: z3.literal("or"),
|
|
432
|
-
alias: z3.string().optional(),
|
|
433
|
-
output: outputsSchema,
|
|
434
|
-
meta: metaSchema
|
|
435
|
-
});
|
|
436
|
-
var nodeSchema = z3.discriminatedUnion("type", [
|
|
437
|
-
entryNodeSchema,
|
|
438
|
-
serviceNodeSchema,
|
|
439
|
-
catchNodeSchema,
|
|
440
|
-
logicNodeSchema,
|
|
441
|
-
orNodeSchema
|
|
442
|
-
]);
|
|
443
320
|
|
|
444
|
-
// ../helpers/src/
|
|
445
|
-
class
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
params
|
|
453
|
-
}
|
|
454
|
-
]);
|
|
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;
|
|
455
329
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
const names = new Map;
|
|
460
|
-
let entryNode = null;
|
|
461
|
-
let firstNodeId = null;
|
|
462
|
-
for (const node of nodes) {
|
|
463
|
-
if (node.type === "entry") {
|
|
464
|
-
entryNode = node;
|
|
465
|
-
}
|
|
466
|
-
if ((node.type === "service" || node.type === "logic") && !firstNodeId) {
|
|
467
|
-
firstNodeId = node.id;
|
|
468
|
-
}
|
|
469
|
-
if ("alias" in node && node.alias) {
|
|
470
|
-
if (!aliases.has(node.alias)) {
|
|
471
|
-
aliases.set(node.alias, []);
|
|
472
|
-
}
|
|
473
|
-
aliases.get(node.alias).push(node.id);
|
|
474
|
-
}
|
|
475
|
-
if ("name" in node && node.name) {
|
|
476
|
-
if (!names.has(node.name)) {
|
|
477
|
-
names.set(node.name, []);
|
|
478
|
-
}
|
|
479
|
-
names.get(node.name).push(node.id);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
if (!entryNode && firstNodeId) {
|
|
483
|
-
nodes.unshift({
|
|
484
|
-
type: "entry",
|
|
485
|
-
id: "__entry__",
|
|
486
|
-
output: [{ default: true, exit: false, target: firstNodeId }]
|
|
330
|
+
static fromStreamObject(stream2) {
|
|
331
|
+
const instance = new this(null, {
|
|
332
|
+
type: "x/x"
|
|
487
333
|
});
|
|
334
|
+
instance.#stream = stream2;
|
|
335
|
+
return instance;
|
|
488
336
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
return aliases.get(identifier)[0];
|
|
492
|
-
}
|
|
493
|
-
if (names.get(identifier)?.length === 1) {
|
|
494
|
-
return names.get(identifier)[0];
|
|
495
|
-
}
|
|
496
|
-
return identifier;
|
|
497
|
-
};
|
|
498
|
-
return nodes.map((node) => {
|
|
499
|
-
node.output = node.output.map((output) => ("target" in output) ? {
|
|
500
|
-
...output,
|
|
501
|
-
target: resolveOutput(output.target)
|
|
502
|
-
} : output);
|
|
503
|
-
if ("subject" in node) {
|
|
504
|
-
node.subject = resolveOutput(node.subject);
|
|
505
|
-
}
|
|
506
|
-
return node;
|
|
507
|
-
});
|
|
508
|
-
}).transform((nodes) => {
|
|
509
|
-
const { getInputs, getNode } = createNodeMaps(nodes);
|
|
510
|
-
const nodeAliases = new Set;
|
|
511
|
-
const nodeIds = new Set;
|
|
512
|
-
const catchSubjects = new Map;
|
|
513
|
-
const identify = (nodeId) => identifyNode(nodeId, getNode);
|
|
514
|
-
for (const node of nodes) {
|
|
515
|
-
if (nodeIds.has(node.id)) {
|
|
516
|
-
throw new NodesError("id is not unique", {
|
|
517
|
-
id: node.id
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
nodeIds.add(node.id);
|
|
521
|
-
if ("alias" in node && node.alias) {
|
|
522
|
-
if (nodeAliases.has(node.alias)) {
|
|
523
|
-
throw new NodesError("alias is not unique", {
|
|
524
|
-
alias: node.alias
|
|
525
|
-
});
|
|
526
|
-
}
|
|
527
|
-
nodeAliases.add(node.alias);
|
|
528
|
-
}
|
|
529
|
-
if (node.type === "catch") {
|
|
530
|
-
if (catchSubjects.has(node.subject)) {
|
|
531
|
-
throw new NodesError("only one catch node per service allowed", {
|
|
532
|
-
id: node.subject
|
|
533
|
-
});
|
|
534
|
-
}
|
|
535
|
-
catchSubjects.set(node.subject, node);
|
|
536
|
-
}
|
|
337
|
+
get streamObject() {
|
|
338
|
+
return this.#stream;
|
|
537
339
|
}
|
|
538
|
-
|
|
539
|
-
|
|
340
|
+
get mimeType() {
|
|
341
|
+
return this.#stream?.mime ?? this.#options.type;
|
|
540
342
|
}
|
|
541
|
-
|
|
542
|
-
|
|
343
|
+
get mainMimeType() {
|
|
344
|
+
return this.mimeType.split("/")[0];
|
|
543
345
|
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
throw new NodesError("catch node has invalid subject", {
|
|
547
|
-
id: catchNode.subject
|
|
548
|
-
});
|
|
549
|
-
}
|
|
346
|
+
get subMimeType() {
|
|
347
|
+
return this.mimeType.split("/")[1];
|
|
550
348
|
}
|
|
551
|
-
|
|
552
|
-
if (
|
|
553
|
-
const
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
}
|
|
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;
|
|
557
354
|
}
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
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
|
+
};
|
|
563
371
|
}
|
|
564
|
-
}
|
|
372
|
+
};
|
|
565
373
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
getNode,
|
|
569
|
-
onMissingInputs: (_node, path) => {
|
|
570
|
-
throw new NodesError("no path from entry to node", {
|
|
571
|
-
path: path.map(identify)
|
|
572
|
-
});
|
|
573
|
-
}
|
|
574
|
-
});
|
|
575
|
-
if (possiblePaths.every((possiblePath) => !possiblePath.includes("__entry__"))) {
|
|
576
|
-
throw new NodesError("no path from entry to exit");
|
|
374
|
+
toString() {
|
|
375
|
+
return `RequenceStream<${this.mimeType}>`;
|
|
577
376
|
}
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
const node = pathSegment === "__exit__" ? null : getNode(pathSegment);
|
|
581
|
-
if (node?.type === "catch" && possiblePath.includes(node.subject)) {
|
|
582
|
-
throw new NodesError("Unresolvable, inputs needs both catch and subject", {
|
|
583
|
-
path: possiblePath.map(identify)
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
}
|
|
377
|
+
toJSON() {
|
|
378
|
+
return `RequenceStream<${this.mimeType}>`;
|
|
587
379
|
}
|
|
588
|
-
|
|
589
|
-
});
|
|
380
|
+
}
|
|
590
381
|
|
|
591
|
-
// ../helpers/src/
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
maxExecutions: z5.number().int().min(0).optional().default(10)
|
|
598
|
-
});
|
|
599
|
-
var createNodesSchema = z5.object({
|
|
600
|
-
type: z5.literal("CREATE_NODES"),
|
|
601
|
-
nodes: nodesSchema,
|
|
602
|
-
input: z5.any(),
|
|
603
|
-
meta: z5.any(),
|
|
604
|
-
options: nodeOptionsSchema
|
|
605
|
-
});
|
|
606
|
-
var commandSchema = z5.union([abortSchema, createNodesSchema]);
|
|
607
|
-
// ../helpers/src/protocol/update.ts
|
|
608
|
-
import { z as z6 } from "zod";
|
|
609
|
-
var baseUpdateSchema = z6.object({
|
|
610
|
-
timestamp: z6.number().int().transform((int) => new Date(int))
|
|
611
|
-
});
|
|
612
|
-
var baseNodeUpdateSchema = baseUpdateSchema.extend({
|
|
613
|
-
nodeId: z6.string().uuid()
|
|
614
|
-
});
|
|
615
|
-
var nodeStartUpdateSchema = baseNodeUpdateSchema.extend({
|
|
616
|
-
type: z6.literal("NODE_START"),
|
|
617
|
-
context: contextSchema
|
|
618
|
-
});
|
|
619
|
-
var nodeErrorUpdateSchema = baseNodeUpdateSchema.extend({
|
|
620
|
-
type: z6.literal("NODE_ERROR"),
|
|
621
|
-
error: z6.string(),
|
|
622
|
-
context: contextSchema
|
|
623
|
-
});
|
|
624
|
-
var nodeUpdateSchema = baseNodeUpdateSchema.extend({
|
|
625
|
-
type: z6.literal("NODE_UPDATE"),
|
|
626
|
-
output: z6.string(),
|
|
627
|
-
data: z6.unknown(),
|
|
628
|
-
context: contextSchema
|
|
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")
|
|
629
388
|
});
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
nodes: nodesSchema,
|
|
648
|
-
context: contextSchema
|
|
649
|
-
});
|
|
650
|
-
var taskErrorUpdateSchema = baseUpdateSchema.extend({
|
|
651
|
-
type: z6.literal("TASK_ERROR"),
|
|
652
|
-
reason: z6.string().optional(),
|
|
653
|
-
context: contextSchema
|
|
654
|
-
});
|
|
655
|
-
var taskFinishedUpdateSchema = baseUpdateSchema.extend({
|
|
656
|
-
type: z6.literal("TASK_FINISHED"),
|
|
657
|
-
context: contextSchema
|
|
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")
|
|
658
406
|
});
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
407
|
+
function toFileObject(fileInfo) {
|
|
408
|
+
return {
|
|
409
|
+
...fileInfo,
|
|
410
|
+
__REQUENCE_type: "RequenceFile"
|
|
411
|
+
};
|
|
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/index.ts
|
|
437
|
+
import { z as z6 } from "zod/v4";
|
|
438
|
+
|
|
670
439
|
// src/createAmqpConnection.ts
|
|
671
|
-
import {
|
|
672
|
-
|
|
440
|
+
import {
|
|
441
|
+
connect
|
|
442
|
+
} from "amqp-connection-manager";
|
|
443
|
+
import { z as z5 } from "zod/v4";
|
|
673
444
|
|
|
674
445
|
// src/helpers.ts
|
|
675
446
|
class RetryError extends Error {
|
|
@@ -680,92 +451,201 @@ class RetryError extends Error {
|
|
|
680
451
|
}
|
|
681
452
|
}
|
|
682
453
|
|
|
454
|
+
class SkipError extends Error {
|
|
455
|
+
}
|
|
456
|
+
|
|
683
457
|
class AbortError extends Error {
|
|
684
458
|
}
|
|
685
459
|
var OUTPUT_VALUE = Symbol("output_value");
|
|
686
460
|
function isOutputValue(value) {
|
|
687
461
|
return value !== null && typeof value === "object" && OUTPUT_VALUE in value;
|
|
688
462
|
}
|
|
689
|
-
function
|
|
690
|
-
|
|
691
|
-
|
|
463
|
+
function processData(params) {
|
|
464
|
+
return mapOutput({
|
|
465
|
+
value: mapData(params.data, {
|
|
466
|
+
Function(data, path) {
|
|
467
|
+
return {
|
|
468
|
+
...params.onCallback(data),
|
|
469
|
+
outputName: params.outputName,
|
|
470
|
+
propertyPath: path,
|
|
471
|
+
__REQUENCE_type: "RequenceCallback"
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
}),
|
|
475
|
+
options: params.options,
|
|
476
|
+
onDone: params.onDone
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
async function unwrapResult(params) {
|
|
480
|
+
if (isOutputValue(params.result)) {
|
|
481
|
+
return {
|
|
482
|
+
value: await processData({
|
|
483
|
+
outputName: params.result[OUTPUT_VALUE],
|
|
484
|
+
data: params.result.value,
|
|
485
|
+
options: params.options,
|
|
486
|
+
onDone: params.onDone,
|
|
487
|
+
onCallback: params.onCallback
|
|
488
|
+
}),
|
|
489
|
+
outputName: params.result[OUTPUT_VALUE]
|
|
490
|
+
};
|
|
692
491
|
}
|
|
693
|
-
return {
|
|
492
|
+
return {
|
|
493
|
+
value: await processData({
|
|
494
|
+
outputName: null,
|
|
495
|
+
data: params.result,
|
|
496
|
+
options: params.options,
|
|
497
|
+
onDone: params.onDone,
|
|
498
|
+
onCallback: params.onCallback
|
|
499
|
+
}),
|
|
500
|
+
outputName: null
|
|
501
|
+
};
|
|
694
502
|
}
|
|
695
|
-
function
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
503
|
+
function isAsyncIterable(iterable) {
|
|
504
|
+
return typeof iterable[Symbol.asyncIterator] === "function";
|
|
505
|
+
}
|
|
506
|
+
function createContextHelper(options) {
|
|
507
|
+
const terminatePromise = createRemotePromise();
|
|
508
|
+
return [
|
|
509
|
+
{
|
|
510
|
+
taskId: options.taskId,
|
|
511
|
+
input: resolveRequenceTypes(options.input, options.onCallback),
|
|
512
|
+
configuration: resolveRequenceTypes(options.configuration, () => {
|
|
513
|
+
throw new Error("configuration may not have callbacks");
|
|
514
|
+
}),
|
|
515
|
+
toOutput(name, value) {
|
|
516
|
+
return {
|
|
517
|
+
[OUTPUT_VALUE]: name,
|
|
518
|
+
value
|
|
519
|
+
};
|
|
520
|
+
},
|
|
521
|
+
defer: options.onDefer,
|
|
522
|
+
debug: {
|
|
523
|
+
log(...data) {
|
|
524
|
+
options.onLog("log", data);
|
|
525
|
+
},
|
|
526
|
+
info(...data) {
|
|
527
|
+
options.onLog("info", data);
|
|
528
|
+
},
|
|
529
|
+
warn(...data) {
|
|
530
|
+
options.onLog("warn", data);
|
|
531
|
+
},
|
|
532
|
+
error(...data) {
|
|
533
|
+
options.onLog("error", data);
|
|
534
|
+
}
|
|
721
535
|
},
|
|
722
|
-
|
|
723
|
-
|
|
536
|
+
retry(delay) {
|
|
537
|
+
throw new RetryError(delay);
|
|
724
538
|
},
|
|
725
|
-
|
|
726
|
-
|
|
539
|
+
abort(reason) {
|
|
540
|
+
throw new AbortError(reason);
|
|
727
541
|
},
|
|
728
|
-
|
|
729
|
-
|
|
542
|
+
skip() {
|
|
543
|
+
throw new SkipError;
|
|
544
|
+
},
|
|
545
|
+
terminated: terminatePromise.promise,
|
|
546
|
+
wrapIterable: function(iterable) {
|
|
547
|
+
if (isAsyncIterable(iterable)) {
|
|
548
|
+
return {
|
|
549
|
+
[Symbol.asyncIterator]() {
|
|
550
|
+
const iterator = iterable[Symbol.asyncIterator]();
|
|
551
|
+
return {
|
|
552
|
+
async next() {
|
|
553
|
+
const result = await Promise.race([
|
|
554
|
+
terminatePromise.promise,
|
|
555
|
+
iterator.next()
|
|
556
|
+
]);
|
|
557
|
+
if (typeof result === "string") {
|
|
558
|
+
return { done: true, value: undefined };
|
|
559
|
+
}
|
|
560
|
+
return result;
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
return {
|
|
567
|
+
[Symbol.iterator]() {
|
|
568
|
+
const iterator = iterable[Symbol.iterator]();
|
|
569
|
+
let terminated = false;
|
|
570
|
+
terminatePromise.then(() => {
|
|
571
|
+
terminated = true;
|
|
572
|
+
});
|
|
573
|
+
return {
|
|
574
|
+
next() {
|
|
575
|
+
if (terminated) {
|
|
576
|
+
return { done: true, value: undefined };
|
|
577
|
+
}
|
|
578
|
+
const result = iterator.next();
|
|
579
|
+
return result;
|
|
580
|
+
}
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
};
|
|
730
584
|
}
|
|
731
585
|
},
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
586
|
+
terminatePromise
|
|
587
|
+
];
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// src/mapInput.ts
|
|
591
|
+
function mapInput(data) {
|
|
592
|
+
return mapData(data, {
|
|
593
|
+
Object(obj) {
|
|
594
|
+
if (isFileObject(obj)) {
|
|
595
|
+
return RequenceFile.fromFileObject(obj);
|
|
596
|
+
}
|
|
597
|
+
if (isStreamObject(obj)) {
|
|
598
|
+
return RequenceStream.fromStreamObject(obj);
|
|
599
|
+
}
|
|
737
600
|
}
|
|
738
601
|
});
|
|
739
602
|
}
|
|
740
603
|
|
|
741
604
|
// src/createAmqpConnection.ts
|
|
742
|
-
var messageKeySchema =
|
|
605
|
+
var messageKeySchema = z5.string().transform((str) => deobfuscate(str)).pipe(z5.tuple([z5.uuid(), z5.uuid()]).rest(z5.string())).transform((arr) => ({
|
|
743
606
|
taskId: arr[0],
|
|
744
|
-
|
|
745
|
-
|
|
607
|
+
messageId: arr[1],
|
|
608
|
+
uploadUrl: arr[2] || undefined,
|
|
609
|
+
streamUrl: arr[3] || undefined
|
|
746
610
|
}));
|
|
747
|
-
var headerSchema =
|
|
748
|
-
properties:
|
|
749
|
-
correlationId:
|
|
750
|
-
headers:
|
|
751
|
-
|
|
752
|
-
taskId: z7.string().uuid(),
|
|
753
|
-
serviceId: z7.string().uuid()
|
|
611
|
+
var headerSchema = z5.object({
|
|
612
|
+
properties: z5.object({
|
|
613
|
+
correlationId: z5.uuid(),
|
|
614
|
+
headers: z5.object({
|
|
615
|
+
taskId: z5.uuid()
|
|
754
616
|
})
|
|
755
617
|
})
|
|
756
618
|
}).transform((msg) => ({
|
|
757
|
-
version: msg.properties.headers.version,
|
|
758
619
|
messageId: msg.properties.correlationId,
|
|
759
|
-
taskId: msg.properties.headers.taskId
|
|
760
|
-
serviceId: msg.properties.headers.serviceId
|
|
620
|
+
taskId: msg.properties.headers.taskId
|
|
761
621
|
}));
|
|
762
|
-
var payloadSchema =
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
622
|
+
var payloadSchema = z5.object({ content: z5.instanceof(Buffer) }).transform((msg) => JSON.parse(msg.content.toString())).pipe(z5.object({
|
|
623
|
+
input: z5.unknown(),
|
|
624
|
+
configuration: z5.unknown(),
|
|
625
|
+
options: z5.object({
|
|
626
|
+
uploadUrl: z5.url().optional(),
|
|
627
|
+
streamUrl: z5.url().optional()
|
|
767
628
|
})
|
|
768
629
|
}));
|
|
630
|
+
var backchannelMessageSchema = z5.object({
|
|
631
|
+
content: z5.instanceof(Buffer).transform((content) => JSON.parse(content.toString())).pipe(z5.discriminatedUnion("type", [
|
|
632
|
+
z5.object({
|
|
633
|
+
type: z5.literal("stop")
|
|
634
|
+
}),
|
|
635
|
+
z5.object({
|
|
636
|
+
type: z5.literal("callback"),
|
|
637
|
+
callbackId: z5.uuid(),
|
|
638
|
+
arg: z5.any()
|
|
639
|
+
})
|
|
640
|
+
])),
|
|
641
|
+
properties: z5.object({
|
|
642
|
+
correlationId: z5.string()
|
|
643
|
+
})
|
|
644
|
+
}).transform((message) => ({
|
|
645
|
+
payload: message.content,
|
|
646
|
+
messageId: message.properties.correlationId
|
|
647
|
+
}));
|
|
648
|
+
var abortSymbol = Symbol();
|
|
769
649
|
function isMessageHandlerGenerator(handler) {
|
|
770
650
|
return handler.constructor.name === "GeneratorFunction" || handler.constructor.name === "AsyncGeneratorFunction";
|
|
771
651
|
}
|
|
@@ -775,12 +655,13 @@ function createConnection({
|
|
|
775
655
|
version,
|
|
776
656
|
prefetch = 1,
|
|
777
657
|
silent = false,
|
|
778
|
-
connectionTimeout
|
|
658
|
+
connectionTimeout,
|
|
659
|
+
connectionOptions
|
|
779
660
|
}, messageHandler) {
|
|
780
661
|
const queue = `${url.username}@${version}`;
|
|
781
662
|
const exchange = url.username;
|
|
782
|
-
const connection = connect(url.toString());
|
|
783
|
-
const connectedPromise = new Promise((
|
|
663
|
+
const connection = connect(url.toString(), { connectionOptions });
|
|
664
|
+
const connectedPromise = new Promise((resolve2, reject) => {
|
|
784
665
|
const unsubscribe = () => {
|
|
785
666
|
clearTimeout(timeout);
|
|
786
667
|
connection.removeListener("connect", handleConnect);
|
|
@@ -791,7 +672,7 @@ function createConnection({
|
|
|
791
672
|
}, connectionTimeout);
|
|
792
673
|
const handleConnect = () => {
|
|
793
674
|
unsubscribe();
|
|
794
|
-
|
|
675
|
+
resolve2();
|
|
795
676
|
};
|
|
796
677
|
const handleConnectFailed = ({ err }) => {
|
|
797
678
|
unsubscribe();
|
|
@@ -800,11 +681,17 @@ function createConnection({
|
|
|
800
681
|
connection.addListener("connect", handleConnect);
|
|
801
682
|
connection.addListener("connectFailed", handleConnectFailed);
|
|
802
683
|
});
|
|
684
|
+
const connectionId = crypto.randomUUID();
|
|
685
|
+
const backchannelQueue = `${queue}-backchannel-${connectionId}`;
|
|
803
686
|
const channel = connection.createChannel({
|
|
804
687
|
async setup(channel2) {
|
|
805
688
|
await channel2.checkExchange(exchange);
|
|
806
689
|
await channel2.checkExchange(`${exchange}-retry`);
|
|
807
690
|
await channel2.checkQueue(queue);
|
|
691
|
+
await channel2.assertQueue(backchannelQueue, {
|
|
692
|
+
exclusive: true
|
|
693
|
+
});
|
|
694
|
+
await channel2.bindQueue(backchannelQueue, "service", backchannelQueue);
|
|
808
695
|
await channel2.prefetch(prefetch);
|
|
809
696
|
}
|
|
810
697
|
});
|
|
@@ -812,90 +699,141 @@ function createConnection({
|
|
|
812
699
|
data,
|
|
813
700
|
outputName,
|
|
814
701
|
messageId,
|
|
702
|
+
priority,
|
|
815
703
|
...headers
|
|
816
|
-
}) => {
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
704
|
+
}) => channel.publish(exchange, "", Buffer.from(JSON.stringify(data ?? null)), {
|
|
705
|
+
correlationId: messageId,
|
|
706
|
+
contentType: "application/json",
|
|
707
|
+
persistent: true,
|
|
708
|
+
priority,
|
|
709
|
+
headers: {
|
|
710
|
+
outputName: outputName ?? null,
|
|
711
|
+
connectionId,
|
|
712
|
+
libVersion: "javascript@1.0.0-alpha.30",
|
|
713
|
+
...headers
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
const generatorTerminators = new Map;
|
|
717
|
+
const callbacks = new Map;
|
|
718
|
+
channel.consume(backchannelQueue, async (message) => {
|
|
719
|
+
const result = backchannelMessageSchema.safeParse(message);
|
|
720
|
+
if (!result.success) {
|
|
829
721
|
return;
|
|
830
722
|
}
|
|
831
|
-
|
|
832
|
-
|
|
723
|
+
const backchannelMessage = result.data;
|
|
724
|
+
switch (backchannelMessage.payload.type) {
|
|
725
|
+
case "stop": {
|
|
726
|
+
generatorTerminators.get(backchannelMessage.messageId)?.("task stopped");
|
|
727
|
+
break;
|
|
728
|
+
}
|
|
729
|
+
case "callback": {
|
|
730
|
+
callbacks.get(backchannelMessage.payload.callbackId)?.(backchannelMessage.payload.arg);
|
|
731
|
+
break;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}, {
|
|
735
|
+
noAck: true
|
|
736
|
+
});
|
|
737
|
+
channel.consume(queue, async (message) => {
|
|
738
|
+
let publishIndex = 0;
|
|
739
|
+
const donePromises = [];
|
|
740
|
+
const registeredCallbackIds = new Set;
|
|
741
|
+
let removeActiveMessage = () => {};
|
|
742
|
+
const { messageId, taskId } = headerSchema.parse(message);
|
|
833
743
|
try {
|
|
834
744
|
let deferred = false;
|
|
835
745
|
let deferredReason = null;
|
|
836
|
-
const { messageId, serviceId, taskId } = headerSchema.parse(message);
|
|
837
746
|
activeMessages.add(messageId);
|
|
838
747
|
removeActiveMessage = () => activeMessages.delete(messageId);
|
|
839
748
|
const payload = payloadSchema.parse(message);
|
|
840
|
-
|
|
841
|
-
const ack = () => {
|
|
842
|
-
if (!acked) {
|
|
843
|
-
acked = true;
|
|
844
|
-
channel.ack(message);
|
|
845
|
-
}
|
|
846
|
-
};
|
|
847
|
-
let immediateUpdateState;
|
|
848
|
-
const extendedContext = createExtendedContextHelper({
|
|
849
|
-
serviceId,
|
|
850
|
-
context: payload.context,
|
|
851
|
-
nodes: payload.meta.nodes,
|
|
749
|
+
const [extendedContext, terminatePromise] = createContextHelper({
|
|
852
750
|
taskId,
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
clearImmediate(immediateUpdateState);
|
|
856
|
-
immediateUpdateState = setImmediate(() => {
|
|
857
|
-
publish({
|
|
858
|
-
messageId,
|
|
859
|
-
taskId,
|
|
860
|
-
serviceId,
|
|
861
|
-
data: clone(newState),
|
|
862
|
-
state: true
|
|
863
|
-
});
|
|
864
|
-
});
|
|
865
|
-
},
|
|
751
|
+
input: mapInput(payload.input),
|
|
752
|
+
configuration: mapInput(payload.configuration),
|
|
866
753
|
onLog(debugMethod, data) {
|
|
867
754
|
publish({
|
|
755
|
+
index: publishIndex++,
|
|
756
|
+
version,
|
|
868
757
|
messageId,
|
|
869
758
|
taskId,
|
|
870
|
-
serviceId,
|
|
871
759
|
data,
|
|
872
760
|
debugMethod,
|
|
761
|
+
priority: message.properties.priority,
|
|
873
762
|
debug: true
|
|
874
763
|
});
|
|
875
764
|
},
|
|
876
765
|
onDefer(reason) {
|
|
877
766
|
deferred = true;
|
|
878
767
|
deferredReason = reason || null;
|
|
879
|
-
|
|
880
|
-
|
|
768
|
+
return obfuscate(taskId, messageId, payload.options.uploadUrl ?? "", payload.options.streamUrl ?? "");
|
|
769
|
+
},
|
|
770
|
+
onCallback(params) {
|
|
771
|
+
publish({
|
|
772
|
+
index: 0,
|
|
773
|
+
version,
|
|
774
|
+
taskId,
|
|
775
|
+
messageId,
|
|
776
|
+
data: params.arg,
|
|
777
|
+
outputName: params.outputName,
|
|
778
|
+
connectionId: params.sourceId,
|
|
779
|
+
callbackId: params.callbackId,
|
|
780
|
+
propertyPath: params.propertyPath
|
|
781
|
+
});
|
|
881
782
|
}
|
|
882
783
|
});
|
|
784
|
+
await publish({
|
|
785
|
+
index: publishIndex++,
|
|
786
|
+
version,
|
|
787
|
+
messageId,
|
|
788
|
+
taskId,
|
|
789
|
+
priority: message.properties.priority,
|
|
790
|
+
begin: true
|
|
791
|
+
});
|
|
883
792
|
if (isMessageHandlerGenerator(messageHandler)) {
|
|
884
793
|
const generator = messageHandler(extendedContext);
|
|
794
|
+
const terminationPromise = createRemotePromise();
|
|
795
|
+
generatorTerminators.set(messageId, (reason) => {
|
|
796
|
+
generator.return();
|
|
797
|
+
terminationPromise.resolve(abortSymbol);
|
|
798
|
+
terminatePromise.resolve(reason);
|
|
799
|
+
});
|
|
885
800
|
while (true) {
|
|
886
|
-
const
|
|
887
|
-
|
|
801
|
+
const next = await Promise.race([
|
|
802
|
+
terminationPromise,
|
|
803
|
+
generator.next()
|
|
804
|
+
]);
|
|
805
|
+
if (next === abortSymbol) {
|
|
806
|
+
break;
|
|
807
|
+
}
|
|
808
|
+
const { value: result, done } = next;
|
|
888
809
|
if (deferred) {
|
|
889
810
|
deferred = false;
|
|
890
811
|
console.warn("returning a value in a deferred message resets the deferred status");
|
|
891
812
|
}
|
|
892
|
-
const
|
|
813
|
+
const donePromise = createRemotePromise();
|
|
814
|
+
donePromises.push(donePromise);
|
|
815
|
+
const { value, outputName } = await unwrapResult({
|
|
816
|
+
result,
|
|
817
|
+
options: payload.options,
|
|
818
|
+
onDone: donePromise.resolve,
|
|
819
|
+
onCallback: (callback) => {
|
|
820
|
+
const callbackId = crypto.randomUUID();
|
|
821
|
+
registeredCallbackIds.add(callbackId);
|
|
822
|
+
callbacks.set(callbackId, callback);
|
|
823
|
+
return {
|
|
824
|
+
sourceId: connectionId,
|
|
825
|
+
callbackId
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
});
|
|
893
829
|
if (!done || typeof value !== "undefined") {
|
|
894
830
|
publish({
|
|
831
|
+
index: publishIndex++,
|
|
832
|
+
version,
|
|
895
833
|
messageId,
|
|
896
834
|
taskId,
|
|
897
|
-
serviceId,
|
|
898
835
|
data: value,
|
|
836
|
+
priority: message.properties.priority,
|
|
899
837
|
outputName
|
|
900
838
|
});
|
|
901
839
|
}
|
|
@@ -905,52 +843,74 @@ function createConnection({
|
|
|
905
843
|
}
|
|
906
844
|
} else {
|
|
907
845
|
const result = await messageHandler(extendedContext);
|
|
908
|
-
|
|
909
|
-
|
|
846
|
+
const donePromise = createRemotePromise();
|
|
847
|
+
donePromises.push(donePromise);
|
|
848
|
+
const { value, outputName } = await unwrapResult({
|
|
849
|
+
result,
|
|
850
|
+
options: payload.options,
|
|
851
|
+
onDone: donePromise.resolve,
|
|
852
|
+
onCallback: () => {
|
|
853
|
+
throw new Error("callbacks can only be used in generator functions");
|
|
854
|
+
}
|
|
855
|
+
});
|
|
910
856
|
if (deferred && value) {
|
|
911
857
|
console.warn("returning a value in a deferred message resets the deferred status");
|
|
912
858
|
deferred = false;
|
|
913
859
|
}
|
|
914
860
|
if (!deferred || value) {
|
|
915
861
|
publish({
|
|
862
|
+
index: publishIndex++,
|
|
863
|
+
version,
|
|
916
864
|
messageId,
|
|
917
865
|
taskId,
|
|
918
|
-
serviceId,
|
|
919
866
|
data: value,
|
|
867
|
+
priority: message.properties.priority,
|
|
920
868
|
outputName
|
|
921
869
|
});
|
|
922
870
|
}
|
|
923
871
|
}
|
|
924
|
-
setImmediate(() =>
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
872
|
+
setImmediate(async () => {
|
|
873
|
+
if (!deferred) {
|
|
874
|
+
await Promise.allSettled(donePromises);
|
|
875
|
+
}
|
|
876
|
+
publish({
|
|
877
|
+
index: publishIndex++,
|
|
878
|
+
version,
|
|
879
|
+
messageId,
|
|
880
|
+
taskId,
|
|
881
|
+
data: deferredReason,
|
|
882
|
+
priority: message.properties.priority,
|
|
883
|
+
deferred,
|
|
884
|
+
done: !deferred
|
|
885
|
+
});
|
|
886
|
+
channel.ack(message);
|
|
887
|
+
});
|
|
932
888
|
} catch (error) {
|
|
889
|
+
if (error instanceof SkipError) {
|
|
890
|
+
channel.nack(message);
|
|
891
|
+
return;
|
|
892
|
+
}
|
|
933
893
|
if (error instanceof RetryError) {
|
|
894
|
+
channel.ack(message);
|
|
934
895
|
const properties = {
|
|
935
896
|
...message.properties,
|
|
936
897
|
expiration: error.delay || 1000
|
|
937
898
|
};
|
|
938
|
-
channel.publish(`${exchange}-retry`,
|
|
939
|
-
channel.ack(message);
|
|
899
|
+
channel.publish(`${exchange}-retry`, version, message.content, properties);
|
|
940
900
|
return;
|
|
941
901
|
}
|
|
942
902
|
if (error instanceof AbortError && error.message.length > 0) {
|
|
943
|
-
channel.
|
|
903
|
+
channel.ack(message);
|
|
904
|
+
channel.publish(`${exchange}-retry`, "operator", error.message, {
|
|
944
905
|
...message.properties,
|
|
945
|
-
expiration: 0,
|
|
946
|
-
priority: 0,
|
|
947
906
|
contentType: "text/plain",
|
|
948
907
|
headers: {
|
|
949
908
|
...message.properties.headers,
|
|
909
|
+
index: publishIndex++,
|
|
910
|
+
libVersion: "javascript@1.0.0-alpha.30",
|
|
950
911
|
abort: true
|
|
951
912
|
}
|
|
952
913
|
});
|
|
953
|
-
channel.ack(message);
|
|
954
914
|
return;
|
|
955
915
|
}
|
|
956
916
|
if (error instanceof Error) {
|
|
@@ -958,21 +918,23 @@ function createConnection({
|
|
|
958
918
|
console.error(`Encountered an error inside service handler:`);
|
|
959
919
|
console.error(error);
|
|
960
920
|
}
|
|
961
|
-
channel.
|
|
921
|
+
channel.ack(message);
|
|
922
|
+
channel.publish(`${exchange}-retry`, "operator", message.content, {
|
|
962
923
|
...message.properties,
|
|
963
|
-
expiration: 0,
|
|
964
|
-
priority: 0,
|
|
965
924
|
headers: {
|
|
966
925
|
...message.properties.headers,
|
|
926
|
+
version,
|
|
967
927
|
exception: true,
|
|
928
|
+
index: publishIndex++,
|
|
929
|
+
libVersion: "javascript@1.0.0-alpha.30",
|
|
968
930
|
"error-message": error.message || "error in service handler"
|
|
969
931
|
}
|
|
970
932
|
});
|
|
971
|
-
channel.ack(message);
|
|
972
933
|
return;
|
|
973
934
|
}
|
|
974
|
-
channel.nack(message, false, false);
|
|
975
935
|
} finally {
|
|
936
|
+
generatorTerminators.delete(messageId);
|
|
937
|
+
registeredCallbackIds.forEach((id) => callbacks.delete(id));
|
|
976
938
|
removeActiveMessage();
|
|
977
939
|
}
|
|
978
940
|
});
|
|
@@ -983,73 +945,113 @@ function createConnection({
|
|
|
983
945
|
},
|
|
984
946
|
open: () => connectedPromise.then(() => api),
|
|
985
947
|
async act(messageKey, actor) {
|
|
948
|
+
let publishIndex = 0;
|
|
949
|
+
const { taskId, messageId, ...options } = messageKeySchema.parse(messageKey);
|
|
950
|
+
const checkActiveMessage = () => {
|
|
951
|
+
if (activeMessages.has(messageId)) {
|
|
952
|
+
throw new Error("Cannot send deferred message while callback handler is still running");
|
|
953
|
+
}
|
|
954
|
+
};
|
|
955
|
+
const registeredCallbackIds = new Set;
|
|
956
|
+
const donePromises = [];
|
|
986
957
|
await actor({
|
|
987
|
-
sendToOutput(outputName, data) {
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
}
|
|
958
|
+
async sendToOutput(outputName, data) {
|
|
959
|
+
checkActiveMessage();
|
|
960
|
+
const donePromise = createRemotePromise();
|
|
961
|
+
donePromises.push(donePromise);
|
|
992
962
|
publish({
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
963
|
+
index: publishIndex++,
|
|
964
|
+
version,
|
|
965
|
+
messageId,
|
|
966
|
+
taskId,
|
|
967
|
+
data: await processData({
|
|
968
|
+
outputName,
|
|
969
|
+
data,
|
|
970
|
+
options,
|
|
971
|
+
onDone: donePromise.resolve,
|
|
972
|
+
onCallback: (callback) => {
|
|
973
|
+
const callbackId = crypto.randomUUID();
|
|
974
|
+
registeredCallbackIds.add(callbackId);
|
|
975
|
+
callbacks.set(callbackId, callback);
|
|
976
|
+
return {
|
|
977
|
+
sourceId: connectionId,
|
|
978
|
+
callbackId
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
}),
|
|
997
982
|
outputName
|
|
998
983
|
});
|
|
999
984
|
},
|
|
1000
|
-
send(data) {
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
}
|
|
985
|
+
async send(data) {
|
|
986
|
+
checkActiveMessage();
|
|
987
|
+
const donePromise = createRemotePromise();
|
|
988
|
+
donePromises.push(donePromise);
|
|
1005
989
|
publish({
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
990
|
+
index: publishIndex++,
|
|
991
|
+
version,
|
|
992
|
+
messageId,
|
|
993
|
+
taskId,
|
|
994
|
+
data: await processData({
|
|
995
|
+
outputName: null,
|
|
996
|
+
data,
|
|
997
|
+
options,
|
|
998
|
+
onDone: donePromise.resolve,
|
|
999
|
+
onCallback: (callback) => {
|
|
1000
|
+
const callbackId = crypto.randomUUID();
|
|
1001
|
+
registeredCallbackIds.add(callbackId);
|
|
1002
|
+
callbacks.set(callbackId, callback);
|
|
1003
|
+
return {
|
|
1004
|
+
sourceId: connectionId,
|
|
1005
|
+
callbackId
|
|
1006
|
+
};
|
|
1007
|
+
}
|
|
1008
|
+
})
|
|
1010
1009
|
});
|
|
1011
1010
|
},
|
|
1012
1011
|
abort(error) {
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
channel.publish(`${exchange}-retry`, "requeue", error instanceof Error ? error.message : error, {
|
|
1018
|
-
correlationId: messageId2,
|
|
1012
|
+
checkActiveMessage();
|
|
1013
|
+
channel.publish(`${exchange}-retry`, "operator", error instanceof Error ? error.message : error, {
|
|
1014
|
+
persistent: true,
|
|
1015
|
+
correlationId: messageId,
|
|
1019
1016
|
expiration: 0,
|
|
1020
1017
|
priority: 0,
|
|
1021
1018
|
contentType: "text/plain",
|
|
1022
1019
|
headers: {
|
|
1023
|
-
taskId
|
|
1024
|
-
|
|
1020
|
+
taskId,
|
|
1021
|
+
libVersion: "javascript@1.0.0-alpha.30",
|
|
1022
|
+
index: publishIndex++,
|
|
1025
1023
|
abort: true
|
|
1026
1024
|
}
|
|
1027
1025
|
});
|
|
1028
1026
|
}
|
|
1029
1027
|
});
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1028
|
+
setImmediate(async () => {
|
|
1029
|
+
await Promise.allSettled(donePromises);
|
|
1030
|
+
registeredCallbackIds.forEach((id) => callbacks.delete(id));
|
|
1031
|
+
publish({
|
|
1032
|
+
index: publishIndex++,
|
|
1033
|
+
version,
|
|
1034
|
+
messageId,
|
|
1035
|
+
taskId,
|
|
1036
|
+
done: true
|
|
1037
|
+
});
|
|
1038
|
+
});
|
|
1037
1039
|
}
|
|
1038
1040
|
};
|
|
1039
1041
|
return api;
|
|
1040
1042
|
}
|
|
1041
1043
|
|
|
1042
1044
|
// src/index.ts
|
|
1043
|
-
var
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
z8.instanceof(URL).refine((url) => url.protocol.match(/^amqps?:/), "Wrong protocol")
|
|
1045
|
+
var connectionOptionsSchema = z6.object({
|
|
1046
|
+
url: z6.union([
|
|
1047
|
+
z6.string().regex(/^amqps?:\/\/(.+):(.+)@(.+)$/).transform((str) => new URL(str)),
|
|
1048
|
+
z6.instanceof(URL).refine((url) => url.protocol.match(/^amqps?:/), "Wrong protocol")
|
|
1048
1049
|
]),
|
|
1049
|
-
version:
|
|
1050
|
-
silent:
|
|
1051
|
-
prefetch:
|
|
1052
|
-
connectionTimeout:
|
|
1050
|
+
version: z6.string(),
|
|
1051
|
+
silent: z6.boolean().optional(),
|
|
1052
|
+
prefetch: z6.number().int().optional(),
|
|
1053
|
+
connectionTimeout: z6.number().positive().default(3000),
|
|
1054
|
+
connectionOptions: z6.any()
|
|
1053
1055
|
});
|
|
1054
1056
|
function createService(optionsOrVersion, optionalMessageHandler) {
|
|
1055
1057
|
let options;
|
|
@@ -1063,11 +1065,15 @@ function createService(optionsOrVersion, optionalMessageHandler) {
|
|
|
1063
1065
|
options = optionsOrVersion;
|
|
1064
1066
|
messageHandler = optionalMessageHandler;
|
|
1065
1067
|
}
|
|
1066
|
-
|
|
1067
|
-
if (!
|
|
1068
|
+
let token = options.accessToken ?? process.env.REQUENCE_SERVICE_ACCESS_TOKEN ?? process.env.REQUENCE_ACCESS_TOKEN;
|
|
1069
|
+
if (!token) {
|
|
1070
|
+
const pkgJson = JSON.parse(fs.readFileSync("package.json", "utf-8"));
|
|
1071
|
+
token = pkgJson.requence?.service?.accessToken ?? pkgJson.requence?.accessToken;
|
|
1072
|
+
}
|
|
1073
|
+
if (!token) {
|
|
1068
1074
|
throw new Error("No service key found");
|
|
1069
1075
|
}
|
|
1070
|
-
const parts = deobfuscate(
|
|
1076
|
+
const parts = deobfuscate(token);
|
|
1071
1077
|
if (parts.length < 2 || parts[0] !== "service") {
|
|
1072
1078
|
throw new Error("Invalid service key");
|
|
1073
1079
|
}
|
|
@@ -1078,8 +1084,11 @@ function createService(optionsOrVersion, optionalMessageHandler) {
|
|
|
1078
1084
|
return createConnection(connectionOptionsSchema.parse(connectionOptions), messageHandler);
|
|
1079
1085
|
}
|
|
1080
1086
|
export {
|
|
1081
|
-
createService
|
|
1087
|
+
createService,
|
|
1088
|
+
createCallback,
|
|
1089
|
+
RequenceStream,
|
|
1090
|
+
RequenceFile
|
|
1082
1091
|
};
|
|
1083
1092
|
|
|
1084
|
-
//# debugId=
|
|
1093
|
+
//# debugId=313B374CFFE32D7064756E2164756E21
|
|
1085
1094
|
//# sourceMappingURL=index.js.map
|