@nsshunt/stsappframework 3.1.118 → 3.1.120

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/ipcMessageHandler.js +171 -0
  2. package/dist/ipcMessageHandler.js.map +1 -0
  3. package/dist/ipcMessageManager.js +15 -5
  4. package/dist/ipcMessageManager.js.map +1 -1
  5. package/dist/ipcMessageProcessorPrimary.js +1 -0
  6. package/dist/ipcMessageProcessorPrimary.js.map +1 -1
  7. package/dist/ipcMessageProcessorWorker.js +1 -0
  8. package/dist/ipcMessageProcessorWorker.js.map +1 -1
  9. package/dist/redisMessageHandler.js +212 -0
  10. package/dist/redisMessageHandler.js.map +1 -0
  11. package/dist/redisMessageHandler.test.js +127 -0
  12. package/dist/redisMessageHandler.test.js.map +1 -0
  13. package/dist/testing/app.js +112 -5
  14. package/dist/testing/app.js.map +1 -1
  15. package/package.json +1 -1
  16. package/runtest2.sh +1 -1
  17. package/src/commonTypes.ts +1 -0
  18. package/src/ipcMessageHandler.ts +181 -0
  19. package/src/ipcMessageManager.ts +19 -9
  20. package/src/ipcMessageProcessorPrimary.ts +1 -0
  21. package/src/ipcMessageProcessorWorker.ts +1 -0
  22. package/src/redisMessageHandler.test.ts +155 -0
  23. package/src/redisMessageHandler.ts +256 -0
  24. package/src/testing/app.ts +132 -8
  25. package/types/commonTypes.d.ts +1 -0
  26. package/types/commonTypes.d.ts.map +1 -1
  27. package/types/ipcMessageHandler.d.ts +24 -0
  28. package/types/ipcMessageHandler.d.ts.map +1 -0
  29. package/types/ipcMessageManager.d.ts +4 -3
  30. package/types/ipcMessageManager.d.ts.map +1 -1
  31. package/types/ipcMessageProcessorPrimary.d.ts.map +1 -1
  32. package/types/ipcMessageProcessorWorker.d.ts.map +1 -1
  33. package/types/redisMessageHandler.d.ts +35 -0
  34. package/types/redisMessageHandler.d.ts.map +1 -0
  35. package/types/redisMessageHandler.test.d.ts +2 -0
  36. package/types/redisMessageHandler.test.d.ts.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redisMessageHandler.test.js","sourceRoot":"","sources":["../src/redisMessageHandler.test.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,9 @@ const ipcMessageProcessorWorker_1 = require("./../ipcMessageProcessorWorker");
12
12
  const stsutils_1 = require("@nsshunt/stsutils");
13
13
  const ipcMessageProcessorPrimary_1 = require("./../ipcMessageProcessorPrimary");
14
14
  const chalk_1 = __importDefault(require("chalk"));
15
+ const uuid_1 = require("uuid");
16
+ const redisMessageHandler_1 = require("./../redisMessageHandler");
17
+ const stsconfig_1 = require("@nsshunt/stsconfig");
15
18
  const sleepVal = 0;
16
19
  const maxLoop = 100;
17
20
  const zzz = async () => {
@@ -34,8 +37,7 @@ const zzz = async () => {
34
37
  console.log(chalk_1.default.green(JSON.stringify(retVal)));
35
38
  }
36
39
  };
