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.
Files changed (128) hide show
  1. package/README.md +417 -293
  2. package/{cjs → lib}/body.d.ts +2 -3
  3. package/lib/body.js +10 -0
  4. package/lib/body.js.map +1 -0
  5. package/{esm → lib}/bodyHelpers.d.ts +2 -4
  6. package/lib/bodyHelpers.js +102 -0
  7. package/lib/bodyHelpers.js.map +1 -0
  8. package/{esm → lib}/dx.d.ts +6 -9
  9. package/lib/dx.js +133 -0
  10. package/lib/dx.js.map +1 -0
  11. package/{cjs → lib}/dxHelpers.d.ts +2 -5
  12. package/lib/dxHelpers.js +135 -0
  13. package/lib/dxHelpers.js.map +1 -0
  14. package/lib/helpers.js.map +1 -0
  15. package/{cjs → lib}/index.d.ts +1 -2
  16. package/{esm/index.d.ts → lib/index.js} +1 -2
  17. package/lib/index.js.map +1 -0
  18. package/lib/logger.d.ts +4 -0
  19. package/lib/logger.js +64 -0
  20. package/lib/logger.js.map +1 -0
  21. package/lib/router.d.ts +42 -0
  22. package/lib/router.js +43 -0
  23. package/lib/router.js.map +1 -0
  24. package/lib/static.js +23 -0
  25. package/lib/static.js.map +1 -0
  26. package/{cjs → lib}/staticHelpers.d.ts +5 -3
  27. package/lib/staticHelpers.js +202 -0
  28. package/lib/staticHelpers.js.map +1 -0
  29. package/{cjs → lib}/stream.d.ts +3 -8
  30. package/lib/stream.js +96 -0
  31. package/lib/stream.js.map +1 -0
  32. package/lib/vendors/contentType.js +64 -0
  33. package/lib/vendors/contentType.js.map +1 -0
  34. package/{cjs → lib}/vendors/etag.d.ts +2 -5
  35. package/lib/vendors/etag.js +94 -0
  36. package/lib/vendors/etag.js.map +1 -0
  37. package/{cjs → lib}/vendors/fresh.d.ts +2 -2
  38. package/lib/vendors/fresh.js +88 -0
  39. package/lib/vendors/fresh.js.map +1 -0
  40. package/lib/vendors/mime.d.ts +1 -0
  41. package/lib/vendors/mime.js +35 -0
  42. package/lib/vendors/mime.js.map +1 -0
  43. package/{cjs → lib}/vendors/mimeDb.d.ts +2544 -2544
  44. package/lib/vendors/mimeDb.js +9435 -0
  45. package/lib/vendors/mimeDb.js.map +1 -0
  46. package/{cjs → lib}/vendors/mimeScore.d.ts +1 -1
  47. package/lib/vendors/mimeScore.js +44 -0
  48. package/lib/vendors/mimeScore.js.map +1 -0
  49. package/{cjs → lib}/vendors/onFinished.d.ts +1 -1
  50. package/lib/vendors/onFinished.js +231 -0
  51. package/lib/vendors/rangeParser.d.ts +12 -0
  52. package/lib/vendors/rangeParser.js +108 -0
  53. package/lib/vendors/rangeParser.js.map +1 -0
  54. package/package.json +32 -36
  55. package/cjs/body.js +0 -14
  56. package/cjs/bodyHelpers.d.ts +0 -16
  57. package/cjs/bodyHelpers.js +0 -101
  58. package/cjs/connect.d.ts +0 -5
  59. package/cjs/connect.js +0 -44
  60. package/cjs/dx.d.ts +0 -46
  61. package/cjs/dx.js +0 -144
  62. package/cjs/dxHelpers.js +0 -123
  63. package/cjs/express.d.ts +0 -4
  64. package/cjs/express.js +0 -43
  65. package/cjs/helpers.js +0 -14
  66. package/cjs/index.js +0 -38
  67. package/cjs/logger.d.ts +0 -3
  68. package/cjs/logger.js +0 -61
  69. package/cjs/package.json +0 -3
  70. package/cjs/polyfillWithResolvers.d.ts +0 -1
  71. package/cjs/polyfillWithResolvers.js +0 -17
  72. package/cjs/router.js +0 -47
  73. package/cjs/static.js +0 -27
  74. package/cjs/staticHelpers.js +0 -195
  75. package/cjs/stream.js +0 -97
  76. package/cjs/vendors/contentType.js +0 -92
  77. package/cjs/vendors/etag.js +0 -136
  78. package/cjs/vendors/fresh.js +0 -102
  79. package/cjs/vendors/mime.d.ts +0 -1
  80. package/cjs/vendors/mime.js +0 -42
  81. package/cjs/vendors/mimeDb.js +0 -9417
  82. package/cjs/vendors/mimeScore.js +0 -50
  83. package/cjs/vendors/onFinished.js +0 -245
  84. package/cjs/vendors/rangeParser.d.ts +0 -10
  85. package/cjs/vendors/rangeParser.js +0 -126
  86. package/esm/body.d.ts +0 -8
  87. package/esm/body.js +0 -11
  88. package/esm/bodyHelpers.js +0 -90
  89. package/esm/connect.d.ts +0 -5
  90. package/esm/connect.js +0 -40
  91. package/esm/dx.js +0 -128
  92. package/esm/dxHelpers.d.ts +0 -49
  93. package/esm/dxHelpers.js +0 -119
  94. package/esm/express.d.ts +0 -4
  95. package/esm/express.js +0 -35
  96. package/esm/helpers.js +0 -3
  97. package/esm/index.js +0 -9
  98. package/esm/logger.d.ts +0 -3
  99. package/esm/logger.js +0 -57
  100. package/esm/polyfillWithResolvers.d.ts +0 -1
  101. package/esm/polyfillWithResolvers.js +0 -16
  102. package/esm/router.js +0 -44
  103. package/esm/static.d.ts +0 -5
  104. package/esm/static.js +0 -23
  105. package/esm/staticHelpers.d.ts +0 -18
  106. package/esm/staticHelpers.js +0 -188
  107. package/esm/stream.d.ts +0 -12
  108. package/esm/stream.js +0 -92
  109. package/esm/vendors/contentType.d.ts +0 -4
  110. package/esm/vendors/contentType.js +0 -88
  111. package/esm/vendors/etag.d.ts +0 -10
  112. package/esm/vendors/etag.js +0 -105
  113. package/esm/vendors/fresh.d.ts +0 -23
  114. package/esm/vendors/fresh.js +0 -96
  115. package/esm/vendors/mime.d.ts +0 -1
  116. package/esm/vendors/mime.js +0 -35
  117. package/esm/vendors/mimeDb.d.ts +0 -9413
  118. package/esm/vendors/mimeDb.js +0 -9415
  119. package/esm/vendors/mimeScore.d.ts +0 -5
  120. package/esm/vendors/mimeScore.js +0 -46
  121. package/esm/vendors/onFinished.d.ts +0 -14
  122. package/esm/vendors/onFinished.js +0 -241
  123. package/esm/vendors/rangeParser.d.ts +0 -10
  124. package/esm/vendors/rangeParser.js +0 -122
  125. /package/{cjs → lib}/helpers.d.ts +0 -0
  126. /package/{esm/helpers.d.ts → lib/helpers.js} +0 -0
  127. /package/{cjs → lib}/static.d.ts +0 -0
  128. /package/{cjs → lib}/vendors/contentType.d.ts +0 -0
