@kaleido-io/workflow-engine-sdk 0.0.1 → 0.9.2

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 (140) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1121 -0
  3. package/bin/init.js +200 -0
  4. package/bin/wesdk.js +57 -0
  5. package/dist/package.json +3 -0
  6. package/dist/src/client/client.d.ts +24 -0
  7. package/dist/src/client/client.d.ts.map +1 -0
  8. package/dist/src/client/client.js +58 -0
  9. package/dist/src/client/client.js.map +1 -0
  10. package/dist/src/client/rest-client.d.ts +222 -0
  11. package/dist/src/client/rest-client.d.ts.map +1 -0
  12. package/dist/src/client/rest-client.js +242 -0
  13. package/dist/src/client/rest-client.js.map +1 -0
  14. package/dist/src/config/config.d.ts +60 -0
  15. package/dist/src/config/config.d.ts.map +1 -0
  16. package/dist/src/config/config.js +117 -0
  17. package/dist/src/config/config.js.map +1 -0
  18. package/dist/src/factories/event_source.d.ts +54 -0
  19. package/dist/src/factories/event_source.d.ts.map +1 -0
  20. package/dist/src/factories/event_source.js +170 -0
  21. package/dist/src/factories/event_source.js.map +1 -0
  22. package/dist/src/factories/transaction_handler.d.ts +27 -0
  23. package/dist/src/factories/transaction_handler.d.ts.map +1 -0
  24. package/dist/src/factories/transaction_handler.js +66 -0
  25. package/dist/src/factories/transaction_handler.js.map +1 -0
  26. package/dist/src/helpers/stage_director.d.ts +42 -0
  27. package/dist/src/helpers/stage_director.d.ts.map +1 -0
  28. package/dist/src/helpers/stage_director.js +304 -0
  29. package/dist/src/helpers/stage_director.js.map +1 -0
  30. package/dist/src/i18n/errors.d.ts +61 -0
  31. package/dist/src/i18n/errors.d.ts.map +1 -0
  32. package/dist/src/i18n/errors.js +90 -0
  33. package/dist/src/i18n/errors.js.map +1 -0
  34. package/dist/src/index.d.ts +20 -0
  35. package/dist/src/index.d.ts.map +1 -0
  36. package/dist/src/index.js +85 -0
  37. package/dist/src/index.js.map +1 -0
  38. package/dist/src/interfaces/handlers.d.ts +112 -0
  39. package/dist/src/interfaces/handlers.d.ts.map +1 -0
  40. package/dist/src/interfaces/handlers.js +18 -0
  41. package/dist/src/interfaces/handlers.js.map +1 -0
  42. package/dist/src/interfaces/messages.d.ts +6 -0
  43. package/dist/src/interfaces/messages.d.ts.map +1 -0
  44. package/dist/src/interfaces/messages.js +18 -0
  45. package/dist/src/interfaces/messages.js.map +1 -0
  46. package/dist/src/log/logger.d.ts +8 -0
  47. package/dist/src/log/logger.d.ts.map +1 -0
  48. package/dist/src/log/logger.js +39 -0
  49. package/dist/src/log/logger.js.map +1 -0
  50. package/dist/src/runtime/engine_client.d.ts +37 -0
  51. package/dist/src/runtime/engine_client.d.ts.map +1 -0
  52. package/dist/src/runtime/engine_client.js +99 -0
  53. package/dist/src/runtime/engine_client.js.map +1 -0
  54. package/dist/src/runtime/handler_runtime.d.ts +124 -0
  55. package/dist/src/runtime/handler_runtime.d.ts.map +1 -0
  56. package/dist/src/runtime/handler_runtime.js +623 -0
  57. package/dist/src/runtime/handler_runtime.js.map +1 -0
  58. package/dist/src/types/core.d.ts +258 -0
  59. package/dist/src/types/core.d.ts.map +1 -0
  60. package/dist/src/types/core.js +71 -0
  61. package/dist/src/types/core.js.map +1 -0
  62. package/dist/src/types/flows.d.ts +144 -0
  63. package/dist/src/types/flows.d.ts.map +1 -0
  64. package/dist/src/types/flows.js +30 -0
  65. package/dist/src/types/flows.js.map +1 -0
  66. package/dist/src/utils/errors.d.ts +2 -0
  67. package/dist/src/utils/errors.d.ts.map +1 -0
  68. package/dist/src/utils/errors.js +23 -0
  69. package/dist/src/utils/errors.js.map +1 -0
  70. package/dist/src/utils/patch.d.ts +9 -0
  71. package/dist/src/utils/patch.d.ts.map +1 -0
  72. package/dist/src/utils/patch.js +99 -0
  73. package/dist/src/utils/patch.js.map +1 -0
  74. package/dist-esm/src/client/client.js +54 -0
  75. package/dist-esm/src/client/client.js.map +1 -0
  76. package/dist-esm/src/client/rest-client.js +238 -0
  77. package/dist-esm/src/client/rest-client.js.map +1 -0
  78. package/dist-esm/src/config/config.js +113 -0
  79. package/dist-esm/src/config/config.js.map +1 -0
  80. package/dist-esm/src/factories/event_source.js +167 -0
  81. package/dist-esm/src/factories/event_source.js.map +1 -0
  82. package/dist-esm/src/factories/transaction_handler.js +63 -0
  83. package/dist-esm/src/factories/transaction_handler.js.map +1 -0
  84. package/dist-esm/src/helpers/stage_director.js +298 -0
  85. package/dist-esm/src/helpers/stage_director.js.map +1 -0
  86. package/dist-esm/src/i18n/errors.js +85 -0
  87. package/dist-esm/src/i18n/errors.js.map +1 -0
  88. package/dist-esm/src/index.js +51 -0
  89. package/dist-esm/src/index.js.map +1 -0
  90. package/dist-esm/src/interfaces/handlers.js +17 -0
  91. package/dist-esm/src/interfaces/handlers.js.map +1 -0
  92. package/dist-esm/src/interfaces/messages.js +17 -0
  93. package/dist-esm/src/interfaces/messages.js.map +1 -0
  94. package/dist-esm/src/log/logger.js +36 -0
  95. package/dist-esm/src/log/logger.js.map +1 -0
  96. package/dist-esm/src/runtime/engine_client.js +95 -0
  97. package/dist-esm/src/runtime/engine_client.js.map +1 -0
  98. package/dist-esm/src/runtime/handler_runtime.js +586 -0
  99. package/dist-esm/src/runtime/handler_runtime.js.map +1 -0
  100. package/dist-esm/src/types/core.js +68 -0
  101. package/dist-esm/src/types/core.js.map +1 -0
  102. package/dist-esm/src/types/flows.js +27 -0
  103. package/dist-esm/src/types/flows.js.map +1 -0
  104. package/dist-esm/src/utils/errors.js +19 -0
  105. package/dist-esm/src/utils/errors.js.map +1 -0
  106. package/dist-esm/src/utils/patch.js +56 -0
  107. package/dist-esm/src/utils/patch.js.map +1 -0
  108. package/package.json +79 -11
  109. package/template/.env.sample +14 -0
  110. package/template/.vscode/launch.json +23 -0
  111. package/template/README.md +37 -0
  112. package/template/package.json +36 -0
  113. package/template/src/connect.ts +58 -0
  114. package/template/src/provider.ts +24 -0
  115. package/template/src/samples/event-source/README.md +50 -0
  116. package/template/src/samples/event-source/echo-handler.ts +65 -0
  117. package/template/src/samples/event-source/event-processor.ts +46 -0
  118. package/template/src/samples/event-source/event-source.ts +70 -0
  119. package/template/src/samples/event-source/stream.ts +34 -0
  120. package/template/src/samples/hello/README.md +52 -0
  121. package/template/src/samples/hello/flow.ts +74 -0
  122. package/template/src/samples/hello/handlers.test.ts +147 -0
  123. package/template/src/samples/hello/handlers.ts +72 -0
  124. package/template/src/samples/hello/transaction.ts +24 -0
  125. package/template/src/samples/http-invoke/README.md +42 -0
  126. package/template/src/samples/http-invoke/flow.ts +63 -0
  127. package/template/src/samples/http-invoke/handlers.ts +66 -0
  128. package/template/src/samples/http-invoke/transaction.ts +22 -0
  129. package/template/src/samples/snap/README.md +98 -0
  130. package/template/src/samples/snap/event-source.ts +104 -0
  131. package/template/src/samples/snap/flow.ts +85 -0
  132. package/template/src/samples/snap/snap-handler.ts +84 -0
  133. package/template/src/samples/snap/stream.ts +26 -0
  134. package/template/src/samples/snap/transaction.ts +26 -0
  135. package/template/src/utils/post-stream.ts +67 -0
  136. package/template/src/utils/post-transaction.ts +64 -0
  137. package/template/src/utils/post-workflow.ts +63 -0
  138. package/template/tsconfig.json +24 -0
  139. package/template/vitest.config.ts +42 -0
  140. package/CODEOWNERS +0 -5
