node-pluginsmanager-plugin 6.5.0 → 7.0.1
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/LICENSE +13 -13
- package/README.md +53 -48
- package/lib/@types/socket.io-v2.d.ts +988 -0
- package/lib/cjs/checkers/RangeError/checkNonEmptyNumber.d.ts +2 -2
- package/lib/cjs/checkers/RangeError/checkNonEmptyObject.d.ts +2 -2
- package/lib/cjs/checkers/RangeError/checkNonEmptyString.d.ts +2 -2
- package/lib/cjs/checkers/ReferenceError/checkExists.d.ts +2 -2
- package/lib/cjs/checkers/TypeError/checkFunction.d.ts +2 -2
- package/lib/cjs/checkers/TypeError/checkInteger.d.ts +2 -2
- package/lib/cjs/checkers/TypeError/checkNumber.d.ts +2 -2
- package/lib/cjs/checkers/TypeError/checkObject.d.ts +2 -2
- package/lib/cjs/checkers/TypeError/checkString.d.ts +2 -2
- package/lib/cjs/components/DescriptorUser.d.ts +10 -11
- package/lib/cjs/components/DescriptorUser.js +51 -40
- package/lib/cjs/components/Mediator.d.ts +12 -17
- package/lib/cjs/components/Mediator.js +59 -39
- package/lib/cjs/components/MediatorUser.d.ts +2 -2
- package/lib/cjs/components/MediatorUser.js +12 -5
- package/lib/cjs/components/Orchestrator.d.ts +13 -13
- package/lib/cjs/components/Orchestrator.js +123 -69
- package/lib/cjs/components/Server.d.ts +22 -19
- package/lib/cjs/components/Server.js +279 -238
- package/lib/cjs/main.cjs +1 -40
- package/lib/cjs/main.d.cts +3 -15
- package/lib/cjs/openAPITypes.d.ts +5 -0
- package/lib/cjs/openAPITypes.js +3 -0
- package/lib/cjs/utils/cleanSendedError.d.ts +1 -1
- package/lib/cjs/utils/cleanSendedError.js +2 -4
- package/lib/cjs/utils/descriptor/extractParams.d.ts +1 -1
- package/lib/cjs/utils/descriptor/extractParams.js +1 -1
- package/lib/cjs/utils/descriptor/extractPathMethodByOperationId.d.ts +2 -3
- package/lib/cjs/utils/descriptor/extractPathMethodByOperationId.js +14 -14
- package/lib/cjs/utils/descriptor/extractPattern.d.ts +2 -2
- package/lib/cjs/utils/descriptor/extractPattern.js +5 -5
- package/lib/cjs/utils/descriptor/extractSchemaType.d.ts +1 -1
- package/lib/cjs/utils/descriptor/extractSchemaType.js +13 -8
- package/lib/cjs/utils/file/readJSONFile.d.ts +1 -1
- package/lib/cjs/utils/request/extractBody.js +9 -5
- package/lib/cjs/utils/request/extractCookies.d.ts +1 -1
- package/lib/cjs/utils/request/extractCookies.js +6 -6
- package/lib/cjs/utils/request/extractIp.d.ts +1 -1
- package/lib/cjs/utils/request/extractIp.js +19 -10
- package/lib/cjs/utils/request/extractMime.d.ts +1 -4
- package/lib/cjs/utils/request/extractMime.js +15 -11
- package/lib/cjs/utils/send.d.ts +4 -4
- package/lib/cjs/utils/send.js +27 -29
- package/lib/cjs/utils/server/getServerTypeFromServer.d.ts +4 -0
- package/lib/cjs/utils/server/getServerTypeFromServer.js +23 -0
- package/lib/cjs/utils/server/getSocketIOVersionFromServer.d.ts +4 -0
- package/lib/cjs/utils/server/getSocketIOVersionFromServer.js +19 -0
- package/package.json +101 -97
- package/lib/cjs/checkers/RangeError/checkArrayLength.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkArrayLength.js +0 -23
- package/lib/cjs/checkers/RangeError/checkArrayLengthBetween.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkArrayLengthBetween.js +0 -30
- package/lib/cjs/checkers/RangeError/checkIntegerBetween.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkIntegerBetween.js +0 -29
- package/lib/cjs/checkers/RangeError/checkNonEmptyArray.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkNonEmptyArray.js +0 -19
- package/lib/cjs/checkers/RangeError/checkNonEmptyInteger.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkNonEmptyInteger.js +0 -19
- package/lib/cjs/checkers/RangeError/checkNumberBetween.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkNumberBetween.js +0 -29
- package/lib/cjs/checkers/RangeError/checkObjectLength.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkObjectLength.js +0 -28
- package/lib/cjs/checkers/RangeError/checkObjectLengthBetween.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkObjectLengthBetween.js +0 -33
- package/lib/cjs/checkers/RangeError/checkStringLength.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkStringLength.js +0 -23
- package/lib/cjs/checkers/RangeError/checkStringLengthBetween.d.ts +0 -2
- package/lib/cjs/checkers/RangeError/checkStringLengthBetween.js +0 -30
- package/lib/cjs/checkers/TypeError/checkArray.d.ts +0 -2
- package/lib/cjs/checkers/TypeError/checkArray.js +0 -19
- package/lib/cjs/checkers/TypeError/checkBoolean.d.ts +0 -2
- package/lib/cjs/checkers/TypeError/checkBoolean.js +0 -19
- package/lib/cjs/utils/jsonParser.d.ts +0 -1
- package/lib/cjs/utils/jsonParser.js +0 -16
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
/*
|
|
3
|
+
eslint-disable camelcase
|
|
4
|
+
*/
|
|
5
|
+
// => camelcase is disabled because of "openapi-types" types
|
|
3
6
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
8
|
};
|
|
6
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
// deps
|
|
11
|
+
// natives
|
|
7
12
|
const node_os_1 = require("node:os");
|
|
8
13
|
const node_url_1 = require("node:url");
|
|
9
14
|
// externals
|
|
@@ -19,7 +24,6 @@ const extractBody_1 = __importDefault(require("../utils/request/extractBody"));
|
|
|
19
24
|
const extractIp_1 = __importDefault(require("../utils/request/extractIp"));
|
|
20
25
|
const extractCookies_1 = __importDefault(require("../utils/request/extractCookies"));
|
|
21
26
|
const extractMime_1 = __importDefault(require("../utils/request/extractMime"));
|
|
22
|
-
const jsonParser_1 = __importDefault(require("../utils/jsonParser"));
|
|
23
27
|
const send_1 = __importDefault(require("../utils/send"));
|
|
24
28
|
const cleanSendedError_1 = __importDefault(require("../utils/cleanSendedError"));
|
|
25
29
|
const MediatorUser_1 = __importDefault(require("./MediatorUser"));
|
|
@@ -27,11 +31,19 @@ const UnauthorizedError_1 = __importDefault(require("./errors/UnauthorizedError"
|
|
|
27
31
|
const NotFoundError_1 = __importDefault(require("./errors/NotFoundError"));
|
|
28
32
|
const LockedError_1 = __importDefault(require("./errors/LockedError"));
|
|
29
33
|
const serverCodes_1 = __importDefault(require("../utils/serverCodes"));
|
|
34
|
+
const getServerTypeFromServer_1 = __importDefault(require("../utils/server/getServerTypeFromServer"));
|
|
35
|
+
const getSocketIOVersionFromServer_1 = __importDefault(require("../utils/server/getSocketIOVersionFromServer"));
|
|
30
36
|
// consts
|
|
31
37
|
const WEBSOCKET_STATE_OPEN = 1;
|
|
32
38
|
// module
|
|
33
|
-
// Please note the fact that "init" and "release" method MUST NOT be re-
|
|
39
|
+
// Please note the fact that "init" and "release" method MUST NOT be re-written. Each child has its own init logic.
|
|
34
40
|
class Server extends MediatorUser_1.default {
|
|
41
|
+
// attributes
|
|
42
|
+
// protected
|
|
43
|
+
_socketServer;
|
|
44
|
+
_checkParameters;
|
|
45
|
+
_checkResponse;
|
|
46
|
+
_cors;
|
|
35
47
|
// constructor
|
|
36
48
|
constructor(opt) {
|
|
37
49
|
super(opt);
|
|
@@ -41,37 +53,34 @@ class Server extends MediatorUser_1.default {
|
|
|
41
53
|
this._cors = false;
|
|
42
54
|
}
|
|
43
55
|
// protected
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return "WEBSOCKET";
|
|
50
|
-
}
|
|
51
|
-
else if (this._socketServer.sockets && "function" === typeof this._socketServer.sockets.emit) {
|
|
52
|
-
return "SOCKETIO";
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
return "UNKNOWN";
|
|
56
|
-
}
|
|
56
|
+
_getServerType() {
|
|
57
|
+
return (0, getServerTypeFromServer_1.default)(this._socketServer);
|
|
58
|
+
}
|
|
59
|
+
_getSocketIOVersion() {
|
|
60
|
+
return (0, getSocketIOVersionFromServer_1.default)(this._socketServer);
|
|
57
61
|
}
|
|
58
62
|
_getUsableSocketIOClient(clientId) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
for (const key in
|
|
63
|
+
if ("SOCKETIO" === this._getServerType()) {
|
|
64
|
+
const socketIOVersion = this._getSocketIOVersion();
|
|
65
|
+
if ("V2" === socketIOVersion) {
|
|
66
|
+
const { sockets } = this._socketServer.sockets;
|
|
67
|
+
for (const key in sockets) {
|
|
64
68
|
if (key === clientId) {
|
|
65
|
-
|
|
69
|
+
if (sockets[key].connected) {
|
|
70
|
+
return sockets[key];
|
|
71
|
+
}
|
|
66
72
|
break;
|
|
67
73
|
}
|
|
68
74
|
}
|
|
69
75
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
if ("V3-V4" === socketIOVersion) {
|
|
77
|
+
const { sockets } = this._socketServer.sockets;
|
|
78
|
+
if (sockets.has(clientId)) {
|
|
79
|
+
const result = sockets.get(clientId);
|
|
80
|
+
if (true === result?.connected) { // force boolean comparison to avoid lint errors with "?"
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
75
84
|
}
|
|
76
85
|
}
|
|
77
86
|
return undefined;
|
|
@@ -102,18 +111,22 @@ class Server extends MediatorUser_1.default {
|
|
|
102
111
|
return this;
|
|
103
112
|
}
|
|
104
113
|
appMiddleware(_req, res, next) {
|
|
105
|
-
if (!this._Descriptor) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (!this._Descriptor.paths) {
|
|
109
|
-
return next();
|
|
114
|
+
if (!this._Descriptor?.paths) {
|
|
115
|
+
next();
|
|
116
|
+
return;
|
|
110
117
|
}
|
|
111
118
|
this.checkDescriptor().then(() => {
|
|
112
|
-
var _a, _b, _c;
|
|
113
119
|
const req = Object.assign(_req);
|
|
120
|
+
if ("undefined" === typeof req.url) {
|
|
121
|
+
return next();
|
|
122
|
+
}
|
|
114
123
|
// parse
|
|
115
|
-
const { pathname,
|
|
116
|
-
|
|
124
|
+
const { pathname, searchParams } = new node_url_1.URL(req.url, "http://localhost"); // any url, but "http://localhost" is used to avoid errors
|
|
125
|
+
const query = Object.fromEntries(searchParams);
|
|
126
|
+
if (0 >= pathname.length) {
|
|
127
|
+
return next();
|
|
128
|
+
}
|
|
129
|
+
req.method = "string" === typeof _req.method ? _req.method.toLowerCase() : "get";
|
|
117
130
|
req.pattern = null === (0, checkNonEmptyString_1.checkNonEmptyStringSync)("pattern", req.pattern) ? req.pattern : (0, extractPattern_1.default)(this._Descriptor.paths, pathname, req.method);
|
|
118
131
|
if (0 >= req.pattern.length) {
|
|
119
132
|
return next();
|
|
@@ -121,13 +134,17 @@ class Server extends MediatorUser_1.default {
|
|
|
121
134
|
// extract specific data
|
|
122
135
|
try {
|
|
123
136
|
// workaround for express 5
|
|
124
|
-
if (Object.getPrototypeOf(req)
|
|
125
|
-
Object.defineProperty(req, "query",
|
|
137
|
+
if ("app" in Object.getPrototypeOf(req)) {
|
|
138
|
+
Object.defineProperty(req, "query", {
|
|
139
|
+
...Object.getOwnPropertyDescriptor(req, "query"),
|
|
140
|
+
"value": req.query,
|
|
141
|
+
"writable": true
|
|
142
|
+
});
|
|
126
143
|
}
|
|
127
144
|
req.validatedIp = null === (0, checkNonEmptyString_1.checkNonEmptyStringSync)("ip", req.validatedIp) ? req.validatedIp : (0, extractIp_1.default)(req);
|
|
128
145
|
// url
|
|
129
146
|
req.params = null === (0, checkNonEmptyObject_1.checkNonEmptyObjectSync)("params", req.params) ? req.params : (0, extractParams_1.default)(req.pattern, pathname);
|
|
130
|
-
req.query = null === (0, checkNonEmptyObject_1.checkNonEmptyObjectSync)("query", req.query) ? req.query : query
|
|
147
|
+
req.query = null === (0, checkNonEmptyObject_1.checkNonEmptyObjectSync)("query", req.query) ? req.query : query;
|
|
131
148
|
if (null !== (0, checkNonEmptyObject_1.checkNonEmptyObjectSync)("headers", req.headers)) {
|
|
132
149
|
req.headers = null === (0, checkNonEmptyObject_1.checkNonEmptyObjectSync)("header", req.header) ? req.header : {};
|
|
133
150
|
}
|
|
@@ -136,34 +153,43 @@ class Server extends MediatorUser_1.default {
|
|
|
136
153
|
}
|
|
137
154
|
// ensure content length formate
|
|
138
155
|
if ("undefined" === typeof req.headers["content-length"]) {
|
|
139
|
-
req.headers["content-length"] = 0;
|
|
156
|
+
req.headers["content-length"] = "0";
|
|
140
157
|
}
|
|
141
|
-
else if ("
|
|
142
|
-
req.headers["content-length"] =
|
|
158
|
+
else if ("number" === typeof req.headers["content-length"]) {
|
|
159
|
+
req.headers["content-length"] = String(req.headers["content-length"]);
|
|
143
160
|
}
|
|
144
161
|
}
|
|
145
162
|
catch (e) {
|
|
146
163
|
return next(e);
|
|
147
164
|
}
|
|
148
|
-
|
|
165
|
+
const { paths } = this._Descriptor;
|
|
166
|
+
// enforce with try to avoid unexpected (data are theoretically validated by types, but can be wrong in practice, like with pure JS dev)
|
|
167
|
+
try {
|
|
168
|
+
if (!paths[req.pattern][req.method]) {
|
|
169
|
+
return next();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
149
173
|
return next();
|
|
150
174
|
}
|
|
151
|
-
const
|
|
175
|
+
const operation = paths[req.pattern][req.method];
|
|
176
|
+
const { operationId } = operation; // operationId is "any", had to specify the type to avoid lint errors
|
|
152
177
|
const apiVersion = this._Descriptor.info.version;
|
|
153
|
-
const contentType =
|
|
154
|
-
const responses =
|
|
178
|
+
const contentType = req.headers["content-type"] ?? req.headers["Content-Type"] ?? "";
|
|
179
|
+
const { responses } = operation; // response is "any", had to specify the type to avoid lint errors
|
|
180
|
+
const contentLengthParsed = Number.parseInt(req.headers["content-length"], 10);
|
|
155
181
|
this._log("info", ""
|
|
156
182
|
+ "=> [" + req.validatedIp + "] " + req.url + " (" + req.method.toUpperCase() + ")"
|
|
157
|
-
+ (operationId ? node_os_1.EOL + "operationId : " + operationId : "")
|
|
158
|
-
+ (req.headers["content-type"] ? node_os_1.EOL + "content-type : " + req.headers["content-type"] : "")
|
|
159
|
-
+ ("get" !== req.method &&
|
|
183
|
+
+ ("undefined" !== typeof operationId ? node_os_1.EOL + "operationId : " + operationId : "")
|
|
184
|
+
+ ("undefined" !== typeof req.headers["content-type"] ? node_os_1.EOL + "content-type : " + req.headers["content-type"] : "")
|
|
185
|
+
+ ("get" !== req.method && !Number.isNaN(contentLengthParsed) && 4 < contentLengthParsed
|
|
160
186
|
? node_os_1.EOL + "content-length : " + req.headers["content-length"]
|
|
161
187
|
: ""));
|
|
162
188
|
// get descriptor
|
|
163
189
|
if ("/" + this._Descriptor.info.title + "/api/descriptor" === req.pattern && "get" === req.method) {
|
|
164
190
|
// add current server
|
|
165
|
-
const port = res.socket
|
|
166
|
-
const descriptor =
|
|
191
|
+
const port = res.socket?.localPort ?? (res.socket?.address()).port;
|
|
192
|
+
const descriptor = { ...this._Descriptor };
|
|
167
193
|
descriptor.servers.push({
|
|
168
194
|
"url": req.validatedIp + ":" + port,
|
|
169
195
|
"description": "Actual current server"
|
|
@@ -185,6 +211,8 @@ class Server extends MediatorUser_1.default {
|
|
|
185
211
|
"apiVersion": apiVersion,
|
|
186
212
|
"cors": this._cors,
|
|
187
213
|
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.INTERNAL_SERVER_ERROR, responses)
|
|
214
|
+
}).then(() => {
|
|
215
|
+
// force return nothing
|
|
188
216
|
});
|
|
189
217
|
});
|
|
190
218
|
}
|
|
@@ -197,10 +225,12 @@ class Server extends MediatorUser_1.default {
|
|
|
197
225
|
"apiVersion": apiVersion,
|
|
198
226
|
"cors": this._cors,
|
|
199
227
|
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.OK, responses)
|
|
228
|
+
}).then(() => {
|
|
229
|
+
// force return nothing
|
|
200
230
|
});
|
|
201
231
|
}
|
|
202
232
|
// missing operationId
|
|
203
|
-
else if (
|
|
233
|
+
else if ("undefined" === typeof operationId) {
|
|
204
234
|
const result = JSON.stringify({
|
|
205
235
|
"code": "NOT_IMPLEMENTED",
|
|
206
236
|
"message": "Missing \"operationId\" in the Descriptor for this request"
|
|
@@ -210,6 +240,8 @@ class Server extends MediatorUser_1.default {
|
|
|
210
240
|
"apiVersion": apiVersion,
|
|
211
241
|
"cors": this._cors,
|
|
212
242
|
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.NOT_IMPLEMENTED, responses)
|
|
243
|
+
}).then(() => {
|
|
244
|
+
// force return nothing
|
|
213
245
|
});
|
|
214
246
|
}
|
|
215
247
|
// not implemented operationId
|
|
@@ -223,10 +255,12 @@ class Server extends MediatorUser_1.default {
|
|
|
223
255
|
"apiVersion": apiVersion,
|
|
224
256
|
"cors": this._cors,
|
|
225
257
|
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.NOT_IMPLEMENTED, responses)
|
|
258
|
+
}).then(() => {
|
|
259
|
+
// force return nothing
|
|
226
260
|
});
|
|
227
261
|
}
|
|
228
262
|
// no "Content-Length" header found
|
|
229
|
-
else if ("get" !== req.method && null !== (0, checkInteger_1.checkIntegerSync)("headers[\"content-length\"]",
|
|
263
|
+
else if ("get" !== req.method && null !== (0, checkInteger_1.checkIntegerSync)("headers[\"content-length\"]", contentLengthParsed)) {
|
|
230
264
|
const result = JSON.stringify({
|
|
231
265
|
"code": "MISSING_HEADER",
|
|
232
266
|
"message": "No valid \"Content-Length\" header found"
|
|
@@ -236,76 +270,73 @@ class Server extends MediatorUser_1.default {
|
|
|
236
270
|
"apiVersion": apiVersion,
|
|
237
271
|
"cors": this._cors,
|
|
238
272
|
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.MISSING_HEADER, responses)
|
|
273
|
+
}).then(() => {
|
|
274
|
+
// force return nothing
|
|
239
275
|
});
|
|
240
276
|
}
|
|
241
277
|
else {
|
|
242
278
|
// force formate for path parameters
|
|
243
279
|
return Promise.resolve().then(() => {
|
|
244
280
|
const keys = Object.keys(req.params);
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
return
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
281
|
+
if (!keys.length) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const docParameters = (paths[req.pattern][req.method]?.parameters?.filter((p) => {
|
|
285
|
+
return "path" === p.in;
|
|
286
|
+
}) ?? []);
|
|
287
|
+
if (!docParameters.length) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
for (let i = 0; i < keys.length; ++i) {
|
|
291
|
+
const key = keys[i];
|
|
292
|
+
const schema = docParameters.find((dp) => {
|
|
293
|
+
return dp.name === key;
|
|
294
|
+
})?.schema ?? null;
|
|
295
|
+
if (!schema) {
|
|
296
|
+
throw new ReferenceError("Unknown parameter: request.params['" + key + "']");
|
|
297
|
+
}
|
|
298
|
+
switch ((0, extractSchemaType_1.default)(schema, (this._Descriptor.components?.schemas ?? {}))) {
|
|
299
|
+
case "boolean":
|
|
300
|
+
if ("boolean" !== typeof req.params[key]) {
|
|
301
|
+
if ("true" === req.params[key]) {
|
|
302
|
+
req.params[key] = true;
|
|
303
|
+
}
|
|
304
|
+
else if ("false" === req.params[key]) {
|
|
305
|
+
req.params[key] = false;
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
throw new TypeError("Error while validating request: request.params['" + key + "'] should be boolean");
|
|
309
|
+
}
|
|
260
310
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
break;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
break;
|
|
276
|
-
case "integer":
|
|
277
|
-
// error returned, not an integer
|
|
278
|
-
if (null !== (0, checkInteger_1.checkIntegerSync)("request.params['" + key + "']", req.params[key])) {
|
|
279
|
-
const value = parseInt(req.params[key], 10);
|
|
280
|
-
if (!Number.isNaN(value)) {
|
|
281
|
-
req.params[key] = value;
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
err = new TypeError("Error while validating request: request.params['" + key + "'] should be integer");
|
|
285
|
-
break;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
break;
|
|
289
|
-
case "number":
|
|
290
|
-
if ("number" !== typeof req.params[key]) {
|
|
291
|
-
const value = parseFloat(req.params[key]);
|
|
292
|
-
if (!Number.isNaN(value)) {
|
|
293
|
-
req.params[key] = value;
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
err = new TypeError("Error while validating request: request.params['" + key + "'] should be number");
|
|
297
|
-
break;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
break;
|
|
301
|
-
default:
|
|
302
|
-
// nothing to do here
|
|
303
|
-
break;
|
|
311
|
+
break;
|
|
312
|
+
case "integer":
|
|
313
|
+
// error returned, not an integer
|
|
314
|
+
if (null !== (0, checkInteger_1.checkIntegerSync)("request.params['" + key + "']", req.params[key])) {
|
|
315
|
+
const value = Number.parseInt(req.params[key], 10);
|
|
316
|
+
if (!Number.isNaN(value)) {
|
|
317
|
+
req.params[key] = value;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
throw new TypeError("Error while validating request: request.params['" + key + "'] should be integer");
|
|
321
|
+
}
|
|
304
322
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
323
|
+
break;
|
|
324
|
+
case "number":
|
|
325
|
+
if ("number" !== typeof req.params[key]) {
|
|
326
|
+
const value = Number.parseFloat(req.params[key]);
|
|
327
|
+
if (!Number.isNaN(value)) {
|
|
328
|
+
req.params[key] = value;
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
throw new TypeError("Error while validating request: request.params['" + key + "'] should be number");
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
break;
|
|
335
|
+
default:
|
|
336
|
+
// nothing to do here
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
309
340
|
// extract body
|
|
310
341
|
}).then(() => {
|
|
311
342
|
if ("get" === req.method.toLowerCase()) {
|
|
@@ -318,12 +349,17 @@ class Server extends MediatorUser_1.default {
|
|
|
318
349
|
return (0, extractBody_1.default)(req).then((body) => {
|
|
319
350
|
if (body.length) {
|
|
320
351
|
this._log("log", body);
|
|
321
|
-
|
|
352
|
+
try {
|
|
353
|
+
req.body = JSON.parse(body);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// nothing to do here
|
|
357
|
+
}
|
|
322
358
|
}
|
|
323
359
|
else {
|
|
324
360
|
req.body = "";
|
|
325
361
|
}
|
|
326
|
-
return
|
|
362
|
+
return req.body;
|
|
327
363
|
});
|
|
328
364
|
}
|
|
329
365
|
// formate data
|
|
@@ -363,7 +399,7 @@ class Server extends MediatorUser_1.default {
|
|
|
363
399
|
else if ("application/json" === contentType) {
|
|
364
400
|
this._log("success", "<= [" + req.validatedIp + "] <" + contentType + "> " + JSON.stringify(content));
|
|
365
401
|
}
|
|
366
|
-
else if (["application/xml", "text/plain"].includes(contentType)) {
|
|
402
|
+
else if (["application/xml", "text/plain"].includes(contentType) && "string" === typeof content) {
|
|
367
403
|
this._log("success", "<= [" + req.validatedIp + "] <" + contentType + "> " + content);
|
|
368
404
|
}
|
|
369
405
|
else {
|
|
@@ -376,107 +412,112 @@ class Server extends MediatorUser_1.default {
|
|
|
376
412
|
"mime": (0, extractMime_1.default)(contentType, serverCode, responses)
|
|
377
413
|
});
|
|
378
414
|
}
|
|
379
|
-
}).catch((err) => {
|
|
380
|
-
if (err instanceof ReferenceError) {
|
|
381
|
-
const result = JSON.stringify({
|
|
382
|
-
"code": "MISSING_PARAMETER",
|
|
383
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
384
|
-
});
|
|
385
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
386
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.MISSING_PARAMETER, result, {
|
|
387
|
-
"apiVersion": apiVersion,
|
|
388
|
-
"cors": this._cors,
|
|
389
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.MISSING_PARAMETER, responses)
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
else if (err instanceof TypeError) {
|
|
393
|
-
const result = JSON.stringify({
|
|
394
|
-
"code": "WRONG_TYPE_PARAMETER",
|
|
395
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
396
|
-
});
|
|
397
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
398
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.WRONG_TYPE_PARAMETER, result, {
|
|
399
|
-
"apiVersion": apiVersion,
|
|
400
|
-
"cors": this._cors,
|
|
401
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.WRONG_TYPE_PARAMETER, responses)
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
else if (err instanceof RangeError) {
|
|
405
|
-
const result = JSON.stringify({
|
|
406
|
-
"code": "EMPTY_OR_RANGE_OR_ENUM_PARAMETER",
|
|
407
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
408
|
-
});
|
|
409
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
410
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.EMPTY_OR_RANGE_OR_ENUM_PARAMETER, result, {
|
|
411
|
-
"apiVersion": apiVersion,
|
|
412
|
-
"cors": this._cors,
|
|
413
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.EMPTY_OR_RANGE_OR_ENUM_PARAMETER, responses)
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
else if (err instanceof SyntaxError) {
|
|
417
|
-
const result = JSON.stringify({
|
|
418
|
-
"code": "JSON_PARSE",
|
|
419
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
420
|
-
});
|
|
421
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
422
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.JSON_PARSE, result, {
|
|
423
|
-
"apiVersion": apiVersion,
|
|
424
|
-
"cors": this._cors,
|
|
425
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.JSON_PARSE, responses)
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
else if (err instanceof UnauthorizedError_1.default) {
|
|
429
|
-
const result = JSON.stringify({
|
|
430
|
-
"code": "UNAUTHORIZED",
|
|
431
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
432
|
-
});
|
|
433
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
434
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.UNAUTHORIZED, result, {
|
|
435
|
-
"apiVersion": apiVersion,
|
|
436
|
-
"cors": this._cors,
|
|
437
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.UNAUTHORIZED, responses)
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
else if (err instanceof NotFoundError_1.default) {
|
|
441
|
-
const result = JSON.stringify({
|
|
442
|
-
"code": "NOT_FOUND",
|
|
443
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
444
|
-
});
|
|
445
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
446
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_FOUND, result, {
|
|
447
|
-
"apiVersion": apiVersion,
|
|
448
|
-
"cors": this._cors,
|
|
449
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.NOT_FOUND, responses)
|
|
450
|
-
});
|
|
451
|
-
}
|
|
452
|
-
else if (err instanceof LockedError_1.default) {
|
|
453
|
-
const result = JSON.stringify({
|
|
454
|
-
"code": "LOCKED",
|
|
455
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
456
|
-
});
|
|
457
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
458
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.LOCKED, result, {
|
|
459
|
-
"apiVersion": apiVersion,
|
|
460
|
-
"cors": this._cors,
|
|
461
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.LOCKED, responses)
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
else {
|
|
465
|
-
this._log("error", err);
|
|
466
|
-
const result = JSON.stringify({
|
|
467
|
-
"code": "INTERNAL_SERVER_ERROR",
|
|
468
|
-
"message": (0, cleanSendedError_1.default)(err)
|
|
469
|
-
});
|
|
470
|
-
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
471
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.INTERNAL_SERVER_ERROR, result, {
|
|
472
|
-
"apiVersion": apiVersion,
|
|
473
|
-
"cors": this._cors,
|
|
474
|
-
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.INTERNAL_SERVER_ERROR, responses)
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
415
|
// check response
|
|
478
|
-
}).then(() => {
|
|
479
|
-
return this._checkResponse ? this._Mediator.checkResponse(operationId,
|
|
416
|
+
}).then((response) => {
|
|
417
|
+
return this._checkResponse ? this._Mediator.checkResponse(operationId, response) : Promise.resolve();
|
|
418
|
+
}).catch((err) => {
|
|
419
|
+
return Promise.resolve().then(() => {
|
|
420
|
+
if (err instanceof ReferenceError) {
|
|
421
|
+
const result = JSON.stringify({
|
|
422
|
+
"code": "MISSING_PARAMETER",
|
|
423
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
424
|
+
});
|
|
425
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
426
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.MISSING_PARAMETER, result, {
|
|
427
|
+
"apiVersion": apiVersion,
|
|
428
|
+
"cors": this._cors,
|
|
429
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.MISSING_PARAMETER, responses)
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
else if (err instanceof TypeError) {
|
|
433
|
+
const result = JSON.stringify({
|
|
434
|
+
"code": "WRONG_TYPE_PARAMETER",
|
|
435
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
436
|
+
});
|
|
437
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
438
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.WRONG_TYPE_PARAMETER, result, {
|
|
439
|
+
"apiVersion": apiVersion,
|
|
440
|
+
"cors": this._cors,
|
|
441
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.WRONG_TYPE_PARAMETER, responses)
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
else if (err instanceof RangeError) {
|
|
445
|
+
const result = JSON.stringify({
|
|
446
|
+
"code": "EMPTY_OR_RANGE_OR_ENUM_PARAMETER",
|
|
447
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
448
|
+
});
|
|
449
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
450
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.EMPTY_OR_RANGE_OR_ENUM_PARAMETER, result, {
|
|
451
|
+
"apiVersion": apiVersion,
|
|
452
|
+
"cors": this._cors,
|
|
453
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.EMPTY_OR_RANGE_OR_ENUM_PARAMETER, responses)
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
else if (err instanceof SyntaxError) {
|
|
457
|
+
const result = JSON.stringify({
|
|
458
|
+
"code": "JSON_PARSE",
|
|
459
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
460
|
+
});
|
|
461
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
462
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.JSON_PARSE, result, {
|
|
463
|
+
"apiVersion": apiVersion,
|
|
464
|
+
"cors": this._cors,
|
|
465
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.JSON_PARSE, responses)
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
else if (err instanceof UnauthorizedError_1.default) {
|
|
469
|
+
const result = JSON.stringify({
|
|
470
|
+
"code": "UNAUTHORIZED",
|
|
471
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
472
|
+
});
|
|
473
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
474
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.UNAUTHORIZED, result, {
|
|
475
|
+
"apiVersion": apiVersion,
|
|
476
|
+
"cors": this._cors,
|
|
477
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.UNAUTHORIZED, responses)
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
else if (err instanceof NotFoundError_1.default) {
|
|
481
|
+
const result = JSON.stringify({
|
|
482
|
+
"code": "NOT_FOUND",
|
|
483
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
484
|
+
});
|
|
485
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
486
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_FOUND, result, {
|
|
487
|
+
"apiVersion": apiVersion,
|
|
488
|
+
"cors": this._cors,
|
|
489
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.NOT_FOUND, responses)
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
else if (err instanceof LockedError_1.default) {
|
|
493
|
+
const result = JSON.stringify({
|
|
494
|
+
"code": "LOCKED",
|
|
495
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
496
|
+
});
|
|
497
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
498
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.LOCKED, result, {
|
|
499
|
+
"apiVersion": apiVersion,
|
|
500
|
+
"cors": this._cors,
|
|
501
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.LOCKED, responses)
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
this._log("error", err);
|
|
506
|
+
const result = JSON.stringify({
|
|
507
|
+
"code": "INTERNAL_SERVER_ERROR",
|
|
508
|
+
"message": (0, cleanSendedError_1.default)(err)
|
|
509
|
+
});
|
|
510
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
511
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.INTERNAL_SERVER_ERROR, result, {
|
|
512
|
+
"apiVersion": apiVersion,
|
|
513
|
+
"cors": this._cors,
|
|
514
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.INTERNAL_SERVER_ERROR, responses)
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
// still check response for errors
|
|
518
|
+
}).then((response) => {
|
|
519
|
+
return this._checkResponse ? this._Mediator.checkResponse(operationId, response) : Promise.resolve();
|
|
520
|
+
});
|
|
480
521
|
});
|
|
481
522
|
}
|
|
482
523
|
}).then(() => {
|
|
@@ -490,7 +531,7 @@ class Server extends MediatorUser_1.default {
|
|
|
490
531
|
this._socketServer = socketServer;
|
|
491
532
|
}
|
|
492
533
|
push(command, data, log = true) {
|
|
493
|
-
const serverType = this.
|
|
534
|
+
const serverType = this._getServerType();
|
|
494
535
|
if (!["WEBSOCKET", "SOCKETIO"].includes(serverType)) {
|
|
495
536
|
return this;
|
|
496
537
|
}
|
|
@@ -513,16 +554,17 @@ class Server extends MediatorUser_1.default {
|
|
|
513
554
|
switch (serverType) {
|
|
514
555
|
case "WEBSOCKET":
|
|
515
556
|
this._socketServer.clients.forEach((client) => {
|
|
516
|
-
|
|
517
|
-
client.id = (0, uniqid_1.default)();
|
|
518
|
-
}
|
|
557
|
+
client.id ??= (0, uniqid_1.default)();
|
|
519
558
|
if (WEBSOCKET_STATE_OPEN === client.readyState) {
|
|
520
559
|
client.send(result);
|
|
521
560
|
}
|
|
522
561
|
});
|
|
523
562
|
break;
|
|
524
563
|
case "SOCKETIO":
|
|
525
|
-
|
|
564
|
+
{
|
|
565
|
+
const sockets = this._socketServer.sockets;
|
|
566
|
+
sockets.emit("message", result);
|
|
567
|
+
}
|
|
526
568
|
break;
|
|
527
569
|
default:
|
|
528
570
|
// nothing to do here
|
|
@@ -534,33 +576,32 @@ class Server extends MediatorUser_1.default {
|
|
|
534
576
|
return this;
|
|
535
577
|
}
|
|
536
578
|
getClients() {
|
|
537
|
-
|
|
538
|
-
switch (this._serverType()) {
|
|
579
|
+
switch (this._getServerType()) {
|
|
539
580
|
case "WEBSOCKET": {
|
|
540
581
|
const result = [];
|
|
541
582
|
this._socketServer.clients.forEach((s) => {
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
}
|
|
545
|
-
return {
|
|
583
|
+
s.id ??= (0, uniqid_1.default)();
|
|
584
|
+
result.push({
|
|
546
585
|
"id": s.id,
|
|
547
586
|
"status": WEBSOCKET_STATE_OPEN === s.readyState ? "CONNECTED" : "DISCONNECTED"
|
|
548
|
-
};
|
|
587
|
+
});
|
|
549
588
|
});
|
|
550
589
|
return result;
|
|
551
590
|
}
|
|
552
591
|
case "SOCKETIO": {
|
|
592
|
+
const socketIOVersion = this._getSocketIOVersion();
|
|
553
593
|
const result = [];
|
|
554
|
-
if ("
|
|
555
|
-
|
|
556
|
-
|
|
594
|
+
if ("V2" === socketIOVersion) {
|
|
595
|
+
const { sockets } = this._socketServer.sockets;
|
|
596
|
+
for (const key in sockets) {
|
|
597
|
+
const s = sockets[key];
|
|
557
598
|
result.push({
|
|
558
599
|
"id": s.id,
|
|
559
600
|
"status": s.connected ? "CONNECTED" : "DISCONNECTED"
|
|
560
601
|
});
|
|
561
602
|
}
|
|
562
603
|
}
|
|
563
|
-
else {
|
|
604
|
+
else if ("V3-V4" === socketIOVersion) {
|
|
564
605
|
this._socketServer.sockets.sockets.forEach((s) => {
|
|
565
606
|
result.push({
|
|
566
607
|
"id": s.id,
|
|
@@ -575,7 +616,7 @@ class Server extends MediatorUser_1.default {
|
|
|
575
616
|
}
|
|
576
617
|
}
|
|
577
618
|
pushClient(clientId, command, data, log = true) {
|
|
578
|
-
const serverType = this.
|
|
619
|
+
const serverType = this._getServerType();
|
|
579
620
|
if (!["WEBSOCKET", "SOCKETIO"].includes(serverType)) {
|
|
580
621
|
return this;
|
|
581
622
|
}
|
|
@@ -595,7 +636,7 @@ class Server extends MediatorUser_1.default {
|
|
|
595
636
|
switch (serverType) {
|
|
596
637
|
case "WEBSOCKET":
|
|
597
638
|
this._socketServer.clients.forEach((client) => {
|
|
598
|
-
if (
|
|
639
|
+
if ("undefined" === typeof client.id) {
|
|
599
640
|
client.id = (0, uniqid_1.default)();
|
|
600
641
|
}
|
|
601
642
|
else if (client.id === clientId && WEBSOCKET_STATE_OPEN === client.readyState) {
|
|
@@ -634,7 +675,7 @@ class Server extends MediatorUser_1.default {
|
|
|
634
675
|
return this._initWorkSpace(...data);
|
|
635
676
|
}).then(() => {
|
|
636
677
|
this.initialized = true;
|
|
637
|
-
this.
|
|
678
|
+
this.emit("initialized", ...data);
|
|
638
679
|
});
|
|
639
680
|
}
|
|
640
681
|
release(...data) {
|
|
@@ -647,10 +688,10 @@ class Server extends MediatorUser_1.default {
|
|
|
647
688
|
if (this._Mediator) {
|
|
648
689
|
this._Mediator = null;
|
|
649
690
|
}
|
|
650
|
-
this.
|
|
691
|
+
this._externalResourcesDirectory = "";
|
|
651
692
|
this._socketServer = null;
|
|
652
693
|
this.initialized = false;
|
|
653
|
-
this.
|
|
694
|
+
this.emit("released", ...data);
|
|
654
695
|
}).then(() => {
|
|
655
696
|
this.removeAllListeners();
|
|
656
697
|
});
|