@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.
Files changed (143) hide show
  1. package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts.map +1 -0
  2. package/esm/deps/jsr.io/@std/fmt/{1.0.9 → 1.0.10}/colors.js +2 -2
  3. package/esm/deps/jsr.io/@std/log/0.224.14/console_handler.js +1 -1
  4. package/esm/src/connection/internal/CredentialHolder.js +1 -1
  5. package/esm/src/connection/internal/FetchBuilder.d.ts +9 -2
  6. package/esm/src/connection/internal/FetchBuilder.d.ts.map +1 -1
  7. package/esm/src/connection/internal/FetchBuilder.js +124 -3
  8. package/esm/src/context/Context.d.ts +5 -0
  9. package/esm/src/context/Context.d.ts.map +1 -1
  10. package/esm/src/context/Context.js +6 -0
  11. package/esm/src/dsl/Workflow.d.ts.map +1 -1
  12. package/esm/src/dsl/Workflow.js +2 -0
  13. package/esm/src/dsl/http/types.d.ts +2 -0
  14. package/esm/src/dsl/http/types.d.ts.map +1 -1
  15. package/esm/src/dsl/http/versori/configloader.d.ts.map +1 -1
  16. package/esm/src/dsl/http/versori/configloader.js +1 -1
  17. package/esm/src/dsl/http/versori/cronapi.d.ts +2 -3
  18. package/esm/src/dsl/http/versori/cronapi.d.ts.map +1 -1
  19. package/esm/src/dsl/http/versori/cronapi.js +14 -15
  20. package/esm/src/dsl/http/versori/kvapi/core/OpenAPI.js +1 -1
  21. package/esm/src/dsl/triggers/WebhookTrigger.d.ts.map +1 -1
  22. package/esm/src/dsl/triggers/WebhookTrigger.js +3 -1
  23. package/esm/src/internal/constants.d.ts +3 -0
  24. package/esm/src/internal/constants.d.ts.map +1 -1
  25. package/esm/src/internal/constants.js +3 -0
  26. package/esm/src/internal/supervisor.d.ts +23 -0
  27. package/esm/src/internal/supervisor.d.ts.map +1 -0
  28. package/esm/src/internal/supervisor.js +267 -0
  29. package/esm/src/interpreter/durable/DurableInterpreter.d.ts +10 -3
  30. package/esm/src/interpreter/durable/DurableInterpreter.d.ts.map +1 -1
  31. package/esm/src/interpreter/durable/DurableInterpreter.js +65 -13
  32. package/esm/src/interpreter/durable/ObservableCompiler.d.ts +6 -1
  33. package/esm/src/interpreter/durable/ObservableCompiler.d.ts.map +1 -1
  34. package/esm/src/interpreter/durable/Queue.js +1 -1
  35. package/esm/src/interpreter/durable/compilers/catch.d.ts.map +1 -1
  36. package/esm/src/interpreter/durable/compilers/catch.js +3 -1
  37. package/esm/src/interpreter/durable/compilers/fn.d.ts.map +1 -1
  38. package/esm/src/interpreter/durable/compilers/fn.js +29 -6
  39. package/esm/src/interpreter/durable/compilers/http.d.ts.map +1 -1
  40. package/esm/src/interpreter/durable/compilers/http.js +45 -11
  41. package/esm/src/interpreter/durable/compilers/schedule.d.ts.map +1 -1
  42. package/esm/src/interpreter/durable/compilers/schedule.js +4 -3
  43. package/esm/src/interpreter/durable/compilers/webhook.d.ts.map +1 -1
  44. package/esm/src/interpreter/durable/compilers/webhook.js +2 -0
  45. package/esm/src/interpreter/memory/MemoryInterpreter.d.ts +8 -1
  46. package/esm/src/interpreter/memory/MemoryInterpreter.d.ts.map +1 -1
  47. package/esm/src/interpreter/memory/MemoryInterpreter.js +56 -12
  48. package/esm/src/interpreter/memory/ObservableCompiler.d.ts +6 -1
  49. package/esm/src/interpreter/memory/ObservableCompiler.d.ts.map +1 -1
  50. package/esm/src/interpreter/memory/compilers/catch.d.ts.map +1 -1
  51. package/esm/src/interpreter/memory/compilers/catch.js +5 -0
  52. package/esm/src/interpreter/memory/compilers/fn.d.ts.map +1 -1
  53. package/esm/src/interpreter/memory/compilers/fn.js +29 -18
  54. package/esm/src/interpreter/memory/compilers/http.d.ts.map +1 -1
  55. package/esm/src/interpreter/memory/compilers/http.js +44 -10
  56. package/esm/src/interpreter/memory/compilers/schedule.d.ts.map +1 -1
  57. package/esm/src/interpreter/memory/compilers/schedule.js +61 -4
  58. package/esm/src/interpreter/memory/compilers/webhook.d.ts.map +1 -1
  59. package/esm/src/interpreter/memory/compilers/webhook.js +9 -3
  60. package/esm/src/interpreter/vanilla/VanillaInterpreter.d.ts +2 -1
  61. package/esm/src/interpreter/vanilla/VanillaInterpreter.d.ts.map +1 -1
  62. package/esm/src/interpreter/vanilla/VanillaInterpreter.js +41 -9
  63. package/esm/src/interpreter/vanilla/compilers/schedule.js +1 -1
  64. package/esm/src/issues/Issues.d.ts.map +1 -1
  65. package/esm/src/issues/Issues.js +6 -1
  66. package/esm/src/observability/logging/ConsoleLogger.d.ts.map +1 -1
  67. package/package.json +3 -1
  68. package/script/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts.map +1 -0
  69. package/script/deps/jsr.io/@std/fmt/{1.0.9 → 1.0.10}/colors.js +2 -2
  70. package/script/deps/jsr.io/@std/log/0.224.14/console_handler.js +1 -1
  71. package/script/src/connection/internal/CredentialHolder.js +1 -1
  72. package/script/src/connection/internal/FetchBuilder.d.ts +9 -2
  73. package/script/src/connection/internal/FetchBuilder.d.ts.map +1 -1
  74. package/script/src/connection/internal/FetchBuilder.js +147 -3
  75. package/script/src/context/Context.d.ts +5 -0
  76. package/script/src/context/Context.d.ts.map +1 -1
  77. package/script/src/context/Context.js +6 -0
  78. package/script/src/dsl/Workflow.d.ts.map +1 -1
  79. package/script/src/dsl/Workflow.js +2 -0
  80. package/script/src/dsl/http/types.d.ts +2 -0
  81. package/script/src/dsl/http/types.d.ts.map +1 -1
  82. package/script/src/dsl/http/versori/configloader.d.ts.map +1 -1
  83. package/script/src/dsl/http/versori/configloader.js +1 -1
  84. package/script/src/dsl/http/versori/cronapi.d.ts +2 -3
  85. package/script/src/dsl/http/versori/cronapi.d.ts.map +1 -1
  86. package/script/src/dsl/http/versori/cronapi.js +14 -15
  87. package/script/src/dsl/http/versori/kvapi/core/OpenAPI.js +1 -1
  88. package/script/src/dsl/triggers/WebhookTrigger.d.ts.map +1 -1
  89. package/script/src/dsl/triggers/WebhookTrigger.js +3 -1
  90. package/script/src/internal/constants.d.ts +3 -0
  91. package/script/src/internal/constants.d.ts.map +1 -1
  92. package/script/src/internal/constants.js +4 -1
  93. package/script/src/internal/supervisor.d.ts +23 -0
  94. package/script/src/internal/supervisor.d.ts.map +1 -0
  95. package/script/src/internal/supervisor.js +275 -0
  96. package/script/src/interpreter/durable/DurableInterpreter.d.ts +10 -3
  97. package/script/src/interpreter/durable/DurableInterpreter.d.ts.map +1 -1
  98. package/script/src/interpreter/durable/DurableInterpreter.js +70 -18
  99. package/script/src/interpreter/durable/ObservableCompiler.d.ts +6 -1
  100. package/script/src/interpreter/durable/ObservableCompiler.d.ts.map +1 -1
  101. package/script/src/interpreter/durable/Queue.js +1 -1
  102. package/script/src/interpreter/durable/compilers/catch.d.ts.map +1 -1
  103. package/script/src/interpreter/durable/compilers/catch.js +3 -1
  104. package/script/src/interpreter/durable/compilers/fn.d.ts.map +1 -1
  105. package/script/src/interpreter/durable/compilers/fn.js +28 -5
  106. package/script/src/interpreter/durable/compilers/http.d.ts.map +1 -1
  107. package/script/src/interpreter/durable/compilers/http.js +45 -11
  108. package/script/src/interpreter/durable/compilers/schedule.d.ts.map +1 -1
  109. package/script/src/interpreter/durable/compilers/schedule.js +4 -3
  110. package/script/src/interpreter/durable/compilers/webhook.d.ts.map +1 -1
  111. package/script/src/interpreter/durable/compilers/webhook.js +2 -0
  112. package/script/src/interpreter/memory/MemoryInterpreter.d.ts +8 -1
  113. package/script/src/interpreter/memory/MemoryInterpreter.d.ts.map +1 -1
  114. package/script/src/interpreter/memory/MemoryInterpreter.js +55 -11
  115. package/script/src/interpreter/memory/ObservableCompiler.d.ts +6 -1
  116. package/script/src/interpreter/memory/ObservableCompiler.d.ts.map +1 -1
  117. package/script/src/interpreter/memory/compilers/catch.d.ts.map +1 -1
  118. package/script/src/interpreter/memory/compilers/catch.js +5 -0
  119. package/script/src/interpreter/memory/compilers/fn.d.ts.map +1 -1
  120. package/script/src/interpreter/memory/compilers/fn.js +28 -17
  121. package/script/src/interpreter/memory/compilers/http.d.ts.map +1 -1
  122. package/script/src/interpreter/memory/compilers/http.js +44 -10
  123. package/script/src/interpreter/memory/compilers/schedule.d.ts.map +1 -1
  124. package/script/src/interpreter/memory/compilers/schedule.js +61 -4
  125. package/script/src/interpreter/memory/compilers/webhook.d.ts.map +1 -1
  126. package/script/src/interpreter/memory/compilers/webhook.js +9 -3
  127. package/script/src/interpreter/vanilla/VanillaInterpreter.d.ts +2 -1
  128. package/script/src/interpreter/vanilla/VanillaInterpreter.d.ts.map +1 -1
  129. package/script/src/interpreter/vanilla/VanillaInterpreter.js +41 -9
  130. package/script/src/interpreter/vanilla/compilers/schedule.js +1 -1
  131. package/script/src/issues/Issues.d.ts.map +1 -1
  132. package/script/src/issues/Issues.js +6 -1
  133. package/script/src/observability/logging/ConsoleLogger.d.ts.map +1 -1
  134. package/esm/deps/jsr.io/@std/fmt/1.0.9/colors.d.ts.map +0 -1
  135. package/esm/src/dsl/http/versori/constants.d.ts +0 -21
  136. package/esm/src/dsl/http/versori/constants.d.ts.map +0 -1
  137. package/esm/src/dsl/http/versori/constants.js +0 -38
  138. package/script/deps/jsr.io/@std/fmt/1.0.9/colors.d.ts.map +0 -1
  139. package/script/src/dsl/http/versori/constants.d.ts +0 -21
  140. package/script/src/dsl/http/versori/constants.d.ts.map +0 -1
  141. package/script/src/dsl/http/versori/constants.js +0 -41
  142. /package/esm/deps/jsr.io/@std/fmt/{1.0.9 → 1.0.10}/colors.d.ts +0 -0
  143. /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 readonly cronRegistry;
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
- constructor(log: Logger, compiler: ObservableCompiler, contextProvider: ContextProvider, webhookRouter: Router, cronRouter: Router, cronRegistry: Map<string, string>, platformApi: PlatformApi, cnxFetchFactory: DirectConnectionFactory, cronProvider: CronProvider, tracer: Tracer, issue: IssueAPI, cfgReader: ConfigReader, queueProvider: QueueAPI, otelSDK?: NodeSDK | undefined);
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":"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"}
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(runLocal) {
34
- if (runLocal) {
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(runLocal);
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('PORT') || 3000;
279
- const cronPort = Deno.env.get('CRON_PORT') || 3001;
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.onErrorError: failed to call onError handler', {
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('READY_CHECK_URL');
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;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,MAAM,sBAAsB,GAAG;IACjC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,QAAQ,CAAC;IACxB,aAAa,EAAE,QAAQ,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CACrF,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,CAAC,KACN,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAE/B,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,gBAAgB,CAAgD;;IAkBxE,WAAW,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI,EACzC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,GACpB,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC;IAe1C,cAAc,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAC3D,GAAG,EAAE,sBAAsB,EAC3B,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,WAAW,GACpB,UAAU,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAerC,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAKjF,eAAe,CAAC,GAAG,EAAE,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;CAIjF"}
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 '../../dsl/http/versori/constants.js';
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;AAuFnE,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAGrE,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('error', `${error}`);
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":"AAgBA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEtD,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAiCnE,eAAO,MAAM,UAAU,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAG/D,CAAC"}
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, tap } from 'rxjs';
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(tap({
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
- return ctx.withData(await task._fn(ctx, ctx.idx));
30
+ result = ctx.withData(await task._fn(ctxWithLogger, ctx.idx));
25
31
  }
26
- return ctx.withData(await task._fn(ctx));
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":"AAiBA,OAAO,EAAmB,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE/E,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAwFnE,eAAO,MAAM,YAAY,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAG5E,CAAC"}
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"}