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.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,36 @@ 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(arg1, arg2) {
|
|
607
|
+
const requestListener = typeof arg1 === "function" ? arg1 : arg2;
|
|
608
|
+
return new Server(requestListener);
|
|
609
|
+
}
|
|
610
|
+
var import_node_events5, Server;
|
|
611
|
+
var init_server_runtime = __esm({
|
|
612
|
+
"src/server/http/server-runtime.ts"() {
|
|
613
|
+
"use strict";
|
|
614
|
+
import_node_events5 = require("events");
|
|
615
|
+
init_runtime();
|
|
616
|
+
init_node_modules();
|
|
617
|
+
init_incoming_message();
|
|
618
|
+
init_response();
|
|
619
|
+
init_utils();
|
|
620
|
+
Server = class extends import_node_events5.EventEmitter {
|
|
412
621
|
constructor(requestListener) {
|
|
413
622
|
super();
|
|
414
623
|
this._bunWebSocketServers = /* @__PURE__ */ new Set();
|
|
@@ -421,9 +630,28 @@ var init_http = __esm({
|
|
|
421
630
|
unregisterWebSocketServer(wsServer) {
|
|
422
631
|
this._bunWebSocketServers.delete(wsServer);
|
|
423
632
|
}
|
|
633
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
634
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
635
|
+
return explicitFd;
|
|
636
|
+
}
|
|
637
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
638
|
+
if (!fdValue) {
|
|
639
|
+
return void 0;
|
|
640
|
+
}
|
|
641
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
642
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
643
|
+
return void 0;
|
|
644
|
+
}
|
|
645
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
646
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
647
|
+
return void 0;
|
|
648
|
+
}
|
|
649
|
+
return parsedFd;
|
|
650
|
+
}
|
|
424
651
|
listen(...args) {
|
|
425
652
|
let port = 3e3;
|
|
426
653
|
let hostname = "0.0.0.0";
|
|
654
|
+
let fd;
|
|
427
655
|
let callback;
|
|
428
656
|
const firstArg = args[0];
|
|
429
657
|
if (typeof firstArg === "number") {
|
|
@@ -438,8 +666,10 @@ var init_http = __esm({
|
|
|
438
666
|
} else if (firstArg && typeof firstArg === "object") {
|
|
439
667
|
port = firstArg.port || 3e3;
|
|
440
668
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
669
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
441
670
|
callback = args[1];
|
|
442
671
|
}
|
|
672
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
443
673
|
const self = this;
|
|
444
674
|
if (isNode) {
|
|
445
675
|
this.nativeServer = http.createServer((req, res) => {
|
|
@@ -454,11 +684,19 @@ var init_http = __esm({
|
|
|
454
684
|
this.nativeServer.on("upgrade", (req, socket, head) => {
|
|
455
685
|
self.emit("upgrade", req, socket, head);
|
|
456
686
|
});
|
|
457
|
-
|
|
458
|
-
this.
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
687
|
+
if (fd !== void 0) {
|
|
688
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
689
|
+
this._listening = true;
|
|
690
|
+
this.emit("listening");
|
|
691
|
+
if (callback) callback();
|
|
692
|
+
});
|
|
693
|
+
} else {
|
|
694
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
695
|
+
this._listening = true;
|
|
696
|
+
this.emit("listening");
|
|
697
|
+
if (callback) callback();
|
|
698
|
+
});
|
|
699
|
+
}
|
|
462
700
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
463
701
|
this.nativeServer.on("close", () => {
|
|
464
702
|
this._listening = false;
|
|
@@ -483,6 +721,8 @@ var init_http = __esm({
|
|
|
483
721
|
const urlObj = new URL(req.url);
|
|
484
722
|
const pathname = urlObj.pathname;
|
|
485
723
|
const requestUrl = urlObj.pathname + urlObj.search;
|
|
724
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
725
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
486
726
|
const upgradeHeader = req.headers.get("upgrade");
|
|
487
727
|
if (upgradeHeader && upgradeHeader.toLowerCase() === "websocket") {
|
|
488
728
|
const matchingWebSocketServer = Array.from(this._bunWebSocketServers).find((wsServer) => {
|
|
@@ -519,9 +759,9 @@ var init_http = __esm({
|
|
|
519
759
|
const incomingMessage = {
|
|
520
760
|
method: req.method,
|
|
521
761
|
url: requestUrl,
|
|
522
|
-
headers:
|
|
762
|
+
headers: incomingHeaders,
|
|
523
763
|
httpVersion: "1.1",
|
|
524
|
-
rawHeaders
|
|
764
|
+
rawHeaders,
|
|
525
765
|
_req: req,
|
|
526
766
|
text: () => req.text(),
|
|
527
767
|
json: () => req.json()
|
|
@@ -575,57 +815,148 @@ var init_http = __esm({
|
|
|
575
815
|
this.writeHead(statusCode);
|
|
576
816
|
}
|
|
577
817
|
responseReady = true;
|
|
578
|
-
return this;
|
|
579
818
|
}
|
|
580
819
|
};
|
|
581
820
|
if (self.requestListener) {
|
|
582
821
|
self.requestListener(incomingMessage, serverResponse);
|
|
822
|
+
} else {
|
|
823
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
583
824
|
}
|
|
584
|
-
if (responseReady) {
|
|
585
|
-
|
|
586
|
-
status: statusCode,
|
|
587
|
-
statusText: statusMessage,
|
|
588
|
-
headers
|
|
589
|
-
});
|
|
825
|
+
if (!responseReady) {
|
|
826
|
+
serverResponse.end();
|
|
590
827
|
}
|
|
591
|
-
return new
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
}
|
|
596
|
-
resolve(new Response(body, {
|
|
597
|
-
status: statusCode,
|
|
598
|
-
statusText: statusMessage,
|
|
599
|
-
headers
|
|
600
|
-
}));
|
|
601
|
-
};
|
|
828
|
+
return new Response(body, {
|
|
829
|
+
status: statusCode,
|
|
830
|
+
statusText: statusMessage,
|
|
831
|
+
headers
|
|
602
832
|
});
|
|
603
833
|
},
|
|
604
|
-
error:
|
|
834
|
+
error: (err) => {
|
|
835
|
+
this.emit("error", err);
|
|
836
|
+
return createErrorResponse();
|
|
837
|
+
}
|
|
605
838
|
});
|
|
839
|
+
this._listening = true;
|
|
606
840
|
emitListeningWithCallback(this, callback);
|
|
841
|
+
this.nativeServer.stop = this.nativeServer.stop || this.nativeServer.close;
|
|
842
|
+
this.nativeServer.close = this.nativeServer.close || this.nativeServer.stop;
|
|
843
|
+
this.nativeServer.on?.("close", () => {
|
|
844
|
+
this._listening = false;
|
|
845
|
+
this.emit("close");
|
|
846
|
+
});
|
|
607
847
|
} else if (isDeno) {
|
|
848
|
+
const server = this;
|
|
608
849
|
this.nativeServer = Deno.serve({
|
|
609
850
|
port,
|
|
610
|
-
hostname
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
851
|
+
hostname
|
|
852
|
+
}, async (req) => {
|
|
853
|
+
const urlObj = new URL(req.url);
|
|
854
|
+
const requestUrl = urlObj.pathname + urlObj.search;
|
|
855
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
856
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
857
|
+
const bodyChunks = [];
|
|
858
|
+
const responseHeaders = new Headers();
|
|
859
|
+
let statusCode = 200;
|
|
860
|
+
let statusText = "OK";
|
|
861
|
+
let responseClosed = false;
|
|
862
|
+
const incomingMessage = {
|
|
863
|
+
method: req.method,
|
|
864
|
+
url: requestUrl,
|
|
865
|
+
headers: incomingHeaders,
|
|
866
|
+
httpVersion: "1.1",
|
|
867
|
+
rawHeaders,
|
|
868
|
+
_req: req,
|
|
869
|
+
text: () => req.text(),
|
|
870
|
+
json: () => req.json()
|
|
871
|
+
};
|
|
872
|
+
const serverResponse = {
|
|
873
|
+
statusCode: 200,
|
|
874
|
+
statusMessage: "OK",
|
|
875
|
+
headersSent: false,
|
|
876
|
+
setHeader(name, value) {
|
|
877
|
+
responseHeaders.set(name, Array.isArray(value) ? value.join(", ") : String(value));
|
|
878
|
+
return this;
|
|
879
|
+
},
|
|
880
|
+
getHeader(name) {
|
|
881
|
+
return responseHeaders.get(name) ?? void 0;
|
|
882
|
+
},
|
|
883
|
+
getHeaders() {
|
|
884
|
+
const headers = {};
|
|
885
|
+
responseHeaders.forEach((value, key) => {
|
|
886
|
+
headers[key] = value;
|
|
887
|
+
});
|
|
888
|
+
return headers;
|
|
889
|
+
},
|
|
890
|
+
writeHead(status, arg2, arg3) {
|
|
891
|
+
statusCode = status;
|
|
892
|
+
this.statusCode = status;
|
|
893
|
+
this.headersSent = true;
|
|
894
|
+
if (typeof arg2 === "string") {
|
|
895
|
+
statusText = arg2;
|
|
896
|
+
this.statusMessage = arg2;
|
|
897
|
+
if (arg3) {
|
|
898
|
+
Object.entries(arg3).forEach(([key, value]) => {
|
|
899
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
} else if (arg2) {
|
|
903
|
+
Object.entries(arg2).forEach(([key, value]) => {
|
|
904
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
905
|
+
});
|
|
620
906
|
}
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
907
|
+
return this;
|
|
908
|
+
},
|
|
909
|
+
write(chunk) {
|
|
910
|
+
if (!this.headersSent) {
|
|
911
|
+
this.writeHead(statusCode);
|
|
912
|
+
}
|
|
913
|
+
if (typeof chunk === "string") {
|
|
914
|
+
bodyChunks.push(new TextEncoder().encode(chunk));
|
|
915
|
+
} else if (chunk instanceof Uint8Array) {
|
|
916
|
+
bodyChunks.push(chunk);
|
|
917
|
+
} else if (chunk !== void 0 && chunk !== null) {
|
|
918
|
+
bodyChunks.push(new TextEncoder().encode(String(chunk)));
|
|
919
|
+
}
|
|
920
|
+
return true;
|
|
921
|
+
},
|
|
922
|
+
end(chunk) {
|
|
923
|
+
if (chunk !== void 0) {
|
|
924
|
+
this.write(chunk);
|
|
925
|
+
}
|
|
926
|
+
if (!this.headersSent) {
|
|
927
|
+
this.writeHead(statusCode);
|
|
928
|
+
}
|
|
929
|
+
responseClosed = true;
|
|
930
|
+
}
|
|
931
|
+
};
|
|
932
|
+
if (server.requestListener) {
|
|
933
|
+
server.requestListener(incomingMessage, serverResponse);
|
|
934
|
+
} else {
|
|
935
|
+
server.emit("request", incomingMessage, serverResponse);
|
|
626
936
|
}
|
|
937
|
+
if (!responseClosed) {
|
|
938
|
+
serverResponse.end();
|
|
939
|
+
}
|
|
940
|
+
const body = bodyChunks.length === 0 ? void 0 : (() => {
|
|
941
|
+
const totalLength = bodyChunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
942
|
+
const output = new ArrayBuffer(totalLength);
|
|
943
|
+
const combined = new Uint8Array(output);
|
|
944
|
+
let offset = 0;
|
|
945
|
+
for (const chunk of bodyChunks) {
|
|
946
|
+
combined.set(chunk, offset);
|
|
947
|
+
offset += chunk.length;
|
|
948
|
+
}
|
|
949
|
+
return output;
|
|
950
|
+
})();
|
|
951
|
+
return new Response(body, {
|
|
952
|
+
status: statusCode,
|
|
953
|
+
statusText,
|
|
954
|
+
headers: responseHeaders
|
|
955
|
+
});
|
|
627
956
|
});
|
|
957
|
+
this._listening = true;
|
|
628
958
|
emitListeningWithCallback(this, callback);
|
|
959
|
+
this.nativeServer.finished.then(() => closeAndEmit(this)).catch((err) => this.emit("error", err));
|
|
629
960
|
}
|
|
630
961
|
return this;
|
|
631
962
|
}
|
|
@@ -654,9 +985,11 @@ var init_http = __esm({
|
|
|
654
985
|
return createAddress(0, addr, "unix");
|
|
655
986
|
}
|
|
656
987
|
return addr;
|
|
657
|
-
}
|
|
988
|
+
}
|
|
989
|
+
if (isBun) {
|
|
658
990
|
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
659
|
-
}
|
|
991
|
+
}
|
|
992
|
+
if (isDeno) {
|
|
660
993
|
const addr = this.nativeServer.addr;
|
|
661
994
|
return createAddress(addr.port, addr.hostname);
|
|
662
995
|
}
|
|
@@ -666,42 +999,65 @@ var init_http = __esm({
|
|
|
666
999
|
return this._listening;
|
|
667
1000
|
}
|
|
668
1001
|
};
|
|
669
|
-
ClientRequest = class extends import_node_events.EventEmitter {
|
|
670
|
-
constructor(_url, _options = {}) {
|
|
671
|
-
super();
|
|
672
|
-
}
|
|
673
|
-
write(_chunk) {
|
|
674
|
-
return true;
|
|
675
|
-
}
|
|
676
|
-
end(callback) {
|
|
677
|
-
queueCallback(callback);
|
|
678
|
-
}
|
|
679
|
-
};
|
|
680
|
-
Agent = class {
|
|
681
|
-
constructor(options) {
|
|
682
|
-
this.options = options;
|
|
683
|
-
}
|
|
684
|
-
};
|
|
685
|
-
http_default = {
|
|
686
|
-
createServer,
|
|
687
|
-
request,
|
|
688
|
-
get,
|
|
689
|
-
Server,
|
|
690
|
-
IncomingMessage,
|
|
691
|
-
ServerResponse,
|
|
692
|
-
Agent,
|
|
693
|
-
ClientRequest,
|
|
694
|
-
METHODS,
|
|
695
|
-
STATUS_CODES,
|
|
696
|
-
getRuntime
|
|
697
|
-
};
|
|
698
1002
|
}
|
|
699
1003
|
});
|
|
700
1004
|
|
|
701
|
-
// src/
|
|
702
|
-
var
|
|
703
|
-
__export(
|
|
704
|
-
|
|
1005
|
+
// src/server/http/index.ts
|
|
1006
|
+
var http_exports = {};
|
|
1007
|
+
__export(http_exports, {
|
|
1008
|
+
Agent: () => Agent,
|
|
1009
|
+
ClientRequest: () => ClientRequest,
|
|
1010
|
+
IncomingMessage: () => IncomingMessage,
|
|
1011
|
+
METHODS: () => METHODS,
|
|
1012
|
+
STATUS_CODES: () => STATUS_CODES,
|
|
1013
|
+
Server: () => Server,
|
|
1014
|
+
ServerResponse: () => ServerResponse,
|
|
1015
|
+
createServer: () => createServer,
|
|
1016
|
+
default: () => http_default,
|
|
1017
|
+
get: () => get,
|
|
1018
|
+
getRuntime: () => getRuntime3,
|
|
1019
|
+
request: () => request
|
|
1020
|
+
});
|
|
1021
|
+
var http_default;
|
|
1022
|
+
var init_http = __esm({
|
|
1023
|
+
"src/server/http/index.ts"() {
|
|
1024
|
+
"use strict";
|
|
1025
|
+
init_agent();
|
|
1026
|
+
init_client_request();
|
|
1027
|
+
init_constants();
|
|
1028
|
+
init_incoming_message();
|
|
1029
|
+
init_request_api();
|
|
1030
|
+
init_response();
|
|
1031
|
+
init_runtime2();
|
|
1032
|
+
init_server_runtime();
|
|
1033
|
+
init_agent();
|
|
1034
|
+
init_client_request();
|
|
1035
|
+
init_constants();
|
|
1036
|
+
init_incoming_message();
|
|
1037
|
+
init_request_api();
|
|
1038
|
+
init_response();
|
|
1039
|
+
init_runtime2();
|
|
1040
|
+
init_server_runtime();
|
|
1041
|
+
http_default = {
|
|
1042
|
+
createServer,
|
|
1043
|
+
request,
|
|
1044
|
+
get,
|
|
1045
|
+
Server,
|
|
1046
|
+
IncomingMessage,
|
|
1047
|
+
ServerResponse,
|
|
1048
|
+
Agent,
|
|
1049
|
+
ClientRequest,
|
|
1050
|
+
METHODS,
|
|
1051
|
+
STATUS_CODES,
|
|
1052
|
+
getRuntime: getRuntime3
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
});
|
|
1056
|
+
|
|
1057
|
+
// src/server/wss/index.ts
|
|
1058
|
+
var wss_exports = {};
|
|
1059
|
+
__export(wss_exports, {
|
|
1060
|
+
CLOSE_CODES: () => CLOSE_CODES,
|
|
705
1061
|
ReadyState: () => ReadyState,
|
|
706
1062
|
WSSClient: () => WSSClient,
|
|
707
1063
|
WSSServer: () => WSSServer,
|
|
@@ -711,196 +1067,8 @@ __export(wss_exports, {
|
|
|
711
1067
|
getRuntime: () => getRuntime2
|
|
712
1068
|
});
|
|
713
1069
|
module.exports = __toCommonJS(wss_exports);
|
|
714
|
-
var import_events3 = require("events");
|
|
715
1070
|
|
|
716
|
-
// src/
|
|
717
|
-
var import_events = require("events");
|
|
718
|
-
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
|
-
|
|
901
|
-
// src/ws.ts
|
|
902
|
-
var import_events2 = require("events");
|
|
903
|
-
init_runtime();
|
|
1071
|
+
// src/server/ws/constants.ts
|
|
904
1072
|
var ReadyState = /* @__PURE__ */ ((ReadyState2) => {
|
|
905
1073
|
ReadyState2[ReadyState2["CONNECTING"] = 0] = "CONNECTING";
|
|
906
1074
|
ReadyState2[ReadyState2["OPEN"] = 1] = "OPEN";
|
|
@@ -925,7 +1093,14 @@ var CLOSE_CODES = {
|
|
|
925
1093
|
BAD_GATEWAY: 1014,
|
|
926
1094
|
TLS_HANDSHAKE_FAIL: 1015
|
|
927
1095
|
};
|
|
928
|
-
|
|
1096
|
+
|
|
1097
|
+
// src/server/ws/server.ts
|
|
1098
|
+
var import_events2 = require("events");
|
|
1099
|
+
init_runtime();
|
|
1100
|
+
|
|
1101
|
+
// src/server/ws/utils.ts
|
|
1102
|
+
init_runtime();
|
|
1103
|
+
function queueCallback(callback, error) {
|
|
929
1104
|
if (callback) {
|
|
930
1105
|
queueMicrotask(() => callback(error));
|
|
931
1106
|
}
|
|
@@ -940,7 +1115,74 @@ function getRequestPath(url) {
|
|
|
940
1115
|
const [pathname = "/"] = (url || "/").split("?");
|
|
941
1116
|
return pathname || "/";
|
|
942
1117
|
}
|
|
943
|
-
|
|
1118
|
+
function isIgnorableConnectionError(error) {
|
|
1119
|
+
const errorCode = error?.code;
|
|
1120
|
+
return errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE";
|
|
1121
|
+
}
|
|
1122
|
+
function coerceBunMessage(message) {
|
|
1123
|
+
const isBinary = typeof message !== "string";
|
|
1124
|
+
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));
|
|
1125
|
+
return { payload, isBinary };
|
|
1126
|
+
}
|
|
1127
|
+
function parseFrame(data) {
|
|
1128
|
+
if (data.length < 2) {
|
|
1129
|
+
return null;
|
|
1130
|
+
}
|
|
1131
|
+
const firstByte = data[0];
|
|
1132
|
+
const secondByte = data[1];
|
|
1133
|
+
const opcode = firstByte & 15;
|
|
1134
|
+
const isMasked = (secondByte & 128) === 128;
|
|
1135
|
+
let payloadLength = secondByte & 127;
|
|
1136
|
+
let offset = 2;
|
|
1137
|
+
if (payloadLength === 126) {
|
|
1138
|
+
payloadLength = data.readUInt16BE(2);
|
|
1139
|
+
offset = 4;
|
|
1140
|
+
} else if (payloadLength === 127) {
|
|
1141
|
+
payloadLength = Number(data.readBigUInt64BE(2));
|
|
1142
|
+
offset = 10;
|
|
1143
|
+
}
|
|
1144
|
+
let payload = data.subarray(offset);
|
|
1145
|
+
if (isMasked) {
|
|
1146
|
+
const maskKey = data.subarray(offset, offset + 4);
|
|
1147
|
+
payload = data.subarray(offset + 4, offset + 4 + payloadLength);
|
|
1148
|
+
for (let index = 0; index < payload.length; index += 1) {
|
|
1149
|
+
payload[index] ^= maskKey[index % 4];
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
if (opcode === 1) {
|
|
1153
|
+
return payload.toString("utf8");
|
|
1154
|
+
}
|
|
1155
|
+
return null;
|
|
1156
|
+
}
|
|
1157
|
+
function createFrame(data) {
|
|
1158
|
+
const payload = typeof data === "string" ? Buffer.from(data) : data;
|
|
1159
|
+
const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;
|
|
1160
|
+
let frame;
|
|
1161
|
+
let offset = 2;
|
|
1162
|
+
if (payloadLength < 126) {
|
|
1163
|
+
frame = Buffer.allocUnsafe(2 + payloadLength);
|
|
1164
|
+
frame[1] = payloadLength;
|
|
1165
|
+
} else if (payloadLength < 65536) {
|
|
1166
|
+
frame = Buffer.allocUnsafe(4 + payloadLength);
|
|
1167
|
+
frame[1] = 126;
|
|
1168
|
+
frame.writeUInt16BE(payloadLength, 2);
|
|
1169
|
+
offset = 4;
|
|
1170
|
+
} else {
|
|
1171
|
+
frame = Buffer.allocUnsafe(10 + payloadLength);
|
|
1172
|
+
frame[1] = 127;
|
|
1173
|
+
frame.writeBigUInt64BE(BigInt(payloadLength), 2);
|
|
1174
|
+
offset = 10;
|
|
1175
|
+
}
|
|
1176
|
+
frame[0] = 129;
|
|
1177
|
+
if (Buffer.isBuffer(payload)) {
|
|
1178
|
+
payload.copy(frame, offset);
|
|
1179
|
+
}
|
|
1180
|
+
return frame;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
// src/server/ws/websocket.ts
|
|
1184
|
+
var import_events = require("events");
|
|
1185
|
+
var WebSocket = class extends import_events.EventEmitter {
|
|
944
1186
|
constructor(address, protocols, _options) {
|
|
945
1187
|
super();
|
|
946
1188
|
this.readyState = 0 /* CONNECTING */;
|
|
@@ -970,22 +1212,23 @@ var WebSocket = class extends import_events2.EventEmitter {
|
|
|
970
1212
|
};
|
|
971
1213
|
}
|
|
972
1214
|
/**
|
|
973
|
-
* Send data through WebSocket
|
|
1215
|
+
* Send data through WebSocket.
|
|
974
1216
|
*/
|
|
975
1217
|
send(data, options, callback) {
|
|
976
1218
|
const cb = typeof options === "function" ? options : callback;
|
|
977
1219
|
if (this.readyState !== 1 /* OPEN */) {
|
|
978
|
-
|
|
1220
|
+
queueCallback(cb, new Error("WebSocket is not open"));
|
|
1221
|
+
return;
|
|
979
1222
|
}
|
|
980
1223
|
try {
|
|
981
1224
|
this._socket.send(data);
|
|
982
|
-
|
|
1225
|
+
queueCallback(cb);
|
|
983
1226
|
} catch (error) {
|
|
984
|
-
|
|
1227
|
+
queueCallback(cb, error);
|
|
985
1228
|
}
|
|
986
1229
|
}
|
|
987
1230
|
/**
|
|
988
|
-
* Close the WebSocket connection
|
|
1231
|
+
* Close the WebSocket connection.
|
|
989
1232
|
*/
|
|
990
1233
|
close(code, reason) {
|
|
991
1234
|
if (this.readyState === 3 /* CLOSED */ || this.readyState === 2 /* CLOSING */) {
|
|
@@ -995,41 +1238,43 @@ var WebSocket = class extends import_events2.EventEmitter {
|
|
|
995
1238
|
this._socket.close(code, typeof reason === "string" ? reason : reason?.toString());
|
|
996
1239
|
}
|
|
997
1240
|
/**
|
|
998
|
-
* Pause the socket (no-op for native WebSocket)
|
|
1241
|
+
* Pause the socket (no-op for native WebSocket).
|
|
999
1242
|
*/
|
|
1000
1243
|
pause() {
|
|
1001
1244
|
}
|
|
1002
1245
|
/**
|
|
1003
|
-
* Resume the socket (no-op for native WebSocket)
|
|
1246
|
+
* Resume the socket (no-op for native WebSocket).
|
|
1004
1247
|
*/
|
|
1005
1248
|
resume() {
|
|
1006
1249
|
}
|
|
1007
1250
|
/**
|
|
1008
|
-
* Send a ping frame (no-op for native WebSocket)
|
|
1251
|
+
* Send a ping frame (no-op for native WebSocket).
|
|
1009
1252
|
*/
|
|
1010
1253
|
ping(_data, _mask, callback) {
|
|
1011
|
-
|
|
1254
|
+
queueCallback(callback);
|
|
1012
1255
|
}
|
|
1013
1256
|
/**
|
|
1014
|
-
* Send a pong frame (no-op for native WebSocket)
|
|
1257
|
+
* Send a pong frame (no-op for native WebSocket).
|
|
1015
1258
|
*/
|
|
1016
1259
|
pong(_data, _mask, callback) {
|
|
1017
|
-
|
|
1260
|
+
queueCallback(callback);
|
|
1018
1261
|
}
|
|
1019
1262
|
/**
|
|
1020
|
-
* Terminate the connection
|
|
1263
|
+
* Terminate the connection.
|
|
1021
1264
|
*/
|
|
1022
1265
|
terminate() {
|
|
1023
1266
|
this._socket.close();
|
|
1024
1267
|
this.readyState = 3 /* CLOSED */;
|
|
1025
1268
|
}
|
|
1026
1269
|
/**
|
|
1027
|
-
* Get buffered amount
|
|
1270
|
+
* Get buffered amount.
|
|
1028
1271
|
*/
|
|
1029
1272
|
get bufferedAmount() {
|
|
1030
1273
|
return this._socket.bufferedAmount || 0;
|
|
1031
1274
|
}
|
|
1032
1275
|
};
|
|
1276
|
+
|
|
1277
|
+
// src/server/ws/server.ts
|
|
1033
1278
|
var WebSocketServer = class extends import_events2.EventEmitter {
|
|
1034
1279
|
constructor(options, callback) {
|
|
1035
1280
|
super();
|
|
@@ -1041,8 +1286,7 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1041
1286
|
if (options?.server) {
|
|
1042
1287
|
this._httpServer = options.server;
|
|
1043
1288
|
this._setupUpgradeHandler();
|
|
1044
|
-
} else if (options?.noServer) {
|
|
1045
|
-
} else {
|
|
1289
|
+
} else if (!options?.noServer) {
|
|
1046
1290
|
const http2 = require("http");
|
|
1047
1291
|
this._httpServer = http2.createServer();
|
|
1048
1292
|
this._ownsHttpServer = true;
|
|
@@ -1056,30 +1300,30 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1056
1300
|
this._httpServer = options.server;
|
|
1057
1301
|
options.server.registerWebSocketServer(this);
|
|
1058
1302
|
}
|
|
1059
|
-
|
|
1303
|
+
queueCallback(callback);
|
|
1060
1304
|
} else {
|
|
1061
|
-
|
|
1305
|
+
queueCallback(callback);
|
|
1062
1306
|
}
|
|
1063
1307
|
}
|
|
1064
1308
|
_setupUpgradeHandler() {
|
|
1065
|
-
this._httpServer.on("upgrade", (
|
|
1066
|
-
const requestPath = getRequestPath(
|
|
1309
|
+
this._httpServer.on("upgrade", (request3, socket, head) => {
|
|
1310
|
+
const requestPath = getRequestPath(request3.url);
|
|
1067
1311
|
console.log("[WebSocket] Upgrade request:", requestPath, "Expected:", this.path || "(any)");
|
|
1068
1312
|
if (this.path && requestPath !== this.path) {
|
|
1069
1313
|
console.log("[WebSocket] Path mismatch, ignoring");
|
|
1070
1314
|
return;
|
|
1071
1315
|
}
|
|
1072
|
-
this.handleUpgrade(
|
|
1316
|
+
this.handleUpgrade(request3, socket, head, (client) => {
|
|
1073
1317
|
console.log("[WebSocket] Client connected");
|
|
1074
|
-
this.emit("connection", client,
|
|
1318
|
+
this.emit("connection", client, request3);
|
|
1075
1319
|
});
|
|
1076
1320
|
});
|
|
1077
1321
|
}
|
|
1078
1322
|
/**
|
|
1079
|
-
* Handle HTTP upgrade for WebSocket
|
|
1323
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1080
1324
|
*/
|
|
1081
|
-
handleUpgrade(
|
|
1082
|
-
const key =
|
|
1325
|
+
handleUpgrade(request3, socket, _head, callback) {
|
|
1326
|
+
const key = request3.headers["sec-websocket-key"];
|
|
1083
1327
|
if (!key) {
|
|
1084
1328
|
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
|
|
1085
1329
|
return;
|
|
@@ -1115,7 +1359,7 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1115
1359
|
client._socket = socket;
|
|
1116
1360
|
socket.on("data", (data) => {
|
|
1117
1361
|
try {
|
|
1118
|
-
const message =
|
|
1362
|
+
const message = parseFrame(data);
|
|
1119
1363
|
if (message) {
|
|
1120
1364
|
client.emit("message", message, false);
|
|
1121
1365
|
}
|
|
@@ -1128,36 +1372,34 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1128
1372
|
client.emit("close", CLOSE_CODES.NORMAL, "");
|
|
1129
1373
|
});
|
|
1130
1374
|
socket.on("error", (error) => {
|
|
1131
|
-
|
|
1132
|
-
if (errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE") {
|
|
1375
|
+
if (isIgnorableConnectionError(error)) {
|
|
1133
1376
|
return;
|
|
1134
1377
|
}
|
|
1135
1378
|
client.emit("error", error);
|
|
1136
1379
|
});
|
|
1137
1380
|
client.send = (data, _options, callback) => {
|
|
1138
1381
|
if (!socket.writable || client.readyState !== 1 /* OPEN */) {
|
|
1139
|
-
const
|
|
1140
|
-
|
|
1141
|
-
|
|
1382
|
+
const error = new Error("WebSocket is not open");
|
|
1383
|
+
error.code = "WS_NOT_OPEN";
|
|
1384
|
+
queueCallback(callback, error);
|
|
1142
1385
|
return;
|
|
1143
1386
|
}
|
|
1144
1387
|
try {
|
|
1145
|
-
const frame =
|
|
1146
|
-
socket.write(frame, (
|
|
1147
|
-
if (
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
} else {
|
|
1156
|
-
queueCallback3(callback);
|
|
1388
|
+
const frame = createFrame(data);
|
|
1389
|
+
socket.write(frame, (error) => {
|
|
1390
|
+
if (!error) {
|
|
1391
|
+
queueCallback(callback);
|
|
1392
|
+
return;
|
|
1393
|
+
}
|
|
1394
|
+
if (isIgnorableConnectionError(error)) {
|
|
1395
|
+
client.readyState = 3 /* CLOSED */;
|
|
1396
|
+
queueCallback(callback);
|
|
1397
|
+
return;
|
|
1157
1398
|
}
|
|
1399
|
+
queueCallback(callback, error);
|
|
1158
1400
|
});
|
|
1159
1401
|
} catch (error) {
|
|
1160
|
-
|
|
1402
|
+
queueCallback(callback, error);
|
|
1161
1403
|
}
|
|
1162
1404
|
};
|
|
1163
1405
|
client.close = (_code, _reason) => {
|
|
@@ -1177,14 +1419,14 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1177
1419
|
client._socket = socket;
|
|
1178
1420
|
client.send = (data, _options, callback) => {
|
|
1179
1421
|
if (client.readyState !== 1 /* OPEN */) {
|
|
1180
|
-
|
|
1422
|
+
queueCallback(callback, new Error("WebSocket is not open"));
|
|
1181
1423
|
return;
|
|
1182
1424
|
}
|
|
1183
1425
|
try {
|
|
1184
1426
|
socket.send(data);
|
|
1185
|
-
|
|
1427
|
+
queueCallback(callback);
|
|
1186
1428
|
} catch (error) {
|
|
1187
|
-
|
|
1429
|
+
queueCallback(callback, error);
|
|
1188
1430
|
}
|
|
1189
1431
|
};
|
|
1190
1432
|
client.close = (code, reason) => {
|
|
@@ -1192,7 +1434,7 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1192
1434
|
return;
|
|
1193
1435
|
}
|
|
1194
1436
|
client.readyState = 2 /* CLOSING */;
|
|
1195
|
-
socket.close(code ?? CLOSE_CODES.NORMAL, reason);
|
|
1437
|
+
socket.close(code ?? CLOSE_CODES.NORMAL, typeof reason === "string" ? reason : reason?.toString());
|
|
1196
1438
|
};
|
|
1197
1439
|
client.terminate = () => {
|
|
1198
1440
|
socket.close();
|
|
@@ -1200,7 +1442,7 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1200
1442
|
};
|
|
1201
1443
|
return client;
|
|
1202
1444
|
}
|
|
1203
|
-
_handleBunOpen(socket,
|
|
1445
|
+
_handleBunOpen(socket, request3 = {}) {
|
|
1204
1446
|
const client = this._createClientFromBunSocket(socket);
|
|
1205
1447
|
if (socket.data) {
|
|
1206
1448
|
socket.data.client = client;
|
|
@@ -1212,9 +1454,9 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1212
1454
|
});
|
|
1213
1455
|
}
|
|
1214
1456
|
const incomingRequest = {
|
|
1215
|
-
url:
|
|
1216
|
-
headers:
|
|
1217
|
-
socket:
|
|
1457
|
+
url: request3.url || this.path,
|
|
1458
|
+
headers: request3.headers || {},
|
|
1459
|
+
socket: request3.socket || { remoteAddress: void 0 }
|
|
1218
1460
|
};
|
|
1219
1461
|
this.emit("connection", client, incomingRequest);
|
|
1220
1462
|
}
|
|
@@ -1223,8 +1465,7 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1223
1465
|
if (!client) {
|
|
1224
1466
|
return;
|
|
1225
1467
|
}
|
|
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));
|
|
1468
|
+
const { payload, isBinary } = coerceBunMessage(message);
|
|
1228
1469
|
client.emit("message", payload, isBinary);
|
|
1229
1470
|
}
|
|
1230
1471
|
_handleBunClose(socket, code, reason) {
|
|
@@ -1236,98 +1477,290 @@ var WebSocketServer = class extends import_events2.EventEmitter {
|
|
|
1236
1477
|
client.emit("close", code, typeof reason === "string" ? reason : reason?.toString() || "");
|
|
1237
1478
|
this.clients.delete(client);
|
|
1238
1479
|
}
|
|
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
1480
|
/**
|
|
1293
|
-
* Close the server
|
|
1481
|
+
* Close the server.
|
|
1294
1482
|
*/
|
|
1295
1483
|
close(callback) {
|
|
1296
1484
|
this.clients.forEach((client) => client.close());
|
|
1297
1485
|
this.clients.clear();
|
|
1298
1486
|
if (this._httpServer && this._ownsHttpServer) {
|
|
1299
1487
|
this._httpServer.close(callback);
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
this.emit("close");
|
|
1305
|
-
queueCallback3(callback);
|
|
1488
|
+
return;
|
|
1489
|
+
}
|
|
1490
|
+
if (runtime === "bun" && this._httpServer?.unregisterWebSocketServer) {
|
|
1491
|
+
this._httpServer.unregisterWebSocketServer(this);
|
|
1306
1492
|
}
|
|
1493
|
+
this.emit("close");
|
|
1494
|
+
queueCallback(callback);
|
|
1307
1495
|
}
|
|
1308
1496
|
/**
|
|
1309
|
-
* Check if server should handle request
|
|
1497
|
+
* Check if server should handle request.
|
|
1310
1498
|
*/
|
|
1311
|
-
shouldHandle(
|
|
1312
|
-
if (this.path && getRequestPath(
|
|
1499
|
+
shouldHandle(request3) {
|
|
1500
|
+
if (this.path && getRequestPath(request3.url) !== this.path) {
|
|
1313
1501
|
return false;
|
|
1314
1502
|
}
|
|
1315
1503
|
return true;
|
|
1316
1504
|
}
|
|
1317
1505
|
/**
|
|
1318
|
-
* Get server address
|
|
1506
|
+
* Get server address.
|
|
1319
1507
|
*/
|
|
1320
1508
|
address() {
|
|
1321
|
-
if (this._httpServer
|
|
1509
|
+
if (this._httpServer?.address) {
|
|
1322
1510
|
return this._httpServer.address();
|
|
1323
1511
|
}
|
|
1324
1512
|
return null;
|
|
1325
1513
|
}
|
|
1326
1514
|
};
|
|
1327
1515
|
|
|
1328
|
-
// src/
|
|
1516
|
+
// src/server/ws/runtime.ts
|
|
1517
|
+
init_runtime();
|
|
1518
|
+
|
|
1519
|
+
// src/server/wss/client.ts
|
|
1520
|
+
var WSSClient = class extends WebSocket {
|
|
1521
|
+
constructor(address, protocols, options) {
|
|
1522
|
+
const urlString = typeof address === "string" ? address : address.toString();
|
|
1523
|
+
const secureUrl = urlString.replace(/^ws:\/\//i, "wss://");
|
|
1524
|
+
super(secureUrl, protocols, options);
|
|
1525
|
+
}
|
|
1526
|
+
};
|
|
1527
|
+
function createWSSClient(address, protocols, options) {
|
|
1528
|
+
return new WSSClient(address, protocols, options);
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
// src/server/wss/runtime.ts
|
|
1532
|
+
init_runtime();
|
|
1533
|
+
function getRuntime2() {
|
|
1534
|
+
return runtime;
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
// src/server/wss/server.ts
|
|
1538
|
+
var import_events3 = require("events");
|
|
1539
|
+
|
|
1540
|
+
// src/server/https/client-request.ts
|
|
1541
|
+
var import_node_events = require("events");
|
|
1542
|
+
init_utils();
|
|
1543
|
+
|
|
1544
|
+
// src/server/https/request-api.ts
|
|
1545
|
+
init_runtime();
|
|
1546
|
+
|
|
1547
|
+
// src/server/https/http-classes.ts
|
|
1548
|
+
function loadHttpClasses() {
|
|
1549
|
+
const httpModule = (init_http(), __toCommonJS(http_exports));
|
|
1550
|
+
return {
|
|
1551
|
+
IncomingMessage: httpModule.IncomingMessage,
|
|
1552
|
+
ServerResponse: httpModule.ServerResponse
|
|
1553
|
+
};
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
// src/server/https/node-modules.ts
|
|
1557
|
+
init_runtime();
|
|
1558
|
+
var https2;
|
|
1559
|
+
if (isNode && typeof process !== "undefined") {
|
|
1560
|
+
try {
|
|
1561
|
+
https2 = require("https");
|
|
1562
|
+
} catch {
|
|
1563
|
+
https2 = require("https");
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
// src/server/https/runtime.ts
|
|
1568
|
+
init_runtime();
|
|
1569
|
+
|
|
1570
|
+
// src/server/https/server-runtime.ts
|
|
1571
|
+
var import_node_events6 = require("events");
|
|
1572
|
+
init_runtime();
|
|
1573
|
+
init_utils();
|
|
1574
|
+
var Server2 = class extends import_node_events6.EventEmitter {
|
|
1575
|
+
constructor(options = {}, requestListener) {
|
|
1576
|
+
super();
|
|
1577
|
+
this._listening = false;
|
|
1578
|
+
this.options = options;
|
|
1579
|
+
this.requestListener = requestListener;
|
|
1580
|
+
}
|
|
1581
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
1582
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
1583
|
+
return explicitFd;
|
|
1584
|
+
}
|
|
1585
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
1586
|
+
if (!fdValue) {
|
|
1587
|
+
return void 0;
|
|
1588
|
+
}
|
|
1589
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
1590
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
1591
|
+
return void 0;
|
|
1592
|
+
}
|
|
1593
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
1594
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
1595
|
+
return void 0;
|
|
1596
|
+
}
|
|
1597
|
+
return parsedFd;
|
|
1598
|
+
}
|
|
1599
|
+
listen(...args) {
|
|
1600
|
+
let port = 3e3;
|
|
1601
|
+
let hostname = "0.0.0.0";
|
|
1602
|
+
let fd;
|
|
1603
|
+
let callback;
|
|
1604
|
+
const firstArg = args[0];
|
|
1605
|
+
if (typeof firstArg === "number") {
|
|
1606
|
+
port = firstArg;
|
|
1607
|
+
const secondArg = args[1];
|
|
1608
|
+
if (typeof secondArg === "string") {
|
|
1609
|
+
hostname = secondArg;
|
|
1610
|
+
callback = args[2] || args[3];
|
|
1611
|
+
} else if (typeof secondArg === "function") {
|
|
1612
|
+
callback = secondArg;
|
|
1613
|
+
}
|
|
1614
|
+
} else if (firstArg && typeof firstArg === "object") {
|
|
1615
|
+
port = firstArg.port || 3e3;
|
|
1616
|
+
hostname = firstArg.hostname || "0.0.0.0";
|
|
1617
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
1618
|
+
callback = args[1];
|
|
1619
|
+
}
|
|
1620
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
1621
|
+
const self = this;
|
|
1622
|
+
if (isNode) {
|
|
1623
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1624
|
+
this.nativeServer = https2.createServer(this.options, (req, res) => {
|
|
1625
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1626
|
+
const serverResponse = new ServerResponse2(incomingMessage, res);
|
|
1627
|
+
if (self.requestListener) {
|
|
1628
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1629
|
+
} else {
|
|
1630
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1631
|
+
}
|
|
1632
|
+
});
|
|
1633
|
+
if (fd !== void 0) {
|
|
1634
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
1635
|
+
this._listening = true;
|
|
1636
|
+
this.emit("listening");
|
|
1637
|
+
if (callback) callback();
|
|
1638
|
+
});
|
|
1639
|
+
} else {
|
|
1640
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
1641
|
+
this._listening = true;
|
|
1642
|
+
this.emit("listening");
|
|
1643
|
+
if (callback) callback();
|
|
1644
|
+
});
|
|
1645
|
+
}
|
|
1646
|
+
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1647
|
+
this.nativeServer.on("close", () => {
|
|
1648
|
+
this._listening = false;
|
|
1649
|
+
this.emit("close");
|
|
1650
|
+
});
|
|
1651
|
+
} else if (isBun) {
|
|
1652
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1653
|
+
const tlsOptions = {
|
|
1654
|
+
port,
|
|
1655
|
+
hostname,
|
|
1656
|
+
fetch: (req) => {
|
|
1657
|
+
return new Promise((resolve) => {
|
|
1658
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1659
|
+
const serverResponse = new ServerResponse2();
|
|
1660
|
+
serverResponse._setResolver(resolve);
|
|
1661
|
+
if (self.requestListener) {
|
|
1662
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1663
|
+
} else {
|
|
1664
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1665
|
+
}
|
|
1666
|
+
});
|
|
1667
|
+
},
|
|
1668
|
+
error: (error) => {
|
|
1669
|
+
this.emit("error", error);
|
|
1670
|
+
return createErrorResponse();
|
|
1671
|
+
}
|
|
1672
|
+
};
|
|
1673
|
+
if (this.options.key || this.options.cert) {
|
|
1674
|
+
tlsOptions.tls = {
|
|
1675
|
+
key: this.options.key,
|
|
1676
|
+
cert: this.options.cert,
|
|
1677
|
+
ca: this.options.ca,
|
|
1678
|
+
passphrase: this.options.passphrase
|
|
1679
|
+
};
|
|
1680
|
+
} else if (this.options.tls) {
|
|
1681
|
+
tlsOptions.tls = this.options.tls;
|
|
1682
|
+
}
|
|
1683
|
+
this.nativeServer = Bun.serve(tlsOptions);
|
|
1684
|
+
emitListeningWithCallback(this, callback);
|
|
1685
|
+
} else if (isDeno) {
|
|
1686
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1687
|
+
const serveOptions = {
|
|
1688
|
+
port,
|
|
1689
|
+
hostname,
|
|
1690
|
+
handler: (req) => {
|
|
1691
|
+
return new Promise((resolve) => {
|
|
1692
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1693
|
+
const serverResponse = new ServerResponse2();
|
|
1694
|
+
serverResponse._setResolver(resolve);
|
|
1695
|
+
if (self.requestListener) {
|
|
1696
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1697
|
+
} else {
|
|
1698
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1699
|
+
}
|
|
1700
|
+
});
|
|
1701
|
+
},
|
|
1702
|
+
onError: (error) => {
|
|
1703
|
+
this.emit("error", error);
|
|
1704
|
+
return createErrorResponse();
|
|
1705
|
+
}
|
|
1706
|
+
};
|
|
1707
|
+
if (this.options.key && this.options.cert) {
|
|
1708
|
+
serveOptions.cert = this.options.cert;
|
|
1709
|
+
serveOptions.key = this.options.key;
|
|
1710
|
+
}
|
|
1711
|
+
this.nativeServer = Deno.serve(serveOptions);
|
|
1712
|
+
emitListeningWithCallback(this, callback);
|
|
1713
|
+
}
|
|
1714
|
+
return this;
|
|
1715
|
+
}
|
|
1716
|
+
close(callback) {
|
|
1717
|
+
if (!this.nativeServer) {
|
|
1718
|
+
if (callback) queueCallback2(() => callback());
|
|
1719
|
+
return this;
|
|
1720
|
+
}
|
|
1721
|
+
if (isNode) {
|
|
1722
|
+
this.nativeServer.close(callback);
|
|
1723
|
+
} else if (isBun) {
|
|
1724
|
+
this.nativeServer.stop();
|
|
1725
|
+
closeAndEmit(this, callback);
|
|
1726
|
+
} else if (isDeno) {
|
|
1727
|
+
this.nativeServer.shutdown();
|
|
1728
|
+
closeAndEmit(this, callback);
|
|
1729
|
+
}
|
|
1730
|
+
return this;
|
|
1731
|
+
}
|
|
1732
|
+
address() {
|
|
1733
|
+
if (!this.nativeServer) return null;
|
|
1734
|
+
if (isNode) {
|
|
1735
|
+
const addr = this.nativeServer.address();
|
|
1736
|
+
if (!addr) return null;
|
|
1737
|
+
if (typeof addr === "string") {
|
|
1738
|
+
return createAddress(0, addr, "unix");
|
|
1739
|
+
}
|
|
1740
|
+
return addr;
|
|
1741
|
+
}
|
|
1742
|
+
if (isBun) {
|
|
1743
|
+
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
1744
|
+
}
|
|
1745
|
+
if (isDeno) {
|
|
1746
|
+
const addr = this.nativeServer.addr;
|
|
1747
|
+
return createAddress(addr.port, addr.hostname);
|
|
1748
|
+
}
|
|
1749
|
+
return null;
|
|
1750
|
+
}
|
|
1751
|
+
get listening() {
|
|
1752
|
+
return this._listening;
|
|
1753
|
+
}
|
|
1754
|
+
};
|
|
1755
|
+
function createServer2(options = {}, requestListener) {
|
|
1756
|
+
return new Server2(options, requestListener);
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1759
|
+
// src/server/wss/server.ts
|
|
1329
1760
|
init_runtime();
|
|
1330
|
-
|
|
1761
|
+
|
|
1762
|
+
// src/server/wss/utils.ts
|
|
1763
|
+
function queueCallback3(callback) {
|
|
1331
1764
|
if (callback) {
|
|
1332
1765
|
queueMicrotask(callback);
|
|
1333
1766
|
}
|
|
@@ -1344,15 +1777,10 @@ function buildHttpsOptions(options) {
|
|
|
1344
1777
|
}
|
|
1345
1778
|
function emitCloseWithCallback(emitter, callback) {
|
|
1346
1779
|
emitter.emit("close");
|
|
1347
|
-
|
|
1780
|
+
queueCallback3(callback);
|
|
1348
1781
|
}
|
|
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
|
-
};
|
|
1782
|
+
|
|
1783
|
+
// src/server/wss/server.ts
|
|
1356
1784
|
var WSSServer = class extends import_events3.EventEmitter {
|
|
1357
1785
|
constructor(options, callback) {
|
|
1358
1786
|
super();
|
|
@@ -1365,7 +1793,7 @@ var WSSServer = class extends import_events3.EventEmitter {
|
|
|
1365
1793
|
this._setupServer(callback);
|
|
1366
1794
|
} else if (options?.noServer) {
|
|
1367
1795
|
this._wsServer = new WebSocketServer({ noServer: true });
|
|
1368
|
-
|
|
1796
|
+
queueCallback3(callback);
|
|
1369
1797
|
} else {
|
|
1370
1798
|
this._httpsServer = createServer2(buildHttpsOptions(options));
|
|
1371
1799
|
this._setupServer(callback);
|
|
@@ -1375,7 +1803,7 @@ var WSSServer = class extends import_events3.EventEmitter {
|
|
|
1375
1803
|
}
|
|
1376
1804
|
} else {
|
|
1377
1805
|
this._wsServer = new WebSocketServer(options);
|
|
1378
|
-
|
|
1806
|
+
queueCallback3(callback);
|
|
1379
1807
|
}
|
|
1380
1808
|
}
|
|
1381
1809
|
_setupServer(callback) {
|
|
@@ -1384,44 +1812,44 @@ var WSSServer = class extends import_events3.EventEmitter {
|
|
|
1384
1812
|
server: this._httpsServer,
|
|
1385
1813
|
noServer: false
|
|
1386
1814
|
});
|
|
1387
|
-
this._wsServer.on("connection", (client,
|
|
1815
|
+
this._wsServer.on("connection", (client, request3) => {
|
|
1388
1816
|
if (this.options.clientTracking !== false) {
|
|
1389
1817
|
this.clients.add(client);
|
|
1390
1818
|
client.on("close", () => {
|
|
1391
1819
|
this.clients.delete(client);
|
|
1392
1820
|
});
|
|
1393
1821
|
}
|
|
1394
|
-
this.emit("connection", client,
|
|
1822
|
+
this.emit("connection", client, request3);
|
|
1395
1823
|
});
|
|
1396
1824
|
this._wsServer.on("error", (error) => {
|
|
1397
1825
|
this.emit("error", error);
|
|
1398
1826
|
});
|
|
1399
1827
|
if (!this.options?.port) {
|
|
1400
|
-
|
|
1828
|
+
queueCallback3(callback);
|
|
1401
1829
|
}
|
|
1402
1830
|
}
|
|
1403
1831
|
/**
|
|
1404
|
-
* Handle HTTP upgrade for WebSocket
|
|
1832
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1405
1833
|
*/
|
|
1406
|
-
handleUpgrade(
|
|
1834
|
+
handleUpgrade(request3, socket, head, callback) {
|
|
1407
1835
|
if (this._wsServer) {
|
|
1408
|
-
this._wsServer.handleUpgrade(
|
|
1836
|
+
this._wsServer.handleUpgrade(request3, socket, head, callback);
|
|
1409
1837
|
}
|
|
1410
1838
|
}
|
|
1411
1839
|
/**
|
|
1412
|
-
* Check if server should handle request
|
|
1840
|
+
* Check if server should handle request.
|
|
1413
1841
|
*/
|
|
1414
|
-
shouldHandle(
|
|
1842
|
+
shouldHandle(request3) {
|
|
1415
1843
|
if (this._wsServer) {
|
|
1416
|
-
return this._wsServer.shouldHandle(
|
|
1844
|
+
return this._wsServer.shouldHandle(request3);
|
|
1417
1845
|
}
|
|
1418
|
-
if (this.path &&
|
|
1846
|
+
if (this.path && request3.url !== this.path) {
|
|
1419
1847
|
return false;
|
|
1420
1848
|
}
|
|
1421
1849
|
return true;
|
|
1422
1850
|
}
|
|
1423
1851
|
/**
|
|
1424
|
-
* Close the server
|
|
1852
|
+
* Close the server.
|
|
1425
1853
|
*/
|
|
1426
1854
|
close(callback) {
|
|
1427
1855
|
this.clients.forEach((client) => client.close());
|
|
@@ -1434,17 +1862,19 @@ var WSSServer = class extends import_events3.EventEmitter {
|
|
|
1434
1862
|
emitCloseWithCallback(this, callback);
|
|
1435
1863
|
}
|
|
1436
1864
|
});
|
|
1437
|
-
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
if (this._httpsServer) {
|
|
1438
1868
|
this._httpsServer.close(callback);
|
|
1439
|
-
|
|
1440
|
-
emitCloseWithCallback(this, callback);
|
|
1869
|
+
return;
|
|
1441
1870
|
}
|
|
1871
|
+
emitCloseWithCallback(this, callback);
|
|
1442
1872
|
}
|
|
1443
1873
|
/**
|
|
1444
|
-
* Get server address
|
|
1874
|
+
* Get server address.
|
|
1445
1875
|
*/
|
|
1446
1876
|
address() {
|
|
1447
|
-
if (this._httpsServer
|
|
1877
|
+
if (this._httpsServer?.address) {
|
|
1448
1878
|
return this._httpsServer.address();
|
|
1449
1879
|
}
|
|
1450
1880
|
if (this._wsServer) {
|
|
@@ -1453,15 +1883,11 @@ var WSSServer = class extends import_events3.EventEmitter {
|
|
|
1453
1883
|
return null;
|
|
1454
1884
|
}
|
|
1455
1885
|
};
|
|
1456
|
-
function createWSSClient(address, protocols, options) {
|
|
1457
|
-
return new WSSClient(address, protocols, options);
|
|
1458
|
-
}
|
|
1459
1886
|
function createWSSServer(options, callback) {
|
|
1460
1887
|
return new WSSServer(options, callback);
|
|
1461
1888
|
}
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
}
|
|
1889
|
+
|
|
1890
|
+
// src/server/wss/index.ts
|
|
1465
1891
|
var wss_default = {
|
|
1466
1892
|
WSSClient,
|
|
1467
1893
|
WSSServer,
|