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
@@ -2,4 +2,4 @@
2
2
  * Get each component of the score for a mime type. The sum of these is the
3
3
  * total score. The higher the score, the more "official" the type.
4
4
  */
5
- export declare function mimeScore(mimeType: any, source?: string): any;
5
+ export declare function mimeScore(mimeType: string, source?: string): number;
@@ -0,0 +1,44 @@
1
+ // 'mime-score' back-ported to CommonJS
2
+ // Score RFC facets (see https://tools.ietf.org/html/rfc6838#section-3)
3
+ const facetScores = {
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 sourceScores = {
12
+ nginx: 10,
13
+ apache: 20,
14
+ iana: 40,
15
+ default: 30, // definitions added by `jshttp/mime-db` project?
16
+ };
17
+ const typeScores = {
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
+ const [type, subtype] = mimeType.split('/');
37
+ const facet = subtype.replace(/(\.|x-).*/, '$1');
38
+ const facetScore = facetScores[facet] || facetScores.default;
39
+ const sourceScore = sourceScores[source] || sourceScores.default;
40
+ const typeScore = typeScores[type] || typeScores.default;
41
+ // All else being equal prefer shorter types
42
+ const lengthScore = 1 - mimeType.length / 100;
43
+ return facetScore + sourceScore + typeScore + lengthScore;
44
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mimeScore.js","sourceRoot":"","sources":["../../src/vendors/mimeScore.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,uEAAuE;AACvE,MAAM,WAAW,GAAG;IACnB,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;CACZ,CAAA;AAED,uEAAuE;AACvE,MAAM,YAAY,GAAG;IACpB,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAE,EAAE,iDAAiD;CAC9D,CAAA;AAED,MAAM,UAAU,GAAG;IAClB,uCAAuC;IACvC,uCAAuC;IACvC,WAAW,EAAE,CAAC;IAEd,8CAA8C;IAC9C,IAAI,EAAE,CAAC;IAEP,uDAAuD;IACvD,4DAA4D;IAC5D,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IAER,OAAO,EAAE,CAAC;CACV,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,MAAM,GAAG,SAAS;IAC7D,IAAI,QAAQ,KAAK,0BAA0B;QAAE,OAAO,CAAC,CAAA;IAErD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IAEhD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAiC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAA;IACxF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAmC,CAAC,IAAI,YAAY,CAAC,OAAO,CAAA;IAC7F,MAAM,SAAS,GAAG,UAAU,CAAC,IAA+B,CAAC,IAAI,UAAU,CAAC,OAAO,CAAA;IAEnF,4CAA4C;IAC5C,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAA;IAE7C,OAAO,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,CAAA;AAC1D,CAAC","sourcesContent":["// 'mime-score' back-ported to CommonJS\n\n// Score RFC facets (see https://tools.ietf.org/html/rfc6838#section-3)\nconst facetScores = {\n\t'prs.': 100,\n\t'x-': 200,\n\t'x.': 300,\n\t'vnd.': 400,\n\tdefault: 900,\n}\n\n// Score mime source (Logic originally from `jshttp/mime-types` module)\nconst sourceScores = {\n\tnginx: 10,\n\tapache: 20,\n\tiana: 40,\n\tdefault: 30, // definitions added by `jshttp/mime-db` project?\n}\n\nconst typeScores = {\n\t// prefer application/xml over text/xml\n\t// prefer application/rtf over text/rtf\n\tapplication: 1,\n\n\t// prefer font/woff over application/font-woff\n\tfont: 2,\n\n\t// prefer video/mp4 over audio/mp4 over application/mp4\n\t// See https://www.rfc-editor.org/rfc/rfc4337.html#section-2\n\taudio: 2,\n\tvideo: 3,\n\n\tdefault: 0,\n}\n\n/**\n * Get each component of the score for a mime type. The sum of these is the\n * total score. The higher the score, the more \"official\" the type.\n */\nexport function mimeScore(mimeType: string, source = 'default') {\n\tif (mimeType === 'application/octet-stream') return 0\n\n\tconst [type, subtype] = mimeType.split('/')\n\n\tconst facet = subtype.replace(/(\\.|x-).*/, '$1')\n\n\tconst facetScore = facetScores[facet as keyof typeof facetScores] || facetScores.default\n\tconst sourceScore = sourceScores[source as keyof typeof sourceScores] || sourceScores.default\n\tconst typeScore = typeScores[type as keyof typeof typeScores] || typeScores.default\n\n\t// All else being equal prefer shorter types\n\tconst lengthScore = 1 - mimeType.length / 100\n\n\treturn facetScore + sourceScore + typeScore + lengthScore\n}\n"]}
@@ -11,4 +11,4 @@
11
11
  * @return {object}
12
12
  * @public
13
13
  */
14
- export declare function onFinished(msg: any, listener: any): any;
14
+ export declare function onFinished<T>(msg: T, listener: (err: any, msg?: any) => void): T;
@@ -0,0 +1,231 @@
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
+ function attachListener(msg, listener) {
92
+ let attached = msg.__onFinished;
93
+ // create a private single listener with queue
94
+ if (!attached || !attached.queue) {
95
+ attached = msg.__onFinished = createListener(msg);
96
+ attachFinishedListener(msg, attached);
97
+ }
98
+ attached.queue.push(listener);
99
+ }
100
+ /**
101
+ * Create listener on message.
102
+ *
103
+ * @param {object} msg
104
+ * @return {function}
105
+ * @private
106
+ */
107
+ function createListener(msg) {
108
+ const listener = ((err) => {
109
+ if (msg.__onFinished === listener)
110
+ msg.__onFinished = null;
111
+ if (!listener.queue)
112
+ return;
113
+ const queue = listener.queue;
114
+ listener.queue = null;
115
+ for (let i = 0; i < queue.length; i++) {
116
+ queue[i](err, msg);
117
+ }
118
+ });
119
+ listener.queue = [];
120
+ return listener;
121
+ }
122
+ /**
123
+ * Patch ServerResponse.prototype.assignSocket for node.js 0.8.
124
+ *
125
+ * @param {ServerResponse} res
126
+ * @param {function} callback
127
+ * @private
128
+ */
129
+ // istanbul ignore next: node.js 0.8 patch
130
+ function patchAssignSocket(res, callback) {
131
+ const assignSocket = res.assignSocket;
132
+ if (typeof assignSocket !== 'function')
133
+ return;
134
+ // res.on('socket', callback) is broken in 0.8
135
+ res.assignSocket = function _assignSocket(socket) {
136
+ assignSocket.call(this, socket);
137
+ callback(socket);
138
+ };
139
+ }
140
+ /**
141
+ * Try to require async_hooks
142
+ * @private
143
+ */
144
+ function tryRequireAsyncHooks() {
145
+ try {
146
+ return require('async_hooks');
147
+ }
148
+ catch (e) {
149
+ return {};
150
+ }
151
+ }
152
+ /**
153
+ * Wrap function with async resource, if possible.
154
+ * AsyncResource.bind static method backported.
155
+ * @private
156
+ */
157
+ function wrap(fn) {
158
+ // create anonymous resource
159
+ const res = new AsyncResource(fn.name || 'bound-anonymous-fn');
160
+ // incompatible node.js
161
+ if (!res || !res.runInAsyncScope) {
162
+ return fn;
163
+ }
164
+ // return bound function
165
+ return res.runInAsyncScope.bind(res, fn, null);
166
+ }
167
+ /**
168
+ * Get the first event in a set of event emitters and event pairs.
169
+ *
170
+ * @param {array} stuff
171
+ * @param {function} done
172
+ * @public
173
+ */
174
+ function first(stuff, done) {
175
+ if (!Array.isArray(stuff)) {
176
+ throw new TypeError('arg must be an array of [ee, events...] arrays');
177
+ }
178
+ const cleanups = [];
179
+ for (let i = 0; i < stuff.length; i++) {
180
+ const arr = stuff[i];
181
+ if (!Array.isArray(arr) || arr.length < 2) {
182
+ throw new TypeError('each array member must be [ee, events...]');
183
+ }
184
+ const ee = arr[0];
185
+ for (let j = 1; j < arr.length; j++) {
186
+ const event = arr[j];
187
+ const fn = listener(event, callback);
188
+ // listen to the event
189
+ ee.on(event, fn);
190
+ // push this listener to the list of cleanups
191
+ cleanups.push({
192
+ ee: ee,
193
+ event: event,
194
+ fn: fn
195
+ });
196
+ }
197
+ }
198
+ function callback(...args) {
199
+ cleanup();
200
+ done.apply(null, args);
201
+ }
202
+ function cleanup() {
203
+ for (let i = 0; i < cleanups.length; i++) {
204
+ const x = cleanups[i];
205
+ x.ee.removeListener(x.event, x.fn);
206
+ }
207
+ }
208
+ const thunk = function thunk(fn) {
209
+ done = fn;
210
+ };
211
+ thunk.cancel = cleanup;
212
+ return thunk;
213
+ }
214
+ /**
215
+ * Create the event listener.
216
+ * @private
217
+ */
218
+ function listener(event, done) {
219
+ return function onevent(arg1) {
220
+ const args = new Array(arguments.length);
221
+ const ee = this;
222
+ const err = event === 'error'
223
+ ? arg1
224
+ : null;
225
+ // copy args to prevent arguments escaping scope
226
+ for (let i = 0; i < args.length; i++) {
227
+ args[i] = arguments[i];
228
+ }
229
+ done(err, ee, event, args);
230
+ };
231
+ }
@@ -0,0 +1,12 @@
1
+ interface Range {
2
+ start: number;
3
+ end: number;
4
+ }
5
+ export type Ranges = Range[] & {
6
+ type: string;
7
+ };
8
+ export declare function parseRange(size: number, str: string | undefined, { combine, maxRanges }?: {
9
+ combine?: boolean;
10
+ maxRanges?: number;
11
+ }): Ranges | -1 | -2;
12
+ export {};
@@ -0,0 +1,108 @@
1
+ export function parseRange(size, str, { combine, maxRanges = 100 } = {}) {
2
+ if (typeof str !== 'string')
3
+ throw new TypeError('argument str must be a string');
4
+ const index = str.indexOf('=');
5
+ if (index === -1)
6
+ return -2;
7
+ // split the range string
8
+ const arr = str.slice(index + 1).split(',');
9
+ // bound the number of ranges: each costs a parseInt and combineRanges sorts O(n log n),
10
+ // so an attacker could amplify CPU with a header full of tiny ranges
11
+ if (arr.length > maxRanges)
12
+ return -1;
13
+ const ranges = [];
14
+ // add ranges type
15
+ ranges.type = str.slice(0, index);
16
+ // parse all ranges
17
+ for (let i = 0; i < arr.length; i++) {
18
+ const range = arr[i].split('-');
19
+ let start = parseInt(range[0], 10);
20
+ let end = parseInt(range[1], 10);
21
+ // -nnn
22
+ if (isNaN(start)) {
23
+ start = size - end;
24
+ end = size - 1;
25
+ // nnn-
26
+ }
27
+ else if (isNaN(end))
28
+ end = size - 1;
29
+ // limit last-byte-pos to current length
30
+ if (end > size - 1)
31
+ end = size - 1;
32
+ // invalid or unsatisifiable
33
+ if (isNaN(start) || isNaN(end) || start > end || start < 0)
34
+ continue;
35
+ // add range
36
+ ranges.push({
37
+ start: start,
38
+ end: end,
39
+ });
40
+ }
41
+ // unsatisifiable
42
+ if (ranges.length < 1)
43
+ return -1;
44
+ return combine ? combineRanges(ranges) : ranges;
45
+ }
46
+ /**
47
+ * Combine overlapping & adjacent ranges.
48
+ * @private
49
+ */
50
+ function combineRanges(ranges) {
51
+ const ordered = ranges.map(mapWithIndex).sort(sortByRangeStart);
52
+ let j = 0;
53
+ for (let i = 1; i < ordered.length; i++) {
54
+ const range = ordered[i];
55
+ const current = ordered[j];
56
+ if (range.start > current.end + 1) {
57
+ // next range
58
+ ordered[++j] = range;
59
+ }
60
+ else if (range.end > current.end) {
61
+ // extend range
62
+ current.end = range.end;
63
+ current.index = Math.min(current.index, range.index);
64
+ }
65
+ }
66
+ // trim ordered array
67
+ ordered.length = j + 1;
68
+ // generate combined range
69
+ const combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex);
70
+ // copy ranges type
71
+ combined.type = ranges.type;
72
+ return combined;
73
+ }
74
+ /**
75
+ * Map function to add index value to ranges.
76
+ * @private
77
+ */
78
+ function mapWithIndex(range, index) {
79
+ return {
80
+ start: range.start,
81
+ end: range.end,
82
+ index: index,
83
+ };
84
+ }
85
+ /**
86
+ * Map function to remove index value from ranges.
87
+ * @private
88
+ */
89
+ function mapWithoutIndex(range) {
90
+ return {
91
+ start: range.start,
92
+ end: range.end,
93
+ };
94
+ }
95
+ /**
96
+ * Sort function to sort ranges by index.
97
+ * @private
98
+ */
99
+ function sortByRangeIndex(a, b) {
100
+ return a.index - b.index;
101
+ }
102
+ /**
103
+ * Sort function to sort ranges by start position.
104
+ * @private
105
+ */
106
+ function sortByRangeStart(a, b) {
107
+ return a.start - b.start;
108
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeParser.js","sourceRoot":"","sources":["../../src/vendors/rangeParser.ts"],"names":[],"mappings":"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","sourcesContent":["interface Range {\n\tstart: number\n\tend: number\n}\ninterface IndexedRange extends Range {\n\tindex: number\n}\nexport type Ranges = Range[] & {type: string}\n\nexport function parseRange(\n\tsize: number,\n\tstr: string | undefined,\n\t{combine, maxRanges = 100}: {combine?: boolean; maxRanges?: number} = {},\n): Ranges | -1 | -2 {\n\tif (typeof str !== 'string') throw new TypeError('argument str must be a string')\n\n\tconst index = str.indexOf('=')\n\n\tif (index === -1) return -2\n\n\t// split the range string\n\tconst arr = str.slice(index + 1).split(',')\n\n\t// bound the number of ranges: each costs a parseInt and combineRanges sorts O(n log n),\n\t// so an attacker could amplify CPU with a header full of tiny ranges\n\tif (arr.length > maxRanges) return -1\n\n\tconst ranges = [] as unknown as Ranges\n\n\t// add ranges type\n\tranges.type = str.slice(0, index)\n\n\t// parse all ranges\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst range = arr[i].split('-')\n\t\tlet start = parseInt(range[0], 10)\n\t\tlet end = parseInt(range[1], 10)\n\n\t\t// -nnn\n\t\tif (isNaN(start)) {\n\t\t\tstart = size - end\n\t\t\tend = size - 1\n\t\t\t// nnn-\n\t\t} else if (isNaN(end)) end = size - 1\n\n\t\t// limit last-byte-pos to current length\n\t\tif (end > size - 1) end = size - 1\n\n\t\t// invalid or unsatisifiable\n\t\tif (isNaN(start) || isNaN(end) || start > end || start < 0) continue\n\n\t\t// add range\n\t\tranges.push({\n\t\t\tstart: start,\n\t\t\tend: end,\n\t\t})\n\t}\n\n\t// unsatisifiable\n\tif (ranges.length < 1) return -1\n\n\treturn combine ? combineRanges(ranges) : ranges\n}\n\n/**\n * Combine overlapping & adjacent ranges.\n * @private\n */\n\nfunction combineRanges(ranges: Ranges) {\n\tconst ordered = ranges.map(mapWithIndex).sort(sortByRangeStart)\n\n\tlet j = 0\n\tfor (let i = 1; i < ordered.length; i++) {\n\t\tconst range = ordered[i]\n\t\tconst current = ordered[j]\n\n\t\tif (range.start > current.end + 1) {\n\t\t\t// next range\n\t\t\tordered[++j] = range\n\t\t} else if (range.end > current.end) {\n\t\t\t// extend range\n\t\t\tcurrent.end = range.end\n\t\t\tcurrent.index = Math.min(current.index, range.index)\n\t\t}\n\t}\n\n\t// trim ordered array\n\tordered.length = j + 1\n\n\t// generate combined range\n\tconst combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex) as unknown as Ranges\n\n\t// copy ranges type\n\tcombined.type = ranges.type\n\n\treturn combined\n}\n\n/**\n * Map function to add index value to ranges.\n * @private\n */\n\nfunction mapWithIndex(range: Range, index: number) {\n\treturn {\n\t\tstart: range.start,\n\t\tend: range.end,\n\t\tindex: index,\n\t}\n}\n\n/**\n * Map function to remove index value from ranges.\n * @private\n */\n\nfunction mapWithoutIndex(range: IndexedRange) {\n\treturn {\n\t\tstart: range.start,\n\t\tend: range.end,\n\t}\n}\n\n/**\n * Sort function to sort ranges by index.\n * @private\n */\n\nfunction sortByRangeIndex(a: IndexedRange, b: IndexedRange) {\n\treturn a.index - b.index\n}\n\n/**\n * Sort function to sort ranges by start position.\n * @private\n */\n\nfunction sortByRangeStart(a: IndexedRange, b: IndexedRange) {\n\treturn a.start - b.start\n}\n"]}
package/package.json CHANGED
@@ -1,38 +1,34 @@
1
1
  {
2
- "name": "dx-server",
3
- "version": "0.12.2",
4
- "main": "./cjs/index.js",
5
- "homepage": "https://github.com/tranvansang/dx-server",
6
- "repository": "https://github.com/tranvansang/dx-server",
7
- "author": "Sang Tran <t@sang.jp>",
8
- "files": [
9
- "cjs",
10
- "esm"
11
- ],
12
- "exports": {
13
- ".": {
14
- "import": "./esm/index.js",
15
- "require": "./cjs/index.js"
16
- },
17
- "./express": {
18
- "import": "./esm/express.js",
19
- "require": "./cjs/express.js"
20
- },
21
- "./helpers": {
22
- "import": "./esm/helpers.js",
23
- "require": "./cjs/helpers.js"
24
- }
25
- },
26
- "type": "module",
27
- "engines": {
28
- "node": ">=16.0.0"
29
- },
30
- "scripts": {
31
- "prepublishOnly": "./compile.sh"
32
- },
33
- "license": "MIT",
34
- "devDependencies": {
35
- "@types/node": "^20.12.8",
36
- "typescript": "^5.4.5"
37
- }
2
+ "name": "dx-server",
3
+ "version": "0.13.0-alpha.2",
4
+ "main": "./lib/index.js",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/tranvansang/dx-server.git"
8
+ },
9
+ "author": "Sang Tran <t@sang.jp>",
10
+ "files": [
11
+ "lib"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "default": "./lib/index.js",
16
+ "types": "./lib/index.d.ts"
17
+ },
18
+ "./helpers": {
19
+ "default": "./lib/helpers.js",
20
+ "types": "./lib/helpers.d.ts"
21
+ }
22
+ },
23
+ "type": "module",
24
+ "scripts": {
25
+ "prepublishOnly": "tsc",
26
+ "test": "tsc && node --test test/*.test.ts",
27
+ "coverage": "tsc && node --test --experimental-test-coverage --test-coverage-include='lib/**' --test-coverage-exclude='lib/vendors/mimeDb.js' --test-coverage-exclude='test/**' test/*.test.ts"
28
+ },
29
+ "license": "MIT",
30
+ "devDependencies": {
31
+ "@types/node": "^25.6.0",
32
+ "typescript": "^6.0.2"
33
+ }
38
34
  }
package/cjs/body.js DELETED
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.getBuffer = void 0;
4
- const dx_js_1 = require("./dx.js");
5
- const bodyHelpers_js_1 = require("./bodyHelpers.js");
6
- exports.getBuffer = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.bufferFromReq)((0, dx_js_1.getReq)(), options));
7
- exports.getJson = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.jsonFromReq)((0, dx_js_1.getReq)(), options));
8
- exports.getRaw = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.rawFromReq)((0, dx_js_1.getReq)(), options));
9
- exports.getText = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.textFromReq)((0, dx_js_1.getReq)(), options));
10
- exports.getUrlEncoded = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.urlEncodedFromReq)((0, dx_js_1.getReq)(), options));
11
- exports.getQuery = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.queryFromReq)((0, dx_js_1.getReq)(), options));
12
- // to getFile use busboy
13
- // https://github.com/mscdex/busboy
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUE2QztBQUM3QyxxREFReUI7QUFFWixRQUFBLFNBQVMsR0FBRyxJQUFBLHFCQUFhLEVBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDhCQUFhLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ3JHLFFBQUEsT0FBTyxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsNEJBQVcsRUFBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFDakcsUUFBQSxNQUFNLEdBQUcsSUFBQSxxQkFBYSxFQUFDLENBQUMsT0FBb0MsRUFBRSxFQUFFLENBQUMsSUFBQSwyQkFBVSxFQUFDLElBQUEsY0FBTSxHQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUMvRixRQUFBLE9BQU8sR0FBRyxJQUFBLHFCQUFhLEVBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDRCQUFXLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ2pHLFFBQUEsYUFBYSxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsa0NBQWlCLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQzdHLFFBQUEsUUFBUSxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsNkJBQVksRUFBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFFaEgsd0JBQXdCO0FBQ3hCLG1DQUFtQyJ9
@@ -1,16 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
- import { IncomingMessage } from 'node:http';
4
- export interface BufferBodyOptions {
5
- bodyLimit: number;
6
- urlEncodedParser?(search: string): any;
7
- queryParser?(search: string): any;
8
- }
9
- export declare function setBufferBodyDefaultOptions(options: Partial<BufferBodyOptions>): void;
10
- export declare function bufferFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<Buffer | undefined>;
11
- export declare function jsonFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<any>;
12
- export declare function rawFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<Buffer | undefined>;
13
- export declare function textFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<string | undefined>;
14
- export declare function urlEncodedFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<any>;
15
- export declare function urlFromReq(req: IncomingMessage): URL;
16
- export declare function queryFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): any;
@@ -1,101 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.queryFromReq = exports.urlFromReq = exports.urlEncodedFromReq = exports.textFromReq = exports.rawFromReq = exports.jsonFromReq = exports.bufferFromReq = exports.setBufferBodyDefaultOptions = void 0;
4
- const stream_js_1 = require("./stream.js");
5
- const contentType_js_1 = require("./vendors/contentType.js");
6
- function defaultQueryParser(search) {
7
- return Object.fromEntries(new URLSearchParams(search)); // support both leading ? and not
8
- }
9
- let bodyDefaultOptions = { bodyLimit: 100 << 10 }; // 100kb
10
- function setBufferBodyDefaultOptions(options) {
11
- bodyDefaultOptions = { ...bodyDefaultOptions, ...options };
12
- }
13
- exports.setBufferBodyDefaultOptions = setBufferBodyDefaultOptions;
14
- async function bufferFromReq(req, options) {
15
- const { bodyLimit } = { ...bodyDefaultOptions, ...options };
16
- /**
17
- * Check if a request has a request body.
18
- * A request with a body __must__ either have `transfer-encoding`
19
- * or `content-length` headers set.
20
- * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
21
- */
22
- // https://github.com/jshttp/type-is/blob/cdcfe23e9833872e425b0aaf71ca0311373b6116/index.js#L92
23
- const contentLengthParsed = parseInt(req.headers['content-length'] ?? '', 10);
24
- if (req.headers['transfer-encoding'] === undefined
25
- && isNaN(contentLengthParsed))
26
- return;
27
- const contentLength = isNaN(contentLengthParsed) ? undefined : contentLengthParsed;
28
- // read
29
- const encoding = (req.headers['content-encoding'] ?? 'identity').toLowerCase();
30
- const stream = (0, stream_js_1.getContentStream)(req, encoding);
31
- return await (0, stream_js_1.readStream)(stream, {
32
- length: encoding === 'identity' ? contentLength : undefined,
33
- limit: bodyLimit,
34
- });
35
- }
36
- exports.bufferFromReq = bufferFromReq;
37
- // if content-type is not as expected, return undefined
38
- function forceGetContentTypeParams(req, expected) {
39
- const contentTypeRaw = req.headers['content-type'];
40
- if (!contentTypeRaw)
41
- return;
42
- const { mediaType, parameters } = (0, contentType_js_1.parseContentType)(contentTypeRaw);
43
- if (mediaType !== expected)
44
- return;
45
- return parameters;
46
- }
47
- function forceGetCharset(req, expected) {
48
- const parameters = forceGetContentTypeParams(req, expected);
49
- if (!parameters)
50
- return;
51
- // assert charset per RFC 7159 sec 8.1
52
- const charset = parameters.charset?.toLowerCase() || 'utf-8';
53
- if (!charset.startsWith('utf-'))
54
- throw new Error(`unsupported charset "${charset.toUpperCase()}"`);
55
- return charset;
56
- }
57
- async function jsonFromReq(req, options) {
58
- const charset = forceGetCharset(req, 'application/json');
59
- if (!charset)
60
- return;
61
- const buffer = await bufferFromReq(req, options);
62
- if (buffer) {
63
- const str = buffer.toString(charset);
64
- return str ? JSON.parse(str) : undefined;
65
- }
66
- }
67
- exports.jsonFromReq = jsonFromReq;
68
- async function rawFromReq(req, options) {
69
- if (!forceGetContentTypeParams(req, 'application/octet-stream'))
70
- return;
71
- return await bufferFromReq(req, options);
72
- }
73
- exports.rawFromReq = rawFromReq;
74
- async function textFromReq(req, options) {
75
- const charset = forceGetCharset(req, 'text/plain');
76
- if (!charset)
77
- return;
78
- const buffer = await bufferFromReq(req, options);
79
- if (buffer)
80
- return buffer.toString(charset);
81
- }
82
- exports.textFromReq = textFromReq;
83
- async function urlEncodedFromReq(req, options) {
84
- const charset = forceGetCharset(req, 'application/x-www-form-urlencoded');
85
- if (!charset)
86
- return;
87
- const buffer = await bufferFromReq(req, options);
88
- if (buffer) {
89
- return (bodyDefaultOptions.urlEncodedParser ?? options?.urlEncodedParser ?? defaultQueryParser)(buffer.toString(charset));
90
- }
91
- }
92
- exports.urlEncodedFromReq = urlEncodedFromReq;
93
- function urlFromReq(req) {
94
- return new URL(req.url ?? '', 'https://example.com');
95
- }
96
- exports.urlFromReq = urlFromReq;
97
- function queryFromReq(req, options) {
98
- return (bodyDefaultOptions.queryParser ?? options?.queryParser ?? defaultQueryParser)(urlFromReq(req).searchParams.toString());
99
- }
100
- exports.queryFromReq = queryFromReq;
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm9keUhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdEO0FBQ3hELDZEQUF5RDtBQVF6RCxTQUFTLGtCQUFrQixDQUFDLE1BQWM7SUFDekMsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsQ0FBQyxpQ0FBaUM7QUFDekYsQ0FBQztBQUVELElBQUksa0JBQWtCLEdBQXNCLEVBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUMsQ0FBQSxDQUFDLFFBQVE7QUFDM0UsU0FBZ0IsMkJBQTJCLENBQUMsT0FBbUM7SUFDOUUsa0JBQWtCLEdBQUcsRUFBQyxHQUFHLGtCQUFrQixFQUFFLEdBQUcsT0FBTyxFQUFDLENBQUE7QUFDekQsQ0FBQztBQUZELGtFQUVDO0FBRU0sS0FBSyxVQUFVLGFBQWEsQ0FBQyxHQUFvQixFQUFFLE9BQW9DO0lBQzdGLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxFQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQTtJQUN2RDs7Ozs7T0FLRztJQUNGLCtGQUErRjtJQUNoRyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdFLElBQ0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFNBQVM7V0FDM0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQzVCLE9BQU07SUFDUixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQTtJQUVsRixPQUFPO0lBQ1AsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFH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
package/cjs/connect.d.ts DELETED
@@ -1,5 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import type { IncomingMessage, ServerResponse } from 'node:http';
3
- import { type Chainable } from './dx.js';
4
- import './polyfillWithResolvers.js';
5
- export declare function connectMiddlewares(...middlewares: Array<(req: IncomingMessage, res: ServerResponse, next: () => any) => any>): Chainable;