@versori/run 0.5.9 → 0.6.0-alpha.1

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 (133) hide show
  1. package/esm/src/connection/internal/CredentialHolder.js +1 -1
  2. package/esm/src/connection/internal/FetchBuilder.d.ts +9 -2
  3. package/esm/src/connection/internal/FetchBuilder.d.ts.map +1 -1
  4. package/esm/src/connection/internal/FetchBuilder.js +124 -3
  5. package/esm/src/context/Context.d.ts +5 -0
  6. package/esm/src/context/Context.d.ts.map +1 -1
  7. package/esm/src/context/Context.js +6 -0
  8. package/esm/src/dsl/Workflow.d.ts.map +1 -1
  9. package/esm/src/dsl/Workflow.js +2 -0
  10. package/esm/src/dsl/http/types.d.ts +2 -0
  11. package/esm/src/dsl/http/types.d.ts.map +1 -1
  12. package/esm/src/dsl/http/versori/configloader.d.ts.map +1 -1
  13. package/esm/src/dsl/http/versori/configloader.js +1 -1
  14. package/esm/src/dsl/http/versori/cronapi.d.ts +2 -3
  15. package/esm/src/dsl/http/versori/cronapi.d.ts.map +1 -1
  16. package/esm/src/dsl/http/versori/cronapi.js +14 -15
  17. package/esm/src/dsl/http/versori/kvapi/core/OpenAPI.js +1 -1
  18. package/esm/src/dsl/triggers/WebhookTrigger.d.ts.map +1 -1
  19. package/esm/src/dsl/triggers/WebhookTrigger.js +3 -1
  20. package/esm/src/internal/constants.d.ts +3 -0
  21. package/esm/src/internal/constants.d.ts.map +1 -1
  22. package/esm/src/internal/constants.js +3 -0
  23. package/esm/src/internal/supervisor.d.ts +23 -0
  24. package/esm/src/internal/supervisor.d.ts.map +1 -0
  25. package/esm/src/internal/supervisor.js +267 -0
  26. package/esm/src/interpreter/durable/DurableInterpreter.d.ts +9 -2
  27. package/esm/src/interpreter/durable/DurableInterpreter.d.ts.map +1 -1
  28. package/esm/src/interpreter/durable/DurableInterpreter.js +57 -13
  29. package/esm/src/interpreter/durable/ObservableCompiler.d.ts +6 -1
  30. package/esm/src/interpreter/durable/ObservableCompiler.d.ts.map +1 -1
  31. package/esm/src/interpreter/durable/Queue.js +1 -1
  32. package/esm/src/interpreter/durable/compilers/catch.d.ts.map +1 -1
  33. package/esm/src/interpreter/durable/compilers/catch.js +3 -1
  34. package/esm/src/interpreter/durable/compilers/fn.d.ts.map +1 -1
  35. package/esm/src/interpreter/durable/compilers/fn.js +29 -6
  36. package/esm/src/interpreter/durable/compilers/http.d.ts.map +1 -1
  37. package/esm/src/interpreter/durable/compilers/http.js +45 -11
  38. package/esm/src/interpreter/durable/compilers/schedule.d.ts.map +1 -1
  39. package/esm/src/interpreter/durable/compilers/schedule.js +4 -3
  40. package/esm/src/interpreter/durable/compilers/webhook.d.ts.map +1 -1
  41. package/esm/src/interpreter/durable/compilers/webhook.js +2 -0
  42. package/esm/src/interpreter/memory/MemoryInterpreter.d.ts +8 -1
  43. package/esm/src/interpreter/memory/MemoryInterpreter.d.ts.map +1 -1
  44. package/esm/src/interpreter/memory/MemoryInterpreter.js +56 -12
  45. package/esm/src/interpreter/memory/ObservableCompiler.d.ts +6 -1
  46. package/esm/src/interpreter/memory/ObservableCompiler.d.ts.map +1 -1
  47. package/esm/src/interpreter/memory/compilers/catch.d.ts.map +1 -1
  48. package/esm/src/interpreter/memory/compilers/catch.js +5 -0
  49. package/esm/src/interpreter/memory/compilers/fn.d.ts.map +1 -1
  50. package/esm/src/interpreter/memory/compilers/fn.js +29 -18
  51. package/esm/src/interpreter/memory/compilers/http.d.ts.map +1 -1
  52. package/esm/src/interpreter/memory/compilers/http.js +44 -10
  53. package/esm/src/interpreter/memory/compilers/schedule.d.ts.map +1 -1
  54. package/esm/src/interpreter/memory/compilers/schedule.js +61 -4
  55. package/esm/src/interpreter/memory/compilers/webhook.d.ts.map +1 -1
  56. package/esm/src/interpreter/memory/compilers/webhook.js +9 -3
  57. package/esm/src/interpreter/vanilla/VanillaInterpreter.d.ts +1 -0
  58. package/esm/src/interpreter/vanilla/VanillaInterpreter.d.ts.map +1 -1
  59. package/esm/src/interpreter/vanilla/VanillaInterpreter.js +30 -6
  60. package/esm/src/interpreter/vanilla/compilers/schedule.js +1 -1
  61. package/esm/src/issues/Issues.d.ts.map +1 -1
  62. package/esm/src/issues/Issues.js +6 -1
  63. package/esm/src/observability/logging/ConsoleLogger.d.ts.map +1 -1
  64. package/package.json +3 -1
  65. package/script/src/connection/internal/CredentialHolder.js +1 -1
  66. package/script/src/connection/internal/FetchBuilder.d.ts +9 -2
  67. package/script/src/connection/internal/FetchBuilder.d.ts.map +1 -1
  68. package/script/src/connection/internal/FetchBuilder.js +147 -3
  69. package/script/src/context/Context.d.ts +5 -0
  70. package/script/src/context/Context.d.ts.map +1 -1
  71. package/script/src/context/Context.js +6 -0
  72. package/script/src/dsl/Workflow.d.ts.map +1 -1
  73. package/script/src/dsl/Workflow.js +2 -0
  74. package/script/src/dsl/http/types.d.ts +2 -0
  75. package/script/src/dsl/http/types.d.ts.map +1 -1
  76. package/script/src/dsl/http/versori/configloader.d.ts.map +1 -1
  77. package/script/src/dsl/http/versori/configloader.js +1 -1
  78. package/script/src/dsl/http/versori/cronapi.d.ts +2 -3
  79. package/script/src/dsl/http/versori/cronapi.d.ts.map +1 -1
  80. package/script/src/dsl/http/versori/cronapi.js +14 -15
  81. package/script/src/dsl/http/versori/kvapi/core/OpenAPI.js +1 -1
  82. package/script/src/dsl/triggers/WebhookTrigger.d.ts.map +1 -1
  83. package/script/src/dsl/triggers/WebhookTrigger.js +3 -1
  84. package/script/src/internal/constants.d.ts +3 -0
  85. package/script/src/internal/constants.d.ts.map +1 -1
  86. package/script/src/internal/constants.js +4 -1
  87. package/script/src/internal/supervisor.d.ts +23 -0
  88. package/script/src/internal/supervisor.d.ts.map +1 -0
  89. package/script/src/internal/supervisor.js +275 -0
  90. package/script/src/interpreter/durable/DurableInterpreter.d.ts +9 -2
  91. package/script/src/interpreter/durable/DurableInterpreter.d.ts.map +1 -1
  92. package/script/src/interpreter/durable/DurableInterpreter.js +62 -18
  93. package/script/src/interpreter/durable/ObservableCompiler.d.ts +6 -1
  94. package/script/src/interpreter/durable/ObservableCompiler.d.ts.map +1 -1
  95. package/script/src/interpreter/durable/Queue.js +1 -1
  96. package/script/src/interpreter/durable/compilers/catch.d.ts.map +1 -1
  97. package/script/src/interpreter/durable/compilers/catch.js +3 -1
  98. package/script/src/interpreter/durable/compilers/fn.d.ts.map +1 -1
  99. package/script/src/interpreter/durable/compilers/fn.js +28 -5
  100. package/script/src/interpreter/durable/compilers/http.d.ts.map +1 -1
  101. package/script/src/interpreter/durable/compilers/http.js +45 -11
  102. package/script/src/interpreter/durable/compilers/schedule.d.ts.map +1 -1
  103. package/script/src/interpreter/durable/compilers/schedule.js +4 -3
  104. package/script/src/interpreter/durable/compilers/webhook.d.ts.map +1 -1
  105. package/script/src/interpreter/durable/compilers/webhook.js +2 -0
  106. package/script/src/interpreter/memory/MemoryInterpreter.d.ts +8 -1
  107. package/script/src/interpreter/memory/MemoryInterpreter.d.ts.map +1 -1
  108. package/script/src/interpreter/memory/MemoryInterpreter.js +55 -11
  109. package/script/src/interpreter/memory/ObservableCompiler.d.ts +6 -1
  110. package/script/src/interpreter/memory/ObservableCompiler.d.ts.map +1 -1
  111. package/script/src/interpreter/memory/compilers/catch.d.ts.map +1 -1
  112. package/script/src/interpreter/memory/compilers/catch.js +5 -0
  113. package/script/src/interpreter/memory/compilers/fn.d.ts.map +1 -1
  114. package/script/src/interpreter/memory/compilers/fn.js +28 -17
  115. package/script/src/interpreter/memory/compilers/http.d.ts.map +1 -1
  116. package/script/src/interpreter/memory/compilers/http.js +44 -10
  117. package/script/src/interpreter/memory/compilers/schedule.d.ts.map +1 -1
  118. package/script/src/interpreter/memory/compilers/schedule.js +61 -4
  119. package/script/src/interpreter/memory/compilers/webhook.d.ts.map +1 -1
  120. package/script/src/interpreter/memory/compilers/webhook.js +9 -3
  121. package/script/src/interpreter/vanilla/VanillaInterpreter.d.ts +1 -0
  122. package/script/src/interpreter/vanilla/VanillaInterpreter.d.ts.map +1 -1
  123. package/script/src/interpreter/vanilla/VanillaInterpreter.js +30 -6
  124. package/script/src/interpreter/vanilla/compilers/schedule.js +1 -1
  125. package/script/src/issues/Issues.d.ts.map +1 -1
  126. package/script/src/issues/Issues.js +6 -1
  127. package/script/src/observability/logging/ConsoleLogger.d.ts.map +1 -1
  128. package/esm/src/dsl/http/versori/constants.d.ts +0 -21
  129. package/esm/src/dsl/http/versori/constants.d.ts.map +0 -1
  130. package/esm/src/dsl/http/versori/constants.js +0 -38
  131. package/script/src/dsl/http/versori/constants.d.ts +0 -21
  132. package/script/src/dsl/http/versori/constants.d.ts.map +0 -1
  133. package/script/src/dsl/http/versori/constants.js +0 -41
