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.js
CHANGED
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
};
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
29
|
|
|
30
|
-
// src/runtime.ts
|
|
30
|
+
// src/shares/runtime.ts
|
|
31
31
|
var runtime, isNode, isBun, isDeno;
|
|
32
32
|
var init_runtime = __esm({
|
|
33
|
-
"src/runtime.ts"() {
|
|
33
|
+
"src/shares/runtime.ts"() {
|
|
34
34
|
"use strict";
|
|
35
35
|
runtime = (() => {
|
|
36
36
|
if (typeof Deno !== "undefined") return "deno";
|
|
@@ -43,25 +43,78 @@
|
|
|
43
43
|
}
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
-
// src/http.ts
|
|
47
|
-
|
|
48
|
-
__export(http_exports, {
|
|
49
|
-
Agent: () => Agent,
|
|
50
|
-
ClientRequest: () => ClientRequest,
|
|
51
|
-
IncomingMessage: () => IncomingMessage,
|
|
52
|
-
METHODS: () => METHODS,
|
|
53
|
-
STATUS_CODES: () => STATUS_CODES,
|
|
54
|
-
Server: () => Server,
|
|
55
|
-
ServerResponse: () => ServerResponse,
|
|
56
|
-
createServer: () => createServer,
|
|
57
|
-
default: () => http_default,
|
|
58
|
-
get: () => get,
|
|
59
|
-
getRuntime: () => getRuntime,
|
|
60
|
-
request: () => request
|
|
61
|
-
});
|
|
62
|
-
function queueCallback(callback) {
|
|
46
|
+
// src/server/http/utils.ts
|
|
47
|
+
function queueCallback2(callback) {
|
|
63
48
|
if (callback) queueMicrotask(callback);
|
|
64
49
|
}
|
|
50
|
+
function getRequestPath2(url) {
|
|
51
|
+
if (!url) return "";
|
|
52
|
+
try {
|
|
53
|
+
const urlObj = new URL(url);
|
|
54
|
+
return urlObj.pathname + urlObj.search;
|
|
55
|
+
} catch {
|
|
56
|
+
return url;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function headersToRecord(headers) {
|
|
60
|
+
const result = /* @__PURE__ */ Object.create(null);
|
|
61
|
+
headers.forEach((value, key) => {
|
|
62
|
+
result[key] = value;
|
|
63
|
+
});
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
function headersToRawHeaders(headers) {
|
|
67
|
+
const rawHeaders = [];
|
|
68
|
+
headers.forEach((value, key) => {
|
|
69
|
+
rawHeaders.push(key, value);
|
|
70
|
+
});
|
|
71
|
+
return rawHeaders;
|
|
72
|
+
}
|
|
73
|
+
function normalizeRequestBodyChunk(chunk, encoding = "utf8") {
|
|
74
|
+
if (typeof chunk === "string") {
|
|
75
|
+
if (encoding !== "utf8" && typeof Buffer !== "undefined") {
|
|
76
|
+
return Buffer.from(chunk, encoding);
|
|
77
|
+
}
|
|
78
|
+
return chunk;
|
|
79
|
+
}
|
|
80
|
+
if (chunk instanceof Uint8Array) {
|
|
81
|
+
return chunk;
|
|
82
|
+
}
|
|
83
|
+
if (chunk instanceof ArrayBuffer) {
|
|
84
|
+
return new Uint8Array(chunk);
|
|
85
|
+
}
|
|
86
|
+
if (ArrayBuffer.isView(chunk)) {
|
|
87
|
+
return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);
|
|
88
|
+
}
|
|
89
|
+
return new TextEncoder().encode(String(chunk));
|
|
90
|
+
}
|
|
91
|
+
function buildRequestBody(chunks) {
|
|
92
|
+
if (chunks.length === 0) {
|
|
93
|
+
return void 0;
|
|
94
|
+
}
|
|
95
|
+
if (chunks.length === 1) {
|
|
96
|
+
return chunks[0];
|
|
97
|
+
}
|
|
98
|
+
if (chunks.every((chunk) => typeof chunk === "string")) {
|
|
99
|
+
return chunks.join("");
|
|
100
|
+
}
|
|
101
|
+
const encoder = new TextEncoder();
|
|
102
|
+
const bodyParts = chunks.map((chunk) => typeof chunk === "string" ? encoder.encode(chunk) : chunk);
|
|
103
|
+
const totalLength = bodyParts.reduce((sum, part) => sum + part.byteLength, 0);
|
|
104
|
+
const body = new Uint8Array(totalLength);
|
|
105
|
+
let offset = 0;
|
|
106
|
+
for (const part of bodyParts) {
|
|
107
|
+
body.set(part, offset);
|
|
108
|
+
offset += part.byteLength;
|
|
109
|
+
}
|
|
110
|
+
return body;
|
|
111
|
+
}
|
|
112
|
+
function isFetchResponse(value) {
|
|
113
|
+
return typeof value?.status === "number" && typeof value?.statusText === "string" && typeof value?.headers?.forEach === "function";
|
|
114
|
+
}
|
|
115
|
+
function isNodeIncomingMessage(value) {
|
|
116
|
+
return typeof value?.on === "function" && typeof value?.headers === "object" && (typeof value?.httpVersion === "string" || value?.socket !== void 0);
|
|
117
|
+
}
|
|
65
118
|
function headersToInit(headers) {
|
|
66
119
|
const result = {};
|
|
67
120
|
for (const key in headers) {
|
|
@@ -79,76 +132,110 @@
|
|
|
79
132
|
function emitListeningWithCallback(server, callback) {
|
|
80
133
|
server._listening = true;
|
|
81
134
|
server.emit("listening");
|
|
82
|
-
|
|
135
|
+
queueCallback2(callback);
|
|
83
136
|
}
|
|
84
137
|
function closeAndEmit(server, callback) {
|
|
85
138
|
server._listening = false;
|
|
86
139
|
server.emit("close");
|
|
87
140
|
if (callback) queueMicrotask(() => callback());
|
|
88
141
|
}
|
|
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);
|
|
142
|
+
var init_utils = __esm({
|
|
143
|
+
"src/server/http/utils.ts"() {
|
|
144
|
+
"use strict";
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// src/server/http/agent.ts
|
|
149
|
+
var Agent;
|
|
150
|
+
var init_agent = __esm({
|
|
151
|
+
"src/server/http/agent.ts"() {
|
|
152
|
+
"use strict";
|
|
153
|
+
Agent = class {
|
|
154
|
+
constructor(options) {
|
|
155
|
+
this.options = options;
|
|
126
156
|
}
|
|
127
|
-
}
|
|
157
|
+
};
|
|
128
158
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return runtime;
|
|
136
|
-
}
|
|
137
|
-
var import_node_events, http, https, METHODS, STATUS_CODES, IncomingMessage, ServerResponse, Server, ClientRequest, Agent, http_default;
|
|
138
|
-
var init_http = __esm({
|
|
139
|
-
"src/http.ts"() {
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// src/server/http/client-request.ts
|
|
162
|
+
var import_node_events2, 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
|
-
|
|
148
|
-
http = __require("http");
|
|
149
|
-
https = __require("https");
|
|
166
|
+
import_node_events2 = __require("events");
|
|
167
|
+
init_utils();
|
|
168
|
+
ClientRequest = class extends import_node_events2.EventEmitter {
|
|
169
|
+
constructor(_url, _options = {}) {
|
|
170
|
+
super();
|
|
171
|
+
this._bodyChunks = [];
|
|
172
|
+
this._ended = false;
|
|
150
173
|
}
|
|
151
|
-
|
|
174
|
+
_setNativeRequest(nativeRequest) {
|
|
175
|
+
this._nativeRequest = nativeRequest;
|
|
176
|
+
}
|
|
177
|
+
_setExecutor(executor) {
|
|
178
|
+
this._executor = executor;
|
|
179
|
+
}
|
|
180
|
+
write(chunk, encoding, callback) {
|
|
181
|
+
if (this._ended) {
|
|
182
|
+
throw new Error("Cannot write after end");
|
|
183
|
+
}
|
|
184
|
+
if (typeof encoding === "function") {
|
|
185
|
+
callback = encoding;
|
|
186
|
+
encoding = void 0;
|
|
187
|
+
}
|
|
188
|
+
if (this._nativeRequest) {
|
|
189
|
+
const actualEncoding2 = typeof encoding === "string" ? encoding : void 0;
|
|
190
|
+
return this._nativeRequest.write(chunk, actualEncoding2, callback);
|
|
191
|
+
}
|
|
192
|
+
const actualEncoding = typeof encoding === "string" ? encoding : "utf8";
|
|
193
|
+
this._bodyChunks.push(normalizeRequestBodyChunk(chunk, actualEncoding));
|
|
194
|
+
queueCallback2(callback);
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
end(chunk, encoding, callback) {
|
|
198
|
+
if (typeof chunk === "function") {
|
|
199
|
+
callback = chunk;
|
|
200
|
+
chunk = void 0;
|
|
201
|
+
encoding = void 0;
|
|
202
|
+
} else if (typeof encoding === "function") {
|
|
203
|
+
callback = encoding;
|
|
204
|
+
encoding = void 0;
|
|
205
|
+
}
|
|
206
|
+
if (this._ended) {
|
|
207
|
+
queueCallback2(callback);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
this._ended = true;
|
|
211
|
+
if (this._nativeRequest) {
|
|
212
|
+
const actualEncoding = typeof encoding === "string" ? encoding : void 0;
|
|
213
|
+
if (chunk !== void 0) {
|
|
214
|
+
this._nativeRequest.end(chunk, actualEncoding, callback);
|
|
215
|
+
} else {
|
|
216
|
+
this._nativeRequest.end(callback);
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (chunk !== void 0) {
|
|
221
|
+
this._bodyChunks.push(normalizeRequestBodyChunk(chunk, typeof encoding === "string" ? encoding : "utf8"));
|
|
222
|
+
}
|
|
223
|
+
const executor = this._executor;
|
|
224
|
+
const body = buildRequestBody(this._bodyChunks);
|
|
225
|
+
if (executor) {
|
|
226
|
+
Promise.resolve().then(() => executor(body)).catch((error) => this.emit("error", error));
|
|
227
|
+
}
|
|
228
|
+
queueCallback2(callback);
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
// src/server/http/constants.ts
|
|
235
|
+
var METHODS, STATUS_CODES;
|
|
236
|
+
var init_constants = __esm({
|
|
237
|
+
"src/server/http/constants.ts"() {
|
|
238
|
+
"use strict";
|
|
152
239
|
METHODS = [
|
|
153
240
|
"GET",
|
|
154
241
|
"POST",
|
|
@@ -216,13 +303,30 @@
|
|
|
216
303
|
510: "Not Extended",
|
|
217
304
|
511: "Network Authentication Required"
|
|
218
305
|
};
|
|
219
|
-
|
|
220
|
-
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
// src/server/http/incoming-message.ts
|
|
310
|
+
var import_node_events3, IncomingMessage;
|
|
311
|
+
var init_incoming_message = __esm({
|
|
312
|
+
"src/server/http/incoming-message.ts"() {
|
|
313
|
+
"use strict";
|
|
314
|
+
import_node_events3 = __require("events");
|
|
315
|
+
init_utils();
|
|
316
|
+
IncomingMessage = class extends import_node_events3.EventEmitter {
|
|
317
|
+
constructor(req, requestMethod) {
|
|
221
318
|
super();
|
|
222
319
|
this.httpVersion = "1.1";
|
|
223
320
|
this.rawHeaders = [];
|
|
224
321
|
this._req = req;
|
|
225
|
-
if (
|
|
322
|
+
if (isFetchResponse(req)) {
|
|
323
|
+
this.method = requestMethod || "GET";
|
|
324
|
+
this.url = getRequestPath2(req.url);
|
|
325
|
+
this.headers = headersToRecord(req.headers);
|
|
326
|
+
this.statusCode = req.status;
|
|
327
|
+
this.statusMessage = req.statusText;
|
|
328
|
+
this.rawHeaders = headersToRawHeaders(req.headers);
|
|
329
|
+
} else if (isNodeIncomingMessage(req)) {
|
|
226
330
|
this.method = req.method;
|
|
227
331
|
this.url = req.url;
|
|
228
332
|
this.headers = req.headers;
|
|
@@ -233,14 +337,13 @@
|
|
|
233
337
|
this.socket = req.socket;
|
|
234
338
|
} else {
|
|
235
339
|
this.method = req.method;
|
|
236
|
-
|
|
237
|
-
this.
|
|
238
|
-
this.
|
|
239
|
-
this.rawHeaders = [];
|
|
340
|
+
this.url = getRequestPath2(req.url);
|
|
341
|
+
this.headers = headersToRecord(req.headers);
|
|
342
|
+
this.rawHeaders = headersToRawHeaders(req.headers);
|
|
240
343
|
}
|
|
241
344
|
}
|
|
242
345
|
async text() {
|
|
243
|
-
if (
|
|
346
|
+
if (isNodeIncomingMessage(this._req)) {
|
|
244
347
|
return new Promise((resolve, reject) => {
|
|
245
348
|
const chunks = [];
|
|
246
349
|
this._req.on("data", (chunk) => chunks.push(chunk));
|
|
@@ -251,14 +354,92 @@
|
|
|
251
354
|
return this._req.text();
|
|
252
355
|
}
|
|
253
356
|
async json() {
|
|
254
|
-
if (
|
|
357
|
+
if (isNodeIncomingMessage(this._req)) {
|
|
255
358
|
const text = await this.text();
|
|
256
359
|
return JSON.parse(text);
|
|
257
360
|
}
|
|
258
361
|
return this._req.json();
|
|
259
362
|
}
|
|
260
363
|
};
|
|
261
|
-
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// src/server/http/node-modules.ts
|
|
368
|
+
var http, https;
|
|
369
|
+
var init_node_modules = __esm({
|
|
370
|
+
"src/server/http/node-modules.ts"() {
|
|
371
|
+
"use strict";
|
|
372
|
+
init_runtime();
|
|
373
|
+
if (isNode && typeof process !== "undefined") {
|
|
374
|
+
try {
|
|
375
|
+
http = __require("http");
|
|
376
|
+
https = __require("https");
|
|
377
|
+
} catch {
|
|
378
|
+
http = __require("http");
|
|
379
|
+
https = __require("https");
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
// src/server/http/request-api.ts
|
|
386
|
+
function request(url, options, callback) {
|
|
387
|
+
const urlString = typeof url === "string" ? url : url.toString();
|
|
388
|
+
const req = new ClientRequest(urlString, options);
|
|
389
|
+
if (isNode) {
|
|
390
|
+
const urlObj = new URL(urlString);
|
|
391
|
+
const client = urlObj.protocol === "https:" ? https : http;
|
|
392
|
+
const nodeReq = client.request(urlString, {
|
|
393
|
+
method: options?.method || "GET",
|
|
394
|
+
headers: options?.headers,
|
|
395
|
+
timeout: options?.timeout,
|
|
396
|
+
signal: options?.signal
|
|
397
|
+
}, (res) => {
|
|
398
|
+
const incomingMessage = new IncomingMessage(res);
|
|
399
|
+
if (callback) callback(incomingMessage);
|
|
400
|
+
req.emit("response", incomingMessage);
|
|
401
|
+
});
|
|
402
|
+
req._setNativeRequest(nodeReq);
|
|
403
|
+
nodeReq.on("error", (error) => req.emit("error", error));
|
|
404
|
+
} else {
|
|
405
|
+
req._setExecutor(async (body) => {
|
|
406
|
+
const response = await fetch(urlString, {
|
|
407
|
+
method: options?.method || "GET",
|
|
408
|
+
headers: options?.headers,
|
|
409
|
+
body,
|
|
410
|
+
signal: options?.signal
|
|
411
|
+
});
|
|
412
|
+
const incomingMessage = new IncomingMessage(response, options?.method || "GET");
|
|
413
|
+
if (callback) callback(incomingMessage);
|
|
414
|
+
req.emit("response", incomingMessage);
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
return req;
|
|
418
|
+
}
|
|
419
|
+
function get(url, options, callback) {
|
|
420
|
+
const req = request(url, { ...options, method: "GET" }, callback);
|
|
421
|
+
req.end();
|
|
422
|
+
return req;
|
|
423
|
+
}
|
|
424
|
+
var init_request_api = __esm({
|
|
425
|
+
"src/server/http/request-api.ts"() {
|
|
426
|
+
"use strict";
|
|
427
|
+
init_runtime();
|
|
428
|
+
init_client_request();
|
|
429
|
+
init_incoming_message();
|
|
430
|
+
init_node_modules();
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
// src/server/http/response.ts
|
|
435
|
+
var import_node_events4, ServerResponse;
|
|
436
|
+
var init_response = __esm({
|
|
437
|
+
"src/server/http/response.ts"() {
|
|
438
|
+
"use strict";
|
|
439
|
+
import_node_events4 = __require("events");
|
|
440
|
+
init_runtime();
|
|
441
|
+
init_utils();
|
|
442
|
+
ServerResponse = class extends import_node_events4.EventEmitter {
|
|
262
443
|
constructor(_req, nodeRes) {
|
|
263
444
|
super();
|
|
264
445
|
this.statusCode = 200;
|
|
@@ -351,7 +532,7 @@
|
|
|
351
532
|
return this._nodeRes.write(chunk, encoding, callback);
|
|
352
533
|
}
|
|
353
534
|
this._body += chunk;
|
|
354
|
-
|
|
535
|
+
queueCallback2(callback);
|
|
355
536
|
return true;
|
|
356
537
|
}
|
|
357
538
|
end(chunk, encoding, callback) {
|
|
@@ -384,14 +565,13 @@
|
|
|
384
565
|
if (this._resolve) {
|
|
385
566
|
this._resolve(response);
|
|
386
567
|
}
|
|
387
|
-
|
|
568
|
+
queueCallback2(callback);
|
|
388
569
|
}
|
|
389
570
|
return this;
|
|
390
571
|
}
|
|
391
572
|
_setResolver(resolve) {
|
|
392
573
|
this._resolve = resolve;
|
|
393
574
|
}
|
|
394
|
-
// Express.js-like methods
|
|
395
575
|
json(data, statusCode = 200) {
|
|
396
576
|
if (!this.headersSent) {
|
|
397
577
|
this.setHeader("Content-Type", "application/json");
|
|
@@ -415,7 +595,36 @@
|
|
|
415
595
|
return this;
|
|
416
596
|
}
|
|
417
597
|
};
|
|
418
|
-
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
// src/server/http/runtime.ts
|
|
602
|
+
function getRuntime3() {
|
|
603
|
+
return runtime;
|
|
604
|
+
}
|
|
605
|
+
var init_runtime2 = __esm({
|
|
606
|
+
"src/server/http/runtime.ts"() {
|
|
607
|
+
"use strict";
|
|
608
|
+
init_runtime();
|
|
609
|
+
}
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
// src/server/http/server-runtime.ts
|
|
613
|
+
function createServer(arg1, arg2) {
|
|
614
|
+
const requestListener = typeof arg1 === "function" ? arg1 : arg2;
|
|
615
|
+
return new Server(requestListener);
|
|
616
|
+
}
|
|
617
|
+
var import_node_events5, Server;
|
|
618
|
+
var init_server_runtime = __esm({
|
|
619
|
+
"src/server/http/server-runtime.ts"() {
|
|
620
|
+
"use strict";
|
|
621
|
+
import_node_events5 = __require("events");
|
|
622
|
+
init_runtime();
|
|
623
|
+
init_node_modules();
|
|
624
|
+
init_incoming_message();
|
|
625
|
+
init_response();
|
|
626
|
+
init_utils();
|
|
627
|
+
Server = class extends import_node_events5.EventEmitter {
|
|
419
628
|
constructor(requestListener) {
|
|
420
629
|
super();
|
|
421
630
|
this._bunWebSocketServers = /* @__PURE__ */ new Set();
|
|
@@ -428,9 +637,28 @@
|
|
|
428
637
|
unregisterWebSocketServer(wsServer) {
|
|
429
638
|
this._bunWebSocketServers.delete(wsServer);
|
|
430
639
|
}
|
|
640
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
641
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
642
|
+
return explicitFd;
|
|
643
|
+
}
|
|
644
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
645
|
+
if (!fdValue) {
|
|
646
|
+
return void 0;
|
|
647
|
+
}
|
|
648
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
649
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
650
|
+
return void 0;
|
|
651
|
+
}
|
|
652
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
653
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
654
|
+
return void 0;
|
|
655
|
+
}
|
|
656
|
+
return parsedFd;
|
|
657
|
+
}
|
|
431
658
|
listen(...args) {
|
|
432
659
|
let port = 3e3;
|
|
433
660
|
let hostname = "0.0.0.0";
|
|
661
|
+
let fd;
|
|
434
662
|
let callback;
|
|
435
663
|
const firstArg = args[0];
|
|
436
664
|
if (typeof firstArg === "number") {
|
|
@@ -445,8 +673,10 @@
|
|
|
445
673
|
} else if (firstArg && typeof firstArg === "object") {
|
|
446
674
|
port = firstArg.port || 3e3;
|
|
447
675
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
676
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
448
677
|
callback = args[1];
|
|
449
678
|
}
|
|
679
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
450
680
|
const self = this;
|
|
451
681
|
if (isNode) {
|
|
452
682
|
this.nativeServer = http.createServer((req, res) => {
|
|
@@ -461,11 +691,19 @@
|
|
|
461
691
|
this.nativeServer.on("upgrade", (req, socket, head) => {
|
|
462
692
|
self.emit("upgrade", req, socket, head);
|
|
463
693
|
});
|
|
464
|
-
|
|
465
|
-
this.
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
694
|
+
if (fd !== void 0) {
|
|
695
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
696
|
+
this._listening = true;
|
|
697
|
+
this.emit("listening");
|
|
698
|
+
if (callback) callback();
|
|
699
|
+
});
|
|
700
|
+
} else {
|
|
701
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
702
|
+
this._listening = true;
|
|
703
|
+
this.emit("listening");
|
|
704
|
+
if (callback) callback();
|
|
705
|
+
});
|
|
706
|
+
}
|
|
469
707
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
470
708
|
this.nativeServer.on("close", () => {
|
|
471
709
|
this._listening = false;
|
|
@@ -490,6 +728,8 @@
|
|
|
490
728
|
const urlObj = new URL(req.url);
|
|
491
729
|
const pathname = urlObj.pathname;
|
|
492
730
|
const requestUrl = urlObj.pathname + urlObj.search;
|
|
731
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
732
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
493
733
|
const upgradeHeader = req.headers.get("upgrade");
|
|
494
734
|
if (upgradeHeader && upgradeHeader.toLowerCase() === "websocket") {
|
|
495
735
|
const matchingWebSocketServer = Array.from(this._bunWebSocketServers).find((wsServer) => {
|
|
@@ -526,9 +766,9 @@
|
|
|
526
766
|
const incomingMessage = {
|
|
527
767
|
method: req.method,
|
|
528
768
|
url: requestUrl,
|
|
529
|
-
headers:
|
|
769
|
+
headers: incomingHeaders,
|
|
530
770
|
httpVersion: "1.1",
|
|
531
|
-
rawHeaders
|
|
771
|
+
rawHeaders,
|
|
532
772
|
_req: req,
|
|
533
773
|
text: () => req.text(),
|
|
534
774
|
json: () => req.json()
|
|
@@ -582,57 +822,148 @@
|
|
|
582
822
|
this.writeHead(statusCode);
|
|
583
823
|
}
|
|
584
824
|
responseReady = true;
|
|
585
|
-
return this;
|
|
586
825
|
}
|
|
587
826
|
};
|
|
588
827
|
if (self.requestListener) {
|
|
589
828
|
self.requestListener(incomingMessage, serverResponse);
|
|
829
|
+
} else {
|
|
830
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
590
831
|
}
|
|
591
|
-
if (responseReady) {
|
|
592
|
-
|
|
593
|
-
status: statusCode,
|
|
594
|
-
statusText: statusMessage,
|
|
595
|
-
headers
|
|
596
|
-
});
|
|
832
|
+
if (!responseReady) {
|
|
833
|
+
serverResponse.end();
|
|
597
834
|
}
|
|
598
|
-
return new
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
}
|
|
603
|
-
resolve(new Response(body, {
|
|
604
|
-
status: statusCode,
|
|
605
|
-
statusText: statusMessage,
|
|
606
|
-
headers
|
|
607
|
-
}));
|
|
608
|
-
};
|
|
835
|
+
return new Response(body, {
|
|
836
|
+
status: statusCode,
|
|
837
|
+
statusText: statusMessage,
|
|
838
|
+
headers
|
|
609
839
|
});
|
|
610
840
|
},
|
|
611
|
-
error:
|
|
841
|
+
error: (err) => {
|
|
842
|
+
this.emit("error", err);
|
|
843
|
+
return createErrorResponse();
|
|
844
|
+
}
|
|
612
845
|
});
|
|
846
|
+
this._listening = true;
|
|
613
847
|
emitListeningWithCallback(this, callback);
|
|
848
|
+
this.nativeServer.stop = this.nativeServer.stop || this.nativeServer.close;
|
|
849
|
+
this.nativeServer.close = this.nativeServer.close || this.nativeServer.stop;
|
|
850
|
+
this.nativeServer.on?.("close", () => {
|
|
851
|
+
this._listening = false;
|
|
852
|
+
this.emit("close");
|
|
853
|
+
});
|
|
614
854
|
} else if (isDeno) {
|
|
855
|
+
const server = this;
|
|
615
856
|
this.nativeServer = Deno.serve({
|
|
616
857
|
port,
|
|
617
|
-
hostname
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
858
|
+
hostname
|
|
859
|
+
}, async (req) => {
|
|
860
|
+
const urlObj = new URL(req.url);
|
|
861
|
+
const requestUrl = urlObj.pathname + urlObj.search;
|
|
862
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
863
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
864
|
+
const bodyChunks = [];
|
|
865
|
+
const responseHeaders = new Headers();
|
|
866
|
+
let statusCode = 200;
|
|
867
|
+
let statusText = "OK";
|
|
868
|
+
let responseClosed = false;
|
|
869
|
+
const incomingMessage = {
|
|
870
|
+
method: req.method,
|
|
871
|
+
url: requestUrl,
|
|
872
|
+
headers: incomingHeaders,
|
|
873
|
+
httpVersion: "1.1",
|
|
874
|
+
rawHeaders,
|
|
875
|
+
_req: req,
|
|
876
|
+
text: () => req.text(),
|
|
877
|
+
json: () => req.json()
|
|
878
|
+
};
|
|
879
|
+
const serverResponse = {
|
|
880
|
+
statusCode: 200,
|
|
881
|
+
statusMessage: "OK",
|
|
882
|
+
headersSent: false,
|
|
883
|
+
setHeader(name, value) {
|
|
884
|
+
responseHeaders.set(name, Array.isArray(value) ? value.join(", ") : String(value));
|
|
885
|
+
return this;
|
|
886
|
+
},
|
|
887
|
+
getHeader(name) {
|
|
888
|
+
return responseHeaders.get(name) ?? void 0;
|
|
889
|
+
},
|
|
890
|
+
getHeaders() {
|
|
891
|
+
const headers = {};
|
|
892
|
+
responseHeaders.forEach((value, key) => {
|
|
893
|
+
headers[key] = value;
|
|
894
|
+
});
|
|
895
|
+
return headers;
|
|
896
|
+
},
|
|
897
|
+
writeHead(status, arg2, arg3) {
|
|
898
|
+
statusCode = status;
|
|
899
|
+
this.statusCode = status;
|
|
900
|
+
this.headersSent = true;
|
|
901
|
+
if (typeof arg2 === "string") {
|
|
902
|
+
statusText = arg2;
|
|
903
|
+
this.statusMessage = arg2;
|
|
904
|
+
if (arg3) {
|
|
905
|
+
Object.entries(arg3).forEach(([key, value]) => {
|
|
906
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
} else if (arg2) {
|
|
910
|
+
Object.entries(arg2).forEach(([key, value]) => {
|
|
911
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
912
|
+
});
|
|
627
913
|
}
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
914
|
+
return this;
|
|
915
|
+
},
|
|
916
|
+
write(chunk) {
|
|
917
|
+
if (!this.headersSent) {
|
|
918
|
+
this.writeHead(statusCode);
|
|
919
|
+
}
|
|
920
|
+
if (typeof chunk === "string") {
|
|
921
|
+
bodyChunks.push(new TextEncoder().encode(chunk));
|
|
922
|
+
} else if (chunk instanceof Uint8Array) {
|
|
923
|
+
bodyChunks.push(chunk);
|
|
924
|
+
} else if (chunk !== void 0 && chunk !== null) {
|
|
925
|
+
bodyChunks.push(new TextEncoder().encode(String(chunk)));
|
|
926
|
+
}
|
|
927
|
+
return true;
|
|
928
|
+
},
|
|
929
|
+
end(chunk) {
|
|
930
|
+
if (chunk !== void 0) {
|
|
931
|
+
this.write(chunk);
|
|
932
|
+
}
|
|
933
|
+
if (!this.headersSent) {
|
|
934
|
+
this.writeHead(statusCode);
|
|
935
|
+
}
|
|
936
|
+
responseClosed = true;
|
|
937
|
+
}
|
|
938
|
+
};
|
|
939
|
+
if (server.requestListener) {
|
|
940
|
+
server.requestListener(incomingMessage, serverResponse);
|
|
941
|
+
} else {
|
|
942
|
+
server.emit("request", incomingMessage, serverResponse);
|
|
633
943
|
}
|
|
944
|
+
if (!responseClosed) {
|
|
945
|
+
serverResponse.end();
|
|
946
|
+
}
|
|
947
|
+
const body = bodyChunks.length === 0 ? void 0 : (() => {
|
|
948
|
+
const totalLength = bodyChunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
949
|
+
const output = new ArrayBuffer(totalLength);
|
|
950
|
+
const combined = new Uint8Array(output);
|
|
951
|
+
let offset = 0;
|
|
952
|
+
for (const chunk of bodyChunks) {
|
|
953
|
+
combined.set(chunk, offset);
|
|
954
|
+
offset += chunk.length;
|
|
955
|
+
}
|
|
956
|
+
return output;
|
|
957
|
+
})();
|
|
958
|
+
return new Response(body, {
|
|
959
|
+
status: statusCode,
|
|
960
|
+
statusText,
|
|
961
|
+
headers: responseHeaders
|
|
962
|
+
});
|
|
634
963
|
});
|
|
964
|
+
this._listening = true;
|
|
635
965
|
emitListeningWithCallback(this, callback);
|
|
966
|
+
this.nativeServer.finished.then(() => closeAndEmit(this)).catch((err) => this.emit("error", err));
|
|
636
967
|
}
|
|
637
968
|
return this;
|
|
638
969
|
}
|
|
@@ -661,9 +992,11 @@
|
|
|
661
992
|
return createAddress(0, addr, "unix");
|
|
662
993
|
}
|
|
663
994
|
return addr;
|
|
664
|
-
}
|
|
995
|
+
}
|
|
996
|
+
if (isBun) {
|
|
665
997
|
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
666
|
-
}
|
|
998
|
+
}
|
|
999
|
+
if (isDeno) {
|
|
667
1000
|
const addr = this.nativeServer.addr;
|
|
668
1001
|
return createAddress(addr.port, addr.hostname);
|
|
669
1002
|
}
|
|
@@ -673,229 +1006,62 @@
|
|
|
673
1006
|
return this._listening;
|
|
674
1007
|
}
|
|
675
1008
|
};
|
|
676
|
-
ClientRequest = class extends import_node_events.EventEmitter {
|
|
677
|
-
constructor(_url, _options = {}) {
|
|
678
|
-
super();
|
|
679
|
-
}
|
|
680
|
-
write(_chunk) {
|
|
681
|
-
return true;
|
|
682
|
-
}
|
|
683
|
-
end(callback) {
|
|
684
|
-
queueCallback(callback);
|
|
685
|
-
}
|
|
686
|
-
};
|
|
687
|
-
Agent = class {
|
|
688
|
-
constructor(options) {
|
|
689
|
-
this.options = options;
|
|
690
|
-
}
|
|
691
|
-
};
|
|
692
|
-
http_default = {
|
|
693
|
-
createServer,
|
|
694
|
-
request,
|
|
695
|
-
get,
|
|
696
|
-
Server,
|
|
697
|
-
IncomingMessage,
|
|
698
|
-
ServerResponse,
|
|
699
|
-
Agent,
|
|
700
|
-
ClientRequest,
|
|
701
|
-
METHODS,
|
|
702
|
-
STATUS_CODES,
|
|
703
|
-
getRuntime
|
|
704
|
-
};
|
|
705
1009
|
}
|
|
706
1010
|
});
|
|
707
1011
|
|
|
708
|
-
// src/
|
|
709
|
-
var
|
|
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
|
-
|
|
757
|
-
hostname = secondArg;
|
|
758
|
-
callback = args[2] || args[3];
|
|
759
|
-
} else if (typeof secondArg === "function") {
|
|
760
|
-
callback = secondArg;
|
|
761
|
-
}
|
|
762
|
-
} else if (firstArg && typeof firstArg === "object") {
|
|
763
|
-
port = firstArg.port || 3e3;
|
|
764
|
-
hostname = firstArg.hostname || "0.0.0.0";
|
|
765
|
-
callback = args[1];
|
|
766
|
-
}
|
|
767
|
-
const self = this;
|
|
768
|
-
if (isNode) {
|
|
769
|
-
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
770
|
-
if (!https2) https2 = __require("https");
|
|
771
|
-
this.nativeServer = https2.createServer(this.options, (req, res) => {
|
|
772
|
-
const incomingMessage = new IncomingMessage2(req);
|
|
773
|
-
const serverResponse = new ServerResponse2(incomingMessage, res);
|
|
774
|
-
if (self.requestListener) {
|
|
775
|
-
self.requestListener(incomingMessage, serverResponse);
|
|
776
|
-
} else {
|
|
777
|
-
self.emit("request", incomingMessage, serverResponse);
|
|
778
|
-
}
|
|
779
|
-
});
|
|
780
|
-
this.nativeServer.listen(port, hostname, () => {
|
|
781
|
-
this._listening = true;
|
|
782
|
-
this.emit("listening");
|
|
783
|
-
if (callback) callback();
|
|
784
|
-
});
|
|
785
|
-
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
786
|
-
this.nativeServer.on("close", () => {
|
|
787
|
-
this._listening = false;
|
|
788
|
-
this.emit("close");
|
|
789
|
-
});
|
|
790
|
-
} else if (isBun) {
|
|
791
|
-
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
792
|
-
const tlsOptions = {
|
|
793
|
-
port,
|
|
794
|
-
hostname,
|
|
795
|
-
fetch: (req) => {
|
|
796
|
-
return new Promise((resolve) => {
|
|
797
|
-
const incomingMessage = new IncomingMessage2(req);
|
|
798
|
-
const serverResponse = new ServerResponse2();
|
|
799
|
-
serverResponse._setResolver(resolve);
|
|
800
|
-
if (self.requestListener) {
|
|
801
|
-
self.requestListener(incomingMessage, serverResponse);
|
|
802
|
-
} else {
|
|
803
|
-
self.emit("request", incomingMessage, serverResponse);
|
|
804
|
-
}
|
|
805
|
-
});
|
|
806
|
-
},
|
|
807
|
-
error: (error) => {
|
|
808
|
-
this.emit("error", error);
|
|
809
|
-
return createErrorResponse2();
|
|
810
|
-
}
|
|
811
|
-
};
|
|
812
|
-
if (this.options.key || this.options.cert) {
|
|
813
|
-
tlsOptions.tls = {
|
|
814
|
-
key: this.options.key,
|
|
815
|
-
cert: this.options.cert,
|
|
816
|
-
ca: this.options.ca,
|
|
817
|
-
passphrase: this.options.passphrase
|
|
818
|
-
};
|
|
819
|
-
} else if (this.options.tls) {
|
|
820
|
-
tlsOptions.tls = this.options.tls;
|
|
821
|
-
}
|
|
822
|
-
this.nativeServer = Bun.serve(tlsOptions);
|
|
823
|
-
emitListeningWithCallback2(this, callback);
|
|
824
|
-
} else if (isDeno) {
|
|
825
|
-
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
826
|
-
const serveOptions = {
|
|
827
|
-
port,
|
|
828
|
-
hostname,
|
|
829
|
-
handler: (req) => {
|
|
830
|
-
return new Promise((resolve) => {
|
|
831
|
-
const incomingMessage = new IncomingMessage2(req);
|
|
832
|
-
const serverResponse = new ServerResponse2();
|
|
833
|
-
serverResponse._setResolver(resolve);
|
|
834
|
-
if (self.requestListener) {
|
|
835
|
-
self.requestListener(incomingMessage, serverResponse);
|
|
836
|
-
} else {
|
|
837
|
-
self.emit("request", incomingMessage, serverResponse);
|
|
838
|
-
}
|
|
839
|
-
});
|
|
840
|
-
},
|
|
841
|
-
onError: (error) => {
|
|
842
|
-
this.emit("error", error);
|
|
843
|
-
return createErrorResponse2();
|
|
844
|
-
}
|
|
845
|
-
};
|
|
846
|
-
if (this.options.key && this.options.cert) {
|
|
847
|
-
serveOptions.cert = this.options.cert;
|
|
848
|
-
serveOptions.key = this.options.key;
|
|
849
|
-
}
|
|
850
|
-
this.nativeServer = Deno.serve(serveOptions);
|
|
851
|
-
emitListeningWithCallback2(this, callback);
|
|
852
|
-
}
|
|
853
|
-
return this;
|
|
854
|
-
}
|
|
855
|
-
close(callback) {
|
|
856
|
-
if (!this.nativeServer) {
|
|
857
|
-
if (callback) queueMicrotask(() => callback());
|
|
858
|
-
return this;
|
|
859
|
-
}
|
|
860
|
-
if (isNode) {
|
|
861
|
-
this.nativeServer.close(callback);
|
|
862
|
-
} else if (isBun) {
|
|
863
|
-
this.nativeServer.stop();
|
|
864
|
-
closeAndEmit2(this, callback);
|
|
865
|
-
} else if (isDeno) {
|
|
866
|
-
this.nativeServer.shutdown();
|
|
867
|
-
closeAndEmit2(this, callback);
|
|
868
|
-
}
|
|
869
|
-
return this;
|
|
870
|
-
}
|
|
871
|
-
address() {
|
|
872
|
-
if (!this.nativeServer) return null;
|
|
873
|
-
if (isNode) {
|
|
874
|
-
const addr = this.nativeServer.address();
|
|
875
|
-
if (!addr) return null;
|
|
876
|
-
if (typeof addr === "string") {
|
|
877
|
-
return createAddress2(0, addr, "unix");
|
|
878
|
-
}
|
|
879
|
-
return addr;
|
|
880
|
-
} else if (isBun) {
|
|
881
|
-
return createAddress2(this.nativeServer.port, this.nativeServer.hostname);
|
|
882
|
-
} else if (isDeno) {
|
|
883
|
-
const addr = this.nativeServer.addr;
|
|
884
|
-
return createAddress2(addr.port, addr.hostname);
|
|
885
|
-
}
|
|
886
|
-
return null;
|
|
887
|
-
}
|
|
888
|
-
get listening() {
|
|
889
|
-
return this._listening;
|
|
1012
|
+
// src/server/http/index.ts
|
|
1013
|
+
var http_exports = {};
|
|
1014
|
+
__export(http_exports, {
|
|
1015
|
+
Agent: () => Agent,
|
|
1016
|
+
ClientRequest: () => ClientRequest,
|
|
1017
|
+
IncomingMessage: () => IncomingMessage,
|
|
1018
|
+
METHODS: () => METHODS,
|
|
1019
|
+
STATUS_CODES: () => STATUS_CODES,
|
|
1020
|
+
Server: () => Server,
|
|
1021
|
+
ServerResponse: () => ServerResponse,
|
|
1022
|
+
createServer: () => createServer,
|
|
1023
|
+
default: () => http_default,
|
|
1024
|
+
get: () => get,
|
|
1025
|
+
getRuntime: () => getRuntime3,
|
|
1026
|
+
request: () => request
|
|
1027
|
+
});
|
|
1028
|
+
var http_default;
|
|
1029
|
+
var init_http = __esm({
|
|
1030
|
+
"src/server/http/index.ts"() {
|
|
1031
|
+
"use strict";
|
|
1032
|
+
init_agent();
|
|
1033
|
+
init_client_request();
|
|
1034
|
+
init_constants();
|
|
1035
|
+
init_incoming_message();
|
|
1036
|
+
init_request_api();
|
|
1037
|
+
init_response();
|
|
1038
|
+
init_runtime2();
|
|
1039
|
+
init_server_runtime();
|
|
1040
|
+
init_agent();
|
|
1041
|
+
init_client_request();
|
|
1042
|
+
init_constants();
|
|
1043
|
+
init_incoming_message();
|
|
1044
|
+
init_request_api();
|
|
1045
|
+
init_response();
|
|
1046
|
+
init_runtime2();
|
|
1047
|
+
init_server_runtime();
|
|
1048
|
+
http_default = {
|
|
1049
|
+
createServer,
|
|
1050
|
+
request,
|
|
1051
|
+
get,
|
|
1052
|
+
Server,
|
|
1053
|
+
IncomingMessage,
|
|
1054
|
+
ServerResponse,
|
|
1055
|
+
Agent,
|
|
1056
|
+
ClientRequest,
|
|
1057
|
+
METHODS,
|
|
1058
|
+
STATUS_CODES,
|
|
1059
|
+
getRuntime: getRuntime3
|
|
1060
|
+
};
|
|
890
1061
|
}
|
|
891
|
-
};
|
|
892
|
-
function createServer2(options, requestListener) {
|
|
893
|
-
return new Server2(options, requestListener);
|
|
894
|
-
}
|
|
1062
|
+
});
|
|
895
1063
|
|
|
896
|
-
// src/ws.ts
|
|
897
|
-
var import_events2 = __require("events");
|
|
898
|
-
init_runtime();
|
|
1064
|
+
// src/server/ws/constants.ts
|
|
899
1065
|
var ReadyState = /* @__PURE__ */ ((ReadyState2) => {
|
|
900
1066
|
ReadyState2[ReadyState2["CONNECTING"] = 0] = "CONNECTING";
|
|
901
1067
|
ReadyState2[ReadyState2["OPEN"] = 1] = "OPEN";
|
|
@@ -920,7 +1086,14 @@
|
|
|
920
1086
|
BAD_GATEWAY: 1014,
|
|
921
1087
|
TLS_HANDSHAKE_FAIL: 1015
|
|
922
1088
|
};
|
|
923
|
-
|
|
1089
|
+
|
|
1090
|
+
// src/server/ws/server.ts
|
|
1091
|
+
var import_events2 = __require("events");
|
|
1092
|
+
init_runtime();
|
|
1093
|
+
|
|
1094
|
+
// src/server/ws/utils.ts
|
|
1095
|
+
init_runtime();
|
|
1096
|
+
function queueCallback(callback, error) {
|
|
924
1097
|
if (callback) {
|
|
925
1098
|
queueMicrotask(() => callback(error));
|
|
926
1099
|
}
|
|
@@ -935,7 +1108,74 @@
|
|
|
935
1108
|
const [pathname = "/"] = (url || "/").split("?");
|
|
936
1109
|
return pathname || "/";
|
|
937
1110
|
}
|
|
938
|
-
|
|
1111
|
+
function isIgnorableConnectionError(error) {
|
|
1112
|
+
const errorCode = error?.code;
|
|
1113
|
+
return errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE";
|
|
1114
|
+
}
|
|
1115
|
+
function coerceBunMessage(message) {
|
|
1116
|
+
const isBinary = typeof message !== "string";
|
|
1117
|
+
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));
|
|
1118
|
+
return { payload, isBinary };
|
|
1119
|
+
}
|
|
1120
|
+
function parseFrame(data) {
|
|
1121
|
+
if (data.length < 2) {
|
|
1122
|
+
return null;
|
|
1123
|
+
}
|
|
1124
|
+
const firstByte = data[0];
|
|
1125
|
+
const secondByte = data[1];
|
|
1126
|
+
const opcode = firstByte & 15;
|
|
1127
|
+
const isMasked = (secondByte & 128) === 128;
|
|
1128
|
+
let payloadLength = secondByte & 127;
|
|
1129
|
+
let offset = 2;
|
|
1130
|
+
if (payloadLength === 126) {
|
|
1131
|
+
payloadLength = data.readUInt16BE(2);
|
|
1132
|
+
offset = 4;
|
|
1133
|
+
} else if (payloadLength === 127) {
|
|
1134
|
+
payloadLength = Number(data.readBigUInt64BE(2));
|
|
1135
|
+
offset = 10;
|
|
1136
|
+
}
|
|
1137
|
+
let payload = data.subarray(offset);
|
|
1138
|
+
if (isMasked) {
|
|
1139
|
+
const maskKey = data.subarray(offset, offset + 4);
|
|
1140
|
+
payload = data.subarray(offset + 4, offset + 4 + payloadLength);
|
|
1141
|
+
for (let index = 0; index < payload.length; index += 1) {
|
|
1142
|
+
payload[index] ^= maskKey[index % 4];
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
if (opcode === 1) {
|
|
1146
|
+
return payload.toString("utf8");
|
|
1147
|
+
}
|
|
1148
|
+
return null;
|
|
1149
|
+
}
|
|
1150
|
+
function createFrame(data) {
|
|
1151
|
+
const payload = typeof data === "string" ? Buffer.from(data) : data;
|
|
1152
|
+
const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;
|
|
1153
|
+
let frame;
|
|
1154
|
+
let offset = 2;
|
|
1155
|
+
if (payloadLength < 126) {
|
|
1156
|
+
frame = Buffer.allocUnsafe(2 + payloadLength);
|
|
1157
|
+
frame[1] = payloadLength;
|
|
1158
|
+
} else if (payloadLength < 65536) {
|
|
1159
|
+
frame = Buffer.allocUnsafe(4 + payloadLength);
|
|
1160
|
+
frame[1] = 126;
|
|
1161
|
+
frame.writeUInt16BE(payloadLength, 2);
|
|
1162
|
+
offset = 4;
|
|
1163
|
+
} else {
|
|
1164
|
+
frame = Buffer.allocUnsafe(10 + payloadLength);
|
|
1165
|
+
frame[1] = 127;
|
|
1166
|
+
frame.writeBigUInt64BE(BigInt(payloadLength), 2);
|
|
1167
|
+
offset = 10;
|
|
1168
|
+
}
|
|
1169
|
+
frame[0] = 129;
|
|
1170
|
+
if (Buffer.isBuffer(payload)) {
|
|
1171
|
+
payload.copy(frame, offset);
|
|
1172
|
+
}
|
|
1173
|
+
return frame;
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
// src/server/ws/websocket.ts
|
|
1177
|
+
var import_events = __require("events");
|
|
1178
|
+
var WebSocket = class extends import_events.EventEmitter {
|
|
939
1179
|
constructor(address, protocols, _options) {
|
|
940
1180
|
super();
|
|
941
1181
|
this.readyState = 0 /* CONNECTING */;
|
|
@@ -965,22 +1205,23 @@
|
|
|
965
1205
|
};
|
|
966
1206
|
}
|
|
967
1207
|
/**
|
|
968
|
-
* Send data through WebSocket
|
|
1208
|
+
* Send data through WebSocket.
|
|
969
1209
|
*/
|
|
970
1210
|
send(data, options, callback) {
|
|
971
1211
|
const cb = typeof options === "function" ? options : callback;
|
|
972
1212
|
if (this.readyState !== 1 /* OPEN */) {
|
|
973
|
-
|
|
1213
|
+
queueCallback(cb, new Error("WebSocket is not open"));
|
|
1214
|
+
return;
|
|
974
1215
|
}
|
|
975
1216
|
try {
|
|
976
1217
|
this._socket.send(data);
|
|
977
|
-
|
|
1218
|
+
queueCallback(cb);
|
|
978
1219
|
} catch (error) {
|
|
979
|
-
|
|
1220
|
+
queueCallback(cb, error);
|
|
980
1221
|
}
|
|
981
1222
|
}
|
|
982
1223
|
/**
|
|
983
|
-
* Close the WebSocket connection
|
|
1224
|
+
* Close the WebSocket connection.
|
|
984
1225
|
*/
|
|
985
1226
|
close(code, reason) {
|
|
986
1227
|
if (this.readyState === 3 /* CLOSED */ || this.readyState === 2 /* CLOSING */) {
|
|
@@ -990,41 +1231,43 @@
|
|
|
990
1231
|
this._socket.close(code, typeof reason === "string" ? reason : reason?.toString());
|
|
991
1232
|
}
|
|
992
1233
|
/**
|
|
993
|
-
* Pause the socket (no-op for native WebSocket)
|
|
1234
|
+
* Pause the socket (no-op for native WebSocket).
|
|
994
1235
|
*/
|
|
995
1236
|
pause() {
|
|
996
1237
|
}
|
|
997
1238
|
/**
|
|
998
|
-
* Resume the socket (no-op for native WebSocket)
|
|
1239
|
+
* Resume the socket (no-op for native WebSocket).
|
|
999
1240
|
*/
|
|
1000
1241
|
resume() {
|
|
1001
1242
|
}
|
|
1002
1243
|
/**
|
|
1003
|
-
* Send a ping frame (no-op for native WebSocket)
|
|
1244
|
+
* Send a ping frame (no-op for native WebSocket).
|
|
1004
1245
|
*/
|
|
1005
1246
|
ping(_data, _mask, callback) {
|
|
1006
|
-
|
|
1247
|
+
queueCallback(callback);
|
|
1007
1248
|
}
|
|
1008
1249
|
/**
|
|
1009
|
-
* Send a pong frame (no-op for native WebSocket)
|
|
1250
|
+
* Send a pong frame (no-op for native WebSocket).
|
|
1010
1251
|
*/
|
|
1011
1252
|
pong(_data, _mask, callback) {
|
|
1012
|
-
|
|
1253
|
+
queueCallback(callback);
|
|
1013
1254
|
}
|
|
1014
1255
|
/**
|
|
1015
|
-
* Terminate the connection
|
|
1256
|
+
* Terminate the connection.
|
|
1016
1257
|
*/
|
|
1017
1258
|
terminate() {
|
|
1018
1259
|
this._socket.close();
|
|
1019
1260
|
this.readyState = 3 /* CLOSED */;
|
|
1020
1261
|
}
|
|
1021
1262
|
/**
|
|
1022
|
-
* Get buffered amount
|
|
1263
|
+
* Get buffered amount.
|
|
1023
1264
|
*/
|
|
1024
1265
|
get bufferedAmount() {
|
|
1025
1266
|
return this._socket.bufferedAmount || 0;
|
|
1026
1267
|
}
|
|
1027
1268
|
};
|
|
1269
|
+
|
|
1270
|
+
// src/server/ws/server.ts
|
|
1028
1271
|
var WebSocketServer = class extends import_events2.EventEmitter {
|
|
1029
1272
|
constructor(options, callback) {
|
|
1030
1273
|
super();
|
|
@@ -1036,8 +1279,7 @@
|
|
|
1036
1279
|
if (options?.server) {
|
|
1037
1280
|
this._httpServer = options.server;
|
|
1038
1281
|
this._setupUpgradeHandler();
|
|
1039
|
-
} else if (options?.noServer) {
|
|
1040
|
-
} else {
|
|
1282
|
+
} else if (!options?.noServer) {
|
|
1041
1283
|
const http2 = __require("http");
|
|
1042
1284
|
this._httpServer = http2.createServer();
|
|
1043
1285
|
this._ownsHttpServer = true;
|
|
@@ -1051,30 +1293,30 @@
|
|
|
1051
1293
|
this._httpServer = options.server;
|
|
1052
1294
|
options.server.registerWebSocketServer(this);
|
|
1053
1295
|
}
|
|
1054
|
-
|
|
1296
|
+
queueCallback(callback);
|
|
1055
1297
|
} else {
|
|
1056
|
-
|
|
1298
|
+
queueCallback(callback);
|
|
1057
1299
|
}
|
|
1058
1300
|
}
|
|
1059
1301
|
_setupUpgradeHandler() {
|
|
1060
|
-
this._httpServer.on("upgrade", (
|
|
1061
|
-
const requestPath = getRequestPath(
|
|
1302
|
+
this._httpServer.on("upgrade", (request3, socket, head) => {
|
|
1303
|
+
const requestPath = getRequestPath(request3.url);
|
|
1062
1304
|
console.log("[WebSocket] Upgrade request:", requestPath, "Expected:", this.path || "(any)");
|
|
1063
1305
|
if (this.path && requestPath !== this.path) {
|
|
1064
1306
|
console.log("[WebSocket] Path mismatch, ignoring");
|
|
1065
1307
|
return;
|
|
1066
1308
|
}
|
|
1067
|
-
this.handleUpgrade(
|
|
1309
|
+
this.handleUpgrade(request3, socket, head, (client) => {
|
|
1068
1310
|
console.log("[WebSocket] Client connected");
|
|
1069
|
-
this.emit("connection", client,
|
|
1311
|
+
this.emit("connection", client, request3);
|
|
1070
1312
|
});
|
|
1071
1313
|
});
|
|
1072
1314
|
}
|
|
1073
1315
|
/**
|
|
1074
|
-
* Handle HTTP upgrade for WebSocket
|
|
1316
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1075
1317
|
*/
|
|
1076
|
-
handleUpgrade(
|
|
1077
|
-
const key =
|
|
1318
|
+
handleUpgrade(request3, socket, _head, callback) {
|
|
1319
|
+
const key = request3.headers["sec-websocket-key"];
|
|
1078
1320
|
if (!key) {
|
|
1079
1321
|
socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
|
|
1080
1322
|
return;
|
|
@@ -1110,7 +1352,7 @@
|
|
|
1110
1352
|
client._socket = socket;
|
|
1111
1353
|
socket.on("data", (data) => {
|
|
1112
1354
|
try {
|
|
1113
|
-
const message =
|
|
1355
|
+
const message = parseFrame(data);
|
|
1114
1356
|
if (message) {
|
|
1115
1357
|
client.emit("message", message, false);
|
|
1116
1358
|
}
|
|
@@ -1123,36 +1365,34 @@
|
|
|
1123
1365
|
client.emit("close", CLOSE_CODES.NORMAL, "");
|
|
1124
1366
|
});
|
|
1125
1367
|
socket.on("error", (error) => {
|
|
1126
|
-
|
|
1127
|
-
if (errorCode === "ECONNABORTED" || errorCode === "ECONNRESET" || errorCode === "EPIPE") {
|
|
1368
|
+
if (isIgnorableConnectionError(error)) {
|
|
1128
1369
|
return;
|
|
1129
1370
|
}
|
|
1130
1371
|
client.emit("error", error);
|
|
1131
1372
|
});
|
|
1132
1373
|
client.send = (data, _options, callback) => {
|
|
1133
1374
|
if (!socket.writable || client.readyState !== 1 /* OPEN */) {
|
|
1134
|
-
const
|
|
1135
|
-
|
|
1136
|
-
|
|
1375
|
+
const error = new Error("WebSocket is not open");
|
|
1376
|
+
error.code = "WS_NOT_OPEN";
|
|
1377
|
+
queueCallback(callback, error);
|
|
1137
1378
|
return;
|
|
1138
1379
|
}
|
|
1139
1380
|
try {
|
|
1140
|
-
const frame =
|
|
1141
|
-
socket.write(frame, (
|
|
1142
|
-
if (
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
queueCallback3(callback, err);
|
|
1146
|
-
} else {
|
|
1147
|
-
client.readyState = 3 /* CLOSED */;
|
|
1148
|
-
queueCallback3(callback);
|
|
1149
|
-
}
|
|
1150
|
-
} else {
|
|
1151
|
-
queueCallback3(callback);
|
|
1381
|
+
const frame = createFrame(data);
|
|
1382
|
+
socket.write(frame, (error) => {
|
|
1383
|
+
if (!error) {
|
|
1384
|
+
queueCallback(callback);
|
|
1385
|
+
return;
|
|
1152
1386
|
}
|
|
1387
|
+
if (isIgnorableConnectionError(error)) {
|
|
1388
|
+
client.readyState = 3 /* CLOSED */;
|
|
1389
|
+
queueCallback(callback);
|
|
1390
|
+
return;
|
|
1391
|
+
}
|
|
1392
|
+
queueCallback(callback, error);
|
|
1153
1393
|
});
|
|
1154
1394
|
} catch (error) {
|
|
1155
|
-
|
|
1395
|
+
queueCallback(callback, error);
|
|
1156
1396
|
}
|
|
1157
1397
|
};
|
|
1158
1398
|
client.close = (_code, _reason) => {
|
|
@@ -1172,14 +1412,14 @@
|
|
|
1172
1412
|
client._socket = socket;
|
|
1173
1413
|
client.send = (data, _options, callback) => {
|
|
1174
1414
|
if (client.readyState !== 1 /* OPEN */) {
|
|
1175
|
-
|
|
1415
|
+
queueCallback(callback, new Error("WebSocket is not open"));
|
|
1176
1416
|
return;
|
|
1177
1417
|
}
|
|
1178
1418
|
try {
|
|
1179
1419
|
socket.send(data);
|
|
1180
|
-
|
|
1420
|
+
queueCallback(callback);
|
|
1181
1421
|
} catch (error) {
|
|
1182
|
-
|
|
1422
|
+
queueCallback(callback, error);
|
|
1183
1423
|
}
|
|
1184
1424
|
};
|
|
1185
1425
|
client.close = (code, reason) => {
|
|
@@ -1187,7 +1427,7 @@
|
|
|
1187
1427
|
return;
|
|
1188
1428
|
}
|
|
1189
1429
|
client.readyState = 2 /* CLOSING */;
|
|
1190
|
-
socket.close(code ?? CLOSE_CODES.NORMAL, reason);
|
|
1430
|
+
socket.close(code ?? CLOSE_CODES.NORMAL, typeof reason === "string" ? reason : reason?.toString());
|
|
1191
1431
|
};
|
|
1192
1432
|
client.terminate = () => {
|
|
1193
1433
|
socket.close();
|
|
@@ -1195,7 +1435,7 @@
|
|
|
1195
1435
|
};
|
|
1196
1436
|
return client;
|
|
1197
1437
|
}
|
|
1198
|
-
_handleBunOpen(socket,
|
|
1438
|
+
_handleBunOpen(socket, request3 = {}) {
|
|
1199
1439
|
const client = this._createClientFromBunSocket(socket);
|
|
1200
1440
|
if (socket.data) {
|
|
1201
1441
|
socket.data.client = client;
|
|
@@ -1207,9 +1447,9 @@
|
|
|
1207
1447
|
});
|
|
1208
1448
|
}
|
|
1209
1449
|
const incomingRequest = {
|
|
1210
|
-
url:
|
|
1211
|
-
headers:
|
|
1212
|
-
socket:
|
|
1450
|
+
url: request3.url || this.path,
|
|
1451
|
+
headers: request3.headers || {},
|
|
1452
|
+
socket: request3.socket || { remoteAddress: void 0 }
|
|
1213
1453
|
};
|
|
1214
1454
|
this.emit("connection", client, incomingRequest);
|
|
1215
1455
|
}
|
|
@@ -1218,8 +1458,7 @@
|
|
|
1218
1458
|
if (!client) {
|
|
1219
1459
|
return;
|
|
1220
1460
|
}
|
|
1221
|
-
const isBinary =
|
|
1222
|
-
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));
|
|
1461
|
+
const { payload, isBinary } = coerceBunMessage(message);
|
|
1223
1462
|
client.emit("message", payload, isBinary);
|
|
1224
1463
|
}
|
|
1225
1464
|
_handleBunClose(socket, code, reason) {
|
|
@@ -1231,98 +1470,290 @@
|
|
|
1231
1470
|
client.emit("close", code, typeof reason === "string" ? reason : reason?.toString() || "");
|
|
1232
1471
|
this.clients.delete(client);
|
|
1233
1472
|
}
|
|
1234
|
-
_parseFrame(data) {
|
|
1235
|
-
if (data.length < 2) return null;
|
|
1236
|
-
const firstByte = data[0];
|
|
1237
|
-
const secondByte = data[1];
|
|
1238
|
-
const opcode = firstByte & 15;
|
|
1239
|
-
const isMasked = (secondByte & 128) === 128;
|
|
1240
|
-
let payloadLength = secondByte & 127;
|
|
1241
|
-
let offset = 2;
|
|
1242
|
-
if (payloadLength === 126) {
|
|
1243
|
-
payloadLength = data.readUInt16BE(2);
|
|
1244
|
-
offset = 4;
|
|
1245
|
-
} else if (payloadLength === 127) {
|
|
1246
|
-
payloadLength = Number(data.readBigUInt64BE(2));
|
|
1247
|
-
offset = 10;
|
|
1248
|
-
}
|
|
1249
|
-
let payload = data.subarray(offset);
|
|
1250
|
-
if (isMasked) {
|
|
1251
|
-
const maskKey = data.subarray(offset, offset + 4);
|
|
1252
|
-
payload = data.subarray(offset + 4, offset + 4 + payloadLength);
|
|
1253
|
-
for (let i = 0; i < payload.length; i++) {
|
|
1254
|
-
payload[i] ^= maskKey[i % 4];
|
|
1255
|
-
}
|
|
1256
|
-
}
|
|
1257
|
-
if (opcode === 1) {
|
|
1258
|
-
return payload.toString("utf8");
|
|
1259
|
-
}
|
|
1260
|
-
return null;
|
|
1261
|
-
}
|
|
1262
|
-
_createFrame(data) {
|
|
1263
|
-
const payload = typeof data === "string" ? Buffer.from(data) : data;
|
|
1264
|
-
const payloadLength = Buffer.isBuffer(payload) ? payload.length : 0;
|
|
1265
|
-
let frame;
|
|
1266
|
-
let offset = 2;
|
|
1267
|
-
if (payloadLength < 126) {
|
|
1268
|
-
frame = Buffer.allocUnsafe(2 + payloadLength);
|
|
1269
|
-
frame[1] = payloadLength;
|
|
1270
|
-
} else if (payloadLength < 65536) {
|
|
1271
|
-
frame = Buffer.allocUnsafe(4 + payloadLength);
|
|
1272
|
-
frame[1] = 126;
|
|
1273
|
-
frame.writeUInt16BE(payloadLength, 2);
|
|
1274
|
-
offset = 4;
|
|
1275
|
-
} else {
|
|
1276
|
-
frame = Buffer.allocUnsafe(10 + payloadLength);
|
|
1277
|
-
frame[1] = 127;
|
|
1278
|
-
frame.writeBigUInt64BE(BigInt(payloadLength), 2);
|
|
1279
|
-
offset = 10;
|
|
1280
|
-
}
|
|
1281
|
-
frame[0] = 129;
|
|
1282
|
-
if (Buffer.isBuffer(payload)) {
|
|
1283
|
-
payload.copy(frame, offset);
|
|
1284
|
-
}
|
|
1285
|
-
return frame;
|
|
1286
|
-
}
|
|
1287
1473
|
/**
|
|
1288
|
-
* Close the server
|
|
1474
|
+
* Close the server.
|
|
1289
1475
|
*/
|
|
1290
1476
|
close(callback) {
|
|
1291
1477
|
this.clients.forEach((client) => client.close());
|
|
1292
1478
|
this.clients.clear();
|
|
1293
1479
|
if (this._httpServer && this._ownsHttpServer) {
|
|
1294
1480
|
this._httpServer.close(callback);
|
|
1295
|
-
|
|
1296
|
-
if (runtime === "bun" && this._httpServer?.unregisterWebSocketServer) {
|
|
1297
|
-
this._httpServer.unregisterWebSocketServer(this);
|
|
1298
|
-
}
|
|
1299
|
-
this.emit("close");
|
|
1300
|
-
queueCallback3(callback);
|
|
1481
|
+
return;
|
|
1301
1482
|
}
|
|
1483
|
+
if (runtime === "bun" && this._httpServer?.unregisterWebSocketServer) {
|
|
1484
|
+
this._httpServer.unregisterWebSocketServer(this);
|
|
1485
|
+
}
|
|
1486
|
+
this.emit("close");
|
|
1487
|
+
queueCallback(callback);
|
|
1302
1488
|
}
|
|
1303
1489
|
/**
|
|
1304
|
-
* Check if server should handle request
|
|
1490
|
+
* Check if server should handle request.
|
|
1305
1491
|
*/
|
|
1306
|
-
shouldHandle(
|
|
1307
|
-
if (this.path && getRequestPath(
|
|
1492
|
+
shouldHandle(request3) {
|
|
1493
|
+
if (this.path && getRequestPath(request3.url) !== this.path) {
|
|
1308
1494
|
return false;
|
|
1309
1495
|
}
|
|
1310
1496
|
return true;
|
|
1311
1497
|
}
|
|
1312
1498
|
/**
|
|
1313
|
-
* Get server address
|
|
1499
|
+
* Get server address.
|
|
1314
1500
|
*/
|
|
1315
1501
|
address() {
|
|
1316
|
-
if (this._httpServer
|
|
1502
|
+
if (this._httpServer?.address) {
|
|
1317
1503
|
return this._httpServer.address();
|
|
1318
1504
|
}
|
|
1319
1505
|
return null;
|
|
1320
1506
|
}
|
|
1321
1507
|
};
|
|
1322
1508
|
|
|
1323
|
-
// src/
|
|
1509
|
+
// src/server/ws/runtime.ts
|
|
1510
|
+
init_runtime();
|
|
1511
|
+
|
|
1512
|
+
// src/server/wss/client.ts
|
|
1513
|
+
var WSSClient = class extends WebSocket {
|
|
1514
|
+
constructor(address, protocols, options) {
|
|
1515
|
+
const urlString = typeof address === "string" ? address : address.toString();
|
|
1516
|
+
const secureUrl = urlString.replace(/^ws:\/\//i, "wss://");
|
|
1517
|
+
super(secureUrl, protocols, options);
|
|
1518
|
+
}
|
|
1519
|
+
};
|
|
1520
|
+
function createWSSClient(address, protocols, options) {
|
|
1521
|
+
return new WSSClient(address, protocols, options);
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
// src/server/wss/runtime.ts
|
|
1525
|
+
init_runtime();
|
|
1526
|
+
function getRuntime2() {
|
|
1527
|
+
return runtime;
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
// src/server/wss/server.ts
|
|
1531
|
+
var import_events3 = __require("events");
|
|
1532
|
+
|
|
1533
|
+
// src/server/https/client-request.ts
|
|
1534
|
+
var import_node_events = __require("events");
|
|
1535
|
+
init_utils();
|
|
1536
|
+
|
|
1537
|
+
// src/server/https/request-api.ts
|
|
1538
|
+
init_runtime();
|
|
1539
|
+
|
|
1540
|
+
// src/server/https/http-classes.ts
|
|
1541
|
+
function loadHttpClasses() {
|
|
1542
|
+
const httpModule = (init_http(), __toCommonJS(http_exports));
|
|
1543
|
+
return {
|
|
1544
|
+
IncomingMessage: httpModule.IncomingMessage,
|
|
1545
|
+
ServerResponse: httpModule.ServerResponse
|
|
1546
|
+
};
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
// src/server/https/node-modules.ts
|
|
1550
|
+
init_runtime();
|
|
1551
|
+
var https2;
|
|
1552
|
+
if (isNode && typeof process !== "undefined") {
|
|
1553
|
+
try {
|
|
1554
|
+
https2 = __require("https");
|
|
1555
|
+
} catch {
|
|
1556
|
+
https2 = __require("https");
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
// src/server/https/runtime.ts
|
|
1561
|
+
init_runtime();
|
|
1562
|
+
|
|
1563
|
+
// src/server/https/server-runtime.ts
|
|
1564
|
+
var import_node_events6 = __require("events");
|
|
1565
|
+
init_runtime();
|
|
1566
|
+
init_utils();
|
|
1567
|
+
var Server2 = class extends import_node_events6.EventEmitter {
|
|
1568
|
+
constructor(options = {}, requestListener) {
|
|
1569
|
+
super();
|
|
1570
|
+
this._listening = false;
|
|
1571
|
+
this.options = options;
|
|
1572
|
+
this.requestListener = requestListener;
|
|
1573
|
+
}
|
|
1574
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
1575
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
1576
|
+
return explicitFd;
|
|
1577
|
+
}
|
|
1578
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
1579
|
+
if (!fdValue) {
|
|
1580
|
+
return void 0;
|
|
1581
|
+
}
|
|
1582
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
1583
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
1584
|
+
return void 0;
|
|
1585
|
+
}
|
|
1586
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
1587
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
1588
|
+
return void 0;
|
|
1589
|
+
}
|
|
1590
|
+
return parsedFd;
|
|
1591
|
+
}
|
|
1592
|
+
listen(...args) {
|
|
1593
|
+
let port = 3e3;
|
|
1594
|
+
let hostname = "0.0.0.0";
|
|
1595
|
+
let fd;
|
|
1596
|
+
let callback;
|
|
1597
|
+
const firstArg = args[0];
|
|
1598
|
+
if (typeof firstArg === "number") {
|
|
1599
|
+
port = firstArg;
|
|
1600
|
+
const secondArg = args[1];
|
|
1601
|
+
if (typeof secondArg === "string") {
|
|
1602
|
+
hostname = secondArg;
|
|
1603
|
+
callback = args[2] || args[3];
|
|
1604
|
+
} else if (typeof secondArg === "function") {
|
|
1605
|
+
callback = secondArg;
|
|
1606
|
+
}
|
|
1607
|
+
} else if (firstArg && typeof firstArg === "object") {
|
|
1608
|
+
port = firstArg.port || 3e3;
|
|
1609
|
+
hostname = firstArg.hostname || "0.0.0.0";
|
|
1610
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
1611
|
+
callback = args[1];
|
|
1612
|
+
}
|
|
1613
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
1614
|
+
const self = this;
|
|
1615
|
+
if (isNode) {
|
|
1616
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1617
|
+
this.nativeServer = https2.createServer(this.options, (req, res) => {
|
|
1618
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1619
|
+
const serverResponse = new ServerResponse2(incomingMessage, res);
|
|
1620
|
+
if (self.requestListener) {
|
|
1621
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1622
|
+
} else {
|
|
1623
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1624
|
+
}
|
|
1625
|
+
});
|
|
1626
|
+
if (fd !== void 0) {
|
|
1627
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
1628
|
+
this._listening = true;
|
|
1629
|
+
this.emit("listening");
|
|
1630
|
+
if (callback) callback();
|
|
1631
|
+
});
|
|
1632
|
+
} else {
|
|
1633
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
1634
|
+
this._listening = true;
|
|
1635
|
+
this.emit("listening");
|
|
1636
|
+
if (callback) callback();
|
|
1637
|
+
});
|
|
1638
|
+
}
|
|
1639
|
+
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1640
|
+
this.nativeServer.on("close", () => {
|
|
1641
|
+
this._listening = false;
|
|
1642
|
+
this.emit("close");
|
|
1643
|
+
});
|
|
1644
|
+
} else if (isBun) {
|
|
1645
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1646
|
+
const tlsOptions = {
|
|
1647
|
+
port,
|
|
1648
|
+
hostname,
|
|
1649
|
+
fetch: (req) => {
|
|
1650
|
+
return new Promise((resolve) => {
|
|
1651
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1652
|
+
const serverResponse = new ServerResponse2();
|
|
1653
|
+
serverResponse._setResolver(resolve);
|
|
1654
|
+
if (self.requestListener) {
|
|
1655
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1656
|
+
} else {
|
|
1657
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1658
|
+
}
|
|
1659
|
+
});
|
|
1660
|
+
},
|
|
1661
|
+
error: (error) => {
|
|
1662
|
+
this.emit("error", error);
|
|
1663
|
+
return createErrorResponse();
|
|
1664
|
+
}
|
|
1665
|
+
};
|
|
1666
|
+
if (this.options.key || this.options.cert) {
|
|
1667
|
+
tlsOptions.tls = {
|
|
1668
|
+
key: this.options.key,
|
|
1669
|
+
cert: this.options.cert,
|
|
1670
|
+
ca: this.options.ca,
|
|
1671
|
+
passphrase: this.options.passphrase
|
|
1672
|
+
};
|
|
1673
|
+
} else if (this.options.tls) {
|
|
1674
|
+
tlsOptions.tls = this.options.tls;
|
|
1675
|
+
}
|
|
1676
|
+
this.nativeServer = Bun.serve(tlsOptions);
|
|
1677
|
+
emitListeningWithCallback(this, callback);
|
|
1678
|
+
} else if (isDeno) {
|
|
1679
|
+
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
1680
|
+
const serveOptions = {
|
|
1681
|
+
port,
|
|
1682
|
+
hostname,
|
|
1683
|
+
handler: (req) => {
|
|
1684
|
+
return new Promise((resolve) => {
|
|
1685
|
+
const incomingMessage = new IncomingMessage2(req);
|
|
1686
|
+
const serverResponse = new ServerResponse2();
|
|
1687
|
+
serverResponse._setResolver(resolve);
|
|
1688
|
+
if (self.requestListener) {
|
|
1689
|
+
self.requestListener(incomingMessage, serverResponse);
|
|
1690
|
+
} else {
|
|
1691
|
+
self.emit("request", incomingMessage, serverResponse);
|
|
1692
|
+
}
|
|
1693
|
+
});
|
|
1694
|
+
},
|
|
1695
|
+
onError: (error) => {
|
|
1696
|
+
this.emit("error", error);
|
|
1697
|
+
return createErrorResponse();
|
|
1698
|
+
}
|
|
1699
|
+
};
|
|
1700
|
+
if (this.options.key && this.options.cert) {
|
|
1701
|
+
serveOptions.cert = this.options.cert;
|
|
1702
|
+
serveOptions.key = this.options.key;
|
|
1703
|
+
}
|
|
1704
|
+
this.nativeServer = Deno.serve(serveOptions);
|
|
1705
|
+
emitListeningWithCallback(this, callback);
|
|
1706
|
+
}
|
|
1707
|
+
return this;
|
|
1708
|
+
}
|
|
1709
|
+
close(callback) {
|
|
1710
|
+
if (!this.nativeServer) {
|
|
1711
|
+
if (callback) queueCallback2(() => callback());
|
|
1712
|
+
return this;
|
|
1713
|
+
}
|
|
1714
|
+
if (isNode) {
|
|
1715
|
+
this.nativeServer.close(callback);
|
|
1716
|
+
} else if (isBun) {
|
|
1717
|
+
this.nativeServer.stop();
|
|
1718
|
+
closeAndEmit(this, callback);
|
|
1719
|
+
} else if (isDeno) {
|
|
1720
|
+
this.nativeServer.shutdown();
|
|
1721
|
+
closeAndEmit(this, callback);
|
|
1722
|
+
}
|
|
1723
|
+
return this;
|
|
1724
|
+
}
|
|
1725
|
+
address() {
|
|
1726
|
+
if (!this.nativeServer) return null;
|
|
1727
|
+
if (isNode) {
|
|
1728
|
+
const addr = this.nativeServer.address();
|
|
1729
|
+
if (!addr) return null;
|
|
1730
|
+
if (typeof addr === "string") {
|
|
1731
|
+
return createAddress(0, addr, "unix");
|
|
1732
|
+
}
|
|
1733
|
+
return addr;
|
|
1734
|
+
}
|
|
1735
|
+
if (isBun) {
|
|
1736
|
+
return createAddress(this.nativeServer.port, this.nativeServer.hostname);
|
|
1737
|
+
}
|
|
1738
|
+
if (isDeno) {
|
|
1739
|
+
const addr = this.nativeServer.addr;
|
|
1740
|
+
return createAddress(addr.port, addr.hostname);
|
|
1741
|
+
}
|
|
1742
|
+
return null;
|
|
1743
|
+
}
|
|
1744
|
+
get listening() {
|
|
1745
|
+
return this._listening;
|
|
1746
|
+
}
|
|
1747
|
+
};
|
|
1748
|
+
function createServer2(options = {}, requestListener) {
|
|
1749
|
+
return new Server2(options, requestListener);
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1752
|
+
// src/server/wss/server.ts
|
|
1324
1753
|
init_runtime();
|
|
1325
|
-
|
|
1754
|
+
|
|
1755
|
+
// src/server/wss/utils.ts
|
|
1756
|
+
function queueCallback3(callback) {
|
|
1326
1757
|
if (callback) {
|
|
1327
1758
|
queueMicrotask(callback);
|
|
1328
1759
|
}
|
|
@@ -1339,15 +1770,10 @@
|
|
|
1339
1770
|
}
|
|
1340
1771
|
function emitCloseWithCallback(emitter, callback) {
|
|
1341
1772
|
emitter.emit("close");
|
|
1342
|
-
|
|
1773
|
+
queueCallback3(callback);
|
|
1343
1774
|
}
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
const urlString = typeof address === "string" ? address : address.toString();
|
|
1347
|
-
const secureUrl = urlString.replace(/^ws:\/\//i, "wss://");
|
|
1348
|
-
super(secureUrl, protocols, options);
|
|
1349
|
-
}
|
|
1350
|
-
};
|
|
1775
|
+
|
|
1776
|
+
// src/server/wss/server.ts
|
|
1351
1777
|
var WSSServer = class extends import_events3.EventEmitter {
|
|
1352
1778
|
constructor(options, callback) {
|
|
1353
1779
|
super();
|
|
@@ -1360,7 +1786,7 @@
|
|
|
1360
1786
|
this._setupServer(callback);
|
|
1361
1787
|
} else if (options?.noServer) {
|
|
1362
1788
|
this._wsServer = new WebSocketServer({ noServer: true });
|
|
1363
|
-
|
|
1789
|
+
queueCallback3(callback);
|
|
1364
1790
|
} else {
|
|
1365
1791
|
this._httpsServer = createServer2(buildHttpsOptions(options));
|
|
1366
1792
|
this._setupServer(callback);
|
|
@@ -1370,7 +1796,7 @@
|
|
|
1370
1796
|
}
|
|
1371
1797
|
} else {
|
|
1372
1798
|
this._wsServer = new WebSocketServer(options);
|
|
1373
|
-
|
|
1799
|
+
queueCallback3(callback);
|
|
1374
1800
|
}
|
|
1375
1801
|
}
|
|
1376
1802
|
_setupServer(callback) {
|
|
@@ -1379,44 +1805,44 @@
|
|
|
1379
1805
|
server: this._httpsServer,
|
|
1380
1806
|
noServer: false
|
|
1381
1807
|
});
|
|
1382
|
-
this._wsServer.on("connection", (client,
|
|
1808
|
+
this._wsServer.on("connection", (client, request3) => {
|
|
1383
1809
|
if (this.options.clientTracking !== false) {
|
|
1384
1810
|
this.clients.add(client);
|
|
1385
1811
|
client.on("close", () => {
|
|
1386
1812
|
this.clients.delete(client);
|
|
1387
1813
|
});
|
|
1388
1814
|
}
|
|
1389
|
-
this.emit("connection", client,
|
|
1815
|
+
this.emit("connection", client, request3);
|
|
1390
1816
|
});
|
|
1391
1817
|
this._wsServer.on("error", (error) => {
|
|
1392
1818
|
this.emit("error", error);
|
|
1393
1819
|
});
|
|
1394
1820
|
if (!this.options?.port) {
|
|
1395
|
-
|
|
1821
|
+
queueCallback3(callback);
|
|
1396
1822
|
}
|
|
1397
1823
|
}
|
|
1398
1824
|
/**
|
|
1399
|
-
* Handle HTTP upgrade for WebSocket
|
|
1825
|
+
* Handle HTTP upgrade for WebSocket.
|
|
1400
1826
|
*/
|
|
1401
|
-
handleUpgrade(
|
|
1827
|
+
handleUpgrade(request3, socket, head, callback) {
|
|
1402
1828
|
if (this._wsServer) {
|
|
1403
|
-
this._wsServer.handleUpgrade(
|
|
1829
|
+
this._wsServer.handleUpgrade(request3, socket, head, callback);
|
|
1404
1830
|
}
|
|
1405
1831
|
}
|
|
1406
1832
|
/**
|
|
1407
|
-
* Check if server should handle request
|
|
1833
|
+
* Check if server should handle request.
|
|
1408
1834
|
*/
|
|
1409
|
-
shouldHandle(
|
|
1835
|
+
shouldHandle(request3) {
|
|
1410
1836
|
if (this._wsServer) {
|
|
1411
|
-
return this._wsServer.shouldHandle(
|
|
1837
|
+
return this._wsServer.shouldHandle(request3);
|
|
1412
1838
|
}
|
|
1413
|
-
if (this.path &&
|
|
1839
|
+
if (this.path && request3.url !== this.path) {
|
|
1414
1840
|
return false;
|
|
1415
1841
|
}
|
|
1416
1842
|
return true;
|
|
1417
1843
|
}
|
|
1418
1844
|
/**
|
|
1419
|
-
* Close the server
|
|
1845
|
+
* Close the server.
|
|
1420
1846
|
*/
|
|
1421
1847
|
close(callback) {
|
|
1422
1848
|
this.clients.forEach((client) => client.close());
|
|
@@ -1429,17 +1855,19 @@
|
|
|
1429
1855
|
emitCloseWithCallback(this, callback);
|
|
1430
1856
|
}
|
|
1431
1857
|
});
|
|
1432
|
-
|
|
1858
|
+
return;
|
|
1859
|
+
}
|
|
1860
|
+
if (this._httpsServer) {
|
|
1433
1861
|
this._httpsServer.close(callback);
|
|
1434
|
-
|
|
1435
|
-
emitCloseWithCallback(this, callback);
|
|
1862
|
+
return;
|
|
1436
1863
|
}
|
|
1864
|
+
emitCloseWithCallback(this, callback);
|
|
1437
1865
|
}
|
|
1438
1866
|
/**
|
|
1439
|
-
* Get server address
|
|
1867
|
+
* Get server address.
|
|
1440
1868
|
*/
|
|
1441
1869
|
address() {
|
|
1442
|
-
if (this._httpsServer
|
|
1870
|
+
if (this._httpsServer?.address) {
|
|
1443
1871
|
return this._httpsServer.address();
|
|
1444
1872
|
}
|
|
1445
1873
|
if (this._wsServer) {
|
|
@@ -1448,15 +1876,11 @@
|
|
|
1448
1876
|
return null;
|
|
1449
1877
|
}
|
|
1450
1878
|
};
|
|
1451
|
-
function createWSSClient(address, protocols, options) {
|
|
1452
|
-
return new WSSClient(address, protocols, options);
|
|
1453
|
-
}
|
|
1454
1879
|
function createWSSServer(options, callback) {
|
|
1455
1880
|
return new WSSServer(options, callback);
|
|
1456
1881
|
}
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
}
|
|
1882
|
+
|
|
1883
|
+
// src/server/wss/index.ts
|
|
1460
1884
|
var wss_default = {
|
|
1461
1885
|
WSSClient,
|
|
1462
1886
|
WSSServer,
|