dx-server 0.12.2 → 0.13.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/README.md +47 -55
- package/{cjs → lib}/body.d.ts +2 -3
- package/lib/body.js +10 -0
- package/{esm → lib}/bodyHelpers.d.ts +2 -4
- package/lib/bodyHelpers.js +89 -0
- package/{esm → lib}/dx.d.ts +5 -8
- package/lib/dx.js +127 -0
- package/{cjs → lib}/dxHelpers.d.ts +0 -4
- package/{esm → lib}/dxHelpers.js +0 -2
- package/{cjs → lib}/index.d.ts +0 -1
- package/{esm/index.d.ts → lib/index.js} +0 -1
- package/lib/logger.js +56 -0
- package/lib/router.d.ts +42 -0
- package/lib/router.js +43 -0
- package/lib/static.js +22 -0
- package/{cjs → lib}/staticHelpers.d.ts +0 -2
- package/lib/staticHelpers.js +186 -0
- package/{cjs → lib}/stream.d.ts +2 -7
- package/lib/stream.js +90 -0
- package/{esm → lib}/vendors/contentType.js +0 -1
- package/{cjs → lib}/vendors/etag.d.ts +0 -3
- package/lib/vendors/etag.js +104 -0
- package/{cjs → lib}/vendors/fresh.d.ts +2 -2
- package/lib/vendors/fresh.js +95 -0
- package/lib/vendors/mime.d.ts +1 -0
- package/lib/vendors/mime.js +35 -0
- package/{esm → lib}/vendors/mimeDb.js +0 -1
- package/{cjs → lib}/vendors/mimeScore.d.ts +1 -1
- package/lib/vendors/mimeScore.js +45 -0
- package/{cjs → lib}/vendors/onFinished.d.ts +1 -1
- package/lib/vendors/onFinished.js +231 -0
- package/lib/vendors/rangeParser.d.ts +20 -0
- package/lib/vendors/rangeParser.js +121 -0
- package/package.json +10 -19
- package/cjs/body.js +0 -14
- package/cjs/bodyHelpers.d.ts +0 -16
- package/cjs/bodyHelpers.js +0 -101
- package/cjs/connect.d.ts +0 -5
- package/cjs/connect.js +0 -44
- package/cjs/dx.d.ts +0 -46
- package/cjs/dx.js +0 -144
- package/cjs/dxHelpers.js +0 -123
- package/cjs/express.d.ts +0 -4
- package/cjs/express.js +0 -43
- package/cjs/helpers.js +0 -14
- package/cjs/index.js +0 -38
- package/cjs/logger.js +0 -61
- package/cjs/package.json +0 -3
- package/cjs/polyfillWithResolvers.d.ts +0 -1
- package/cjs/polyfillWithResolvers.js +0 -17
- package/cjs/router.js +0 -47
- package/cjs/static.js +0 -27
- package/cjs/staticHelpers.js +0 -195
- package/cjs/stream.js +0 -97
- package/cjs/vendors/contentType.js +0 -92
- package/cjs/vendors/etag.js +0 -136
- package/cjs/vendors/fresh.js +0 -102
- package/cjs/vendors/mime.d.ts +0 -1
- package/cjs/vendors/mime.js +0 -42
- package/cjs/vendors/mimeDb.js +0 -9417
- package/cjs/vendors/mimeScore.js +0 -50
- package/cjs/vendors/onFinished.js +0 -245
- package/cjs/vendors/rangeParser.d.ts +0 -10
- package/cjs/vendors/rangeParser.js +0 -126
- package/esm/body.d.ts +0 -8
- package/esm/body.js +0 -11
- package/esm/bodyHelpers.js +0 -90
- package/esm/connect.d.ts +0 -5
- package/esm/connect.js +0 -40
- package/esm/dx.js +0 -128
- package/esm/dxHelpers.d.ts +0 -49
- package/esm/express.d.ts +0 -4
- package/esm/express.js +0 -35
- package/esm/helpers.js +0 -3
- package/esm/index.js +0 -9
- package/esm/logger.d.ts +0 -3
- package/esm/logger.js +0 -57
- package/esm/polyfillWithResolvers.d.ts +0 -1
- package/esm/polyfillWithResolvers.js +0 -16
- package/esm/router.js +0 -44
- package/esm/static.d.ts +0 -5
- package/esm/static.js +0 -23
- package/esm/staticHelpers.d.ts +0 -18
- package/esm/staticHelpers.js +0 -188
- package/esm/stream.d.ts +0 -12
- package/esm/stream.js +0 -92
- package/esm/vendors/contentType.d.ts +0 -4
- package/esm/vendors/etag.d.ts +0 -10
- package/esm/vendors/etag.js +0 -105
- package/esm/vendors/fresh.d.ts +0 -23
- package/esm/vendors/fresh.js +0 -96
- package/esm/vendors/mime.d.ts +0 -1
- package/esm/vendors/mime.js +0 -35
- package/esm/vendors/mimeDb.d.ts +0 -9413
- package/esm/vendors/mimeScore.d.ts +0 -5
- package/esm/vendors/mimeScore.js +0 -46
- package/esm/vendors/onFinished.d.ts +0 -14
- package/esm/vendors/onFinished.js +0 -241
- package/esm/vendors/rangeParser.d.ts +0 -10
- package/esm/vendors/rangeParser.js +0 -122
- /package/{cjs → lib}/helpers.d.ts +0 -0
- /package/{esm/helpers.d.ts → lib/helpers.js} +0 -0
- /package/{cjs → lib}/logger.d.ts +0 -0
- /package/{cjs → lib}/static.d.ts +0 -0
- /package/{cjs → lib}/vendors/contentType.d.ts +0 -0
- /package/{cjs → lib}/vendors/mimeDb.d.ts +0 -0
package/cjs/staticHelpers.js
DELETED
|
@@ -1,195 +0,0 @@
|
|
|
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.sendFileTrusted = void 0;
|
|
7
|
-
require("./polyfillWithResolvers.js");
|
|
8
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
-
const promises_1 = require("node:fs/promises");
|
|
10
|
-
const etag_js_1 = require("./vendors/etag.js");
|
|
11
|
-
const mime_js_1 = require("./vendors/mime.js");
|
|
12
|
-
const fresh_js_1 = require("./vendors/fresh.js");
|
|
13
|
-
const rangeParser_js_1 = require("./vendors/rangeParser.js");
|
|
14
|
-
const node_fs_1 = require("node:fs");
|
|
15
|
-
const onFinished_js_1 = require("./vendors/onFinished.js");
|
|
16
|
-
const node_util_1 = require("node:util");
|
|
17
|
-
const BYTES_RANGE_REGEXP = /^ *bytes=/;
|
|
18
|
-
const UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
|
|
19
|
-
async function sendFileTrusted(req, res, pathname, // plain path, not URI-encoded
|
|
20
|
-
{ root, allowDotfiles, start = 0, end, disableAcceptRanges, disableLastModified, etag = 'strong', disableCacheControl, maxAge = 60 * 60 * 24 * 365 * 1000, // 1 year
|
|
21
|
-
immutable, } = {}) {
|
|
22
|
-
// null byte(s)
|
|
23
|
-
if (pathname.includes('\0'))
|
|
24
|
-
throw new Error('Forbidden');
|
|
25
|
-
let parts;
|
|
26
|
-
if (root) {
|
|
27
|
-
// normalize
|
|
28
|
-
pathname = node_path_1.default.normalize(`.${node_path_1.default.sep}${pathname}`);
|
|
29
|
-
// malicious path
|
|
30
|
-
if (UP_PATH_REGEXP.test(pathname))
|
|
31
|
-
throw new Error('Forbidden');
|
|
32
|
-
// explode path parts
|
|
33
|
-
parts = pathname.split(node_path_1.default.sep);
|
|
34
|
-
// join / normalize from optional root dir
|
|
35
|
-
pathname = node_path_1.default.normalize(node_path_1.default.join(root, pathname));
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
// malicious path
|
|
39
|
-
if (UP_PATH_REGEXP.test(pathname))
|
|
40
|
-
throw new Error('Forbidden');
|
|
41
|
-
// explode path parts
|
|
42
|
-
parts = node_path_1.default.normalize(pathname).split(node_path_1.default.sep);
|
|
43
|
-
// join / normalize from optional root dir
|
|
44
|
-
pathname = node_path_1.default.resolve(pathname);
|
|
45
|
-
}
|
|
46
|
-
// dotfile handling
|
|
47
|
-
if (parts.some(part => part.length > 1 && part[0] === '.') && !allowDotfiles)
|
|
48
|
-
throw new Error('Forbidden: dotfiles are not allowed');
|
|
49
|
-
// pathEndsWithSep
|
|
50
|
-
if (pathname[pathname.length - 1] === node_path_1.default.sep)
|
|
51
|
-
throw new Error('Forbidden: directory access is not allowed');
|
|
52
|
-
const fileStat = await (0, promises_1.stat)(pathname);
|
|
53
|
-
// not found, check extensions
|
|
54
|
-
// if (err.code === 'ENOENT' && !path.extname(pathname) && !pathEndsWithSep) throw err
|
|
55
|
-
// switch (err.code) {
|
|
56
|
-
// case 'ENAMETOOLONG':
|
|
57
|
-
// case 'ENOENT':
|
|
58
|
-
// case 'ENOTDIR':
|
|
59
|
-
// default:
|
|
60
|
-
// }
|
|
61
|
-
if (fileStat.isDirectory())
|
|
62
|
-
throw new Error('Forbidden: directory access is not allowed');
|
|
63
|
-
if (res.headersSent)
|
|
64
|
-
return;
|
|
65
|
-
//region set header fields
|
|
66
|
-
if (!disableAcceptRanges && !res.getHeader('Accept-Ranges'))
|
|
67
|
-
res.setHeader('Accept-Ranges', 'bytes');
|
|
68
|
-
if (!disableCacheControl && !res.getHeader('Cache-Control'))
|
|
69
|
-
res.setHeader('Cache-Control', [
|
|
70
|
-
`public, max-age=${Math.floor(maxAge / 1000)}`,
|
|
71
|
-
immutable && 'immutable',
|
|
72
|
-
].filter(Boolean).join(', '));
|
|
73
|
-
if (!disableLastModified && !res.getHeader('Last-Modified'))
|
|
74
|
-
res.setHeader('Last-Modified', fileStat.mtime.toUTCString());
|
|
75
|
-
if (etag !== 'disabled' && !res.getHeader('ETag'))
|
|
76
|
-
res.setHeader('ETag', etag === 'weak' ? (0, etag_js_1.statTag)(fileStat) : await (0, etag_js_1.entityTagPath)(fileStat, pathname, false));
|
|
77
|
-
//endregion set header fields
|
|
78
|
-
// content-type
|
|
79
|
-
if (!res.getHeader('Content-Type'))
|
|
80
|
-
res.setHeader('Content-Type', (0, mime_js_1.contentTypeForExtension)(node_path_1.default.extname(pathname).slice(1)) || 'application/octet-stream');
|
|
81
|
-
// conditional GET support
|
|
82
|
-
// isConditionalGET
|
|
83
|
-
if (req.headers['if-match'] || req.headers['if-unmodified-since'] || req.headers['if-none-match'] || req.headers['if-modified-since']) {
|
|
84
|
-
//region isPreconditionFailure
|
|
85
|
-
// if-match
|
|
86
|
-
const match = req.headers['if-match'];
|
|
87
|
-
if (match) {
|
|
88
|
-
const etag = res.getHeader('ETag');
|
|
89
|
-
if (!etag
|
|
90
|
-
|| (match !== '*' && (0, fresh_js_1.parseTokenList)(match).every(match => match !== etag && match !== 'W/' + etag && 'W/' + match !== etag)))
|
|
91
|
-
throw new Error('Precondition Failed: request headers do not match the response');
|
|
92
|
-
}
|
|
93
|
-
// if-unmodified-since (ignore when using strong etag since mtime may be unreliable)
|
|
94
|
-
if (etag === 'weak') {
|
|
95
|
-
const unmodifiedSince = (0, fresh_js_1.parseHttpDate)(req.headers['if-unmodified-since']);
|
|
96
|
-
if (!isNaN(unmodifiedSince)) {
|
|
97
|
-
const lastModified = (0, fresh_js_1.parseHttpDate)(res.getHeader('Last-Modified'));
|
|
98
|
-
if (isNaN(lastModified) || lastModified > unmodifiedSince)
|
|
99
|
-
throw new Error('Precondition Failed: resource has been modified since the specified date');
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
//endregion isPreconditionFailure
|
|
103
|
-
// isCachable
|
|
104
|
-
if ((res.statusCode >= 200 && res.statusCode < 300 || res.statusCode === 304)
|
|
105
|
-
&& (0, fresh_js_1.fresh)(req.headers, {
|
|
106
|
-
etag: res.getHeader('ETag'),
|
|
107
|
-
// Only use last-modified for freshness check when using weak Etag
|
|
108
|
-
'last-modified': etag === 'weak' ? res.getHeader('Last-Modified') : undefined
|
|
109
|
-
})) {
|
|
110
|
-
// removeContentHeaderFields
|
|
111
|
-
res.removeHeader('Content-Encoding');
|
|
112
|
-
res.removeHeader('Content-Language');
|
|
113
|
-
res.removeHeader('Content-Length');
|
|
114
|
-
res.removeHeader('Content-Range');
|
|
115
|
-
res.removeHeader('Content-Type');
|
|
116
|
-
res.statusCode = 304;
|
|
117
|
-
return void await (0, node_util_1.promisify)(res.end.bind(res))();
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// adjust len to start/end options
|
|
121
|
-
let len = fileStat.size;
|
|
122
|
-
len = Math.max(0, len - start);
|
|
123
|
-
if (end !== undefined) {
|
|
124
|
-
const bytes = end - start + 1;
|
|
125
|
-
if (len > bytes)
|
|
126
|
-
len = bytes;
|
|
127
|
-
}
|
|
128
|
-
// Range support
|
|
129
|
-
let ranges = req.headers.range;
|
|
130
|
-
if (!disableAcceptRanges && BYTES_RANGE_REGEXP.test(ranges ?? '')) {
|
|
131
|
-
// parse
|
|
132
|
-
let rangesNum = (0, rangeParser_js_1.parseRange)(len, ranges, { combine: true });
|
|
133
|
-
// If-Range support
|
|
134
|
-
if (!isRangeFresh(req, res))
|
|
135
|
-
rangesNum = -2;
|
|
136
|
-
// unsatisfiable
|
|
137
|
-
if (rangesNum === -1) {
|
|
138
|
-
// Content-Range
|
|
139
|
-
res.setHeader('Content-Range', contentRange('bytes', len));
|
|
140
|
-
// 416 Requested Range Not Satisfiable
|
|
141
|
-
throw new Error('Requested Range Not Satisfiable: requested range is not satisfiable');
|
|
142
|
-
// return this.error(416, {
|
|
143
|
-
// headers: {'Content-Range': res.getHeader('Content-Range')}
|
|
144
|
-
// })
|
|
145
|
-
}
|
|
146
|
-
// valid (syntactically invalid/multiple ranges are treated as a regular response)
|
|
147
|
-
if (rangesNum !== -2 && rangesNum.length === 1) {
|
|
148
|
-
// Content-Range
|
|
149
|
-
res.statusCode = 206;
|
|
150
|
-
res.setHeader('Content-Range', contentRange('bytes', len, rangesNum[0]));
|
|
151
|
-
// adjust for requested range
|
|
152
|
-
start += rangesNum[0].start;
|
|
153
|
-
len = rangesNum[0].end - rangesNum[0].start + 1;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// set read options
|
|
157
|
-
end = Math.max(start, start + len - 1);
|
|
158
|
-
// content-length
|
|
159
|
-
res.setHeader('Content-Length', len);
|
|
160
|
-
// HEAD support
|
|
161
|
-
if (req.method === 'HEAD')
|
|
162
|
-
return void await (0, node_util_1.promisify)(res.end.bind(res))();
|
|
163
|
-
// Weak ETag path: stream file
|
|
164
|
-
const stream = (0, node_fs_1.createReadStream)(pathname, { start, end });
|
|
165
|
-
stream.pipe(res);
|
|
166
|
-
const defer = Promise.withResolvers();
|
|
167
|
-
(0, onFinished_js_1.onFinished)(res, cleanup);
|
|
168
|
-
stream.on('error', err => {
|
|
169
|
-
cleanup();
|
|
170
|
-
defer.reject(err);
|
|
171
|
-
});
|
|
172
|
-
stream.on('end', defer.resolve);
|
|
173
|
-
function cleanup() {
|
|
174
|
-
stream.destroy();
|
|
175
|
-
}
|
|
176
|
-
return defer.promise;
|
|
177
|
-
}
|
|
178
|
-
exports.sendFileTrusted = sendFileTrusted;
|
|
179
|
-
function isRangeFresh(req, res) {
|
|
180
|
-
const ifRange = req.headers['if-range'];
|
|
181
|
-
if (!ifRange)
|
|
182
|
-
return true;
|
|
183
|
-
// if-range as etag
|
|
184
|
-
if (ifRange.indexOf('"') !== -1) {
|
|
185
|
-
const etag = res.getHeader('ETag');
|
|
186
|
-
return etag && ifRange.includes(etag);
|
|
187
|
-
}
|
|
188
|
-
// if-range as modified date
|
|
189
|
-
const lastModified = res.getHeader('Last-Modified');
|
|
190
|
-
return (0, fresh_js_1.parseHttpDate)(lastModified) <= (0, fresh_js_1.parseHttpDate)(ifRange);
|
|
191
|
-
}
|
|
192
|
-
function contentRange(type, size, range) {
|
|
193
|
-
return `${type} ${range ? range.start + '-' + range.end : '*'}/${size}`;
|
|
194
|
-
}
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGF0aWNIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHNDQUFtQztBQUNuQywwREFBNEI7QUFDNUIsK0NBQXFDO0FBQ3JDLCtDQUF3RDtBQUN4RCwrQ0FBeUQ7QUFDekQsaURBQXVFO0FBQ3ZFLDZEQUFtRDtBQUNuRCxxQ0FBd0M7QUFDeEMsMkRBQWtEO0FBQ2xELHlDQUFtQztBQUVuQyxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQTtBQUN0QyxNQUFNLGNBQWMsR0FBRyw0QkFBNEIsQ0FBQTtBQXFCNUMsS0FBSyxVQUFVLGVBQWUsQ0FDcEMsR0FBb0IsRUFDcEIsR0FBbUIsRUFDbkIsUUFBZ0IsRUFBRSw4QkFBOEI7QUFDaEQsRUFDQyxJQUFJLEVBQUUsYUFBYSxFQUNuQixLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFDZCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLElBQUksR0FBRyxRQUFRLEVBQ2YsbUJBQW1CLEVBQ25CLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLFNBQVM7QUFDN0MsU0FBUyxNQUNXLEVBQUU7SUFFdkIsZUFBZTtJQUNmLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXpELElBQUksS0FBZSxDQUFBO0lBQ25CLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVixZQUFZO1FBQ1osUUFBUSxHQUFHLG1CQUFJLENBQUMsU0FBUyxDQUFDLElBQUksbUJBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUVwRCxpQkFBaUI7UUFDakIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFL0QscUJBQXFCO1FBQ3JCLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLG1CQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFaEMsMENBQTBDO1FBQzFDLFFBQVEsR0FBRyxtQkFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUNyRCxDQUFDO1NBQU0sQ0FBQztRQUNQLGlCQUFpQjtRQUNqQixJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUvRCxxQkFBcUI7UUFDckIsS0FBSyxHQUFHLG1CQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWhELDBDQUEwQztRQUMxQyxRQUFRLEdBQUcsbUJBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBRXBJLGtCQUFrQjtJQUNsQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLG1CQUFJLENBQUMsR0FBRztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtJQUU3RyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsZUFBSSxFQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3JDLDhCQUE4QjtJQUM5QixzRkFBc0Y7SUFDdEYsc0JBQXNCO0lBQ3RCLHdCQUF3QjtJQUN4QixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixJQUFJO0lBRUosSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBRXpGLElBQUksR0FBRyxDQUFDLFdBQVc7UUFBRSxPQUFNO0lBRTNCLDBCQUEwQjtJQUUxQixJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBRXBHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQ3pGO1lBQ0MsbUJBQW1CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQzlDLFNBQVMsSUFBSSxXQUFXO1NBQ3hCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDNUIsQ0FBQTtJQUVELElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1FBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBRXpILElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBQSxpQkFBTyxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUEsdUJBQWEsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDOUosNkJBQTZCO0lBRTdCLGVBQWU7SUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7UUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxJQUFBLGlDQUF1QixFQUFDLG1CQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLDBCQUEwQixDQUFDLENBQUE7SUFFekosMEJBQTBCO0lBQzFCLG1CQUFtQjtJQUNuQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7UUFDdkksOEJBQThCO1FBQzlCLFdBQVc7UUFDWCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3JDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2xDLElBQ0MsQ0FBQyxJQUFJO21CQUNGLENBQUMsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFBLHlCQUFjLEVBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO2dCQUMzSCxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUE7UUFDcEYsQ0FBQztRQUVELG9GQUFvRjtRQUNwRixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyQixNQUFNLGVBQWUsR0FBRyxJQUFBLHdCQUFhLEVBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUE7WUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUM3QixNQUFNLFlBQVksR0FBRyxJQUFBLHdCQUFhLEVBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO2dCQUNsRSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLEdBQUcsZUFBZTtvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBFQUEwRSxDQUFDLENBQUE7WUFDdkosQ0FBQztRQUNGLENBQUM7UUFDRCxpQ0FBaUM7UUFFakMsYUFBYTtRQUNiLElBQ0MsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLEdBQUcsQ0FBQztlQUN0RSxJQUFBLGdCQUFLLEVBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDckIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2dCQUMzQixrRUFBa0U7Z0JBQ2xFLGVBQWUsRUFBRSxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzdFLENBQUMsRUFDRCxDQUFDO1lBQ0YsNEJBQTRCO1lBQzVCLEdBQUcsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUNwQyxHQUFHLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFDcEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBQ2xDLEdBQUcsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDakMsR0FBRyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUNoQyxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQTtZQUNwQixPQUFPLEtBQUssTUFBTSxJQUFBLHFCQUFTLEVBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pELENBQUM7SUFDRixDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUE7SUFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQTtJQUM5QixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUM3QixJQUFJLEdBQUcsR0FBRyxLQUFLO1lBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQTtJQUM3QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFBO0lBQzlCLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDbkUsUUFBUTtRQUNSLElBQUksU0FBUyxHQUFHLElBQUEsMkJBQVUsRUFBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFFeEQsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUUzQyxnQkFBZ0I7UUFDaEIsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QixnQkFBZ0I7WUFDaEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBRTFELHNDQUFzQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUE7WUFDdEYsMkJBQTJCO1lBQzNCLDhEQUE4RDtZQUM5RCxLQUFLO1FBQ04sQ0FBQztRQUVELGtGQUFrRjtRQUNsRixJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hELGdCQUFnQjtZQUNoQixHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQTtZQUNwQixHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRXhFLDZCQUE2QjtZQUM3QixLQUFLLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtZQUMzQixHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUNoRCxDQUFDO0lBQ0YsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUV0QyxpQkFBaUI7SUFDakIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUVwQyxlQUFlO0lBQ2YsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLEtBQUssTUFBTSxJQUFBLHFCQUFTLEVBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRTNFLDhCQUE4QjtJQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFnQixFQUFDLFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFaEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBUSxDQUFBO0lBRTNDLElBQUEsMEJBQVUsRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDeEIsT0FBTyxFQUFFLENBQUE7UUFDVCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2xCLENBQUMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQy9CLFNBQVMsT0FBTztRQUNmLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNqQixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFBO0FBQ3JCLENBQUM7QUFoTUQsMENBZ01DO0FBRUQsU0FBUyxZQUFZLENBQUUsR0FBb0IsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRXZDLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFekIsbUJBQW1CO0lBQ25CLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbEMsT0FBTyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDbkQsT0FBTyxJQUFBLHdCQUFhLEVBQUMsWUFBWSxDQUFDLElBQUksSUFBQSx3QkFBYSxFQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQzdELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUs7SUFDdkMsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtBQUN4RSxDQUFDIn0=
|
package/cjs/stream.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.readStream = exports.getContentStream = void 0;
|
|
4
|
-
const node_zlib_1 = require("node:zlib");
|
|
5
|
-
require("./polyfillWithResolvers.js");
|
|
6
|
-
// note: there might be multiple encodings applied to the stream
|
|
7
|
-
// we only support one encoding
|
|
8
|
-
function getContentStream(req, encoding, disableInflate) {
|
|
9
|
-
if (disableInflate && encoding !== 'identity')
|
|
10
|
-
throw new Error(`content-encoding ${encoding} is not supported`);
|
|
11
|
-
switch (encoding) {
|
|
12
|
-
case 'deflate': {
|
|
13
|
-
const stream = (0, node_zlib_1.createInflate)();
|
|
14
|
-
req.pipe(stream);
|
|
15
|
-
return stream;
|
|
16
|
-
}
|
|
17
|
-
case 'gzip': {
|
|
18
|
-
const stream = (0, node_zlib_1.createGunzip)();
|
|
19
|
-
req.pipe(stream);
|
|
20
|
-
return stream;
|
|
21
|
-
}
|
|
22
|
-
case 'br': {
|
|
23
|
-
const stream = (0, node_zlib_1.createBrotliDecompress)();
|
|
24
|
-
req.pipe(stream);
|
|
25
|
-
return stream;
|
|
26
|
-
}
|
|
27
|
-
case 'identity':
|
|
28
|
-
return req;
|
|
29
|
-
default:
|
|
30
|
-
throw new Error(`unsupported content-encoding ${encoding}`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
exports.getContentStream = getContentStream;
|
|
34
|
-
// https://github.com/stream-utils/raw-body/blob/191e4b6506dcf77198eed01c8feb4b6817008342/index.js#L155
|
|
35
|
-
async function readStream(stream, { length, limit }) {
|
|
36
|
-
let completed = false;
|
|
37
|
-
// check the length and limit options.
|
|
38
|
-
// note: we intentionally leave the stream paused,
|
|
39
|
-
// so users should handle the stream themselves.
|
|
40
|
-
if (limit !== undefined && length !== undefined && length > limit)
|
|
41
|
-
throw new Error('request entity too large');
|
|
42
|
-
let received = 0;
|
|
43
|
-
const buffers = [];
|
|
44
|
-
const defer = Promise.withResolvers();
|
|
45
|
-
// attach listeners
|
|
46
|
-
stream.on('aborted', onAborted);
|
|
47
|
-
stream.on('close', onClose);
|
|
48
|
-
stream.on('data', onData);
|
|
49
|
-
stream.on('end', onEnd);
|
|
50
|
-
stream.on('error', onError);
|
|
51
|
-
function done(err, result) {
|
|
52
|
-
if (completed)
|
|
53
|
-
return;
|
|
54
|
-
completed = true;
|
|
55
|
-
onClose();
|
|
56
|
-
if (err) {
|
|
57
|
-
stream.unpipe?.();
|
|
58
|
-
stream.pause?.();
|
|
59
|
-
defer.reject(err);
|
|
60
|
-
}
|
|
61
|
-
else
|
|
62
|
-
defer.resolve(result);
|
|
63
|
-
}
|
|
64
|
-
function onData(chunk) {
|
|
65
|
-
if (completed)
|
|
66
|
-
return;
|
|
67
|
-
received += chunk.length;
|
|
68
|
-
if (limit !== undefined && received > limit) {
|
|
69
|
-
done(new Error('request entity too large'));
|
|
70
|
-
}
|
|
71
|
-
else
|
|
72
|
-
buffers.push(chunk);
|
|
73
|
-
}
|
|
74
|
-
function onError(err) {
|
|
75
|
-
done(err);
|
|
76
|
-
}
|
|
77
|
-
function onEnd() {
|
|
78
|
-
if (length !== undefined && received !== length)
|
|
79
|
-
done(new Error('request size did not match content length'));
|
|
80
|
-
else
|
|
81
|
-
done(undefined, Buffer.concat(buffers));
|
|
82
|
-
}
|
|
83
|
-
function onAborted() {
|
|
84
|
-
done(new Error('request aborted'));
|
|
85
|
-
}
|
|
86
|
-
function onClose() {
|
|
87
|
-
buffers.splice(0, buffers.length);
|
|
88
|
-
stream.off('aborted', onAborted);
|
|
89
|
-
stream.off('data', onData);
|
|
90
|
-
stream.off('end', onEnd);
|
|
91
|
-
stream.off('error', onError);
|
|
92
|
-
stream.off('close', onClose);
|
|
93
|
-
}
|
|
94
|
-
return await defer.promise;
|
|
95
|
-
}
|
|
96
|
-
exports.readStream = readStream;
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx5Q0FBNkU7QUFDN0Usc0NBQW1DO0FBRW5DLGdFQUFnRTtBQUNoRSwrQkFBK0I7QUFDL0IsU0FBZ0IsZ0JBQWdCLENBQUMsR0FBb0IsRUFBRSxRQUFnQixFQUFFLGNBQXdCO0lBQ2hHLElBQUksY0FBYyxJQUFJLFFBQVEsS0FBSyxVQUFVO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsUUFBUSxtQkFBbUIsQ0FBQyxDQUFBO0lBRS9HLFFBQVEsUUFBUSxFQUFFLENBQUM7UUFDbEIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUEseUJBQWEsR0FBRSxDQUFBO1lBQzlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDaEIsT0FBTyxNQUFNLENBQUE7UUFDZCxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBQSx3QkFBWSxHQUFFLENBQUE7WUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQixPQUFPLE1BQU0sQ0FBQTtRQUNkLENBQUM7UUFDRCxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDWCxNQUFNLE1BQU0sR0FBRyxJQUFBLGtDQUFzQixHQUFFLENBQUE7WUFDdkMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNoQixPQUFPLE1BQU0sQ0FBQTtRQUNkLENBQUM7UUFDRCxLQUFLLFVBQVU7WUFDZCxPQUFPLEdBQUcsQ0FBQTtRQUNYO1lBQ0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0FBQ0YsQ0FBQztBQXhCRCw0Q0F3QkM7QUFFRCx1R0FBdUc7QUFDaEcs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
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseContentType = void 0;
|
|
4
|
-
// https://github.com/jshttp/content-type/blob/d02574e9640bd4370f148c767b1b877b5a300070/index.js#L106
|
|
5
|
-
/**
|
|
6
|
-
* RegExp to match type in RFC 7231 sec 3.1.1.1
|
|
7
|
-
*
|
|
8
|
-
* media-type = type "/" subtype
|
|
9
|
-
* type = token
|
|
10
|
-
* subtype = token
|
|
11
|
-
*/
|
|
12
|
-
const TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
|
|
13
|
-
/**
|
|
14
|
-
* RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1
|
|
15
|
-
*
|
|
16
|
-
* parameter = token "=" ( token / quoted-string )
|
|
17
|
-
* token = 1*tchar
|
|
18
|
-
* tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
|
|
19
|
-
* / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
|
|
20
|
-
* / DIGIT / ALPHA
|
|
21
|
-
* ; any VCHAR, except delimiters
|
|
22
|
-
* quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
|
|
23
|
-
* qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
|
|
24
|
-
* obs-text = %x80-FF
|
|
25
|
-
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
|
26
|
-
*/
|
|
27
|
-
const PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g; // eslint-disable-line no-control-regex
|
|
28
|
-
const TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/; // eslint-disable-line no-control-regex
|
|
29
|
-
const TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
|
|
30
|
-
/**
|
|
31
|
-
* RegExp to match quoted-pair in RFC 7230 sec 3.2.6
|
|
32
|
-
*
|
|
33
|
-
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
|
|
34
|
-
* obs-text = %x80-FF
|
|
35
|
-
*/
|
|
36
|
-
const QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g; // eslint-disable-line no-control-regex
|
|
37
|
-
function parseContentType(header) {
|
|
38
|
-
let index = header.indexOf(';');
|
|
39
|
-
const mediaType = index !== -1
|
|
40
|
-
? header.slice(0, index).trim()
|
|
41
|
-
: header.trim();
|
|
42
|
-
if (!TYPE_REGEXP.test(mediaType))
|
|
43
|
-
throw new TypeError(`invalid media type: ${mediaType}`);
|
|
44
|
-
const parameters = Object.create(null);
|
|
45
|
-
// parse parameters
|
|
46
|
-
if (index !== -1) {
|
|
47
|
-
let key;
|
|
48
|
-
let match;
|
|
49
|
-
let value;
|
|
50
|
-
const regexp = new RegExp(PARAM_REGEXP);
|
|
51
|
-
regexp.lastIndex = index;
|
|
52
|
-
while ((match = regexp.exec(header))) {
|
|
53
|
-
if (match.index !== index)
|
|
54
|
-
throw new TypeError('invalid parameter format');
|
|
55
|
-
index += match[0].length;
|
|
56
|
-
key = match[1].toLowerCase();
|
|
57
|
-
value = match[2];
|
|
58
|
-
if (value.charCodeAt(0) === 0x22 /* " */) {
|
|
59
|
-
// remove quotes
|
|
60
|
-
value = value.slice(1, -1);
|
|
61
|
-
// remove escapes
|
|
62
|
-
if (value.indexOf('\\') !== -1)
|
|
63
|
-
value = value.replace(QESC_REGEXP, '$1');
|
|
64
|
-
}
|
|
65
|
-
parameters[key] = value;
|
|
66
|
-
}
|
|
67
|
-
if (index !== header.length)
|
|
68
|
-
throw new TypeError('invalid parameter format');
|
|
69
|
-
}
|
|
70
|
-
return { mediaType, parameters };
|
|
71
|
-
}
|
|
72
|
-
exports.parseContentType = parseContentType;
|
|
73
|
-
/**
|
|
74
|
-
* RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6
|
|
75
|
-
*/
|
|
76
|
-
const QUOTE_REGEXP = /([\\"])/g;
|
|
77
|
-
function qstring(str) {
|
|
78
|
-
// no need to quote tokens
|
|
79
|
-
if (TOKEN_REGEXP.test(str))
|
|
80
|
-
return str;
|
|
81
|
-
if (str.length > 0 && !TEXT_REGEXP.test(str))
|
|
82
|
-
throw new TypeError(`invalid parameter value: ${str}`);
|
|
83
|
-
return `"${str.replace(QUOTE_REGEXP, '\\$1')}"`;
|
|
84
|
-
}
|
|
85
|
-
function formatContentType({ mediaType, parameters }) {
|
|
86
|
-
if (!mediaType || !TYPE_REGEXP.test(mediaType))
|
|
87
|
-
throw new TypeError(`invalid type: ${mediaType}`);
|
|
88
|
-
return `${mediaType}${parameters
|
|
89
|
-
? Object.keys(parameters).sort().map(key => `; ${key}=${qstring(parameters[key])}`).join('')
|
|
90
|
-
: ''}`;
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVuZG9ycy9jb250ZW50VHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxR0FBcUc7QUFDckc7Ozs7OztHQU1HO0FBQ0gsTUFBTSxXQUFXLEdBQUcsNERBQTRELENBQUE7QUFDaEY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sWUFBWSxHQUFHLGtLQUFrSyxDQUFBLENBQUMsdUNBQXVDO0FBQy9OLE1BQU0sV0FBVyxHQUFHLHVDQUF1QyxDQUFBLENBQUMsdUNBQXVDO0FBQ25HLE1BQU0sWUFBWSxHQUFHLCtCQUErQixDQUFBO0FBQ3BEOzs7OztHQUtHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUEsQ0FBQyx1Q0FBdUM7QUFFeEYsU0FBZ0IsZ0JBQWdCLENBQUUsTUFBYztJQUMvQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9CLE1BQU0sU0FBUyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRTtRQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO0lBRWhCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsdUJBQXVCLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDekYsTUFBTSxVQUFVLEdBQTJCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFOUQsbUJBQW1CO0lBQ25CLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEIsSUFBSSxHQUFHLENBQUE7UUFDUCxJQUFJLEtBQUssQ0FBQTtRQUNULElBQUksS0FBSyxDQUFBO1FB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
|
package/cjs/vendors/etag.js
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
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;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.isFreshModifiedSince = exports.isFreshETag = exports.statTag = exports.entityTagPath = exports.entityTag = void 0;
|
|
27
|
-
// etag: https://github.com/jshttp/etag/blob/b9f0642256e63654287299d205bc6ced71b1a228/index.js#L39
|
|
28
|
-
const node_crypto_1 = __importStar(require("node:crypto"));
|
|
29
|
-
const node_fs_1 = require("node:fs");
|
|
30
|
-
function entityTag(buf, weak) {
|
|
31
|
-
// pre-computed empty
|
|
32
|
-
return buf.length
|
|
33
|
-
? `${buf.length.toString(16)}-${node_crypto_1.default
|
|
34
|
-
.createHash('sha1')
|
|
35
|
-
.update(buf)
|
|
36
|
-
.digest('base64')
|
|
37
|
-
.substring(0, 27)}"`
|
|
38
|
-
: `${weak ? 'W/' : ''}"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"`;
|
|
39
|
-
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#directives
|
|
40
|
-
// weak W/ vs strong eTag
|
|
41
|
-
// same weak eTag: 2 resources might be semantically equivalent, but not byte-for-byte identical
|
|
42
|
-
}
|
|
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;
|
|
59
|
-
const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
|
|
60
|
-
function statTag(stat) {
|
|
61
|
-
const mtime = stat.mtime.getTime().toString(16);
|
|
62
|
-
const size = stat.size.toString(16);
|
|
63
|
-
return `"${size}-${mtime}"`;
|
|
64
|
-
}
|
|
65
|
-
exports.statTag = statTag;
|
|
66
|
-
// https://github.com/jshttp/fresh/blob/05254186fd7428915224db46144fc94293a7df7d/index.js#L33
|
|
67
|
-
function isFreshETag(req, etag) {
|
|
68
|
-
const noneMatch = req.headers['if-none-match'];
|
|
69
|
-
if (!noneMatch)
|
|
70
|
-
return;
|
|
71
|
-
// Always return stale when Cache-Control: no-cache
|
|
72
|
-
// to support end-to-end reload requests
|
|
73
|
-
// https://tools.ietf.org/html/rfc2616#section-14.9.4
|
|
74
|
-
const cacheControl = req.headers['cache-control'];
|
|
75
|
-
if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl))
|
|
76
|
-
return;
|
|
77
|
-
if (noneMatch && noneMatch !== '*') {
|
|
78
|
-
if (!etag)
|
|
79
|
-
return;
|
|
80
|
-
let etagStale = true;
|
|
81
|
-
for (const match of parseTokenList(noneMatch)) {
|
|
82
|
-
if (match === etag || match === `W/${etag}` || `W/${match}` === etag) {
|
|
83
|
-
etagStale = false;
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (etagStale)
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
exports.isFreshETag = isFreshETag;
|
|
93
|
-
function isFreshModifiedSince(req, lastModified) {
|
|
94
|
-
const modifiedSince = req.headers['if-modified-since'];
|
|
95
|
-
if (!modifiedSince)
|
|
96
|
-
return;
|
|
97
|
-
// Always return stale when Cache-Control: no-cache
|
|
98
|
-
// to support end-to-end reload requests
|
|
99
|
-
// https://tools.ietf.org/html/rfc2616#section-14.9.4
|
|
100
|
-
const cacheControl = req.headers['cache-control'];
|
|
101
|
-
if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl))
|
|
102
|
-
return;
|
|
103
|
-
if (modifiedSince && lastModified) {
|
|
104
|
-
const lastModifiedDate = Date.parse(lastModified);
|
|
105
|
-
const modifiedSinceDate = Date.parse(modifiedSince);
|
|
106
|
-
return !isNaN(lastModifiedDate) && !isNaN(modifiedSinceDate) && lastModifiedDate <= modifiedSinceDate;
|
|
107
|
-
}
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
exports.isFreshModifiedSince = isFreshModifiedSince;
|
|
111
|
-
function parseTokenList(str) {
|
|
112
|
-
let end = 0;
|
|
113
|
-
const list = [];
|
|
114
|
-
let start = 0;
|
|
115
|
-
// gather tokens
|
|
116
|
-
for (let i = 0, len = str.length; i < len; i++) {
|
|
117
|
-
switch (str.charCodeAt(i)) {
|
|
118
|
-
case 0x20: /* */
|
|
119
|
-
if (start === end) {
|
|
120
|
-
start = end = i + 1;
|
|
121
|
-
}
|
|
122
|
-
break;
|
|
123
|
-
case 0x2c: /* , */
|
|
124
|
-
list.push(str.substring(start, end));
|
|
125
|
-
start = end = i + 1;
|
|
126
|
-
break;
|
|
127
|
-
default:
|
|
128
|
-
end = i + 1;
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// final token
|
|
133
|
-
list.push(str.substring(start, end));
|
|
134
|
-
return list;
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZW5kb3JzL2V0YWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrR0FBa0c7QUFDbEcsMkRBQThDO0FBRTlDLHFDQUFvRDtBQUVwRCxTQUFnQixTQUFTLENBQUMsR0FBVyxFQUFFLElBQWM7SUFDcEQscUJBQXFCO0lBQ3JCLE9BQU8sR0FBRyxDQUFDLE1BQU07UUFDaEIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUkscUJBQU07YUFDcEMsVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUNoQixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBQ3JCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlDQUFpQyxDQUFBO0lBQ3ZELDRFQUE0RTtJQUM1RSx5QkFBeUI7SUFDekIsZ0dBQWdHO0FBQ2pHLENBQUM7QUFaRCw4QkFZQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsUUFBZSxFQUFFLFFBQWdCLEVBQUUsSUFBYztJQUNwRixNQUFNLElBQUksR0FBRyxJQUFBLHdCQUFVLEVBQUMsTUFBTSxDQUFDLENBQUE7SUFDL0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBVSxDQUFBO0lBQzdDLElBQUEsMEJBQWdCLEVBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNuQyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDM0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0IsTUFBTSxLQUFLLENB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
|
package/cjs/vendors/fresh.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseTokenList = exports.parseHttpDate = exports.fresh = void 0;
|
|
4
|
-
const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
|
|
5
|
-
/**
|
|
6
|
-
* Check freshness of the response using request and response headers.
|
|
7
|
-
*
|
|
8
|
-
* @param {Object} reqHeaders
|
|
9
|
-
* @param {Object} resHeaders
|
|
10
|
-
* @return {Boolean}
|
|
11
|
-
* @public
|
|
12
|
-
*/
|
|
13
|
-
function fresh(reqHeaders, resHeaders) {
|
|
14
|
-
// fields
|
|
15
|
-
const modifiedSince = reqHeaders['if-modified-since'];
|
|
16
|
-
const noneMatch = reqHeaders['if-none-match'];
|
|
17
|
-
// unconditional request
|
|
18
|
-
if (!modifiedSince && !noneMatch) {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
// Always return stale when Cache-Control: no-cache
|
|
22
|
-
// to support end-to-end reload requests
|
|
23
|
-
// https://tools.ietf.org/html/rfc2616#section-14.9.4
|
|
24
|
-
const cacheControl = reqHeaders['cache-control'];
|
|
25
|
-
if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
// if-none-match takes precedent over if-modified-since
|
|
29
|
-
if (noneMatch) {
|
|
30
|
-
if (noneMatch === '*') {
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
const etag = resHeaders.etag;
|
|
34
|
-
if (!etag) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
const matches = parseTokenList(noneMatch);
|
|
38
|
-
for (let i = 0; i < matches.length; i++) {
|
|
39
|
-
const match = matches[i];
|
|
40
|
-
if (match === etag || match === 'W/' + etag || 'W/' + match === etag) {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
// if-modified-since
|
|
47
|
-
if (modifiedSince) {
|
|
48
|
-
const lastModified = resHeaders['last-modified'];
|
|
49
|
-
const modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince));
|
|
50
|
-
if (modifiedStale) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
exports.fresh = fresh;
|
|
57
|
-
/**
|
|
58
|
-
* Parse an HTTP Date into a number.
|
|
59
|
-
*
|
|
60
|
-
* @param {string} date
|
|
61
|
-
* @private
|
|
62
|
-
*/
|
|
63
|
-
function parseHttpDate(date) {
|
|
64
|
-
const timestamp = date && Date.parse(date);
|
|
65
|
-
// istanbul ignore next: guard against date.js Date.parse patching
|
|
66
|
-
return typeof timestamp === 'number' ? timestamp : NaN;
|
|
67
|
-
}
|
|
68
|
-
exports.parseHttpDate = parseHttpDate;
|
|
69
|
-
/**
|
|
70
|
-
* Parse a HTTP token list.
|
|
71
|
-
*
|
|
72
|
-
* @param {string} str
|
|
73
|
-
* @private
|
|
74
|
-
*/
|
|
75
|
-
function parseTokenList(str) {
|
|
76
|
-
let end = 0;
|
|
77
|
-
const list = [];
|
|
78
|
-
let start = 0;
|
|
79
|
-
// gather tokens
|
|
80
|
-
let i = 0, len = str.length;
|
|
81
|
-
for (; i < len; i++) {
|
|
82
|
-
switch (str.charCodeAt(i)) {
|
|
83
|
-
case 0x20: /* */
|
|
84
|
-
if (start === end) {
|
|
85
|
-
start = end = i + 1;
|
|
86
|
-
}
|
|
87
|
-
break;
|
|
88
|
-
case 0x2c: /* , */
|
|
89
|
-
list.push(str.substring(start, end));
|
|
90
|
-
start = end = i + 1;
|
|
91
|
-
break;
|
|
92
|
-
default:
|
|
93
|
-
end = i + 1;
|
|
94
|
-
break;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// final token
|
|
98
|
-
list.push(str.substring(start, end));
|
|
99
|
-
return list;
|
|
100
|
-
}
|
|
101
|
-
exports.parseTokenList = parseTokenList;
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVuZG9ycy9mcmVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLDZCQUE2QixHQUFHLGdDQUFnQyxDQUFBO0FBRXRFOzs7Ozs7O0dBT0c7QUFFSCxTQUFnQixLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDM0MsU0FBUztJQUNULE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ3JELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUU3Qyx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sS0FBSyxDQUFBO0lBQ2IsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCx3Q0FBd0M7SUFDeEMscURBQXFEO0lBQ3JELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNoRCxJQUFJLFlBQVksSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUN0RSxPQUFPLEtBQUssQ0FBQTtJQUNiLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNmLElBQUksU0FBUyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFBO1FBQ1osQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUE7UUFFNUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUE7UUFDYixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxF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
|