elit 3.6.5 → 3.6.7
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/Cargo.lock +1 -1
- package/Cargo.toml +1 -1
- package/README.md +6 -0
- package/dist/build.cjs +421 -331
- package/dist/build.d.ts +1 -16
- package/dist/build.js +420 -330
- package/dist/build.mjs +420 -330
- package/dist/chokidar.cjs +219 -182
- package/dist/chokidar.d.ts +25 -10
- package/dist/chokidar.js +217 -182
- package/dist/chokidar.mjs +218 -183
- package/dist/cli.cjs +21608 -20241
- package/dist/cli.d.ts +19 -37
- package/dist/cli.mjs +21262 -19910
- package/dist/config.cjs +357 -350
- package/dist/config.d.ts +19 -240
- package/dist/config.js +520 -515
- package/dist/config.mjs +346 -341
- package/dist/contracts-BeW9k0yZ.d.ts +54 -0
- package/dist/contracts-D7KIS-TK.d.ts +36 -0
- package/dist/coverage.cjs +448 -485
- package/dist/coverage.d.ts +13 -59
- package/dist/coverage.js +447 -484
- package/dist/coverage.mjs +447 -484
- package/dist/database.cjs +819 -828
- package/dist/database.d.ts +8 -24
- package/dist/database.js +818 -829
- package/dist/database.mjs +818 -829
- package/dist/desktop-auto-render.cjs +1700 -1522
- package/dist/desktop-auto-render.d.ts +4 -9
- package/dist/desktop-auto-render.js +1695 -1517
- package/dist/desktop-auto-render.mjs +1696 -1518
- package/dist/desktop.cjs +3 -1
- package/dist/desktop.d.ts +4 -1
- package/dist/desktop.js +1 -1
- package/dist/desktop.mjs +1 -1
- package/dist/dev-build.cjs +830 -0
- package/dist/dev-build.d.ts +53 -0
- package/dist/dev-build.js +3318 -0
- package/dist/dev-build.mjs +797 -0
- package/dist/dom.cjs +717 -590
- package/dist/dom.d.ts +2 -15
- package/dist/dom.js +714 -587
- package/dist/dom.mjs +716 -589
- package/dist/el.cjs +62 -52
- package/dist/el.d.ts +5 -10
- package/dist/el.js +60 -52
- package/dist/el.mjs +60 -52
- package/dist/fs.cjs +72 -63
- package/dist/fs.d.ts +22 -19
- package/dist/fs.js +71 -62
- package/dist/fs.mjs +71 -62
- package/dist/hmr.cjs +40 -14
- package/dist/hmr.d.ts +11 -23
- package/dist/hmr.js +38 -14
- package/dist/hmr.mjs +38 -14
- package/dist/http.cjs +251 -99
- package/dist/http.d.ts +38 -104
- package/dist/http.js +249 -99
- package/dist/http.mjs +249 -99
- package/dist/https.cjs +524 -228
- package/dist/https.d.ts +44 -36
- package/dist/https.js +520 -226
- package/dist/https.mjs +522 -228
- package/dist/index.cjs +7502 -7690
- package/dist/index.d.ts +8 -3
- package/dist/index.js +7486 -7676
- package/dist/index.mjs +7497 -7686
- package/dist/mime-types.cjs +10 -4
- package/dist/mime-types.d.ts +8 -11
- package/dist/mime-types.js +9 -3
- package/dist/mime-types.mjs +9 -3
- package/dist/native.cjs +8616 -8869
- package/dist/native.d.ts +7 -8
- package/dist/native.js +8682 -8935
- package/dist/native.mjs +8615 -8868
- package/dist/path.cjs +83 -77
- package/dist/path.d.ts +29 -29
- package/dist/path.js +82 -76
- package/dist/path.mjs +82 -76
- package/dist/pm.cjs +3300 -0
- package/dist/pm.d.ts +256 -0
- package/dist/pm.js +5638 -0
- package/dist/pm.mjs +3196 -0
- package/dist/preview-build.cjs +712 -0
- package/dist/preview-build.d.ts +59 -0
- package/dist/preview-build.js +3194 -0
- package/dist/preview-build.mjs +676 -0
- package/dist/render-context.cjs +13 -2
- package/dist/render-context.d.ts +9 -31
- package/dist/render-context.js +11 -2
- package/dist/render-context.mjs +11 -2
- package/dist/router.cjs +787 -645
- package/dist/router.d.ts +8 -12
- package/dist/router.js +786 -644
- package/dist/router.mjs +786 -644
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.mjs +1 -1
- package/dist/server.cjs +3315 -2603
- package/dist/server.d.ts +49 -4
- package/dist/server.js +7611 -2834
- package/dist/server.mjs +3317 -2607
- package/dist/smtp-server.cjs +128 -0
- package/dist/smtp-server.d.ts +27 -0
- package/dist/smtp-server.js +4199 -0
- package/dist/smtp-server.mjs +100 -0
- package/dist/state-DvEkDehk.d.ts +195 -0
- package/dist/state.cjs +768 -658
- package/dist/state.d.ts +11 -69
- package/dist/state.js +760 -650
- package/dist/state.mjs +767 -657
- package/dist/style.cjs +1011 -968
- package/dist/style.d.ts +13 -127
- package/dist/style.js +1009 -970
- package/dist/style.mjs +1011 -971
- package/dist/test-reporter.cjs +332 -316
- package/dist/test-reporter.d.ts +28 -33
- package/dist/test-reporter.js +328 -312
- package/dist/test-reporter.mjs +328 -312
- package/dist/test-runtime.cjs +927 -968
- package/dist/test-runtime.d.ts +24 -99
- package/dist/test-runtime.js +922 -965
- package/dist/test-runtime.mjs +922 -965
- package/dist/test.cjs +4428 -4273
- package/dist/test.d.ts +2 -8
- package/dist/test.js +4307 -4154
- package/dist/test.mjs +4419 -4267
- package/dist/types-BONVzPtp.d.ts +59 -0
- package/dist/types-BR4wMiVx.d.ts +32 -0
- package/dist/types-C4gKykuG.d.ts +23 -0
- package/dist/types-CIhpN1-K.d.ts +64 -0
- package/dist/types-Ckj8md_j.d.ts +84 -0
- package/dist/types-CpjQTAkX.d.ts +24 -0
- package/dist/types-D0LjrYjS.d.ts +14 -0
- package/dist/types-DAisuVr5.d.ts +75 -0
- package/dist/types-tJn88E1N.d.ts +242 -0
- package/dist/types.d.ts +71 -226
- package/dist/universal.cjs +1 -1
- package/dist/universal.d.ts +1 -5
- package/dist/universal.js +1 -1
- package/dist/universal.mjs +1 -1
- package/dist/websocket-XfyK23zD.d.ts +119 -0
- package/dist/ws.cjs +129 -108
- package/dist/ws.d.ts +21 -131
- package/dist/ws.js +128 -109
- package/dist/ws.mjs +128 -109
- package/dist/wss.cjs +757 -479
- package/dist/wss.d.ts +31 -28
- package/dist/wss.js +755 -479
- package/dist/wss.mjs +758 -482
- package/package.json +16 -1
- package/vendor/epaint-0.31.1/src/image.rs +418 -0
- package/dist/server-CcBFc2F5.d.ts +0 -449
package/dist/wss.mjs
CHANGED
|
@@ -26,10 +26,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
26
26
|
};
|
|
27
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
28
|
|
|
29
|
-
// src/runtime.ts
|
|
29
|
+
// src/shares/runtime.ts
|
|
30
30
|
var runtime, isNode, isBun, isDeno;
|
|
31
31
|
var init_runtime = __esm({
|
|
32
|
-
"src/runtime.ts"() {
|
|
32
|
+
"src/shares/runtime.ts"() {
|
|
33
33
|
"use strict";
|
|
34
34
|
runtime = (() => {
|
|
35
35
|
if (typeof Deno !== "undefined") return "deno";
|
|
@@ -42,26 +42,78 @@ var init_runtime = __esm({
|
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
-
// src/http.ts
|
|
46
|
-
|
|
47
|
-
__export(http_exports, {
|
|
48
|
-
Agent: () => Agent,
|
|
49
|
-
ClientRequest: () => ClientRequest,
|
|
50
|
-
IncomingMessage: () => IncomingMessage,
|
|
51
|
-
METHODS: () => METHODS,
|
|
52
|
-
STATUS_CODES: () => STATUS_CODES,
|
|
53
|
-
Server: () => Server,
|
|
54
|
-
ServerResponse: () => ServerResponse,
|
|
55
|
-
createServer: () => createServer,
|
|
56
|
-
default: () => http_default,
|
|
57
|
-
get: () => get,
|
|
58
|
-
getRuntime: () => getRuntime,
|
|
59
|
-
request: () => request
|
|
60
|
-
});
|
|
61
|
-
import { EventEmitter } from "events";
|
|
62
|
-
function queueCallback(callback) {
|
|
45
|
+
// src/server/http/utils.ts
|
|
46
|
+
function queueCallback2(callback) {
|
|
63
47
|
if (callback) queueMicrotask(callback);
|
|
64
48
|
}
|
|
49
|
+
function getRequestPath2(url) {
|
|
50
|
+
if (!url) return "";
|
|
51
|
+
try {
|
|
52
|
+
const urlObj = new URL(url);
|
|
53
|
+
return urlObj.pathname + urlObj.search;
|
|
54
|
+
} catch {
|
|
55
|
+
return url;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function headersToRecord(headers) {
|
|
59
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
60
|
+
headers.forEach((value, key) => {
|
|
61
|
+
result[key] = value;
|
|
62
|
+
});
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
function headersToRawHeaders(headers) {
|
|
66
|
+
const rawHeaders = [];
|
|
67
|
+
headers.forEach((value, key) => {
|
|
68
|
+
rawHeaders.push(key, value);
|
|
69
|
+
});
|
|
70
|
+
return rawHeaders;
|
|
71
|
+
}
|
|
72
|
+
function normalizeRequestBodyChunk(chunk, encoding = "utf8") {
|
|
73
|
+
if (typeof chunk === "string") {
|
|
74
|
+
if (encoding !== "utf8" && typeof Buffer !== "undefined") {
|
|
75
|
+
return Buffer.from(chunk, encoding);
|
|
76
|
+
}
|
|
77
|
+
return chunk;
|
|
78
|
+
}
|
|
79
|
+
if (chunk instanceof Uint8Array) {
|
|
80
|
+
return chunk;
|
|
81
|
+
}
|
|
82
|
+
if (chunk instanceof ArrayBuffer) {
|
|
83
|
+
return new Uint8Array(chunk);
|
|
84
|
+
}
|
|
85
|
+
if (ArrayBuffer.isView(chunk)) {
|
|
86
|
+
return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);
|
|
87
|
+
}
|
|
88
|
+
return new TextEncoder().encode(String(chunk));
|
|
89
|
+
}
|
|
90
|
+
function buildRequestBody(chunks) {
|
|
91
|
+
if (chunks.length === 0) {
|
|
92
|
+
return void 0;
|
|
93
|
+
}
|
|
94
|
+
if (chunks.length === 1) {
|
|
95
|
+
return chunks[0];
|
|
96
|
+
}
|
|
97
|
+
if (chunks.every((chunk) => typeof chunk === "string")) {
|
|
98
|
+
return chunks.join("");
|
|
99
|
+
}
|
|
100
|
+
const encoder = new TextEncoder();
|
|
101
|
+
const bodyParts = chunks.map((chunk) => typeof chunk === "string" ? encoder.encode(chunk) : chunk);
|
|
102
|
+
const totalLength = bodyParts.reduce((sum, part) => sum + part.byteLength, 0);
|
|
103
|
+
const body = new Uint8Array(totalLength);
|
|
104
|
+
let offset = 0;
|
|
105
|
+
for (const part of bodyParts) {
|
|
106
|
+
body.set(part, offset);
|
|
107
|
+
offset += part.byteLength;
|
|
108
|
+
}
|
|
109
|
+
return body;
|
|
110
|
+
}
|
|
111
|
+
function isFetchResponse(value) {
|
|
112
|
+
return typeof value?.status === "number" && typeof value?.statusText === "string" && typeof value?.headers?.forEach === "function";
|
|
113
|
+
}
|
|
114
|
+
function isNodeIncomingMessage(value) {
|
|
115
|
+
return typeof value?.on === "function" && typeof value?.headers === "object" && (typeof value?.httpVersion === "string" || value?.socket !== void 0);
|
|
116
|
+
}
|
|
65
117
|
function headersToInit(headers) {
|
|
66
118
|
const result = {};
|
|
67
119
|
for (const key in headers) {
|
|
@@ -79,75 +131,110 @@ function createErrorResponse() {
|
|
|
79
131
|
function emitListeningWithCallback(server, callback) {
|
|
80
132
|
server._listening = true;
|
|
81
133
|
server.emit("listening");
|
|
82
|
-
|
|
134
|
+
queueCallback2(callback);
|
|
83
135
|
}
|
|
84
136
|
function closeAndEmit(server, callback) {
|
|
85
137
|
server._listening = false;
|
|
86
138
|
server.emit("close");
|
|
87
139
|
if (callback) queueMicrotask(() => callback());
|
|
88
140
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}, (res) => {
|
|
104
|
-
const incomingMessage = new IncomingMessage(res);
|
|
105
|
-
if (callback) callback(incomingMessage);
|
|
106
|
-
req.emit("response", incomingMessage);
|
|
107
|
-
});
|
|
108
|
-
nodeReq.on("error", (error) => req.emit("error", error));
|
|
109
|
-
nodeReq.end();
|
|
110
|
-
} else {
|
|
111
|
-
queueMicrotask(async () => {
|
|
112
|
-
try {
|
|
113
|
-
const response = await fetch(urlString, {
|
|
114
|
-
method: options?.method || "GET",
|
|
115
|
-
headers: options?.headers,
|
|
116
|
-
signal: options?.signal
|
|
117
|
-
});
|
|
118
|
-
const fetchRequest = new Request(urlString);
|
|
119
|
-
const incomingMessage = new IncomingMessage(fetchRequest);
|
|
120
|
-
incomingMessage.statusCode = response.status;
|
|
121
|
-
incomingMessage.statusMessage = response.statusText;
|
|
122
|
-
if (callback) callback(incomingMessage);
|
|
123
|
-
req.emit("response", incomingMessage);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
req.emit("error", error);
|
|
141
|
+
var init_utils = __esm({
|
|
142
|
+
"src/server/http/utils.ts"() {
|
|
143
|
+
"use strict";
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// src/server/http/agent.ts
|
|
148
|
+
var Agent;
|
|
149
|
+
var init_agent = __esm({
|
|
150
|
+
"src/server/http/agent.ts"() {
|
|
151
|
+
"use strict";
|
|
152
|
+
Agent = class {
|
|
153
|
+
constructor(options) {
|
|
154
|
+
this.options = options;
|
|
126
155
|
}
|
|
127
|
-
}
|
|
156
|
+
};
|
|
128
157
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
var http, https, METHODS, STATUS_CODES, IncomingMessage, ServerResponse, Server, ClientRequest, Agent, http_default;
|
|
138
|
-
var init_http = __esm({
|
|
139
|
-
"src/http.ts"() {
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// src/server/http/client-request.ts
|
|
161
|
+
import { EventEmitter as EventEmitter4 } from "events";
|
|
162
|
+
var ClientRequest;
|
|
163
|
+
var init_client_request = __esm({
|
|
164
|
+
"src/server/http/client-request.ts"() {
|
|
140
165
|
"use strict";
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
http = __require("http");
|
|
148
|
-
https = __require("https");
|
|
166
|
+
init_utils();
|
|
167
|
+
ClientRequest = class extends EventEmitter4 {
|
|
168
|
+
constructor(_url, _options = {}) {
|
|
169
|
+
super();
|
|
170
|
+
this._bodyChunks = [];
|
|
171
|
+
this._ended = false;
|
|
149
172
|
}
|
|
150
|
-
|
|
173
|
+
_setNativeRequest(nativeRequest) {
|
|
174
|
+
this._nativeRequest = nativeRequest;
|
|
175
|
+
}
|
|
176
|
+
_setExecutor(executor) {
|
|
177
|
+
this._executor = executor;
|
|
178
|
+
}
|
|
179
|
+
write(chunk, encoding, callback) {
|
|
180
|
+
if (this._ended) {
|
|
181
|
+
throw new Error("Cannot write after end");
|
|
182
|
+
}
|
|
183
|
+
if (typeof encoding === "function") {
|
|
184
|
+
callback = encoding;
|
|
185
|
+
encoding = void 0;
|
|
186
|
+
}
|
|
187
|
+
if (this._nativeRequest) {
|
|
188
|
+
const actualEncoding2 = typeof encoding === "string" ? encoding : void 0;
|
|
189
|
+
return this._nativeRequest.write(chunk, actualEncoding2, callback);
|
|
190
|
+
}
|
|
191
|
+
const actualEncoding = typeof encoding === "string" ? encoding : "utf8";
|
|
192
|
+
this._bodyChunks.push(normalizeRequestBodyChunk(chunk, actualEncoding));
|
|
193
|
+
queueCallback2(callback);
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
end(chunk, encoding, callback) {
|
|
197
|
+
if (typeof chunk === "function") {
|
|
198
|
+
callback = chunk;
|
|
199
|
+
chunk = void 0;
|
|
200
|
+
encoding = void 0;
|
|
201
|
+
} else if (typeof encoding === "function") {
|
|
202
|
+
callback = encoding;
|
|
203
|
+
encoding = void 0;
|
|
204
|
+
}
|
|
205
|
+
if (this._ended) {
|
|
206
|
+
queueCallback2(callback);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
this._ended = true;
|
|
210
|
+
if (this._nativeRequest) {
|
|
211
|
+
const actualEncoding = typeof encoding === "string" ? encoding : void 0;
|
|
212
|
+
if (chunk !== void 0) {
|
|
213
|
+
this._nativeRequest.end(chunk, actualEncoding, callback);
|
|
214
|
+
} else {
|
|
215
|
+
this._nativeRequest.end(callback);
|
|
216
|
+
}
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (chunk !== void 0) {
|
|
220
|
+
this._bodyChunks.push(normalizeRequestBodyChunk(chunk, typeof encoding === "string" ? encoding : "utf8"));
|
|
221
|
+
}
|
|
222
|
+
const executor = this._executor;
|
|
223
|
+
const body = buildRequestBody(this._bodyChunks);
|
|
224
|
+
if (executor) {
|
|
225
|
+
Promise.resolve().then(() => executor(body)).catch((error) => this.emit("error", error));
|
|
226
|
+
}
|
|
227
|
+
queueCallback2(callback);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// src/server/http/constants.ts
|
|
234
|
+
var METHODS, STATUS_CODES;
|
|
235
|
+
var init_constants = __esm({
|
|
236
|
+
"src/server/http/constants.ts"() {
|
|
237
|
+
"use strict";
|
|
151
238
|
METHODS = [
|
|
152
239
|
"GET",
|
|
153
240
|
"POST",
|
|
@@ -215,13 +302,30 @@ var init_http = __esm({
|
|
|
215
302
|
510: "Not Extended",
|
|
216
303
|
511: "Network Authentication Required"
|
|
217
304
|
};
|
|
218
|
-
|
|
219
|
-
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
// src/server/http/incoming-message.ts
|
|
309
|
+
import { EventEmitter as EventEmitter5 } from "events";
|
|
310
|
+
var IncomingMessage;
|
|
311
|
+
var init_incoming_message = __esm({
|
|
312
|
+
"src/server/http/incoming-message.ts"() {
|
|
313
|
+
"use strict";
|
|
314
|
+
init_utils();
|
|
315
|
+
IncomingMessage = class extends EventEmitter5 {
|
|
316
|
+
constructor(req, requestMethod) {
|
|
220
317
|
super();
|
|
221
318
|
this.httpVersion = "1.1";
|
|
222
319
|
this.rawHeaders = [];
|
|
223
320
|
this._req = req;
|
|
224
|
-
if (
|
|
321
|
+
if (isFetchResponse(req)) {
|
|
322
|
+
this.method = requestMethod || "GET";
|
|
323
|
+
this.url = getRequestPath2(req.url);
|
|
324
|
+
this.headers = headersToRecord(req.headers);
|
|
325
|
+
this.statusCode = req.status;
|
|
326
|
+
this.statusMessage = req.statusText;
|
|
327
|
+
this.rawHeaders = headersToRawHeaders(req.headers);
|
|
328
|
+
} else if (isNodeIncomingMessage(req)) {
|
|
225
329
|
this.method = req.method;
|
|
226
330
|
this.url = req.url;
|
|
227
331
|
this.headers = req.headers;
|
|
@@ -232,14 +336,13 @@ var init_http = __esm({
|
|
|
232
336
|
this.socket = req.socket;
|
|
233
337
|
} else {
|
|
234
338
|
this.method = req.method;
|
|
235
|
-
|
|
236
|
-
this.
|
|
237
|
-
this.
|
|
238
|
-
this.rawHeaders = [];
|
|
339
|
+
this.url = getRequestPath2(req.url);
|
|
340
|
+
this.headers = headersToRecord(req.headers);
|
|
341
|
+
this.rawHeaders = headersToRawHeaders(req.headers);
|
|
239
342
|
}
|
|
240
343
|
}
|
|
241
344
|
async text() {
|
|
242
|
-
if (
|
|
345
|
+
if (isNodeIncomingMessage(this._req)) {
|
|
243
346
|
return new Promise((resolve, reject) => {
|
|
244
347
|
const chunks = [];
|
|
245
348
|
this._req.on("data", (chunk) => chunks.push(chunk));
|
|
@@ -250,14 +353,92 @@ var init_http = __esm({
|
|
|
250
353
|
return this._req.text();
|
|
251
354
|
}
|
|
252
355
|
async json() {
|
|
253
|
-
if (
|
|
356
|
+
if (isNodeIncomingMessage(this._req)) {
|
|
254
357
|
const text = await this.text();
|
|
255
358
|
return JSON.parse(text);
|
|
256
359
|
}
|
|
257
360
|
return this._req.json();
|
|
258
361
|
}
|
|
259
362
|
};
|
|
260
|
-
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
// src/server/http/node-modules.ts
|
|
367
|
+
var http, https;
|
|
368
|
+
var init_node_modules = __esm({
|
|
369
|
+
"src/server/http/node-modules.ts"() {
|
|
370
|
+
"use strict";
|
|
371
|
+
init_runtime();
|
|
372
|
+
if (isNode && typeof process !== "undefined") {
|
|
373
|
+
try {
|
|
374
|
+
http = __require("http");
|
|
375
|
+
https = __require("https");
|
|
376
|
+
} catch {
|
|
377
|
+
http = __require("http");
|
|
378
|
+
https = __require("https");
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
// src/server/http/request-api.ts
|
|
385
|
+
function request(url, options, callback) {
|
|
386
|
+
const urlString = typeof url === "string" ? url : url.toString();
|
|
387
|
+
const req = new ClientRequest(urlString, options);
|
|
388
|
+
if (isNode) {
|
|
389
|
+
const urlObj = new URL(urlString);
|
|
390
|
+
const client = urlObj.protocol === "https:" ? https : http;
|
|
391
|
+
const nodeReq = client.request(urlString, {
|
|
392
|
+
method: options?.method || "GET",
|
|
393
|
+
headers: options?.headers,
|
|
394
|
+
timeout: options?.timeout,
|
|
395
|
+
signal: options?.signal
|
|
396
|
+
}, (res) => {
|
|
397
|
+
const incomingMessage = new IncomingMessage(res);
|
|
398
|
+
if (callback) callback(incomingMessage);
|
|
399
|
+
req.emit("response", incomingMessage);
|
|
400
|
+
});
|
|
401
|
+
req._setNativeRequest(nodeReq);
|
|
402
|
+
nodeReq.on("error", (error) => req.emit("error", error));
|
|
403
|
+
} else {
|
|
404
|
+
req._setExecutor(async (body) => {
|
|
405
|
+
const response = await fetch(urlString, {
|
|
406
|
+
method: options?.method || "GET",
|
|
407
|
+
headers: options?.headers,
|
|
408
|
+
body,
|
|
409
|
+
signal: options?.signal
|
|
410
|
+
});
|
|
411
|
+
const incomingMessage = new IncomingMessage(response, options?.method || "GET");
|
|
412
|
+
if (callback) callback(incomingMessage);
|
|
413
|
+
req.emit("response", incomingMessage);
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
return req;
|
|
417
|
+
}
|
|
418
|
+
function get(url, options, callback) {
|
|
419
|
+
const req = request(url, { ...options, method: "GET" }, callback);
|
|
420
|
+
req.end();
|
|
421
|
+
return req;
|
|
422
|
+
}
|
|
423
|
+
var init_request_api = __esm({
|
|
424
|
+
"src/server/http/request-api.ts"() {
|
|
425
|
+
"use strict";
|
|
426
|
+
init_runtime();
|
|
427
|
+
init_client_request();
|
|
428
|
+
init_incoming_message();
|
|
429
|
+
init_node_modules();
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
// src/server/http/response.ts
|
|
434
|
+
import { EventEmitter as EventEmitter6 } from "events";
|
|
435
|
+
var ServerResponse;
|
|
436
|
+
var init_response = __esm({
|
|
437
|
+
"src/server/http/response.ts"() {
|
|
438
|
+
"use strict";
|
|
439
|
+
init_runtime();
|
|
440
|
+
init_utils();
|
|
441
|
+
ServerResponse = class extends EventEmitter6 {
|
|
261
442
|
constructor(_req, nodeRes) {
|
|
262
443
|
super();
|
|
263
444
|
this.statusCode = 200;
|
|
@@ -350,7 +531,7 @@ var init_http = __esm({
|
|
|
350
531
|
return this._nodeRes.write(chunk, encoding, callback);
|
|
351
532
|
}
|
|
352
533
|
this._body += chunk;
|
|
353
|
-
|
|
534
|
+
queueCallback2(callback);
|
|
354
535
|
return true;
|
|
355
536
|
}
|
|
356
537
|
end(chunk, encoding, callback) {
|
|
@@ -383,14 +564,13 @@ var init_http = __esm({
|
|
|
383
564
|
if (this._resolve) {
|
|
384
565
|
this._resolve(response);
|
|
385
566
|
}
|
|
386
|
-
|
|
567
|
+
queueCallback2(callback);
|
|
387
568
|
}
|
|
388
569
|
return this;
|
|
389
570
|
}
|
|
390
571
|
_setResolver(resolve) {
|
|
391
572
|
this._resolve = resolve;
|
|
392
573
|
}
|
|
393
|
-
// Express.js-like methods
|
|
394
574
|
json(data, statusCode = 200) {
|
|
395
575
|
if (!this.headersSent) {
|
|
396
576
|
this.setHeader("Content-Type", "application/json");
|
|
@@ -414,7 +594,35 @@ var init_http = __esm({
|
|
|
414
594
|
return this;
|
|
415
595
|
}
|
|
416
596
|
};
|
|
417
|
-
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
// src/server/http/runtime.ts
|
|
601
|
+
function getRuntime3() {
|
|
602
|
+
return runtime;
|
|
603
|
+
}
|
|
604
|
+
var init_runtime2 = __esm({
|
|
605
|
+
"src/server/http/runtime.ts"() {
|
|
606
|
+
"use strict";
|
|
607
|
+
init_runtime();
|
|
608
|
+
}
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
// src/server/http/server-runtime.ts
|
|
612
|
+
import { EventEmitter as EventEmitter7 } from "events";
|
|
613
|
+
function createServer(optionsOrListener, requestListener) {
|
|
614
|
+
return new Server(typeof optionsOrListener === "function" ? optionsOrListener : requestListener);
|
|
615
|
+
}
|
|
616
|
+
var Server;
|
|
617
|
+
var init_server_runtime = __esm({
|
|
618
|
+
"src/server/http/server-runtime.ts"() {
|
|
619
|
+
"use strict";
|
|
620
|
+
init_runtime();
|
|
621
|
+
init_node_modules();
|
|
622
|
+
init_incoming_message();
|
|
623
|
+
init_response();
|
|
624
|
+
init_utils();
|
|
625
|
+
Server = class extends EventEmitter7 {
|
|
418
626
|
constructor(requestListener) {
|
|
419
627
|
super();
|
|
420
628
|
this._bunWebSocketServers = /* @__PURE__ */ new Set();
|
|
@@ -489,6 +697,8 @@ var init_http = __esm({
|
|
|
489
697
|
const urlObj = new URL(req.url);
|
|
490
698
|
const pathname = urlObj.pathname;
|
|
491
699
|
const requestUrl = urlObj.pathname + urlObj.search;
|
|
700
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
701
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
492
702
|
const upgradeHeader = req.headers.get("upgrade");
|
|
493
703
|
if (upgradeHeader && upgradeHeader.toLowerCase() === "websocket") {
|
|
494
704
|
const matchingWebSocketServer = Array.from(this._bunWebSocketServers).find((wsServer) => {
|
|
@@ -525,9 +735,9 @@ var init_http = __esm({
|
|
|
525
735
|
const incomingMessage = {
|
|
526
736
|
method: req.method,
|
|
527
737
|
url: requestUrl,
|
|
528
|
-
headers:
|
|
738
|
+
headers: incomingHeaders,
|
|
529
739
|
httpVersion: "1.1",
|
|
530
|
-
rawHeaders
|
|
740
|
+
rawHeaders,
|
|
531
741
|
_req: req,
|
|
532
742
|
text: () => req.text(),
|
|
533
743
|
json: () => req.json()
|
|
@@ -586,6 +796,8 @@ var init_http = __esm({
|
|
|
586
796
|
};
|
|
587
797
|
if (self.requestListener) {
|
|
588
798
|
self.requestListener(incomingMessage, serverResponse);
|
|
799
|
+
} else {
|
|
800
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
589
801
|
}
|
|
590
802
|
if (responseReady) {
|
|
591
803
|
return new Response(body, {
|
|
@@ -660,9 +872,11 @@ var init_http = __esm({
|
|
|
660
872
|
return createAddress(0, addr, "unix");
|
|
661
873
|
}
|
|
662
874
|
return addr;
|
|
663
|
-
}
|
|
875
|
+
}
|
|
876
|
+
if (isBun) {
|
|
664
877
|
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
665
|
-
}
|
|
878
|
+
}
|
|
879
|
+
if (isDeno) {
|
|
666
880
|
const addr = this.nativeServer.addr;
|
|
667
881
|
return createAddress(addr.port, addr.hostname);
|
|
668
882
|
}
|
|
@@ -672,22 +886,45 @@ var init_http = __esm({
|
|
|
672
886
|
return this._listening;
|
|
673
887
|
}
|
|
674
888
|
};
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
889
|
+
}
|
|
890
|
+
});
|
|
891
|
+
|
|
892
|
+
// src/server/http/index.ts
|
|
893
|
+
var http_exports = {};
|
|
894
|
+
__export(http_exports, {
|
|
895
|
+
Agent: () => Agent,
|
|
896
|
+
ClientRequest: () => ClientRequest,
|
|
897
|
+
IncomingMessage: () => IncomingMessage,
|
|
898
|
+
METHODS: () => METHODS,
|
|
899
|
+
STATUS_CODES: () => STATUS_CODES,
|
|
900
|
+
Server: () => Server,
|
|
901
|
+
ServerResponse: () => ServerResponse,
|
|
902
|
+
createServer: () => createServer,
|
|
903
|
+
default: () => http_default,
|
|
904
|
+
get: () => get,
|
|
905
|
+
getRuntime: () => getRuntime3,
|
|
906
|
+
request: () => request
|
|
907
|
+
});
|
|
908
|
+
var http_default;
|
|
909
|
+
var init_http = __esm({
|
|
910
|
+
"src/server/http/index.ts"() {
|
|
911
|
+
"use strict";
|
|
912
|
+
init_agent();
|
|
913
|
+
init_client_request();
|
|
914
|
+
init_constants();
|
|
915
|
+
init_incoming_message();
|
|
916
|
+
init_request_api();
|
|
917
|
+
init_response();
|
|
918
|
+
init_runtime2();
|
|
919
|
+
init_server_runtime();
|
|
920
|
+
init_agent();
|
|
921
|
+
init_client_request();
|
|
922
|
+
init_constants();
|
|
923
|
+
init_incoming_message();
|
|
924
|
+
init_request_api();
|
|
925
|
+
init_response();
|
|
926
|
+
init_runtime2();
|
|
927
|
+
init_server_runtime();
|
|
691
928
|
http_default = {
|
|
692
929
|
createServer,
|
|
693
930
|
request,
|
|
@@ -699,227 +936,44 @@ var init_http = __esm({
|
|
|
699
936
|
ClientRequest,
|
|
700
937
|
METHODS,
|
|
701
938
|
STATUS_CODES,
|
|
702
|
-
getRuntime
|
|
939
|
+
getRuntime: getRuntime3
|
|
703
940
|
};
|
|
704
941
|
}
|
|
705
942
|
});
|
|
706
943
|
|
|
707
|
-
// src/
|
|
708
|
-
|
|
944
|
+
// src/server/ws/constants.ts
|
|
945
|
+
var ReadyState = /* @__PURE__ */ ((ReadyState2) => {
|
|
946
|
+
ReadyState2[ReadyState2["CONNECTING"] = 0] = "CONNECTING";
|
|
947
|
+
ReadyState2[ReadyState2["OPEN"] = 1] = "OPEN";
|
|
948
|
+
ReadyState2[ReadyState2["CLOSING"] = 2] = "CLOSING";
|
|
949
|
+
ReadyState2[ReadyState2["CLOSED"] = 3] = "CLOSED";
|
|
950
|
+
return ReadyState2;
|
|
951
|
+
})(ReadyState || {});
|
|
952
|
+
var CLOSE_CODES = {
|
|
953
|
+
NORMAL: 1e3,
|
|
954
|
+
GOING_AWAY: 1001,
|
|
955
|
+
PROTOCOL_ERROR: 1002,
|
|
956
|
+
UNSUPPORTED_DATA: 1003,
|
|
957
|
+
NO_STATUS: 1005,
|
|
958
|
+
ABNORMAL: 1006,
|
|
959
|
+
INVALID_DATA: 1007,
|
|
960
|
+
POLICY_VIOLATION: 1008,
|
|
961
|
+
MESSAGE_TOO_BIG: 1009,
|
|
962
|
+
EXTENSION_REQUIRED: 1010,
|
|
963
|
+
INTERNAL_ERROR: 1011,
|
|
964
|
+
SERVICE_RESTART: 1012,
|
|
965
|
+
TRY_AGAIN_LATER: 1013,
|
|
966
|
+
BAD_GATEWAY: 1014,
|
|
967
|
+
TLS_HANDSHAKE_FAIL: 1015
|
|
968
|
+
};
|
|
709
969
|
|
|
710
|
-
// src/
|
|
970
|
+
// src/server/ws/server.ts
|
|
711
971
|
init_runtime();
|
|
712
972
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
713
|
-
function queueCallback2(callback) {
|
|
714
|
-
if (callback) queueMicrotask(callback);
|
|
715
|
-
}
|
|
716
|
-
function createErrorResponse2() {
|
|
717
|
-
return new Response("Internal Server Error", { status: 500 });
|
|
718
|
-
}
|
|
719
|
-
function createAddress2(port, address, family = "IPv4") {
|
|
720
|
-
return { port, family, address };
|
|
721
|
-
}
|
|
722
|
-
function emitListeningWithCallback2(server, callback) {
|
|
723
|
-
server._listening = true;
|
|
724
|
-
server.emit("listening");
|
|
725
|
-
queueCallback2(callback);
|
|
726
|
-
}
|
|
727
|
-
function closeAndEmit2(server, callback) {
|
|
728
|
-
server._listening = false;
|
|
729
|
-
server.emit("close");
|
|
730
|
-
if (callback) queueMicrotask(() => callback());
|
|
731
|
-
}
|
|
732
|
-
function loadHttpClasses() {
|
|
733
|
-
const httpModule = (init_http(), __toCommonJS(http_exports));
|
|
734
|
-
return {
|
|
735
|
-
IncomingMessage: httpModule.IncomingMessage,
|
|
736
|
-
ServerResponse: httpModule.ServerResponse
|
|
737
|
-
};
|
|
738
|
-
}
|
|
739
|
-
var https2;
|
|
740
|
-
var Server2 = class extends EventEmitter2 {
|
|
741
|
-
constructor(options, requestListener) {
|
|
742
|
-
super();
|
|
743
|
-
this._listening = false;
|
|
744
|
-
this.options = options;
|
|
745
|
-
this.requestListener = requestListener;
|
|
746
|
-
}
|
|
747
|
-
listen(...args) {
|
|
748
|
-
let port = 3e3;
|
|
749
|
-
let hostname = "0.0.0.0";
|
|
750
|
-
let callback;
|
|
751
|
-
const firstArg = args[0];
|
|
752
|
-
if (typeof firstArg === "number") {
|
|
753
|
-
port = firstArg;
|
|
754
|
-
const secondArg = args[1];
|
|
755
|
-
if (typeof secondArg === "string") {
|
|
756
|
-
hostname = secondArg;
|
|
757
|
-
callback = args[2] || args[3];
|
|
758
|
-
} else if (typeof secondArg === "function") {
|
|
759
|
-
callback = secondArg;
|
|
760
|
-
}
|
|
761
|
-
} else if (firstArg && typeof firstArg === "object") {
|
|
762
|
-
port = firstArg.port || 3e3;
|
|
763
|
-
hostname = firstArg.hostname || "0.0.0.0";
|
|
764
|
-
callback = args[1];
|
|
765
|
-
}
|
|
766
|
-
const self = this;
|
|
767
|
-
if (isNode) {
|
|
768
|
-
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
769
|
-
if (!https2) https2 = __require("https");
|
|
770
|
-
this.nativeServer = https2.createServer(this.options, (req, res) => {
|
|
771
|
-
const incomingMessage = new IncomingMessage2(req);
|
|
772
|
-
const serverResponse = new ServerResponse2(incomingMessage, res);
|
|
773
|
-
if (self.requestListener) {
|
|
774
|
-
self.requestListener(incomingMessage, serverResponse);
|
|
775
|
-
} else {
|
|
776
|
-
self.emit("request", incomingMessage, serverResponse);
|
|
777
|
-
}
|
|
778
|
-
});
|
|
779
|
-
this.nativeServer.listen(port, hostname, () => {
|
|
780
|
-
this._listening = true;
|
|
781
|
-
this.emit("listening");
|
|
782
|
-
if (callback) callback();
|
|
783
|
-
});
|
|
784
|
-
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
785
|
-
this.nativeServer.on("close", () => {
|
|
786
|
-
this._listening = false;
|
|
787
|
-
this.emit("close");
|
|
788
|
-
});
|
|
789
|
-
} else if (isBun) {
|
|
790
|
-
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
791
|
-
const tlsOptions = {
|
|
792
|
-
port,
|
|
793
|
-
hostname,
|
|
794
|
-
fetch: (req) => {
|
|
795
|
-
return new Promise((resolve) => {
|
|
796
|
-
const incomingMessage = new IncomingMessage2(req);
|
|
797
|
-
const serverResponse = new ServerResponse2();
|
|
798
|
-
serverResponse._setResolver(resolve);
|
|
799
|
-
if (self.requestListener) {
|
|
800
|
-
self.requestListener(incomingMessage, serverResponse);
|
|
801
|
-
} else {
|
|
802
|
-
self.emit("request", incomingMessage, serverResponse);
|
|
803
|
-
}
|
|
804
|
-
});
|
|
805
|
-
},
|
|
806
|
-
error: (error) => {
|
|
807
|
-
this.emit("error", error);
|
|
808
|
-
return createErrorResponse2();
|
|
809
|
-
}
|
|
810
|
-
};
|
|
811
|
-
if (this.options.key || this.options.cert) {
|
|
812
|
-
tlsOptions.tls = {
|
|
813
|
-
key: this.options.key,
|
|
814
|
-
cert: this.options.cert,
|
|
815
|
-
ca: this.options.ca,
|
|
816
|
-
passphrase: this.options.passphrase
|
|
817
|
-
};
|
|
818
|
-
} else if (this.options.tls) {
|
|
819
|
-
tlsOptions.tls = this.options.tls;
|
|
820
|
-
}
|
|
821
|
-
this.nativeServer = Bun.serve(tlsOptions);
|
|
822
|
-
emitListeningWithCallback2(this, callback);
|
|
823
|
-
} else if (isDeno) {
|
|
824
|
-
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
825
|
-
const serveOptions = {
|
|
826
|
-
port,
|
|
827
|
-
hostname,
|
|
828
|
-
handler: (req) => {
|
|
829
|
-
return new Promise((resolve) => {
|
|
830
|
-
const incomingMessage = new IncomingMessage2(req);
|
|
831
|
-
const serverResponse = new ServerResponse2();
|
|
832
|
-
serverResponse._setResolver(resolve);
|
|
833
|
-
if (self.requestListener) {
|
|
834
|
-
self.requestListener(incomingMessage, serverResponse);
|
|
835
|
-
} else {
|
|
836
|
-
self.emit("request", incomingMessage, serverResponse);
|
|
837
|
-
}
|
|
838
|
-
});
|
|
839
|
-
},
|
|
840
|
-
onError: (error) => {
|
|
841
|
-
this.emit("error", error);
|
|
842
|
-
return createErrorResponse2();
|
|
843
|
-
}
|
|
844
|
-
};
|
|
845
|
-
if (this.options.key && this.options.cert) {
|
|
846
|
-
serveOptions.cert = this.options.cert;
|
|
847
|
-
serveOptions.key = this.options.key;
|
|
848
|
-
}
|
|
849
|
-
this.nativeServer = Deno.serve(serveOptions);
|
|
850
|
-
emitListeningWithCallback2(this, callback);
|
|
851
|
-
}
|
|
852
|
-
return this;
|
|
853
|
-
}
|
|
854
|
-
close(callback) {
|
|
855
|
-
if (!this.nativeServer) {
|
|
856
|
-
if (callback) queueMicrotask(() => callback());
|
|
857
|
-
return this;
|
|
858
|
-
}
|
|
859
|
-
if (isNode) {
|
|
860
|
-
this.nativeServer.close(callback);
|
|
861
|
-
} else if (isBun) {
|
|
862
|
-
this.nativeServer.stop();
|
|
863
|
-
closeAndEmit2(this, callback);
|
|
864
|
-
} else if (isDeno) {
|
|
865
|
-
this.nativeServer.shutdown();
|
|
866
|
-
closeAndEmit2(this, callback);
|
|
867
|
-
}
|
|
868
|
-
return this;
|
|
869
|
-
}
|
|
870
|
-
address() {
|
|
871
|
-
if (!this.nativeServer) return null;
|
|
872
|
-
if (isNode) {
|
|
873
|
-
const addr = this.nativeServer.address();
|
|
874
|
-
if (!addr) return null;
|
|
875
|
-
if (typeof addr === "string") {
|
|
876
|
-
return createAddress2(0, addr, "unix");
|
|
877
|
-
}
|
|
878
|
-
return addr;
|
|
879
|
-
} else if (isBun) {
|
|
880
|
-
return createAddress2(this.nativeServer.port, this.nativeServer.hostname);
|
|
881
|
-
} else if (isDeno) {
|
|
882
|
-
const addr = this.nativeServer.addr;
|
|
883
|
-
return createAddress2(addr.port, addr.hostname);
|
|
884
|
-
}
|
|
885
|
-
return null;
|
|
886
|
-
}
|
|
887
|
-
get listening() {
|
|
888
|
-
return this._listening;
|
|
889
|
-
}
|
|
890
|
-
};
|
|
891
|
-
function createServer2(options, requestListener) {
|
|
892
|
-
return new Server2(options, requestListener);
|
|
893
|
-
}
|
|
894
973
|
|
|
895
|
-
// src/ws.ts
|
|
974
|
+
// src/server/ws/utils.ts
|
|
896
975
|
init_runtime();
|
|
897
|
-
|
|
898
|
-
var ReadyState = /* @__PURE__ */ ((ReadyState2) => {
|
|
899
|
-
ReadyState2[ReadyState2["CONNECTING"] = 0] = "CONNECTING";
|
|
900
|
-
ReadyState2[ReadyState2["OPEN"] = 1] = "OPEN";
|
|
901
|
-
ReadyState2[ReadyState2["CLOSING"] = 2] = "CLOSING";
|
|
902
|
-
ReadyState2[ReadyState2["CLOSED"] = 3] = "CLOSED";
|
|
903
|
-
return ReadyState2;
|
|
904
|
-
})(ReadyState || {});
|
|
905
|
-
var CLOSE_CODES = {
|
|
906
|
-
NORMAL: 1e3,
|
|
907
|
-
GOING_AWAY: 1001,
|
|
908
|
-
PROTOCOL_ERROR: 1002,
|
|
909
|
-
UNSUPPORTED_DATA: 1003,
|
|
910
|
-
NO_STATUS: 1005,
|
|
911
|
-
ABNORMAL: 1006,
|
|
912
|
-
INVALID_DATA: 1007,
|
|
913
|
-
POLICY_VIOLATION: 1008,
|
|
914
|
-
MESSAGE_TOO_BIG: 1009,
|
|
915
|
-
EXTENSION_REQUIRED: 1010,
|
|
916
|
-
INTERNAL_ERROR: 1011,
|
|
917
|
-
SERVICE_RESTART: 1012,
|
|
918
|
-
TRY_AGAIN_LATER: 1013,
|
|
919
|
-
BAD_GATEWAY: 1014,
|
|
920
|
-
TLS_HANDSHAKE_FAIL: 1015
|
|
921
|
-
};
|
|
922
|
-
function queueCallback3(callback, error) {
|
|
976
|
+
function queueCallback(callback, error) {
|
|
923
977
|
if (callback) {
|
|
924
978
|
queueMicrotask(() => callback(error));
|
|
925
979
|
}
|
|
@@ -934,7 +988,74 @@ function getRequestPath(url) {
|
|
|
934
988
|
const [pathname = "/"] = (url || "/").split("?");
|
|
935
989
|
return pathname || "/";
|
|
936
990
|
}
|
|
937
|
-
|
|
991
|
+
function isIgnorableConnectionError(error) {
|
|
992
|
+
const errorCode = error?.code;
|
|
993
|
+
return errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE";
|
|
994
|
+
}
|
|
995
|
+
function coerceBunMessage(message) {
|
|
996
|
+
const isBinary = typeof message !== "string";
|
|
997
|
+
const payload = typeof message === "string" ? message : message instanceof ArrayBuffer ? Buffer.from(message) : ArrayBuffer.isView(message) ? Buffer.from(message.buffer, message.byteOffset, message.byteLength) : Buffer.from(String(message));
|
|
998
|
+
return { payload, isBinary };
|
|
999
|
+
}
|
|
1000
|
+
function parseFrame(data) {
|
|
1001
|
+
if (data.length < 2) {
|
|
1002
|
+
return null;
|
|
1003
|
+
}
|
|
1004
|
+
const firstByte = data[0];
|
|
1005
|
+
const secondByte = data[1];
|
|
1006
|
+
const opcode = firstByte & 15;
|
|
1007
|
+
const isMasked = (secondByte & 128) === 128;
|
|
1008
|
+
let payloadLength = secondByte & 127;
|
|
1009
|
+
let offset = 2;
|
|
1010
|
+
if (payloadLength === 126) {
|
|
1011
|
+
payloadLength = data.readUInt16BE(2);
|
|
1012
|
+
offset = 4;
|
|
1013
|
+
} else if (payloadLength === 127) {
|
|
1014
|
+
payloadLength = Number(data.readBigUInt64BE(2));
|
|
1015
|
+
offset = 10;
|
|
1016
|
+
}
|
|
1017
|
+
let payload = data.subarray(offset);
|
|
1018
|
+
if (isMasked) {
|
|
1019
|
+
const maskKey = data.subarray(offset, offset + 4);
|
|
1020
|
+
payload = data.subarray(offset + 4, offset + 4 + payloadLength);
|
|
1021
|
+
for (let index = 0; index < payload.length; index += 1) {
|
|
1022
|
+
payload[index] ^= maskKey[index % 4];
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
if (opcode === 1) {
|
|
1026
|
+
return payload.toString("utf8");
|
|
1027
|
+
}
|
|
1028
|
+
return null;
|
|
1029
|
+
}
|
|
1030
|
+
function createFrame(data) {
|
|
1031
|
+
const payload = typeof data === "string" ? Buffer.from(data) : data;
|
|
1032
|
+
const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;
|
|
1033
|
+
let frame;
|
|
1034
|
+
let offset = 2;
|
|
1035
|
+
if (payloadLength < 126) {
|
|
1036
|
+
frame = Buffer.allocUnsafe(2 + payloadLength);
|
|
1037
|
+
frame[1] = payloadLength;
|
|
1038
|
+
} else if (payloadLength < 65536) {
|
|
1039
|
+
frame = Buffer.allocUnsafe(4 + payloadLength);
|
|
1040
|
+
frame[1] = 126;
|
|
1041
|
+
frame.writeUInt16BE(payloadLength, 2);
|
|
1042
|
+
offset = 4;
|
|
1043
|
+
} else {
|
|
1044
|
+
frame = Buffer.allocUnsafe(10 + payloadLength);
|
|
1045
|
+
frame[1] = 127;
|
|
1046
|
+
frame.writeBigUInt64BE(BigInt(payloadLength), 2);
|
|
1047
|
+
offset = 10;
|
|
1048
|
+
}
|
|
1049
|
+
frame[0] = 129;
|
|
1050
|
+
if (Buffer.isBuffer(payload)) {
|
|
1051
|
+
payload.copy(frame, offset);
|
|
1052
|
+
}
|
|
1053
|
+
return frame;
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
// src/server/ws/websocket.ts
|
|
1057
|
+
import { EventEmitter } from "events";
|
|
1058
|
+
var WebSocket = class extends EventEmitter {
|
|
938
1059
|
constructor(address, protocols, _options) {
|
|
939
1060
|
super();
|
|
940
1061
|
this.readyState = 0 /* CONNECTING */;
|
|
@@ -964,22 +1085,23 @@ var WebSocket = class extends EventEmitter3 {
|
|
|
964
1085
|
};
|
|
965
1086
|
}
|
|
966
1087
|
/**
|
|
967
|
-
* Send data through WebSocket
|
|
1088
|
+
* Send data through WebSocket.
|
|
968
1089
|
*/
|
|
969
1090
|
send(data, options, callback) {
|
|
970
1091
|
const cb = typeof options === "function" ? options : callback;
|
|
971
1092
|
if (this.readyState !== 1 /* OPEN */) {
|
|
972
|
-
|
|
1093
|
+
queueCallback(cb, new Error("WebSocket is not open"));
|
|
1094
|
+
return;
|
|
973
1095
|
}
|
|
974
1096
|
try {
|
|
975
1097
|
this._socket.send(data);
|
|
976
|
-
|
|
1098
|
+
queueCallback(cb);
|
|
977
1099
|
} catch (error) {
|
|
978
|
-
|
|
1100
|
+
queueCallback(cb, error);
|
|
979
1101
|
}
|
|
980
1102
|
}
|
|
981
1103
|
/**
|
|
982
|
-
* Close the WebSocket connection
|
|
1104
|
+
* Close the WebSocket connection.
|
|
983
1105
|
*/
|
|
984
1106
|
close(code, reason) {
|
|
985
1107
|
if (this.readyState === 3 /* CLOSED */ || this.readyState === 2 /* CLOSING */) {
|
|
@@ -989,42 +1111,44 @@ var WebSocket = class extends EventEmitter3 {
|
|
|
989
1111
|
this._socket.close(code, typeof reason === "string" ? reason : reason?.toString());
|
|
990
1112
|
}
|
|
991
1113
|
/**
|
|
992
|
-
* Pause the socket (no-op for native WebSocket)
|
|
1114
|
+
* Pause the socket (no-op for native WebSocket).
|
|
993
1115
|
*/
|
|
994
1116
|
pause() {
|
|
995
1117
|
}
|
|
996
1118
|
/**
|
|
997
|
-
* Resume the socket (no-op for native WebSocket)
|
|
1119
|
+
* Resume the socket (no-op for native WebSocket).
|
|
998
1120
|
*/
|
|
999
1121
|
resume() {
|
|
1000
1122
|
}
|
|
1001
1123
|
/**
|
|
1002
|
-
* Send a ping frame (no-op for native WebSocket)
|
|
1124
|
+
* Send a ping frame (no-op for native WebSocket).
|
|
1003
1125
|
*/
|
|
1004
1126
|
ping(_data, _mask, callback) {
|
|
1005
|
-
|
|
1127
|
+
queueCallback(callback);
|
|
1006
1128
|
}
|
|
1007
1129
|
/**
|
|
1008
|
-
* Send a pong frame (no-op for native WebSocket)
|
|
1130
|
+
* Send a pong frame (no-op for native WebSocket).
|
|
1009
1131
|
*/
|
|
1010
1132
|
pong(_data, _mask, callback) {
|
|
1011
|
-
|
|
1133
|
+
queueCallback(callback);
|
|
1012
1134
|
}
|
|
1013
1135
|
/**
|
|
1014
|
-
* Terminate the connection
|
|
1136
|
+
* Terminate the connection.
|
|
1015
1137
|
*/
|
|
1016
1138
|
terminate() {
|
|
1017
1139
|
this._socket.close();
|
|
1018
1140
|
this.readyState = 3 /* CLOSED */;
|
|
1019
1141
|
}
|
|
1020
1142
|
/**
|
|
1021
|
-
* Get buffered amount
|
|
1143
|
+
* Get buffered amount.
|
|
1022
1144
|
*/
|
|
1023
1145
|
get bufferedAmount() {
|
|
1024
1146
|
return this._socket.bufferedAmount || 0;
|
|
1025
1147
|
}
|
|
1026
1148
|
};
|
|
1027
|
-
|
|
1149
|
+
|
|
1150
|
+
// src/server/ws/server.ts
|
|
1151
|
+
var WebSocketServer = class extends EventEmitter2 {
|
|
1028
1152
|
constructor(options, callback) {
|
|
1029
1153
|
super();
|
|
1030
1154
|
this.clients = /* @__PURE__ */ new Set();
|
|
@@ -1035,8 +1159,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1035
1159
|
if (options?.server) {
|
|
1036
1160
|
this._httpServer = options.server;
|
|
1037
1161
|
this._setupUpgradeHandler();
|
|
1038
|
-
} else if (options?.noServer) {
|
|
1039
|
-
} else {
|
|
1162
|
+
} else if (!options?.noServer) {
|
|
1040
1163
|
const http2 = __require("http");
|
|
1041
1164
|
this._httpServer = http2.createServer();
|
|
1042
1165
|
this._ownsHttpServer = true;
|
|
@@ -1050,30 +1173,30 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1050
1173
|
this._httpServer = options.server;
|
|
1051
1174
|
options.server.registerWebSocketServer(this);
|
|
1052
1175
|
}
|
|
1053
|
-
|
|
1176
|
+
queueCallback(callback);
|
|
1054
1177
|
} else {
|
|
1055
|
-
|
|
1178
|
+
queueCallback(callback);
|
|
1056
1179
|
}
|
|
1057
1180
|
}
|
|
1058
1181
|
_setupUpgradeHandler() {
|
|
1059
|
-
this._httpServer.on("upgrade", (
|
|
1060
|
-
const requestPath = getRequestPath(
|
|
1182
|
+
this._httpServer.on("upgrade", (request3, socket, head) => {
|
|
1183
|
+
const requestPath = getRequestPath(request3.url);
|
|
1061
1184
|
console.log("[WebSocket] Upgrade request:", requestPath, "Expected:", this.path || "(any)");
|
|
1062
1185
|
if (this.path && requestPath !== this.path) {
|
|
1063
1186
|
console.log("[WebSocket] Path mismatch, ignoring");
|
|
1064
1187
|
return;
|
|
1065
1188
|
}
|
|
1066
|
-
this.handleUpgrade(
|
|
1189
|
+
this.handleUpgrade(request3, socket, head, (client) => {
|
|
1067
1190
|
console.log("[WebSocket] Client connected");
|
|
1068
|
-
this.emit("connection", client,
|
|
1191
|
+
this.emit("connection", client, request3);
|
|
1069
1192
|
});
|
|
1070
1193
|
});
|
|
1071
1194
|
}
|
|
1072
1195
|
/**
|
|
1073
|
-
* Handle HTTP upgrade for WebSocket
|
|
1196
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1074
1197
|
*/
|
|
1075
|
-
handleUpgrade(
|
|
1076
|
-
const key =
|
|
1198
|
+
handleUpgrade(request3, socket, _head, callback) {
|
|
1199
|
+
const key = request3.headers["sec-websocket-key"];
|
|
1077
1200
|
if (!key) {
|
|
1078
1201
|
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
|
|
1079
1202
|
return;
|
|
@@ -1100,7 +1223,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1100
1223
|
}
|
|
1101
1224
|
_createClientFromSocket(socket) {
|
|
1102
1225
|
const client = Object.create(WebSocket.prototype);
|
|
1103
|
-
|
|
1226
|
+
EventEmitter2.call(client);
|
|
1104
1227
|
client.readyState = 1 /* OPEN */;
|
|
1105
1228
|
client.url = "ws://localhost";
|
|
1106
1229
|
client.protocol = "";
|
|
@@ -1109,7 +1232,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1109
1232
|
client._socket = socket;
|
|
1110
1233
|
socket.on("data", (data) => {
|
|
1111
1234
|
try {
|
|
1112
|
-
const message =
|
|
1235
|
+
const message = parseFrame(data);
|
|
1113
1236
|
if (message) {
|
|
1114
1237
|
client.emit("message", message, false);
|
|
1115
1238
|
}
|
|
@@ -1122,36 +1245,34 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1122
1245
|
client.emit("close", CLOSE_CODES.NORMAL, "");
|
|
1123
1246
|
});
|
|
1124
1247
|
socket.on("error", (error) => {
|
|
1125
|
-
|
|
1126
|
-
if (errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE") {
|
|
1248
|
+
if (isIgnorableConnectionError(error)) {
|
|
1127
1249
|
return;
|
|
1128
1250
|
}
|
|
1129
1251
|
client.emit("error", error);
|
|
1130
1252
|
});
|
|
1131
1253
|
client.send = (data, _options, callback) => {
|
|
1132
1254
|
if (!socket.writable || client.readyState !== 1 /* OPEN */) {
|
|
1133
|
-
const
|
|
1134
|
-
|
|
1135
|
-
|
|
1255
|
+
const error = new Error("WebSocket is not open");
|
|
1256
|
+
error.code = "WS_NOT_OPEN";
|
|
1257
|
+
queueCallback(callback, error);
|
|
1136
1258
|
return;
|
|
1137
1259
|
}
|
|
1138
1260
|
try {
|
|
1139
|
-
const frame =
|
|
1140
|
-
socket.write(frame, (
|
|
1141
|
-
if (
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
} else {
|
|
1150
|
-
queueCallback3(callback);
|
|
1261
|
+
const frame = createFrame(data);
|
|
1262
|
+
socket.write(frame, (error) => {
|
|
1263
|
+
if (!error) {
|
|
1264
|
+
queueCallback(callback);
|
|
1265
|
+
return;
|
|
1266
|
+
}
|
|
1267
|
+
if (isIgnorableConnectionError(error)) {
|
|
1268
|
+
client.readyState = 3 /* CLOSED */;
|
|
1269
|
+
queueCallback(callback);
|
|
1270
|
+
return;
|
|
1151
1271
|
}
|
|
1272
|
+
queueCallback(callback, error);
|
|
1152
1273
|
});
|
|
1153
1274
|
} catch (error) {
|
|
1154
|
-
|
|
1275
|
+
queueCallback(callback, error);
|
|
1155
1276
|
}
|
|
1156
1277
|
};
|
|
1157
1278
|
client.close = (_code, _reason) => {
|
|
@@ -1162,7 +1283,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1162
1283
|
}
|
|
1163
1284
|
_createClientFromBunSocket(socket) {
|
|
1164
1285
|
const client = Object.create(WebSocket.prototype);
|
|
1165
|
-
|
|
1286
|
+
EventEmitter2.call(client);
|
|
1166
1287
|
client.readyState = 1 /* OPEN */;
|
|
1167
1288
|
client.url = "ws://localhost";
|
|
1168
1289
|
client.protocol = "";
|
|
@@ -1171,14 +1292,14 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1171
1292
|
client._socket = socket;
|
|
1172
1293
|
client.send = (data, _options, callback) => {
|
|
1173
1294
|
if (client.readyState !== 1 /* OPEN */) {
|
|
1174
|
-
|
|
1295
|
+
queueCallback(callback, new Error("WebSocket is not open"));
|
|
1175
1296
|
return;
|
|
1176
1297
|
}
|
|
1177
1298
|
try {
|
|
1178
1299
|
socket.send(data);
|
|
1179
|
-
|
|
1300
|
+
queueCallback(callback);
|
|
1180
1301
|
} catch (error) {
|
|
1181
|
-
|
|
1302
|
+
queueCallback(callback, error);
|
|
1182
1303
|
}
|
|
1183
1304
|
};
|
|
1184
1305
|
client.close = (code, reason) => {
|
|
@@ -1186,7 +1307,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1186
1307
|
return;
|
|
1187
1308
|
}
|
|
1188
1309
|
client.readyState = 2 /* CLOSING */;
|
|
1189
|
-
socket.close(code ?? CLOSE_CODES.NORMAL, reason);
|
|
1310
|
+
socket.close(code ?? CLOSE_CODES.NORMAL, typeof reason === "string" ? reason : reason?.toString());
|
|
1190
1311
|
};
|
|
1191
1312
|
client.terminate = () => {
|
|
1192
1313
|
socket.close();
|
|
@@ -1194,7 +1315,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1194
1315
|
};
|
|
1195
1316
|
return client;
|
|
1196
1317
|
}
|
|
1197
|
-
_handleBunOpen(socket,
|
|
1318
|
+
_handleBunOpen(socket, request3 = {}) {
|
|
1198
1319
|
const client = this._createClientFromBunSocket(socket);
|
|
1199
1320
|
if (socket.data) {
|
|
1200
1321
|
socket.data.client = client;
|
|
@@ -1206,9 +1327,9 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1206
1327
|
});
|
|
1207
1328
|
}
|
|
1208
1329
|
const incomingRequest = {
|
|
1209
|
-
url:
|
|
1210
|
-
headers:
|
|
1211
|
-
socket:
|
|
1330
|
+
url: request3.url || this.path,
|
|
1331
|
+
headers: request3.headers || {},
|
|
1332
|
+
socket: request3.socket || { remoteAddress: void 0 }
|
|
1212
1333
|
};
|
|
1213
1334
|
this.emit("connection", client, incomingRequest);
|
|
1214
1335
|
}
|
|
@@ -1217,8 +1338,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1217
1338
|
if (!client) {
|
|
1218
1339
|
return;
|
|
1219
1340
|
}
|
|
1220
|
-
const isBinary =
|
|
1221
|
-
const payload = typeof message === "string" ? message : message instanceof ArrayBuffer ? Buffer.from(message) : ArrayBuffer.isView(message) ? Buffer.from(message.buffer, message.byteOffset, message.byteLength) : Buffer.from(String(message));
|
|
1341
|
+
const { payload, isBinary } = coerceBunMessage(message);
|
|
1222
1342
|
client.emit("message", payload, isBinary);
|
|
1223
1343
|
}
|
|
1224
1344
|
_handleBunClose(socket, code, reason) {
|
|
@@ -1230,98 +1350,261 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1230
1350
|
client.emit("close", code, typeof reason === "string" ? reason : reason?.toString() || "");
|
|
1231
1351
|
this.clients.delete(client);
|
|
1232
1352
|
}
|
|
1233
|
-
_parseFrame(data) {
|
|
1234
|
-
if (data.length < 2) return null;
|
|
1235
|
-
const firstByte = data[0];
|
|
1236
|
-
const secondByte = data[1];
|
|
1237
|
-
const opcode = firstByte & 15;
|
|
1238
|
-
const isMasked = (secondByte & 128) === 128;
|
|
1239
|
-
let payloadLength = secondByte & 127;
|
|
1240
|
-
let offset = 2;
|
|
1241
|
-
if (payloadLength === 126) {
|
|
1242
|
-
payloadLength = data.readUInt16BE(2);
|
|
1243
|
-
offset = 4;
|
|
1244
|
-
} else if (payloadLength === 127) {
|
|
1245
|
-
payloadLength = Number(data.readBigUInt64BE(2));
|
|
1246
|
-
offset = 10;
|
|
1247
|
-
}
|
|
1248
|
-
let payload = data.subarray(offset);
|
|
1249
|
-
if (isMasked) {
|
|
1250
|
-
const maskKey = data.subarray(offset, offset + 4);
|
|
1251
|
-
payload = data.subarray(offset + 4, offset + 4 + payloadLength);
|
|
1252
|
-
for (let i = 0; i < payload.length; i++) {
|
|
1253
|
-
payload[i] ^= maskKey[i % 4];
|
|
1254
|
-
}
|
|
1255
|
-
}
|
|
1256
|
-
if (opcode === 1) {
|
|
1257
|
-
return payload.toString("utf8");
|
|
1258
|
-
}
|
|
1259
|
-
return null;
|
|
1260
|
-
}
|
|
1261
|
-
_createFrame(data) {
|
|
1262
|
-
const payload = typeof data === "string" ? Buffer.from(data) : data;
|
|
1263
|
-
const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;
|
|
1264
|
-
let frame;
|
|
1265
|
-
let offset = 2;
|
|
1266
|
-
if (payloadLength < 126) {
|
|
1267
|
-
frame = Buffer.allocUnsafe(2 + payloadLength);
|
|
1268
|
-
frame[1] = payloadLength;
|
|
1269
|
-
} else if (payloadLength < 65536) {
|
|
1270
|
-
frame = Buffer.allocUnsafe(4 + payloadLength);
|
|
1271
|
-
frame[1] = 126;
|
|
1272
|
-
frame.writeUInt16BE(payloadLength, 2);
|
|
1273
|
-
offset = 4;
|
|
1274
|
-
} else {
|
|
1275
|
-
frame = Buffer.allocUnsafe(10 + payloadLength);
|
|
1276
|
-
frame[1] = 127;
|
|
1277
|
-
frame.writeBigUInt64BE(BigInt(payloadLength), 2);
|
|
1278
|
-
offset = 10;
|
|
1279
|
-
}
|
|
1280
|
-
frame[0] = 129;
|
|
1281
|
-
if (Buffer.isBuffer(payload)) {
|
|
1282
|
-
payload.copy(frame, offset);
|
|
1283
|
-
}
|
|
1284
|
-
return frame;
|
|
1285
|
-
}
|
|
1286
1353
|
/**
|
|
1287
|
-
* Close the server
|
|
1354
|
+
* Close the server.
|
|
1288
1355
|
*/
|
|
1289
1356
|
close(callback) {
|
|
1290
1357
|
this.clients.forEach((client) => client.close());
|
|
1291
1358
|
this.clients.clear();
|
|
1292
1359
|
if (this._httpServer && this._ownsHttpServer) {
|
|
1293
1360
|
this._httpServer.close(callback);
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
this.emit("close");
|
|
1299
|
-
queueCallback3(callback);
|
|
1361
|
+
return;
|
|
1362
|
+
}
|
|
1363
|
+
if (runtime === "bun" && this._httpServer?.unregisterWebSocketServer) {
|
|
1364
|
+
this._httpServer.unregisterWebSocketServer(this);
|
|
1300
1365
|
}
|
|
1366
|
+
this.emit("close");
|
|
1367
|
+
queueCallback(callback);
|
|
1301
1368
|
}
|
|
1302
1369
|
/**
|
|
1303
|
-
* Check if server should handle request
|
|
1370
|
+
* Check if server should handle request.
|
|
1304
1371
|
*/
|
|
1305
|
-
shouldHandle(
|
|
1306
|
-
if (this.path && getRequestPath(
|
|
1372
|
+
shouldHandle(request3) {
|
|
1373
|
+
if (this.path && getRequestPath(request3.url) !== this.path) {
|
|
1307
1374
|
return false;
|
|
1308
1375
|
}
|
|
1309
1376
|
return true;
|
|
1310
1377
|
}
|
|
1311
1378
|
/**
|
|
1312
|
-
* Get server address
|
|
1379
|
+
* Get server address.
|
|
1313
1380
|
*/
|
|
1314
1381
|
address() {
|
|
1315
|
-
if (this._httpServer
|
|
1382
|
+
if (this._httpServer?.address) {
|
|
1316
1383
|
return this._httpServer.address();
|
|
1317
1384
|
}
|
|
1318
1385
|
return null;
|
|
1319
1386
|
}
|
|
1320
1387
|
};
|
|
1321
1388
|
|
|
1322
|
-
// src/
|
|
1389
|
+
// src/server/ws/runtime.ts
|
|
1390
|
+
init_runtime();
|
|
1391
|
+
|
|
1392
|
+
// src/server/wss/client.ts
|
|
1393
|
+
var WSSClient = class extends WebSocket {
|
|
1394
|
+
constructor(address, protocols, options) {
|
|
1395
|
+
const urlString = typeof address === "string" ? address : address.toString();
|
|
1396
|
+
const secureUrl = urlString.replace(/^ws:\/\//i, "wss://");
|
|
1397
|
+
super(secureUrl, protocols, options);
|
|
1398
|
+
}
|
|
1399
|
+
};
|
|
1400
|
+
function createWSSClient(address, protocols, options) {
|
|
1401
|
+
return new WSSClient(address, protocols, options);
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
// src/server/wss/runtime.ts
|
|
1405
|
+
init_runtime();
|
|
1406
|
+
function getRuntime2() {
|
|
1407
|
+
return runtime;
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
// src/server/wss/server.ts
|
|
1411
|
+
import { EventEmitter as EventEmitter9 } from "events";
|
|
1412
|
+
|
|
1413
|
+
// src/server/https/client-request.ts
|
|
1414
|
+
init_utils();
|
|
1415
|
+
import { EventEmitter as EventEmitter3 } from "events";
|
|
1416
|
+
|
|
1417
|
+
// src/server/https/request-api.ts
|
|
1418
|
+
init_runtime();
|
|
1419
|
+
|
|
1420
|
+
// src/server/https/http-classes.ts
|
|
1421
|
+
function loadHttpClasses() {
|
|
1422
|
+
const httpModule = (init_http(), __toCommonJS(http_exports));
|
|
1423
|
+
return {
|
|
1424
|
+
IncomingMessage: httpModule.IncomingMessage,
|
|
1425
|
+
ServerResponse: httpModule.ServerResponse
|
|
1426
|
+
};
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
// src/server/https/node-modules.ts
|
|
1430
|
+
init_runtime();
|
|
1431
|
+
var https2;
|
|
1432
|
+
if (isNode && typeof process !== "undefined") {
|
|
1433
|
+
try {
|
|
1434
|
+
https2 = __require("https");
|
|
1435
|
+
} catch {
|
|
1436
|
+
https2 = __require("https");
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
// src/server/https/runtime.ts
|
|
1441
|
+
init_runtime();
|
|
1442
|
+
|
|
1443
|
+
// src/server/https/server-runtime.ts
|
|
1444
|
+
init_runtime();
|
|
1445
|
+
init_utils();
|
|
1446
|
+
import { EventEmitter as EventEmitter8 } from "events";
|
|
1447
|
+
var Server2 = class extends EventEmitter8 {
|
|
1448
|
+
constructor(options = {}, requestListener) {
|
|
1449
|
+
super();
|
|
1450
|
+
this._listening = false;
|
|
1451
|
+
this.options = options;
|
|
1452
|
+
this.requestListener = requestListener;
|
|
1453
|
+
}
|
|
1454
|
+
listen(...args) {
|
|
1455
|
+
let port = 3e3;
|
|
1456
|
+
let hostname = "0.0.0.0";
|
|
1457
|
+
let callback;
|
|
1458
|
+
const firstArg = args[0];
|
|
1459
|
+
if (typeof firstArg === "number") {
|
|
1460
|
+
port = firstArg;
|
|
1461
|
+
const secondArg = args[1];
|
|
1462
|
+
if (typeof secondArg === "string") {
|
|
1463
|
+
hostname = secondArg;
|
|
1464
|
+
callback = args[2] || args[3];
|
|
1465
|
+
} else if (typeof secondArg === "function") {
|
|
1466
|
+
callback = secondArg;
|
|
1467
|
+
}
|
|
1468
|
+
} else if (firstArg && typeof firstArg === "object") {
|
|
1469
|
+
port = firstArg.port || 3e3;
|
|
1470
|
+
hostname = firstArg.hostname || "0.0.0.0";
|
|
1471
|
+
callback = args[1];
|
|
1472
|
+
}
|
|
1473
|
+
const self = this;
|
|
1474
|
+
if (isNode) {
|
|
1475
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1476
|
+
this.nativeServer = https2.createServer(this.options, (req, res) => {
|
|
1477
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1478
|
+
const serverResponse = new ServerResponse2(incomingMessage, res);
|
|
1479
|
+
if (self.requestListener) {
|
|
1480
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1481
|
+
} else {
|
|
1482
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1483
|
+
}
|
|
1484
|
+
});
|
|
1485
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
1486
|
+
this._listening = true;
|
|
1487
|
+
this.emit("listening");
|
|
1488
|
+
if (callback) callback();
|
|
1489
|
+
});
|
|
1490
|
+
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1491
|
+
this.nativeServer.on("close", () => {
|
|
1492
|
+
this._listening = false;
|
|
1493
|
+
this.emit("close");
|
|
1494
|
+
});
|
|
1495
|
+
} else if (isBun) {
|
|
1496
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1497
|
+
const tlsOptions = {
|
|
1498
|
+
port,
|
|
1499
|
+
hostname,
|
|
1500
|
+
fetch: (req) => {
|
|
1501
|
+
return new Promise((resolve) => {
|
|
1502
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1503
|
+
const serverResponse = new ServerResponse2();
|
|
1504
|
+
serverResponse._setResolver(resolve);
|
|
1505
|
+
if (self.requestListener) {
|
|
1506
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1507
|
+
} else {
|
|
1508
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1509
|
+
}
|
|
1510
|
+
});
|
|
1511
|
+
},
|
|
1512
|
+
error: (error) => {
|
|
1513
|
+
this.emit("error", error);
|
|
1514
|
+
return createErrorResponse();
|
|
1515
|
+
}
|
|
1516
|
+
};
|
|
1517
|
+
if (this.options.key || this.options.cert) {
|
|
1518
|
+
tlsOptions.tls = {
|
|
1519
|
+
key: this.options.key,
|
|
1520
|
+
cert: this.options.cert,
|
|
1521
|
+
ca: this.options.ca,
|
|
1522
|
+
passphrase: this.options.passphrase
|
|
1523
|
+
};
|
|
1524
|
+
} else if (this.options.tls) {
|
|
1525
|
+
tlsOptions.tls = this.options.tls;
|
|
1526
|
+
}
|
|
1527
|
+
this.nativeServer = Bun.serve(tlsOptions);
|
|
1528
|
+
emitListeningWithCallback(this, callback);
|
|
1529
|
+
} else if (isDeno) {
|
|
1530
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1531
|
+
const serveOptions = {
|
|
1532
|
+
port,
|
|
1533
|
+
hostname,
|
|
1534
|
+
handler: (req) => {
|
|
1535
|
+
return new Promise((resolve) => {
|
|
1536
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1537
|
+
const serverResponse = new ServerResponse2();
|
|
1538
|
+
serverResponse._setResolver(resolve);
|
|
1539
|
+
if (self.requestListener) {
|
|
1540
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1541
|
+
} else {
|
|
1542
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1543
|
+
}
|
|
1544
|
+
});
|
|
1545
|
+
},
|
|
1546
|
+
onError: (error) => {
|
|
1547
|
+
this.emit("error", error);
|
|
1548
|
+
return createErrorResponse();
|
|
1549
|
+
}
|
|
1550
|
+
};
|
|
1551
|
+
if (this.options.key && this.options.cert) {
|
|
1552
|
+
serveOptions.cert = this.options.cert;
|
|
1553
|
+
serveOptions.key = this.options.key;
|
|
1554
|
+
}
|
|
1555
|
+
this.nativeServer = Deno.serve(serveOptions);
|
|
1556
|
+
emitListeningWithCallback(this, callback);
|
|
1557
|
+
}
|
|
1558
|
+
return this;
|
|
1559
|
+
}
|
|
1560
|
+
close(callback) {
|
|
1561
|
+
if (!this.nativeServer) {
|
|
1562
|
+
if (callback) queueCallback2(() => callback());
|
|
1563
|
+
return this;
|
|
1564
|
+
}
|
|
1565
|
+
if (isNode) {
|
|
1566
|
+
this.nativeServer.close(callback);
|
|
1567
|
+
} else if (isBun) {
|
|
1568
|
+
this.nativeServer.stop();
|
|
1569
|
+
closeAndEmit(this, callback);
|
|
1570
|
+
} else if (isDeno) {
|
|
1571
|
+
this.nativeServer.shutdown();
|
|
1572
|
+
closeAndEmit(this, callback);
|
|
1573
|
+
}
|
|
1574
|
+
return this;
|
|
1575
|
+
}
|
|
1576
|
+
address() {
|
|
1577
|
+
if (!this.nativeServer) return null;
|
|
1578
|
+
if (isNode) {
|
|
1579
|
+
const addr = this.nativeServer.address();
|
|
1580
|
+
if (!addr) return null;
|
|
1581
|
+
if (typeof addr === "string") {
|
|
1582
|
+
return createAddress(0, addr, "unix");
|
|
1583
|
+
}
|
|
1584
|
+
return addr;
|
|
1585
|
+
}
|
|
1586
|
+
if (isBun) {
|
|
1587
|
+
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
1588
|
+
}
|
|
1589
|
+
if (isDeno) {
|
|
1590
|
+
const addr = this.nativeServer.addr;
|
|
1591
|
+
return createAddress(addr.port, addr.hostname);
|
|
1592
|
+
}
|
|
1593
|
+
return null;
|
|
1594
|
+
}
|
|
1595
|
+
get listening() {
|
|
1596
|
+
return this._listening;
|
|
1597
|
+
}
|
|
1598
|
+
};
|
|
1599
|
+
function createServer2(options = {}, requestListener) {
|
|
1600
|
+
return new Server2(options, requestListener);
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
// src/server/wss/server.ts
|
|
1323
1604
|
init_runtime();
|
|
1324
|
-
|
|
1605
|
+
|
|
1606
|
+
// src/server/wss/utils.ts
|
|
1607
|
+
function queueCallback3(callback) {
|
|
1325
1608
|
if (callback) {
|
|
1326
1609
|
queueMicrotask(callback);
|
|
1327
1610
|
}
|
|
@@ -1338,16 +1621,11 @@ function buildHttpsOptions(options) {
|
|
|
1338
1621
|
}
|
|
1339
1622
|
function emitCloseWithCallback(emitter, callback) {
|
|
1340
1623
|
emitter.emit("close");
|
|
1341
|
-
|
|
1624
|
+
queueCallback3(callback);
|
|
1342
1625
|
}
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
const secureUrl = urlString.replace(/^ws:\/\//i, "wss://");
|
|
1347
|
-
super(secureUrl, protocols, options);
|
|
1348
|
-
}
|
|
1349
|
-
};
|
|
1350
|
-
var WSSServer = class extends EventEmitter4 {
|
|
1626
|
+
|
|
1627
|
+
// src/server/wss/server.ts
|
|
1628
|
+
var WSSServer = class extends EventEmitter9 {
|
|
1351
1629
|
constructor(options, callback) {
|
|
1352
1630
|
super();
|
|
1353
1631
|
this.clients = /* @__PURE__ */ new Set();
|
|
@@ -1359,7 +1637,7 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1359
1637
|
this._setupServer(callback);
|
|
1360
1638
|
} else if (options?.noServer) {
|
|
1361
1639
|
this._wsServer = new WebSocketServer({ noServer: true });
|
|
1362
|
-
|
|
1640
|
+
queueCallback3(callback);
|
|
1363
1641
|
} else {
|
|
1364
1642
|
this._httpsServer = createServer2(buildHttpsOptions(options));
|
|
1365
1643
|
this._setupServer(callback);
|
|
@@ -1369,7 +1647,7 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1369
1647
|
}
|
|
1370
1648
|
} else {
|
|
1371
1649
|
this._wsServer = new WebSocketServer(options);
|
|
1372
|
-
|
|
1650
|
+
queueCallback3(callback);
|
|
1373
1651
|
}
|
|
1374
1652
|
}
|
|
1375
1653
|
_setupServer(callback) {
|
|
@@ -1378,44 +1656,44 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1378
1656
|
server: this._httpsServer,
|
|
1379
1657
|
noServer: false
|
|
1380
1658
|
});
|
|
1381
|
-
this._wsServer.on("connection", (client,
|
|
1659
|
+
this._wsServer.on("connection", (client, request3) => {
|
|
1382
1660
|
if (this.options.clientTracking !== false) {
|
|
1383
1661
|
this.clients.add(client);
|
|
1384
1662
|
client.on("close", () => {
|
|
1385
1663
|
this.clients.delete(client);
|
|
1386
1664
|
});
|
|
1387
1665
|
}
|
|
1388
|
-
this.emit("connection", client,
|
|
1666
|
+
this.emit("connection", client, request3);
|
|
1389
1667
|
});
|
|
1390
1668
|
this._wsServer.on("error", (error) => {
|
|
1391
1669
|
this.emit("error", error);
|
|
1392
1670
|
});
|
|
1393
1671
|
if (!this.options?.port) {
|
|
1394
|
-
|
|
1672
|
+
queueCallback3(callback);
|
|
1395
1673
|
}
|
|
1396
1674
|
}
|
|
1397
1675
|
/**
|
|
1398
|
-
* Handle HTTP upgrade for WebSocket
|
|
1676
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1399
1677
|
*/
|
|
1400
|
-
handleUpgrade(
|
|
1678
|
+
handleUpgrade(request3, socket, head, callback) {
|
|
1401
1679
|
if (this._wsServer) {
|
|
1402
|
-
this._wsServer.handleUpgrade(
|
|
1680
|
+
this._wsServer.handleUpgrade(request3, socket, head, callback);
|
|
1403
1681
|
}
|
|
1404
1682
|
}
|
|
1405
1683
|
/**
|
|
1406
|
-
* Check if server should handle request
|
|
1684
|
+
* Check if server should handle request.
|
|
1407
1685
|
*/
|
|
1408
|
-
shouldHandle(
|
|
1686
|
+
shouldHandle(request3) {
|
|
1409
1687
|
if (this._wsServer) {
|
|
1410
|
-
return this._wsServer.shouldHandle(
|
|
1688
|
+
return this._wsServer.shouldHandle(request3);
|
|
1411
1689
|
}
|
|
1412
|
-
if (this.path &&
|
|
1690
|
+
if (this.path && request3.url !== this.path) {
|
|
1413
1691
|
return false;
|
|
1414
1692
|
}
|
|
1415
1693
|
return true;
|
|
1416
1694
|
}
|
|
1417
1695
|
/**
|
|
1418
|
-
* Close the server
|
|
1696
|
+
* Close the server.
|
|
1419
1697
|
*/
|
|
1420
1698
|
close(callback) {
|
|
1421
1699
|
this.clients.forEach((client) => client.close());
|
|
@@ -1428,17 +1706,19 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1428
1706
|
emitCloseWithCallback(this, callback);
|
|
1429
1707
|
}
|
|
1430
1708
|
});
|
|
1431
|
-
|
|
1709
|
+
return;
|
|
1710
|
+
}
|
|
1711
|
+
if (this._httpsServer) {
|
|
1432
1712
|
this._httpsServer.close(callback);
|
|
1433
|
-
|
|
1434
|
-
emitCloseWithCallback(this, callback);
|
|
1713
|
+
return;
|
|
1435
1714
|
}
|
|
1715
|
+
emitCloseWithCallback(this, callback);
|
|
1436
1716
|
}
|
|
1437
1717
|
/**
|
|
1438
|
-
* Get server address
|
|
1718
|
+
* Get server address.
|
|
1439
1719
|
*/
|
|
1440
1720
|
address() {
|
|
1441
|
-
if (this._httpsServer
|
|
1721
|
+
if (this._httpsServer?.address) {
|
|
1442
1722
|
return this._httpsServer.address();
|
|
1443
1723
|
}
|
|
1444
1724
|
if (this._wsServer) {
|
|
@@ -1447,15 +1727,11 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1447
1727
|
return null;
|
|
1448
1728
|
}
|
|
1449
1729
|
};
|
|
1450
|
-
function createWSSClient(address, protocols, options) {
|
|
1451
|
-
return new WSSClient(address, protocols, options);
|
|
1452
|
-
}
|
|
1453
1730
|
function createWSSServer(options, callback) {
|
|
1454
1731
|
return new WSSServer(options, callback);
|
|
1455
1732
|
}
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
}
|
|
1733
|
+
|
|
1734
|
+
// src/server/wss/index.ts
|
|
1459
1735
|
var wss_default = {
|
|
1460
1736
|
WSSClient,
|
|
1461
1737
|
WSSServer,
|