@nsshunt/stsmessaging 1.0.40 → 1.0.41

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.
@@ -160,8 +160,8 @@ class RedisMessageHandler extends TinyEmitter {
160
160
  #events = {};
161
161
  #requestChannel;
162
162
  #responseChannel;
163
- #redisSubscriber;
164
- #redisPublisher;
163
+ #ioredisSubscriber;
164
+ #ioredisPublisher;
165
165
  #clients = {};
166
166
  #pingTimeout = null;
167
167
  constructor(options) {
@@ -173,15 +173,15 @@ class RedisMessageHandler extends TinyEmitter {
173
173
  showFriendlyErrorStack: true,
174
174
  maxRetriesPerRequest: 20
175
175
  };
176
- this.#redisSubscriber = new Redis(this.#options.redisUrl, redisOptions);
177
- this.#redisPublisher = new Redis(this.#options.redisUrl, redisOptions);
178
- this.#redisSubscriber.on("error", (error) => {
176
+ this.#ioredisSubscriber = new Redis(this.#options.redisUrl, redisOptions);
177
+ this.#ioredisPublisher = new Redis(this.#options.redisUrl, redisOptions);
178
+ this.#ioredisSubscriber.on("error", (error) => {
179
179
  this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisSubscriber on error): [${error}]`));
180
180
  });
181
- this.#redisPublisher.on("error", (error) => {
181
+ this.#ioredisPublisher.on("error", (error) => {
182
182
  this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisPublisher on error): [${error}]`));
183
183
  });
184
- this.#redisSubscriber.subscribe(this.#requestChannel, this.#responseChannel, (error, count) => {
184
+ this.#ioredisSubscriber.subscribe(this.#requestChannel, this.#responseChannel, (error, count) => {
185
185
  if (error) {
186
186
  this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error - Failed to subscribe: [${error}]`));
187
187
  } else {
@@ -272,19 +272,19 @@ class RedisMessageHandler extends TinyEmitter {
272
272
  // This gets called when an event is received from a message receiver (when ProcessMessage is invoked from the receiver event handler)
273
273
  ProcessRequestMessage: this.#processPayload,
274
274
  messageReceiverStart: (options) => {
275
- this.#redisSubscriber.on("message", this.#processRawMessage);
275
+ this.#ioredisSubscriber.on("message", this.#processRawMessage);
276
276
  },
277
277
  messageReceiverStop: (options) => {
278
- this.#redisSubscriber.off("message", this.#processRawMessage);
278
+ this.#ioredisSubscriber.off("message", this.#processRawMessage);
279
279
  }
280
280
  };
281
281
  this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);
282
282
  };
283
283
  #messageSender = (payload, options) => {
284
284
  if (payload.messageType.localeCompare("REQUEST") === 0 || payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
285
- this.#redisPublisher.publish(this.#requestChannel, JSON.stringify(payload));
285
+ this.#ioredisPublisher.publish(this.#requestChannel, JSON.stringify(payload));
286
286
  } else if (payload.messageType.localeCompare("RESPONSE") === 0) {
287
- this.#redisPublisher.publish(this.#responseChannel, JSON.stringify(payload));
287
+ this.#ioredisPublisher.publish(this.#responseChannel, JSON.stringify(payload));
288
288
  }
289
289
  };
290
290
  #ProcessResponseMessage = async (responses, options) => {
@@ -371,10 +371,10 @@ class RedisMessageHandler extends TinyEmitter {
371
371
  this.#pingTimeout = null;
372
372
  }
373
373
  this.#messagingManager?.Stop();
374
- this.#redisSubscriber.quit();
375
- this.#redisSubscriber.disconnect();
376
- this.#redisPublisher.quit();
377
- this.#redisPublisher.disconnect();
374
+ this.#ioredisSubscriber.quit();
375
+ this.#ioredisSubscriber.disconnect();
376
+ this.#ioredisPublisher.quit();
377
+ this.#ioredisPublisher.disconnect();
378
378
  };
379
379
  emit(event, ...args) {
380
380
  (async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"stsmessaging.mjs","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\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { IIPCMessageProcessorIPCPayload, IIPCMessageProcessorWorkerRecord } from './commonTypes'\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 = uuidv4();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${uuidv4()}`;\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 = uuidv4();\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 = uuidv4();\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}__${uuidv4()}`;\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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 #redisSubscriber: Redis;\n #redisPublisher: 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.#redisSubscriber = new Redis(this.#options.redisUrl, redisOptions);\n this.#redisPublisher = new Redis(this.#options.redisUrl, redisOptions);\n\n this.#redisSubscriber.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.#redisPublisher.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.#redisSubscriber.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.#redisSubscriber.on(\"message\", this.#processRawMessage);\n },\n \n messageReceiverStop: (options: any) => {\n this.#redisSubscriber.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.#redisPublisher.publish(this.#requestChannel, JSON.stringify(payload));\n } else if (payload.messageType.localeCompare('RESPONSE') === 0) {\n this.#redisPublisher.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.#redisSubscriber.quit();\n this.#redisSubscriber.disconnect();\n\n this.#redisPublisher.quit();\n this.#redisPublisher.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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\n\nimport chalk from 'chalk';\n\nimport { v4 as uuidv4 } from 'uuid';\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 = uuidv4();\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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}"],"names":["uuidv4","payload"],"mappings":"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"}
1
+ {"version":3,"file":"stsmessaging.mjs","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\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { IIPCMessageProcessorIPCPayload, IIPCMessageProcessorWorkerRecord } from './commonTypes'\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 = uuidv4();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${uuidv4()}`;\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 = uuidv4();\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 = uuidv4();\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}__${uuidv4()}`;\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\n\nimport chalk from 'chalk';\n\nimport { v4 as uuidv4 } from 'uuid';\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 = uuidv4();\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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}"],"names":["uuidv4","payload"],"mappings":"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"}
@@ -159,8 +159,8 @@
159
159
  #events = {};
160
160
  #requestChannel;
161
161
  #responseChannel;
162
- #redisSubscriber;
163
- #redisPublisher;
162
+ #ioredisSubscriber;
163
+ #ioredisPublisher;
164
164
  #clients = {};
165
165
  #pingTimeout = null;
166
166
  constructor(options) {
@@ -172,15 +172,15 @@
172
172
  showFriendlyErrorStack: true,
173
173
  maxRetriesPerRequest: 20
174
174
  };
175
- this.#redisSubscriber = new ioredis.Redis(this.#options.redisUrl, redisOptions);
176
- this.#redisPublisher = new ioredis.Redis(this.#options.redisUrl, redisOptions);
177
- this.#redisSubscriber.on("error", (error) => {
175
+ this.#ioredisSubscriber = new ioredis.Redis(this.#options.redisUrl, redisOptions);
176
+ this.#ioredisPublisher = new ioredis.Redis(this.#options.redisUrl, redisOptions);
177
+ this.#ioredisSubscriber.on("error", (error) => {
178
178
  this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisSubscriber on error): [${error}]`));