@@ -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,4 +0,0 @@
1
- export declare function parseContentType(header: string): {
2
- mediaType: string;
3
- parameters: Record<string, string>;
4
- };
@@ -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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
@@ -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;
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZW5kb3JzL2V0YWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0dBQWtHO0FBQ2xHLE9BQU8sTUFBTSxFQUFFLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRTlDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBYSxNQUFNLFNBQVMsQ0FBQTtBQUVwRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxJQUFjO0lBQ3BELHFCQUFxQjtJQUNyQixPQUFPLEdBQUcsQ0FBQyxNQUFNO1FBQ2hCLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU07YUFDcEMsVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUNoQixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBQ3JCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlDQUFpQyxDQUFBO0lBQ3ZELDRFQUE0RTtJQUM1RSx5QkFBeUI7SUFDekIsZ0dBQWdHO0FBQ2pHLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxRQUFlLEVBQUUsUUFBZ0IsRUFBRSxJQUFjO0lBQ3BGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFVLENBQUE7SUFDN0MsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNuQyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDM0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0IsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFBO0lBQ25CLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJO1NBQ3pDLE1BQU0sQ0FBQyxRQUFRLENBQUM7U0FDaEIsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFBO0lBQ3JCLDRFQUE0RTtJQUM1RSx5QkFBeUI7SUFDekIsZ0dBQWdHO0FBQ2pHLENBQUM7QUFFRCxNQUFNLDZCQUE2QixHQUFHLGdDQUFnQyxDQUFBO0FBQ3RFLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBVztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVuQyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFBO0FBQzVCLENBQUM7QUFDRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUFvQixFQUFFLElBQVk7SUFDN0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUM5QyxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU07SUFFdEIsbURBQW1EO0lBQ25ELHdDQUF3QztJQUN4QyxxREFBcUQ7SUFDckQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNqRCxJQUFJLFlBQVksSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTTtJQUU1RSxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFNO1FBRWpCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQTtRQUNwQixLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEVBQUUsSUFBSSxLQUFLLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN0RSxTQUFTLEdBQUcsS0FBSyxDQUFBO2dCQUNqQixNQUFLO1lBQ04sQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFJLFNBQVM7WUFBRSxPQUFNO0lBQ3RCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNaLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBb0IsRUFBRSxZQUFvQjtJQUM5RSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDdEQsSUFBSSxDQUFDLGFBQWE7UUFBRSxPQUFNO0lBRTFCLG1EQUFtRDtJQUNuRCx3Q0FBd0M7SUFDeEMscURBQXFEO0lBQ3JELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDakQsSUFBSSxZQUFZLElBQUksNkJBQTZCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUFFLE9BQU07SUFFNUUsSUFBSSxhQUFhLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ2pELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNuRCxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxnQkFBZ0IsSUFBSSxpQkFBaUIsQ0FBQTtJQUN0RyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDWixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUUsR0FBVztJQUNuQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDWCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUE7SUFDZixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7SUFFYixnQkFBZ0I7SUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hELFFBQVEsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNCLEtBQUssSUFBSSxFQUFFLE9BQU87Z0JBQ2pCLElBQUksS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUNuQixLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBSztZQUNOLEtBQUssSUFBSSxFQUFFLE9BQU87Z0JBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtnQkFDcEMsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNuQixNQUFLO1lBQ047Z0JBQ0MsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ1gsTUFBSztRQUNQLENBQUM7SUFDRixDQUFDO0lBQ0QsY0FBYztJQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNwQyxPQUFPLElBQUksQ0FBQTtBQUNaLENBQUMifQ==
@@ -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[];