@nsshunt/stsmessaging 1.0.6

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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/stsmessaging.mjs +892 -0
  4. package/dist/stsmessaging.mjs.map +1 -0
  5. package/dist/stsmessaging.umd.js +891 -0
  6. package/dist/stsmessaging.umd.js.map +1 -0
  7. package/package.json +65 -0
  8. package/types/app_fork.test.d.ts +4 -0
  9. package/types/app_fork.test.d.ts.map +1 -0
  10. package/types/app_fork_file.d.ts +4 -0
  11. package/types/app_fork_file.d.ts.map +1 -0
  12. package/types/app_fork_pair.test.d.ts +2 -0
  13. package/types/app_fork_pair.test.d.ts.map +1 -0
  14. package/types/app_ipc_legacy.d.ts +2 -0
  15. package/types/app_ipc_legacy.d.ts.map +1 -0
  16. package/types/app_ww.d.ts +1 -0
  17. package/types/app_ww.d.ts.map +1 -0
  18. package/types/commonTypes.d.ts +27 -0
  19. package/types/commonTypes.d.ts.map +1 -0
  20. package/types/index.d.ts +6 -0
  21. package/types/index.d.ts.map +1 -0
  22. package/types/ipcMessageHandler.d.ts +39 -0
  23. package/types/ipcMessageHandler.d.ts.map +1 -0
  24. package/types/ipcMessageHandlerPair.d.ts +32 -0
  25. package/types/ipcMessageHandlerPair.d.ts.map +1 -0
  26. package/types/ipcMessageProcessorPrimary.d.ts +26 -0
  27. package/types/ipcMessageProcessorPrimary.d.ts.map +1 -0
  28. package/types/ipcMessageProcessorWorker.d.ts +25 -0
  29. package/types/ipcMessageProcessorWorker.d.ts.map +1 -0
  30. package/types/messagingManager.d.ts +31 -0
  31. package/types/messagingManager.d.ts.map +1 -0
  32. package/types/redisMessageHandler.d.ts +47 -0
  33. package/types/redisMessageHandler.d.ts.map +1 -0
  34. package/types/redisMessageHandler.test.d.ts +2 -0
  35. package/types/redisMessageHandler.test.d.ts.map +1 -0
  36. package/types/webWorkerMessageHandler.d.ts +51 -0
  37. package/types/webWorkerMessageHandler.d.ts.map +1 -0
  38. package/types/webWorkerSupport.d.ts +6 -0
  39. package/types/webWorkerSupport.d.ts.map +1 -0
