dx-server 0.8.4 → 0.10.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.
Files changed (87) hide show
  1. package/README.md +557 -245
  2. package/cjs/body.d.ts +7 -7
  3. package/cjs/body.js +8 -8
  4. package/cjs/bodyHelpers.js +6 -6
  5. package/cjs/connect.d.ts +2 -2
  6. package/cjs/connect.js +5 -5
  7. package/cjs/dx.d.ts +1 -1
  8. package/cjs/dx.js +24 -15
  9. package/cjs/dxHelpers.d.ts +2 -2
  10. package/cjs/dxHelpers.js +12 -7
  11. package/cjs/express.d.ts +1 -1
  12. package/cjs/express.js +16 -14
  13. package/cjs/helpers.d.ts +2 -2
  14. package/cjs/helpers.js +10 -10
  15. package/cjs/index.d.ts +6 -6
  16. package/cjs/index.js +28 -28
  17. package/cjs/polyfillWithResolvers.js +2 -3
  18. package/cjs/router.js +7 -7
  19. package/cjs/static.d.ts +3 -3
  20. package/cjs/static.js +12 -12
  21. package/cjs/staticHelpers.d.ts +16 -4
  22. package/cjs/staticHelpers.js +191 -9
  23. package/cjs/stream.d.ts +1 -1
  24. package/cjs/stream.js +3 -3
  25. package/{esm → cjs/vendors}/contentType.js +7 -3
  26. package/{esm → cjs/vendors}/etag.d.ts +3 -1
  27. package/cjs/{etag.js → vendors/etag.js} +1 -1
  28. package/cjs/vendors/fresh.d.ts +23 -0
  29. package/cjs/vendors/fresh.js +102 -0
  30. package/cjs/vendors/mime.d.ts +1 -0
  31. package/cjs/vendors/mime.js +42 -0
  32. package/cjs/vendors/mimeDb.d.ts +9413 -0
  33. package/cjs/vendors/mimeDb.js +9417 -0
  34. package/cjs/vendors/mimeScore.d.ts +5 -0
  35. package/cjs/vendors/mimeScore.js +50 -0
  36. package/cjs/vendors/onFinished.d.ts +14 -0
  37. package/cjs/vendors/onFinished.js +245 -0
  38. package/cjs/vendors/rangeParser.d.ts +10 -0
  39. package/cjs/vendors/rangeParser.js +125 -0
  40. package/esm/body.d.ts +7 -7
  41. package/esm/body.js +2 -2
  42. package/esm/bodyHelpers.js +3 -3
  43. package/esm/connect.d.ts +2 -2
  44. package/esm/connect.js +3 -3
  45. package/esm/dx.d.ts +1 -1
  46. package/esm/dx.js +23 -14
  47. package/esm/dxHelpers.d.ts +2 -2
  48. package/esm/dxHelpers.js +10 -5
  49. package/esm/express.d.ts +1 -1
  50. package/esm/express.js +16 -14
  51. package/esm/helpers.d.ts +2 -2
  52. package/esm/helpers.js +2 -2
  53. package/esm/index.d.ts +6 -6
  54. package/esm/index.js +6 -6
  55. package/esm/polyfillWithResolvers.js +2 -3
  56. package/esm/router.js +6 -6
  57. package/esm/static.d.ts +3 -3
  58. package/esm/static.js +10 -10
  59. package/esm/staticHelpers.d.ts +16 -4
  60. package/esm/staticHelpers.js +191 -9
  61. package/esm/stream.d.ts +1 -1
  62. package/esm/stream.js +3 -3
  63. package/{cjs → esm/vendors}/contentType.js +3 -7
  64. package/{cjs → esm/vendors}/etag.d.ts +3 -1
  65. package/esm/vendors/etag.js +90 -0
  66. package/esm/vendors/fresh.d.ts +23 -0
  67. package/esm/vendors/fresh.js +96 -0
  68. package/esm/vendors/mime.d.ts +1 -0
  69. package/esm/vendors/mime.js +35 -0
  70. package/esm/vendors/mimeDb.d.ts +9413 -0
  71. package/esm/vendors/mimeDb.js +9415 -0
  72. package/esm/vendors/mimeScore.d.ts +5 -0
  73. package/esm/vendors/mimeScore.js +46 -0
  74. package/esm/vendors/onFinished.d.ts +14 -0
  75. package/esm/vendors/onFinished.js +241 -0
  76. package/esm/vendors/rangeParser.d.ts +10 -0
  77. package/esm/vendors/rangeParser.js +121 -0
  78. package/package.json +4 -6
  79. package/cjs/file.d.ts +0 -3
  80. package/cjs/file.js +0 -12
  81. package/cjs/router.d.ts +0 -43
  82. package/esm/etag.js +0 -90
  83. package/esm/file.d.ts +0 -3
  84. package/esm/file.js +0 -8
  85. package/esm/router.d.ts +0 -43
  86. /package/cjs/{contentType.d.ts → vendors/contentType.d.ts} +0 -0
  87. /package/esm/{contentType.d.ts → vendors/contentType.d.ts} +0 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Get each component of the score for a mime type. The sum of these is the
