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 +14 -1
- package/cjs/dx.d.ts +8 -6
- package/cjs/dx.js +59 -48
- package/esm/dx.d.ts +8 -6
- package/esm/dx.js +57 -46
- package/package.json +1 -1
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.
|
|
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
|
-
|
|
7
|
-
const
|
|
8
|
-
const
|
|
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
|
-
|
|
12
|
-
const result = await
|
|
13
|
-
await (0, dxHelpers_js_1.writeRes)(req, res,
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
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
|
-
|
|
9
|
-
const result = await
|
|
10
|
-
await writeRes(req, res,
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
59
|
+
const dx = dxContext.value;
|
|
35
60
|
dx.type = 'html';
|
|
36
61
|
}
|
|
37
62
|
export function setFile(filePath, options) {
|
|
38
|
-
const dx =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
102
|
+
const dx = dxContext.value;
|
|
78
103
|
res.statusCode = status;
|
|
79
104
|
dx.data = url;
|
|
80
105
|
dx.type = 'redirect';
|
|
81
106
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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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
|