@nsshunt/stsappframework 3.1.234 → 3.1.236

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 (51) hide show
  1. package/.github/workflows/npm-publish.yml +18 -29
  2. package/build.sh +12 -6
  3. package/eslint.config.mjs +7 -0
  4. package/package.json +11 -14
  5. package/.eslintrc.json +0 -27
  6. package/babel.config.json +0 -6
  7. package/dist/commonTypes.js +0 -69
  8. package/dist/commonTypes.js.map +0 -1
  9. package/dist/controller/stscontrollerbase.js +0 -14
  10. package/dist/controller/stscontrollerbase.js.map +0 -1
  11. package/dist/controller/stslatencycontroller.js +0 -28
  12. package/dist/controller/stslatencycontroller.js.map +0 -1
  13. package/dist/index.js.map +0 -1
  14. package/dist/logger/stsTransportLoggerWinston.js +0 -22
  15. package/dist/logger/stsTransportLoggerWinston.js.map +0 -1
  16. package/dist/logger/stsTransportWinston.js +0 -43
  17. package/dist/logger/stsTransportWinston.js.map +0 -1
  18. package/dist/middleware/serverNetworkMiddleware.js +0 -199
  19. package/dist/middleware/serverNetworkMiddleware.js.map +0 -1
  20. package/dist/network.js +0 -38
  21. package/dist/network.js.map +0 -1
  22. package/dist/process/masterprocessbase.js +0 -558
  23. package/dist/process/masterprocessbase.js.map +0 -1
  24. package/dist/process/processbase.js +0 -411
  25. package/dist/process/processbase.js.map +0 -1
  26. package/dist/process/serverprocessbase.js +0 -401
  27. package/dist/process/serverprocessbase.js.map +0 -1
  28. package/dist/process/singleprocessbase.js +0 -55
  29. package/dist/process/singleprocessbase.js.map +0 -1
  30. package/dist/process/workerprocessbase.js +0 -210
  31. package/dist/process/workerprocessbase.js.map +0 -1
  32. package/dist/publishertransports/publishTransportUtils.js +0 -47
  33. package/dist/publishertransports/publishTransportUtils.js.map +0 -1
  34. package/dist/route/stslatencyroute.js +0 -15
  35. package/dist/route/stslatencyroute.js.map +0 -1
  36. package/dist/route/stsrouterbase.js +0 -21
  37. package/dist/route/stsrouterbase.js.map +0 -1
  38. package/dist/stsexpressserver.js +0 -115
  39. package/dist/stsexpressserver.js.map +0 -1
  40. package/dist/validation/errors.js +0 -10
  41. package/dist/validation/errors.js.map +0 -1
  42. package/dist/vitesttesting/appConfig.js +0 -93
  43. package/dist/vitesttesting/appConfig.js.map +0 -1
  44. package/dist/vitesttesting/appSingleWSS.js +0 -122
  45. package/dist/vitesttesting/appSingleWSS.js.map +0 -1
  46. package/dist/vitesttesting/server.js +0 -15
  47. package/dist/vitesttesting/server.js.map +0 -1
  48. package/dist/vitesttesting/singleservertest.test.js +0 -286
  49. package/dist/vitesttesting/singleservertest.test.js.map +0 -1
  50. package/dist/vitesttesting/wsevents.js +0 -3
  51. package/dist/vitesttesting/wsevents.js.map +0 -1