@@ -0,0 +1,892 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __typeError = (msg) => {
3
+ throw TypeError(msg);
4
+ };
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
8
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
12
+ var _id, _options, _inflightMessages, _messageHeader, _SendMessageNoResponse, _SendMessage, _ProcessMessage, _messagingManager, _options2, _events, _requestChannel, _responseChannel, _redisSubscriber, _redisPublisher, _clients, _pingTimeout, _RedisMessageHandler_instances, LogInfo_fn, LogError_fn, _processRawMessage, _messageSender, _ProcessResponseMessage, _processPayload, _messagingManager2, _options3, _clients2, _events2, _startWorkerOptions, _ProcessWorkerMessageRaw, _processPayload2, _messagingManager3, _options4, _worker, _events3, _startWorkerOptions2, _startPrimaryWorker, _ProcessPrimaryMessageRaw, _ProcessWorkerMessageRaw2, _processPayload3;
13
+ import { v4 } from "uuid";
14
+ import { TinyEmitter } from "tiny-emitter";
15
+ import { Redis } from "ioredis";
16
+ import chalk from "chalk";
17
+ import { defaultLogger } from "@nsshunt/stsutils";
18
+ class MessagingManager {
19
+ constructor(options) {
20
+ __privateAdd(this, _id);
21
+ __privateAdd(this, _options);
22
+ __privateAdd(this, _inflightMessages, {});
23
+ __privateAdd(this, _messageHeader);
24
+ __publicField(this, "SendMessageNoResponse", (payload, options) => {
25
+ __privateGet(this, _SendMessageNoResponse).call(this, payload, options);
26
+ });
27
+ __publicField(this, "SendMessage", (payload, options) => {
28
+ return new Promise((resolve, reject) => {
29
+ __privateGet(this, _SendMessage).call(this, payload, options, (payload2) => {
30
+ resolve(payload2.responsePayload);
31
+ }, (payload2) => {
32
+ reject(payload2.requestPayload);
33
+ });
34
+ });
35
+ });
36
+ __privateAdd(this, _SendMessageNoResponse, (payload, options) => {
37
+ const messageId = v4();
38
+ const requestPayload = {
39
+ header: __privateGet(this, _messageHeader),
40
+ messageId,
41
+ senderId: __privateGet(this, _id),
42
+ senderRole: __privateGet(this, _options).role,
43
+ requestPayload: payload,
44
+ responsePayload: {},
45
+ pid: process.pid.toString(),
46
+ messageType: "REQUEST_NO_RESPONSE"
47
+ };
48
+ __privateGet(this, _options).messageSender(requestPayload, options);
49
+ });
50
+ __privateAdd(this, _SendMessage, (payload, options, callBack, errorCallBack) => {
51
+ const messageId = v4();
52
+ const requestPayload = {
53
+ header: __privateGet(this, _messageHeader),
54
+ messageId,
55
+ senderId: __privateGet(this, _id),
56
+ senderRole: __privateGet(this, _options).role,
57
+ requestPayload: payload,
58
+ responsePayload: {},
59
+ pid: process.pid.toString(),
60
+ messageType: "REQUEST"
61
+ };
62
+ const messageRecord = {
63
+ messageId,
64
+ senderId: __privateGet(this, _id),
65
+ senderRole: __privateGet(this, _options).role,
66
+ requestPayload,
67
+ responses: {},
68
+ // record
69
+ startTime: performance.now(),
70
+ endTime: 0,
71
+ timeout: setTimeout(() => {
72
+ setTimeout(() => {
73
+ delete __privateGet(this, _inflightMessages)[messageRecord.messageId];
74
+ }, 0).unref();
75
+ errorCallBack(requestPayload);
76
+ }, __privateGet(this, _options).requestResponseMessageTimeout).unref(),
77
+ // max message timeout allowed
78
+ callBack,
79
+ errorCallBack
80
+ };
81
+ __privateGet(this, _inflightMessages)[messageRecord.messageId] = messageRecord;
82
+ __privateGet(this, _options).messageSender(requestPayload, options);
83
+ });
84
+ __privateAdd(this, _ProcessMessage, async (msg, options) => {
85
+ if (msg.header && msg.header.localeCompare(__privateGet(this, _messageHeader)) === 0) {
86
+ const message = msg;
87
+ if (__privateGet(this, _inflightMessages)[message.messageId]) {
88
+ const inFlightMessageRecord = __privateGet(this, _inflightMessages)[message.messageId];
89
+ inFlightMessageRecord.responses[message.senderId] = { ...message };
90
+ let completed = true;
91
+ if (__privateGet(this, _options).ProcessResponseMessage) {
92
+ completed = await __privateGet(this, _options).ProcessResponseMessage(inFlightMessageRecord.responses, options);
93
+ if (completed) {
94
+ inFlightMessageRecord.endTime = performance.now();
95
+ clearTimeout(inFlightMessageRecord.timeout);
96
+ inFlightMessageRecord.callBack({
97
+ responsePayload: Object.values(inFlightMessageRecord.responses).map((r) => r.responsePayload)
98
+ }, options);
99
+ delete __privateGet(this, _inflightMessages)[message.messageId];
100
+ }
101
+ } else if (completed) {
102
+ inFlightMessageRecord.endTime = performance.now();
103
+ clearTimeout(inFlightMessageRecord.timeout);
104
+ inFlightMessageRecord.callBack(message, options);
105
+ delete __privateGet(this, _inflightMessages)[message.messageId];
106
+ } else ;
107
+ }
108
+ }
109
+ });
110
+ __publicField(this, "Start", (options) => {
111
+ __privateSet(this, _messageHeader, `__STS__${__privateGet(this, _options).namespace}__${v4()}`);
112
+ __privateGet(this, _options).messageReceiverStart(options);
113
+ });
114
+ __publicField(this, "Stop", (options) => {
115
+ __privateGet(this, _options).messageReceiverStop(options);
116
+ for (const [, iPCMessageProcessorWorkerRecord] of Object.entries(__privateGet(this, _inflightMessages))) {
117
+ if (iPCMessageProcessorWorkerRecord.timeout) {
118
+ clearTimeout(iPCMessageProcessorWorkerRecord.timeout);
119
+ }
120
+ }
121
+ __privateSet(this, _inflightMessages, {});
122
+ });
123
+ // Process a message recieved from a worker
124
+ __publicField(this, "ProcessMessage", async (msg, options) => {
125
+ if (msg.header) {
126
+ const checkName = `__STS__${__privateGet(this, _options).namespace}__`;
127
+ if (msg.header.includes(checkName)) {
128
+ const message = msg;
129
+ if (msg.messageType.localeCompare("REQUEST") === 0 || msg.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
130
+ let processMessage = true;
131
+ if (message.requestPayload.args && message.requestPayload.args.length > 0 && message.requestPayload.args[0].group) {
132
+ const group = message.requestPayload.args[0].group;
133
+ processMessage = __privateGet(this, _options).groups.indexOf(group) === -1 ? false : true;
134
+ }
135
+ if (processMessage) {
136
+ if (msg.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
137
+ __privateGet(this, _options).ProcessRequestMessage(message, options);
138
+ } else {
139
+ message.responsePayload = await __privateGet(this, _options).ProcessRequestMessage(message, options);
140
+ message.senderId = __privateGet(this, _id);
141
+ message.messageType = "RESPONSE";
142
+ __privateGet(this, _options).messageSender(message, options);
143
+ }
144
+ }
145
+ } else {
146
+ __privateGet(this, _ProcessMessage).call(this, msg, options);
147
+ }
148
+ }
149
+ }
150
+ });
151
+ __privateSet(this, _id, v4());
152
+ __privateSet(this, _options, options);
153
+ __privateSet(this, _messageHeader, `__STS__${__privateGet(this, _options).namespace}__${v4()}`);
154
+ }
155
+ get id() {
156
+ return __privateGet(this, _id);
157
+ }
158
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
159
+ ReceivedMessageFromMaster(msg) {
160
+ }
161
+ }
162
+ _id = new WeakMap();
163
+ _options = new WeakMap();
164
+ _inflightMessages = new WeakMap();
165
+ _messageHeader = new WeakMap();
166
+ _SendMessageNoResponse = new WeakMap();
167
+ _SendMessage = new WeakMap();
168
+ _ProcessMessage = new WeakMap();
169
+ const REQUEST_CHANNEL = "__STS__SVC_stsappframework_request";
170
+ const RESPONSE_CHANNEL = "__STS__SVC_stsappframework_response";
171
+ class RedisMessageHandler extends TinyEmitter {
172
+ constructor(options) {
173
+ super();
174
+ __privateAdd(this, _RedisMessageHandler_instances);
175
+ __privateAdd(this, _messagingManager, null);
176
+ __privateAdd(this, _options2);
177
+ __privateAdd(this, _events, {});
178
+ __privateAdd(this, _requestChannel);
179
+ __privateAdd(this, _responseChannel);
180
+ __privateAdd(this, _redisSubscriber);
181
+ __privateAdd(this, _redisPublisher);
182
+ __privateAdd(this, _clients, {});
183
+ __privateAdd(this, _pingTimeout, null);
184
+ __privateAdd(this, _processRawMessage, (channel, rawmessage) => {
185
+ var _a;
186
+ const message = JSON.parse(rawmessage);
187
+ (_a = __privateGet(this, _messagingManager)) == null ? void 0 : _a.ProcessMessage(message, { channel });
188
+ });
189
+ __publicField(this, "AddGroup", (group) => {
190
+ const index = __privateGet(this, _options2).groups.indexOf(group);
191
+ if (index === -1) {
192
+ __privateGet(this, _options2).groups.push(group);
193
+ }
194
+ });
195
+ __publicField(this, "RemoveGroup", (group) => {
196
+ const removeIndex = __privateGet(this, _options2).groups.indexOf(group);
197
+ if (removeIndex !== -1) {
198
+ __privateGet(this, _options2).groups.splice(removeIndex, 1);
199
+ }
200
+ });
201
+ __publicField(this, "SetupPrimary", () => {
202
+ const ipcMessageManagerOptions = {
203
+ logger: __privateGet(this, _options2).logger,
204
+ requestResponseMessageTimeout: 5e3,
205
+ namespace: __privateGet(this, _options2).namespace,
206
+ role: __privateGet(this, _options2).role,
207
+ groups: __privateGet(this, _options2).groups,
208
+ messageSender: __privateGet(this, _messageSender),
209
+ // This method is used to calculate if all responses have been received from multiple clients (broadcast)
210
+ // returns true/false.
211
+ ProcessResponseMessage: __privateGet(this, _ProcessResponseMessage),
212
+ // This gets called when an event is received from a message receiver (when ProcessMessage is invoked from the receiver event handler)
213
+ ProcessRequestMessage: __privateGet(this, _processPayload),
214
+ messageReceiverStart: (options) => {
215
+ __privateGet(this, _redisSubscriber).on("message", __privateGet(this, _processRawMessage));
216
+ },
217
+ messageReceiverStop: (options) => {
218
+ __privateGet(this, _redisSubscriber).off("message", __privateGet(this, _processRawMessage));
219
+ }
220
+ };
221
+ __privateSet(this, _messagingManager, new MessagingManager(ipcMessageManagerOptions));
222
+ });
223
+ __privateAdd(this, _messageSender, (payload, options) => {
224
+ if (payload.messageType.localeCompare("REQUEST") === 0 || payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
225
+ __privateGet(this, _redisPublisher).publish(__privateGet(this, _requestChannel), JSON.stringify(payload));
226
+ } else if (payload.messageType.localeCompare("RESPONSE") === 0) {
227
+ __privateGet(this, _redisPublisher).publish(__privateGet(this, _responseChannel), JSON.stringify(payload));
228
+ }
229
+ });
230
+ __privateAdd(this, _ProcessResponseMessage, async (responses, options) => {
231
+ let found = true;
232
+ let requestGroup = null;
233
+ for (const [responseId, response] of Object.entries(responses)) {
234
+ if (response.requestPayload.args.length > 0 && response.requestPayload.args[0].group) {
235
+ requestGroup = response.requestPayload.args[0].group;
236
+ break;
237
+ }
238
+ }
239
+ if (requestGroup) {
240
+ const clientsInGroup = Object.values(__privateGet(this, _clients)).filter((c) => {
241
+ if (c.groups.indexOf(requestGroup) === -1) {
242
+ return false;
243
+ }
244
+ return true;
245
+ });
246
+ found = true;
247
+ clientsInGroup.forEach((c) => {
248
+ if (!responses[c.id]) {
249
+ found = false;
250
+ }
251
+ });
252
+ } else {
253
+ const clientsInGroup = Object.values(__privateGet(this, _clients));
254
+ found = true;
255
+ clientsInGroup.forEach((c) => {
256
+ if (!responses[c.id]) {
257
+ found = false;
258
+ }
259
+ });
260
+ }
261
+ return found;
262
+ });
263
+ __privateAdd(this, _processPayload, (payload, options) => {
264
+ return new Promise((resolve, reject) => {
265
+ if (payload.messageType.localeCompare("REQUEST") === 0 || payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
266
+ if (payload.requestPayload["__eventName"]) {
267
+ const eventName = payload.requestPayload["__eventName"];
268
+ if (__privateGet(this, _events)[eventName]) {
269
+ try {
270
+ if (payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
271
+ __privateGet(this, _events)[eventName].callback(...payload.requestPayload.args);
272
+ resolve({});
273
+ } else {
274
+ __privateGet(this, _events)[eventName].callback(...payload.requestPayload.args, (responseMessage) => {
275
+ resolve(responseMessage);
276
+ });
277
+ }
278
+ } catch (error) {
279
+ reject(error);
280
+ }
281
+ }
282
+ }
283
+ }
284
+ });
285
+ });
286
+ __publicField(this, "Start", () => {
287
+ var _a;
288
+ (_a = __privateGet(this, _messagingManager)) == null ? void 0 : _a.Start();
289
+ });
290
+ __publicField(this, "Stop", () => {
291
+ var _a;
292
+ if (__privateGet(this, _pingTimeout)) {
293
+ clearTimeout(__privateGet(this, _pingTimeout));
294
+ __privateSet(this, _pingTimeout, null);
295
+ }
296
+ (_a = __privateGet(this, _messagingManager)) == null ? void 0 : _a.Stop();
297
+ __privateGet(this, _redisSubscriber).quit();
298
+ __privateGet(this, _redisSubscriber).disconnect();
299
+ __privateGet(this, _redisPublisher).quit();
300
+ __privateGet(this, _redisPublisher).disconnect();
301
+ });
302
+ __publicField(this, "emitex", async (event, ...args) => {
303
+ return __privateGet(this, _messagingManager).SendMessage({
304
+ __eventName: event,
305
+ args
306
+ });
307
+ });
308
+ __publicField(this, "emitNoResponse", async (event, ...args) => {
309
+ __privateGet(this, _messagingManager).SendMessageNoResponse({
310
+ __eventName: event,
311
+ args
312
+ });
313
+ });
314
+ __privateSet(this, _options2, options);
315
+ __privateSet(this, _requestChannel, REQUEST_CHANNEL);
316
+ __privateSet(this, _responseChannel, RESPONSE_CHANNEL);
317
+ const redisOptions = {
318
+ showFriendlyErrorStack: true,
319
+ maxRetriesPerRequest: 20
320
+ };
321
+ __privateSet(this, _redisSubscriber, new Redis(__privateGet(this, _options2).redisUrl, redisOptions));
322
+ __privateSet(this, _redisPublisher, new Redis(__privateGet(this, _options2).redisUrl, redisOptions));
323
+ __privateGet(this, _redisSubscriber).subscribe(__privateGet(this, _requestChannel), __privateGet(this, _responseChannel), (error, count) => {
324
+ if (error) {
325
+ __privateMethod(this, _RedisMessageHandler_instances, LogError_fn).call(this, chalk.red(`RedisAdminManager:constructor(): PID: [${process.pid}] Role: [${__privateGet(this, _options2).role}] Error - Failed to subscribe: [${error}]`));
326
+ } else {
327
+ __privateMethod(this, _RedisMessageHandler_instances, LogInfo_fn).call(this, chalk.white(`RedisAdminManager:constructor(): PID: [${process.pid}] Role: [${__privateGet(this, _options2).role}] Subscribed successfully! This client is currently subscribed to ${count} channels.`));
328
+ }
329
+ });
330
+ this.SetupPrimary();
331
+ if (__privateGet(this, _options2).role.localeCompare("CLIENT") === 0) {
332
+ const ping = () => {
333
+ __privateSet(this, _pingTimeout, setTimeout(() => {
334
+ const pingData = {
335
+ id: __privateGet(this, _messagingManager).id,
336
+ groups: __privateGet(this, _options2).groups
337
+ };
338
+ if (__privateGet(this, _options2).extraData) {
339
+ pingData.extraData = __privateGet(this, _options2).extraData;
340
+ }
341
+ this.emitNoResponse("ping", pingData);
342
+ ping();
343
+ }, 1e3).unref());
344
+ };
345
+ ping();
346
+ } else {
347
+ this.on("ping", (pingData, callback) => {
348
+ const { id, groups, extraData } = pingData;
349
+ if (__privateGet(this, _clients)[id]) {
350
+ clearTimeout(__privateGet(this, _clients)[id].timeout);
351
+ __privateGet(this, _clients)[id].pingCount++;
352
+ __privateGet(this, _clients)[id].timeout = setTimeout(() => {
353
+ delete __privateGet(this, _clients)[id];
354
+ }, 2e3);
355
+ __privateGet(this, _clients)[id].groups = groups;
356
+ __privateGet(this, _clients)[id].extraData = extraData;
357
+ } else {
358
+ __privateGet(this, _clients)[id] = {
359
+ id,
360
+ clientConnected: /* @__PURE__ */ new Date(),
361
+ pingCount: 0,
362
+ timeout: setTimeout(() => {
363
+ delete __privateGet(this, _clients)[id];
364
+ }, 2e3),
365
+ groups,
366
+ extraData
367
+ };
368
+ }
369
+ });
370
+ }
371
+ }
372
+ get clients() {
373
+ return __privateGet(this, _clients);
374
+ }
375
+ get groups() {
376
+ return __privateGet(this, _options2).groups;
377
+ }
378
+ // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {
379
+ on(event, callback, ctx) {
380
+ if (__privateGet(this, _events)[event]) {
381
+ delete __privateGet(this, _events)[event];
382
+ }
383
+ const eventObject = {
384
+ event,
385
+ callback,
386
+ ctx
387
+ };
388
+ __privateGet(this, _events)[eventObject.event] = eventObject;
389
+ return this;
390
+ }
391
+ off(event, callback) {
392
+ if (__privateGet(this, _events)[event]) {
393
+ delete __privateGet(this, _events)[event];
394
+ }
395
+ return this;
396
+ }
397
+ emit(event, ...args) {
398
+ (async () => {
399
+ var _a;
400
+ try {
401
+ const retVal = await ((_a = __privateGet(this, _messagingManager)) == null ? void 0 : _a.SendMessage({
402
+ __eventName: event,
403
+ args: args.slice(0, args.length - 1)
404
+ }));
405
+ args[args.length - 1](retVal);
406
+ } catch (error) {
407
+ if (__privateGet(this, _options2).ignoreEvents) {
408
+ if (__privateGet(this, _options2).ignoreEvents.indexOf(error.__eventName) !== -1) {
409
+ return;
410
+ }
411
+ }
412
+ __privateGet(this, _options2).logger.error(chalk.red(`RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));
413
+ }
414
+ })();
415
+ return this;
416
+ }
417
+ emitWithError(event, args, responseCb, errorCb) {
418
+ (async () => {
419
+ var _a;
420
+ try {
421
+ const retVal = await ((_a = __privateGet(this, _messagingManager)) == null ? void 0 : _a.SendMessage({
422
+ __eventName: event,
423
+ args: [args]
424
+ }));
425
+ responseCb(retVal);
426
+ } catch (error) {
427
+ if (__privateGet(this, _options2).ignoreEvents) {
428
+ if (__privateGet(this, _options2).ignoreEvents.indexOf(error.__eventName) !== -1) {
429
+ return;
430
+ }
431
+ }
432
+ errorCb(error);
433
+ }
434
+ })();
435
+ return this;
436
+ }
437
+ }
438
+ _messagingManager = new WeakMap();
439
+ _options2 = new WeakMap();
440
+ _events = new WeakMap();
441
+ _requestChannel = new WeakMap();
442
+ _responseChannel = new WeakMap();
443
+ _redisSubscriber = new WeakMap();
444
+ _redisPublisher = new WeakMap();
445
+ _clients = new WeakMap();
446
+ _pingTimeout = new WeakMap();
447
+ _RedisMessageHandler_instances = new WeakSet();
448
+ LogInfo_fn = function(message) {
449
+ __privateGet(this, _options2).logger.info(message);
450
+ };
451
+ LogError_fn = function(message) {
452
+ __privateGet(this, _options2).logger.error(message);
453
+ };
454
+ _processRawMessage = new WeakMap();
455
+ _messageSender = new WeakMap();
456
+ _ProcessResponseMessage = new WeakMap();
457
+ _processPayload = new WeakMap();
458
+ class IPCMessageHandler extends TinyEmitter {
459
+ constructor(options) {
460
+ super();
461
+ __privateAdd(this, _messagingManager2, null);
462
+ __privateAdd(this, _options3);
463
+ __privateAdd(this, _clients2, {});
464
+ __privateAdd(this, _events2, {});
465
+ __privateAdd(this, _startWorkerOptions);
466
+ __publicField(this, "AddClient", (client) => {
467
+ const id = v4();
468
+ const processMessage = (payload) => {
469
+ var _a;
470
+ (_a = __privateGet(this, _messagingManager2)) == null ? void 0 : _a.ProcessMessage(payload, { client });
471
+ };
472
+ client.on("message", processMessage);
473
+ __privateGet(this, _clients2)[id] = {
474
+ client,
475
+ processMessage
476
+ };
477
+ return id;
478
+ });
479
+ __publicField(this, "RemoveClient", (id) => {
480
+ const clientRecord = __privateGet(this, _clients2)[id];
481
+ if (clientRecord) {
482
+ clientRecord.client.off("message", clientRecord.processMessage);
483
+ delete __privateGet(this, _clients2)[id];
484
+ }
485
+ });
486
+ __publicField(this, "SetupPrimary", () => {
487
+ const ipcMessageManagerOptions = {
488
+ logger: defaultLogger,
489
+ requestResponseMessageTimeout: 5e3,
490
+ namespace: __privateGet(this, _options3).namespace,
491
+ role: "SERVER",
492
+ messageSender: (payload, options) => {
493
+ options.client.send(payload);
494
+ },
495
+ ProcessRequestMessage: async (payload, options) => {
496
+ return __privateGet(this, _processPayload2).call(this, payload, options);
497
+ },
498
+ //@@ also need way to add/remove a worker/child to the collection
499
+ //@@ the ping should also auto remove (such as a failed worker)
500
+ messageReceiverStart: (options) => {
501
+ },
502
+ messageReceiverStop: (options) => {
503
+ },
504
+ groups: []
505
+ };
506
+ __privateSet(this, _messagingManager2, new MessagingManager(ipcMessageManagerOptions));
507
+ });
508
+ __privateAdd(this, _ProcessWorkerMessageRaw, (payload) => {
509
+ var _a;
510
+ (_a = __privateGet(this, _messagingManager2)) == null ? void 0 : _a.ProcessMessage(payload, __privateGet(this, _startWorkerOptions));
511
+ });
512
+ __publicField(this, "SetupWorker", () => {
513
+ const ipcMessageManagerOptions = {
514
+ logger: defaultLogger,
515
+ requestResponseMessageTimeout: __privateGet(this, _options3).requestResponseMessageTimeout,
516
+ namespace: __privateGet(this, _options3).namespace,
517
+ role: "CLIENT",
518
+ messageSender: (payload, options) => {
519
+ process.send(payload);
520
+ },
521
+ ProcessRequestMessage: async (payload, options) => {
522
+ return __privateGet(this, _processPayload2).call(this, payload, options);
523
+ },
524
+ messageReceiverStart: (options) => {
525
+ __privateSet(this, _startWorkerOptions, { ...options });
526
+ process.on("message", __privateGet(this, _ProcessWorkerMessageRaw));
527
+ },
528
+ messageReceiverStop: (options) => {
529
+ process.off("message", __privateGet(this, _ProcessWorkerMessageRaw));
530
+ },
531
+ groups: []
532
+ };
533
+ __privateSet(this, _messagingManager2, new MessagingManager(ipcMessageManagerOptions));
534
+ });
535
+ __publicField(this, "SendMessage", async (payload) => {
536
+ var _a, _b;
537
+ if (__privateGet(this, _messagingManager2)) {
538
+ if (__privateGet(this, _options3).role.localeCompare("CLIENT") === 0) {
539
+ return (_a = __privateGet(this, _messagingManager2)) == null ? void 0 : _a.SendMessage(payload, {});
540
+ } else {
541
+ const promArray = [];
542
+ for (const [clientId, clientRecord] of Object.entries(__privateGet(this, _clients2))) {
543
+ promArray.push((_b = __privateGet(this, _messagingManager2)) == null ? void 0 : _b.SendMessage(payload, { client: clientRecord.client }));
544
+ }
545
+ try {
546
+ const retVal = await Promise.all(promArray);
547
+ return {
548
+ result: retVal
549
+ };
550
+ } catch (error) {
551
+ return {};
552
+ }
553
+ }
554
+ } else {
555
+ return {};
556
+ }
557
+ });
558
+ __privateAdd(this, _processPayload2, (payload, options) => {
559
+ return new Promise((resolve, reject) => {
560
+ if (payload.messageType.localeCompare("REQUEST") === 0 || payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
561
+ if (payload.requestPayload["__eventName"]) {
562
+ const eventName = payload.requestPayload["__eventName"];
563
+ if (__privateGet(this, _events2)[eventName]) {
564
+ try {
565
+ if (payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
566
+ __privateGet(this, _events2)[eventName].callback(...payload.requestPayload.args);
567
+ resolve({});
568
+ } else {
569
+ __privateGet(this, _events2)[eventName].callback(...payload.requestPayload.args, (responseMessage) => {
570
+ resolve(responseMessage);
571
+ });
572
+ }
573
+ } catch (error) {
574
+ reject(error);
575
+ }
576
+ }
577
+ }
578
+ }
579
+ });
580
+ });
581
+ // Supply complete collection of workers
582
+ __publicField(this, "Start", () => {
583
+ var _a;
584
+ (_a = __privateGet(this, _messagingManager2)) == null ? void 0 : _a.Start({});
585
+ });
586
+ // Supply complete collection of workers
587
+ __publicField(this, "Stop", () => {
588
+ var _a;
589
+ (_a = __privateGet(this, _messagingManager2)) == null ? void 0 : _a.Stop({});
590
+ });
591
+ __publicField(this, "emitNoResponse", async (event, ...args) => {
592
+ if (__privateGet(this, _options3).role.localeCompare("CLIENT") === 0) {
593
+ __privateGet(this, _messagingManager2).SendMessageNoResponse({
594
+ __eventName: event,
595
+ args
596
+ });
597
+ } else {
598
+ for (const [clientId, clientRecord] of Object.entries(__privateGet(this, _clients2))) {
599
+ __privateGet(this, _messagingManager2).SendMessageNoResponse({
600
+ __eventName: event,
601
+ args
602
+ }, { client: clientRecord.client });
603
+ }
604
+ }
605
+ });
606
+ __privateSet(this, _options3, options);
607
+ if (options.role.localeCompare("CLIENT") === 0) {
608
+ this.SetupWorker();
609
+ } else {
610
+ this.SetupPrimary();
611
+ }
612
+ }
613
+ get __events() {
614
+ return __privateGet(this, _events2);
615
+ }
616
+ get clients() {
617
+ return __privateGet(this, _clients2);
618
+ }
619
+ // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {
620
+ on(event, callback, ctx) {
621
+ if (__privateGet(this, _events2)[event]) {
622
+ delete __privateGet(this, _events2)[event];
623
+ }
624
+ const eventObject = {
625
+ event,
626
+ callback,
627
+ ctx
628
+ };
629
+ __privateGet(this, _events2)[eventObject.event] = eventObject;
630
+ return this;
631
+ }
632
+ off(event, callback) {
633
+ if (__privateGet(this, _events2)[event]) {
634
+ delete __privateGet(this, _events2)[event];
635
+ }
636
+ return this;
637
+ }
638
+ /*
639
+ override emit(event: string, ...args: any[]): this {
640
+ const sendMessage = async () => {
641
+ const retVal = await this.SendMessage({
642
+ __eventName: event,
643
+ args: args.slice(0, args.length-1)
644
+ });
645
+ // Invoke the response callback
646
+ args[args.length-1](retVal);
647
+ };
648
+ sendMessage();
649
+ return this;
650
+ //return super.emit(event, ...args);
651
+ }
652
+ */
653
+ emit(event, ...args) {
654
+ (async () => {
655
+ try {
656
+ const retVal = await this.SendMessage({
657
+ __eventName: event,
658
+ args: args.slice(0, args.length - 1)
659
+ });
660
+ args[args.length - 1](retVal);
661
+ } catch (error) {
662
+ if (__privateGet(this, _options3).ignoreEvents) {
663
+ if (__privateGet(this, _options3).ignoreEvents.indexOf(error.__eventName) !== -1) {
664
+ return;
665
+ }
666
+ }
667
+ console.log(error);
668
+ __privateGet(this, _options3).logger.error(chalk.red(`IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));
669
+ }
670
+ })();
671
+ return this;
672
+ }
673
+ }
674
+ _messagingManager2 = new WeakMap();
675
+ _options3 = new WeakMap();
676
+ _clients2 = new WeakMap();
677
+ _events2 = new WeakMap();
678
+ _startWorkerOptions = new WeakMap();
679
+ _ProcessWorkerMessageRaw = new WeakMap();
680
+ _processPayload2 = new WeakMap();
681
+ class IPCMessageHandlerPair extends TinyEmitter {
682
+ constructor(options) {
683
+ super();
684
+ __privateAdd(this, _messagingManager3, null);
685
+ __privateAdd(this, _options4);
686
+ __privateAdd(this, _worker, null);
687
+ __privateAdd(this, _events3, {});
688
+ __privateAdd(this, _startWorkerOptions2);
689
+ __privateAdd(this, _startPrimaryWorker, null);
690
+ __privateAdd(this, _ProcessPrimaryMessageRaw, (payload) => {
691
+ var _a;
692
+ (_a = __privateGet(this, _messagingManager3)) == null ? void 0 : _a.ProcessMessage(payload, { worker: __privateGet(this, _startPrimaryWorker) });
693
+ });
694
+ __publicField(this, "SetupPrimary", () => {
695
+ const ipcMessageManagerOptions = {
696
+ logger: defaultLogger,
697
+ requestResponseMessageTimeout: 5e3,
698
+ namespace: __privateGet(this, _options4).namespace,
699
+ role: "SERVER",
700
+ messageSender: (payload, options) => {
701
+ options.worker.send(payload);
702
+ },
703
+ ProcessRequestMessage: async (payload, options) => {
704
+ return __privateGet(this, _processPayload3).call(this, payload, options);
705
+ },
706
+ //@@ also need way to add/remove a worker/child to the collection
707
+ //@@ the ping should also auto remove (such as a failed worker)
708
+ messageReceiverStart: (options) => {
709
+ const worker = options.worker;
710
+ __privateSet(this, _startPrimaryWorker, worker);
711
+ worker.on("message", __privateGet(this, _ProcessPrimaryMessageRaw));
712
+ },
713
+ messageReceiverStop: (options) => {
714
+ const worker = options.worker;
715
+ worker.off("message", __privateGet(this, _ProcessPrimaryMessageRaw));
716
+ },
717
+ groups: []
718
+ };
719
+ __privateSet(this, _messagingManager3, new MessagingManager(ipcMessageManagerOptions));
720
+ });
721
+ __privateAdd(this, _ProcessWorkerMessageRaw2, (payload) => {
722
+ var _a;
723
+ (_a = __privateGet(this, _messagingManager3)) == null ? void 0 : _a.ProcessMessage(payload, __privateGet(this, _startWorkerOptions2));
724
+ });
725
+ __publicField(this, "SetupWorker", () => {
726
+ const ipcMessageManagerOptions = {
727
+ logger: defaultLogger,
728
+ requestResponseMessageTimeout: __privateGet(this, _options4).requestResponseMessageTimeout,
729
+ namespace: __privateGet(this, _options4).namespace,
730
+ role: "CLIENT",
731
+ messageSender: (payload, options) => {
732
+ process.send(payload);
733
+ },
734
+ ProcessRequestMessage: async (payload, options) => {
735
+ return __privateGet(this, _processPayload3).call(this, payload, options);
736
+ },
737
+ messageReceiverStart: (options) => {
738
+ __privateSet(this, _startWorkerOptions2, { ...options });
739
+ process.on("message", __privateGet(this, _ProcessWorkerMessageRaw2));
740
+ },
741
+ messageReceiverStop: (options) => {
742
+ process.off("message", __privateGet(this, _ProcessWorkerMessageRaw2));
743
+ },
744
+ groups: []
745
+ };
746
+ __privateSet(this, _messagingManager3, new MessagingManager(ipcMessageManagerOptions));
747
+ });
748
+ __publicField(this, "SendMessage", async (payload) => {
749
+ var _a, _b;
750
+ if (__privateGet(this, _messagingManager3)) {
751
+ if (__privateGet(this, _worker)) {
752
+ return (_a = __privateGet(this, _messagingManager3)) == null ? void 0 : _a.SendMessage(payload, { worker: __privateGet(this, _worker) });
753
+ } else {
754
+ return (_b = __privateGet(this, _messagingManager3)) == null ? void 0 : _b.SendMessage(payload, {});
755
+ }
756
+ } else {
757
+ return {};
758
+ }
759
+ });
760
+ __privateAdd(this, _processPayload3, (payload, options) => {
761
+ return new Promise((resolve, reject) => {
762
+ if (payload.messageType.localeCompare("REQUEST") === 0 || payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
763
+ if (payload.requestPayload["__eventName"]) {
764
+ const eventName = payload.requestPayload["__eventName"];
765
+ if (__privateGet(this, _events3)[eventName]) {
766
+ try {
767
+ if (payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
768
+ __privateGet(this, _events3)[eventName].callback(...payload.requestPayload.args);
769
+ resolve({});
770
+ } else {
771
+ __privateGet(this, _events3)[eventName].callback(...payload.requestPayload.args, (responseMessage) => {
772
+ resolve(responseMessage);
773
+ });
774
+ }
775
+ } catch (error) {
776
+ reject(error);
777
+ }
778
+ }
779
+ }
780
+ }
781
+ });
782
+ });
783
+ // Supply complete collection of workers
784
+ __publicField(this, "Start", (worker) => {
785
+ var _a, _b;
786
+ if (worker) {
787
+ (_a = __privateGet(this, _messagingManager3)) == null ? void 0 : _a.Start({ worker });
788
+ __privateSet(this, _worker, worker);
789
+ } else {
790
+ (_b = __privateGet(this, _messagingManager3)) == null ? void 0 : _b.Start({});
791
+ }
792
+ });
793
+ // Supply complete collection of workers
794
+ __publicField(this, "Stop", () => {
795
+ var _a, _b;
796
+ if (__privateGet(this, _worker)) {
797
+ (_a = __privateGet(this, _messagingManager3)) == null ? void 0 : _a.Stop({ worker: __privateGet(this, _worker) });
798
+ __privateSet(this, _worker, null);
799
+ } else {
800
+ (_b = __privateGet(this, _messagingManager3)) == null ? void 0 : _b.Stop({});
801
+ }
802
+ });
803
+ __publicField(this, "emitNoResponse", async (event, ...args) => {
804
+ __privateGet(this, _messagingManager3).SendMessageNoResponse({
805
+ __eventName: event,
806
+ args
807
+ });
808
+ });
809
+ __privateSet(this, _options4, options);
810
+ if (options.role.localeCompare("CLIENT") === 0) {
811
+ this.SetupWorker();
812
+ } else {
813
+ this.SetupPrimary();
814
+ }
815
+ }
816
+ get __events() {
817
+ return __privateGet(this, _events3);
818
+ }
819
+ // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {
820
+ on(event, callback, ctx) {
821
+ if (__privateGet(this, _events3)[event]) {
822
+ delete __privateGet(this, _events3)[event];
823
+ }
824
+ const eventObject = {
825
+ event,
826
+ callback,
827
+ ctx
828
+ };
829
+ __privateGet(this, _events3)[eventObject.event] = eventObject;
830
+ return this;
831
+ }
832
+ off(event, callback) {
833
+ if (__privateGet(this, _events3)[event]) {
834
+ delete __privateGet(this, _events3)[event];
835
+ }
836
+ return this;
837
+ }
838
+ get worker() {
839
+ return __privateGet(this, _worker);
840
+ }
841
+ /*
842
+ override emit(event: string, ...args: any[]): this {
843
+ const sendMessage = async () => {
844
+ const retVal = await this.SendMessage({
845
+ __eventName: event,
846
+ args: args.slice(0, args.length-1)
847
+ });
848
+ // Invoke the response callback
849
+ args[args.length-1](retVal);
850
+ };
851
+ sendMessage();
852
+ return this;
853
+ //return super.emit(event, ...args);
854
+ }
855
+ */
856
+ emit(event, ...args) {
857
+ (async () => {
858
+ try {
859
+ const retVal = await this.SendMessage({
860
+ __eventName: event,
861
+ args: args.slice(0, args.length - 1)
862
+ });
863
+ args[args.length - 1](retVal);
864
+ } catch (error) {
865
+ if (__privateGet(this, _options4).ignoreEvents) {
866
+ if (__privateGet(this, _options4).ignoreEvents.indexOf(error.__eventName) !== -1) {
867
+ return;
868
+ }
869
+ }
870
+ console.log(error);
871
+ __privateGet(this, _options4).logger.error(chalk.red(`IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));
872
+ }
873
+ })();
874
+ return this;
875
+ }
876
+ }
877
+ _messagingManager3 = new WeakMap();
878
+ _options4 = new WeakMap();
879
+ _worker = new WeakMap();
880
+ _events3 = new WeakMap();
881
+ _startWorkerOptions2 = new WeakMap();
882
+ _startPrimaryWorker = new WeakMap();
883
+ _ProcessPrimaryMessageRaw = new WeakMap();
884
+ _ProcessWorkerMessageRaw2 = new WeakMap();
885
+ _processPayload3 = new WeakMap();
886
+ export {
887
+ IPCMessageHandler,
888
+ IPCMessageHandlerPair,
889
+ MessagingManager,
890
+ RedisMessageHandler
891
+ };
892
+ //# sourceMappingURL=stsmessaging.mjs.map