dx-server 0.5.2 → 0.5.5

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
@@ -18,22 +18,48 @@ import dxServer, {getReq, getRes, router, setHtml, setText,} from 'dx-server'
18
18
 
19
19
  new Server().on('request', (req, res) => chain(
20
20
  dxServer(req, res),
21
- next => {
22
- getRes().setHeader('Cache-Control', 'no-cache')
23
- console.log(getReq().method, getReq().url)
24
- return next()
25
- },
26
21
  async next => {
27
- try {await next()} catch (e) {
22
+ try {
23
+ getRes().setHeader('Cache-Control', 'no-cache')
24
+ console.log(getReq().method, getReq().url)
25
+ await next()
26
+ } catch (e) {
28
27
  console.error(e)
29
- setHtml('internal server error (code: internal)', {status: 500})
28
+ setHtml('internal server error', {status: 500})
30
29
  }
31
30
  },
32
31
  router.get({
33
32
  '/'() {setHtml('hello world')},
34
33
  '/health'() {setText('ok')}
35
34
  }),
36
- () => {setHtml('not found', {status: 404})},
35
+ () => setHtml('not found', {status: 404}),
36
+ )()
37
+ ).listen(3000, () => console.log('server is listening at 3000'))
38
+ ```
39
+
40
+ File server:
41
+
42
+ ```javascript
43
+ import {Server} from 'node:http'
44
+ import chain from 'jchain'
45
+ import dxServer, {chainStatic, getReq, getRes, setHtml} from 'dx-server'
46
+ import {resolve, dirname} from 'node:path'
47
+ import {fileURLToPath} from 'node:url'
48
+
49
+ new Server().on('request', (req, res) => chain(
50
+ dxServer(req, res),
51
+ async next => {
52
+ try {
53
+ getRes().setHeader('Cache-Control', 'no-cache')
54
+ console.log(getReq().method, getReq().url)
55
+ await next()
56
+ } catch (e) {
57
+ console.error(e)
58
+ setHtml('internal server error', {status: 500})
59
+ }
60
+ },
61
+ chainStatic('/', {root: resolve(dirname(fileURLToPath(import.meta.url)), 'public')}),
62
+ () => setHtml('not found', {status: 404}),
37
63
  )()
38
64
  ).listen(3000, () => console.log('server is listening at 3000'))
39
65
  ```
@@ -48,14 +74,13 @@ import {promisify} from 'node:util'
48
74
  import chain from 'jchain'
49
75
  import dxServer, {
50
76
  getReq, getRes,
51
- getJson, getRaw, getText, getUrlEncoded, getQuery,
52
- setHtml, setJson, setText, setBuffer, setRedirect, setNodeStream, setWebStream,
53
- router, connectMiddlewares
77
+ getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery,
78
+ setHtml, setJson, setText, setBuffer, setRedirect, setNodeStream, setWebStream, setFile,
79
+ router, connectMiddlewares, chainStatic, makeDxContext
54
80
  } from 'dx-server'
55
81
  import {expressApp} from 'dx-server/express'
56
82
  import express from 'express'
57
83
  import morgan from 'morgan'
58
- import {AsyncLocalStorage} from 'node:async_hooks'
59
84
 
60
85
  // it is best practice to create custom error class for non-system error
61
86
  class ServerError extends Error {
@@ -68,14 +93,12 @@ class ServerError extends Error {
68
93
  }
69
94
  }
70
95
 
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
- }
96
+ const authContext = makeDxContext(async () => {
97
+ if (getReq().headers.authorization) return {id: 1, name: 'joe (private)'}
98
+ })
76
99
 
77
100
  const requireAuth = () => {
78
- if (!authStorage.getStore()) throw new ServerError('unauthorized', 401, 'unauthorized')
101
+ if (!authContext.value) throw new ServerError('unauthorized', 401, 'unauthorized')
79
102
  }
80
103
 
81
104
  const serverChain = chain(
@@ -105,7 +128,7 @@ const serverChain = chain(
105
128
  if (process.env.NODE_ENV !== 'production') app.set('json spaces', 2)
106
129
  app.use('/public', express.static('public'))
107
130
  }),
108
- authChain,
131
+ authContext.chain(), // chain context will set the context value to authContext.value in every request
109
132
  router.post({// example of catching error for all /api/* routes
110
133
  async '/api'({next}) {
111
134
  try {
@@ -131,7 +154,7 @@ const serverChain = chain(
131
154
  },
132
155
  '/api/me'() { // sample private router
133
156
  requireAuth()
134
- setJson({name: authStorage.getStore().name})
157
+ setJson({name: authContext.value.name})
135
158
  },
136
159
  }),
137
160
  router.get({ // sample GET router
@@ -156,6 +179,7 @@ const tcpServer = new Server()
156
179
  )()
157
180
  } catch (e) {
158
181
  console.error(e)
182
+ res.end()
159
183
  }
160
184
  })
161
185
 
@@ -163,26 +187,99 @@ await promisify(tcpServer.listen.bind(tcpServer))(3000)
163
187
  console.log('server is listening at 3000')
164
188
  ```
165
189
 
166
- ## TODO
167
- Until these middlewares are available as native dx-server middlewares, express middlewares can be used with `expressApp()`
168
- - [ ] native static file serve, like 'static-serve'
169
-
170
190
  ## Note:
171
191
 
172
192
  `getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery` are all synchronous functions.
173
193
  The associated results are calculated in the first time they are called and cached for subsequent calls.
174
194
 
175
- If you want to get these values synchronously, you can do as follows:
195
+ If you want to get these values synchronously, chain it, like follows:
176
196
  ```javascript
177
- import {AsyncLocalStorage} from 'node:async_hooks'
178
197
  import {getJson} from 'dx-server'
179
- const jsonStorage = new AsyncLocalStorage()
180
198
 
181
199
  chain(
182
- async next => jsonStorage.run(await getJson(), next),
200
+ getJson.chain(/*option*/), // json body is parsed and stored in context in every request
201
+ next => {
202
+ console.log(getJson.value) // json body can be accessed synchronously
203
+ return next()
204
+ }
205
+ )
206
+ ```
207
+
208
+ Context can be created using `makeDxContext` function:
209
+
210
+ ```javascript
211
+ import {makeDxContext} from 'dx-server'
212
+
213
+ const authContext = makeDxContext(() => {
214
+ if (getReq().headers.authorization) return {id: 1, name: 'joe (authorized)'}
215
+ })
216
+ const requireAuth = () => {
217
+ if (!authContext.value) throw new Error('unauthorized')
218
+ }
219
+ chain(
220
+ authContext.chain(),
183
221
  next => {
184
- console.log(jsonContext.value) // json body can be accessed synchronously
222
+ requireAuth()
223
+ return next()
224
+ }
225
+ )
226
+ // or await authContext() to lazy load the context and don't require chaining authContext.chain()
227
+ chain(
228
+ async next => {
229
+ console.log(await authContext())
185
230
  return next()
186
231
  }
187
232
  )
188
233
  ```
234
+
235
+ # API References
236
+ All exported APIs:
237
+ ```javascript
238
+ import dxServer, {
239
+ getReq, getRes, getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery,
240
+ setHtml, setJson, setText, setBuffer, setRedirect, setNodeStream, setWebStream, setFile,
241
+ router, connectMiddlewares, chainStatic, makeDxContext
242
+ } from 'dx-server'
243
+ import {expressApp, expressRouter} from 'dx-server/express' // requires express installed
244
+ import {
245
+ setBufferBodyDefaultOptions,
246
+ bufferFromReq, jsonFromReq, rawFromReq, textFromReq, urlEncodedFromReq, queryFromReq,
247
+ } from 'dx-server/helpers'
248
+ ```
249
+
250
+ - `getReq()`, `getRes()`: get request and response objects from anywhere.
251
+
252
+ - `getBuffer()`, `getJson()`, `getRaw()`, `getText()`, `getUrlEncoded()`, `getQuery()`: get parsed request body, raw body, text body, url encoded body, query string from anywhere.
253
+ These are DX context object, can be used as follows:
254
+ - `const json = await getJson()`: lazily load the context, once loaded, it is cached for subsequent calls.
255
+ - Chain it to get the value synchronously: `chain(getJson.chain(), next => console.log(getJson.value))`. Note that the value is calculated in every request.
256
+ - `makeDxContext(fn)`: create a DX context object.
257
+
258
+ - `setHtml`, `setJson`, `setText`, `setBuffer`, `setRedirect`, `setNodeStream`, `setWebStream`, `setFile`: set response body.
259
+
260
+ - `router.get`, `router.post`, `router.put`, `router.delete`, `router.patch`, `router.head`, `router.options`, `router.connect`, `router.trace`: create router.
261
+ - `router.method(methods, routes, options)`: create router with custom methods.
262
+ - `router.all(routes, options)`: create router for all methods.
263
+
264
+ - `connectMiddlewares(...middlewares)`: connect middlewares. For example:
265
+ ```javascript
266
+ import {connectMiddlewares} from 'dx-server'
267
+ import morgan from 'morgan'
268
+ import cors from 'cors'
269
+
270
+ connectMiddlewares(
271
+ morgan('common'),
272
+ cors(),
273
+ )
274
+ ```
275
+
276
+ - `chainStatic(path, options)`: serve static files. For example:
277
+ ```javascript
278
+ import {chainStatic} from 'dx-server'
279
+ import {resolve, dirname} from 'node:path'
280
+ import {fileURLToPath} from 'node:url'
281
+
282
+ chain(
283
+ chainStatic('/assets', {root: resolve(dirname(fileURLToPath(import.meta.url)), 'public')})
284
+ )
285
+ ```
package/cjs/body.js CHANGED
@@ -1,35 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = void 0;
3
+ exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.getBuffer = void 0;
4
4
  const dx_js_1 = require("./dx.js");
5
5
  const bodyHelpers_js_1 = require("./bodyHelpers.js");
6
- const bufferBodySymbol = Symbol('bufferBody');
7
- async function getBuffer(options) {
8
- return (0, dx_js_1.getReq)()[bufferBodySymbol] ??= (0, bodyHelpers_js_1.bufferFromReq)((0, dx_js_1.getReq)(), options);
9
- }
10
- const jsonBodySymbol = Symbol('jsonBody');
11
- async function getJson(options) {
12
- return (0, dx_js_1.getReq)()[jsonBodySymbol] ??= (0, bodyHelpers_js_1.jsonFromReq)((0, dx_js_1.getReq)(), options);
13
- }
14
- exports.getJson = getJson;
15
- const rawBodySymbol = Symbol('rawBody');
16
- async function getRaw(options) {
17
- return (0, dx_js_1.getReq)()[rawBodySymbol] ??= (0, bodyHelpers_js_1.rawFromReq)((0, dx_js_1.getReq)(), options);
18
- }
19
- exports.getRaw = getRaw;
20
- const textBodySymbol = Symbol('textBody');
21
- async function getText(options) {
22
- return (0, dx_js_1.getReq)()[textBodySymbol] ??= (0, bodyHelpers_js_1.textFromReq)((0, dx_js_1.getReq)(), options);
23
- }
24
- exports.getText = getText;
25
- const urlEncodedBodySymbol = Symbol('urlencodedBody');
26
- async function getUrlEncoded(options) {
27
- return (0, dx_js_1.getReq)()[urlEncodedBodySymbol] ??= (0, bodyHelpers_js_1.urlEncodedFromReq)((0, dx_js_1.getReq)(), options);
28
- }
29
- exports.getUrlEncoded = getUrlEncoded;
30
- const querySymbol = Symbol('query');
31
- async function getQuery({ simplify, ...options } = {}) {
32
- return (0, dx_js_1.getReq)()[querySymbol] ??= (0, bodyHelpers_js_1.queryFromReq)((0, dx_js_1.getReq)(), options);
33
- }
34
- exports.getQuery = getQuery;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUE4QjtBQUM5QixxREFReUI7QUFFekIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7QUFDN0MsS0FBSyxVQUFVLFNBQVMsQ0FBQyxPQUFvQztJQUM1RCxPQUFPLElBQUEsY0FBTSxHQUFFLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFBLDhCQUFhLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUN2RSxDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBQ2xDLEtBQUssVUFBVSxPQUFPLENBQUMsT0FBb0M7SUFDakUsT0FBTyxJQUFBLGNBQU0sR0FBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLElBQUEsNEJBQVcsRUFBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFGRCwwQkFFQztBQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUNoQyxLQUFLLFVBQVUsTUFBTSxDQUFDLE9BQW9DO0lBQ2hFLE9BQU8sSUFBQSxjQUFNLEdBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFBLDJCQUFVLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUNqRSxDQUFDO0FBRkQsd0JBRUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDbEMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxPQUFvQztJQUNqRSxPQUFPLElBQUEsY0FBTSxHQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBQSw0QkFBVyxFQUFDLElBQUEsY0FBTSxHQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDbkUsQ0FBQztBQUZELDBCQUVDO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtBQUM5QyxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQW1DO0lBQ3RFLE9BQU8sSUFBQSxjQUFNLEdBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLElBQUEsa0NBQWlCLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUMvRSxDQUFDO0FBRkQsc0NBRUM7QUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDNUIsS0FBSyxVQUFVLFFBQVEsQ0FBQyxFQUFDLFFBQVEsRUFBRSxHQUFHLE9BQU8sS0FBdUQsRUFBRTtJQUM1RyxPQUFPLElBQUEsY0FBTSxHQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBQSw2QkFBWSxFQUFDLElBQUEsY0FBTSxHQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDakUsQ0FBQztBQUZELDRCQUVDIn0=
6
+ exports.getBuffer = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.bufferFromReq)((0, dx_js_1.getReq)(), options));
7
+ exports.getJson = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.jsonFromReq)((0, dx_js_1.getReq)(), options));
8
+ exports.getRaw = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.rawFromReq)((0, dx_js_1.getReq)(), options));
9
+ exports.getText = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.textFromReq)((0, dx_js_1.getReq)(), options));
10
+ exports.getUrlEncoded = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.urlEncodedFromReq)((0, dx_js_1.getReq)(), options));
11
+ exports.getQuery = (0, dx_js_1.makeDxContext)((options) => (0, bodyHelpers_js_1.queryFromReq)((0, dx_js_1.getReq)(), options));
12
+ // to getFile use busboy
13
+ // https://github.com/mscdex/busboy
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUE2QztBQUM3QyxxREFReUI7QUFFWixRQUFBLFNBQVMsR0FBRyxJQUFBLHFCQUFhLEVBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDhCQUFhLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ3JHLFFBQUEsT0FBTyxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsNEJBQVcsRUFBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFDakcsUUFBQSxNQUFNLEdBQUcsSUFBQSxxQkFBYSxFQUFDLENBQUMsT0FBb0MsRUFBRSxFQUFFLENBQUMsSUFBQSwyQkFBVSxFQUFDLElBQUEsY0FBTSxHQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUMvRixRQUFBLE9BQU8sR0FBRyxJQUFBLHFCQUFhLEVBQUMsQ0FBQyxPQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDRCQUFXLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ2pHLFFBQUEsYUFBYSxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUEsa0NBQWlCLEVBQUMsSUFBQSxjQUFNLEdBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQzdHLFFBQUEsUUFBUSxHQUFHLElBQUEscUJBQWEsRUFBQyxDQUFDLE9BQTJELEVBQUUsRUFBRSxDQUFDLElBQUEsNkJBQVksRUFBQyxJQUFBLGNBQU0sR0FBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7QUFFdkksd0JBQXdCO0FBQ3hCLG1DQUFtQyJ9
@@ -13,4 +13,5 @@ export declare function jsonFromReq(req: IncomingMessage, options?: Partial<Buff
13
13
  export declare function rawFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<Buffer | undefined>;
14
14
  export declare function textFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<string | undefined>;
15
15
  export declare function urlEncodedFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<qs.ParsedQs | undefined>;
16
- export declare function queryFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): Promise<qs.ParsedQs>;
16
+ export declare function urlFromReq(req: IncomingMessage): URL;
17
+ export declare function queryFromReq(req: IncomingMessage, options?: Partial<BufferBodyOptions>): qs.ParsedQs;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.queryFromReq = exports.urlEncodedFromReq = exports.textFromReq = exports.rawFromReq = exports.jsonFromReq = exports.bufferFromReq = exports.setBufferBodyDefaultOptions = void 0;
6
+ exports.queryFromReq = exports.urlFromReq = exports.urlEncodedFromReq = exports.textFromReq = exports.rawFromReq = exports.jsonFromReq = exports.bufferFromReq = exports.setBufferBodyDefaultOptions = void 0;
7
7
  const stream_js_1 = require("./stream.js");
