dx-server 0.0.4 → 0.0.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 +8 -1
- package/cjs/express.d.ts +10 -4
- package/cjs/express.js +32 -18
- package/esm/express.d.ts +10 -4
- package/esm/express.js +29 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,7 +18,14 @@ import chain from 'jchain'
|
|
|
18
18
|
import {
|
|
19
19
|
makeContext, requestContext, responseContext,
|
|
20
20
|
|
|
21
|
-
expressContext,
|
|
21
|
+
expressContext,
|
|
22
|
+
setHtml,
|
|
23
|
+
setJson,
|
|
24
|
+
setText,
|
|
25
|
+
setBuffer,
|
|
26
|
+
setRedirect,
|
|
27
|
+
setNodeStream,
|
|
28
|
+
setWebStream,
|
|
22
29
|
|
|
23
30
|
bufferBodyContext,
|
|
24
31
|
jsonBodyContext,
|
package/cjs/express.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
import {
|
|
3
|
+
import { Readable } from 'node:stream';
|
|
4
4
|
export declare const expressContext: {
|
|
5
5
|
readonly value: {
|
|
6
6
|
charset?: BufferEncoding | undefined;
|
|
@@ -22,8 +22,11 @@ export declare const expressContext: {
|
|
|
22
22
|
type: 'redirect';
|
|
23
23
|
data: string;
|
|
24
24
|
} | {
|
|
25
|
-
type: '
|
|
26
|
-
data:
|
|
25
|
+
type: 'nodeStream';
|
|
26
|
+
data: Readable;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'webStream';
|
|
29
|
+
data: ReadableStream;
|
|
27
30
|
});
|
|
28
31
|
chain(params_0?: {
|
|
29
32
|
jsonBeautify?: boolean | undefined;
|
|
@@ -39,7 +42,10 @@ export declare function setHtml(html: string, opts?: {
|
|
|
39
42
|
export declare function setBuffer(buffer: Buffer, { status }?: {
|
|
40
43
|
status?: number;
|
|
41
44
|
}): void;
|
|
42
|
-
export declare function
|
|
45
|
+
export declare function setNodeStream(stream: Readable, { status }?: {
|
|
46
|
+
status?: number;
|
|
47
|
+
}): void;
|
|
48
|
+
export declare function setWebStream(stream: ReadableStream, { status }?: {
|
|
43
49
|
status?: number;
|
|
44
50
|
}): void;
|
|
45
51
|
export declare function setJson(json: any, { status, beautify }?: {
|
package/cjs/express.js
CHANGED
|
@@ -3,11 +3,12 @@ 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.setRedirect = exports.setJson = exports.
|
|
6
|
+
exports.setRedirect = exports.setJson = exports.setWebStream = exports.setNodeStream = exports.setBuffer = exports.setHtml = exports.setText = exports.expressContext = void 0;
|
|
7
7
|
const jdefer_1 = __importDefault(require("jdefer"));
|
|
8
8
|
const node_util_1 = require("node:util");
|
|
9
9
|
const etag_js_1 = require("./etag.js");
|
|
10
10
|
const context_js_1 = require("./context.js");
|
|
11
|
+
const node_stream_1 = require("node:stream");
|
|
11
12
|
exports.expressContext = (0, context_js_1.makeContext)(async ({ jsonBeautify, disableEtag } = {}) => {
|
|
12
13
|
return {
|
|
13
14
|
jsonBeautify,
|
|
@@ -20,29 +21,33 @@ exports.expressContext = (0, context_js_1.makeContext)(async ({ jsonBeautify, di
|
|
|
20
21
|
return;
|
|
21
22
|
res.setHeader('content-type', `${contentType}${charset ? `; charset=${charset}` : ''}`);
|
|
22
23
|
};
|
|
23
|
-
let
|
|
24
|
+
let bufferOrStream;
|
|
24
25
|
switch (type) {
|
|
25
26
|
case 'text':
|
|
26
27
|
setContentType('text/plain');
|
|
27
28
|
case 'html':
|
|
28
29
|
setContentType('text/html');
|
|
29
30
|
// shared with text
|
|
30
|
-
|
|
31
|
+
bufferOrStream = Buffer.from(data, charset);
|
|
31
32
|
break;
|
|
32
33
|
case 'buffer':
|
|
33
34
|
setContentType('application/octet-stream');
|
|
34
|
-
|
|
35
|
+
bufferOrStream = data;
|
|
35
36
|
break;
|
|
36
|
-
case '
|
|
37
|
+
case 'nodeStream':
|
|
37
38
|
setContentType('application/octet-stream');
|
|
38
|
-
|
|
39
|
+
bufferOrStream = data;
|
|
40
|
+
break;
|
|
41
|
+
case 'webStream':
|
|
42
|
+
setContentType('application/octet-stream');
|
|
43
|
+
bufferOrStream = node_stream_1.Readable.fromWeb(data);
|
|
39
44
|
break;
|
|
40
45
|
case 'json':
|
|
41
46
|
setContentType('application/json');
|
|
42
|
-
|
|
47
|
+
bufferOrStream = Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
|
|
43
48
|
break;
|
|
44
49
|
case 'redirect':
|
|
45
|
-
|
|
50
|
+
bufferOrStream = Buffer.from(data, charset);
|
|
46
51
|
break;
|
|
47
52
|
case undefined:
|
|
48
53
|
// skip response. Some middleware may handle it outside the chain. For example, express middleware
|
|
@@ -83,11 +88,11 @@ exports.expressContext = (0, context_js_1.makeContext)(async ({ jsonBeautify, di
|
|
|
83
88
|
// write nothing
|
|
84
89
|
}
|
|
85
90
|
else {
|
|
86
|
-
if (Buffer.isBuffer(
|
|
91
|
+
if (Buffer.isBuffer(bufferOrStream)) {
|
|
87
92
|
// support: 304 (etag), zipping, file etag and last modified
|
|
88
|
-
res.setHeader('content-length',
|
|
93
|
+
res.setHeader('content-length', bufferOrStream.length);
|
|
89
94
|
if (!disableEtag) {
|
|
90
|
-
const etag = (0, etag_js_1.entityTag)(
|
|
95
|
+
const etag = (0, etag_js_1.entityTag)(bufferOrStream);
|
|
91
96
|
const lastModified = res.getHeader('last-modified');
|
|
92
97
|
res.setHeader('ETag', etag);
|
|
93
98
|
if ((0, etag_js_1.isFreshETag)(req, etag)) {
|
|
@@ -98,13 +103,13 @@ exports.expressContext = (0, context_js_1.makeContext)(async ({ jsonBeautify, di
|
|
|
98
103
|
// write nothing
|
|
99
104
|
}
|
|
100
105
|
else
|
|
101
|
-
res.write(
|
|
106
|
+
res.write(bufferOrStream);
|
|
102
107
|
}
|
|
103
108
|
else
|
|
104
|
-
res.write(
|
|
109
|
+
res.write(bufferOrStream);
|
|
105
110
|
}
|
|
106
111
|
else {
|
|
107
|
-
|
|
112
|
+
bufferOrStream.pipe(res);
|
|
108
113
|
}
|
|
109
114
|
// fixme: not support content-encoding (gzip, deflate, br) for now
|
|
110
115
|
}
|
|
@@ -137,15 +142,24 @@ function setBuffer(buffer, { status } = {}) {
|
|
|
137
142
|
express.type = 'buffer';
|
|
138
143
|
}
|
|
139
144
|
exports.setBuffer = setBuffer;
|
|
140
|
-
function
|
|
145
|
+
function setNodeStream(stream, { status } = {}) {
|
|
146
|
+
const response = context_js_1.responseContext.value;
|
|
147
|
+
const express = exports.expressContext.value;
|
|
148
|
+
if (status)
|
|
149
|
+
response.statusCode = status;
|
|
150
|
+
express.data = stream;
|
|
151
|
+
express.type = 'nodeStream';
|
|
152
|
+
}
|
|
153
|
+
exports.setNodeStream = setNodeStream;
|
|
154
|
+
function setWebStream(stream, { status } = {}) {
|
|
141
155
|
const response = context_js_1.responseContext.value;
|
|
142
156
|
const express = exports.expressContext.value;
|
|
143
157
|
if (status)
|
|
144
158
|
response.statusCode = status;
|
|
145
159
|
express.data = stream;
|
|
146
|
-
express.type = '
|
|
160
|
+
express.type = 'webStream';
|
|
147
161
|
}
|
|
148
|
-
exports.
|
|
162
|
+
exports.setWebStream = setWebStream;
|
|
149
163
|
function setJson(json, { status, beautify } = {}) {
|
|
150
164
|
const response = context_js_1.responseContext.value;
|
|
151
165
|
if (status)
|
|
@@ -165,4 +179,4 @@ function setRedirect(url, status) {
|
|
|
165
179
|
express.type = 'redirect';
|
|
166
180
|
}
|
|
167
181
|
exports.setRedirect = setRedirect;
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE4QjtBQUM5Qix5Q0FBbUM7QUFDbkMsdUNBQWdEO0FBQ2hELDZDQUF5RTtBQUN6RSw2Q0FBb0M7QUFFdkIsUUFBQSxjQUFjLEdBQUcsSUFBQSx3QkFBVyxFQUFDLEtBQUssRUFDOUMsRUFBQyxZQUFZLEVBQUUsV0FBVyxLQUd0QixFQUFFLEVBQ0wsRUFBRTtJQUNILE9BQU87UUFDTixZQUFZO1FBQ1osV0FBVztLQW1DVixDQUFBO0FBQ0gsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFDLEVBQUUsRUFBRTtJQUNsRSxNQUFNLEdBQUcsR0FBRyw0QkFBZSxDQUFDLEtBQUssQ0FBQTtJQUNqQyxNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFBRSxPQUFNO1FBQzVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN4RixDQUFDLENBQUE7SUFDRCxJQUFJLGNBQWMsQ0FBQTtJQUVsQixRQUFRLElBQUksRUFBRTtRQUNiLEtBQUssTUFBTTtZQUNWLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM3QixLQUFLLE1BQU07WUFDVixjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDM0IsbUJBQW1CO1lBQ25CLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FB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
|
package/esm/express.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
-
import {
|
|
3
|
+
import { Readable } from 'node:stream';
|
|
4
4
|
export declare const expressContext: {
|
|
5
5
|
readonly value: {
|
|
6
6
|
charset?: BufferEncoding | undefined;
|
|
@@ -22,8 +22,11 @@ export declare const expressContext: {
|
|
|
22
22
|
type: 'redirect';
|
|
23
23
|
data: string;
|
|
24
24
|
} | {
|
|
25
|
-
type: '
|
|
26
|
-
data:
|
|
25
|
+
type: 'nodeStream';
|
|
26
|
+
data: Readable;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'webStream';
|
|
29
|
+
data: ReadableStream;
|
|
27
30
|
});
|
|
28
31
|
chain(params_0?: {
|
|
29
32
|
jsonBeautify?: boolean | undefined;
|
|
@@ -39,7 +42,10 @@ export declare function setHtml(html: string, opts?: {
|
|
|
39
42
|
export declare function setBuffer(buffer: Buffer, { status }?: {
|
|
40
43
|
status?: number;
|
|
41
44
|
}): void;
|
|
42
|
-
export declare function
|
|
45
|
+
export declare function setNodeStream(stream: Readable, { status }?: {
|
|
46
|
+
status?: number;
|
|
47
|
+
}): void;
|
|
48
|
+
export declare function setWebStream(stream: ReadableStream, { status }?: {
|
|
43
49
|
status?: number;
|
|
44
50
|
}): void;
|
|
45
51
|
export declare function setJson(json: any, { status, beautify }?: {
|
package/esm/express.js
CHANGED
|
@@ -2,6 +2,7 @@ import makeDefer from 'jdefer';
|
|
|
2
2
|
import { promisify } from 'node:util';
|
|
3
3
|
import { entityTag, isFreshETag } from './etag.js';
|
|
4
4
|
import { makeContext, requestContext, responseContext } from './context.js';
|
|
5
|
+
import { Readable } from 'node:stream';
|
|
5
6
|
export const expressContext = makeContext(async ({ jsonBeautify, disableEtag } = {}) => {
|
|
6
7
|
return {
|
|
7
8
|
jsonBeautify,
|
|
@@ -14,29 +15,33 @@ export const expressContext = makeContext(async ({ jsonBeautify, disableEtag } =
|
|
|
14
15
|
return;
|
|
15
16
|
res.setHeader('content-type', `${contentType}${charset ? `; charset=${charset}` : ''}`);
|
|
16
17
|
};
|
|
17
|
-
let
|
|
18
|
+
let bufferOrStream;
|
|
18
19
|
switch (type) {
|
|
19
20
|
case 'text':
|
|
20
21
|
setContentType('text/plain');
|
|
21
22
|
case 'html':
|
|
22
23
|
setContentType('text/html');
|
|
23
24
|
// shared with text
|
|
24
|
-
|
|
25
|
+
bufferOrStream = Buffer.from(data, charset);
|
|
25
26
|
break;
|
|
26
27
|
case 'buffer':
|
|
27
28
|
setContentType('application/octet-stream');
|
|
28
|
-
|
|
29
|
+
bufferOrStream = data;
|
|
29
30
|
break;
|
|
30
|
-
case '
|
|
31
|
+
case 'nodeStream':
|
|
31
32
|
setContentType('application/octet-stream');
|
|
32
|
-
|
|
33
|
+
bufferOrStream = data;
|
|
34
|
+
break;
|
|
35
|
+
case 'webStream':
|
|
36
|
+
setContentType('application/octet-stream');
|
|
37
|
+
bufferOrStream = Readable.fromWeb(data);
|
|
33
38
|
break;
|
|
34
39
|
case 'json':
|
|
35
40
|
setContentType('application/json');
|
|
36
|
-
|
|
41
|
+
bufferOrStream = Buffer.from(jsonBeautify ? JSON.stringify(data, null, 2) : JSON.stringify(data), charset);
|
|
37
42
|
break;
|
|
38
43
|
case 'redirect':
|
|
39
|
-
|
|
44
|
+
bufferOrStream = Buffer.from(data, charset);
|
|
40
45
|
break;
|
|
41
46
|
case undefined:
|
|
42
47
|
// skip response. Some middleware may handle it outside the chain. For example, express middleware
|
|
@@ -77,11 +82,11 @@ export const expressContext = makeContext(async ({ jsonBeautify, disableEtag } =
|
|
|
77
82
|
// write nothing
|
|
78
83
|
}
|
|
79
84
|
else {
|
|
80
|
-
if (Buffer.isBuffer(
|
|
85
|
+
if (Buffer.isBuffer(bufferOrStream)) {
|
|
81
86
|
// support: 304 (etag), zipping, file etag and last modified
|
|
82
|
-
res.setHeader('content-length',
|
|
87
|
+
res.setHeader('content-length', bufferOrStream.length);
|
|
83
88
|
if (!disableEtag) {
|
|
84
|
-
const etag = entityTag(
|
|
89
|
+
const etag = entityTag(bufferOrStream);
|
|
85
90
|
const lastModified = res.getHeader('last-modified');
|
|
86
91
|
res.setHeader('ETag', etag);
|
|
87
92
|
if (isFreshETag(req, etag)) {
|
|
@@ -92,13 +97,13 @@ export const expressContext = makeContext(async ({ jsonBeautify, disableEtag } =
|
|
|
92
97
|
// write nothing
|
|
93
98
|
}
|
|
94
99
|
else
|
|
95
|
-
res.write(
|
|
100
|
+
res.write(bufferOrStream);
|
|
96
101
|
}
|
|
97
102
|
else
|
|
98
|
-
res.write(
|
|
103
|
+
res.write(bufferOrStream);
|
|
99
104
|
}
|
|
100
105
|
else {
|
|
101
|
-
|
|
106
|
+
bufferOrStream.pipe(res);
|
|
102
107
|
}
|
|
103
108
|
// fixme: not support content-encoding (gzip, deflate, br) for now
|
|
104
109
|
}
|
|
@@ -128,13 +133,21 @@ export function setBuffer(buffer, { status } = {}) {
|
|
|
128
133
|
express.data = buffer;
|
|
129
134
|
express.type = 'buffer';
|
|
130
135
|
}
|
|
131
|
-
export function
|
|
136
|
+
export function setNodeStream(stream, { status } = {}) {
|
|
137
|
+
const response = responseContext.value;
|
|
138
|
+
const express = expressContext.value;
|
|
139
|
+
if (status)
|
|
140
|
+
response.statusCode = status;
|
|
141
|
+
express.data = stream;
|
|
142
|
+
express.type = 'nodeStream';
|
|
143
|
+
}
|
|
144
|
+
export function setWebStream(stream, { status } = {}) {
|
|
132
145
|
const response = responseContext.value;
|
|
133
146
|
const express = expressContext.value;
|
|
134
147
|
if (status)
|
|
135
148
|
response.statusCode = status;
|
|
136
149
|
express.data = stream;
|
|
137
|
-
express.type = '
|
|
150
|
+
express.type = 'webStream';
|
|
138
151
|
}
|
|
139
152
|
export function setJson(json, { status, beautify } = {}) {
|
|
140
153
|
const response = responseContext.value;
|
|
@@ -153,4 +166,4 @@ export function setRedirect(url, status) {
|
|
|
153
166
|
express.data = url;
|
|
154
167
|
express.type = 'redirect';
|
|
155
168
|
}
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxNQUFNLFFBQVEsQ0FBQTtBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQ2hELE9BQU8sRUFBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN6RSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUM5QyxFQUFDLFlBQVksRUFBRSxXQUFXLEtBR3RCLEVBQUUsRUFDTCxFQUFFO0lBQ0gsT0FBTztRQUNOLFlBQVk7UUFDWixXQUFXO0tBbUNWLENBQUE7QUFDSCxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUMsRUFBRSxFQUFFO0lBQ2xFLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUE7SUFDakMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxXQUFtQixFQUFFLEVBQUU7UUFDOUMsSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO1lBQUUsT0FBTTtRQUM1RCxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDeEYsQ0FBQyxDQUFBO0lBQ0QsSUFBSSxjQUFjLENBQUE7SUFFbEIsUUFBUSxJQUFJLEVBQUU7UUFDYixL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
|