179
179
  });
180
- this.#redisPublisher.on("error", (error) => {
180
+ this.#ioredisPublisher.on("error", (error) => {
181
181
  this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error (redisPublisher on error): [${error}]`));
182
182
  });
183
- this.#redisSubscriber.subscribe(this.#requestChannel, this.#responseChannel, (error, count) => {
183
+ this.#ioredisSubscriber.subscribe(this.#requestChannel, this.#responseChannel, (error, count) => {
184
184
  if (error) {
185
185
  this.#LogError(chalk.red(`RedisMessageHandler:constructor(): PID: [${process.pid}] Role: [${this.#options.role}] Error - Failed to subscribe: [${error}]`));
186
186
  } else {
@@ -271,19 +271,19 @@
271
271
  // This gets called when an event is received from a message receiver (when ProcessMessage is invoked from the receiver event handler)
272
272
  ProcessRequestMessage: this.#processPayload,
273
273
  messageReceiverStart: (options) => {
274
- this.#redisSubscriber.on("message", this.#processRawMessage);
274
+ this.#ioredisSubscriber.on("message", this.#processRawMessage);
275
275
  },
276
276
  messageReceiverStop: (options) => {
277
- this.#redisSubscriber.off("message", this.#processRawMessage);
277
+ this.#ioredisSubscriber.off("message", this.#processRawMessage);
278
278
  }
279
279
  };
280
280
  this.#messagingManager = new MessagingManager(ipcMessageManagerOptions);
281
281
  };
282
282
  #messageSender = (payload, options) => {
283
283
  if (payload.messageType.localeCompare("REQUEST") === 0 || payload.messageType.localeCompare("REQUEST_NO_RESPONSE") === 0) {
284
- this.#redisPublisher.publish(this.#requestChannel, JSON.stringify(payload));
284
+ this.#ioredisPublisher.publish(this.#requestChannel, JSON.stringify(payload));
285
285
  } else if (payload.messageType.localeCompare("RESPONSE") === 0) {
286
- this.#redisPublisher.publish(this.#responseChannel, JSON.stringify(payload));
286
+ this.#ioredisPublisher.publish(this.#responseChannel, JSON.stringify(payload));
287
287
  }
288
288
  };
289
289
  #ProcessResponseMessage = async (responses, options) => {
@@ -370,10 +370,10 @@
370
370
  this.#pingTimeout = null;
371
371
  }
372
372
  this.#messagingManager?.Stop();
373
- this.#redisSubscriber.quit();
374
- this.#redisSubscriber.disconnect();
375
- this.#redisPublisher.quit();
376
- this.#redisPublisher.disconnect();
373
+ this.#ioredisSubscriber.quit();
374
+ this.#ioredisSubscriber.disconnect();
375
+ this.#ioredisPublisher.quit();
376
+ this.#ioredisPublisher.disconnect();
377
377
  };