3
+ * total score. The higher the score, the more "official" the type.
4
+ */
5
+ export declare function mimeScore(mimeType: any, source?: string): any;
@@ -0,0 +1,46 @@
1
+ // 'mime-score' back-ported to CommonJS
2
+ // Score RFC facets (see https://tools.ietf.org/html/rfc6838#section-3)
3
+ const FACET_SCORES = {
4
+ 'prs.': 100,
5
+ 'x-': 200,
6
+ 'x.': 300,
7
+ 'vnd.': 400,
8
+ default: 900
9
+ };
10
+ // Score mime source (Logic originally from `jshttp/mime-types` module)
11
+ const SOURCE_SCORES = {
12
+ nginx: 10,
13
+ apache: 20,
14
+ iana: 40,
15
+ default: 30 // definitions added by `jshttp/mime-db` project?
16
+ };
17
+ const TYPE_SCORES = {
18
+ // prefer application/xml over text/xml
19
+ // prefer application/rtf over text/rtf
20
+ application: 1,
21
+ // prefer font/woff over application/font-woff
22
+ font: 2,
23
+ // prefer video/mp4 over audio/mp4 over application/mp4
24
+ // See https://www.rfc-editor.org/rfc/rfc4337.html#section-2
25
+ audio: 2,
26
+ video: 3,
27
+ default: 0
28
+ };
29
+ /**
30
+ * Get each component of the score for a mime type. The sum of these is the
31
+ * total score. The higher the score, the more "official" the type.
32
+ */
33
+ export function mimeScore(mimeType, source = 'default') {
34
+ if (mimeType === 'application/octet-stream') {
35
+ return 0;
36
+ }
37
+ const [type, subtype] = mimeType.split('/');
38
+ const facet = subtype.replace(/(\.|x-).*/, '$1');
39
+ const facetScore = FACET_SCORES[facet] || FACET_SCORES.default;
40
+ const sourceScore = SOURCE_SCORES[source] || SOURCE_SCORES.default;
41
+ const typeScore = TYPE_SCORES[type] || TYPE_SCORES.default;
42
+ // All else being equal prefer shorter types
43
+ const lengthScore = 1 - mimeType.length / 100;
44
+ return facetScore + sourceScore + typeScore + lengthScore;
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWltZVNjb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZlbmRvcnMvbWltZVNjb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1QztBQUV2Qyx1RUFBdUU7QUFDdkUsTUFBTSxZQUFZLEdBQUc7SUFDcEIsTUFBTSxFQUFFLEdBQUc7SUFDWCxJQUFJLEVBQUUsR0FBRztJQUNULElBQUksRUFBRSxHQUFHO0lBQ1QsTUFBTSxFQUFFLEdBQUc7SUFDWCxPQUFPLEVBQUUsR0FBRztDQUNaLENBQUE7QUFFRCx1RUFBdUU7QUFDdkUsTUFBTSxhQUFhLEdBQUc7SUFDckIsS0FBSyxFQUFFLEVBQUU7SUFDVCxNQUFNLEVBQUUsRUFBRTtJQUNWLElBQUksRUFBRSxFQUFFO0lBQ1IsT0FBTyxFQUFFLEVBQUUsQ0FBQyxpREFBaUQ7Q0FDN0QsQ0FBQTtBQUVELE1BQU0sV0FBVyxHQUFHO0lBQ25CLHVDQUF1QztJQUN2Qyx1Q0FBdUM7SUFDdkMsV0FBVyxFQUFFLENBQUM7SUFFZCw4Q0FBOEM7SUFDOUMsSUFBSSxFQUFFLENBQUM7SUFFUCx1REFBdUQ7SUFDdkQsNERBQTREO0lBQzVELEtBQUssRUFBRSxDQUFDO0lBQ1IsS0FBSyxFQUFFLENBQUM7SUFFUixPQUFPLEVBQUUsQ0FBQztDQUNWLENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUcsU0FBUztJQUNyRCxJQUFJLFFBQVEsS0FBSywwQkFBMEIsRUFBRSxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxDQUFBO0lBQ1QsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUUzQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUVoRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQTtJQUM5RCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQTtJQUNsRSxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQTtJQUUxRCw0Q0FBNEM7SUFDNUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFBO0lBRTdDLE9BQU8sVUFBVSxHQUFHLFdBQVcsR0FBRyxTQUFTLEdBQUcsV0FBVyxDQUFBO0FBQzFELENBQUMifQ==
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Variables.
3
+ * @private
4
+ */
5
+ /**
6
+ * Invoke callback when the response has finished, useful for
7
+ * cleaning up resources afterwards.
8
+ *
9
+ * @param {object} msg
10
+ * @param {function} listener
11
+ * @return {object}
12
+ * @public
13
+ */
14
+ export declare function onFinished(msg: any, listener: any): any;
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Variables.
3
+ * @private
4
+ */
5
+ /* istanbul ignore next */
6
+ import { AsyncResource } from 'node:async_hooks';
7
+ const defer = typeof setImmediate === 'function'
8
+ ? setImmediate
9
+ : function (fn) {
10
+ process.nextTick(fn.bind.apply(fn, arguments));
11
+ };
12
+ /**
13
+ * Invoke callback when the response has finished, useful for
14
+ * cleaning up resources afterwards.
15
+ *
16
+ * @param {object} msg
17
+ * @param {function} listener
18
+ * @return {object}
19
+ * @public
20
+ */
21
+ export function onFinished(msg, listener) {
22
+ if (isFinished(msg) !== false) {
23
+ defer(listener, null, msg);
24
+ return msg;
25
+ }
26
+ // attach the listener to the message
27
+ attachListener(msg, wrap(listener));
28
+ return msg;
29
+ }
30
+ /**
31
+ * Determine if message is already finished.
32
+ *
33
+ * @param {object} msg
34
+ * @return {boolean}
35
+ * @public
36
+ */
37
+ function isFinished(msg) {
38
+ const socket = msg.socket;
39
+ if (typeof msg.finished === 'boolean') {
40
+ // OutgoingMessage
41
+ return Boolean(msg.finished || (socket && !socket.writable));
42
+ }
43
+ if (typeof msg.complete === 'boolean') {
44
+ // IncomingMessage
45
+ return Boolean(msg.upgrade || !socket || !socket.readable || (msg.complete && !msg.readable));
46
+ }
47
+ // don't know
48
+ return undefined;
49
+ }
50
+ /**
51
+ * Attach a finished listener to the message.
52
+ *
53
+ * @param {object} msg
54
+ * @param {function} callback
55
+ * @private
56
+ */
57
+ function attachFinishedListener(msg, callback) {
58
+ let eeMsg;
59
+ let eeSocket;
60
+ let finished = false;
61
+ function onFinish(error) {
62
+ eeMsg.cancel();
63
+ eeSocket.cancel();
64
+ finished = true;
65
+ callback(error);
66
+ }
67
+ // finished on first message event
68
+ eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish);
69
+ function onSocket(socket) {
70
+ // remove listener
71
+ msg.removeListener('socket', onSocket);
72
+ if (finished)
73
+ return;
74
+ if (eeMsg !== eeSocket)
75
+ return;
76
+ // finished on first socket event
77
+ eeSocket = first([[socket, 'error', 'close']], onFinish);
78
+ }
79
+ if (msg.socket) {
80
+ // socket already assigned
81
+ onSocket(msg.socket);
82
+ return;
83
+ }
84
+ // wait for socket to be assigned
85
+ msg.on('socket', onSocket);
86
+ if (msg.socket === undefined) {
87
+ // istanbul ignore next: node.js 0.8 patch
88
+ patchAssignSocket(msg, onSocket);
89
+ }
90
+ }
91
+ /**
92
+ * Attach the listener to the message.
93
+ *
94
+ * @param {object} msg
95
+ * @return {function}
96
+ * @private
97
+ */
98
+ function attachListener(msg, listener) {
99
+ let attached = msg.__onFinished;
100
+ // create a private single listener with queue
101
+ if (!attached || !attached.queue) {
102
+ attached = msg.__onFinished = createListener(msg);
103
+ attachFinishedListener(msg, attached);
104
+ }
105
+ attached.queue.push(listener);
106
+ }
107
+ /**
108
+ * Create listener on message.
109
+ *
110
+ * @param {object} msg
111
+ * @return {function}
112
+ * @private
113
+ */
114
+ function createListener(msg) {
115
+ function listener(err) {
116
+ if (msg.__onFinished === listener)
117
+ msg.__onFinished = null;
118
+ if (!listener.queue)
119
+ return;
120
+ const queue = listener.queue;
121
+ listener.queue = null;
122
+ for (let i = 0; i < queue.length; i++) {
123
+ queue[i](err, msg);
124
+ }
125
+ }
126
+ listener.queue = [];
127
+ return listener;
128
+ }
129
+ /**
130
+ * Patch ServerResponse.prototype.assignSocket for node.js 0.8.
131
+ *
132
+ * @param {ServerResponse} res
133
+ * @param {function} callback
134
+ * @private
135
+ */
136
+ // istanbul ignore next: node.js 0.8 patch
137
+ function patchAssignSocket(res, callback) {
138
+ const assignSocket = res.assignSocket;
139
+ if (typeof assignSocket !== 'function')
140
+ return;
141
+ // res.on('socket', callback) is broken in 0.8
142
+ res.assignSocket = function _assignSocket(socket) {
143
+ assignSocket.call(this, socket);
144
+ callback(socket);
145
+ };
146
+ }
147
+ /**
148
+ * Try to require async_hooks
149
+ * @private
150
+ */
151
+ function tryRequireAsyncHooks() {
152
+ try {
153
+ return require('async_hooks');
154
+ }
155
+ catch (e) {
156
+ return {};
157
+ }
158
+ }
159
+ /**
160
+ * Wrap function with async resource, if possible.
161
+ * AsyncResource.bind static method backported.
162
+ * @private
163
+ */
164
+ function wrap(fn) {
165
+ let res;
166
+ // create anonymous resource
167
+ res = new AsyncResource(fn.name || 'bound-anonymous-fn');
168
+ // incompatible node.js
169
+ if (!res || !res.runInAsyncScope) {
170
+ return fn;
171
+ }
172
+ // return bound function
173
+ return res.runInAsyncScope.bind(res, fn, null);
174
+ }
175
+ /**
176
+ * Get the first event in a set of event emitters and event pairs.
177
+ *
178
+ * @param {array} stuff
179
+ * @param {function} done
180
+ * @public
181
+ */
182
+ function first(stuff, done) {
183
+ if (!Array.isArray(stuff)) {
184
+ throw new TypeError('arg must be an array of [ee, events...] arrays');
185
+ }
186
+ const cleanups = [];
187
+ for (let i = 0; i < stuff.length; i++) {
188
+ const arr = stuff[i];
189
+ if (!Array.isArray(arr) || arr.length < 2) {
190
+ throw new TypeError('each array member must be [ee, events...]');
191
+ }
192
+ const ee = arr[0];
193
+ for (let j = 1; j < arr.length; j++) {
194
+ const event = arr[j];
195
+ const fn = listener(event, callback);
196
+ // listen to the event
197
+ ee.on(event, fn);
198
+ // push this listener to the list of cleanups
199
+ cleanups.push({
200
+ ee: ee,
201
+ event: event,
202
+ fn: fn
203
+ });
204
+ }
205
+ }
206
+ function callback() {
207
+ cleanup();
208
+ done.apply(null, arguments);
209
+ }
210
+ function cleanup() {
211
+ let x;
212
+ for (let i = 0; i < cleanups.length; i++) {
213
+ x = cleanups[i];
214
+ x.ee.removeListener(x.event, x.fn);
215
+ }
216
+ }
217
+ function thunk(fn) {
218
+ done = fn;
219
+ }
220
+ thunk.cancel = cleanup;
221
+ return thunk;
222
+ }
223
+ /**
224
+ * Create the event listener.
225
+ * @private
226
+ */
227
+ function listener(event, done) {
228
+ return function onevent(arg1) {
229
+ const args = new Array(arguments.length);
230
+ const ee = this;
231
+ const err = event === 'error'
232
+ ? arg1
233
+ : null;
234
+ // copy args to prevent arguments escaping scope
235
+ for (let i = 0; i < args.length; i++) {
236
+ args[i] = arguments[i];
237
+ }
238
+ done(err, ee, event, args);
239
+ };
240
+ }
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25GaW5pc2hlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZW5kb3JzL29uRmluaXNoZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsMEJBQTBCO0FBQzFCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUU5QyxNQUFNLEtBQUssR0FBRyxPQUFPLFlBQVksS0FBSyxVQUFVO0lBQy9DLENBQUMsQ0FBQyxZQUFZO0lBQ2QsQ0FBQyxDQUFDLFVBQVUsRUFBRTtRQUNiLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDL0MsQ0FBQyxDQUFBO0FBRUY7Ozs7Ozs7O0dBUUc7QUFFSCxNQUFNLFVBQVUsVUFBVSxDQUFFLEdBQUcsRUFBRSxRQUFRO0lBQ3hDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzFCLE9BQU8sR0FBRyxDQUFBO0lBQ1gsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBRW5DLE9BQU8sR0FBRyxDQUFBO0FBQ1gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUVILFNBQVMsVUFBVSxDQUFFLEdBQUc7SUFDdkIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtJQUV6QixJQUFJLE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxrQkFBa0I7UUFDbEIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFB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
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Parse "Range" header `str` relative to the given file `size`.
3
+ *
4
+ * @param {Number} size
5
+ * @param {String} str
6
+ * @param {Object} [options]
7
+ * @return {Array}
8
+ * @public
9
+ */
10
+ export declare function parseRange(size: any, str: any, options: any): any;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Parse "Range" header `str` relative to the given file `size`.
3
+ *
4
+ * @param {Number} size
5
+ * @param {String} str
6
+ * @param {Object} [options]
7
+ * @return {Array}
8
+ * @public
9
+ */
10
+ export function parseRange(size, str, options) {
11
+ if (typeof str !== 'string') {
12
+ throw new TypeError('argument str must be a string');
13
+ }
14
+ const index = str.indexOf('=');
15
+ if (index === -1) {
16
+ return -2;
17
+ }
18
+ // split the range string
19
+ const arr = str.slice(index + 1).split(',');
20
+ const ranges = [];
21
+ // add ranges type
22
+ ranges.type = str.slice(0, index);
23
+ // parse all ranges
24
+ for (let i = 0; i < arr.length; i++) {
25
+ const range = arr[i].split('-');
26
+ let start = parseInt(range[0], 10);
27
+ let end = parseInt(range[1], 10);
28
+ // -nnn
29
+ if (isNaN(start)) {
30
+ start = size - end;
31
+ end = size - 1;
32
+ // nnn-
33
+ }
34
+ else if (isNaN(end)) {
35
+ end = size - 1;
36
+ }
37
+ // limit last-byte-pos to current length
38
+ if (end > size - 1) {
39
+ end = size - 1;
40
+ }
41
+ // invalid or unsatisifiable
42
+ if (isNaN(start) || isNaN(end) || start > end || start < 0) {
43
+ continue;
44
+ }
45
+ // add range
46
+ ranges.push({
47
+ start: start,
48
+ end: end
49
+ });
50
+ }
51
+ if (ranges.length < 1) {
52
+ // unsatisifiable
53
+ return -1;
54
+ }
55
+ return options && options.combine
56
+ ? combineRanges(ranges)
57
+ : ranges;
58
+ }
59
+ /**
60
+ * Combine overlapping & adjacent ranges.
61
+ * @private
62
+ */
63
+ function combineRanges(ranges) {
64
+ const ordered = ranges.map(mapWithIndex).sort(sortByRangeStart);
65
+ for (let j = 0, i = 1; i < ordered.length; i++) {
66
+ const range = ordered[i];
67
+ const current = ordered[j];
68
+ if (range.start > current.end + 1) {
69
+ // next range
70
+ ordered[++j] = range;
71
+ }
72
+ else if (range.end > current.end) {
73
+ // extend range
74
+ current.end = range.end;
75
+ current.index = Math.min(current.index, range.index);
76
+ }
77
+ }
78
+ // trim ordered array
79
+ ordered.length = j + 1;
80
+ // generate combined range
81
+ const combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex);
82
+ // copy ranges type
83
+ combined.type = ranges.type;
84
+ return combined;
85
+ }
86
+ /**
87
+ * Map function to add index value to ranges.
88
+ * @private
89
+ */
90
+ function mapWithIndex(range, index) {
91
+ return {
92
+ start: range.start,
93
+ end: range.end,
94
+ index: index
95
+ };
96
+ }
97
+ /**
98
+ * Map function to remove index value from ranges.
99
+ * @private
100
+ */
101
+ function mapWithoutIndex(range) {
102
+ return {
103
+ start: range.start,
104
+ end: range.end
105
+ };
106
+ }
107
+ /**
108
+ * Sort function to sort ranges by index.
109
+ * @private
110
+ */
111
+ function sortByRangeIndex(a, b) {
112
+ return a.index - b.index;
113
+ }
114
+ /**
115
+ * Sort function to sort ranges by start position.
116
+ * @private
117
+ */
118
+ function sortByRangeStart(a, b) {
119
+ return a.start - b.start;
120
+ }
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2VQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVuZG9ycy9yYW5nZVBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE1BQU0sVUFBVSxVQUFVLENBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPO0lBQzdDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRTlCLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUNWLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUVqQixrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUVqQyxtQkFBbUI7SUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQy9CLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDbEMsSUFBSSxHQUFHLEdBQUcsUUFB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TixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDbEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsS0FBSyxFQUFFLEtBQUs7S0FDWixDQUFBO0FBQ0YsQ0FBQztBQUVEOzs7R0FHRztBQUVILFNBQVMsZUFBZSxDQUFFLEtBQUs7SUFDOUIsT0FBTztRQUNOLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztRQUNsQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7S0FDZCxDQUFBO0FBQ0YsQ0FBQztBQUVEOzs7R0FHRztBQUVILFNBQVMsZ0JBQWdCLENBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUIsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDekIsQ0FBQztBQUVEOzs7R0FHRztBQUVILFNBQVMsZ0JBQWdCLENBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUIsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDekIsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dx-server",
3
- "version": "0.8.4",
3
+ "version": "0.10.0",
4
4
  "main": "./cjs/index.js",