@@ -11,19 +11,32 @@
11
11
  * use of this software will be governed by the Apache License, Version 2.0.
12
12
  */
13
13
  import { mergeMap } from 'rxjs';
14
- import { tap } from 'rxjs/operators';
15
- import { HttpContextImpl, HttpTaskImpl } from '../../../dsl/tasks/HttpTask.js';
16
14
  import { DynamicFetchFactory } from '../../../connection/DynamicFetchFactory.js';
15
+ import { FetchBuilder } from '../../../connection/internal/FetchBuilder.js';
17
16
  import { StaticFetchFactory } from '../../../connection/StaticFetchFactory.js';
17
+ import { HttpContextImpl, HttpTaskImpl } from '../../../dsl/tasks/HttpTask.js';
18
+ import { sendTaskStartEvent, enabled as supervisorEnabled } from '../../../internal/supervisor.js';
18
19
  function compileHttp(compilerCtx, task) {
19
20
  const cnxMap = compilerCtx.configReader.getCnxMapping(task.opts.connection);
20
21
  let fetchFactory;
21
22
  if (!cnxMap) {
22
- compilerCtx.log.error(`Connection ${task.opts.connection} not found, using default fetch with no credentials`);
23
- fetchFactory = Promise.resolve(new StaticFetchFactory(globalThis.fetch));
23
+ compilerCtx.log.warn(`Connection ${task.opts.connection} not found, using default fetch with no credentials`);
24
+ if (supervisorEnabled) {
25
+ // missing connection map and we are in supervised mode, so we use the fake fetcher
26
+ fetchFactory = Promise.resolve(new StaticFetchFactory(new FetchBuilder(globalThis.fetch, { name: task.opts.connection }).buildSupervisedFetch()));
27
+ }
28
+ else {
29
+ // missing connection map and not in supervised mode, so we use global fetch
30
+ fetchFactory = Promise.resolve(new StaticFetchFactory(globalThis.fetch));
31
+ }
24
32
  }
25
33
  else if (cnxMap.dynamic) {
26
- fetchFactory = Promise.resolve(new DynamicFetchFactory(compilerCtx.cnxFactory, compilerCtx.platformApi, compilerCtx.organisationId, cnxMap.templateId));
34
+ if (cnxMap.mockWithAI) {
35
+ fetchFactory = Promise.resolve(new StaticFetchFactory(new FetchBuilder(globalThis.fetch, { name: task.opts.connection }).buildSupervisedFetch()));
36
+ }
37
+ else {
38
+ fetchFactory = Promise.resolve(new DynamicFetchFactory(compilerCtx.cnxFactory, compilerCtx.platformApi, compilerCtx.organisationId, cnxMap.templateId));
39
+ }
27
40
  }
28
41
  else {
29
42
  fetchFactory = compilerCtx.platformApi.getConnection({
@@ -33,8 +46,21 @@ function compileHttp(compilerCtx, task) {
33
46
  },
34
47
  throwOnError: true,
35
48
  })
36
- .then(({ data }) => Promise.all([compilerCtx.cnxFactory.fetcher(data), data.baseUrl ?? '']))
37
- .then(([fetcher, baseUrl]) => new StaticFetchFactory(fetcher, baseUrl));
49
+ .then(({ data }) => {
50
+ if (cnxMap.mockWithAI) {
51
+ // use the fake fetcher that calls the supervisor to generate a mock reponse
52
+ return new StaticFetchFactory(new FetchBuilder(globalThis.fetch, data).buildSupervisedFetch());
53
+ }
54
+ return Promise.all([compilerCtx.cnxFactory.fetcher(data), data.baseUrl ?? ''])
55
+ .then(([fetcher, baseUrl]) => new StaticFetchFactory(fetcher, baseUrl));
56
+ })
57
+ .catch((err) => {
58
+ compilerCtx.log.error(`Failed to get connection ${task.opts.connection}`, err);
59
+ if (supervisorEnabled) {
60
+ return new StaticFetchFactory(new FetchBuilder(globalThis.fetch, { name: task.opts.connection }).build());
61
+ }
62
+ throw err;
63
+ });
38
64
  }
39
65
  async function http(ctx) {
40
66
  const [fetch, baseUrl] = await fetchFactory.then((ff) => Promise.all([ff.fetcher(ctx), ff.baseUrl(ctx)]));
@@ -42,19 +68,27 @@ function compileHttp(compilerCtx, task) {
42
68
  const result = await task.fn(httpContext);
43
69
  return ctx.withData(result);
44
70
  }
45
- return (src) => src.pipe(tap({
46
- complete: () => compilerCtx.log.debug('http.complete'),
47
- }), mergeMap((ctx) => {
71
+ return (src) => src.pipe(mergeMap((ctx) => {
48
72
  return compilerCtx.tracer.startActiveSpan(`http-${task.id}`, async (span) => {
73
+ await sendTaskStartEvent(task.id, ctx, span);
49
74
  span.setAttribute('task.id', task.id);
50
75
  span.setAttribute('task.type', 'http');
76
+ span.setAttribute('type', 'task');
51
77
  span.setAttribute('execution.id', ctx.executionId);
52
78
  span.setAttribute('connection.name', task.opts.connection);
79
+ span.setAttribute('workflow.id', ctx.options.workflowId || 'unknown-workflow');
80
+ const spanContext = span.spanContext();
53
81
  try {
54
- return await http(ctx);
82
+ const result = await http(ctx.withLogger(ctx.log.child({ spanId: spanContext.spanId, traceId: spanContext.traceId })));
83
+ if (supervisorEnabled) {
84
+ span.setAttribute('response.body', JSON.stringify(result.data));
85
+ }
86
+ span.setAttribute('status', 'pass');
87
+ return result;
55
88
  }
56
89
  catch (error) {
57
90
  if (error instanceof Error) {
91
+ span.setAttribute('status', 'fail');
58
92
  span.recordException(error);
59
93
  }
60
94
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/schedule.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAEzF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkJ7C,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,YAAY,EAAE,eAAe,CAG3E,CAAC"}
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/schedule.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAQzF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAqJ7C,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,YAAY,EAAE,eAAe,CAG3E,CAAC"}
@@ -11,8 +11,8 @@
11
11
  * use of this software will be governed by the Apache License, Version 2.0.
12
12
  */
13
13
  import { Observable } from 'rxjs';
14
- import { envVarEnvId, envVarEnvironmentName, envVarOrgId, envVarProjectId, } from '../../../dsl/http/versori/constants.js';
15
14
  import { ScheduleTrigger } from '../../../dsl/triggers/ScheduleTrigger.js';
15
+ import { envVarEnvId, envVarEnvironmentName, envVarOrgId, envVarProjectId, } from '../../../internal/constants.js';
16
16
  function compileSchedule(ctx, trigger, signal) {
17
17
  return new Observable((subscriber) => {
18
18
  // Add HTTP endpoint for manual triggering
@@ -52,7 +52,7 @@ function compileSchedule(ctx, trigger, signal) {
52
52
  });
53
53
  return;
54
54
  }
55
- const executionCtx = ctx.contextProvider.create(activation[0], {});
55
+ const executionCtx = ctx.contextProvider.create(activation[0], {}, { workflowId: trigger.id });
56
56
  span.setAttribute('execution.id', executionCtx.executionId);
57
57
  try {
58
58
  subscriber.next(executionCtx);
@@ -84,7 +84,7 @@ function compileSchedule(ctx, trigger, signal) {
84
84
  return;
85
85
  }
86
86
  activations.forEach((activation) => {
87
- const executionCtx = ctx.contextProvider.create(activation, {});
87
+ const executionCtx = ctx.contextProvider.create(activation, {}, { workflowId: trigger.id });
88
88
  try {
89
89
  subscriber.next(executionCtx);
90
90
  }
@@ -103,6 +103,7 @@ function compileSchedule(ctx, trigger, signal) {
103
103
  await ctx.tracer.startActiveSpan(`schedule-${trigger.id}`, async (span) => {
104
104
  span.setAttribute('task.id', trigger.id);
105
105
  span.setAttribute('task.type', 'schedule');
106
+ span.setAttribute('type', 'task');
106
107
  span.setAttribute('schedule', trigger.schedule);
107
108
  span.setAttribute('project.id', projectId);
108
109
  span.setAttribute('environment.id', environmentId);
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/webhook.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAGtF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAuD7C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,WAAW,EAAE,cAAc,CAySxE,CAAC"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/durable/compilers/webhook.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAGtF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAuD7C,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,WAAW,EAAE,cAAc,CA4SxE,CAAC"}
@@ -84,6 +84,7 @@ export const webhookCompiler = {
84
84
  onError = trigger.options.response.onError;
85
85
  }
86
86
  const ctxOptionsFn = (req, res) => ({
87
+ workflowId: trigger.id,
87
88
  onSuccess: (ctx) => {
88
89
  if (isSync) {
89
90
  sendResponse(res, onSuccess(ctx));
@@ -104,6 +105,7 @@ export const webhookCompiler = {
104
105
  else {
105
106
  routeMiddleware.push(express.raw({ type: '*/*', limit: '50mb' }));
106
107
  }
108
+ ctx.webhookRegistry.set(trigger.id, { method, path: `/${trigger.id}`, options: trigger.options });
107
109
  return new Observable((subscriber) => {
108
110
  if (!ctx.webhookRouter) {
109
111
  throw new Error('Router not available in compiler context');
@@ -44,6 +44,11 @@ type Registration = {
44
44
  sigintListener: () => void;
45
45
  subscription?: Subscription;
46
46
  };
47
+ type WebhookRegistry = Map<string, {
48
+ method: string;
49
+ path: string;
50
+ options: any;
51
+ }>;
47
52
  /**
48
53
  * MemoryInterpreter is the default interpreter for executing Versori workflows. It handles registration and execution
49
54
  * of workflows triggered by schedules and webhooks.
@@ -72,6 +77,7 @@ export declare class MemoryInterpreter {
72
77
  private readonly webhookRouter;
73
78
  private readonly cronRouter;
74
79
  private cronRegistry;
80
+ private webhookRegistry;
75
81
  private readonly cnxFactory;
76
82
  private readonly cronProvider;
77
83
  private readonly tracer;
@@ -83,7 +89,8 @@ export declare class MemoryInterpreter {
83
89
  private cronServer?;
84
90
  private shutdownServer?;
85
91
  private isShuttingDown;
86
- constructor(log: Logger, compiler: ObservableCompiler, contextProvider: ContextProvider, webhookRouter: Router, cronRouter: Router, cronRegistry: Map<string, string>, cnxFactory: DirectConnectionFactory, cronProvider: CronProvider, tracer: Tracer, issuesProvider: IssueAPI, cfgReader: ConfigReader, otelSDK?: NodeSDK | undefined);
92
+ private wfRegistration;
93
+ constructor(log: Logger, compiler: ObservableCompiler, contextProvider: ContextProvider, webhookRouter: Router, cronRouter: Router, cronRegistry: Map<string, string>, webhookRegistry: WebhookRegistry, cnxFactory: DirectConnectionFactory, cronProvider: CronProvider, tracer: Tracer, issuesProvider: IssueAPI, cfgReader: ConfigReader, otelSDK?: NodeSDK | undefined);
87
94
  static newInstance(options?: MemoryInterpreterOptions): Promise<MemoryInterpreter>;
88
95
  register<O>(workflow: Workflow<O>, options?: MemoryInterpreterOptions): Registration;
89
96
  start(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryInterpreter.d.ts","sourceRoot":"","sources":["../../../../src/src/interpreter/memory/MemoryInterpreter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MemoryInterpreter.d.ts","sourceRoot":"","sources":["../../../../src/src/interpreter/memory/MemoryInterpreter.ts"],"names":[],"mappings":"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"}
@@ -22,15 +22,16 @@ import { ContextProviderImpl } from '../../context/ContextProvider.js';
22
22
  import { VersoriConfigReader } from '../../dsl/http/versori/configloader.js';
23
23
  import { CronAPIClient } from '../../dsl/http/versori/cronapi.js';
24
24
  import { WorkflowImpl } from '../../dsl/Workflow.js';
25
- import { envVarEnvId, envVarEnvironmentName, envVarLocalRun, envVarOrgId, envVarOrgSlug, envVarOtelTracesURL, envVarProjectId, envVarVersion, } from '../../internal/constants.js';
25
+ import { envCronPort, envPort, envReadyCheckURL, envVarEnvId, envVarEnvironmentName, envVarOrgId, envVarOrgSlug, envVarOtelTracesURL, envVarProjectId, envVarVersion, } from '../../internal/constants.js';
26
+ import { Fake, registerWorkflow, signalReady, enabled as supervisorEnabled } from '../../internal/supervisor.js';
26
27
  import { IssueImpl } from '../../issues/Issues.js';
27
28
  import { MemoryKeyValueProvider } from '../../kv/memory/MemoryKeyValueProvider.js';
28
29
  import { NatsKeyValueProvider } from '../../kv/nats/NatsKeyValueProvider.js';
29
30
  import { ConsoleLogger } from '../../observability/logging/ConsoleLogger.js';
30
31
  import { PlatformApiImpl } from '../../services/platform/PlatformApi.js';
31
32
  import { ObservableCompiler } from './ObservableCompiler.js';
32
- function getKVProvider(runLocal) {
33
- if (runLocal) {
33
+ function getKVProvider() {
34
+ if (supervisorEnabled) {
34
35
  return Promise.resolve(new MemoryKeyValueProvider());
35
36
  }
36
37
  return NatsKeyValueProvider.fromEnv();
@@ -57,7 +58,7 @@ function getKVProvider(runLocal) {
57
58
  * ```
58
59
  */
59
60
  export class MemoryInterpreter {
60
- constructor(log, compiler, contextProvider, webhookRouter, cronRouter, cronRegistry, cnxFactory, cronProvider, tracer, issuesProvider, cfgReader, otelSDK) {
61
+ constructor(log, compiler, contextProvider, webhookRouter, cronRouter, cronRegistry, webhookRegistry, cnxFactory, cronProvider, tracer, issuesProvider, cfgReader, otelSDK) {
61
62
  Object.defineProperty(this, "log", {
62
63
  enumerable: true,
63
64
  configurable: true,
@@ -94,6 +95,12 @@ export class MemoryInterpreter {
94
95
  writable: true,
95
96
  value: cronRegistry
96
97
  });
98
+ Object.defineProperty(this, "webhookRegistry", {
99
+ enumerable: true,
100
+ configurable: true,
101
+ writable: true,
102
+ value: webhookRegistry
103
+ });
97
104
  Object.defineProperty(this, "cnxFactory", {
98
105
  enumerable: true,
99
106
  configurable: true,
@@ -160,6 +167,13 @@ export class MemoryInterpreter {
160
167
  writable: true,
161
168
  value: false
162
169
  });
170
+ // Workflow registration promises only used when supervisor is enabled
171
+ Object.defineProperty(this, "wfRegistration", {
172
+ enumerable: true,
173
+ configurable: true,
174
+ writable: true,
175
+ value: []
176
+ });
163
177
  if (typeof this.log === 'undefined') {
164
178
  // this captures the old way of instantiating the MemoryInterpreter and provides an
165
179
  // error message back to the user to let them know they should use the new way.
@@ -178,7 +192,6 @@ export class MemoryInterpreter {
178
192
  const otelTracesURL = Deno.env.get(envVarOtelTracesURL);
179
193
  let otelSDK;
180
194
  const configReader = VersoriConfigReader.fromEnv(log);
181
- const runLocal = Deno.env.get(envVarLocalRun) === 'true';
182
195
  await waitForReady(log);
183
196
  // Do NOT change those attributes, they are used by the API to filter on
184
197
  const resource = resourceFromAttributes({
@@ -200,20 +213,29 @@ export class MemoryInterpreter {
200
213
  log.info('Starting OpenTelemetry SDK');
201
214
  otelSDK.start();
202
215
  }
216
+ else if (supervisorEnabled) {
217
+ otelSDK = new NodeSDK({
218
+ traceExporter: new Fake(),
219
+ serviceName: serviceName,
220
+ resource: resource,
221
+ });
222
+ log.info('Starting Testing OpenTelemetry SDK');
223
+ otelSDK.start();
224
+ }
203
225
  const tracer = opentelemetry.trace.getTracer(serviceName, version);
204
226
  const connectionFactory = DirectConnectionFactory.fromEnv(log);
205
227
  const issuesProvider = new IssueImpl(log);
206
228
  if (options.contextProvider) {
207
229
  // no need to set up a key-value provider if options.contextProvider is already
208
230
  // initialised.
209
- return new MemoryInterpreter(log, compiler, options.contextProvider, express.Router(), express.Router(), new Map(), DirectConnectionFactory.fromEnv(log), CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, otelSDK);
231
+ return new MemoryInterpreter(log, compiler, options.contextProvider, express.Router(), express.Router(), new Map(), new Map(), connectionFactory, CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, otelSDK);
210
232
  }
211
- const kvp = await getKVProvider(runLocal);
233
+ const kvp = await getKVProvider();
212
234
  const platformApi = PlatformApiImpl.fromEnv();
213
235
  const organisationId = Deno.env.get(envVarOrgId) || 'development';
214
236
  const environmentId = Deno.env.get(envVarEnvId) || 'development';
215
237
  const ctxProvider = new ContextProviderImpl(log, kvp, new CredentialsProviderImpl(connectionFactory.credentials, connectionFactory.tokens, connectionFactory.oauth1, configReader, platformApi), platformApi, organisationId, environmentId, issuesProvider);
216
- return new MemoryInterpreter(log, compiler, ctxProvider, express.Router(), express.Router(), new Map(), connectionFactory, CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, otelSDK);
238
+ return new MemoryInterpreter(log, compiler, ctxProvider, express.Router(), express.Router(), new Map(), new Map(), connectionFactory, CronAPIClient.fromEnv(), tracer, issuesProvider, configReader, otelSDK);
217
239
  }
218
240
  register(workflow, options) {
219
241
  const localAbortController = new AbortController();
@@ -235,6 +257,7 @@ export class MemoryInterpreter {
235
257
  cnxFactory: this.cnxFactory,
236
258
  platformApi: PlatformApiImpl.fromEnv(),
237
259
  webhookRouter: this.webhookRouter,
260
+ webhookRegistry: this.webhookRegistry,
238
261
  cronRouter: this.cronRouter,
239
262
  cronRegistry: this.cronRegistry,
240
263
  configReader: this.cfgReader,
@@ -254,11 +277,14 @@ export class MemoryInterpreter {
254
277
  },
255
278
  };
256
279
  this.registeredWorkflows.push(registration);
280
+ if (supervisorEnabled) {
281
+ this.wfRegistration.push(registerWorkflow(workflow));
282
+ }
257
283
  return registration;
258
284
  }
259
- start() {
260
- const port = Deno.env.get('PORT') || 3000;
261
- const cronPort = Deno.env.get('CRON_PORT') || 3001;
285
+ async start() {
286
+ const port = Deno.env.get(envPort) || 3000;
287
+ const cronPort = Deno.env.get(envCronPort) || 3001;
262
288
  const webhookApp = express();
263
289
  const cronApp = express();
264
290
  cronApp.use(express.json());
@@ -285,6 +311,13 @@ export class MemoryInterpreter {
285
311
  triggerName: registration.triggerName,
286
312
  error: err instanceof Error ? err.toString() : err,
287
313
  });
314
+ this.tracer.startActiveSpan('done', (span) => {
315
+ span.setAttribute('error.message', err instanceof Error ? err.toString() : err);
316
+ span.setAttribute('execution.id', ctx.executionId);
317
+ span.setAttribute('result', 'fail');
318
+ span.setAttribute('workflow.id', ctx.workflowId || 'unknown-workflow');
319
+ span.end();
320
+ });
288
321
  try {
289
322
  ctx.options.onError?.(ctx.withData(err));
290
323
  }
@@ -307,6 +340,12 @@ export class MemoryInterpreter {
307
340
  triggerName: registration.triggerName,
308
341
  durationMs,
309
342
  });
343
+ this.tracer.startActiveSpan('done', (span) => {
344
+ span.setAttribute('execution.id', ctx.executionId);
345
+ span.setAttribute('result', 'pass');
346
+ span.setAttribute('workflow.id', ctx.workflowId || 'unknown-workflow');
347
+ span.end();
348
+ });
310
349
  try {
311
350
  ctx.options.onSuccess?.(ctx);
312
351
  }
@@ -368,6 +407,7 @@ export class MemoryInterpreter {
368
407
  if (this.cronServer) {
369
408
  this.cronServer.close();
370
409
  }
410
+ this.otelSDK?.shutdown();
371
411
  // Remove all signal listeners
372
412
  for (const registration of this.registeredWorkflows) {
373
413
  Deno.removeSignalListener('SIGINT', registration.sigintListener);
@@ -384,6 +424,10 @@ export class MemoryInterpreter {
384
424
  }
385
425
  };
386
426
  Deno.addSignalListener('SIGINT', this.shutdownServer);
427
+ if (supervisorEnabled) {
428
+ await Promise.all(this.wfRegistration);
429
+ await signalReady();
430
+ }
387
431
  return new Promise((resolve) => {
388
432
  let serversClosed = 0;
389
433
  const totalServers = [this.webhookServer, this.cronServer].filter(Boolean).length;
@@ -420,7 +464,7 @@ export class MemoryInterpreter {
420
464
  }
421
465
  }
422
466
  async function waitForReady(log) {
423
- const readyCheckUrl = Deno.env.get('READY_CHECK_URL');
467
+ const readyCheckUrl = Deno.env.get(envReadyCheckURL);
424
468
  if (!readyCheckUrl) {
425
469
  return Promise.resolve();
426
470
  }
@@ -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';
@@ -10,7 +11,6 @@ import { IssueAPI } from '../../issues/Issues.js';
10
11
  import { Logger } from '../../observability/logging/Logger.js';
11
12
  import { PlatformApi } from '../../services/platform/PlatformApi.js';
12
13
  import { ContextOperatorFunction, TaskCompiler, TriggerCompiler } from './compilers/types.js';
13
- import { ConnectionFactory } from '../../connection/types.js';
14
14
  export type CompilerContext = {
15
15
  compiler: ObservableCompiler;
16
16
  log: Logger;
@@ -23,6 +23,11 @@ export type CompilerContext = {
23
23
  issueProvider: IssueAPI;
24
24
  configReader: ConfigReader;
25
25
  cronRegistry: Map<string, string>;
26
+ webhookRegistry: Map<string, {
27
+ method: string;
28
+ path: string;
29
+ options: any;
30
+ }>;
26
31
  organisationId: string;
27
32
  };
28
33
  export type CompilerFunc<In = any, Out = any, T extends Task<In, Out> = Task<In, Out>> = (ctx: CompilerContext, task: T) => OperatorFunction<In, Out>;
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableCompiler.d.ts","sourceRoot":"","sources":["../../../../src/src/interpreter/memory/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;AAEpD,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,wCAAwC,CAAC;AASrE,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,MAAM,eAAe,GAAG;IAC1B,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,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,QAAQ,CAAC;IACxB,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,eAAe,EACpB,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;;IAgBxE,WAAW,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI,EACzC,GAAG,EAAE,eAAe,EACpB,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,eAAe,EACpB,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/memory/ObservableCompiler.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"catch.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/memory/compilers/catch.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAsFnE,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/memory/compilers/catch.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AA4FnE,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAGrE,CAAC"}
@@ -19,9 +19,13 @@ function compileCatch(compilerCtx, task) {
19
19
  return (src) => src.pipe(mergeMap((ctx) => {
20
20
  return baseOperator(of(ctx)).pipe(catchError((error) => {
21
21
  return compilerCtx.tracer.startActiveSpan(`catch`, (span) => {
22
+ // TODO: do we even want this here? Can't be async in here I believe
23
+ // await sendTaskStartEvent(task.id, span);
22
24
  span.setAttribute('execution.id', ctx.executionId);
23
25
  span.setAttribute('task.type', 'catch');
26
+ span.setAttribute('type', 'task');
24
27
  if (error instanceof Error) {
28
+ span.setAttribute('status', 'fail');
25
29
  span.recordException(error);
26
30
  span.setAttribute('error.message', error.message);
27
31
  span.setAttribute('error.stack', error.stack ?? '');
@@ -59,6 +63,7 @@ function compileCatch(compilerCtx, task) {
59
63
  ctx.log.error('execution has encountered an error', {
60
64
  error: error,
61
65
  });
66
+ span.setAttribute('status', 'fail');
62
67
  span.setAttribute('error', `${error}`);
63
68
  span.end();
64
69
  return errorOperator(of(ctx.withData(new ExecutionError(ctx, `${error}`, { cause: error }), { recoveredFromCatch: true })));
@@ -1 +1 @@
1
- {"version":3,"file":"fn.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/memory/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/memory/compilers/fn.ts"],"names":[],"mappings":"AAgBA,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"}
@@ -1,29 +1,40 @@
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 { mergeMap, tap } from 'rxjs';
1
+ import { mergeMap } from 'rxjs';
14
2
  import { FnTask } from '../../../dsl/tasks/FnTask.js';
3
+ import { sendTaskStartEvent, enabled as supervisorEnabled } from '../../../internal/supervisor.js';
15
4
  function compileFn(compilerCtx, task) {
16
- return (src) => src.pipe(tap({
17
- complete: () => compilerCtx.log.debug('fn.complete'),
18
- }), mergeMap(async (ctx) => {
5
+ return (src) => src.pipe(mergeMap(async (ctx) => {
19
6
  return await compilerCtx.tracer.startActiveSpan(`fn-${task.id}`, async (span) => {
7
+ ctx = await sendTaskStartEvent(task.id, ctx, span);
20
8
  span.setAttribute('task.id', task.id);
9
+ span.setAttribute('type', 'task');
10
+ span.setAttribute('task.type', 'fn');
21
11
  span.setAttribute('execution.id', ctx.executionId);
12
+ span.setAttribute('workflow.id', ctx.options.workflowId || 'unknown-workflow');
22
13
  try {
14
+ let result;
15
+ const spanContext = span.spanContext();
16
+ const ctxWithLogger = ctx.withLogger(ctx.log.child({ spanId: spanContext.spanId, traceId: spanContext.traceId }));
23
17
  if (typeof ctx.idx === 'number') {
24
- return ctx.withData(await task._fn(ctx, ctx.idx));
18
+ result = ctx.withData(await task._fn(ctxWithLogger, ctx.idx));
25
19
  }
26
- return ctx.withData(await task._fn(ctx));
20
+ else {
21
+ result = ctx.withData(await task._fn(ctxWithLogger));
22
+ }
23
+ if (supervisorEnabled) {
24
+ span.setAttribute('response.body', JSON.stringify(result.data));
25
+ }
26
+ span.setAttribute('status', 'pass');
27
+ return result;
28
+ }
29
+ catch (error) {
30
+ if (error instanceof Error) {
31
+ span.setAttribute('status', 'fail');
32
+ span.recordException(error);
33
+ }
34
+ else {
35
+ span.recordException(new Error(String(error)));
36
+ }
37
+ throw error;
27
38
  }
28
39
  finally {
29
40
  span.end();
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/memory/compilers/http.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAmB,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE/E,OAAO,EAA2B,YAAY,EAAE,MAAM,YAAY,CAAC;AAqFnE,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/memory/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"}
@@ -11,19 +11,32 @@
11
11
  * use of this software will be governed by the Apache License, Version 2.0.
12
12
  */
13
13
  import { mergeMap } from 'rxjs';
14
- import { tap } from 'rxjs/operators';
15
14
  import { DynamicFetchFactory } from '../../../connection/DynamicFetchFactory.js';
15
+ import { FetchBuilder } from '../../../connection/internal/FetchBuilder.js';
16
16
  import { StaticFetchFactory } from '../../../connection/StaticFetchFactory.js';
17
17
  import { HttpContextImpl, HttpTaskImpl } from '../../../dsl/tasks/HttpTask.js';
18
+ import { sendTaskStartEvent, enabled as supervisorEnabled } from '../../../internal/supervisor.js';
18
19
  function compileHttp(compilerCtx, task) {
19
20
  const cnxMap = compilerCtx.configReader.getCnxMapping(task.opts.connection);
20
21
  let fetchFactory;
21
22
  if (!cnxMap) {
22
- compilerCtx.log.error(`Connection ${task.opts.connection} not found, using default fetch with no credentials`);
23
- fetchFactory = Promise.resolve(new StaticFetchFactory(globalThis.fetch));
23
+ compilerCtx.log.warn(`Connection ${task.opts.connection} not found, using default fetch with no credentials`);
24
+ if (supervisorEnabled) {
25
+ // missing connection map and we are in supervised mode, so we use the fake fetcher
26
+ fetchFactory = Promise.resolve(new StaticFetchFactory(new FetchBuilder(globalThis.fetch, { name: task.opts.connection }).buildSupervisedFetch()));
27
+ }
28
+ else {
29
+ // missing connection map and not in supervised mode, so we use global fetch
30
+ fetchFactory = Promise.resolve(new StaticFetchFactory(globalThis.fetch));
31
+ }
24
32
  }
25
33
  else if (cnxMap.dynamic) {
26
- fetchFactory = Promise.resolve(new DynamicFetchFactory(compilerCtx.cnxFactory, compilerCtx.platformApi, compilerCtx.organisationId, cnxMap.templateId));
34
+ if (cnxMap.mockWithAI) {
35
+ fetchFactory = Promise.resolve(new StaticFetchFactory(new FetchBuilder(globalThis.fetch, { name: task.opts.connection }).buildSupervisedFetch()));
36
+ }
37
+ else {
38
+ fetchFactory = Promise.resolve(new DynamicFetchFactory(compilerCtx.cnxFactory, compilerCtx.platformApi, compilerCtx.organisationId, cnxMap.templateId));
39
+ }
27
40
  }
28
41
  else {
29
42
  fetchFactory = compilerCtx.platformApi.getConnection({
@@ -33,8 +46,21 @@ function compileHttp(compilerCtx, task) {
33
46
  },
34
47
  throwOnError: true,
35
48
  })
36
- .then(({ data }) => Promise.all([compilerCtx.cnxFactory.fetcher(data), data.baseUrl ?? '']))
37
- .then(([fetcher, baseUrl]) => new StaticFetchFactory(fetcher, baseUrl));
49
+ .then(({ data }) => {
50
+ if (cnxMap.mockWithAI) {
51
+ // use the fake fetcher that calls the supervisor to generate a mock reponse
52
+ return new StaticFetchFactory(new FetchBuilder(globalThis.fetch, data).buildSupervisedFetch());
53
+ }
54
+ return Promise.all([compilerCtx.cnxFactory.fetcher(data), data.baseUrl ?? ''])
55
+ .then(([fetcher, baseUrl]) => new StaticFetchFactory(fetcher, baseUrl));
56
+ })
57
+ .catch((err) => {
58
+ compilerCtx.log.error(`Failed to get connection ${task.opts.connection}`, err);
59
+ if (supervisorEnabled) {
60
+ return new StaticFetchFactory(new FetchBuilder(globalThis.fetch, { name: task.opts.connection }).build());
61
+ }
62
+ throw err;
63
+ });
38
64
  }
39
65
  async function http(ctx) {
40
66
  const [fetch, baseUrl] = await fetchFactory.then((ff) => Promise.all([ff.fetcher(ctx), ff.baseUrl(ctx)]));
@@ -42,19 +68,27 @@ function compileHttp(compilerCtx, task) {
42
68
  const result = await task.fn(httpContext);
43
69
  return ctx.withData(result);
44
70
  }
45
- return (src) => src.pipe(tap({
46
- complete: () => compilerCtx.log.debug('http.complete'),
47
- }), mergeMap((ctx) => {
71
+ return (src) => src.pipe(mergeMap((ctx) => {
48
72
  return compilerCtx.tracer.startActiveSpan(`http-${task.id}`, async (span) => {
73
+ ctx = await sendTaskStartEvent(task.id, ctx, span);
49
74
  span.setAttribute('task.id', task.id);
50
75
  span.setAttribute('task.type', 'http');
76
+ span.setAttribute('type', 'task');
51
77
  span.setAttribute('execution.id', ctx.executionId);
52
78
  span.setAttribute('connection.name', task.opts.connection);
79
+ span.setAttribute('workflow.id', ctx.options.workflowId || 'unknown-workflow');
80
+ const spanContext = span.spanContext();
53
81
  try {
54
- return await http(ctx);
82
+ const newCtx = await http(ctx.withLogger(ctx.log.child({ spanId: spanContext.spanId, traceId: spanContext.traceId })));
83
+ if (supervisorEnabled) {
84
+ span.setAttribute('response.body', JSON.stringify(newCtx.data));
85
+ }
86
+ span.setAttribute('status', 'pass');
87
+ return newCtx;
55
88
  }
56
89
  catch (error) {
57
90
  if (error instanceof Error) {
91
+ span.setAttribute('status', 'fail');
58
92
  span.recordException(error);
59
93
  }
60
94
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/memory/compilers/schedule.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAEzF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAyI7C,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,YAAY,EAAE,eAAe,CAG3E,CAAC"}
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../../../../src/src/interpreter/memory/compilers/schedule.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AASzF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+M7C,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,YAAY,EAAE,eAAe,CAG3E,CAAC"}