dx-server 0.10.3 → 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 -8
- package/cjs/staticHelpers.js +34 -79
- 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 -8
- package/esm/staticHelpers.js +34 -78
- package/esm/vendors/etag.d.ts +2 -1
- package/esm/vendors/etag.js +17 -2
- package/package.json +1 -1
package/cjs/vendors/etag.d.ts
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
3
|
/// <reference types="node" resolution-mode="require"/>
|
|
4
4
|
import type { IncomingMessage } from 'node:http';
|
|
5
|
-
import type
|
|
5
|
+
import { type Stats } from 'node:fs';
|
|
6
6
|
export declare function entityTag(buf: Buffer, weak?: boolean): string;
|
|
7
|
+
export declare function entityTagPath(fileStat: Stats, filePath: string, weak?: boolean): Promise<string>;
|
|
7
8
|
export declare function statTag(stat: Stats): string;
|
|
8
9
|
export declare function isFreshETag(req: IncomingMessage, etag: string): true | undefined;
|
|
9
10
|
export declare function isFreshModifiedSince(req: IncomingMessage, lastModified: string): boolean | undefined;
|
package/cjs/vendors/etag.js
CHANGED
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
4
24
|
};
|
|
5
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.isFreshModifiedSince = exports.isFreshETag = exports.statTag = exports.entityTag = void 0;
|
|
26
|
+
exports.isFreshModifiedSince = exports.isFreshETag = exports.statTag = exports.entityTagPath = exports.entityTag = void 0;
|
|
7
27
|
// etag: https://github.com/jshttp/etag/blob/b9f0642256e63654287299d205bc6ced71b1a228/index.js#L39
|
|
8
|
-
const node_crypto_1 =
|
|
28
|
+
const node_crypto_1 = __importStar(require("node:crypto"));
|
|
29
|
+
const node_fs_1 = require("node:fs");
|
|
9
30
|
function entityTag(buf, weak) {
|
|
10
31
|
// pre-computed empty
|
|
11
32
|
return buf.length
|
|
@@ -20,6 +41,21 @@ function entityTag(buf, weak) {
|
|
|
20
41
|
// same weak eTag: 2 resources might be semantically equivalent, but not byte-for-byte identical
|
|
21
42
|
}
|
|
22
43
|
exports.entityTag = entityTag;
|
|
44
|
+
async function entityTagPath(fileStat, filePath, weak) {
|
|
45
|
+
const hash = (0, node_crypto_1.createHash)('sha1');
|
|
46
|
+
const defer = Promise.withResolvers();
|
|
47
|
+
(0, node_fs_1.createReadStream)(filePath).pipe(hash)
|
|
48
|
+
.on('finish', defer.resolve)
|
|
49
|
+
.on('error', defer.reject);
|
|
50
|
+
await defer.promise;
|
|
51
|
+
return `${fileStat.size.toString(16)}-${hash
|
|
52
|
+
.digest('base64')
|
|
53
|
+
.substring(0, 27)}`;
|
|
54
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#directives
|
|
55
|
+
// weak W/ vs strong eTag
|
|
56
|
+
// same weak eTag: 2 resources might be semantically equivalent, but not byte-for-byte identical
|
|
57
|
+
}
|
|
58
|
+
exports.entityTagPath = entityTagPath;
|
|
23
59
|
const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
|
|
24
60
|
function statTag(stat) {
|
|
25
61
|
const mtime = stat.mtime.getTime().toString(16);
|
|
@@ -97,4 +133,4 @@ function parseTokenList(str) {
|
|
|
97
133
|
list.push(str.substring(start, end));
|
|
98
134
|
return list;
|
|
99
135
|
}
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZW5kb3JzL2V0YWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrR0FBa0c7QUFDbEcsMkRBQThDO0FBRTlDLHFDQUFvRDtBQUVwRCxTQUFnQixTQUFTLENBQUMsR0FBVyxFQUFFLElBQWM7SUFDcEQscUJBQXFCO0lBQ3JCLE9BQU8sR0FBRyxDQUFDLE1BQU07UUFDaEIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUkscUJBQU07YUFDcEMsVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUNoQixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBQ3JCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlDQUFpQyxDQUFBO0lBQ3ZELDRFQUE0RTtJQUM1RSx5QkFBeUI7SUFDekIsZ0dBQWdHO0FBQ2pHLENBQUM7QUFaRCw4QkFZQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsUUFBZSxFQUFFLFFBQWdCLEVBQUUsSUFBYztJQUNwRixNQUFNLElBQUksR0FBRyxJQUFBLHdCQUFVLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFDL0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBVSxDQUFBO0lBQzdDLElBQUEsMEJBQWdCLEVBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNuQyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDM0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0IsTUFBTSxLQUFLLENB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
|
package/esm/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/esm/dx.js
CHANGED
|
@@ -125,4 +125,4 @@ export function setRedirect(url, status) {
|
|
|
125
125
|
// https://github.com/jshttp/content-disposition/blob/1037e24e4790273da96645ad250061f39e77968c/index.js#L186
|
|
126
126
|
// because in most applications, users can specify a simple filename which usually doesn't need to be validated.
|
|
127
127
|
// we leave setDownload() implementation for users, for now.
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFpQixRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQXVCdkQsTUFBTSxVQUFVLGFBQWEsQ0FLM0IsS0FBNEM7SUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQStCLENBQUE7SUFDN0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQXNCLENBQUE7SUFDbEQsTUFBTSxPQUFPLEdBQWdDLENBQUMsR0FBRyxNQUFjLEVBQUUsRUFBRTtRQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN6RCxNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFBO2dCQUNwQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtnQkFDeEIsT0FBTyxLQUFLLENBQUE7WUFDYixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDTCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDM0IsQ0FBQyxDQUFBO0lBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFO1FBQ3ZDLEdBQUcsS0FBSSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQSxDQUFBLENBQUM7UUFDckMsR0FBRyxDQUFDLEtBQUs7WUFDUixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtZQUNwQixVQUFVLENBQUMsR0FBRyxD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
|
package/esm/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/esm/dxHelpers.js
CHANGED
|
@@ -51,6 +51,7 @@ export async function writeRes(req, res, { type, data, charset, jsonBeautify, di
|
|
|
51
51
|
// skip response. Some middleware may handle it outside the chain. For example, express middleware
|
|
52
52
|
return;
|
|
53
53
|
case 'empty':
|
|
54
|
+
bufferOrStream = Buffer.from('', charset);
|
|
54
55
|
break;
|
|
55
56
|
default:
|
|
56
57
|
if (!res.getHeader('content-type'))
|
|
@@ -63,37 +64,35 @@ export async function writeRes(req, res, { type, data, charset, jsonBeautify, di
|
|
|
63
64
|
// skipped: response is already finished
|
|
64
65
|
}
|
|
65
66
|
else if (res.writableEnded) {
|
|
66
|
-
const defer = Promise.withResolvers()
|
|
67
|
-
res.addListener('finish', defer.resolve)
|
|
68
|
-
|
|
67
|
+
// const defer = Promise.withResolvers()
|
|
68
|
+
// res.addListener('finish', defer.resolve)
|
|
69
|
+
// res.addListener('error', defer.reject)
|
|
70
|
+
// await defer.promise
|
|
69
71
|
// skipped: response is already ended
|
|
70
72
|
// chunk is not fully flushed yet
|
|
71
73
|
}
|
|
72
74
|
else
|
|
73
|
-
await promisify(res.end.bind(res))(
|
|
75
|
+
await promisify(res.end.bind(res))();
|
|
74
76
|
}
|
|
75
77
|
else {
|
|
76
78
|
// https://github.com/expressjs/express/blob/980d881e3b023db079de60477a2588a91f046ca5/lib/response.js#L210
|
|
77
|
-
if (res.statusCode === 204) { // No Content
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// write nothing
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
79
|
+
// if (res.statusCode === 204) { // No Content
|
|
80
|
+
// res.removeHeader('content-type')
|
|
81
|
+
// res.removeHeader('content-length')
|
|
82
|
+
// res.removeHeader('transfer-encoding')
|
|
83
|
+
// // write nothing
|
|
84
|
+
// }
|
|
85
|
+
// if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
|
|
86
|
+
// res.setHeader('content-length', 0)
|
|
87
|
+
// res.removeHeader('transfer-encoding')
|
|
88
|
+
// } else
|
|
89
|
+
if (req.method !== 'HEAD') {
|
|
91
90
|
if (Buffer.isBuffer(bufferOrStream)) {
|
|
92
91
|
// support: 304 (etag), zipping, file etag and last modified
|
|
93
92
|
res.setHeader('content-length', bufferOrStream.length);
|
|
94
93
|
if (!disableEtag) {
|
|
95
94
|
const etag = entityTag(bufferOrStream);
|
|
96
|
-
const lastModified = res.getHeader('last-modified')
|
|
95
|
+
// const lastModified = res.getHeader('last-modified')
|
|
97
96
|
res.setHeader('ETag', etag);
|
|
98
97
|
if (isFreshETag(req, etag)) {
|
|
99
98
|
res.removeHeader('content-type');
|
|
@@ -114,7 +113,7 @@ export async function writeRes(req, res, { type, data, charset, jsonBeautify, di
|
|
|
114
113
|
}
|
|
115
114
|
// we do not support content-encoding (gzip, deflate, br) and leave it to reverse proxy or CDN
|
|
116
115
|
}
|
|
117
|
-
await promisify(res.end.bind(res))(
|
|
116
|
+
await promisify(res.end.bind(res))();
|
|
118
117
|
}
|
|
119
118
|
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhIZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2R4SGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUEwQixNQUFNLG9CQUFvQixDQUFBO0FBRTNFLE9BQU8sNEJBQTRCLENBQUE7QUFvRG5DLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFZO0lBQzdJLE1BQU0sY0FBYyxHQUFHLENBQUMsV0FBbUIsRUFBRSxFQUFFO1FBQzlDLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUFFLE9BQU07UUFDNUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ3hGLENBQUMsQ0FBQTtJQUNELElBQUksY0FBYyxDQUFBO0lBRWxCLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDZCxLQUFLLE1BQU07WUFDVixjQUFjLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDN0IsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQzNCLG1CQUFtQjtZQUNuQixjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBQyxD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
|
package/esm/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/esm/index.js
CHANGED
|
@@ -4,5 +4,6 @@ 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;
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sT0FBTyxFQUNQLGFBQWEsRUFDYixZQUFZLEVBQ1osT0FBTyxFQUNQLFNBQVMsRUFDVCxXQUFXLEVBQ1gsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsYUFBYSxHQUNiLE1BQU0sU0FBUyxDQUFBO0FBQ2hCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDaEMsT0FBTyxFQUNOLFNBQVMsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLE9BQU8sRUFDUCxhQUFhLEVBQ2IsUUFBUSxHQUNSLE1BQU0sV0FBVyxDQUFBO0FBQ2xCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDbEMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDdkMsT0FBTyxFQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksTUFBTSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXRELGVBQWUsUUFBUSxDQUFBIn0=
|
package/esm/logger.d.ts
ADDED
package/esm/logger.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { getReq, getRes } from './dx.js';
|
|
2
|
+
import { hrtime } from 'node:process';
|
|
3
|
+
export function logJson(json) {
|
|
4
|
+
console.log(process.env.NODE_ENV === 'production' ? JSON.stringify(json) : JSON.stringify(json, null, 2));
|
|
5
|
+
}
|
|
6
|
+
let requestCount = 0;
|
|
7
|
+
export default (log = logJson) => function logger(next) {
|
|
8
|
+
const res = getRes();
|
|
9
|
+
const req = getReq();
|
|
10
|
+
const logId = requestCount++;
|
|
11
|
+
const start = hrtime.bigint();
|
|
12
|
+
const now = new Date(Date.now() + 9 * 60 * 60 * 1000); // jst
|
|
13
|
+
log({
|
|
14
|
+
level: 'info',
|
|
15
|
+
id: logId,
|
|
16
|
+
timestamp: [
|
|
17
|
+
[
|
|
18
|
+
now.getUTCFullYear(),
|
|
19
|
+
String(now.getUTCMonth() + 1).padStart(2, '0'),
|
|
20
|
+
String(now.getUTCDate()).padStart(2, '0'),
|
|
21
|
+
].join('-'),
|
|
22
|
+
[
|
|
23
|
+
String(now.getUTCHours()).padStart(2, '0'),
|
|
24
|
+
String(now.getUTCMinutes()).padStart(2, '0'),
|
|
25
|
+
[String(now.getUTCSeconds()).padStart(2, '0'), String(now.getUTCMilliseconds()).padStart(3, '0')].join('.'),
|
|
26
|
+
].join(':'),
|
|
27
|
+
].join('T'),
|
|
28
|
+
remoteAddress: req.socket.remoteAddress,
|
|
29
|
+
method: req.method,
|
|
30
|
+
url: req.url,
|
|
31
|
+
httpVersion: `HTTP/${req.httpVersion}`,
|
|
32
|
+
headers: process.env.NODE_ENV === 'production'
|
|
33
|
+
? req.headers
|
|
34
|
+
: Object.fromEntries(Object.entries(req.headers).filter(([k]) => [
|
|
35
|
+
'host',
|
|
36
|
+
'referer',
|
|
37
|
+
'referrer',
|
|
38
|
+
'user-agent',
|
|
39
|
+
'x-forwarded-proto',
|
|
40
|
+
'x-forwarded-host',
|
|
41
|
+
'x-forwarded-for',
|
|
42
|
+
].includes(k))),
|
|
43
|
+
});
|
|
44
|
+
res.once('finish', end).once('close', end).once('error', end);
|
|
45
|
+
return next();
|
|
46
|
+
function end() {
|
|
47
|
+
res.off('finish', end).off('close', end).off('error', end);
|
|
48
|
+
const durationNs = hrtime.bigint() - start;
|
|
49
|
+
log({
|
|
50
|
+
level: 'info',
|
|
51
|
+
id: logId,
|
|
52
|
+
duration: Number(durationNs) / 1e6, // ms
|
|
53
|
+
headers: res.getHeaders(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUN0QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRW5DLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBUztJQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDMUcsQ0FBQztBQUVELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQTtBQUNwQixlQUFlLENBQUMsR0FBRyxHQUFHLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxNQUFNLENBQUMsSUFBZTtJQUNoRSxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtJQUNwQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtJQUNwQixNQUFNLEtBQUssR0FBRyxZQUFZLEVBQUUsQ0FBQTtJQUU1QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBLENBQUMsTUFBTTtJQUU1RCxHQUFHLENBQUM7UUFDSCxLQUFLLEVBQUUsTUFBTTtRQUNiLEVBQUUsRUFBRSxLQUFLO1FBQ1QsU0FBUyxFQUFFO1lBQ1Y7Z0JBQ0MsR0FBRyxDQUFDLGNBQWMsRUFBRTtnQkFDcEIsTUFBTSxDQUFD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
|
package/esm/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/esm/static.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { getReq, getRes } from './dx.js';
|
|
2
|
-
import {
|
|
1
|
+
import { getReq, getRes, setHtml } from './dx.js';
|
|
2
|
+
import { sendFileTrusted } from './staticHelpers.js';
|
|
3
3
|
import { urlFromReq } from './bodyHelpers.js';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
const UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
|
|
4
6
|
export function chainStatic(pattern, { getPathname, ...options }) {
|
|
5
7
|
const urlPattern = new URLPattern({ pathname: pattern });
|
|
6
8
|
return async (next) => {
|
|
@@ -20,4 +22,47 @@ export function chainStatic(pattern, { getPathname, ...options }) {
|
|
|
20
22
|
}
|
|
21
23
|
};
|
|
22
24
|
}
|
|
23
|
-
|
|
25
|
+
async function sendFile(req, res, pathname, // plain path, not URI-encoded
|
|
26
|
+
options) {
|
|
27
|
+
const { root, dotfiles, ...trustedSendOptions } = options ?? {};
|
|
28
|
+
// null byte(s)
|
|
29
|
+
if (pathname.includes('\0'))
|
|
30
|
+
return setHtml('Invalid request', { status: 400 });
|
|
31
|
+
let parts;
|
|
32
|
+
if (root) {
|
|
33
|
+
// normalize
|
|
34
|
+
pathname = path.normalize(`.${path.sep}${pathname}`);
|
|
35
|
+
// malicious path
|
|
36
|
+
if (UP_PATH_REGEXP.test(pathname))
|
|
37
|
+
return setHtml('Forbidden', { status: 403 });
|
|
38
|
+
// explode path parts
|
|
39
|
+
parts = pathname.split(path.sep);
|
|
40
|
+
// join / normalize from optional root dir
|
|
41
|
+
pathname = path.normalize(path.join(root, pathname));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// malicious path
|
|
45
|
+
if (UP_PATH_REGEXP.test(pathname))
|
|
46
|
+
return setHtml('Forbidden', { status: 403 });
|
|
47
|
+
// explode path parts
|
|
48
|
+
parts = path.normalize(pathname).split(path.sep);
|
|
49
|
+
// join / normalize from optional root dir
|
|
50
|
+
pathname = path.resolve(pathname);
|
|
51
|
+
}
|
|
52
|
+
// dotfile handling
|
|
53
|
+
if (parts.some(part => part.length > 1 && part[0] === '.'))
|
|
54
|
+
switch (dotfiles) {
|
|
55
|
+
case 'allow':
|
|
56
|
+
break;
|
|
57
|
+
case 'deny':
|
|
58
|
+
return setHtml('Forbidden', { status: 403 });
|
|
59
|
+
case 'ignore':
|
|
60
|
+
default:
|
|
61
|
+
throw new Error('Forbidden: dotfiles are not allowed');
|
|
62
|
+
}
|
|
63
|
+
// pathEndsWithSep
|
|
64
|
+
if (pathname[pathname.length - 1] === path.sep)
|
|
65
|
+
return setHtml('Forbidden: directory access is not allowed', { status: 403 });
|
|
66
|
+
return sendFileTrusted(req, res, pathname, trustedSendOptions);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQy9ELE9BQU8sRUFBQyxlQUFlLEVBQTBCLE1BQU0sb0JBQW9CLENBQUE7QUFDM0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUU1QixNQUFNLGNBQWMsR0FBRyw0QkFBNEIsQ0FBQTtBQUVuRCxNQUFNLFVBQVUsV0FBVyxDQUMxQixPQUFlLEVBQ2YsRUFBQyxXQUFXLEVBQUUsR0FBRyxPQUFPLEVBSXZCO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtJQUN0RCxPQUFPLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUNuQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtRQUNwQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTTtZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFFaEUsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNsQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUMzQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFFM0IsSUFBSSxDQUFDO1lBQ0osTUFBTSxRQUFRLENBQ2IsR0FBRyxFQUNILE1BQU0sRUFBRSxFQUNQLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQzttQkFDcEIsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEVB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
|
package/esm/staticHelpers.d.ts
CHANGED
|
@@ -1,20 +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
11
|
end?: number;
|
|
13
|
-
root?: string;
|
|
14
12
|
start?: number;
|
|
15
13
|
}
|
|
16
|
-
export declare function sendFile(req: IncomingMessage, res: ServerResponse, pathname: string, // plain path, not URI-encoded
|
|
17
|
-
options?: SendOptions): Promise<void>;
|
|
18
14
|
export declare function sendFileTrusted(req: IncomingMessage, res: ServerResponse, pathname: string, // plain path, not URI-encoded
|
|
19
|
-
{
|
|
20
|
-
immutable, }?:
|
|
15
|
+
{ start, end, disableAcceptRanges, disableLastModified, etag, disableCacheControl, maxAge, // 1 year
|
|
16
|
+
immutable, }?: TrustedSendOptions | undefined): Promise<void>;
|