5
5
  "homepage": "https://github.com/tranvansang/dx-server",
6
6
  "repository": "https://github.com/tranvansang/dx-server",
@@ -24,17 +24,15 @@
24
24
  }
25
25
  },
26
26
  "type": "module",
27
+ "engines": {
28
+ "node": ">=16.0.0"
29
+ },
27
30
  "scripts": {
28
31
  "prepublishOnly": "./compile.sh"
29
32
  },
30
33
  "license": "MIT",
31
34
  "devDependencies": {
32
35
  "@types/node": "^20.12.8",
33
- "@types/send": "^0.17.4",
34
36
  "typescript": "^5.4.5"
35
- },
36
- "dependencies": {
37
- "send": "^0.18.0",
38
- "urlpattern-polyfill": "^10.0.0"
39
37
  }
40
38
  }
package/cjs/file.d.ts DELETED
@@ -1,3 +0,0 @@
1
- export declare const serveFile: ({ prefix }: {
2
- prefix?: string;
3
- }) => (next: any) => any;
package/cjs/file.js DELETED
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.serveFile = void 0;
4
- const dx_js_1 = require("./dx.js");
5
- const serveFile = ({ prefix = '' }) => next => {
6
- const req = (0, dx_js_1.getReq)();
7
- const res = (0, dx_js_1.getRes)();
8
- if (req.method !== 'GET' && req.method !== 'HEAD')
9
- return next();
10
- };
11
- exports.serveFile = serveFile;
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFzQztBQUUvQixNQUFNLFNBQVMsR0FBRyxDQUN4QixFQUFDLE1BQU0sR0FBRyxFQUFFLEVBRVgsRUFDQSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU0sR0FBRSxDQUFBO0lBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTSxHQUFFLENBQUE7SUFDcEIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0FBQ2pFLENBQUMsQ0FBQTtBQVJZLFFBQUEsU0FBUyxhQVFyQiJ9
package/cjs/router.d.ts DELETED
@@ -1,43 +0,0 @@
1
- import { Chainable } from './dx.js';
2
- import 'urlpattern-polyfill';
3
- interface URLPatternOptions {
4
- }
5
- interface RouteContext {
6
- matched: URLPatternResult;
7
- next(): any;
8
- }
9
- interface Route {
10
- (context: RouteContext): any;
11
- }
12
- interface Routes {
13
- [k: string]: Route;
14
- }
15
- interface RouterOptions extends URLPatternOptions {
16
- prefix?: string;
17
- }
18
- type Router = {
19
- patch(routes: Routes, options?: RouterOptions): Chainable;
20
- patch(pattern: string, route: Route, options?: RouterOptions): Chainable;
21
- trace(routes: Routes, options?: RouterOptions): Chainable;
22
- trace(pattern: string, route: Route, options?: RouterOptions): Chainable;
23
- options(routes: Routes, options?: RouterOptions): Chainable;
24
- options(pattern: string, route: Route, options?: RouterOptions): Chainable;
25
- connect(routes: Routes, options?: RouterOptions): Chainable;
26
- connect(pattern: string, route: Route, options?: RouterOptions): Chainable;
27
- delete(routes: Routes, options?: RouterOptions): Chainable;
28
- delete(pattern: string, route: Route, options?: RouterOptions): Chainable;
29
- put(routes: Routes, options?: RouterOptions): Chainable;
30
- put(pattern: string, route: Route, options?: RouterOptions): Chainable;
31
- post(routes: Routes, options?: RouterOptions): Chainable;
32
- post(pattern: string, route: Route, options?: RouterOptions): Chainable;
33
- head(routes: Routes, options?: RouterOptions): Chainable;
34
- head(pattern: string, route: Route, options?: RouterOptions): Chainable;
35
- get(routes: Routes, options?: RouterOptions): Chainable;
36
- get(pattern: string, route: Route, options?: RouterOptions): Chainable;
37
- all(routes: Routes, options?: RouterOptions): Chainable;
38
- all(pattern: string, route: Route, options?: RouterOptions): Chainable;
39
- method(method: string, routes: Routes, options?: RouterOptions): Chainable;
40
- method(method: string, pattern: string, route: Route, options?: RouterOptions): Chainable;
41
- };
42
- export declare const router: Router;
43
- export {};
package/esm/etag.js DELETED
@@ -1,90 +0,0 @@
1
- // etag: https://github.com/jshttp/etag/blob/b9f0642256e63654287299d205bc6ced71b1a228/index.js#L39
2
- import crypto from 'node:crypto';
3
- export function entityTag(buf, weak) {
4
- // pre-computed empty
5
- return buf.length
6
- ? `${buf.length.toString(16)}-${crypto
7
- .createHash('sha1')
8
- .update(buf)
9
- .digest('base64')
10
- .substring(0, 27)}"`
11
- : `${weak ? 'W/' : ''}"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"`;
12
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#directives
13
- // weak W/ vs strong eTag
14
- // same weak eTag: 2 resources might be semantically equivalent, but not byte-for-byte identical
15
- }
16
- const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
17
- export function statTag(stat) {
18
- const mtime = stat.mtime.getTime().toString(16);
19
- const size = stat.size.toString(16);
20
- return `"${size}-${mtime}"`;
21
- }
22
- // https://github.com/jshttp/fresh/blob/05254186fd7428915224db46144fc94293a7df7d/index.js#L33
23
- export function isFreshETag(req, etag) {
24
- const noneMatch = req.headers['if-none-match'];
25
- if (!noneMatch)
26
- return;
27
- // Always return stale when Cache-Control: no-cache
28
- // to support end-to-end reload requests
29
- // https://tools.ietf.org/html/rfc2616#section-14.9.4
30
- const cacheControl = req.headers['cache-control'];
31
- if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl))
32
- return;
33
- if (noneMatch && noneMatch !== '*') {
34
- if (!etag)
35
- return;
36
- let etagStale = true;
37
- for (const match of parseTokenList(noneMatch)) {
38
- if (match === etag || match === `W/${etag}` || `W/${match}` === etag) {
39
- etagStale = false;
40
- break;
41
- }
42
- }
43
- if (etagStale)
44
- return;
45
- }
46
- return true;
47
- }
48
- export function isFreshModifiedSince(req, lastModified) {
49
- const modifiedSince = req.headers['if-modified-since'];
50
- if (!modifiedSince)
51
- return;
52
- // Always return stale when Cache-Control: no-cache
53
- // to support end-to-end reload requests
54
- // https://tools.ietf.org/html/rfc2616#section-14.9.4
55
- const cacheControl = req.headers['cache-control'];
56
- if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl))
57
- return;
58
- if (modifiedSince && lastModified) {
59
- const lastModifiedDate = Date.parse(lastModified);
60
- const modifiedSinceDate = Date.parse(modifiedSince);
61
- return !isNaN(lastModifiedDate) && !isNaN(modifiedSinceDate) && lastModifiedDate <= modifiedSinceDate;
62
- }
63
- return true;
64
- }
65
- function parseTokenList(str) {
66
- let end = 0;
67
- const list = [];
68
- let start = 0;
69
- // gather tokens
70
- for (let i = 0, len = str.length; i < len; i++) {
71
- switch (str.charCodeAt(i)) {
72
- case 0x20: /* */
73
- if (start === end) {
74
- start = end = i + 1;
75
- }
76
- break;
77
- case 0x2c: /* , */
78
- list.push(str.substring(start, end));
79
- start = end = i + 1;
80
- break;
81
- default:
82
- end = i + 1;
83
- break;
84
- }
85
- }
86
- // final token
87
- list.push(str.substring(start, end));
88
- return list;
89
- }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ldGFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtHQUFrRztBQUNsRyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFHaEMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsSUFBYztJQUNwRCxxQkFBcUI7SUFDckIsT0FBTyxHQUFHLENBQUMsTUFBTTtRQUNoQixDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNO2FBQ3BDLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDaEIsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRztRQUNyQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQTtJQUN2RCw0RUFBNEU7SUFDNUUseUJBQXlCO0lBQ3pCLGdHQUFnRztBQUNqRyxDQUFDO0FBRUQsTUFBTSw2QkFBNkIsR0FBRyxnQ0FBZ0MsQ0FBQTtBQUN0RSxNQUFNLFVBQVUsT0FBTyxDQUFDLElBQUk7SUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFbkMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQTtBQUM1QixDQUFDO0FBQ0QsNkZBQTZGO0FBQzdGLE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBb0IsRUFBRSxJQUFZO0lBQzdELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFB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
package/esm/file.d.ts DELETED
@@ -1,3 +0,0 @@
1
- export declare const serveFile: ({ prefix }: {
2
- prefix?: string;
3
- }) => (next: any) => any;
package/esm/file.js DELETED
@@ -1,8 +0,0 @@
1
- import { getReq, getRes } from './dx.js';
2
- export const serveFile = ({ prefix = '' }) => next => {
3
- const req = getReq();
4
- const res = getRes();
5
- if (req.method !== 'GET' && req.method !== 'HEAD')
6
- return next();
7
- };
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUN4QixFQUFDLE1BQU0sR0FBRyxFQUFFLEVBRVgsRUFDQSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDWCxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtJQUNwQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQTtJQUNwQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTTtRQUFFLE9BQU8sSUFBSSxFQUFFLENBQUE7QUFDakUsQ0FBQyxDQUFBIn0=