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.
Files changed (77) hide show
  1. package/LICENSE +13 -13
  2. package/README.md +53 -48
  3. package/lib/@types/socket.io-v2.d.ts +988 -0
  4. package/lib/cjs/checkers/RangeError/checkNonEmptyNumber.d.ts +2 -2
  5. package/lib/cjs/checkers/RangeError/checkNonEmptyObject.d.ts +2 -2
  6. package/lib/cjs/checkers/RangeError/checkNonEmptyString.d.ts +2 -2
  7. package/lib/cjs/checkers/ReferenceError/checkExists.d.ts +2 -2
  8. package/lib/cjs/checkers/TypeError/checkFunction.d.ts +2 -2
  9. package/lib/cjs/checkers/TypeError/checkInteger.d.ts +2 -2
  10. package/lib/cjs/checkers/TypeError/checkNumber.d.ts +2 -2
  11. package/lib/cjs/checkers/TypeError/checkObject.d.ts +2 -2
  12. package/lib/cjs/checkers/TypeError/checkString.d.ts +2 -2
  13. package/lib/cjs/components/DescriptorUser.d.ts +10 -11
  14. package/lib/cjs/components/DescriptorUser.js +51 -40
  15. package/lib/cjs/components/Mediator.d.ts +12 -17
  16. package/lib/cjs/components/Mediator.js +59 -39
  17. package/lib/cjs/components/MediatorUser.d.ts +2 -2
  18. package/lib/cjs/components/MediatorUser.js +12 -5
  19. package/lib/cjs/components/Orchestrator.d.ts +13 -13
  20. package/lib/cjs/components/Orchestrator.js +123 -69
  21. package/lib/cjs/components/Server.d.ts +22 -19
  22. package/lib/cjs/components/Server.js +279 -238
  23. package/lib/cjs/main.cjs +1 -40
  24. package/lib/cjs/main.d.cts +3 -15
  25. package/lib/cjs/openAPITypes.d.ts +5 -0
  26. package/lib/cjs/openAPITypes.js +3 -0
  27. package/lib/cjs/utils/cleanSendedError.d.ts +1 -1
  28. package/lib/cjs/utils/cleanSendedError.js +2 -4
  29. package/lib/cjs/utils/descriptor/extractParams.d.ts +1 -1
  30. package/lib/cjs/utils/descriptor/extractParams.js +1 -1
  31. package/lib/cjs/utils/descriptor/extractPathMethodByOperationId.d.ts +2 -3
  32. package/lib/cjs/utils/descriptor/extractPathMethodByOperationId.js +14 -14
  33. package/lib/cjs/utils/descriptor/extractPattern.d.ts +2 -2
  34. package/lib/cjs/utils/descriptor/extractPattern.js +5 -5
  35. package/lib/cjs/utils/descriptor/extractSchemaType.d.ts +1 -1
  36. package/lib/cjs/utils/descriptor/extractSchemaType.js +13 -8
  37. package/lib/cjs/utils/file/readJSONFile.d.ts +1 -1
  38. package/lib/cjs/utils/request/extractBody.js +9 -5
  39. package/lib/cjs/utils/request/extractCookies.d.ts +1 -1
  40. package/lib/cjs/utils/request/extractCookies.js +6 -6
  41. package/lib/cjs/utils/request/extractIp.d.ts +1 -1
  42. package/lib/cjs/utils/request/extractIp.js +19 -10
  43. package/lib/cjs/utils/request/extractMime.d.ts +1 -4
  44. package/lib/cjs/utils/request/extractMime.js +15 -11
  45. package/lib/cjs/utils/send.d.ts +4 -4
  46. package/lib/cjs/utils/send.js +27 -29
  47. package/lib/cjs/utils/server/getServerTypeFromServer.d.ts +4 -0
  48. package/lib/cjs/utils/server/getServerTypeFromServer.js +23 -0
  49. package/lib/cjs/utils/server/getSocketIOVersionFromServer.d.ts +4 -0
  50. package/lib/cjs/utils/server/getSocketIOVersionFromServer.js +19 -0
  51. package/package.json +101 -97
  52. package/lib/cjs/checkers/RangeError/checkArrayLength.d.ts +0 -2
  53. package/lib/cjs/checkers/RangeError/checkArrayLength.js +0 -23
  54. package/lib/cjs/checkers/RangeError/checkArrayLengthBetween.d.ts +0 -2
  55. package/lib/cjs/checkers/RangeError/checkArrayLengthBetween.js +0 -30
  56. package/lib/cjs/checkers/RangeError/checkIntegerBetween.d.ts +0 -2
  57. package/lib/cjs/checkers/RangeError/checkIntegerBetween.js +0 -29
  58. package/lib/cjs/checkers/RangeError/checkNonEmptyArray.d.ts +0 -2
  59. package/lib/cjs/checkers/RangeError/checkNonEmptyArray.js +0 -19
  60. package/lib/cjs/checkers/RangeError/checkNonEmptyInteger.d.ts +0 -2
  61. package/lib/cjs/checkers/RangeError/checkNonEmptyInteger.js +0 -19
  62. package/lib/cjs/checkers/RangeError/checkNumberBetween.d.ts +0 -2
  63. package/lib/cjs/checkers/RangeError/checkNumberBetween.js +0 -29
  64. package/lib/cjs/checkers/RangeError/checkObjectLength.d.ts +0 -2
  65. package/lib/cjs/checkers/RangeError/checkObjectLength.js +0 -28
  66. package/lib/cjs/checkers/RangeError/checkObjectLengthBetween.d.ts +0 -2
  67. package/lib/cjs/checkers/RangeError/checkObjectLengthBetween.js +0 -33
  68. package/lib/cjs/checkers/RangeError/checkStringLength.d.ts +0 -2
  69. package/lib/cjs/checkers/RangeError/checkStringLength.js +0 -23
  70. package/lib/cjs/checkers/RangeError/checkStringLengthBetween.d.ts +0 -2
  71. package/lib/cjs/checkers/RangeError/checkStringLengthBetween.js +0 -30
  72. package/lib/cjs/checkers/TypeError/checkArray.d.ts +0 -2
  73. package/lib/cjs/checkers/TypeError/checkArray.js +0 -19
  74. package/lib/cjs/checkers/TypeError/checkBoolean.d.ts +0 -2
  75. package/lib/cjs/checkers/TypeError/checkBoolean.js +0 -19
  76. package/lib/cjs/utils/jsonParser.d.ts +0 -1
  77. package/lib/cjs/utils/jsonParser.js +0 -16
