dx-server 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -245,7 +245,20 @@ These are DX context object, can be used as follows:
245
245
  - `const json = await getJson()`: lazily load the context, once loaded, it is cached for subsequent calls.
246
246
  No chaining is required.
247
247
  - Chain it to get the value synchronously: `chain(getJson.chain(), next => console.log(getJson.value))`. Note that the value is calculated in every request.
248
- - `makeDxContext(fn)`: create a DX context object.
248
+ - `ctx = makeDxContext(fn)`: create a DX context object.
249
+ `fn` is called once per request to calculate the value.
250
+ The value is cached for subsequent calls.
251
+
252
+ - Context value can be accessed by:
253
+
254
+ - `const value = await ctx()`: lazily load the context, once loaded, it is cached for subsequent calls.
255
+ - `const value = ctx.value`: get the value synchronously. Note that the value must be fetched at least once before via `await ctx()` or by chaining `chain(ctx.chain())`.
256
+ - `const value = ctx.get(req)`: similar condition as `ctx.value`.
257
+
258
+ - Context value can be set or overridden by:
259
+
260
+ - `ctx.value = value`.
261
+ - `ctx.set(req, value)`.
249
262
 
250
263
  - `setHtml`, `setJson`, `setText`, `setBuffer`, `setRedirect`, `setNodeStream`, `setWebStream`, `setFile`: set response body.
251
264
 
package/cjs/dx.d.ts CHANGED
@@ -7,6 +7,14 @@ import { SendOptions } from 'send';
7
7
  export interface Chainable<P extends any[] = any[], R = any, Next = (...np: any[]) => any> {
8
8
  (next: Next, ...p: P): R;
9
9
  }