8
8
  const contentType_js_1 = require("./contentType.js");
9
9
  const qs_1 = __importDefault(require("qs"));
@@ -93,10 +93,14 @@ async function urlEncodedFromReq(req, options) {
93
93
  }
94
94
  }
95
95
  exports.urlEncodedFromReq = urlEncodedFromReq;
96
- async function queryFromReq(req, options) {
97
- const query = new URL(req.url ?? '', 'https://example.com').searchParams.toString();
96
+ function urlFromReq(req) {
97
+ return new URL(req.url ?? '', 'https://example.com');
98
+ }
99
+ exports.urlFromReq = urlFromReq;
100
+ function queryFromReq(req, options) {
101
+ const query = urlFromReq(req).searchParams.toString();
98
102
  const { simplifyQuery } = { ...bodyDefaultOptions, ...options };
99
103
  return simplifyQuery ? Object.fromEntries(new URLSearchParams(query)) : qs_1.default.parse(query);
100
104
  }
101
105
  exports.queryFromReq = queryFromReq;
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm9keUhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsMkNBQXdEO0FBQ3hELHFEQUFpRDtBQUNqRCw0Q0FBbUI7QUFRbkIsSUFBSSxrQkFBa0IsR0FBc0IsRUFBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBQyxDQUFBLENBQUMsUUFBUTtBQUMzRSxTQUFnQiwyQkFBMkIsQ0FBQyxPQUFtQztJQUM5RSxrQkFBa0IsR0FBRyxFQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQTtBQUN6RCxDQUFDO0FBRkQsa0VBRUM7QUFFTSxLQUFLLFVBQVUsYUFBYSxDQUFDLEdBQW9CLEVBQUUsT0FBb0M7SUFDN0YsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLEVBQUMsR0FBRyxrQkFBa0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0lBQ3ZEOzs7OztPQUtHO0lBQ0YsK0ZBQStGO0lBQ2hHLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0UsSUFDQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUztXQUMzQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7UUFDNUIsT0FBTTtJQUNSLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFBO0lBRWxGLE9BQU87SUFDUCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5RSxNQUFNLE1BQU0sR0FBRyxJQUFBLDRCQUFnQixFQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM5QyxPQUFPLE1BQU0sSUFBQSxzQkFBVSxFQUN0QixNQUFNLEVBQ047UUFDQyxNQUFNLEVBQUUsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzNELEtBQUssRUFBRSxTQUFTO0tBQ2hCLENBQ0QsQ0FBQTtBQUNGLENBQUM7QUExQkQsc0NBMEJDO0FBRUQsdURBQXVEO0FBQ3ZELFNBQVMseUJBQXlCLENBQUMsR0FBb0IsRUFBRSxRQUFnQjtJQUN4RSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ2xELElBQUksQ0FBQyxjQUFjO1FBQUUsT0FBTTtJQUMzQixNQUFNLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBQyxHQUFHLElBQUEsaUNBQWdCLEVBQUMsY0FBYyxDQUFDLENBQUE7SUFDaEUsSUFBSSxTQUFTLEtBQUssUUFBUTtRQUFFLE9BQU07SUFFbEMsT0FBTyxVQUFVLENBQUE7QUFDbEIsQ0FBQztBQUNELFNBQVMsZUFBZSxDQUFDLEdBQW9CLEVBQUUsUUFBZ0I7SUFDOUQsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNELElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTTtJQUN2QixzQ0FBc0M7SUFDdEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQW9CLElBQUksT0FBTyxDQUFBO0lBQzlFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFFbEcsT0FBTyxPQUFPLENBQUE7QUFDZixDQUFDO0FBRU0sS0FBSyxVQUFVLFdBQVcsQ0FBQyxHQUFvQixFQUFFLE9BQW9DO0lBQzNGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtJQUN4RCxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU07SUFDcEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2hELElBQUksTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDekMsQ0FBQztBQUNGLENBQUM7QUFSRCxrQ0FRQztBQUVNLEtBQUssVUFBVSxVQUFVLENBQUMsR0FBb0IsRUFBRSxPQUFvQztJQUMxRixJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDO1FBQUUsT0FBTTtJQUN2RSxPQUFPLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUN6QyxDQUFDO0FBSEQsZ0NBR0M7QUFFTSxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQW9CLEVBQUUsT0FBb0M7SUFDM0YsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUNsRCxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU07SUFDcEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2hELElBQUksTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUM1QyxDQUFDO0FBTEQsa0NBS0M7QUFFTSxLQUFLLFVBQVUsaUJBQWlCLENBQUMsR0FBb0IsRUFBRSxPQUFvQztJQUNqRyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLG1DQUFtQyxDQUFDLENBQUE7SUFDekUsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFNO0lBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwQyxNQUFNLEVBQUMsc0JBQXNCLEVBQUMsR0FBRyxFQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQTtRQUNwRSxPQUFPLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDN0YsQ0FBQztBQUNGLENBQUM7QUFURCw4Q0FTQztBQUVNLEtBQUssVUFBVSxZQUFZLENBQUMsR0FBb0IsRUFBRSxPQUFvQztJQUM1RixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNuRixNQUFNLEVBQUMsYUFBYSxFQUFDLEdBQUcsRUFBQyxHQUFHLGtCQUFrQixFQUFFLEdBQUcsT0FBTyxFQUFDLENBQUE7SUFDM0QsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBSkQsb0NBSUMifQ==
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYm9keUhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsMkNBQXdEO0FBQ3hELHFEQUFpRDtBQUNqRCw0Q0FBbUI7QUFRbkIsSUFBSSxrQkFBa0IsR0FBc0IsRUFBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBQyxDQUFBLENBQUMsUUFBUTtBQUMzRSxTQUFnQiwyQkFBMkIsQ0FBQyxPQUFtQztJQUM5RSxrQkFBa0IsR0FBRyxFQUFDLEdBQUcsa0JBQWtCLEVBQUUsR0FBRyxPQUFPLEVBQUMsQ0FBQTtBQUN6RCxDQUFDO0FBRkQsa0VBRUM7QUFFTSxLQUFLLFVBQVUsYUFBYSxDQUFDLEdBQW9CLEVBQUUsT0FBb0M7SUFDN0YsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLEVBQUMsR0FBRyxrQkFBa0IsRUFBRSxHQUFHLE9BQU8sRUFBQyxDQUFBO0lBQ3ZEOzs7OztPQUtHO0lBQ0YsK0ZBQStGO0lBQ2hHLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0UsSUFDQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUztXQUMzQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7UUFDNUIsT0FBTTtJQUNSLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFBO0lBRWxGLE9BQU87SUFDUCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM5RSxNQUFNLE1BQU0sR0FBRyxJQUFBLDRCQUFnQixFQUFD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
package/cjs/dx.d.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  /// <reference types="node" resolution-mode="require"/>
4
4
  import { Readable } from 'node:stream';
5
5
  import type { IncomingMessage, ServerResponse } from 'node:http';
6
+ import { SendOptions } from 'send';
6
7
  export interface Chainable<P extends any[] = any[], R = any, Next = (...np: any[]) => any> {
7
8
  (next: Next, ...p: P): R;
8
9
  }
@@ -18,6 +19,7 @@ export declare function setText(text: string, { status }?: {
18
19
  export declare function setHtml(html: string, opts?: {
19
20
  status?: number;
20
21
  }): void;
22
+ export declare function setFile(filePath: string, options?: SendOptions): void;
21
23
  export declare function setBuffer(buffer: Buffer, { status }?: {
22
24
  status?: number;
23
25
  }): void;
@@ -31,3 +33,10 @@ export declare function setJson(json: any, { status }?: {
31
33
  status?: number;
32
34
  }): void;
33
35
  export declare function setRedirect(url: string, status: 301 | 302): void;
36
+ interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
37
+ value: T;
38
+ chain(...params: Params): Chainable<Params, R, Next>;
39
+ (...params: Params): Promise<T>;
40
+ }
41
+ export declare function makeDxContext<T, Params extends any[], R = any, Next = (...np: any[]) => any>(maker: (...params: Params) => T): Context<T, Params, R, Next>;
42
+ export {};
package/cjs/dx.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setHtml = exports.setText = exports.getRes = exports.getReq = exports.dxServer = void 0;
3
+ exports.makeDxContext = exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setFile = exports.setHtml = exports.setText = exports.getRes = exports.getReq = exports.dxServer = void 0;
4
4
  const node_async_hooks_1 = require("node:async_hooks");
5
5
  const dxHelpers_js_1 = require("./dxHelpers.js");
6
6
  const reqStorage = new node_async_hooks_1.AsyncLocalStorage();
@@ -27,7 +27,6 @@ function getRes() {
27
27
  return resStorage.getStore();
28
28
  }
29
29
  exports.getRes = getRes;
30
- // todo: support setFile (with stream or with buffer)
31
30
  function setText(text, { status } = {}) {
32
31
  const res = getRes();
33
32
  const dx = dxStorage.getStore();
@@ -43,6 +42,13 @@ function setHtml(html, opts = {}) {
43
42
  dx.type = 'html';
44
43
  }
45
44
  exports.setHtml = setHtml;
45
+ function setFile(filePath, options) {
46
+ const dx = dxStorage.getStore();
47
+ dx.data = filePath;
48
+ dx.type = 'file';
49
+ dx.options = options;
50
+ }
51
+ exports.setFile = setFile;
46
52
  function setBuffer(buffer, { status } = {}) {
47
53
  const res = getRes();
48
54
  const dx = dxStorage.getStore();
@@ -87,4 +93,30 @@ function setRedirect(url, status) {
87
93
  dx.type = 'redirect';
88
94
  }
89
95
  exports.setRedirect = setRedirect;
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdURBQWtEO0FBQ2xELGlEQUF1RDtBQVV2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLG9DQUFpQixFQUFtQixDQUFBO0FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksb0NBQWlCLEVBQWtCLENBQUE7QUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQ0FBaUIsRUFBYSxDQUFBO0FBQ3BELFNBQWdCLFFBQVEsQ0FDdkIsR0FBb0IsRUFDcEIsR0FBbUIsRUFDbkIsVUFHSSxFQUFFO0lBRU4sT0FBTyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7UUFDbkIsTUFBTSxFQUFFLEdBQWMsRUFBQyxHQUFHLE9BQU8sRUFBQyxDQUFBO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDakMsRUFBRSxFQUNGLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ25CLEdBQUcsRUFDSCxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FDL0IsQ0FDRCxDQUFBO1FBQ0QsTUFBTSxJQUFBLHVCQUFRLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM1QixPQUFPLE1BQU0sQ0FBQTtJQUNkLENBQUMsQ0FBQTtBQUNGLENBQUM7QUFwQkQsNEJBb0JDO0FBRUQsZUFBZTtBQUNmLGdEQUFnRDtBQUNoRCwyRkFBMkY7QUFDM0YsZ0ZBQWdGO0FBQ2hGLFNBQWdCLE1BQU07SUFDckIsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFHLENBQUE7QUFDOUIsQ0FBQztBQUZELHdCQUVDO0FBQ0QsU0FBZ0IsTUFBTTtJQUNyQixPQUFPLFVBQVUsQ0FBQyxRQUFRLEVBQUcsQ0FBQTtBQUM5QixDQUFDO0FBRkQsd0JBRUM7QUFFRCxxREFBcUQ7QUFFckQs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
96
+ function makeDxContext(maker) {
97
+ const promiseSymbol = Symbol('promise');
98
+ const valueSymbol = Symbol('value');
99
+ // wrap in an async function to ensure the maker is called only once
100
+ const context = (...params) => getReq()[promiseSymbol] ??= (async () => {
101
+ try {
102
+ return getReq()[valueSymbol] = await maker(...params);
103
+ }
104
+ catch (e) {
105
+ throw e;
106
+ }
107
+ })();
108
+ Object.defineProperty(context, 'value', {
109
+ get() {
110
+ if (!getReq()[promiseSymbol])
111
+ throw new Error('value is not ready');
112
+ return getReq()[valueSymbol];
113
+ }
114
+ });
115
+ context.chain = (...params) => async (next) => {
116
+ await context(...params);
117
+ return next();
118
+ };
119
+ return context;
120
+ }
121
+ exports.makeDxContext = makeDxContext;
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdURBQWtEO0FBQ2xELGlEQUF1RDtBQVd2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLG9DQUFpQixFQUFtQixDQUFBO0FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksb0NBQWlCLEVBQWtCLENBQUE7QUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQ0FBaUIsRUFBYSxDQUFBO0FBQ3BELFNBQWdCLFFBQVEsQ0FDdkIsR0FBb0IsRUFDcEIsR0FBbUIsRUFDbkIsVUFHSSxFQUFFO0lBRU4sT0FBTyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7UUFDbkIsTUFBTSxFQUFFLEdBQWMsRUFBQyxHQUFHLE9BQU8sRUFBQyxDQUFBO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDakMsRUFBRSxFQUNGLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ25CLEdBQUcsRUFDSCxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FDL0IsQ0FDRCxDQUFBO1FBQ0QsTUFBTSxJQUFBLHVCQUFRLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUM1QixPQUFPLE1BQU0sQ0FBQTtJQUNkLENBQUMsQ0FBQTtBQUNGLENBQUM7QUFwQkQsNEJBb0JDO0FBRUQsZUFBZTtBQUNmLGdEQUFnRDtBQUNoRCwyRkFBMkY7QUFDM0YsZ0ZBQWdGO0FBQ2hGLFNBQWdCLE1BQU07SUFDckIsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFHLENBQUE7QUFDOUIsQ0FBQztBQUZELHdCQUVDO0FBQ0QsU0FBZ0IsTUFBTTtJQUNyQixPQUFPLFVBQVUsQ0FBQyxRQUFRLEVBQUcsQ0FBQTtBQUM5QixDQUFDO0FBRkQsd0JBRUM7QUFFRCxTQUFnQixPQUFPLENB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
@@ -3,6 +3,7 @@
3
3
  /// <reference types="node" resolution-mode="require"/>
4
4
  import type { IncomingMessage, ServerResponse } from 'node:http';
5
5
  import { Readable } from 'node:stream';
6
+ import { SendOptions } from 'send';
6
7
  export type DxContext = {
7
8
  charset?: BufferEncoding;
8
9
  jsonBeautify?: boolean;
@@ -10,23 +11,34 @@ export type DxContext = {
10
11
  } & ({
11
12
  type: 'text';
12
13
  data: string;
14
+ options: undefined;
13
15
  } | {
14
16
  type: 'html';
15
17
  data: string;
18
+ options: undefined;
16
19
  } | {
17
20
  type: 'buffer';
18
21
  data: Buffer;
22
+ options: undefined;
19
23
  } | {
20
24
  type: 'json';
21
25
  data: any;
26
+ options: undefined;
22
27
  } | {
23
28
  type: 'redirect';
24
29
  data: string;
30
+ options: undefined;
25
31
  } | {
26
32
  type: 'nodeStream';
27
33
  data: Readable;
34
+ options: undefined;
28
35
  } | {
29
36
  type: 'webStream';
30
37
  data: ReadableStream;
38
+ options: undefined;
39
+ } | {
40
+ type: 'file';
41
+ data: string;
42
+ options?: SendOptions;
31
43
  });
32
- export declare function writeRes(req: IncomingMessage, res: ServerResponse, { type, data, charset, jsonBeautify, disableEtag }: DxContext): Promise<void>;
44
+ export declare function writeRes(req: IncomingMessage, res: ServerResponse, { type, data, charset, jsonBeautify, disableEtag, options }: DxContext): Promise<void>;
package/cjs/dxHelpers.js CHANGED
@@ -8,7 +8,9 @@ const node_stream_1 = require("node:stream");
8
8
  const jdefer_1 = __importDefault(require("jdefer"));
9
9
  const node_util_1 = require("node:util");
10
10
  const etag_js_1 = require("./etag.js");
11
- async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEtag }) {
11
+ const staticHelpers_js_1 = require("./staticHelpers.js");
12
+ const dx_js_1 = require("./dx.js");
13
+ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEtag, options }) {
12
14
  const setContentType = (contentType) => {
13
15
  if (res.headersSent || res.getHeader('content-type'))
14
16
  return;
@@ -43,6 +45,8 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
43
45
  res.setHeader('location', data);
44
46
  bufferOrStream = Buffer.from('', charset);
45
47
  break;
48
+ case 'file':
49
+ return (0, staticHelpers_js_1.sendFile)(req, (0, dx_js_1.getRes)(), encodeURI(data), options, () => void 0);
46
50
  case undefined:
47
51
  // skip response. Some middleware may handle it outside the chain. For example, express middleware
48
52
  return;
@@ -52,6 +56,7 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
52
56
  throw new Error(`unsupported response type ${type}`);
53
57
  }
54
58
  if (res.headersSent) {
59
+ // for example, chainStatic or setFile send the response directly
55
60
  if (res.writableFinished) {
56
61
  // skipped: response is already finished
57
62
  }
@@ -110,4 +115,4 @@ async function writeRes(req, res, { type, data, charset, jsonBeautify, disableEt
110
115
  }
111
116
  }
112
117
  exports.writeRes = writeRes;
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhIZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2R4SGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSw2Q0FBb0M7QUFDcEMsb0RBQThCO0FBQzlCLHlDQUFtQztBQUNuQyx1Q0FBZ0Q7QUFvQ3pDLEtBQUssVUFBVSxRQUFRLENBQUMsR0FBb0IsRUFBRSxHQUFtQixFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBWTtJQUNwSSxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLGNBQWMsQ0FBQTtJQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixtQkFBbUI7WUFDbkIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQzNDLE1BQUs7UUFDTixLQUFLLFFBQVE7WUFDWixjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtZQUMxQyxjQUFjLEdBQUcsSUFBSSxDQUFBO1lBQ3JCLE1BQUs7UUFDTixLQUFLLFlBQVk7WUFDaEIsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUE7WUFDMUMsY0FBYyxHQUFHLElBQUksQ0FBQTtZ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
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHhIZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2R4SGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSw2Q0FBb0M7QUFDcEMsb0RBQThCO0FBQzlCLHlDQUFtQztBQUNuQyx1Q0FBZ0Q7QUFFaEQseURBQTJDO0FBQzNDLG1DQUE4QjtBQStDdkIsS0FBSyxVQUFVLFFBQVEsQ0FBQyxHQUFvQixFQUFFLEdBQW1CLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBWTtJQUM3SSxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLGNBQWMsQ0FBQTtJQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1YsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzdCLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixtQkFBbUI7WUFDbkIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQzNDLE1BQUs7UUFDTixLQUFLLFFBQVE7WUFDWixjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtZQUMxQyxjQUFjLEdBQUcsSUFBSSxDQUFBO1lBQ3JCLE1BQUs7UUFDTixLQUFLLFlBQVk7WUFDaEIsY0FBYyxDQUFDLDBCQUEwQixD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
package/cjs/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export { getReq, getRes, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText } from './dx.js';
1
+ export { getReq, getRes, setHtml, setNodeStream, setWebStream, setJson, setBuffer, setRedirect, setText, setFile, makeDxContext, } from './dx.js';
2
2
  import { dxServer } from './dx.js';
3
- export { getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
3
+ export { getBuffer, getJson, getRaw, getText, getUrlEncoded, getQuery, } from './body.js';
4
4
  export { router } from './route.js';
5
5
  export { connectMiddlewares } from './connect.js';
6
+ export { chainStatic } from './static.js';
6
7
  export default dxServer;
package/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.connectMiddlewares = exports.router = exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.setText = exports.setRedirect = exports.setBuffer = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setHtml = exports.getRes = exports.getReq = void 0;
3
+ exports.chainStatic = exports.connectMiddlewares = exports.router = exports.getQuery = exports.getUrlEncoded = exports.getText = exports.getRaw = exports.getJson = exports.getBuffer = exports.makeDxContext = exports.setFile = exports.setText = exports.setRedirect = exports.setBuffer = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setHtml = exports.getRes = exports.getReq = void 0;
4
4
  var dx_js_1 = require("./dx.js");
5
5
  Object.defineProperty(exports, "getReq", { enumerable: true, get: function () { return dx_js_1.getReq; } });
6
6
  Object.defineProperty(exports, "getRes", { enumerable: true, get: function () { return dx_js_1.getRes; } });
@@ -11,8 +11,11 @@ Object.defineProperty(exports, "setJson", { enumerable: true, get: function () {
11
11
  Object.defineProperty(exports, "setBuffer", { enumerable: true, get: function () { return dx_js_1.setBuffer; } });
12
12
  Object.defineProperty(exports, "setRedirect", { enumerable: true, get: function () { return dx_js_1.setRedirect; } });
13
13
  Object.defineProperty(exports, "setText", { enumerable: true, get: function () { return dx_js_1.setText; } });
14
+ Object.defineProperty(exports, "setFile", { enumerable: true, get: function () { return dx_js_1.setFile; } });
15
+ Object.defineProperty(exports, "makeDxContext", { enumerable: true, get: function () { return dx_js_1.makeDxContext; } });
14
16
  const dx_js_2 = require("./dx.js");
15
17
  var body_js_1 = require("./body.js");
18
+ Object.defineProperty(exports, "getBuffer", { enumerable: true, get: function () { return body_js_1.getBuffer; } });
16
19
  Object.defineProperty(exports, "getJson", { enumerable: true, get: function () { return body_js_1.getJson; } });
17
20
  Object.defineProperty(exports, "getRaw", { enumerable: true, get: function () { return body_js_1.getRaw; } });
18
21
  Object.defineProperty(exports, "getText", { enumerable: true, get: function () { return body_js_1.getText; } });
@@ -22,5 +25,7 @@ var route_js_1 = require("./route.js");
22
25
  Object.defineProperty(exports, "router", { enumerable: true, get: function () { return route_js_1.router; } });
23
26
  var connect_js_1 = require("./connect.js");
24
27
  Object.defineProperty(exports, "connectMiddlewares", { enumerable: true, get: function () { return connect_js_1.connectMiddlewares; } });
28
+ var static_js_1 = require("./static.js");
29
+ Object.defineProperty(exports, "chainStatic", { enumerable: true, get: function () { return static_js_1.chainStatic; } });
25
30
  exports.default = dx_js_2.dxServer;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBVWdCO0FBVGYsK0ZBQUEsTUFBTSxPQUFBO0FBQ04sK0ZBQUEsTUFBTSxPQUFBO0FBQ04sZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBQ2IscUdBQUEsWUFBWSxPQUFBO0FBQ1osZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asa0dBQUEsU0FBUyxPQUFBO0FBQ1Qsb0dBQUEsV0FBVyxPQUFBO0FBQ1gsZ0dBQUEsT0FBTyxPQUFBO0FBRVIsbUNBQWdDO0FBQ2hDLHFDQU1rQjtBQUxqQixrR0FBQSxPQUFPLE9BQUE7QUFDUCxpR0FBQSxNQUFNLE9BQUE7QUFDTixrR0FBQSxPQUFPLE9BQUE7QUFDUCx3R0FBQSxhQUFhLE9BQUE7QUFDYixtR0FBQSxRQUFRLE9BQUE7QUFFVCx1Q0FBaUM7QUFBekIsa0dBQUEsTUFBTSxPQUFBO0FBQ2QsMkNBQStDO0FBQXZDLGdIQUFBLGtCQUFrQixPQUFBO0FBRTFCLGtCQUFlLGdCQUFRLENBQUEifQ==
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBWWdCO0FBWGYsK0ZBQUEsTUFBTSxPQUFBO0FBQ04sK0ZBQUEsTUFBTSxPQUFBO0FBQ04sZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBQ2IscUdBQUEsWUFBWSxPQUFBO0FBQ1osZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asa0dBQUEsU0FBUyxPQUFBO0FBQ1Qsb0dBQUEsV0FBVyxPQUFBO0FBQ1gsZ0dBQUEsT0FBTyxPQUFBO0FBQ1AsZ0dBQUEsT0FBTyxPQUFBO0FBQ1Asc0dBQUEsYUFBYSxPQUFBO0FBRWQsbUNBQWdDO0FBQ2hDLHFDQU9rQjtBQU5qQixvR0FBQSxTQUFTLE9BQUE7QUFDVCxrR0FBQSxPQUFPLE9BQUE7QUFDUCxpR0FBQSxNQUFNLE9BQUE7QUFDTixrR0FBQSxPQUFPLE9BQUE7QUFDUCx3R0FBQSxhQUFhLE9BQUE7QUFDYixtR0FBQSxRQUFRLE9BQUE7QUFFVCx1Q0FBaUM7QUFBekIsa0dBQUEsTUFBTSxPQUFBO0FBQ2QsMkNBQStDO0FBQXZDLGdIQUFBLGtCQUFrQixPQUFBO0FBQzFCLHlDQUF1QztBQUEvQix3R0FBQSxXQUFXLE9BQUE7QUFFbkIsa0JBQWUsZ0JBQVEsQ0FBQSJ9
package/cjs/route.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { Key } from 'path-to-regexp';
2
+ import { Chainable } from './dx.js';
2
3
  interface RegexpToPathOptions {
3
4
  end?: boolean;
4
5
  strict?: boolean;
@@ -13,9 +14,6 @@ export declare function matchPattern<Params extends Record<Key['name'], string>>
13
14
  matched: any;
14
15
  params: any;
15
16
  } | undefined;
16
- interface Chainable<P extends any[] = any[], R = any, Next = (...np: any[]) => any> {
17
- (next: Next, ...p: P): R;
18
- }
19
17
  interface RouteContext {
20
18
  matched: string;
21
19
  next(): any;
package/cjs/route.js CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.router = exports.matchPattern = void 0;
4
4
  const path_to_regexp_1 = require("path-to-regexp");
5
5
  const dx_js_1 = require("./dx.js");
6
+ const bodyHelpers_js_1 = require("./bodyHelpers.js");
6
7
  const cache = {};
7
8
  const cacheLimit = 10000;
8
9
  let cacheCount = 0;
@@ -56,7 +57,7 @@ exports.router = {
56
57
  if (req.method !== method.toUpperCase())
57
58
  return next();
58
59
  for (const [pattern, handler] of Object.entries(router)) {
59
- const match = matchPattern(new URL(req.url ?? '', 'https://example.com').pathname, `${prefix}${pattern}`, options);
60
+ const match = matchPattern((0, bodyHelpers_js_1.urlFromReq)(req).pathname, `${prefix}${pattern}`, options);
60
61
  if (match)
61
62
  return handler({
62
63
  ...match,
@@ -70,7 +71,7 @@ exports.router = {
70
71
  return next => {
71
72
  const req = (0, dx_js_1.getReq)();
72
73
  for (const [pattern, handler] of Object.entries(router)) {
73
- const match = matchPattern(req.url ?? '', `${prefix}${pattern}`, options);
74
+ const match = matchPattern((0, bodyHelpers_js_1.urlFromReq)(req).pathname, `${prefix}${pattern}`, options);
74
75
  if (match)
75
76
  return handler({
76
77
  ...match,
@@ -83,4 +84,4 @@ exports.router = {
83
84
  };
84
85
  for (const method of allMethods)
85
86
  exports.router[method] = exports.router.method.bind(exports.router, method);
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQTJDO0FBQzNDLG1DQUE4QjtBQUU5QixNQUFNLEtBQUssR0FBd0IsRUFBRSxDQUFBO0FBQ3JDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQTtBQUN4QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7QUFjbEIsU0FBUyxXQUFXLENBQUMsSUFBWSxFQUFFLE9BQTRCO0lBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzNELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTNDLE1BQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQTtJQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFBLDZCQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxNQUFNLE1BQU0sR0FBRztRQUNkLE1BQU07UUFDTixJQUFJO0tBQ0osQ0FBQTtJQUVELElBQUksVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUE7UUFDeEIsVUFBVSxFQUFFLENBQUE7SUFDYixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUMzQixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBNkI7SUFFN0IsT0FBTyxHQUFHLEVBQUMsR0FBRyxPQUFPLEVBQUMsQ0FBQTtJQUN0QixPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQTtJQUNwQixPQUFP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
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQTJDO0FBQzNDLG1DQUF5QztBQUN6QyxxREFBMkM7QUFFM0MsTUFBTSxLQUFLLEdBQXdCLEVBQUUsQ0FBQTtBQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUE7QUFDeEIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFBO0FBY2xCLFNBQVMsV0FBVyxDQUFDLElBQVksRUFBRSxPQUE0QjtJQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUMzRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUUzQyxNQUFNLElBQUksR0FBVSxFQUFFLENBQUE7SUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBQSw2QkFBWSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDaEQsTUFBTSxNQUFNLEdBQUc7UUFDZCxNQUFNO1FBQ04sSUFBSTtLQUNKLENBQUE7SUFFRCxJQUFJLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFBO1FBQ3hCLFVBQVUsRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2QsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FDM0IsUUFBZ0IsRUFDaEIsT0FBZSxFQUNmLE9BQTZCO0lBRTdCLE9BQU8sR0FBRyxFQUFDLEdBQUcsT0FBTyxFQUFDLENBQUE7SUFDdEIsT0FBTyxDQUFDLEdBQUcsS0FBSyxJQUFJLENB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