@nsshunt/stsappframework 3.2.1 → 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonTypes.js +69 -0
- package/dist/commonTypes.js.map +1 -0
- package/dist/controller/stscontrollerbase.js +14 -0
- package/dist/controller/stscontrollerbase.js.map +1 -0
- package/dist/controller/stslatencycontroller.js +28 -0
- package/dist/controller/stslatencycontroller.js.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/stsTransportLoggerWinston.js +22 -0
- package/dist/logger/stsTransportLoggerWinston.js.map +1 -0
- package/dist/logger/stsTransportWinston.js +43 -0
- package/dist/logger/stsTransportWinston.js.map +1 -0
- package/{src/middleware/serverNetworkMiddleware.ts → dist/middleware/serverNetworkMiddleware.js} +80 -124
- package/dist/middleware/serverNetworkMiddleware.js.map +1 -0
- package/dist/network.js +38 -0
- package/dist/network.js.map +1 -0
- package/dist/process/masterprocessbase.js +558 -0
- package/dist/process/masterprocessbase.js.map +1 -0
- package/{src/process/processbase.ts → dist/process/processbase.js} +150 -222
- package/dist/process/processbase.js.map +1 -0
- package/{src/process/serverprocessbase.ts → dist/process/serverprocessbase.js} +158 -212
- package/dist/process/serverprocessbase.js.map +1 -0
- package/dist/process/singleprocessbase.js +55 -0
- package/dist/process/singleprocessbase.js.map +1 -0
- package/{src/process/workerprocessbase.ts → dist/process/workerprocessbase.js} +93 -107
- package/dist/process/workerprocessbase.js.map +1 -0
- package/{src/publishertransports/publishTransportUtils.ts → dist/publishertransports/publishTransportUtils.js} +18 -24
- package/dist/publishertransports/publishTransportUtils.js.map +1 -0
- package/dist/route/stslatencyroute.js +15 -0
- package/dist/route/stslatencyroute.js.map +1 -0
- package/dist/route/stsrouterbase.js +21 -0
- package/dist/route/stsrouterbase.js.map +1 -0
- package/dist/stsexpressserver.js +115 -0
- package/dist/stsexpressserver.js.map +1 -0
- package/dist/validation/errors.js +10 -0
- package/dist/validation/errors.js.map +1 -0
- package/dist/vitesttesting/appConfig.js +93 -0
- package/dist/vitesttesting/appConfig.js.map +1 -0
- package/dist/vitesttesting/appSingleWSS.js +122 -0
- package/dist/vitesttesting/appSingleWSS.js.map +1 -0
- package/dist/vitesttesting/server.js +15 -0
- package/dist/vitesttesting/server.js.map +1 -0
- package/dist/vitesttesting/singleservertest.test.js +286 -0
- package/dist/vitesttesting/singleservertest.test.js.map +1 -0
- package/dist/vitesttesting/wsevents.js +3 -0
- package/dist/vitesttesting/wsevents.js.map +1 -0
- package/package.json +8 -3
- package/.github/dependabot.yml +0 -13
- package/.github/workflows/npm-publish.yml +0 -47
- package/.gitignore copy +0 -108
- package/build.sh +0 -37
- package/esbuild.config.js +0 -81
- package/eslint.config.mjs +0 -55
- package/jest/setEnvVars.js +0 -19
- package/keys/server.cert +0 -21
- package/keys/server.key +0 -28
- package/local-redis-stack.conf +0 -2
- package/run-grpc-client.sh +0 -2
- package/run-grpc-server.sh +0 -2
- package/run1.sh +0 -20
- package/run2.sh +0 -20
- package/run3.sh +0 -20
- package/runc1.sh +0 -19
- package/runc2.sh +0 -19
- package/runkafka.sh +0 -19
- package/runkafkaconsume01.sh +0 -21
- package/runkafkaconsume02.sh +0 -21
- package/runpromise.sh +0 -5
- package/runredis.sh +0 -5
- package/runredis1.sh +0 -4
- package/runredis2.sh +0 -24
- package/runredis3.sh +0 -4
- package/runtest1.sh +0 -19
- package/runtest2.sh +0 -19
- package/runtest_ipc_legacy.sh +0 -19
- package/runtest_ipcex.sh +0 -19
- package/runtest_redis.sh +0 -19
- package/runtest_ww.sh +0 -19
- package/src/commonTypes.ts +0 -374
- package/src/controller/stscontrollerbase.ts +0 -14
- package/src/controller/stslatencycontroller.ts +0 -26
- package/src/index.ts +0 -13
- package/src/logger/stsTransportLoggerWinston.ts +0 -24
- package/src/logger/stsTransportWinston.ts +0 -48
- package/src/network.ts +0 -36
- package/src/process/masterprocessbase.ts +0 -674
- package/src/process/singleprocessbase.ts +0 -63
- package/src/route/stslatencyroute.ts +0 -15
- package/src/route/stsrouterbase.ts +0 -21
- package/src/stsexpressserver.ts +0 -137
- package/src/validation/errors.ts +0 -6
- package/src/vitesttesting/appConfig.ts +0 -111
- package/src/vitesttesting/appSingleWSS.ts +0 -142
- package/src/vitesttesting/server.ts +0 -17
- package/src/vitesttesting/singleservertest.test.ts +0 -352
- package/src/vitesttesting/wsevents.ts +0 -44
- package/tsconfig.json +0 -42
- package/vite.config.ts +0 -19
|
@@ -1,137 +1,112 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
import { STSExpressServer } from './../stsexpressserver'
|
|
22
|
-
import { Express } from 'express'
|
|
23
|
-
|
|
24
|
-
import { createAdapter as clusterCreateAdapter } from '@socket.io/cluster-adapter'
|
|
25
|
-
import { createAdapter } from "@socket.io/redis-streams-adapter";
|
|
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.ServerProcessBase = void 0;
|
|
7
|
+
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const stsconfig_1 = require("@nsshunt/stsconfig");
|
|
10
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
11
|
+
const stsutils_1 = require("@nsshunt/stsutils");
|
|
12
|
+
const processbase_1 = require("./processbase");
|
|
13
|
+
const prom_client_1 = require("prom-client");
|
|
14
|
+
const node_https_1 = require("node:https");
|
|
15
|
+
const node_http_1 = require("node:http");
|
|
16
|
+
const node_tls_1 = __importDefault(require("node:tls"));
|
|
17
|
+
const socket_io_1 = require("socket.io");
|
|
18
|
+
const stsexpressserver_1 = require("./../stsexpressserver");
|
|
19
|
+
const cluster_adapter_1 = require("@socket.io/cluster-adapter");
|
|
20
|
+
const redis_streams_adapter_1 = require("@socket.io/redis-streams-adapter");
|
|
26
21
|
//import { ClusterAdapterWithHeartbeat } from 'socket.io-adaptor';
|
|
27
|
-
|
|
28
22
|
//import { createAdapter } from "@socket.io/redis-adapter";
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
import jayson from 'jayson'
|
|
34
|
-
|
|
35
|
-
import { STSTransportLoggerWinston } from './../logger/stsTransportLoggerWinston'
|
|
36
|
-
|
|
23
|
+
const redis_1 = require("redis");
|
|
24
|
+
const jayson_1 = __importDefault(require("jayson"));
|
|
25
|
+
const stsTransportLoggerWinston_1 = require("./../logger/stsTransportLoggerWinston");
|
|
37
26
|
/**
|
|
38
27
|
* todo
|
|
39
28
|
* @typedef {Object} options - todo
|
|
40
29
|
* @property {boolean} [wssServer=false] - Create a web socket server on this worker instance
|
|
41
30
|
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#sockets: net.Socket[] = [ ];
|
|
31
|
+
class ServerProcessBase extends processbase_1.ProcessBase {
|
|
32
|
+
#masterProcessExitTime = stsconfig_1.goptions.masterProcessExitTime;
|
|
33
|
+
#io = null;
|
|
34
|
+
#redisClient = null;
|
|
35
|
+
#httpServer = null;
|
|
36
|
+
#expressServer = null;
|
|
37
|
+
#sockets = [];
|
|
50
38
|
#shuttingDown = false;
|
|
51
|
-
|
|
52
|
-
constructor(options: ProcessOptions) {
|
|
39
|
+
constructor(options) {
|
|
53
40
|
super(options);
|
|
54
41
|
}
|
|
55
|
-
|
|
56
42
|
get httpServer() {
|
|
57
43
|
return this.#httpServer;
|
|
58
44
|
}
|
|
59
|
-
|
|
60
45
|
get io() {
|
|
61
46
|
return this.#io;
|
|
62
47
|
}
|
|
63
|
-
|
|
64
|
-
get expressServer(): STSExpressServer | null {
|
|
48
|
+
get expressServer() {
|
|
65
49
|
return this.#expressServer;
|
|
66
50
|
}
|
|
67
|
-
set expressServer(val
|
|
51
|
+
set expressServer(val) {
|
|
68
52
|
this.#expressServer = val;
|
|
69
53
|
}
|
|
70
|
-
|
|
71
54
|
// Setup server to Prometheus scrapes:
|
|
72
|
-
#SetupPrometheusEndPoints = (expressServer
|
|
55
|
+
#SetupPrometheusEndPoints = (expressServer) => {
|
|
73
56
|
// AggregatorRegistry is required here in the worker as well as the master in order for prom-client to work correctly.
|
|
74
|
-
new AggregatorRegistry();
|
|
75
|
-
|
|
57
|
+
new prom_client_1.AggregatorRegistry();
|
|
76
58
|
const prefix = 'sts_';
|
|
77
|
-
|
|
78
|
-
collectDefaultMetrics({
|
|
59
|
+
(0, prom_client_1.collectDefaultMetrics)({
|
|
79
60
|
labels: { NODE_APP_INSTANCE: process.pid },
|
|
80
61
|
prefix: prefix
|
|
81
62
|
});
|
|
82
|
-
|
|
83
|
-
const c = new Counter({
|
|
63
|
+
const c = new prom_client_1.Counter({
|
|
84
64
|
name: 'sts_test_counter',
|
|
85
65
|
help: 'Example of a counter',
|
|
86
66
|
labelNames: ['code'],
|
|
87
67
|
});
|
|
88
|
-
|
|
89
68
|
setInterval(() => {
|
|
90
69
|
c.inc({ code: 200 });
|
|
91
70
|
}, 1000).unref();
|
|
92
|
-
|
|
93
71
|
setInterval(() => {
|
|
94
72
|
c.inc({ code: 400 });
|
|
95
73
|
c.inc({ code: 'worker_' + process.pid });
|
|
96
74
|
}, 500).unref();
|
|
97
|
-
|
|
98
|
-
expressServer.get('/metrics', async (req: any, res: any) => {
|
|
75
|
+
expressServer.get('/metrics', async (req, res) => {
|
|
99
76
|
try {
|
|
100
|
-
res.set('Content-Type', register.contentType);
|
|
101
|
-
res.end(await register.metrics());
|
|
102
|
-
}
|
|
77
|
+
res.set('Content-Type', prom_client_1.register.contentType);
|
|
78
|
+
res.end(await prom_client_1.register.metrics());
|
|
79
|
+
}
|
|
80
|
+
catch (ex) {
|
|
103
81
|
res.status(500).end(ex);
|
|
104
82
|
}
|
|
105
83
|
});
|
|
106
|
-
|
|
107
|
-
expressServer.get('/metrics/counter', async (req: any, res: any) => {
|
|
84
|
+
expressServer.get('/metrics/counter', async (req, res) => {
|
|
108
85
|
try {
|
|
109
|
-
res.set('Content-Type', register.contentType);
|
|
110
|
-
res.end(await register.getSingleMetricAsString('test_counter'));
|
|
111
|
-
}
|
|
86
|
+
res.set('Content-Type', prom_client_1.register.contentType);
|
|
87
|
+
res.end(await prom_client_1.register.getSingleMetricAsString('test_counter'));
|
|
88
|
+
}
|
|
89
|
+
catch (ex) {
|
|
112
90
|
res.status(500).end(ex);
|
|
113
91
|
}
|
|
114
92
|
});
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
#SetupTLSServer = async (socket: net.Socket): Promise<void> => {
|
|
93
|
+
};
|
|
94
|
+
#SetupTLSServer = async (socket) => {
|
|
118
95
|
// Add a 'close' event handler to this instance of socket
|
|
119
96
|
this.LogInfoMessage('CONNECTED: ' + socket.remoteAddress + ':' + socket.remotePort + ' ' + process.pid);
|
|
120
97
|
this.#sockets.push(socket);
|
|
121
|
-
|
|
122
98
|
//const self = this;
|
|
123
|
-
socket.on('close', (data
|
|
124
|
-
const index = this.#sockets.findIndex(function(o) {
|
|
99
|
+
socket.on('close', (data) => {
|
|
100
|
+
const index = this.#sockets.findIndex(function (o) {
|
|
125
101
|
return o.remoteAddress === socket.remoteAddress && o.remotePort === socket.remotePort;
|
|
126
|
-
})
|
|
127
|
-
if (index !== -1)
|
|
102
|
+
});
|
|
103
|
+
if (index !== -1)
|
|
104
|
+
this.#sockets.splice(index, 1);
|
|
128
105
|
this.LogInfoMessage('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort + ' ' + process.pid);
|
|
129
106
|
});
|
|
130
|
-
|
|
131
|
-
socket.on('data', (data: any) => {
|
|
107
|
+
socket.on('data', (data) => {
|
|
132
108
|
this.LogInfoMessage('DATA ' + socket.remoteAddress + ': ' + socket.remotePort + ': ' + data);
|
|
133
109
|
socket.write(socket.remoteAddress + ':' + socket.remotePort + " said " + data + '\n');
|
|
134
|
-
|
|
135
110
|
// Write the data back to all the connected, the client will receive it as data from the server
|
|
136
111
|
/*
|
|
137
112
|
self.#sockets.forEach(function(socket, index, array) {
|
|
@@ -140,86 +115,77 @@ export abstract class ServerProcessBase extends ProcessBase implements IServerPr
|
|
|
140
115
|
|
|
141
116
|
*/
|
|
142
117
|
});
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
#SetupRPCServer = async (socket: net.Socket): Promise<void> => {
|
|
118
|
+
};
|
|
119
|
+
#SetupRPCServer = async (socket) => {
|
|
146
120
|
this.LogInfoMessage('CONNECTED: ' + socket.remoteAddress + ':' + socket.remotePort + ' ' + process.pid);
|
|
147
|
-
|
|
148
|
-
socket.on('close', (data: any) => {
|
|
121
|
+
socket.on('close', (data) => {
|
|
149
122
|
this.LogInfoMessage('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort + ' ' + process.pid);
|
|
150
123
|
});
|
|
151
|
-
|
|
152
|
-
socket.on('data', (data: any) => {
|
|
124
|
+
socket.on('data', (data) => {
|
|
153
125
|
this.LogInfoMessage('DATA ' + socket.remoteAddress + ': ' + data);
|
|
154
126
|
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
#SetupWSSServer = async (): Promise<void> => {
|
|
127
|
+
};
|
|
128
|
+
#SetupWSSServer = async () => {
|
|
158
129
|
// socket.io
|
|
159
130
|
// WebSocket
|
|
160
|
-
const options
|
|
161
|
-
transports: [
|
|
131
|
+
const options = {
|
|
132
|
+
transports: ["websocket"] // or [ "websocket", "polling" ] (to use long-poolling. Note that the order matters)
|
|
162
133
|
// The default path is /socket.io
|
|
163
134
|
// This can be changed with the path option as shown below
|
|
164
135
|
//,path: '/zzz'
|
|
165
136
|
};
|
|
166
|
-
|
|
167
137
|
//this.#io = require("socket.io")(this.#httpServer, options);
|
|
168
|
-
this.#io = new Server(this.#httpServer, options);
|
|
169
|
-
|
|
138
|
+
this.#io = new socket_io_1.Server(this.#httpServer, options);
|
|
170
139
|
if (this.options.useSocketIoRedisAdaptor) {
|
|
171
140
|
this.LogInfoMessage(`Using Redis for socket.io cluster management (worker)`);
|
|
172
141
|
if (this.options.socketIoRedisAdaptorUrl) {
|
|
173
142
|
this.LogInfoMessage(`Redis url: [${this.options.socketIoRedisAdaptorUrl}]`);
|
|
174
|
-
this.#redisClient = createClient({url: this.options.socketIoRedisAdaptorUrl});
|
|
175
|
-
}
|
|
143
|
+
this.#redisClient = (0, redis_1.createClient)({ url: this.options.socketIoRedisAdaptorUrl });
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
176
146
|
this.LogInfoMessage(`Redis url: [localhost]`);
|
|
177
|
-
this.#redisClient = createClient();
|
|
147
|
+
this.#redisClient = (0, redis_1.createClient)();
|
|
178
148
|
}
|
|
179
149
|
await this.#redisClient.connect();
|
|
180
|
-
|
|
181
150
|
//this.#redisClient = new Redis(this.options.socketIoRedisAdaptorUrl as string);
|
|
182
|
-
|
|
183
|
-
this.#io.adapter(createAdapter(this.#redisClient));
|
|
184
|
-
|
|
151
|
+
this.#io.adapter((0, redis_streams_adapter_1.createAdapter)(this.#redisClient));
|
|
185
152
|
this.LogInfoMessage(`Redis successfully connected.`);
|
|
186
|
-
}
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
187
155
|
if (this.options.clusterMode) {
|
|
188
|
-
this.#io.adapter(
|
|
156
|
+
this.#io.adapter((0, cluster_adapter_1.createAdapter)());
|
|
189
157
|
this.LogInfoMessage(`Using nodejs cluster mode for socket.io cluster management`);
|
|
190
|
-
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
191
160
|
this.LogInfoMessage(`Not using any adaptors for socket.io cluster management.}`);
|
|
192
161
|
}
|
|
193
162
|
}
|
|
194
|
-
|
|
195
163
|
// To use a seperate socket server, the code below can be applied.
|
|
196
164
|
// this.#io = require("socket.io")(options);
|
|
197
165
|
// this.#io.adapter(createAdapter());
|
|
198
166
|
// this.#io.listen(3006);
|
|
199
|
-
|
|
200
167
|
this.#io.engine.on("connection_error", (err) => {
|
|
201
168
|
this.LogInfoMessage(err.req); // the request object
|
|
202
169
|
this.LogInfoMessage(err.code); // the error code, for example 1
|
|
203
170
|
this.LogInfoMessage(err.message); // the error message, for example "Session ID unknown"
|
|
204
171
|
this.LogInfoMessage(err.context); // some additional error context
|
|
205
172
|
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
#GetTLSOptions = (): JSONObject => {
|
|
173
|
+
};
|
|
174
|
+
#GetTLSOptions = () => {
|
|
209
175
|
return {
|
|
210
|
-
key:
|
|
211
|
-
cert:
|
|
176
|
+
key: node_fs_1.default.readFileSync(this.options.httpsServerKeyPath),
|
|
177
|
+
cert: node_fs_1.default.readFileSync(this.options.httpsServerCertificatePath)
|
|
212
178
|
};
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
#SetupExpressServer = async (useTls: boolean): Promise<void> => {
|
|
179
|
+
};
|
|
180
|
+
#SetupExpressServer = async (useTls) => {
|
|
216
181
|
if (useTls) {
|
|
217
|
-
this.#httpServer =
|
|
218
|
-
}
|
|
219
|
-
|
|
182
|
+
this.#httpServer = (0, node_https_1.createServer)(this.#GetTLSOptions(), this.#expressServer.App);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
this.#httpServer = (0, node_http_1.createServer)(this.#expressServer.App);
|
|
220
186
|
}
|
|
221
187
|
if (this.options.prometheusSupport === true) {
|
|
222
|
-
this.#SetupPrometheusEndPoints(
|
|
188
|
+
this.#SetupPrometheusEndPoints(this.#expressServer.App);
|
|
223
189
|
}
|
|
224
190
|
if (this.options.wssServer === true) {
|
|
225
191
|
await this.#SetupWSSServer();
|
|
@@ -227,76 +193,72 @@ export abstract class ServerProcessBase extends ProcessBase implements IServerPr
|
|
|
227
193
|
// https://stackoverflow.com/questions/21342828/node-express-unix-domain-socket-permissions
|
|
228
194
|
//@@httpServer.listen('/tmp/stsrest01.sock').on('listening', () =>
|
|
229
195
|
//@@httpServer.listen('/var/run/sts/stsrest01.sock').on('listening', () =>
|
|
230
|
-
this.#httpServer.listen(this.options.listenPort, () => {
|
|
196
|
+
this.#httpServer.listen(this.options.listenPort, () => {
|
|
231
197
|
//@@chmodSync(this.options.port, 511);
|
|
232
198
|
}).on('listening', () => {
|
|
233
199
|
this.LogInfoMessage(`live on ${this.options.endpoint}:${this.options.listenPort}${this.options.apiRoot}`);
|
|
234
200
|
});
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
#SetupTCPRawServer = async (): Promise<void> => {
|
|
201
|
+
};
|
|
202
|
+
#SetupTCPRawServer = async () => {
|
|
238
203
|
// The second parameter is the automatic listener for the secureConnection event from the tls.Server class
|
|
239
|
-
this.#httpServer =
|
|
240
|
-
this.#httpServer.listen(this.options.listenPort, 'stscore.stsmda.org', () => {
|
|
204
|
+
this.#httpServer = node_tls_1.default.createServer(this.#GetTLSOptions(), this.#SetupTLSServer);
|
|
205
|
+
this.#httpServer.listen(this.options.listenPort, 'stscore.stsmda.org', () => {
|
|
241
206
|
this.LogInfoMessage('TCP Server is running on port ' + this.options.listenPort + '.');
|
|
242
207
|
}).on('listening', () => {
|
|
243
208
|
this.LogInfoMessage(`TCP live on ${this.options.endpoint}:${this.options.listenPort}${this.options.apiRoot}`);
|
|
244
209
|
});
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
const jaysonServer = new jayson.server();
|
|
210
|
+
};
|
|
211
|
+
#SetupJSONRPCServer = async () => {
|
|
212
|
+
const jaysonServer = new jayson_1.default.server();
|
|
249
213
|
// Supported methods here - move somewhere else ...
|
|
250
|
-
jaysonServer.method("add", function(args
|
|
214
|
+
jaysonServer.method("add", function (args, callback) {
|
|
251
215
|
callback(null, args[0] + args[1]);
|
|
252
216
|
});
|
|
253
217
|
this.#httpServer = jaysonServer.tls(this.#GetTLSOptions());
|
|
254
|
-
|
|
255
|
-
this.#httpServer.listen(this.options.listenPort, 'stscore.stsmda.org', () => {
|
|
218
|
+
this.#httpServer.on('secureConnection', this.#SetupRPCServer);
|
|
219
|
+
this.#httpServer.listen(this.options.listenPort, 'stscore.stsmda.org', () => {
|
|
256
220
|
this.LogInfoMessage('JSON RPC 2.0 Server is running on port ' + this.options.listenPort + '.');
|
|
257
221
|
}).on('listening', () => {
|
|
258
222
|
this.LogInfoMessage(`JSON RPC 2.0 live on ${this.options.endpoint}:${this.options.listenPort}${this.options.apiRoot}`);
|
|
259
223
|
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
override get shuttingDown(): boolean {
|
|
224
|
+
};
|
|
225
|
+
get shuttingDown() {
|
|
263
226
|
return this.#shuttingDown;
|
|
264
227
|
}
|
|
265
|
-
|
|
266
|
-
TerminateSocketIO = async (): Promise<void> => {
|
|
228
|
+
TerminateSocketIO = async () => {
|
|
267
229
|
if (this.options.wssServer === true && this.#io !== null) {
|
|
268
230
|
const logPrefix = `ServerProcessBase:TerminateSockets():${process.pid}:`;
|
|
269
231
|
this.LogInfoMessage(`${logPrefix} Disconnect SocketIO Sockets.`);
|
|
270
|
-
await Sleep(250);
|
|
232
|
+
await (0, stsutils_1.Sleep)(250);
|
|
271
233
|
await this.#io?.of('/').adapter.close();
|
|
272
234
|
if (this.socketIoServerHelper !== null) {
|
|
273
235
|
await this.socketIoServerHelper.CloseAdaptors();
|
|
274
|
-
await Sleep(50);
|
|
236
|
+
await (0, stsutils_1.Sleep)(50);
|
|
275
237
|
if (this.#redisClient) {
|
|
276
238
|
this.#redisClient.disconnect();
|
|
277
|
-
await Sleep(50);
|
|
239
|
+
await (0, stsutils_1.Sleep)(50);
|
|
278
240
|
}
|
|
279
241
|
this.LogInfoMessage(`${logPrefix} this.socketIoServerHelper.DisconnectSockets()`);
|
|
280
242
|
await this.socketIoServerHelper.DisconnectSockets();
|
|
281
|
-
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
282
245
|
this.LogInfoMessage(`${logPrefix} this.#io.disconnectSockets()`);
|
|
283
246
|
if (this.#redisClient) {
|
|
284
247
|
this.#redisClient.disconnect();
|
|
285
|
-
await Sleep(50);
|
|
248
|
+
await (0, stsutils_1.Sleep)(50);
|
|
286
249
|
}
|
|
287
250
|
this.#io.disconnectSockets();
|
|
288
251
|
}
|
|
289
252
|
this.socketIoServerHelper = null;
|
|
290
253
|
this.#io = null;
|
|
291
254
|
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
TerminateHTTPServer = async (): Promise<void> => {
|
|
255
|
+
};
|
|
256
|
+
TerminateHTTPServer = async () => {
|
|
295
257
|
const logPrefix = `ServerProcessBase:TerminateHTTPServer():${process.pid}:`;
|
|
296
258
|
if (this.#httpServer !== null) {
|
|
297
|
-
if (goptions.STSServerType.localeCompare('TCPRAW_TLS') === 0) {
|
|
298
|
-
this.#sockets.forEach((socket
|
|
299
|
-
this.LogInfoMessage(
|
|
259
|
+
if (stsconfig_1.goptions.STSServerType.localeCompare('TCPRAW_TLS') === 0) {
|
|
260
|
+
this.#sockets.forEach((socket, index, array) => {
|
|
261
|
+
this.LogInfoMessage(chalk_1.default.yellow(`${logPrefix} TCP Socket destroy, remote address: [${socket.remoteAddress}], remote port: [${socket.remotePort}]`));
|
|
300
262
|
socket.destroy();
|
|
301
263
|
//socket.end();
|
|
302
264
|
});
|
|
@@ -305,8 +267,7 @@ export abstract class ServerProcessBase extends ProcessBase implements IServerPr
|
|
|
305
267
|
await this.#httpServer.close();
|
|
306
268
|
this.#httpServer = null;
|
|
307
269
|
}
|
|
308
|
-
}
|
|
309
|
-
|
|
270
|
+
};
|
|
310
271
|
// Terminate in order;
|
|
311
272
|
// forked worker threads (send signal)
|
|
312
273
|
// De-Register service
|
|
@@ -314,62 +275,54 @@ export abstract class ServerProcessBase extends ProcessBase implements IServerPr
|
|
|
314
275
|
// instrument timers (gauge etc.)
|
|
315
276
|
// publisher
|
|
316
277
|
// terminate UI (if loaded)
|
|
317
|
-
Terminate = async (clusterPerformExit
|
|
278
|
+
Terminate = async (clusterPerformExit, signal) => {
|
|
318
279
|
const logPrefix = `ServerProcessBase:Terminate():${process.pid}:`;
|
|
319
280
|
if (this.#shuttingDown === false) {
|
|
320
281
|
this.#shuttingDown = true;
|
|
321
|
-
|
|
322
282
|
if (signal) {
|
|
323
283
|
this.LogInfoMessage(this.GetSignalColour(signal)(`${logPrefix} Received signal: ${signal}`));
|
|
324
|
-
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
325
286
|
this.LogInfoMessage(this.GetSignalColour(null)(`${logPrefix} Received Terminate without signal.`));
|
|
326
287
|
}
|
|
327
|
-
|
|
328
288
|
await this.ProcessTerminate();
|
|
329
|
-
|
|
330
289
|
this.TerminateUIController();
|
|
331
|
-
|
|
332
290
|
await this.TerminateSocketIO();
|
|
333
|
-
|
|
334
291
|
await this.TerminateHTTPServer();
|
|
335
|
-
|
|
336
292
|
await this.TerminateDatabase();
|
|
337
|
-
|
|
338
293
|
// Output final messages here (before TerminateInstrumentController)
|
|
339
294
|
if (this.options.clusterMode) {
|
|
340
295
|
this.LogInfoMessage(`${logPrefix} clusterPerformExit value: [${clusterPerformExit}]`);
|
|
341
296
|
if (clusterPerformExit) {
|
|
342
297
|
this.LogInfoMessage(`${logPrefix} Process will self terminate with process.exit(0).`);
|
|
343
|
-
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
344
300
|
this.LogInfoMessage(`${logPrefix} Child process will not self terminate. Terminate will be handled by master process.`);
|
|
345
301
|
}
|
|
346
302
|
}
|
|
347
|
-
|
|
348
303
|
this.TerminateInstrumentController();
|
|
349
|
-
|
|
350
304
|
//@@ always return here appears to always cleanly exit
|
|
351
305
|
// and cleanly exit from socket.io cluster adaptor
|
|
352
306
|
// without return here, socket.io cluster adaptor terminates in an error state
|
|
353
307
|
// as the implementation relies on cluster.on to send messages to worker threads
|
|
354
308
|
// but these have already been closed from the process.exit(0) below.
|
|
355
|
-
|
|
356
|
-
await Sleep(1000); // Allow socket.io time to clean-up
|
|
357
|
-
|
|
309
|
+
await (0, stsutils_1.Sleep)(1000); // Allow socket.io time to clean-up
|
|
358
310
|
if (this.options.clusterMode === true) {
|
|
359
311
|
if (clusterPerformExit === true) {
|
|
360
312
|
setTimeout(() => {
|
|
361
313
|
process.exit(0);
|
|
362
314
|
}, 0);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
365
318
|
this.ProcessExit(this.#masterProcessExitTime);
|
|
366
319
|
}
|
|
367
|
-
}
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
368
322
|
this.LogInfoMessage(`${logPrefix} Process already terminating.`);
|
|
369
323
|
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
async SetupServer(): Promise<boolean> {
|
|
324
|
+
};
|
|
325
|
+
async SetupServer() {
|
|
373
326
|
return new Promise((resolve, reject) => {
|
|
374
327
|
try {
|
|
375
328
|
this.SetupInstrumentation();
|
|
@@ -377,79 +330,72 @@ export abstract class ServerProcessBase extends ProcessBase implements IServerPr
|
|
|
377
330
|
try {
|
|
378
331
|
await this.SetupServerEx();
|
|
379
332
|
resolve(true);
|
|
380
|
-
}
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
381
335
|
reject(error);
|
|
382
336
|
}
|
|
383
337
|
}, 100);
|
|
384
|
-
}
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
385
340
|
reject(error);
|
|
386
341
|
}
|
|
387
|
-
})
|
|
342
|
+
});
|
|
388
343
|
}
|
|
389
|
-
|
|
390
344
|
ProcessStarted() {
|
|
391
|
-
const transport = new STSTransportLoggerWinston({
|
|
345
|
+
const transport = new stsTransportLoggerWinston_1.STSTransportLoggerWinston({
|
|
392
346
|
stsApp: this
|
|
393
347
|
});
|
|
394
348
|
setTimeout(() => {
|
|
395
|
-
|
|
349
|
+
this.options.logger.add(transport);
|
|
396
350
|
}, 0);
|
|
397
351
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
this.LogInfoMessage(chalk.green(`ServerProcessBase:SetupServerEx(): Main Process:${process.pid} Starting ...`));
|
|
401
|
-
|
|
352
|
+
async SetupServerEx() {
|
|
353
|
+
this.LogInfoMessage(chalk_1.default.green(`ServerProcessBase:SetupServerEx(): Main Process:${process.pid} Starting ...`));
|
|
402
354
|
this.ProcessStartup();
|
|
403
|
-
|
|
404
355
|
if (this.options.expressServerRouteFactory || this.options.expressServerRouteStaticFactory) {
|
|
405
|
-
this.expressServer = new STSExpressServer(this.options, this);
|
|
356
|
+
this.expressServer = new stsexpressserver_1.STSExpressServer(this.options, this);
|
|
406
357
|
}
|
|
407
|
-
|
|
408
358
|
this.LogInfoMessage(`ServerProcessBase:SetupServerEx(): Worker instance starting. Service instance Id: [${this.options.serviceInstanceId}]`);
|
|
409
|
-
|
|
410
359
|
// Signal Codes
|
|
411
360
|
// https://en.wikipedia.org/wiki/Signal_(IPC)
|
|
412
361
|
process.on('SIGTERM', async () => {
|
|
413
362
|
this.LogInfoMessage(`ServerProcessBase:SetupServerEx(): SIGTERM signal received for worker: ${process.pid}`);
|
|
414
363
|
await this.Terminate(true, true);
|
|
415
364
|
});
|
|
416
|
-
|
|
417
365
|
process.on('SIGINT', async () => {
|
|
418
366
|
this.LogInfoMessage(`ServerProcessBase:SetupServerEx(): SIGINT signal received for worker: ${process.pid}`);
|
|
419
367
|
await this.Terminate(true, true);
|
|
420
368
|
});
|
|
421
|
-
|
|
422
369
|
process.on('exit', (code) => {
|
|
423
370
|
if (code === 0) {
|
|
424
|
-
this.LogInfoMessage(
|
|
425
|
-
}
|
|
426
|
-
|
|
371
|
+
this.LogInfoMessage(chalk_1.default.green(`ServerProcessBase:SetupServerEx(): Process: ${process.pid} terminated gracefully with code: ${code}`));
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
this.LogInfoMessage(chalk_1.default.red(`ServerProcessBase:SetupServerEx(): Process: ${process.pid} terminated with code: ${code}`));
|
|
427
375
|
}
|
|
428
376
|
});
|
|
429
|
-
|
|
430
377
|
await this.SetupSTSServer();
|
|
431
|
-
|
|
432
378
|
this.ProcessStarted();
|
|
433
|
-
|
|
434
|
-
this.LogInfoMessage(chalk.green(`ServerProcessBase:SetupServerEx(): Main Process:${process.pid} Started`));
|
|
435
|
-
|
|
379
|
+
this.LogInfoMessage(chalk_1.default.green(`ServerProcessBase:SetupServerEx(): Main Process:${process.pid} Started`));
|
|
436
380
|
return true;
|
|
437
|
-
};
|
|
438
|
-
|
|
439
|
-
SetupSTSServer = async(): Promise<void> => {
|
|
440
|
-
switch (goptions.STSServerType) {
|
|
441
|
-
case 'EXPRESS' :
|
|
442
|
-
await this.#SetupExpressServer(false);
|
|
443
|
-
break;
|
|
444
|
-
case 'EXPRESS_TLS' :
|
|
445
|
-
await this.#SetupExpressServer(true);
|
|
446
|
-
break;
|
|
447
|
-
case 'TCPRAW_TLS' :
|
|
448
|
-
await this.#SetupTCPRawServer();
|
|
449
|
-
break;
|
|
450
|
-
case 'JSONRPC2_TLS' :
|
|
451
|
-
await this.#SetupJSONRPCServer();
|
|
452
|
-
break;
|
|
453
|
-
}
|
|
454
381
|
}
|
|
382
|
+
;
|
|
383
|
+
SetupSTSServer = async () => {
|
|
384
|
+
switch (stsconfig_1.goptions.STSServerType) {
|
|
385
|
+
case 'EXPRESS':
|
|
386
|
+
await this.#SetupExpressServer(false);
|
|
387
|
+
break;
|
|
388
|
+
case 'EXPRESS_TLS':
|
|
389
|
+
await this.#SetupExpressServer(true);
|
|
390
|
+
break;
|
|
391
|
+
case 'TCPRAW_TLS':
|
|
392
|
+
await this.#SetupTCPRawServer();
|
|
393
|
+
break;
|
|
394
|
+
case 'JSONRPC2_TLS':
|
|
395
|
+
await this.#SetupJSONRPCServer();
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
};
|
|
455
399
|
}
|
|
400
|
+
exports.ServerProcessBase = ServerProcessBase;
|
|
401
|
+
//# sourceMappingURL=serverprocessbase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverprocessbase.js","sourceRoot":"","sources":["../../src/process/serverprocessbase.ts"],"names":[],"mappings":"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"}
|