package/dist/network.js DELETED
@@ -1,38 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.GetNetworkInterfaces = GetNetworkInterfaces;
7
- exports.GetFirstNetworkInterface = GetFirstNetworkInterface;
8
- const os_1 = __importDefault(require("os"));
9
- function GetNetworkInterfaces() {
10
- const nets = os_1.default.networkInterfaces();
11
- const results = {};
12
- for (const name of Object.keys(nets)) {
13
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
- for (const net of nets[name]) {
15
- // Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses
16
- if (net.family === 'IPv4' && !net.internal) {
17
- if (!results[name]) {
18
- results[name] = [];
19
- }
20
- results[name].push(net.address);
21
- }
22
- }
23
- }
24
- return results;
25
- }
26
- function GetFirstNetworkInterface() {
27
- const nics = GetNetworkInterfaces();
28
- let hostaddr = null;
29
- for (const nic in nics) {
30
- const val = nics[nic];
31
- if (val.length > 0) {
32
- hostaddr = val[0];
33
- break;
34
- }
35
- }
36
- return hostaddr;
37
- }
38
- //# sourceMappingURL=network.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":";;;;;AAIA,oDAgBC;AAED,4DAaC;AAnCD,4CAAmB;AAInB,SAAgB,oBAAoB;IAChC,MAAM,IAAI,GAAG,YAAE,CAAC,iBAAiB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAsB,EAAG,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,8DAA8D;QAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAQ,EAAE,CAAC;YAClC,6DAA6D;YAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAgB,wBAAwB;IACpC,MAAM,IAAI,GAAsB,oBAAoB,EAAE,CAAC;IACvD,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EACtB,CAAC;QACG,MAAM,GAAG,GAAa,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAClB,CAAC;YACG,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM;QACV,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC"}
@@ -1,558 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.MasterProcessBase = void 0;
7
- /* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
8
- const node_fs_1 = __importDefault(require("node:fs"));
9
- const systeminformation_1 = __importDefault(require("systeminformation")); // https://systeminformation.io/
10
- const axios_1 = __importDefault(require("axios"));
11
- const node_cluster_1 = __importDefault(require("node:cluster"));
12
- const chalk_1 = __importDefault(require("chalk"));
13
- const express_1 = __importDefault(require("express"));
14
- const cluster_adapter_1 = require("@socket.io/cluster-adapter");
15
- const node_https_1 = require("node:https");
16
- const node_http_1 = require("node:http");
17
- const prom_client_1 = require("prom-client");
18
- const stsconfig_1 = require("@nsshunt/stsconfig");
19
- const stsobservability_1 = require("@nsshunt/stsobservability");
20
- const processbase_1 = require("./processbase");
21
- const commonTypes_1 = require("./../commonTypes");
22
- const stsTransportLoggerWinston_1 = require("./../logger/stsTransportLoggerWinston");
23
- const stsutils_1 = require("@nsshunt/stsutils");
24
- //import { GetFirstNetworkInterface } from './network';
25
- class MasterProcessBase extends processbase_1.ProcessBase {
26
- //static WORKER_MESSAGE_EVENT = 'sts_worker_message_event';
27
- #masterProcessExitTime = stsconfig_1.goptions.masterProcessExitTime;
28
- #childProcessExitTime = stsconfig_1.goptions.childProcessExitTime;
29
- #siValueObject = {
30
- currentLoad: 'currentLoad'
31
- };
32
- #httpServer = null; // Prometheus cluster server. See https://github.com/siimon/prom-client/blob/master/example/cluster.js
33
- #metricsServer = null;
34
- #aggregatorRegistry = null;
35
- #checkLatency = null;
36
- #killWorkers = {};
37
- #workers = 1; // Start at 1 becuase of main thread
38
- #shuttingDown = false;
39
- #agentManager;
40
- constructor(options) {
41
- super(options);
42
- this.#agentManager = new stsconfig_1.AgentManager({
43
- agentOptions: {
44
- keepAlive: false, // Use basic defaults. This agent will not use keep-alive.
45
- maxFreeSockets: stsconfig_1.goptions.maxFreeSockets,
46
- maxSockets: stsconfig_1.goptions.maxSockets,
47
- maxTotalSockets: stsconfig_1.goptions.maxTotalSockets,
48
- timeout: stsconfig_1.goptions.timeout,
49
- rejectUnauthorized: stsconfig_1.goptions.isProduction // Allows self-signed certificates if non-production
50
- }
51
- });
52
- }
53
- #LogErrorMessage(message) {
54
- this.options.logger.error(message);
55
- }
56
- #LogDebugMessage(message) {
57
- this.options.logger.debug(message);
58
- }
59
- CollectAdditionalTelemetry() {
60
- systeminformation_1.default.get(this.#siValueObject).then(data => {
61
- this.UpdateInstrument(stsobservability_1.Gauge.CPU_SYSTEM_LOAD_GAUGE, {
62
- val: data.currentLoad.currentLoad
63
- });
64
- });
65
- }
66
- GetAdditionalInstruments() {
67
- return [
68
- [stsobservability_1.Gauge.CPU_SYSTEM_LOAD_GAUGE, stsobservability_1.GaugeTypes.INSTRUMENT_GAUGE, {
69
- interval: stsconfig_1.goptions.instrumentationObservationInterval,
70
- sampleSize: stsconfig_1.goptions.instrumentationTimeWindow
71
- }]
72
- ];
73
- }
74
- /**
75
- * Note: msg removed from signature but will be passed at run-time.
76
- * @param {*} msg
77
- */
78
- WorkerMessageEvent(workerId, msg) {
79
- return null;
80
- }
81
- #WorkerMessageEvent(workerId, msg) {
82
- if (msg.command) {
83
- this.WorkerMessageEvent(workerId, msg);
84
- }
85
- }
86
- #InitCluster = () => {
87
- node_cluster_1.default.on('listening', (worker, address) => {
88
- this.emit('clusterListening', worker, address);
89
- let allListening = true;
90
- for (const worker of Object.values(node_cluster_1.default.workers)) {
91
- if (worker?.isConnected) {
92
- allListening = false;
93
- break;
94
- }
95
- }
96
- if (allListening) {
97
- this.LogInfoMessage(`Service instance started.`);
98
- this.emit('allListening');
99
- }
100
- });
101
- };
102
- // https://github.com/siimon/prom-client/blob/master/example/cluster.js
103
- #SetupPrometheusForMaster = () => {
104
- this.#metricsServer = (0, express_1.default)();
105
- this.#aggregatorRegistry = new prom_client_1.AggregatorRegistry();
106
- switch (stsconfig_1.goptions.STSServerType) {
107
- case 'EXPRESS_TLS':
108
- {
109
- const options = {
110
- key: node_fs_1.default.readFileSync(this.options.httpsServerKeyPath),
111
- cert: node_fs_1.default.readFileSync(this.options.httpsServerCertificatePath)
112
- };
113
- this.#httpServer = (0, node_https_1.createServer)(options, this.#metricsServer);
114
- }
115
- break;
116
- case 'EXPRESS': {
117
- this.#httpServer = (0, node_http_1.createServer)(this.#metricsServer);
118
- }
119
- }
120
- //this.#httpServer.maxConnections = 50;
121
- this.#metricsServer.get('/cluster_metrics', async (req, res) => {
122
- try {
123
- const metrics = await this.#aggregatorRegistry.clusterMetrics();
124
- res.set('Content-Type', this.#aggregatorRegistry.contentType);
125
- res.send(metrics);
126
- }
127
- catch (ex) {
128
- res.statusCode = 500;
129
- res.send(ex.message);
130
- }
131
- });
132
- //@@@ options wrong
133
- try {
134
- // https://stackoverflow.com/questions/21342828/node-express-unix-domain-socket-permissions
135
- //@@httpServer.listen('/tmp/stsrest01.sock').on('listening', () =>
136
- //@@httpServer.listen('/var/run/sts/stsrest01.sock').on('listening', () =>
137
- //@@httpServer.listen('/var/lib/sts/stsrest01.sock').on('listening', () =>
138
- this.#httpServer.listen(this.options.prometheusClusterPort, () => {
139
- //@@chmodSync(this.options.port, 511);
140
- }).on('listening', () => {
141
- this.emit('prometheusScrapesListening', `${this.options.endpoint}:${this.options.prometheusClusterPort}/metrics`, this.options.endpoint, this.options.prometheusClusterPort);
142
- this.LogInfoMessage(`Prometheus scrapes ready and live on ${this.options.endpoint}:${this.options.prometheusClusterPort}/metrics`);
143
- });
144
- }
145
- catch (error) {
146
- this.#LogErrorMessage(error);
147
- throw error;
148
- }
149
- };
150
- #CheckLatency = async () => {
151
- const start = process.hrtime();
152
- await this.#GetLatency();
153
- this.#LatencyRequestCompleted(start);
154
- };
155
- #GetLatency = async () => {
156
- let retVal = null;
157
- // We use port rather than hostport becuase this test going outside the service and comes back in as a regular client
158
- const url = `${this.options.endpoint}:${this.options.port}${this.options.apiRoot}/latency`;
159
- try {
160
- retVal = await (0, axios_1.default)(new stsconfig_1.STSAxiosConfig(url, 'get')
161
- .withDefaultHeaders()
162
- .withAgentManager(this.#agentManager).config);
163
- if (retVal.status !== 200) {
164
- this.#LogDebugMessage(chalk_1.default.magenta(`Error (MasterProcessBase:#GetLatency): Invalid response from server: [${retVal.status}]`));
165
- return null;
166
- }
167
- return retVal.data.detail;
168
- }
169
- catch (error) {
170
- this.#LogDebugMessage(chalk_1.default.red(`Error (MasterProcessBase:#GetLatency:catch): [${error}]`));
171
- this.#LogDebugMessage(chalk_1.default.red(` url: [${url}]`));
172
- if (error.response && error.response.data) {
173
- this.#LogDebugMessage(chalk_1.default.red(` Details: [${JSON.stringify(error.response.data)}]`));
174
- }
175
- }
176
- };
177
- #LatencyRequestCompleted = (start) => {
178
- // Update request duration histo data
179
- let timeInMs = 0;
180
- const end = process.hrtime(start);
181
- timeInMs = (end[0] * 1000000000 + end[1]) / 1000000;
182
- timeInMs = parseFloat(timeInMs.toFixed(4));
183
- this.UpdateInstrument(stsobservability_1.Gauge.LATENCY_HISTOGRAM_GAUGE, {
184
- val: timeInMs
185
- });
186
- this.UpdateInstrument(stsobservability_1.Gauge.LATENCY_GAUGE, {
187
- val: timeInMs
188
- });
189
- };
190
- SetupServer = async () => {
191
- this.SetupInstrumentation();
192
- setTimeout(() => {
193
- this.SetupServerEx();
194
- }, 100);
195
- };
196
- #_KillWorker = (id, signal, killProcess) => {
197
- try {
198
- if (node_cluster_1.default.workers && node_cluster_1.default.workers[id]) {
199
- const worker = node_cluster_1.default.workers[id];
200
- if (worker.process) {
201
- this.LogInfoMessage(chalk_1.default.grey(`Sending terminate message `) + chalk_1.default.yellow(`(initiated by ${signal})`) + chalk_1.default.grey(` for worker PID: ${worker.process.pid}`));
202
- const command = (killProcess ? 'TerminateAndKill' : 'Terminate');
203
- try {
204
- worker.send({ command });
205
- //worker.process.send( { command } );
206
- }
207
- catch (error) {
208
- this.LogInfoMessage(chalk_1.default.red(`MasterProcessBase:#_KillWorker() (1): id: [${id}], signal: [${signal}], killProcess: [${killProcess}], error: [${error}]`));
209
- return false;
210
- }
211
- return true;
212
- }
213
- else {
214
- this.LogInfoMessage(chalk_1.default.red(`MasterProcessBase:#_KillWorker(): Could not kill worker with id: [${id}]. The process does not exists`));
215
- return false;
216
- }
217
- }
218
- else {
219
- this.LogInfoMessage(chalk_1.default.red(`MasterProcessBase:#_KillWorker(): Could not kill worker with id: [${id}]. Worker does not exist within workers collection`));
220
- return false;
221
- }
222
- }
223
- catch (error) {
224
- this.LogInfoMessage(chalk_1.default.red(`MasterProcessBase:#_KillWorker() (2): id: [${id}], signal: [${signal}], killProcess: [${killProcess}], error: [${error}]`));
225
- return false;
226
- }
227
- };
228
- KillWorker = (id, signal = "SIGTERM", options, killProcess, allowKillAll) => {
229
- try {
230
- if (allowKillAll || Object.keys(node_cluster_1.default.workers).length > 1) {
231
- if (id.localeCompare('0') === 0) {
232
- const keys = Object.keys(node_cluster_1.default.workers);
233
- for (let i = keys.length - 1; i > 0; i--) {
234
- // Kill the last one added (assumed node keeps them in order)
235
- id = keys[i];
236
- if (!this.#killWorkers[id]) {
237
- this.#killWorkers[id] = id;
238
- // Allow some time for the worker to be terminated before clean-up of the killWorkers array
239
- setTimeout(() => {
240
- delete this.#killWorkers[id];
241
- }, 2000).unref(); //@@
242
- return this.#_KillWorker(id, signal, killProcess);
243
- }
244
- }
245
- return false;
246
- }
247
- else {
248
- return this.#_KillWorker(id, signal, killProcess);
249
- }
250
- }
251
- else {
252
- this.LogInfoMessage(chalk_1.default.yellow(`MasterProcessBase:KillWorker(): Not allowed to kill the last worker process.`));
253
- return false;
254
- }
255
- }
256
- catch (error) {
257
- this.LogInfoMessage(chalk_1.default.red(`MasterProcessBase:KillWorker(): id: [${id}], signal: [${signal}], killProcess: [${killProcess}], error: [${error}]`));
258
- return false;
259
- }
260
- };
261
- KillWorkers = (signal, keepOne) => {
262
- const logPrefix = `MasterProcessBase:KillWorkers():${process.pid}:`;
263
- try {
264
- this.LogInfoMessage(`${logPrefix} Killing Workers.`);
265
- const keepOneAlive = (keepOne ? keepOne : false);
266
- let skippedFirst = false;
267
- const sortedIdList = [];
268
- for (const id in node_cluster_1.default.workers) {
269
- sortedIdList.push(parseInt(id));
270
- }
271
- sortedIdList.sort().forEach((id) => {
272
- if (keepOneAlive && !skippedFirst) {
273
- skippedFirst = true;
274
- }
275
- else {
276
- this.KillWorker(id.toString(), signal, null, false, true);
277
- }
278
- });
279
- }
280
- catch (error) {
281
- this.LogInfoMessage(chalk_1.default.red(`${logPrefix} signal: [${signal}], keepOne: [${keepOne}], error: [${error}]`));
282
- }
283
- };
284
- #UpdateWorkersInstrument = () => {
285
- setTimeout(() => {
286
- this.UpdateInstrument(stsobservability_1.Gauge.CORE_COUNT_GAUGE, {
287
- val: this.#workers
288
- });
289
- }, 2000);
290
- };
291
- IncWorkers = () => {
292
- this.#workers++;
293
- this.#LogDebugMessage(` Inc Workers. Total thread count: [${this.#workers}]`);
294
- this.#UpdateWorkersInstrument();
295
- };
296
- DecWorkers = () => {
297
- this.#workers--;
298
- this.#LogDebugMessage(` Dec Workers. Total thread count: [${this.#workers}]`);
299
- this.#UpdateWorkersInstrument();
300
- };
301
- AddWorker = (options) => {
302
- const workerId = this.#SpawnWorker(options);
303
- this.#LogDebugMessage(chalk_1.default.yellow(` Spawned worker with id: [${workerId}]`));
304
- if (options) {
305
- this.#LogDebugMessage(chalk_1.default.yellow(` Options: [${JSON.stringify(options)}]`));
306
- }
307
- return workerId;
308
- };
309
- async ProcessIPCCommand(iPCMessagePayload) {
310
- return this.#processIPCCommand(iPCMessagePayload);
311
- }
312
- #processIPCCommand = async (iPCMessagePayload) => {
313
- this.#LogDebugMessage(chalk_1.default.yellow(` Processing message command: [${iPCMessagePayload.command}]`));
314
- switch (iPCMessagePayload.command) {
315
- case commonTypes_1.IPCMessageCommand.AddWorker: {
316
- const workerId = this.AddWorker(iPCMessagePayload.requestDetail?.options);
317
- iPCMessagePayload.responseDetail = {
318
- workerId
319
- };
320
- return iPCMessagePayload;
321
- }
322
- case commonTypes_1.IPCMessageCommand.DeleteWorker: {
323
- const workerId = iPCMessagePayload.requestDetail?.workerId;
324
- const workerKilled = this.KillWorker(workerId, "SIGTERM", iPCMessagePayload.requestDetail?.options, true, false);
325
- this.#LogDebugMessage(chalk_1.default.yellow(` Killed worker with id: [${workerId}]`));
326
- iPCMessagePayload.responseDetail = {
327
- workerId,
328
- workerKilled
329
- };
330
- return iPCMessagePayload;
331
- }
332
- case commonTypes_1.IPCMessageCommand.GetConfig: {
333
- const safeOptions = { ...this.options };
334
- delete safeOptions.logger;
335
- delete safeOptions.publisherLogger;
336
- delete safeOptions.expressServerRouteFactory;
337
- //this.#LogDebugMessage(chalk.yellow(` Safe options: [${JSON.stringify(safeOptions)}]`));
338
- iPCMessagePayload.responseDetail = {
339
- safeOptions
340
- };
341
- return iPCMessagePayload;
342
- }
343
- default: {
344
- const errorMessage = `Could not process command: [${iPCMessagePayload.command}].`;
345
- this.#LogDebugMessage(chalk_1.default.red(` ${errorMessage}`));
346
- throw new Error(errorMessage);
347
- }
348
- }
349
- };
350
- #SpawnWorker = (spawnWorkerOptions) => {
351
- const workerEnv = {};
352
- const tempOptions = { ...this.options };
353
- // Remove the assigned loggers (this will need to be re-created in the worker thread)
354
- delete tempOptions.logger;
355
- delete tempOptions.publisherLogger;
356
- workerEnv['STS_GSD_SII'] = JSON.stringify(tempOptions);
357
- if (spawnWorkerOptions) {
358
- workerEnv['STS_GSD_OPTIONS'] = JSON.stringify(spawnWorkerOptions);
359
- }
360
- // https://nodejs.org/api/cluster.html#clustersetupprimarysettings
361
- if (this.options.workerExec) {
362
- node_cluster_1.default.setupPrimary({
363
- exec: this.options.workerExec,
364
- silent: true,
365
- });
366
- }
367
- const worker = node_cluster_1.default.fork(workerEnv);
368
- this.IncWorkers();
369
- worker.on('exit', (code, signal) => {
370
- this.emit('workerExit', code, signal);
371
- if (signal) {
372
- this.LogInfoMessage(`Worker: ${worker.process.pid} was killed by signal: ${signal}`);
373
- }
374
- else if (code !== 0) {
375
- this.LogInfoMessage(`Worker: ${worker.process.pid} exited with error code: ${code}`);
376
- }
377
- else {
378
- this.LogInfoMessage(`Worker: ${worker.process.pid} exited successfully, code: ${code}, signal: ${signal}`);
379
- }
380
- });
381
- worker.on('message', async (payload) => {
382
- this.emit('workerMessage', worker.id, payload);
383
- // Only handle request/response message types here ...
384
- if (payload.requestResponse) {
385
- const iPCMessagePayload = payload;
386
- //this.#LogDebugMessage(chalk.yellow(`Received message with id: [${iPCMessagePayload.id}] from worker: [${worker.process.pid}]. Details: [${JSON.stringify(iPCMessagePayload)}]`));
387
- const response = await this.ProcessIPCCommand(iPCMessagePayload);
388
- //this.#LogDebugMessage(chalk.green(`Sending response message with id: [${iPCMessagePayload.id}] to worker: [${worker.process.pid}]. Details: [${JSON.stringify(response)}]`));
389
- worker.send(response);
390
- }
391
- else {
392
- this.#WorkerMessageEvent(worker.id, payload);
393
- }
394
- });
395
- worker.on('error', (error) => {
396
- this.emit('workerError', error);
397
- const message = chalk_1.default.red(`#SpawnWorker():worker.on('error'): Error: [${error}]`);
398
- this.LogErrorMessage(message);
399
- });
400
- this.emit('workerAdded', worker.id);
401
- return worker.id;
402
- };
403
- MasterStarted() {
404
- const transport = new stsTransportLoggerWinston_1.STSTransportLoggerWinston({
405
- stsApp: this
406
- });
407
- setTimeout(() => {
408
- this.options.logger.add(transport);
409
- }, 0);
410
- }
411
- get shuttingDown() {
412
- return this.#shuttingDown;
413
- }
414
- SetupServerEx = async () => {
415
- this.ProcessStartup();
416
- this.LogInfoMessage(`Service instance starting. Instance Id: [${this.options.serviceInstanceId}]`);
417
- this.LogSystemTelemetry();
418
- // socket.io
419
- // setup connections between the workers
420
- if (this.options.wssServer === true) {
421
- if (this.options.useSocketIoRedisAdaptor) {
422
- this.LogInfoMessage(`Using Redis for socket.io cluster management (master)`);
423
- }
424
- else {
425
- this.LogInfoMessage(`Using nodejs cluster mode for socket.io cluster management`);
426
- (0, cluster_adapter_1.setupPrimary)();
427
- }
428
- }
429
- if (this.options.prometheusSupport === true) {
430
- this.#SetupPrometheusForMaster();
431
- }
432
- const numCPUs = await this.GetNumCPUs();
433
- for (let i = 0; i < numCPUs; i++) {
434
- this.#SpawnWorker();
435
- }
436
- this.#InitCluster();
437
- node_cluster_1.default.on('listening', (worker, address) => {
438
- this.emit('clusterListening', worker, address);
439
- this.LogInfoMessage(`Worker process ${worker.process.pid} is listening at address: ${JSON.stringify(address)}`);
440
- });
441
- //Setting up lifecycle event listeners for worker processes
442
- node_cluster_1.default.on('online', worker => {
443
- this.emit('clusterOnline', worker);
444
- this.LogInfoMessage(`Worker process ${worker.process.pid} is online`);
445
- });
446
- node_cluster_1.default.on('exit', (worker, code, signal) => {
447
- this.emit('clusterExit', worker, code, signal);
448
- if ((code !== null && code === 0) || (signal === 'SIGINT')) {
449
- this.LogInfoMessage(chalk_1.default.green(`Process ${worker.process.pid} terminated gracefully with code: ${code}, signal: ${signal}`));
450
- this.DecWorkers();
451
- }
452
- else if ((code !== null && code === 15) || (signal === 'SIGTERM')) {
453
- this.DecWorkers();
454
- this.LogInfoMessage(chalk_1.default.red(`Process ${worker.process.pid} terminated with code: ${code}, signal: ${signal}`));
455
- }
456
- else {
457
- this.DecWorkers();
458
- this.LogInfoMessage(chalk_1.default.red(`worker ${worker.process.pid} died`));
459
- this.LogInfoMessage(chalk_1.default.red(`code: ${code}`));
460
- this.LogInfoMessage(chalk_1.default.red(`signal: ${signal}`));
461
- this.LogInfoMessage(chalk_1.default.red('process terminated in an error state'));
462
- if (stsconfig_1.goptions.respawnOnFail === true) {
463
- this.LogInfoMessage(chalk_1.default.magenta(`Attemping to respawn worker`));
464
- this.#SpawnWorker();
465
- }
466
- }
467
- });
468
- const TerminateLatency = () => {
469
- if (this.#checkLatency) {
470
- clearInterval(this.#checkLatency);
471
- this.#checkLatency = null;
472
- }
473
- };
474
- const TerminateHTTPServer = async () => {
475
- if (this.#httpServer !== null) {
476
- const logPrefix = `ServerProcessBase:TerminateHTTPServer():${process.pid}:`;
477
- this.LogInfoMessage(`${logPrefix} Closing httpServer.`);
478
- await this.#httpServer.close();
479
- this.#httpServer = null;
480
- }
481
- };
482
- // Terminate in order;
483
- // forked worker threads (send signal)
484
- // De-Register service
485
- // systeminformation observers
486
- // instrument timers (gauge etc.)
487
- // publisher
488
- // terminate UI (if loaded)
489
- const Terminate = async (signal) => {
490
- const logPrefix = `MasterProcessBase:Terminate():${process.pid}:`;
491
- if (this.#shuttingDown === false) {
492
- this.#shuttingDown = true;
493
- if (signal) {
494
- this.LogInfoMessage(this.GetSignalColour(signal)(`${logPrefix} Received signal: ${signal}`));
495
- }
496
- else {
497
- this.LogInfoMessage(this.GetSignalColour(null)(`${logPrefix} Received Terminate without signal.`));
498
- }
499
- TerminateLatency();
500
- await this.ProcessTerminate();
501
- this.TerminateUIController();
502
- this.LogInfoMessage(`${logPrefix} De-Registering service.`);
503
- //@@ De-register here ...
504
- await TerminateHTTPServer();
505
- this.KillWorkers(signal);
506
- await this.TerminateDatabase();
507
- this.TerminateInstrumentController();
508
- await (0, stsutils_1.Sleep)(1000);
509
- this.ProcessExit(this.#childProcessExitTime + this.#masterProcessExitTime);
510
- }
511
- else {
512
- this.LogInfoMessage(`${logPrefix} Process already terminating.`);
513
- }
514
- };
515
- process.on('SIGINT', async () => {
516
- this.emit('processSigint');
517
- await Terminate('SIGINT');
518
- });
519
- process.on('SIGTERM', async () => {
520
- this.emit('processSigterm');
521
- await Terminate('SIGTERM');
522
- });
523
- process.on('exit', (code) => {
524
- this.emit('processExit', code);
525
- if (code === 0) {
526
- this.LogInfoMessage(chalk_1.default.green(`Main Process: ${process.pid} terminated gracefully with code: ${code}`));
527
- }
528
- else {
529
- this.LogInfoMessage(chalk_1.default.red(`Main Process: ${process.pid} terminated with code: ${code}`));
530
- }
531
- });
532
- if (this.options.useLatency) {
533
- this.#checkLatency = setInterval(() => {
534
- this.#CheckLatency();
535
- }, 1000).unref();
536
- }
537
- this.MasterStarted();
538
- this.LogInfoMessage(chalk_1.default.green(`Master process:${process.pid} started`));
539
- };
540
- BroadcastDataToWorkers = (command, data) => {
541
- try {
542
- for (const id in node_cluster_1.default.workers) {
543
- try {
544
- //@@this.LogInfoMessage(chalk.gray(`Sending message to worker PID: ${cluster.workers[id].process.pid}`));
545
- node_cluster_1.default.workers[id].process.send({ command: command, data: data });
546
- }
547
- catch (error) {
548
- //@@this.LogInfoMessage(error);
549
- }
550
- }
551
- }
552
- catch (error) {
553
- //@@this.LogInfoMessage(error);
554
- }
555
- };
556
- }
557
- exports.MasterProcessBase = MasterProcessBase;
558
- //# sourceMappingURL=masterprocessbase.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"masterprocessbase.js","sourceRoot":"","sources":["../../src/process/masterprocessbase.ts"],"names":[],"mappings":"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"}