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