37
- if (node_cluster_1.default.isPrimary) {
38
- new __1.MasterProcessBase((0, appConfig_1.ServiceConfigOptions)(true, node_cluster_1.default.isPrimary)).SetupServer();
40
+ const StartTestPrimary = () => {
39
41
  setTimeout(async () => {
40
42
  for (const id in node_cluster_1.default.workers) {
41
43
  const p1 = new ipcMessageProcessorPrimary_1.IPCMessageProcessorPrimary({
@@ -82,9 +84,8 @@ if (node_cluster_1.default.isPrimary) {
82
84
  }
83
85
  zzz();
84
86
  }, 1000);
85
- }
86
- else {
87
- new appWorkerWSS_1.WorkerProcess((0, appConfig_1.ServiceConfigOptions)(true, node_cluster_1.default.isPrimary)).SetupServer();
87
+ };
88
+ const StartTestWorker = () => {
88
89
  const w1 = new ipcMessageProcessorWorker_1.IPCMessageProcessorWorker({
89
90
  logger: stsutils_1.defaultLogger,
90
91
  namespace: 'test1',
@@ -153,5 +154,111 @@ else {
153
154
  await (0, stsutils_1.Sleep)(sleepVal);
154
155
  }
155
156
  }, 1000);
157
+ };
158
+ const iterations = 100;
159
+ const delay = 100;
160
+ if (node_cluster_1.default.isPrimary) {
161
+ new __1.MasterProcessBase((0, appConfig_1.ServiceConfigOptions)(true, node_cluster_1.default.isPrimary)).SetupServer();
162
+ //StartTestPrimary();
163
+ setTimeout(() => {
164
+ const p = {};
165
+ /*
166
+ for (const id in cluster.workers) {
167
+ const worker = cluster.workers[id] as Worker;
168
+
169
+ const p1: IPCMessageHandler = new IPCMessageHandler({
170
+ logger: defaultLogger,
171
+ requestResponseMessageTimeout: 5000,
172
+ namespace: 'aabbcc'
173
+ });
174
+ p1.Start(worker);
175
+
176
+ p1.on('fromworker', (arg1: string, arg2: number, arg3: string, callback: any) => {
177
+ //callback(null);
178
+ callback({status: `response message from event = fromworker with args ${arg1} ${arg2} ${arg3}`})
179
+ });
180
+
181
+ p[worker.id] = p1;
182
+ }
183
+ */
184
+ const r1 = new redisMessageHandler_1.RedisMessageHandler({
185
+ logger: stsutils_1.defaultLogger,
186
+ role: 'SERVER',
187
+ redisUrl: stsconfig_1.goptions.imRedisMessageProcessorUrl,
188
+ namespace: 'mytestapp'
189
+ });
190
+ r1.Start();
191
+ r1.on('fromworkerredis', (arg1, arg2, arg3, callback) => {
192
+ console.log(chalk_1.default.magenta(`${process.pid}: fromworkerredis.ON: [${arg1} ${arg2} ${arg3}]`));
193
+ //callback(null);
194
+ callback({ status: `response message from event = fromworkerredis with args ${arg1} ${arg2} ${arg3}` });
195
+ });
196
+ setTimeout(async () => {
197
+ for (let i = 0; i < iterations; i++) {
198
+ /*
199
+ Object.keys(p).forEach(async (pKey) => {
200
+ const emitobj = { i: i, a: 'a', b: 'b', worker: pKey };
201
+ console.log(chalk.green(`${process.pid}: emit event to worker: [${pKey}] fromprimary: [${JSON.stringify(emitobj)}`));
202
+ p[pKey].emit('fromprimary', emitobj, (response: any) => {
203
+ console.log(chalk.green(`${process.pid}: ${JSON.stringify(response)}`));
204
+ });
205
+ });
206
+ */
207
+ const emitobj = { i: i, a: 'a', b: 'b' };
208
+ console.log(chalk_1.default.cyan(`${process.pid}: emit event fromprimaryredis fromprimary: [${JSON.stringify(emitobj)}`));
209
+ r1.emit('fromprimaryredis', emitobj, (response) => {
210
+ console.log(chalk_1.default.cyan(`${process.pid}: Response(fromprimaryredis): [${JSON.stringify(response)}]`));
211
+ });
212
+ await (0, stsutils_1.Sleep)(delay);
213
+ }
214
+ }, 1000);
215
+ }, 1000);
216
+ }
217
+ else {
218
+ new appWorkerWSS_1.WorkerProcess((0, appConfig_1.ServiceConfigOptions)(true, node_cluster_1.default.isPrimary)).SetupServer();
219
+ //StartTestWorker();
220
+ setTimeout(async () => {
221
+ /*
222
+ const w1: IPCMessageHandler = new IPCMessageHandler({
223
+ logger: defaultLogger,
224
+ requestResponseMessageTimeout: 5000,
225
+ namespace: 'aabbcc'
226
+ });
227
+ w1.Start();
228
+
229
+ w1.on('fromprimary', (arg1: JSONObject, callback: any) => {
230
+ //callback();
231
+ callback({status: `response message from event = fromprimary with args ${JSON.stringify(arg1)}`})
232
+ });
233
+ */
234
+ const r1 = new redisMessageHandler_1.RedisMessageHandler({
235
+ logger: stsutils_1.defaultLogger,
236
+ role: 'CLIENT',
237
+ redisUrl: stsconfig_1.goptions.imRedisMessageProcessorUrl,
238
+ namespace: 'mytestapp'
239
+ });
240
+ r1.Start();
241
+ r1.on('fromprimaryredis', (arg1, callback) => {
242
+ //callback();
243
+ console.log(chalk_1.default.yellow(`${process.pid}: fromprimaryredis.ON: [${JSON.stringify(arg1)}]`));
244
+ callback({ status: `PID: [${process.pid}]: response message from event = fromprimaryredis with args ${JSON.stringify(arg1)}` });
245
+ });
246
+ setTimeout(async () => {
247
+ for (let i = 0; i < iterations; i++) {
248
+ const id = (0, uuid_1.v4)();
249
+ /*
250
+ console.log(chalk.yellow(`${process.pid}: emit event fromworker: [${id} ${i} Hello]`));
251
+ w1.emit('fromworker', id, i, 'Hello', (response: any) => {
252
+ console.log(chalk.yellow(`${process.pid}: ${JSON.stringify(response)}`));
253
+ });
254
+ */
255
+ console.log(chalk_1.default.green(`${process.pid}: emit event fromworkerredis: [${id} ${i} Hello]`));
256
+ r1.emit('fromworkerredis', id, i, 'Hello', (response) => {
257
+ console.log(chalk_1.default.green(`${process.pid}: Response(fromworkerredis): [${JSON.stringify(response)}]`));
258
+ });
259
+ await (0, stsutils_1.Sleep)(delay);
260
+ }
261
+ }, 1000);
262
+ }, 1000);
156
263
  }
157
264
  //# sourceMappingURL=app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/testing/app.ts"],"names":[],"mappings":";;;;;AAAA,wFAAwF,CAAE,UAAU;AACpG,2CAAkD;AAClD,4BAAwC;AACxC,iDAA8C;AAE9C,gEAA+C;AAE/C,8EAA0E;AAC1E,gDAAqE;AAErE,gFAA4E;AAI5E,kDAA0B;AAG1B,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;IACnB,MAAM,GAAG,GAAiC,EAAG,CAAC;IAC9C,KAAK,MAAM,EAAE,IAAI,sBAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,sBAAO,CAAC,OAAO,CAAC,EAAE,CAAW,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,uDAA0B,CAAC;YACtC,MAAM,EAAE,wBAAa;YACrB,SAAS,EAAE,KAAK;SACnB,CAAC,CAAA;QACF,EAAE,CAAC,KAAK,CAAC,sBAAO,CAAC,OAAO,CAAC,EAAE,CAAW,CAAC,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,SAAS,GAA0B,EAAG,CAAC;IAC7C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAC,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACtD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;AACL,CAAC,CAAA;AAED,IAAI,sBAAO,CAAC,SAAS,EAAE,CAAC;IACpB,IAAI,qBAAiB,CAAC,IAAA,gCAAoB,EAAC,IAAI,EAAE,sBAAO,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEnF,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,KAAK,MAAM,EAAE,IAAI,sBAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAI,uDAA0B,CAAC;gBACtC,MAAM,EAAE,wBAAa;gBACrB,SAAS,EAAE,OAAO;gBAClB,cAAc,EAAE,KAAK,EAAE,OAAuC,EAAE,EAAE;oBAC9D,OAAO;wBACH,GAAG,EAAE,kBAAkB,OAAO,CAAC,GAAG,GAAG;wBACrC,OAAO,EAAE,OAAO,CAAC,cAAc;wBAC/B,MAAM,EAAE,QAAQ;wBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;qBACnB,CAAC;gBACN,CAAC;aACJ,CAAC,CAAA;YAEF,MAAM,EAAE,GAAG,IAAI,uDAA0B,CAAC;gBACtC,MAAM,EAAE,wBAAa;gBACrB,SAAS,EAAE,OAAO;gBAClB,cAAc,EAAE,KAAK,EAAE,OAAuC,EAAE,EAAE;oBAC9D,OAAO;wBACH,GAAG,EAAE,kBAAkB,OAAO,CAAC,GAAG,GAAG;wBACrC,OAAO,EAAE,OAAO,CAAC,cAAc;wBAC/B,MAAM,EAAE,QAAQ;wBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;qBACnB,CAAC;gBACN,CAAC;aACJ,CAAC,CAAA;YAEF,EAAE,CAAC,KAAK,CAAC,sBAAO,CAAC,OAAO,CAAC,EAAE,CAAW,CAAC,CAAC;YACxC,EAAE,CAAC,KAAK,CAAC,sBAAO,CAAC,OAAO,CAAC,EAAE,CAAW,CAAC,CAAC;YAExC,UAAU,CAAC,KAAK,IAAI,EAAE;gBAClB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC;wBACjC,KAAK,EAAE,qBAAqB;wBAC5B,KAAK,EAAE,CAAC;qBACX,CAAC,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC;wBACjC,KAAK,EAAE,qBAAqB;wBAC5B,KAAK,EAAE,CAAC;qBACX,CAAC,CAAC;oBAEH,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;oBAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;oBAE5D,MAAM,IAAA,gBAAK,EAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACL,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC;QAED,GAAG,EAAE,CAAC;IAEV,CAAC,EAAE,IAAI,CAAC,CAAC;AAEb,CAAC;KAAM,CAAC;IACJ,IAAI,4BAAa,CAAC,IAAA,gCAAoB,EAAC,IAAI,EAAE,sBAAO,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAE/E,MAAM,EAAE,GAAG,IAAI,qDAAyB,CAAC;QACrC,MAAM,EAAE,wBAAa;QACrB,SAAS,EAAE,OAAO;QAClB,6BAA6B,EAAE,IAAI;QACnC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9B,OAAO;gBACH,IAAI,EAAE,iBAAiB,OAAO,CAAC,GAAG,GAAG;gBACrC,QAAQ,EAAE,OAAO,CAAC,cAAc;gBAChC,IAAI,EAAE,OAAO,CAAC,GAAG;aACpB,CAAA;QACL,CAAC;KACJ,CAAC,CAAA;IAEF,MAAM,EAAE,GAAG,IAAI,qDAAyB,CAAC;QACrC,MAAM,EAAE,wBAAa;QACrB,SAAS,EAAE,OAAO;QAClB,6BAA6B,EAAE,IAAI;QACnC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9B,OAAO;gBACH,IAAI,EAAE,iBAAiB,OAAO,CAAC,GAAG,GAAG;gBACrC,QAAQ,EAAE,OAAO,CAAC,cAAc;gBAChC,IAAI,EAAE,OAAO,CAAC,GAAG;aACpB,CAAA;QACL,CAAC;KACJ,CAAC,CAAA;IAEF,MAAM,EAAE,GAAG,IAAI,qDAAyB,CAAC;QACrC,MAAM,EAAE,wBAAa;QACrB,SAAS,EAAE,KAAK;QAChB,6BAA6B,EAAE,IAAI;QACnC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAC9B,QAAQ,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;gBACrC,KAAK,MAAM;oBAAG,OAAO;wBACjB,IAAI,EAAE,2BAA2B,OAAO,CAAC,GAAG,GAAG;wBAC/C,QAAQ,EAAE,OAAO,CAAC,cAAc;wBAChC,IAAI,EAAE,OAAO,CAAC,GAAG;qBACpB,CAAA;oBACG,MAAM;gBACV,KAAK,MAAM;oBACP,OAAO;wBACH,IAAI,EAAE,2BAA2B,OAAO,CAAC,GAAG,GAAG;wBAC/C,QAAQ,EAAE,OAAO,CAAC,cAAc;wBAChC,IAAI,EAAE,OAAO,CAAC,GAAG;qBACpB,CAAA;oBACD,MAAM;YACV,CAAC;YACD,OAAO;gBACH,IAAI,EAAE,iCAAiC,OAAO,CAAC,GAAG,GAAG;gBACrD,QAAQ,EAAE,OAAO,CAAC,cAAc;gBAChC,IAAI,EAAE,OAAO,CAAC,GAAG;aACpB,CAAA;QACL,CAAC;KACJ,CAAC,CAAA;IAEF,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC;gBACjC,MAAM,EAAC,kBAAkB,CAAC,EAAE;aAC/B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9E,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC;gBACjC,MAAM,EAAC,kBAAkB,CAAC,EAAE;aAC/B,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAE9E,MAAM,IAAA,gBAAK,EAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/testing/app.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stsappframework",
3
- "version": "3.1.118",
3
+ "version": "3.1.120",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "./types/index.d.ts",
package/runtest2.sh CHANGED
@@ -6,7 +6,7 @@ STSENVFILE=$STS_PROJ_ROOT/stsglobalresources/.env \
6
6
  REST01_PORT=3003 \
7
7
  REST01_HOST_PORT=3003 \
8
8
  REST01_ENDPOINT="https://stscore.stsmda.org" \
9
- MAX_CPU=2 \
9
+ MAX_CPU=4 \
10
10
  AS_ENDPOINT=https://stscore.stsmda.org \
11
11
  AS_HOST_PORT=3002 \
12
12
  AS_PORT=3002 \
@@ -268,6 +268,7 @@ export interface IIPCMessageProcessorIPCPayload {
268
268
  header: string
269
269
  messageId: string
270
270
  senderId: string
271
+ senderRole: string
271
272
  requestPayload: JSONObject
272
273
  responsePayload: JSONObject
273
274
  pid: string
@@ -0,0 +1,181 @@
1
+ /* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF */ // --> OFF
2
+ import { TinyEmitter } from "tiny-emitter";
3
+ import cluster, { Worker } from 'node:cluster'
4
+ import { ISTSLogger, JSONObject, defaultLogger } from '@nsshunt/stsutils'
5
+
6
+ import { IIPCMessageProcessorIPCPayload } from './commonTypes'
7
+
8
+ import { IPCMessageManager, IPCMessageManagerOptions } from './ipcMessageManager'
9
+
10
+ export interface IPCMessageHandlerOptions {
11
+ logger: ISTSLogger
12
+ requestResponseMessageTimeout: number
13
+ namespace: string
14
+ //processPayload?: (payload: IIPCMessageProcessorIPCPayload, options: any) => Promise<JSONObject>
15
+ }
16
+
17
+ export class IPCMessageHandler extends TinyEmitter {
18
+ #ipcMessageManager: IPCMessageManager | null = null;
19
+ #options: IPCMessageHandlerOptions;
20
+ #worker: Worker | null = null;
21
+ #events: JSONObject = { };
22
+
23
+ constructor(options: IPCMessageHandlerOptions) {
24
+ super();
25
+ this.#options = options;
26
+ if (cluster.isPrimary) {
27
+ this.SetupPrimary();
28
+ } else {
29
+ this.SetupWorker();
30
+ }
31
+ }
32
+
33
+ get __events() {
34
+ return this.#events;
35
+ }
36
+
37
+ SetupPrimary = () => {
38
+ const ipcMessageManagerOptions: IPCMessageManagerOptions = {
39
+ logger: defaultLogger,
40
+ requestResponseMessageTimeout: 2000,
41
+ namespace: this.#options.namespace,
42
+ role: 'SERVER',
43
+ messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {
44
+ (options.worker as any).send(payload);
45
+ },
46
+ ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {
47
+ return this.#processPayload(payload, options);
48
+ },
49
+ messageReceiverStart: (options: any) => {
50
+ // Receive a message to process from a worker
51
+ const worker = (options.worker as Worker);
52
+ worker.on('message', (payload) => this.#ipcMessageManager?.ProcessMessage(payload, { worker }));
53
+ },
54
+ messageReceiverStop: (options: any) => {
55
+ const worker = (options.worker as Worker);
56
+ worker.off('message', (payload) => this.#ipcMessageManager?.ProcessMessage(payload, { worker }));
57
+ }
58
+ }
59
+ this.#ipcMessageManager = new IPCMessageManager(ipcMessageManagerOptions);
60
+ }
61
+
62
+ SetupWorker = () => {
63
+ const ipcMessageManagerOptions: IPCMessageManagerOptions = {
64
+ logger: defaultLogger,
65
+ requestResponseMessageTimeout: this.#options.requestResponseMessageTimeout,
66
+ namespace: this.#options.namespace,
67
+ role: 'CLIENT',
68
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
69
+ messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {
70
+ // Options not required for sending payloads to the master process
71
+ (process as any).send(payload);
72
+ },
73
+ ProcessRequestMessage: async (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {
74
+ return this.#processPayload(payload, options);
75
+ },
76
+ messageReceiverStart: (options: any) => {
77
+ // Receive a message response back from the primary thread
78
+ process.on('message', (payload) => this.#ipcMessageManager?.ProcessMessage(payload, options));
79
+ },
80
+ messageReceiverStop: (options: any) => {
81
+ process.off('message', (payload) => this.#ipcMessageManager?.ProcessMessage(payload, options));
82
+ }
83
+ }
84
+ this.#ipcMessageManager = new IPCMessageManager(ipcMessageManagerOptions);
85
+ }
86
+
87
+ SendMessage = async (payload: JSONObject): Promise<JSONObject> => {
88
+ if (this.#ipcMessageManager) {
89
+ if (this.#worker) {
90
+ return this.#ipcMessageManager?.SendMessage(payload, { worker: this.#worker });
91
+ } else {
92
+ return this.#ipcMessageManager?.SendMessage(payload, { });
93
+ }
94
+ } else {
95
+ // Error state - no #ipcMessageManager set
96
+ return { };
97
+ }
98
+ }
99
+
100
+ #processPayload = (payload: IIPCMessageProcessorIPCPayload, options: any): Promise<JSONObject> => {
101
+ // check the event name from the collection and invoke that function
102
+ return new Promise<JSONObject>((resolve, reject) => {
103
+ if (payload.messageType.localeCompare('REQUEST') === 0) {
104
+ if (payload.requestPayload['__eventName']) {
105
+ const eventName = payload.requestPayload['__eventName'];
106
+ if (this.#events[eventName]) {
107
+ try {
108
+ //const retVal = this.#events[eventName].callback(payload.requestPayload.args, payload, options, this.#events[eventName].ctx);
109
+ this.#events[eventName].callback(...payload.requestPayload.args, (responseMessage: any) => {
110
+ resolve(responseMessage);
111
+ });
112
+ } catch (error) {
113
+ reject(error);
114
+ }
115
+ }
116
+ }
117
+ }
118
+ });
119
+ }
120
+
121
+ // p.on('fromworker', (arg1: number, arg2: string, callback: any) => {
122
+ override on(event: string, callback: any, ctx?: any): this {
123
+ if (this.#events[event]) {
124
+ // Update the event with the same name
125
+ delete this.#events[event];
126
+ }
127
+ const eventObject = {
128
+ event,
129
+ callback,
130
+ ctx
131
+ }
132
+ this.#events[eventObject.event] = eventObject;
133
+ return this;
134
+ //return super.on(event, callback, ctx);
135
+ }
136
+
137
+ override off(event: string, callback?: any): this {
138
+ if (this.#events[event]) {
139
+ delete this.#events[event];
140
+ }
141
+ return this;
142
+ //return super.off(event, callback);
143
+ }
144
+
145
+ Start = (worker?: Worker) => {
146
+ if (worker) {
147
+ this.#ipcMessageManager?.Start({ worker });
148
+ this.#worker = worker;
149
+ } else {
150
+ this.#ipcMessageManager?.Start({ });
151
+ }
152
+ }
153
+
154
+ Stop = () => {
155
+ if (this.#worker) {
156
+ this.#ipcMessageManager?.Stop({ worker: this.#worker });
157
+ this.#worker = null;
158
+ } else {
159
+ this.#ipcMessageManager?.Stop({ });
160
+ }
161
+ }
162
+
163
+ get worker(): Worker | null {
164
+ return this.#worker;
165
+ }
166
+
167
+ override emit(event: string, ...args: any[]): this {
168
+
169
+ const sendMessage = async () => {
170
+ const retVal = await this.SendMessage({
171
+ __eventName: event,
172
+ args: args.slice(0, args.length-1)
173
+ });
174
+ // Invoke the response callback
175
+ args[args.length-1](retVal);
176
+ };
177
+ sendMessage();
178
+ return this;
179
+ //return super.emit(event, ...args);
180
+ }
181
+ }
@@ -11,6 +11,7 @@ export interface IPCMessageManagerOptions {
11
11
  logger: ISTSLogger
12
12
  requestResponseMessageTimeout: number
13
13
  namespace: string
14
+ role: 'SERVER' | 'CLIENT'
14
15
  messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => void
15
16
  ProcessRequestMessage: (payload: IIPCMessageProcessorIPCPayload, options: any) => Promise<JSONObject>
16
17
  ProcessResponseMessage?: (reesponses: Record<string, IIPCMessageProcessorIPCPayload>, options: any) => Promise<boolean>
@@ -48,7 +49,7 @@ export class IPCMessageManager
48
49
  // Override in subclass if required
49
50
  }
50
51
 
51
- SendMessage = (payload: JSONObject, options: any): Promise<JSONObject> => {
52
+ SendMessage = (payload: JSONObject, options?: any): Promise<JSONObject> => {
52
53
  return new Promise((resolve, reject) => {
53
54
  this.#SendMessage(payload, options,
54
55
  (payload: IIPCMessageProcessorIPCPayload) => {
@@ -69,6 +70,7 @@ export class IPCMessageManager
69
70
  header: this.#messageHeader,
70
71
  messageId,
71
72
  senderId: this.#id,
73
+ senderRole: this.#options.role,
72
74
  requestPayload: payload,
73
75
  responsePayload: { },
74
76
  pid: process.pid.toString(),
@@ -77,6 +79,7 @@ export class IPCMessageManager
77
79
  const messageRecord = {
78
80
  messageId,
79
81
  senderId: this.#id,
82
+ senderRole: this.#options.role,
80
83
  requestPayload,
81
84
  responses: { }, // record
82
85
  startTime: performance.now(),
@@ -105,26 +108,33 @@ export class IPCMessageManager
105
108
  let completed = true; // Defaults to true
106
109
  if (this.#options.ProcessResponseMessage) {
107
110
  completed = await this.#options.ProcessResponseMessage(inFlightMessageRecord.responses, options);
108
- }
109
- if (completed) {
111
+ if (completed) {
112
+ inFlightMessageRecord.endTime = performance.now();
113
+ clearTimeout(inFlightMessageRecord.timeout as NodeJS.Timer);
114
+ inFlightMessageRecord.callBack({
115
+ responsePayload: Object.values(inFlightMessageRecord.responses).map(r => r.responsePayload)
116
+ } as any, options) //
117
+ delete this.#inflightMessages[message.messageId];
118
+ }
119
+ } else if (completed) {
110
120
  inFlightMessageRecord.endTime = performance.now();
111
121
  clearTimeout(inFlightMessageRecord.timeout as NodeJS.Timer);
112
- //this.#LogDebugMessage(chalk.green(`received: [${JSON.stringify(message)}]`));
113
- inFlightMessageRecord.callBack(message, options)
122
+ inFlightMessageRecord.callBack(message, options) // inFlightMessageRecord.responses
123
+ //@@inFlightMessageRecord.callBack(Object.values(inFlightMessageRecord.responses), options) //
114
124
  delete this.#inflightMessages[message.messageId];
115
125
  }
116
126
  } else {
117
- throw new Error(`Could not find Request/Response message with id: [${message.messageId}]`);
127
+ //throw new Error(`Could not find Request/Response message with id: [${message.messageId}]`); //@@
118
128
  }
119
129
  }
120
130
  }
121
131
 
122
- Start = (options: any) => {
132
+ Start = (options?: any) => {
123
133
  this.#messageHeader = `__STS__${this.#options.namespace}__${uuidv4()}`;
124
134
  this.#options.messageReceiverStart(options);
125
135
  }
126
136
 
127
- Stop = (options: any) => {
137
+ Stop = (options?: any) => {
128
138
  // Kill in-flight messages
129
139
  this.#options.messageReceiverStop(options);
130
140
 
@@ -139,7 +149,7 @@ export class IPCMessageManager
139
149
  // Process a message recieved from a worker
140
150
  ProcessMessage = async (msg: any, options: any) => {
141
151
  if (msg.header) {
142
- const checkName = `__STS__${this.#options.namespace}__`;
152
+ const checkName = `__STS__${this.#options.namespace}__`; //@@ this is a broadcast becuase the unique uuid is not part of the header test
143
153
  if ((msg.header as string).includes(checkName)) {
144
154
  const message = (msg as IIPCMessageProcessorIPCPayload);
145
155
  if (msg.messageType.localeCompare('REQUEST') === 0) {
@@ -23,6 +23,7 @@ export class IPCMessageProcessorPrimary
23
23
  logger: defaultLogger,
24
24
  requestResponseMessageTimeout: 2000,
25
25
  namespace: classOptions.namespace,
26
+ role: 'SERVER',
26
27
  messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {
27
28
  (options.worker as any).send(payload);
28
29
  },
@@ -20,6 +20,7 @@ export class IPCMessageProcessorWorker {
20
20
  logger: defaultLogger,
21
21
  requestResponseMessageTimeout: classOptions.requestResponseMessageTimeout,
22
22
  namespace: classOptions.namespace,
23
+ role: 'CLIENT',
23
24
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars
24
25
  messageSender: (payload: IIPCMessageProcessorIPCPayload, options: any) => {
25
26
  // Options not required for sending payloads to the master process
@@ -0,0 +1,155 @@
1
+ /* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF
2
+ import { beforeAll, afterAll, test, describe, expect } from 'vitest';
3
+
4
+ import { RedisMessageHandler } from './redisMessageHandler'
5
+
6
+ import { JSONObject, Sleep, defaultLogger } from '@nsshunt/stsutils';
7
+
8
+ import chalk from 'chalk';
9
+
10
+ import { v4 as uuidv4 } from 'uuid';
11
+
12
+ import { GenericContainer } from "testcontainers";
13
+
14
+ describe("Redis Message Handler Test", () =>
15
+ {
16
+ let ioRedisContainer: any;
17
+ let ioRedisMessageProcessorUrl = '';
18
+
19
+ beforeAll(async () => {
20
+ // --- [ioRedis ] -------------------------------------------------------------------------
21
+
22
+ ioRedisContainer = await new GenericContainer("redis")
23
+ .withExposedPorts(6379)
24
+ .start();
25
+ ioRedisMessageProcessorUrl = `redis://${ioRedisContainer.getHost()}:${ioRedisContainer.getMappedPort(6379)}`;
26
+ });
27
+
28
+ afterAll(async () => {
29
+ if (ioRedisContainer) {
30
+ await ioRedisContainer.stop();
31
+ }
32
+ }, 5000);
33
+
34
+ class Server {
35
+ #r1: RedisMessageHandler;
36
+
37
+ constructor() {
38
+ this.#r1 = new RedisMessageHandler({
39
+ logger: defaultLogger,
40
+ role: 'SERVER',
41
+ redisUrl: ioRedisMessageProcessorUrl, // goptions.imRedisMessageProcessorUrl,
42
+ namespace: 'redistestingstsframework'
43
+ });
44
+ this.#r1.Start();
45
+
46
+ this.#r1.on('fromworkerredis', (arg1: string, arg2: number, arg3: string, callback: any) => {
47
+ console.log(chalk.magenta(`${process.pid}: fromworkerredis.ON: [${arg1} ${arg2} ${arg3}]`));
48
+ //callback(null);
49
+ callback({status: `response message from event = fromworkerredis with args ${arg1} ${arg2} ${arg3}`})
50
+ });
51
+ }
52
+
53
+ Start = async (expectedResponses: number, iterations: number, delay: number) => {
54
+ for (let i=0; i < iterations; i++) {
55
+ /*
56
+ Object.keys(p).forEach(async (pKey) => {
57
+ const emitobj = { i: i, a: 'a', b: 'b', worker: pKey };
58
+ console.log(chalk.green(`${process.pid}: emit event to worker: [${pKey}] fromprimary: [${JSON.stringify(emitobj)}`));
59
+ p[pKey].emit('fromprimary', emitobj, (response: any) => {
60
+ console.log(chalk.green(`${process.pid}: ${JSON.stringify(response)}`));
61
+ });
62
+ });
63
+ */
64
+
65
+
66
+ const emitobj = { i: i, a: 'a', b: 'b' };
67
+ console.log(chalk.cyan(`${process.pid}: emit event fromprimaryredis fromprimary: [${JSON.stringify(emitobj)}`));
68
+ this.#r1.emit('fromprimaryredis', emitobj, (response: any) => {
69
+ console.log(chalk.cyan(`${process.pid}: Response(fromprimaryredis): Count: [${response.length}] [${JSON.stringify(response)}]`));
70
+ expect(response.length).toEqual(expectedResponses);
71
+ });
72
+
73
+ await Sleep(delay);
74
+ }
75
+ }
76
+
77
+ Stop = () => {
78
+ this.#r1.Stop();
79
+ }
80
+ }
81
+
82
+ class Client {
83
+ #r1: RedisMessageHandler;
84
+
85
+ constructor() {
86
+ this.#r1 = new RedisMessageHandler({
87
+ logger: defaultLogger,
88
+ role: 'CLIENT',
89
+ redisUrl: ioRedisMessageProcessorUrl, // goptions.imRedisMessageProcessorUrl,
90
+ namespace: 'redistestingstsframework'
91
+ });
92
+ this.#r1.Start();
93
+
94
+ this.#r1.on('fromprimaryredis', (arg1: JSONObject, callback: any) => {
95
+ //callback();
96
+ console.log(chalk.yellow(`${process.pid}: fromprimaryredis.ON: [${JSON.stringify(arg1)}]`));
97
+ callback({status: `PID: [${process.pid}]: response message from event = fromprimaryredis with args ${JSON.stringify(arg1)}`})
98
+ });
99
+ }
100
+
101
+ Start = async (iterations: number, delay: number) => {
102
+ for (let i=0; i < iterations; i++) {
103
+ const id = uuidv4();
104
+ /*
105
+ console.log(chalk.yellow(`${process.pid}: emit event fromworker: [${id} ${i} Hello]`));
106
+ w1.emit('fromworker', id, i, 'Hello', (response: any) => {
107
+ console.log(chalk.yellow(`${process.pid}: ${JSON.stringify(response)}`));
108
+ });
109
+ */
110
+
111
+ console.log(chalk.green(`${process.pid}: emit event fromworkerredis: [${id} ${i} Hello]`));
112
+ this.#r1.emit('fromworkerredis', id, i, 'Hello', (response: any) => {
113
+ console.log(chalk.green(`${process.pid}: Response(fromworkerredis): [${JSON.stringify(response)}]`));
114
+ });
115
+ await Sleep(delay);
116
+ }
117
+ }
118
+
119
+ Stop = () => {
120
+ this.#r1.Stop();
121
+ }
122
+ }
123
+
124
+
125
+ test('Test 1', async () =>
126
+ {
127
+ const clientCount = 20;
128
+ const iterations = 5;
129
+ const delay = 100;
130
+
131
+ expect.assertions(iterations);
132
+
133
+ // Setup new server and clients
134
+ const server = new Server();
135
+ const clients: Client[] = [ ];
136
+ for (let i=0; i < clientCount; i++) {
137
+ clients.push(new Client());
138
+ }
139
+
140
+ // Need this delay to ensure the pings are all sent and received between the clients and the server
141
+ await Sleep(2000);
142
+
143
+ // Start sending messages
144
+ server.Start(clientCount, iterations, delay);
145
+ clients.forEach(c => c.Start(iterations, delay));
146
+
147
+ // Allow time to process
148
+ await Sleep(3000);
149
+
150
+ // All done, stop.
151
+ clients.forEach(c => c.Stop());
152
+ server.Stop();
153
+ }, 30000);
154
+ });
155
+