dx-server 0.2.0 → 0.4.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 +68 -107
- package/cjs/body.d.ts +15 -38
- package/cjs/body.js +101 -72
- package/cjs/index.d.ts +2 -2
- package/cjs/index.js +11 -8
- package/esm/body.d.ts +15 -38
- package/esm/body.js +94 -72
- package/esm/index.d.ts +2 -2
- package/esm/index.js +3 -3
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -9,34 +9,56 @@ yarn add dx-server jchain
|
|
|
9
9
|
|
|
10
10
|
Check below sample with comment for more details.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Simple server
|
|
13
13
|
|
|
14
14
|
```javascript
|
|
15
|
-
import {Server} from 'http'
|
|
16
|
-
import
|
|
15
|
+
import {Server} from 'node:http'
|
|
16
|
+
import chain from 'jchain'
|
|
17
|
+
import {reqContext, resContext, dxContext, setHtml, setText, router,} from 'dx-server'
|
|
18
|
+
|
|
19
|
+
new Server().on('request', async (req, res) => {
|
|
20
|
+
await chain(
|
|
21
|
+
reqContext.chain(req),
|
|
22
|
+
resContext.chain(res),
|
|
23
|
+
dxContext.chain(),
|
|
24
|
+
next => {
|
|
25
|
+
resContext.value.setHeader('Cache-Control', 'no-cache')
|
|
26
|
+
console.log(reqContext.value.method, reqContext.value.url)
|
|
27
|
+
next()
|
|
28
|
+
},
|
|
29
|
+
async next => {
|
|
30
|
+
try {await next()} catch (e) {
|
|
31
|
+
console.error(e)
|
|
32
|
+
setHtml('internal server error (code: internal)', {status: 500})
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
router.get({
|
|
36
|
+
'/'() {setHtml('hello world')},
|
|
37
|
+
'/health'() {setText('ok')}
|
|
38
|
+
}),
|
|
39
|
+
() => {setHtml('not found', {status: 404})},
|
|
40
|
+
)()
|
|
41
|
+
}).listen(3000, () => console.log('server is listening at 3000'))
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
More complex server with express.
|
|
45
|
+
This sample additionally requires: `yarn install express morgan`
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
```javascript
|
|
49
|
+
import {Server} from 'node:http'
|
|
50
|
+
import {promisify} from 'node:util'
|
|
17
51
|
import chain from 'jchain'
|
|
18
52
|
import {
|
|
19
53
|
makeContext, reqContext, resContext,
|
|
20
54
|
|
|
21
55
|
dxContext,
|
|
22
|
-
|
|
23
|
-
setJson,
|
|
24
|
-
setText,
|
|
25
|
-
setBuffer,
|
|
26
|
-
setRedirect,
|
|
27
|
-
setNodeStream,
|
|
28
|
-
setWebStream,
|
|
29
|
-
|
|
30
|
-
bufferBodyContext,
|
|
31
|
-
jsonBodyContext,
|
|
32
|
-
queryContext,
|
|
33
|
-
rawBodyContext,
|
|
34
|
-
textBodyContext,
|
|
35
|
-
urlencodedBodyContext,
|
|
56
|
+
getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery,
|
|
57
|
+
setHtml, setJson, setText, setBuffer, setRedirect, setNodeStream, setWebStream,
|
|
36
58
|
|
|
37
59
|
router
|
|
38
60
|
} from 'dx-server'
|
|
39
|
-
import {expressApp
|
|
61
|
+
import {expressApp} from 'dx-server/express'
|
|
40
62
|
import express from 'express'
|
|
41
63
|
import morgan from 'morgan'
|
|
42
64
|
|
|
@@ -66,68 +88,40 @@ const requireAuth = () => {
|
|
|
66
88
|
}
|
|
67
89
|
|
|
68
90
|
const serverChain = chain(
|
|
69
|
-
dxContext.chain({jsonBeautify: true}), // allows to use setHtml, setJson, setRaw, setBuffer, setFile, setRedirect, etc.
|
|
70
|
-
bufferBodyContext.chain(), // use raw buffer body as Buffer use bufferBodyContext.value. This is required for jsonBodyContext, urlencodedBodyContext, textBodyContext, rawBodyContext
|
|
71
|
-
jsonBodyContext.chain(), // to get body parsed as json use jsonBodyContext.value. Only available if content-type is application/json
|
|
72
|
-
urlencodedBodyContext.chain(), // to get body parsed as urlencoded use urlencodedBodyContext.value. Only available if content-type is application/x-www-form-urlencoded
|
|
73
|
-
textBodyContext.chain(), // to get body parsed as text use textBodyContext.value. Only available if content-type is text/plain
|
|
74
|
-
rawBodyContext.chain(), // to get body as raw use rawBodyContext.value. Only available if content-type is application/octet-stream
|
|
75
|
-
queryContext.chain(), // to get query params use queryContext.value. Query is parsed via 'qs' package. If no query, return empty object {}
|
|
76
91
|
next => {
|
|
77
92
|
// this is the difference between express and dx-server
|
|
78
93
|
// req, res can be accessed from anywhere via context which uses NodeJS's AsyncLocalStorage under the hood
|
|
79
94
|
resContext.value.setHeader('Cache-Control', 'no-cache')
|
|
80
|
-
next()
|
|
95
|
+
return next() // must return or await
|
|
81
96
|
},
|
|
82
|
-
async next => {
|
|
83
|
-
// global error catching for all following middlewares
|
|
97
|
+
async next => {// global error catching for all following middlewares
|
|
84
98
|
try {
|
|
85
99
|
await next()
|
|
86
|
-
} catch (e) {
|
|
87
|
-
// only app error message should be shown to user
|
|
100
|
+
} catch (e) {// only app error message should be shown to user
|
|
88
101
|
if (e instanceof ServerError) setHtml(`${e.message} (code: ${e.code})`, {status: e.status})
|
|
89
|
-
else {
|
|
90
|
-
// report system error
|
|
102
|
+
else {// report system error
|
|
91
103
|
console.error(e)
|
|
92
104
|
setHtml('internal server error (code: internal)', {status: 500})
|
|
93
105
|
}
|
|
94
106
|
}
|
|
95
107
|
},
|
|
96
|
-
await expressApp(app => {
|
|
97
|
-
// any express feature can be used
|
|
98
|
-
// required express installed, with for e.g., `yarn add express`
|
|
108
|
+
await expressApp(app => {// any express feature can be used. This requires express installed, with for e.g., `yarn add express`
|
|
99
109
|
app.set('trust proxy', true)
|
|
100
110
|
if (process.env.NODE_ENV !== 'production') app.set('json spaces', 2)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
morgan('common'), // in future, we will provide native implementation of express middlewares
|
|
104
|
-
// cookies, session, etc.
|
|
105
|
-
// session({
|
|
106
|
-
// secret: '123',
|
|
107
|
-
// resave: false,
|
|
108
|
-
// store: redisStore,
|
|
109
|
-
// saveUninitialized: true,
|
|
110
|
-
// // cookie: { secure: true }
|
|
111
|
-
// }),
|
|
112
|
-
),
|
|
113
|
-
await expressRouter(router => {
|
|
114
|
-
// setup express router
|
|
115
|
-
router.use('/public', express.static('public'))
|
|
111
|
+
app.use(morgan('common')) // in future, we will provide native implementation of express middlewares
|
|
112
|
+
app.use('/public', express.static('public'))
|
|
116
113
|
}),
|
|
117
114
|
authContext.chain(),
|
|
118
|
-
// example of catching error for all /api/* routes
|
|
119
|
-
router.post({
|
|
115
|
+
router.post({// example of catching error for all /api/* routes
|
|
120
116
|
async '/api'({next}) {
|
|
121
117
|
try {
|
|
122
118
|
await next()
|
|
123
119
|
} catch (e) {
|
|
124
|
-
// only app error message should be shown to user
|
|
125
|
-
if (e instanceof ServerError) setJson({
|
|
120
|
+
if (e instanceof ServerError) setJson({// only app error message should be shown to user
|
|
126
121
|
error: e.message,
|
|
127
122
|
code: e.code,
|
|
128
123
|
}, {status: e.status})
|
|
129
|
-
else {
|
|
130
|
-
// report system error
|
|
124
|
+
else {// report system error
|
|
131
125
|
console.error(e)
|
|
132
126
|
setJson({
|
|
133
127
|
message: 'internal server error',
|
|
@@ -154,11 +148,6 @@ const serverChain = chain(
|
|
|
154
148
|
setHtml('ok')
|
|
155
149
|
}
|
|
156
150
|
}),
|
|
157
|
-
router.post({ // api not found router
|
|
158
|
-
'/api'() {
|
|
159
|
-
throw new ServerError('not found', 404, 'not_found')
|
|
160
|
-
}
|
|
161
|
-
}, {end: false}),
|
|
162
151
|
() => { // not found router
|
|
163
152
|
throw new ServerError('not found', 404, 'not_found')
|
|
164
153
|
},
|
|
@@ -170,6 +159,7 @@ const tcpServer = new Server()
|
|
|
170
159
|
await chain(
|
|
171
160
|
reqContext.chain(req), // required for most middlewares
|
|
172
161
|
resContext.chain(res), // required for most middlewares
|
|
162
|
+
dxContext.chain({jsonBeautify: process.env.NODE_ENV !== 'production'}), // basic dx-server context
|
|
173
163
|
serverChain,
|
|
174
164
|
)()
|
|
175
165
|
} catch (e) {
|
|
@@ -177,56 +167,27 @@ const tcpServer = new Server()
|
|
|
177
167
|
}
|
|
178
168
|
})
|
|
179
169
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
console.log(`server is listening at ${port}`)
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
Sample error boundary chains:
|
|
186
|
-
```typescript
|
|
187
|
-
import { type Chainable } from 'jchain'
|
|
188
|
-
import {setHtml, setJson} from 'dx-server'
|
|
189
|
-
import {router} from 'dx-server'
|
|
190
|
-
|
|
191
|
-
export const catchError: Chainable = async next => {
|
|
192
|
-
try {
|
|
193
|
-
await next()
|
|
194
|
-
} catch (e) {
|
|
195
|
-
console.error(e)
|
|
196
|
-
setHtml('internal server error', {status: 500})
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export const catchApiError: Chainable = router.post({
|
|
201
|
-
async '/api'({next}) {
|
|
202
|
-
try {
|
|
203
|
-
await next()
|
|
204
|
-
} catch (e) {
|
|
205
|
-
console.error(e)
|
|
206
|
-
setJson({
|
|
207
|
-
message: 'internal server error',
|
|
208
|
-
code: 'internal_server_error'
|
|
209
|
-
}, {status: 500})
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}, {end: false})
|
|
213
|
-
|
|
214
|
-
export const notFound: Chainable = () => {
|
|
215
|
-
setHtml('not found', {status: 404})
|
|
216
|
-
}
|
|
217
|
-
export const notFoundApi: Chainable = router.post({
|
|
218
|
-
'/api'() {
|
|
219
|
-
setJson({
|
|
220
|
-
message: 'not found',
|
|
221
|
-
code: 'not_found'
|
|
222
|
-
}, {status: 404})
|
|
223
|
-
}
|
|
224
|
-
}, {end: false})
|
|
170
|
+
await promisify(tcpServer.listen.bind(tcpServer))(3000)
|
|
171
|
+
console.log('server is listening at 3000')
|
|
225
172
|
```
|
|
226
173
|
|
|
227
174
|
## TODO
|
|
228
175
|
Until these middlewares are available as native dx-server middlewares, express middlewares can be used with `expressApp()`
|
|
229
176
|
- [ ] native static file serve, like 'static-serve'
|
|
230
177
|
- [ ] logger like morgan
|
|
231
|
-
- [ ] cookie, session
|
|
232
178
|
- [ ] cors
|
|
179
|
+
|
|
180
|
+
## Note:
|
|
181
|
+
`getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery` are all synchronous functions.
|
|
182
|
+
The associated results are calculated in the first time they are called and cached for subsequent calls.
|
|
183
|
+
|
|
184
|
+
If you want to get these values synchronously, you can do as follows:
|
|
185
|
+
```javascript
|
|
186
|
+
import {makeContext, getJson} from 'dx-server'
|
|
187
|
+
const jsonContext = makeContext(() => getJson())
|
|
188
|
+
|
|
189
|
+
chain(jsonContext.chain(), next => {
|
|
190
|
+
console.log(jsonContext.value) // json body can be accessed synchronously
|
|
191
|
+
return next()
|
|
192
|
+
})
|
|
193
|
+
```
|
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,34 +1,44 @@
|
|
|
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
7
|
const context_js_1 = require("./context.js");
|
|
8
|
-
|
|
9
|
-
|
|
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 };
|
|
10
16
|
const req = context_js_1.reqContext.value;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
});
|
|
31
|
-
|
|
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) {
|
|
32
42
|
const req = context_js_1.reqContext.value;
|
|
33
43
|
const contentTypeRaw = req.headers['content-type'];
|
|
34
44
|
if (!contentTypeRaw)
|
|
@@ -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 context_js_1.reqContext.value[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 context_js_1.reqContext.value[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 context_js_1.reqContext.value[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 context_js_1.reqContext.value[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 context_js_1.reqContext.value[querySymbol] ??= (async () => {
|
|
115
|
+
const query = context_js_1.reqContext.value.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3RDtBQUN4RCwyQkFBd0I7QUFDeEIscURBQWlEO0FBQ2pELDZDQUF1QztBQUt2QyxJQUFJLHdCQUF3QixHQUFzQixFQUFDLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxFQUFDLENBQUEsQ0FBQyxRQUFRO0FBQzdFLFNBQWdCLDJCQUEyQixDQUFDLE9BQW1DO0lBQzlFLHdCQUF3QixHQUFHLEVBQUMsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0FBQ3JFLENBQUM7QUFGRCxrRUFFQztBQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0FBQ3RDLEtBQUssVUFBVSxTQUFTLENBQUMsT0FBb0M7SUFDbkUsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEVBQUMsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0lBQ3pELE1BQU0sR0FBRyxHQUFHLHVCQUFVLENBQUMsS0FBSyxDQUFBO0lBQzVCLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUM1Qzs7Ozs7V0FLRztRQUNGLCtGQUErRjtRQUNoRyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzdFLElBQ0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLFNBQVM7ZUFDM0MsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1lBQzVCLE9BQU07UUFDUixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQTtRQUVsRixP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
|
package/cjs/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { makeContext, reqContext, resContext } from './context.js';
|
|
2
|
-
export { dxContext, setHtml, setJson, setBuffer, setRedirect, setText } from './dx.js';
|
|
3
|
-
export {
|
|
2
|
+
export { dxContext, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText } from './dx.js';
|
|
3
|
+
export { setBufferBodyDefaultOptions, getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
|
|
4
4
|
export { router } from './route.js';
|
package/cjs/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.router = exports.
|
|
3
|
+
exports.router = exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.getBuffer = exports.setBufferBodyDefaultOptions = exports.setText = exports.setRedirect = exports.setBuffer = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setHtml = exports.dxContext = exports.resContext = exports.reqContext = exports.makeContext = void 0;
|
|
4
4
|
var context_js_1 = require("./context.js");
|
|
5
5
|
Object.defineProperty(exports, "makeContext", { enumerable: true, get: function () { return context_js_1.makeContext; } });
|
|
6
6
|
Object.defineProperty(exports, "reqContext", { enumerable: true, get: function () { return context_js_1.reqContext; } });
|
|
@@ -8,17 +8,20 @@ Object.defineProperty(exports, "resContext", { enumerable: true, get: function (
|
|
|
8
8
|
var dx_js_1 = require("./dx.js");
|
|
9
9
|
Object.defineProperty(exports, "dxContext", { enumerable: true, get: function () { return dx_js_1.dxContext; } });
|
|
10
10
|
Object.defineProperty(exports, "setHtml", { enumerable: true, get: function () { return dx_js_1.setHtml; } });
|
|
11
|
+
Object.defineProperty(exports, "setNodeStream", { enumerable: true, get: function () { return dx_js_1.setNodeStream; } });
|
|
12
|
+
Object.defineProperty(exports, "setWebStream", { enumerable: true, get: function () { return dx_js_1.setWebStream; } });
|
|
11
13
|
Object.defineProperty(exports, "setJson", { enumerable: true, get: function () { return dx_js_1.setJson; } });
|
|
12
14
|
Object.defineProperty(exports, "setBuffer", { enumerable: true, get: function () { return dx_js_1.setBuffer; } });
|
|
13
15
|
Object.defineProperty(exports, "setRedirect", { enumerable: true, get: function () { return dx_js_1.setRedirect; } });
|
|
14
16
|
Object.defineProperty(exports, "setText", { enumerable: true, get: function () { return dx_js_1.setText; } });
|
|
15
17
|
var body_js_1 = require("./body.js");
|
|
16
|
-
Object.defineProperty(exports, "
|
|
17
|
-
Object.defineProperty(exports, "
|
|
18
|
-
Object.defineProperty(exports, "
|
|
19
|
-
Object.defineProperty(exports, "
|
|
20
|
-
Object.defineProperty(exports, "
|
|
21
|
-
Object.defineProperty(exports, "
|
|
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
|
+
Object.defineProperty(exports, "getJson", { enumerable: true, get: function () { return body_js_1.getJson; } });
|
|
21
|
+
Object.defineProperty(exports, "getRaw", { enumerable: true, get: function () { return body_js_1.getRaw; } });
|
|
22
|
+
Object.defineProperty(exports, "getText", { enumerable: true, get: function () { return body_js_1.getText; } });
|
|
23
|
+
Object.defineProperty(exports, "getUrlEncoded", { enumerable: true, get: function () { return body_js_1.getUrlEncoded; } });
|
|
24
|
+
Object.defineProperty(exports, "getQuery", { enumerable: true, get: function () { return body_js_1.getQuery; } });
|
|
22
25
|
var route_js_1 = require("./route.js");
|
|
23
26
|
Object.defineProperty(exports, "router", { enumerable: true, get: function () { return route_js_1.router; } });
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQWdFO0FBQXhELHlHQUFBLFdBQVcsT0FBQTtBQUFFLHdHQUFBLFVBQVUsT0FBQTtBQUFFLHdHQUFBLFVBQVUsT0FBQTtBQUMzQyxpQ0FTZ0I7QUFSZixrR0FBQSxTQUFTLE9BQUE7QUFDVCxnR0FBQSxPQUFPLE9BQUE7QUFDUCxzR0FBQSxhQUFhLE9BQUE7QUFDYixxR0FBQSxZQUFZLE9BQUE7QUFDWixnR0FBQSxPQUFPLE9BQUE7QUFDUCxrR0FBQSxTQUFTLE9BQUE7QUFDVCxvR0FBQSxXQUFXLE9BQUE7QUFDWCxnR0FBQSxPQUFPLE9BQUE7QUFFUixxQ0FRa0I7QUFQakIsc0hBQUEsMkJBQTJCLE9BQUE7QUFDM0Isb0dBQUEsU0FBUyxPQUFBO0FBQ1Qsa0dBQUEsT0FBTyxPQUFBO0FBQ1AsaUdBQUEsTUFBTSxPQUFBO0FBQ04sa0dBQUEsT0FBTyxPQUFBO0FBQ1Asd0dBQUEsYUFBYSxPQUFBO0FBQ2IsbUdBQUEsUUFBUSxPQUFBO0FBRVQsdUNBQWlDO0FBQXpCLGtHQUFBLE1BQU0sT0FBQSJ9
|
package/esm/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/esm/body.js
CHANGED
|
@@ -1,31 +1,39 @@
|
|
|
1
1
|
import { getContentStream, readStream } from './stream.js';
|
|
2
2
|
import { parse } from 'qs';
|
|
3
3
|
import { parseContentType } from './contentType.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import { reqContext } from './context.js';
|
|
5
|
+
let bufferBodyDefaultOptions = { limit: 100 << 10 }; // 100kb
|
|
6
|
+
export function setBufferBodyDefaultOptions(options) {
|
|
7
|
+
bufferBodyDefaultOptions = { ...bufferBodyDefaultOptions, ...options };
|
|
8
|
+
}
|
|
9
|
+
const bufferBodySymbol = Symbol('bufferBody');
|
|
10
|
+
export async function getBuffer(options) {
|
|
11
|
+
const { limit } = { ...bufferBodyDefaultOptions, ...options };
|
|
7
12
|
const req = reqContext.value;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
});
|
|
28
|
-
|
|
13
|
+
return req[bufferBodySymbol] ??= (async () => {
|
|
14
|
+
/**
|
|
15
|
+
* Check if a request has a request body.
|
|
16
|
+
* A request with a body __must__ either have `transfer-encoding`
|
|
17
|
+
* or `content-length` headers set.
|
|
18
|
+
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
|
|
19
|
+
*/
|
|
20
|
+
// https://github.com/jshttp/type-is/blob/cdcfe23e9833872e425b0aaf71ca0311373b6116/index.js#L92
|
|
21
|
+
const contentLengthParsed = parseInt(req.headers['content-length'] ?? '', 10);
|
|
22
|
+
if (req.headers['transfer-encoding'] === undefined
|
|
23
|
+
&& isNaN(contentLengthParsed))
|
|
24
|
+
return;
|
|
25
|
+
const contentLength = isNaN(contentLengthParsed) ? undefined : contentLengthParsed;
|
|
26
|
+
// read
|
|
27
|
+
const encoding = (req.headers['content-encoding'] ?? 'identity').toLowerCase();
|
|
28
|
+
const stream = getContentStream(req, encoding);
|
|
29
|
+
return await readStream(stream, {
|
|
30
|
+
length: encoding === 'identity' ? contentLength : undefined,
|
|
31
|
+
limit,
|
|
32
|
+
});
|
|
33
|
+
})();
|
|
34
|
+
}
|
|
35
|
+
// if content-type is not as expected, return undefined
|
|
36
|
+
function forceGetContentTypeParams(expected) {
|
|
29
37
|
const req = reqContext.value;
|
|
30
38
|
const contentTypeRaw = req.headers['content-type'];
|
|
31
39
|
if (!contentTypeRaw)
|
|
@@ -34,8 +42,8 @@ const forceGetContentTypeParams = (expected) => {
|
|
|
34
42
|
if (mediaType !== expected)
|
|
35
43
|
return;
|
|
36
44
|
return parameters;
|
|
37
|
-
}
|
|
38
|
-
|
|
45
|
+
}
|
|
46
|
+
function forceGetCharset(expected) {
|
|
39
47
|
const parameters = forceGetContentTypeParams(expected);
|
|
40
48
|
if (!parameters)
|
|
41
49
|
return;
|
|
@@ -44,49 +52,63 @@ const forceGetCharset = (expected) => {
|
|
|
44
52
|
if (!charset.startsWith('utf-'))
|
|
45
53
|
throw new Error(`unsupported charset "${charset.toUpperCase()}"`);
|
|
46
54
|
return charset;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
55
|
+
}
|
|
56
|
+
const jsonBodySymbol = Symbol('jsonBody');
|
|
57
|
+
export async function getJson(options) {
|
|
58
|
+
return reqContext.value[jsonBodySymbol] ??= (async () => {
|
|
59
|
+
const charset = forceGetCharset('application/json');
|
|
60
|
+
if (!charset)
|
|
61
|
+
return;
|
|
62
|
+
const buffer = await getBuffer(options);
|
|
63
|
+
if (buffer) {
|
|
64
|
+
const str = buffer.toString(charset);
|
|
65
|
+
return str ? JSON.parse(str) : undefined;
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
}
|
|
69
|
+
const rawBodySymbol = Symbol('rawBody');
|
|
70
|
+
export async function getRaw(options) {
|
|
71
|
+
return reqContext.value[rawBodySymbol] ??= (async () => {
|
|
72
|
+
if (!forceGetContentTypeParams('application/octet-stream'))
|
|
73
|
+
return;
|
|
74
|
+
return await getBuffer(options);
|
|
75
|
+
})();
|
|
76
|
+
}
|
|
77
|
+
const textBodySymbol = Symbol('textBody');
|
|
78
|
+
export async function getText(options) {
|
|
79
|
+
return reqContext.value[textBodySymbol] ??= (async () => {
|
|
80
|
+
const charset = forceGetCharset('text/plain');
|
|
81
|
+
if (!charset)
|
|
82
|
+
return;
|
|
83
|
+
const buffer = await getBuffer(options);
|
|
84
|
+
if (buffer)
|
|
85
|
+
return buffer.toString(charset);
|
|
86
|
+
})();
|
|
87
|
+
}
|
|
88
|
+
const urlEncodedBodySymbol = Symbol('urlencodedBody');
|
|
89
|
+
export async function getUrlEncoded({ simplify, ...options } = {}) {
|
|
90
|
+
return reqContext.value[urlEncodedBodySymbol] ??= (async () => {
|
|
91
|
+
const charset = forceGetCharset('application/x-www-form-urlencoded');
|
|
92
|
+
if (!charset)
|
|
93
|
+
return;
|
|
94
|
+
const buffer = await getBuffer(options);
|
|
95
|
+
if (buffer) {
|
|
96
|
+
const str = buffer.toString(charset);
|
|
97
|
+
return simplify
|
|
98
|
+
? Object.fromEntries(new URLSearchParams(str))
|
|
99
|
+
: parse(str);
|
|
100
|
+
}
|
|
101
|
+
})();
|
|
102
|
+
}
|
|
103
|
+
const querySymbol = Symbol('query');
|
|
104
|
+
export async function getQuery({ simplify, ...options } = {}) {
|
|
105
|
+
return reqContext.value[querySymbol] ??= (async () => {
|
|
106
|
+
const query = reqContext.value.url?.split('?', 2)?.[1];
|
|
107
|
+
return query
|
|
108
|
+
? simplify
|
|
109
|
+
? Object.fromEntries(new URLSearchParams(query))
|
|
110
|
+
: parse(query)
|
|
111
|
+
: {};
|
|
112
|
+
})();
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDeEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLElBQUksQ0FBQTtBQUN4QixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBS3ZDLElBQUksd0JBQXdCLEdBQXNCLEVBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUMsQ0FBQSxDQUFDLFFBQVE7QUFDN0UsTUFBTSxVQUFVLDJCQUEyQixDQUFDLE9BQW1DO0lBQzlFLHdCQUF3QixHQUFHLEVBQUMsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0FBQ3JFLENBQUM7QUFDRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUM3QyxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxPQUFvQztJQUNuRSxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsRUFBQyxHQUFHLHdCQUF3QixFQUFFLEdBQUcsT0FBTyxFQUFDLENBQUE7SUFDekQsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQTtJQUM1QixPQUFPLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDNUM7Ozs7O1dBS0c7UUFDRiwrRkFBK0Y7UUFDaEcsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM3RSxJQUNDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsS0FBSyxTQUFTO2VBQzNDLEtB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
|
package/esm/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { makeContext, reqContext, resContext } from './context.js';
|
|
2
|
-
export { dxContext, setHtml, setJson, setBuffer, setRedirect, setText } from './dx.js';
|
|
3
|
-
export {
|
|
2
|
+
export { dxContext, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText } from './dx.js';
|
|
3
|
+
export { setBufferBodyDefaultOptions, getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
|
|
4
4
|
export { router } from './route.js';
|
package/esm/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { makeContext, reqContext, resContext } from './context.js';
|
|
2
|
-
export { dxContext, setHtml, setJson, setBuffer, setRedirect, setText } from './dx.js';
|
|
3
|
-
export {
|
|
2
|
+
export { dxContext, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText } from './dx.js';
|
|
3
|
+
export { setBufferBodyDefaultOptions, getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
|
|
4
4
|
export { router } from './route.js';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ2hFLE9BQU8sRUFDTixTQUFTLEVBQ1QsT0FBTyxFQUNQLGFBQWEsRUFDYixZQUFZLEVBQ1osT0FBTyxFQUNQLFNBQVMsRUFDVCxXQUFXLEVBQ1gsT0FBTyxFQUNQLE1BQU0sU0FBUyxDQUFBO0FBQ2hCLE9BQU8sRUFDTiwyQkFBMkIsRUFDM0IsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sT0FBTyxFQUNQLGFBQWEsRUFDYixRQUFRLEdBQ1IsTUFBTSxXQUFXLENBQUE7QUFDbEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dx-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"main": "./cjs/index.js",
|
|
5
|
+
"homepage": "https://github.com/tranvansang/dx-server",
|
|
5
6
|
"repository": "https://github.com/tranvansang/dx-server",
|
|
6
7
|
"author": "Sang Tran <t@sang.jp>",
|
|
7
8
|
"files": [
|
|
@@ -20,10 +21,9 @@
|
|
|
20
21
|
},
|
|
21
22
|
"type": "module",
|
|
22
23
|
"scripts": {
|
|
23
|
-
"
|
|
24
|
+
"prepublishOnly": "./compile.sh"
|
|
24
25
|
},
|
|
25
26
|
"license": "MIT",
|
|
26
|
-
"packageManager": "yarn@4.1.1",
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^20.12.7",
|
|
29
29
|
"@types/path-to-regexp": "^1.7.0",
|
|
@@ -35,5 +35,6 @@
|
|
|
35
35
|
"jdefer": "^0.0.14",
|
|
36
36
|
"path-to-regexp": "^6.2.2",
|
|
37
37
|
"qs": "^6.12.1"
|
|
38
|
-
}
|
|
39
|
-
|
|
38
|
+
},
|
|
39
|
+
"packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
|
|
40
|
+
}
|