elit 3.6.7 → 3.6.9
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/cli.cjs +2777 -321
- package/dist/cli.mjs +2764 -308
- package/dist/config.d.ts +6 -6
- package/dist/{contracts-BeW9k0yZ.d.ts → contracts-_0p1-15U.d.ts} +1 -1
- package/dist/coverage.d.ts +1 -1
- package/dist/dev-build.d.ts +3 -3
- package/dist/http.cjs +160 -41
- package/dist/http.d.ts +5 -11
- package/dist/http.js +160 -41
- package/dist/http.mjs +160 -41
- package/dist/https.cjs +194 -46
- package/dist/https.d.ts +3 -6
- package/dist/https.js +194 -46
- package/dist/https.mjs +194 -46
- package/dist/pm-node-shared-listener-bootstrap.cjs +75 -0
- package/dist/pm.cjs +2390 -160
- package/dist/pm.d.ts +83 -8
- package/dist/pm.js +2388 -188
- package/dist/pm.mjs +2380 -165
- package/dist/preview-build.d.ts +3 -3
- package/dist/server.cjs +417 -168
- package/dist/server.d.ts +4 -4
- package/dist/server.js +453 -179
- package/dist/server.mjs +417 -168
- package/dist/smtp-server.js +37 -12
- package/dist/test-reporter.d.ts +1 -1
- package/dist/test-runtime.d.ts +1 -1
- package/dist/{types-tJn88E1N.d.ts → types-BayMVo_k.d.ts} +39 -3
- package/dist/{types-CIhpN1-K.d.ts → types-C70T-42Z.d.ts} +1 -1
- package/dist/{types-DAisuVr5.d.ts → types-DPOgoGs-.d.ts} +7 -1
- package/dist/{state-DvEkDehk.d.ts → types-fiLday0L.d.ts} +96 -92
- package/dist/types.d.ts +4 -0
- package/dist/{websocket-XfyK23zD.d.ts → websocket-BLBEAnhp.d.ts} +1 -1
- package/dist/ws.d.ts +3 -3
- package/dist/wss.cjs +194 -46
- package/dist/wss.d.ts +3 -3
- package/dist/wss.js +194 -46
- package/dist/wss.mjs +194 -46
- package/package.json +11 -6
package/dist/https.js
CHANGED
|
@@ -610,8 +610,9 @@
|
|
|
610
610
|
});
|
|
611
611
|
|
|
612
612
|
// src/server/http/server-runtime.ts
|
|
613
|
-
function createServer(
|
|
614
|
-
|
|
613
|
+
function createServer(arg1, arg2) {
|
|
614
|
+
const requestListener = typeof arg1 === "function" ? arg1 : arg2;
|
|
615
|
+
return new Server(requestListener);
|
|
615
616
|
}
|
|
616
617
|
var import_node_events5, Server;
|
|
617
618
|
var init_server_runtime = __esm({
|
|
@@ -636,9 +637,28 @@
|
|
|
636
637
|
unregisterWebSocketServer(wsServer) {
|
|
637
638
|
this._bunWebSocketServers.delete(wsServer);
|
|
638
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
|
+
}
|
|
639
658
|
listen(...args) {
|
|
640
659
|
let port = 3e3;
|
|
641
660
|
let hostname = "0.0.0.0";
|
|
661
|
+
let fd;
|
|
642
662
|
let callback;
|
|
643
663
|
const firstArg = args[0];
|
|
644
664
|
if (typeof firstArg === "number") {
|
|
@@ -653,8 +673,10 @@
|
|
|
653
673
|
} else if (firstArg && typeof firstArg === "object") {
|
|
654
674
|
port = firstArg.port || 3e3;
|
|
655
675
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
676
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
656
677
|
callback = args[1];
|
|
657
678
|
}
|
|
679
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
658
680
|
const self = this;
|
|
659
681
|
if (isNode) {
|
|
660
682
|
this.nativeServer = http.createServer((req, res) => {
|
|
@@ -669,11 +691,19 @@
|
|
|
669
691
|
this.nativeServer.on("upgrade", (req, socket, head) => {
|
|
670
692
|
self.emit("upgrade", req, socket, head);
|
|
671
693
|
});
|
|
672
|
-
|
|
673
|
-
this.
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
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
|
+
}
|
|
677
707
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
678
708
|
this.nativeServer.on("close", () => {
|
|
679
709
|
this._listening = false;
|
|
@@ -792,7 +822,6 @@
|
|
|
792
822
|
this.writeHead(statusCode);
|
|
793
823
|
}
|
|
794
824
|
responseReady = true;
|
|
795
|
-
return this;
|
|
796
825
|
}
|
|
797
826
|
};
|
|
798
827
|
if (self.requestListener) {
|
|
@@ -800,51 +829,141 @@
|
|
|
800
829
|
} else {
|
|
801
830
|
self.emit("request", incomingMessage, serverResponse);
|
|
802
831
|
}
|
|
803
|
-
if (responseReady) {
|
|
804
|
-
|
|
805
|
-
status: statusCode,
|
|
806
|
-
statusText: statusMessage,
|
|
807
|
-
headers
|
|
808
|
-
});
|
|
832
|
+
if (!responseReady) {
|
|
833
|
+
serverResponse.end();
|
|
809
834
|
}
|
|
810
|
-
return new
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
}
|
|
815
|
-
resolve(new Response(body, {
|
|
816
|
-
status: statusCode,
|
|
817
|
-
statusText: statusMessage,
|
|
818
|
-
headers
|
|
819
|
-
}));
|
|
820
|
-
};
|
|
835
|
+
return new Response(body, {
|
|
836
|
+
status: statusCode,
|
|
837
|
+
statusText: statusMessage,
|
|
838
|
+
headers
|
|
821
839
|
});
|
|
822
840
|
},
|
|
823
|
-
error:
|
|
841
|
+
error: (err) => {
|
|
842
|
+
this.emit("error", err);
|
|
843
|
+
return createErrorResponse();
|
|
844
|
+
}
|
|
824
845
|
});
|
|
846
|
+
this._listening = true;
|
|
825
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
|
+
});
|
|
826
854
|
} else if (isDeno) {
|
|
855
|
+
const server = this;
|
|
827
856
|
this.nativeServer = Deno.serve({
|
|
828
857
|
port,
|
|
829
|
-
hostname
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
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
|
+
});
|
|
839
913
|
}
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
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);
|
|
943
|
+
}
|
|
944
|
+
if (!responseClosed) {
|
|
945
|
+
serverResponse.end();
|
|
845
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
|
+
});
|
|
846
963
|
});
|
|
964
|
+
this._listening = true;
|
|
847
965
|
emitListeningWithCallback(this, callback);
|
|
966
|
+
this.nativeServer.finished.then(() => closeAndEmit(this)).catch((err) => this.emit("error", err));
|
|
848
967
|
}
|
|
849
968
|
return this;
|
|
850
969
|
}
|
|
@@ -1095,9 +1214,28 @@
|
|
|
1095
1214
|
this.options = options;
|
|
1096
1215
|
this.requestListener = requestListener;
|
|
1097
1216
|
}
|
|
1217
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
1218
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
1219
|
+
return explicitFd;
|
|
1220
|
+
}
|
|
1221
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
1222
|
+
if (!fdValue) {
|
|
1223
|
+
return void 0;
|
|
1224
|
+
}
|
|
1225
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
1226
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
1227
|
+
return void 0;
|
|
1228
|
+
}
|
|
1229
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
1230
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
1231
|
+
return void 0;
|
|
1232
|
+
}
|
|
1233
|
+
return parsedFd;
|
|
1234
|
+
}
|
|
1098
1235
|
listen(...args) {
|
|
1099
1236
|
let port = 3e3;
|
|
1100
1237
|
let hostname = "0.0.0.0";
|
|
1238
|
+
let fd;
|
|
1101
1239
|
let callback;
|
|
1102
1240
|
const firstArg = args[0];
|
|
1103
1241
|
if (typeof firstArg === "number") {
|
|
@@ -1112,8 +1250,10 @@
|
|
|
1112
1250
|
} else if (firstArg && typeof firstArg === "object") {
|
|
1113
1251
|
port = firstArg.port || 3e3;
|
|
1114
1252
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
1253
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
1115
1254
|
callback = args[1];
|
|
1116
1255
|
}
|
|
1256
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
1117
1257
|
const self = this;
|
|
1118
1258
|
if (isNode) {
|
|
1119
1259
|
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
@@ -1126,11 +1266,19 @@
|
|
|
1126
1266
|
self.emit("request", incomingMessage, serverResponse);
|
|
1127
1267
|
}
|
|
1128
1268
|
});
|
|
1129
|
-
|
|
1130
|
-
this.
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1269
|
+
if (fd !== void 0) {
|
|
1270
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
1271
|
+
this._listening = true;
|
|
1272
|
+
this.emit("listening");
|
|
1273
|
+
if (callback) callback();
|
|
1274
|
+
});
|
|
1275
|
+
} else {
|
|
1276
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
1277
|
+
this._listening = true;
|
|
1278
|
+
this.emit("listening");
|
|
1279
|
+
if (callback) callback();
|
|
1280
|
+
});
|
|
1281
|
+
}
|
|
1134
1282
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1135
1283
|
this.nativeServer.on("close", () => {
|
|
1136
1284
|
this._listening = false;
|
package/dist/https.mjs
CHANGED
|
@@ -610,8 +610,9 @@ var init_runtime2 = __esm({
|
|
|
610
610
|
|
|
611
611
|
// src/server/http/server-runtime.ts
|
|
612
612
|
import { EventEmitter as EventEmitter5 } from "events";
|
|
613
|
-
function createServer(
|
|
614
|
-
|
|
613
|
+
function createServer(arg1, arg2) {
|
|
614
|
+
const requestListener = typeof arg1 === "function" ? arg1 : arg2;
|
|
615
|
+
return new Server(requestListener);
|
|
615
616
|
}
|
|
616
617
|
var Server;
|
|
617
618
|
var init_server_runtime = __esm({
|
|
@@ -635,9 +636,28 @@ var init_server_runtime = __esm({
|
|
|
635
636
|
unregisterWebSocketServer(wsServer) {
|
|
636
637
|
this._bunWebSocketServers.delete(wsServer);
|
|
637
638
|
}
|
|
639
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
640
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
641
|
+
return explicitFd;
|
|
642
|
+
}
|
|
643
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
644
|
+
if (!fdValue) {
|
|
645
|
+
return void 0;
|
|
646
|
+
}
|
|
647
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
648
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
649
|
+
return void 0;
|
|
650
|
+
}
|
|
651
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
652
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
653
|
+
return void 0;
|
|
654
|
+
}
|
|
655
|
+
return parsedFd;
|
|
656
|
+
}
|
|
638
657
|
listen(...args) {
|
|
639
658
|
let port = 3e3;
|
|
640
659
|
let hostname = "0.0.0.0";
|
|
660
|
+
let fd;
|
|
641
661
|
let callback;
|
|
642
662
|
const firstArg = args[0];
|
|
643
663
|
if (typeof firstArg === "number") {
|
|
@@ -652,8 +672,10 @@ var init_server_runtime = __esm({
|
|
|
652
672
|
} else if (firstArg && typeof firstArg === "object") {
|
|
653
673
|
port = firstArg.port || 3e3;
|
|
654
674
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
675
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
655
676
|
callback = args[1];
|
|
656
677
|
}
|
|
678
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
657
679
|
const self = this;
|
|
658
680
|
if (isNode) {
|
|
659
681
|
this.nativeServer = http.createServer((req, res) => {
|
|
@@ -668,11 +690,19 @@ var init_server_runtime = __esm({
|
|
|
668
690
|
this.nativeServer.on("upgrade", (req, socket, head) => {
|
|
669
691
|
self.emit("upgrade", req, socket, head);
|
|
670
692
|
});
|
|
671
|
-
|
|
672
|
-
this.
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
693
|
+
if (fd !== void 0) {
|
|
694
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
695
|
+
this._listening = true;
|
|
696
|
+
this.emit("listening");
|
|
697
|
+
if (callback) callback();
|
|
698
|
+
});
|
|
699
|
+
} else {
|
|
700
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
701
|
+
this._listening = true;
|
|
702
|
+
this.emit("listening");
|
|
703
|
+
if (callback) callback();
|
|
704
|
+
});
|
|
705
|
+
}
|
|
676
706
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
677
707
|
this.nativeServer.on("close", () => {
|
|
678
708
|
this._listening = false;
|
|
@@ -791,7 +821,6 @@ var init_server_runtime = __esm({
|
|
|
791
821
|
this.writeHead(statusCode);
|
|
792
822
|
}
|
|
793
823
|
responseReady = true;
|
|
794
|
-
return this;
|
|
795
824
|
}
|
|
796
825
|
};
|
|
797
826
|
if (self.requestListener) {
|
|
@@ -799,51 +828,141 @@ var init_server_runtime = __esm({
|
|
|
799
828
|
} else {
|
|
800
829
|
self.emit("request", incomingMessage, serverResponse);
|
|
801
830
|
}
|
|
802
|
-
if (responseReady) {
|
|
803
|
-
|
|
804
|
-
status: statusCode,
|
|
805
|
-
statusText: statusMessage,
|
|
806
|
-
headers
|
|
807
|
-
});
|
|
831
|
+
if (!responseReady) {
|
|
832
|
+
serverResponse.end();
|
|
808
833
|
}
|
|
809
|
-
return new
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
}
|
|
814
|
-
resolve(new Response(body, {
|
|
815
|
-
status: statusCode,
|
|
816
|
-
statusText: statusMessage,
|
|
817
|
-
headers
|
|
818
|
-
}));
|
|
819
|
-
};
|
|
834
|
+
return new Response(body, {
|
|
835
|
+
status: statusCode,
|
|
836
|
+
statusText: statusMessage,
|
|
837
|
+
headers
|
|
820
838
|
});
|
|
821
839
|
},
|
|
822
|
-
error:
|
|
840
|
+
error: (err) => {
|
|
841
|
+
this.emit("error", err);
|
|
842
|
+
return createErrorResponse();
|
|
843
|
+
}
|
|
823
844
|
});
|
|
845
|
+
this._listening = true;
|
|
824
846
|
emitListeningWithCallback(this, callback);
|
|
847
|
+
this.nativeServer.stop = this.nativeServer.stop || this.nativeServer.close;
|
|
848
|
+
this.nativeServer.close = this.nativeServer.close || this.nativeServer.stop;
|
|
849
|
+
this.nativeServer.on?.("close", () => {
|
|
850
|
+
this._listening = false;
|
|
851
|
+
this.emit("close");
|
|
852
|
+
});
|
|
825
853
|
} else if (isDeno) {
|
|
854
|
+
const server = this;
|
|
826
855
|
this.nativeServer = Deno.serve({
|
|
827
856
|
port,
|
|
828
|
-
hostname
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
857
|
+
hostname
|
|
858
|
+
}, async (req) => {
|
|
859
|
+
const urlObj = new URL(req.url);
|
|
860
|
+
const requestUrl = urlObj.pathname + urlObj.search;
|
|
861
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
862
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
863
|
+
const bodyChunks = [];
|
|
864
|
+
const responseHeaders = new Headers();
|
|
865
|
+
let statusCode = 200;
|
|
866
|
+
let statusText = "OK";
|
|
867
|
+
let responseClosed = false;
|
|
868
|
+
const incomingMessage = {
|
|
869
|
+
method: req.method,
|
|
870
|
+
url: requestUrl,
|
|
871
|
+
headers: incomingHeaders,
|
|
872
|
+
httpVersion: "1.1",
|
|
873
|
+
rawHeaders,
|
|
874
|
+
_req: req,
|
|
875
|
+
text: () => req.text(),
|
|
876
|
+
json: () => req.json()
|
|
877
|
+
};
|
|
878
|
+
const serverResponse = {
|
|
879
|
+
statusCode: 200,
|
|
880
|
+
statusMessage: "OK",
|
|
881
|
+
headersSent: false,
|
|
882
|
+
setHeader(name, value) {
|
|
883
|
+
responseHeaders.set(name, Array.isArray(value) ? value.join(", ") : String(value));
|
|
884
|
+
return this;
|
|
885
|
+
},
|
|
886
|
+
getHeader(name) {
|
|
887
|
+
return responseHeaders.get(name) ?? void 0;
|
|
888
|
+
},
|
|
889
|
+
getHeaders() {
|
|
890
|
+
const headers = {};
|
|
891
|
+
responseHeaders.forEach((value, key) => {
|
|
892
|
+
headers[key] = value;
|
|
893
|
+
});
|
|
894
|
+
return headers;
|
|
895
|
+
},
|
|
896
|
+
writeHead(status, arg2, arg3) {
|
|
897
|
+
statusCode = status;
|
|
898
|
+
this.statusCode = status;
|
|
899
|
+
this.headersSent = true;
|
|
900
|
+
if (typeof arg2 === "string") {
|
|
901
|
+
statusText = arg2;
|
|
902
|
+
this.statusMessage = arg2;
|
|
903
|
+
if (arg3) {
|
|
904
|
+
Object.entries(arg3).forEach(([key, value]) => {
|
|
905
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
906
|
+
});
|
|
907
|
+
}
|
|
908
|
+
} else if (arg2) {
|
|
909
|
+
Object.entries(arg2).forEach(([key, value]) => {
|
|
910
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
911
|
+
});
|
|
838
912
|
}
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
913
|
+
return this;
|
|
914
|
+
},
|
|
915
|
+
write(chunk) {
|
|
916
|
+
if (!this.headersSent) {
|
|
917
|
+
this.writeHead(statusCode);
|
|
918
|
+
}
|
|
919
|
+
if (typeof chunk === "string") {
|
|
920
|
+
bodyChunks.push(new TextEncoder().encode(chunk));
|
|
921
|
+
} else if (chunk instanceof Uint8Array) {
|
|
922
|
+
bodyChunks.push(chunk);
|
|
923
|
+
} else if (chunk !== void 0 && chunk !== null) {
|
|
924
|
+
bodyChunks.push(new TextEncoder().encode(String(chunk)));
|
|
925
|
+
}
|
|
926
|
+
return true;
|
|
927
|
+
},
|
|
928
|
+
end(chunk) {
|
|
929
|
+
if (chunk !== void 0) {
|
|
930
|
+
this.write(chunk);
|
|
931
|
+
}
|
|
932
|
+
if (!this.headersSent) {
|
|
933
|
+
this.writeHead(statusCode);
|
|
934
|
+
}
|
|
935
|
+
responseClosed = true;
|
|
936
|
+
}
|
|
937
|
+
};
|
|
938
|
+
if (server.requestListener) {
|
|
939
|
+
server.requestListener(incomingMessage, serverResponse);
|
|
940
|
+
} else {
|
|
941
|
+
server.emit("request", incomingMessage, serverResponse);
|
|
942
|
+
}
|
|
943
|
+
if (!responseClosed) {
|
|
944
|
+
serverResponse.end();
|
|
844
945
|
}
|
|
946
|
+
const body = bodyChunks.length === 0 ? void 0 : (() => {
|
|
947
|
+
const totalLength = bodyChunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
948
|
+
const output = new ArrayBuffer(totalLength);
|
|
949
|
+
const combined = new Uint8Array(output);
|
|
950
|
+
let offset = 0;
|
|
951
|
+
for (const chunk of bodyChunks) {
|
|
952
|
+
combined.set(chunk, offset);
|
|
953
|
+
offset += chunk.length;
|
|
954
|
+
}
|
|
955
|
+
return output;
|
|
956
|
+
})();
|
|
957
|
+
return new Response(body, {
|
|
958
|
+
status: statusCode,
|
|
959
|
+
statusText,
|
|
960
|
+
headers: responseHeaders
|
|
961
|
+
});
|
|
845
962
|
});
|
|
963
|
+
this._listening = true;
|
|
846
964
|
emitListeningWithCallback(this, callback);
|
|
965
|
+
this.nativeServer.finished.then(() => closeAndEmit(this)).catch((err) => this.emit("error", err));
|
|
847
966
|
}
|
|
848
967
|
return this;
|
|
849
968
|
}
|
|
@@ -1094,9 +1213,28 @@ var Server2 = class extends EventEmitter6 {
|
|
|
1094
1213
|
this.options = options;
|
|
1095
1214
|
this.requestListener = requestListener;
|
|
1096
1215
|
}
|
|
1216
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
1217
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
1218
|
+
return explicitFd;
|
|
1219
|
+
}
|
|
1220
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
1221
|
+
if (!fdValue) {
|
|
1222
|
+
return void 0;
|
|
1223
|
+
}
|
|
1224
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
1225
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
1226
|
+
return void 0;
|
|
1227
|
+
}
|
|
1228
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
1229
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
1230
|
+
return void 0;
|
|
1231
|
+
}
|
|
1232
|
+
return parsedFd;
|
|
1233
|
+
}
|
|
1097
1234
|
listen(...args) {
|
|
1098
1235
|
let port = 3e3;
|
|
1099
1236
|
let hostname = "0.0.0.0";
|
|
1237
|
+
let fd;
|
|
1100
1238
|
let callback;
|
|
1101
1239
|
const firstArg = args[0];
|
|
1102
1240
|
if (typeof firstArg === "number") {
|
|
@@ -1111,8 +1249,10 @@ var Server2 = class extends EventEmitter6 {
|
|
|
1111
1249
|
} else if (firstArg && typeof firstArg === "object") {
|
|
1112
1250
|
port = firstArg.port || 3e3;
|
|
1113
1251
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
1252
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
1114
1253
|
callback = args[1];
|
|
1115
1254
|
}
|
|
1255
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
1116
1256
|
const self = this;
|
|
1117
1257
|
if (isNode) {
|
|
1118
1258
|
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
@@ -1125,11 +1265,19 @@ var Server2 = class extends EventEmitter6 {
|
|
|
1125
1265
|
self.emit("request", incomingMessage, serverResponse);
|
|
1126
1266
|
}
|
|
1127
1267
|
});
|
|
1128
|
-
|
|
1129
|
-
this.
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1268
|
+
if (fd !== void 0) {
|
|
1269
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
1270
|
+
this._listening = true;
|
|
1271
|
+
this.emit("listening");
|
|
1272
|
+
if (callback) callback();
|
|
1273
|
+
});
|
|
1274
|
+
} else {
|
|
1275
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
1276
|
+
this._listening = true;
|
|
1277
|
+
this.emit("listening");
|
|
1278
|
+
if (callback) callback();
|
|
1279
|
+
});
|
|
1280
|
+
}
|
|
1133
1281
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1134
1282
|
this.nativeServer.on("close", () => {
|
|
1135
1283
|
this._listening = false;
|