@@ -0,0 +1,623 @@
1
+ "use strict";
2
+ // Copyright © 2026 Kaleido, Inc.
3
+ //
4
+ // SPDX-License-Identifier: Apache-2.0
5
+ //
6
+ // Licensed under the Apache License, Version 2.0 (the "License");
7
+ // you may not use this file except in compliance with the License.
8
+ // You may obtain a copy of the License at
9
+ //
10
+ // http://www.apache.org/licenses/LICENSE-2.0
11
+ //
12
+ // Unless required by applicable law or agreed to in writing, software
13
+ // distributed under the License is distributed on an "AS IS" BASIS,
14
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ // See the License for the specific language governing permissions and
16
+ // limitations under the License.
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.HandlerRuntime = exports.HandlerRuntimeMode = void 0;
52
+ const ws_1 = __importStar(require("ws"));
53
+ const exponential_backoff_1 = require("exponential-backoff");
54
+ const core_1 = require("../types/core");
55
+ const engine_client_1 = require("./engine_client");
56
+ const logger_1 = require("../log/logger");
57
+ const errors_1 = require("../utils/errors");
58
+ const errors_2 = require("../i18n/errors");
59
+ const log = (0, logger_1.newLogger)('handler_runtime');
60
+ /**
61
+ * outbound mode connects to the configured URL via a WebSocket connection
62
+ * inbound mode creates a websocket server and waits for connections
63
+ */
64
+ var HandlerRuntimeMode;
65
+ (function (HandlerRuntimeMode) {
66
+ HandlerRuntimeMode["OUTBOUND"] = "outbound";
67
+ HandlerRuntimeMode["INBOUND"] = "inbound";
68
+ })(HandlerRuntimeMode || (exports.HandlerRuntimeMode = HandlerRuntimeMode = {}));
69
+ /**
70
+ * Internal runtime that manages WebSocket connection and handler lifecycle.
71
+ */
72
+ class HandlerRuntime {
73
+ constructor(config) {
74
+ this.mode = HandlerRuntimeMode.OUTBOUND;
75
+ this.transactionHandlers = new Map();
76
+ this.eventSources = new Map();
77
+ this.eventSourceConfigs = new Map();
78
+ this.eventProcessors = new Map();
79
+ this.isConnected = false;
80
+ this.shouldReconnect = true;
81
+ if (process.env.WORKFLOW_ENGINE_MODE === 'inbound') {
82
+ this.mode = HandlerRuntimeMode.INBOUND;
83
+ if (!process.env.WEBSOCKET_PORT) {
84
+ throw (0, errors_2.newError)(errors_2.SDKErrors.MsgSDKWebSocketPortRequiredInbound);
85
+ }
86
+ this.port = parseInt(process.env.WEBSOCKET_PORT);
87
+ }
88
+ this.config = config;
89
+ this.engineClient = new engine_client_1.EngineClient(this);
90
+ // Set heartbeat intervals from config or use defaults
91
+ this.PING_INTERVAL_MS = config.pingIntervalMs ?? 30000; // 30 seconds default
92
+ this.PONG_TIMEOUT_MS = config.pongTimeoutMs ?? 10000; // 10 seconds default
93
+ }
94
+ /**
95
+ * Register a transaction handler
96
+ */
97
+ registerTransactionHandler(name, handler) {
98
+ this.transactionHandlers.set(name, handler);
99
+ }
100
+ /**
101
+ * Register an event source handler
102
+ */
103
+ registerEventSource(name, handler) {
104
+ this.eventSources.set(name, handler);
105
+ }
106
+ /**
107
+ * Register an event processor handler
108
+ */
109
+ registerEventProcessor(name, handler) {
110
+ this.eventProcessors.set(name, handler);
111
+ }
112
+ /**
113
+ * Get all registered handlers
114
+ */
115
+ getAllHandlers() {
116
+ return [
117
+ ...Array.from(this.transactionHandlers.values()),
118
+ ...Array.from(this.eventSources.values()),
119
+ ...Array.from(this.eventProcessors.values()),
120
+ ];
121
+ }
122
+ /**
123
+ * Initialize all handlers and connect to WebSocket
124
+ */
125
+ async start() {
126
+ if (this.mode === HandlerRuntimeMode.INBOUND) {
127
+ log.info('Starting handler runtime in inbound mode', {
128
+ port: this.port,
129
+ provider: this.config.providerName
130
+ });
131
+ }
132
+ else {
133
+ log.info('Starting handler runtime in outbound mode and registering with workflow engine at', {
134
+ url: this.config.url,
135
+ provider: this.config.providerName
136
+ });
137
+ }
138
+ // Initialize all handlers
139
+ for (const [name, handler] of this.transactionHandlers.entries()) {
140
+ await handler.init(this.engineClient);
141
+ log.debug('Initialized transaction handler', { name });
142
+ }
143
+ for (const [name, handler] of this.eventSources.entries()) {
144
+ await handler.init(this.engineClient);
145
+ log.debug('Initialized event source', { name });
146
+ }
147
+ for (const [name, handler] of this.eventProcessors.entries()) {
148
+ await handler.init(this.engineClient);
149
+ log.debug('Initialized event processor', { name });
150
+ }
151
+ if (this.mode === HandlerRuntimeMode.INBOUND) {
152
+ this.shouldReconnect = false;
153
+ this.createWebSocketServer();
154
+ }
155
+ else {
156
+ // Connect to WebSocket with retry
157
+ await this.connectWebSocket();
158
+ }
159
+ }
160
+ /**
161
+ * Stop the runtime and close all handlers
162
+ */
163
+ stop() {
164
+ log.info('Stopping handler runtime');
165
+ this.shouldReconnect = false;
166
+ // Clean up heartbeat
167
+ this.cleanupHeartbeat();
168
+ if (this.ws) {
169
+ this.ws.close();
170
+ }
171
+ if (this.wsServer) {
172
+ this.wsServer.close();
173
+ }
174
+ for (const [name, handler] of this.transactionHandlers.entries()) {
175
+ handler.close();
176
+ log.debug('Closed transaction handler', { name });
177
+ }
178
+ for (const [name, handler] of this.eventSources.entries()) {
179
+ handler.close();
180
+ log.debug('Closed event source', { name });
181
+ }
182
+ for (const [name, handler] of this.eventProcessors.entries()) {
183
+ handler.close();
184
+ log.debug('Closed event processor', { name });
185
+ }
186
+ }
187
+ /**
188
+ * Check if connected to the workflow engine
189
+ */
190
+ isWebSocketConnected() {
191
+ return this.isConnected && this.ws?.readyState === ws_1.default.OPEN;
192
+ }
193
+ /**
194
+ * Set active handler context for EngineAPI calls
195
+ */
196
+ setActiveHandlerContext(requestId, authTokens) {
197
+ this.activeHandlerContext = { requestId, authTokens };
198
+ }
199
+ /**
200
+ * Clear active handler context
201
+ */
202
+ clearActiveHandlerContext() {
203
+ this.activeHandlerContext = undefined;
204
+ }
205
+ /**
206
+ * Get active handler context
207
+ */
208
+ getActiveHandlerContext() {
209
+ return this.activeHandlerContext;
210
+ }
211
+ /**
212
+ * Send a message over WebSocket
213
+ */
214
+ sendMessage(message) {
215
+ if (this.ws && this.isConnected) {
216
+ this.ws.send(JSON.stringify(message));
217
+ }
218
+ else {
219
+ log.warn('Attempted to send message while disconnected');
220
+ }
221
+ }
222
+ // ============================================================================
223
+ // WebSocket Connection Management
224
+ // ============================================================================
225
+ createWebSocketServer() {
226
+ this.wsServer = new ws_1.WebSocketServer({ port: this.port });
227
+ this.wsServer.on('connection', (ws, req) => {
228
+ log.info('WebSocket server connection', { remoteAddress: req.socket.remoteAddress, remotePort: req.socket.remotePort });
229
+ this.ws = ws;
230
+ this.isConnected = true;
231
+ this.setupHeartbeat();
232
+ this.registerProviderAndHandlers();
233
+ ws.on('error', this.onError.bind(this));
234
+ ws.on('close', this.onClose.bind(this));
235
+ ws.on('message', this.onMessage.bind(this));
236
+ });
237
+ }
238
+ async connectWebSocket() {
239
+ return (0, exponential_backoff_1.backOff)(() => new Promise((resolve, reject) => {
240
+ if (!this.config.url) {
241
+ throw (0, errors_2.newError)(errors_2.SDKErrors.MsgSDKURLRequiredOutbound);
242
+ }
243
+ log.debug('Connecting to WebSocket', { url: this.config.url });
244
+ const wsOptions = {
245
+ ...this.config.options,
246
+ headers: {
247
+ ...this.config.options?.headers,
248
+ ...this.config.headers,
249
+ },
250
+ };
251
+ if (this.config.authToken) {
252
+ // We can default to Authorization if not set
253
+ const authHeaderName = this.config.authHeaderName ?? 'Authorization';
254
+ wsOptions.headers = {
255
+ ...wsOptions.headers,
256
+ [authHeaderName]: this.config.authToken,
257
+ };
258
+ }
259
+ this.ws = new ws_1.default(this.config.url, wsOptions);
260
+ this.reconnectResolve = resolve;
261
+ this.reconnectReject = reject;
262
+ this.ws.on('error', this.onError.bind(this));
263
+ this.ws.on('open', this.onOpen.bind(this));
264
+ this.ws.on('message', this.onMessage.bind(this));
265
+ this.ws.on('close', this.onClose.bind(this));
266
+ }), this.config.maxAttempts ? { numOfAttempts: this.config.maxAttempts } : {});
267
+ }
268
+ onError(error) {
269
+ log.error('WebSocket error', { error: error.message });
270
+ if (this.reconnectReject) {
271
+ this.reconnectReject(error);
272
+ }
273
+ }
274
+ onOpen() {
275
+ this.isConnected = true;
276
+ log.info('WebSocket connected');
277
+ if (this.reconnectResolve) {
278
+ this.reconnectResolve();
279
+ this.reconnectResolve = undefined;
280
+ this.reconnectReject = undefined;
281
+ }
282
+ // Setup heartbeat for connection liveness detection
283
+ this.setupHeartbeat();
284
+ this.registerProviderAndHandlers();
285
+ }
286
+ onClose() {
287
+ this.isConnected = false;
288
+ log.info('WebSocket closed');
289
+ // Clean up heartbeat
290
+ this.cleanupHeartbeat();
291
+ if (this.reconnectReject) {
292
+ this.reconnectReject(new Error('WebSocket closed'));
293
+ this.reconnectReject = undefined;
294
+ this.reconnectResolve = undefined;
295
+ }
296
+ else if (this.shouldReconnect) {
297
+ const delay = this.config.reconnectDelay || 1000;
298
+ log.info('Reconnecting', { delay });
299
+ setTimeout(() => this.connectWebSocket(), delay);
300
+ }
301
+ }
302
+ onMessage(data, isBinary) {
303
+ try {
304
+ const message = isBinary ? data : data.toString();
305
+ if (typeof message === 'string') {
306
+ const msg = JSON.parse(message);
307
+ this.handleMessage(msg);
308
+ }
309
+ else {
310
+ log.warn('Received non-string message data, ignoring');
311
+ }
312
+ }
313
+ catch (error) {
314
+ log.error('Error processing message', { error });
315
+ }
316
+ }
317
+ // ============================================================================
318
+ // Handler Registration
319
+ // ============================================================================
320
+ registerProviderAndHandlers() {
321
+ log.info('Registering provider and handlers', {
322
+ provider: this.config.providerName,
323
+ transactionHandlers: this.transactionHandlers.size,
324
+ eventSources: this.eventSources.size,
325
+ eventProcessors: this.eventProcessors.size
326
+ });
327
+ // Register provider
328
+ this.sendMessage({
329
+ messageType: core_1.WSMessageType.REGISTER_PROVIDER,
330
+ id: this.generateId(),
331
+ providerName: this.config.providerName,
332
+ providerMetadata: this.config.providerMetadata,
333
+ });
334
+ // Register all transaction handlers
335
+ for (const name of this.transactionHandlers.keys()) {
336
+ this.registerHandler(name, core_1.WSHandlerType.TRANSACTION_HANDLER);
337
+ }
338
+ // Register all event sources
339
+ for (const name of this.eventSources.keys()) {
340
+ this.registerHandler(name, core_1.WSHandlerType.EVENT_SOURCE);
341
+ }
342
+ // Register all event processors
343
+ for (const name of this.eventProcessors.keys()) {
344
+ this.registerHandler(name, core_1.WSHandlerType.EVENT_PROCESSOR);
345
+ }
346
+ }
347
+ registerHandler(handlerName, handlerType) {
348
+ log.debug('Registering handler', { name: handlerName, type: handlerType });
349
+ this.sendMessage({
350
+ messageType: core_1.WSMessageType.REGISTER_HANDLER,
351
+ id: this.generateId(),
352
+ handlerType: handlerType,
353
+ handler: handlerName,
354
+ });
355
+ }
356
+ // ============================================================================
357
+ // Message Routing
358
+ // ============================================================================
359
+ handleMessage(msg) {
360
+ switch (msg.messageType) {
361
+ case core_1.WSMessageType.HANDLE_TRANSACTIONS:
362
+ this.handleTransactionsMessage(msg);
363
+ break;
364
+ case core_1.WSMessageType.EVENT_PROCESSOR_BATCH:
365
+ this.handleEventProcessorBatch(msg);
366
+ break;
367
+ case core_1.WSMessageType.EVENT_SOURCE_CONFIG:
368
+ this.handleEventSourceConfig(msg);
369
+ break;
370
+ case core_1.WSMessageType.EVENT_SOURCE_POLL:
371
+ this.handleEventSourcePoll(msg);
372
+ break;
373
+ case core_1.WSMessageType.EVENT_SOURCE_VALIDATE_CONFIG:
374
+ this.handleEventSourceValidateConfig(msg);
375
+ break;
376
+ case core_1.WSMessageType.EVENT_SOURCE_DELETE:
377
+ this.handleEventSourceDelete(msg);
378
+ break;
379
+ case core_1.WSMessageType.ENGINE_API_SUBMIT_TRANSACTIONS_RESULT:
380
+ this.engineClient.handleResponse(msg);
381
+ break;
382
+ case core_1.WSMessageType.PROTOCOL_ERROR:
383
+ log.error('Protocol error received', { error: msg.error });
384
+ break;
385
+ case core_1.WSMessageType.REGISTER_PROVIDER:
386
+ case core_1.WSMessageType.REGISTER_HANDLER:
387
+ log.debug('Registration response', { messageType: msg.messageType });
388
+ break;
389
+ default:
390
+ log.warn('Unknown message type', { messageType: msg.messageType });
391
+ }
392
+ }
393
+ async handleTransactionsMessage(batch) {
394
+ if (!batch.handler) {
395
+ log.error('Handler not set in transactions message');
396
+ return;
397
+ }
398
+ log.debug('Handling transactions', {
399
+ handler: batch.handler,
400
+ batchId: batch.id,
401
+ count: batch.transactions.length
402
+ });
403
+ const response = {
404
+ messageType: core_1.WSMessageType.HANDLE_TRANSACTIONS_RESULT,
405
+ handler: batch.handler,
406
+ id: batch.id,
407
+ results: [],
408
+ };
409
+ try {
410
+ const handler = this.transactionHandlers.get(batch.handler);
411
+ if (handler) {
412
+ this.setActiveHandlerContext(batch.id, batch.authTokens || {});
413
+ await handler.transactionHandlerBatch(response, batch);
414
+ }
415
+ else {
416
+ response.error = `No transaction handler registered: ${batch.handler}`;
417
+ log.error(response.error);
418
+ }
419
+ }
420
+ catch (error) {
421
+ log.error('Handler failed', { handler: batch.handler, error });
422
+ response.results = batch.transactions.map(() => ({
423
+ error: (0, errors_1.getErrorMessage)(error)
424
+ }));
425
+ }
426
+ finally {
427
+ this.clearActiveHandlerContext();
428
+ }
429
+ this.sendMessage(response);
430
+ }
431
+ async handleEventProcessorBatch(batch) {
432
+ log.debug('Handling event processor batch', {
433
+ handler: batch.handler,
434
+ batchId: batch.id,
435
+ count: batch.events.length
436
+ });
437
+ const response = {
438
+ messageType: core_1.WSMessageType.EVENT_PROCESSOR_BATCH_RESULT,
439
+ id: batch.id,
440
+ handler: batch.handler,
441
+ events: batch.events,
442
+ };
443
+ try {
444
+ const eventProcessor = this.eventProcessors.get(batch.handler || '');
445
+ if (eventProcessor) {
446
+ this.setActiveHandlerContext(batch.id, batch.authTokens || {});
447
+ await eventProcessor.eventProcessorBatch(response, batch);
448
+ }
449
+ else {
450
+ response.error = `No event processor registered: ${batch.handler}`;
451
+ log.error(response.error);
452
+ }
453
+ }
454
+ catch (error) {
455
+ log.error('Event processor batch failed', { handler: batch.handler, error });
456
+ response.error = (0, errors_1.getErrorMessage)(error);
457
+ }
458
+ finally {
459
+ this.clearActiveHandlerContext();
460
+ }
461
+ this.sendMessage(response);
462
+ }
463
+ async handleEventSourceConfig(config) {
464
+ log.debug('Event source config', {
465
+ stream: config.streamId,
466
+ name: config.streamName
467
+ });
468
+ // Store the config for later use during polling
469
+ this.eventSourceConfigs.set(config.streamId, config);
470
+ }
471
+ async handleEventSourcePoll(request) {
472
+ const response = {
473
+ messageType: core_1.WSMessageType.EVENT_SOURCE_POLL_RESULT,
474
+ id: request.id,
475
+ handler: request.handler,
476
+ events: [],
477
+ };
478
+ try {
479
+ const eventSource = this.eventSources.get(request.handler || '');
480
+ const config = this.eventSourceConfigs.get(request.streamId);
481
+ if (eventSource && config) {
482
+ this.setActiveHandlerContext(request.id, request.authTokens || {});
483
+ await eventSource.eventSourcePoll(config, response, request);
484
+ }
485
+ else {
486
+ response.error = `No event source or config: ${request.handler}/${request.streamId}`;
487
+ log.error(response.error);
488
+ }
489
+ }
490
+ catch (error) {
491
+ log.error('Event source poll failed', { handler: request.handler, error });
492
+ response.error = (0, errors_1.getErrorMessage)(error);
493
+ }
494
+ finally {
495
+ this.clearActiveHandlerContext();
496
+ }
497
+ this.sendMessage(response);
498
+ }
499
+ async handleEventSourceValidateConfig(request) {
500
+ log.debug('Event source validate config', { handler: request.handler });
501
+ const response = {
502
+ messageType: core_1.WSMessageType.EVENT_SOURCE_VALIDATE_CONFIG_RESULT,
503
+ id: request.id,
504
+ handler: request.handler,
505
+ };
506
+ try {
507
+ const eventSource = this.eventSources.get(request.handler || '');
508
+ if (eventSource) {
509
+ this.setActiveHandlerContext(request.id, request.authTokens || {});
510
+ await eventSource.eventSourceValidateConfig(response, request);
511
+ }
512
+ else {
513
+ response.error = `No event source registered: ${request.handler}`;
514
+ log.error(response.error);
515
+ }
516
+ }
517
+ catch (error) {
518
+ log.error('Event source validate config failed', {
519
+ handler: request.handler,
520
+ error
521
+ });
522
+ response.error = (0, errors_1.getErrorMessage)(error);
523
+ }
524
+ finally {
525
+ this.clearActiveHandlerContext();
526
+ }
527
+ this.sendMessage(response);
528
+ }
529
+ async handleEventSourceDelete(request) {
530
+ log.debug('Event source delete', {
531
+ handler: request.handler,
532
+ stream: request.streamId
533
+ });
534
+ const response = {
535
+ messageType: core_1.WSMessageType.EVENT_SOURCE_DELETE_RESULT,
536
+ id: request.id,
537
+ handler: request.handler,
538
+ };
539
+ try {
540
+ const eventSource = this.eventSources.get(request.handler || '');
541
+ if (eventSource) {
542
+ this.setActiveHandlerContext(request.id, request.authTokens || {});
543
+ await eventSource.eventSourceDelete(response, request);
544
+ this.eventSourceConfigs.delete(request.streamId);
545
+ }
546
+ else {
547
+ response.error = `No event source registered: ${request.handler}`;
548
+ log.error(response.error);
549
+ }
550
+ }
551
+ catch (error) {
552
+ log.error('Event source delete failed', { handler: request.handler, error });
553
+ response.error = (0, errors_1.getErrorMessage)(error);
554
+ }
555
+ finally {
556
+ this.clearActiveHandlerContext();
557
+ }
558
+ this.sendMessage(response);
559
+ }
560
+ // ============================================================================
561
+ // WebSocket Heartbeat (Ping/Pong)
562
+ // ============================================================================
563
+ /**
564
+ * Setup WebSocket heartbeat for connection liveness detection.
565
+ * Sends periodic pings and detects missing pongs to identify dead connections.
566
+ */
567
+ setupHeartbeat() {
568
+ if (!this.ws) {
569
+ return;
570
+ }
571
+ log.debug('Setting up WebSocket heartbeat', {
572
+ pingInterval: this.PING_INTERVAL_MS,
573
+ pongTimeout: this.PONG_TIMEOUT_MS
574
+ });
575
+ // Send ping every PING_INTERVAL_MS
576
+ this.pingInterval = setInterval(() => {
577
+ if (this.ws && this.ws.readyState === ws_1.default.OPEN && this.isConnected) {
578
+ this.ws.ping();
579
+ // Expect pong within PONG_TIMEOUT_MS
580
+ clearTimeout(this.pongTimeout);
581
+ this.pongTimeout = setTimeout(() => {
582
+ log.warn('Pong timeout - connection appears dead, reconnecting');
583
+ this.ws?.terminate();
584
+ // onClose will trigger reconnection
585
+ }, this.PONG_TIMEOUT_MS);
586
+ }
587
+ }, this.PING_INTERVAL_MS);
588
+ // Listen for pong responses
589
+ this.ws.on('pong', () => {
590
+ if (this.pongTimeout) {
591
+ clearTimeout(this.pongTimeout);
592
+ this.pongTimeout = undefined;
593
+ }
594
+ });
595
+ // Respond to server pings (ws library handles this automatically, but we log it)
596
+ this.ws.on('ping', () => {
597
+ log.debug('Received WebSocket ping from server');
598
+ });
599
+ }
600
+ /**
601
+ * Cleanup heartbeat timers and handlers
602
+ */
603
+ cleanupHeartbeat() {
604
+ if (this.pingInterval) {
605
+ clearInterval(this.pingInterval);
606
+ this.pingInterval = undefined;
607
+ log.debug('Cleared ping interval');
608
+ }
609
+ if (this.pongTimeout) {
610
+ clearTimeout(this.pongTimeout);
611
+ this.pongTimeout = undefined;
612
+ log.debug('Cleared pong timeout');
613
+ }
614
+ }
615
+ // ============================================================================
616
+ // Utilities
617
+ // ============================================================================
618
+ generateId() {
619
+ return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
620
+ }
621
+ }
622
+ exports.HandlerRuntime = HandlerRuntime;
623
+ //# sourceMappingURL=handler_runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler_runtime.js","sourceRoot":"","sources":["../../../src/runtime/handler_runtime.ts"],"names":[],"mappings":"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"}