dx-server 0.12.2 → 0.13.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -55
- package/{cjs → lib}/body.d.ts +2 -3
- package/lib/body.js +10 -0
- package/{esm → lib}/bodyHelpers.d.ts +2 -4
- package/lib/bodyHelpers.js +89 -0
- package/{esm → lib}/dx.d.ts +5 -8
- package/lib/dx.js +127 -0
- package/{cjs → lib}/dxHelpers.d.ts +0 -4
- package/{esm → lib}/dxHelpers.js +0 -2
- package/{cjs → lib}/index.d.ts +0 -1
- package/{esm/index.d.ts → lib/index.js} +0 -1
- package/lib/logger.js +56 -0
- package/lib/router.d.ts +42 -0
- package/lib/router.js +43 -0
- package/lib/static.js +22 -0
- package/{cjs → lib}/staticHelpers.d.ts +0 -2
- package/lib/staticHelpers.js +186 -0
- package/{cjs → lib}/stream.d.ts +2 -7
- package/lib/stream.js +90 -0
- package/{esm → lib}/vendors/contentType.js +0 -1
- package/{cjs → lib}/vendors/etag.d.ts +0 -3
- package/lib/vendors/etag.js +104 -0
- package/{cjs → lib}/vendors/fresh.d.ts +2 -2
- package/lib/vendors/fresh.js +95 -0
- package/lib/vendors/mime.d.ts +1 -0
- package/lib/vendors/mime.js +35 -0
- package/{esm → lib}/vendors/mimeDb.js +0 -1
- package/{cjs → lib}/vendors/mimeScore.d.ts +1 -1
- package/lib/vendors/mimeScore.js +45 -0
- package/{cjs → lib}/vendors/onFinished.d.ts +1 -1
- package/lib/vendors/onFinished.js +231 -0
- package/lib/vendors/rangeParser.d.ts +20 -0
- package/lib/vendors/rangeParser.js +121 -0
- package/package.json +10 -19
- package/cjs/body.js +0 -14
- package/cjs/bodyHelpers.d.ts +0 -16
- package/cjs/bodyHelpers.js +0 -101
- package/cjs/connect.d.ts +0 -5
- package/cjs/connect.js +0 -44
- package/cjs/dx.d.ts +0 -46
- package/cjs/dx.js +0 -144
- package/cjs/dxHelpers.js +0 -123
- package/cjs/express.d.ts +0 -4
- package/cjs/express.js +0 -43
- package/cjs/helpers.js +0 -14
- package/cjs/index.js +0 -38
- package/cjs/logger.js +0 -61
- package/cjs/package.json +0 -3
- package/cjs/polyfillWithResolvers.d.ts +0 -1
- package/cjs/polyfillWithResolvers.js +0 -17
- package/cjs/router.js +0 -47
- package/cjs/static.js +0 -27
- package/cjs/staticHelpers.js +0 -195
- package/cjs/stream.js +0 -97
- package/cjs/vendors/contentType.js +0 -92
- package/cjs/vendors/etag.js +0 -136
- package/cjs/vendors/fresh.js +0 -102
- package/cjs/vendors/mime.d.ts +0 -1
- package/cjs/vendors/mime.js +0 -42
- package/cjs/vendors/mimeDb.js +0 -9417
- package/cjs/vendors/mimeScore.js +0 -50
- package/cjs/vendors/onFinished.js +0 -245
- package/cjs/vendors/rangeParser.d.ts +0 -10
- package/cjs/vendors/rangeParser.js +0 -126
- package/esm/body.d.ts +0 -8
- package/esm/body.js +0 -11
- package/esm/bodyHelpers.js +0 -90
- package/esm/connect.d.ts +0 -5
- package/esm/connect.js +0 -40
- package/esm/dx.js +0 -128
- package/esm/dxHelpers.d.ts +0 -49
- package/esm/express.d.ts +0 -4
- package/esm/express.js +0 -35
- package/esm/helpers.js +0 -3
- package/esm/index.js +0 -9
- package/esm/logger.d.ts +0 -3
- package/esm/logger.js +0 -57
- package/esm/polyfillWithResolvers.d.ts +0 -1
- package/esm/polyfillWithResolvers.js +0 -16
- package/esm/router.js +0 -44
- package/esm/static.d.ts +0 -5
- package/esm/static.js +0 -23
- package/esm/staticHelpers.d.ts +0 -18
- package/esm/staticHelpers.js +0 -188
- package/esm/stream.d.ts +0 -12
- package/esm/stream.js +0 -92
- package/esm/vendors/contentType.d.ts +0 -4
- package/esm/vendors/etag.d.ts +0 -10
- package/esm/vendors/etag.js +0 -105
- package/esm/vendors/fresh.d.ts +0 -23
- package/esm/vendors/fresh.js +0 -96
- package/esm/vendors/mime.d.ts +0 -1
- package/esm/vendors/mime.js +0 -35
- package/esm/vendors/mimeDb.d.ts +0 -9413
- package/esm/vendors/mimeScore.d.ts +0 -5
- package/esm/vendors/mimeScore.js +0 -46
- package/esm/vendors/onFinished.d.ts +0 -14
- package/esm/vendors/onFinished.js +0 -241
- package/esm/vendors/rangeParser.d.ts +0 -10
- package/esm/vendors/rangeParser.js +0 -122
- /package/{cjs → lib}/helpers.d.ts +0 -0
- /package/{esm/helpers.d.ts → lib/helpers.js} +0 -0
- /package/{cjs → lib}/logger.d.ts +0 -0
- /package/{cjs → lib}/static.d.ts +0 -0
- /package/{cjs → lib}/vendors/contentType.d.ts +0 -0
- /package/{cjs → lib}/vendors/mimeDb.d.ts +0 -0
|
@@ -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,20 @@
|
|
|
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
|
+
interface Range {
|
|
11
|
+
start: number;
|
|
12
|
+
end: number;
|
|
13
|
+
}
|
|
14
|
+
export type Ranges = Range[] & {
|
|
15
|
+
type: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function parseRange(size: number, str: string | undefined, options?: {
|
|
18
|
+
combine?: boolean;
|
|
19
|
+
}): Ranges | -1 | -2;
|
|
20
|
+
export {};
|
|
@@ -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
|
+
let j = 0;
|
|
66
|
+
for (let i = 1; i < ordered.length; i++) {
|
|
67
|
+
const range = ordered[i];
|
|
68
|
+
const current = ordered[j];
|
|
69
|
+
if (range.start > current.end + 1) {
|
|
70
|
+
// next range
|
|
71
|
+
ordered[++j] = range;
|
|
72
|
+
}
|
|
73
|
+
else if (range.end > current.end) {
|
|
74
|
+
// extend range
|
|
75
|
+
current.end = range.end;
|
|
76
|
+
current.index = Math.min(current.index, range.index);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// trim ordered array
|
|
80
|
+
ordered.length = j + 1;
|
|
81
|
+
// generate combined range
|
|
82
|
+
const combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex);
|
|
83
|
+
// copy ranges type
|
|
84
|
+
combined.type = ranges.type;
|
|
85
|
+
return combined;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Map function to add index value to ranges.
|
|
89
|
+
* @private
|
|
90
|
+
*/
|
|
91
|
+
function mapWithIndex(range, index) {
|
|
92
|
+
return {
|
|
93
|
+
start: range.start,
|
|
94
|
+
end: range.end,
|
|
95
|
+
index: index
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Map function to remove index value from ranges.
|
|
100
|
+
* @private
|
|
101
|
+
*/
|
|
102
|
+
function mapWithoutIndex(range) {
|
|
103
|
+
return {
|
|
104
|
+
start: range.start,
|
|
105
|
+
end: range.end
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Sort function to sort ranges by index.
|
|
110
|
+
* @private
|
|
111
|
+
*/
|
|
112
|
+
function sortByRangeIndex(a, b) {
|
|
113
|
+
return a.index - b.index;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Sort function to sort ranges by start position.
|
|
117
|
+
* @private
|
|
118
|
+
*/
|
|
119
|
+
function sortByRangeStart(a, b) {
|
|
120
|
+
return a.start - b.start;
|
|
121
|
+
}
|
package/package.json
CHANGED
|
@@ -1,38 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dx-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"main": "./
|
|
5
|
-
"homepage": "https://github.com/tranvansang/dx-server",
|
|
3
|
+
"version": "0.13.0-alpha.1",
|
|
4
|
+
"main": "./lib/index.js",
|
|
6
5
|
"repository": "https://github.com/tranvansang/dx-server",
|
|
7
6
|
"author": "Sang Tran <t@sang.jp>",
|
|
8
7
|
"files": [
|
|
9
|
-
"
|
|
10
|
-
"esm"
|
|
8
|
+
"lib"
|
|
11
9
|
],
|
|
12
10
|
"exports": {
|
|
13
11
|
".": {
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
},
|
|
17
|
-
"./express": {
|
|
18
|
-
"import": "./esm/express.js",
|
|
19
|
-
"require": "./cjs/express.js"
|
|
12
|
+
"default": "./lib/index.js",
|
|
13
|
+
"types": "./lib/index.d.ts"
|
|
20
14
|
},
|
|
21
15
|
"./helpers": {
|
|
22
|
-
"
|
|
23
|
-
"
|
|
16
|
+
"default": "./lib/helpers.js",
|
|
17
|
+
"types": "./lib/helpers.d.ts"
|
|
24
18
|
}
|
|
25
19
|
},
|
|
26
20
|
"type": "module",
|
|
27
|
-
"engines": {
|
|
28
|
-
"node": ">=16.0.0"
|
|
29
|
-
},
|
|
30
21
|
"scripts": {
|
|
31
|
-
"prepublishOnly": "
|
|
22
|
+
"prepublishOnly": "tsc"
|
|
32
23
|
},
|
|
33
24
|
"license": "MIT",
|
|
34
25
|
"devDependencies": {
|
|
35
|
-
"@types/node": "^
|
|
36
|
-
"typescript": "^
|
|
26
|
+
"@types/node": "^25.6.0",
|
|
27
|
+
"typescript": "^6.0.2"
|
|
37
28
|
}
|
|
38
29
|
}
|
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
|
package/cjs/bodyHelpers.d.ts
DELETED
|
@@ -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;
|
package/cjs/bodyHelpers.js
DELETED
|
@@ -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;
|
package/cjs/connect.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.connectMiddlewares = void 0;
|
|
4
|
-
const dx_js_1 = require("./dx.js");
|
|
5
|
-
require("./polyfillWithResolvers.js");
|
|
6
|
-
// support async middleware
|
|
7
|
-
// do not support error middleware (the one with 4 arguments)
|
|
8
|
-
function connectMiddlewares(...middlewares) {
|
|
9
|
-
return next => {
|
|
10
|
-
const req = (0, dx_js_1.getReq)();
|
|
11
|
-
const res = (0, dx_js_1.getRes)();
|
|
12
|
-
const defer = Promise.withResolvers();
|
|
13
|
-
// because middleware usually not return next() or await to next(),
|
|
14
|
-
// the next passed to the middleware must be resilient to error (never throw or reject)
|
|
15
|
-
middlewares.reduceRight((connectNext, middleware) => async (error) => {
|
|
16
|
-
// this function must not throw or reject
|
|
17
|
-
if (error !== undefined && error !== null)
|
|
18
|
-
return defer.reject(error);
|
|
19
|
-
try {
|
|
20
|
-
return await middleware(req, res, connectNext);
|
|
21
|
-
}
|
|
22
|
-
catch (err) {
|
|
23
|
-
return defer.reject(err);
|
|
24
|
-
}
|
|
25
|
-
}, async () => {
|
|
26
|
-
// next might throw error synchronously and be swallowed by some async middleware unless we wrap it here
|
|
27
|
-
try {
|
|
28
|
-
return defer.resolve(await next());
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
return defer.reject(err);
|
|
32
|
-
}
|
|
33
|
-
})(); // no need to await result from this call because it will never reject
|
|
34
|
-
return defer.promise;
|
|
35
|
-
// let i = 0
|
|
36
|
-
// const run = async () => {
|
|
37
|
-
// if (i === middlewares.length) return next()
|
|
38
|
-
// await middlewares[i++](req, res, run)
|
|
39
|
-
// }
|
|
40
|
-
// await run()
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
exports.connectMiddlewares = connectMiddlewares;
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25uZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLG1DQUFzRDtBQUN0RCxzQ0FBbUM7QUFFbkMsMkJBQTJCO0FBQzNCLDZEQUE2RDtBQUM3RCxTQUFnQixrQkFBa0IsQ0FDakMsR0FBRyxXQUF1RjtJQUUxRixPQUFPLElBQUksQ0FBQyxFQUFFO1FBQ2IsTUFBTSxHQUFHLEdBQUcsSUFBQSxjQUFNLEdBQUUsQ0FBQTtRQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU0sR0FBRSxDQUFBO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNyQyxtRUFBbUU7UUFDbkUsdUZBQXVGO1FBQ3ZGLFdBQVcsQ0FBQyxXQUFXLENBQ3RCLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQVcsRUFBRSxFQUFFO1lBQ2xELHlDQUF5QztZQUN6QyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7Z0JBQUUsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3JFLElBQUksQ0FBQztnQkFBQSxPQUFPLE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFBQSxDQUFDO1lBQ3BELE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQUEsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQUEsQ0FBQztRQUN2QyxDQUFDLEVBQ0QsS0FBSyxJQUFJLEVBQUU7WUFDVix3R0FBd0c7WUFDeEcsSUFBSSxDQUFDO2dCQUNKLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUE7WUFDbkMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3pCLENBQUM7UUFDRixDQUFDLENBQ0QsRUFBRSxDQUFBLENBQUMsc0VBQXNFO1FBQzFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQTtRQUNwQixZQUFZO1FBQ1osNEJBQTRCO1FBQzVCLCtDQUErQztRQUMvQyx5Q0FBeUM7UUFDekMsSUFBSTtRQUNKLGNBQWM7SUFDZixDQUFDLENBQUE7QUFDRixDQUFDO0FBakNELGdEQWlDQyJ9
|
package/cjs/dx.d.ts
DELETED
|
@@ -1,46 +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 { Readable } from 'node:stream';
|
|
5
|
-
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
-
import type { SendFileOptions } from './staticHelpers.js';
|
|
7
|
-
export interface Chainable<P extends any[] = any[], R = any, Next = (...np: any[]) => any> {
|
|
8
|
-
(next: Next, ...p: P): R;
|
|
9
|
-
}
|
|
10
|
-
export interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
|
|
11
|
-
value: Awaited<T>;
|
|
12
|
-
get(req: IncomingMessage): T;
|
|
13
|
-
set(req: IncomingMessage, value: T): void;
|
|
14
|
-
(...params: Params): Promise<T>;
|
|
15
|
-
chain(...params: Params): Chainable<Params, R, Next>;
|
|
16
|
-
}
|
|
17
|
-
export declare function makeDxContext<T, Params extends any[], R = any, Next = (...np: any[]) => any>(maker: (...params: Params) => T | Promise<T>): Context<T, Params, R, Next>;
|
|
18
|
-
export declare function dxServer(req: IncomingMessage, res: ServerResponse, options?: {
|
|
19
|
-
jsonBeautify?: boolean;
|
|
20
|
-
disableEtag?: boolean;
|
|
21
|
-
}): Chainable;
|
|
22
|
-
export declare function getReq(): IncomingMessage;
|
|
23
|
-
export declare function getRes(): ServerResponse;
|
|
24
|
-
export declare function setText(text: string, { status }?: {
|
|
25
|
-
status?: number;
|
|
26
|
-
}): void;
|
|
27
|
-
export declare function setEmpty({ status }?: {
|
|
28
|
-
status?: number;
|
|
29
|
-
}): void;
|
|
30
|
-
export declare function setHtml(html: string, opts?: {
|
|
31
|
-
status?: number;
|
|
32
|
-
}): void;
|
|
33
|
-
export declare function setFile(filePath: string, options?: SendFileOptions): void;
|
|
34
|
-
export declare function setBuffer(buffer: Buffer, { status }?: {
|
|
35
|
-
status?: number;
|
|
36
|
-
}): void;
|
|
37
|
-
export declare function setNodeStream(stream: Readable, { status }?: {
|
|
38
|
-
status?: number;
|
|
39
|
-
}): void;
|
|
40
|
-
export declare function setWebStream(stream: ReadableStream, { status }?: {
|
|
41
|
-
status?: number;
|
|
42
|
-
}): void;
|
|
43
|
-
export declare function setJson(json: any, { status }?: {
|
|
44
|
-
status?: number;
|
|
45
|
-
}): void;
|
|
46
|
-
export declare function setRedirect(url: string, status: 301 | 302): void;
|