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