@nsshunt/stsappframework 3.0.87 → 3.0.89
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 +67 -33
- package/dist/middleware/serverNetworkMiddleware.js.map +1 -1
- package/dist/testing/appsolo.js +2 -0
- package/dist/testing/appsolo.js.map +1 -1
- package/package.json +5 -1
- package/src/middleware/serverNetworkMiddleware.ts +70 -34
- package/src/testing/appsolo.ts +7 -0
- package/tsconfig.json +1 -0
- package/types/middleware/serverNetworkMiddleware.d.ts.map +1 -1
- package/types/testing/appsolo.d.ts.map +1 -1
|
@@ -4,11 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ServerNetworkMiddleware = exports.ServerNetworkMiddlewareEventName = void 0;
|
|
7
|
+
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk")); // Note: Do NOT upgrade beyond 4.1.2 as the ESM version (5.0.0+) breaks this entire codebase
|
|
7
9
|
const tiny_emitter_1 = require("tiny-emitter");
|
|
8
10
|
const debug_1 = __importDefault(require("debug"));
|
|
9
11
|
const stsutils_1 = require("@nsshunt/stsutils");
|
|
10
12
|
const debug = (0, debug_1.default)(`proc:${process.pid}`);
|
|
11
13
|
const uuid_1 = require("uuid");
|
|
14
|
+
const on_headers_1 = __importDefault(require("on-headers"));
|
|
12
15
|
var ServerNetworkMiddlewareEventName;
|
|
13
16
|
(function (ServerNetworkMiddlewareEventName) {
|
|
14
17
|
ServerNetworkMiddlewareEventName["UpdateInstrument_SERVER_NET_VAL"] = "UpdateInstrument_SERVER_NET_VAL"; // request net stats
|
|
@@ -45,15 +48,33 @@ class ServerNetworkMiddleware extends stsutils_1.STSOptionsBase {
|
|
|
45
48
|
workingSocketRecord.currentBytesWritten = req.socket.bytesWritten;
|
|
46
49
|
workingSocketRecord.requestBytesRead = workingSocketRecord.currentBytesRead - workingSocketRecord.lastBytesRead;
|
|
47
50
|
workingSocketRecord.requestBytesWritten = workingSocketRecord.currentBytesWritten - workingSocketRecord.lastBytesWritten;
|
|
48
|
-
//this.#debug(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]
|
|
49
|
-
//this.#debug(`totalBytesWritten: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesWritten}]
|
|
51
|
+
//this.#debug(chalk.gray(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]`));
|
|
52
|
+
//this.#debug(chalk.gray(`totalBytesWritten: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesWritten}]`));
|
|
50
53
|
const workingSocketEventRecord = { ...workingSocketRecord };
|
|
51
54
|
delete workingSocketEventRecord.socket;
|
|
52
|
-
this.#debug(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]
|
|
55
|
+
this.#debug(chalk_1.default.gray(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]`));
|
|
53
56
|
this.#tinyEmitter.emit(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, workingSocketEventRecord);
|
|
54
57
|
workingSocketRecord.lastBytesRead = workingSocketRecord.currentBytesRead;
|
|
55
58
|
workingSocketRecord.lastBytesWritten = workingSocketRecord.currentBytesWritten;
|
|
56
59
|
};
|
|
60
|
+
#GetRequestContentSize = (req) => {
|
|
61
|
+
try {
|
|
62
|
+
let contentLength = 0;
|
|
63
|
+
if (req['_contentLength']) {
|
|
64
|
+
contentLength = req['_contentLength'];
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
if (req.headers['content-length']) {
|
|
68
|
+
contentLength = parseInt(req.headers['content-length']);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return contentLength;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.#debug(chalk_1.default.red(`ServerNetworkMiddleware:#GetRequestContentSize(): Error: [${error}]`));
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
57
78
|
Middleware = (req, res, next) => {
|
|
58
79
|
let workingSocketRecord = null;
|
|
59
80
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
@@ -72,94 +93,107 @@ class ServerNetworkMiddleware extends stsutils_1.STSOptionsBase {
|
|
|
72
93
|
eventName: '',
|
|
73
94
|
};
|
|
74
95
|
this.#socketCollection[workingSocketRecord.id] = workingSocketRecord;
|
|
75
|
-
this.#debug(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
76
|
-
if (res.socket) {
|
|
77
|
-
const workingResSocketRecord = this.GetSocketRecord(res.socket);
|
|
78
|
-
if (!workingResSocketRecord) {
|
|
79
|
-
this.#debug(`Response socket is a different socket`.magenta);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
this.#debug(`Response socket is the SAME socket`.green);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
this.#debug(`No response socket`.red);
|
|
87
|
-
}
|
|
96
|
+
this.#debug(chalk_1.default.gray(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
88
97
|
workingSocketRecord.socket.on('data', () => {
|
|
89
98
|
const socketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
90
99
|
if (socketRecord) {
|
|
91
|
-
this.#debug(`Socket
|
|
100
|
+
this.#debug(chalk_1.default.gray(`Socket data event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
92
101
|
this.UpdateNetworkStats(socketRecord, 'socket_data', req);
|
|
93
|
-
this.#debug(`Socket removed from recordset: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`.gray);
|
|
94
102
|
}
|
|
95
103
|
else {
|
|
96
|
-
this.#debug(`Socket
|
|
104
|
+
this.#debug(chalk_1.default.magenta(`Socket data event: Could not find socket within recordset`));
|
|
97
105
|
}
|
|
98
106
|
});
|
|
99
107
|
workingSocketRecord.socket.on('close', () => {
|
|
100
108
|
const socketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
101
109
|
if (socketRecord) {
|
|
102
|
-
this.#debug(`Socket close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
110
|
+
this.#debug(chalk_1.default.gray(`Socket close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
103
111
|
this.UpdateNetworkStats(socketRecord, 'socket_close', req);
|
|
104
112
|
delete this.#socketCollection[socketRecord.id];
|
|
105
|
-
this.#debug(`Socket removed from recordset: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
113
|
+
this.#debug(chalk_1.default.gray(`Socket removed from recordset: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
106
114
|
}
|
|
107
115
|
else {
|
|
108
|
-
this.#debug(`Socket close event: Could not find socket within recordset
|
|
116
|
+
this.#debug(chalk_1.default.magenta(`Socket close event: Could not find socket within recordset`));
|
|
109
117
|
}
|
|
110
118
|
});
|
|
111
119
|
workingSocketRecord.socket.on('end', () => {
|
|
112
120
|
const socketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
113
121
|
if (socketRecord) {
|
|
114
|
-
this.#debug(`Socket end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
122
|
+
this.#debug(chalk_1.default.gray(`Socket end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
115
123
|
this.UpdateNetworkStats(socketRecord, 'socket_end', req);
|
|
116
124
|
}
|
|
117
125
|
else {
|
|
118
|
-
this.#debug(`Socket end event: Could not find socket within recordset
|
|
126
|
+
this.#debug(chalk_1.default.magenta(`Socket end event: Could not find socket within recordset`));
|
|
119
127
|
}
|
|
120
128
|
});
|
|
121
129
|
}
|
|
130
|
+
// The following gets the payload size from adding _contentLength or content-length to the header size.
|
|
131
|
+
// From brief observations, this appears to be about 80 bytes short from what is reported by the socket writtenBytes.
|
|
132
|
+
(0, on_headers_1.default)(res, () => {
|
|
133
|
+
let contentLength = 0;
|
|
134
|
+
if (res['_contentLength']) {
|
|
135
|
+
contentLength = res['_contentLength'];
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
if (res.hasHeader('content-length')) {
|
|
139
|
+
contentLength = parseInt(res.getHeader('content-length'));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Ensure that the client does NOT cache the response
|
|
143
|
+
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); // HTTP 1.1
|
|
144
|
+
res.setHeader('Pragma', 'no-cache'); // HTTP 1.0
|
|
145
|
+
res.setHeader('Expires', '0'); // Proxies
|
|
146
|
+
const headerLength = JSON.stringify(res.getHeaders()).length;
|
|
147
|
+
const totalSize = contentLength + headerLength;
|
|
148
|
+
this.#debug(chalk_1.default.white.bgBlue(`contentLength: [${contentLength}], headerLength: [${headerLength}], total Size: [${totalSize}]`));
|
|
149
|
+
});
|
|
150
|
+
// This event is the one where bytesWritten is generally recorded
|
|
122
151
|
req.on('end', () => {
|
|
123
152
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
124
153
|
if (socketRecord) {
|
|
125
|
-
this.#debug(`Request end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
154
|
+
this.#debug(chalk_1.default.gray(`Request end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
126
155
|
this.UpdateNetworkStats(socketRecord, 'req_end', req);
|
|
127
156
|
}
|
|
128
157
|
else {
|
|
129
|
-
this.#debug(`Request end event: Could not find socket within recordset
|
|
158
|
+
this.#debug(chalk_1.default.magenta(`Request end event: Could not find socket within recordset`));
|
|
130
159
|
}
|
|
131
160
|
});
|
|
132
161
|
req.on('close', () => {
|
|
133
162
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
134
163
|
if (socketRecord) {
|
|
135
|
-
this.#debug(`Request close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
164
|
+
this.#debug(chalk_1.default.gray(`Request close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
136
165
|
this.UpdateNetworkStats(socketRecord, 'req_close', req);
|
|
137
166
|
}
|
|
138
167
|
else {
|
|
139
|
-
this.#debug(`Request close event: Could not find socket within recordset
|
|
168
|
+
this.#debug(chalk_1.default.magenta(`Request close event: Could not find socket within recordset`));
|
|
140
169
|
}
|
|
141
170
|
});
|
|
142
|
-
/*
|
|
171
|
+
/* These methods are also available but from testing they provide no specific value add, i.e. the calculated numbers are always 0.
|
|
143
172
|
req.on('data', () => {
|
|
144
173
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
145
174
|
if (workingSocketRecord) {
|
|
146
|
-
this.#debug(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
175
|
+
this.#debug(chalk.gray(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
147
176
|
this.UpdateNetworkStats(workingSocketRecord, 'data', req);
|
|
148
177
|
} else {
|
|
149
|
-
this.#debug(`Request close event: Could not find socket within recordset
|
|
178
|
+
this.#debug(chalk.magenta(`Request close event: Could not find socket within recordset`));
|
|
150
179
|
}
|
|
151
180
|
});
|
|
152
181
|
|
|
153
182
|
req.on('readable', () => {
|
|
154
183
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
155
184
|
if (workingSocketRecord) {
|
|
156
|
-
this.#debug(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
185
|
+
this.#debug(chalk.gray(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
157
186
|
this.UpdateNetworkStats(workingSocketRecord, 'readable', req);
|
|
158
187
|
} else {
|
|
159
|
-
this.#debug(`Request close event: Could not find socket within recordset
|
|
188
|
+
this.#debug(chalk.magenta(`Request close event: Could not find socket within recordset`));
|
|
160
189
|
}
|
|
161
190
|
});
|
|
162
191
|
*/
|
|
192
|
+
const inHeadersLength = JSON.stringify(req.headers).length;
|
|
193
|
+
const inContentLength = this.#GetRequestContentSize(req);
|
|
194
|
+
const inTotal = inHeadersLength + inContentLength;
|
|
195
|
+
this.#debug(chalk_1.default.white.bgGray(`inHeadersLength: [${inHeadersLength}], inContentLength: [${inContentLength}], inTotal: [${inTotal}]`));
|
|
196
|
+
// This event is the one where bytesRead is generally recorded
|
|
163
197
|
this.UpdateNetworkStats(workingSocketRecord, 'middleware', req);
|
|
164
198
|
next();
|
|
165
199
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverNetworkMiddleware.js","sourceRoot":"","sources":["../../src/middleware/serverNetworkMiddleware.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"serverNetworkMiddleware.js","sourceRoot":"","sources":["../../src/middleware/serverNetworkMiddleware.ts"],"names":[],"mappings":"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"}
|
package/dist/testing/appsolo.js
CHANGED
|
@@ -5,12 +5,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
};
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
9
|
const oldResTx = [];
|
|
9
10
|
const oldResRx = [];
|
|
10
11
|
const newResRx = [];
|
|
11
12
|
const newResTx = [];
|
|
12
13
|
function getNetworkUsage(pidArray) {
|
|
13
14
|
try {
|
|
15
|
+
console.log(chalk_1.default.white.bgCyan.bold('Hello World'));
|
|
14
16
|
for (let i = 0; i < pidArray.length; i++) {
|
|
15
17
|
const pid = pidArray[i];
|
|
16
18
|
const filePath = `/proc/${pid}/net/dev`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appsolo.js","sourceRoot":"","sources":["../../src/testing/appsolo.ts"],"names":[],"mappings":";AAAA,wFAAwF,CAAE,UAAU;;;;;AAEpG,sDAAwB;
|
|
1
|
+
{"version":3,"file":"appsolo.js","sourceRoot":"","sources":["../../src/testing/appsolo.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.89",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "./types/index.d.ts",
|
|
@@ -56,9 +56,12 @@
|
|
|
56
56
|
"@nsshunt/stsutils": "^1.16.17",
|
|
57
57
|
"@socket.io/cluster-adapter": "^0.2.2",
|
|
58
58
|
"@socket.io/redis-streams-adapter": "^0.1.0",
|
|
59
|
+
"@types/colors": "^1.2.1",
|
|
60
|
+
"@types/on-headers": "^1.0.3",
|
|
59
61
|
"@types/pidusage": "^2.0.5",
|
|
60
62
|
"@types/tough-cookie": "^4.0.5",
|
|
61
63
|
"axios": "^1.6.2",
|
|
64
|
+
"chalk": "^4.1.2",
|
|
62
65
|
"colors": "^1.4.0",
|
|
63
66
|
"cookie-parser": "^1.4.6",
|
|
64
67
|
"cors": "^2.8.5",
|
|
@@ -70,6 +73,7 @@
|
|
|
70
73
|
"jwks-rsa": "^3.1.0",
|
|
71
74
|
"jwt-decode": "^4.0.0",
|
|
72
75
|
"kafkajs": "^2.2.4",
|
|
76
|
+
"on-headers": "^1.0.2",
|
|
73
77
|
"pidusage": "^3.0.2",
|
|
74
78
|
"prom-client": "^15.0.0",
|
|
75
79
|
"redis": "^4.6.10",
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
2
|
+
import chalk from 'chalk'; // Note: Do NOT upgrade beyond 4.1.2 as the ESM version (5.0.0+) breaks this entire codebase
|
|
2
3
|
import { Request, Response, NextFunction } from 'express'
|
|
3
4
|
import { Socket } from 'node:net'
|
|
4
5
|
import { TinyEmitter } from 'tiny-emitter';
|
|
5
6
|
|
|
6
7
|
import debugModule from 'debug'
|
|
7
8
|
import { STSOptionsBase } from '@nsshunt/stsutils';
|
|
8
|
-
import { CompareSTSInstrumentControllerPluginKey } from '@nsshunt/stspublisherserver';
|
|
9
9
|
const debug = debugModule(`proc:${process.pid}`);
|
|
10
10
|
|
|
11
11
|
import { v4 as uuidv4 } from 'uuid';
|
|
12
|
+
import onHeaders from 'on-headers';
|
|
12
13
|
|
|
13
14
|
export enum ServerNetworkMiddlewareEventName {
|
|
14
15
|
UpdateInstrument_SERVER_NET_VAL = 'UpdateInstrument_SERVER_NET_VAL' // request net stats
|
|
@@ -73,18 +74,35 @@ export class ServerNetworkMiddleware extends STSOptionsBase
|
|
|
73
74
|
workingSocketRecord.requestBytesRead = workingSocketRecord.currentBytesRead - workingSocketRecord.lastBytesRead;
|
|
74
75
|
workingSocketRecord.requestBytesWritten = workingSocketRecord.currentBytesWritten - workingSocketRecord.lastBytesWritten;
|
|
75
76
|
|
|
76
|
-
//this.#debug(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]
|
|
77
|
-
//this.#debug(`totalBytesWritten: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesWritten}]
|
|
77
|
+
//this.#debug(chalk.gray(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]`));
|
|
78
|
+
//this.#debug(chalk.gray(`totalBytesWritten: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesWritten}]`));
|
|
78
79
|
|
|
79
80
|
const workingSocketEventRecord = { ...workingSocketRecord };
|
|
80
81
|
delete (workingSocketEventRecord as any).socket;
|
|
81
|
-
this.#debug(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]
|
|
82
|
+
this.#debug(chalk.gray(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]`));
|
|
82
83
|
this.#tinyEmitter.emit(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, workingSocketEventRecord);
|
|
83
84
|
|
|
84
85
|
workingSocketRecord.lastBytesRead = workingSocketRecord.currentBytesRead;
|
|
85
86
|
workingSocketRecord.lastBytesWritten = workingSocketRecord.currentBytesWritten;
|
|
86
87
|
}
|
|
87
88
|
|
|
89
|
+
#GetRequestContentSize = (req: Request) => {
|
|
90
|
+
try {
|
|
91
|
+
let contentLength = 0;
|
|
92
|
+
if ((req as any)['_contentLength']) {
|
|
93
|
+
contentLength = (req as any)['_contentLength'];
|
|
94
|
+
} else {
|
|
95
|
+
if (req.headers['content-length']) {
|
|
96
|
+
contentLength = parseInt(req.headers['content-length'])
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return contentLength;
|
|
100
|
+
} catch (error) {
|
|
101
|
+
this.#debug(chalk.red(`ServerNetworkMiddleware:#GetRequestContentSize(): Error: [${error}]`));
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
88
106
|
Middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
89
107
|
let workingSocketRecord: ISocketRecord | null = null;
|
|
90
108
|
|
|
@@ -107,96 +125,114 @@ export class ServerNetworkMiddleware extends STSOptionsBase
|
|
|
107
125
|
|
|
108
126
|
this.#socketCollection[workingSocketRecord.id] = workingSocketRecord;
|
|
109
127
|
|
|
110
|
-
this.#debug(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
111
|
-
|
|
112
|
-
if (res.socket) {
|
|
113
|
-
const workingResSocketRecord = this.GetSocketRecord(res.socket);
|
|
114
|
-
if (!workingResSocketRecord) {
|
|
115
|
-
this.#debug(`Response socket is a different socket`.magenta);
|
|
116
|
-
} else {
|
|
117
|
-
this.#debug(`Response socket is the SAME socket`.green);
|
|
118
|
-
}
|
|
119
|
-
} else {
|
|
120
|
-
this.#debug(`No response socket`.red);
|
|
121
|
-
}
|
|
122
|
-
|
|
128
|
+
this.#debug(chalk.gray(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
123
129
|
|
|
124
130
|
workingSocketRecord.socket.on('data', () => {
|
|
125
131
|
const socketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
126
132
|
if (socketRecord) {
|
|
127
|
-
this.#debug(`Socket
|
|
133
|
+
this.#debug(chalk.gray(`Socket data event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
128
134
|
this.UpdateNetworkStats(socketRecord, 'socket_data', req);
|
|
129
|
-
this.#debug(`Socket removed from recordset: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`.gray)
|
|
130
135
|
} else {
|
|
131
|
-
this.#debug(`Socket
|
|
136
|
+
this.#debug(chalk.magenta(`Socket data event: Could not find socket within recordset`));
|
|
132
137
|
}
|
|
133
138
|
});
|
|
134
139
|
|
|
135
140
|
workingSocketRecord.socket.on('close', () => {
|
|
136
141
|
const socketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
137
142
|
if (socketRecord) {
|
|
138
|
-
this.#debug(`Socket close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
143
|
+
this.#debug(chalk.gray(`Socket close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
139
144
|
this.UpdateNetworkStats(socketRecord, 'socket_close', req);
|
|
140
145
|
delete this.#socketCollection[socketRecord.id];
|
|
141
|
-
this.#debug(`Socket removed from recordset: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
146
|
+
this.#debug(chalk.gray(`Socket removed from recordset: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
142
147
|
} else {
|
|
143
|
-
this.#debug(`Socket close event: Could not find socket within recordset
|
|
148
|
+
this.#debug(chalk.magenta(`Socket close event: Could not find socket within recordset`));
|
|
144
149
|
}
|
|
145
150
|
});
|
|
146
151
|
|
|
147
152
|
workingSocketRecord.socket.on('end', () => {
|
|
148
153
|
const socketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
149
154
|
if (socketRecord) {
|
|
150
|
-
this.#debug(`Socket end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
155
|
+
this.#debug(chalk.gray(`Socket end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
151
156
|
this.UpdateNetworkStats(socketRecord, 'socket_end', req);
|
|
152
157
|
} else {
|
|
153
|
-
this.#debug(`Socket end event: Could not find socket within recordset
|
|
158
|
+
this.#debug(chalk.magenta(`Socket end event: Could not find socket within recordset`));
|
|
154
159
|
}
|
|
155
160
|
});
|
|
156
161
|
}
|
|
157
162
|
|
|
163
|
+
// The following gets the payload size from adding _contentLength or content-length to the header size.
|
|
164
|
+
// From brief observations, this appears to be about 80 bytes short from what is reported by the socket writtenBytes.
|
|
165
|
+
onHeaders(res, () => {
|
|
166
|
+
let contentLength = 0;
|
|
167
|
+
if ((res as any)['_contentLength']) {
|
|
168
|
+
contentLength = (res as any)['_contentLength'];
|
|
169
|
+
} else {
|
|
170
|
+
if (res.hasHeader('content-length')) {
|
|
171
|
+
contentLength = parseInt(res.getHeader('content-length') as string);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Ensure that the client does NOT cache the response
|
|
176
|
+
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); // HTTP 1.1
|
|
177
|
+
res.setHeader('Pragma', 'no-cache'); // HTTP 1.0
|
|
178
|
+
res.setHeader('Expires', '0'); // Proxies
|
|
179
|
+
|
|
180
|
+
const headerLength = JSON.stringify(res.getHeaders()).length;
|
|
181
|
+
const totalSize = contentLength + headerLength;
|
|
182
|
+
|
|
183
|
+
this.#debug(chalk.white.bgBlue(`contentLength: [${contentLength}], headerLength: [${headerLength}], total Size: [${totalSize}]`));
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// This event is the one where bytesWritten is generally recorded
|
|
158
187
|
req.on('end', () => {
|
|
159
188
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
160
189
|
if (socketRecord) {
|
|
161
|
-
this.#debug(`Request end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
190
|
+
this.#debug(chalk.gray(`Request end event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`))
|
|
162
191
|
this.UpdateNetworkStats(socketRecord, 'req_end', req);
|
|
163
192
|
} else {
|
|
164
|
-
this.#debug(`Request end event: Could not find socket within recordset
|
|
193
|
+
this.#debug(chalk.magenta(`Request end event: Could not find socket within recordset`));
|
|
165
194
|
}
|
|
166
195
|
});
|
|
167
196
|
|
|
168
197
|
req.on('close', () => {
|
|
169
198
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
170
199
|
if (socketRecord) {
|
|
171
|
-
this.#debug(`Request close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
200
|
+
this.#debug(chalk.gray(`Request close event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
172
201
|
this.UpdateNetworkStats(socketRecord, 'req_close', req);
|
|
173
202
|
} else {
|
|
174
|
-
this.#debug(`Request close event: Could not find socket within recordset
|
|
203
|
+
this.#debug(chalk.magenta(`Request close event: Could not find socket within recordset`));
|
|
175
204
|
}
|
|
176
205
|
});
|
|
177
206
|
|
|
178
|
-
/*
|
|
207
|
+
/* These methods are also available but from testing they provide no specific value add, i.e. the calculated numbers are always 0.
|
|
179
208
|
req.on('data', () => {
|
|
180
209
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
181
210
|
if (workingSocketRecord) {
|
|
182
|
-
this.#debug(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
211
|
+
this.#debug(chalk.gray(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
183
212
|
this.UpdateNetworkStats(workingSocketRecord, 'data', req);
|
|
184
213
|
} else {
|
|
185
|
-
this.#debug(`Request close event: Could not find socket within recordset
|
|
214
|
+
this.#debug(chalk.magenta(`Request close event: Could not find socket within recordset`));
|
|
186
215
|
}
|
|
187
216
|
});
|
|
188
217
|
|
|
189
218
|
req.on('readable', () => {
|
|
190
219
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
191
220
|
if (workingSocketRecord) {
|
|
192
|
-
this.#debug(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
221
|
+
this.#debug(chalk.gray(`Request close event: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
193
222
|
this.UpdateNetworkStats(workingSocketRecord, 'readable', req);
|
|
194
223
|
} else {
|
|
195
|
-
this.#debug(`Request close event: Could not find socket within recordset
|
|
224
|
+
this.#debug(chalk.magenta(`Request close event: Could not find socket within recordset`));
|
|
196
225
|
}
|
|
197
226
|
});
|
|
198
227
|
*/
|
|
199
228
|
|
|
229
|
+
const inHeadersLength = JSON.stringify(req.headers).length;
|
|
230
|
+
const inContentLength = this.#GetRequestContentSize(req);
|
|
231
|
+
const inTotal = inHeadersLength + inContentLength;
|
|
232
|
+
|
|
233
|
+
this.#debug(chalk.white.bgGray(`inHeadersLength: [${inHeadersLength}], inContentLength: [${inContentLength}], inTotal: [${inTotal}]`));
|
|
234
|
+
|
|
235
|
+
// This event is the one where bytesRead is generally recorded
|
|
200
236
|
this.UpdateNetworkStats(workingSocketRecord, 'middleware', req);
|
|
201
237
|
|
|
202
238
|
next();
|
package/src/testing/appsolo.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
|
|
2
2
|
|
|
3
3
|
import fs from 'node:fs'
|
|
4
|
+
import chalk from 'chalk';
|
|
4
5
|
|
|
5
6
|
const oldResTx: number[] = []
|
|
6
7
|
const oldResRx: number[] = []
|
|
@@ -11,6 +12,8 @@ const newResTx: number[] = []
|
|
|
11
12
|
function getNetworkUsage(pidArray: number[]) {
|
|
12
13
|
try {
|
|
13
14
|
|
|
15
|
+
console.log(chalk.white.bgCyan.bold('Hello World'));
|
|
16
|
+
|
|
14
17
|
for (let i=0; i < pidArray.length; i++) {
|
|
15
18
|
|
|
16
19
|
const pid = pidArray[i];
|
|
@@ -84,3 +87,7 @@ setInterval(function() {
|
|
|
84
87
|
//getNetworkUsage()
|
|
85
88
|
|
|
86
89
|
}, 1000)
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
|
|
93
|
+
}
|
package/tsconfig.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverNetworkMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/serverNetworkMiddleware.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"serverNetworkMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/serverNetworkMiddleware.ts"],"names":[],"mappings":";AAEA,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;AAMnD,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;IAmBD,UAAU,QAAS,OAAO,OAAO,QAAQ,QAAQ,YAAY,UAqI5D;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appsolo.d.ts","sourceRoot":"","sources":["../../src/testing/appsolo.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"appsolo.d.ts","sourceRoot":"","sources":["../../src/testing/appsolo.ts"],"names":[],"mappings":";AA0FA,OAAO,EAEN,CAAA"}
|