dx-server 0.11.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/dx.d.ts +2 -2
- package/cjs/dx.js +1 -1
- package/cjs/dxHelpers.d.ts +2 -2
- package/cjs/dxHelpers.js +20 -21
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +8 -2
- package/cjs/logger.d.ts +3 -0
- package/cjs/logger.js +61 -0
- package/cjs/static.d.ts +2 -2
- package/cjs/static.js +50 -2
- package/cjs/staticHelpers.d.ts +4 -9
- package/cjs/staticHelpers.js +42 -100
- package/cjs/vendors/etag.d.ts +2 -1
- package/cjs/vendors/etag.js +41 -5
- package/esm/dx.d.ts +2 -2
- package/esm/dx.js +1 -1
- package/esm/dxHelpers.d.ts +2 -2
- package/esm/dxHelpers.js +20 -21
- package/esm/index.d.ts +1 -0
- package/esm/index.js +2 -1
- package/esm/logger.d.ts +3 -0
- package/esm/logger.js +57 -0
- package/esm/static.d.ts +2 -2
- package/esm/static.js +48 -3
- package/esm/staticHelpers.d.ts +4 -9
- package/esm/staticHelpers.js +43 -100
- package/esm/vendors/etag.d.ts +2 -1
- package/esm/vendors/etag.js +17 -2
- package/package.json +1 -1
package/cjs/dx.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/// <reference types="node" resolution-mode="require"/>
|
|
4
4
|
import { Readable } from 'node:stream';
|
|
5
5
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
-
import type {
|
|
6
|
+
import type { TrustedSendOptions } from './staticHelpers.js';
|
|
7
7
|
export interface Chainable<P extends any[] = any[], R = any, Next = (...np: any[]) => any> {
|
|
8
8
|
(next: Next, ...p: P): R;
|
|
9
9
|
}
|
|
@@ -30,7 +30,7 @@ export declare function setEmpty({ status }?: {
|
|
|
30
30
|
export declare function setHtml(html: string, opts?: {
|
|
31
31
|
status?: number;
|
|
32
32
|
}): void;
|
|
33
|
-
export declare function setFile(filePath: string, options?:
|
|
33
|
+
export declare function setFile(filePath: string, options?: TrustedSendOptions): void;
|
|
34
34
|
export declare function setBuffer(buffer: Buffer, { status }?: {
|
|
35
35
|
status?: number;
|
|
36
36
|
}): void;
|
package/cjs/dx.js
CHANGED
|
@@ -141,4 +141,4 @@ exports.setRedirect = setRedirect;
|
|
|
141
141
|
// https://github.com/jshttp/content-disposition/blob/1037e24e4790273da96645ad250061f39e77968c/index.js#L186
|
|
142
142
|
// because in most applications, users can specify a simple filename which usually doesn't need to be validated.
|
|
143
143
|
// we leave setDownload() implementation for users, for now.
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdURBQWtEO0FBQ2xELGlEQUF1RDtBQXVCdkQsU0FBZ0IsYUFBYSxDQUszQixLQUE0QztJQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBK0IsQ0FBQTtJQUM3RCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBc0IsQ0FBQTtJQUNsRCxNQUFNLE9BQU8sR0FBZ0MsQ0FBQyxHQUFHLE1BQWMsRUFBRSxFQUFFO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pELE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUE7Z0JBQ3BDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUN4QixPQUFPLEtBQUssQ0FBQTtZQUNiLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNMLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMzQixDQUFDLENBQUE7SUFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUU7UUFDdkMsR0FBRyxLQUFJLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBLENBQUEsQ0FBQztRQUNyQyxHQUFHLENBQUMsS0FBSztZQUNSLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFBO1lBQ3BCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUMzQyxRQUFR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
|
package/cjs/dxHelpers.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/// <reference types="node" resolution-mode="require"/>
|
|
4
4
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
5
|
import { Readable } from 'node:stream';
|
|
6
|
-
import { type
|
|
6
|
+
import { type TrustedSendOptions } from './staticHelpers.js';
|
|
7
7
|
import './polyfillWithResolvers.js';
|
|
8
8
|
export type DxContext = {
|
|
9
9
|
charset?: BufferEncoding;
|
|
@@ -44,6 +44,6 @@ export type DxContext = {
|
|
|
44
44
|
} | {
|
|
45
45
|
type: 'file';
|
|
46
46
|
data: string;
|
|
47
|
-
options?:
|
|
47
|
+
options?: TrustedSendOptions;
|
|
48
48
|
});
|
|
49
49
|
export declare function writeRes(req: IncomingMessage, res: ServerResponse, { type, data, charset, jsonBeautify, disableEtag, options }: DxContext): Promise<void>;
|
package/cjs/dxHelpers.js
CHANGED
|
@@ -54,6 +54,7 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
|
|
|
54
54
|
// skip response. Some middleware may handle it outside the chain. For example, express middleware
|
|
55
55
|
return;
|
|
56
56
|
case 'empty':
|
|
57
|
+
bufferOrStream = Buffer.from('', charset);
|
|
57
58
|
break;
|
|
58
59
|
default:
|
|
59
60
|
if (!res.getHeader('content-type'))
|
|
@@ -66,37 +67,35 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
|
|
|
66
67
|
// skipped: response is already finished
|
|
67
68
|
}
|
|
68
69
|
else if (res.writableEnded) {
|
|
69
|
-
const defer = Promise.withResolvers()
|
|
70
|
-
res.addListener('finish', defer.resolve)
|
|
71
|
-
|
|
70
|
+
// const defer = Promise.withResolvers()
|
|
71
|
+
// res.addListener('finish', defer.resolve)
|
|
72
|
+
// res.addListener('error', defer.reject)
|
|
73
|
+
// await defer.promise
|
|
72
74
|
// skipped: response is already ended
|
|
73
75
|
// chunk is not fully flushed yet
|
|
74
76
|
}
|
|
75
77
|
else
|
|
76
|
-
await (0, node_util_1.promisify)(res.end.bind(res))(
|
|
78
|
+
await (0, node_util_1.promisify)(res.end.bind(res))();
|
|
77
79
|
}
|
|
78
80
|
else {
|
|
79
81
|
// https://github.com/expressjs/express/blob/980d881e3b023db079de60477a2588a91f046ca5/lib/response.js#L210
|
|
80
|
-
if (res.statusCode === 204) { // No Content
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// write nothing
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
82
|
+
// if (res.statusCode === 204) { // No Content
|
|
83
|
+
// res.removeHeader('content-type')
|
|
84
|
+
// res.removeHeader('content-length')
|
|
85
|
+
// res.removeHeader('transfer-encoding')
|
|
86
|
+
// // write nothing
|
|
87
|
+
// }
|
|
88
|
+
// if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
|
|
89
|
+
// res.setHeader('content-length', 0)
|
|
90
|
+
// res.removeHeader('transfer-encoding')
|
|
91
|
+
// } else
|
|
92
|
+
if (req.method !== 'HEAD') {
|
|
94
93
|
if (Buffer.isBuffer(bufferOrStream)) {
|
|
95
94
|
// support: 304 (etag), zipping, file etag and last modified
|
|
96
95
|
res.setHeader('content-length', bufferOrStream.length);
|
|
97
96
|
if (!disableEtag) {
|
|
98
97
|
const etag = (0, etag_js_1.entityTag)(bufferOrStream);
|
|
99
|
-
const lastModified = res.getHeader('last-modified')
|
|
98
|
+
// const lastModified = res.getHeader('last-modified')
|
|
100
99
|
res.setHeader('ETag', etag);
|
|
101
100
|
if ((0, etag_js_1.isFreshETag)(req, etag)) {
|
|
102
101
|
res.removeHeader('content-type');
|
|
@@ -117,8 +116,8 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
|
|
|
117
116
|
}
|
|
118
117
|
// we do not support content-encoding (gzip, deflate, br) and leave it to reverse proxy or CDN
|
|
119
118
|
}
|
|
120
|
-
await (0, node_util_1.promisify)(res.end.bind(res))(
|
|
119
|
+
await (0, node_util_1.promisify)(res.end.bind(res))();
|
|
121
120
|
}
|
|
122
121
|
}
|
|
123
122
|
exports.writeRes = writeRes;
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhIZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2R4SGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2Q0FBb0M7QUFDcEMseUNBQW1DO0FBQ25DLCtDQUF3RDtBQUN4RCx5REFBMkU7QUFFM0Usc0NBQW1DO0FBb0Q1QixLQUFLLFVBQVUsUUFBUSxDQUFDLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFZO0lBQzdJLE1BQU0sY0FBYyxHQUFHLENBQUMsV0FBbUIsRUFBRSxFQUFFO1FBQzlDLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUFFLE9BQU07UUFDNUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLENBQUMsQ0FBQTtJQUNELElBQUksY0FBYyxDQUFBO0lBRWxCLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDZCxLQUFLLE1BQU07WUFDVixjQUFjLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDN0IsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQzNCLG1CQUFtQjtZQUNuQixjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ2pELE1BQUs7UUFDTixLQUFLLFFBQVE7WUFDWixjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtZQUMxQyxjQUFjLEdBQUcsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ2pELE1BQUs7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
|
package/cjs/index.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export { getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from '.
|
|
|
4
4
|
export { router } from './router.js';
|
|
5
5
|
export { connectMiddlewares } from './connect.js';
|
|
6
6
|
export { chainStatic } from './static.js';
|
|
7
|
+
export { logJson, default as logger } from './logger.js';
|
|
7
8
|
export default dxServer;
|
package/cjs/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.chainStatic = exports.connectMiddlewares = exports.router = exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.getBuffer = exports.makeDxContext = exports.setFile = exports.setEmpty = exports.setText = exports.setRedirect = exports.setBuffer = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setHtml = exports.getRes = exports.getReq = void 0;
|
|
6
|
+
exports.logger = exports.logJson = exports.chainStatic = exports.connectMiddlewares = exports.router = exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.getBuffer = exports.makeDxContext = exports.setFile = exports.setEmpty = exports.setText = exports.setRedirect = exports.setBuffer = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setHtml = exports.getRes = exports.getReq = void 0;
|
|
4
7
|
var dx_js_1 = require("./dx.js");
|
|
5
8
|
Object.defineProperty(exports, "getReq", { enumerable: true, get: function () { return dx_js_1.getReq; } });
|
|
6
9
|
Object.defineProperty(exports, "getRes", { enumerable: true, get: function () { return dx_js_1.getRes; } });
|
|
@@ -28,5 +31,8 @@ var connect_js_1 = require("./connect.js");
|
|
|
28
31
|
Object.defineProperty(exports, "connectMiddlewares", { enumerable: true, get: function () { return connect_js_1.connectMiddlewares; } });
|
|
29
32
|
var static_js_1 = require("./static.js");
|
|
30
33
|
Object.defineProperty(exports, "chainStatic", { enumerable: true, get: function () { return static_js_1.chainStatic; } });
|
|
34
|
+
var logger_js_1 = require("./logger.js");
|
|
35
|
+
Object.defineProperty(exports, "logJson", { enumerable: true, get: function () { return logger_js_1.logJson; } });
|
|
36
|
+
Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return __importDefault(logger_js_1).default; } });
|
|
31
37
|
exports.default = dx_js_2.dxServer;
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUNBYWdCO0FBWmYsK0ZBQUEsTUFBTSxPQUFBO0FBQ04sK0ZBQUEsTUFBTSxPQUFBO0FBQ04sZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBQ2IscUdBQUEsWUFBWSxPQUFBO0FBQ1osZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asa0dBQUEsU0FBUyxPQUFBO0FBQ1Qsb0dBQUEsV0FBVyxPQUFBO0FBQ1gsZ0dBQUEsT0FBTyxPQUFBO0FBQ1AsaUdBQUEsUUFBUSxPQUFBO0FBQ1IsZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBRWQsbUNBQWdDO0FBQ2hDLHFDQU9rQjtBQU5qQixvR0FBQSxTQUFTLE9BQUE7QUFDVCxrR0FBQSxPQUFPLE9BQUE7QUFDUCxpR0FBQSxNQUFNLE9BQUE7QUFDTixrR0FBQSxPQUFPLE9BQUE7QUFDUCx3R0FBQSxhQUFhLE9BQUE7QUFDYixtR0FBQSxRQUFRLE9BQUE7QUFFVCx5Q0FBa0M7QUFBMUIsbUdBQUEsTUFBTSxPQUFBO0FBQ2QsMkNBQStDO0FBQXZDLGdIQUFBLGtCQUFrQixPQUFBO0FBQzFCLHlDQUF1QztBQUEvQix3R0FBQSxXQUFXLE9BQUE7QUFDbkIseUNBQXNEO0FBQTlDLG9HQUFBLE9BQU8sT0FBQTtBQUFFLG9IQUFBLE9BQU8sT0FBVTtBQUVsQyxrQkFBZSxnQkFBUSxDQUFBIn0=
|
package/cjs/logger.d.ts
ADDED
package/cjs/logger.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.logJson = void 0;
|
|
4
|
+
const dx_js_1 = require("./dx.js");
|
|
5
|
+
const node_process_1 = require("node:process");
|
|
6
|
+
function logJson(json) {
|
|
7
|
+
console.log(process.env.NODE_ENV === 'production' ? JSON.stringify(json) : JSON.stringify(json, null, 2));
|
|
8
|
+
}
|
|
9
|
+
exports.logJson = logJson;
|
|
10
|
+
let requestCount = 0;
|
|
11
|
+
exports.default = (log = logJson) => function logger(next) {
|
|
12
|
+
const res = (0, dx_js_1.getRes)();
|
|
13
|
+
const req = (0, dx_js_1.getReq)();
|
|
14
|
+
const logId = requestCount++;
|
|
15
|
+
const start = node_process_1.hrtime.bigint();
|
|
16
|
+
const now = new Date(Date.now() + 9 * 60 * 60 * 1000); // jst
|
|
17
|
+
log({
|
|
18
|
+
level: 'info',
|
|
19
|
+
id: logId,
|
|
20
|
+
timestamp: [
|
|
21
|
+
[
|
|
22
|
+
now.getUTCFullYear(),
|
|
23
|
+
String(now.getUTCMonth() + 1).padStart(2, '0'),
|
|
24
|
+
String(now.getUTCDate()).padStart(2, '0'),
|
|
25
|
+
].join('-'),
|
|
26
|
+
[
|
|
27
|
+
String(now.getUTCHours()).padStart(2, '0'),
|
|
28
|
+
String(now.getUTCMinutes()).padStart(2, '0'),
|
|
29
|
+
[String(now.getUTCSeconds()).padStart(2, '0'), String(now.getUTCMilliseconds()).padStart(3, '0')].join('.'),
|
|
30
|
+
].join(':'),
|
|
31
|
+
].join('T'),
|
|
32
|
+
remoteAddress: req.socket.remoteAddress,
|
|
33
|
+
method: req.method,
|
|
34
|
+
url: req.url,
|
|
35
|
+
httpVersion: `HTTP/${req.httpVersion}`,
|
|
36
|
+
headers: process.env.NODE_ENV === 'production'
|
|
37
|
+
? req.headers
|
|
38
|
+
: Object.fromEntries(Object.entries(req.headers).filter(([k]) => [
|
|
39
|
+
'host',
|
|
40
|
+
'referer',
|
|
41
|
+
'referrer',
|
|
42
|
+
'user-agent',
|
|
43
|
+
'x-forwarded-proto',
|
|
44
|
+
'x-forwarded-host',
|
|
45
|
+
'x-forwarded-for',
|
|
46
|
+
].includes(k))),
|
|
47
|
+
});
|
|
48
|
+
res.once('finish', end).once('close', end).once('error', end);
|
|
49
|
+
return next();
|
|
50
|
+
function end() {
|
|
51
|
+
res.off('finish', end).off('close', end).off('error', end);
|
|
52
|
+
const durationNs = node_process_1.hrtime.bigint() - start;
|
|
53
|
+
log({
|
|
54
|
+
level: 'info',
|
|
55
|
+
id: logId,
|
|
56
|
+
duration: Number(durationNs) / 1e6, // ms
|
|
57
|
+
headers: res.getHeaders(),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBc0M7QUFDdEMsK0NBQW1DO0FBRW5DLFNBQWdCLE9BQU8sQ0FBQyxJQUFTO0lBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMxRyxDQUFDO0FBRkQsMEJBRUM7QUFFRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUE7QUFDcEIsa0JBQWUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxJQUFlO0lBQ2hFLE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTSxHQUFFLENBQUE7SUFDcEIsTUFBTSxHQUFHLEdBQUcsSUFBQSxjQUFNLEdBQUUsQ0FBQTtJQUNwQixNQUFNLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQTtJQUU1QixNQUFNLEtBQUssR0FBRyxxQkFBTSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQSxDQUFDLE1BQU07SUFFNUQsR0FBRyxDQUFDO1FBQ0gsS0FBSyxFQUFFLE1BQU07UUFDYixFQUFFLEVBQUUsS0FBSztRQUNULFNBQVMsRUFBRTtZQUNWO2dCQUNDLEdBQUcsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFB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
|
package/cjs/static.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Chainable } from './dx.js';
|
|
2
|
-
import type
|
|
3
|
-
export declare function chainStatic(pattern: string, { getPathname, ...options }:
|
|
2
|
+
import { type TrustedSendOptions } from './staticHelpers.js';
|
|
3
|
+
export declare function chainStatic(pattern: string, { getPathname, ...options }: TrustedSendOptions & {
|
|
4
4
|
getPathname?(matched: any): string;
|
|
5
5
|
}): Chainable;
|
package/cjs/static.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.chainStatic = void 0;
|
|
4
7
|
const dx_js_1 = require("./dx.js");
|
|
5
8
|
const staticHelpers_js_1 = require("./staticHelpers.js");
|
|
6
9
|
const bodyHelpers_js_1 = require("./bodyHelpers.js");
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
|
|
7
12
|
function chainStatic(pattern, { getPathname, ...options }) {
|
|
8
13
|
const urlPattern = new URLPattern({ pathname: pattern });
|
|
9
14
|
return async (next) => {
|
|
@@ -15,7 +20,7 @@ function chainStatic(pattern, { getPathname, ...options }) {
|
|
|
15
20
|
if (!matched)
|
|
16
21
|
return next();
|
|
17
22
|
try {
|
|
18
|
-
await
|
|
23
|
+
await sendFile(req, (0, dx_js_1.getRes)(), getPathname?.(matched)
|
|
19
24
|
?? decodeURIComponent(pathname), options);
|
|
20
25
|
}
|
|
21
26
|
catch (e) {
|
|
@@ -24,4 +29,47 @@ function chainStatic(pattern, { getPathname, ...options }) {
|
|
|
24
29
|
};
|
|
25
30
|
}
|
|
26
31
|
exports.chainStatic = chainStatic;
|
|
27
|
-
|
|
32
|
+
async function sendFile(req, res, pathname, // plain path, not URI-encoded
|
|
33
|
+
options) {
|
|
34
|
+
const { root, dotfiles, ...trustedSendOptions } = options ?? {};
|
|
35
|
+
// null byte(s)
|
|
36
|
+
if (pathname.includes('\0'))
|
|
37
|
+
return (0, dx_js_1.setHtml)('Invalid request', { status: 400 });
|
|
38
|
+
let parts;
|
|
39
|
+
if (root) {
|
|
40
|
+
// normalize
|
|
41
|
+
pathname = node_path_1.default.normalize(`.${node_path_1.default.sep}${pathname}`);
|
|
42
|
+
// malicious path
|
|
43
|
+
if (UP_PATH_REGEXP.test(pathname))
|
|
44
|
+
return (0, dx_js_1.setHtml)('Forbidden', { status: 403 });
|
|
45
|
+
// explode path parts
|
|
46
|
+
parts = pathname.split(node_path_1.default.sep);
|
|
47
|
+
// join / normalize from optional root dir
|
|
48
|
+
pathname = node_path_1.default.normalize(node_path_1.default.join(root, pathname));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// malicious path
|
|
52
|
+
if (UP_PATH_REGEXP.test(pathname))
|
|
53
|
+
return (0, dx_js_1.setHtml)('Forbidden', { status: 403 });
|
|
54
|
+
// explode path parts
|
|
55
|
+
parts = node_path_1.default.normalize(pathname).split(node_path_1.default.sep);
|
|
56
|
+
// join / normalize from optional root dir
|
|
57
|
+
pathname = node_path_1.default.resolve(pathname);
|
|
58
|
+
}
|
|
59
|
+
// dotfile handling
|
|
60
|
+
if (parts.some(part => part.length > 1 && part[0] === '.'))
|
|
61
|
+
switch (dotfiles) {
|
|
62
|
+
case 'allow':
|
|
63
|
+
break;
|
|
64
|
+
case 'deny':
|
|
65
|
+
return (0, dx_js_1.setHtml)('Forbidden', { status: 403 });
|
|
66
|
+
case 'ignore':
|
|
67
|
+
default:
|
|
68
|
+
throw new Error('Forbidden: dotfiles are not allowed');
|
|
69
|
+
}
|
|
70
|
+
// pathEndsWithSep
|
|
71
|
+
if (pathname[pathname.length - 1] === node_path_1.default.sep)
|
|
72
|
+
return (0, dx_js_1.setHtml)('Forbidden: directory access is not allowed', { status: 403 });
|
|
73
|
+
return (0, staticHelpers_js_1.sendFileTrusted)(req, res, pathname, trustedSendOptions);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtQ0FBK0Q7QUFDL0QseURBQTJFO0FBQzNFLHFEQUEyQztBQUUzQywwREFBNEI7QUFFNUIsTUFBTSxjQUFjLEdBQUcsNEJBQTRCLENBQUE7QUFFbkQsU0FBZ0IsV0FBVyxDQUMxQixPQUFlLEVBQ2YsRUFBQyxXQUFXLEVBQUUsR0FBRyxPQUFPLEVBSXZCO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtJQUN0RCxPQUFPLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU0sR0FBRSxDQUFBO1FBQ3BCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNO1lBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUVoRSxNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsSUFBQSwyQkFBVSxFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUUzQixJQUFJLENBQUM7WUFDSixNQUFNLFFBQVEsQ0FDYixHQUFHLEVBQ0gsSUFBQSxjQUFNLEdBQUUsRUFDUCxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7bUJBQ3BCLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUMvQixPQUFPLENBQ1AsQ0FBQTtRQUNGLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1osT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxpR0FBaUc7UUFDakgsQ0FB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
|
package/cjs/staticHelpers.d.ts
CHANGED
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
import { IncomingMessage, ServerResponse } from 'node:http';
|
|
3
3
|
import './polyfillWithResolvers.js';
|
|
4
|
-
export interface
|
|
4
|
+
export interface TrustedSendOptions {
|
|
5
5
|
disableAcceptRanges?: boolean;
|
|
6
6
|
disableLastModified?: boolean;
|
|
7
|
-
|
|
7
|
+
etag?: 'disabled' | 'strong' | 'weak';
|
|
8
8
|
disableCacheControl?: boolean;
|
|
9
9
|
maxAge?: number;
|
|
10
|
-
dotfiles?: 'allow' | 'deny' | 'ignore';
|
|
11
10
|
immutable?: boolean;
|
|
12
|
-
weakEtag?: boolean;
|
|
13
11
|
end?: number;
|
|
14
|
-
root?: string;
|
|
15
12
|
start?: number;
|
|
16
13
|
}
|
|
17
|
-
export declare function sendFile(req: IncomingMessage, res: ServerResponse, pathname: string, // plain path, not URI-encoded
|
|
18
|
-
options?: SendOptions): Promise<void>;
|
|
19
14
|
export declare function sendFileTrusted(req: IncomingMessage, res: ServerResponse, pathname: string, // plain path, not URI-encoded
|
|
20
|
-
{
|
|
21
|
-
immutable,
|
|
15
|
+
{ start, end, disableAcceptRanges, disableLastModified, etag, disableCacheControl, maxAge, // 1 year
|
|
16
|
+
immutable, }?: TrustedSendOptions | undefined): Promise<void>;
|