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