dx-server 0.2.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -65
- package/cjs/body.d.ts +15 -38
- package/cjs/body.js +104 -75
- package/cjs/dx.d.ts +12 -58
- package/cjs/dx.js +130 -116
- 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/index.d.ts +4 -3
- package/cjs/index.js +13 -13
- package/cjs/route.js +4 -4
- package/cjs/static.js +4 -4
- package/esm/body.d.ts +15 -38
- package/esm/body.js +96 -74
- package/esm/dx.d.ts +12 -58
- package/esm/dx.js +126 -115
- 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/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 -6
- 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/README.md
CHANGED
|
@@ -14,28 +14,14 @@ Simple server
|
|
|
14
14
|
```javascript
|
|
15
15
|
import {Server} from 'node:http'
|
|
16
16
|
import chain from 'jchain'
|
|
17
|
-
import {
|
|
18
|
-
reqContext, resContext,
|
|
19
|
-
dxContext, setHtml, setJson, setText,
|
|
20
|
-
bufferBodyContext, jsonBodyContext, queryContext, rawBodyContext, textBodyContext, urlencodedBodyContext,
|
|
21
|
-
router,
|
|
22
|
-
} from 'dx-server'
|
|
17
|
+
import dxServer, {getReq, getRes, router, setHtml, setText,} from 'dx-server'
|
|
23
18
|
|
|
24
|
-
new Server().on('request',
|
|
25
|
-
|
|
26
|
-
reqContext.chain(req),
|
|
27
|
-
resContext.chain(res),
|
|
28
|
-
dxContext.chain(),
|
|
29
|
-
bufferBodyContext.chain(),
|
|
30
|
-
jsonBodyContext.chain(),
|
|
31
|
-
urlencodedBodyContext.chain(),
|
|
32
|
-
textBodyContext.chain(),
|
|
33
|
-
rawBodyContext.chain(),
|
|
34
|
-
queryContext.chain(),
|
|
19
|
+
new Server().on('request', (req, res) => chain(
|
|
20
|
+
dxServer(req, res),
|
|
35
21
|
next => {
|
|
36
|
-
|
|
37
|
-
console.log(
|
|
38
|
-
next()
|
|
22
|
+
getRes().setHeader('Cache-Control', 'no-cache')
|
|
23
|
+
console.log(getReq().method, getReq().url)
|
|
24
|
+
return next()
|
|
39
25
|
},
|
|
40
26
|
async next => {
|
|
41
27
|
try {await next()} catch (e) {
|
|
@@ -47,9 +33,9 @@ new Server().on('request', async (req, res) => {
|
|
|
47
33
|
'/'() {setHtml('hello world')},
|
|
48
34
|
'/health'() {setText('ok')}
|
|
49
35
|
}),
|
|
50
|
-
() => {
|
|
36
|
+
() => {setHtml('not found', {status: 404})},
|
|
51
37
|
)()
|
|
52
|
-
|
|
38
|
+
).listen(3000, () => console.log('server is listening at 3000'))
|
|
53
39
|
```
|
|
54
40
|
|
|
55
41
|
More complex server with express.
|
|
@@ -60,30 +46,16 @@ This sample additionally requires: `yarn install express morgan`
|
|
|
60
46
|
import {Server} from 'node:http'
|
|
61
47
|
import {promisify} from 'node:util'
|
|
62
48
|
import chain from 'jchain'
|
|
63
|
-
import {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
setJson,
|
|
69
|
-
setText,
|
|
70
|
-
setBuffer,
|
|
71
|
-
setRedirect,
|
|
72
|
-
setNodeStream,
|
|
73
|
-
setWebStream,
|
|
74
|
-
|
|
75
|
-
bufferBodyContext,
|
|
76
|
-
jsonBodyContext,
|
|
77
|
-
queryContext,
|
|
78
|
-
rawBodyContext,
|
|
79
|
-
textBodyContext,
|
|
80
|
-
urlencodedBodyContext,
|
|
81
|
-
|
|
82
|
-
router
|
|
49
|
+
import dxServer, {
|
|
50
|
+
getReq, getRes,
|
|
51
|
+
getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery,
|
|
52
|
+
setHtml, setJson, setText, setBuffer, setRedirect, setNodeStream, setWebStream,
|
|
53
|
+
router,
|
|
83
54
|
} from 'dx-server'
|
|
84
55
|
import {expressApp} from 'dx-server/express'
|
|
85
56
|
import express from 'express'
|
|
86
57
|
import morgan from 'morgan'
|
|
58
|
+
import {AsyncLocalStorage} from 'node:async_hooks'
|
|
87
59
|
|
|
88
60
|
// it is best practice to create custom error class for non-system error
|
|
89
61
|
class ServerError extends Error {
|
|
@@ -96,33 +68,22 @@ class ServerError extends Error {
|
|
|
96
68
|
}
|
|
97
69
|
}
|
|
98
70
|
|
|
99
|
-
|
|
100
|
-
const
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (req.headers.authorization) {
|
|
105
|
-
return {id: 1, name: 'joe'}
|
|
106
|
-
}
|
|
107
|
-
})
|
|
71
|
+
const authStorage = new AsyncLocalStorage()
|
|
72
|
+
const authChain = async next => {
|
|
73
|
+
const auth = getReq().headers.authorization ? {id: 1, name: 'joe'} : undefined
|
|
74
|
+
return authStorage.run(auth, next)
|
|
75
|
+
}
|
|
108
76
|
|
|
109
77
|
const requireAuth = () => {
|
|
110
|
-
if (!
|
|
78
|
+
if (!authStorage.getStore()) throw new ServerError('unauthorized', 401, 'unauthorized')
|
|
111
79
|
}
|
|
112
80
|
|
|
113
81
|
const serverChain = chain(
|
|
114
|
-
dxContext.chain({jsonBeautify: process.env.NODE_ENV !== 'production'}), // allows to use setHtml, setJson, setRaw, setBuffer, setFile, setRedirect, etc.
|
|
115
|
-
bufferBodyContext.chain(), // use raw buffer body as Buffer use bufferBodyContext.value. This is required for jsonBodyContext, urlencodedBodyContext, textBodyContext, rawBodyContext
|
|
116
|
-
jsonBodyContext.chain(), // to get body parsed as json use jsonBodyContext.value. Only available if content-type is application/json
|
|
117
|
-
urlencodedBodyContext.chain(), // to get body parsed as urlencoded use urlencodedBodyContext.value. Only available if content-type is application/x-www-form-urlencoded
|
|
118
|
-
textBodyContext.chain(), // to get body parsed as text use textBodyContext.value. Only available if content-type is text/plain
|
|
119
|
-
rawBodyContext.chain(), // to get body as raw use rawBodyContext.value. Only available if content-type is application/octet-stream
|
|
120
|
-
queryContext.chain(), // to get query params use queryContext.value. Query is parsed via 'qs' package. If no query, return empty object {}
|
|
121
82
|
next => {
|
|
122
83
|
// this is the difference between express and dx-server
|
|
123
84
|
// req, res can be accessed from anywhere via context which uses NodeJS's AsyncLocalStorage under the hood
|
|
124
|
-
|
|
125
|
-
next()
|
|
85
|
+
getRes().setHeader('Cache-Control', 'no-cache')
|
|
86
|
+
return next() // must return or await
|
|
126
87
|
},
|
|
127
88
|
async next => {// global error catching for all following middlewares
|
|
128
89
|
try {
|
|
@@ -141,7 +102,7 @@ const serverChain = chain(
|
|
|
141
102
|
app.use(morgan('common')) // in future, we will provide native implementation of express middlewares
|
|
142
103
|
app.use('/public', express.static('public'))
|
|
143
104
|
}),
|
|
144
|
-
|
|
105
|
+
authChain,
|
|
145
106
|
router.post({// example of catching error for all /api/* routes
|
|
146
107
|
async '/api'({next}) {
|
|
147
108
|
try {
|
|
@@ -167,7 +128,7 @@ const serverChain = chain(
|
|
|
167
128
|
},
|
|
168
129
|
'/api/me'() { // sample private router
|
|
169
130
|
requireAuth()
|
|
170
|
-
setJson({name:
|
|
131
|
+
setJson({name: authStorage.getStore().name})
|
|
171
132
|
},
|
|
172
133
|
}),
|
|
173
134
|
router.get({ // sample GET router
|
|
@@ -187,8 +148,7 @@ const tcpServer = new Server()
|
|
|
187
148
|
.on('request', async (req, res) => {
|
|
188
149
|
try {
|
|
189
150
|
await chain(
|
|
190
|
-
|
|
191
|
-
resContext.chain(res), // required for most middlewares
|
|
151
|
+
dxServer(req, res, {jsonBeautify: process.env.NODE_ENV !== 'production'}), // basic dx-server context
|
|
192
152
|
serverChain,
|
|
193
153
|
)()
|
|
194
154
|
} catch (e) {
|
|
@@ -205,3 +165,22 @@ Until these middlewares are available as native dx-server middlewares, express m
|
|
|
205
165
|
- [ ] native static file serve, like 'static-serve'
|
|
206
166
|
- [ ] logger like morgan
|
|
207
167
|
- [ ] cors
|
|
168
|
+
|
|
169
|
+
## Note:
|
|
170
|
+
`getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery` are all synchronous functions.
|
|
171
|
+
The associated results are calculated in the first time they are called and cached for subsequent calls.
|
|
172
|
+
|
|
173
|
+
If you want to get these values synchronously, you can do as follows:
|
|
174
|
+
```javascript
|
|
175
|
+
import {AsyncLocalStorage} from 'node:async_hooks'
|
|
176
|
+
import {getJson} from 'dx-server'
|
|
177
|
+
const jsonStorage = new AsyncLocalStorage()
|
|
178
|
+
|
|
179
|
+
chain(
|
|
180
|
+
async next => jsonStorage.run(await getJson(), next),
|
|
181
|
+
next => {
|
|
182
|
+
console.log(jsonContext.value) // json body can be accessed synchronously
|
|
183
|
+
return next()
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
```
|
package/cjs/body.d.ts
CHANGED
|
@@ -1,38 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
export
|
|
16
|
-
readonly value: Buffer | undefined;
|
|
17
|
-
chain(): <V>(next: () => V) => Promise<any>;
|
|
18
|
-
with(value: Buffer | undefined): <V_1>(next: () => V_1) => Promise<any>;
|
|
19
|
-
};
|
|
20
|
-
export declare const textBodyContext: {
|
|
21
|
-
readonly value: string | undefined;
|
|
22
|
-
chain(): <V>(next: () => V) => Promise<any>;
|
|
23
|
-
with(value: string | undefined): <V_1>(next: () => V_1) => Promise<any>;
|
|
24
|
-
};
|
|
25
|
-
export declare const urlencodedBodyContext: {
|
|
26
|
-
readonly value: import("qs").ParsedQs | undefined;
|
|
27
|
-
chain(params_0?: {
|
|
28
|
-
simplify?: boolean | undefined;
|
|
29
|
-
} | undefined): <V>(next: () => V) => Promise<any>;
|
|
30
|
-
with(value: import("qs").ParsedQs | undefined): <V_1>(next: () => V_1) => Promise<any>;
|
|
31
|
-
};
|
|
32
|
-
export declare const queryContext: {
|
|
33
|
-
readonly value: import("qs").ParsedQs;
|
|
34
|
-
chain(params_0?: {
|
|
35
|
-
simplify?: boolean | undefined;
|
|
36
|
-
} | undefined): <V>(next: () => V) => Promise<any>;
|
|
37
|
-
with(value: import("qs").ParsedQs): <V_1>(next: () => V_1) => Promise<any>;
|
|
38
|
-
};
|
|
1
|
+
interface BufferBodyOptions {
|
|
2
|
+
limit: number;
|
|
3
|
+
}
|
|
4
|
+
export declare function setBufferBodyDefaultOptions(options: Partial<BufferBodyOptions>): void;
|
|
5
|
+
export declare function getBuffer(options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
6
|
+
export declare function getJson(options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
7
|
+
export declare function getRaw(options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
8
|
+
export declare function getText(options?: Partial<BufferBodyOptions>): Promise<any>;
|
|
9
|
+
export declare function getUrlEncoded({ simplify, ...options }?: Partial<BufferBodyOptions> & {
|
|
10
|
+
simplify?: boolean;
|
|
11
|
+
}): Promise<any>;
|
|
12
|
+
export declare function getQuery({ simplify, ...options }?: Partial<BufferBodyOptions> & {
|
|
13
|
+
simplify?: boolean;
|
|
14
|
+
}): Promise<any>;
|
|
15
|
+
export {};
|
package/cjs/body.js
CHANGED
|
@@ -1,35 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.getBuffer = exports.setBufferBodyDefaultOptions = void 0;
|
|
4
4
|
const stream_js_1 = require("./stream.js");
|
|
5
5
|
const qs_1 = require("qs");
|
|
6
6
|
const contentType_js_1 = require("./contentType.js");
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
7
|
+
const dx_js_1 = require("./dx.js");
|
|
8
|
+
let bufferBodyDefaultOptions = { limit: 100 << 10 }; // 100kb
|
|
9
|
+
function setBufferBodyDefaultOptions(options) {
|
|
10
|
+
bufferBodyDefaultOptions = { ...bufferBodyDefaultOptions, ...options };
|
|
11
|
+
}
|
|
12
|
+
exports.setBufferBodyDefaultOptions = setBufferBodyDefaultOptions;
|
|
13
|
+
const bufferBodySymbol = Symbol('bufferBody');
|
|
14
|
+
async function getBuffer(options) {
|
|
15
|
+
const { limit } = { ...bufferBodyDefaultOptions, ...options };
|
|
16
|
+
const req = (0, dx_js_1.getReq)();
|
|
17
|
+
return req[bufferBodySymbol] ??= (async () => {
|
|
18
|
+
/**
|
|
19
|
+
* Check if a request has a request body.
|
|
20
|
+
* A request with a body __must__ either have `transfer-encoding`
|
|
21
|
+
* or `content-length` headers set.
|
|
22
|
+
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
|
|
23
|
+
*/
|
|
24
|
+
// https://github.com/jshttp/type-is/blob/cdcfe23e9833872e425b0aaf71ca0311373b6116/index.js#L92
|
|
25
|
+
const contentLengthParsed = parseInt(req.headers['content-length'] ?? '', 10);
|
|
26
|
+
if (req.headers['transfer-encoding'] === undefined
|
|
27
|
+
&& isNaN(contentLengthParsed))
|
|
28
|
+
return;
|
|
29
|
+
const contentLength = isNaN(contentLengthParsed) ? undefined : contentLengthParsed;
|
|
30
|
+
// read
|
|
31
|
+
const encoding = (req.headers['content-encoding'] ?? 'identity').toLowerCase();
|
|
32
|
+
const stream = (0, stream_js_1.getContentStream)(req, encoding);
|
|
33
|
+
return await (0, stream_js_1.readStream)(stream, {
|
|
34
|
+
length: encoding === 'identity' ? contentLength : undefined,
|
|
35
|
+
limit,
|
|
36
|
+
});
|
|
37
|
+
})();
|
|
38
|
+
}
|
|
39
|
+
exports.getBuffer = getBuffer;
|
|
40
|
+
// if content-type is not as expected, return undefined
|
|
41
|
+
function forceGetContentTypeParams(expected) {
|
|
42
|
+
const req = (0, dx_js_1.getReq)();
|
|
33
43
|
const contentTypeRaw = req.headers['content-type'];
|
|
34
44
|
if (!contentTypeRaw)
|
|
35
45
|
return;
|
|
@@ -37,8 +47,8 @@ const forceGetContentTypeParams = (expected) => {
|
|
|
37
47
|
if (mediaType !== expected)
|
|
38
48
|
return;
|
|
39
49
|
return parameters;
|
|
40
|
-
}
|
|
41
|
-
|
|
50
|
+
}
|
|
51
|
+
function forceGetCharset(expected) {
|
|
42
52
|
const parameters = forceGetContentTypeParams(expected);
|
|
43
53
|
if (!parameters)
|
|
44
54
|
return;
|
|
@@ -47,49 +57,68 @@ const forceGetCharset = (expected) => {
|
|
|
47
57
|
if (!charset.startsWith('utf-'))
|
|
48
58
|
throw new Error(`unsupported charset "${charset.toUpperCase()}"`);
|
|
49
59
|
return charset;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
60
|
+
}
|
|
61
|
+
const jsonBodySymbol = Symbol('jsonBody');
|
|
62
|
+
async function getJson(options) {
|
|
63
|
+
return (0, dx_js_1.getReq)()[jsonBodySymbol] ??= (async () => {
|
|
64
|
+
const charset = forceGetCharset('application/json');
|
|
65
|
+
if (!charset)
|
|
66
|
+
return;
|
|
67
|
+
const buffer = await getBuffer(options);
|
|
68
|
+
if (buffer) {
|
|
69
|
+
const str = buffer.toString(charset);
|
|
70
|
+
return str ? JSON.parse(str) : undefined;
|
|
71
|
+
}
|
|
72
|
+
})();
|
|
73
|
+
}
|
|
74
|
+
exports.getJson = getJson;
|
|
75
|
+
const rawBodySymbol = Symbol('rawBody');
|
|
76
|
+
async function getRaw(options) {
|
|
77
|
+
return (0, dx_js_1.getReq)()[rawBodySymbol] ??= (async () => {
|
|
78
|
+
if (!forceGetContentTypeParams('application/octet-stream'))
|
|
79
|
+
return;
|
|
80
|
+
return await getBuffer(options);
|
|
81
|
+
})();
|
|
82
|
+
}
|
|
83
|
+
exports.getRaw = getRaw;
|
|
84
|
+
const textBodySymbol = Symbol('textBody');
|
|
85
|
+
async function getText(options) {
|
|
86
|
+
return (0, dx_js_1.getReq)()[textBodySymbol] ??= (async () => {
|
|
87
|
+
const charset = forceGetCharset('text/plain');
|
|
88
|
+
if (!charset)
|
|
89
|
+
return;
|
|
90
|
+
const buffer = await getBuffer(options);
|
|
91
|
+
if (buffer)
|
|
92
|
+
return buffer.toString(charset);
|
|
93
|
+
})();
|
|
94
|
+
}
|
|
95
|
+
exports.getText = getText;
|
|
96
|
+
const urlEncodedBodySymbol = Symbol('urlencodedBody');
|
|
97
|
+
async function getUrlEncoded({ simplify, ...options } = {}) {
|
|
98
|
+
return (0, dx_js_1.getReq)()[urlEncodedBodySymbol] ??= (async () => {
|
|
99
|
+
const charset = forceGetCharset('application/x-www-form-urlencoded');
|
|
100
|
+
if (!charset)
|
|
101
|
+
return;
|
|
102
|
+
const buffer = await getBuffer(options);
|
|
103
|
+
if (buffer) {
|
|
104
|
+
const str = buffer.toString(charset);
|
|
105
|
+
return simplify
|
|
106
|
+
? Object.fromEntries(new URLSearchParams(str))
|
|
107
|
+
: (0, qs_1.parse)(str);
|
|
108
|
+
}
|
|
109
|
+
})();
|
|
110
|
+
}
|
|
111
|
+
exports.getUrlEncoded = getUrlEncoded;
|
|
112
|
+
const querySymbol = Symbol('query');
|
|
113
|
+
async function getQuery({ simplify, ...options } = {}) {
|
|
114
|
+
return (0, dx_js_1.getReq)()[querySymbol] ??= (async () => {
|
|
115
|
+
const query = (0, dx_js_1.getReq)().url?.split('?', 2)?.[1];
|
|
116
|
+
return query
|
|
117
|
+
? simplify
|
|
118
|
+
? Object.fromEntries(new URLSearchParams(query))
|
|
119
|
+
: (0, qs_1.parse)(query)
|
|
120
|
+
: {};
|
|
121
|
+
})();
|
|
122
|
+
}
|
|
123
|
+
exports.getQuery = getQuery;
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3RDtBQUN4RCwyQkFBd0I7QUFDeEIscURBQWlEO0FBQ2pELG1DQUE4QjtBQUs5QixJQUFJLHdCQUF3QixHQUFzQixFQUFDLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxFQUFDLENBQUEsQ0FBQyxRQUFRO0FBQzdFLFNBQWdCLDJCQUEyQixDQUFDLE9BQW1DO0lBQzlFLHdCQUF3QixHQUFHLEVBQUMsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0FBQ3JFLENBQUM7QUFGRCxrRUFFQztBQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0FBQ3RDLEtBQUssVUFBVSxTQUFTLENBQUMsT0FBb0M7SUFDbkUsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEVBQUMsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0lBQ3pELE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTSxHQUFFLENBQUE7SUFDcEIsT0FBTyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQzVDOzs7OztXQUtHO1FBQ0YsK0ZBQStGO1FBQ2hHLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDN0UsSUFDQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUztlQUMzQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDNUIsT0FBTTtRQUNSLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFBO1FBRWxGLE9B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
|
package/cjs/dx.d.ts
CHANGED
|
@@ -1,64 +1,17 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
4
|
import { Readable } from 'node:stream';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
data: string;
|
|
15
|
-
} | {
|
|
16
|
-
type: 'buffer';
|
|
17
|
-
data: Buffer;
|
|
18
|
-
} | {
|
|
19
|
-
type: 'json';
|
|
20
|
-
data: any;
|
|
21
|
-
} | {
|
|
22
|
-
type: 'redirect';
|
|
23
|
-
data: string;
|
|
24
|
-
} | {
|
|
25
|
-
type: 'nodeStream';
|
|
26
|
-
data: Readable;
|
|
27
|
-
} | {
|
|
28
|
-
type: 'webStream';
|
|
29
|
-
data: ReadableStream;
|
|
30
|
-
});
|
|
31
|
-
chain(params_0?: {
|
|
32
|
-
jsonBeautify?: boolean | undefined;
|
|
33
|
-
disableEtag?: boolean | undefined;
|
|
34
|
-
} | undefined): <V>(next: () => V) => Promise<any>;
|
|
35
|
-
with(value: {
|
|
36
|
-
charset?: BufferEncoding | undefined;
|
|
37
|
-
jsonBeautify?: boolean | undefined;
|
|
38
|
-
disableEtag?: boolean | undefined;
|
|
39
|
-
} & ({
|
|
40
|
-
type: 'text';
|
|
41
|
-
data: string;
|
|
42
|
-
} | {
|
|
43
|
-
type: 'html';
|
|
44
|
-
data: string;
|
|
45
|
-
} | {
|
|
46
|
-
type: 'buffer';
|
|
47
|
-
data: Buffer;
|
|
48
|
-
} | {
|
|
49
|
-
type: 'json';
|
|
50
|
-
data: any;
|
|
51
|
-
} | {
|
|
52
|
-
type: 'redirect';
|
|
53
|
-
data: string;
|
|
54
|
-
} | {
|
|
55
|
-
type: 'nodeStream';
|
|
56
|
-
data: Readable;
|
|
57
|
-
} | {
|
|
58
|
-
type: 'webStream';
|
|
59
|
-
data: ReadableStream;
|
|
60
|
-
})): <V_1>(next: () => V_1) => Promise<any>;
|
|
61
|
-
};
|
|
5
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
+
interface Chainable<P extends any[] = any[], R = any, Next = (...np: any[]) => any> {
|
|
7
|
+
(next: Next, ...p: P): R;
|
|
8
|
+
}
|
|
9
|
+
export declare function dxServer(req: IncomingMessage, res: ServerResponse, options?: {
|
|
10
|
+
jsonBeautify?: boolean;
|
|
11
|
+
disableEtag?: boolean;
|
|
12
|
+
}): Chainable;
|
|
13
|
+
export declare function getReq(): IncomingMessage;
|
|
14
|
+
export declare function getRes(): ServerResponse;
|
|
62
15
|
export declare function setText(text: string, { status }?: {
|
|
63
16
|
status?: number;
|
|
64
17
|
}): void;
|
|
@@ -79,3 +32,4 @@ export declare function setJson(json: any, { status, beautify }?: {
|
|
|
79
32
|
beautify?: boolean;
|
|
80
33
|
}): void;
|
|
81
34
|
export declare function setRedirect(url: string, status: 301 | 302): void;
|
|
35
|
+
export {};
|