node-pluginsmanager-plugin 5.1.0 → 6.0.0
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/lib/cjs/components/Mediator.d.ts +1 -1
- package/lib/cjs/components/Mediator.js +9 -6
- package/lib/cjs/components/Orchestrator.js +0 -2
- package/lib/cjs/components/Server.js +130 -60
- package/lib/cjs/utils/file/readJSONFile.js +1 -1
- package/lib/cjs/utils/jsonParser.d.ts +1 -0
- package/lib/cjs/utils/jsonParser.js +17 -0
- package/lib/cjs/utils/request/extractBody.d.ts +1 -6
- package/lib/cjs/utils/request/extractBody.js +3 -14
- package/lib/cjs/utils/request/extractMime.d.ts +8 -0
- package/lib/cjs/utils/request/extractMime.js +68 -0
- package/lib/cjs/utils/send.d.ts +5 -1
- package/lib/cjs/utils/send.js +8 -11
- package/package.json +10 -9
|
@@ -21,7 +21,7 @@ export interface iBodyParameters {
|
|
|
21
21
|
export default class Mediator extends DescriptorUser {
|
|
22
22
|
protected _validator: OpenApiValidator | null;
|
|
23
23
|
constructor(options: iDescriptorUserOptions);
|
|
24
|
-
checkParameters(operationId: string, urlParams: iUrlParameters, bodyParams:
|
|
24
|
+
checkParameters(operationId: string, urlParams: iUrlParameters, bodyParams: string): Promise<void>;
|
|
25
25
|
checkResponse(operationId: string, res: iServerResponse): Promise<void>;
|
|
26
26
|
init(...data: any): Promise<void>;
|
|
27
27
|
release(...data: any): Promise<void>;
|
|
@@ -3,10 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const checkExists_1 = require("../checkers/ReferenceError/checkExists");
|
|
6
7
|
const checkObject_1 = require("../checkers/TypeError/checkObject");
|
|
7
8
|
const checkNonEmptyString_1 = require("../checkers/RangeError/checkNonEmptyString");
|
|
8
9
|
const checkNonEmptyObject_1 = require("../checkers/RangeError/checkNonEmptyObject");
|
|
9
10
|
const extractPathMethodByOperationId_1 = __importDefault(require("../utils/descriptor/extractPathMethodByOperationId"));
|
|
11
|
+
const jsonParser_1 = __importDefault(require("../utils/jsonParser"));
|
|
10
12
|
const DescriptorUser_1 = __importDefault(require("./DescriptorUser"));
|
|
11
13
|
// types & interfaces
|
|
12
14
|
// externals
|
|
@@ -35,7 +37,7 @@ class Mediator extends DescriptorUser_1.default {
|
|
|
35
37
|
return (0, checkObject_1.checkObject)("urlParams.cookies", urlParams.cookies);
|
|
36
38
|
});
|
|
37
39
|
}).then(() => {
|
|
38
|
-
return (0,
|
|
40
|
+
return (0, checkExists_1.checkExists)("bodyParams", bodyParams);
|
|
39
41
|
}).then(() => {
|
|
40
42
|
// search wanted operation
|
|
41
43
|
const foundPathMethod = (0, extractPathMethodByOperationId_1.default)(this._Descriptor.paths, operationId);
|
|
@@ -98,15 +100,16 @@ class Mediator extends DescriptorUser_1.default {
|
|
|
98
100
|
}
|
|
99
101
|
else {
|
|
100
102
|
try {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
const mutedRes = Object.assign({}, res);
|
|
104
|
+
mutedRes.headers = res.getHeaders();
|
|
105
|
+
if ("undefined" === typeof mutedRes.body || "" === mutedRes.body) {
|
|
106
|
+
mutedRes.body = {};
|
|
104
107
|
}
|
|
105
108
|
else {
|
|
106
|
-
|
|
109
|
+
mutedRes.body = (0, jsonParser_1.default)(mutedRes.body);
|
|
107
110
|
}
|
|
108
111
|
const validateResponse = this._validator.validateResponse(foundPathMethod.method, foundPathMethod.path);
|
|
109
|
-
validateResponse(
|
|
112
|
+
validateResponse(mutedRes);
|
|
110
113
|
return resolve();
|
|
111
114
|
}
|
|
112
115
|
catch (e) {
|
|
@@ -351,7 +351,6 @@ class Orchestrator extends MediatorUser_1.default {
|
|
|
351
351
|
return this._Server.init(...data).then(() => {
|
|
352
352
|
if (this._socketServer) { // delayed socketMiddleware
|
|
353
353
|
this._Server.socketMiddleware(this._socketServer);
|
|
354
|
-
this._socketServer = null;
|
|
355
354
|
}
|
|
356
355
|
if (!this._checkParameters) { // delayed checkParameters
|
|
357
356
|
this._Server.disableCheckParameters();
|
|
@@ -376,7 +375,6 @@ class Orchestrator extends MediatorUser_1.default {
|
|
|
376
375
|
}) : Promise.resolve();
|
|
377
376
|
}).then(() => {
|
|
378
377
|
return this._Server ? this._Server.release(...data).then(() => {
|
|
379
|
-
this._socketServer = null;
|
|
380
378
|
this._Server = null;
|
|
381
379
|
}) : Promise.resolve();
|
|
382
380
|
}).then(() => {
|
|
@@ -19,6 +19,8 @@ const extractSchemaType_1 = __importDefault(require("../utils/descriptor/extract
|
|
|
19
19
|
const extractBody_1 = __importDefault(require("../utils/request/extractBody"));
|
|
20
20
|
const extractIp_1 = __importDefault(require("../utils/request/extractIp"));
|
|
21
21
|
const extractCookies_1 = __importDefault(require("../utils/request/extractCookies"));
|
|
22
|
+
const extractMime_1 = __importDefault(require("../utils/request/extractMime"));
|
|
23
|
+
const jsonParser_1 = __importDefault(require("../utils/jsonParser"));
|
|
22
24
|
const send_1 = __importDefault(require("../utils/send"));
|
|
23
25
|
const cleanSendedError_1 = __importDefault(require("../utils/cleanSendedError"));
|
|
24
26
|
const MediatorUser_1 = __importDefault(require("./MediatorUser"));
|
|
@@ -106,37 +108,46 @@ class Server extends MediatorUser_1.default {
|
|
|
106
108
|
else if ("string" === typeof req.headers["content-length"]) {
|
|
107
109
|
req.headers["content-length"] = parseInt(req.headers["content-length"], 10);
|
|
108
110
|
}
|
|
109
|
-
// set default content-type
|
|
110
|
-
if ("string" !== typeof req.headers["content-type"]) {
|
|
111
|
-
req.headers["content-type"] = "application/json";
|
|
112
|
-
}
|
|
113
111
|
if (!req.pattern || !this._Descriptor.paths[req.pattern] || !this._Descriptor.paths[req.pattern][req.method]) {
|
|
114
112
|
return next();
|
|
115
113
|
}
|
|
116
114
|
const { operationId } = this._Descriptor.paths[req.pattern][req.method];
|
|
115
|
+
const apiVersion = this._Descriptor.info.version;
|
|
116
|
+
const contentType = req.headers["content-type"] || req.headers["Content-Type"] || "";
|
|
117
|
+
const responses = this._Descriptor.paths[req.pattern][req.method].responses;
|
|
117
118
|
this._log("info", "" +
|
|
118
119
|
"=> [" + req.validatedIp + "] " + req.url + " (" + req.method.toUpperCase() + ")" +
|
|
119
120
|
(operationId ? node_os_1.EOL + "operationId : " + operationId : "") +
|
|
120
|
-
node_os_1.EOL + "content-type : " + req.headers["content-type"] +
|
|
121
|
+
(req.headers["content-type"] ? node_os_1.EOL + "content-type : " + req.headers["content-type"] : "") +
|
|
121
122
|
("get" !== req.method && req.headers["content-length"] && 4 < req.headers["content-length"] ?
|
|
122
123
|
node_os_1.EOL + "content-length : " + req.headers["content-length"] : ""));
|
|
123
124
|
// get descriptor
|
|
124
125
|
if ("/" + this._Descriptor.info.title + "/api/descriptor" === req.pattern && "get" === req.method) {
|
|
125
126
|
// add current server
|
|
126
127
|
const port = res.socket && res.socket.localPort ? res.socket.localPort : ((_a = res.socket) === null || _a === void 0 ? void 0 : _a.address()).port;
|
|
127
|
-
this._Descriptor
|
|
128
|
+
const descriptor = Object.assign({}, this._Descriptor);
|
|
129
|
+
descriptor.servers.push({
|
|
128
130
|
"url": req.validatedIp + ":" + port,
|
|
129
131
|
"description": "Actual current server"
|
|
130
132
|
});
|
|
131
|
-
|
|
132
|
-
|
|
133
|
+
const content = JSON.stringify(descriptor);
|
|
134
|
+
this._log("info", "<= [" + req.validatedIp + "] " + content);
|
|
135
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.OK, content, {
|
|
136
|
+
"apiVersion": apiVersion,
|
|
137
|
+
"cors": this._cors,
|
|
138
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.OK, responses)
|
|
139
|
+
}).catch((err) => {
|
|
133
140
|
this._log("error", err);
|
|
134
|
-
const result = {
|
|
141
|
+
const result = JSON.stringify({
|
|
135
142
|
"code": "INTERNAL_SERVER_ERROR",
|
|
136
143
|
"message": (0, cleanSendedError_1.default)(err)
|
|
137
|
-
};
|
|
138
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
139
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.INTERNAL_SERVER_ERROR, result,
|
|
144
|
+
});
|
|
145
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
146
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.INTERNAL_SERVER_ERROR, result, {
|
|
147
|
+
"apiVersion": apiVersion,
|
|
148
|
+
"cors": this._cors,
|
|
149
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.INTERNAL_SERVER_ERROR, responses)
|
|
150
|
+
});
|
|
140
151
|
});
|
|
141
152
|
}
|
|
142
153
|
// get plugin status
|
|
@@ -144,34 +155,50 @@ class Server extends MediatorUser_1.default {
|
|
|
144
155
|
const initialized = this.initialized && this._Mediator.initialized;
|
|
145
156
|
const status = initialized ? "INITIALIZED" : "ENABLED";
|
|
146
157
|
this._log("info", "<= [" + req.validatedIp + "] " + status);
|
|
147
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.OK, status,
|
|
158
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.OK, JSON.stringify(status), {
|
|
159
|
+
"apiVersion": apiVersion,
|
|
160
|
+
"cors": this._cors,
|
|
161
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.OK, responses)
|
|
162
|
+
});
|
|
148
163
|
}
|
|
149
164
|
// missing operationId
|
|
150
165
|
else if (!operationId) {
|
|
151
|
-
const result = {
|
|
166
|
+
const result = JSON.stringify({
|
|
152
167
|
"code": "NOT_IMPLEMENTED",
|
|
153
168
|
"message": "Missing \"operationId\" in the Descriptor for this request"
|
|
154
|
-
};
|
|
155
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
156
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_IMPLEMENTED, result,
|
|
169
|
+
});
|
|
170
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
171
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_IMPLEMENTED, result, {
|
|
172
|
+
"apiVersion": apiVersion,
|
|
173
|
+
"cors": this._cors,
|
|
174
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.NOT_IMPLEMENTED, responses)
|
|
175
|
+
});
|
|
157
176
|
}
|
|
158
177
|
// not implemented operationId
|
|
159
178
|
else if ("function" !== typeof this._Mediator[operationId]) {
|
|
160
|
-
const result = {
|
|
179
|
+
const result = JSON.stringify({
|
|
161
180
|
"code": "NOT_IMPLEMENTED",
|
|
162
181
|
"message": "Unknown Mediator's \"operationId\" method for this request"
|
|
163
|
-
};
|
|
164
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
165
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_IMPLEMENTED, result,
|
|
182
|
+
});
|
|
183
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
184
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_IMPLEMENTED, result, {
|
|
185
|
+
"apiVersion": apiVersion,
|
|
186
|
+
"cors": this._cors,
|
|
187
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.NOT_IMPLEMENTED, responses)
|
|
188
|
+
});
|
|
166
189
|
}
|
|
167
190
|
// no "Content-Length" header found
|
|
168
191
|
else if ("get" !== req.method && null !== (0, checkInteger_1.checkIntegerSync)("headers[\"content-length\"]", req.headers["content-length"])) {
|
|
169
|
-
const result = {
|
|
192
|
+
const result = JSON.stringify({
|
|
170
193
|
"code": "MISSING_HEADER",
|
|
171
194
|
"message": "No valid \"Content-Length\" header found"
|
|
172
|
-
};
|
|
173
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
174
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.MISSING_HEADER, result,
|
|
195
|
+
});
|
|
196
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
197
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.MISSING_HEADER, result, {
|
|
198
|
+
"apiVersion": apiVersion,
|
|
199
|
+
"cors": this._cors,
|
|
200
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.MISSING_HEADER, responses)
|
|
201
|
+
});
|
|
175
202
|
}
|
|
176
203
|
else {
|
|
177
204
|
// force formate for path parameters
|
|
@@ -244,16 +271,19 @@ class Server extends MediatorUser_1.default {
|
|
|
244
271
|
// extract body
|
|
245
272
|
}).then(() => {
|
|
246
273
|
if ("get" === req.method.toLowerCase()) {
|
|
247
|
-
return Promise.resolve(
|
|
274
|
+
return Promise.resolve("");
|
|
248
275
|
}
|
|
249
|
-
else if (!(0,
|
|
276
|
+
else if (!(0, checkNonEmptyString_1.checkNonEmptyStringSync)("body", req.body)) {
|
|
250
277
|
return Promise.resolve(req.body);
|
|
251
278
|
}
|
|
252
279
|
else {
|
|
253
280
|
return (0, extractBody_1.default)(req).then((body) => {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
281
|
+
if (body.length) {
|
|
282
|
+
this._log("log", body);
|
|
283
|
+
req.body = (0, jsonParser_1.default)(body);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
req.body = "";
|
|
257
287
|
}
|
|
258
288
|
return Promise.resolve(req.body);
|
|
259
289
|
});
|
|
@@ -282,71 +312,111 @@ class Server extends MediatorUser_1.default {
|
|
|
282
312
|
if ("put" === req.method) {
|
|
283
313
|
if ("undefined" === typeof content || null === content) {
|
|
284
314
|
this._log("success", "<= [" + req.validatedIp + "] no content");
|
|
285
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.OK_PUT,
|
|
315
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.OK_PUT, "", {
|
|
316
|
+
"apiVersion": apiVersion,
|
|
317
|
+
"cors": this._cors,
|
|
318
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.OK_PUT, responses)
|
|
319
|
+
});
|
|
286
320
|
}
|
|
287
321
|
else {
|
|
288
|
-
this._log("success", "<= [" + req.validatedIp + "] " +
|
|
289
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.OK_PUT, content,
|
|
322
|
+
this._log("success", "<= [" + req.validatedIp + "] " + content);
|
|
323
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.OK_PUT, content, {
|
|
324
|
+
"apiVersion": apiVersion,
|
|
325
|
+
"cors": this._cors,
|
|
326
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.OK_PUT, responses)
|
|
327
|
+
});
|
|
290
328
|
}
|
|
291
329
|
}
|
|
292
330
|
// no content
|
|
293
331
|
else if ("undefined" === typeof content || null === content) {
|
|
294
332
|
this._log("warning", "<= [" + req.validatedIp + "] no content");
|
|
295
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.OK_NO_CONTENT,
|
|
333
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.OK_NO_CONTENT, "", {
|
|
334
|
+
"apiVersion": apiVersion,
|
|
335
|
+
"cors": this._cors,
|
|
336
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.OK_NO_CONTENT, responses)
|
|
337
|
+
});
|
|
296
338
|
}
|
|
297
339
|
else {
|
|
298
|
-
this._log("success", "<= [" + req.validatedIp + "] " +
|
|
299
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.OK, content,
|
|
340
|
+
this._log("success", "<= [" + req.validatedIp + "] " + content);
|
|
341
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.OK, content, {
|
|
342
|
+
"apiVersion": apiVersion,
|
|
343
|
+
"cors": this._cors,
|
|
344
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.OK, responses)
|
|
345
|
+
});
|
|
300
346
|
}
|
|
301
347
|
}).catch((err) => {
|
|
302
348
|
if (err instanceof ReferenceError) {
|
|
303
|
-
const result = {
|
|
349
|
+
const result = JSON.stringify({
|
|
304
350
|
"code": "MISSING_PARAMETER",
|
|
305
351
|
"message": (0, cleanSendedError_1.default)(err)
|
|
306
|
-
};
|
|
307
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
308
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.MISSING_PARAMETER, result,
|
|
352
|
+
});
|
|
353
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
354
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.MISSING_PARAMETER, result, {
|
|
355
|
+
"apiVersion": apiVersion,
|
|
356
|
+
"cors": this._cors,
|
|
357
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.MISSING_PARAMETER, responses)
|
|
358
|
+
});
|
|
309
359
|
}
|
|
310
360
|
else if (err instanceof TypeError) {
|
|
311
|
-
const result = {
|
|
361
|
+
const result = JSON.stringify({
|
|
312
362
|
"code": "WRONG_TYPE_PARAMETER",
|
|
313
363
|
"message": (0, cleanSendedError_1.default)(err)
|
|
314
|
-
};
|
|
315
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
316
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.WRONG_TYPE_PARAMETER, result,
|
|
364
|
+
});
|
|
365
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
366
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.WRONG_TYPE_PARAMETER, result, {
|
|
367
|
+
"apiVersion": apiVersion,
|
|
368
|
+
"cors": this._cors,
|
|
369
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.WRONG_TYPE_PARAMETER, responses)
|
|
370
|
+
});
|
|
317
371
|
}
|
|
318
372
|
else if (err instanceof RangeError) {
|
|
319
|
-
const result = {
|
|
373
|
+
const result = JSON.stringify({
|
|
320
374
|
"code": "EMPTY_OR_RANGE_OR_ENUM_PARAMETER",
|
|
321
375
|
"message": (0, cleanSendedError_1.default)(err)
|
|
322
|
-
};
|
|
323
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
324
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.EMPTY_OR_RANGE_OR_ENUM_PARAMETER, result,
|
|
376
|
+
});
|
|
377
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
378
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.EMPTY_OR_RANGE_OR_ENUM_PARAMETER, result, {
|
|
379
|
+
"apiVersion": apiVersion,
|
|
380
|
+
"cors": this._cors,
|
|
381
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.EMPTY_OR_RANGE_OR_ENUM_PARAMETER, responses)
|
|
382
|
+
});
|
|
325
383
|
}
|
|
326
384
|
else if (err instanceof SyntaxError) {
|
|
327
|
-
const result = {
|
|
385
|
+
const result = JSON.stringify({
|
|
328
386
|
"code": "JSON_PARSE",
|
|
329
387
|
"message": (0, cleanSendedError_1.default)(err)
|
|
330
|
-
};
|
|
331
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
332
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.JSON_PARSE, result,
|
|
388
|
+
});
|
|
389
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
390
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.JSON_PARSE, result, {
|
|
391
|
+
"apiVersion": apiVersion,
|
|
392
|
+
"cors": this._cors,
|
|
393
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.JSON_PARSE, responses)
|
|
394
|
+
});
|
|
333
395
|
}
|
|
334
396
|
else if (err instanceof NotFoundError_1.default) {
|
|
335
|
-
const result = {
|
|
397
|
+
const result = JSON.stringify({
|
|
336
398
|
"code": "NOT_FOUND",
|
|
337
399
|
"message": (0, cleanSendedError_1.default)(err)
|
|
338
|
-
};
|
|
339
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
340
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_FOUND, result,
|
|
400
|
+
});
|
|
401
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
402
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.NOT_FOUND, result, {
|
|
403
|
+
"apiVersion": apiVersion,
|
|
404
|
+
"cors": this._cors,
|
|
405
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.NOT_FOUND, responses)
|
|
406
|
+
});
|
|
341
407
|
}
|
|
342
408
|
else {
|
|
343
409
|
this._log("error", err);
|
|
344
|
-
const result = {
|
|
410
|
+
const result = JSON.stringify({
|
|
345
411
|
"code": "INTERNAL_SERVER_ERROR",
|
|
346
412
|
"message": (0, cleanSendedError_1.default)(err)
|
|
347
|
-
};
|
|
348
|
-
this._log("error", "<= [" + req.validatedIp + "] " +
|
|
349
|
-
return (0, send_1.default)(req, res, serverCodes_1.default.INTERNAL_SERVER_ERROR, result,
|
|
413
|
+
});
|
|
414
|
+
this._log("error", "<= [" + req.validatedIp + "] " + result);
|
|
415
|
+
return (0, send_1.default)(req, res, serverCodes_1.default.INTERNAL_SERVER_ERROR, result, {
|
|
416
|
+
"apiVersion": apiVersion,
|
|
417
|
+
"cors": this._cors,
|
|
418
|
+
"mime": (0, extractMime_1.default)(contentType, serverCodes_1.default.INTERNAL_SERVER_ERROR, responses)
|
|
419
|
+
});
|
|
350
420
|
}
|
|
351
421
|
// check response
|
|
352
422
|
}).then(() => {
|
|
@@ -11,7 +11,7 @@ const checkFile_1 = __importDefault(require("./checkFile"));
|
|
|
11
11
|
// module
|
|
12
12
|
function readJSONFile(file) {
|
|
13
13
|
return (0, checkFile_1.default)(file).then(() => {
|
|
14
|
-
return (0, promises_1.readFile)(file, "
|
|
14
|
+
return (0, promises_1.readFile)(file, "utf-8");
|
|
15
15
|
}).then((content) => {
|
|
16
16
|
return Promise.resolve(JSON.parse(content));
|
|
17
17
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function jsonParser(content: string): any;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// module
|
|
4
|
+
function jsonParser(content) {
|
|
5
|
+
try {
|
|
6
|
+
let parsed = JSON.parse(content);
|
|
7
|
+
if ("string" === typeof parsed) {
|
|
8
|
+
parsed = jsonParser(parsed);
|
|
9
|
+
}
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
return content;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.default = jsonParser;
|
|
17
|
+
;
|
|
@@ -1,7 +1,2 @@
|
|
|
1
1
|
import { iIncomingMessage } from "../../components/Server";
|
|
2
|
-
|
|
3
|
-
"value": string;
|
|
4
|
-
"parsed": any;
|
|
5
|
-
}
|
|
6
|
-
export default function extractBody(req: iIncomingMessage): Promise<iResult>;
|
|
7
|
-
export {};
|
|
2
|
+
export default function extractBody(req: iIncomingMessage): Promise<string>;
|
|
@@ -17,13 +17,10 @@ function extractBody(req) {
|
|
|
17
17
|
return new Promise((resolve, reject) => {
|
|
18
18
|
let queryData = "";
|
|
19
19
|
req.on("data", (data) => {
|
|
20
|
-
queryData += data.toString("
|
|
20
|
+
queryData += data.toString("utf-8");
|
|
21
21
|
}).on("end", () => {
|
|
22
22
|
if ("" === queryData || "null" === queryData) {
|
|
23
|
-
resolve(
|
|
24
|
-
"value": "",
|
|
25
|
-
"parsed": {}
|
|
26
|
-
});
|
|
23
|
+
resolve("");
|
|
27
24
|
}
|
|
28
25
|
else {
|
|
29
26
|
req.headers["content-length"] = parseInt(req.headers["content-length"], 10);
|
|
@@ -33,15 +30,7 @@ function extractBody(req) {
|
|
|
33
30
|
" Do not forget the fact that it is a 8-bit bytes number."));
|
|
34
31
|
}
|
|
35
32
|
else {
|
|
36
|
-
|
|
37
|
-
resolve({
|
|
38
|
-
"value": queryData,
|
|
39
|
-
"parsed": JSON.parse(queryData)
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
catch (e) {
|
|
43
|
-
reject(e);
|
|
44
|
-
}
|
|
33
|
+
resolve(queryData);
|
|
45
34
|
}
|
|
46
35
|
}
|
|
47
36
|
});
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// deps
|
|
4
|
+
// locals
|
|
5
|
+
const checkString_1 = require("../../checkers/TypeError/checkString");
|
|
6
|
+
const checkNonEmptyNumber_1 = require("../../checkers/RangeError/checkNonEmptyNumber");
|
|
7
|
+
const checkObject_1 = require("../../checkers/TypeError/checkObject");
|
|
8
|
+
// consts
|
|
9
|
+
const DEFAULT_MIME = "text/plain";
|
|
10
|
+
// module
|
|
11
|
+
function extractMime(contentType, code, responses) {
|
|
12
|
+
const err = (0, checkString_1.checkStringSync)("contentType", contentType) ||
|
|
13
|
+
(0, checkNonEmptyNumber_1.checkNonEmptyNumberSync)("code", code) ||
|
|
14
|
+
(0, checkObject_1.checkObjectSync)("responses", responses);
|
|
15
|
+
if (err) {
|
|
16
|
+
throw err;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const stringifiedCode = String(code);
|
|
20
|
+
if (!responses[stringifiedCode] && !responses.default && "" !== contentType.trim()) {
|
|
21
|
+
return contentType;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
let descriptorContent;
|
|
25
|
+
if (responses[stringifiedCode]) {
|
|
26
|
+
if (responses[stringifiedCode].content) {
|
|
27
|
+
descriptorContent = responses[stringifiedCode].content;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else if (responses.default && responses.default.content) {
|
|
31
|
+
descriptorContent = responses.default.content;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return DEFAULT_MIME;
|
|
35
|
+
}
|
|
36
|
+
const possibleMimes = descriptorContent ? Object.keys(descriptorContent) : [];
|
|
37
|
+
const [mimeRequest, charsetRequest] = contentType.split(";").map((content) => {
|
|
38
|
+
return content.trim().toLowerCase();
|
|
39
|
+
});
|
|
40
|
+
let result = DEFAULT_MIME; // default mime
|
|
41
|
+
if (!possibleMimes.length) {
|
|
42
|
+
if (mimeRequest) {
|
|
43
|
+
result = mimeRequest;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
result = DEFAULT_MIME;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (1 === possibleMimes.length) { // only one possible option
|
|
50
|
+
result = possibleMimes[0];
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
if (mimeRequest && possibleMimes.includes(mimeRequest)) {
|
|
54
|
+
result = mimeRequest;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result = DEFAULT_MIME;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (charsetRequest) {
|
|
61
|
+
result = mimeRequest + "; " + charsetRequest;
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.default = extractMime;
|
|
68
|
+
;
|
package/lib/cjs/utils/send.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
import { iIncomingMessage, iServerResponse } from "../components/Server";
|
|
2
|
-
export default function send(req: iIncomingMessage, res: iServerResponse, code: number, content:
|
|
2
|
+
export default function send(req: iIncomingMessage, res: iServerResponse, code: number, content: string, options: {
|
|
3
|
+
"apiVersion": string;
|
|
4
|
+
"cors": boolean;
|
|
5
|
+
"mime": string;
|
|
6
|
+
}): Promise<void>;
|
package/lib/cjs/utils/send.js
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// module
|
|
4
|
-
function send(req, res, code, content,
|
|
4
|
+
function send(req, res, code, content, options) {
|
|
5
5
|
return new Promise((resolve) => {
|
|
6
|
-
// formate content
|
|
7
|
-
if ("undefined" !== typeof content) {
|
|
8
|
-
res.body = JSON.stringify(content);
|
|
9
|
-
}
|
|
10
6
|
// force data for checking
|
|
11
7
|
res.statusCode = code;
|
|
12
8
|
res.headers = Object.assign({
|
|
13
|
-
"Content-Type":
|
|
14
|
-
"Content-Length":
|
|
9
|
+
"Content-Type": options.mime,
|
|
10
|
+
"Content-Length": content ? Buffer.byteLength(content) : 0,
|
|
15
11
|
"Status-Code-Url-Cat": "https://http.cat/" + code,
|
|
16
|
-
"API-Version": apiVersion
|
|
17
|
-
}, cors ? {
|
|
12
|
+
"API-Version": options.apiVersion
|
|
13
|
+
}, options.cors ? {
|
|
18
14
|
"Access-Control-Allow-Origin": "*",
|
|
19
15
|
"Access-Control-Allow-Credentials": true,
|
|
20
16
|
"Access-Control-Allow-Methods": req.headers["access-control-request-method"] ? req.headers["access-control-request-method"] : [
|
|
@@ -41,8 +37,9 @@ function send(req, res, code, content, apiVersion, cors) {
|
|
|
41
37
|
} : {});
|
|
42
38
|
// send data
|
|
43
39
|
res.writeHead(res.statusCode, res.headers);
|
|
44
|
-
if (
|
|
45
|
-
res.
|
|
40
|
+
if (content) {
|
|
41
|
+
res.body = content; // for Mediator response validator
|
|
42
|
+
res.end(content, "utf-8", () => {
|
|
46
43
|
resolve();
|
|
47
44
|
});
|
|
48
45
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
|
|
3
3
|
"name": "node-pluginsmanager-plugin",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "6.0.0",
|
|
5
5
|
"description": "An abstract parent plugin for node-pluginsmanager",
|
|
6
6
|
|
|
7
7
|
"type": "commonjs",
|
|
@@ -44,14 +44,15 @@
|
|
|
44
44
|
"uniqid": "5.4.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@types/express": "4.17.
|
|
48
|
-
"@types/node": "20.
|
|
47
|
+
"@types/express": "4.17.21",
|
|
48
|
+
"@types/node": "20.10.1",
|
|
49
49
|
"@types/socket.io": "3.0.2",
|
|
50
|
-
"@types/uniqid": "5.3.
|
|
51
|
-
"@types/ws": "8.5.
|
|
52
|
-
"check-version-modules": "
|
|
50
|
+
"@types/uniqid": "5.3.4",
|
|
51
|
+
"@types/ws": "8.5.10",
|
|
52
|
+
"check-version-modules": "2.0.0",
|
|
53
53
|
"coveralls": "3.1.1",
|
|
54
54
|
"colors": "1.4.0",
|
|
55
|
+
"eslint": "8.54.0",
|
|
55
56
|
"express": "4.18.2",
|
|
56
57
|
"husky": "8.0.3",
|
|
57
58
|
"mocha": "10.2.0",
|
|
@@ -59,9 +60,9 @@
|
|
|
59
60
|
"openapi-types": "12.1.3",
|
|
60
61
|
"socket.io": "4.7.2",
|
|
61
62
|
"socket.io-client": "4.7.2",
|
|
62
|
-
"typescript": "5.
|
|
63
|
-
"used-deps-analyzer": "0.1.
|
|
64
|
-
"ws": "8.
|
|
63
|
+
"typescript": "5.3.2",
|
|
64
|
+
"used-deps-analyzer": "0.1.8",
|
|
65
|
+
"ws": "8.14.2"
|
|
65
66
|
},
|
|
66
67
|
"optionalDependencies": {},
|
|
67
68
|
|