10
+ export interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
11
+ value: Awaited<T>;
12
+ get(req: IncomingMessage): T;
13
+ set(req: IncomingMessage, value: T): void;
14
+ (...params: Params): Promise<T>;
15
+ chain(...params: Params): Chainable<Params, R, Next>;
16
+ }
17
+ export declare function makeDxContext<T, Params extends any[], R = any, Next = (...np: any[]) => any>(maker: (...params: Params) => T): Context<T, Params, R, Next>;
10
18
  export declare function dxServer(req: IncomingMessage, res: ServerResponse, options?: {
11
19
  jsonBeautify?: boolean;
12
20
  disableEtag?: boolean;
@@ -33,9 +41,3 @@ export declare function setJson(json: any, { status }?: {
33
41
  status?: number;
34
42
  }): void;
35
43
  export declare function setRedirect(url: string, status: 301 | 302): void;
36
- export interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
37
- value: Awaited<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>;
package/cjs/dx.js CHANGED
@@ -1,16 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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;
3
+ exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setFile = exports.setHtml = exports.setText = exports.getRes = exports.getReq = exports.dxServer = exports.makeDxContext = void 0;
4
4
  const node_async_hooks_1 = require("node:async_hooks");
5
5
  const dxHelpers_js_1 = require("./dxHelpers.js");
6
- const reqStorage = new node_async_hooks_1.AsyncLocalStorage();
7
- const resStorage = new node_async_hooks_1.AsyncLocalStorage();
8
- const dxStorage = new node_async_hooks_1.AsyncLocalStorage();
6
+ function makeDxContext(maker) {
7
+ const promiseSymbol = Symbol('promise');
8
+ const valueSymbol = Symbol('value');
9
+ // wrap in an async function to ensure the maker is called only once
10
+ const context = (...params) => getReq()[promiseSymbol] ??= (async () => {
11
+ try {
12
+ return getReq()[valueSymbol] = await maker(...params);
13
+ }
14
+ catch (e) {
15
+ throw e;
16
+ }
17
+ })();
18
+ Object.defineProperty(context, 'value', {
19
+ get() { return getReq()[valueSymbol]; },
20
+ set(value) {
21
+ getReq()[promiseSymbol] = Promise.resolve(value);
22
+ getReq()[valueSymbol] = value;
23
+ }
24
+ });
25
+ context.chain = (...params) => async (next) => {
26
+ await context(...params);
27
+ return next();
28
+ };
29
+ context.set = (req, value) => {
30
+ req[promiseSymbol] = Promise.resolve(value);
31
+ req[valueSymbol] = value;
32
+ };
33
+ context.get = req => req[valueSymbol];
34
+ return context;
35
+ }
36
+ exports.makeDxContext = makeDxContext;
37
+ const requestStorage = new node_async_hooks_1.AsyncLocalStorage();
38
+ const dxContext = makeDxContext(options => ({ ...options }));
9
39
  function dxServer(req, res, options = {}) {
10
40
  return async (next) => {
11
- const dx = { ...options };
12
- const result = await dxStorage.run(dx, () => reqStorage.run(req, () => resStorage.run(res, next)));
13
- await (0, dxHelpers_js_1.writeRes)(req, res, dx);
41
+ dxContext.set(req, { ...options });
42
+ const result = await requestStorage.run({ req, res }, next);
43
+ await (0, dxHelpers_js_1.writeRes)(req, res, dxContext.get(req));
14
44
  return result;
15
45
  };
16
46
  }
@@ -19,17 +49,13 @@ exports.dxServer = dxServer;
19
49
  // url: full url without server, protocol, port.
20
50
  // headers: if headers are repeated, they are joined by comma. Header names are lowercased.
21
51
  // rawHeaders: list of header name and value in a flat array. Case is preserved.
22
- function getReq() {
23
- return reqStorage.getStore();
24
- }
52
+ function getReq() { return requestStorage.getStore().req; }
25
53
  exports.getReq = getReq;
26
- function getRes() {
27
- return resStorage.getStore();
28
- }
54
+ function getRes() { return requestStorage.getStore().res; }
29
55
  exports.getRes = getRes;
30
56
  function setText(text, { status } = {}) {
31
57
  const res = getRes();
32
- const dx = dxStorage.getStore();
58
+ const dx = dxContext.value;
33
59
  if (status)
34
60
  res.statusCode = status;
35
61
  dx.data = text;
@@ -38,12 +64,12 @@ function setText(text, { status } = {}) {
38
64
  exports.setText = setText;
39
65
  function setHtml(html, opts = {}) {
40
66
  setText(html, opts);
41
- const dx = dxStorage.getStore();
67
+ const dx = dxContext.value;
42
68
  dx.type = 'html';
43
69
  }
44
70
  exports.setHtml = setHtml;
45
71
  function setFile(filePath, options) {
46
- const dx = dxStorage.getStore();
72
+ const dx = dxContext.value;
47
73
  dx.data = filePath;
48
74
  dx.type = 'file';
49
75
  dx.options = options;
@@ -51,7 +77,7 @@ function setFile(filePath, options) {
51
77
  exports.setFile = setFile;
52
78
  function setBuffer(buffer, { status } = {}) {
53
79
  const res = getRes();
54
- const dx = dxStorage.getStore();
80
+ const dx = dxContext.value;
55
81
  if (status)
56
82
  res.statusCode = status;
57
83
  dx.data = buffer;
@@ -60,7 +86,7 @@ function setBuffer(buffer, { status } = {}) {
60
86
  exports.setBuffer = setBuffer;
61
87
  function setNodeStream(stream, { status } = {}) {
62
88
  const res = getRes();
63
- const dx = dxStorage.getStore();
89
+ const dx = dxContext.value;
64
90
  if (status)
65
91
  res.statusCode = status;
66
92
  dx.data = stream;
@@ -69,7 +95,7 @@ function setNodeStream(stream, { status } = {}) {
69
95
  exports.setNodeStream = setNodeStream;
70
96
  function setWebStream(stream, { status } = {}) {
71
97
  const res = getRes();
72
- const dx = dxStorage.getStore();
98
+ const dx = dxContext.value;
73
99
  if (status)
74
100
  res.statusCode = status;
75
101
  dx.data = stream;
@@ -80,43 +106,28 @@ function setJson(json, { status } = {}) {
80
106
  const res = getRes();
81
107
  if (status)
82
108
  res.statusCode = status;
83
- const dx = dxStorage.getStore();
109
+ const dx = dxContext.value;
84
110
  dx.data = json;
85
111
  dx.type = 'json';
86
112
  }
87
113
  exports.setJson = setJson;
88
114
  function setRedirect(url, status) {
89
115
  const res = getRes();
90
- const dx = dxStorage.getStore();
116
+ const dx = dxContext.value;
91
117
  res.statusCode = status;
92
118
  dx.data = url;
93
119
  dx.type = 'redirect';
94
120
  }
95
121
  exports.setRedirect = setRedirect;
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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
122
+ // for download, set content-disposition header
123
+ // res.setHeader('Content-disposition', 'attachment; filename=my-movie.MOV')
124
+ // res.setHeader('Content-type', 'video/quicktime')
125
+ // fileStream.pipe(res)
126
+ // or
127
+ // send(req, filePath, options).pipe(res) // which will set content-type, content-length, and other cache related headers like staticHelpers.sendFile
128
+ // implementing this require a strict validation for the type (attachment) and filename.
129
+ // For example: express relies on this
130
+ // https://github.com/jshttp/content-disposition/blob/1037e24e4790273da96645ad250061f39e77968c/index.js#L186
131
+ // because in most applications, users can specify a simple filename which usually doesn't need to be validated.
132
+ // we leave setDownload() implementation for users, for now.
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdURBQWtEO0FBQ2xELGlEQUF1RDtBQXVCdkQsU0FBZ0IsYUFBYSxDQUszQixLQUErQjtJQUNoQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDdkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ25DLG9FQUFvRTtJQUNwRSxNQUFNLE9BQU8sR0FBZ0MsQ0FBQyxHQUFHLE1BQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUMzRyxJQUFJLENBQUM7WUFDSixPQUFPLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsQ0FBQTtRQUNSLENBQUM7SUFDRixDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ0osTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFO1FBQ3ZDLEdBQUcsS0FBSSxPQUFPLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFBLENBQUEsQ0FBQztRQUNwQyxHQUFHLENBQUMsS0FBSztZQUNSLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDaEQsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQzlCLENBQUM7S0FDRCxDQUFDLENBQUE7SUFDRixPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUMzQyxNQUFN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
package/esm/dx.d.ts CHANGED
@@ -7,6 +7,14 @@ import { SendOptions } from 'send';
7
7
  export interface Chainable<P extends any[] = any[], R = any, Next = (...np: any[]) => any> {
8
8
  (next: Next, ...p: P): R;
9
9
  }
10
+ export interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
11
+ value: Awaited<T>;
12
+ get(req: IncomingMessage): T;
13
+ set(req: IncomingMessage, value: T): void;
14
+ (...params: Params): Promise<T>;
15
+ chain(...params: Params): Chainable<Params, R, Next>;
16
+ }
17
+ export declare function makeDxContext<T, Params extends any[], R = any, Next = (...np: any[]) => any>(maker: (...params: Params) => T): Context<T, Params, R, Next>;
10
18
  export declare function dxServer(req: IncomingMessage, res: ServerResponse, options?: {
11
19
  jsonBeautify?: boolean;
12
20
  disableEtag?: boolean;
@@ -33,9 +41,3 @@ export declare function setJson(json: any, { status }?: {
33
41
  status?: number;
34
42
  }): void;
35
43
  export declare function setRedirect(url: string, status: 301 | 302): void;
36
- export interface Context<T, Params extends any[], R = any, Next = (...np: any[]) => any> {
37
- value: Awaited<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>;
package/esm/dx.js CHANGED
@@ -1,13 +1,42 @@
1
1
  import { AsyncLocalStorage } from 'node:async_hooks';
2
2
  import { writeRes } from './dxHelpers.js';
3
- const reqStorage = new AsyncLocalStorage();
4
- const resStorage = new AsyncLocalStorage();
5
- const dxStorage = new AsyncLocalStorage();
3
+ export function makeDxContext(maker) {
4
+ const promiseSymbol = Symbol('promise');
5
+ const valueSymbol = Symbol('value');
6
+ // wrap in an async function to ensure the maker is called only once
7
+ const context = (...params) => getReq()[promiseSymbol] ??= (async () => {
8
+ try {
9
+ return getReq()[valueSymbol] = await maker(...params);
10
+ }
11
+ catch (e) {
12
+ throw e;
13
+ }
14
+ })();
15
+ Object.defineProperty(context, 'value', {
16
+ get() { return getReq()[valueSymbol]; },
17
+ set(value) {
18
+ getReq()[promiseSymbol] = Promise.resolve(value);
19
+ getReq()[valueSymbol] = value;
20
+ }
21
+ });
22
+ context.chain = (...params) => async (next) => {
23
+ await context(...params);
24
+ return next();
25
+ };
26
+ context.set = (req, value) => {
27
+ req[promiseSymbol] = Promise.resolve(value);
28
+ req[valueSymbol] = value;
29
+ };
30
+ context.get = req => req[valueSymbol];
31
+ return context;
32
+ }
33
+ const requestStorage = new AsyncLocalStorage();
34
+ const dxContext = makeDxContext(options => ({ ...options }));
6
35
  export function dxServer(req, res, options = {}) {
7
36
  return async (next) => {
8
- const dx = { ...options };
9
- const result = await dxStorage.run(dx, () => reqStorage.run(req, () => resStorage.run(res, next)));
10
- await writeRes(req, res, dx);
37
+ dxContext.set(req, { ...options });
38
+ const result = await requestStorage.run({ req, res }, next);
39
+ await writeRes(req, res, dxContext.get(req));
11
40
  return result;
12
41
  };
13
42
  }
@@ -15,15 +44,11 @@ export function dxServer(req, res, options = {}) {
15
44
  // url: full url without server, protocol, port.
16
45
  // headers: if headers are repeated, they are joined by comma. Header names are lowercased.
17
46
  // rawHeaders: list of header name and value in a flat array. Case is preserved.
18
- export function getReq() {
19
- return reqStorage.getStore();
20
- }
21
- export function getRes() {
22
- return resStorage.getStore();
23
- }
47
+ export function getReq() { return requestStorage.getStore().req; }
48
+ export function getRes() { return requestStorage.getStore().res; }
24
49
  export function setText(text, { status } = {}) {
25
50
  const res = getRes();
26
- const dx = dxStorage.getStore();
51
+ const dx = dxContext.value;
27
52
  if (status)
28
53
  res.statusCode = status;
29
54
  dx.data = text;
@@ -31,18 +56,18 @@ export function setText(text, { status } = {}) {
31
56
  }
32
57
  export function setHtml(html, opts = {}) {
33
58
  setText(html, opts);
34
- const dx = dxStorage.getStore();
59
+ const dx = dxContext.value;
35
60
  dx.type = 'html';
36
61
  }
37
62
  export function setFile(filePath, options) {
38
- const dx = dxStorage.getStore();
63
+ const dx = dxContext.value;
39
64
  dx.data = filePath;
40
65
  dx.type = 'file';
41
66
  dx.options = options;
42
67
  }
43
68
  export function setBuffer(buffer, { status } = {}) {
44
69
  const res = getRes();
45
- const dx = dxStorage.getStore();
70
+ const dx = dxContext.value;
46
71
  if (status)
47
72
  res.statusCode = status;
48
73
  dx.data = buffer;
@@ -50,7 +75,7 @@ export function setBuffer(buffer, { status } = {}) {
50
75
  }
51
76
  export function setNodeStream(stream, { status } = {}) {
52
77
  const res = getRes();
53
- const dx = dxStorage.getStore();
78
+ const dx = dxContext.value;
54
79
  if (status)
55
80
  res.statusCode = status;
56
81
  dx.data = stream;
@@ -58,7 +83,7 @@ export function setNodeStream(stream, { status } = {}) {
58
83
  }
59
84
  export function setWebStream(stream, { status } = {}) {
60
85
  const res = getRes();
61
- const dx = dxStorage.getStore();
86
+ const dx = dxContext.value;
62
87
  if (status)
63
88
  res.statusCode = status;
64
89
  dx.data = stream;
@@ -68,40 +93,26 @@ export function setJson(json, { status } = {}) {
68
93
  const res = getRes();
69
94
  if (status)
70
95
  res.statusCode = status;
71
- const dx = dxStorage.getStore();
96
+ const dx = dxContext.value;
72
97
  dx.data = json;
73
98
  dx.type = 'json';
74
99
  }
75
100
  export function setRedirect(url, status) {
76
101
  const res = getRes();
77
- const dx = dxStorage.getStore();
102
+ const dx = dxContext.value;
78
103
  res.statusCode = status;
79
104
  dx.data = url;
80
105
  dx.type = 'redirect';
81
106
  }
82
- export function makeDxContext(maker) {
83
- const promiseSymbol = Symbol('promise');
84
- const valueSymbol = Symbol('value');
85
- // wrap in an async function to ensure the maker is called only once
86
- const context = (...params) => getReq()[promiseSymbol] ??= (async () => {
87
- try {
88
- return getReq()[valueSymbol] = await maker(...params);
89
- }
90
- catch (e) {
91
- throw e;
92
- }
93
- })();
94
- Object.defineProperty(context, 'value', {
95
- get() {
96
- if (!getReq()[promiseSymbol])
97
- throw new Error('value is not ready');
98
- return getReq()[valueSymbol];
99
- }
100
- });
101
- context.chain = (...params) => async (next) => {
102
- await context(...params);
103
- return next();
104
- };
105
- return context;
106
- }
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFpQixRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQVd2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLGlCQUFpQixFQUFtQixDQUFBO0FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksaUJBQWlCLEVBQWtCLENBQUE7QUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxpQkFBaUIsRUFBYSxDQUFBO0FBQ3BELE1BQU0sVUFBVSxRQUFRLENBQ3ZCLEdBQW9CLEVBQ3BCLEdBQW1CLEVBQ25CLFVBR0ksRUFBRTtJQUVOLE9BQU8sS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQ25CLE1BQU0sRUFBRSxHQUFjLEVBQUMsR0FBRyxPQUFPLEVBQUMsQ0FBQTtRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQ2pDLEVBQUUsRUFDRixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUNuQixHQUFHLEVBQ0gsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQy9CLENBQ0QsQ0FBQTtRQUNELE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDNUIsT0FBTyxNQUFNLENBQUE7SUFDZCxDQUFDLENBQUE7QUFDRixDQUFDO0FBRUQsZUFBZTtBQUNmLGdEQUFnRDtBQUNoRCwyRkFBMkY7QUFDM0YsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxNQUFNO0lBQ3JCLE9BQU8sVUFBVSxDQUFDLFFBQVEsRUFBRyxDQUFBO0FBQzlCLENBQUM7QUFDRCxNQUFNLFVBQVUsTUFBTTtJQUNyQixPQUFPLFVBQVUsQ0FBQyxRQUFRLEVBQUcsQ0FB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
107
+ // for download, set content-disposition header
108
+ // res.setHeader('Content-disposition', 'attachment; filename=my-movie.MOV')
109
+ // res.setHeader('Content-type', 'video/quicktime')
110
+ // fileStream.pipe(res)
111
+ // or
112
+ // send(req, filePath, options).pipe(res) // which will set content-type, content-length, and other cache related headers like staticHelpers.sendFile
113
+ // implementing this require a strict validation for the type (attachment) and filename.
114
+ // For example: express relies on this
115
+ // https://github.com/jshttp/content-disposition/blob/1037e24e4790273da96645ad250061f39e77968c/index.js#L186
116
+ // because in most applications, users can specify a simple filename which usually doesn't need to be validated.
117
+ // we leave setDownload() implementation for users, for now.
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFpQixRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQXVCdkQsTUFBTSxVQUFVLGFBQWEsQ0FLM0IsS0FBK0I7SUFDaEMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNuQyxvRUFBb0U7SUFDcEUsTUFBTSxPQUFPLEdBQWdDLENBQUMsR0FBRyxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDM0csSUFBSSxDQUFDO1lBQ0osT0FBTyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFBO1FBQ3RELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1osTUFBTSxDQUFDLENBQUE7UUFDUixDQUFDO0lBQ0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNKLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRTtRQUN2QyxHQUFHLEtBQUksT0FBTyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQSxDQUFBLENBQUM7UUFDcEMsR0FBRyxDQUFDLEtBQUs7WUFDUixNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUM5QixDQUFDO0tBQ0QsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxDQUFDLEtBQUssR0FBRyxD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dx-server",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "main": "./cjs/index.js",
5
5
  "homepage": "https://github.com/tranvansang/dx-server",
6
6
  "repository": "https://github.com/tranvansang/dx-server",