378
378
  emit(event, ...args) {
379
379
  (async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"stsmessaging.umd.js","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\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { IIPCMessageProcessorIPCPayload, IIPCMessageProcessorWorkerRecord } from './commonTypes'\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 = uuidv4();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${uuidv4()}`;\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 = uuidv4();\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 = uuidv4();\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}__${uuidv4()}`;\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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 #redisSubscriber: Redis;\n #redisPublisher: 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.#redisSubscriber = new Redis(this.#options.redisUrl, redisOptions);\n this.#redisPublisher = new Redis(this.#options.redisUrl, redisOptions);\n\n this.#redisSubscriber.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.#redisPublisher.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.#redisSubscriber.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.#redisSubscriber.on(\"message\", this.#processRawMessage);\n },\n \n messageReceiverStop: (options: any) => {\n this.#redisSubscriber.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.#redisPublisher.publish(this.#requestChannel, JSON.stringify(payload));\n } else if (payload.messageType.localeCompare('RESPONSE') === 0) {\n this.#redisPublisher.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.#redisSubscriber.quit();\n this.#redisSubscriber.disconnect();\n\n this.#redisPublisher.quit();\n this.#redisPublisher.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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\n\nimport chalk from 'chalk';\n\nimport { v4 as uuidv4 } from 'uuid';\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 = uuidv4();\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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}"],"names":["uuidv4","payload","TinyEmitter","Redis","defaultLogger"],"mappings":"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"}
1
+ {"version":3,"file":"stsmessaging.umd.js","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\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { IIPCMessageProcessorIPCPayload, IIPCMessageProcessorWorkerRecord } from './commonTypes'\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 = uuidv4();\n this.#options = options;\n this.#messageHeader = `__STS__${this.#options.namespace}__${uuidv4()}`;\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 = uuidv4();\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 = uuidv4();\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}__${uuidv4()}`;\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\n\nimport chalk from 'chalk';\n\nimport { v4 as uuidv4 } from 'uuid';\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 = uuidv4();\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'\n\nimport { MessagingManager, MessagingManagerOptions } from './messagingManager'\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}"],"names":["uuidv4","payload","TinyEmitter","Redis","defaultLogger"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsmessaging",
3
- "version": "1.0.40",
3
+ "version": "1.0.41",
4
4
  "description": "STS Messeging",
5
5
  "main": "./dist/stsmessaging.umd.js",
6
6
  "module": "./dist/stsmessaging.mjs",
@@ -40,16 +40,16 @@
40
40
  "devDependencies": {
41
41
  "@typescript-eslint/eslint-plugin": "8.45.0",
42
42
  "@typescript-eslint/parser": "8.45.0",
43
- "eslint": "^9.36.0",
43
+ "eslint": "^9.37.0",
44
44
  "globals": "16.4.0",
45
- "testcontainers": "11.7.0",
45
+ "testcontainers": "11.7.1",
46
46
  "ts-node": "^10.9.2",
47
47
  "typescript": "^5.9.3",
48
- "vite": "7.1.7",
48
+ "vite": "7.1.9",
49
49
  "vitest": "3.2.4"
50
50
  },
51
51
  "dependencies": {
52
- "@nsshunt/stsutils": "^1.19.45",
52
+ "@nsshunt/stsutils": "^1.19.46",
53
53
  "chalk": "^4.1.2",
54
54
  "ioredis": "^5.8.0",
55
55
  "tiny-emitter": "^2.1.0",
@@ -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,CAAA;AAQ1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,+BAA+B;IAC5C,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,UAAU,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,GAAG,EAAE,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,GAAG,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAA;CACZ;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,UAAU,CAAA;CACzB;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,UAKxB;IAED,WAAW,GAAI,OAAO,MAAM,UAK3B;IAED,YAAY,aAyBX;IA4FQ,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,aAEJ;IAED,IAAI,aAeH;IAEQ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAqBlD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAqB3I,MAAM,GAAS,OAAO,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,KAAG,OAAO,CAAC,UAAU,CAAC,CAKjE;CACJ"}
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,CAAA;AAQ1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,+BAA+B;IAC5C,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,WAAW,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,eAAe,EAAE,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,UAAU,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,GAAG,EAAE,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,GAAG,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAA;CACZ;AAED,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,UAAU,CAAA;CACzB;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,UAKxB;IAED,WAAW,GAAI,OAAO,MAAM,UAK3B;IAED,YAAY,aAuBX;IAwFQ,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,aAEJ;IAED,IAAI,aAOH;IAEQ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAqBlD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAqB3I,MAAM,GAAS,OAAO,MAAM,EAAE,GAAG,MAAM,GAAG,EAAE,KAAG,OAAO,CAAC,UAAU,CAAC,CAKjE;CACJ"}