@nsshunt/stsappframework 3.0.88 → 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 +64 -21
- 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 +3 -1
- package/src/middleware/serverNetworkMiddleware.ts +66 -22
- 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,6 +4,8 @@ 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");
|
|
@@ -46,15 +48,33 @@ class ServerNetworkMiddleware extends stsutils_1.STSOptionsBase {
|
|
|
46
48
|
workingSocketRecord.currentBytesWritten = req.socket.bytesWritten;
|
|
47
49
|
workingSocketRecord.requestBytesRead = workingSocketRecord.currentBytesRead - workingSocketRecord.lastBytesRead;
|
|
48
50
|
workingSocketRecord.requestBytesWritten = workingSocketRecord.currentBytesWritten - workingSocketRecord.lastBytesWritten;
|
|
49
|
-
//this.#debug(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]
|
|
50
|
-
//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}]`));
|
|
51
53
|
const workingSocketEventRecord = { ...workingSocketRecord };
|
|
52
54
|
delete workingSocketEventRecord.socket;
|
|
53
|
-
this.#debug(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]
|
|
55
|
+
this.#debug(chalk_1.default.gray(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]`));
|
|
54
56
|
this.#tinyEmitter.emit(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, workingSocketEventRecord);
|
|
55
57
|
workingSocketRecord.lastBytesRead = workingSocketRecord.currentBytesRead;
|
|
56
58
|
workingSocketRecord.lastBytesWritten = workingSocketRecord.currentBytesWritten;
|
|
57
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
|
+
};
|
|
58
78
|
Middleware = (req, res, next) => {
|
|
59
79
|
let workingSocketRecord = null;
|
|
60
80
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
@@ -73,84 +93,107 @@ class ServerNetworkMiddleware extends stsutils_1.STSOptionsBase {
|
|
|
73
93
|
eventName: '',
|
|
74
94
|
};
|
|
75
95
|
this.#socketCollection[workingSocketRecord.id] = workingSocketRecord;
|
|
76
|
-
this.#debug(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
96
|
+
this.#debug(chalk_1.default.gray(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
77
97
|
workingSocketRecord.socket.on('data', () => {
|
|
78
98
|
const socketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
79
99
|
if (socketRecord) {
|
|
80
|
-
this.#debug(`Socket data event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
100
|
+
this.#debug(chalk_1.default.gray(`Socket data event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
81
101
|
this.UpdateNetworkStats(socketRecord, 'socket_data', req);
|
|
82
102
|
}
|
|
83
103
|
else {
|
|
84
|
-
this.#debug(`Socket data event: Could not find socket within recordset
|
|
104
|
+
this.#debug(chalk_1.default.magenta(`Socket data event: Could not find socket within recordset`));
|
|
85
105
|
}
|
|
86
106
|
});
|
|
87
107
|
workingSocketRecord.socket.on('close', () => {
|
|
88
108
|
const socketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
89
109
|
if (socketRecord) {
|
|
90
|
-
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}]`));
|
|
91
111
|
this.UpdateNetworkStats(socketRecord, 'socket_close', req);
|
|
92
112
|
delete this.#socketCollection[socketRecord.id];
|
|
93
|
-
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}]`));
|
|
94
114
|
}
|
|
95
115
|
else {
|
|
96
|
-
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`));
|
|
97
117
|
}
|
|
98
118
|
});
|
|
99
119
|
workingSocketRecord.socket.on('end', () => {
|
|
100
120
|
const socketRecord = this.GetSocketRecord(workingSocketRecord.socket);
|
|
101
121
|
if (socketRecord) {
|
|
102
|
-
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}]`));
|
|
103
123
|
this.UpdateNetworkStats(socketRecord, 'socket_end', req);
|
|
104
124
|
}
|
|
105
125
|
else {
|
|
106
|
-
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`));
|
|
107
127
|
}
|
|
108
128
|
});
|
|
109
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.
|
|
110
132
|
(0, on_headers_1.default)(res, () => {
|
|
111
|
-
|
|
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}]`));
|
|
112
149
|
});
|
|
150
|
+
// This event is the one where bytesWritten is generally recorded
|
|
113
151
|
req.on('end', () => {
|
|
114
152
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
115
153
|
if (socketRecord) {
|
|
116
|
-
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}]`));
|
|
117
155
|
this.UpdateNetworkStats(socketRecord, 'req_end', req);
|
|
118
156
|
}
|
|
119
157
|
else {
|
|
120
|
-
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`));
|
|
121
159
|
}
|
|
122
160
|
});
|
|
123
161
|
req.on('close', () => {
|
|
124
162
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
125
163
|
if (socketRecord) {
|
|
126
|
-
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}]`));
|
|
127
165
|
this.UpdateNetworkStats(socketRecord, 'req_close', req);
|
|
128
166
|
}
|
|
129
167
|
else {
|
|
130
|
-
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`));
|
|
131
169
|
}
|
|
132
170
|
});
|
|
133
|
-
/*
|
|
171
|
+
/* These methods are also available but from testing they provide no specific value add, i.e. the calculated numbers are always 0.
|
|
134
172
|
req.on('data', () => {
|
|
135
173
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
136
174
|
if (workingSocketRecord) {
|
|
137
|
-
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}]`));
|
|
138
176
|
this.UpdateNetworkStats(workingSocketRecord, 'data', req);
|
|
139
177
|
} else {
|
|
140
|
-
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`));
|
|
141
179
|
}
|
|
142
180
|
});
|
|
143
181
|
|
|
144
182
|
req.on('readable', () => {
|
|
145
183
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
146
184
|
if (workingSocketRecord) {
|
|
147
|
-
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}]`));
|
|
148
186
|
this.UpdateNetworkStats(workingSocketRecord, 'readable', req);
|
|
149
187
|
} else {
|
|
150
|
-
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`));
|
|
151
189
|
}
|
|
152
190
|
});
|
|
153
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
|
|
154
197
|
this.UpdateNetworkStats(workingSocketRecord, 'middleware', req);
|
|
155
198
|
next();
|
|
156
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,10 +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",
|
|
59
60
|
"@types/on-headers": "^1.0.3",
|
|
60
61
|
"@types/pidusage": "^2.0.5",
|
|
61
62
|
"@types/tough-cookie": "^4.0.5",
|
|
62
63
|
"axios": "^1.6.2",
|
|
64
|
+
"chalk": "^4.1.2",
|
|
63
65
|
"colors": "^1.4.0",
|
|
64
66
|
"cookie-parser": "^1.4.6",
|
|
65
67
|
"cors": "^2.8.5",
|
|
@@ -1,11 +1,11 @@
|
|
|
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';
|
|
@@ -74,18 +74,35 @@ export class ServerNetworkMiddleware extends STSOptionsBase
|
|
|
74
74
|
workingSocketRecord.requestBytesRead = workingSocketRecord.currentBytesRead - workingSocketRecord.lastBytesRead;
|
|
75
75
|
workingSocketRecord.requestBytesWritten = workingSocketRecord.currentBytesWritten - workingSocketRecord.lastBytesWritten;
|
|
76
76
|
|
|
77
|
-
//this.#debug(`totalBytesRead: [${workingSocketRecord.id}] [${workingSocketRecord.originalUrl}] [${eventName}] [${workingSocketRecord.requestBytesRead}]
|
|
78
|
-
//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}]`));
|
|
79
79
|
|
|
80
80
|
const workingSocketEventRecord = { ...workingSocketRecord };
|
|
81
81
|
delete (workingSocketEventRecord as any).socket;
|
|
82
|
-
this.#debug(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]
|
|
82
|
+
this.#debug(chalk.gray(`Sending event: [${JSON.stringify(workingSocketEventRecord)}]`));
|
|
83
83
|
this.#tinyEmitter.emit(ServerNetworkMiddlewareEventName.UpdateInstrument_SERVER_NET_VAL, workingSocketEventRecord);
|
|
84
84
|
|
|
85
85
|
workingSocketRecord.lastBytesRead = workingSocketRecord.currentBytesRead;
|
|
86
86
|
workingSocketRecord.lastBytesWritten = workingSocketRecord.currentBytesWritten;
|
|
87
87
|
}
|
|
88
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
|
+
|
|
89
106
|
Middleware = (req: Request, res: Response, next: NextFunction) => {
|
|
90
107
|
let workingSocketRecord: ISocketRecord | null = null;
|
|
91
108
|
|
|
@@ -108,87 +125,114 @@ export class ServerNetworkMiddleware extends STSOptionsBase
|
|
|
108
125
|
|
|
109
126
|
this.#socketCollection[workingSocketRecord.id] = workingSocketRecord;
|
|
110
127
|
|
|
111
|
-
this.#debug(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]
|
|
128
|
+
this.#debug(chalk.gray(`Adding new socket to recordset: ID: [${workingSocketRecord.id}], originalUrl: [${workingSocketRecord.originalUrl}]`));
|
|
112
129
|
|
|
113
130
|
workingSocketRecord.socket.on('data', () => {
|
|
114
131
|
const socketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
115
132
|
if (socketRecord) {
|
|
116
|
-
this.#debug(`Socket data event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]
|
|
133
|
+
this.#debug(chalk.gray(`Socket data event: ID: [${socketRecord.id}], originalUrl: [${socketRecord.originalUrl}]`));
|
|
117
134
|
this.UpdateNetworkStats(socketRecord, 'socket_data', req);
|
|
118
135
|
} else {
|
|
119
|
-
this.#debug(`Socket data event: Could not find socket within recordset
|
|
136
|
+
this.#debug(chalk.magenta(`Socket data event: Could not find socket within recordset`));
|
|
120
137
|
}
|
|
121
138
|
});
|
|
122
139
|
|
|
123
140
|
workingSocketRecord.socket.on('close', () => {
|
|
124
141
|
const socketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
125
142
|
if (socketRecord) {
|
|
126
|
-
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}]`));
|
|
127
144
|
this.UpdateNetworkStats(socketRecord, 'socket_close', req);
|
|
128
145
|
delete this.#socketCollection[socketRecord.id];
|
|
129
|
-
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}]`));
|
|
130
147
|
} else {
|
|
131
|
-
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`));
|
|
132
149
|
}
|
|
133
150
|
});
|
|
134
151
|
|
|
135
152
|
workingSocketRecord.socket.on('end', () => {
|
|
136
153
|
const socketRecord = this.GetSocketRecord((workingSocketRecord as ISocketRecord).socket);
|
|
137
154
|
if (socketRecord) {
|
|
138
|
-
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}]`));
|
|
139
156
|
this.UpdateNetworkStats(socketRecord, 'socket_end', req);
|
|
140
157
|
} else {
|
|
141
|
-
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`));
|
|
142
159
|
}
|
|
143
160
|
});
|
|
144
161
|
}
|
|
145
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.
|
|
146
165
|
onHeaders(res, () => {
|
|
147
|
-
|
|
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}]`));
|
|
148
184
|
});
|
|
149
185
|
|
|
186
|
+
// This event is the one where bytesWritten is generally recorded
|
|
150
187
|
req.on('end', () => {
|
|
151
188
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
152
189
|
if (socketRecord) {
|
|
153
|
-
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}]`))
|
|
154
191
|
this.UpdateNetworkStats(socketRecord, 'req_end', req);
|
|
155
192
|
} else {
|
|
156
|
-
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`));
|
|
157
194
|
}
|
|
158
195
|
});
|
|
159
196
|
|
|
160
197
|
req.on('close', () => {
|
|
161
198
|
const socketRecord = this.GetSocketRecord(req.socket);
|
|
162
199
|
if (socketRecord) {
|
|
163
|
-
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}]`));
|
|
164
201
|
this.UpdateNetworkStats(socketRecord, 'req_close', req);
|
|
165
202
|
} else {
|
|
166
|
-
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`));
|
|
167
204
|
}
|
|
168
205
|
});
|
|
169
206
|
|
|
170
|
-
/*
|
|
207
|
+
/* These methods are also available but from testing they provide no specific value add, i.e. the calculated numbers are always 0.
|
|
171
208
|
req.on('data', () => {
|
|
172
209
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
173
210
|
if (workingSocketRecord) {
|
|
174
|
-
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}]`));
|
|
175
212
|
this.UpdateNetworkStats(workingSocketRecord, 'data', req);
|
|
176
213
|
} else {
|
|
177
|
-
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`));
|
|
178
215
|
}
|
|
179
216
|
});
|
|
180
217
|
|
|
181
218
|
req.on('readable', () => {
|
|
182
219
|
workingSocketRecord = this.GetSocketRecord(req.socket);
|
|
183
220
|
if (workingSocketRecord) {
|
|
184
|
-
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}]`));
|
|
185
222
|
this.UpdateNetworkStats(workingSocketRecord, 'readable', req);
|
|
186
223
|
} else {
|
|
187
|
-
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`));
|
|
188
225
|
}
|
|
189
226
|
});
|
|
190
227
|
*/
|
|
191
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
|
|
192
236
|
this.UpdateNetworkStats(workingSocketRecord, 'middleware', req);
|
|
193
237
|
|
|
194
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"}
|