@versori/run 0.5.10 → 0.7.0-alpha.10
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/esm/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fmt/{1.0.9 → 1.0.10}/colors.js +2 -2
- package/esm/deps/jsr.io/@std/log/0.224.14/console_handler.js +1 -1
- package/esm/src/connection/internal/CredentialHolder.js +1 -1
- package/esm/src/connection/internal/FetchBuilder.d.ts +9 -2
- package/esm/src/connection/internal/FetchBuilder.d.ts.map +1 -1
- package/esm/src/connection/internal/FetchBuilder.js +124 -3
- package/esm/src/context/Context.d.ts +5 -0
- package/esm/src/context/Context.d.ts.map +1 -1
- package/esm/src/context/Context.js +6 -0
- package/esm/src/dsl/Workflow.d.ts.map +1 -1
- package/esm/src/dsl/Workflow.js +2 -0
- package/esm/src/dsl/http/types.d.ts +2 -0
- package/esm/src/dsl/http/types.d.ts.map +1 -1
- package/esm/src/dsl/http/versori/configloader.d.ts.map +1 -1
- package/esm/src/dsl/http/versori/configloader.js +1 -1
- package/esm/src/dsl/http/versori/cronapi.d.ts +2 -3
- package/esm/src/dsl/http/versori/cronapi.d.ts.map +1 -1
- package/esm/src/dsl/http/versori/cronapi.js +14 -15
- package/esm/src/dsl/http/versori/kvapi/core/OpenAPI.js +1 -1
- package/esm/src/dsl/triggers/WebhookTrigger.d.ts.map +1 -1
- package/esm/src/dsl/triggers/WebhookTrigger.js +3 -1
- package/esm/src/internal/constants.d.ts +3 -0
- package/esm/src/internal/constants.d.ts.map +1 -1
- package/esm/src/internal/constants.js +3 -0
- package/esm/src/internal/supervisor.d.ts +23 -0
- package/esm/src/internal/supervisor.d.ts.map +1 -0
- package/esm/src/internal/supervisor.js +267 -0
- package/esm/src/interpreter/durable/DurableInterpreter.d.ts +10 -3
- package/esm/src/interpreter/durable/DurableInterpreter.d.ts.map +1 -1
- package/esm/src/interpreter/durable/DurableInterpreter.js +65 -13
- package/esm/src/interpreter/durable/ObservableCompiler.d.ts +6 -1
- package/esm/src/interpreter/durable/ObservableCompiler.d.ts.map +1 -1
- package/esm/src/interpreter/durable/Queue.js +1 -1
- package/esm/src/interpreter/durable/compilers/catch.d.ts.map +1 -1
- package/esm/src/interpreter/durable/compilers/catch.js +3 -1
- package/esm/src/interpreter/durable/compilers/fn.d.ts.map +1 -1
- package/esm/src/interpreter/durable/compilers/fn.js +29 -6
- package/esm/src/interpreter/durable/compilers/http.d.ts.map +1 -1
- package/esm/src/interpreter/durable/compilers/http.js +45 -11
- package/esm/src/interpreter/durable/compilers/schedule.d.ts.map +1 -1
- package/esm/src/interpreter/durable/compilers/schedule.js +4 -3
- package/esm/src/interpreter/durable/compilers/webhook.d.ts.map +1 -1
- package/esm/src/interpreter/durable/compilers/webhook.js +2 -0
- package/esm/src/interpreter/memory/MemoryInterpreter.d.ts +8 -1
- package/esm/src/interpreter/memory/MemoryInterpreter.d.ts.map +1 -1
- package/esm/src/interpreter/memory/MemoryInterpreter.js +56 -12
- package/esm/src/interpreter/memory/ObservableCompiler.d.ts +6 -1
- package/esm/src/interpreter/memory/ObservableCompiler.d.ts.map +1 -1
- package/esm/src/interpreter/memory/compilers/catch.d.ts.map +1 -1
- package/esm/src/interpreter/memory/compilers/catch.js +5 -0
- package/esm/src/interpreter/memory/compilers/fn.d.ts.map +1 -1
- package/esm/src/interpreter/memory/compilers/fn.js +29 -18
- package/esm/src/interpreter/memory/compilers/http.d.ts.map +1 -1
- package/esm/src/interpreter/memory/compilers/http.js +44 -10
- package/esm/src/interpreter/memory/compilers/schedule.d.ts.map +1 -1
- package/esm/src/interpreter/memory/compilers/schedule.js +61 -4
- package/esm/src/interpreter/memory/compilers/webhook.d.ts.map +1 -1
- package/esm/src/interpreter/memory/compilers/webhook.js +9 -3
- package/esm/src/interpreter/vanilla/VanillaInterpreter.d.ts +2 -1
- package/esm/src/interpreter/vanilla/VanillaInterpreter.d.ts.map +1 -1
- package/esm/src/interpreter/vanilla/VanillaInterpreter.js +41 -9
- package/esm/src/interpreter/vanilla/compilers/schedule.js +1 -1
- package/esm/src/issues/Issues.d.ts.map +1 -1
- package/esm/src/issues/Issues.js +6 -1
- package/esm/src/observability/logging/ConsoleLogger.d.ts.map +1 -1
- package/package.json +3 -1
- package/script/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts.map +1 -0
- package/script/deps/jsr.io/@std/fmt/{1.0.9 → 1.0.10}/colors.js +2 -2
- package/script/deps/jsr.io/@std/log/0.224.14/console_handler.js +1 -1
- package/script/src/connection/internal/CredentialHolder.js +1 -1
- package/script/src/connection/internal/FetchBuilder.d.ts +9 -2
- package/script/src/connection/internal/FetchBuilder.d.ts.map +1 -1
- package/script/src/connection/internal/FetchBuilder.js +147 -3
- package/script/src/context/Context.d.ts +5 -0
- package/script/src/context/Context.d.ts.map +1 -1
- package/script/src/context/Context.js +6 -0
- package/script/src/dsl/Workflow.d.ts.map +1 -1
- package/script/src/dsl/Workflow.js +2 -0
- package/script/src/dsl/http/types.d.ts +2 -0
- package/script/src/dsl/http/types.d.ts.map +1 -1
- package/script/src/dsl/http/versori/configloader.d.ts.map +1 -1
- package/script/src/dsl/http/versori/configloader.js +1 -1
- package/script/src/dsl/http/versori/cronapi.d.ts +2 -3
- package/script/src/dsl/http/versori/cronapi.d.ts.map +1 -1
- package/script/src/dsl/http/versori/cronapi.js +14 -15
- package/script/src/dsl/http/versori/kvapi/core/OpenAPI.js +1 -1
- package/script/src/dsl/triggers/WebhookTrigger.d.ts.map +1 -1
- package/script/src/dsl/triggers/WebhookTrigger.js +3 -1
- package/script/src/internal/constants.d.ts +3 -0
- package/script/src/internal/constants.d.ts.map +1 -1
- package/script/src/internal/constants.js +4 -1
- package/script/src/internal/supervisor.d.ts +23 -0
- package/script/src/internal/supervisor.d.ts.map +1 -0
- package/script/src/internal/supervisor.js +275 -0
- package/script/src/interpreter/durable/DurableInterpreter.d.ts +10 -3
- package/script/src/interpreter/durable/DurableInterpreter.d.ts.map +1 -1
- package/script/src/interpreter/durable/DurableInterpreter.js +70 -18
- package/script/src/interpreter/durable/ObservableCompiler.d.ts +6 -1
- package/script/src/interpreter/durable/ObservableCompiler.d.ts.map +1 -1
- package/script/src/interpreter/durable/Queue.js +1 -1
- package/script/src/interpreter/durable/compilers/catch.d.ts.map +1 -1
- package/script/src/interpreter/durable/compilers/catch.js +3 -1
- package/script/src/interpreter/durable/compilers/fn.d.ts.map +1 -1
- package/script/src/interpreter/durable/compilers/fn.js +28 -5
- package/script/src/interpreter/durable/compilers/http.d.ts.map +1 -1
- package/script/src/interpreter/durable/compilers/http.js +45 -11
- package/script/src/interpreter/durable/compilers/schedule.d.ts.map +1 -1
- package/script/src/interpreter/durable/compilers/schedule.js +4 -3
- package/script/src/interpreter/durable/compilers/webhook.d.ts.map +1 -1
- package/script/src/interpreter/durable/compilers/webhook.js +2 -0
- package/script/src/interpreter/memory/MemoryInterpreter.d.ts +8 -1
- package/script/src/interpreter/memory/MemoryInterpreter.d.ts.map +1 -1
- package/script/src/interpreter/memory/MemoryInterpreter.js +55 -11
- package/script/src/interpreter/memory/ObservableCompiler.d.ts +6 -1
- package/script/src/interpreter/memory/ObservableCompiler.d.ts.map +1 -1
- package/script/src/interpreter/memory/compilers/catch.d.ts.map +1 -1
- package/script/src/interpreter/memory/compilers/catch.js +5 -0
- package/script/src/interpreter/memory/compilers/fn.d.ts.map +1 -1
- package/script/src/interpreter/memory/compilers/fn.js +28 -17
- package/script/src/interpreter/memory/compilers/http.d.ts.map +1 -1
- package/script/src/interpreter/memory/compilers/http.js +44 -10
- package/script/src/interpreter/memory/compilers/schedule.d.ts.map +1 -1
- package/script/src/interpreter/memory/compilers/schedule.js +61 -4
- package/script/src/interpreter/memory/compilers/webhook.d.ts.map +1 -1
- package/script/src/interpreter/memory/compilers/webhook.js +9 -3
- package/script/src/interpreter/vanilla/VanillaInterpreter.d.ts +2 -1
- package/script/src/interpreter/vanilla/VanillaInterpreter.d.ts.map +1 -1
- package/script/src/interpreter/vanilla/VanillaInterpreter.js +41 -9
- package/script/src/interpreter/vanilla/compilers/schedule.js +1 -1
- package/script/src/issues/Issues.d.ts.map +1 -1
- package/script/src/issues/Issues.js +6 -1
- package/script/src/observability/logging/ConsoleLogger.d.ts.map +1 -1
- package/esm/deps/jsr.io/@std/fmt/1.0.9/colors.d.ts.map +0 -1
- package/esm/src/dsl/http/versori/constants.d.ts +0 -21
- package/esm/src/dsl/http/versori/constants.d.ts.map +0 -1
- package/esm/src/dsl/http/versori/constants.js +0 -38
- package/script/deps/jsr.io/@std/fmt/1.0.9/colors.d.ts.map +0 -1
- package/script/src/dsl/http/versori/constants.d.ts +0 -21
- package/script/src/dsl/http/versori/constants.d.ts.map +0 -1
- package/script/src/dsl/http/versori/constants.js +0 -41
- /package/esm/deps/jsr.io/@std/fmt/{1.0.9 → 1.0.10}/colors.d.ts +0 -0
- /package/script/deps/jsr.io/@std/fmt/{1.0.9 → 1.0.10}/colors.d.ts +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025 Versori Group Inc
|
|
3
|
+
*
|
|
4
|
+
* Use of this software is governed by the Business Source License 1.1
|
|
5
|
+
* included in the LICENSE file at the root of this repository.
|
|
6
|
+
*
|
|
7
|
+
* Change Date: 2029-01-01
|
|
8
|
+
* Change License: Apache License, Version 2.0
|
|
9
|
+
*
|
|
10
|
+
* As of the Change Date, in accordance with the Business Source License,
|
|
11
|
+
* use of this software will be governed by the Apache License, Version 2.0.
|
|
12
|
+
*/
|
|
13
|
+
import { ExportResultCode, hrTimeToMilliseconds, hrTimeToTimeStamp, } from '@opentelemetry/core';
|
|
14
|
+
import { ConsoleLogger } from '../observability/logging/ConsoleLogger.js';
|
|
15
|
+
import { ChainTask } from '../dsl/tasks/ChainTask.js';
|
|
16
|
+
import { ScheduleTrigger } from '../dsl/triggers/ScheduleTrigger.js';
|
|
17
|
+
import { WebhookTrigger } from '../dsl/triggers/WebhookTrigger.js';
|
|
18
|
+
import { DurableWorkflowTrigger } from '../dsl/triggers/DurableTrigger.js';
|
|
19
|
+
import { TaskType } from '../dsl/Task.js';
|
|
20
|
+
import { CatchTask } from '../dsl/tasks/CatchTask.js';
|
|
21
|
+
import { FnTask } from '../dsl/tasks/FnTask.js';
|
|
22
|
+
import { HttpTaskImpl } from '../dsl/tasks/HttpTask.js';
|
|
23
|
+
import { BackgroundTask } from '../dsl/tasks/BackgroundTask.js';
|
|
24
|
+
import { ParallelTask } from '../dsl/tasks/ParallelTask.js';
|
|
25
|
+
const supervisorURL = (function () {
|
|
26
|
+
return Deno.env.get('RUN_SUPERVISOR_URL') || '';
|
|
27
|
+
})();
|
|
28
|
+
export const enabled = (function () {
|
|
29
|
+
return Deno.env.get('RUN_SUPERVISOR_URL') ? true : false;
|
|
30
|
+
})();
|
|
31
|
+
const flows = (function () {
|
|
32
|
+
try {
|
|
33
|
+
const _cwd = Deno.cwd();
|
|
34
|
+
const flowsFile = Deno.readTextFileSync(_cwd + '/versori-flow.json');
|
|
35
|
+
const flows = JSON.parse(flowsFile);
|
|
36
|
+
const nodes = {};
|
|
37
|
+
for (const node of flows.nodes) {
|
|
38
|
+
nodes[node.id] = {
|
|
39
|
+
description: node?.data?.description,
|
|
40
|
+
steps: node?.data?.steps,
|
|
41
|
+
files: node?.data?.files[0],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return nodes;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
})();
|
|
50
|
+
const logger = new ConsoleLogger('debug');
|
|
51
|
+
function getTriggerData(workflow) {
|
|
52
|
+
if (workflow.trigger instanceof WebhookTrigger) {
|
|
53
|
+
return {
|
|
54
|
+
id: workflow.trigger.id,
|
|
55
|
+
type: 'webhook',
|
|
56
|
+
method: workflow.trigger.options.method || 'post',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
else if (workflow.trigger instanceof ScheduleTrigger) {
|
|
60
|
+
return {
|
|
61
|
+
id: workflow.trigger.id,
|
|
62
|
+
type: 'schedule',
|
|
63
|
+
schedule: workflow.trigger.schedule,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else if (workflow.trigger instanceof DurableWorkflowTrigger) {
|
|
67
|
+
return {
|
|
68
|
+
id: workflow.trigger.id,
|
|
69
|
+
type: 'durable',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
function getTaskData(task) {
|
|
75
|
+
let taskData = [];
|
|
76
|
+
if (task instanceof ChainTask) {
|
|
77
|
+
taskData = task.tasks.map((t) => getTaskData(t)).flat();
|
|
78
|
+
}
|
|
79
|
+
else if (task instanceof CatchTask) {
|
|
80
|
+
taskData = [...getTaskData(task._base), ...getTaskData(task._errorHandler)];
|
|
81
|
+
}
|
|
82
|
+
else if (task instanceof BackgroundTask) {
|
|
83
|
+
taskData = getTaskData(task._base);
|
|
84
|
+
}
|
|
85
|
+
else if (task instanceof ParallelTask) {
|
|
86
|
+
// I'm not sure if this is correct, but I don't think there are any ParallelTasks out in the wild yet
|
|
87
|
+
taskData = [...getTaskData(task._base), ...getTaskData(task._each)];
|
|
88
|
+
}
|
|
89
|
+
else if (task instanceof FnTask) {
|
|
90
|
+
taskData.push({
|
|
91
|
+
taskId: task.id,
|
|
92
|
+
type: task[TaskType].toLowerCase(),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else if (task instanceof HttpTaskImpl) {
|
|
96
|
+
taskData.push({
|
|
97
|
+
taskId: task.id,
|
|
98
|
+
type: task[TaskType].toLowerCase(),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// yolo
|
|
103
|
+
taskData.push({
|
|
104
|
+
taskId: String(task.id || 'unknown'),
|
|
105
|
+
type: task[TaskType].toLowerCase(),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return taskData;
|
|
109
|
+
}
|
|
110
|
+
export async function signalReady() {
|
|
111
|
+
if (!enabled) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
await fetch(`${supervisorURL}/ready`, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
logger.error('Failed to signal ready to supervisor', { error: err });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export async function registerWorkflow(workflow) {
|
|
124
|
+
if (!enabled) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const triggerData = getTriggerData(workflow);
|
|
128
|
+
const tasks = getTaskData(workflow.task);
|
|
129
|
+
try {
|
|
130
|
+
if (triggerData) {
|
|
131
|
+
const data = {
|
|
132
|
+
workflowId: triggerData.id,
|
|
133
|
+
trigger: triggerData,
|
|
134
|
+
tasks,
|
|
135
|
+
};
|
|
136
|
+
await fetch(`${supervisorURL}/register-workflow`, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
body: JSON.stringify(data),
|
|
139
|
+
headers: {
|
|
140
|
+
'Content-Type': 'application/json',
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
logger.error('Failed to register workflow with supervisor', { error: err });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function sendTaskStartEvent(taskId, ctx, span) {
|
|
150
|
+
if (!enabled) {
|
|
151
|
+
return ctx;
|
|
152
|
+
}
|
|
153
|
+
const data = {
|
|
154
|
+
taskId,
|
|
155
|
+
spanId: span.spanContext().spanId,
|
|
156
|
+
traceId: span.spanContext().traceId,
|
|
157
|
+
startTime: new Date().toISOString(), // assuming current time as start time
|
|
158
|
+
executionId: ctx.executionId,
|
|
159
|
+
workflowId: ctx.workflowId || '',
|
|
160
|
+
};
|
|
161
|
+
try {
|
|
162
|
+
const resp = await fetch(`${supervisorURL}/tasks/start`, {
|
|
163
|
+
method: 'POST',
|
|
164
|
+
body: JSON.stringify(data),
|
|
165
|
+
headers: {
|
|
166
|
+
'Content-Type': 'application/json',
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
if (resp.ok) {
|
|
170
|
+
const bodyString = await resp.text();
|
|
171
|
+
if (!bodyString) {
|
|
172
|
+
return ctx;
|
|
173
|
+
}
|
|
174
|
+
// TODO: XML, CSV yada yada
|
|
175
|
+
const respData = JSON.parse(bodyString);
|
|
176
|
+
return ctx.withData(respData);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
logger.error('Failed to send task start event to supervisor', { error: err });
|
|
181
|
+
}
|
|
182
|
+
return ctx;
|
|
183
|
+
}
|
|
184
|
+
export async function mockAPIRequest(info, cnx, options) {
|
|
185
|
+
if (!enabled) {
|
|
186
|
+
return new Response();
|
|
187
|
+
}
|
|
188
|
+
const mockRequest = {
|
|
189
|
+
url: info.toString(),
|
|
190
|
+
payload: options?.body || '',
|
|
191
|
+
method: options?.method || 'GET',
|
|
192
|
+
headers: options?.headers,
|
|
193
|
+
connection: cnx?.name,
|
|
194
|
+
connectionId: cnx?.id,
|
|
195
|
+
};
|
|
196
|
+
try {
|
|
197
|
+
const response = await fetch(`${supervisorURL}/ai/fake-fetch-call`, {
|
|
198
|
+
method: 'POST',
|
|
199
|
+
body: JSON.stringify(mockRequest),
|
|
200
|
+
headers: {
|
|
201
|
+
'Content-Type': 'application/json',
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
if (!response.ok) {
|
|
205
|
+
logger.error('Failed to mock api request', { response });
|
|
206
|
+
return new Response();
|
|
207
|
+
}
|
|
208
|
+
const text = await response.text();
|
|
209
|
+
return new Response(text);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
logger.error('Failed to mock api request', { error: err });
|
|
213
|
+
return new Response();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function printableSpan(s) {
|
|
217
|
+
const span = {
|
|
218
|
+
name: s.name,
|
|
219
|
+
startTime: hrTimeToTimeStamp(s.startTime),
|
|
220
|
+
endTime: hrTimeToTimeStamp(s.endTime),
|
|
221
|
+
duration: hrTimeToMilliseconds(s.duration),
|
|
222
|
+
attributes: s.attributes,
|
|
223
|
+
status: s.status,
|
|
224
|
+
ended: s.ended,
|
|
225
|
+
events: s.events,
|
|
226
|
+
parentSpanContext: s.parentSpanContext,
|
|
227
|
+
spanContext: s.spanContext(),
|
|
228
|
+
};
|
|
229
|
+
const nodeDetail = flows[span.attributes['task.id']]; // I know I have coded all of those as string
|
|
230
|
+
if (nodeDetail) {
|
|
231
|
+
span.attributes['description'] = nodeDetail?.description || '';
|
|
232
|
+
span.attributes['steps'] = nodeDetail?.steps || '';
|
|
233
|
+
span.attributes['files'] = nodeDetail?.files || '';
|
|
234
|
+
}
|
|
235
|
+
return span;
|
|
236
|
+
}
|
|
237
|
+
export class Fake {
|
|
238
|
+
constructor() {
|
|
239
|
+
this.export = this.export.bind(this);
|
|
240
|
+
this.shutdown = this.shutdown.bind(this);
|
|
241
|
+
this.forceFlush = this.forceFlush.bind(this);
|
|
242
|
+
}
|
|
243
|
+
export(spans, resultCallback) {
|
|
244
|
+
const ss = spans.map(printableSpan);
|
|
245
|
+
try {
|
|
246
|
+
fetch(`${supervisorURL}/receive-spans`, {
|
|
247
|
+
method: 'POST',
|
|
248
|
+
body: JSON.stringify({ spans: ss }),
|
|
249
|
+
headers: {
|
|
250
|
+
'Content-Type': 'application/json',
|
|
251
|
+
},
|
|
252
|
+
}).catch((err) => {
|
|
253
|
+
logger.error('Failed to send spans to supervisor', { error: err });
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
logger.error('Failed to send spans to supervisor', { error: err });
|
|
258
|
+
}
|
|
259
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
260
|
+
}
|
|
261
|
+
shutdown() {
|
|
262
|
+
return Promise.resolve();
|
|
263
|
+
}
|
|
264
|
+
forceFlush() {
|
|
265
|
+
return Promise.resolve();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
@@ -46,6 +46,11 @@ type Registration = {
|
|
|
46
46
|
sigintListener: () => void;
|
|
47
47
|
subscription?: Subscription;
|
|
48
48
|
};
|
|
49
|
+
type WebhookRegistry = Map<string, {
|
|
50
|
+
method: string;
|
|
51
|
+
path: string;
|
|
52
|
+
options: any;
|
|
53
|
+
}>;
|
|
49
54
|
/**
|
|
50
55
|
* DurableInterpreter is an interpreter for executing Versori workflows with support for durable, queue-based workflow
|
|
51
56
|
* execution. It supports all trigger types including the {@link workflow} trigger which allows workflows to be started
|
|
@@ -76,7 +81,8 @@ export declare class DurableInterpreter {
|
|
|
76
81
|
private readonly contextProvider;
|
|
77
82
|
private readonly webhookRouter;
|
|
78
83
|
private readonly cronRouter;
|
|
79
|
-
private
|
|
84
|
+
private cronRegistry;
|
|
85
|
+
private webhookRegistry;
|
|
80
86
|
private readonly platformApi;
|
|
81
87
|
private readonly cnxFetchFactory;
|
|
82
88
|
private readonly cronProvider;
|
|
@@ -90,9 +96,10 @@ export declare class DurableInterpreter {
|
|
|
90
96
|
private cronServer?;
|
|
91
97
|
private shutdownServer?;
|
|
92
98
|
private isShuttingDown;
|
|
93
|
-
|
|
99
|
+
private wfRegistration;
|
|
100
|
+
constructor(log: Logger, compiler: ObservableCompiler, contextProvider: ContextProvider, webhookRouter: Router, cronRouter: Router, cronRegistry: Map<string, string>, webhookRegistry: WebhookRegistry, platformApi: PlatformApi, cnxFetchFactory: DirectConnectionFactory, cronProvider: CronProvider, tracer: Tracer, issue: IssueAPI, cfgReader: ConfigReader, queueProvider: QueueAPI, otelSDK?: NodeSDK | undefined);
|
|
94
101
|
static newInstance(options?: DurableInterpreterOptions): Promise<DurableInterpreter>;
|
|
95
|
-
register<O>(workflow: Workflow<O>, options?: DurableInterpreterOptions): Registration;
|
|
102
|
+
register<O>(workflow: Workflow<O>, options?: DurableInterpreterOptions): Registration | void;
|
|
96
103
|
start(): Promise<void>;
|
|
97
104
|
stop(): Promise<void>;
|
|
98
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DurableInterpreter.d.ts","sourceRoot":"","sources":["../../../../src/src/interpreter/durable/DurableInterpreter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DurableInterpreter.d.ts","sourceRoot":"","sources":["../../../../src/src/interpreter/durable/DurableInterpreter.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,11 @@ import { CredentialsProviderImpl } from '../../connection/CredentialsProvider.js
|
|
|
20
20
|
import { DirectConnectionFactory } from '../../connection/DirectConnectionFactory.js';
|
|
21
21
|
import { ContextProviderImpl } from '../../context/ContextProvider.js';
|
|
22
22
|
import { VersoriConfigReader } from '../../dsl/http/versori/configloader.js';
|
|
23
|
-
import { envVarEnvId, envVarEnvironmentName, envVarLocalRun, envVarOrgId, envVarOrgSlug, envVarOtelTracesURL, envVarProjectId, envVarVersion, } from '../../dsl/http/versori/constants.js';
|
|
24
23
|
import { CronAPIClient } from '../../dsl/http/versori/cronapi.js';
|
|
24
|
+
import { DurableWorkflowTrigger } from '../../dsl/triggers/DurableTrigger.js';
|
|
25
25
|
import { WorkflowImpl } from '../../dsl/Workflow.js';
|
|
26
|
+
import { envCronPort, envPort, envReadyCheckURL, envVarEnvId, envVarEnvironmentName, envVarOrgId, envVarOrgSlug, envVarOtelTracesURL, envVarProjectId, envVarVersion, } from '../../internal/constants.js';
|
|
27
|
+
import { Fake, registerWorkflow, signalReady, enabled as supervisorEnabled } from '../../internal/supervisor.js';
|
|
26
28
|
import { IssueImpl } from '../../issues/Issues.js';
|
|
27
29
|
import { MemoryKeyValueProvider } from '../../kv/memory/MemoryKeyValueProvider.js';
|
|
28
30
|
import { SDKKeyValueProvider } from '../../kv/sdk/SDKKeyValueProvider.js';
|
|
@@ -30,8 +32,8 @@ import { ConsoleLogger } from '../../observability/logging/ConsoleLogger.js';
|
|
|
30
32
|
import { PlatformApiImpl } from '../../services/platform/PlatformApi.js';
|
|
31
33
|
import { ObservableCompiler } from './ObservableCompiler.js';
|
|
32
34
|
import { QueueImpl } from './Queue.js';
|
|
33
|
-
function getKVProvider(
|
|
34
|
-
if (
|
|
35
|
+
function getKVProvider() {
|
|
36
|
+
if (supervisorEnabled) {
|
|
35
37
|
return Promise.resolve(new MemoryKeyValueProvider());
|
|
36
38
|
}
|
|
37
39
|
return SDKKeyValueProvider.fromEnv();
|
|
@@ -61,7 +63,7 @@ function getKVProvider(runLocal) {
|
|
|
61
63
|
* ```
|
|
62
64
|
*/
|
|
63
65
|
export class DurableInterpreter {
|
|
64
|
-
constructor(log, compiler, contextProvider, webhookRouter, cronRouter, cronRegistry, platformApi, cnxFetchFactory, cronProvider, tracer, issue, cfgReader, queueProvider, otelSDK) {
|
|
66
|
+
constructor(log, compiler, contextProvider, webhookRouter, cronRouter, cronRegistry, webhookRegistry, platformApi, cnxFetchFactory, cronProvider, tracer, issue, cfgReader, queueProvider, otelSDK) {
|
|
65
67
|
Object.defineProperty(this, "log", {
|
|
66
68
|
enumerable: true,
|
|
67
69
|
configurable: true,
|
|
@@ -98,6 +100,12 @@ export class DurableInterpreter {
|
|
|
98
100
|
writable: true,
|
|
99
101
|
value: cronRegistry
|
|
100
102
|
});
|
|
103
|
+
Object.defineProperty(this, "webhookRegistry", {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
configurable: true,
|
|
106
|
+
writable: true,
|
|
107
|
+
value: webhookRegistry
|
|
108
|
+
});
|
|
101
109
|
Object.defineProperty(this, "platformApi", {
|
|
102
110
|
enumerable: true,
|
|
103
111
|
configurable: true,
|
|
@@ -176,6 +184,13 @@ export class DurableInterpreter {
|
|
|
176
184
|
writable: true,
|
|
177
185
|
value: false
|
|
178
186
|
});
|
|
187
|
+
// Workflow registration promises only used when supervisor is enabled
|
|
188
|
+
Object.defineProperty(this, "wfRegistration", {
|
|
189
|
+
enumerable: true,
|
|
190
|
+
configurable: true,
|
|
191
|
+
writable: true,
|
|
192
|
+
value: []
|
|
193
|
+
});
|
|
179
194
|
if (typeof this.log === 'undefined') {
|
|
180
195
|
// this captures the old way of instantiating the DurableInterpreter and provides an
|
|
181
196
|
// error message back to the user to let them know they should use the new way.
|
|
@@ -194,7 +209,6 @@ export class DurableInterpreter {
|
|
|
194
209
|
const otelTracesURL = Deno.env.get(envVarOtelTracesURL);
|
|
195
210
|
let otelSDK;
|
|
196
211
|
const configReader = VersoriConfigReader.fromEnv(log);
|
|
197
|
-
const runLocal = Deno.env.get(envVarLocalRun) === 'true';
|
|
198
212
|
await waitForReady(log);
|
|
199
213
|
// Do NOT change those attributes, they are used by the API to filter on
|
|
200
214
|
const resource = resourceFromAttributes({
|
|
@@ -216,6 +230,15 @@ export class DurableInterpreter {
|
|
|
216
230
|
log.info('Starting OpenTelemetry SDK');
|
|
217
231
|
otelSDK.start();
|
|
218
232
|
}
|
|
233
|
+
else if (supervisorEnabled) {
|
|
234
|
+
otelSDK = new NodeSDK({
|
|
235
|
+
traceExporter: new Fake(),
|
|
236
|
+
serviceName: serviceName,
|
|
237
|
+
resource: resource,
|
|
238
|
+
});
|
|
239
|
+
log.info('Starting Testing OpenTelemetry SDK');
|
|
240
|
+
otelSDK.start();
|
|
241
|
+
}
|
|
219
242
|
const tracer = opentelemetry.trace.getTracer(serviceName, version);
|
|
220
243
|
const queueProvider = await QueueImpl.fromEnv(log);
|
|
221
244
|
const connectionFactory = DirectConnectionFactory.fromEnv(log);
|
|
@@ -223,14 +246,14 @@ export class DurableInterpreter {
|
|
|
223
246
|
if (options.contextProvider) {
|
|
224
247
|
// no need to set up a key-value provider if options.contextProvider is already
|
|
225
248
|
// initialised.
|
|
226
|
-
return new DurableInterpreter(log, compiler, options.contextProvider, express.Router(), express.Router(), new Map(), PlatformApiImpl.fromEnv(), connectionFactory, CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, queueProvider, otelSDK);
|
|
249
|
+
return new DurableInterpreter(log, compiler, options.contextProvider, express.Router(), express.Router(), new Map(), new Map(), PlatformApiImpl.fromEnv(), connectionFactory, CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, queueProvider, otelSDK);
|
|
227
250
|
}
|
|
228
|
-
const kvp = await getKVProvider(
|
|
251
|
+
const kvp = await getKVProvider();
|
|
229
252
|
const platformApi = PlatformApiImpl.fromEnv();
|
|
230
253
|
const organisationId = Deno.env.get(envVarOrgId) || 'development';
|
|
231
254
|
const environmentId = Deno.env.get(envVarEnvId) || 'development';
|
|
232
255
|
const ctxProvider = new ContextProviderImpl(log, kvp, new CredentialsProviderImpl(connectionFactory.credentials, connectionFactory.tokens, connectionFactory.oauth1, configReader, platformApi), platformApi, organisationId, environmentId, issuesProvider, queueProvider);
|
|
233
|
-
return new DurableInterpreter(log, compiler, ctxProvider, express.Router(), express.Router(), new Map(), PlatformApiImpl.fromEnv(), connectionFactory, CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, queueProvider, otelSDK);
|
|
256
|
+
return new DurableInterpreter(log, compiler, ctxProvider, express.Router(), express.Router(), new Map(), new Map(), PlatformApiImpl.fromEnv(), connectionFactory, CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, queueProvider, otelSDK);
|
|
234
257
|
}
|
|
235
258
|
register(workflow, options) {
|
|
236
259
|
const localAbortController = new AbortController();
|
|
@@ -243,6 +266,13 @@ export class DurableInterpreter {
|
|
|
243
266
|
const triggerName = 'id' in workflow.trigger && typeof workflow.trigger.id === 'string'
|
|
244
267
|
? workflow.trigger.id
|
|
245
268
|
: workflow.trigger.constructor.name;
|
|
269
|
+
if (supervisorEnabled && workflow.trigger instanceof DurableWorkflowTrigger) {
|
|
270
|
+
this.log.info('Skipping durable workflow trigger registration (supervisor mode)', {
|
|
271
|
+
triggerName,
|
|
272
|
+
});
|
|
273
|
+
this.wfRegistration.push(registerWorkflow(workflow));
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
246
276
|
this.log.info('DurableInterpreter.register', { workflow, triggerName });
|
|
247
277
|
const compilerContext = {
|
|
248
278
|
compiler: this.compiler,
|
|
@@ -250,6 +280,7 @@ export class DurableInterpreter {
|
|
|
250
280
|
tracer: this.tracer,
|
|
251
281
|
contextProvider: this.contextProvider,
|
|
252
282
|
webhookRouter: this.webhookRouter,
|
|
283
|
+
webhookRegistry: this.webhookRegistry,
|
|
253
284
|
queueProvider: this.queueProvider,
|
|
254
285
|
cronRouter: this.cronRouter,
|
|
255
286
|
cronRegistry: this.cronRegistry,
|
|
@@ -272,11 +303,14 @@ export class DurableInterpreter {
|
|
|
272
303
|
},
|
|
273
304
|
};
|
|
274
305
|
this.registeredWorkflows.push(registration);
|
|
306
|
+
if (supervisorEnabled) {
|
|
307
|
+
this.wfRegistration.push(registerWorkflow(workflow));
|
|
308
|
+
}
|
|
275
309
|
return registration;
|
|
276
310
|
}
|
|
277
|
-
start() {
|
|
278
|
-
const port = Deno.env.get(
|
|
279
|
-
const cronPort = Deno.env.get(
|
|
311
|
+
async start() {
|
|
312
|
+
const port = Deno.env.get(envPort) || 3000;
|
|
313
|
+
const cronPort = Deno.env.get(envCronPort) || 3001;
|
|
280
314
|
const webhookApp = express();
|
|
281
315
|
const cronApp = express();
|
|
282
316
|
cronApp.use(express.json());
|
|
@@ -303,11 +337,18 @@ export class DurableInterpreter {
|
|
|
303
337
|
triggerName: registration.triggerName,
|
|
304
338
|
error: err instanceof Error ? err.toString() : err,
|
|
305
339
|
});
|
|
340
|
+
this.tracer.startActiveSpan('done', (span) => {
|
|
341
|
+
span.setAttribute('error.message', err instanceof Error ? err.toString() : err);
|
|
342
|
+
span.setAttribute('execution.id', ctx.executionId);
|
|
343
|
+
span.setAttribute('result', 'fail');
|
|
344
|
+
span.setAttribute('workflow.id', ctx.workflowId || 'unknown-workflow');
|
|
345
|
+
span.end();
|
|
346
|
+
});
|
|
306
347
|
try {
|
|
307
348
|
ctx.options.onError?.(ctx.withData(err));
|
|
308
349
|
}
|
|
309
350
|
catch (err) {
|
|
310
|
-
ctx.log.error('DurableInterpreter.
|
|
351
|
+
ctx.log.error('DurableInterpreter.onError: failed to call onError handler', {
|
|
311
352
|
triggerName: registration.triggerName,
|
|
312
353
|
error: err instanceof Error ? err.toString() : err,
|
|
313
354
|
});
|
|
@@ -325,6 +366,12 @@ export class DurableInterpreter {
|
|
|
325
366
|
triggerName: registration.triggerName,
|
|
326
367
|
durationMs,
|
|
327
368
|
});
|
|
369
|
+
this.tracer.startActiveSpan('done', (span) => {
|
|
370
|
+
span.setAttribute('execution.id', ctx.executionId);
|
|
371
|
+
span.setAttribute('result', 'pass');
|
|
372
|
+
span.setAttribute('workflow.id', ctx.workflowId || 'unknown-workflow');
|
|
373
|
+
span.end();
|
|
374
|
+
});
|
|
328
375
|
try {
|
|
329
376
|
ctx.options.onSuccess?.(ctx);
|
|
330
377
|
}
|
|
@@ -386,6 +433,7 @@ export class DurableInterpreter {
|
|
|
386
433
|
if (this.cronServer) {
|
|
387
434
|
this.cronServer.close();
|
|
388
435
|
}
|
|
436
|
+
this.otelSDK?.shutdown();
|
|
389
437
|
// Remove all signal listeners
|
|
390
438
|
for (const registration of this.registeredWorkflows) {
|
|
391
439
|
Deno.removeSignalListener('SIGINT', registration.sigintListener);
|
|
@@ -402,6 +450,10 @@ export class DurableInterpreter {
|
|
|
402
450
|
}
|
|
403
451
|
};
|
|
404
452
|
Deno.addSignalListener('SIGINT', this.shutdownServer);
|
|
453
|
+
if (supervisorEnabled) {
|
|
454
|
+
await Promise.all(this.wfRegistration);
|
|
455
|
+
await signalReady();
|
|
456
|
+
}
|
|
405
457
|
return new Promise((resolve) => {
|
|
406
458
|
let serversClosed = 0;
|
|
407
459
|
const totalServers = [this.webhookServer, this.cronServer].filter(Boolean).length;
|
|
@@ -438,7 +490,7 @@ export class DurableInterpreter {
|
|
|
438
490
|
}
|
|
439
491
|
}
|
|
440
492
|
async function waitForReady(log) {
|
|
441
|
-
const readyCheckUrl = Deno.env.get(
|
|
493
|
+
const readyCheckUrl = Deno.env.get(envReadyCheckURL);
|
|
442
494
|
if (!readyCheckUrl) {
|
|
443
495
|
return Promise.resolve();
|
|
444
496
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Tracer } from '@opentelemetry/api';
|
|
2
2
|
import { Router } from 'express';
|
|
3
3
|
import { Observable, OperatorFunction } from 'rxjs';
|
|
4
|
+
import { ConnectionFactory } from '../../connection/types.js';
|
|
4
5
|
import { ContextImpl } from '../../context/Context.js';
|
|
5
6
|
import { ContextProvider } from '../../context/ContextProvider.js';
|
|
6
7
|
import { ConfigReader } from '../../dsl/http/types.js';
|
|
@@ -11,7 +12,6 @@ import { Logger } from '../../observability/logging/Logger.js';
|
|
|
11
12
|
import { PlatformApi } from '../../services/platform/mod.js';
|
|
12
13
|
import { ContextOperatorFunction, TaskCompiler, TriggerCompiler } from './compilers/types.js';
|
|
13
14
|
import { QueueAPI } from './Queue.js';
|
|
14
|
-
import { ConnectionFactory } from '../../connection/types.js';
|
|
15
15
|
export type DurableCompilerContext = {
|
|
16
16
|
compiler: ObservableCompiler;
|
|
17
17
|
log: Logger;
|
|
@@ -22,6 +22,11 @@ export type DurableCompilerContext = {
|
|
|
22
22
|
queueProvider: QueueAPI;
|
|
23
23
|
issueProvider: IssueAPI;
|
|
24
24
|
webhookRouter: Router;
|
|
25
|
+
webhookRegistry: Map<string, {
|
|
26
|
+
method: string;
|
|
27
|
+
path: string;
|
|
28
|
+
options: any;
|
|
29
|
+
}>;
|
|
25
30
|
cronRouter: Router;
|
|
26
31
|
configReader: ConfigReader;
|
|
27
32
|
cronRegistry: Map<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservableCompiler.d.ts","sourceRoot":"","sources":["../../../../src/src/interpreter/durable/ObservableCompiler.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAY,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAe,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAU7D,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG9F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ObservableCompiler.d.ts","sourceRoot":"","sources":["../../../../src/src/interpreter/durable/ObservableCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* As of the Change Date, in accordance with the Business Source License,
|
|
11
11
|
* use of this software will be governed by the Apache License, Version 2.0.
|
|
12
12
|
*/
|
|
13
|
-
import { envVarEnvId, envVarProjectId, envVarSDKApiBaseURL, } from '../../
|
|
13
|
+
import { envVarEnvId, envVarProjectId, envVarSDKApiBaseURL, } from '../../internal/constants.js';
|
|
14
14
|
import { ConsoleLogger } from '../../mod.js';
|
|
15
15
|
export class QueueImpl {
|
|
16
16
|
constructor(baseUrl, projectId, environmentId, log) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catch.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/catch.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"catch.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/catch.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAyFnE,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAGrE,CAAC"}
|
|
@@ -22,7 +22,9 @@ function compileCatch(compilerCtx, task) {
|
|
|
22
22
|
return compilerCtx.tracer.startActiveSpan(`catch`, (span) => {
|
|
23
23
|
span.setAttribute('execution.id', ctx.executionId);
|
|
24
24
|
span.setAttribute('task.type', 'catch');
|
|
25
|
+
span.setAttribute('type', 'task');
|
|
25
26
|
if (error instanceof Error) {
|
|
27
|
+
span.setAttribute('status', 'fail');
|
|
26
28
|
span.recordException(error);
|
|
27
29
|
span.setAttribute('error.message', error.message);
|
|
28
30
|
span.setAttribute('error.stack', error.stack ?? '');
|
|
@@ -60,7 +62,7 @@ function compileCatch(compilerCtx, task) {
|
|
|
60
62
|
reason: 'error',
|
|
61
63
|
severity: 'low',
|
|
62
64
|
});
|
|
63
|
-
span.setAttribute('
|
|
65
|
+
span.setAttribute('status', 'fail');
|
|
64
66
|
span.end();
|
|
65
67
|
return errorOperator(of(ctx.withData(new ExecutionError(ctx, `${error}`, { cause: error }), { recoveredFromCatch: true })));
|
|
66
68
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fn.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/fn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fn.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/fn.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAGtD,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAoDnE,eAAO,MAAM,UAAU,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAG/D,CAAC"}
|
|
@@ -10,20 +10,43 @@
|
|
|
10
10
|
* As of the Change Date, in accordance with the Business Source License,
|
|
11
11
|
* use of this software will be governed by the Apache License, Version 2.0.
|
|
12
12
|
*/
|
|
13
|
-
import { mergeMap
|
|
13
|
+
import { mergeMap } from 'rxjs';
|
|
14
14
|
import { FnTask } from '../../../dsl/tasks/FnTask.js';
|
|
15
|
+
import { sendTaskStartEvent, enabled as supervisorEnabled } from '../../../internal/supervisor.js';
|
|
15
16
|
function compileFn(compilerCtx, task) {
|
|
16
|
-
return (src) => src.pipe(
|
|
17
|
-
complete: () => compilerCtx.log.debug('fn.complete'),
|
|
18
|
-
}), mergeMap(async (ctx) => {
|
|
17
|
+
return (src) => src.pipe(mergeMap(async (ctx) => {
|
|
19
18
|
return await compilerCtx.tracer.startActiveSpan(`fn-${task.id}`, async (span) => {
|
|
19
|
+
await sendTaskStartEvent(task.id, ctx, span);
|
|
20
20
|
span.setAttribute('task.id', task.id);
|
|
21
|
+
span.setAttribute('type', 'task');
|
|
22
|
+
span.setAttribute('task.type', 'fn');
|
|
21
23
|
span.setAttribute('execution.id', ctx.executionId);
|
|
24
|
+
span.setAttribute('workflow.id', ctx.options.workflowId || 'unknown-workflow');
|
|
22
25
|
try {
|
|
26
|
+
const spanContext = span.spanContext();
|
|
27
|
+
const ctxWithLogger = ctx.withLogger(ctx.log.child({ spanId: spanContext.spanId, traceId: spanContext.traceId }));
|
|
28
|
+
let result;
|
|
23
29
|
if (typeof ctx.idx === 'number') {
|
|
24
|
-
|
|
30
|
+
result = ctx.withData(await task._fn(ctxWithLogger, ctx.idx));
|
|
25
31
|
}
|
|
26
|
-
|
|
32
|
+
else {
|
|
33
|
+
result = ctx.withData(await task._fn(ctxWithLogger));
|
|
34
|
+
}
|
|
35
|
+
if (supervisorEnabled) {
|
|
36
|
+
span.setAttribute('response.body', JSON.stringify(result.data));
|
|
37
|
+
}
|
|
38
|
+
span.setAttribute('status', 'pass');
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof Error) {
|
|
43
|
+
span.setAttribute('status', 'fail');
|
|
44
|
+
span.recordException(error);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
span.recordException(new Error(String(error)));
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
27
50
|
}
|
|
28
51
|
finally {
|
|
29
52
|
span.end();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/http.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAmB,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAG/E,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAyHnE,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAG5E,CAAC"}
|