@hono/node-server 1.2.1 → 1.2.3
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/dist/index.js +55 -11
- package/dist/index.mjs +55 -11
- package/dist/listener.js +55 -11
- package/dist/listener.mjs +55 -11
- package/dist/serve-static.js +3 -5
- package/dist/serve-static.mjs +3 -5
- package/dist/server.js +55 -11
- package/dist/server.mjs +55 -11
- package/dist/utils.d.mts +5 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +67 -0
- package/dist/utils.mjs +42 -0
- package/dist/vercel.js +55 -11
- package/dist/vercel.mjs +55 -11
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -41,7 +41,6 @@ var import_node_http = require("http");
|
|
|
41
41
|
|
|
42
42
|
// src/listener.ts
|
|
43
43
|
var import_node_stream = require("stream");
|
|
44
|
-
var import_promises = require("stream/promises");
|
|
45
44
|
|
|
46
45
|
// src/globals.ts
|
|
47
46
|
var import_node_crypto = __toESM(require("crypto"));
|
|
@@ -59,6 +58,46 @@ global.fetch = (info, init) => {
|
|
|
59
58
|
return webFetch(info, init);
|
|
60
59
|
};
|
|
61
60
|
|
|
61
|
+
// src/utils.ts
|
|
62
|
+
function writeFromReadableStream(stream, writable) {
|
|
63
|
+
if (stream.locked) {
|
|
64
|
+
throw new TypeError("ReadableStream is locked.");
|
|
65
|
+
} else if (writable.destroyed) {
|
|
66
|
+
stream.cancel();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const reader = stream.getReader();
|
|
70
|
+
writable.on("close", cancel);
|
|
71
|
+
writable.on("error", cancel);
|
|
72
|
+
reader.read().then(flow, cancel);
|
|
73
|
+
return reader.closed.finally(() => {
|
|
74
|
+
writable.off("close", cancel);
|
|
75
|
+
writable.off("error", cancel);
|
|
76
|
+
});
|
|
77
|
+
function cancel(error) {
|
|
78
|
+
reader.cancel(error).catch(() => {
|
|
79
|
+
});
|
|
80
|
+
if (error)
|
|
81
|
+
writable.destroy(error);
|
|
82
|
+
}
|
|
83
|
+
function onDrain() {
|
|
84
|
+
reader.read().then(flow, cancel);
|
|
85
|
+
}
|
|
86
|
+
function flow({ done, value }) {
|
|
87
|
+
try {
|
|
88
|
+
if (done) {
|
|
89
|
+
writable.end();
|
|
90
|
+
} else if (!writable.write(value)) {
|
|
91
|
+
writable.once("drain", onDrain);
|
|
92
|
+
} else {
|
|
93
|
+
return reader.read().then(flow, cancel);
|
|
94
|
+
}
|
|
95
|
+
} catch (e) {
|
|
96
|
+
cancel(e);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
62
101
|
// src/listener.ts
|
|
63
102
|
var regBuffer = /^no$/i;
|
|
64
103
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -81,7 +120,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
81
120
|
}
|
|
82
121
|
let res;
|
|
83
122
|
try {
|
|
84
|
-
res = await fetchCallback(new Request(url
|
|
123
|
+
res = await fetchCallback(new Request(url, init));
|
|
85
124
|
} catch (e) {
|
|
86
125
|
res = new Response(null, { status: 500 });
|
|
87
126
|
if (e instanceof Error) {
|
|
@@ -91,24 +130,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
91
130
|
}
|
|
92
131
|
}
|
|
93
132
|
const resHeaderRecord = {};
|
|
133
|
+
const cookies = [];
|
|
94
134
|
for (const [k, v] of res.headers) {
|
|
95
|
-
resHeaderRecord[k] = v;
|
|
96
135
|
if (k === "set-cookie") {
|
|
97
|
-
|
|
136
|
+
cookies.push(v);
|
|
98
137
|
} else {
|
|
99
|
-
|
|
138
|
+
resHeaderRecord[k] = v;
|
|
100
139
|
}
|
|
101
140
|
}
|
|
102
|
-
|
|
141
|
+
if (cookies.length > 0) {
|
|
142
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
143
|
+
}
|
|
103
144
|
if (res.body) {
|
|
104
145
|
try {
|
|
105
146
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
106
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
107
|
-
|
|
147
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
148
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
149
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
108
150
|
} else {
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
outgoing.
|
|
151
|
+
const buffer = await res.arrayBuffer();
|
|
152
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
153
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
154
|
+
outgoing.end(new Uint8Array(buffer));
|
|
112
155
|
}
|
|
113
156
|
} catch (e) {
|
|
114
157
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -120,6 +163,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
120
163
|
}
|
|
121
164
|
}
|
|
122
165
|
} else {
|
|
166
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
123
167
|
outgoing.end();
|
|
124
168
|
}
|
|
125
169
|
};
|
package/dist/index.mjs
CHANGED
|
@@ -3,7 +3,6 @@ import { createServer as createServerHTTP } from "http";
|
|
|
3
3
|
|
|
4
4
|
// src/listener.ts
|
|
5
5
|
import { Readable } from "stream";
|
|
6
|
-
import { pipeline } from "stream/promises";
|
|
7
6
|
|
|
8
7
|
// src/globals.ts
|
|
9
8
|
import crypto from "crypto";
|
|
@@ -21,6 +20,46 @@ global.fetch = (info, init) => {
|
|
|
21
20
|
return webFetch(info, init);
|
|
22
21
|
};
|
|
23
22
|
|
|
23
|
+
// src/utils.ts
|
|
24
|
+
function writeFromReadableStream(stream, writable) {
|
|
25
|
+
if (stream.locked) {
|
|
26
|
+
throw new TypeError("ReadableStream is locked.");
|
|
27
|
+
} else if (writable.destroyed) {
|
|
28
|
+
stream.cancel();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const reader = stream.getReader();
|
|
32
|
+
writable.on("close", cancel);
|
|
33
|
+
writable.on("error", cancel);
|
|
34
|
+
reader.read().then(flow, cancel);
|
|
35
|
+
return reader.closed.finally(() => {
|
|
36
|
+
writable.off("close", cancel);
|
|
37
|
+
writable.off("error", cancel);
|
|
38
|
+
});
|
|
39
|
+
function cancel(error) {
|
|
40
|
+
reader.cancel(error).catch(() => {
|
|
41
|
+
});
|
|
42
|
+
if (error)
|
|
43
|
+
writable.destroy(error);
|
|
44
|
+
}
|
|
45
|
+
function onDrain() {
|
|
46
|
+
reader.read().then(flow, cancel);
|
|
47
|
+
}
|
|
48
|
+
function flow({ done, value }) {
|
|
49
|
+
try {
|
|
50
|
+
if (done) {
|
|
51
|
+
writable.end();
|
|
52
|
+
} else if (!writable.write(value)) {
|
|
53
|
+
writable.once("drain", onDrain);
|
|
54
|
+
} else {
|
|
55
|
+
return reader.read().then(flow, cancel);
|
|
56
|
+
}
|
|
57
|
+
} catch (e) {
|
|
58
|
+
cancel(e);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
24
63
|
// src/listener.ts
|
|
25
64
|
var regBuffer = /^no$/i;
|
|
26
65
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -43,7 +82,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
43
82
|
}
|
|
44
83
|
let res;
|
|
45
84
|
try {
|
|
46
|
-
res = await fetchCallback(new Request(url
|
|
85
|
+
res = await fetchCallback(new Request(url, init));
|
|
47
86
|
} catch (e) {
|
|
48
87
|
res = new Response(null, { status: 500 });
|
|
49
88
|
if (e instanceof Error) {
|
|
@@ -53,24 +92,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
53
92
|
}
|
|
54
93
|
}
|
|
55
94
|
const resHeaderRecord = {};
|
|
95
|
+
const cookies = [];
|
|
56
96
|
for (const [k, v] of res.headers) {
|
|
57
|
-
resHeaderRecord[k] = v;
|
|
58
97
|
if (k === "set-cookie") {
|
|
59
|
-
|
|
98
|
+
cookies.push(v);
|
|
60
99
|
} else {
|
|
61
|
-
|
|
100
|
+
resHeaderRecord[k] = v;
|
|
62
101
|
}
|
|
63
102
|
}
|
|
64
|
-
|
|
103
|
+
if (cookies.length > 0) {
|
|
104
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
105
|
+
}
|
|
65
106
|
if (res.body) {
|
|
66
107
|
try {
|
|
67
108
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
68
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
69
|
-
|
|
109
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
110
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
111
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
70
112
|
} else {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
outgoing.
|
|
113
|
+
const buffer = await res.arrayBuffer();
|
|
114
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
115
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
116
|
+
outgoing.end(new Uint8Array(buffer));
|
|
74
117
|
}
|
|
75
118
|
} catch (e) {
|
|
76
119
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -82,6 +125,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
82
125
|
}
|
|
83
126
|
}
|
|
84
127
|
} else {
|
|
128
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
85
129
|
outgoing.end();
|
|
86
130
|
}
|
|
87
131
|
};
|
package/dist/listener.js
CHANGED
|
@@ -34,7 +34,6 @@ __export(listener_exports, {
|
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(listener_exports);
|
|
36
36
|
var import_node_stream = require("stream");
|
|
37
|
-
var import_promises = require("stream/promises");
|
|
38
37
|
|
|
39
38
|
// src/globals.ts
|
|
40
39
|
var import_node_crypto = __toESM(require("crypto"));
|
|
@@ -52,6 +51,46 @@ global.fetch = (info, init) => {
|
|
|
52
51
|
return webFetch(info, init);
|
|
53
52
|
};
|
|
54
53
|
|
|
54
|
+
// src/utils.ts
|
|
55
|
+
function writeFromReadableStream(stream, writable) {
|
|
56
|
+
if (stream.locked) {
|
|
57
|
+
throw new TypeError("ReadableStream is locked.");
|
|
58
|
+
} else if (writable.destroyed) {
|
|
59
|
+
stream.cancel();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const reader = stream.getReader();
|
|
63
|
+
writable.on("close", cancel);
|
|
64
|
+
writable.on("error", cancel);
|
|
65
|
+
reader.read().then(flow, cancel);
|
|
66
|
+
return reader.closed.finally(() => {
|
|
67
|
+
writable.off("close", cancel);
|
|
68
|
+
writable.off("error", cancel);
|
|
69
|
+
});
|
|
70
|
+
function cancel(error) {
|
|
71
|
+
reader.cancel(error).catch(() => {
|
|
72
|
+
});
|
|
73
|
+
if (error)
|
|
74
|
+
writable.destroy(error);
|
|
75
|
+
}
|
|
76
|
+
function onDrain() {
|
|
77
|
+
reader.read().then(flow, cancel);
|
|
78
|
+
}
|
|
79
|
+
function flow({ done, value }) {
|
|
80
|
+
try {
|
|
81
|
+
if (done) {
|
|
82
|
+
writable.end();
|
|
83
|
+
} else if (!writable.write(value)) {
|
|
84
|
+
writable.once("drain", onDrain);
|
|
85
|
+
} else {
|
|
86
|
+
return reader.read().then(flow, cancel);
|
|
87
|
+
}
|
|
88
|
+
} catch (e) {
|
|
89
|
+
cancel(e);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
55
94
|
// src/listener.ts
|
|
56
95
|
var regBuffer = /^no$/i;
|
|
57
96
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -74,7 +113,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
74
113
|
}
|
|
75
114
|
let res;
|
|
76
115
|
try {
|
|
77
|
-
res = await fetchCallback(new Request(url
|
|
116
|
+
res = await fetchCallback(new Request(url, init));
|
|
78
117
|
} catch (e) {
|
|
79
118
|
res = new Response(null, { status: 500 });
|
|
80
119
|
if (e instanceof Error) {
|
|
@@ -84,24 +123,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
84
123
|
}
|
|
85
124
|
}
|
|
86
125
|
const resHeaderRecord = {};
|
|
126
|
+
const cookies = [];
|
|
87
127
|
for (const [k, v] of res.headers) {
|
|
88
|
-
resHeaderRecord[k] = v;
|
|
89
128
|
if (k === "set-cookie") {
|
|
90
|
-
|
|
129
|
+
cookies.push(v);
|
|
91
130
|
} else {
|
|
92
|
-
|
|
131
|
+
resHeaderRecord[k] = v;
|
|
93
132
|
}
|
|
94
133
|
}
|
|
95
|
-
|
|
134
|
+
if (cookies.length > 0) {
|
|
135
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
136
|
+
}
|
|
96
137
|
if (res.body) {
|
|
97
138
|
try {
|
|
98
139
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
99
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
100
|
-
|
|
140
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
141
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
142
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
101
143
|
} else {
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
outgoing.
|
|
144
|
+
const buffer = await res.arrayBuffer();
|
|
145
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
146
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
147
|
+
outgoing.end(new Uint8Array(buffer));
|
|
105
148
|
}
|
|
106
149
|
} catch (e) {
|
|
107
150
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -113,6 +156,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
113
156
|
}
|
|
114
157
|
}
|
|
115
158
|
} else {
|
|
159
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
116
160
|
outgoing.end();
|
|
117
161
|
}
|
|
118
162
|
};
|
package/dist/listener.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// src/listener.ts
|
|
2
2
|
import { Readable } from "stream";
|
|
3
|
-
import { pipeline } from "stream/promises";
|
|
4
3
|
|
|
5
4
|
// src/globals.ts
|
|
6
5
|
import crypto from "crypto";
|
|
@@ -18,6 +17,46 @@ global.fetch = (info, init) => {
|
|
|
18
17
|
return webFetch(info, init);
|
|
19
18
|
};
|
|
20
19
|
|
|
20
|
+
// src/utils.ts
|
|
21
|
+
function writeFromReadableStream(stream, writable) {
|
|
22
|
+
if (stream.locked) {
|
|
23
|
+
throw new TypeError("ReadableStream is locked.");
|
|
24
|
+
} else if (writable.destroyed) {
|
|
25
|
+
stream.cancel();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const reader = stream.getReader();
|
|
29
|
+
writable.on("close", cancel);
|
|
30
|
+
writable.on("error", cancel);
|
|
31
|
+
reader.read().then(flow, cancel);
|
|
32
|
+
return reader.closed.finally(() => {
|
|
33
|
+
writable.off("close", cancel);
|
|
34
|
+
writable.off("error", cancel);
|
|
35
|
+
});
|
|
36
|
+
function cancel(error) {
|
|
37
|
+
reader.cancel(error).catch(() => {
|
|
38
|
+
});
|
|
39
|
+
if (error)
|
|
40
|
+
writable.destroy(error);
|
|
41
|
+
}
|
|
42
|
+
function onDrain() {
|
|
43
|
+
reader.read().then(flow, cancel);
|
|
44
|
+
}
|
|
45
|
+
function flow({ done, value }) {
|
|
46
|
+
try {
|
|
47
|
+
if (done) {
|
|
48
|
+
writable.end();
|
|
49
|
+
} else if (!writable.write(value)) {
|
|
50
|
+
writable.once("drain", onDrain);
|
|
51
|
+
} else {
|
|
52
|
+
return reader.read().then(flow, cancel);
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
cancel(e);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
21
60
|
// src/listener.ts
|
|
22
61
|
var regBuffer = /^no$/i;
|
|
23
62
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -40,7 +79,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
40
79
|
}
|
|
41
80
|
let res;
|
|
42
81
|
try {
|
|
43
|
-
res = await fetchCallback(new Request(url
|
|
82
|
+
res = await fetchCallback(new Request(url, init));
|
|
44
83
|
} catch (e) {
|
|
45
84
|
res = new Response(null, { status: 500 });
|
|
46
85
|
if (e instanceof Error) {
|
|
@@ -50,24 +89,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
50
89
|
}
|
|
51
90
|
}
|
|
52
91
|
const resHeaderRecord = {};
|
|
92
|
+
const cookies = [];
|
|
53
93
|
for (const [k, v] of res.headers) {
|
|
54
|
-
resHeaderRecord[k] = v;
|
|
55
94
|
if (k === "set-cookie") {
|
|
56
|
-
|
|
95
|
+
cookies.push(v);
|
|
57
96
|
} else {
|
|
58
|
-
|
|
97
|
+
resHeaderRecord[k] = v;
|
|
59
98
|
}
|
|
60
99
|
}
|
|
61
|
-
|
|
100
|
+
if (cookies.length > 0) {
|
|
101
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
102
|
+
}
|
|
62
103
|
if (res.body) {
|
|
63
104
|
try {
|
|
64
105
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
65
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
66
|
-
|
|
106
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
107
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
108
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
67
109
|
} else {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
outgoing.
|
|
110
|
+
const buffer = await res.arrayBuffer();
|
|
111
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
112
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
113
|
+
outgoing.end(new Uint8Array(buffer));
|
|
71
114
|
}
|
|
72
115
|
} catch (e) {
|
|
73
116
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -79,6 +122,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
79
122
|
}
|
|
80
123
|
}
|
|
81
124
|
} else {
|
|
125
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
82
126
|
outgoing.end();
|
|
83
127
|
}
|
|
84
128
|
};
|
package/dist/serve-static.js
CHANGED
|
@@ -191,11 +191,9 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
191
191
|
}
|
|
192
192
|
c.header("Accept-Ranges", "bytes");
|
|
193
193
|
c.header("Date", stat.birthtime.toUTCString());
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
start = parseInt(parts[0], 10);
|
|
198
|
-
end = parts[1] ? parseInt(parts[1], 10) : end;
|
|
194
|
+
const parts = range.replace(/bytes=/, "").split("-", 2);
|
|
195
|
+
const start = parts[0] ? parseInt(parts[0], 10) : 0;
|
|
196
|
+
let end = parts[1] ? parseInt(parts[1], 10) : stat.size - 1;
|
|
199
197
|
if (size < end - start + 1) {
|
|
200
198
|
end = size - 1;
|
|
201
199
|
}
|
package/dist/serve-static.mjs
CHANGED
|
@@ -167,11 +167,9 @@ var serveStatic = (options = { root: "" }) => {
|
|
|
167
167
|
}
|
|
168
168
|
c.header("Accept-Ranges", "bytes");
|
|
169
169
|
c.header("Date", stat.birthtime.toUTCString());
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
start = parseInt(parts[0], 10);
|
|
174
|
-
end = parts[1] ? parseInt(parts[1], 10) : end;
|
|
170
|
+
const parts = range.replace(/bytes=/, "").split("-", 2);
|
|
171
|
+
const start = parts[0] ? parseInt(parts[0], 10) : 0;
|
|
172
|
+
let end = parts[1] ? parseInt(parts[1], 10) : stat.size - 1;
|
|
175
173
|
if (size < end - start + 1) {
|
|
176
174
|
end = size - 1;
|
|
177
175
|
}
|
package/dist/server.js
CHANGED
|
@@ -38,7 +38,6 @@ var import_node_http = require("http");
|
|
|
38
38
|
|
|
39
39
|
// src/listener.ts
|
|
40
40
|
var import_node_stream = require("stream");
|
|
41
|
-
var import_promises = require("stream/promises");
|
|
42
41
|
|
|
43
42
|
// src/globals.ts
|
|
44
43
|
var import_node_crypto = __toESM(require("crypto"));
|
|
@@ -56,6 +55,46 @@ global.fetch = (info, init) => {
|
|
|
56
55
|
return webFetch(info, init);
|
|
57
56
|
};
|
|
58
57
|
|
|
58
|
+
// src/utils.ts
|
|
59
|
+
function writeFromReadableStream(stream, writable) {
|
|
60
|
+
if (stream.locked) {
|
|
61
|
+
throw new TypeError("ReadableStream is locked.");
|
|
62
|
+
} else if (writable.destroyed) {
|
|
63
|
+
stream.cancel();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const reader = stream.getReader();
|
|
67
|
+
writable.on("close", cancel);
|
|
68
|
+
writable.on("error", cancel);
|
|
69
|
+
reader.read().then(flow, cancel);
|
|
70
|
+
return reader.closed.finally(() => {
|
|
71
|
+
writable.off("close", cancel);
|
|
72
|
+
writable.off("error", cancel);
|
|
73
|
+
});
|
|
74
|
+
function cancel(error) {
|
|
75
|
+
reader.cancel(error).catch(() => {
|
|
76
|
+
});
|
|
77
|
+
if (error)
|
|
78
|
+
writable.destroy(error);
|
|
79
|
+
}
|
|
80
|
+
function onDrain() {
|
|
81
|
+
reader.read().then(flow, cancel);
|
|
82
|
+
}
|
|
83
|
+
function flow({ done, value }) {
|
|
84
|
+
try {
|
|
85
|
+
if (done) {
|
|
86
|
+
writable.end();
|
|
87
|
+
} else if (!writable.write(value)) {
|
|
88
|
+
writable.once("drain", onDrain);
|
|
89
|
+
} else {
|
|
90
|
+
return reader.read().then(flow, cancel);
|
|
91
|
+
}
|
|
92
|
+
} catch (e) {
|
|
93
|
+
cancel(e);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
59
98
|
// src/listener.ts
|
|
60
99
|
var regBuffer = /^no$/i;
|
|
61
100
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -78,7 +117,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
78
117
|
}
|
|
79
118
|
let res;
|
|
80
119
|
try {
|
|
81
|
-
res = await fetchCallback(new Request(url
|
|
120
|
+
res = await fetchCallback(new Request(url, init));
|
|
82
121
|
} catch (e) {
|
|
83
122
|
res = new Response(null, { status: 500 });
|
|
84
123
|
if (e instanceof Error) {
|
|
@@ -88,24 +127,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
88
127
|
}
|
|
89
128
|
}
|
|
90
129
|
const resHeaderRecord = {};
|
|
130
|
+
const cookies = [];
|
|
91
131
|
for (const [k, v] of res.headers) {
|
|
92
|
-
resHeaderRecord[k] = v;
|
|
93
132
|
if (k === "set-cookie") {
|
|
94
|
-
|
|
133
|
+
cookies.push(v);
|
|
95
134
|
} else {
|
|
96
|
-
|
|
135
|
+
resHeaderRecord[k] = v;
|
|
97
136
|
}
|
|
98
137
|
}
|
|
99
|
-
|
|
138
|
+
if (cookies.length > 0) {
|
|
139
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
140
|
+
}
|
|
100
141
|
if (res.body) {
|
|
101
142
|
try {
|
|
102
143
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
103
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
104
|
-
|
|
144
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
145
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
146
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
105
147
|
} else {
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
outgoing.
|
|
148
|
+
const buffer = await res.arrayBuffer();
|
|
149
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
150
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
151
|
+
outgoing.end(new Uint8Array(buffer));
|
|
109
152
|
}
|
|
110
153
|
} catch (e) {
|
|
111
154
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -117,6 +160,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
117
160
|
}
|
|
118
161
|
}
|
|
119
162
|
} else {
|
|
163
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
120
164
|
outgoing.end();
|
|
121
165
|
}
|
|
122
166
|
};
|
package/dist/server.mjs
CHANGED
|
@@ -3,7 +3,6 @@ import { createServer as createServerHTTP } from "http";
|
|
|
3
3
|
|
|
4
4
|
// src/listener.ts
|
|
5
5
|
import { Readable } from "stream";
|
|
6
|
-
import { pipeline } from "stream/promises";
|
|
7
6
|
|
|
8
7
|
// src/globals.ts
|
|
9
8
|
import crypto from "crypto";
|
|
@@ -21,6 +20,46 @@ global.fetch = (info, init) => {
|
|
|
21
20
|
return webFetch(info, init);
|
|
22
21
|
};
|
|
23
22
|
|
|
23
|
+
// src/utils.ts
|
|
24
|
+
function writeFromReadableStream(stream, writable) {
|
|
25
|
+
if (stream.locked) {
|
|
26
|
+
throw new TypeError("ReadableStream is locked.");
|
|
27
|
+
} else if (writable.destroyed) {
|
|
28
|
+
stream.cancel();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const reader = stream.getReader();
|
|
32
|
+
writable.on("close", cancel);
|
|
33
|
+
writable.on("error", cancel);
|
|
34
|
+
reader.read().then(flow, cancel);
|
|
35
|
+
return reader.closed.finally(() => {
|
|
36
|
+
writable.off("close", cancel);
|
|
37
|
+
writable.off("error", cancel);
|
|
38
|
+
});
|
|
39
|
+
function cancel(error) {
|
|
40
|
+
reader.cancel(error).catch(() => {
|
|
41
|
+
});
|
|
42
|
+
if (error)
|
|
43
|
+
writable.destroy(error);
|
|
44
|
+
}
|
|
45
|
+
function onDrain() {
|
|
46
|
+
reader.read().then(flow, cancel);
|
|
47
|
+
}
|
|
48
|
+
function flow({ done, value }) {
|
|
49
|
+
try {
|
|
50
|
+
if (done) {
|
|
51
|
+
writable.end();
|
|
52
|
+
} else if (!writable.write(value)) {
|
|
53
|
+
writable.once("drain", onDrain);
|
|
54
|
+
} else {
|
|
55
|
+
return reader.read().then(flow, cancel);
|
|
56
|
+
}
|
|
57
|
+
} catch (e) {
|
|
58
|
+
cancel(e);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
24
63
|
// src/listener.ts
|
|
25
64
|
var regBuffer = /^no$/i;
|
|
26
65
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -43,7 +82,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
43
82
|
}
|
|
44
83
|
let res;
|
|
45
84
|
try {
|
|
46
|
-
res = await fetchCallback(new Request(url
|
|
85
|
+
res = await fetchCallback(new Request(url, init));
|
|
47
86
|
} catch (e) {
|
|
48
87
|
res = new Response(null, { status: 500 });
|
|
49
88
|
if (e instanceof Error) {
|
|
@@ -53,24 +92,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
53
92
|
}
|
|
54
93
|
}
|
|
55
94
|
const resHeaderRecord = {};
|
|
95
|
+
const cookies = [];
|
|
56
96
|
for (const [k, v] of res.headers) {
|
|
57
|
-
resHeaderRecord[k] = v;
|
|
58
97
|
if (k === "set-cookie") {
|
|
59
|
-
|
|
98
|
+
cookies.push(v);
|
|
60
99
|
} else {
|
|
61
|
-
|
|
100
|
+
resHeaderRecord[k] = v;
|
|
62
101
|
}
|
|
63
102
|
}
|
|
64
|
-
|
|
103
|
+
if (cookies.length > 0) {
|
|
104
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
105
|
+
}
|
|
65
106
|
if (res.body) {
|
|
66
107
|
try {
|
|
67
108
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
68
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
69
|
-
|
|
109
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
110
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
111
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
70
112
|
} else {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
outgoing.
|
|
113
|
+
const buffer = await res.arrayBuffer();
|
|
114
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
115
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
116
|
+
outgoing.end(new Uint8Array(buffer));
|
|
74
117
|
}
|
|
75
118
|
} catch (e) {
|
|
76
119
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -82,6 +125,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
82
125
|
}
|
|
83
126
|
}
|
|
84
127
|
} else {
|
|
128
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
85
129
|
outgoing.end();
|
|
86
130
|
}
|
|
87
131
|
};
|
package/dist/utils.d.mts
ADDED
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/utils.ts
|
|
21
|
+
var utils_exports = {};
|
|
22
|
+
__export(utils_exports, {
|
|
23
|
+
writeFromReadableStream: () => writeFromReadableStream
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(utils_exports);
|
|
26
|
+
function writeFromReadableStream(stream, writable) {
|
|
27
|
+
if (stream.locked) {
|
|
28
|
+
throw new TypeError("ReadableStream is locked.");
|
|
29
|
+
} else if (writable.destroyed) {
|
|
30
|
+
stream.cancel();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const reader = stream.getReader();
|
|
34
|
+
writable.on("close", cancel);
|
|
35
|
+
writable.on("error", cancel);
|
|
36
|
+
reader.read().then(flow, cancel);
|
|
37
|
+
return reader.closed.finally(() => {
|
|
38
|
+
writable.off("close", cancel);
|
|
39
|
+
writable.off("error", cancel);
|
|
40
|
+
});
|
|
41
|
+
function cancel(error) {
|
|
42
|
+
reader.cancel(error).catch(() => {
|
|
43
|
+
});
|
|
44
|
+
if (error)
|
|
45
|
+
writable.destroy(error);
|
|
46
|
+
}
|
|
47
|
+
function onDrain() {
|
|
48
|
+
reader.read().then(flow, cancel);
|
|
49
|
+
}
|
|
50
|
+
function flow({ done, value }) {
|
|
51
|
+
try {
|
|
52
|
+
if (done) {
|
|
53
|
+
writable.end();
|
|
54
|
+
} else if (!writable.write(value)) {
|
|
55
|
+
writable.once("drain", onDrain);
|
|
56
|
+
} else {
|
|
57
|
+
return reader.read().then(flow, cancel);
|
|
58
|
+
}
|
|
59
|
+
} catch (e) {
|
|
60
|
+
cancel(e);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
65
|
+
0 && (module.exports = {
|
|
66
|
+
writeFromReadableStream
|
|
67
|
+
});
|
package/dist/utils.mjs
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/utils.ts
|
|
2
|
+
function writeFromReadableStream(stream, writable) {
|
|
3
|
+
if (stream.locked) {
|
|
4
|
+
throw new TypeError("ReadableStream is locked.");
|
|
5
|
+
} else if (writable.destroyed) {
|
|
6
|
+
stream.cancel();
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const reader = stream.getReader();
|
|
10
|
+
writable.on("close", cancel);
|
|
11
|
+
writable.on("error", cancel);
|
|
12
|
+
reader.read().then(flow, cancel);
|
|
13
|
+
return reader.closed.finally(() => {
|
|
14
|
+
writable.off("close", cancel);
|
|
15
|
+
writable.off("error", cancel);
|
|
16
|
+
});
|
|
17
|
+
function cancel(error) {
|
|
18
|
+
reader.cancel(error).catch(() => {
|
|
19
|
+
});
|
|
20
|
+
if (error)
|
|
21
|
+
writable.destroy(error);
|
|
22
|
+
}
|
|
23
|
+
function onDrain() {
|
|
24
|
+
reader.read().then(flow, cancel);
|
|
25
|
+
}
|
|
26
|
+
function flow({ done, value }) {
|
|
27
|
+
try {
|
|
28
|
+
if (done) {
|
|
29
|
+
writable.end();
|
|
30
|
+
} else if (!writable.write(value)) {
|
|
31
|
+
writable.once("drain", onDrain);
|
|
32
|
+
} else {
|
|
33
|
+
return reader.read().then(flow, cancel);
|
|
34
|
+
}
|
|
35
|
+
} catch (e) {
|
|
36
|
+
cancel(e);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
writeFromReadableStream
|
|
42
|
+
};
|
package/dist/vercel.js
CHANGED
|
@@ -36,7 +36,6 @@ module.exports = __toCommonJS(vercel_exports);
|
|
|
36
36
|
|
|
37
37
|
// src/listener.ts
|
|
38
38
|
var import_node_stream = require("stream");
|
|
39
|
-
var import_promises = require("stream/promises");
|
|
40
39
|
|
|
41
40
|
// src/globals.ts
|
|
42
41
|
var import_node_crypto = __toESM(require("crypto"));
|
|
@@ -54,6 +53,46 @@ global.fetch = (info, init) => {
|
|
|
54
53
|
return webFetch(info, init);
|
|
55
54
|
};
|
|
56
55
|
|
|
56
|
+
// src/utils.ts
|
|
57
|
+
function writeFromReadableStream(stream, writable) {
|
|
58
|
+
if (stream.locked) {
|
|
59
|
+
throw new TypeError("ReadableStream is locked.");
|
|
60
|
+
} else if (writable.destroyed) {
|
|
61
|
+
stream.cancel();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const reader = stream.getReader();
|
|
65
|
+
writable.on("close", cancel);
|
|
66
|
+
writable.on("error", cancel);
|
|
67
|
+
reader.read().then(flow, cancel);
|
|
68
|
+
return reader.closed.finally(() => {
|
|
69
|
+
writable.off("close", cancel);
|
|
70
|
+
writable.off("error", cancel);
|
|
71
|
+
});
|
|
72
|
+
function cancel(error) {
|
|
73
|
+
reader.cancel(error).catch(() => {
|
|
74
|
+
});
|
|
75
|
+
if (error)
|
|
76
|
+
writable.destroy(error);
|
|
77
|
+
}
|
|
78
|
+
function onDrain() {
|
|
79
|
+
reader.read().then(flow, cancel);
|
|
80
|
+
}
|
|
81
|
+
function flow({ done, value }) {
|
|
82
|
+
try {
|
|
83
|
+
if (done) {
|
|
84
|
+
writable.end();
|
|
85
|
+
} else if (!writable.write(value)) {
|
|
86
|
+
writable.once("drain", onDrain);
|
|
87
|
+
} else {
|
|
88
|
+
return reader.read().then(flow, cancel);
|
|
89
|
+
}
|
|
90
|
+
} catch (e) {
|
|
91
|
+
cancel(e);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
57
96
|
// src/listener.ts
|
|
58
97
|
var regBuffer = /^no$/i;
|
|
59
98
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -76,7 +115,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
76
115
|
}
|
|
77
116
|
let res;
|
|
78
117
|
try {
|
|
79
|
-
res = await fetchCallback(new Request(url
|
|
118
|
+
res = await fetchCallback(new Request(url, init));
|
|
80
119
|
} catch (e) {
|
|
81
120
|
res = new Response(null, { status: 500 });
|
|
82
121
|
if (e instanceof Error) {
|
|
@@ -86,24 +125,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
86
125
|
}
|
|
87
126
|
}
|
|
88
127
|
const resHeaderRecord = {};
|
|
128
|
+
const cookies = [];
|
|
89
129
|
for (const [k, v] of res.headers) {
|
|
90
|
-
resHeaderRecord[k] = v;
|
|
91
130
|
if (k === "set-cookie") {
|
|
92
|
-
|
|
131
|
+
cookies.push(v);
|
|
93
132
|
} else {
|
|
94
|
-
|
|
133
|
+
resHeaderRecord[k] = v;
|
|
95
134
|
}
|
|
96
135
|
}
|
|
97
|
-
|
|
136
|
+
if (cookies.length > 0) {
|
|
137
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
138
|
+
}
|
|
98
139
|
if (res.body) {
|
|
99
140
|
try {
|
|
100
141
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
101
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
102
|
-
|
|
142
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
143
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
144
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
103
145
|
} else {
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
outgoing.
|
|
146
|
+
const buffer = await res.arrayBuffer();
|
|
147
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
148
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
149
|
+
outgoing.end(new Uint8Array(buffer));
|
|
107
150
|
}
|
|
108
151
|
} catch (e) {
|
|
109
152
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -115,6 +158,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
115
158
|
}
|
|
116
159
|
}
|
|
117
160
|
} else {
|
|
161
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
118
162
|
outgoing.end();
|
|
119
163
|
}
|
|
120
164
|
};
|
package/dist/vercel.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// src/listener.ts
|
|
2
2
|
import { Readable } from "stream";
|
|
3
|
-
import { pipeline } from "stream/promises";
|
|
4
3
|
|
|
5
4
|
// src/globals.ts
|
|
6
5
|
import crypto from "crypto";
|
|
@@ -18,6 +17,46 @@ global.fetch = (info, init) => {
|
|
|
18
17
|
return webFetch(info, init);
|
|
19
18
|
};
|
|
20
19
|
|
|
20
|
+
// src/utils.ts
|
|
21
|
+
function writeFromReadableStream(stream, writable) {
|
|
22
|
+
if (stream.locked) {
|
|
23
|
+
throw new TypeError("ReadableStream is locked.");
|
|
24
|
+
} else if (writable.destroyed) {
|
|
25
|
+
stream.cancel();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const reader = stream.getReader();
|
|
29
|
+
writable.on("close", cancel);
|
|
30
|
+
writable.on("error", cancel);
|
|
31
|
+
reader.read().then(flow, cancel);
|
|
32
|
+
return reader.closed.finally(() => {
|
|
33
|
+
writable.off("close", cancel);
|
|
34
|
+
writable.off("error", cancel);
|
|
35
|
+
});
|
|
36
|
+
function cancel(error) {
|
|
37
|
+
reader.cancel(error).catch(() => {
|
|
38
|
+
});
|
|
39
|
+
if (error)
|
|
40
|
+
writable.destroy(error);
|
|
41
|
+
}
|
|
42
|
+
function onDrain() {
|
|
43
|
+
reader.read().then(flow, cancel);
|
|
44
|
+
}
|
|
45
|
+
function flow({ done, value }) {
|
|
46
|
+
try {
|
|
47
|
+
if (done) {
|
|
48
|
+
writable.end();
|
|
49
|
+
} else if (!writable.write(value)) {
|
|
50
|
+
writable.once("drain", onDrain);
|
|
51
|
+
} else {
|
|
52
|
+
return reader.read().then(flow, cancel);
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
cancel(e);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
21
60
|
// src/listener.ts
|
|
22
61
|
var regBuffer = /^no$/i;
|
|
23
62
|
var regContentType = /^(application\/json\b|text\/(?!event-stream\b))/i;
|
|
@@ -40,7 +79,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
40
79
|
}
|
|
41
80
|
let res;
|
|
42
81
|
try {
|
|
43
|
-
res = await fetchCallback(new Request(url
|
|
82
|
+
res = await fetchCallback(new Request(url, init));
|
|
44
83
|
} catch (e) {
|
|
45
84
|
res = new Response(null, { status: 500 });
|
|
46
85
|
if (e instanceof Error) {
|
|
@@ -50,24 +89,28 @@ var getRequestListener = (fetchCallback) => {
|
|
|
50
89
|
}
|
|
51
90
|
}
|
|
52
91
|
const resHeaderRecord = {};
|
|
92
|
+
const cookies = [];
|
|
53
93
|
for (const [k, v] of res.headers) {
|
|
54
|
-
resHeaderRecord[k] = v;
|
|
55
94
|
if (k === "set-cookie") {
|
|
56
|
-
|
|
95
|
+
cookies.push(v);
|
|
57
96
|
} else {
|
|
58
|
-
|
|
97
|
+
resHeaderRecord[k] = v;
|
|
59
98
|
}
|
|
60
99
|
}
|
|
61
|
-
|
|
100
|
+
if (cookies.length > 0) {
|
|
101
|
+
resHeaderRecord["set-cookie"] = cookies;
|
|
102
|
+
}
|
|
62
103
|
if (res.body) {
|
|
63
104
|
try {
|
|
64
105
|
if (resHeaderRecord["transfer-encoding"] || resHeaderRecord["content-encoding"] || resHeaderRecord["content-length"] || // nginx buffering variant
|
|
65
|
-
regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
66
|
-
|
|
106
|
+
resHeaderRecord["x-accel-buffering"] && regBuffer.test(resHeaderRecord["x-accel-buffering"]) || !regContentType.test(resHeaderRecord["content-type"])) {
|
|
107
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
108
|
+
await writeFromReadableStream(res.body, outgoing);
|
|
67
109
|
} else {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
outgoing.
|
|
110
|
+
const buffer = await res.arrayBuffer();
|
|
111
|
+
resHeaderRecord["content-length"] = buffer.byteLength;
|
|
112
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
113
|
+
outgoing.end(new Uint8Array(buffer));
|
|
71
114
|
}
|
|
72
115
|
} catch (e) {
|
|
73
116
|
const err = e instanceof Error ? e : new Error("unknown error", { cause: e });
|
|
@@ -79,6 +122,7 @@ var getRequestListener = (fetchCallback) => {
|
|
|
79
122
|
}
|
|
80
123
|
}
|
|
81
124
|
} else {
|
|
125
|
+
outgoing.writeHead(res.status, resHeaderRecord);
|
|
82
126
|
outgoing.end();
|
|
83
127
|
}
|
|
84
128
|
};
|