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/wss.cjs
CHANGED
|
@@ -603,8 +603,9 @@ var init_runtime2 = __esm({
|
|
|
603
603
|
});
|
|
604
604
|
|
|
605
605
|
// src/server/http/server-runtime.ts
|
|
606
|
-
function createServer(
|
|
607
|
-
|
|
606
|
+
function createServer(arg1, arg2) {
|
|
607
|
+
const requestListener = typeof arg1 === "function" ? arg1 : arg2;
|
|
608
|
+
return new Server(requestListener);
|
|
608
609
|
}
|
|
609
610
|
var import_node_events5, Server;
|
|
610
611
|
var init_server_runtime = __esm({
|
|
@@ -629,9 +630,28 @@ var init_server_runtime = __esm({
|
|
|
629
630
|
unregisterWebSocketServer(wsServer) {
|
|
630
631
|
this._bunWebSocketServers.delete(wsServer);
|
|
631
632
|
}
|
|
633
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
634
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
635
|
+
return explicitFd;
|
|
636
|
+
}
|
|
637
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
638
|
+
if (!fdValue) {
|
|
639
|
+
return void 0;
|
|
640
|
+
}
|
|
641
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
642
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
643
|
+
return void 0;
|
|
644
|
+
}
|
|
645
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
646
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
647
|
+
return void 0;
|
|
648
|
+
}
|
|
649
|
+
return parsedFd;
|
|
650
|
+
}
|
|
632
651
|
listen(...args) {
|
|
633
652
|
let port = 3e3;
|
|
634
653
|
let hostname = "0.0.0.0";
|
|
654
|
+
let fd;
|
|
635
655
|
let callback;
|
|
636
656
|
const firstArg = args[0];
|
|
637
657
|
if (typeof firstArg === "number") {
|
|
@@ -646,8 +666,10 @@ var init_server_runtime = __esm({
|
|
|
646
666
|
} else if (firstArg && typeof firstArg === "object") {
|
|
647
667
|
port = firstArg.port || 3e3;
|
|
648
668
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
669
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
649
670
|
callback = args[1];
|
|
650
671
|
}
|
|
672
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
651
673
|
const self = this;
|
|
652
674
|
if (isNode) {
|
|
653
675
|
this.nativeServer = http.createServer((req, res) => {
|
|
@@ -662,11 +684,19 @@ var init_server_runtime = __esm({
|
|
|
662
684
|
this.nativeServer.on("upgrade", (req, socket, head) => {
|
|
663
685
|
self.emit("upgrade", req, socket, head);
|
|
664
686
|
});
|
|
665
|
-
|
|
666
|
-
this.
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
687
|
+
if (fd !== void 0) {
|
|
688
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
689
|
+
this._listening = true;
|
|
690
|
+
this.emit("listening");
|
|
691
|
+
if (callback) callback();
|
|
692
|
+
});
|
|
693
|
+
} else {
|
|
694
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
695
|
+
this._listening = true;
|
|
696
|
+
this.emit("listening");
|
|
697
|
+
if (callback) callback();
|
|
698
|
+
});
|
|
699
|
+
}
|
|
670
700
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
671
701
|
this.nativeServer.on("close", () => {
|
|
672
702
|
this._listening = false;
|
|
@@ -785,7 +815,6 @@ var init_server_runtime = __esm({
|
|
|
785
815
|
this.writeHead(statusCode);
|
|
786
816
|
}
|
|
787
817
|
responseReady = true;
|
|
788
|
-
return this;
|
|
789
818
|
}
|
|
790
819
|
};
|
|
791
820
|
if (self.requestListener) {
|
|
@@ -793,51 +822,141 @@ var init_server_runtime = __esm({
|
|
|
793
822
|
} else {
|
|
794
823
|
self.emit("request", incomingMessage, serverResponse);
|
|
795
824
|
}
|
|
796
|
-
if (responseReady) {
|
|
797
|
-
|
|
798
|
-
status: statusCode,
|
|
799
|
-
statusText: statusMessage,
|
|
800
|
-
headers
|
|
801
|
-
});
|
|
825
|
+
if (!responseReady) {
|
|
826
|
+
serverResponse.end();
|
|
802
827
|
}
|
|
803
|
-
return new
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
}
|
|
808
|
-
resolve(new Response(body, {
|
|
809
|
-
status: statusCode,
|
|
810
|
-
statusText: statusMessage,
|
|
811
|
-
headers
|
|
812
|
-
}));
|
|
813
|
-
};
|
|
828
|
+
return new Response(body, {
|
|
829
|
+
status: statusCode,
|
|
830
|
+
statusText: statusMessage,
|
|
831
|
+
headers
|
|
814
832
|
});
|
|
815
833
|
},
|
|
816
|
-
error:
|
|
834
|
+
error: (err) => {
|
|
835
|
+
this.emit("error", err);
|
|
836
|
+
return createErrorResponse();
|
|
837
|
+
}
|
|
817
838
|
});
|
|
839
|
+
this._listening = true;
|
|
818
840
|
emitListeningWithCallback(this, callback);
|
|
841
|
+
this.nativeServer.stop = this.nativeServer.stop || this.nativeServer.close;
|
|
842
|
+
this.nativeServer.close = this.nativeServer.close || this.nativeServer.stop;
|
|
843
|
+
this.nativeServer.on?.("close", () => {
|
|
844
|
+
this._listening = false;
|
|
845
|
+
this.emit("close");
|
|
846
|
+
});
|
|
819
847
|
} else if (isDeno) {
|
|
848
|
+
const server = this;
|
|
820
849
|
this.nativeServer = Deno.serve({
|
|
821
850
|
port,
|
|
822
|
-
hostname
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
851
|
+
hostname
|
|
852
|
+
}, async (req) => {
|
|
853
|
+
const urlObj = new URL(req.url);
|
|
854
|
+
const requestUrl = urlObj.pathname + urlObj.search;
|
|
855
|
+
const incomingHeaders = headersToRecord(req.headers);
|
|
856
|
+
const rawHeaders = headersToRawHeaders(req.headers);
|
|
857
|
+
const bodyChunks = [];
|
|
858
|
+
const responseHeaders = new Headers();
|
|
859
|
+
let statusCode = 200;
|
|
860
|
+
let statusText = "OK";
|
|
861
|
+
let responseClosed = false;
|
|
862
|
+
const incomingMessage = {
|
|
863
|
+
method: req.method,
|
|
864
|
+
url: requestUrl,
|
|
865
|
+
headers: incomingHeaders,
|
|
866
|
+
httpVersion: "1.1",
|
|
867
|
+
rawHeaders,
|
|
868
|
+
_req: req,
|
|
869
|
+
text: () => req.text(),
|
|
870
|
+
json: () => req.json()
|
|
871
|
+
};
|
|
872
|
+
const serverResponse = {
|
|
873
|
+
statusCode: 200,
|
|
874
|
+
statusMessage: "OK",
|
|
875
|
+
headersSent: false,
|
|
876
|
+
setHeader(name, value) {
|
|
877
|
+
responseHeaders.set(name, Array.isArray(value) ? value.join(", ") : String(value));
|
|
878
|
+
return this;
|
|
879
|
+
},
|
|
880
|
+
getHeader(name) {
|
|
881
|
+
return responseHeaders.get(name) ?? void 0;
|
|
882
|
+
},
|
|
883
|
+
getHeaders() {
|
|
884
|
+
const headers = {};
|
|
885
|
+
responseHeaders.forEach((value, key) => {
|
|
886
|
+
headers[key] = value;
|
|
887
|
+
});
|
|
888
|
+
return headers;
|
|
889
|
+
},
|
|
890
|
+
writeHead(status, arg2, arg3) {
|
|
891
|
+
statusCode = status;
|
|
892
|
+
this.statusCode = status;
|
|
893
|
+
this.headersSent = true;
|
|
894
|
+
if (typeof arg2 === "string") {
|
|
895
|
+
statusText = arg2;
|
|
896
|
+
this.statusMessage = arg2;
|
|
897
|
+
if (arg3) {
|
|
898
|
+
Object.entries(arg3).forEach(([key, value]) => {
|
|
899
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
} else if (arg2) {
|
|
903
|
+
Object.entries(arg2).forEach(([key, value]) => {
|
|
904
|
+
responseHeaders.set(key, Array.isArray(value) ? value.join(", ") : String(value));
|
|
905
|
+
});
|
|
832
906
|
}
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
907
|
+
return this;
|
|
908
|
+
},
|
|
909
|
+
write(chunk) {
|
|
910
|
+
if (!this.headersSent) {
|
|
911
|
+
this.writeHead(statusCode);
|
|
912
|
+
}
|
|
913
|
+
if (typeof chunk === "string") {
|
|
914
|
+
bodyChunks.push(new TextEncoder().encode(chunk));
|
|
915
|
+
} else if (chunk instanceof Uint8Array) {
|
|
916
|
+
bodyChunks.push(chunk);
|
|
917
|
+
} else if (chunk !== void 0 && chunk !== null) {
|
|
918
|
+
bodyChunks.push(new TextEncoder().encode(String(chunk)));
|
|
919
|
+
}
|
|
920
|
+
return true;
|
|
921
|
+
},
|
|
922
|
+
end(chunk) {
|
|
923
|
+
if (chunk !== void 0) {
|
|
924
|
+
this.write(chunk);
|
|
925
|
+
}
|
|
926
|
+
if (!this.headersSent) {
|
|
927
|
+
this.writeHead(statusCode);
|
|
928
|
+
}
|
|
929
|
+
responseClosed = true;
|
|
930
|
+
}
|
|
931
|
+
};
|
|
932
|
+
if (server.requestListener) {
|
|
933
|
+
server.requestListener(incomingMessage, serverResponse);
|
|
934
|
+
} else {
|
|
935
|
+
server.emit("request", incomingMessage, serverResponse);
|
|
936
|
+
}
|
|
937
|
+
if (!responseClosed) {
|
|
938
|
+
serverResponse.end();
|
|
838
939
|
}
|
|
940
|
+
const body = bodyChunks.length === 0 ? void 0 : (() => {
|
|
941
|
+
const totalLength = bodyChunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
942
|
+
const output = new ArrayBuffer(totalLength);
|
|
943
|
+
const combined = new Uint8Array(output);
|
|
944
|
+
let offset = 0;
|
|
945
|
+
for (const chunk of bodyChunks) {
|
|
946
|
+
combined.set(chunk, offset);
|
|
947
|
+
offset += chunk.length;
|
|
948
|
+
}
|
|
949
|
+
return output;
|
|
950
|
+
})();
|
|
951
|
+
return new Response(body, {
|
|
952
|
+
status: statusCode,
|
|
953
|
+
statusText,
|
|
954
|
+
headers: responseHeaders
|
|
955
|
+
});
|
|
839
956
|
});
|
|
957
|
+
this._listening = true;
|
|
840
958
|
emitListeningWithCallback(this, callback);
|
|
959
|
+
this.nativeServer.finished.then(() => closeAndEmit(this)).catch((err) => this.emit("error", err));
|
|
841
960
|
}
|
|
842
961
|
return this;
|
|
843
962
|
}
|
|
@@ -1459,9 +1578,28 @@ var Server2 = class extends import_node_events6.EventEmitter {
|
|
|
1459
1578
|
this.options = options;
|
|
1460
1579
|
this.requestListener = requestListener;
|
|
1461
1580
|
}
|
|
1581
|
+
resolvePmInheritedFd(explicitPort, explicitFd) {
|
|
1582
|
+
if (typeof explicitFd === "number" && Number.isInteger(explicitFd) && explicitFd >= 0) {
|
|
1583
|
+
return explicitFd;
|
|
1584
|
+
}
|
|
1585
|
+
const fdValue = process.env.ELIT_PM_LISTEN_FD;
|
|
1586
|
+
if (!fdValue) {
|
|
1587
|
+
return void 0;
|
|
1588
|
+
}
|
|
1589
|
+
const parsedFd = Number.parseInt(fdValue, 10);
|
|
1590
|
+
if (!Number.isInteger(parsedFd) || parsedFd < 0) {
|
|
1591
|
+
return void 0;
|
|
1592
|
+
}
|
|
1593
|
+
const publicPort = Number.parseInt(process.env.ELIT_PM_PUBLIC_PORT ?? process.env.ELIT_PM_PORT ?? "", 10);
|
|
1594
|
+
if (Number.isInteger(explicitPort) && Number.isInteger(publicPort) && explicitPort !== publicPort) {
|
|
1595
|
+
return void 0;
|
|
1596
|
+
}
|
|
1597
|
+
return parsedFd;
|
|
1598
|
+
}
|
|
1462
1599
|
listen(...args) {
|
|
1463
1600
|
let port = 3e3;
|
|
1464
1601
|
let hostname = "0.0.0.0";
|
|
1602
|
+
let fd;
|
|
1465
1603
|
let callback;
|
|
1466
1604
|
const firstArg = args[0];
|
|
1467
1605
|
if (typeof firstArg === "number") {
|
|
@@ -1476,8 +1614,10 @@ var Server2 = class extends import_node_events6.EventEmitter {
|
|
|
1476
1614
|
} else if (firstArg && typeof firstArg === "object") {
|
|
1477
1615
|
port = firstArg.port || 3e3;
|
|
1478
1616
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
1617
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
1479
1618
|
callback = args[1];
|
|
1480
1619
|
}
|
|
1620
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
1481
1621
|
const self = this;
|
|
1482
1622
|
if (isNode) {
|
|
1483
1623
|
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
@@ -1490,11 +1630,19 @@ var Server2 = class extends import_node_events6.EventEmitter {
|
|
|
1490
1630
|
self.emit("request", incomingMessage, serverResponse);
|
|
1491
1631
|
}
|
|
1492
1632
|
});
|
|
1493
|
-
|
|
1494
|
-
this.
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1633
|
+
if (fd !== void 0) {
|
|
1634
|
+
this.nativeServer.listen({ fd, exclusive: false }, () => {
|
|
1635
|
+
this._listening = true;
|
|
1636
|
+
this.emit("listening");
|
|
1637
|
+
if (callback) callback();
|
|
1638
|
+
});
|
|
1639
|
+
} else {
|
|
1640
|
+
this.nativeServer.listen(port, hostname, () => {
|
|
1641
|
+
this._listening = true;
|
|
1642
|
+
this.emit("listening");
|
|
1643
|
+
if (callback) callback();
|
|
1644
|
+
});
|
|
1645
|
+
}
|
|
1498
1646
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1499
1647
|
this.nativeServer.on("close", () => {
|
|
1500
1648
|
this._listening = false;
|
package/dist/wss.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { W as WebSocket, S as ServerOptions, R as ReadyState } from './websocket-
|
|
2
|
-
export { C as CLOSE_CODES, D as Data } from './websocket-
|
|
1
|
+
import { W as WebSocket, S as ServerOptions, R as ReadyState } from './websocket-BLBEAnhp.js';
|
|
2
|
+
export { C as CLOSE_CODES, D as Data } from './websocket-BLBEAnhp.js';
|
|
3
3
|
import { EventEmitter } from 'events';
|
|
4
|
-
import { I as IncomingMessage } from './types-
|
|
4
|
+
import { I as IncomingMessage } from './types-DPOgoGs-.js';
|
|
5
5
|
import 'node:events';
|
|
6
6
|
|
|
7
7
|
/**
|
package/dist/wss.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
|
}
|
|
@@ -1452,9 +1571,28 @@
|
|
|
1452
1571
|
this.options = options;
|
|
1453
1572
|
this.requestListener = requestListener;
|
|
1454
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
|
+
}
|
|
1455
1592
|
listen(...args) {
|
|
1456
1593
|
let port = 3e3;
|
|
1457
1594
|
let hostname = "0.0.0.0";
|
|
1595
|
+
let fd;
|
|
1458
1596
|
let callback;
|
|
1459
1597
|
const firstArg = args[0];
|
|
1460
1598
|
if (typeof firstArg === "number") {
|
|
@@ -1469,8 +1607,10 @@
|
|
|
1469
1607
|
} else if (firstArg && typeof firstArg === "object") {
|
|
1470
1608
|
port = firstArg.port || 3e3;
|
|
1471
1609
|
hostname = firstArg.hostname || "0.0.0.0";
|
|
1610
|
+
fd = typeof firstArg.fd === "number" ? firstArg.fd : void 0;
|
|
1472
1611
|
callback = args[1];
|
|
1473
1612
|
}
|
|
1613
|
+
fd = this.resolvePmInheritedFd(firstArg && typeof firstArg === "object" ? firstArg.port : port, fd);
|
|
1474
1614
|
const self = this;
|
|
1475
1615
|
if (isNode) {
|
|
1476
1616
|
const { IncomingMessage: IncomingMessage2, ServerResponse: ServerResponse2 } = loadHttpClasses();
|
|
@@ -1483,11 +1623,19 @@
|
|
|
1483
1623
|
self.emit("request", incomingMessage, serverResponse);
|
|
1484
1624
|
}
|
|
1485
1625
|
});
|
|
1486
|
-
|
|
1487
|
-
this.
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
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
|
+
}
|
|
1491
1639
|
this.nativeServer.on("error", (err) => this.emit("error", err));
|
|
1492
1640
|
this.nativeServer.on("close", () => {
|
|
1493
1641
|
this._listening = false;
|