dx-server 0.4.0 → 0.5.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 +33 -39
- package/cjs/body.d.ts +2 -9
- package/cjs/body.js +11 -100
- package/cjs/bodyHelpers.d.ts +16 -0
- package/cjs/bodyHelpers.js +102 -0
- package/cjs/dx.d.ts +13 -60
- package/cjs/dx.js +41 -134
- package/cjs/dxHelpers.d.ts +32 -0
- package/cjs/dxHelpers.js +113 -0
- package/cjs/etag.js +1 -1
- package/cjs/express.js +6 -8
- package/cjs/file.d.ts +1 -2
- package/cjs/file.js +4 -4
- package/cjs/helpers.d.ts +2 -0
- package/cjs/helpers.js +14 -0
- package/cjs/index.d.ts +4 -3
- package/cjs/index.js +6 -9
- package/cjs/route.js +4 -4
- package/cjs/static.js +4 -4
- package/esm/body.d.ts +2 -9
- package/esm/body.js +11 -98
- package/esm/bodyHelpers.d.ts +16 -0
- package/esm/bodyHelpers.js +89 -0
- package/esm/dx.d.ts +13 -60
- package/esm/dx.js +37 -130
- package/esm/dxHelpers.d.ts +32 -0
- package/esm/dxHelpers.js +106 -0
- package/esm/etag.js +1 -1
- package/esm/express.js +6 -8
- package/esm/file.d.ts +1 -2
- package/esm/file.js +4 -4
- package/esm/helpers.d.ts +2 -0
- package/esm/helpers.js +3 -0
- package/esm/index.d.ts +4 -3
- package/esm/index.js +5 -4
- package/esm/route.js +4 -4
- package/esm/static.js +3 -3
- package/package.json +6 -4
- package/cjs/context.d.ts +0 -19
- package/cjs/context.js +0 -32
- package/esm/context.d.ts +0 -19
- package/esm/context.js +0 -28
package/cjs/dx.js
CHANGED
|
@@ -1,127 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setHtml = exports.setText = exports.
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
return {
|
|
14
|
-
|
|
15
|
-
|
|
3
|
+
exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setHtml = exports.setText = exports.getRes = exports.getReq = exports.dxServer = void 0;
|
|
4
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
5
|
+
const dxHelpers_js_1 = require("./dxHelpers.js");
|
|
6
|
+
const reqStorage = new node_async_hooks_1.AsyncLocalStorage();
|
|
7
|
+
const resStorage = new node_async_hooks_1.AsyncLocalStorage();
|
|
8
|
+
const dxStorage = new node_async_hooks_1.AsyncLocalStorage();
|
|
9
|
+
function dxServer(req, res, options = {}) {
|
|
10
|
+
return async (next) => {
|
|
11
|
+
const dx = { ...options };
|
|
12
|
+
const result = await dxStorage.run(dx, () => reqStorage.run(req, () => resStorage.run(res, next)));
|
|
13
|
+
await (0, dxHelpers_js_1.writeRes)(req, res, dx);
|
|
14
|
+
return result;
|
|
16
15
|
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
bufferOrStream = Buffer.from(data, charset);
|
|
32
|
-
break;
|
|
33
|
-
case 'buffer':
|
|
34
|
-
setContentType('application/octet-stream');
|
|
35
|
-
bufferOrStream = data;
|
|
36
|
-
break;
|
|
37
|
-
case 'nodeStream':
|
|
38
|
-
setContentType('application/octet-stream');
|
|
39
|
-
bufferOrStream = data;
|
|
40
|
-
break;
|
|
41
|
-
case 'webStream':
|
|
42
|
-
setContentType('application/octet-stream');
|
|
43
|
-
bufferOrStream = node_stream_1.Readable.fromWeb(data);
|
|
44
|
-
break;
|
|
45
|
-
case 'json':
|
|
46
|
-
setContentType('application/json');
|
|
47
|
-
bufferOrStream = Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
|
|
48
|
-
break;
|
|
49
|
-
case 'redirect':
|
|
50
|
-
res.setHeader('location', data);
|
|
51
|
-
bufferOrStream = Buffer.from('', charset);
|
|
52
|
-
break;
|
|
53
|
-
case undefined:
|
|
54
|
-
// skip response. Some middleware may handle it outside the chain. For example, express middleware
|
|
55
|
-
return ret;
|
|
56
|
-
default:
|
|
57
|
-
if (!res.getHeader('content-type'))
|
|
58
|
-
res.setHeader('content-type', 'text/plain');
|
|
59
|
-
throw new Error(`unsupported response type ${type}`);
|
|
60
|
-
}
|
|
61
|
-
const req = context_js_1.reqContext.value;
|
|
62
|
-
if (res.headersSent) {
|
|
63
|
-
if (res.writableFinished) {
|
|
64
|
-
// skipped: response is already finished
|
|
65
|
-
}
|
|
66
|
-
else if (res.writableEnded) {
|
|
67
|
-
const defer = (0, jdefer_1.default)();
|
|
68
|
-
res.addListener('finish', defer.resolve);
|
|
69
|
-
await defer.promise;
|
|
70
|
-
// skipped: response is already ended
|
|
71
|
-
// chunk is not fully flushed yet
|
|
72
|
-
}
|
|
73
|
-
else
|
|
74
|
-
await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // to be consistent, we end the response immediately
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
// https://github.com/expressjs/express/blob/980d881e3b023db079de60477a2588a91f046ca5/lib/response.js#L210
|
|
78
|
-
if (res.statusCode === 204) { // No Content
|
|
79
|
-
res.removeHeader('content-type');
|
|
80
|
-
res.removeHeader('content-length');
|
|
81
|
-
res.removeHeader('transfer-encoding');
|
|
82
|
-
// write nothing
|
|
83
|
-
}
|
|
84
|
-
if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
|
|
85
|
-
res.setHeader('content-length', 0);
|
|
86
|
-
res.removeHeader('transfer-encoding');
|
|
87
|
-
}
|
|
88
|
-
else if (req.method === 'HEAD') {
|
|
89
|
-
// write nothing
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
if (Buffer.isBuffer(bufferOrStream)) {
|
|
93
|
-
// support: 304 (etag), zipping, file etag and last modified
|
|
94
|
-
res.setHeader('content-length', bufferOrStream.length);
|
|
95
|
-
if (!disableEtag) {
|
|
96
|
-
const etag = (0, etag_js_1.entityTag)(bufferOrStream);
|
|
97
|
-
const lastModified = res.getHeader('last-modified');
|
|
98
|
-
res.setHeader('ETag', etag);
|
|
99
|
-
if ((0, etag_js_1.isFreshETag)(req, etag)) {
|
|
100
|
-
res.removeHeader('content-type');
|
|
101
|
-
res.removeHeader('content-length');
|
|
102
|
-
res.removeHeader('transfer-encoding');
|
|
103
|
-
res.statusCode = 304;
|
|
104
|
-
// write nothing
|
|
105
|
-
}
|
|
106
|
-
else
|
|
107
|
-
res.write(bufferOrStream);
|
|
108
|
-
}
|
|
109
|
-
else
|
|
110
|
-
res.write(bufferOrStream);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
bufferOrStream.pipe(res);
|
|
114
|
-
}
|
|
115
|
-
// we do not support content-encoding (gzip, deflate, br) and leave it to reverse proxy or CDN
|
|
116
|
-
}
|
|
117
|
-
await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // some express middleware, such as express-session, requires explicitly passing chunk
|
|
118
|
-
}
|
|
119
|
-
return ret;
|
|
120
|
-
});
|
|
16
|
+
}
|
|
17
|
+
exports.dxServer = dxServer;
|
|
18
|
+
// method: verb
|
|
19
|
+
// url: full url without server, protocol, port.
|
|
20
|
+
// headers: if headers are repeated, they are joined by comma. Header names are lowercased.
|
|
21
|
+
// rawHeaders: list of header name and value in a flat array. Case is preserved.
|
|
22
|
+
function getReq() {
|
|
23
|
+
return reqStorage.getStore();
|
|
24
|
+
}
|
|
25
|
+
exports.getReq = getReq;
|
|
26
|
+
function getRes() {
|
|
27
|
+
return resStorage.getStore();
|
|
28
|
+
}
|
|
29
|
+
exports.getRes = getRes;
|
|
121
30
|
// todo: support setFile (with stream or with buffer)
|
|
122
31
|
function setText(text, { status } = {}) {
|
|
123
|
-
const res =
|
|
124
|
-
const dx =
|
|
32
|
+
const res = getRes();
|
|
33
|
+
const dx = dxStorage.getStore();
|
|
125
34
|
if (status)
|
|
126
35
|
res.statusCode = status;
|
|
127
36
|
dx.data = text;
|
|
@@ -130,13 +39,13 @@ function setText(text, { status } = {}) {
|
|
|
130
39
|
exports.setText = setText;
|
|
131
40
|
function setHtml(html, opts = {}) {
|
|
132
41
|
setText(html, opts);
|
|
133
|
-
const dx =
|
|
42
|
+
const dx = dxStorage.getStore();
|
|
134
43
|
dx.type = 'html';
|
|
135
44
|
}
|
|
136
45
|
exports.setHtml = setHtml;
|
|
137
46
|
function setBuffer(buffer, { status } = {}) {
|
|
138
|
-
const res =
|
|
139
|
-
const dx =
|
|
47
|
+
const res = getRes();
|
|
48
|
+
const dx = dxStorage.getStore();
|
|
140
49
|
if (status)
|
|
141
50
|
res.statusCode = status;
|
|
142
51
|
dx.data = buffer;
|
|
@@ -144,8 +53,8 @@ function setBuffer(buffer, { status } = {}) {
|
|
|
144
53
|
}
|
|
145
54
|
exports.setBuffer = setBuffer;
|
|
146
55
|
function setNodeStream(stream, { status } = {}) {
|
|
147
|
-
const res =
|
|
148
|
-
const dx =
|
|
56
|
+
const res = getRes();
|
|
57
|
+
const dx = dxStorage.getStore();
|
|
149
58
|
if (status)
|
|
150
59
|
res.statusCode = status;
|
|
151
60
|
dx.data = stream;
|
|
@@ -153,31 +62,29 @@ function setNodeStream(stream, { status } = {}) {
|
|
|
153
62
|
}
|
|
154
63
|
exports.setNodeStream = setNodeStream;
|
|
155
64
|
function setWebStream(stream, { status } = {}) {
|
|
156
|
-
const res =
|
|
157
|
-
const dx =
|
|
65
|
+
const res = getRes();
|
|
66
|
+
const dx = dxStorage.getStore();
|
|
158
67
|
if (status)
|
|
159
68
|
res.statusCode = status;
|
|
160
69
|
dx.data = stream;
|
|
161
70
|
dx.type = 'webStream';
|
|
162
71
|
}
|
|
163
72
|
exports.setWebStream = setWebStream;
|
|
164
|
-
function setJson(json, { status
|
|
165
|
-
const res =
|
|
73
|
+
function setJson(json, { status } = {}) {
|
|
74
|
+
const res = getRes();
|
|
166
75
|
if (status)
|
|
167
76
|
res.statusCode = status;
|
|
168
|
-
const dx =
|
|
77
|
+
const dx = dxStorage.getStore();
|
|
169
78
|
dx.data = json;
|
|
170
79
|
dx.type = 'json';
|
|
171
|
-
if (beautify !== undefined)
|
|
172
|
-
dx.jsonBeautify = beautify;
|
|
173
80
|
}
|
|
174
81
|
exports.setJson = setJson;
|
|
175
82
|
function setRedirect(url, status) {
|
|
176
|
-
const res =
|
|
177
|
-
const dx =
|
|
83
|
+
const res = getRes();
|
|
84
|
+
const dx = dxStorage.getStore();
|
|
178
85
|
res.statusCode = status;
|
|
179
86
|
dx.data = url;
|
|
180
87
|
dx.type = 'redirect';
|
|
181
88
|
}
|
|
182
89
|
exports.setRedirect = setRedirect;
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdURBQWtEO0FBQ2xELGlEQUF1RDtBQVV2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLG9DQUFpQixFQUFtQixDQUFBO0FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksb0NBQWlCLEVBQWtCLENBQUE7QUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQ0FBaUIsRUFBYSxDQUFBO0FBQ3BELFNBQWdCLFFBQVEsQ0FDdkIsR0FBb0IsRUFDcEIsR0FBbUIsRUFDbkIsVUFHSSxFQUFFO0lBRU4sT0FBTyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7UUFDbkIsTUFBTSxFQUFFLEdBQWMsRUFBQyxHQUFHLE9BQU8sRUFBQyxDQUFBO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDakMsRUFBRSxFQUNGLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ25CLEdBQUcsRUFDSCxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FDL0IsQ0FDRCxDQUFBO1FBQ0QsTUFBTSxJQUFBLHVCQUFRLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM1QixPQUFPLE1BQU0sQ0FBQTtJQUNkLENBQUMsQ0FBQTtBQUNGLENBQUM7QUFwQkQsNEJBb0JDO0FBRUQsZUFBZTtBQUNmLGdEQUFnRDtBQUNoRCwyRkFBMkY7QUFDM0YsZ0ZBQWdGO0FBQ2hGLFNBQWdCLE1BQU07SUFDckIsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFHLENBQUE7QUFDOUIsQ0FBQztBQUZELHdCQUVDO0FBQ0QsU0FBZ0IsTUFBTTtJQUNyQixPQUFPLFVBQVUsQ0FBQyxRQUFRLEVBQUcsQ0FBQTtBQUM5QixDQUFDO0FBRkQsd0JBRUM7QUFFRCxxREFBcUQ7QUFFckQs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
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
4
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
|
+
import { Readable } from 'node:stream';
|
|
6
|
+
export type DxContext = {
|
|
7
|
+
charset?: BufferEncoding;
|
|
8
|
+
jsonBeautify?: boolean;
|
|
9
|
+
disableEtag?: boolean;
|
|
10
|
+
} & ({
|
|
11
|
+
type: 'text';
|
|
12
|
+
data: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'html';
|
|
15
|
+
data: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'buffer';
|
|
18
|
+
data: Buffer;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'json';
|
|
21
|
+
data: any;
|
|
22
|
+
} | {
|
|
23
|
+
type: 'redirect';
|
|
24
|
+
data: string;
|
|
25
|
+
} | {
|
|
26
|
+
type: 'nodeStream';
|
|
27
|
+
data: Readable;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'webStream';
|
|
30
|
+
data: ReadableStream;
|
|
31
|
+
});
|
|
32
|
+
export declare function writeRes(req: IncomingMessage, res: ServerResponse, { type, data, charset, jsonBeautify, disableEtag }: DxContext): Promise<void>;
|
package/cjs/dxHelpers.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.writeRes = void 0;
|
|
7
|
+
const node_stream_1 = require("node:stream");
|
|
8
|
+
const jdefer_1 = __importDefault(require("jdefer"));
|
|
9
|
+
const node_util_1 = require("node:util");
|
|
10
|
+
const etag_js_1 = require("./etag.js");
|
|
11
|
+
async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEtag }) {
|
|
12
|
+
const setContentType = (contentType) => {
|
|
13
|
+
if (res.headersSent || res.getHeader('content-type'))
|
|
14
|
+
return;
|
|
15
|
+
res.setHeader('content-type', `${contentType}${charset ? `; charset=${charset}` : ''}`);
|
|
16
|
+
};
|
|
17
|
+
let bufferOrStream;
|
|
18
|
+
switch (type) {
|
|
19
|
+
case 'text':
|
|
20
|
+
setContentType('text/plain');
|
|
21
|
+
case 'html':
|
|
22
|
+
setContentType('text/html');
|
|
23
|
+
// shared with text
|
|
24
|
+
bufferOrStream = Buffer.from(data, charset);
|
|
25
|
+
break;
|
|
26
|
+
case 'buffer':
|
|
27
|
+
setContentType('application/octet-stream');
|
|
28
|
+
bufferOrStream = data;
|
|
29
|
+
break;
|
|
30
|
+
case 'nodeStream':
|
|
31
|
+
setContentType('application/octet-stream');
|
|
32
|
+
bufferOrStream = data;
|
|
33
|
+
break;
|
|
34
|
+
case 'webStream':
|
|
35
|
+
setContentType('application/octet-stream');
|
|
36
|
+
bufferOrStream = node_stream_1.Readable.fromWeb(data);
|
|
37
|
+
break;
|
|
38
|
+
case 'json':
|
|
39
|
+
setContentType('application/json');
|
|
40
|
+
bufferOrStream = Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
|
|
41
|
+
break;
|
|
42
|
+
case 'redirect':
|
|
43
|
+
res.setHeader('location', data);
|
|
44
|
+
bufferOrStream = Buffer.from('', charset);
|
|
45
|
+
break;
|
|
46
|
+
case undefined:
|
|
47
|
+
// skip response. Some middleware may handle it outside the chain. For example, express middleware
|
|
48
|
+
return;
|
|
49
|
+
default:
|
|
50
|
+
if (!res.getHeader('content-type'))
|
|
51
|
+
res.setHeader('content-type', 'text/plain');
|
|
52
|
+
throw new Error(`unsupported response type ${type}`);
|
|
53
|
+
}
|
|
54
|
+
if (res.headersSent) {
|
|
55
|
+
if (res.writableFinished) {
|
|
56
|
+
// skipped: response is already finished
|
|
57
|
+
}
|
|
58
|
+
else if (res.writableEnded) {
|
|
59
|
+
const defer = (0, jdefer_1.default)();
|
|
60
|
+
res.addListener('finish', defer.resolve);
|
|
61
|
+
await defer.promise;
|
|
62
|
+
// skipped: response is already ended
|
|
63
|
+
// chunk is not fully flushed yet
|
|
64
|
+
}
|
|
65
|
+
else
|
|
66
|
+
await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // to be consistent, we end the response immediately
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// https://github.com/expressjs/express/blob/980d881e3b023db079de60477a2588a91f046ca5/lib/response.js#L210
|
|
70
|
+
if (res.statusCode === 204) { // No Content
|
|
71
|
+
res.removeHeader('content-type');
|
|
72
|
+
res.removeHeader('content-length');
|
|
73
|
+
res.removeHeader('transfer-encoding');
|
|
74
|
+
// write nothing
|
|
75
|
+
}
|
|
76
|
+
if (res.statusCode === 205) { // reset content. Tell client to clear the form, etc.
|
|
77
|
+
res.setHeader('content-length', 0);
|
|
78
|
+
res.removeHeader('transfer-encoding');
|
|
79
|
+
}
|
|
80
|
+
else if (req.method === 'HEAD') {
|
|
81
|
+
// write nothing
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
if (Buffer.isBuffer(bufferOrStream)) {
|
|
85
|
+
// support: 304 (etag), zipping, file etag and last modified
|
|
86
|
+
res.setHeader('content-length', bufferOrStream.length);
|
|
87
|
+
if (!disableEtag) {
|
|
88
|
+
const etag = (0, etag_js_1.entityTag)(bufferOrStream);
|
|
89
|
+
const lastModified = res.getHeader('last-modified');
|
|
90
|
+
res.setHeader('ETag', etag);
|
|
91
|
+
if ((0, etag_js_1.isFreshETag)(req, etag)) {
|
|
92
|
+
res.removeHeader('content-type');
|
|
93
|
+
res.removeHeader('content-length');
|
|
94
|
+
res.removeHeader('transfer-encoding');
|
|
95
|
+
res.statusCode = 304;
|
|
96
|
+
// write nothing
|
|
97
|
+
}
|
|
98
|
+
else
|
|
99
|
+
res.write(bufferOrStream);
|
|
100
|
+
}
|
|
101
|
+
else
|
|
102
|
+
res.write(bufferOrStream);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
bufferOrStream.pipe(res);
|
|
106
|
+
}
|
|
107
|
+
// we do not support content-encoding (gzip, deflate, br) and leave it to reverse proxy or CDN
|
|
108
|
+
}
|
|
109
|
+
await (0, node_util_1.promisify)(res.end.bind(res))(undefined); // some express middleware, such as express-session, requires explicitly passing chunk
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.writeRes = writeRes;
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhIZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2R4SGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSw2Q0FBb0M7QUFDcEMsb0RBQThCO0FBQzlCLHlDQUFtQztBQUNuQyx1Q0FBZ0Q7QUFvQ3pDLEtBQUssVUFBVSxRQUFRLENBQUMsR0FBb0IsRUFBRSxHQUFtQixFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBWTtJQUNwSSxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLGNBQWMsQ0FBQTtJQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixtQkFBbUI7WUFDbkIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQzNDLE1BQUs7UUFDTixLQUFLLFFBQVE7WUFDWixjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtZQUMxQyxjQUFjLEdBQUcsSUFBSSxDQUFBO1lBQ3JCLE1BQUs7UUFDTixLQUFLLFlBQVk7WUFDaEIsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUE7WUFDMUMsY0FBYyxHQUFHLElBQUksQ0FBQTtZ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
|
package/cjs/etag.js
CHANGED
|
@@ -97,4 +97,4 @@ function parseTokenList(str) {
|
|
|
97
97
|
list.push(str.substring(start, end));
|
|
98
98
|
return list;
|
|
99
99
|
}
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ldGFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtHQUFrRztBQUNsRyw4REFBZ0M7QUFHaEMsU0FBZ0IsU0FBUyxDQUFDLEdBQVcsRUFBRSxJQUFjO0lBQ3BELHFCQUFxQjtJQUNyQixPQUFPLEdBQUcsQ0FBQyxNQUFNO1FBQ2hCLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLHFCQUFNO2FBQ3BDLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNYLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDaEIsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRztRQUNyQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQTtJQUN2RCw0RUFBNEU7SUFDNUUseUJBQXlCO0lBQ3pCLGdHQUFnRztBQUNqRyxDQUFDO0FBWkQsOEJBWUM7QUFFRCxNQUFNLDZCQUE2QixHQUFHLGdDQUFnQyxDQUFBO0FBQ3RFLFNBQWdCLE9BQU8sQ0FBQyxJQUFJO0lBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRW5DLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxHQUFHLENBQUE7QUFDNUIsQ0FBQztBQUxELDBCQUtDO0FBQ0QsNkZBQTZGO0FBQzdGLFNBQWdCLFdBQVcsQ0FBQyxHQUFvQixFQUFFLElBQVk7SUFDN0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUM5QyxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU07SUFFdEIsbURBQW1EO0lBQ25ELHdDQUF3QztJQUN4QyxxREFBcUQ7SUFDckQsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNqRCxJQUFJLFlBQVksSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTTtJQUU1RSxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFNO1FBRWpCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQTtRQUNwQixLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEVBQUUsSUFBSSxLQUFLLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN0RSxTQUFTLEdBQUcsS0FBSyxDQUFBO2dCQUNqQixNQUFLO1lBQ04sQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFJLFNBQVM7WUFBRSxPQUFNO0lBQ3RCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNaLENBQUM7QUF4QkQsa0NBd0JDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsR0FBb0IsRUFBRSxZQUFvQjtJQUM5RSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDdEQsSUFBSSxDQUFDLGFBQWE7UUFBRSxPQUFNO0lBRTFCLG1EQUFtRDtJQUNuRCx3Q0FBd0M7SUFDeEMscURBQXFEO0lBQ3JELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDakQsSUFBSSxZQUFZLElBQUksNkJBQTZCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUFFLE9BQU07SUFFNUUsSUFBSSxhQUFhLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ2pELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNuRCxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxnQkFBZ0IsSUFBSSxpQkFBaUIsQ0FBQTtJQUN0RyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDWixDQUFDO0FBaEJELG9EQWdCQztBQUVELFNBQVMsY0FBYyxDQUFFLEdBQVc7SUFDbkMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBQ1gsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ2YsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFBO0lBRWIsZ0JBQWdCO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoRCxRQUFRLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzQixLQUFLLElBQUksRUFBRSxPQUFPO2dCQUNqQixJQUFJLEtBQUssS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNwQixDQUFDO2dCQUNELE1BQUs7WUFDTixLQUFLLElBQUksRUFBRSxPQUFPO2dCQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQ3BDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDbkIsTUFBSztZQUNOO2dCQUNDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNYLE1BQUs7UUFDUCxDQUFDO0lBQ0YsQ0FBQztJQUNELGNBQWM7SUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDcEMsT0FBTyxJQUFJLENBQUE7QUFDWixDQUFDIn0=
|
package/cjs/express.js
CHANGED
|
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.expressMiddlewares = exports.expressRouter = exports.expressApp = void 0;
|
|
7
7
|
const express_1 = __importDefault(require("express"));
|
|
8
|
-
const context_js_1 = require("./context.js");
|
|
9
8
|
const jdefer_1 = __importDefault(require("jdefer"));
|
|
9
|
+
const dx_js_1 = require("./dx.js");
|
|
10
10
|
const expressApp = async (setup) => {
|
|
11
11
|
const symbol = Symbol('expressApp');
|
|
12
12
|
const app = (0, express_1.default)();
|
|
@@ -14,10 +14,9 @@ const expressApp = async (setup) => {
|
|
|
14
14
|
app.use((req, _res, _next) => req[symbol].resolve());
|
|
15
15
|
app.use((err, req, _res, _next) => req[symbol].reject(err));
|
|
16
16
|
return async (next) => {
|
|
17
|
-
const req = context_js_1.reqContext.value;
|
|
18
17
|
const defer = (0, jdefer_1.default)();
|
|
19
|
-
|
|
20
|
-
app(
|
|
18
|
+
(0, dx_js_1.getReq)()[symbol] = defer;
|
|
19
|
+
app((0, dx_js_1.getReq)(), (0, dx_js_1.getRes)());
|
|
21
20
|
await defer.promise;
|
|
22
21
|
await next();
|
|
23
22
|
};
|
|
@@ -30,10 +29,9 @@ const expressRouter = async (setup) => {
|
|
|
30
29
|
router.use((req, _res, _next) => req[symbol].resolve());
|
|
31
30
|
router.use((err, req, _res, _next) => req[symbol].reject(err));
|
|
32
31
|
return async (next) => {
|
|
33
|
-
const req = context_js_1.reqContext.value;
|
|
34
32
|
const defer = (0, jdefer_1.default)();
|
|
35
|
-
|
|
36
|
-
router(
|
|
33
|
+
(0, dx_js_1.getReq)()[symbol] = defer;
|
|
34
|
+
router((0, dx_js_1.getReq)(), (0, dx_js_1.getRes)());
|
|
37
35
|
await defer.promise; // if express middleware handles the request, this will never resolve.
|
|
38
36
|
await next();
|
|
39
37
|
};
|
|
@@ -41,4 +39,4 @@ const expressRouter = async (setup) => {
|
|
|
41
39
|
exports.expressRouter = expressRouter;
|
|
42
40
|
const expressMiddlewares = (...middlewares) => (0, exports.expressRouter)(router => router.use(...middlewares));
|
|
43
41
|
exports.expressMiddlewares = expressMiddlewares;
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNEQUF1RjtBQUN2RixvREFBOEI7QUFDOUIsbUNBQXNDO0FBRS9CLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxLQUE0QixFQUFFLEVBQUU7SUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRW5DLE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQU8sR0FBRSxDQUFBO0lBQ3JCLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDcEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzNELE9BQU8sS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQVMsR0FBRSxDQUFBO1FBQ3pCLElBQUEsY0FBTSxHQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLEdBQUcsQ0FBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLElBQUEsY0FBTSxHQUFFLENBQUMsQ0FBQTtRQUN2QixNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUE7UUFDbkIsTUFBTSxJQUFJLEVBQUUsQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNGLENBQUMsQ0FBQTtBQWRZLFFBQUEsVUFBVSxjQWN0QjtBQUVNLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxLQUE4QixFQUFFLEVBQUU7SUFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBRXRDLE1BQU0sTUFBTSxHQUFHLGlCQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDL0IsTUFBTSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUN2RCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDOUQsT0FBTyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBQSxnQkFBUyxHQUFFLENBQUE7UUFDekIsSUFBQSxjQUFNLEdBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDeEIsTUFBTSxDQUFDLElBQUEsY0FBTSxHQUFFLEVBQUUsSUFBQSxjQUFNLEdBQUUsQ0FBQyxDQUFBO1FBQzFCLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQSxDQUFDLHNFQUFzRTtRQUMxRixNQUFNLElBQUksRUFBRSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0YsQ0FBQyxDQUFBO0FBZFksUUFBQSxhQUFhLGlCQWN6QjtBQUVNLE1BQU0sa0JBQWtCLEdBQUcsQ0FDakMsR0FBRyxXQUF5RSxFQUMzRSxFQUFFLENBQUMsSUFBQSxxQkFBYSxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUE7QUFGM0MsUUFBQSxrQkFBa0Isc0JBRXlCIn0=
|
package/cjs/file.d.ts
CHANGED
package/cjs/file.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.serveFile = void 0;
|
|
4
|
-
const
|
|
4
|
+
const dx_js_1 = require("./dx.js");
|
|
5
5
|
const serveFile = ({ prefix = '' }) => next => {
|
|
6
|
-
const req =
|
|
7
|
-
const res =
|
|
6
|
+
const req = (0, dx_js_1.getReq)();
|
|
7
|
+
const res = (0, dx_js_1.getRes)();
|
|
8
8
|
if (req.method !== 'GET' && req.method !== 'HEAD')
|
|
9
9
|
return next();
|
|
10
10
|
};
|
|
11
11
|
exports.serveFile = serveFile;
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFzQztBQUUvQixNQUFNLFNBQVMsR0FBRyxDQUN4QixFQUFDLE1BQU0sR0FBRyxFQUFFLEVBRVgsRUFDQSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFBLGNBQU0sR0FBRSxDQUFBO0lBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTSxHQUFFLENBQUE7SUFDcEIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksRUFBRSxDQUFBO0FBQ2pFLENBQUMsQ0FBQTtBQVJZLFFBQUEsU0FBUyxhQVFyQiJ9
|
package/cjs/helpers.d.ts
ADDED
package/cjs/helpers.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.queryFromReq = exports.urlEncodedFromReq = exports.textFromReq = exports.rawFromReq = exports.jsonFromReq = exports.bufferFromReq = exports.setBufferBodyDefaultOptions = exports.writeRes = void 0;
|
|
4
|
+
var dxHelpers_js_1 = require("./dxHelpers.js");
|
|
5
|
+
Object.defineProperty(exports, "writeRes", { enumerable: true, get: function () { return dxHelpers_js_1.writeRes; } });
|
|
6
|
+
var bodyHelpers_js_1 = require("./bodyHelpers.js");
|
|
7
|
+
Object.defineProperty(exports, "setBufferBodyDefaultOptions", { enumerable: true, get: function () { return bodyHelpers_js_1.setBufferBodyDefaultOptions; } });
|
|
8
|
+
Object.defineProperty(exports, "bufferFromReq", { enumerable: true, get: function () { return bodyHelpers_js_1.bufferFromReq; } });
|
|
9
|
+
Object.defineProperty(exports, "jsonFromReq", { enumerable: true, get: function () { return bodyHelpers_js_1.jsonFromReq; } });
|
|
10
|
+
Object.defineProperty(exports, "rawFromReq", { enumerable: true, get: function () { return bodyHelpers_js_1.rawFromReq; } });
|
|
11
|
+
Object.defineProperty(exports, "textFromReq", { enumerable: true, get: function () { return bodyHelpers_js_1.textFromReq; } });
|
|
12
|
+
Object.defineProperty(exports, "urlEncodedFromReq", { enumerable: true, get: function () { return bodyHelpers_js_1.urlEncodedFromReq; } });
|
|
13
|
+
Object.defineProperty(exports, "queryFromReq", { enumerable: true, get: function () { return bodyHelpers_js_1.queryFromReq; } });
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUF1QztBQUEvQix3R0FBQSxRQUFRLE9BQUE7QUFDaEIsbURBUXlCO0FBUHhCLDZIQUFBLDJCQUEyQixPQUFBO0FBQzNCLCtHQUFBLGFBQWEsT0FBQTtBQUNiLDZHQUFBLFdBQVcsT0FBQTtBQUNYLDRHQUFBLFVBQVUsT0FBQTtBQUNWLDZHQUFBLFdBQVcsT0FBQTtBQUNYLG1IQUFBLGlCQUFpQixPQUFBO0FBQ2pCLDhHQUFBLFlBQVksT0FBQSJ9
|
package/cjs/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
|
|
3
|
-
export {
|
|
1
|
+
export { getReq, getRes, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText } from './dx.js';
|
|
2
|
+
import { dxServer } from './dx.js';
|
|
3
|
+
export { getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
|
|
4
4
|
export { router } from './route.js';
|
|
5
|
+
export default dxServer;
|
package/cjs/index.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.router = exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.
|
|
4
|
-
var context_js_1 = require("./context.js");
|
|
5
|
-
Object.defineProperty(exports, "makeContext", { enumerable: true, get: function () { return context_js_1.makeContext; } });
|
|
6
|
-
Object.defineProperty(exports, "reqContext", { enumerable: true, get: function () { return context_js_1.reqContext; } });
|
|
7
|
-
Object.defineProperty(exports, "resContext", { enumerable: true, get: function () { return context_js_1.resContext; } });
|
|
3
|
+
exports.router = exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.setText = exports.setRedirect = exports.setBuffer = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setHtml = exports.getRes = exports.getReq = void 0;
|
|
8
4
|
var dx_js_1 = require("./dx.js");
|
|
9
|
-
Object.defineProperty(exports, "
|
|
5
|
+
Object.defineProperty(exports, "getReq", { enumerable: true, get: function () { return dx_js_1.getReq; } });
|
|
6
|
+
Object.defineProperty(exports, "getRes", { enumerable: true, get: function () { return dx_js_1.getRes; } });
|
|
10
7
|
Object.defineProperty(exports, "setHtml", { enumerable: true, get: function () { return dx_js_1.setHtml; } });
|
|
11
8
|
Object.defineProperty(exports, "setNodeStream", { enumerable: true, get: function () { return dx_js_1.setNodeStream; } });
|
|
12
9
|
Object.defineProperty(exports, "setWebStream", { enumerable: true, get: function () { return dx_js_1.setWebStream; } });
|
|
@@ -14,9 +11,8 @@ Object.defineProperty(exports, "setJson", { enumerable: true, get: function () {
|
|
|
14
11
|
Object.defineProperty(exports, "setBuffer", { enumerable: true, get: function () { return dx_js_1.setBuffer; } });
|
|
15
12
|
Object.defineProperty(exports, "setRedirect", { enumerable: true, get: function () { return dx_js_1.setRedirect; } });
|
|
16
13
|
Object.defineProperty(exports, "setText", { enumerable: true, get: function () { return dx_js_1.setText; } });
|
|
14
|
+
const dx_js_2 = require("./dx.js");
|
|
17
15
|
var body_js_1 = require("./body.js");
|
|
18
|
-
Object.defineProperty(exports, "setBufferBodyDefaultOptions", { enumerable: true, get: function () { return body_js_1.setBufferBodyDefaultOptions; } });
|
|
19
|
-
Object.defineProperty(exports, "getBuffer", { enumerable: true, get: function () { return body_js_1.getBuffer; } });
|
|
20
16
|
Object.defineProperty(exports, "getJson", { enumerable: true, get: function () { return body_js_1.getJson; } });
|
|
21
17
|
Object.defineProperty(exports, "getRaw", { enumerable: true, get: function () { return body_js_1.getRaw; } });
|
|
22
18
|
Object.defineProperty(exports, "getText", { enumerable: true, get: function () { return body_js_1.getText; } });
|
|
@@ -24,4 +20,5 @@ Object.defineProperty(exports, "getUrlEncoded", { enumerable: true, get: functio
|
|
|
24
20
|
Object.defineProperty(exports, "getQuery", { enumerable: true, get: function () { return body_js_1.getQuery; } });
|
|
25
21
|
var route_js_1 = require("./route.js");
|
|
26
22
|
Object.defineProperty(exports, "router", { enumerable: true, get: function () { return route_js_1.router; } });
|
|
27
|
-
|
|
23
|
+
exports.default = dx_js_2.dxServer;
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBVWdCO0FBVGYsK0ZBQUEsTUFBTSxPQUFBO0FBQ04sK0ZBQUEsTUFBTSxPQUFBO0FBQ04sZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBQ2IscUdBQUEsWUFBWSxPQUFBO0FBQ1osZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asa0dBQUEsU0FBUyxPQUFBO0FBQ1Qsb0dBQUEsV0FBVyxPQUFBO0FBQ1gsZ0dBQUEsT0FBTyxPQUFBO0FBRVIsbUNBQWdDO0FBQ2hDLHFDQU1rQjtBQUxqQixrR0FBQSxPQUFPLE9BQUE7QUFDUCxpR0FBQSxNQUFNLE9BQUE7QUFDTixrR0FBQSxPQUFPLE9BQUE7QUFDUCx3R0FBQSxhQUFhLE9BQUE7QUFDYixtR0FBQSxRQUFRLE9BQUE7QUFFVCx1Q0FBaUM7QUFBekIsa0dBQUEsTUFBTSxPQUFBO0FBRWQsa0JBQWUsZ0JBQVEsQ0FBQSJ9
|
package/cjs/route.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.router = exports.matchPattern = void 0;
|
|
4
4
|
const path_to_regexp_1 = require("path-to-regexp");
|
|
5
|
-
const
|
|
5
|
+
const dx_js_1 = require("./dx.js");
|
|
6
6
|
const cache = {};
|
|
7
7
|
const cacheLimit = 10000;
|
|
8
8
|
let cacheCount = 0;
|
|
@@ -52,7 +52,7 @@ const allMethods = [
|
|
|
52
52
|
exports.router = {
|
|
53
53
|
method(method, router, { prefix = '', ...options } = {}) {
|
|
54
54
|
return next => {
|
|
55
|
-
const req =
|
|
55
|
+
const req = (0, dx_js_1.getReq)();
|
|
56
56
|
if (req.method !== method.toUpperCase())
|
|
57
57
|
return next();
|
|
58
58
|
for (const [pattern, handler] of Object.entries(router)) {
|
|
@@ -68,7 +68,7 @@ exports.router = {
|
|
|
68
68
|
},
|
|
69
69
|
all(router, { prefix = '', ...options } = {}) {
|
|
70
70
|
return next => {
|
|
71
|
-
const req =
|
|
71
|
+
const req = (0, dx_js_1.getReq)();
|
|
72
72
|
for (const [pattern, handler] of Object.entries(router)) {
|
|
73
73
|
const match = matchPattern(req.url ?? '', `${prefix}${pattern}`, options);
|
|
74
74
|
if (match)
|
|
@@ -83,4 +83,4 @@ exports.router = {
|
|
|
83
83
|
};
|
|
84
84
|
for (const method of allMethods)
|
|
85
85
|
exports.router[method] = exports.router.method.bind(exports.router, method);
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQTJDO0FBQzNDLG1DQUE4QjtBQUU5QixNQUFNLEtBQUssR0FBd0IsRUFBRSxDQUFBO0FBQ3JDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQTtBQUN4QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7QUFjbEIsU0FBUyxXQUFXLENBQUMsSUFBWSxFQUFFLE9BQTRCO0lBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzNELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNDLE1BQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQTtJQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFBLDZCQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxNQUFNLE1BQU0sR0FBRztRQUNkLE1BQU07UUFDTixJQUFJO0tBQ0osQ0FBQTtJQUVELElBQUksVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUE7UUFDeEIsVUFBVSxFQUFFLENBQUE7SUFDYixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUMzQixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBNkI7SUFFN0IsT0FBTyxHQUFHLEVBQUMsR0FBRyxPQUFPLEVBQUMsQ0FBQTtJQUN0QixPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQTtJQUNwQixPQUFP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
|