@nsshunt/stsappframework 3.0.72 → 3.0.73

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.
@@ -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(async (err, req, res, next) => {
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
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.72",
3
+ "version": "3.0.73",
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.32",
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, IRequestNetStats } from '@nsshunt/stspublisherserver'
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(async (err: any, req: Request, res: Response, next: NextFunction) => {
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"}
@@ -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;AAI5C,qBAAa,gBAAgB;;gBAMb,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY;IAkIzD,IAAI,GAAG,IAAI,OAAO,CAGjB;CACJ"}
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"}