elit 3.6.6 → 3.6.8
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 +20 -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 +25197 -22128
- package/dist/cli.d.ts +19 -37
- package/dist/cli.mjs +26668 -23614
- 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-D7KIS-TK.d.ts +36 -0
- package/dist/contracts-_0p1-15U.d.ts +54 -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 +411 -140
- package/dist/http.d.ts +40 -112
- package/dist/http.js +409 -140
- package/dist/http.mjs +409 -140
- package/dist/https.cjs +716 -272
- package/dist/https.d.ts +46 -41
- package/dist/https.js +712 -270
- package/dist/https.mjs +714 -272
- 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-node-shared-listener-bootstrap.cjs +75 -0
- package/dist/pm.cjs +5267 -0
- package/dist/pm.d.ts +331 -0
- package/dist/pm.js +7575 -0
- package/dist/pm.mjs +5148 -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 +3702 -2883
- package/dist/server.d.ts +47 -5
- package/dist/server.js +4007 -3165
- package/dist/server.mjs +3665 -2848
- package/dist/smtp-server.cjs +16 -3
- package/dist/smtp-server.d.ts +12 -26
- package/dist/smtp-server.js +55 -17
- package/dist/smtp-server.mjs +16 -3
- 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-BayMVo_k.d.ts +278 -0
- package/dist/types-C4gKykuG.d.ts +23 -0
- package/dist/types-C70T-42Z.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-DPOgoGs-.d.ts +81 -0
- package/dist/types-fiLday0L.d.ts +199 -0
- package/dist/types.d.ts +54 -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-BLBEAnhp.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 +938 -512
- package/dist/wss.d.ts +31 -28
- package/dist/wss.js +932 -508
- package/dist/wss.mjs +936 -512
- package/package.json +18 -6
- package/vendor/epaint-0.31.1/src/image.rs +418 -0
- package/dist/server-uMQvZAll.d.ts +0 -458
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,36 @@ 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(arg1, arg2) {
|
|
614
|
+
const requestListener = typeof arg1 === "function" ? arg1 : arg2;
|
|
615
|
+
return new Server(requestListener);
|
|
616
|
+
}
|
|
617
|
+
var Server;
|
|
618
|
+
var init_server_runtime = __esm({
|
|
619
|
+
"src/server/http/server-runtime.ts"() {
|
|
620
|
+
"use strict";
|
|
621
|
+
init_runtime();
|
|
622
|
+
init_node_modules();
|
|
623
|
+
init_incoming_message();
|
|
624
|
+
init_response();
|
|
625
|
+
init_utils();
|
|
626
|
+
Server = class extends EventEmitter7 {
|
|
418
627
|
constructor(requestListener) {
|
|
419
628
|
super();
|
|
420
629
|
this._bunWebSocketServers = /* @__PURE__ */ new Set();
|
|
@@ -427,9 +636,28 @@ var init_http = __esm({
|
|
|
427
636
|
unregisterWebSocketServer(wsServer) {
|
|
428
637
|
this._bunWebSocketServers.delete(wsServer);
|
|
429
638
|
}
|
|
639
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
640
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
641
|
+
return explicitFd;
|
|
642
|
+
}
|
|
643
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
644
|
+
if (!fdValue) {
|
|
645
|
+
return void 0;
|
|
646
|
+
}
|
|
647
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
648
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
649
|
+
return void 0;
|
|
650
|
+
}
|
|
651
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
652
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
653
|
+
return void 0;
|
|
654
|
+
}
|
|
655
|
+
return parsedFd;
|
|
656
|
+
}
|
|
430
657
|
listen(...args) {
|
|
431
658
|
let port = 3e3;
|
|
432
659
|
let hostname = "0.0.0.0";
|
|
660
|
+
let fd;
|
|
433
661
|
let callback;
|
|
434
662
|
const firstArg = args[0];
|
|
435
663
|
if (typeof firstArg === "number") {
|
|
@@ -444,8 +672,10 @@ var init_http = __esm({
|
|
|
444
672
|
} else if (firstArg && typeof firstArg === "object") {
|
|
445
673
|
port = firstArg.port || 3e3;
|
|
446
674
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
675
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
447
676
|
callback = args[1];
|
|
448
677
|
}
|
|
678
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
449
679
|
const self = this;
|
|
450
680
|
if (isNode) {
|
|
451
681
|
this.nativeServer = http.createServer((req, res) => {
|
|
@@ -460,11 +690,19 @@ var init_http = __esm({
|
|
|
460
690
|
this.nativeServer.on("upgrade", (req, socket, head) => {
|
|
461
691
|
self.emit("upgrade", req, socket, head);
|
|
462
692
|
});
|
|
463
|
-
|
|
464
|
-
this.
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
693
|
+
if (fd !== void 0) {
|
|
694
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
695
|
+
this._listening = true;
|
|
696
|
+
this.emit("listening");
|
|
697
|
+
if (callback) callback();
|
|
698
|
+
});
|
|
699
|
+
} else {
|
|
700
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
701
|
+
this._listening = true;
|
|
702
|
+
this.emit("listening");
|
|
703
|
+
if (callback) callback();
|
|
704
|
+
});
|
|
705
|
+
}
|
|
468
706
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
469
707
|
this.nativeServer.on("close", () => {
|
|
470
708
|
this._listening = false;
|
|
@@ -489,6 +727,8 @@ var init_http = __esm({
|
|
|
489
727
|
const urlObj = new URL(req.url);
|
|
490
728
|
const pathname = urlObj.pathname;
|
|
491
729
|
const requestUrl = urlObj.pathname + urlObj.search;
|
|
730
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
731
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
492
732
|
const upgradeHeader = req.headers.get("upgrade");
|
|
493
733
|
if (upgradeHeader && upgradeHeader.toLowerCase() === "websocket") {
|
|
494
734
|
const matchingWebSocketServer = Array.from(this._bunWebSocketServers).find((wsServer) => {
|
|
@@ -525,9 +765,9 @@ var init_http = __esm({
|
|
|
525
765
|
const incomingMessage = {
|
|
526
766
|
method: req.method,
|
|
527
767
|
url: requestUrl,
|
|
528
|
-
headers:
|
|
768
|
+
headers: incomingHeaders,
|
|
529
769
|
httpVersion: "1.1",
|
|
530
|
-
rawHeaders
|
|
770
|
+
rawHeaders,
|
|
531
771
|
_req: req,
|
|
532
772
|
text: () => req.text(),
|
|
533
773
|
json: () => req.json()
|
|
@@ -581,57 +821,148 @@ var init_http = __esm({
|
|
|
581
821
|
this.writeHead(statusCode);
|
|
582
822
|
}
|
|
583
823
|
responseReady = true;
|
|
584
|
-
return this;
|
|
585
824
|
}
|
|
586
825
|
};
|
|
587
826
|
if (self.requestListener) {
|
|
588
827
|
self.requestListener(incomingMessage, serverResponse);
|
|
828
|
+
} else {
|
|
829
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
589
830
|
}
|
|
590
|
-
if (responseReady) {
|
|
591
|
-
|
|
592
|
-
status: statusCode,
|
|
593
|
-
statusText: statusMessage,
|
|
594
|
-
headers
|
|
595
|
-
});
|
|
831
|
+
if (!responseReady) {
|
|
832
|
+
serverResponse.end();
|
|
596
833
|
}
|
|
597
|
-
return new
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
}
|
|
602
|
-
resolve(new Response(body, {
|
|
603
|
-
status: statusCode,
|
|
604
|
-
statusText: statusMessage,
|
|
605
|
-
headers
|
|
606
|
-
}));
|
|
607
|
-
};
|
|
834
|
+
return new Response(body, {
|
|
835
|
+
status: statusCode,
|
|
836
|
+
statusText: statusMessage,
|
|
837
|
+
headers
|
|
608
838
|
});
|
|
609
839
|
},
|
|
610
|
-
error:
|
|
840
|
+
error: (err) => {
|
|
841
|
+
this.emit("error", err);
|
|
842
|
+
return createErrorResponse();
|
|
843
|
+
}
|
|
611
844
|
});
|
|
845
|
+
this._listening = true;
|
|
612
846
|
emitListeningWithCallback(this, callback);
|
|
847
|
+
this.nativeServer.stop = this.nativeServer.stop || this.nativeServer.close;
|
|
848
|
+
this.nativeServer.close = this.nativeServer.close || this.nativeServer.stop;
|
|
849
|
+
this.nativeServer.on?.("close", () => {
|
|
850
|
+
this._listening = false;
|
|
851
|
+
this.emit("close");
|
|
852
|
+
});
|
|
613
853
|
} else if (isDeno) {
|
|
854
|
+
const server = this;
|
|
614
855
|
this.nativeServer = Deno.serve({
|
|
615
856
|
port,
|
|
616
|
-
hostname
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
857
|
+
hostname
|
|
858
|
+
}, async (req) => {
|
|
859
|
+
const urlObj = new URL(req.url);
|
|
860
|
+
const requestUrl = urlObj.pathname + urlObj.search;
|
|
861
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
862
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
863
|
+
const bodyChunks = [];
|
|
864
|
+
const responseHeaders = new Headers();
|
|
865
|
+
let statusCode = 200;
|
|
866
|
+
let statusText = "OK";
|
|
867
|
+
let responseClosed = false;
|
|
868
|
+
const incomingMessage = {
|
|
869
|
+
method: req.method,
|
|
870
|
+
url: requestUrl,
|
|
871
|
+
headers: incomingHeaders,
|
|
872
|
+
httpVersion: "1.1",
|
|
873
|
+
rawHeaders,
|
|
874
|
+
_req: req,
|
|
875
|
+
text: () => req.text(),
|
|
876
|
+
json: () => req.json()
|
|
877
|
+
};
|
|
878
|
+
const serverResponse = {
|
|
879
|
+
statusCode: 200,
|
|
880
|
+
statusMessage: "OK",
|
|
881
|
+
headersSent: false,
|
|
882
|
+
setHeader(name, value) {
|
|
883
|
+
responseHeaders.set(name, Array.isArray(value) ? value.join(", ") : String(value));
|
|
884
|
+
return this;
|
|
885
|
+
},
|
|
886
|
+
getHeader(name) {
|
|
887
|
+
return responseHeaders.get(name) ?? void 0;
|
|
888
|
+
},
|
|
889
|
+
getHeaders() {
|
|
890
|
+
const headers = {};
|
|
891
|
+
responseHeaders.forEach((value, key) => {
|
|
892
|
+
headers[key] = value;
|
|
893
|
+
});
|
|
894
|
+
return headers;
|
|
895
|
+
},
|
|
896
|
+
writeHead(status, arg2, arg3) {
|
|
897
|
+
statusCode = status;
|
|
898
|
+
this.statusCode = status;
|
|
899
|
+
this.headersSent = true;
|
|
900
|
+
if (typeof arg2 === "string") {
|
|
901
|
+
statusText = arg2;
|
|
902
|
+
this.statusMessage = arg2;
|
|
903
|
+
if (arg3) {
|
|
904
|
+
Object.entries(arg3).forEach(([key, value]) => {
|
|
905
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
906
|
+
});
|
|
907
|
+
}
|
|
908
|
+
} else if (arg2) {
|
|
909
|
+
Object.entries(arg2).forEach(([key, value]) => {
|
|
910
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
911
|
+
});
|
|
626
912
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
913
|
+
return this;
|
|
914
|
+
},
|
|
915
|
+
write(chunk) {
|
|
916
|
+
if (!this.headersSent) {
|
|
917
|
+
this.writeHead(statusCode);
|
|
918
|
+
}
|
|
919
|
+
if (typeof chunk === "string") {
|
|
920
|
+
bodyChunks.push(new TextEncoder().encode(chunk));
|
|
921
|
+
} else if (chunk instanceof Uint8Array) {
|
|
922
|
+
bodyChunks.push(chunk);
|
|
923
|
+
} else if (chunk !== void 0 && chunk !== null) {
|
|
924
|
+
bodyChunks.push(new TextEncoder().encode(String(chunk)));
|
|
925
|
+
}
|
|
926
|
+
return true;
|
|
927
|
+
},
|
|
928
|
+
end(chunk) {
|
|
929
|
+
if (chunk !== void 0) {
|
|
930
|
+
this.write(chunk);
|
|
931
|
+
}
|
|
932
|
+
if (!this.headersSent) {
|
|
933
|
+
this.writeHead(statusCode);
|
|
934
|
+
}
|
|
935
|
+
responseClosed = true;
|
|
936
|
+
}
|
|
937
|
+
};
|
|
938
|
+
if (server.requestListener) {
|
|
939
|
+
server.requestListener(incomingMessage, serverResponse);
|
|
940
|
+
} else {
|
|
941
|
+
server.emit("request", incomingMessage, serverResponse);
|
|
632
942
|
}
|
|
943
|
+
if (!responseClosed) {
|
|
944
|
+
serverResponse.end();
|
|
945
|
+
}
|
|
946
|
+
const body = bodyChunks.length === 0 ? void 0 : (() => {
|
|
947
|
+
const totalLength = bodyChunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
948
|
+
const output = new ArrayBuffer(totalLength);
|
|
949
|
+
const combined = new Uint8Array(output);
|
|
950
|
+
let offset = 0;
|
|
951
|
+
for (const chunk of bodyChunks) {
|
|
952
|
+
combined.set(chunk, offset);
|
|
953
|
+
offset += chunk.length;
|
|
954
|
+
}
|
|
955
|
+
return output;
|
|
956
|
+
})();
|
|
957
|
+
return new Response(body, {
|
|
958
|
+
status: statusCode,
|
|
959
|
+
statusText,
|
|
960
|
+
headers: responseHeaders
|
|
961
|
+
});
|
|
633
962
|
});
|
|
963
|
+
this._listening = true;
|
|
634
964
|
emitListeningWithCallback(this, callback);
|
|
965
|
+
this.nativeServer.finished.then(() => closeAndEmit(this)).catch((err) => this.emit("error", err));
|
|
635
966
|
}
|
|
636
967
|
return this;
|
|
637
968
|
}
|
|
@@ -660,9 +991,11 @@ var init_http = __esm({
|
|
|
660
991
|
return createAddress(0, addr, "unix");
|
|
661
992
|
}
|
|
662
993
|
return addr;
|
|
663
|
-
}
|
|
994
|
+
}
|
|
995
|
+
if (isBun) {
|
|
664
996
|
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
665
|
-
}
|
|
997
|
+
}
|
|
998
|
+
if (isDeno) {
|
|
666
999
|
const addr = this.nativeServer.addr;
|
|
667
1000
|
return createAddress(addr.port, addr.hostname);
|
|
668
1001
|
}
|
|
@@ -672,229 +1005,62 @@ var init_http = __esm({
|
|
|
672
1005
|
return this._listening;
|
|
673
1006
|
}
|
|
674
1007
|
};
|
|
675
|
-
ClientRequest = class extends EventEmitter {
|
|
676
|
-
constructor(_url, _options = {}) {
|
|
677
|
-
super();
|
|
678
|
-
}
|
|
679
|
-
write(_chunk) {
|
|
680
|
-
return true;
|
|
681
|
-
}
|
|
682
|
-
end(callback) {
|
|
683
|
-
queueCallback(callback);
|
|
684
|
-
}
|
|
685
|
-
};
|
|
686
|
-
Agent = class {
|
|
687
|
-
constructor(options) {
|
|
688
|
-
this.options = options;
|
|
689
|
-
}
|
|
690
|
-
};
|
|
691
|
-
http_default = {
|
|
692
|
-
createServer,
|
|
693
|
-
request,
|
|
694
|
-
get,
|
|
695
|
-
Server,
|
|
696
|
-
IncomingMessage,
|
|
697
|
-
ServerResponse,
|
|
698
|
-
Agent,
|
|
699
|
-
ClientRequest,
|
|
700
|
-
METHODS,
|
|
701
|
-
STATUS_CODES,
|
|
702
|
-
getRuntime
|
|
703
|
-
};
|
|
704
1008
|
}
|
|
705
1009
|
});
|
|
706
1010
|
|
|
707
|
-
// src/
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
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;
|
|
1011
|
+
// src/server/http/index.ts
|
|
1012
|
+
var http_exports = {};
|
|
1013
|
+
__export(http_exports, {
|
|
1014
|
+
Agent: () => Agent,
|
|
1015
|
+
ClientRequest: () => ClientRequest,
|
|
1016
|
+
IncomingMessage: () => IncomingMessage,
|
|
1017
|
+
METHODS: () => METHODS,
|
|
1018
|
+
STATUS_CODES: () => STATUS_CODES,
|
|
1019
|
+
Server: () => Server,
|
|
1020
|
+
ServerResponse: () => ServerResponse,
|
|
1021
|
+
createServer: () => createServer,
|
|
1022
|
+
default: () => http_default,
|
|
1023
|
+
get: () => get,
|
|
1024
|
+
getRuntime: () => getRuntime3,
|
|
1025
|
+
request: () => request
|
|
1026
|
+
});
|
|
1027
|
+
var http_default;
|
|
1028
|
+
var init_http = __esm({
|
|
1029
|
+
"src/server/http/index.ts"() {
|
|
1030
|
+
"use strict";
|
|
1031
|
+
init_agent();
|
|
1032
|
+
init_client_request();
|
|
1033
|
+
init_constants();
|
|
1034
|
+
init_incoming_message();
|
|
1035
|
+
init_request_api();
|
|
1036
|
+
init_response();
|
|
1037
|
+
init_runtime2();
|
|
1038
|
+
init_server_runtime();
|
|
1039
|
+
init_agent();
|
|
1040
|
+
init_client_request();
|
|
1041
|
+
init_constants();
|
|
1042
|
+
init_incoming_message();
|
|
1043
|
+
init_request_api();
|
|
1044
|
+
init_response();
|
|
1045
|
+
init_runtime2();
|
|
1046
|
+
init_server_runtime();
|
|
1047
|
+
http_default = {
|
|
1048
|
+
createServer,
|
|
1049
|
+
request,
|
|
1050
|
+
get,
|
|
1051
|
+
Server,
|
|
1052
|
+
IncomingMessage,
|
|
1053
|
+
ServerResponse,
|
|
1054
|
+
Agent,
|
|
1055
|
+
ClientRequest,
|
|
1056
|
+
METHODS,
|
|
1057
|
+
STATUS_CODES,
|
|
1058
|
+
getRuntime: getRuntime3
|
|
1059
|
+
};
|
|
889
1060
|
}
|
|
890
|
-
};
|
|
891
|
-
function createServer2(options, requestListener) {
|
|
892
|
-
return new Server2(options, requestListener);
|
|
893
|
-
}
|
|
1061
|
+
});
|
|
894
1062
|
|
|
895
|
-
// src/ws.ts
|
|
896
|
-
init_runtime();
|
|
897
|
-
import { EventEmitter as EventEmitter3 } from "events";
|
|
1063
|
+
// src/server/ws/constants.ts
|
|
898
1064
|
var ReadyState = /* @__PURE__ */ ((ReadyState2) => {
|
|
899
1065
|
ReadyState2[ReadyState2["CONNECTING"] = 0] = "CONNECTING";
|
|
900
1066
|
ReadyState2[ReadyState2["OPEN"] = 1] = "OPEN";
|
|
@@ -919,7 +1085,14 @@ var CLOSE_CODES = {
|
|
|
919
1085
|
BAD_GATEWAY: 1014,
|
|
920
1086
|
TLS_HANDSHAKE_FAIL: 1015
|
|
921
1087
|
};
|
|
922
|
-
|
|
1088
|
+
|
|
1089
|
+
// src/server/ws/server.ts
|
|
1090
|
+
init_runtime();
|
|
1091
|
+
import { EventEmitter as EventEmitter2 } from "events";
|
|
1092
|
+
|
|
1093
|
+
// src/server/ws/utils.ts
|
|
1094
|
+
init_runtime();
|
|
1095
|
+
function queueCallback(callback, error) {
|
|
923
1096
|
if (callback) {
|
|
924
1097
|
queueMicrotask(() => callback(error));
|
|
925
1098
|
}
|
|
@@ -934,7 +1107,74 @@ function getRequestPath(url) {
|
|
|
934
1107
|
const [pathname = "/"] = (url || "/").split("?");
|
|
935
1108
|
return pathname || "/";
|
|
936
1109
|
}
|
|
937
|
-
|
|
1110
|
+
function isIgnorableConnectionError(error) {
|
|
1111
|
+
const errorCode = error?.code;
|
|
1112
|
+
return errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE";
|
|
1113
|
+
}
|
|
1114
|
+
function coerceBunMessage(message) {
|
|
1115
|
+
const isBinary = typeof message !== "string";
|
|
1116
|
+
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));
|
|
1117
|
+
return { payload, isBinary };
|
|
1118
|
+
}
|
|
1119
|
+
function parseFrame(data) {
|
|
1120
|
+
if (data.length < 2) {
|
|
1121
|
+
return null;
|
|
1122
|
+
}
|
|
1123
|
+
const firstByte = data[0];
|
|
1124
|
+
const secondByte = data[1];
|
|
1125
|
+
const opcode = firstByte & 15;
|
|
1126
|
+
const isMasked = (secondByte & 128) === 128;
|
|
1127
|
+
let payloadLength = secondByte & 127;
|
|
1128
|
+
let offset = 2;
|
|
1129
|
+
if (payloadLength === 126) {
|
|
1130
|
+
payloadLength = data.readUInt16BE(2);
|
|
1131
|
+
offset = 4;
|
|
1132
|
+
} else if (payloadLength === 127) {
|
|
1133
|
+
payloadLength = Number(data.readBigUInt64BE(2));
|
|
1134
|
+
offset = 10;
|
|
1135
|
+
}
|
|
1136
|
+
let payload = data.subarray(offset);
|
|
1137
|
+
if (isMasked) {
|
|
1138
|
+
const maskKey = data.subarray(offset, offset + 4);
|
|
1139
|
+
payload = data.subarray(offset + 4, offset + 4 + payloadLength);
|
|
1140
|
+
for (let index = 0; index < payload.length; index += 1) {
|
|
1141
|
+
payload[index] ^= maskKey[index % 4];
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
if (opcode === 1) {
|
|
1145
|
+
return payload.toString("utf8");
|
|
1146
|
+
}
|
|
1147
|
+
return null;
|
|
1148
|
+
}
|
|
1149
|
+
function createFrame(data) {
|
|
1150
|
+
const payload = typeof data === "string" ? Buffer.from(data) : data;
|
|
1151
|
+
const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;
|
|
1152
|
+
let frame;
|
|
1153
|
+
let offset = 2;
|
|
1154
|
+
if (payloadLength < 126) {
|
|
1155
|
+
frame = Buffer.allocUnsafe(2 + payloadLength);
|
|
1156
|
+
frame[1] = payloadLength;
|
|
1157
|
+
} else if (payloadLength < 65536) {
|
|
1158
|
+
frame = Buffer.allocUnsafe(4 + payloadLength);
|
|
1159
|
+
frame[1] = 126;
|
|
1160
|
+
frame.writeUInt16BE(payloadLength, 2);
|
|
1161
|
+
offset = 4;
|
|
1162
|
+
} else {
|
|
1163
|
+
frame = Buffer.allocUnsafe(10 + payloadLength);
|
|
1164
|
+
frame[1] = 127;
|
|
1165
|
+
frame.writeBigUInt64BE(BigInt(payloadLength), 2);
|
|
1166
|
+
offset = 10;
|
|
1167
|
+
}
|
|
1168
|
+
frame[0] = 129;
|
|
1169
|
+
if (Buffer.isBuffer(payload)) {
|
|
1170
|
+
payload.copy(frame, offset);
|
|
1171
|
+
}
|
|
1172
|
+
return frame;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
// src/server/ws/websocket.ts
|
|
1176
|
+
import { EventEmitter } from "events";
|
|
1177
|
+
var WebSocket = class extends EventEmitter {
|
|
938
1178
|
constructor(address, protocols, _options) {
|
|
939
1179
|
super();
|
|
940
1180
|
this.readyState = 0 /* CONNECTING */;
|
|
@@ -964,22 +1204,23 @@ var WebSocket = class extends EventEmitter3 {
|
|
|
964
1204
|
};
|
|
965
1205
|
}
|
|
966
1206
|
/**
|
|
967
|
-
* Send data through WebSocket
|
|
1207
|
+
* Send data through WebSocket.
|
|
968
1208
|
*/
|
|
969
1209
|
send(data, options, callback) {
|
|
970
1210
|
const cb = typeof options === "function" ? options : callback;
|
|
971
1211
|
if (this.readyState !== 1 /* OPEN */) {
|
|
972
|
-
|
|
1212
|
+
queueCallback(cb, new Error("WebSocket is not open"));
|
|
1213
|
+
return;
|
|
973
1214
|
}
|
|
974
1215
|
try {
|
|
975
1216
|
this._socket.send(data);
|
|
976
|
-
|
|
1217
|
+
queueCallback(cb);
|
|
977
1218
|
} catch (error) {
|
|
978
|
-
|
|
1219
|
+
queueCallback(cb, error);
|
|
979
1220
|
}
|
|
980
1221
|
}
|
|
981
1222
|
/**
|
|
982
|
-
* Close the WebSocket connection
|
|
1223
|
+
* Close the WebSocket connection.
|
|
983
1224
|
*/
|
|
984
1225
|
close(code, reason) {
|
|
985
1226
|
if (this.readyState === 3 /* CLOSED */ || this.readyState === 2 /* CLOSING */) {
|
|
@@ -989,42 +1230,44 @@ var WebSocket = class extends EventEmitter3 {
|
|
|
989
1230
|
this._socket.close(code, typeof reason === "string" ? reason : reason?.toString());
|
|
990
1231
|
}
|
|
991
1232
|
/**
|
|
992
|
-
* Pause the socket (no-op for native WebSocket)
|
|
1233
|
+
* Pause the socket (no-op for native WebSocket).
|
|
993
1234
|
*/
|
|
994
1235
|
pause() {
|
|
995
1236
|
}
|
|
996
1237
|
/**
|
|
997
|
-
* Resume the socket (no-op for native WebSocket)
|
|
1238
|
+
* Resume the socket (no-op for native WebSocket).
|
|
998
1239
|
*/
|
|
999
1240
|
resume() {
|
|
1000
1241
|
}
|
|
1001
1242
|
/**
|
|
1002
|
-
* Send a ping frame (no-op for native WebSocket)
|
|
1243
|
+
* Send a ping frame (no-op for native WebSocket).
|
|
1003
1244
|
*/
|
|
1004
1245
|
ping(_data, _mask, callback) {
|
|
1005
|
-
|
|
1246
|
+
queueCallback(callback);
|
|
1006
1247
|
}
|
|
1007
1248
|
/**
|
|
1008
|
-
* Send a pong frame (no-op for native WebSocket)
|
|
1249
|
+
* Send a pong frame (no-op for native WebSocket).
|
|
1009
1250
|
*/
|
|
1010
1251
|
pong(_data, _mask, callback) {
|
|
1011
|
-
|
|
1252
|
+
queueCallback(callback);
|
|
1012
1253
|
}
|
|
1013
1254
|
/**
|
|
1014
|
-
* Terminate the connection
|
|
1255
|
+
* Terminate the connection.
|
|
1015
1256
|
*/
|
|
1016
1257
|
terminate() {
|
|
1017
1258
|
this._socket.close();
|
|
1018
1259
|
this.readyState = 3 /* CLOSED */;
|
|
1019
1260
|
}
|
|
1020
1261
|
/**
|
|
1021
|
-
* Get buffered amount
|
|
1262
|
+
* Get buffered amount.
|
|
1022
1263
|
*/
|
|
1023
1264
|
get bufferedAmount() {
|
|
1024
1265
|
return this._socket.bufferedAmount || 0;
|
|
1025
1266
|
}
|
|
1026
1267
|
};
|
|
1027
|
-
|
|
1268
|
+
|
|
1269
|
+
// src/server/ws/server.ts
|
|
1270
|
+
var WebSocketServer = class extends EventEmitter2 {
|
|
1028
1271
|
constructor(options, callback) {
|
|
1029
1272
|
super();
|
|
1030
1273
|
this.clients = /* @__PURE__ */ new Set();
|
|
@@ -1035,8 +1278,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1035
1278
|
if (options?.server) {
|
|
1036
1279
|
this._httpServer = options.server;
|
|
1037
1280
|
this._setupUpgradeHandler();
|
|
1038
|
-
} else if (options?.noServer) {
|
|
1039
|
-
} else {
|
|
1281
|
+
} else if (!options?.noServer) {
|
|
1040
1282
|
const http2 = __require("http");
|
|
1041
1283
|
this._httpServer = http2.createServer();
|
|
1042
1284
|
this._ownsHttpServer = true;
|
|
@@ -1050,30 +1292,30 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1050
1292
|
this._httpServer = options.server;
|
|
1051
1293
|
options.server.registerWebSocketServer(this);
|
|
1052
1294
|
}
|
|
1053
|
-
|
|
1295
|
+
queueCallback(callback);
|
|
1054
1296
|
} else {
|
|
1055
|
-
|
|
1297
|
+
queueCallback(callback);
|
|
1056
1298
|
}
|
|
1057
1299
|
}
|
|
1058
1300
|
_setupUpgradeHandler() {
|
|
1059
|
-
this._httpServer.on("upgrade", (
|
|
1060
|
-
const requestPath = getRequestPath(
|
|
1301
|
+
this._httpServer.on("upgrade", (request3, socket, head) => {
|
|
1302
|
+
const requestPath = getRequestPath(request3.url);
|
|
1061
1303
|
console.log("[WebSocket] Upgrade request:", requestPath, "Expected:", this.path || "(any)");
|
|
1062
1304
|
if (this.path && requestPath !== this.path) {
|
|
1063
1305
|
console.log("[WebSocket] Path mismatch, ignoring");
|
|
1064
1306
|
return;
|
|
1065
1307
|
}
|
|
1066
|
-
this.handleUpgrade(
|
|
1308
|
+
this.handleUpgrade(request3, socket, head, (client) => {
|
|
1067
1309
|
console.log("[WebSocket] Client connected");
|
|
1068
|
-
this.emit("connection", client,
|
|
1310
|
+
this.emit("connection", client, request3);
|
|
1069
1311
|
});
|
|
1070
1312
|
});
|
|
1071
1313
|
}
|
|
1072
1314
|
/**
|
|
1073
|
-
* Handle HTTP upgrade for WebSocket
|
|
1315
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1074
1316
|
*/
|
|
1075
|
-
handleUpgrade(
|
|
1076
|
-
const key =
|
|
1317
|
+
handleUpgrade(request3, socket, _head, callback) {
|
|
1318
|
+
const key = request3.headers["sec-websocket-key"];
|
|
1077
1319
|
if (!key) {
|
|
1078
1320
|
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
|
|
1079
1321
|
return;
|
|
@@ -1100,7 +1342,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1100
1342
|
}
|
|
1101
1343
|
_createClientFromSocket(socket) {
|
|
1102
1344
|
const client = Object.create(WebSocket.prototype);
|
|
1103
|
-
|
|
1345
|
+
EventEmitter2.call(client);
|
|
1104
1346
|
client.readyState = 1 /* OPEN */;
|
|
1105
1347
|
client.url = "ws://localhost";
|
|
1106
1348
|
client.protocol = "";
|
|
@@ -1109,7 +1351,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1109
1351
|
client._socket = socket;
|
|
1110
1352
|
socket.on("data", (data) => {
|
|
1111
1353
|
try {
|
|
1112
|
-
const message =
|
|
1354
|
+
const message = parseFrame(data);
|
|
1113
1355
|
if (message) {
|
|
1114
1356
|
client.emit("message", message, false);
|
|
1115
1357
|
}
|
|
@@ -1122,36 +1364,34 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1122
1364
|
client.emit("close", CLOSE_CODES.NORMAL, "");
|
|
1123
1365
|
});
|
|
1124
1366
|
socket.on("error", (error) => {
|
|
1125
|
-
|
|
1126
|
-
if (errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE") {
|
|
1367
|
+
if (isIgnorableConnectionError(error)) {
|
|
1127
1368
|
return;
|
|
1128
1369
|
}
|
|
1129
1370
|
client.emit("error", error);
|
|
1130
1371
|
});
|
|
1131
1372
|
client.send = (data, _options, callback) => {
|
|
1132
1373
|
if (!socket.writable || client.readyState !== 1 /* OPEN */) {
|
|
1133
|
-
const
|
|
1134
|
-
|
|
1135
|
-
|
|
1374
|
+
const error = new Error("WebSocket is not open");
|
|
1375
|
+
error.code = "WS_NOT_OPEN";
|
|
1376
|
+
queueCallback(callback, error);
|
|
1136
1377
|
return;
|
|
1137
1378
|
}
|
|
1138
1379
|
try {
|
|
1139
|
-
const frame =
|
|
1140
|
-
socket.write(frame, (
|
|
1141
|
-
if (
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
} else {
|
|
1150
|
-
queueCallback3(callback);
|
|
1380
|
+
const frame = createFrame(data);
|
|
1381
|
+
socket.write(frame, (error) => {
|
|
1382
|
+
if (!error) {
|
|
1383
|
+
queueCallback(callback);
|
|
1384
|
+
return;
|
|
1385
|
+
}
|
|
1386
|
+
if (isIgnorableConnectionError(error)) {
|
|
1387
|
+
client.readyState = 3 /* CLOSED */;
|
|
1388
|
+
queueCallback(callback);
|
|
1389
|
+
return;
|
|
1151
1390
|
}
|
|
1391
|
+
queueCallback(callback, error);
|
|
1152
1392
|
});
|
|
1153
1393
|
} catch (error) {
|
|
1154
|
-
|
|
1394
|
+
queueCallback(callback, error);
|
|
1155
1395
|
}
|
|
1156
1396
|
};
|
|
1157
1397
|
client.close = (_code, _reason) => {
|
|
@@ -1162,7 +1402,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1162
1402
|
}
|
|
1163
1403
|
_createClientFromBunSocket(socket) {
|
|
1164
1404
|
const client = Object.create(WebSocket.prototype);
|
|
1165
|
-
|
|
1405
|
+
EventEmitter2.call(client);
|
|
1166
1406
|
client.readyState = 1 /* OPEN */;
|
|
1167
1407
|
client.url = "ws://localhost";
|
|
1168
1408
|
client.protocol = "";
|
|
@@ -1171,14 +1411,14 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1171
1411
|
client._socket = socket;
|
|
1172
1412
|
client.send = (data, _options, callback) => {
|
|
1173
1413
|
if (client.readyState !== 1 /* OPEN */) {
|
|
1174
|
-
|
|
1414
|
+
queueCallback(callback, new Error("WebSocket is not open"));
|
|
1175
1415
|
return;
|
|
1176
1416
|
}
|
|
1177
1417
|
try {
|
|
1178
1418
|
socket.send(data);
|
|
1179
|
-
|
|
1419
|
+
queueCallback(callback);
|
|
1180
1420
|
} catch (error) {
|
|
1181
|
-
|
|
1421
|
+
queueCallback(callback, error);
|
|
1182
1422
|
}
|
|
1183
1423
|
};
|
|
1184
1424
|
client.close = (code, reason) => {
|
|
@@ -1186,7 +1426,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1186
1426
|
return;
|
|
1187
1427
|
}
|
|
1188
1428
|
client.readyState = 2 /* CLOSING */;
|
|
1189
|
-
socket.close(code ?? CLOSE_CODES.NORMAL, reason);
|
|
1429
|
+
socket.close(code ?? CLOSE_CODES.NORMAL, typeof reason === "string" ? reason : reason?.toString());
|
|
1190
1430
|
};
|
|
1191
1431
|
client.terminate = () => {
|
|
1192
1432
|
socket.close();
|
|
@@ -1194,7 +1434,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1194
1434
|
};
|
|
1195
1435
|
return client;
|
|
1196
1436
|
}
|
|
1197
|
-
_handleBunOpen(socket,
|
|
1437
|
+
_handleBunOpen(socket, request3 = {}) {
|
|
1198
1438
|
const client = this._createClientFromBunSocket(socket);
|
|
1199
1439
|
if (socket.data) {
|
|
1200
1440
|
socket.data.client = client;
|
|
@@ -1206,9 +1446,9 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1206
1446
|
});
|
|
1207
1447
|
}
|
|
1208
1448
|
const incomingRequest = {
|
|
1209
|
-
url:
|
|
1210
|
-
headers:
|
|
1211
|
-
socket:
|
|
1449
|
+
url: request3.url || this.path,
|
|
1450
|
+
headers: request3.headers || {},
|
|
1451
|
+
socket: request3.socket || { remoteAddress: void 0 }
|
|
1212
1452
|
};
|
|
1213
1453
|
this.emit("connection", client, incomingRequest);
|
|
1214
1454
|
}
|
|
@@ -1217,8 +1457,7 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1217
1457
|
if (!client) {
|
|
1218
1458
|
return;
|
|
1219
1459
|
}
|
|
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));
|
|
1460
|
+
const { payload, isBinary } = coerceBunMessage(message);
|
|
1222
1461
|
client.emit("message", payload, isBinary);
|
|
1223
1462
|
}
|
|
1224
1463
|
_handleBunClose(socket, code, reason) {
|
|
@@ -1230,98 +1469,290 @@ var WebSocketServer = class extends EventEmitter3 {
|
|
|
1230
1469
|
client.emit("close", code, typeof reason === "string" ? reason : reason?.toString() || "");
|
|
1231
1470
|
this.clients.delete(client);
|
|
1232
1471
|
}
|
|
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
1472
|
/**
|
|
1287
|
-
* Close the server
|
|
1473
|
+
* Close the server.
|
|
1288
1474
|
*/
|
|
1289
1475
|
close(callback) {
|
|
1290
1476
|
this.clients.forEach((client) => client.close());
|
|
1291
1477
|
this.clients.clear();
|
|
1292
1478
|
if (this._httpServer && this._ownsHttpServer) {
|
|
1293
1479
|
this._httpServer.close(callback);
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
this.emit("close");
|
|
1299
|
-
queueCallback3(callback);
|
|
1480
|
+
return;
|
|
1481
|
+
}
|
|
1482
|
+
if (runtime === "bun" && this._httpServer?.unregisterWebSocketServer) {
|
|
1483
|
+
this._httpServer.unregisterWebSocketServer(this);
|
|
1300
1484
|
}
|
|
1485
|
+
this.emit("close");
|
|
1486
|
+
queueCallback(callback);
|
|
1301
1487
|
}
|
|
1302
1488
|
/**
|
|
1303
|
-
* Check if server should handle request
|
|
1489
|
+
* Check if server should handle request.
|
|
1304
1490
|
*/
|
|
1305
|
-
shouldHandle(
|
|
1306
|
-
if (this.path && getRequestPath(
|
|
1491
|
+
shouldHandle(request3) {
|
|
1492
|
+
if (this.path && getRequestPath(request3.url) !== this.path) {
|
|
1307
1493
|
return false;
|
|
1308
1494
|
}
|
|
1309
1495
|
return true;
|
|
1310
1496
|
}
|
|
1311
1497
|
/**
|
|
1312
|
-
* Get server address
|
|
1498
|
+
* Get server address.
|
|
1313
1499
|
*/
|
|
1314
1500
|
address() {
|
|
1315
|
-
if (this._httpServer
|
|
1501
|
+
if (this._httpServer?.address) {
|
|
1316
1502
|
return this._httpServer.address();
|
|
1317
1503
|
}
|
|
1318
1504
|
return null;
|
|
1319
1505
|
}
|
|
1320
1506
|
};
|
|
1321
1507
|
|
|
1322
|
-
// src/
|
|
1508
|
+
// src/server/ws/runtime.ts
|
|
1509
|
+
init_runtime();
|
|
1510
|
+
|
|
1511
|
+
// src/server/wss/client.ts
|
|
1512
|
+
var WSSClient = class extends WebSocket {
|
|
1513
|
+
constructor(address, protocols, options) {
|
|
1514
|
+
const urlString = typeof address === "string" ? address : address.toString();
|
|
1515
|
+
const secureUrl = urlString.replace(/^ws:\/\//i, "wss://");
|
|
1516
|
+
super(secureUrl, protocols, options);
|
|
1517
|
+
}
|
|
1518
|
+
};
|
|
1519
|
+
function createWSSClient(address, protocols, options) {
|
|
1520
|
+
return new WSSClient(address, protocols, options);
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1523
|
+
// src/server/wss/runtime.ts
|
|
1524
|
+
init_runtime();
|
|
1525
|
+
function getRuntime2() {
|
|
1526
|
+
return runtime;
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1529
|
+
// src/server/wss/server.ts
|
|
1530
|
+
import { EventEmitter as EventEmitter9 } from "events";
|
|
1531
|
+
|
|
1532
|
+
// src/server/https/client-request.ts
|
|
1533
|
+
init_utils();
|
|
1534
|
+
import { EventEmitter as EventEmitter3 } from "events";
|
|
1535
|
+
|
|
1536
|
+
// src/server/https/request-api.ts
|
|
1537
|
+
init_runtime();
|
|
1538
|
+
|
|
1539
|
+
// src/server/https/http-classes.ts
|
|
1540
|
+
function loadHttpClasses() {
|
|
1541
|
+
const httpModule = (init_http(), __toCommonJS(http_exports));
|
|
1542
|
+
return {
|
|
1543
|
+
IncomingMessage: httpModule.IncomingMessage,
|
|
1544
|
+
ServerResponse: httpModule.ServerResponse
|
|
1545
|
+
};
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
// src/server/https/node-modules.ts
|
|
1549
|
+
init_runtime();
|
|
1550
|
+
var https2;
|
|
1551
|
+
if (isNode && typeof process !== "undefined") {
|
|
1552
|
+
try {
|
|
1553
|
+
https2 = __require("https");
|
|
1554
|
+
} catch {
|
|
1555
|
+
https2 = __require("https");
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
// src/server/https/runtime.ts
|
|
1323
1560
|
init_runtime();
|
|
1324
|
-
|
|
1561
|
+
|
|
1562
|
+
// src/server/https/server-runtime.ts
|
|
1563
|
+
init_runtime();
|
|
1564
|
+
init_utils();
|
|
1565
|
+
import { EventEmitter as EventEmitter8 } from "events";
|
|
1566
|
+
var Server2 = class extends EventEmitter8 {
|
|
1567
|
+
constructor(options = {}, requestListener) {
|
|
1568
|
+
super();
|
|
1569
|
+
this._listening = false;
|
|
1570
|
+
this.options = options;
|
|
1571
|
+
this.requestListener = requestListener;
|
|
1572
|
+
}
|
|
1573
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
1574
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
1575
|
+
return explicitFd;
|
|
1576
|
+
}
|
|
1577
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
1578
|
+
if (!fdValue) {
|
|
1579
|
+
return void 0;
|
|
1580
|
+
}
|
|
1581
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
1582
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
1583
|
+
return void 0;
|
|
1584
|
+
}
|
|
1585
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
1586
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
1587
|
+
return void 0;
|
|
1588
|
+
}
|
|
1589
|
+
return parsedFd;
|
|
1590
|
+
}
|
|
1591
|
+
listen(...args) {
|
|
1592
|
+
let port = 3e3;
|
|
1593
|
+
let hostname = "0.0.0.0";
|
|
1594
|
+
let fd;
|
|
1595
|
+
let callback;
|
|
1596
|
+
const firstArg = args[0];
|
|
1597
|
+
if (typeof firstArg === "number") {
|
|
1598
|
+
port = firstArg;
|
|
1599
|
+
const secondArg = args[1];
|
|
1600
|
+
if (typeof secondArg === "string") {
|
|
1601
|
+
hostname = secondArg;
|
|
1602
|
+
callback = args[2] || args[3];
|
|
1603
|
+
} else if (typeof secondArg === "function") {
|
|
1604
|
+
callback = secondArg;
|
|
1605
|
+
}
|
|
1606
|
+
} else if (firstArg && typeof firstArg === "object") {
|
|
1607
|
+
port = firstArg.port || 3e3;
|
|
1608
|
+
hostname = firstArg.hostname || "0.0.0.0";
|
|
1609
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
1610
|
+
callback = args[1];
|
|
1611
|
+
}
|
|
1612
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
1613
|
+
const self = this;
|
|
1614
|
+
if (isNode) {
|
|
1615
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1616
|
+
this.nativeServer = https2.createServer(this.options, (req, res) => {
|
|
1617
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1618
|
+
const serverResponse = new ServerResponse2(incomingMessage, res);
|
|
1619
|
+
if (self.requestListener) {
|
|
1620
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1621
|
+
} else {
|
|
1622
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1623
|
+
}
|
|
1624
|
+
});
|
|
1625
|
+
if (fd !== void 0) {
|
|
1626
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
1627
|
+
this._listening = true;
|
|
1628
|
+
this.emit("listening");
|
|
1629
|
+
if (callback) callback();
|
|
1630
|
+
});
|
|
1631
|
+
} else {
|
|
1632
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
1633
|
+
this._listening = true;
|
|
1634
|
+
this.emit("listening");
|
|
1635
|
+
if (callback) callback();
|
|
1636
|
+
});
|
|
1637
|
+
}
|
|
1638
|
+
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1639
|
+
this.nativeServer.on("close", () => {
|
|
1640
|
+
this._listening = false;
|
|
1641
|
+
this.emit("close");
|
|
1642
|
+
});
|
|
1643
|
+
} else if (isBun) {
|
|
1644
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1645
|
+
const tlsOptions = {
|
|
1646
|
+
port,
|
|
1647
|
+
hostname,
|
|
1648
|
+
fetch: (req) => {
|
|
1649
|
+
return new Promise((resolve) => {
|
|
1650
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1651
|
+
const serverResponse = new ServerResponse2();
|
|
1652
|
+
serverResponse._setResolver(resolve);
|
|
1653
|
+
if (self.requestListener) {
|
|
1654
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1655
|
+
} else {
|
|
1656
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1657
|
+
}
|
|
1658
|
+
});
|
|
1659
|
+
},
|
|
1660
|
+
error: (error) => {
|
|
1661
|
+
this.emit("error", error);
|
|
1662
|
+
return createErrorResponse();
|
|
1663
|
+
}
|
|
1664
|
+
};
|
|
1665
|
+
if (this.options.key || this.options.cert) {
|
|
1666
|
+
tlsOptions.tls = {
|
|
1667
|
+
key: this.options.key,
|
|
1668
|
+
cert: this.options.cert,
|
|
1669
|
+
ca: this.options.ca,
|
|
1670
|
+
passphrase: this.options.passphrase
|
|
1671
|
+
};
|
|
1672
|
+
} else if (this.options.tls) {
|
|
1673
|
+
tlsOptions.tls = this.options.tls;
|
|
1674
|
+
}
|
|
1675
|
+
this.nativeServer = Bun.serve(tlsOptions);
|
|
1676
|
+
emitListeningWithCallback(this, callback);
|
|
1677
|
+
} else if (isDeno) {
|
|
1678
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1679
|
+
const serveOptions = {
|
|
1680
|
+
port,
|
|
1681
|
+
hostname,
|
|
1682
|
+
handler: (req) => {
|
|
1683
|
+
return new Promise((resolve) => {
|
|
1684
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1685
|
+
const serverResponse = new ServerResponse2();
|
|
1686
|
+
serverResponse._setResolver(resolve);
|
|
1687
|
+
if (self.requestListener) {
|
|
1688
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1689
|
+
} else {
|
|
1690
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1691
|
+
}
|
|
1692
|
+
});
|
|
1693
|
+
},
|
|
1694
|
+
onError: (error) => {
|
|
1695
|
+
this.emit("error", error);
|
|
1696
|
+
return createErrorResponse();
|
|
1697
|
+
}
|
|
1698
|
+
};
|
|
1699
|
+
if (this.options.key && this.options.cert) {
|
|
1700
|
+
serveOptions.cert = this.options.cert;
|
|
1701
|
+
serveOptions.key = this.options.key;
|
|
1702
|
+
}
|
|
1703
|
+
this.nativeServer = Deno.serve(serveOptions);
|
|
1704
|
+
emitListeningWithCallback(this, callback);
|
|
1705
|
+
}
|
|
1706
|
+
return this;
|
|
1707
|
+
}
|
|
1708
|
+
close(callback) {
|
|
1709
|
+
if (!this.nativeServer) {
|
|
1710
|
+
if (callback) queueCallback2(() => callback());
|
|
1711
|
+
return this;
|
|
1712
|
+
}
|
|
1713
|
+
if (isNode) {
|
|
1714
|
+
this.nativeServer.close(callback);
|
|
1715
|
+
} else if (isBun) {
|
|
1716
|
+
this.nativeServer.stop();
|
|
1717
|
+
closeAndEmit(this, callback);
|
|
1718
|
+
} else if (isDeno) {
|
|
1719
|
+
this.nativeServer.shutdown();
|
|
1720
|
+
closeAndEmit(this, callback);
|
|
1721
|
+
}
|
|
1722
|
+
return this;
|
|
1723
|
+
}
|
|
1724
|
+
address() {
|
|
1725
|
+
if (!this.nativeServer) return null;
|
|
1726
|
+
if (isNode) {
|
|
1727
|
+
const addr = this.nativeServer.address();
|
|
1728
|
+
if (!addr) return null;
|
|
1729
|
+
if (typeof addr === "string") {
|
|
1730
|
+
return createAddress(0, addr, "unix");
|
|
1731
|
+
}
|
|
1732
|
+
return addr;
|
|
1733
|
+
}
|
|
1734
|
+
if (isBun) {
|
|
1735
|
+
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
1736
|
+
}
|
|
1737
|
+
if (isDeno) {
|
|
1738
|
+
const addr = this.nativeServer.addr;
|
|
1739
|
+
return createAddress(addr.port, addr.hostname);
|
|
1740
|
+
}
|
|
1741
|
+
return null;
|
|
1742
|
+
}
|
|
1743
|
+
get listening() {
|
|
1744
|
+
return this._listening;
|
|
1745
|
+
}
|
|
1746
|
+
};
|
|
1747
|
+
function createServer2(options = {}, requestListener) {
|
|
1748
|
+
return new Server2(options, requestListener);
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
// src/server/wss/server.ts
|
|
1752
|
+
init_runtime();
|
|
1753
|
+
|
|
1754
|
+
// src/server/wss/utils.ts
|
|
1755
|
+
function queueCallback3(callback) {
|
|
1325
1756
|
if (callback) {
|
|
1326
1757
|
queueMicrotask(callback);
|
|
1327
1758
|
}
|
|
@@ -1338,16 +1769,11 @@ function buildHttpsOptions(options) {
|
|
|
1338
1769
|
}
|
|
1339
1770
|
function emitCloseWithCallback(emitter, callback) {
|
|
1340
1771
|
emitter.emit("close");
|
|
1341
|
-
|
|
1772
|
+
queueCallback3(callback);
|
|
1342
1773
|
}
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
const secureUrl = urlString.replace(/^ws:\/\//i, "wss://");
|
|
1347
|
-
super(secureUrl, protocols, options);
|
|
1348
|
-
}
|
|
1349
|
-
};
|
|
1350
|
-
var WSSServer = class extends EventEmitter4 {
|
|
1774
|
+
|
|
1775
|
+
// src/server/wss/server.ts
|
|
1776
|
+
var WSSServer = class extends EventEmitter9 {
|
|
1351
1777
|
constructor(options, callback) {
|
|
1352
1778
|
super();
|
|
1353
1779
|
this.clients = /* @__PURE__ */ new Set();
|
|
@@ -1359,7 +1785,7 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1359
1785
|
this._setupServer(callback);
|
|
1360
1786
|
} else if (options?.noServer) {
|
|
1361
1787
|
this._wsServer = new WebSocketServer({ noServer: true });
|
|
1362
|
-
|
|
1788
|
+
queueCallback3(callback);
|
|
1363
1789
|
} else {
|
|
1364
1790
|
this._httpsServer = createServer2(buildHttpsOptions(options));
|
|
1365
1791
|
this._setupServer(callback);
|
|
@@ -1369,7 +1795,7 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1369
1795
|
}
|
|
1370
1796
|
} else {
|
|
1371
1797
|
this._wsServer = new WebSocketServer(options);
|
|
1372
|
-
|
|
1798
|
+
queueCallback3(callback);
|
|
1373
1799
|
}
|
|
1374
1800
|
}
|
|
1375
1801
|
_setupServer(callback) {
|
|
@@ -1378,44 +1804,44 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1378
1804
|
server: this._httpsServer,
|
|
1379
1805
|
noServer: false
|
|
1380
1806
|
});
|
|
1381
|
-
this._wsServer.on("connection", (client,
|
|
1807
|
+
this._wsServer.on("connection", (client, request3) => {
|
|
1382
1808
|
if (this.options.clientTracking !== false) {
|
|
1383
1809
|
this.clients.add(client);
|
|
1384
1810
|
client.on("close", () => {
|
|
1385
1811
|
this.clients.delete(client);
|
|
1386
1812
|
});
|
|
1387
1813
|
}
|
|
1388
|
-
this.emit("connection", client,
|
|
1814
|
+
this.emit("connection", client, request3);
|
|
1389
1815
|
});
|
|
1390
1816
|
this._wsServer.on("error", (error) => {
|
|
1391
1817
|
this.emit("error", error);
|
|
1392
1818
|
});
|
|
1393
1819
|
if (!this.options?.port) {
|
|
1394
|
-
|
|
1820
|
+
queueCallback3(callback);
|
|
1395
1821
|
}
|
|
1396
1822
|
}
|
|
1397
1823
|
/**
|
|
1398
|
-
* Handle HTTP upgrade for WebSocket
|
|
1824
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1399
1825
|
*/
|
|
1400
|
-
handleUpgrade(
|
|
1826
|
+
handleUpgrade(request3, socket, head, callback) {
|
|
1401
1827
|
if (this._wsServer) {
|
|
1402
|
-
this._wsServer.handleUpgrade(
|
|
1828
|
+
this._wsServer.handleUpgrade(request3, socket, head, callback);
|
|
1403
1829
|
}
|
|
1404
1830
|
}
|
|
1405
1831
|
/**
|
|
1406
|
-
* Check if server should handle request
|
|
1832
|
+
* Check if server should handle request.
|
|
1407
1833
|
*/
|
|
1408
|
-
shouldHandle(
|
|
1834
|
+
shouldHandle(request3) {
|
|
1409
1835
|
if (this._wsServer) {
|
|
1410
|
-
return this._wsServer.shouldHandle(
|
|
1836
|
+
return this._wsServer.shouldHandle(request3);
|
|
1411
1837
|
}
|
|
1412
|
-
if (this.path &&
|
|
1838
|
+
if (this.path && request3.url !== this.path) {
|
|
1413
1839
|
return false;
|
|
1414
1840
|
}
|
|
1415
1841
|
return true;
|
|
1416
1842
|
}
|
|
1417
1843
|
/**
|
|
1418
|
-
* Close the server
|
|
1844
|
+
* Close the server.
|
|
1419
1845
|
*/
|
|
1420
1846
|
close(callback) {
|
|
1421
1847
|
this.clients.forEach((client) => client.close());
|
|
@@ -1428,17 +1854,19 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1428
1854
|
emitCloseWithCallback(this, callback);
|
|
1429
1855
|
}
|
|
1430
1856
|
});
|
|
1431
|
-
|
|
1857
|
+
return;
|
|
1858
|
+
}
|
|
1859
|
+
if (this._httpsServer) {
|
|
1432
1860
|
this._httpsServer.close(callback);
|
|
1433
|
-
|
|
1434
|
-
emitCloseWithCallback(this, callback);
|
|
1861
|
+
return;
|
|
1435
1862
|
}
|
|
1863
|
+
emitCloseWithCallback(this, callback);
|
|
1436
1864
|
}
|
|
1437
1865
|
/**
|
|
1438
|
-
* Get server address
|
|
1866
|
+
* Get server address.
|
|
1439
1867
|
*/
|
|
1440
1868
|
address() {
|
|
1441
|
-
if (this._httpsServer
|
|
1869
|
+
if (this._httpsServer?.address) {
|
|
1442
1870
|
return this._httpsServer.address();
|
|
1443
1871
|
}
|
|
1444
1872
|
if (this._wsServer) {
|
|
@@ -1447,15 +1875,11 @@ var WSSServer = class extends EventEmitter4 {
|
|
|
1447
1875
|
return null;
|
|
1448
1876
|
}
|
|
1449
1877
|
};
|
|
1450
|
-
function createWSSClient(address, protocols, options) {
|
|
1451
|
-
return new WSSClient(address, protocols, options);
|
|
1452
|
-
}
|
|
1453
1878
|
function createWSSServer(options, callback) {
|
|
1454
1879
|
return new WSSServer(options, callback);
|
|
1455
1880
|
}
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
}
|
|
1881
|
+
|
|
1882
|
+
// src/server/wss/index.ts
|
|
1459
1883
|
var wss_default = {
|
|
1460
1884
|
WSSClient,
|
|
1461
1885
|
WSSServer,
|