exisjs 0.7.14 → 0.8.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/LICENSE +21 -0
- package/README.md +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +4 -37
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +10 -0
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +9 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/database/lifecycle.d.ts +7 -0
- package/dist/database/lifecycle.d.ts.map +1 -1
- package/dist/database/lifecycle.js +30 -7
- package/dist/database/lifecycle.js.map +1 -1
- package/dist/decorators/caching.d.ts +2 -5
- package/dist/decorators/caching.d.ts.map +1 -1
- package/dist/decorators/caching.js +7 -61
- package/dist/decorators/caching.js.map +1 -1
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +5 -0
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/cron.d.ts +1 -0
- package/dist/decorators/cron.d.ts.map +1 -1
- package/dist/decorators/cron.js +4 -1
- package/dist/decorators/cron.js.map +1 -1
- package/dist/di/container.d.ts +1 -0
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +19 -3
- package/dist/di/container.js.map +1 -1
- package/dist/docs/ARCHITECTURE.md +11 -24
- package/dist/docs/BENCHMARKS.md +59 -26
- package/dist/docs/README.md +1 -1
- package/dist/docs/content/boundaries.mdx +2 -0
- package/dist/docs/content/cli/commands.mdx +1 -2
- package/dist/docs/content/cli/overview.mdx +1 -1
- package/dist/docs/content/config.mdx +22 -9
- package/dist/docs/content/cron.mdx +2 -2
- package/dist/docs/content/decorators.mdx +2 -2
- package/dist/docs/content/errors.mdx +22 -6
- package/dist/docs/content/installation.mdx +13 -8
- package/dist/docs/content/introduction.mdx +12 -12
- package/dist/docs/content/middleware.mdx +1 -1
- package/dist/docs/content/providers.mdx +4 -4
- package/dist/docs/content/requests.mdx +12 -1
- package/dist/docs/content/responses.mdx +44 -3
- package/dist/docs/content/routing.mdx +24 -0
- package/dist/docs/content/structure.mdx +4 -1
- package/dist/docs/content/testing.mdx +2 -0
- package/dist/docs/content/validation.mdx +16 -2
- package/dist/docs/reference/README.md +1 -1
- package/dist/docs/reference/config.mdx +1 -1
- package/dist/docs/reference/decorators.mdx +2 -2
- package/dist/docs/reference/di.mdx +1 -1
- package/dist/docs/reference/middleware.mdx +7 -5
- package/dist/docs/reference/sanitize.mdx +4 -4
- package/dist/docs/reference/validator.mdx +1 -1
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +31 -8
- package/dist/error/errors.js.map +1 -1
- package/dist/lib/start-server.js +5 -1
- package/dist/lib/start-server.js.map +1 -1
- package/dist/middleware/compression.d.ts +0 -12
- package/dist/middleware/compression.d.ts.map +1 -1
- package/dist/middleware/compression.js +52 -41
- package/dist/middleware/compression.js.map +1 -1
- package/dist/middleware/idempotency.d.ts +11 -6
- package/dist/middleware/idempotency.d.ts.map +1 -1
- package/dist/middleware/idempotency.js +5 -35
- package/dist/middleware/idempotency.js.map +1 -1
- package/dist/middleware/ip-filter.d.ts.map +1 -1
- package/dist/middleware/ip-filter.js +0 -16
- package/dist/middleware/ip-filter.js.map +1 -1
- package/dist/middleware/middleware.d.ts +2 -1
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +92 -56
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +19 -38
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +3 -1
- package/dist/middleware/security.js.map +1 -1
- package/dist/middleware/upload.d.ts.map +1 -1
- package/dist/middleware/upload.js +15 -7
- package/dist/middleware/upload.js.map +1 -1
- package/dist/response/index.d.ts +23 -0
- package/dist/response/index.d.ts.map +1 -1
- package/dist/response/index.js +28 -1
- package/dist/response/index.js.map +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/router/radix.d.ts +3 -16
- package/dist/router/radix.d.ts.map +1 -1
- package/dist/router/radix.js +135 -211
- package/dist/router/radix.js.map +1 -1
- package/dist/router/route-builder.d.ts +28 -0
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts +2 -1
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +37 -44
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +153 -126
- package/dist/router/router.js.map +1 -1
- package/dist/router/scanner/boundary-loader.d.ts.map +1 -1
- package/dist/router/scanner/boundary-loader.js +7 -2
- package/dist/router/scanner/boundary-loader.js.map +1 -1
- package/dist/router/scanner/functional-compiler.d.ts.map +1 -1
- package/dist/router/scanner/functional-compiler.js +9 -1
- package/dist/router/scanner/functional-compiler.js.map +1 -1
- package/dist/sanitize/index.d.ts +2 -3
- package/dist/sanitize/index.d.ts.map +1 -1
- package/dist/sanitize/index.js +15 -20
- package/dist/sanitize/index.js.map +1 -1
- package/dist/server/adapters/bun-adapter.d.ts +2 -1
- package/dist/server/adapters/bun-adapter.d.ts.map +1 -1
- package/dist/server/adapters/bun-adapter.js +22 -2
- package/dist/server/adapters/bun-adapter.js.map +1 -1
- package/dist/server/app.d.ts +2 -2
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +14 -7
- package/dist/server/app.js.map +1 -1
- package/dist/server/bootstrapper.d.ts +2 -2
- package/dist/server/bootstrapper.d.ts.map +1 -1
- package/dist/server/bootstrapper.js +2 -2
- package/dist/server/bootstrapper.js.map +1 -1
- package/dist/server/download.d.ts +22 -0
- package/dist/server/download.d.ts.map +1 -0
- package/dist/server/download.js +18 -0
- package/dist/server/download.js.map +1 -0
- package/dist/server/helpers/body-parser.d.ts +1 -1
- package/dist/server/helpers/body-parser.d.ts.map +1 -1
- package/dist/server/helpers/body-parser.js +126 -48
- package/dist/server/helpers/body-parser.js.map +1 -1
- package/dist/server/helpers/cookie.d.ts +6 -0
- package/dist/server/helpers/cookie.d.ts.map +1 -1
- package/dist/server/helpers/cookie.js +35 -0
- package/dist/server/helpers/cookie.js.map +1 -1
- package/dist/server/helpers/etag.d.ts.map +1 -1
- package/dist/server/helpers/etag.js +7 -2
- package/dist/server/helpers/etag.js.map +1 -1
- package/dist/server/helpers/index.d.ts +2 -1
- package/dist/server/helpers/index.d.ts.map +1 -1
- package/dist/server/helpers/index.js +5 -1
- package/dist/server/helpers/index.js.map +1 -1
- package/dist/server/helpers/ip.d.ts +13 -0
- package/dist/server/helpers/ip.d.ts.map +1 -1
- package/dist/server/helpers/ip.js +65 -54
- package/dist/server/helpers/ip.js.map +1 -1
- package/dist/server/helpers/json.d.ts +3 -0
- package/dist/server/helpers/json.d.ts.map +1 -0
- package/dist/server/helpers/json.js +43 -0
- package/dist/server/helpers/json.js.map +1 -0
- package/dist/server/helpers/upload-name.d.ts +9 -0
- package/dist/server/helpers/upload-name.d.ts.map +1 -0
- package/dist/server/helpers/upload-name.js +39 -0
- package/dist/server/helpers/upload-name.js.map +1 -0
- package/dist/server/request-handler.d.ts +0 -7
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +19 -46
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +3 -2
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +22 -16
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts +19 -10
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +98 -72
- package/dist/server/response.js.map +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +8 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/reporter.d.mts.map +1 -1
- package/dist/testing/reporter.mjs +18 -0
- package/dist/testing/reporter.mjs.map +1 -1
- package/dist/utils/ttl-cache.d.ts +11 -0
- package/dist/utils/ttl-cache.d.ts.map +1 -0
- package/dist/utils/ttl-cache.js +42 -0
- package/dist/utils/ttl-cache.js.map +1 -0
- package/dist/validator/builder.d.ts +2 -2
- package/dist/validator/builder.js +2 -2
- package/dist/validator/compile.d.ts +3 -0
- package/dist/validator/compile.d.ts.map +1 -0
- package/dist/validator/compile.js +254 -0
- package/dist/validator/compile.js.map +1 -0
- package/dist/validator/engine.d.ts +1 -0
- package/dist/validator/engine.d.ts.map +1 -1
- package/dist/validator/engine.js +285 -317
- package/dist/validator/engine.js.map +1 -1
- package/dist/validator/error.d.ts +1 -0
- package/dist/validator/error.d.ts.map +1 -1
- package/dist/validator/error.js +11 -1
- package/dist/validator/error.js.map +1 -1
- package/dist/validator/rules.d.ts +64 -0
- package/dist/validator/rules.d.ts.map +1 -0
- package/dist/validator/rules.js +655 -0
- package/dist/validator/rules.js.map +1 -0
- package/dist/validator/text.d.ts +11 -0
- package/dist/validator/text.d.ts.map +1 -0
- package/dist/validator/text.js +69 -0
- package/dist/validator/text.js.map +1 -0
- package/package.json +56 -39
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.serializeCookie = serializeCookie;
|
|
4
4
|
exports.serializeClearCookie = serializeClearCookie;
|
|
5
|
+
exports.parseCookies = parseCookies;
|
|
5
6
|
function serializeCookie(name, value, options = {}) {
|
|
6
7
|
const parts = [
|
|
7
8
|
`${encodeURIComponent(name)}=${encodeURIComponent(value)}`,
|
|
@@ -58,4 +59,38 @@ function serializeClearCookie(name, options = {}) {
|
|
|
58
59
|
maxAge: 0,
|
|
59
60
|
});
|
|
60
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Parses a Cookie header. The first occurrence of a name wins, values are
|
|
64
|
+
* percent-decoded when needed, and a malformed escape keeps the raw value
|
|
65
|
+
* rather than failing the request.
|
|
66
|
+
*/
|
|
67
|
+
function parseCookies(header) {
|
|
68
|
+
const out = {};
|
|
69
|
+
let start = 0;
|
|
70
|
+
const len = header.length;
|
|
71
|
+
while (start < len) {
|
|
72
|
+
let end = header.indexOf(';', start);
|
|
73
|
+
if (end === -1)
|
|
74
|
+
end = len;
|
|
75
|
+
const eq = header.indexOf('=', start);
|
|
76
|
+
if (eq !== -1 && eq < end) {
|
|
77
|
+
const key = header.slice(start, eq).trim();
|
|
78
|
+
// "__proto__" would hit the prototype setter instead of a property
|
|
79
|
+
if (key !== '' && key !== '__proto__' && out[key] === undefined) {
|
|
80
|
+
let val = header.slice(eq + 1, end).trim();
|
|
81
|
+
if (val.indexOf('%') !== -1) {
|
|
82
|
+
try {
|
|
83
|
+
val = decodeURIComponent(val);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// keep raw value
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
out[key] = val;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
start = end + 1;
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
61
96
|
//# sourceMappingURL=cookie.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../../src/server/helpers/cookie.ts"],"names":[],"mappings":";;AAEA,0CAyCC;AAED,oDAWC;
|
|
1
|
+
{"version":3,"file":"cookie.js","sourceRoot":"","sources":["../../../src/server/helpers/cookie.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,SAAS,cAAoB,EAC7B,IAAI,SAAK,GACR,GAAG,CA+HL;AAuCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAyB9D"}
|
|
@@ -3,9 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateETag = generateETag;
|
|
4
4
|
exports.safeSanitize = safeSanitize;
|
|
5
5
|
exports.nativeStringify = nativeStringify;
|
|
6
|
-
const
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
// Weak ETag in the `etag` package format: length in hex plus a truncated
|
|
8
|
+
// base64 SHA-1. SHA-1 is fine here; it only detects content changes.
|
|
7
9
|
function generateETag(content) {
|
|
8
|
-
|
|
10
|
+
if (content.length === 0)
|
|
11
|
+
return 'W/"0-2jmj7l5rsw0yVb/vlWAYkK/YBwk"';
|
|
12
|
+
const hash = (0, node_crypto_1.createHash)('sha1').update(content).digest('base64').slice(0, 27);
|
|
13
|
+
return `W/"${content.length.toString(16)}-${hash}"`;
|
|
9
14
|
}
|
|
10
15
|
function safeSanitize(val, ancestors = new Set(), path = '') {
|
|
11
16
|
if (val === null || val === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"etag.js","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"etag.js","sourceRoot":"","sources":["../../../src/server/helpers/etag.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { normalizeIp, resolveIps, resolveProtocol, resolveHostname } from './ip';
|
|
2
2
|
export { parseRawBody, parseMultipartFormData, streamMultipartUpload, } from './body-parser';
|
|
3
|
-
export { serializeCookie, serializeClearCookie } from './cookie';
|
|
3
|
+
export { serializeCookie, serializeClearCookie, parseCookies } from './cookie';
|
|
4
4
|
export { generateETag, nativeStringify } from './etag';
|
|
5
5
|
export { streamToResponse } from './stream';
|
|
6
|
+
export { secureJsonParse, stripPrototype } from './json';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEhF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAEhF,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE9E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.streamToResponse = exports.nativeStringify = exports.generateETag = exports.serializeClearCookie = exports.serializeCookie = exports.streamMultipartUpload = exports.parseMultipartFormData = exports.parseRawBody = exports.resolveHostname = exports.resolveProtocol = exports.resolveIps = exports.normalizeIp = void 0;
|
|
3
|
+
exports.stripPrototype = exports.secureJsonParse = exports.streamToResponse = exports.nativeStringify = exports.generateETag = exports.parseCookies = exports.serializeClearCookie = exports.serializeCookie = exports.streamMultipartUpload = exports.parseMultipartFormData = exports.parseRawBody = exports.resolveHostname = exports.resolveProtocol = exports.resolveIps = exports.normalizeIp = void 0;
|
|
4
4
|
var ip_1 = require("./ip");
|
|
5
5
|
Object.defineProperty(exports, "normalizeIp", { enumerable: true, get: function () { return ip_1.normalizeIp; } });
|
|
6
6
|
Object.defineProperty(exports, "resolveIps", { enumerable: true, get: function () { return ip_1.resolveIps; } });
|
|
@@ -13,9 +13,13 @@ Object.defineProperty(exports, "streamMultipartUpload", { enumerable: true, get:
|
|
|
13
13
|
var cookie_1 = require("./cookie");
|
|
14
14
|
Object.defineProperty(exports, "serializeCookie", { enumerable: true, get: function () { return cookie_1.serializeCookie; } });
|
|
15
15
|
Object.defineProperty(exports, "serializeClearCookie", { enumerable: true, get: function () { return cookie_1.serializeClearCookie; } });
|
|
16
|
+
Object.defineProperty(exports, "parseCookies", { enumerable: true, get: function () { return cookie_1.parseCookies; } });
|
|
16
17
|
var etag_1 = require("./etag");
|
|
17
18
|
Object.defineProperty(exports, "generateETag", { enumerable: true, get: function () { return etag_1.generateETag; } });
|
|
18
19
|
Object.defineProperty(exports, "nativeStringify", { enumerable: true, get: function () { return etag_1.nativeStringify; } });
|
|
19
20
|
var stream_1 = require("./stream");
|
|
20
21
|
Object.defineProperty(exports, "streamToResponse", { enumerable: true, get: function () { return stream_1.streamToResponse; } });
|
|
22
|
+
var json_1 = require("./json");
|
|
23
|
+
Object.defineProperty(exports, "secureJsonParse", { enumerable: true, get: function () { return json_1.secureJsonParse; } });
|
|
24
|
+
Object.defineProperty(exports, "stripPrototype", { enumerable: true, get: function () { return json_1.stripPrototype; } });
|
|
21
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":";;;AAAA,2BAAgF;AAAvE,iGAAA,WAAW,OAAA;AAAE,gGAAA,UAAU,OAAA;AAAE,qGAAA,eAAe,OAAA;AAAE,qGAAA,eAAe,OAAA;AAElE,6CAIsB;AAHpB,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,oHAAA,qBAAqB,OAAA;AAGvB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/helpers/index.ts"],"names":[],"mappings":";;;AAAA,2BAAgF;AAAvE,iGAAA,WAAW,OAAA;AAAE,gGAAA,UAAU,OAAA;AAAE,qGAAA,eAAe,OAAA;AAAE,qGAAA,eAAe,OAAA;AAElE,6CAIsB;AAHpB,2GAAA,YAAY,OAAA;AACZ,qHAAA,sBAAsB,OAAA;AACtB,oHAAA,qBAAqB,OAAA;AAGvB,mCAA8E;AAArE,yGAAA,eAAe,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,sGAAA,YAAY,OAAA;AAE5D,+BAAsD;AAA7C,oGAAA,YAAY,OAAA;AAAE,uGAAA,eAAe,OAAA;AAEtC,mCAA2C;AAAlC,0GAAA,gBAAgB,OAAA;AAEzB,+BAAwD;AAA/C,uGAAA,eAAe,OAAA;AAAE,sGAAA,cAAc,OAAA"}
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
import type { IncomingMessage } from 'node:http';
|
|
2
2
|
export declare function normalizeIp(ip: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the client IP.
|
|
5
|
+
*
|
|
6
|
+
* - `trustProxy: false` -> socket address only.
|
|
7
|
+
* - `trustProxy: true` -> trust every hop: CDN headers (CF-Connecting-IP,
|
|
8
|
+
* True-Client-IP, X-Real-IP, X-Client-IP), else the left-most
|
|
9
|
+
* X-Forwarded-For entry. Only safe when every request passes through a
|
|
10
|
+
* proxy that overwrites these headers.
|
|
11
|
+
* - `trustProxy: N` -> trust the N closest hops, counting the socket peer
|
|
12
|
+
* (Express semantics). The client is the entry N steps back from the
|
|
13
|
+
* socket, so values a client prepends to X-Forwarded-For are ignored.
|
|
14
|
+
* CDN headers are not consulted, since any client can send them.
|
|
15
|
+
*/
|
|
3
16
|
export declare function resolveIps(raw: IncomingMessage, trustProxy: boolean | number): {
|
|
4
17
|
ips: string[];
|
|
5
18
|
ip: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEhD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ9C;
|
|
1
|
+
{"version":3,"file":"ip.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEhD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAwBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CA+C/B;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B,MAAM,CA6BR;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,OAAO,GAAG,MAAM,GAC3B,MAAM,CAaR"}
|
|
@@ -13,70 +13,83 @@ function normalizeIp(ip) {
|
|
|
13
13
|
}
|
|
14
14
|
return ip;
|
|
15
15
|
}
|
|
16
|
+
// Env overrides are read once; process.env access is slow on the hot path.
|
|
17
|
+
let envTrust;
|
|
18
|
+
function envTrustsProxy() {
|
|
19
|
+
if (envTrust === undefined) {
|
|
20
|
+
envTrust =
|
|
21
|
+
process.env.TRUST_PROXY === 'true' ||
|
|
22
|
+
process.env.EXIS_TRUST_PROXY === 'true';
|
|
23
|
+
}
|
|
24
|
+
return envTrust;
|
|
25
|
+
}
|
|
26
|
+
function isProxyTrusted(trustProxy) {
|
|
27
|
+
return Boolean(trustProxy) || envTrustsProxy();
|
|
28
|
+
}
|
|
29
|
+
function firstHeader(val) {
|
|
30
|
+
const v = Array.isArray(val) ? val[0] : val;
|
|
31
|
+
if (typeof v !== 'string')
|
|
32
|
+
return undefined;
|
|
33
|
+
const t = v.trim();
|
|
34
|
+
return t === '' ? undefined : t;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolves the client IP.
|
|
38
|
+
*
|
|
39
|
+
* - `trustProxy: false` -> socket address only.
|
|
40
|
+
* - `trustProxy: true` -> trust every hop: CDN headers (CF-Connecting-IP,
|
|
41
|
+
* True-Client-IP, X-Real-IP, X-Client-IP), else the left-most
|
|
42
|
+
* X-Forwarded-For entry. Only safe when every request passes through a
|
|
43
|
+
* proxy that overwrites these headers.
|
|
44
|
+
* - `trustProxy: N` -> trust the N closest hops, counting the socket peer
|
|
45
|
+
* (Express semantics). The client is the entry N steps back from the
|
|
46
|
+
* socket, so values a client prepends to X-Forwarded-For are ignored.
|
|
47
|
+
* CDN headers are not consulted, since any client can send them.
|
|
48
|
+
*/
|
|
16
49
|
function resolveIps(raw, trustProxy) {
|
|
17
|
-
const isTrusted = Boolean(trustProxy) ||
|
|
18
|
-
process.env.TRUST_PROXY === 'true' ||
|
|
19
|
-
process.env.EXIS_TRUST_PROXY === 'true';
|
|
20
50
|
const rawRemote = raw.socket?.remoteAddress ?? '127.0.0.1';
|
|
21
51
|
const remoteAddress = normalizeIp(rawRemote);
|
|
22
|
-
if (!
|
|
52
|
+
if (!isProxyTrusted(trustProxy)) {
|
|
23
53
|
return { ips: [], ip: remoteAddress };
|
|
24
54
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
55
|
+
const hops = typeof trustProxy === 'number' && trustProxy > 0 ? trustProxy : Infinity;
|
|
56
|
+
if (hops === Infinity) {
|
|
57
|
+
const h = raw.headers;
|
|
58
|
+
const direct = firstHeader(h['cf-connecting-ip']) ||
|
|
59
|
+
firstHeader(h['true-client-ip']) ||
|
|
60
|
+
firstHeader(h['x-real-ip']) ||
|
|
61
|
+
firstHeader(h['x-client-ip']);
|
|
62
|
+
if (direct) {
|
|
63
|
+
const ip = normalizeIp(direct);
|
|
33
64
|
return { ips: [ip], ip };
|
|
34
65
|
}
|
|
35
66
|
}
|
|
36
|
-
const trueClientIp = raw.headers['true-client-ip'];
|
|
37
|
-
if (trueClientIp) {
|
|
38
|
-
const rawVal = Array.isArray(trueClientIp) ? trueClientIp[0] : trueClientIp;
|
|
39
|
-
if (typeof rawVal === 'string' && rawVal.trim() !== '') {
|
|
40
|
-
const ip = normalizeIp(rawVal.trim());
|
|
41
|
-
return { ips: [ip], ip };
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const xRealIp = raw.headers['x-real-ip'];
|
|
45
|
-
if (xRealIp) {
|
|
46
|
-
const rawVal = Array.isArray(xRealIp) ? xRealIp[0] : xRealIp;
|
|
47
|
-
if (typeof rawVal === 'string' && rawVal.trim() !== '') {
|
|
48
|
-
const ip = normalizeIp(rawVal.trim());
|
|
49
|
-
return { ips: [ip], ip };
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
const xClientIp = raw.headers['x-client-ip'];
|
|
53
|
-
if (xClientIp) {
|
|
54
|
-
const rawVal = Array.isArray(xClientIp) ? xClientIp[0] : xClientIp;
|
|
55
|
-
if (typeof rawVal === 'string' && rawVal.trim() !== '') {
|
|
56
|
-
const ip = normalizeIp(rawVal.trim());
|
|
57
|
-
return { ips: [ip], ip };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// 2. Parse standard X-Forwarded-For proxy chain
|
|
61
67
|
const xForwardedFor = raw.headers['x-forwarded-for'];
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
if (!xForwardedFor)
|
|
69
|
+
return { ips: [], ip: remoteAddress };
|
|
70
|
+
const rawVal = Array.isArray(xForwardedFor)
|
|
71
|
+
? xForwardedFor.join(',')
|
|
72
|
+
: xForwardedFor;
|
|
73
|
+
const forwarded = [];
|
|
74
|
+
for (const part of rawVal.split(',')) {
|
|
75
|
+
const t = part.trim();
|
|
76
|
+
if (t !== '')
|
|
77
|
+
forwarded.push(normalizeIp(t));
|
|
68
78
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
79
|
+
if (forwarded.length === 0)
|
|
80
|
+
return { ips: [], ip: remoteAddress };
|
|
81
|
+
if (hops === Infinity) {
|
|
82
|
+
return { ips: forwarded, ip: forwarded[0] };
|
|
72
83
|
}
|
|
73
|
-
|
|
74
|
-
|
|
84
|
+
// Full chain as seen from the server: [...forwarded, socketPeer].
|
|
85
|
+
// Trusting N hops means the client sits at index (length - 1 - N).
|
|
86
|
+
const chainLen = forwarded.length + 1;
|
|
87
|
+
const clientIdx = Math.max(0, chainLen - 1 - hops);
|
|
88
|
+
const ips = forwarded.slice(clientIdx);
|
|
89
|
+
return { ips, ip: forwarded[clientIdx] };
|
|
75
90
|
}
|
|
76
91
|
function resolveProtocol(raw, trustProxy) {
|
|
77
|
-
const isTrusted =
|
|
78
|
-
process.env.TRUST_PROXY === 'true' ||
|
|
79
|
-
process.env.EXIS_TRUST_PROXY === 'true';
|
|
92
|
+
const isTrusted = isProxyTrusted(trustProxy);
|
|
80
93
|
const connection = raw.socket;
|
|
81
94
|
const isTls = connection?.encrypted || false;
|
|
82
95
|
let protocol = isTls ? 'https' : 'http';
|
|
@@ -103,9 +116,7 @@ function resolveProtocol(raw, trustProxy) {
|
|
|
103
116
|
return protocol;
|
|
104
117
|
}
|
|
105
118
|
function resolveHostname(raw, trustProxy) {
|
|
106
|
-
const isTrusted =
|
|
107
|
-
process.env.TRUST_PROXY === 'true' ||
|
|
108
|
-
process.env.EXIS_TRUST_PROXY === 'true';
|
|
119
|
+
const isTrusted = isProxyTrusted(trustProxy);
|
|
109
120
|
let host = raw.headers['x-forwarded-host'];
|
|
110
121
|
if (!host || !isTrusted) {
|
|
111
122
|
host = raw.headers.host || '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":";;AAEA,kCAQC;
|
|
1
|
+
{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../src/server/helpers/ip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/json.ts"],"names":[],"mappings":"AA2BA,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAG7C;AAED,wBAAgB,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAM5D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// JSON body parsing with prototype-pollution protection.
|
|
3
|
+
//
|
|
4
|
+
// V8's JSON.parse is ~7x faster than round-tripping through the native
|
|
5
|
+
// binding (string -> serde Value -> JS object). JSON.parse never pollutes a
|
|
6
|
+
// prototype by itself: "__proto__" becomes an own property. The danger is a
|
|
7
|
+
// later merge (Object.assign, spread into defaults, deep merge) copying that
|
|
8
|
+
// key, so we drop "__proto__" and "constructor" keys the same way the native
|
|
9
|
+
// parser did. The full walk only runs when the raw text could contain either
|
|
10
|
+
// key; a \u escape could spell one out, so it also triggers the walk.
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.stripPrototype = stripPrototype;
|
|
13
|
+
exports.secureJsonParse = secureJsonParse;
|
|
14
|
+
const SUSPECT = /__proto__|constructor|\\u/;
|
|
15
|
+
function strip(value) {
|
|
16
|
+
if (value === null || typeof value !== 'object')
|
|
17
|
+
return;
|
|
18
|
+
if (Array.isArray(value)) {
|
|
19
|
+
for (const item of value)
|
|
20
|
+
strip(item);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (Object.prototype.hasOwnProperty.call(value, '__proto__')) {
|
|
24
|
+
delete value.__proto__;
|
|
25
|
+
}
|
|
26
|
+
if (Object.prototype.hasOwnProperty.call(value, 'constructor')) {
|
|
27
|
+
delete value.constructor;
|
|
28
|
+
}
|
|
29
|
+
for (const k in value)
|
|
30
|
+
strip(value[k]);
|
|
31
|
+
}
|
|
32
|
+
function stripPrototype(value) {
|
|
33
|
+
strip(value);
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function secureJsonParse(text) {
|
|
37
|
+
const value = JSON.parse(text);
|
|
38
|
+
if (value !== null && typeof value === 'object' && SUSPECT.test(text)) {
|
|
39
|
+
strip(value);
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/server/helpers/json.ts"],"names":[],"mappings":";AAAA,yDAAyD;AACzD,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,sEAAsE;;AAmBtE,wCAGC;AAED,0CAMC;AA5BD,MAAM,OAAO,GAAG,2BAA2B,CAAA;AAE3C,SAAS,KAAK,CAAC,KAAU;IACvB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAM;IACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC,SAAS,CAAA;IACxB,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC,WAAW,CAAA;IAC1B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC;AAED,SAAgB,cAAc,CAAI,KAAQ;IACxC,KAAK,CAAC,KAAK,CAAC,CAAA;IACZ,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,eAAe,CAAc,IAAY;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,KAAK,CAAC,KAAK,CAAC,CAAA;IACd,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function safeUploadName(fieldname: string, filename: string): string;
|
|
2
|
+
export declare function safeUploadPath(destDir: string, fieldname: string, filename: string): string;
|
|
3
|
+
export declare const DEFAULT_UPLOAD_LIMITS: {
|
|
4
|
+
files: number;
|
|
5
|
+
fields: number;
|
|
6
|
+
parts: number;
|
|
7
|
+
fieldSize: number;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=upload-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-name.d.ts","sourceRoot":"","sources":["../../../src/server/helpers/upload-name.ts"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAGD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAGD,eAAO,MAAM,qBAAqB;;;;;CAKjC,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DEFAULT_UPLOAD_LIMITS = void 0;
|
|
7
|
+
exports.safeUploadName = safeUploadName;
|
|
8
|
+
exports.safeUploadPath = safeUploadPath;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
// The multipart field name and filename are client-controlled. Neither may
|
|
12
|
+
// reach the filesystem as-is: "../../x" in a field name used to escape the
|
|
13
|
+
// upload directory via path.join. Only a short alnum token of each survives,
|
|
14
|
+
// and the random part is a UUID instead of guessable Date.now()/Math.random().
|
|
15
|
+
function safeUploadName(fieldname, filename) {
|
|
16
|
+
const field = String(fieldname || 'file')
|
|
17
|
+
.replace(/[^A-Za-z0-9_-]/g, '_')
|
|
18
|
+
.slice(0, 64) || 'file';
|
|
19
|
+
const rawExt = node_path_1.default.extname(String(filename || '')).toLowerCase();
|
|
20
|
+
const ext = /^\.[a-z0-9]{1,16}$/.test(rawExt) ? rawExt : '';
|
|
21
|
+
return `${field}-${(0, node_crypto_1.randomUUID)()}${ext}`;
|
|
22
|
+
}
|
|
23
|
+
// Joins and verifies the result stays inside destDir
|
|
24
|
+
function safeUploadPath(destDir, fieldname, filename) {
|
|
25
|
+
const root = node_path_1.default.resolve(destDir);
|
|
26
|
+
const dest = node_path_1.default.resolve(root, safeUploadName(fieldname, filename));
|
|
27
|
+
if (node_path_1.default.dirname(dest) !== root) {
|
|
28
|
+
throw new Error('Refusing to write upload outside destination directory');
|
|
29
|
+
}
|
|
30
|
+
return dest;
|
|
31
|
+
}
|
|
32
|
+
// Applied when a route configures no limits of its own
|
|
33
|
+
exports.DEFAULT_UPLOAD_LIMITS = {
|
|
34
|
+
files: 10,
|
|
35
|
+
fields: 100,
|
|
36
|
+
parts: 200,
|
|
37
|
+
fieldSize: 1024 * 1024,
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=upload-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-name.js","sourceRoot":"","sources":["../../../src/server/helpers/upload-name.ts"],"names":[],"mappings":";;;;;;AAOA,wCAQC;AAGD,wCAWC;AA7BD,6CAAwC;AACxC,0DAA4B;AAE5B,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,SAAgB,cAAc,CAAC,SAAiB,EAAE,QAAgB;IAChE,MAAM,KAAK,GACT,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;SACxB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAA;IAC3B,MAAM,MAAM,GAAG,mBAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACjE,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3D,OAAO,GAAG,KAAK,IAAI,IAAA,wBAAU,GAAE,GAAG,GAAG,EAAE,CAAA;AACzC,CAAC;AAED,qDAAqD;AACrD,SAAgB,cAAc,CAC5B,OAAe,EACf,SAAiB,EACjB,QAAgB;IAEhB,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;IACpE,IAAI,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,uDAAuD;AAC1C,QAAA,qBAAqB,GAAG;IACnC,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,IAAI,GAAG,IAAI;CACvB,CAAA"}
|
|
@@ -7,14 +7,7 @@ export declare class RequestHandler {
|
|
|
7
7
|
private app;
|
|
8
8
|
private _compiledPipeline?;
|
|
9
9
|
static activeRequests: number;
|
|
10
|
-
private _reqPool;
|
|
11
|
-
private _resPool;
|
|
12
|
-
private static readonly MAX_POOL_SIZE;
|
|
13
10
|
constructor(app: App<any>);
|
|
14
|
-
private _acquireReq;
|
|
15
|
-
private _acquireRes;
|
|
16
|
-
private _releaseReq;
|
|
17
|
-
private _releaseRes;
|
|
18
11
|
getCompiledPipeline(): Handler[];
|
|
19
12
|
inject(options: {
|
|
20
13
|
method?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAChC,OAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAMvC,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAChC,OAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAIzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAMvC,qBAAa,cAAc;IAIb,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,iBAAiB,CAAC,CAAW;IACrC,OAAc,cAAc,SAAI;gBAEZ,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAE1B,mBAAmB,IAAI,OAAO,EAAE;IAsB1B,MAAM,CAAC,OAAO,EAAE;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,EAAE,GAAG,CAAA;QACV,OAAO,CAAC,EAAE,GAAG,CAAA;KACd,GAAG,OAAO,CAAC,OAAO,mBAAmB,EAAE,YAAY,CAAC;IAwF9C,mBAAmB,CACxB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,IAAI,GACpB,IAAI;IA6BA,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;YAyDtD,gBAAgB;YAuChB,iBAAiB;CAuChC"}
|
|
@@ -49,37 +49,6 @@ const noop = () => {
|
|
|
49
49
|
class RequestHandler {
|
|
50
50
|
constructor(app) {
|
|
51
51
|
this.app = app;
|
|
52
|
-
// ─── Object Pools ───────────────────────────────────────────────────────────
|
|
53
|
-
// Recycle ExisRequest and ExisResponse objects instead of allocating new ones
|
|
54
|
-
// per request. This dramatically reduces V8 GC pressure under high load.
|
|
55
|
-
this._reqPool = [];
|
|
56
|
-
this._resPool = [];
|
|
57
|
-
}
|
|
58
|
-
_acquireReq(rawReq, res, trustProxy, bodyLimit) {
|
|
59
|
-
const pooled = this._reqPool.pop();
|
|
60
|
-
if (pooled) {
|
|
61
|
-
return pooled.init(rawReq, res, trustProxy, bodyLimit);
|
|
62
|
-
}
|
|
63
|
-
return new request_1.ExisRequest(rawReq, res, trustProxy, bodyLimit);
|
|
64
|
-
}
|
|
65
|
-
_acquireRes(rawRes) {
|
|
66
|
-
const pooled = this._resPool.pop();
|
|
67
|
-
if (pooled) {
|
|
68
|
-
return pooled.init(rawRes);
|
|
69
|
-
}
|
|
70
|
-
return new response_1.ExisResponse(rawRes);
|
|
71
|
-
}
|
|
72
|
-
_releaseReq(req) {
|
|
73
|
-
req.cleanup();
|
|
74
|
-
if (this._reqPool.length < RequestHandler.MAX_POOL_SIZE) {
|
|
75
|
-
this._reqPool.push(req);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
_releaseRes(res) {
|
|
79
|
-
res.req = undefined;
|
|
80
|
-
if (this._resPool.length < RequestHandler.MAX_POOL_SIZE) {
|
|
81
|
-
this._resPool.push(res);
|
|
82
|
-
}
|
|
83
52
|
}
|
|
84
53
|
getCompiledPipeline() {
|
|
85
54
|
if (this._compiledPipeline)
|
|
@@ -87,8 +56,12 @@ class RequestHandler {
|
|
|
87
56
|
this.app.applyBuiltins();
|
|
88
57
|
if (this.app.globalMiddleware.length === 0) {
|
|
89
58
|
this._compiledPipeline = [
|
|
90
|
-
(req, res) => this.app.getRouter().handle(req, res, () => {
|
|
91
|
-
|
|
59
|
+
(req, res, next) => this.app.getRouter().handle(req, res, (err) => {
|
|
60
|
+
// Route errors must reach the error handlers, not become a 404
|
|
61
|
+
if (err)
|
|
62
|
+
next(err);
|
|
63
|
+
else
|
|
64
|
+
(0, middleware_1.notFound)(req, res, noop);
|
|
92
65
|
}),
|
|
93
66
|
];
|
|
94
67
|
}
|
|
@@ -209,31 +182,32 @@ class RequestHandler {
|
|
|
209
182
|
}
|
|
210
183
|
handle(rawReq, rawRes) {
|
|
211
184
|
RequestHandler.activeRequests++;
|
|
212
|
-
|
|
213
|
-
|
|
185
|
+
// Fresh objects per request. Pooling them is unsafe: a handler that is
|
|
186
|
+
// still awaiting after the client disconnects would observe the next
|
|
187
|
+
// request's data once the object is recycled. Short-lived objects are
|
|
188
|
+
// cheap for V8's young generation, so pooling buys nothing measurable.
|
|
189
|
+
const res = new response_1.ExisResponse(rawRes);
|
|
190
|
+
const req = new request_1.ExisRequest(rawReq, res, this.app.options.trustProxy, this.app.options.bodyLimit);
|
|
214
191
|
res.req = req;
|
|
215
192
|
res.etagEnabled = this.app.options.etag === true;
|
|
216
193
|
req.log = this.app.log;
|
|
217
|
-
//
|
|
194
|
+
// Fired by res.end()'s completion callback, or by 'close' when the
|
|
195
|
+
// client disconnects before the response finished.
|
|
218
196
|
let isDone = false;
|
|
219
197
|
const onDone = () => {
|
|
220
198
|
if (isDone)
|
|
221
199
|
return;
|
|
222
200
|
isDone = true;
|
|
223
|
-
if (RequestHandler.activeRequests > 0)
|
|
201
|
+
if (RequestHandler.activeRequests > 0)
|
|
224
202
|
RequestHandler.activeRequests--;
|
|
225
|
-
}
|
|
226
|
-
this._releaseReq(req);
|
|
227
|
-
this._releaseRes(res);
|
|
228
203
|
};
|
|
229
204
|
res._onDone = onDone;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
else if (typeof rawRes.on === 'function') {
|
|
205
|
+
// Covers clients that disconnect before res.end(); 'close' fires at most
|
|
206
|
+
// once, so a plain listener avoids the once() wrapper allocation
|
|
207
|
+
if (typeof rawRes.on === 'function')
|
|
234
208
|
rawRes.on('close', onDone);
|
|
235
|
-
}
|
|
236
209
|
const pipeline = this._compiledPipeline || this.getCompiledPipeline();
|
|
210
|
+
(0, middleware_1.assignRequestId)(req, res);
|
|
237
211
|
this._executeWithContext(req, res, () => {
|
|
238
212
|
if (this.app.hooks.request.length === 0 &&
|
|
239
213
|
this.app.hooks.response.length === 0) {
|
|
@@ -310,5 +284,4 @@ class RequestHandler {
|
|
|
310
284
|
}
|
|
311
285
|
exports.RequestHandler = RequestHandler;
|
|
312
286
|
RequestHandler.activeRequests = 0;
|
|
313
|
-
RequestHandler.MAX_POOL_SIZE = 2048;
|
|
314
287
|
//# sourceMappingURL=request-handler.js.map
|