@@ -1,9 +1,14 @@
1
1
  "use strict";
2
- // deps
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-writted. Each child has is own init logic.
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
- _serverType() {
45
- if (!this._socketServer) {
46
- return "NO_SERVER";
47
- }
48
- else if (this._socketServer.clients && "function" === typeof this._socketServer.clients.forEach) {
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
- var _a, _b;
60
- if ("SOCKETIO" === this._serverType()) {
61
- let socket = null;
62
- if ("function" !== typeof ((_b = (_a = this._socketServer.sockets) === null || _a === void 0 ? void 0 : _a.sockets) === null || _b === void 0 ? void 0 : _b.has)) { // SocketIO V2
63
- for (const key in this._socketServer.sockets.sockets) {
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
- socket = this._socketServer.sockets.sockets[key];
69
+ if (sockets[key].connected) {
70
+ return sockets[key];
71
+ }
66
72
  break;
67
73
  }
68
74
  }
69
75
  }
70
- else if (this._socketServer.sockets.sockets.has(clientId)) { // SocketIO V3&4
71
- socket = this._socketServer.sockets.sockets.get(clientId);
72
- }
73
- if (socket && socket.connected) {
74
- return socket;
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
- return next();
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, query } = (0, node_url_1.parse)(req.url, true);
116
- req.method = req.method ? req.method.toLowerCase() : "get";
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).app) {
125
- Object.defineProperty(req, "query", Object.assign(Object.assign({}, Object.getOwnPropertyDescriptor(req, "query")), { "value": req.query, "writable": true }));
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 !== null && query !== void 0 ? 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 ("string" === typeof req.headers["content-length"]) {
142
- req.headers["content-length"] = parseInt(req.headers["content-length"], 10);
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
- if (!this._Descriptor.paths[req.pattern] || !this._Descriptor.paths[req.pattern][req.method]) {
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 { operationId } = this._Descriptor.paths[req.pattern][req.method];
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 = (_b = (_a = req.headers["content-type"]) !== null && _a !== void 0 ? _a : req.headers["Content-Type"]) !== null && _b !== void 0 ? _b : "";
154
- const responses = this._Descriptor.paths[req.pattern][req.method].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 && req.headers["content-length"] && 4 < req.headers["content-length"]
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 && res.socket.localPort ? res.socket.localPort : ((_c = res.socket) === null || _c === void 0 ? void 0 : _c.address()).port;
166
- const descriptor = Object.assign({}, this._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 (!operationId) {
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\"]", req.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
- return !keys.length ? Promise.resolve() : Promise.resolve().then(() => {
246
- const docParameters = this._Descriptor.paths[req.pattern][req.method].parameters.filter((p) => {
247
- return "path" === p.in;
248
- });
249
- return !docParameters.length ? Promise.resolve() : Promise.resolve().then(() => {
250
- var _a, _b;
251
- let err = null;
252
- for (let i = 0; i < keys.length; ++i) {
253
- const key = keys[i];
254
- const schema = (_b = (_a = docParameters.find((dp) => {
255
- return dp.name === key;
256
- })) === null || _a === void 0 ? void 0 : _a.schema) !== null && _b !== void 0 ? _b : null;
257
- if (!schema) {
258
- err = new ReferenceError("Unknown parameter: request.params['" + key + "']");
259
- break;
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
- switch ((0, extractSchemaType_1.default)(schema, this._Descriptor.components.schemas)) {
262
- case "boolean":
263
- if ("boolean" !== typeof req.params[key]) {
264
- if ("true" === req.params[key]) {
265
- req.params[key] = true;
266
- }
267
- else if ("false" === req.params[key]) {
268
- req.params[key] = false;
269
- }
270
- else {
271
- err = new TypeError("Error while validating request: request.params['" + key + "'] should be boolean");
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
- return err ? Promise.reject(err) : Promise.resolve();
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
- req.body = (0, jsonParser_1.default)(body);
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 Promise.resolve(req.body);
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, res) : Promise.resolve();
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._serverType();
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
- if (!client.id) {
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
- this._socketServer.sockets.emit("message", result);
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
- var _a, _b;
538
- switch (this._serverType()) {
579
+ switch (this._getServerType()) {
539
580
  case "WEBSOCKET": {
540
581
  const result = [];
541
582
  this._socketServer.clients.forEach((s) => {
542
- if (!s.id) {
543
- s.id = (0, uniqid_1.default)();
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 ("function" !== typeof ((_b = (_a = this._socketServer.sockets) === null || _a === void 0 ? void 0 : _a.sockets) === null || _b === void 0 ? void 0 : _b.has)) { // SocketIO V2
555
- for (const key in this._socketServer.sockets.sockets) {
556
- const s = this._socketServer.sockets.sockets[key];
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._serverType();
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 (!client.id) {
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._emitEventGenericForTSPurposeDONOTUSE("initialized", ...data);
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._externalRessourcesDirectory = "";
691
+ this._externalResourcesDirectory = "";
651
692
  this._socketServer = null;
652
693
  this.initialized = false;
653
- this._emitEventGenericForTSPurposeDONOTUSE("released", ...data);
694
+ this.emit("released", ...data);
654
695
  }).then(() => {
655
696
  this.removeAllListeners();
656
697
  });