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 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
- Sample additionally requires: `yarn install express morgan`
12
+ Simple server
13
13
 
14
14
  ```javascript
15
- import {Server} from 'http'
16
- import {promisify} from 'util'
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
- setHtml,
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, expressRouter, expressMiddlewares} from 'dx-server/express'
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
- expressMiddlewares(
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
- const port = +(process.env.PORT ?? 3000)
181
- await promisify(tcpServer.listen.bind(tcpServer))(port)
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
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="qs" />
3
- export declare const bufferBodyContext: {
4
- readonly value: Buffer | undefined;
5
- chain(params_0?: {
6
- limit?: number | undefined;
7
- } | undefined): <V>(next: () => V) => Promise<any>;
8
- with(value: Buffer | undefined): <V_1>(next: () => V_1) => Promise<any>;
9
- };
10
- export declare const jsonBodyContext: {
11
- readonly value: any;
12
- chain(): <V>(next: () => V) => Promise<any>;
13
- with(value: any): <V_1>(next: () => V_1) => Promise<any>;
14
- };
15
- export declare const rawBodyContext: {
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.queryContext = exports.urlencodedBodyContext = exports.textBodyContext = exports.rawBodyContext = exports.jsonBodyContext = exports.bufferBodyContext = void 0;
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
- exports.bufferBodyContext = (0, context_js_1.makeContext)(async ({ limit = 100 << 10, // 100kb
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
- * Check if a request has a request body.
13
- * A request with a body __must__ either have `transfer-encoding`
14
- * or `content-length` headers set.
15
- * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
16
- */
17
- // https://github.com/jshttp/type-is/blob/cdcfe23e9833872e425b0aaf71ca0311373b6116/index.js#L92
18
- const contentLengthParsed = parseInt(req.headers['content-length'] ?? '', 10);
19
- if (req.headers['transfer-encoding'] === undefined
20
- && isNaN(contentLengthParsed))
21
- return;
22
- const contentLength = isNaN(contentLengthParsed) ? undefined : contentLengthParsed;
23
- // read
24
- const encoding = (req.headers['content-encoding'] ?? 'identity').toLowerCase();
25
- const stream = (0, stream_js_1.getContentStream)(req, encoding);
26
- return await (0, stream_js_1.readStream)(stream, {
27
- length: encoding === 'identity' ? contentLength : undefined,
28
- limit,
29
- });
30
- });
31
- const forceGetContentTypeParams = (expected) => {
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
- const forceGetCharset = (expected) => {
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
- exports.jsonBodyContext = (0, context_js_1.makeContext)(async () => {
52
- const charset = forceGetCharset('application/json');
53
- if (!charset)
54
- return;
55
- const buffer = exports.bufferBodyContext.value;
56
- if (buffer) {
57
- const str = buffer.toString(charset);
58
- return str ? JSON.parse(str) : undefined;
59
- }
60
- });
61
- exports.rawBodyContext = (0, context_js_1.makeContext)(async () => {
62
- if (!forceGetContentTypeParams('application/octet-stream'))
63
- return;
64
- return exports.bufferBodyContext.value;
65
- });
66
- exports.textBodyContext = (0, context_js_1.makeContext)(async () => {
67
- const charset = forceGetCharset('text/plain');
68
- if (!charset)
69
- return;
70
- const buffer = exports.bufferBodyContext.value;
71
- if (buffer)
72
- return buffer.toString(charset);
73
- });
74
- exports.urlencodedBodyContext = (0, context_js_1.makeContext)(async ({ simplify } = {}) => {
75
- const charset = forceGetCharset('application/x-www-form-urlencoded');
76
- if (!charset)
77
- return;
78
- const buffer = exports.bufferBodyContext.value;
79
- if (buffer) {
80
- const str = buffer.toString(charset);
81
- return simplify
82
- ? Object.fromEntries(new URLSearchParams(str))
83
- : (0, qs_1.parse)(str);
84
- }
85
- });
86
- exports.queryContext = (0, context_js_1.makeContext)(({ simplify } = {}) => {
87
- const req = context_js_1.reqContext.value;
88
- const query = req.url?.split('?', 2)?.[1];
89
- return query
90
- ? simplify
91
- ? Object.fromEntries(new URLSearchParams(query))
92
- : (0, qs_1.parse)(query)
93
- : {};
94
- });
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3RDtBQUN4RCwyQkFBd0I7QUFDeEIscURBQWlEO0FBQ2pELDZDQUFvRDtBQUV2QyxRQUFBLGlCQUFpQixHQUFHLElBQUEsd0JBQVcsRUFBQyxLQUFLLEVBQ2pELEVBQ0MsS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsUUFBUTtLQUd4QixFQUFFLEVBQ0wsRUFBRTtJQUNILE1BQU0sR0FBRyxHQUFHLHVCQUFVLENBQUMsS0FBSyxDQUFBO0lBRTVCOzs7OztPQUtHO0lBQ0YsK0ZBQStGO0lBQ2hHLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0UsSUFDQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUztXQUMzQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7UUFDNUIsT0FBTTtJQUNSLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFBO0lBRWxGLE9BQU87SUFDUCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5RSxNQUFNLE1BQU0sR0FBRyxJQUFBLDRCQUFnQixFQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM5QyxPQUFPLE1BQU0sSUFBQSxzQkFBVSxFQUN0QixNQUFNLEVBQ047UUFDQyxNQUFNLEVBQUUsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzNELEtBQUs7S0FD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
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 { bufferBodyContext, jsonBodyContext, queryContext, rawBodyContext, textBodyContext, urlencodedBodyContext } from './body.js';
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.urlencodedBodyContext = exports.textBodyContext = exports.rawBodyContext = exports.queryContext = exports.jsonBodyContext = exports.bufferBodyContext = exports.setText = exports.setRedirect = exports.setBuffer = exports.setJson = exports.setHtml = exports.dxContext = exports.resContext = exports.reqContext = exports.makeContext = void 0;
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, "bufferBodyContext", { enumerable: true, get: function () { return body_js_1.bufferBodyContext; } });
17
- Object.defineProperty(exports, "jsonBodyContext", { enumerable: true, get: function () { return body_js_1.jsonBodyContext; } });
18
- Object.defineProperty(exports, "queryContext", { enumerable: true, get: function () { return body_js_1.queryContext; } });
19
- Object.defineProperty(exports, "rawBodyContext", { enumerable: true, get: function () { return body_js_1.rawBodyContext; } });
20
- Object.defineProperty(exports, "textBodyContext", { enumerable: true, get: function () { return body_js_1.textBodyContext; } });
21
- Object.defineProperty(exports, "urlencodedBodyContext", { enumerable: true, get: function () { return body_js_1.urlencodedBodyContext; } });
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQWdFO0FBQXhELHlHQUFBLFdBQVcsT0FBQTtBQUFFLHdHQUFBLFVBQVUsT0FBQTtBQUFFLHdHQUFBLFVBQVUsT0FBQTtBQUMzQyxpQ0FPZ0I7QUFOZixrR0FBQSxTQUFTLE9BQUE7QUFDVCxnR0FBQSxPQUFPLE9BQUE7QUFDUCxnR0FBQSxPQUFPLE9BQUE7QUFDUCxrR0FBQSxTQUFTLE9BQUE7QUFDVCxvR0FBQSxXQUFXLE9BQUE7QUFDWCxnR0FBQSxPQUFPLE9BQUE7QUFFUixxQ0FPa0I7QUFOakIsNEdBQUEsaUJBQWlCLE9BQUE7QUFDakIsMEdBQUEsZUFBZSxPQUFBO0FBQ2YsdUdBQUEsWUFBWSxPQUFBO0FBQ1oseUdBQUEsY0FBYyxPQUFBO0FBQ2QsMEdBQUEsZUFBZSxPQUFBO0FBQ2YsZ0hBQUEscUJBQXFCLE9BQUE7QUFFdEIsdUNBQWlDO0FBQXpCLGtHQUFBLE1BQU0sT0FBQSJ9
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQWdFO0FBQXhELHlHQUFBLFdBQVcsT0FBQTtBQUFFLHdHQUFBLFVBQVUsT0FBQTtBQUFFLHdHQUFBLFVBQVUsT0FBQTtBQUMzQyxpQ0FTZ0I7QUFSZixrR0FBQSxTQUFTLE9BQUE7QUFDVCxnR0FBQSxPQUFPLE9BQUE7QUFDUCxzR0FBQSxhQUFhLE9BQUE7QUFDYixxR0FBQSxZQUFZLE9BQUE7QUFDWixnR0FBQSxPQUFPLE9BQUE7QUFDUCxrR0FBQSxTQUFTLE9BQUE7QUFDVCxvR0FBQSxXQUFXLE9BQUE7QUFDWCxnR0FBQSxPQUFPLE9BQUE7QUFFUixxQ0FRa0I7QUFQakIsc0hBQUEsMkJBQTJCLE9BQUE7QUFDM0Isb0dBQUEsU0FBUyxPQUFBO0FBQ1Qsa0dBQUEsT0FBTyxPQUFBO0FBQ1AsaUdBQUEsTUFBTSxPQUFBO0FBQ04sa0dBQUEsT0FBTyxPQUFBO0FBQ1Asd0dBQUEsYUFBYSxPQUFBO0FBQ2IsbUdBQUEsUUFBUSxPQUFBO0FBRVQsdUNBQWlDO0FBQXpCLGtHQUFBLE1BQU0sT0FBQSJ9
package/esm/body.d.ts CHANGED
@@ -1,38 +1,15 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- /// <reference types="qs" />
3
- export declare const bufferBodyContext: {
4
- readonly value: Buffer | undefined;
5
- chain(params_0?: {
6
- limit?: number | undefined;
7
- } | undefined): <V>(next: () => V) => Promise<any>;
8
- with(value: Buffer | undefined): <V_1>(next: () => V_1) => Promise<any>;
9
- };
10
- export declare const jsonBodyContext: {
11
- readonly value: any;
12
- chain(): <V>(next: () => V) => Promise<any>;
13
- with(value: any): <V_1>(next: () => V_1) => Promise<any>;
14
- };
15
- export declare const rawBodyContext: {
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 { makeContext, reqContext } from './context.js';
5
- export const bufferBodyContext = makeContext(async ({ limit = 100 << 10, // 100kb
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
- * Check if a request has a request body.
10
- * A request with a body __must__ either have `transfer-encoding`
11
- * or `content-length` headers set.
12
- * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
13
- */
14
- // https://github.com/jshttp/type-is/blob/cdcfe23e9833872e425b0aaf71ca0311373b6116/index.js#L92
15
- const contentLengthParsed = parseInt(req.headers['content-length'] ?? '', 10);
16
- if (req.headers['transfer-encoding'] === undefined
17
- && isNaN(contentLengthParsed))
18
- return;
19
- const contentLength = isNaN(contentLengthParsed) ? undefined : contentLengthParsed;
20
- // read
21
- const encoding = (req.headers['content-encoding'] ?? 'identity').toLowerCase();
22
- const stream = getContentStream(req, encoding);
23
- return await readStream(stream, {
24
- length: encoding === 'identity' ? contentLength : undefined,
25
- limit,
26
- });
27
- });
28
- const forceGetContentTypeParams = (expected) => {
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
- const forceGetCharset = (expected) => {
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
- export const jsonBodyContext = makeContext(async () => {
49
- const charset = forceGetCharset('application/json');
50
- if (!charset)
51
- return;
52
- const buffer = bufferBodyContext.value;
53
- if (buffer) {
54
- const str = buffer.toString(charset);
55
- return str ? JSON.parse(str) : undefined;
56
- }
57
- });
58
- export const rawBodyContext = makeContext(async () => {
59
- if (!forceGetContentTypeParams('application/octet-stream'))
60
- return;
61
- return bufferBodyContext.value;
62
- });
63
- export const textBodyContext = makeContext(async () => {
64
- const charset = forceGetCharset('text/plain');
65
- if (!charset)
66
- return;
67
- const buffer = bufferBodyContext.value;
68
- if (buffer)
69
- return buffer.toString(charset);
70
- });
71
- export const urlencodedBodyContext = makeContext(async ({ simplify } = {}) => {
72
- const charset = forceGetCharset('application/x-www-form-urlencoded');
73
- if (!charset)
74
- return;
75
- const buffer = bufferBodyContext.value;
76
- if (buffer) {
77
- const str = buffer.toString(charset);
78
- return simplify
79
- ? Object.fromEntries(new URLSearchParams(str))
80
- : parse(str);
81
- }
82
- });
83
- export const queryContext = makeContext(({ simplify } = {}) => {
84
- const req = reqContext.value;
85
- const query = req.url?.split('?', 2)?.[1];
86
- return query
87
- ? simplify
88
- ? Object.fromEntries(new URLSearchParams(query))
89
- : parse(query)
90
- : {};
91
- });
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDeEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLElBQUksQ0FBQTtBQUN4QixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUVwRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUNqRCxFQUNDLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLFFBQVE7S0FHeEIsRUFBRSxFQUNMLEVBQUU7SUFDSCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFBO0lBRTVCOzs7OztPQUtHO0lBQ0YsK0ZBQStGO0lBQ2hHLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0UsSUFDQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUztXQUMzQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7UUFDNUIsT0FBTTtJQUNSLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFBO0lBRWxGLE9BQU87SUFDUCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5RSxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFD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
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 { bufferBodyContext, jsonBodyContext, queryContext, rawBodyContext, textBodyContext, urlencodedBodyContext } from './body.js';
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 { bufferBodyContext, jsonBodyContext, queryContext, rawBodyContext, textBodyContext, urlencodedBodyContext } from './body.js';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ2hFLE9BQU8sRUFDTixTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sRUFDUCxTQUFTLEVBQ1QsV0FBVyxFQUNYLE9BQU8sRUFDUCxNQUFNLFNBQVMsQ0FBQTtBQUNoQixPQUFPLEVBQ04saUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixZQUFZLEVBQ1osY0FBYyxFQUNkLGVBQWUsRUFDZixxQkFBcUIsRUFDckIsTUFBTSxXQUFXLENBQUE7QUFDbEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQSJ9
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.2.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
- "prepublish": "./compile.sh"
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
+ }