@nsshunt/stsmessaging 1.0.74 → 1.0.76
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.
- package/dist/index.cjs +26 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +25 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -10
- package/types/commonTypes.d.ts +1 -1
- package/types/commonTypes.d.ts.map +1 -1
- package/types/index.d.ts +5 -5
- package/types/index.d.ts.map +1 -1
- package/types/ipcMessageHandler.d.ts +2 -2
- package/types/ipcMessageHandler.d.ts.map +1 -1
- package/types/ipcMessageHandlerPair.d.ts +2 -2
- package/types/ipcMessageHandlerPair.d.ts.map +1 -1
- package/types/ipcMessageProcessorPrimary.d.ts +3 -3
- package/types/ipcMessageProcessorPrimary.d.ts.map +1 -1
- package/types/ipcMessageProcessorWorker.d.ts +2 -2
- package/types/ipcMessageProcessorWorker.d.ts.map +1 -1
- package/types/messagingManager.d.ts +3 -3
- package/types/messagingManager.d.ts.map +1 -1
- package/types/redisMessageHandler.d.ts +2 -2
- package/types/redisMessageHandler.d.ts.map +1 -1
- package/types/webWorkerMessageHandler.d.ts +3 -3
- package/types/webWorkerMessageHandler.d.ts.map +1 -1
- package/types/webWorkerSupport.d.ts.map +1 -1
package/dist/index.cjs
CHANGED
|
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
}
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
20
20
|
value: mod,
|
|
21
21
|
enumerable: true
|
|
22
22
|
}) : target, mod));
|
|
@@ -148,12 +148,14 @@ var MessagingManager = class {
|
|
|
148
148
|
const group = message.requestPayload.args[0].group;
|
|
149
149
|
processMessage = this.#options.groups.indexOf(group) === -1 ? false : true;
|
|
150
150
|
}
|
|
151
|
-
if (processMessage)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
151
|
+
if (processMessage) {
|
|
152
|
+
if (msg.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) this.#options.ProcessRequestMessage(message, options);
|
|
153
|
+
else {
|
|
154
|
+
message.responsePayload = await this.#options.ProcessRequestMessage(message, options);
|
|
155
|
+
message.senderId = this.#id;
|
|
156
|
+
message.messageType = "RESPONSE";
|
|
157
|
+
this.#options.messageSender(message, options);
|
|
158
|
+
}
|
|
157
159
|
}
|
|
158
160
|
} else this.#ProcessMessage(msg, options);
|
|
159
161
|
}
|
|
@@ -399,7 +401,7 @@ var RedisMessageHandler = class extends tiny_emitter.TinyEmitter {
|
|
|
399
401
|
//#region src/ipcMessageHandler.ts
|
|
400
402
|
/**
|
|
401
403
|
* IPC Message Handling.
|
|
402
|
-
*
|
|
404
|
+
*
|
|
403
405
|
* This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.
|
|
404
406
|
* This class can be used for both tghe cluster primary and the cluster worker.
|
|
405
407
|
* Note: Currently groups handling is not supported. Use the redis version for this capability.
|
|
@@ -486,17 +488,18 @@ var IPCMessageHandler = class extends tiny_emitter.TinyEmitter {
|
|
|
486
488
|
this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);
|
|
487
489
|
};
|
|
488
490
|
SendMessage = async (payload) => {
|
|
489
|
-
if (this.#messagingManager)
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
491
|
+
if (this.#messagingManager) {
|
|
492
|
+
if (this.#options.role.localeCompare("CLIENT") === 0) return this.#messagingManager?.SendMessage(payload, {});
|
|
493
|
+
else {
|
|
494
|
+
const promArray = [];
|
|
495
|
+
for (const [clientId, clientRecord] of Object.entries(this.#clients)) promArray.push(this.#messagingManager?.SendMessage(payload, { client: clientRecord.client }));
|
|
496
|
+
try {
|
|
497
|
+
return { result: await Promise.all(promArray) };
|
|
498
|
+
} catch (error) {
|
|
499
|
+
return {};
|
|
500
|
+
}
|
|
497
501
|
}
|
|
498
|
-
}
|
|
499
|
-
else return {};
|
|
502
|
+
} else return {};
|
|
500
503
|
};
|
|
501
504
|
#processPayload = (payload, options) => {
|
|
502
505
|
return new Promise((resolve, reject) => {
|
|
@@ -570,7 +573,7 @@ var IPCMessageHandler = class extends tiny_emitter.TinyEmitter {
|
|
|
570
573
|
//#region src/ipcMessageHandlerPair.ts
|
|
571
574
|
/**
|
|
572
575
|
* IPC Message Handling.
|
|
573
|
-
*
|
|
576
|
+
*
|
|
574
577
|
* This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.
|
|
575
578
|
* This class can be used for both tghe cluster primary and the cluster worker.
|
|
576
579
|
* Note: Currently groups handling is not supported. Use the redis version for this capability.
|
|
@@ -645,9 +648,10 @@ var IPCMessageHandlerPair = class extends tiny_emitter.TinyEmitter {
|
|
|
645
648
|
this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);
|
|
646
649
|
};
|
|
647
650
|
SendMessage = async (payload) => {
|
|
648
|
-
if (this.#messagingManager)
|
|
649
|
-
|
|
650
|
-
|
|
651
|
+
if (this.#messagingManager) {
|
|
652
|
+
if (this.#worker) return this.#messagingManager?.SendMessage(payload, { worker: this.#worker });
|
|
653
|
+
else return this.#messagingManager?.SendMessage(payload, {});
|
|
654
|
+
} else return {};
|
|
651
655
|
};
|
|
652
656
|
#processPayload = (payload, options) => {
|
|
653
657
|
return new Promise((resolve, reject) => {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["#id","#options","#messageHeader","#SendMessageNoResponse","#SendMessage","#inflightMessages","#ProcessMessage","#options","#requestChannel","#responseChannel","#ioredisSubscriber","#ioredisPublisher","#LogError","#LogInfo","#pingTimeout","#messagingManager","#clients","#messageSender","#ProcessResponseMessage","#processPayload","#processRawMessage","#events","#options","#events","#messagingManager","#clients","#processPayload","#startWorkerOptions","#ProcessWorkerMessageRaw","#options","#events","#messagingManager","#startPrimaryWorker","#processPayload","#ProcessPrimaryMessageRaw","#startWorkerOptions","#ProcessWorkerMessageRaw","#worker"],"sources":["../src/messagingManager.ts","../src/redisMessageHandler.ts","../src/ipcMessageHandler.ts","../src/ipcMessageHandlerPair.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject } from '@nsshunt/stsutils'\n\n//import { randomUUID } from 'node:crypto';\n\nimport { IIPCMessageProcessorIPCPayload, IIPCMessageProcessorWorkerRecord } from './commonTypes.js'\n\nexport interface MessagingManagerOptions {\n logger: ISTSLogger\n requestResponseMessageTimeout: number\n namespace: string\n role: 'SERVER' | 'CLIENT'\n groups: string[]\n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => void\n ProcessRequestMessage: (payload: IIPCMessageProcessorIPCPayload, options: any) => Promise<JSONObject>\n ProcessResponseMessage?: (reesponses: Record<string, IIPCMessageProcessorIPCPayload>, options: any) => Promise<boolean>\n messageReceiverStart: (options: any) => void\n messageReceiverStop: (options: any) => void\n}\n/**\n * todo\n * @typedef {Object} options - todo\n * @property {boolean} [wssServer=false] - Create a web socket server on this worker instance\n */\nexport class MessagingManager {\n #id: string;\n #options: MessagingManagerOptions;\n #inflightMessages: Record<string, IIPCMessageProcessorWorkerRecord> = { };\n #messageHeader: string;\n\n constructor(options: MessagingManagerOptions) {\n this.#id = globalThis.crypto.randomUUID(); // randomUUID();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID();\n }\n\n get id() {\n return this.#id;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ReceivedMessageFromMaster(msg: any) {\n // Override in subclass if required\n }\n\n SendMessageNoResponse = (payload: JSONObject, options?: any): void => {\n this.#SendMessageNoResponse(payload, options);\n };\n\n SendMessage = (payload: JSONObject, options?: any): Promise<JSONObject> => {\n return new Promise((resolve, reject) => {\n this.#SendMessage(payload, options,\n (payload: IIPCMessageProcessorIPCPayload) => {\n resolve(payload.responsePayload);\n },\n (payload: IIPCMessageProcessorIPCPayload) => {\n reject(payload.requestPayload);\n })\n })\n }\n\n #SendMessageNoResponse = (payload: JSONObject, options: any): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: { },\n pid: process.pid.toString(),\n messageType: 'REQUEST_NO_RESPONSE'\n }\n\n //console.log(chalk.blue(`#SendMessageNoResponse: [${JSON.stringify(requestPayload)}]`))\n this.#options.messageSender(requestPayload, options);\n }\n\n #SendMessage = (payload: JSONObject, options: any,\n callBack: (payload: IIPCMessageProcessorIPCPayload) => void, \n errorCallBack: (payload: IIPCMessageProcessorIPCPayload) => void\n ): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: { },\n pid: process.pid.toString(),\n messageType: 'REQUEST'\n }\n const messageRecord = {\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload,\n responses: { }, // record\n startTime: performance.now(),\n endTime: 0,\n timeout: setTimeout(() => {\n //this.#LogDebugMessage(chalk.red(`Timeout has occurred after: [${this.#options.requestResponseMessageTimeout}]ms with message id: [${messageRecord.messageId}]. Details: [${JSON.stringify(this.#inflightMessages[messageRecord.messageId].requestPayload)}]`));\n setTimeout(() => {\n delete this.#inflightMessages[messageRecord.messageId];\n }, 0).unref();\n errorCallBack(requestPayload);\n }, this.#options.requestResponseMessageTimeout).unref(),// max message timeout allowed\n callBack,\n errorCallBack\n }\n this.#inflightMessages[messageRecord.messageId] = messageRecord;\n //this.#LogDebugMessage(chalk.cyan(`sending: [${JSON.stringify(requestPayload)}]`));\n //console.log(chalk.blue(`#SendMessage: [${JSON.stringify(requestPayload)}]`))\n\n this.#options.messageSender(requestPayload, options);\n }\n\n #ProcessMessage = async (msg: any, options: any): Promise<void> => {\n if (msg.header && msg.header.localeCompare(this.#messageHeader) === 0) {\n const message = (msg as IIPCMessageProcessorIPCPayload);\n if (this.#inflightMessages[message.messageId]) {\n const inFlightMessageRecord: IIPCMessageProcessorWorkerRecord = this.#inflightMessages[message.messageId];\n inFlightMessageRecord.responses[message.senderId ] = { ...message };\n let completed = true; // Defaults to true\n if (this.#options.ProcessResponseMessage) {\n completed = await this.#options.ProcessResponseMessage(inFlightMessageRecord.responses, options);\n if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(inFlightMessageRecord.timeout as NodeJS.Timeout);\n inFlightMessageRecord.callBack({\n responsePayload: Object.values(inFlightMessageRecord.responses).map(r => r.responsePayload)\n } as any, options) // \n delete this.#inflightMessages[message.messageId];\n }\n } else if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(inFlightMessageRecord.timeout as NodeJS.Timeout);\n inFlightMessageRecord.callBack(message, options) // inFlightMessageRecord.responses\n //@@inFlightMessageRecord.callBack(Object.values(inFlightMessageRecord.responses), options) // \n delete this.#inflightMessages[message.messageId];\n } else {\n //console.log(chalk.grey(`#ProcessMessage:5`));\n }\n } else {\n //throw new Error(`Could not find Request/Response message with id: [${message.messageId}]`); //@@\n }\n }\n }\n\n Start = (options?: any) => {\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID()\n this.#options.messageReceiverStart(options);\n }\n\n Stop = (options?: any) => {\n // Kill in-flight messages\n this.#options.messageReceiverStop(options);\n\n for (const [, iPCMessageProcessorWorkerRecord] of Object.entries(this.#inflightMessages)) {\n if (iPCMessageProcessorWorkerRecord.timeout) {\n clearTimeout(iPCMessageProcessorWorkerRecord.timeout);\n }\n }\n this.#inflightMessages = { };\n }\n\n // Process a message recieved from a worker\n ProcessMessage = async (msg: any, options: any) => {\n if (msg.header) {\n const checkName = `__STS__${this.#options.namespace}__`; //@@ this is a broadcast becuase the unique uuid is not part of the header test\n if ((msg.header as string).includes(checkName)) {\n const message = (msg as IIPCMessageProcessorIPCPayload);\n if (msg.messageType.localeCompare('REQUEST') === 0 || msg.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n let processMessage = true;\n if (message.requestPayload.args && message.requestPayload.args.length > 0 && message.requestPayload.args[0].group) {\n const group = message.requestPayload.args[0].group;\n processMessage = (this.#options.groups.indexOf(group) === -1) ? false : true;\n }\n if (processMessage) {\n if (msg.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#options.ProcessRequestMessage(message, options);\n } else {\n message.responsePayload = await this.#options.ProcessRequestMessage(message, options);\n message.senderId = this.#id;\n message.messageType = 'RESPONSE';\n this.#options.messageSender(message, options);\n }\n }\n } else {\n // Received a response (to my request)\n this.#ProcessMessage(msg, options);\n }\n }\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject } from '@nsshunt/stsutils'\n\nimport { IIPCMessageProcessorIPCPayload, IEventPayload } from './commonTypes.js'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager.js'\nimport { Redis, RedisOptions } from \"ioredis\";\n\nimport chalk from 'chalk';\n\nconst REQUEST_CHANNEL = '__STS__SVC_stsappframework_request'\nconst RESPONSE_CHANNEL = '__STS__SVC_stsappframework_response'\n\nexport interface IRedisAdminManagerOptions {\n redisUrl: string\n logger: ISTSLogger\n role: 'SERVER' | 'CLIENT'\n namespace: string\n groups: string[]\n ignoreEvents?: string[]\n extraData?: JSONObject\n}\n\nexport interface IClientRecord {\n id: string\n clientConnected: Date\n pingCount: number\n timeout: NodeJS.Timeout\n groups: string[]\n extraData?: JSONObject\n}\n\nexport interface IEventRecord {\n event: string\n callback: any,\n ctx?: any\n}\n\nexport interface IPingData {\n id: string\n groups: string[]\n extraData?: JSONObject\n}\n\nexport class RedisMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IRedisAdminManagerOptions;\n #events: Record<string, IEventRecord> = { };\n #requestChannel: string;\n #responseChannel: string;\n #ioredisSubscriber: Redis;\n #ioredisPublisher: Redis;\n #clients: Record<string, IClientRecord> = { };\n #pingTimeout: NodeJS.Timeout | null = null;\n\n constructor(options: IRedisAdminManagerOptions) {\n super();\n this.#options = options;\n\n this.#requestChannel = REQUEST_CHANNEL\n this.#responseChannel = RESPONSE_CHANNEL\n\n const redisOptions: RedisOptions = {\n showFriendlyErrorStack: true,\n maxRetriesPerRequest: 20\n }\n\n this.#ioredisSubscriber = new Redis(this.#options.redisUrl, redisOptions);\n this.#ioredisPublisher = new Redis(this.#options.redisUrl, redisOptions);\n\n this.#ioredisSubscriber.on(\"error\", (error: Error) => {\n this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisSubscriber on error): [${error}]`));\n });\n\n this.#ioredisPublisher.on(\"error\", (error: Error) => {\n this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisPublisher on error): [${error}]`));\n });\n\n this.#ioredisSubscriber.subscribe(this.#requestChannel, this.#responseChannel, (error, count) => {\n if (error) {\n // Just like other commands, subscribe() can fail for some reasons, // ex network issues.\n this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error - Failed to subscribe: [${error}]`));\n } else {\n // `count` represents the number of channels this client is currently subscribed to.\n this.#LogInfo(chalk.white(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Subscribed successfully! This client is currently subscribed to ${count} channels.`));\n }\n });\n\n this.SetupPrimary();\n\n /*\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n }\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n this.emit('ping', pingData, (response: any) => { });\n ping();\n }, 1000).unref();\n }\n ping();\n\n this.on('ping', (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData\n }\n }\n callback('ok');\n });\n */\n\n if (this.#options.role.localeCompare('CLIENT') === 0) {\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n }\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n //this.emit('ping', pingData, (response: any) => { });\n this.emitNoResponse('ping', pingData);\n ping();\n }, 1000).unref();\n }\n ping();\n } else {\n this.on('ping', (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData\n }\n }\n //callback('ok');\n });\n }\n }\n\n #LogInfo(message: any) {\n this.#options.logger.info(message);\n }\n\n #LogError(message: any) {\n this.#options.logger.error(message);\n }\n\n #processRawMessage = (channel: string, rawmessage: string) => {\n const message = JSON.parse(rawmessage);\n\n /*\n if (message.requestPayload.__eventName.localeCompare('ping') !== 0) {\n console.log(chalk.cyan(`RedisMessageHandler:#processRawMessage(): Role: [${this.#options.role}] Channel: [${channel}] Message: [${JSON.stringify(message)}]`));\n }\n */\n\n this.#messagingManager?.ProcessMessage(message, { channel });\n }\n\n get clients(): Record<string, IClientRecord> {\n return this.#clients;\n }\n\n get groups(): string[] {\n return this.#options.groups;\n }\n \n AddGroup = (group: string) => {\n const index = this.#options.groups.indexOf(group);\n if (index === -1) {\n this.#options.groups.push(group);\n }\n }\n\n RemoveGroup = (group: string) => {\n const removeIndex = this.#options.groups.indexOf(group);\n if (removeIndex !== -1) {\n this.#options.groups.splice(removeIndex, 1);\n }\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: this.#options.logger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: this.#options.role,\n groups: this.#options.groups,\n messageSender: this.#messageSender,\n // This method is used to calculate if all responses have been received from multiple clients (broadcast)\n // returns true/false.\n ProcessResponseMessage: this.#ProcessResponseMessage,\n // This gets called when an event is received from a message receiver (when ProcessMessage is invoked from the receiver event handler)\n ProcessRequestMessage: this.#processPayload,\n \n messageReceiverStart: (options: any) => {\n this.#ioredisSubscriber.on(\"message\", this.#processRawMessage);\n },\n \n messageReceiverStop: (options: any) => {\n this.#ioredisSubscriber.off(\"message\", this.#processRawMessage);\n }\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n \n #messageSender = (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n\n\n //console.log(chalk.grey(JSON.stringify(payload)));\n\n\n this.#ioredisPublisher.publish(this.#requestChannel, JSON.stringify(payload));\n } else if (payload.messageType.localeCompare('RESPONSE') === 0) {\n this.#ioredisPublisher.publish(this.#responseChannel, JSON.stringify(payload));\n }\n }\n\n \n #ProcessResponseMessage = async (responses: Record<string, IIPCMessageProcessorIPCPayload>, options: any): Promise<boolean> => {\n // Now check if we have all responses ...\n\n /*\n let allFound = false;\n\n for (const [responseId, response] of Object.entries(responses)) {\n if (response.senderRole.localeCompare('CLIENT') === 0) {\n allFound = true;\n break;\n }\n }\n if (allFound) {\n return allFound;\n }\n */\n\n let found = true;\n\n // Sender role here is SERVER\n let requestGroup = null;\n for (const [responseId, response] of Object.entries(responses)) {\n if (response.requestPayload.args.length > 0 && response.requestPayload.args[0].group) {\n requestGroup = response.requestPayload.args[0].group;\n break;\n }\n }\n\n if (requestGroup) {\n const clientsInGroup = Object.values(this.#clients).filter(c => {\n if (c.groups.indexOf(requestGroup) === -1) {\n return false;\n }\n return true;\n });\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach(c => {\n if (!responses[c.id]) {\n found = false;\n }\n })\n } else {\n const clientsInGroup = Object.values(this.#clients)\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach(c => {\n if (!responses[c.id]) {\n found = false;\n }\n })\n }\n\n return found;\n }\n\n #processPayload = (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n if (payload.requestPayload['__eventName']) {\n const eventName = payload.requestPayload['__eventName'];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#events[eventName].callback(...payload.requestPayload.args);\n resolve({});\n } else {\n this.#events[eventName].callback(...payload.requestPayload.args, (responseMessage: any) => {\n resolve(responseMessage);\n });\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n }\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject: IEventRecord = {\n event,\n callback,\n ctx\n }\n this.#events[eventObject.event] = eventObject;\n return this;\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n }\n\n Start = () => {\n this.#messagingManager?.Start();\n }\n\n Stop = () => {\n if (this.#pingTimeout) {\n clearTimeout(this.#pingTimeout);\n this.#pingTimeout = null;\n }\n\n this.#messagingManager?.Stop();\n\n this.#ioredisSubscriber.quit();\n this.#ioredisSubscriber.disconnect();\n\n this.#ioredisPublisher.quit();\n this.#ioredisPublisher.disconnect();\n }\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n } as IEventPayload); \n // Invoke the response callback\n args[args.length-1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n this.#options.logger.error(chalk.red(`RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n }\n })();\n return this;\n }\n\n emitWithError(event: string, args: JSONObject, responseCb: (response: JSONObject | undefined) => void, errorCb: (error: any) => void): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: [ args ]\n } as IEventPayload); \n // Invoke the response callback\n responseCb(retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n //this.#options.logger.error(chalk.red(`RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n errorCb(error);\n }\n })();\n return this;\n }\n\n emitex = async(event: string, ...args: any[]): Promise<JSONObject> => {\n return (this.#messagingManager as MessagingManager).SendMessage({\n __eventName: event,\n args\n } as IEventPayload); \n }\n\n emitNoResponse = async(event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload); \n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from '@nsshunt/stsutils'\n\nimport { IIPCMessageProcessorIPCPayload, IEventPayload } from './commonTypes.js'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager.js'\n\nimport chalk from 'chalk';\n\n//import { randomUUID } from 'node:crypto';\n\nexport interface IPCMessageHandlerOptions {\n logger: ISTSLogger\n requestResponseMessageTimeout: number\n namespace: string\n role: 'SERVER' | 'CLIENT'\n ignoreEvents?: string[]\n}\n\ndeclare interface IClientRecord {\n client: any\n processMessage: (client: any) => void\n}\n\n/**\n * IPC Message Handling.\n * \n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerOptions;\n #clients: Record<string, IClientRecord> = { };\n #events: JSONObject = { };\n #startWorkerOptions: any;\n\n constructor(options: IPCMessageHandlerOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare('CLIENT') === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n AddClient = (client: any): string => {\n const id = globalThis.crypto.randomUUID(); // randomUUID();\n\n const processMessage = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, { client });\n };\n\n client.on('message', processMessage);\n this.#clients[id] = {\n client,\n processMessage\n }\n return id;\n }\n\n RemoveClient = (id: string) => {\n const clientRecord = this.#clients[id];\n if (clientRecord) {\n clientRecord.client.off('message', clientRecord.processMessage);\n delete this.#clients[id];\n }\n }\n\n get clients() {\n return this.#clients;\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: 'SERVER',\n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n (options.client as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n \n\n messageReceiverStart: (options: any) => { //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n },\n messageReceiverStop: (options: any) => { //@@ options should be complete collection of workers\n\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, this.#startWorkerOptions);\n }\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: 'CLIENT',\n \n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on('message', this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => { \n process.off('message', this.#ProcessWorkerMessageRaw);\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#options.role.localeCompare('CLIENT') === 0) {\n return this.#messagingManager?.SendMessage(payload, { });\n } else {\n //@@ send to all clients\n const promArray: Promise<JSONObject>[] = [ ];\n for (const [clientId, clientRecord] of Object.entries(this.#clients)) {\n promArray.push(this.#messagingManager?.SendMessage(payload, { client: clientRecord.client }));\n }\n\n try {\n const retVal = await Promise.all(promArray);\n return {\n result: retVal\n };\n } catch (error) {\n return { };\n }\n }\n } else {\n // Error state - no #ipcMessageManager set\n return { };\n }\n }\n\n #processPayload = (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n if (payload.requestPayload['__eventName']) {\n const eventName = payload.requestPayload['__eventName'];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#events[eventName].callback(...payload.requestPayload.args);\n resolve({});\n } else {\n this.#events[eventName].callback(...payload.requestPayload.args, (responseMessage: any) => {\n resolve(responseMessage);\n });\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n }\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx\n }\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = () => {\n this.#messagingManager?.Start({ });\n }\n\n // Supply complete collection of workers\n Stop = () => {\n this.#messagingManager?.Stop({ });\n }\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({ \n __eventName: event,\n args: args.slice(0, args.length-1)\n } as IEventPayload);\n // Invoke the response callback\n args[args.length-1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(chalk.red(`IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n }\n })();\n return this;\n }\n\n emitNoResponse = async(event: string, ...args: any[]): Promise<void> => {\n if (this.#options.role.localeCompare('CLIENT') === 0) {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload); \n } else {\n //@@ send to all clients\n for (const [clientId, clientRecord] of Object.entries(this.#clients)) {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload, { client: clientRecord.client });\n }\n }\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from '@nsshunt/stsutils'\n\nimport { IIPCMessageProcessorIPCPayload, IEventPayload } from './commonTypes.js'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager.js'\n\nimport chalk from 'chalk';\n\nexport interface IPCMessageHandlerPairOptions {\n logger: ISTSLogger\n requestResponseMessageTimeout: number\n namespace: string\n role: 'SERVER' | 'CLIENT'\n ignoreEvents?: string[]\n}\n\n/**\n * IPC Message Handling.\n * \n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandlerPair extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerPairOptions;\n #worker: any = null;\n #events: JSONObject = { };\n #startWorkerOptions: any;\n #startPrimaryWorker: Worker | null = null;\n\n constructor(options: IPCMessageHandlerPairOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare('CLIENT') === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n #ProcessPrimaryMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, { worker: this.#startPrimaryWorker as Worker });\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: 'SERVER',\n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n (options.worker as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n \n\n messageReceiverStart: (options: any) => { //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n const worker = (options.worker as any);\n this.#startPrimaryWorker = worker;\n worker.on('message', this.#ProcessPrimaryMessageRaw);\n },\n messageReceiverStop: (options: any) => { //@@ options should be complete collection of workers\n const worker = (options.worker as any);\n worker.off('message', this.#ProcessPrimaryMessageRaw);\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, this.#startWorkerOptions);\n }\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: 'CLIENT',\n \n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on('message', this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => { \n process.off('message', this.#ProcessWorkerMessageRaw);\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#worker) {\n return this.#messagingManager?.SendMessage(payload, { worker: this.#worker });\n } else {\n return this.#messagingManager?.SendMessage(payload, { });\n }\n } else {\n // Error state - no #ipcMessageManager set\n return { };\n }\n }\n\n #processPayload = (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n if (payload.requestPayload['__eventName']) {\n const eventName = payload.requestPayload['__eventName'];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#events[eventName].callback(...payload.requestPayload.args);\n resolve({});\n } else {\n this.#events[eventName].callback(...payload.requestPayload.args, (responseMessage: any) => {\n resolve(responseMessage);\n });\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n }\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx\n }\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = (worker?: any) => {\n if (worker) {\n this.#messagingManager?.Start({ worker });\n this.#worker = worker;\n } else {\n this.#messagingManager?.Start({ });\n }\n }\n\n // Supply complete collection of workers\n Stop = () => {\n if (this.#worker) {\n this.#messagingManager?.Stop({ worker: this.#worker });\n this.#worker = null;\n } else {\n this.#messagingManager?.Stop({ });\n }\n }\n\n get worker(): Worker | null {\n return this.#worker;\n }\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({ \n __eventName: event,\n args: args.slice(0, args.length-1)\n } as IEventPayload);\n // Invoke the response callback\n args[args.length-1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(chalk.red(`IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n }\n })();\n return this;\n }\n\n emitNoResponse = async(event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload); \n }\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/messagingManager.ts","../src/redisMessageHandler.ts","../src/ipcMessageHandler.ts","../src/ipcMessageHandlerPair.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject } from \"@nsshunt/stsutils\";\n\n//import { randomUUID } from 'node:crypto';\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IIPCMessageProcessorWorkerRecord,\n} from \"./commonTypes.js\";\n\nexport interface MessagingManagerOptions {\n logger: ISTSLogger;\n requestResponseMessageTimeout: number;\n namespace: string;\n role: \"SERVER\" | \"CLIENT\";\n groups: string[];\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => void;\n ProcessRequestMessage: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => Promise<JSONObject>;\n ProcessResponseMessage?: (\n reesponses: Record<string, IIPCMessageProcessorIPCPayload>,\n options: any\n ) => Promise<boolean>;\n messageReceiverStart: (options: any) => void;\n messageReceiverStop: (options: any) => void;\n}\n/**\n * todo\n * @typedef {Object} options - todo\n * @property {boolean} [wssServer=false] - Create a web socket server on this worker instance\n */\nexport class MessagingManager {\n #id: string;\n #options: MessagingManagerOptions;\n #inflightMessages: Record<string, IIPCMessageProcessorWorkerRecord> = {};\n #messageHeader: string;\n\n constructor(options: MessagingManagerOptions) {\n this.#id = globalThis.crypto.randomUUID(); // randomUUID();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID();\n }\n\n get id() {\n return this.#id;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ReceivedMessageFromMaster(msg: any) {\n // Override in subclass if required\n }\n\n SendMessageNoResponse = (payload: JSONObject, options?: any): void => {\n this.#SendMessageNoResponse(payload, options);\n };\n\n SendMessage = (payload: JSONObject, options?: any): Promise<JSONObject> => {\n return new Promise((resolve, reject) => {\n this.#SendMessage(\n payload,\n options,\n (payload: IIPCMessageProcessorIPCPayload) => {\n resolve(payload.responsePayload);\n },\n (payload: IIPCMessageProcessorIPCPayload) => {\n reject(payload.requestPayload);\n }\n );\n });\n };\n\n #SendMessageNoResponse = (payload: JSONObject, options: any): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: {},\n pid: process.pid.toString(),\n messageType: \"REQUEST_NO_RESPONSE\",\n };\n\n //console.log(chalk.blue(`#SendMessageNoResponse: [${JSON.stringify(requestPayload)}]`))\n this.#options.messageSender(requestPayload, options);\n };\n\n #SendMessage = (\n payload: JSONObject,\n options: any,\n callBack: (payload: IIPCMessageProcessorIPCPayload) => void,\n errorCallBack: (payload: IIPCMessageProcessorIPCPayload) => void\n ): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: {},\n pid: process.pid.toString(),\n messageType: \"REQUEST\",\n };\n const messageRecord = {\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload,\n responses: {}, // record\n startTime: performance.now(),\n endTime: 0,\n timeout: setTimeout(() => {\n //this.#LogDebugMessage(chalk.red(`Timeout has occurred after: [${this.#options.requestResponseMessageTimeout}]ms with message id: [${messageRecord.messageId}]. Details: [${JSON.stringify(this.#inflightMessages[messageRecord.messageId].requestPayload)}]`));\n setTimeout(() => {\n delete this.#inflightMessages[messageRecord.messageId];\n }, 0).unref();\n errorCallBack(requestPayload);\n }, this.#options.requestResponseMessageTimeout).unref(), // max message timeout allowed\n callBack,\n errorCallBack,\n };\n this.#inflightMessages[messageRecord.messageId] = messageRecord;\n //this.#LogDebugMessage(chalk.cyan(`sending: [${JSON.stringify(requestPayload)}]`));\n //console.log(chalk.blue(`#SendMessage: [${JSON.stringify(requestPayload)}]`))\n\n this.#options.messageSender(requestPayload, options);\n };\n\n #ProcessMessage = async (msg: any, options: any): Promise<void> => {\n if (msg.header && msg.header.localeCompare(this.#messageHeader) === 0) {\n const message = msg as IIPCMessageProcessorIPCPayload;\n if (this.#inflightMessages[message.messageId]) {\n const inFlightMessageRecord: IIPCMessageProcessorWorkerRecord =\n this.#inflightMessages[message.messageId];\n inFlightMessageRecord.responses[message.senderId] = {\n ...message,\n };\n let completed = true; // Defaults to true\n if (this.#options.ProcessResponseMessage) {\n completed = await this.#options.ProcessResponseMessage(\n inFlightMessageRecord.responses,\n options\n );\n if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(\n inFlightMessageRecord.timeout as NodeJS.Timeout\n );\n inFlightMessageRecord.callBack(\n {\n responsePayload: Object.values(\n inFlightMessageRecord.responses\n ).map((r) => r.responsePayload),\n } as any,\n options\n ); //\n delete this.#inflightMessages[message.messageId];\n }\n } else if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(\n inFlightMessageRecord.timeout as NodeJS.Timeout\n );\n inFlightMessageRecord.callBack(message, options); // inFlightMessageRecord.responses\n //@@inFlightMessageRecord.callBack(Object.values(inFlightMessageRecord.responses), options) //\n delete this.#inflightMessages[message.messageId];\n } else {\n //console.log(chalk.grey(`#ProcessMessage:5`));\n }\n } else {\n //throw new Error(`Could not find Request/Response message with id: [${message.messageId}]`); //@@\n }\n }\n };\n\n Start = (options?: any) => {\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID()\n this.#options.messageReceiverStart(options);\n };\n\n Stop = (options?: any) => {\n // Kill in-flight messages\n this.#options.messageReceiverStop(options);\n\n for (const [, iPCMessageProcessorWorkerRecord] of Object.entries(\n this.#inflightMessages\n )) {\n if (iPCMessageProcessorWorkerRecord.timeout) {\n clearTimeout(iPCMessageProcessorWorkerRecord.timeout);\n }\n }\n this.#inflightMessages = {};\n };\n\n // Process a message recieved from a worker\n ProcessMessage = async (msg: any, options: any) => {\n if (msg.header) {\n const checkName = `__STS__${this.#options.namespace}__`; //@@ this is a broadcast becuase the unique uuid is not part of the header test\n if ((msg.header as string).includes(checkName)) {\n const message = msg as IIPCMessageProcessorIPCPayload;\n if (\n msg.messageType.localeCompare(\"REQUEST\") === 0 ||\n msg.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n let processMessage = true;\n if (\n message.requestPayload.args &&\n message.requestPayload.args.length > 0 &&\n message.requestPayload.args[0].group\n ) {\n const group = message.requestPayload.args[0].group;\n processMessage =\n this.#options.groups.indexOf(group) === -1\n ? false\n : true;\n }\n if (processMessage) {\n if (\n msg.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#options.ProcessRequestMessage(\n message,\n options\n );\n } else {\n message.responsePayload =\n await this.#options.ProcessRequestMessage(\n message,\n options\n );\n message.senderId = this.#id;\n message.messageType = \"RESPONSE\";\n this.#options.messageSender(message, options);\n }\n }\n } else {\n // Received a response (to my request)\n this.#ProcessMessage(msg, options);\n }\n }\n }\n };\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject } from \"@nsshunt/stsutils\";\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IEventPayload,\n} from \"./commonTypes.js\";\n\nimport {\n MessagingManager,\n MessagingManagerOptions,\n} from \"./messagingManager.js\";\nimport { Redis, RedisOptions } from \"ioredis\";\n\nimport chalk from \"chalk\";\n\nconst REQUEST_CHANNEL = \"__STS__SVC_stsappframework_request\";\nconst RESPONSE_CHANNEL = \"__STS__SVC_stsappframework_response\";\n\nexport interface IRedisAdminManagerOptions {\n redisUrl: string;\n logger: ISTSLogger;\n role: \"SERVER\" | \"CLIENT\";\n namespace: string;\n groups: string[];\n ignoreEvents?: string[];\n extraData?: JSONObject;\n}\n\nexport interface IClientRecord {\n id: string;\n clientConnected: Date;\n pingCount: number;\n timeout: NodeJS.Timeout;\n groups: string[];\n extraData?: JSONObject;\n}\n\nexport interface IEventRecord {\n event: string;\n callback: any;\n ctx?: any;\n}\n\nexport interface IPingData {\n id: string;\n groups: string[];\n extraData?: JSONObject;\n}\n\nexport class RedisMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IRedisAdminManagerOptions;\n #events: Record<string, IEventRecord> = {};\n #requestChannel: string;\n #responseChannel: string;\n #ioredisSubscriber: Redis;\n #ioredisPublisher: Redis;\n #clients: Record<string, IClientRecord> = {};\n #pingTimeout: NodeJS.Timeout | null = null;\n\n constructor(options: IRedisAdminManagerOptions) {\n super();\n this.#options = options;\n\n this.#requestChannel = REQUEST_CHANNEL;\n this.#responseChannel = RESPONSE_CHANNEL;\n\n const redisOptions: RedisOptions = {\n showFriendlyErrorStack: true,\n maxRetriesPerRequest: 20,\n };\n\n this.#ioredisSubscriber = new Redis(\n this.#options.redisUrl,\n redisOptions\n );\n this.#ioredisPublisher = new Redis(\n this.#options.redisUrl,\n redisOptions\n );\n\n this.#ioredisSubscriber.on(\"error\", (error: Error) => {\n this.#LogError(\n chalk.red(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisSubscriber on error): [${error}]`\n )\n );\n });\n\n this.#ioredisPublisher.on(\"error\", (error: Error) => {\n this.#LogError(\n chalk.red(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisPublisher on error): [${error}]`\n )\n );\n });\n\n this.#ioredisSubscriber.subscribe(\n this.#requestChannel,\n this.#responseChannel,\n (error, count) => {\n if (error) {\n // Just like other commands, subscribe() can fail for some reasons, // ex network issues.\n this.#LogError(\n chalk.red(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error - Failed to subscribe: [${error}]`\n )\n );\n } else {\n // `count` represents the number of channels this client is currently subscribed to.\n this.#LogInfo(\n chalk.white(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Subscribed successfully! This client is currently subscribed to ${count} channels.`\n )\n );\n }\n }\n );\n\n this.SetupPrimary();\n\n /*\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n }\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n this.emit('ping', pingData, (response: any) => { });\n ping();\n }, 1000).unref();\n }\n ping();\n\n this.on('ping', (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData\n }\n }\n callback('ok');\n });\n */\n\n if (this.#options.role.localeCompare(\"CLIENT\") === 0) {\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n };\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n //this.emit('ping', pingData, (response: any) => { });\n this.emitNoResponse(\"ping\", pingData);\n ping();\n }, 1000).unref();\n };\n ping();\n } else {\n this.on(\"ping\", (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData,\n };\n }\n //callback('ok');\n });\n }\n }\n\n #LogInfo(message: any) {\n this.#options.logger.info(message);\n }\n\n #LogError(message: any) {\n this.#options.logger.error(message);\n }\n\n #processRawMessage = (channel: string, rawmessage: string) => {\n const message = JSON.parse(rawmessage);\n\n /*\n if (message.requestPayload.__eventName.localeCompare('ping') !== 0) {\n console.log(chalk.cyan(`RedisMessageHandler:#processRawMessage(): Role: [${this.#options.role}] Channel: [${channel}] Message: [${JSON.stringify(message)}]`));\n }\n */\n\n this.#messagingManager?.ProcessMessage(message, { channel });\n };\n\n get clients(): Record<string, IClientRecord> {\n return this.#clients;\n }\n\n get groups(): string[] {\n return this.#options.groups;\n }\n\n AddGroup = (group: string) => {\n const index = this.#options.groups.indexOf(group);\n if (index === -1) {\n this.#options.groups.push(group);\n }\n };\n\n RemoveGroup = (group: string) => {\n const removeIndex = this.#options.groups.indexOf(group);\n if (removeIndex !== -1) {\n this.#options.groups.splice(removeIndex, 1);\n }\n };\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: this.#options.logger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: this.#options.role,\n groups: this.#options.groups,\n messageSender: this.#messageSender,\n // This method is used to calculate if all responses have been received from multiple clients (broadcast)\n // returns true/false.\n ProcessResponseMessage: this.#ProcessResponseMessage,\n // This gets called when an event is received from a message receiver (when ProcessMessage is invoked from the receiver event handler)\n ProcessRequestMessage: this.#processPayload,\n\n messageReceiverStart: (options: any) => {\n this.#ioredisSubscriber.on(\"message\", this.#processRawMessage);\n },\n\n messageReceiverStop: (options: any) => {\n this.#ioredisSubscriber.off(\"message\", this.#processRawMessage);\n },\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n #messageSender = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n //console.log(chalk.grey(JSON.stringify(payload)));\n\n this.#ioredisPublisher.publish(\n this.#requestChannel,\n JSON.stringify(payload)\n );\n } else if (payload.messageType.localeCompare(\"RESPONSE\") === 0) {\n this.#ioredisPublisher.publish(\n this.#responseChannel,\n JSON.stringify(payload)\n );\n }\n };\n\n #ProcessResponseMessage = async (\n responses: Record<string, IIPCMessageProcessorIPCPayload>,\n options: any\n ): Promise<boolean> => {\n // Now check if we have all responses ...\n\n /*\n let allFound = false;\n\n for (const [responseId, response] of Object.entries(responses)) {\n if (response.senderRole.localeCompare('CLIENT') === 0) {\n allFound = true;\n break;\n }\n }\n if (allFound) {\n return allFound;\n }\n */\n\n let found = true;\n\n // Sender role here is SERVER\n let requestGroup = null;\n for (const [responseId, response] of Object.entries(responses)) {\n if (\n response.requestPayload.args.length > 0 &&\n response.requestPayload.args[0].group\n ) {\n requestGroup = response.requestPayload.args[0].group;\n break;\n }\n }\n\n if (requestGroup) {\n const clientsInGroup = Object.values(this.#clients).filter((c) => {\n if (c.groups.indexOf(requestGroup) === -1) {\n return false;\n }\n return true;\n });\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach((c) => {\n if (!responses[c.id]) {\n found = false;\n }\n });\n } else {\n const clientsInGroup = Object.values(this.#clients);\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach((c) => {\n if (!responses[c.id]) {\n found = false;\n }\n });\n }\n\n return found;\n };\n\n #processPayload = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n if (payload.requestPayload[\"__eventName\"]) {\n const eventName = payload.requestPayload[\"__eventName\"];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (\n payload.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#events[eventName].callback(\n ...payload.requestPayload.args\n );\n resolve({});\n } else {\n this.#events[eventName].callback(\n ...payload.requestPayload.args,\n (responseMessage: any) => {\n resolve(responseMessage);\n }\n );\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n };\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject: IEventRecord = {\n event,\n callback,\n ctx,\n };\n this.#events[eventObject.event] = eventObject;\n return this;\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n }\n\n Start = () => {\n this.#messagingManager?.Start();\n };\n\n Stop = () => {\n if (this.#pingTimeout) {\n clearTimeout(this.#pingTimeout);\n this.#pingTimeout = null;\n }\n\n this.#messagingManager?.Stop();\n\n this.#ioredisSubscriber.quit();\n this.#ioredisSubscriber.disconnect();\n\n this.#ioredisPublisher.quit();\n this.#ioredisPublisher.disconnect();\n };\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length - 1),\n } as IEventPayload);\n // Invoke the response callback\n args[args.length - 1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n this.#options.logger.error(\n chalk.red(\n `RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`\n )\n );\n }\n })();\n return this;\n }\n\n emitWithError(\n event: string,\n args: JSONObject,\n responseCb: (response: JSONObject | undefined) => void,\n errorCb: (error: any) => void\n ): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: [args],\n } as IEventPayload);\n // Invoke the response callback\n responseCb(retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n //this.#options.logger.error(chalk.red(`RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n errorCb(error);\n }\n })();\n return this;\n }\n\n emitex = async (event: string, ...args: any[]): Promise<JSONObject> => {\n return (this.#messagingManager as MessagingManager).SendMessage({\n __eventName: event,\n args,\n } as IEventPayload);\n };\n\n emitNoResponse = async (event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args,\n } as IEventPayload);\n };\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from \"@nsshunt/stsutils\";\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IEventPayload,\n} from \"./commonTypes.js\";\n\nimport {\n MessagingManager,\n MessagingManagerOptions,\n} from \"./messagingManager.js\";\n\nimport chalk from \"chalk\";\n\n//import { randomUUID } from 'node:crypto';\n\nexport interface IPCMessageHandlerOptions {\n logger: ISTSLogger;\n requestResponseMessageTimeout: number;\n namespace: string;\n role: \"SERVER\" | \"CLIENT\";\n ignoreEvents?: string[];\n}\n\ndeclare interface IClientRecord {\n client: any;\n processMessage: (client: any) => void;\n}\n\n/**\n * IPC Message Handling.\n *\n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerOptions;\n #clients: Record<string, IClientRecord> = {};\n #events: JSONObject = {};\n #startWorkerOptions: any;\n\n constructor(options: IPCMessageHandlerOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare(\"CLIENT\") === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n AddClient = (client: any): string => {\n const id = globalThis.crypto.randomUUID(); // randomUUID();\n\n const processMessage = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, { client });\n };\n\n client.on(\"message\", processMessage);\n this.#clients[id] = {\n client,\n processMessage,\n };\n return id;\n };\n\n RemoveClient = (id: string) => {\n const clientRecord = this.#clients[id];\n if (clientRecord) {\n clientRecord.client.off(\"message\", clientRecord.processMessage);\n delete this.#clients[id];\n }\n };\n\n get clients() {\n return this.#clients;\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: \"SERVER\",\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n (options.client as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n\n messageReceiverStart: (options: any) => {\n //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n },\n messageReceiverStop: (options: any) => {\n //@@ options should be complete collection of workers\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(\n payload,\n this.#startWorkerOptions\n );\n };\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout:\n this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: \"CLIENT\",\n\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on(\"message\", this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => {\n process.off(\"message\", this.#ProcessWorkerMessageRaw);\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#options.role.localeCompare(\"CLIENT\") === 0) {\n return this.#messagingManager?.SendMessage(payload, {});\n } else {\n //@@ send to all clients\n const promArray: Promise<JSONObject>[] = [];\n for (const [clientId, clientRecord] of Object.entries(\n this.#clients\n )) {\n promArray.push(\n this.#messagingManager?.SendMessage(payload, {\n client: clientRecord.client,\n })\n );\n }\n\n try {\n const retVal = await Promise.all(promArray);\n return {\n result: retVal,\n };\n } catch (error) {\n return {};\n }\n }\n } else {\n // Error state - no #ipcMessageManager set\n return {};\n }\n };\n\n #processPayload = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n if (payload.requestPayload[\"__eventName\"]) {\n const eventName = payload.requestPayload[\"__eventName\"];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (\n payload.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#events[eventName].callback(\n ...payload.requestPayload.args\n );\n resolve({});\n } else {\n this.#events[eventName].callback(\n ...payload.requestPayload.args,\n (responseMessage: any) => {\n resolve(responseMessage);\n }\n );\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n };\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx,\n };\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = () => {\n this.#messagingManager?.Start({});\n };\n\n // Supply complete collection of workers\n Stop = () => {\n this.#messagingManager?.Stop({});\n };\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length - 1),\n } as IEventPayload);\n // Invoke the response callback\n args[args.length - 1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(\n chalk.red(\n `IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`\n )\n );\n }\n })();\n return this;\n }\n\n emitNoResponse = async (event: string, ...args: any[]): Promise<void> => {\n if (this.#options.role.localeCompare(\"CLIENT\") === 0) {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args,\n } as IEventPayload);\n } else {\n //@@ send to all clients\n for (const [clientId, clientRecord] of Object.entries(\n this.#clients\n )) {\n (\n this.#messagingManager as MessagingManager\n ).SendMessageNoResponse(\n {\n __eventName: event,\n args,\n } as IEventPayload,\n { client: clientRecord.client }\n );\n }\n }\n };\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from \"@nsshunt/stsutils\";\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IEventPayload,\n} from \"./commonTypes.js\";\n\nimport {\n MessagingManager,\n MessagingManagerOptions,\n} from \"./messagingManager.js\";\n\nimport chalk from \"chalk\";\n\nexport interface IPCMessageHandlerPairOptions {\n logger: ISTSLogger;\n requestResponseMessageTimeout: number;\n namespace: string;\n role: \"SERVER\" | \"CLIENT\";\n ignoreEvents?: string[];\n}\n\n/**\n * IPC Message Handling.\n *\n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandlerPair extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerPairOptions;\n #worker: any = null;\n #events: JSONObject = {};\n #startWorkerOptions: any;\n #startPrimaryWorker: Worker | null = null;\n\n constructor(options: IPCMessageHandlerPairOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare(\"CLIENT\") === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n #ProcessPrimaryMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, {\n worker: this.#startPrimaryWorker as Worker,\n });\n };\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: \"SERVER\",\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n (options.worker as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n\n messageReceiverStart: (options: any) => {\n //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n const worker = options.worker as any;\n this.#startPrimaryWorker = worker;\n worker.on(\"message\", this.#ProcessPrimaryMessageRaw);\n },\n messageReceiverStop: (options: any) => {\n //@@ options should be complete collection of workers\n const worker = options.worker as any;\n worker.off(\"message\", this.#ProcessPrimaryMessageRaw);\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(\n payload,\n this.#startWorkerOptions\n );\n };\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout:\n this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: \"CLIENT\",\n\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on(\"message\", this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => {\n process.off(\"message\", this.#ProcessWorkerMessageRaw);\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#worker) {\n return this.#messagingManager?.SendMessage(payload, {\n worker: this.#worker,\n });\n } else {\n return this.#messagingManager?.SendMessage(payload, {});\n }\n } else {\n // Error state - no #ipcMessageManager set\n return {};\n }\n };\n\n #processPayload = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n if (payload.requestPayload[\"__eventName\"]) {\n const eventName = payload.requestPayload[\"__eventName\"];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (\n payload.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#events[eventName].callback(\n ...payload.requestPayload.args\n );\n resolve({});\n } else {\n this.#events[eventName].callback(\n ...payload.requestPayload.args,\n (responseMessage: any) => {\n resolve(responseMessage);\n }\n );\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n };\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx,\n };\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = (worker?: any) => {\n if (worker) {\n this.#messagingManager?.Start({ worker });\n this.#worker = worker;\n } else {\n this.#messagingManager?.Start({});\n }\n };\n\n // Supply complete collection of workers\n Stop = () => {\n if (this.#worker) {\n this.#messagingManager?.Stop({ worker: this.#worker });\n this.#worker = null;\n } else {\n this.#messagingManager?.Stop({});\n }\n };\n\n get worker(): Worker | null {\n return this.#worker;\n }\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length - 1),\n } as IEventPayload);\n // Invoke the response callback\n args[args.length - 1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(\n chalk.red(\n `IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`\n )\n );\n }\n })();\n return this;\n }\n\n emitNoResponse = async (event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args,\n } as IEventPayload);\n };\n}\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -124,12 +124,14 @@ var MessagingManager = class {
|
|
|
124
124
|
const group = message.requestPayload.args[0].group;
|
|
125
125
|
processMessage = this.#options.groups.indexOf(group) === -1 ? false : true;
|
|
126
126
|
}
|
|
127
|
-
if (processMessage)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
127
|
+
if (processMessage) {
|
|
128
|
+
if (msg.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) this.#options.ProcessRequestMessage(message, options);
|
|
129
|
+
else {
|
|
130
|
+
message.responsePayload = await this.#options.ProcessRequestMessage(message, options);
|
|
131
|
+
message.senderId = this.#id;
|
|
132
|
+
message.messageType = "RESPONSE";
|
|
133
|
+
this.#options.messageSender(message, options);
|
|
134
|
+
}
|
|
133
135
|
}
|
|
134
136
|
} else this.#ProcessMessage(msg, options);
|
|
135
137
|
}
|
|
@@ -375,7 +377,7 @@ var RedisMessageHandler = class extends TinyEmitter {
|
|
|
375
377
|
//#region src/ipcMessageHandler.ts
|
|
376
378
|
/**
|
|
377
379
|
* IPC Message Handling.
|
|
378
|
-
*
|
|
380
|
+
*
|
|
379
381
|
* This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.
|
|
380
382
|
* This class can be used for both tghe cluster primary and the cluster worker.
|
|
381
383
|
* Note: Currently groups handling is not supported. Use the redis version for this capability.
|
|
@@ -462,17 +464,18 @@ var IPCMessageHandler = class extends TinyEmitter {
|
|
|
462
464
|
this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);
|
|
463
465
|
};
|
|
464
466
|
SendMessage = async (payload) => {
|
|
465
|
-
if (this.#messagingManager)
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
467
|
+
if (this.#messagingManager) {
|
|
468
|
+
if (this.#options.role.localeCompare("CLIENT") === 0) return this.#messagingManager?.SendMessage(payload, {});
|
|
469
|
+
else {
|
|
470
|
+
const promArray = [];
|
|
471
|
+
for (const [clientId, clientRecord] of Object.entries(this.#clients)) promArray.push(this.#messagingManager?.SendMessage(payload, { client: clientRecord.client }));
|
|
472
|
+
try {
|
|
473
|
+
return { result: await Promise.all(promArray) };
|
|
474
|
+
} catch (error) {
|
|
475
|
+
return {};
|
|
476
|
+
}
|
|
473
477
|
}
|
|
474
|
-
}
|
|
475
|
-
else return {};
|
|
478
|
+
} else return {};
|
|
476
479
|
};
|
|
477
480
|
#processPayload = (payload, options) => {
|
|
478
481
|
return new Promise((resolve, reject) => {
|
|
@@ -546,7 +549,7 @@ var IPCMessageHandler = class extends TinyEmitter {
|
|
|
546
549
|
//#region src/ipcMessageHandlerPair.ts
|
|
547
550
|
/**
|
|
548
551
|
* IPC Message Handling.
|
|
549
|
-
*
|
|
552
|
+
*
|
|
550
553
|
* This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.
|
|
551
554
|
* This class can be used for both tghe cluster primary and the cluster worker.
|
|
552
555
|
* Note: Currently groups handling is not supported. Use the redis version for this capability.
|
|
@@ -621,9 +624,10 @@ var IPCMessageHandlerPair = class extends TinyEmitter {
|
|
|
621
624
|
this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);
|
|
622
625
|
};
|
|
623
626
|
SendMessage = async (payload) => {
|
|
624
|
-
if (this.#messagingManager)
|
|
625
|
-
|
|
626
|
-
|
|
627
|
+
if (this.#messagingManager) {
|
|
628
|
+
if (this.#worker) return this.#messagingManager?.SendMessage(payload, { worker: this.#worker });
|
|
629
|
+
else return this.#messagingManager?.SendMessage(payload, {});
|
|
630
|
+
} else return {};
|
|
627
631
|
};
|
|
628
632
|
#processPayload = (payload, options) => {
|
|
629
633
|
return new Promise((resolve, reject) => {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#id","#options","#messageHeader","#SendMessageNoResponse","#SendMessage","#inflightMessages","#ProcessMessage","#options","#requestChannel","#responseChannel","#ioredisSubscriber","#ioredisPublisher","#LogError","#LogInfo","#pingTimeout","#messagingManager","#clients","#messageSender","#ProcessResponseMessage","#processPayload","#processRawMessage","#events","#options","#events","#messagingManager","#clients","#processPayload","#startWorkerOptions","#ProcessWorkerMessageRaw","#options","#events","#messagingManager","#startPrimaryWorker","#processPayload","#ProcessPrimaryMessageRaw","#startWorkerOptions","#ProcessWorkerMessageRaw","#worker"],"sources":["../src/messagingManager.ts","../src/redisMessageHandler.ts","../src/ipcMessageHandler.ts","../src/ipcMessageHandlerPair.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject } from '@nsshunt/stsutils'\n\n//import { randomUUID } from 'node:crypto';\n\nimport { IIPCMessageProcessorIPCPayload, IIPCMessageProcessorWorkerRecord } from './commonTypes.js'\n\nexport interface MessagingManagerOptions {\n logger: ISTSLogger\n requestResponseMessageTimeout: number\n namespace: string\n role: 'SERVER' | 'CLIENT'\n groups: string[]\n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => void\n ProcessRequestMessage: (payload: IIPCMessageProcessorIPCPayload, options: any) => Promise<JSONObject>\n ProcessResponseMessage?: (reesponses: Record<string, IIPCMessageProcessorIPCPayload>, options: any) => Promise<boolean>\n messageReceiverStart: (options: any) => void\n messageReceiverStop: (options: any) => void\n}\n/**\n * todo\n * @typedef {Object} options - todo\n * @property {boolean} [wssServer=false] - Create a web socket server on this worker instance\n */\nexport class MessagingManager {\n #id: string;\n #options: MessagingManagerOptions;\n #inflightMessages: Record<string, IIPCMessageProcessorWorkerRecord> = { };\n #messageHeader: string;\n\n constructor(options: MessagingManagerOptions) {\n this.#id = globalThis.crypto.randomUUID(); // randomUUID();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID();\n }\n\n get id() {\n return this.#id;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ReceivedMessageFromMaster(msg: any) {\n // Override in subclass if required\n }\n\n SendMessageNoResponse = (payload: JSONObject, options?: any): void => {\n this.#SendMessageNoResponse(payload, options);\n };\n\n SendMessage = (payload: JSONObject, options?: any): Promise<JSONObject> => {\n return new Promise((resolve, reject) => {\n this.#SendMessage(payload, options,\n (payload: IIPCMessageProcessorIPCPayload) => {\n resolve(payload.responsePayload);\n },\n (payload: IIPCMessageProcessorIPCPayload) => {\n reject(payload.requestPayload);\n })\n })\n }\n\n #SendMessageNoResponse = (payload: JSONObject, options: any): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: { },\n pid: process.pid.toString(),\n messageType: 'REQUEST_NO_RESPONSE'\n }\n\n //console.log(chalk.blue(`#SendMessageNoResponse: [${JSON.stringify(requestPayload)}]`))\n this.#options.messageSender(requestPayload, options);\n }\n\n #SendMessage = (payload: JSONObject, options: any,\n callBack: (payload: IIPCMessageProcessorIPCPayload) => void, \n errorCallBack: (payload: IIPCMessageProcessorIPCPayload) => void\n ): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: { },\n pid: process.pid.toString(),\n messageType: 'REQUEST'\n }\n const messageRecord = {\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload,\n responses: { }, // record\n startTime: performance.now(),\n endTime: 0,\n timeout: setTimeout(() => {\n //this.#LogDebugMessage(chalk.red(`Timeout has occurred after: [${this.#options.requestResponseMessageTimeout}]ms with message id: [${messageRecord.messageId}]. Details: [${JSON.stringify(this.#inflightMessages[messageRecord.messageId].requestPayload)}]`));\n setTimeout(() => {\n delete this.#inflightMessages[messageRecord.messageId];\n }, 0).unref();\n errorCallBack(requestPayload);\n }, this.#options.requestResponseMessageTimeout).unref(),// max message timeout allowed\n callBack,\n errorCallBack\n }\n this.#inflightMessages[messageRecord.messageId] = messageRecord;\n //this.#LogDebugMessage(chalk.cyan(`sending: [${JSON.stringify(requestPayload)}]`));\n //console.log(chalk.blue(`#SendMessage: [${JSON.stringify(requestPayload)}]`))\n\n this.#options.messageSender(requestPayload, options);\n }\n\n #ProcessMessage = async (msg: any, options: any): Promise<void> => {\n if (msg.header && msg.header.localeCompare(this.#messageHeader) === 0) {\n const message = (msg as IIPCMessageProcessorIPCPayload);\n if (this.#inflightMessages[message.messageId]) {\n const inFlightMessageRecord: IIPCMessageProcessorWorkerRecord = this.#inflightMessages[message.messageId];\n inFlightMessageRecord.responses[message.senderId ] = { ...message };\n let completed = true; // Defaults to true\n if (this.#options.ProcessResponseMessage) {\n completed = await this.#options.ProcessResponseMessage(inFlightMessageRecord.responses, options);\n if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(inFlightMessageRecord.timeout as NodeJS.Timeout);\n inFlightMessageRecord.callBack({\n responsePayload: Object.values(inFlightMessageRecord.responses).map(r => r.responsePayload)\n } as any, options) // \n delete this.#inflightMessages[message.messageId];\n }\n } else if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(inFlightMessageRecord.timeout as NodeJS.Timeout);\n inFlightMessageRecord.callBack(message, options) // inFlightMessageRecord.responses\n //@@inFlightMessageRecord.callBack(Object.values(inFlightMessageRecord.responses), options) // \n delete this.#inflightMessages[message.messageId];\n } else {\n //console.log(chalk.grey(`#ProcessMessage:5`));\n }\n } else {\n //throw new Error(`Could not find Request/Response message with id: [${message.messageId}]`); //@@\n }\n }\n }\n\n Start = (options?: any) => {\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID()\n this.#options.messageReceiverStart(options);\n }\n\n Stop = (options?: any) => {\n // Kill in-flight messages\n this.#options.messageReceiverStop(options);\n\n for (const [, iPCMessageProcessorWorkerRecord] of Object.entries(this.#inflightMessages)) {\n if (iPCMessageProcessorWorkerRecord.timeout) {\n clearTimeout(iPCMessageProcessorWorkerRecord.timeout);\n }\n }\n this.#inflightMessages = { };\n }\n\n // Process a message recieved from a worker\n ProcessMessage = async (msg: any, options: any) => {\n if (msg.header) {\n const checkName = `__STS__${this.#options.namespace}__`; //@@ this is a broadcast becuase the unique uuid is not part of the header test\n if ((msg.header as string).includes(checkName)) {\n const message = (msg as IIPCMessageProcessorIPCPayload);\n if (msg.messageType.localeCompare('REQUEST') === 0 || msg.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n let processMessage = true;\n if (message.requestPayload.args && message.requestPayload.args.length > 0 && message.requestPayload.args[0].group) {\n const group = message.requestPayload.args[0].group;\n processMessage = (this.#options.groups.indexOf(group) === -1) ? false : true;\n }\n if (processMessage) {\n if (msg.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#options.ProcessRequestMessage(message, options);\n } else {\n message.responsePayload = await this.#options.ProcessRequestMessage(message, options);\n message.senderId = this.#id;\n message.messageType = 'RESPONSE';\n this.#options.messageSender(message, options);\n }\n }\n } else {\n // Received a response (to my request)\n this.#ProcessMessage(msg, options);\n }\n }\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject } from '@nsshunt/stsutils'\n\nimport { IIPCMessageProcessorIPCPayload, IEventPayload } from './commonTypes.js'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager.js'\nimport { Redis, RedisOptions } from \"ioredis\";\n\nimport chalk from 'chalk';\n\nconst REQUEST_CHANNEL = '__STS__SVC_stsappframework_request'\nconst RESPONSE_CHANNEL = '__STS__SVC_stsappframework_response'\n\nexport interface IRedisAdminManagerOptions {\n redisUrl: string\n logger: ISTSLogger\n role: 'SERVER' | 'CLIENT'\n namespace: string\n groups: string[]\n ignoreEvents?: string[]\n extraData?: JSONObject\n}\n\nexport interface IClientRecord {\n id: string\n clientConnected: Date\n pingCount: number\n timeout: NodeJS.Timeout\n groups: string[]\n extraData?: JSONObject\n}\n\nexport interface IEventRecord {\n event: string\n callback: any,\n ctx?: any\n}\n\nexport interface IPingData {\n id: string\n groups: string[]\n extraData?: JSONObject\n}\n\nexport class RedisMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IRedisAdminManagerOptions;\n #events: Record<string, IEventRecord> = { };\n #requestChannel: string;\n #responseChannel: string;\n #ioredisSubscriber: Redis;\n #ioredisPublisher: Redis;\n #clients: Record<string, IClientRecord> = { };\n #pingTimeout: NodeJS.Timeout | null = null;\n\n constructor(options: IRedisAdminManagerOptions) {\n super();\n this.#options = options;\n\n this.#requestChannel = REQUEST_CHANNEL\n this.#responseChannel = RESPONSE_CHANNEL\n\n const redisOptions: RedisOptions = {\n showFriendlyErrorStack: true,\n maxRetriesPerRequest: 20\n }\n\n this.#ioredisSubscriber = new Redis(this.#options.redisUrl, redisOptions);\n this.#ioredisPublisher = new Redis(this.#options.redisUrl, redisOptions);\n\n this.#ioredisSubscriber.on(\"error\", (error: Error) => {\n this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisSubscriber on error): [${error}]`));\n });\n\n this.#ioredisPublisher.on(\"error\", (error: Error) => {\n this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisPublisher on error): [${error}]`));\n });\n\n this.#ioredisSubscriber.subscribe(this.#requestChannel, this.#responseChannel, (error, count) => {\n if (error) {\n // Just like other commands, subscribe() can fail for some reasons, // ex network issues.\n this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error - Failed to subscribe: [${error}]`));\n } else {\n // `count` represents the number of channels this client is currently subscribed to.\n this.#LogInfo(chalk.white(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Subscribed successfully! This client is currently subscribed to ${count} channels.`));\n }\n });\n\n this.SetupPrimary();\n\n /*\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n }\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n this.emit('ping', pingData, (response: any) => { });\n ping();\n }, 1000).unref();\n }\n ping();\n\n this.on('ping', (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData\n }\n }\n callback('ok');\n });\n */\n\n if (this.#options.role.localeCompare('CLIENT') === 0) {\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n }\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n //this.emit('ping', pingData, (response: any) => { });\n this.emitNoResponse('ping', pingData);\n ping();\n }, 1000).unref();\n }\n ping();\n } else {\n this.on('ping', (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData\n }\n }\n //callback('ok');\n });\n }\n }\n\n #LogInfo(message: any) {\n this.#options.logger.info(message);\n }\n\n #LogError(message: any) {\n this.#options.logger.error(message);\n }\n\n #processRawMessage = (channel: string, rawmessage: string) => {\n const message = JSON.parse(rawmessage);\n\n /*\n if (message.requestPayload.__eventName.localeCompare('ping') !== 0) {\n console.log(chalk.cyan(`RedisMessageHandler:#processRawMessage(): Role: [${this.#options.role}] Channel: [${channel}] Message: [${JSON.stringify(message)}]`));\n }\n */\n\n this.#messagingManager?.ProcessMessage(message, { channel });\n }\n\n get clients(): Record<string, IClientRecord> {\n return this.#clients;\n }\n\n get groups(): string[] {\n return this.#options.groups;\n }\n \n AddGroup = (group: string) => {\n const index = this.#options.groups.indexOf(group);\n if (index === -1) {\n this.#options.groups.push(group);\n }\n }\n\n RemoveGroup = (group: string) => {\n const removeIndex = this.#options.groups.indexOf(group);\n if (removeIndex !== -1) {\n this.#options.groups.splice(removeIndex, 1);\n }\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: this.#options.logger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: this.#options.role,\n groups: this.#options.groups,\n messageSender: this.#messageSender,\n // This method is used to calculate if all responses have been received from multiple clients (broadcast)\n // returns true/false.\n ProcessResponseMessage: this.#ProcessResponseMessage,\n // This gets called when an event is received from a message receiver (when ProcessMessage is invoked from the receiver event handler)\n ProcessRequestMessage: this.#processPayload,\n \n messageReceiverStart: (options: any) => {\n this.#ioredisSubscriber.on(\"message\", this.#processRawMessage);\n },\n \n messageReceiverStop: (options: any) => {\n this.#ioredisSubscriber.off(\"message\", this.#processRawMessage);\n }\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n \n #messageSender = (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n\n\n //console.log(chalk.grey(JSON.stringify(payload)));\n\n\n this.#ioredisPublisher.publish(this.#requestChannel, JSON.stringify(payload));\n } else if (payload.messageType.localeCompare('RESPONSE') === 0) {\n this.#ioredisPublisher.publish(this.#responseChannel, JSON.stringify(payload));\n }\n }\n\n \n #ProcessResponseMessage = async (responses: Record<string, IIPCMessageProcessorIPCPayload>, options: any): Promise<boolean> => {\n // Now check if we have all responses ...\n\n /*\n let allFound = false;\n\n for (const [responseId, response] of Object.entries(responses)) {\n if (response.senderRole.localeCompare('CLIENT') === 0) {\n allFound = true;\n break;\n }\n }\n if (allFound) {\n return allFound;\n }\n */\n\n let found = true;\n\n // Sender role here is SERVER\n let requestGroup = null;\n for (const [responseId, response] of Object.entries(responses)) {\n if (response.requestPayload.args.length > 0 && response.requestPayload.args[0].group) {\n requestGroup = response.requestPayload.args[0].group;\n break;\n }\n }\n\n if (requestGroup) {\n const clientsInGroup = Object.values(this.#clients).filter(c => {\n if (c.groups.indexOf(requestGroup) === -1) {\n return false;\n }\n return true;\n });\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach(c => {\n if (!responses[c.id]) {\n found = false;\n }\n })\n } else {\n const clientsInGroup = Object.values(this.#clients)\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach(c => {\n if (!responses[c.id]) {\n found = false;\n }\n })\n }\n\n return found;\n }\n\n #processPayload = (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n if (payload.requestPayload['__eventName']) {\n const eventName = payload.requestPayload['__eventName'];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#events[eventName].callback(...payload.requestPayload.args);\n resolve({});\n } else {\n this.#events[eventName].callback(...payload.requestPayload.args, (responseMessage: any) => {\n resolve(responseMessage);\n });\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n }\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject: IEventRecord = {\n event,\n callback,\n ctx\n }\n this.#events[eventObject.event] = eventObject;\n return this;\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n }\n\n Start = () => {\n this.#messagingManager?.Start();\n }\n\n Stop = () => {\n if (this.#pingTimeout) {\n clearTimeout(this.#pingTimeout);\n this.#pingTimeout = null;\n }\n\n this.#messagingManager?.Stop();\n\n this.#ioredisSubscriber.quit();\n this.#ioredisSubscriber.disconnect();\n\n this.#ioredisPublisher.quit();\n this.#ioredisPublisher.disconnect();\n }\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n } as IEventPayload); \n // Invoke the response callback\n args[args.length-1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n this.#options.logger.error(chalk.red(`RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n }\n })();\n return this;\n }\n\n emitWithError(event: string, args: JSONObject, responseCb: (response: JSONObject | undefined) => void, errorCb: (error: any) => void): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: [ args ]\n } as IEventPayload); \n // Invoke the response callback\n responseCb(retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n //this.#options.logger.error(chalk.red(`RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n errorCb(error);\n }\n })();\n return this;\n }\n\n emitex = async(event: string, ...args: any[]): Promise<JSONObject> => {\n return (this.#messagingManager as MessagingManager).SendMessage({\n __eventName: event,\n args\n } as IEventPayload); \n }\n\n emitNoResponse = async(event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload); \n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from '@nsshunt/stsutils'\n\nimport { IIPCMessageProcessorIPCPayload, IEventPayload } from './commonTypes.js'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager.js'\n\nimport chalk from 'chalk';\n\n//import { randomUUID } from 'node:crypto';\n\nexport interface IPCMessageHandlerOptions {\n logger: ISTSLogger\n requestResponseMessageTimeout: number\n namespace: string\n role: 'SERVER' | 'CLIENT'\n ignoreEvents?: string[]\n}\n\ndeclare interface IClientRecord {\n client: any\n processMessage: (client: any) => void\n}\n\n/**\n * IPC Message Handling.\n * \n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerOptions;\n #clients: Record<string, IClientRecord> = { };\n #events: JSONObject = { };\n #startWorkerOptions: any;\n\n constructor(options: IPCMessageHandlerOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare('CLIENT') === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n AddClient = (client: any): string => {\n const id = globalThis.crypto.randomUUID(); // randomUUID();\n\n const processMessage = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, { client });\n };\n\n client.on('message', processMessage);\n this.#clients[id] = {\n client,\n processMessage\n }\n return id;\n }\n\n RemoveClient = (id: string) => {\n const clientRecord = this.#clients[id];\n if (clientRecord) {\n clientRecord.client.off('message', clientRecord.processMessage);\n delete this.#clients[id];\n }\n }\n\n get clients() {\n return this.#clients;\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: 'SERVER',\n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n (options.client as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n \n\n messageReceiverStart: (options: any) => { //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n },\n messageReceiverStop: (options: any) => { //@@ options should be complete collection of workers\n\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, this.#startWorkerOptions);\n }\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: 'CLIENT',\n \n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on('message', this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => { \n process.off('message', this.#ProcessWorkerMessageRaw);\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#options.role.localeCompare('CLIENT') === 0) {\n return this.#messagingManager?.SendMessage(payload, { });\n } else {\n //@@ send to all clients\n const promArray: Promise<JSONObject>[] = [ ];\n for (const [clientId, clientRecord] of Object.entries(this.#clients)) {\n promArray.push(this.#messagingManager?.SendMessage(payload, { client: clientRecord.client }));\n }\n\n try {\n const retVal = await Promise.all(promArray);\n return {\n result: retVal\n };\n } catch (error) {\n return { };\n }\n }\n } else {\n // Error state - no #ipcMessageManager set\n return { };\n }\n }\n\n #processPayload = (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n if (payload.requestPayload['__eventName']) {\n const eventName = payload.requestPayload['__eventName'];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#events[eventName].callback(...payload.requestPayload.args);\n resolve({});\n } else {\n this.#events[eventName].callback(...payload.requestPayload.args, (responseMessage: any) => {\n resolve(responseMessage);\n });\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n }\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx\n }\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = () => {\n this.#messagingManager?.Start({ });\n }\n\n // Supply complete collection of workers\n Stop = () => {\n this.#messagingManager?.Stop({ });\n }\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({ \n __eventName: event,\n args: args.slice(0, args.length-1)\n } as IEventPayload);\n // Invoke the response callback\n args[args.length-1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(chalk.red(`IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n }\n })();\n return this;\n }\n\n emitNoResponse = async(event: string, ...args: any[]): Promise<void> => {\n if (this.#options.role.localeCompare('CLIENT') === 0) {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload); \n } else {\n //@@ send to all clients\n for (const [clientId, clientRecord] of Object.entries(this.#clients)) {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload, { client: clientRecord.client });\n }\n }\n }\n}","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from '@nsshunt/stsutils'\n\nimport { IIPCMessageProcessorIPCPayload, IEventPayload } from './commonTypes.js'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager.js'\n\nimport chalk from 'chalk';\n\nexport interface IPCMessageHandlerPairOptions {\n logger: ISTSLogger\n requestResponseMessageTimeout: number\n namespace: string\n role: 'SERVER' | 'CLIENT'\n ignoreEvents?: string[]\n}\n\n/**\n * IPC Message Handling.\n * \n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandlerPair extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerPairOptions;\n #worker: any = null;\n #events: JSONObject = { };\n #startWorkerOptions: any;\n #startPrimaryWorker: Worker | null = null;\n\n constructor(options: IPCMessageHandlerPairOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare('CLIENT') === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n #ProcessPrimaryMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, { worker: this.#startPrimaryWorker as Worker });\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: 'SERVER',\n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n (options.worker as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n \n\n messageReceiverStart: (options: any) => { //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n const worker = (options.worker as any);\n this.#startPrimaryWorker = worker;\n worker.on('message', this.#ProcessPrimaryMessageRaw);\n },\n messageReceiverStop: (options: any) => { //@@ options should be complete collection of workers\n const worker = (options.worker as any);\n worker.off('message', this.#ProcessPrimaryMessageRaw);\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, this.#startWorkerOptions);\n }\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: 'CLIENT',\n \n messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on('message', this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => { \n process.off('message', this.#ProcessWorkerMessageRaw);\n },\n groups: [ ]\n }\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n }\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#worker) {\n return this.#messagingManager?.SendMessage(payload, { worker: this.#worker });\n } else {\n return this.#messagingManager?.SendMessage(payload, { });\n }\n } else {\n // Error state - no #ipcMessageManager set\n return { };\n }\n }\n\n #processPayload = (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (payload.messageType.localeCompare('REQUEST') === 0 || payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n if (payload.requestPayload['__eventName']) {\n const eventName = payload.requestPayload['__eventName'];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (payload.messageType.localeCompare('REQUEST_NO_RESPONSE') === 0) {\n this.#events[eventName].callback(...payload.requestPayload.args);\n resolve({});\n } else {\n this.#events[eventName].callback(...payload.requestPayload.args, (responseMessage: any) => {\n resolve(responseMessage);\n });\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n }\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx\n }\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = (worker?: any) => {\n if (worker) {\n this.#messagingManager?.Start({ worker });\n this.#worker = worker;\n } else {\n this.#messagingManager?.Start({ });\n }\n }\n\n // Supply complete collection of workers\n Stop = () => {\n if (this.#worker) {\n this.#messagingManager?.Stop({ worker: this.#worker });\n this.#worker = null;\n } else {\n this.#messagingManager?.Stop({ });\n }\n }\n\n get worker(): Worker | null {\n return this.#worker;\n }\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({ \n __eventName: event,\n args: args.slice(0, args.length-1)\n } as IEventPayload);\n // Invoke the response callback\n args[args.length-1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (this.#options.ignoreEvents.indexOf((error as any).__eventName) !== -1) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(chalk.red(`IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n }\n })();\n return this;\n }\n\n emitNoResponse = async(event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args\n } as IEventPayload); \n }\n}"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/messagingManager.ts","../src/redisMessageHandler.ts","../src/ipcMessageHandler.ts","../src/ipcMessageHandlerPair.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF\nimport { ISTSLogger, JSONObject } from \"@nsshunt/stsutils\";\n\n//import { randomUUID } from 'node:crypto';\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IIPCMessageProcessorWorkerRecord,\n} from \"./commonTypes.js\";\n\nexport interface MessagingManagerOptions {\n logger: ISTSLogger;\n requestResponseMessageTimeout: number;\n namespace: string;\n role: \"SERVER\" | \"CLIENT\";\n groups: string[];\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => void;\n ProcessRequestMessage: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => Promise<JSONObject>;\n ProcessResponseMessage?: (\n reesponses: Record<string, IIPCMessageProcessorIPCPayload>,\n options: any\n ) => Promise<boolean>;\n messageReceiverStart: (options: any) => void;\n messageReceiverStop: (options: any) => void;\n}\n/**\n * todo\n * @typedef {Object} options - todo\n * @property {boolean} [wssServer=false] - Create a web socket server on this worker instance\n */\nexport class MessagingManager {\n #id: string;\n #options: MessagingManagerOptions;\n #inflightMessages: Record<string, IIPCMessageProcessorWorkerRecord> = {};\n #messageHeader: string;\n\n constructor(options: MessagingManagerOptions) {\n this.#id = globalThis.crypto.randomUUID(); // randomUUID();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID();\n }\n\n get id() {\n return this.#id;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ReceivedMessageFromMaster(msg: any) {\n // Override in subclass if required\n }\n\n SendMessageNoResponse = (payload: JSONObject, options?: any): void => {\n this.#SendMessageNoResponse(payload, options);\n };\n\n SendMessage = (payload: JSONObject, options?: any): Promise<JSONObject> => {\n return new Promise((resolve, reject) => {\n this.#SendMessage(\n payload,\n options,\n (payload: IIPCMessageProcessorIPCPayload) => {\n resolve(payload.responsePayload);\n },\n (payload: IIPCMessageProcessorIPCPayload) => {\n reject(payload.requestPayload);\n }\n );\n });\n };\n\n #SendMessageNoResponse = (payload: JSONObject, options: any): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: {},\n pid: process.pid.toString(),\n messageType: \"REQUEST_NO_RESPONSE\",\n };\n\n //console.log(chalk.blue(`#SendMessageNoResponse: [${JSON.stringify(requestPayload)}]`))\n this.#options.messageSender(requestPayload, options);\n };\n\n #SendMessage = (\n payload: JSONObject,\n options: any,\n callBack: (payload: IIPCMessageProcessorIPCPayload) => void,\n errorCallBack: (payload: IIPCMessageProcessorIPCPayload) => void\n ): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IIPCMessageProcessorIPCPayload = {\n header: this.#messageHeader,\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload: payload,\n responsePayload: {},\n pid: process.pid.toString(),\n messageType: \"REQUEST\",\n };\n const messageRecord = {\n messageId,\n senderId: this.#id,\n senderRole: this.#options.role,\n requestPayload,\n responses: {}, // record\n startTime: performance.now(),\n endTime: 0,\n timeout: setTimeout(() => {\n //this.#LogDebugMessage(chalk.red(`Timeout has occurred after: [${this.#options.requestResponseMessageTimeout}]ms with message id: [${messageRecord.messageId}]. Details: [${JSON.stringify(this.#inflightMessages[messageRecord.messageId].requestPayload)}]`));\n setTimeout(() => {\n delete this.#inflightMessages[messageRecord.messageId];\n }, 0).unref();\n errorCallBack(requestPayload);\n }, this.#options.requestResponseMessageTimeout).unref(), // max message timeout allowed\n callBack,\n errorCallBack,\n };\n this.#inflightMessages[messageRecord.messageId] = messageRecord;\n //this.#LogDebugMessage(chalk.cyan(`sending: [${JSON.stringify(requestPayload)}]`));\n //console.log(chalk.blue(`#SendMessage: [${JSON.stringify(requestPayload)}]`))\n\n this.#options.messageSender(requestPayload, options);\n };\n\n #ProcessMessage = async (msg: any, options: any): Promise<void> => {\n if (msg.header && msg.header.localeCompare(this.#messageHeader) === 0) {\n const message = msg as IIPCMessageProcessorIPCPayload;\n if (this.#inflightMessages[message.messageId]) {\n const inFlightMessageRecord: IIPCMessageProcessorWorkerRecord =\n this.#inflightMessages[message.messageId];\n inFlightMessageRecord.responses[message.senderId] = {\n ...message,\n };\n let completed = true; // Defaults to true\n if (this.#options.ProcessResponseMessage) {\n completed = await this.#options.ProcessResponseMessage(\n inFlightMessageRecord.responses,\n options\n );\n if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(\n inFlightMessageRecord.timeout as NodeJS.Timeout\n );\n inFlightMessageRecord.callBack(\n {\n responsePayload: Object.values(\n inFlightMessageRecord.responses\n ).map((r) => r.responsePayload),\n } as any,\n options\n ); //\n delete this.#inflightMessages[message.messageId];\n }\n } else if (completed) {\n inFlightMessageRecord.endTime = performance.now();\n clearTimeout(\n inFlightMessageRecord.timeout as NodeJS.Timeout\n );\n inFlightMessageRecord.callBack(message, options); // inFlightMessageRecord.responses\n //@@inFlightMessageRecord.callBack(Object.values(inFlightMessageRecord.responses), options) //\n delete this.#inflightMessages[message.messageId];\n } else {\n //console.log(chalk.grey(`#ProcessMessage:5`));\n }\n } else {\n //throw new Error(`Could not find Request/Response message with id: [${message.messageId}]`); //@@\n }\n }\n };\n\n Start = (options?: any) => {\n this.#messageHeader = `__STS__${this.#options.namespace}__${globalThis.crypto.randomUUID()}`; // randomUUID()\n this.#options.messageReceiverStart(options);\n };\n\n Stop = (options?: any) => {\n // Kill in-flight messages\n this.#options.messageReceiverStop(options);\n\n for (const [, iPCMessageProcessorWorkerRecord] of Object.entries(\n this.#inflightMessages\n )) {\n if (iPCMessageProcessorWorkerRecord.timeout) {\n clearTimeout(iPCMessageProcessorWorkerRecord.timeout);\n }\n }\n this.#inflightMessages = {};\n };\n\n // Process a message recieved from a worker\n ProcessMessage = async (msg: any, options: any) => {\n if (msg.header) {\n const checkName = `__STS__${this.#options.namespace}__`; //@@ this is a broadcast becuase the unique uuid is not part of the header test\n if ((msg.header as string).includes(checkName)) {\n const message = msg as IIPCMessageProcessorIPCPayload;\n if (\n msg.messageType.localeCompare(\"REQUEST\") === 0 ||\n msg.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n let processMessage = true;\n if (\n message.requestPayload.args &&\n message.requestPayload.args.length > 0 &&\n message.requestPayload.args[0].group\n ) {\n const group = message.requestPayload.args[0].group;\n processMessage =\n this.#options.groups.indexOf(group) === -1\n ? false\n : true;\n }\n if (processMessage) {\n if (\n msg.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#options.ProcessRequestMessage(\n message,\n options\n );\n } else {\n message.responsePayload =\n await this.#options.ProcessRequestMessage(\n message,\n options\n );\n message.senderId = this.#id;\n message.messageType = \"RESPONSE\";\n this.#options.messageSender(message, options);\n }\n }\n } else {\n // Received a response (to my request)\n this.#ProcessMessage(msg, options);\n }\n }\n }\n };\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject } from \"@nsshunt/stsutils\";\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IEventPayload,\n} from \"./commonTypes.js\";\n\nimport {\n MessagingManager,\n MessagingManagerOptions,\n} from \"./messagingManager.js\";\nimport { Redis, RedisOptions } from \"ioredis\";\n\nimport chalk from \"chalk\";\n\nconst REQUEST_CHANNEL = \"__STS__SVC_stsappframework_request\";\nconst RESPONSE_CHANNEL = \"__STS__SVC_stsappframework_response\";\n\nexport interface IRedisAdminManagerOptions {\n redisUrl: string;\n logger: ISTSLogger;\n role: \"SERVER\" | \"CLIENT\";\n namespace: string;\n groups: string[];\n ignoreEvents?: string[];\n extraData?: JSONObject;\n}\n\nexport interface IClientRecord {\n id: string;\n clientConnected: Date;\n pingCount: number;\n timeout: NodeJS.Timeout;\n groups: string[];\n extraData?: JSONObject;\n}\n\nexport interface IEventRecord {\n event: string;\n callback: any;\n ctx?: any;\n}\n\nexport interface IPingData {\n id: string;\n groups: string[];\n extraData?: JSONObject;\n}\n\nexport class RedisMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IRedisAdminManagerOptions;\n #events: Record<string, IEventRecord> = {};\n #requestChannel: string;\n #responseChannel: string;\n #ioredisSubscriber: Redis;\n #ioredisPublisher: Redis;\n #clients: Record<string, IClientRecord> = {};\n #pingTimeout: NodeJS.Timeout | null = null;\n\n constructor(options: IRedisAdminManagerOptions) {\n super();\n this.#options = options;\n\n this.#requestChannel = REQUEST_CHANNEL;\n this.#responseChannel = RESPONSE_CHANNEL;\n\n const redisOptions: RedisOptions = {\n showFriendlyErrorStack: true,\n maxRetriesPerRequest: 20,\n };\n\n this.#ioredisSubscriber = new Redis(\n this.#options.redisUrl,\n redisOptions\n );\n this.#ioredisPublisher = new Redis(\n this.#options.redisUrl,\n redisOptions\n );\n\n this.#ioredisSubscriber.on(\"error\", (error: Error) => {\n this.#LogError(\n chalk.red(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisSubscriber on error): [${error}]`\n )\n );\n });\n\n this.#ioredisPublisher.on(\"error\", (error: Error) => {\n this.#LogError(\n chalk.red(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisPublisher on error): [${error}]`\n )\n );\n });\n\n this.#ioredisSubscriber.subscribe(\n this.#requestChannel,\n this.#responseChannel,\n (error, count) => {\n if (error) {\n // Just like other commands, subscribe() can fail for some reasons, // ex network issues.\n this.#LogError(\n chalk.red(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error - Failed to subscribe: [${error}]`\n )\n );\n } else {\n // `count` represents the number of channels this client is currently subscribed to.\n this.#LogInfo(\n chalk.white(\n `RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Subscribed successfully! This client is currently subscribed to ${count} channels.`\n )\n );\n }\n }\n );\n\n this.SetupPrimary();\n\n /*\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n }\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n this.emit('ping', pingData, (response: any) => { });\n ping();\n }, 1000).unref();\n }\n ping();\n\n this.on('ping', (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData\n }\n }\n callback('ok');\n });\n */\n\n if (this.#options.role.localeCompare(\"CLIENT\") === 0) {\n const ping = () => {\n this.#pingTimeout = setTimeout(() => {\n const pingData: IPingData = {\n id: (this.#messagingManager as MessagingManager).id,\n groups: this.#options.groups,\n };\n if (this.#options.extraData) {\n pingData.extraData = this.#options.extraData;\n }\n //this.emit('ping', pingData, (response: any) => { });\n this.emitNoResponse(\"ping\", pingData);\n ping();\n }, 1000).unref();\n };\n ping();\n } else {\n this.on(\"ping\", (pingData: IPingData, callback: any) => {\n const { id, groups, extraData } = pingData;\n if (this.#clients[id]) {\n clearTimeout(this.#clients[id].timeout);\n this.#clients[id].pingCount++;\n this.#clients[id].timeout = setTimeout(() => {\n delete this.#clients[id];\n }, 2000);\n this.#clients[id].groups = groups;\n this.#clients[id].extraData = extraData;\n } else {\n this.#clients[id] = {\n id,\n clientConnected: new Date(),\n pingCount: 0,\n timeout: setTimeout(() => {\n delete this.#clients[id];\n }, 2000),\n groups,\n extraData,\n };\n }\n //callback('ok');\n });\n }\n }\n\n #LogInfo(message: any) {\n this.#options.logger.info(message);\n }\n\n #LogError(message: any) {\n this.#options.logger.error(message);\n }\n\n #processRawMessage = (channel: string, rawmessage: string) => {\n const message = JSON.parse(rawmessage);\n\n /*\n if (message.requestPayload.__eventName.localeCompare('ping') !== 0) {\n console.log(chalk.cyan(`RedisMessageHandler:#processRawMessage(): Role: [${this.#options.role}] Channel: [${channel}] Message: [${JSON.stringify(message)}]`));\n }\n */\n\n this.#messagingManager?.ProcessMessage(message, { channel });\n };\n\n get clients(): Record<string, IClientRecord> {\n return this.#clients;\n }\n\n get groups(): string[] {\n return this.#options.groups;\n }\n\n AddGroup = (group: string) => {\n const index = this.#options.groups.indexOf(group);\n if (index === -1) {\n this.#options.groups.push(group);\n }\n };\n\n RemoveGroup = (group: string) => {\n const removeIndex = this.#options.groups.indexOf(group);\n if (removeIndex !== -1) {\n this.#options.groups.splice(removeIndex, 1);\n }\n };\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: this.#options.logger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: this.#options.role,\n groups: this.#options.groups,\n messageSender: this.#messageSender,\n // This method is used to calculate if all responses have been received from multiple clients (broadcast)\n // returns true/false.\n ProcessResponseMessage: this.#ProcessResponseMessage,\n // This gets called when an event is received from a message receiver (when ProcessMessage is invoked from the receiver event handler)\n ProcessRequestMessage: this.#processPayload,\n\n messageReceiverStart: (options: any) => {\n this.#ioredisSubscriber.on(\"message\", this.#processRawMessage);\n },\n\n messageReceiverStop: (options: any) => {\n this.#ioredisSubscriber.off(\"message\", this.#processRawMessage);\n },\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n #messageSender = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n //console.log(chalk.grey(JSON.stringify(payload)));\n\n this.#ioredisPublisher.publish(\n this.#requestChannel,\n JSON.stringify(payload)\n );\n } else if (payload.messageType.localeCompare(\"RESPONSE\") === 0) {\n this.#ioredisPublisher.publish(\n this.#responseChannel,\n JSON.stringify(payload)\n );\n }\n };\n\n #ProcessResponseMessage = async (\n responses: Record<string, IIPCMessageProcessorIPCPayload>,\n options: any\n ): Promise<boolean> => {\n // Now check if we have all responses ...\n\n /*\n let allFound = false;\n\n for (const [responseId, response] of Object.entries(responses)) {\n if (response.senderRole.localeCompare('CLIENT') === 0) {\n allFound = true;\n break;\n }\n }\n if (allFound) {\n return allFound;\n }\n */\n\n let found = true;\n\n // Sender role here is SERVER\n let requestGroup = null;\n for (const [responseId, response] of Object.entries(responses)) {\n if (\n response.requestPayload.args.length > 0 &&\n response.requestPayload.args[0].group\n ) {\n requestGroup = response.requestPayload.args[0].group;\n break;\n }\n }\n\n if (requestGroup) {\n const clientsInGroup = Object.values(this.#clients).filter((c) => {\n if (c.groups.indexOf(requestGroup) === -1) {\n return false;\n }\n return true;\n });\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach((c) => {\n if (!responses[c.id]) {\n found = false;\n }\n });\n } else {\n const clientsInGroup = Object.values(this.#clients);\n\n // Now make sure that all clients are in the responses\n found = true;\n clientsInGroup.forEach((c) => {\n if (!responses[c.id]) {\n found = false;\n }\n });\n }\n\n return found;\n };\n\n #processPayload = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n if (payload.requestPayload[\"__eventName\"]) {\n const eventName = payload.requestPayload[\"__eventName\"];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (\n payload.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#events[eventName].callback(\n ...payload.requestPayload.args\n );\n resolve({});\n } else {\n this.#events[eventName].callback(\n ...payload.requestPayload.args,\n (responseMessage: any) => {\n resolve(responseMessage);\n }\n );\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n };\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject: IEventRecord = {\n event,\n callback,\n ctx,\n };\n this.#events[eventObject.event] = eventObject;\n return this;\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n }\n\n Start = () => {\n this.#messagingManager?.Start();\n };\n\n Stop = () => {\n if (this.#pingTimeout) {\n clearTimeout(this.#pingTimeout);\n this.#pingTimeout = null;\n }\n\n this.#messagingManager?.Stop();\n\n this.#ioredisSubscriber.quit();\n this.#ioredisSubscriber.disconnect();\n\n this.#ioredisPublisher.quit();\n this.#ioredisPublisher.disconnect();\n };\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length - 1),\n } as IEventPayload);\n // Invoke the response callback\n args[args.length - 1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n this.#options.logger.error(\n chalk.red(\n `RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`\n )\n );\n }\n })();\n return this;\n }\n\n emitWithError(\n event: string,\n args: JSONObject,\n responseCb: (response: JSONObject | undefined) => void,\n errorCb: (error: any) => void\n ): this {\n (async () => {\n try {\n const retVal = await this.#messagingManager?.SendMessage({\n __eventName: event,\n args: [args],\n } as IEventPayload);\n // Invoke the response callback\n responseCb(retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n //this.#options.logger.error(chalk.red(`RedisMessageHandler:emit(): Error: [${JSON.stringify(error)}]`));\n errorCb(error);\n }\n })();\n return this;\n }\n\n emitex = async (event: string, ...args: any[]): Promise<JSONObject> => {\n return (this.#messagingManager as MessagingManager).SendMessage({\n __eventName: event,\n args,\n } as IEventPayload);\n };\n\n emitNoResponse = async (event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args,\n } as IEventPayload);\n };\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from \"@nsshunt/stsutils\";\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IEventPayload,\n} from \"./commonTypes.js\";\n\nimport {\n MessagingManager,\n MessagingManagerOptions,\n} from \"./messagingManager.js\";\n\nimport chalk from \"chalk\";\n\n//import { randomUUID } from 'node:crypto';\n\nexport interface IPCMessageHandlerOptions {\n logger: ISTSLogger;\n requestResponseMessageTimeout: number;\n namespace: string;\n role: \"SERVER\" | \"CLIENT\";\n ignoreEvents?: string[];\n}\n\ndeclare interface IClientRecord {\n client: any;\n processMessage: (client: any) => void;\n}\n\n/**\n * IPC Message Handling.\n *\n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandler extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerOptions;\n #clients: Record<string, IClientRecord> = {};\n #events: JSONObject = {};\n #startWorkerOptions: any;\n\n constructor(options: IPCMessageHandlerOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare(\"CLIENT\") === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n AddClient = (client: any): string => {\n const id = globalThis.crypto.randomUUID(); // randomUUID();\n\n const processMessage = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, { client });\n };\n\n client.on(\"message\", processMessage);\n this.#clients[id] = {\n client,\n processMessage,\n };\n return id;\n };\n\n RemoveClient = (id: string) => {\n const clientRecord = this.#clients[id];\n if (clientRecord) {\n clientRecord.client.off(\"message\", clientRecord.processMessage);\n delete this.#clients[id];\n }\n };\n\n get clients() {\n return this.#clients;\n }\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: \"SERVER\",\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n (options.client as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n\n messageReceiverStart: (options: any) => {\n //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n },\n messageReceiverStop: (options: any) => {\n //@@ options should be complete collection of workers\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(\n payload,\n this.#startWorkerOptions\n );\n };\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout:\n this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: \"CLIENT\",\n\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on(\"message\", this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => {\n process.off(\"message\", this.#ProcessWorkerMessageRaw);\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#options.role.localeCompare(\"CLIENT\") === 0) {\n return this.#messagingManager?.SendMessage(payload, {});\n } else {\n //@@ send to all clients\n const promArray: Promise<JSONObject>[] = [];\n for (const [clientId, clientRecord] of Object.entries(\n this.#clients\n )) {\n promArray.push(\n this.#messagingManager?.SendMessage(payload, {\n client: clientRecord.client,\n })\n );\n }\n\n try {\n const retVal = await Promise.all(promArray);\n return {\n result: retVal,\n };\n } catch (error) {\n return {};\n }\n }\n } else {\n // Error state - no #ipcMessageManager set\n return {};\n }\n };\n\n #processPayload = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n if (payload.requestPayload[\"__eventName\"]) {\n const eventName = payload.requestPayload[\"__eventName\"];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (\n payload.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#events[eventName].callback(\n ...payload.requestPayload.args\n );\n resolve({});\n } else {\n this.#events[eventName].callback(\n ...payload.requestPayload.args,\n (responseMessage: any) => {\n resolve(responseMessage);\n }\n );\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n };\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx,\n };\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = () => {\n this.#messagingManager?.Start({});\n };\n\n // Supply complete collection of workers\n Stop = () => {\n this.#messagingManager?.Stop({});\n };\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length - 1),\n } as IEventPayload);\n // Invoke the response callback\n args[args.length - 1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(\n chalk.red(\n `IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`\n )\n );\n }\n })();\n return this;\n }\n\n emitNoResponse = async (event: string, ...args: any[]): Promise<void> => {\n if (this.#options.role.localeCompare(\"CLIENT\") === 0) {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args,\n } as IEventPayload);\n } else {\n //@@ send to all clients\n for (const [clientId, clientRecord] of Object.entries(\n this.#clients\n )) {\n (\n this.#messagingManager as MessagingManager\n ).SendMessageNoResponse(\n {\n __eventName: event,\n args,\n } as IEventPayload,\n { client: clientRecord.client }\n );\n }\n }\n };\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from \"@nsshunt/stsutils\";\n\nimport {\n IIPCMessageProcessorIPCPayload,\n IEventPayload,\n} from \"./commonTypes.js\";\n\nimport {\n MessagingManager,\n MessagingManagerOptions,\n} from \"./messagingManager.js\";\n\nimport chalk from \"chalk\";\n\nexport interface IPCMessageHandlerPairOptions {\n logger: ISTSLogger;\n requestResponseMessageTimeout: number;\n namespace: string;\n role: \"SERVER\" | \"CLIENT\";\n ignoreEvents?: string[];\n}\n\n/**\n * IPC Message Handling.\n *\n * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.\n * This class can be used for both tghe cluster primary and the cluster worker.\n * Note: Currently groups handling is not supported. Use the redis version for this capability.\n */\nexport class IPCMessageHandlerPair extends TinyEmitter {\n #messagingManager: MessagingManager | null = null;\n #options: IPCMessageHandlerPairOptions;\n #worker: any = null;\n #events: JSONObject = {};\n #startWorkerOptions: any;\n #startPrimaryWorker: Worker | null = null;\n\n constructor(options: IPCMessageHandlerPairOptions) {\n super();\n this.#options = options;\n if (options.role.localeCompare(\"CLIENT\") === 0) {\n this.SetupWorker();\n } else {\n this.SetupPrimary();\n }\n }\n\n get __events() {\n return this.#events;\n }\n\n #ProcessPrimaryMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(payload, {\n worker: this.#startPrimaryWorker as Worker,\n });\n };\n\n SetupPrimary = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout: 5000,\n namespace: this.#options.namespace,\n role: \"SERVER\",\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n (options.worker as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n\n //@@ also need way to add/remove a worker/child to the collection\n //@@ the ping should also auto remove (such as a failed worker)\n\n messageReceiverStart: (options: any) => {\n //@@ options should be complete collection of workers\n // Receive a message to process from a worker\n const worker = options.worker as any;\n this.#startPrimaryWorker = worker;\n worker.on(\"message\", this.#ProcessPrimaryMessageRaw);\n },\n messageReceiverStop: (options: any) => {\n //@@ options should be complete collection of workers\n const worker = options.worker as any;\n worker.off(\"message\", this.#ProcessPrimaryMessageRaw);\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n #ProcessWorkerMessageRaw = (payload: any) => {\n this.#messagingManager?.ProcessMessage(\n payload,\n this.#startWorkerOptions\n );\n };\n\n SetupWorker = () => {\n const ipcMessageManagerOptions: MessagingManagerOptions = {\n logger: defaultLogger,\n requestResponseMessageTimeout:\n this.#options.requestResponseMessageTimeout,\n namespace: this.#options.namespace,\n role: \"CLIENT\",\n\n messageSender: (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ) => {\n // Options not required for sending payloads to the master process\n (process as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n return this.#processPayload(payload, options);\n },\n messageReceiverStart: (options: any) => {\n // Receive a message response back from the primary thread\n this.#startWorkerOptions = { ...options };\n process.on(\"message\", this.#ProcessWorkerMessageRaw);\n },\n messageReceiverStop: (options: any) => {\n process.off(\"message\", this.#ProcessWorkerMessageRaw);\n },\n groups: [],\n };\n this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);\n };\n\n SendMessage = async (payload: JSONObject): Promise<JSONObject> => {\n if (this.#messagingManager) {\n if (this.#worker) {\n return this.#messagingManager?.SendMessage(payload, {\n worker: this.#worker,\n });\n } else {\n return this.#messagingManager?.SendMessage(payload, {});\n }\n } else {\n // Error state - no #ipcMessageManager set\n return {};\n }\n };\n\n #processPayload = (\n payload: IIPCMessageProcessorIPCPayload,\n options: any\n ): Promise<JSONObject> => {\n // check the event name from the collection and invoke that function\n return new Promise<JSONObject>((resolve, reject) => {\n if (\n payload.messageType.localeCompare(\"REQUEST\") === 0 ||\n payload.messageType.localeCompare(\"REQUEST_NO_RESPONSE\") === 0\n ) {\n if (payload.requestPayload[\"__eventName\"]) {\n const eventName = payload.requestPayload[\"__eventName\"];\n // Only process events that I have registered interest in (using .on)\n if (this.#events[eventName]) {\n try {\n if (\n payload.messageType.localeCompare(\n \"REQUEST_NO_RESPONSE\"\n ) === 0\n ) {\n this.#events[eventName].callback(\n ...payload.requestPayload.args\n );\n resolve({});\n } else {\n this.#events[eventName].callback(\n ...payload.requestPayload.args,\n (responseMessage: any) => {\n resolve(responseMessage);\n }\n );\n }\n } catch (error) {\n reject(error);\n }\n }\n }\n }\n });\n };\n\n // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {\n override on(event: string, callback: any, ctx?: any): this {\n if (this.#events[event]) {\n // Update the event with the same name\n delete this.#events[event];\n }\n const eventObject = {\n event,\n callback,\n ctx,\n };\n this.#events[eventObject.event] = eventObject;\n return this;\n //return super.on(event, callback, ctx);\n }\n\n override off(event: string, callback?: any): this {\n if (this.#events[event]) {\n delete this.#events[event];\n }\n return this;\n //return super.off(event, callback);\n }\n\n // Supply complete collection of workers\n Start = (worker?: any) => {\n if (worker) {\n this.#messagingManager?.Start({ worker });\n this.#worker = worker;\n } else {\n this.#messagingManager?.Start({});\n }\n };\n\n // Supply complete collection of workers\n Stop = () => {\n if (this.#worker) {\n this.#messagingManager?.Stop({ worker: this.#worker });\n this.#worker = null;\n } else {\n this.#messagingManager?.Stop({});\n }\n };\n\n get worker(): Worker | null {\n return this.#worker;\n }\n\n /*\n override emit(event: string, ...args: any[]): this {\n const sendMessage = async () => {\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length-1)\n });\n // Invoke the response callback\n args[args.length-1](retVal);\n };\n sendMessage();\n return this;\n //return super.emit(event, ...args);\n }\n */\n\n override emit(event: string, ...args: any[]): this {\n (async () => {\n try {\n //const retVal = await this.#messagingManager?.SendMessage({\n const retVal = await this.SendMessage({\n __eventName: event,\n args: args.slice(0, args.length - 1),\n } as IEventPayload);\n // Invoke the response callback\n args[args.length - 1](retVal);\n } catch (error) {\n if (this.#options.ignoreEvents) {\n //console.log(chalk.red(`RedisMessageHandler:emit(): ignoreEvents: [${this.#options.ignoreEvents}]`))\n if (\n this.#options.ignoreEvents.indexOf(\n (error as any).__eventName\n ) !== -1\n ) {\n return;\n }\n }\n console.log(error);\n this.#options.logger.error(\n chalk.red(\n `IPCMessageHandler:emit(): Error: [${JSON.stringify(error)}]`\n )\n );\n }\n })();\n return this;\n }\n\n emitNoResponse = async (event: string, ...args: any[]): Promise<void> => {\n (this.#messagingManager as MessagingManager).SendMessageNoResponse({\n __eventName: event,\n args,\n } as IEventPayload);\n };\n}\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,mBAAb,MAA8B;CAC1B;CACA;CACA,oBAAsE,CAAC;CACvE;CAEA,YAAY,SAAkC;EAC1C,KAAK,MAAM,WAAW,OAAO,WAAW;EACxC,KAAK,WAAW;EAChB,KAAK,iBAAiB,UAAU,KAAK,SAAS,UAAU,IAAI,WAAW,OAAO,WAAW;CAC7F;CAEA,IAAI,KAAK;EACL,OAAO,KAAK;CAChB;CAGA,0BAA0B,KAAU,CAEpC;CAEA,yBAAyB,SAAqB,YAAwB;EAClE,KAAK,uBAAuB,SAAS,OAAO;CAChD;CAEA,eAAe,SAAqB,YAAuC;EACvE,OAAO,IAAI,SAAS,SAAS,WAAW;GACpC,KAAK,aACD,SACA,UACC,YAA4C;IACzC,QAAQ,QAAQ,eAAe;GACnC,IACC,YAA4C;IACzC,OAAO,QAAQ,cAAc;GACjC,CACJ;EACJ,CAAC;CACL;CAEA,0BAA0B,SAAqB,YAAuB;EAClE,MAAM,YAAoB,WAAW,OAAO,WAAW;EACvD,MAAM,iBAAiD;GACnD,QAAQ,KAAK;GACb;GACA,UAAU,KAAK;GACf,YAAY,KAAK,SAAS;GAC1B,gBAAgB;GAChB,iBAAiB,CAAC;GAClB,KAAK,QAAQ,IAAI,SAAS;GAC1B,aAAa;EACjB;EAGA,KAAK,SAAS,cAAc,gBAAgB,OAAO;CACvD;CAEA,gBACI,SACA,SACA,UACA,kBACO;EACP,MAAM,YAAoB,WAAW,OAAO,WAAW;EACvD,MAAM,iBAAiD;GACnD,QAAQ,KAAK;GACb;GACA,UAAU,KAAK;GACf,YAAY,KAAK,SAAS;GAC1B,gBAAgB;GAChB,iBAAiB,CAAC;GAClB,KAAK,QAAQ,IAAI,SAAS;GAC1B,aAAa;EACjB;EACA,MAAM,gBAAgB;GAClB;GACA,UAAU,KAAK;GACf,YAAY,KAAK,SAAS;GAC1B;GACA,WAAW,CAAC;GACZ,WAAW,YAAY,IAAI;GAC3B,SAAS;GACT,SAAS,iBAAiB;IAEtB,iBAAiB;KACb,OAAO,KAAK,kBAAkB,cAAc;IAChD,GAAG,CAAC,CAAC,CAAC,MAAM;IACZ,cAAc,cAAc;GAChC,GAAG,KAAK,SAAS,6BAA6B,CAAC,CAAC,MAAM;GACtD;GACA;EACJ;EACA,KAAK,kBAAkB,cAAc,aAAa;EAIlD,KAAK,SAAS,cAAc,gBAAgB,OAAO;CACvD;CAEA,kBAAkB,OAAO,KAAU,YAAgC;EAC/D,IAAI,IAAI,UAAU,IAAI,OAAO,cAAc,KAAK,cAAc,MAAM,GAAG;GACnE,MAAM,UAAU;GAChB,IAAI,KAAK,kBAAkB,QAAQ,YAAY;IAC3C,MAAM,wBACF,KAAK,kBAAkB,QAAQ;IACnC,sBAAsB,UAAU,QAAQ,YAAY,EAChD,GAAG,QACP;IACA,IAAI,YAAY;IAChB,IAAI,KAAK,SAAS,wBAAwB;KACtC,YAAY,MAAM,KAAK,SAAS,uBAC5B,sBAAsB,WACtB,OACJ;KACA,IAAI,WAAW;MACX,sBAAsB,UAAU,YAAY,IAAI;MAChD,aACI,sBAAsB,OAC1B;MACA,sBAAsB,SAClB,EACI,iBAAiB,OAAO,OACpB,sBAAsB,SAC1B,CAAC,CAAC,KAAK,MAAM,EAAE,eAAe,EAClC,GACA,OACJ;MACA,OAAO,KAAK,kBAAkB,QAAQ;KAC1C;IACJ,OAAO,IAAI,WAAW;KAClB,sBAAsB,UAAU,YAAY,IAAI;KAChD,aACI,sBAAsB,OAC1B;KACA,sBAAsB,SAAS,SAAS,OAAO;KAE/C,OAAO,KAAK,kBAAkB,QAAQ;IAC1C;GAGJ;EAGJ;CACJ;CAEA,SAAS,YAAkB;EACvB,KAAK,iBAAiB,UAAU,KAAK,SAAS,UAAU,IAAI,WAAW,OAAO,WAAW;EACzF,KAAK,SAAS,qBAAqB,OAAO;CAC9C;CAEA,QAAQ,YAAkB;EAEtB,KAAK,SAAS,oBAAoB,OAAO;EAEzC,KAAK,MAAM,GAAG,oCAAoC,OAAO,QACrD,KAAK,iBACT,GACI,IAAI,gCAAgC,SAChC,aAAa,gCAAgC,OAAO;EAG5D,KAAK,oBAAoB,CAAC;CAC9B;CAGA,iBAAiB,OAAO,KAAU,YAAiB;EAC/C,IAAI,IAAI,QAAQ;GACZ,MAAM,YAAY,UAAU,KAAK,SAAS,UAAU;GACpD,IAAK,IAAI,OAAkB,SAAS,SAAS,GAAG;IAC5C,MAAM,UAAU;IAChB,IACI,IAAI,YAAY,cAAc,SAAS,MAAM,KAC7C,IAAI,YAAY,cAAc,qBAAqB,MAAM,GAC3D;KACE,IAAI,iBAAiB;KACrB,IACI,QAAQ,eAAe,QACvB,QAAQ,eAAe,KAAK,SAAS,KACrC,QAAQ,eAAe,KAAK,EAAE,CAAC,OACjC;MACE,MAAM,QAAQ,QAAQ,eAAe,KAAK,EAAE,CAAC;MAC7C,iBACI,KAAK,SAAS,OAAO,QAAQ,KAAK,MAAM,KAClC,QACA;KACd;KACA,IAAI,gBAAgB;MAChB,IACI,IAAI,YAAY,cACZ,qBACJ,MAAM,GAEN,KAAK,SAAS,sBACV,SACA,OACJ;WACG;OACH,QAAQ,kBACJ,MAAM,KAAK,SAAS,sBAChB,SACA,OACJ;OACJ,QAAQ,WAAW,KAAK;OACxB,QAAQ,cAAc;OACtB,KAAK,SAAS,cAAc,SAAS,OAAO;MAChD;KACJ;IACJ,OAEI,KAAK,gBAAgB,KAAK,OAAO;GAEzC;EACJ;CACJ;AACJ;;;AC1OA,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AAiCzB,IAAa,sBAAb,cAAyC,YAAY;CACjD,oBAA6C;CAC7C;CACA,UAAwC,CAAC;CACzC;CACA;CACA;CACA;CACA,WAA0C,CAAC;CAC3C,eAAsC;CAEtC,YAAY,SAAoC;EAC5C,MAAM;EACN,KAAK,WAAW;EAEhB,KAAK,kBAAkB;EACvB,KAAK,mBAAmB;EAExB,MAAM,eAA6B;GAC/B,wBAAwB;GACxB,sBAAsB;EAC1B;EAEA,KAAK,qBAAqB,IAAI,MAC1B,KAAK,SAAS,UACd,YACJ;EACA,KAAK,oBAAoB,IAAI,MACzB,KAAK,SAAS,UACd,YACJ;EAEA,KAAK,mBAAmB,GAAG,UAAU,UAAiB;GAClD,KAAK,UACD,MAAM,IACF,4CAA4C,QAAQ,IAAI,WAAW,KAAK,SAAS,KAAK,uCAAuC,MAAM,EACvI,CACJ;EACJ,CAAC;EAED,KAAK,kBAAkB,GAAG,UAAU,UAAiB;GACjD,KAAK,UACD,MAAM,IACF,4CAA4C,QAAQ,IAAI,WAAW,KAAK,SAAS,KAAK,sCAAsC,MAAM,EACtI,CACJ;EACJ,CAAC;EAED,KAAK,mBAAmB,UACpB,KAAK,iBACL,KAAK,mBACJ,OAAO,UAAU;GACd,IAAI,OAEA,KAAK,UACD,MAAM,IACF,4CAA4C,QAAQ,IAAI,WAAW,KAAK,SAAS,KAAK,kCAAkC,MAAM,EAClI,CACJ;QAGA,KAAK,SACD,MAAM,MACF,4CAA4C,QAAQ,IAAI,WAAW,KAAK,SAAS,KAAK,oEAAoE,MAAM,WACpK,CACJ;EAER,CACJ;EAEA,KAAK,aAAa;EA4ClB,IAAI,KAAK,SAAS,KAAK,cAAc,QAAQ,MAAM,GAAG;GAClD,MAAM,aAAa;IACf,KAAK,eAAe,iBAAiB;KACjC,MAAM,WAAsB;MACxB,IAAK,KAAK,kBAAuC;MACjD,QAAQ,KAAK,SAAS;KAC1B;KACA,IAAI,KAAK,SAAS,WACd,SAAS,YAAY,KAAK,SAAS;KAGvC,KAAK,eAAe,QAAQ,QAAQ;KACpC,KAAK;IACT,GAAG,GAAI,CAAC,CAAC,MAAM;GACnB;GACA,KAAK;EACT,OACI,KAAK,GAAG,SAAS,UAAqB,aAAkB;GACpD,MAAM,EAAE,IAAI,QAAQ,cAAc;GAClC,IAAI,KAAK,SAAS,KAAK;IACnB,aAAa,KAAK,SAAS,GAAG,CAAC,OAAO;IACtC,KAAK,SAAS,GAAG,CAAC;IAClB,KAAK,SAAS,GAAG,CAAC,UAAU,iBAAiB;KACzC,OAAO,KAAK,SAAS;IACzB,GAAG,GAAI;IACP,KAAK,SAAS,GAAG,CAAC,SAAS;IAC3B,KAAK,SAAS,GAAG,CAAC,YAAY;GAClC,OACI,KAAK,SAAS,MAAM;IAChB;IACA,iCAAiB,IAAI,KAAK;IAC1B,WAAW;IACX,SAAS,iBAAiB;KACtB,OAAO,KAAK,SAAS;IACzB,GAAG,GAAI;IACP;IACA;GACJ;EAGR,CAAC;CAET;CAEA,SAAS,SAAc;EACnB,KAAK,SAAS,OAAO,KAAK,OAAO;CACrC;CAEA,UAAU,SAAc;EACpB,KAAK,SAAS,OAAO,MAAM,OAAO;CACtC;CAEA,sBAAsB,SAAiB,eAAuB;EAC1D,MAAM,UAAU,KAAK,MAAM,UAAU;EAQrC,KAAK,mBAAmB,eAAe,SAAS,EAAE,QAAQ,CAAC;CAC/D;CAEA,IAAI,UAAyC;EACzC,OAAO,KAAK;CAChB;CAEA,IAAI,SAAmB;EACnB,OAAO,KAAK,SAAS;CACzB;CAEA,YAAY,UAAkB;EAE1B,IADc,KAAK,SAAS,OAAO,QAAQ,KACvC,MAAU,IACV,KAAK,SAAS,OAAO,KAAK,KAAK;CAEvC;CAEA,eAAe,UAAkB;EAC7B,MAAM,cAAc,KAAK,SAAS,OAAO,QAAQ,KAAK;EACtD,IAAI,gBAAgB,IAChB,KAAK,SAAS,OAAO,OAAO,aAAa,CAAC;CAElD;CAEA,qBAAqB;EACjB,MAAM,2BAAoD;GACtD,QAAQ,KAAK,SAAS;GACtB,+BAA+B;GAC/B,WAAW,KAAK,SAAS;GACzB,MAAM,KAAK,SAAS;GACpB,QAAQ,KAAK,SAAS;GACtB,eAAe,KAAK;GAGpB,wBAAwB,KAAK;GAE7B,uBAAuB,KAAK;GAE5B,uBAAuB,YAAiB;IACpC,KAAK,mBAAmB,GAAG,WAAW,KAAK,kBAAkB;GACjE;GAEA,sBAAsB,YAAiB;IACnC,KAAK,mBAAmB,IAAI,WAAW,KAAK,kBAAkB;GAClE;EACJ;EACA,KAAK,oBAAoB,IAAI,iBAAiB,wBAAwB;CAC1E;CAEA,kBACI,SACA,YACC;EACD,IACI,QAAQ,YAAY,cAAc,SAAS,MAAM,KACjD,QAAQ,YAAY,cAAc,qBAAqB,MAAM,GAI7D,KAAK,kBAAkB,QACnB,KAAK,iBACL,KAAK,UAAU,OAAO,CAC1B;OACG,IAAI,QAAQ,YAAY,cAAc,UAAU,MAAM,GACzD,KAAK,kBAAkB,QACnB,KAAK,kBACL,KAAK,UAAU,OAAO,CAC1B;CAER;CAEA,0BAA0B,OACtB,WACA,YACmB;EAiBnB,IAAI,QAAQ;EAGZ,IAAI,eAAe;EACnB,KAAK,MAAM,CAAC,YAAY,aAAa,OAAO,QAAQ,SAAS,GACzD,IACI,SAAS,eAAe,KAAK,SAAS,KACtC,SAAS,eAAe,KAAK,EAAE,CAAC,OAClC;GACE,eAAe,SAAS,eAAe,KAAK,EAAE,CAAC;GAC/C;EACJ;EAGJ,IAAI,cAAc;GACd,MAAM,iBAAiB,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,QAAQ,MAAM;IAC9D,IAAI,EAAE,OAAO,QAAQ,YAAY,MAAM,IACnC,OAAO;IAEX,OAAO;GACX,CAAC;GAGD,QAAQ;GACR,eAAe,SAAS,MAAM;IAC1B,IAAI,CAAC,UAAU,EAAE,KACb,QAAQ;GAEhB,CAAC;EACL,OAAO;GACH,MAAM,iBAAiB,OAAO,OAAO,KAAK,QAAQ;GAGlD,QAAQ;GACR,eAAe,SAAS,MAAM;IAC1B,IAAI,CAAC,UAAU,EAAE,KACb,QAAQ;GAEhB,CAAC;EACL;EAEA,OAAO;CACX;CAEA,mBACI,SACA,YACsB;EAEtB,OAAO,IAAI,SAAqB,SAAS,WAAW;GAChD,IACI,QAAQ,YAAY,cAAc,SAAS,MAAM,KACjD,QAAQ,YAAY,cAAc,qBAAqB,MAAM,GAEzD;QAAA,QAAQ,eAAe,gBAAgB;KACvC,MAAM,YAAY,QAAQ,eAAe;KAEzC,IAAI,KAAK,QAAQ,YACb,IAAI;MACA,IACI,QAAQ,YAAY,cAChB,qBACJ,MAAM,GACR;OACE,KAAK,QAAQ,UAAU,CAAC,SACpB,GAAG,QAAQ,eAAe,IAC9B;OACA,QAAQ,CAAC,CAAC;MACd,OACI,KAAK,QAAQ,UAAU,CAAC,SACpB,GAAG,QAAQ,eAAe,OACzB,oBAAyB;OACtB,QAAQ,eAAe;MAC3B,CACJ;KAER,SAAS,OAAO;MACZ,OAAO,KAAK;KAChB;IAER;;EAER,CAAC;CACL;CAGA,GAAY,OAAe,UAAe,KAAiB;EACvD,IAAI,KAAK,QAAQ,QAEb,OAAO,KAAK,QAAQ;EAExB,MAAM,cAA4B;GAC9B;GACA;GACA;EACJ;EACA,KAAK,QAAQ,YAAY,SAAS;EAClC,OAAO;CACX;CAEA,IAAa,OAAe,UAAsB;EAC9C,IAAI,KAAK,QAAQ,QACb,OAAO,KAAK,QAAQ;EAExB,OAAO;CACX;CAEA,cAAc;EACV,KAAK,mBAAmB,MAAM;CAClC;CAEA,aAAa;EACT,IAAI,KAAK,cAAc;GACnB,aAAa,KAAK,YAAY;GAC9B,KAAK,eAAe;EACxB;EAEA,KAAK,mBAAmB,KAAK;EAE7B,KAAK,mBAAmB,KAAK;EAC7B,KAAK,mBAAmB,WAAW;EAEnC,KAAK,kBAAkB,KAAK;EAC5B,KAAK,kBAAkB,WAAW;CACtC;CAEA,KAAc,OAAe,GAAG,MAAmB;EAC/C,CAAC,YAAY;GACT,IAAI;IACA,MAAM,SAAS,MAAM,KAAK,mBAAmB,YAAY;KACrD,aAAa;KACb,MAAM,KAAK,MAAM,GAAG,KAAK,SAAS,CAAC;IACvC,CAAkB;IAElB,KAAK,KAAK,SAAS,EAAE,CAAC,MAAM;GAChC,SAAS,OAAO;IACZ,IAAI,KAAK,SAAS,cAGV;SAAA,KAAK,SAAS,aAAa,QACtB,MAAc,WACnB,MAAM,IAEN;IAAA;IAGR,KAAK,SAAS,OAAO,MACjB,MAAM,IACF,uCAAuC,KAAK,UAAU,KAAK,EAAE,EACjE,CACJ;GACJ;EACJ,EAAA,CAAG;EACH,OAAO;CACX;CAEA,cACI,OACA,MACA,YACA,SACI;EACJ,CAAC,YAAY;GACT,IAAI;IAMA,WAAW,MALU,KAAK,mBAAmB,YAAY;KACrD,aAAa;KACb,MAAM,CAAC,IAAI;IACf,CAAkB,CAED;GACrB,SAAS,OAAO;IACZ,IAAI,KAAK,SAAS,cAGV;SAAA,KAAK,SAAS,aAAa,QACtB,MAAc,WACnB,MAAM,IAEN;IAAA;IAIR,QAAQ,KAAK;GACjB;EACJ,EAAA,CAAG;EACH,OAAO;CACX;CAEA,SAAS,OAAO,OAAe,GAAG,SAAqC;EACnE,OAAQ,KAAK,kBAAuC,YAAY;GAC5D,aAAa;GACb;EACJ,CAAkB;CACtB;CAEA,iBAAiB,OAAO,OAAe,GAAG,SAA+B;EACrE,KAAM,kBAAuC,sBAAsB;GAC/D,aAAa;GACb;EACJ,CAAkB;CACtB;AACJ;;;;;;;;;;ACjeA,IAAa,oBAAb,cAAuC,YAAY;CAC/C,oBAA6C;CAC7C;CACA,WAA0C,CAAC;CAC3C,UAAsB,CAAC;CACvB;CAEA,YAAY,SAAmC;EAC3C,MAAM;EACN,KAAK,WAAW;EAChB,IAAI,QAAQ,KAAK,cAAc,QAAQ,MAAM,GACzC,KAAK,YAAY;OAEjB,KAAK,aAAa;CAE1B;CAEA,IAAI,WAAW;EACX,OAAO,KAAK;CAChB;CAEA,aAAa,WAAwB;EACjC,MAAM,KAAK,WAAW,OAAO,WAAW;EAExC,MAAM,kBAAkB,YAAiB;GACrC,KAAK,mBAAmB,eAAe,SAAS,EAAE,OAAO,CAAC;EAC9D;EAEA,OAAO,GAAG,WAAW,cAAc;EACnC,KAAK,SAAS,MAAM;GAChB;GACA;EACJ;EACA,OAAO;CACX;CAEA,gBAAgB,OAAe;EAC3B,MAAM,eAAe,KAAK,SAAS;EACnC,IAAI,cAAc;GACd,aAAa,OAAO,IAAI,WAAW,aAAa,cAAc;GAC9D,OAAO,KAAK,SAAS;EACzB;CACJ;CAEA,IAAI,UAAU;EACV,OAAO,KAAK;CAChB;CAEA,qBAAqB;EACjB,MAAM,2BAAoD;GACtD,QAAQ;GACR,+BAA+B;GAC/B,WAAW,KAAK,SAAS;GACzB,MAAM;GACN,gBACI,SACA,YACC;IACD,QAAS,OAAe,KAAK,OAAO;GACxC;GACA,uBAAuB,OACnB,SACA,YACsB;IACtB,OAAO,KAAK,gBAAgB,SAAS,OAAO;GAChD;GAKA,uBAAuB,YAAiB,CAGxC;GACA,sBAAsB,YAAiB,CAEvC;GACA,QAAQ,CAAC;EACb;EACA,KAAK,oBAAoB,IAAI,iBAAiB,wBAAwB;CAC1E;CAEA,4BAA4B,YAAiB;EACzC,KAAK,mBAAmB,eACpB,SACA,KAAK,mBACT;CACJ;CAEA,oBAAoB;EAChB,MAAM,2BAAoD;GACtD,QAAQ;GACR,+BACI,KAAK,SAAS;GAClB,WAAW,KAAK,SAAS;GACzB,MAAM;GAEN,gBACI,SACA,YACC;IAED,QAAiB,KAAK,OAAO;GACjC;GACA,uBAAuB,OACnB,SACA,YACsB;IACtB,OAAO,KAAK,gBAAgB,SAAS,OAAO;GAChD;GACA,uBAAuB,YAAiB;IAEpC,KAAK,sBAAsB,EAAE,GAAG,QAAQ;IACxC,QAAQ,GAAG,WAAW,KAAK,wBAAwB;GACvD;GACA,sBAAsB,YAAiB;IACnC,QAAQ,IAAI,WAAW,KAAK,wBAAwB;GACxD;GACA,QAAQ,CAAC;EACb;EACA,KAAK,oBAAoB,IAAI,iBAAiB,wBAAwB;CAC1E;CAEA,cAAc,OAAO,YAA6C;EAC9D,IAAI,KAAK,mBAAmB;GACxB,IAAI,KAAK,SAAS,KAAK,cAAc,QAAQ,MAAM,GAC/C,OAAO,KAAK,mBAAmB,YAAY,SAAS,CAAC,CAAC;QACnD;IAEH,MAAM,YAAmC,CAAC;IAC1C,KAAK,MAAM,CAAC,UAAU,iBAAiB,OAAO,QAC1C,KAAK,QACT,GACI,UAAU,KACN,KAAK,mBAAmB,YAAY,SAAS,EACzC,QAAQ,aAAa,OACzB,CAAC,CACL;IAGJ,IAAI;KAEA,OAAO,EACH,QAAQ,MAFS,QAAQ,IAAI,SAAS,EAG1C;IACJ,SAAS,OAAO;KACZ,OAAO,CAAC;IACZ;GACJ;EACJ,OAEI,OAAO,CAAC;CAEhB;CAEA,mBACI,SACA,YACsB;EAEtB,OAAO,IAAI,SAAqB,SAAS,WAAW;GAChD,IACI,QAAQ,YAAY,cAAc,SAAS,MAAM,KACjD,QAAQ,YAAY,cAAc,qBAAqB,MAAM,GAEzD;QAAA,QAAQ,eAAe,gBAAgB;KACvC,MAAM,YAAY,QAAQ,eAAe;KAEzC,IAAI,KAAK,QAAQ,YACb,IAAI;MACA,IACI,QAAQ,YAAY,cAChB,qBACJ,MAAM,GACR;OACE,KAAK,QAAQ,UAAU,CAAC,SACpB,GAAG,QAAQ,eAAe,IAC9B;OACA,QAAQ,CAAC,CAAC;MACd,OACI,KAAK,QAAQ,UAAU,CAAC,SACpB,GAAG,QAAQ,eAAe,OACzB,oBAAyB;OACtB,QAAQ,eAAe;MAC3B,CACJ;KAER,SAAS,OAAO;MACZ,OAAO,KAAK;KAChB;IAER;;EAER,CAAC;CACL;CAGA,GAAY,OAAe,UAAe,KAAiB;EACvD,IAAI,KAAK,QAAQ,QAEb,OAAO,KAAK,QAAQ;EAExB,MAAM,cAAc;GAChB;GACA;GACA;EACJ;EACA,KAAK,QAAQ,YAAY,SAAS;EAClC,OAAO;CAEX;CAEA,IAAa,OAAe,UAAsB;EAC9C,IAAI,KAAK,QAAQ,QACb,OAAO,KAAK,QAAQ;EAExB,OAAO;CAEX;CAGA,cAAc;EACV,KAAK,mBAAmB,MAAM,CAAC,CAAC;CACpC;CAGA,aAAa;EACT,KAAK,mBAAmB,KAAK,CAAC,CAAC;CACnC;CAkBA,KAAc,OAAe,GAAG,MAAmB;EAC/C,CAAC,YAAY;GACT,IAAI;IAEA,MAAM,SAAS,MAAM,KAAK,YAAY;KAClC,aAAa;KACb,MAAM,KAAK,MAAM,GAAG,KAAK,SAAS,CAAC;IACvC,CAAkB;IAElB,KAAK,KAAK,SAAS,EAAE,CAAC,MAAM;GAChC,SAAS,OAAO;IACZ,IAAI,KAAK,SAAS,cAGV;SAAA,KAAK,SAAS,aAAa,QACtB,MAAc,WACnB,MAAM,IAEN;IAAA;IAGR,QAAQ,IAAI,KAAK;IACjB,KAAK,SAAS,OAAO,MACjB,MAAM,IACF,qCAAqC,KAAK,UAAU,KAAK,EAAE,EAC/D,CACJ;GACJ;EACJ,EAAA,CAAG;EACH,OAAO;CACX;CAEA,iBAAiB,OAAO,OAAe,GAAG,SAA+B;EACrE,IAAI,KAAK,SAAS,KAAK,cAAc,QAAQ,MAAM,GAC/C,KAAM,kBAAuC,sBAAsB;GAC/D,aAAa;GACb;EACJ,CAAkB;OAGlB,KAAK,MAAM,CAAC,UAAU,iBAAiB,OAAO,QAC1C,KAAK,QACT,GACI,KACS,kBACP,sBACE;GACI,aAAa;GACb;EACJ,GACA,EAAE,QAAQ,aAAa,OAAO,CAClC;CAGZ;AACJ;;;;;;;;;;ACpTA,IAAa,wBAAb,cAA2C,YAAY;CACnD,oBAA6C;CAC7C;CACA,UAAe;CACf,UAAsB,CAAC;CACvB;CACA,sBAAqC;CAErC,YAAY,SAAuC;EAC/C,MAAM;EACN,KAAK,WAAW;EAChB,IAAI,QAAQ,KAAK,cAAc,QAAQ,MAAM,GACzC,KAAK,YAAY;OAEjB,KAAK,aAAa;CAE1B;CAEA,IAAI,WAAW;EACX,OAAO,KAAK;CAChB;CAEA,6BAA6B,YAAiB;EAC1C,KAAK,mBAAmB,eAAe,SAAS,EAC5C,QAAQ,KAAK,oBACjB,CAAC;CACL;CAEA,qBAAqB;EACjB,MAAM,2BAAoD;GACtD,QAAQ;GACR,+BAA+B;GAC/B,WAAW,KAAK,SAAS;GACzB,MAAM;GACN,gBACI,SACA,YACC;IACD,QAAS,OAAe,KAAK,OAAO;GACxC;GACA,uBAAuB,OACnB,SACA,YACsB;IACtB,OAAO,KAAK,gBAAgB,SAAS,OAAO;GAChD;GAKA,uBAAuB,YAAiB;IAGpC,MAAM,SAAS,QAAQ;IACvB,KAAK,sBAAsB;IAC3B,OAAO,GAAG,WAAW,KAAK,yBAAyB;GACvD;GACA,sBAAsB,YAAiB;IAGnC,QADuB,OAChB,IAAI,WAAW,KAAK,yBAAyB;GACxD;GACA,QAAQ,CAAC;EACb;EACA,KAAK,oBAAoB,IAAI,iBAAiB,wBAAwB;CAC1E;CAEA,4BAA4B,YAAiB;EACzC,KAAK,mBAAmB,eACpB,SACA,KAAK,mBACT;CACJ;CAEA,oBAAoB;EAChB,MAAM,2BAAoD;GACtD,QAAQ;GACR,+BACI,KAAK,SAAS;GAClB,WAAW,KAAK,SAAS;GACzB,MAAM;GAEN,gBACI,SACA,YACC;IAED,QAAiB,KAAK,OAAO;GACjC;GACA,uBAAuB,OACnB,SACA,YACsB;IACtB,OAAO,KAAK,gBAAgB,SAAS,OAAO;GAChD;GACA,uBAAuB,YAAiB;IAEpC,KAAK,sBAAsB,EAAE,GAAG,QAAQ;IACxC,QAAQ,GAAG,WAAW,KAAK,wBAAwB;GACvD;GACA,sBAAsB,YAAiB;IACnC,QAAQ,IAAI,WAAW,KAAK,wBAAwB;GACxD;GACA,QAAQ,CAAC;EACb;EACA,KAAK,oBAAoB,IAAI,iBAAiB,wBAAwB;CAC1E;CAEA,cAAc,OAAO,YAA6C;EAC9D,IAAI,KAAK,mBAAmB;GACxB,IAAI,KAAK,SACL,OAAO,KAAK,mBAAmB,YAAY,SAAS,EAChD,QAAQ,KAAK,QACjB,CAAC;QAED,OAAO,KAAK,mBAAmB,YAAY,SAAS,CAAC,CAAC;EAE9D,OAEI,OAAO,CAAC;CAEhB;CAEA,mBACI,SACA,YACsB;EAEtB,OAAO,IAAI,SAAqB,SAAS,WAAW;GAChD,IACI,QAAQ,YAAY,cAAc,SAAS,MAAM,KACjD,QAAQ,YAAY,cAAc,qBAAqB,MAAM,GAEzD;QAAA,QAAQ,eAAe,gBAAgB;KACvC,MAAM,YAAY,QAAQ,eAAe;KAEzC,IAAI,KAAK,QAAQ,YACb,IAAI;MACA,IACI,QAAQ,YAAY,cAChB,qBACJ,MAAM,GACR;OACE,KAAK,QAAQ,UAAU,CAAC,SACpB,GAAG,QAAQ,eAAe,IAC9B;OACA,QAAQ,CAAC,CAAC;MACd,OACI,KAAK,QAAQ,UAAU,CAAC,SACpB,GAAG,QAAQ,eAAe,OACzB,oBAAyB;OACtB,QAAQ,eAAe;MAC3B,CACJ;KAER,SAAS,OAAO;MACZ,OAAO,KAAK;KAChB;IAER;;EAER,CAAC;CACL;CAGA,GAAY,OAAe,UAAe,KAAiB;EACvD,IAAI,KAAK,QAAQ,QAEb,OAAO,KAAK,QAAQ;EAExB,MAAM,cAAc;GAChB;GACA;GACA;EACJ;EACA,KAAK,QAAQ,YAAY,SAAS;EAClC,OAAO;CAEX;CAEA,IAAa,OAAe,UAAsB;EAC9C,IAAI,KAAK,QAAQ,QACb,OAAO,KAAK,QAAQ;EAExB,OAAO;CAEX;CAGA,SAAS,WAAiB;EACtB,IAAI,QAAQ;GACR,KAAK,mBAAmB,MAAM,EAAE,OAAO,CAAC;GACxC,KAAK,UAAU;EACnB,OACI,KAAK,mBAAmB,MAAM,CAAC,CAAC;CAExC;CAGA,aAAa;EACT,IAAI,KAAK,SAAS;GACd,KAAK,mBAAmB,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC;GACrD,KAAK,UAAU;EACnB,OACI,KAAK,mBAAmB,KAAK,CAAC,CAAC;CAEvC;CAEA,IAAI,SAAwB;EACxB,OAAO,KAAK;CAChB;CAkBA,KAAc,OAAe,GAAG,MAAmB;EAC/C,CAAC,YAAY;GACT,IAAI;IAEA,MAAM,SAAS,MAAM,KAAK,YAAY;KAClC,aAAa;KACb,MAAM,KAAK,MAAM,GAAG,KAAK,SAAS,CAAC;IACvC,CAAkB;IAElB,KAAK,KAAK,SAAS,EAAE,CAAC,MAAM;GAChC,SAAS,OAAO;IACZ,IAAI,KAAK,SAAS,cAGV;SAAA,KAAK,SAAS,aAAa,QACtB,MAAc,WACnB,MAAM,IAEN;IAAA;IAGR,QAAQ,IAAI,KAAK;IACjB,KAAK,SAAS,OAAO,MACjB,MAAM,IACF,qCAAqC,KAAK,UAAU,KAAK,EAAE,EAC/D,CACJ;GACJ;EACJ,EAAA,CAAG;EACH,OAAO;CACX;CAEA,iBAAiB,OAAO,OAAe,GAAG,SAA+B;EACrE,KAAM,kBAAuC,sBAAsB;GAC/D,aAAa;GACb;EACJ,CAAkB;CACtB;AACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nsshunt/stsmessaging",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.76",
|
|
4
4
|
"description": "STS Messeging",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -41,19 +41,20 @@
|
|
|
41
41
|
},
|
|
42
42
|
"homepage": "https://github.com/nsshunt/stsmessaging#readme",
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@types/node": "^
|
|
45
|
-
"@typescript-eslint/eslint-plugin": "8.
|
|
46
|
-
"@typescript-eslint/parser": "8.
|
|
47
|
-
"eslint": "^10.
|
|
48
|
-
"
|
|
49
|
-
"
|
|
44
|
+
"@types/node": "^26.3.0",
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "8.68.0",
|
|
46
|
+
"@typescript-eslint/parser": "8.68.0",
|
|
47
|
+
"eslint": "^10.9.1",
|
|
48
|
+
"eslint-config-prettier": "^10.1.8",
|
|
49
|
+
"globals": "17.11.0",
|
|
50
|
+
"testcontainers": "12.1.0",
|
|
50
51
|
"ts-node": "^10.9.2",
|
|
51
52
|
"typescript": "^6.0.3",
|
|
52
|
-
"vite": "8.
|
|
53
|
-
"vitest": "4.1.
|
|
53
|
+
"vite": "8.2.2",
|
|
54
|
+
"vitest": "4.1.11"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"@nsshunt/stsutils": "^1.19.
|
|
57
|
+
"@nsshunt/stsutils": "^1.19.134",
|
|
57
58
|
"chalk": "^5.6.2",
|
|
58
59
|
"ioredis": "^5.11.1",
|
|
59
60
|
"tiny-emitter": "^2.1.0"
|
package/types/commonTypes.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface IIPCMessageProcessorIPCPayload {
|
|
|
7
7
|
requestPayload: JSONObject;
|
|
8
8
|
responsePayload: JSONObject;
|
|
9
9
|
pid: string;
|
|
10
|
-
messageType:
|
|
10
|
+
messageType: "REQUEST" | "RESPONSE" | "REQUEST_NO_RESPONSE";
|
|
11
11
|
}
|
|
12
12
|
export interface IIPCMessageProcessorWorkerRecord {
|
|
13
13
|
messageId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commonTypes.d.ts","sourceRoot":"","sources":["../src/commonTypes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"commonTypes.d.ts","sourceRoot":"","sources":["../src/commonTypes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,8BAA8B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,UAAU,CAAC;IAC3B,eAAe,EAAE,UAAU,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,SAAS,GAAG,UAAU,GAAG,qBAAqB,CAAC;CAC/D;AAED,MAAM,WAAW,gCAAgC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,8BAA8B,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,OAAO,EAAE,8BAA8B,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAC1E,aAAa,EAAE,CACX,OAAO,EAAE,8BAA8B,EACvC,MAAM,EAAE,GAAG,KACV,IAAI,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,GAAG,EAAE,CAAC;CACf"}
|
package/types/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
1
|
+
export * from "./commonTypes.js";
|
|
2
|
+
export * from "./messagingManager.js";
|
|
3
|
+
export * from "./redisMessageHandler.js";
|
|
4
|
+
export * from "./ipcMessageHandler.js";
|
|
5
|
+
export * from "./ipcMessageHandlerPair.js";
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { TinyEmitter } from "tiny-emitter";
|
|
2
|
-
import { ISTSLogger, JSONObject } from
|
|
2
|
+
import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
|
|
3
3
|
export interface IPCMessageHandlerOptions {
|
|
4
4
|
logger: ISTSLogger;
|
|
5
5
|
requestResponseMessageTimeout: number;
|
|
6
6
|
namespace: string;
|
|
7
|
-
role:
|
|
7
|
+
role: "SERVER" | "CLIENT";
|
|
8
8
|
ignoreEvents?: string[];
|
|
9
9
|
}
|
|
10
10
|
declare interface IClientRecord {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipcMessageHandler.d.ts","sourceRoot":"","sources":["../src/ipcMessageHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ipcMessageHandler.d.ts","sourceRoot":"","sources":["../src/ipcMessageHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAgB1E,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,6BAA6B,EAAE,MAAM,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,OAAO,WAAW,aAAa;IAC3B,MAAM,EAAE,GAAG,CAAC;IACZ,cAAc,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;;gBAOlC,OAAO,EAAE,wBAAwB;IAU7C,IAAI,QAAQ,eAEX;IAED,SAAS,GAAI,QAAQ,GAAG,KAAG,MAAM,CAa/B;IAEF,YAAY,GAAI,IAAI,MAAM,UAMxB;IAEF,IAAI,OAAO,kCAEV;IAED,YAAY,aAgCV;IASF,WAAW,aAgCT;IAEF,WAAW,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,UAAU,CAAC,CA8B5D;IA4CO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI;IAejD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IASjD,KAAK,aAEH;IAGF,IAAI,aAEF;IAkBO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAgClD,cAAc,GAAU,OAAO,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAsBnE;CACL"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { TinyEmitter } from "tiny-emitter";
|
|
2
|
-
import { ISTSLogger, JSONObject } from
|
|
2
|
+
import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
|
|
3
3
|
export interface IPCMessageHandlerPairOptions {
|
|
4
4
|
logger: ISTSLogger;
|
|
5
5
|
requestResponseMessageTimeout: number;
|
|
6
6
|
namespace: string;
|
|
7
|
-
role:
|
|
7
|
+
role: "SERVER" | "CLIENT";
|
|
8
8
|
ignoreEvents?: string[];
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipcMessageHandlerPair.d.ts","sourceRoot":"","sources":["../src/ipcMessageHandlerPair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ipcMessageHandlerPair.d.ts","sourceRoot":"","sources":["../src/ipcMessageHandlerPair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAc1E,MAAM,WAAW,4BAA4B;IACzC,MAAM,EAAE,UAAU,CAAC;IACnB,6BAA6B,EAAE,MAAM,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,WAAW;;gBAQtC,OAAO,EAAE,4BAA4B;IAUjD,IAAI,QAAQ,eAEX;IAQD,YAAY,aAqCV;IASF,WAAW,aAgCT;IAEF,WAAW,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,UAAU,CAAC,CAa5D;IA4CO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI;IAejD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IASjD,KAAK,GAAI,SAAS,GAAG,UAOnB;IAGF,IAAI,aAOF;IAEF,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAkBQ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAgClD,cAAc,GAAU,OAAO,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAKnE;CACL"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ISTSLogger, JSONObject } from
|
|
2
|
-
import { Worker } from
|
|
3
|
-
import { IIPCMessageProcessorIPCPayload } from
|
|
1
|
+
import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
|
|
2
|
+
import { Worker } from "node:cluster";
|
|
3
|
+
import { IIPCMessageProcessorIPCPayload } from "./commonTypes.js";
|
|
4
4
|
export interface IIPCMessageProcessorPrimary {
|
|
5
5
|
logger: ISTSLogger;
|
|
6
6
|
namespace: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipcMessageProcessorPrimary.d.ts","sourceRoot":"","sources":["../src/ipcMessageProcessorPrimary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ipcMessageProcessorPrimary.d.ts","sourceRoot":"","sources":["../src/ipcMessageProcessorPrimary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAOlE,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CACb,OAAO,EAAE,8BAA8B,EACvC,OAAO,EAAE,GAAG,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,0BAA0B;;gBAIvB,YAAY,EAAE,2BAA2B;IA0CrD,WAAW,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,UAAU,CAAC,CAI5D;IAEF,KAAK,GAAI,QAAQ,MAAM,UAGrB;IAEF,IAAI,aAGF;IAEF,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;CACJ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ISTSLogger, JSONObject } from
|
|
2
|
-
import { IIPCMessageProcessorIPCPayload } from
|
|
1
|
+
import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
|
|
2
|
+
import { IIPCMessageProcessorIPCPayload } from "./commonTypes.js";
|
|
3
3
|
export interface IIPCMessageProcessorWorker {
|
|
4
4
|
logger: ISTSLogger;
|
|
5
5
|
requestResponseMessageTimeout: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipcMessageProcessorWorker.d.ts","sourceRoot":"","sources":["../src/ipcMessageProcessorWorker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ipcMessageProcessorWorker.d.ts","sourceRoot":"","sources":["../src/ipcMessageProcessorWorker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAOlE,MAAM,WAAW,0BAA0B;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,6BAA6B,EAAE,MAAM,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CACb,OAAO,EAAE,8BAA8B,EACvC,OAAO,EAAE,GAAG,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,yBAAyB;;gBAGtB,YAAY,EAAE,0BAA0B;IA2CpD,WAAW,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,UAAU,CAAC,CAE5D;IAEF,KAAK,aAEH;IAEF,IAAI,aAEF;CACL"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ISTSLogger, JSONObject } from
|
|
2
|
-
import { IIPCMessageProcessorIPCPayload } from
|
|
1
|
+
import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
|
|
2
|
+
import { IIPCMessageProcessorIPCPayload } from "./commonTypes.js";
|
|
3
3
|
export interface MessagingManagerOptions {
|
|
4
4
|
logger: ISTSLogger;
|
|
5
5
|
requestResponseMessageTimeout: number;
|
|
6
6
|
namespace: string;
|
|
7
|
-
role:
|
|
7
|
+
role: "SERVER" | "CLIENT";
|
|
8
8
|
groups: string[];
|
|
9
9
|
messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => void;
|
|
10
10
|
ProcessRequestMessage: (payload: IIPCMessageProcessorIPCPayload, options: any) => Promise<JSONObject>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagingManager.d.ts","sourceRoot":"","sources":["../src/messagingManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"messagingManager.d.ts","sourceRoot":"","sources":["../src/messagingManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EACH,8BAA8B,EAEjC,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,uBAAuB;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,6BAA6B,EAAE,MAAM,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,CACX,OAAO,EAAE,8BAA8B,EACvC,OAAO,EAAE,GAAG,KACX,IAAI,CAAC;IACV,qBAAqB,EAAE,CACnB,OAAO,EAAE,8BAA8B,EACvC,OAAO,EAAE,GAAG,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,sBAAsB,CAAC,EAAE,CACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,EAC1D,OAAO,EAAE,GAAG,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,oBAAoB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7C,mBAAmB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;CAC/C;AACD;;;;GAIG;AACH,qBAAa,gBAAgB;;gBAMb,OAAO,EAAE,uBAAuB;IAM5C,IAAI,EAAE,WAEL;IAGD,yBAAyB,CAAC,GAAG,EAAE,GAAG;IAIlC,qBAAqB,GAAI,SAAS,UAAU,EAAE,UAAU,GAAG,KAAG,IAAI,CAEhE;IAEF,WAAW,GAAI,SAAS,UAAU,EAAE,UAAU,GAAG,KAAG,OAAO,CAAC,UAAU,CAAC,CAarE;IA4GF,KAAK,GAAI,UAAU,GAAG,UAGpB;IAEF,IAAI,GAAI,UAAU,GAAG,UAYnB;IAGF,cAAc,GAAU,KAAK,GAAG,EAAE,SAAS,GAAG,mBAgD5C;CACL"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TinyEmitter } from "tiny-emitter";
|
|
2
|
-
import { ISTSLogger, JSONObject } from
|
|
2
|
+
import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
|
|
3
3
|
export interface IRedisAdminManagerOptions {
|
|
4
4
|
redisUrl: string;
|
|
5
5
|
logger: ISTSLogger;
|
|
6
|
-
role:
|
|
6
|
+
role: "SERVER" | "CLIENT";
|
|
7
7
|
namespace: string;
|
|
8
8
|
groups: string[];
|
|
9
9
|
ignoreEvents?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redisMessageHandler.d.ts","sourceRoot":"","sources":["../src/redisMessageHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"redisMessageHandler.d.ts","sourceRoot":"","sources":["../src/redisMessageHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAkB3D,MAAM,WAAW,yBAAyB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,qBAAa,mBAAoB,SAAQ,WAAW;;gBAWpC,OAAO,EAAE,yBAAyB;IAuK9C,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAE3C;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED,QAAQ,GAAI,OAAO,MAAM,UAKvB;IAEF,WAAW,GAAI,OAAO,MAAM,UAK1B;IAEF,YAAY,aAuBV;IAkIO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI;IAcjD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAOjD,KAAK,aAEH;IAEF,IAAI,aAaF;IAEO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IA8BlD,aAAa,CACT,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI,EACtD,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC9B,IAAI;IA2BP,MAAM,GAAU,OAAO,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,KAAG,OAAO,CAAC,UAAU,CAAC,CAKjE;IAEF,cAAc,GAAU,OAAO,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAKnE;CACL"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TinyEmitter } from "tiny-emitter";
|
|
2
|
-
import { ISTSLogger, JSONObject } from
|
|
3
|
-
import { MessagePort } from
|
|
2
|
+
import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
|
|
3
|
+
import { MessagePort } from "worker_threads";
|
|
4
4
|
export interface IWebWorkerMessageHandlerOptions {
|
|
5
5
|
logger: ISTSLogger;
|
|
6
|
-
role:
|
|
6
|
+
role: "SERVER" | "CLIENT";
|
|
7
7
|
namespace: string;
|
|
8
8
|
groups: string[];
|
|
9
9
|
ignoreEvents?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webWorkerMessageHandler.d.ts","sourceRoot":"","sources":["../src/webWorkerMessageHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"webWorkerMessageHandler.d.ts","sourceRoot":"","sources":["../src/webWorkerMessageHandler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAW3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,+BAA+B;IAC5C,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,GAAG,EAAE,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,qBAAa,uBAAwB,SAAQ,WAAW;;gBAQxC,OAAO,EAAE,+BAA+B;IAuDpD,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAE3C;IAED,IAAI,MAAM,IAAI,MAAM,EAAE,CAErB;IAED,QAAQ,GAAI,OAAO,MAAM,UAKvB;IAEF,WAAW,GAAI,OAAO,MAAM,UAK1B;IAEF,YAAY,aAyBV;IAuGO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI;IAcjD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAOjD,KAAK,aAEH;IAEF,IAAI,aAOF;IAEO,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IA6BlD,aAAa,CACT,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI,EACtD,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC9B,IAAI;IAyBP,MAAM,GAAU,OAAO,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,KAAG,OAAO,CAAC,UAAU,CAAC,CAKjE;CACL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webWorkerSupport.d.ts","sourceRoot":"","sources":["../src/webWorkerSupport.ts"],"names":[],"mappings":"AASA,qBAAa,aAAa;;;
|
|
1
|
+
{"version":3,"file":"webWorkerSupport.d.ts","sourceRoot":"","sources":["../src/webWorkerSupport.ts"],"names":[],"mappings":"AASA,qBAAa,aAAa;;;IA2DtB,cAAc,GAAU,MAAM,GAAG,mBAG/B;CACL"}
|