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/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,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>;
|
package/cjs/staticHelpers.js
CHANGED
|
@@ -3,9 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.sendFileTrusted =
|
|
6
|
+
exports.sendFileTrusted = void 0;
|
|
7
7
|
require("./polyfillWithResolvers.js");
|
|
8
|
-
const dx_js_1 = require("./dx.js");
|
|
9
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
9
|
const promises_1 = require("node:fs/promises");
|
|
11
10
|
const etag_js_1 = require("./vendors/etag.js");
|
|
@@ -14,55 +13,10 @@ const fresh_js_1 = require("./vendors/fresh.js");
|
|
|
14
13
|
const rangeParser_js_1 = require("./vendors/rangeParser.js");
|
|
15
14
|
const node_fs_1 = require("node:fs");
|
|
16
15
|
const onFinished_js_1 = require("./vendors/onFinished.js");
|
|
17
|
-
const
|
|
16
|
+
const node_util_1 = require("node:util");
|
|
18
17
|
const BYTES_RANGE_REGEXP = /^ *bytes=/;
|
|
19
|
-
async function sendFile(req, res, pathname, // plain path, not URI-encoded
|
|
20
|
-
options) {
|
|
21
|
-
const { root, dotfiles, start = 0, end, disableAcceptRanges, disableLastModified, disableEtag, disableCacheControl, maxAge = 60 * 60 * 24 * 365 * 1000, // 1 year
|
|
22
|
-
immutable, } = options ?? {};
|
|
23
|
-
// null byte(s)
|
|
24
|
-
if (pathname.includes('\0'))
|
|
25
|
-
return (0, dx_js_1.setHtml)('Invalid request', { status: 400 });
|
|
26
|
-
let parts;
|
|
27
|
-
if (root) {
|
|
28
|
-
// normalize
|
|
29
|
-
pathname = node_path_1.default.normalize(`.${node_path_1.default.sep}${pathname}`);
|
|
30
|
-
// malicious path
|
|
31
|
-
if (UP_PATH_REGEXP.test(pathname))
|
|
32
|
-
return (0, dx_js_1.setHtml)('Forbidden', { status: 403 });
|
|
33
|
-
// explode path parts
|
|
34
|
-
parts = pathname.split(node_path_1.default.sep);
|
|
35
|
-
// join / normalize from optional root dir
|
|
36
|
-
pathname = node_path_1.default.normalize(node_path_1.default.join(root, pathname));
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
// malicious path
|
|
40
|
-
if (UP_PATH_REGEXP.test(pathname))
|
|
41
|
-
return (0, dx_js_1.setHtml)('Forbidden', { status: 403 });
|
|
42
|
-
// explode path parts
|
|
43
|
-
parts = node_path_1.default.normalize(pathname).split(node_path_1.default.sep);
|
|
44
|
-
// join / normalize from optional root dir
|
|
45
|
-
pathname = node_path_1.default.resolve(pathname);
|
|
46
|
-
}
|
|
47
|
-
// dotfile handling
|
|
48
|
-
if (parts.some(part => part.length > 1 && part[0] === '.'))
|
|
49
|
-
switch (dotfiles) {
|
|
50
|
-
case 'allow':
|
|
51
|
-
break;
|
|
52
|
-
case 'deny':
|
|
53
|
-
return (0, dx_js_1.setHtml)('Forbidden', { status: 403 });
|
|
54
|
-
case 'ignore':
|
|
55
|
-
default:
|
|
56
|
-
throw new Error('Forbidden: dotfiles are not allowed');
|
|
57
|
-
}
|
|
58
|
-
// pathEndsWithSep
|
|
59
|
-
if (pathname[pathname.length - 1] === node_path_1.default.sep)
|
|
60
|
-
return (0, dx_js_1.setHtml)('Forbidden: directory access is not allowed', { status: 403 });
|
|
61
|
-
return sendFileTrusted(req, res, pathname, options);
|
|
62
|
-
}
|
|
63
|
-
exports.sendFile = sendFile;
|
|
64
18
|
async function sendFileTrusted(req, res, pathname, // plain path, not URI-encoded
|
|
65
|
-
{
|
|
19
|
+
{ start = 0, end, disableAcceptRanges, disableLastModified, etag = 'strong', disableCacheControl, maxAge = 60 * 60 * 24 * 365 * 1000, // 1 year
|
|
66
20
|
immutable, } = {}) {
|
|
67
21
|
const fileStat = await (0, promises_1.stat)(pathname);
|
|
68
22
|
// not found, check extensions
|
|
@@ -75,29 +29,28 @@ immutable, } = {}) {
|
|
|
75
29
|
// }
|
|
76
30
|
if (fileStat.isDirectory())
|
|
77
31
|
throw new Error('Forbidden: directory access is not allowed');
|
|
78
|
-
// do send
|
|
79
|
-
const opts = {};
|
|
80
32
|
if (res.headersSent)
|
|
81
33
|
return;
|
|
82
|
-
//
|
|
34
|
+
//region set header fields
|
|
83
35
|
if (!disableAcceptRanges && !res.getHeader('Accept-Ranges'))
|
|
84
36
|
res.setHeader('Accept-Ranges', 'bytes');
|
|
85
37
|
if (!disableCacheControl && !res.getHeader('Cache-Control'))
|
|
86
|
-
res.setHeader('Cache-Control', [
|
|
38
|
+
res.setHeader('Cache-Control', [
|
|
39
|
+
`public, max-age=${Math.floor(maxAge / 1000)}`,
|
|
87
40
|
immutable && 'immutable',
|
|
88
41
|
].filter(Boolean).join(', '));
|
|
89
42
|
if (!disableLastModified && !res.getHeader('Last-Modified'))
|
|
90
43
|
res.setHeader('Last-Modified', fileStat.mtime.toUTCString());
|
|
91
|
-
if (
|
|
92
|
-
res.setHeader('ETag', (0, etag_js_1.statTag)(fileStat));
|
|
93
|
-
//
|
|
44
|
+
if (etag !== 'disabled' && !res.getHeader('ETag'))
|
|
45
|
+
res.setHeader('ETag', etag === 'weak' ? (0, etag_js_1.statTag)(fileStat) : await (0, etag_js_1.entityTagPath)(fileStat, pathname, false));
|
|
46
|
+
//endregion set header fields
|
|
94
47
|
// content-type
|
|
95
48
|
if (!res.getHeader('Content-Type'))
|
|
96
49
|
res.setHeader('Content-Type', (0, mime_js_1.contentTypeForExtension)(node_path_1.default.extname(pathname).slice(1)) || 'application/octet-stream');
|
|
97
50
|
// conditional GET support
|
|
98
51
|
// isConditionalGET
|
|
99
52
|
if (req.headers['if-match'] || req.headers['if-unmodified-since'] || req.headers['if-none-match'] || req.headers['if-modified-since']) {
|
|
100
|
-
//
|
|
53
|
+
//region isPreconditionFailure
|
|
101
54
|
// if-match
|
|
102
55
|
const match = req.headers['if-match'];
|
|
103
56
|
if (match) {
|
|
@@ -106,20 +59,22 @@ immutable, } = {}) {
|
|
|
106
59
|
|| (match !== '*' && (0, fresh_js_1.parseTokenList)(match).every(match => match !== etag && match !== 'W/' + etag && 'W/' + match !== etag)))
|
|
107
60
|
throw new Error('Precondition Failed: request headers do not match the response');
|
|
108
61
|
}
|
|
109
|
-
// if-unmodified-since
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
62
|
+
// if-unmodified-since (ignore when using strong etag since mtime may be unreliable)
|
|
63
|
+
if (etag === 'weak') {
|
|
64
|
+
const unmodifiedSince = (0, fresh_js_1.parseHttpDate)(req.headers['if-unmodified-since']);
|
|
65
|
+
if (!isNaN(unmodifiedSince)) {
|
|
66
|
+
const lastModified = (0, fresh_js_1.parseHttpDate)(res.getHeader('Last-Modified'));
|
|
67
|
+
if (isNaN(lastModified) || lastModified > unmodifiedSince)
|
|
68
|
+
throw new Error('Precondition Failed: resource has been modified since the specified date');
|
|
69
|
+
}
|
|
115
70
|
}
|
|
116
|
-
//
|
|
71
|
+
//endregion isPreconditionFailure
|
|
117
72
|
// isCachable
|
|
118
|
-
if ((
|
|
119
|
-
res.statusCode === 304)
|
|
73
|
+
if ((res.statusCode >= 200 && res.statusCode < 300 || res.statusCode === 304)
|
|
120
74
|
&& (0, fresh_js_1.fresh)(req.headers, {
|
|
121
75
|
etag: res.getHeader('ETag'),
|
|
122
|
-
|
|
76
|
+
// Only use last-modified for freshness check when using weak Etag
|
|
77
|
+
'last-modified': etag === 'weak' ? res.getHeader('Last-Modified') : undefined
|
|
123
78
|
})) {
|
|
124
79
|
// removeContentHeaderFields
|
|
125
80
|
res.removeHeader('Content-Encoding');
|
|
@@ -128,7 +83,7 @@ immutable, } = {}) {
|
|
|
128
83
|
res.removeHeader('Content-Range');
|
|
129
84
|
res.removeHeader('Content-Type');
|
|
130
85
|
res.statusCode = 304;
|
|
131
|
-
res.end();
|
|
86
|
+
return void await (0, node_util_1.promisify)(res.end.bind(res))();
|
|
132
87
|
}
|
|
133
88
|
}
|
|
134
89
|
// adjust len to start/end options
|
|
@@ -141,14 +96,14 @@ immutable, } = {}) {
|
|
|
141
96
|
}
|
|
142
97
|
// Range support
|
|
143
98
|
let ranges = req.headers.range;
|
|
144
|
-
if (!disableAcceptRanges && BYTES_RANGE_REGEXP.test(ranges)) {
|
|
99
|
+
if (!disableAcceptRanges && BYTES_RANGE_REGEXP.test(ranges ?? '')) {
|
|
145
100
|
// parse
|
|
146
|
-
|
|
101
|
+
let rangesNum = (0, rangeParser_js_1.parseRange)(len, ranges, { combine: true });
|
|
147
102
|
// If-Range support
|
|
148
103
|
if (!isRangeFresh(req, res))
|
|
149
|
-
|
|
104
|
+
rangesNum = -2;
|
|
150
105
|
// unsatisfiable
|
|
151
|
-
if (
|
|
106
|
+
if (rangesNum === -1) {
|
|
152
107
|
// Content-Range
|
|
153
108
|
res.setHeader('Content-Range', contentRange('bytes', len));
|
|
154
109
|
// 416 Requested Range Not Satisfiable
|
|
@@ -158,13 +113,13 @@ immutable, } = {}) {
|
|
|
158
113
|
// })
|
|
159
114
|
}
|
|
160
115
|
// valid (syntactically invalid/multiple ranges are treated as a regular response)
|
|
161
|
-
if (
|
|
116
|
+
if (rangesNum !== -2 && rangesNum.length === 1) {
|
|
162
117
|
// Content-Range
|
|
163
118
|
res.statusCode = 206;
|
|
164
|
-
res.setHeader('Content-Range', contentRange('bytes', len,
|
|
119
|
+
res.setHeader('Content-Range', contentRange('bytes', len, rangesNum[0]));
|
|
165
120
|
// adjust for requested range
|
|
166
|
-
start +=
|
|
167
|
-
len =
|
|
121
|
+
start += rangesNum[0].start;
|
|
122
|
+
len = rangesNum[0].end - rangesNum[0].start + 1;
|
|
168
123
|
}
|
|
169
124
|
}
|
|
170
125
|
// set read options
|
|
@@ -173,8 +128,8 @@ immutable, } = {}) {
|
|
|
173
128
|
res.setHeader('Content-Length', len);
|
|
174
129
|
// HEAD support
|
|
175
130
|
if (req.method === 'HEAD')
|
|
176
|
-
return (0,
|
|
177
|
-
//
|
|
131
|
+
return void await (0, node_util_1.promisify)(res.end.bind(res))();
|
|
132
|
+
// Weak ETag path: stream file
|
|
178
133
|
const stream = (0, node_fs_1.createReadStream)(pathname, { start, end });
|
|
179
134
|
stream.pipe(res);
|
|
180
135
|
const defer = Promise.withResolvers();
|
|
@@ -206,4 +161,4 @@ function isRangeFresh(req, res) {
|
|
|
206
161
|
function contentRange(type, size, range) {
|
|
207
162
|
return `${type} ${range ? range.start + '-' + range.end : '*'}/${size}`;
|
|
208
163
|
}
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGF0aWNIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHNDQUFtQztBQUNuQyxtQ0FBeUM7QUFDekMsMERBQTRCO0FBQzVCLCtDQUFxQztBQUNyQywrQ0FBeUM7QUFDekMsK0NBQXlEO0FBQ3pELGlEQUF1RTtBQUN2RSw2REFBbUQ7QUFDbkQscUNBQXdDO0FBQ3hDLDJEQUFrRDtBQUVsRCxNQUFNLGNBQWMsR0FBRyw0QkFBNEIsQ0FBQTtBQUNuRCxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQTtBQXFCL0IsS0FBSyxVQUFVLFFBQVEsQ0FDN0IsR0FBb0IsRUFDcEIsR0FBbUIsRUFDbkIsUUFBZ0IsRUFBRSw4QkFBOEI7QUFDaEQsT0FBcUI7SUFFckIsTUFBTSxFQUNMLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQzlCLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFDckQsbUJBQW1CLEVBQUUsTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsU0FBUztJQUNsRSxTQUFTLEdBQ1QsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFBO0lBRWpCLGVBQWU7SUFDZixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFBLGVBQU8sRUFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFBO0lBRTdFLElBQUksS0FBZSxDQUFBO0lBQ25CLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVixZQUFZO1FBQ1osUUFBUSxHQUFHLG1CQUFJLENBQUMsU0FBUyxDQUFDLElBQUksbUJBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUVwRCxpQkFBaUI7UUFDakIs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
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGF0aWNIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHNDQUFtQztBQUNuQywwREFBNEI7QUFDNUIsK0NBQXFDO0FBQ3JDLCtDQUF3RDtBQUN4RCwrQ0FBeUQ7QUFDekQsaURBQXVFO0FBQ3ZFLDZEQUFtRDtBQUNuRCxxQ0FBd0M7QUFDeEMsMkRBQWtEO0FBQ2xELHlDQUFtQztBQUVuQyxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQTtBQWlCL0IsS0FBSyxVQUFVLGVBQWUsQ0FDcEMsR0FBb0IsRUFDcEIsR0FBbUIsRUFDbkIsUUFBZ0IsRUFBRSw4QkFBOEI7QUFDaEQsRUFDQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFDZCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLElBQUksR0FBRyxRQUFRLEVBQ2YsbUJBQW1CLEVBQ25CLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLFNBQVM7QUFDN0MsU0FBUyxNQUMwQixFQUFFO0lBRXRDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSxlQUFJLEVBQUMsUUFBUSxDQUFDLENBQUE7SUFDckMsOEJBQThCO0lBQzlCLHNGQUFzRjtJQUN0RixzQkFBc0I7SUFDdEIsd0JBQXdCO0lBQ3hCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLElBQUk7SUFFSixJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7SUFFekYsSUFBSSxHQUFHLENBQUMsV0FBVztRQUFFLE9BQU07SUFFM0IsMEJBQTBCO0lBRTFCLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQUUsR0FBRyxDQUFDLFNBQVMs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
|