alado 2.8.3 → 3.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/dist/decorators/access-control.js +2 -1
- package/dist/decorators/access-control.js.map +1 -1
- package/dist/decorators/class-key.d.ts +4 -0
- package/dist/decorators/class-key.js +23 -0
- package/dist/decorators/class-key.js.map +1 -0
- package/dist/decorators/controller-instances.d.ts +1 -0
- package/dist/decorators/controller-instances.js +8 -0
- package/dist/decorators/controller-instances.js.map +1 -0
- package/dist/decorators/define-request.js +4 -2
- package/dist/decorators/define-request.js.map +1 -1
- package/dist/decorators/define-response.js +2 -1
- package/dist/decorators/define-response.js.map +1 -1
- package/dist/decorators/document-property.js +2 -1
- package/dist/decorators/document-property.js.map +1 -1
- package/dist/decorators/file-upload-property.js +2 -1
- package/dist/decorators/file-upload-property.js.map +1 -1
- package/dist/decorators/http.js +7 -2
- package/dist/decorators/http.js.map +1 -1
- package/dist/decorators/initialize-application.js +2 -1
- package/dist/decorators/initialize-application.js.map +1 -1
- package/dist/decorators/transform-property.js +2 -1
- package/dist/decorators/transform-property.js.map +1 -1
- package/dist/decorators/validate-property.js +2 -1
- package/dist/decorators/validate-property.js.map +1 -1
- package/dist/decorators/with-auth.js +2 -1
- package/dist/decorators/with-auth.js.map +1 -1
- package/dist/factory/open-api-doc-factory.js +1 -1
- package/dist/factory/open-api-doc-factory.js.map +1 -1
- package/dist/helpers/accessor/get-property.d.ts +4 -0
- package/dist/helpers/accessor/get-property.js +15 -2
- package/dist/helpers/accessor/get-property.js.map +1 -1
- package/dist/helpers/parser/authenticate.js +4 -6
- package/dist/helpers/parser/authenticate.js.map +1 -1
- package/dist/helpers/parser/body-parser.d.ts +1 -0
- package/dist/helpers/parser/body-parser.js +22 -8
- package/dist/helpers/parser/body-parser.js.map +1 -1
- package/dist/helpers/parser/query-parser.d.ts +5 -0
- package/dist/helpers/parser/query-parser.js +51 -22
- package/dist/helpers/parser/query-parser.js.map +1 -1
- package/dist/helpers/parser/xml-parser.js +25 -5
- package/dist/helpers/parser/xml-parser.js.map +1 -1
- package/dist/helpers/validate/built-in/validator.d.ts +2 -0
- package/dist/helpers/validate/built-in/validator.js +49 -7
- package/dist/helpers/validate/built-in/validator.js.map +1 -1
- package/dist/helpers/validate/context/validate-request-part.js +3 -5
- package/dist/helpers/validate/context/validate-request-part.js.map +1 -1
- package/dist/request-processor/request-processor.d.ts +13 -0
- package/dist/request-processor/request-processor.js +103 -48
- package/dist/request-processor/request-processor.js.map +1 -1
- package/dist/router/router.d.ts +10 -0
- package/dist/router/router.js +35 -13
- package/dist/router/router.js.map +1 -1
- package/package.json +6 -4
|
@@ -1,31 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.queryParser = queryParser;
|
|
4
|
+
const unsafeKeys = new Set([
|
|
5
|
+
'__proto__',
|
|
6
|
+
'constructor',
|
|
7
|
+
'prototype',
|
|
8
|
+
]);
|
|
9
|
+
function decodeComponent(value) {
|
|
10
|
+
try {
|
|
11
|
+
// query strings encode spaces as '+' (application/x-www-form-urlencoded)
|
|
12
|
+
return decodeURIComponent(value.replace(/\+/g, ' '));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw Object.assign(new Error('Malformed query string'), { statusCode: 400 });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Splits on '&' and the first '=' BEFORE decoding, so encoded '&' / '=' stay
|
|
20
|
+
* inside values. Keys without a value are skipped (as before); `key[]` and
|
|
21
|
+
* repeated keys produce arrays. Malformed percent-encoding throws a 400 error.
|
|
22
|
+
*/
|
|
4
23
|
function queryParser(queryString) {
|
|
5
24
|
const query = {};
|
|
6
|
-
if (queryString) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
if (!queryString) {
|
|
26
|
+
return query;
|
|
27
|
+
}
|
|
28
|
+
for (const part of queryString.split('&')) {
|
|
29
|
+
const separator = part.indexOf('=');
|
|
30
|
+
if (separator <= 0) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const key = decodeComponent(part.slice(0, separator));
|
|
34
|
+
const value = decodeComponent(part.slice(separator + 1));
|
|
35
|
+
if (!key || !value) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (/\w+\[\]$/.test(key)) {
|
|
39
|
+
const k = key.replace(/\[\]$/, '');
|
|
40
|
+
if (unsafeKeys.has(k)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
query[k] = Array.isArray(query[k]) ? query[k] : [];
|
|
44
|
+
query[k].push(value);
|
|
45
|
+
}
|
|
46
|
+
else if (unsafeKeys.has(key)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
else if (Object.prototype.hasOwnProperty.call(query, key)) {
|
|
50
|
+
if (!Array.isArray(query[key])) {
|
|
51
|
+
query[key] = [query[key]];
|
|
27
52
|
}
|
|
28
|
-
|
|
53
|
+
query[key].push(value);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
query[key] = value;
|
|
57
|
+
}
|
|
29
58
|
}
|
|
30
59
|
return query;
|
|
31
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/query-parser.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"query-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/query-parser.ts"],"names":[],"mappings":";;AAsBA,kCAkCC;AAtDD,MAAM,UAAU,GAAgB,IAAI,GAAG,CAAC;IACtC,WAAW;IACX,aAAa;IACb,WAAW;CACZ,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC;QACH,yEAAyE;QACzE,OAAO,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAsB,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,WAAmB;IAC7C,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAW,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAW,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAW,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAW,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.xmlParser = xmlParser;
|
|
4
|
+
// Same keys the JSON body parser drops: assigning them on a plain object can
|
|
5
|
+
// replace its prototype (__proto__) or shadow built-ins.
|
|
6
|
+
const unsafeKeys = new Set([
|
|
7
|
+
'__proto__',
|
|
8
|
+
'constructor',
|
|
9
|
+
'prototype',
|
|
10
|
+
]);
|
|
4
11
|
function xmlParser(xmlInput) {
|
|
5
12
|
let xml = xmlInput;
|
|
6
13
|
let pos = 0;
|
|
@@ -23,7 +30,9 @@ function xmlParser(xmlInput) {
|
|
|
23
30
|
while (match !== null) {
|
|
24
31
|
const name = match[1] || match[3];
|
|
25
32
|
const value = match[2] !== undefined ? match[2] : match[4];
|
|
26
|
-
|
|
33
|
+
if (!unsafeKeys.has(name)) {
|
|
34
|
+
attrs[name] = decodeEntities(value);
|
|
35
|
+
}
|
|
27
36
|
match = attrRegex.exec(tagContent);
|
|
28
37
|
}
|
|
29
38
|
return attrs;
|
|
@@ -68,6 +77,9 @@ function xmlParser(xmlInput) {
|
|
|
68
77
|
return { localName, namespaceUri };
|
|
69
78
|
}
|
|
70
79
|
function addChild(parent, key, value) {
|
|
80
|
+
if (unsafeKeys.has(key)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
71
83
|
if (Object.prototype.hasOwnProperty.call(parent, key)) {
|
|
72
84
|
const existing = parent[key];
|
|
73
85
|
if (Array.isArray(existing)) {
|
|
@@ -115,11 +127,13 @@ function xmlParser(xmlInput) {
|
|
|
115
127
|
const children = {};
|
|
116
128
|
let textContent = '';
|
|
117
129
|
let sawChildElement = false;
|
|
130
|
+
let closed = false;
|
|
118
131
|
while (pos < xml.length) {
|
|
119
132
|
skipWhitespace();
|
|
120
|
-
const closeMatch = new RegExp(`^</${rawTagName}\\s*>`).exec(xml.slice(pos));
|
|
133
|
+
const closeMatch = new RegExp(`^</${rawTagName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*>`).exec(xml.slice(pos));
|
|
121
134
|
if (closeMatch) {
|
|
122
135
|
pos += closeMatch[0].length;
|
|
136
|
+
closed = true;
|
|
123
137
|
break;
|
|
124
138
|
}
|
|
125
139
|
if (xml[pos] === '<') {
|
|
@@ -128,6 +142,7 @@ function xmlParser(xmlInput) {
|
|
|
128
142
|
if (end === -1) {
|
|
129
143
|
throw new Error('Unterminated CDATA section');
|
|
130
144
|
}
|
|
145
|
+
// CDATA is literal: no entity decoding
|
|
131
146
|
textContent += xml.slice(pos + 9, end);
|
|
132
147
|
pos = end + 3;
|
|
133
148
|
continue;
|
|
@@ -142,11 +157,14 @@ function xmlParser(xmlInput) {
|
|
|
142
157
|
else {
|
|
143
158
|
const nextTag = xml.indexOf('<', pos);
|
|
144
159
|
const end = nextTag === -1 ? xml.length : nextTag;
|
|
145
|
-
textContent += xml.slice(pos, end);
|
|
160
|
+
textContent += decodeEntities(xml.slice(pos, end));
|
|
146
161
|
pos = end;
|
|
147
162
|
}
|
|
148
163
|
}
|
|
149
|
-
|
|
164
|
+
if (!closed) {
|
|
165
|
+
throw new Error(`Unclosed element <${rawTagName}>`);
|
|
166
|
+
}
|
|
167
|
+
const trimmedText = textContent.trim();
|
|
150
168
|
if (sawChildElement) {
|
|
151
169
|
children['@ns'] = namespaceUri;
|
|
152
170
|
if (hasAttrs) {
|
|
@@ -182,7 +200,9 @@ function xmlParser(xmlInput) {
|
|
|
182
200
|
const rootElement = parseElement(rootScope);
|
|
183
201
|
if (rootElement) {
|
|
184
202
|
const [rootName, rootValue,] = rootElement;
|
|
185
|
-
|
|
203
|
+
if (!unsafeKeys.has(rootName)) {
|
|
204
|
+
root[rootName] = rootValue;
|
|
205
|
+
}
|
|
186
206
|
}
|
|
187
207
|
return root;
|
|
188
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/xml-parser.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/xml-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
type ValidatorFn = (input: any, root?: any) => boolean | Promise<boolean>;
|
|
2
|
+
type SyncValidatorFn = (input: any, root?: any) => boolean;
|
|
2
3
|
declare class Validator {
|
|
3
4
|
private rules;
|
|
4
5
|
private _required;
|
|
@@ -36,6 +37,7 @@ declare class Validator {
|
|
|
36
37
|
maxItems(n: number): Validator;
|
|
37
38
|
unique(): Validator;
|
|
38
39
|
build(): (input: any, root?: any) => Promise<boolean>;
|
|
40
|
+
buildSync(): SyncValidatorFn;
|
|
39
41
|
}
|
|
40
42
|
export declare const validate: {
|
|
41
43
|
string: () => Validator;
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validate = void 0;
|
|
4
|
+
const ASYNC_RULE_ERROR = 'Validator contains async rules — use .build() instead of .buildSync()';
|
|
5
|
+
function isThenable(value) {
|
|
6
|
+
return value !== null && typeof value === 'object' && typeof value.then === 'function';
|
|
7
|
+
}
|
|
8
|
+
function isAsyncFunction(fn) {
|
|
9
|
+
return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';
|
|
10
|
+
}
|
|
11
|
+
// Stays synchronous when every result is synchronous, so composed
|
|
12
|
+
// validators built with .buildSync() can be nested in shape() / items().
|
|
13
|
+
function every(results) {
|
|
14
|
+
if (results.some(isThenable)) {
|
|
15
|
+
return Promise.all(results).then((r) => r.every(Boolean));
|
|
16
|
+
}
|
|
17
|
+
return results.every(Boolean);
|
|
18
|
+
}
|
|
4
19
|
class Validator {
|
|
5
20
|
rules = [];
|
|
6
21
|
_required = false;
|
|
@@ -88,12 +103,11 @@ class Validator {
|
|
|
88
103
|
}
|
|
89
104
|
// Object rules
|
|
90
105
|
shape(schema) {
|
|
91
|
-
return this.add(
|
|
106
|
+
return this.add((v) => {
|
|
92
107
|
if (typeof v !== 'object' || v === null || Array.isArray(v)) {
|
|
93
108
|
return false;
|
|
94
109
|
}
|
|
95
|
-
|
|
96
|
-
return results.every(Boolean);
|
|
110
|
+
return every(Object.entries(schema).map(([key, fn,]) => fn(v[key], v)));
|
|
97
111
|
});
|
|
98
112
|
}
|
|
99
113
|
minKeys(n) {
|
|
@@ -146,7 +160,8 @@ class Validator {
|
|
|
146
160
|
return true;
|
|
147
161
|
}
|
|
148
162
|
const caseKey = String(ctx[key]);
|
|
149
|
-
|
|
163
|
+
// own keys only: 'constructor', 'toString', ... must not resolve to Object.prototype
|
|
164
|
+
const fn = Object.prototype.hasOwnProperty.call(cases, caseKey) ? cases[caseKey] : fallback;
|
|
150
165
|
if (!fn) {
|
|
151
166
|
return true;
|
|
152
167
|
}
|
|
@@ -155,12 +170,11 @@ class Validator {
|
|
|
155
170
|
}
|
|
156
171
|
// Array rules
|
|
157
172
|
items(fn) {
|
|
158
|
-
return this.add(
|
|
173
|
+
return this.add((v) => {
|
|
159
174
|
if (!Array.isArray(v)) {
|
|
160
175
|
return false;
|
|
161
176
|
}
|
|
162
|
-
|
|
163
|
-
return results.every(Boolean);
|
|
177
|
+
return every(v.map((item) => fn(item)));
|
|
164
178
|
});
|
|
165
179
|
}
|
|
166
180
|
minItems(n) {
|
|
@@ -190,6 +204,34 @@ class Validator {
|
|
|
190
204
|
return true;
|
|
191
205
|
};
|
|
192
206
|
}
|
|
207
|
+
// Same semantics as build(), but returns a plain boolean. Throws if any rule
|
|
208
|
+
// is async: eagerly for async functions passed to custom()/when()/match(),
|
|
209
|
+
// and at call time for any rule that returns a Promise.
|
|
210
|
+
buildSync() {
|
|
211
|
+
const rules = [...this.rules];
|
|
212
|
+
const required = this._required;
|
|
213
|
+
if (rules.some(isAsyncFunction)) {
|
|
214
|
+
throw new Error(ASYNC_RULE_ERROR);
|
|
215
|
+
}
|
|
216
|
+
return (input, root) => {
|
|
217
|
+
const isEmpty = input === null || input === undefined || input === '';
|
|
218
|
+
if (isEmpty) {
|
|
219
|
+
return !required;
|
|
220
|
+
}
|
|
221
|
+
for (const rule of rules) {
|
|
222
|
+
const ok = rule(input, root);
|
|
223
|
+
if (isThenable(ok)) {
|
|
224
|
+
// avoid an unhandled rejection from the promise we are discarding
|
|
225
|
+
Promise.resolve(ok).catch(() => undefined);
|
|
226
|
+
throw new Error(ASYNC_RULE_ERROR);
|
|
227
|
+
}
|
|
228
|
+
if (!ok) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return true;
|
|
233
|
+
};
|
|
234
|
+
}
|
|
193
235
|
}
|
|
194
236
|
// Entry point
|
|
195
237
|
exports.validate = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../../src/helpers/validate/built-in/validator.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../../src/helpers/validate/built-in/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,11 +43,9 @@ async function validateRequestPart(key, context, request) {
|
|
|
43
43
|
request[key][property] = await transform.apply(request, [value]);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
catch
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
message: e.message,
|
|
50
|
-
};
|
|
46
|
+
catch {
|
|
47
|
+
// the configured error, never the exception text (it may describe internals)
|
|
48
|
+
return error;
|
|
51
49
|
}
|
|
52
50
|
}
|
|
53
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-request-part.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-part.ts"],"names":[],"mappings":";;AAOA,
|
|
1
|
+
{"version":3,"file":"validate-request-part.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-part.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
2
2
|
import { RequestProcessorOptions } from '../options/index.js';
|
|
3
3
|
import { AladoServerError, Response } from '../dto/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Maps a request URL to a Swagger UI asset name, or undefined if it is not one.
|
|
6
|
+
* The result is always an exact entry of the swagger-ui-dist listing, so no
|
|
7
|
+
* part of the URL ever reaches the filesystem (no `..`, no subdirectories).
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveSwaggerUiFile(url: string, docsRoute: string): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Errors that carry an HTTP status (thrown on purpose, e.g. `{ statusCode: 404,
|
|
12
|
+
* message }`, or produced by the body parser) keep their status and message.
|
|
13
|
+
* Anything else is an internal failure: the client gets a generic 500 and the
|
|
14
|
+
* details only go to the logger.
|
|
15
|
+
*/
|
|
16
|
+
export declare function toClientError(e: any): AladoServerError;
|
|
4
17
|
export declare class RequestProcessor {
|
|
5
18
|
private readonly options;
|
|
6
19
|
constructor(requestProcessorOptions: RequestProcessorOptions);
|
|
@@ -1,12 +1,51 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RequestProcessor = void 0;
|
|
4
|
+
exports.resolveSwaggerUiFile = resolveSwaggerUiFile;
|
|
5
|
+
exports.toClientError = toClientError;
|
|
4
6
|
const path_1 = require("path");
|
|
5
7
|
const fs_1 = require("fs");
|
|
6
8
|
const _const_1 = require("../constants/index.js");
|
|
7
9
|
const _helper_1 = require("../helpers/index.js");
|
|
8
10
|
const swaggerUiAssetPath = require('swagger-ui-dist').absolutePath();
|
|
9
|
-
|
|
11
|
+
// Only regular files directly inside swagger-ui-dist are ever served.
|
|
12
|
+
const swaggerUiFiles = new Set((0, fs_1.readdirSync)(swaggerUiAssetPath, { withFileTypes: true })
|
|
13
|
+
.filter((entry) => entry.isFile())
|
|
14
|
+
.map((entry) => entry.name));
|
|
15
|
+
/**
|
|
16
|
+
* Maps a request URL to a Swagger UI asset name, or undefined if it is not one.
|
|
17
|
+
* The result is always an exact entry of the swagger-ui-dist listing, so no
|
|
18
|
+
* part of the URL ever reaches the filesystem (no `..`, no subdirectories).
|
|
19
|
+
*/
|
|
20
|
+
function resolveSwaggerUiFile(url, docsRoute) {
|
|
21
|
+
const route = (0, _helper_1.clearRoutePath)(docsRoute || '');
|
|
22
|
+
const pathname = url.split('?')[0];
|
|
23
|
+
let name;
|
|
24
|
+
if (pathname === route) {
|
|
25
|
+
name = 'index.html';
|
|
26
|
+
}
|
|
27
|
+
else if (route && pathname.startsWith(`${route}/`)) {
|
|
28
|
+
name = pathname.slice(route.length + 1);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// index.html references its assets relatively, so they are requested from the root
|
|
32
|
+
name = pathname.replace(/^\//, '');
|
|
33
|
+
}
|
|
34
|
+
return swaggerUiFiles.has(name) ? name : undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Errors that carry an HTTP status (thrown on purpose, e.g. `{ statusCode: 404,
|
|
38
|
+
* message }`, or produced by the body parser) keep their status and message.
|
|
39
|
+
* Anything else is an internal failure: the client gets a generic 500 and the
|
|
40
|
+
* details only go to the logger.
|
|
41
|
+
*/
|
|
42
|
+
function toClientError(e) {
|
|
43
|
+
const statusCode = e?.statusCode;
|
|
44
|
+
if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 600 && typeof e?.message === 'string') {
|
|
45
|
+
return { statusCode, message: e.message };
|
|
46
|
+
}
|
|
47
|
+
return { statusCode: 500, message: 'Internal Server Error' };
|
|
48
|
+
}
|
|
10
49
|
class RequestProcessor {
|
|
11
50
|
options;
|
|
12
51
|
constructor(requestProcessorOptions) {
|
|
@@ -14,12 +53,26 @@ class RequestProcessor {
|
|
|
14
53
|
}
|
|
15
54
|
respond(res, response, backgroundHeaders = {}) {
|
|
16
55
|
let responseBody;
|
|
17
|
-
const { statusCode,
|
|
56
|
+
const { statusCode, body } = response;
|
|
57
|
+
const headers = { ...(response.headers || {}) };
|
|
18
58
|
const isStreamBody = (0, _helper_1.isReadableStream)(body);
|
|
19
|
-
const
|
|
59
|
+
const contentTypeKey = Object.keys(headers).find((h) => h.toLowerCase() === 'content-type');
|
|
60
|
+
const contentType = contentTypeKey ? headers[contentTypeKey] : undefined;
|
|
61
|
+
const isRawBody = body === undefined ||
|
|
62
|
+
body === null ||
|
|
63
|
+
typeof body === 'string' ||
|
|
64
|
+
Buffer.isBuffer(body) ||
|
|
65
|
+
body instanceof Uint8Array;
|
|
20
66
|
if (contentType?.startsWith(_const_1.ContentType.JSON)) {
|
|
21
67
|
responseBody = isStreamBody ? body : JSON.stringify(body);
|
|
22
68
|
}
|
|
69
|
+
else if (!isStreamBody && !isRawBody) {
|
|
70
|
+
// res.end() only accepts strings and buffers: serialise anything else as JSON
|
|
71
|
+
if (!contentType) {
|
|
72
|
+
headers['Content-Type'] = _const_1.ContentType.JSON;
|
|
73
|
+
}
|
|
74
|
+
responseBody = JSON.stringify(body);
|
|
75
|
+
}
|
|
23
76
|
else {
|
|
24
77
|
responseBody = body;
|
|
25
78
|
}
|
|
@@ -32,6 +85,11 @@ class RequestProcessor {
|
|
|
32
85
|
}
|
|
33
86
|
}
|
|
34
87
|
respondError(res, error, headers = {}) {
|
|
88
|
+
if (res.headersSent) {
|
|
89
|
+
// too late for an error response: the status line is already on the wire
|
|
90
|
+
res.destroy();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
35
93
|
const { statusCode, message } = error;
|
|
36
94
|
return this.respond(res, {
|
|
37
95
|
statusCode,
|
|
@@ -49,40 +107,34 @@ class RequestProcessor {
|
|
|
49
107
|
// Process Open API routes
|
|
50
108
|
if (openApiDoc?.enable) {
|
|
51
109
|
if (method === _const_1.HttpMethod.GET) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
110
|
+
const swaggerFile = req.url?.startsWith(`/swagger.json`)
|
|
111
|
+
? undefined
|
|
112
|
+
: resolveSwaggerUiFile(url, openApiDoc.route);
|
|
113
|
+
if (swaggerFile) {
|
|
114
|
+
// swaggerFile is a bare name from the swagger-ui-dist listing, never a path from the URL
|
|
115
|
+
const filePath = (0, path_1.join)(swaggerUiAssetPath, swaggerFile);
|
|
116
|
+
if (swaggerFile === _const_1.SWAGGER_INITIALIZER_FILE_NAME) {
|
|
117
|
+
const initFileContent = (0, fs_1.readFileSync)(filePath)
|
|
118
|
+
.toString()
|
|
119
|
+
.replace('https://petstore.swagger.io/v2/swagger.json', '/swagger.json');
|
|
120
|
+
res.writeHead(200, {
|
|
121
|
+
'Content-Type': 'application/javascript; charset=utf-8',
|
|
122
|
+
'Content-Length': Buffer.byteLength(initFileContent),
|
|
123
|
+
});
|
|
124
|
+
res.end(initFileContent);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const stream = (0, fs_1.createReadStream)(filePath);
|
|
128
|
+
stream.on('error', () => {
|
|
129
|
+
if (!res.headersSent) {
|
|
130
|
+
this.respond(res, { statusCode: 404, headers: { 'Content-Type': 'text/plain' }, body: 'Not Found' });
|
|
69
131
|
}
|
|
70
132
|
else {
|
|
71
|
-
|
|
72
|
-
const initFileContent = (0, fs_1.readFileSync)(filePath)
|
|
73
|
-
.toString()
|
|
74
|
-
.replace('https://petstore.swagger.io/v2/swagger.json', '/swagger.json');
|
|
75
|
-
res.writeHead(200, {
|
|
76
|
-
'Content-Type': 'application/json; charset=utf-8',
|
|
77
|
-
'Content-Length': Buffer.byteLength(initFileContent),
|
|
78
|
-
});
|
|
79
|
-
res.end(initFileContent);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
(0, fs_1.createReadStream)(filePath).pipe(res);
|
|
83
|
-
}
|
|
133
|
+
res.destroy();
|
|
84
134
|
}
|
|
85
135
|
});
|
|
136
|
+
stream.pipe(res);
|
|
137
|
+
return;
|
|
86
138
|
}
|
|
87
139
|
else if (req.url?.startsWith(`/swagger.json`)) {
|
|
88
140
|
return this.respond(res, {
|
|
@@ -96,20 +148,23 @@ class RequestProcessor {
|
|
|
96
148
|
// Process API routes
|
|
97
149
|
const [uri, queryString,] = url.split('?');
|
|
98
150
|
const route = router.parse(method, (0, _helper_1.clearRoutePath)(uri));
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
151
|
+
let backgroundHeaders = {};
|
|
152
|
+
if (this.options.enableCors) {
|
|
153
|
+
backgroundHeaders = {
|
|
154
|
+
'Access-Control-Allow-Methods': route?.allowedMethods?.join(', ') || '',
|
|
155
|
+
'Access-Control-Allow-Headers': this.options.router.options.cors?.allowedHeaders?.join(', ') || '',
|
|
156
|
+
'Access-Control-Expose-Headers': this.options.router.options.cors?.exposeHeaders?.join(', ') || '',
|
|
157
|
+
'Access-Control-Allow-Credentials': this.options.router.options.cors?.allowedCredentials ? 'true' : 'false',
|
|
158
|
+
};
|
|
159
|
+
if (Array.isArray(this.options.router.options.cors.allowedOrigin)) {
|
|
160
|
+
if (this.options.router.options.cors.allowedOrigin.includes(origin)) {
|
|
161
|
+
backgroundHeaders['Access-Control-Allow-Origin'] = origin;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
backgroundHeaders['Access-Control-Allow-Origin'] =
|
|
166
|
+
this.options.router.options.cors.allowedOrigin || origin;
|
|
108
167
|
}
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
backgroundHeaders['Access-Control-Allow-Origin'] =
|
|
112
|
-
this.options.router.options.cors.allowedOrigin || origin;
|
|
113
168
|
}
|
|
114
169
|
if (!route) {
|
|
115
170
|
// Not Found
|
|
@@ -200,13 +255,13 @@ class RequestProcessor {
|
|
|
200
255
|
}
|
|
201
256
|
catch (e) {
|
|
202
257
|
this.logError(e);
|
|
203
|
-
return this.respondError(res,
|
|
258
|
+
return this.respondError(res, toClientError(e), backgroundHeaders);
|
|
204
259
|
}
|
|
205
260
|
}
|
|
206
261
|
}
|
|
207
262
|
catch (e) {
|
|
208
263
|
this.logError(e);
|
|
209
|
-
return this.respondError(res,
|
|
264
|
+
return this.respondError(res, toClientError(e), {});
|
|
210
265
|
}
|
|
211
266
|
}
|
|
212
267
|
logError(e) {
|