@nsshunt/stsappframework 3.0.72 → 3.0.74
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/middleware/serverNetworkMiddleware.js +123 -0
- package/dist/middleware/serverNetworkMiddleware.js.map +1 -0
- package/dist/server.js +10 -33
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
- package/src/middleware/serverNetworkMiddleware.ts +155 -0
- package/src/server.ts +13 -37
- package/types/middleware/serverNetworkMiddleware.d.ts +33 -0
- package/types/middleware/serverNetworkMiddleware.d.ts.map +1 -0
- package/types/server.d.ts.map +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
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.ServerNetworkMiddleware = exports.ServerNetworkMiddlewareEventName = void 0;
|
|
7
|
+
const tiny_emitter_1 = require("tiny-emitter");
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
const stsutils_1 = require("@nsshunt/stsutils");
|
|
10
|
+
const debug = (0, debug_1.default)(`proc:${process.pid}`);
|
|
11
|
+
var ServerNetworkMiddlewareEventName;
|
|
12
|
+
(function (ServerNetworkMiddlewareEventName) {
|
|
13
|
+
ServerNetworkMiddlewareEventName["UpdateInstrument_SERVER_NET_VAL"] = "UpdateInstrument_SERVER_NET_VAL"; // request net stats
|
|
14
|
+
})(ServerNetworkMiddlewareEventName || (exports.ServerNetworkMiddlewareEventName = ServerNetworkMiddlewareEventName = {}));
|
|
15
|
+
class ServerNetworkMiddleware extends stsutils_1.STSOptionsBase {
|
|
16
|
+
#tinyEmitter = new tiny_emitter_1.TinyEmitter();
|
|
17
|
+
#socketCollection = {};
|
|
18
|
+
#id = 0;
|
|
19
|
+
#debug;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
super(options);
|
|
22
|
+
if (options.outputDebug) {
|
|
23
|
+
this.#debug = debug;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
this.#debug = () => { };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
on(eventName, callBackFn) {
|
|
30
|
+
this.#tinyEmitter.on(eventName, callBackFn);
|
|
31
|
+
}
|
|
32
|
+
GetSocketRecord = (socket) => {
|
|
33
|
+
for (const [, socketRecord] of Object.entries(this.#socketCollection)) {
|
|
34
|
+
if (socketRecord.socket === socket) {
|
|
35
|
+
return socketRecord;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
};
|
|
40
|
+
UpdateNetworkStats = (workingSocketRecord, eventName, req) => {
|
|
41
|
+
workingSocketRecord.originalUrl = req.originalUrl;
|
|
42
|
+
workingSocketRecord.eventName = eventName;
|
|
43
|
+
workingSocketRecord.currentBytesRead = req.socket.bytesRead;
|
|
44
|
+
workingSocketRecord.currentBytesWritten = req.socket.bytesWritten;
|
|
45
|
+
workingSocketRecord.requestBytesRead = workingSocketRecord.currentBytesRead - workingSocketRecord.lastBytesRead;
|
|
46
|
+
workingSocketRecord.requestBytesWritten = workingSocketRecord.currentBytesWritten - workingSocketRecord.lastBytesWritten;
|
|
47
|
+
//this.#debug(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]`.grey);
|
|
48
|
+
//this.#debug(`totalBytesWritten: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesWritten}]`.grey);
|
|
49
|
+
const workingSocketEventRecord = { ...workingSocketRecord };
|
|
50
|
+
delete workingSocketEventRecord.socket;
|
|
51
|
+
this.#debug(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]`.grey);
|
|
52
|
+
this.#tinyEmitter.emit(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, workingSocketEventRecord);
|
|
53
|
+
workingSocketRecord.lastBytesRead = workingSocketRecord.currentBytesRead;
|
|
54
|
+
workingSocketRecord.lastBytesWritten = workingSocketRecord.currentBytesWritten;
|
|
55
|
+
};
|
|
56
|
+
Middleware = (req, res, next) => {
|
|
57
|
+
let workingSocketRecord = null;
|
|
58
|
+
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
59
|
+
if (!workingSocketRecord) {
|
|
60
|
+
this.#id++;
|
|
61
|
+
workingSocketRecord = {
|
|
62
|
+
id: `${this.options.name}_${this.#id.toString()}`,
|
|
63
|
+
socket: req.socket,
|
|
64
|
+
currentBytesRead: 0,
|
|
65
|
+
currentBytesWritten: 0,
|
|
66
|
+
lastBytesRead: 0,
|
|
67
|
+
lastBytesWritten: 0,
|
|
68
|
+
requestBytesRead: 0,
|
|
69
|
+
requestBytesWritten: 0,
|
|
70
|
+
originalUrl: req.originalUrl,
|
|
71
|
+
eventName: '',
|
|
72
|
+
};
|
|
73
|
+
this.#socketCollection[workingSocketRecord.id] = workingSocketRecord;
|
|
74
|
+
this.#debug(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray);
|
|
75
|
+
workingSocketRecord.socket.on('close', () => {
|
|
76
|
+
workingSocketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
77
|
+
if (workingSocketRecord) {
|
|
78
|
+
this.#debug(`Socket close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray);
|
|
79
|
+
this.UpdateNetworkStats(workingSocketRecord, 'socket_close', req);
|
|
80
|
+
delete this.#socketCollection[workingSocketRecord.id];
|
|
81
|
+
this.#debug(`Socket removed from recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.#debug(`Socket close event: Could not find socket within recordset`.magenta);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
workingSocketRecord.socket.on('end', () => {
|
|
88
|
+
workingSocketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
89
|
+
if (workingSocketRecord) {
|
|
90
|
+
this.#debug(`Socket end event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray);
|
|
91
|
+
this.UpdateNetworkStats(workingSocketRecord, 'socket_end', req);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.#debug(`Socket end event: Could not find socket within recordset`.magenta);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
req.on('end', () => {
|
|
98
|
+
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
99
|
+
if (workingSocketRecord) {
|
|
100
|
+
this.#debug(`Request end event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray);
|
|
101
|
+
this.UpdateNetworkStats(workingSocketRecord, 'req_end', req);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.#debug(`Request end event: Could not find socket within recordset`.magenta);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
req.on('close', () => {
|
|
108
|
+
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
109
|
+
if (workingSocketRecord) {
|
|
110
|
+
this.#debug(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray);
|
|
111
|
+
this.UpdateNetworkStats(workingSocketRecord, 'req_close', req);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
this.#debug(`Request close event: Could not find socket within recordset`.magenta);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
this.UpdateNetworkStats(workingSocketRecord, 'middleware', req);
|
|
119
|
+
next();
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
exports.ServerNetworkMiddleware = ServerNetworkMiddleware;
|
|
123
|
+
//# sourceMappingURL=serverNetworkMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverNetworkMiddleware.js","sourceRoot":"","sources":["../../src/middleware/serverNetworkMiddleware.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.STSExpressServer = void 0;
|
|
7
|
-
/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF
|
|
7
|
+
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
8
8
|
const express_1 = __importDefault(require("express"));
|
|
9
9
|
const cors_1 = __importDefault(require("cors"));
|
|
10
10
|
const cookie_parser_1 = __importDefault(require("cookie-parser"));
|
|
@@ -12,15 +12,21 @@ const stspublisherserver_1 = require("@nsshunt/stspublisherserver");
|
|
|
12
12
|
const stsconfig_1 = require("@nsshunt/stsconfig");
|
|
13
13
|
const goptions = (0, stsconfig_1.$Options)();
|
|
14
14
|
const stsinstrumentation_1 = require("@nsshunt/stsinstrumentation");
|
|
15
|
+
const serverNetworkMiddleware_1 = require("./middleware/serverNetworkMiddleware");
|
|
15
16
|
class STSExpressServer {
|
|
16
17
|
#app;
|
|
17
|
-
#totalBytesRead = 0;
|
|
18
|
-
#totalBytesWritten = 0;
|
|
19
18
|
constructor(options, stsApp) {
|
|
20
19
|
// Standard RequestLoggerMiddleware for all STS services
|
|
21
20
|
const requestLoggerMiddleware = new stspublisherserver_1.RequestLoggerMiddleware({
|
|
22
21
|
ignoresocketio: goptions.ignoresocketio
|
|
23
22
|
});
|
|
23
|
+
const serverNetworkMiddleware = new serverNetworkMiddleware_1.ServerNetworkMiddleware({
|
|
24
|
+
name: stsApp.options.serviceName,
|
|
25
|
+
outputDebug: false
|
|
26
|
+
});
|
|
27
|
+
serverNetworkMiddleware.on(serverNetworkMiddleware_1.ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, (data) => {
|
|
28
|
+
console.log(`serverNetworkMiddleware: [${JSON.stringify(data)}]`.magenta);
|
|
29
|
+
});
|
|
24
30
|
requestLoggerMiddleware.on(stspublisherserver_1.RequestLoggerMiddlewareEventName.UpdateInstrument_AR_INC, () => {
|
|
25
31
|
stsApp.UpdateInstrument(stsinstrumentation_1.Gauge.ACTIVE_REQUEST_GAUGE, {
|
|
26
32
|
Inc: 1
|
|
@@ -53,31 +59,6 @@ class STSExpressServer {
|
|
|
53
59
|
});
|
|
54
60
|
}
|
|
55
61
|
});
|
|
56
|
-
requestLoggerMiddleware.on(stspublisherserver_1.RequestLoggerMiddlewareEventName.UpdateInstrument_NET_VAL, (stats) => {
|
|
57
|
-
const requestStats = stats;
|
|
58
|
-
console.log(`requestStats: [${JSON.stringify(requestStats)}]`.yellow);
|
|
59
|
-
/*
|
|
60
|
-
stsApp.UpdateInstrument(Gauge.DURATION_GAUGE, {
|
|
61
|
-
val: timeInMs
|
|
62
|
-
} as InstrumentHistogramTelemetry);
|
|
63
|
-
*/
|
|
64
|
-
});
|
|
65
|
-
requestLoggerMiddleware.on(stspublisherserver_1.RequestLoggerMiddlewareEventName.UpdateInstrument_RX_VAL, (bytesRead) => {
|
|
66
|
-
console.log(`bytesRead: [${bytesRead}]`.magenta);
|
|
67
|
-
/*
|
|
68
|
-
stsApp.UpdateInstrument(Gauge.DURATION_GAUGE, {
|
|
69
|
-
val: timeInMs
|
|
70
|
-
} as InstrumentHistogramTelemetry);
|
|
71
|
-
*/
|
|
72
|
-
});
|
|
73
|
-
requestLoggerMiddleware.on(stspublisherserver_1.RequestLoggerMiddlewareEventName.UpdateInstrument_TX_VAL, (bytesWritten) => {
|
|
74
|
-
console.log(`bytesWritten: [${bytesWritten}]`.cyan);
|
|
75
|
-
/*
|
|
76
|
-
stsApp.UpdateInstrument(Gauge.DURATION_GAUGE, {
|
|
77
|
-
val: timeInMs
|
|
78
|
-
} as InstrumentHistogramTelemetry);
|
|
79
|
-
*/
|
|
80
|
-
});
|
|
81
62
|
const app = (0, express_1.default)();
|
|
82
63
|
this.#app = app;
|
|
83
64
|
// https://stackoverflow.com/questions/19743396/cors-cannot-use-wildcard-in-access-control-allow-origin-when-credentials-flag-i
|
|
@@ -97,11 +78,7 @@ class STSExpressServer {
|
|
|
97
78
|
options.expressServerRouteStaticFactory(app, stsApp);
|
|
98
79
|
}
|
|
99
80
|
app.use(requestLoggerMiddleware.Middleware.bind(requestLoggerMiddleware));
|
|
100
|
-
app.use(
|
|
101
|
-
this.#totalBytesRead += req.socket.bytesRead;
|
|
102
|
-
this.#totalBytesWritten += req.socket.bytesWritten;
|
|
103
|
-
next();
|
|
104
|
-
});
|
|
81
|
+
app.use(serverNetworkMiddleware.Middleware.bind(serverNetworkMiddleware));
|
|
105
82
|
if (options.expressServerRouteFactory) {
|
|
106
83
|
options.expressServerRouteFactory(app, stsApp);
|
|
107
84
|
}
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.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.0.
|
|
3
|
+
"version": "3.0.74",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "./types/index.d.ts",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"@nsshunt/stsconfig": "^1.25.60",
|
|
52
52
|
"@nsshunt/stsdatamanagement": "^1.17.130",
|
|
53
53
|
"@nsshunt/stsinstrumentation": "^7.0.5",
|
|
54
|
-
"@nsshunt/stspublisherserver": "^2.0.
|
|
54
|
+
"@nsshunt/stspublisherserver": "^2.0.33",
|
|
55
55
|
"@nsshunt/stssocketio-client": "^0.0.84",
|
|
56
56
|
"@nsshunt/stsutils": "^1.16.15",
|
|
57
57
|
"@socket.io/cluster-adapter": "^0.2.2",
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
2
|
+
import { Request, Response, NextFunction } from 'express'
|
|
3
|
+
import { Socket } from 'node:net'
|
|
4
|
+
import { TinyEmitter } from 'tiny-emitter';
|
|
5
|
+
|
|
6
|
+
import debugModule from 'debug'
|
|
7
|
+
import { STSOptionsBase } from '@nsshunt/stsutils';
|
|
8
|
+
const debug = debugModule(`proc:${process.pid}`);
|
|
9
|
+
|
|
10
|
+
export enum ServerNetworkMiddlewareEventName {
|
|
11
|
+
UpdateInstrument_SERVER_NET_VAL = 'UpdateInstrument_SERVER_NET_VAL' // request net stats
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ISocketRecord {
|
|
15
|
+
id: string
|
|
16
|
+
socket: Socket,
|
|
17
|
+
currentBytesRead: number
|
|
18
|
+
currentBytesWritten: number
|
|
19
|
+
lastBytesRead: number
|
|
20
|
+
lastBytesWritten: number
|
|
21
|
+
requestBytesRead: number
|
|
22
|
+
requestBytesWritten: number
|
|
23
|
+
originalUrl: string
|
|
24
|
+
eventName: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type ServerNetworkMiddlewareEventFunc = (data: ISocketRecord) => void;
|
|
28
|
+
|
|
29
|
+
export interface IServerNetworkMiddleware {
|
|
30
|
+
name: string
|
|
31
|
+
outputDebug: boolean
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class ServerNetworkMiddleware extends STSOptionsBase
|
|
35
|
+
{
|
|
36
|
+
#tinyEmitter: TinyEmitter = new TinyEmitter();
|
|
37
|
+
#socketCollection: Record<string, ISocketRecord> = { };
|
|
38
|
+
#id: number = 0;
|
|
39
|
+
#debug: any;
|
|
40
|
+
|
|
41
|
+
constructor(options: IServerNetworkMiddleware) {
|
|
42
|
+
super(options);
|
|
43
|
+
if (options.outputDebug) {
|
|
44
|
+
this.#debug = debug;
|
|
45
|
+
} else {
|
|
46
|
+
this.#debug = () => { };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
on(eventName: ServerNetworkMiddlewareEventName, callBackFn: ServerNetworkMiddlewareEventFunc) {
|
|
51
|
+
this.#tinyEmitter.on(eventName, callBackFn);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
GetSocketRecord = (socket: Socket): ISocketRecord | null => {
|
|
55
|
+
for (const [, socketRecord] of Object.entries(this.#socketCollection)) {
|
|
56
|
+
if (socketRecord.socket === socket) {
|
|
57
|
+
return socketRecord;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
UpdateNetworkStats = (workingSocketRecord: ISocketRecord, eventName: string, req: Request) => {
|
|
64
|
+
workingSocketRecord.originalUrl = req.originalUrl;
|
|
65
|
+
workingSocketRecord.eventName = eventName;
|
|
66
|
+
|
|
67
|
+
workingSocketRecord.currentBytesRead = req.socket.bytesRead;
|
|
68
|
+
workingSocketRecord.currentBytesWritten = req.socket.bytesWritten;
|
|
69
|
+
|
|
70
|
+
workingSocketRecord.requestBytesRead = workingSocketRecord.currentBytesRead - workingSocketRecord.lastBytesRead;
|
|
71
|
+
workingSocketRecord.requestBytesWritten = workingSocketRecord.currentBytesWritten - workingSocketRecord.lastBytesWritten;
|
|
72
|
+
|
|
73
|
+
//this.#debug(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]`.grey);
|
|
74
|
+
//this.#debug(`totalBytesWritten: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesWritten}]`.grey);
|
|
75
|
+
|
|
76
|
+
const workingSocketEventRecord = { ...workingSocketRecord };
|
|
77
|
+
delete (workingSocketEventRecord as any).socket;
|
|
78
|
+
this.#debug(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]`.grey);
|
|
79
|
+
this.#tinyEmitter.emit(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, workingSocketEventRecord);
|
|
80
|
+
|
|
81
|
+
workingSocketRecord.lastBytesRead = workingSocketRecord.currentBytesRead;
|
|
82
|
+
workingSocketRecord.lastBytesWritten = workingSocketRecord.currentBytesWritten;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
Middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
86
|
+
let workingSocketRecord: ISocketRecord | null = null;
|
|
87
|
+
|
|
88
|
+
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
89
|
+
if (!workingSocketRecord) {
|
|
90
|
+
this.#id++
|
|
91
|
+
workingSocketRecord = {
|
|
92
|
+
id: `${(this.options as IServerNetworkMiddleware).name}_${this.#id.toString()}`,
|
|
93
|
+
socket: req.socket,
|
|
94
|
+
currentBytesRead: 0,
|
|
95
|
+
currentBytesWritten: 0,
|
|
96
|
+
lastBytesRead: 0,
|
|
97
|
+
lastBytesWritten: 0,
|
|
98
|
+
requestBytesRead: 0,
|
|
99
|
+
requestBytesWritten: 0,
|
|
100
|
+
originalUrl: req.originalUrl,
|
|
101
|
+
eventName: '',
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
this.#socketCollection[workingSocketRecord.id] = workingSocketRecord;
|
|
105
|
+
|
|
106
|
+
this.#debug(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray)
|
|
107
|
+
|
|
108
|
+
workingSocketRecord.socket.on('close', () => {
|
|
109
|
+
workingSocketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
110
|
+
if (workingSocketRecord) {
|
|
111
|
+
this.#debug(`Socket close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray)
|
|
112
|
+
this.UpdateNetworkStats(workingSocketRecord, 'socket_close', req);
|
|
113
|
+
delete this.#socketCollection[workingSocketRecord.id];
|
|
114
|
+
this.#debug(`Socket removed from recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray)
|
|
115
|
+
} else {
|
|
116
|
+
this.#debug(`Socket close event: Could not find socket within recordset`.magenta)
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
workingSocketRecord.socket.on('end', () => {
|
|
121
|
+
workingSocketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
122
|
+
if (workingSocketRecord) {
|
|
123
|
+
this.#debug(`Socket end event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray)
|
|
124
|
+
this.UpdateNetworkStats(workingSocketRecord, 'socket_end', req);
|
|
125
|
+
} else {
|
|
126
|
+
this.#debug(`Socket end event: Could not find socket within recordset`.magenta)
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
req.on('end', () => {
|
|
131
|
+
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
132
|
+
if (workingSocketRecord) {
|
|
133
|
+
this.#debug(`Request end event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray)
|
|
134
|
+
this.UpdateNetworkStats(workingSocketRecord, 'req_end', req);
|
|
135
|
+
} else {
|
|
136
|
+
this.#debug(`Request end event: Could not find socket within recordset`.magenta)
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
req.on('close', () => {
|
|
141
|
+
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
142
|
+
if (workingSocketRecord) {
|
|
143
|
+
this.#debug(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`.gray)
|
|
144
|
+
this.UpdateNetworkStats(workingSocketRecord, 'req_close', req);
|
|
145
|
+
} else {
|
|
146
|
+
this.#debug(`Request close event: Could not find socket within recordset`.magenta)
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
this.UpdateNetworkStats(workingSocketRecord, 'middleware', req);
|
|
152
|
+
|
|
153
|
+
next();
|
|
154
|
+
}
|
|
155
|
+
}
|
package/src/server.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/* eslint @typescript-eslint/no-explicit-any: 0 */ // --> OFF
|
|
1
|
+
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
2
2
|
import express, { Express, Request, Response, NextFunction } from 'express';
|
|
3
3
|
|
|
4
4
|
import cors from 'cors';
|
|
5
5
|
import cookieParser from 'cookie-parser';
|
|
6
6
|
|
|
7
|
-
import { RequestLoggerMiddleware, RequestLoggerMiddlewareEventName
|
|
7
|
+
import { RequestLoggerMiddleware, RequestLoggerMiddlewareEventName } from '@nsshunt/stspublisherserver'
|
|
8
8
|
|
|
9
9
|
import { ProcessOptions } from './processoptions'
|
|
10
10
|
|
|
@@ -14,12 +14,11 @@ const goptions = $Options()
|
|
|
14
14
|
import { IProcessBase } from './commonTypes'
|
|
15
15
|
import { Gauge, InstrumentGaugeTelemetry, InstrumentHistogramTelemetry, InstrumentVelocityTelemetry } from '@nsshunt/stsinstrumentation'
|
|
16
16
|
|
|
17
|
+
import { ISocketRecord, ServerNetworkMiddleware, ServerNetworkMiddlewareEventName } from './middleware/serverNetworkMiddleware'
|
|
17
18
|
|
|
18
19
|
export class STSExpressServer
|
|
19
20
|
{
|
|
20
21
|
#app: Express;
|
|
21
|
-
#totalBytesRead = 0;
|
|
22
|
-
#totalBytesWritten = 0;
|
|
23
22
|
|
|
24
23
|
constructor(options: ProcessOptions, stsApp: IProcessBase)
|
|
25
24
|
{
|
|
@@ -28,6 +27,15 @@ export class STSExpressServer
|
|
|
28
27
|
ignoresocketio: goptions.ignoresocketio
|
|
29
28
|
});
|
|
30
29
|
|
|
30
|
+
const serverNetworkMiddleware = new ServerNetworkMiddleware({
|
|
31
|
+
name: (stsApp.options as ProcessOptions).serviceName,
|
|
32
|
+
outputDebug: false
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
serverNetworkMiddleware.on(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, (data: ISocketRecord) => {
|
|
36
|
+
console.log(`serverNetworkMiddleware: [${JSON.stringify(data)}]`.magenta)
|
|
37
|
+
});
|
|
38
|
+
|
|
31
39
|
requestLoggerMiddleware.on(RequestLoggerMiddlewareEventName.UpdateInstrument_AR_INC, () => {
|
|
32
40
|
stsApp.UpdateInstrument(Gauge.ACTIVE_REQUEST_GAUGE, {
|
|
33
41
|
Inc: 1
|
|
@@ -66,34 +74,6 @@ export class STSExpressServer
|
|
|
66
74
|
}
|
|
67
75
|
});
|
|
68
76
|
|
|
69
|
-
requestLoggerMiddleware.on(RequestLoggerMiddlewareEventName.UpdateInstrument_NET_VAL, (stats) => {
|
|
70
|
-
const requestStats: IRequestNetStats = stats as IRequestNetStats;
|
|
71
|
-
console.log(`requestStats: [${JSON.stringify(requestStats)}]`.yellow);
|
|
72
|
-
/*
|
|
73
|
-
stsApp.UpdateInstrument(Gauge.DURATION_GAUGE, {
|
|
74
|
-
val: timeInMs
|
|
75
|
-
} as InstrumentHistogramTelemetry);
|
|
76
|
-
*/
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
requestLoggerMiddleware.on(RequestLoggerMiddlewareEventName.UpdateInstrument_RX_VAL, (bytesRead) => {
|
|
80
|
-
console.log(`bytesRead: [${bytesRead}]`.magenta);
|
|
81
|
-
/*
|
|
82
|
-
stsApp.UpdateInstrument(Gauge.DURATION_GAUGE, {
|
|
83
|
-
val: timeInMs
|
|
84
|
-
} as InstrumentHistogramTelemetry);
|
|
85
|
-
*/
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
requestLoggerMiddleware.on(RequestLoggerMiddlewareEventName.UpdateInstrument_TX_VAL, (bytesWritten) => {
|
|
89
|
-
console.log(`bytesWritten: [${bytesWritten}]`.cyan);
|
|
90
|
-
/*
|
|
91
|
-
stsApp.UpdateInstrument(Gauge.DURATION_GAUGE, {
|
|
92
|
-
val: timeInMs
|
|
93
|
-
} as InstrumentHistogramTelemetry);
|
|
94
|
-
*/
|
|
95
|
-
});
|
|
96
|
-
|
|
97
77
|
const app = express();
|
|
98
78
|
this.#app = app;
|
|
99
79
|
|
|
@@ -121,11 +101,7 @@ export class STSExpressServer
|
|
|
121
101
|
|
|
122
102
|
app.use(requestLoggerMiddleware.Middleware.bind(requestLoggerMiddleware));
|
|
123
103
|
|
|
124
|
-
app.use(
|
|
125
|
-
this.#totalBytesRead += req.socket.bytesRead;
|
|
126
|
-
this.#totalBytesWritten += req.socket.bytesWritten;
|
|
127
|
-
next();
|
|
128
|
-
});
|
|
104
|
+
app.use(serverNetworkMiddleware.Middleware.bind(serverNetworkMiddleware));
|
|
129
105
|
|
|
130
106
|
if (options.expressServerRouteFactory) {
|
|
131
107
|
options.expressServerRouteFactory(app, stsApp);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Request, Response, NextFunction } from 'express';
|
|
3
|
+
import { Socket } from 'node:net';
|
|
4
|
+
import { STSOptionsBase } from '@nsshunt/stsutils';
|
|
5
|
+
export declare enum ServerNetworkMiddlewareEventName {
|
|
6
|
+
UpdateInstrument_SERVER_NET_VAL = "UpdateInstrument_SERVER_NET_VAL"
|
|
7
|
+
}
|
|
8
|
+
export interface ISocketRecord {
|
|
9
|
+
id: string;
|
|
10
|
+
socket: Socket;
|
|
11
|
+
currentBytesRead: number;
|
|
12
|
+
currentBytesWritten: number;
|
|
13
|
+
lastBytesRead: number;
|
|
14
|
+
lastBytesWritten: number;
|
|
15
|
+
requestBytesRead: number;
|
|
16
|
+
requestBytesWritten: number;
|
|
17
|
+
originalUrl: string;
|
|
18
|
+
eventName: string;
|
|
19
|
+
}
|
|
20
|
+
export type ServerNetworkMiddlewareEventFunc = (data: ISocketRecord) => void;
|
|
21
|
+
export interface IServerNetworkMiddleware {
|
|
22
|
+
name: string;
|
|
23
|
+
outputDebug: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare class ServerNetworkMiddleware extends STSOptionsBase {
|
|
26
|
+
#private;
|
|
27
|
+
constructor(options: IServerNetworkMiddleware);
|
|
28
|
+
on(eventName: ServerNetworkMiddlewareEventName, callBackFn: ServerNetworkMiddlewareEventFunc): void;
|
|
29
|
+
GetSocketRecord: (socket: Socket) => ISocketRecord | null;
|
|
30
|
+
UpdateNetworkStats: (workingSocketRecord: ISocketRecord, eventName: string, req: Request) => void;
|
|
31
|
+
Middleware: (req: Request, res: Response, next: NextFunction) => void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=serverNetworkMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverNetworkMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/serverNetworkMiddleware.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAIjC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,oBAAY,gCAAgC;IACxC,+BAA+B,oCAAoC;CACtE;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,MAAM,gCAAgC,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AAE7E,MAAM,WAAW,wBAAwB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;CACvB;AAED,qBAAa,uBAAwB,SAAQ,cAAc;;gBAO3C,OAAO,EAAE,wBAAwB;IAS7C,EAAE,CAAC,SAAS,EAAE,gCAAgC,EAAE,UAAU,EAAE,gCAAgC;IAI5F,eAAe,WAAY,MAAM,KAAG,aAAa,GAAG,IAAI,CAOvD;IAED,kBAAkB,wBAAyB,aAAa,aAAa,MAAM,OAAO,OAAO,UAoBxF;IAED,UAAU,QAAS,OAAO,OAAO,QAAQ,QAAQ,YAAY,UAqE5D;CACJ"}
|
package/types/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAO5E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAO5E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAK5C,qBAAa,gBAAgB;;gBAIb,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY;IA2GzD,IAAI,GAAG,IAAI,OAAO,CAGjB;CACJ"}
|