@nsshunt/stsmessaging 1.0.78 → 1.0.79

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.
@@ -1 +1 @@
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 IMessageProcessorPayload,\n IMessageProcessorWorkerRecord,\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: (payload: IMessageProcessorPayload, options: any) => void;\n ProcessRequestMessage: (\n payload: IMessageProcessorPayload,\n options: any\n ) => Promise<JSONObject>;\n ProcessResponseMessage?: (\n reesponses: Record<string, IMessageProcessorPayload>,\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, IMessageProcessorWorkerRecord> = {};\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: IMessageProcessorPayload) => {\n resolve(payload.responsePayload);\n },\n (payload: IMessageProcessorPayload) => {\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: IMessageProcessorPayload = {\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: IMessageProcessorPayload) => void,\n errorCallBack: (payload: IMessageProcessorPayload) => void\n ): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IMessageProcessorPayload = {\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 IMessageProcessorPayload;\n if (this.#inflightMessages[message.messageId]) {\n const inFlightMessageRecord: IMessageProcessorWorkerRecord =\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 IMessageProcessorPayload;\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 { IMessageProcessorPayload, IEventPayload } 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 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 messageManagerOptions: 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(messageManagerOptions);\n };\n\n #messageSender = (payload: IMessageProcessorPayload, options: any) => {\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, IMessageProcessorPayload>,\n options: any\n ): Promise<boolean> => {\n // Now check if we have all responses ...\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: IMessageProcessorPayload,\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 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 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 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 { IMessageProcessorPayload, IEventPayload } 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: IMessageProcessorPayload,\n options: any\n ) => {\n (options.client as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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 { IMessageProcessorPayload, IEventPayload } 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: IMessageProcessorPayload,\n options: any\n ) => {\n (options.worker as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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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"}
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 IMessageProcessorPayload,\n IMessageProcessorWorkerRecord,\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: (payload: IMessageProcessorPayload, options: any) => void;\n ProcessRequestMessage: (\n payload: IMessageProcessorPayload,\n options: any\n ) => Promise<JSONObject>;\n ProcessResponseMessage?: (\n reesponses: Record<string, IMessageProcessorPayload>,\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, IMessageProcessorWorkerRecord> = {};\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: IMessageProcessorPayload) => {\n resolve(payload.responsePayload);\n },\n (payload: IMessageProcessorPayload) => {\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: IMessageProcessorPayload = {\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: IMessageProcessorPayload) => void,\n errorCallBack: (payload: IMessageProcessorPayload) => void\n ): void => {\n const messageId: string = globalThis.crypto.randomUUID(); // randomUUID();\n const requestPayload: IMessageProcessorPayload = {\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 IMessageProcessorPayload;\n if (this.#inflightMessages[message.messageId]) {\n const inFlightMessageRecord: IMessageProcessorWorkerRecord =\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 IMessageProcessorPayload;\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 { IMessageProcessorPayload, IEventPayload } 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 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 messageManagerOptions: 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(messageManagerOptions);\n };\n\n #messageSender = (payload: IMessageProcessorPayload, options: any) => {\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, IMessageProcessorPayload>,\n options: any\n ): Promise<boolean> => {\n // Now check if we have all responses ...\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: IMessageProcessorPayload,\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 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 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 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 { IMessageProcessorPayload, IEventPayload } 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 the 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: IMessageProcessorPayload,\n options: any\n ) => {\n (options.client as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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\n\n/*\n| Feature | `IPCMessageHandler` | `IPCMessageHandlerPair` |\n| ----------------------------- | -------------------------------- | ---------------------------------- |\n| Primary → worker relationship | 1 → many | 1 → 1 |\n| Stores workers | `#clients` collection | single `#worker` |\n| Add/remove workers | `AddClient()` / `RemoveClient()` | `Start(worker)` / `Stop()` |\n| Server `SendMessage()` | sends to **all workers** | sends to **one worker** |\n| Server `emitNoResponse()` | sends to **all workers** | sends to **one worker** |\n| Server responses | `Promise.all()` array | one response |\n| Worker side | essentially same | essentially same |\n| Best use | cluster-wide messaging | dedicated connection to one worker |\n*/\n\nimport { TinyEmitter } from \"tiny-emitter\";\nimport { ISTSLogger, JSONObject, defaultLogger } from \"@nsshunt/stsutils\";\n\nimport { IMessageProcessorPayload, IEventPayload } 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 the 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: IMessageProcessorPayload,\n options: any\n ) => {\n (options.worker as any).send(payload);\n },\n ProcessRequestMessage: async (\n payload: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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: IMessageProcessorPayload,\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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsmessaging",
3
- "version": "1.0.78",
3
+ "version": "1.0.79",
4
4
  "description": "STS Messeging",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -44,7 +44,7 @@
44
44
  "@types/node": "^26.4.1",
45
45
  "@typescript-eslint/eslint-plugin": "8.69.0",
46
46
  "@typescript-eslint/parser": "8.69.0",
47
- "eslint": "^10.9.1",
47
+ "eslint": "^10.10.0",
48
48
  "eslint-config-prettier": "^10.1.8",
49
49
  "globals": "17.12.0",
50
50
  "testcontainers": "12.1.0",
@@ -54,7 +54,7 @@
54
54
  "vitest": "5.0.0"
55
55
  },
56
56
  "dependencies": {
57
- "@nsshunt/stsutils": "^1.19.139",
57
+ "@nsshunt/stsutils": "^1.19.140",
58
58
  "chalk": "^5.6.2",
59
59
  "ioredis": "^5.11.1",
60
60
  "tiny-emitter": "^2.1.0"
@@ -15,7 +15,7 @@ declare interface IClientRecord {
15
15
  * IPC Message Handling.
16
16
  *
17
17
  * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.
18
- * This class can be used for both tghe cluster primary and the cluster worker.
18
+ * This class can be used for both the cluster primary and the cluster worker.
19
19
  * Note: Currently groups handling is not supported. Use the redis version for this capability.
20
20
  */
21
21
  export declare class IPCMessageHandler extends TinyEmitter {
@@ -1,3 +1,4 @@
1
+
1
2
  import { TinyEmitter } from "tiny-emitter";
2
3
  import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
3
4
  export interface IPCMessageHandlerPairOptions {
@@ -11,7 +12,7 @@ export interface IPCMessageHandlerPairOptions {
11
12
  * IPC Message Handling.
12
13
  *
13
14
  * This class can be used to support messages between cluster.primary and cluster.worker instances using IPC.
14
- * This class can be used for both tghe cluster primary and the cluster worker.
15
+ * This class can be used for both the cluster primary and the cluster worker.
15
16
  * Note: Currently groups handling is not supported. Use the redis version for this capability.
16
17
  */
17
18
  export declare class IPCMessageHandlerPair extends TinyEmitter {
@@ -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,CAAC;AAW1E,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
+ {"version":3,"file":"ipcMessageHandlerPair.d.ts","sourceRoot":"","sources":["../src/ipcMessageHandlerPair.ts"],"names":[],"mappings":";AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAW1E,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"}
@@ -0,0 +1,152 @@
1
+
2
+ import type { Worker } from "node:cluster";
3
+ import { ISTSLogger, JSONObject } from "@nsshunt/stsutils";
4
+ import { IPCMessageHandlerPair } from "./ipcMessageHandlerPair.js";
5
+ export interface IPCMessageHandlerPairManagerOptions {
6
+ logger: ISTSLogger;
7
+ requestResponseMessageTimeout: number;
8
+ namespace: string;
9
+ ignoreEvents?: string[];
10
+ /**
11
+ * Automatically remove and stop a pair when its cluster worker exits.
12
+ *
13
+ * Defaults to true.
14
+ */
15
+ autoRemoveOnWorkerExit?: boolean;
16
+ }
17
+ export interface IPCMessageHandlerPairManagerResponse {
18
+ workerId: number;
19
+ response: JSONObject;
20
+ }
21
+ export interface IPCMessageHandlerPairManagerSettledResponse {
22
+ workerId: number;
23
+ status: "fulfilled" | "rejected";
24
+ response?: JSONObject;
25
+ error?: unknown;
26
+ }
27
+ /**
28
+ * Manages a collection of IPCMessageHandlerPair instances.
29
+ *
30
+ * This class is intended to run on the SERVER / cluster.primary side.
31
+ *
32
+ * Each worker gets its own IPCMessageHandlerPair:
33
+ *
34
+ * Worker Manager
35
+ * |
36
+ * +-- Worker 1 -> IPCMessageHandlerPair
37
+ * +-- Worker 2 -> IPCMessageHandlerPair
38
+ * +-- Worker 3 -> IPCMessageHandlerPair
39
+ *
40
+ * IPCMessageHandlerPair remains responsible for one IPC connection.
41
+ * This manager is responsible for:
42
+ *
43
+ * - the collection of pairs;
44
+ * - adding/removing workers;
45
+ * - propagating event handlers to all pairs;
46
+ * - sending to one worker;
47
+ * - broadcasting to all workers;
48
+ * - cleaning up pairs when workers exit.
49
+ */
50
+ export declare class IPCMessageHandlerPairManager {
51
+ #private;
52
+ constructor(options: IPCMessageHandlerPairManagerOptions);
53
+ /**
54
+ * Number of worker/pair relationships currently managed.
55
+ */
56
+ get size(): number;
57
+ /**
58
+ * Read-only view of the current worker -> pair collection.
59
+ */
60
+ get pairs(): ReadonlyMap<number, IPCMessageHandlerPair>;
61
+ /**
62
+ * Returns all worker IDs currently managed.
63
+ */
64
+ get workerIds(): number[];
65
+ /**
66
+ * Add a cluster worker and create its dedicated IPCMessageHandlerPair.
67
+ *
68
+ * If the same Worker instance is already registered, the existing pair
69
+ * is returned.
70
+ *
71
+ * If the worker ID already exists but refers to a different Worker
72
+ * instance, the old pair is removed first.
73
+ */
74
+ AddWorker: (worker: Worker) => IPCMessageHandlerPair;
75
+ /**
76
+ * Remove a worker's pair and stop its IPC message receiver.
77
+ */
78
+ RemoveWorker: (workerOrId: Worker | number) => boolean;
79
+ /**
80
+ * Returns true when a pair exists for the worker ID.
81
+ */
82
+ HasWorker: (workerId: number) => boolean;
83
+ /**
84
+ * Get the pair associated with a worker ID.
85
+ */
86
+ GetPair: (workerId: number) => IPCMessageHandlerPair | undefined;
87
+ /**
88
+ * Get the cluster Worker associated with a worker ID.
89
+ */
90
+ GetWorker: (workerId: number) => Worker | undefined;
91
+ /**
92
+ * Register an incoming event handler on every current pair.
93
+ *
94
+ * The registration is also retained by the manager and automatically
95
+ * applied to workers added later.
96
+ */
97
+ on: (event: string, callback: any, ctx?: any) => this;
98
+ /**
99
+ * Remove an incoming event handler from every current pair and prevent
100
+ * it being applied to future pairs.
101
+ */
102
+ off: (event: string, callback?: any) => this;
103
+ /**
104
+ * Send a raw MessagingManager payload to one worker.
105
+ */
106
+ SendMessageTo: (workerId: number, payload: JSONObject) => Promise<JSONObject>;
107
+ /**
108
+ * Send a raw MessagingManager payload to every worker.
109
+ *
110
+ * This has Promise.all() semantics: if any worker rejects/times out,
111
+ * the complete operation rejects.
112
+ */
113
+ SendMessageToAll: (payload: JSONObject) => Promise<IPCMessageHandlerPairManagerResponse[]>;
114
+ /**
115
+ * Send a raw MessagingManager payload to every worker without allowing
116
+ * one failed worker to reject the entire broadcast.
117
+ */
118
+ SendMessageToAllSettled: (payload: JSONObject) => Promise<IPCMessageHandlerPairManagerSettledResponse[]>;
119
+ /**
120
+ * Emit a request/response event to one worker.
121
+ *
122
+ * Unlike IPCMessageHandlerPair.emit(), this returns the Promise directly,
123
+ * which makes targeted manager operations easier to await.
124
+ */
125
+ emitTo: (workerId: number, event: string, ...args: any[]) => Promise<JSONObject>;
126
+ /**
127
+ * Emit a request/response event to every worker.
128
+ */
129
+ emitToAll: (event: string, ...args: any[]) => Promise<IPCMessageHandlerPairManagerResponse[]>;
130
+ /**
131
+ * Emit a request/response event to every worker while returning the
132
+ * result of every individual worker, including failures/timeouts.
133
+ */
134
+ emitToAllSettled: (event: string, ...args: any[]) => Promise<IPCMessageHandlerPairManagerSettledResponse[]>;
135
+ /**
136
+ * Emit a fire-and-forget event to one worker.
137
+ */
138
+ emitNoResponseTo: (workerId: number, event: string, ...args: any[]) => Promise<void>;
139
+ /**
140
+ * Emit a fire-and-forget event to every worker.
141
+ */
142
+ emitNoResponseToAll: (event: string, ...args: any[]) => Promise<void>;
143
+ /**
144
+ * Stop every pair and clear the worker collection.
145
+ *
146
+ * Event registrations are intentionally retained. This allows the manager
147
+ * to be reused later and ensures newly-added workers receive the same
148
+ * event registrations.
149
+ */
150
+ Stop: () => void;
151
+ }
152
+ //# sourceMappingURL=ipcMessageHandlerPairManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipcMessageHandlerPairManager.d.ts","sourceRoot":"","sources":["../src/ipcMessageHandlerPairManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+
2
+ export {};
3
+ //# sourceMappingURL=ipcMessageHandlerPairManager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipcMessageHandlerPairManager.test.d.ts","sourceRoot":"","sources":["../src/ipcMessageHandlerPairManager.test.ts"],"names":[],"mappings":""}