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.
Files changed (42) hide show
  1. package/Cargo.lock +1 -1
  2. package/Cargo.toml +1 -1
  3. package/README.md +20 -1
  4. package/dist/cli.cjs +2777 -321
  5. package/dist/cli.mjs +2764 -308
  6. package/dist/config.d.ts +6 -6
  7. package/dist/{contracts-BeW9k0yZ.d.ts → contracts-_0p1-15U.d.ts} +1 -1
  8. package/dist/coverage.d.ts +1 -1
  9. package/dist/dev-build.d.ts +3 -3
  10. package/dist/http.cjs +160 -41
  11. package/dist/http.d.ts +5 -11
  12. package/dist/http.js +160 -41
  13. package/dist/http.mjs +160 -41
  14. package/dist/https.cjs +194 -46
  15. package/dist/https.d.ts +3 -6
  16. package/dist/https.js +194 -46
  17. package/dist/https.mjs +194 -46
  18. package/dist/pm-node-shared-listener-bootstrap.cjs +75 -0
  19. package/dist/pm.cjs +2390 -160
  20. package/dist/pm.d.ts +83 -8
  21. package/dist/pm.js +2388 -188
  22. package/dist/pm.mjs +2380 -165
  23. package/dist/preview-build.d.ts +3 -3
  24. package/dist/server.cjs +417 -168
  25. package/dist/server.d.ts +4 -4
  26. package/dist/server.js +453 -179
  27. package/dist/server.mjs +417 -168
  28. package/dist/smtp-server.js +37 -12
  29. package/dist/test-reporter.d.ts +1 -1
  30. package/dist/test-runtime.d.ts +1 -1
  31. package/dist/{types-tJn88E1N.d.ts → types-BayMVo_k.d.ts} +39 -3
  32. package/dist/{types-CIhpN1-K.d.ts → types-C70T-42Z.d.ts} +1 -1
  33. package/dist/{types-DAisuVr5.d.ts → types-DPOgoGs-.d.ts} +7 -1
  34. package/dist/{state-DvEkDehk.d.ts → types-fiLday0L.d.ts} +96 -92
  35. package/dist/types.d.ts +4 -0
  36. package/dist/{websocket-XfyK23zD.d.ts → websocket-BLBEAnhp.d.ts} +1 -1
  37. package/dist/ws.d.ts +3 -3
  38. package/dist/wss.cjs +194 -46
  39. package/dist/wss.d.ts +3 -3
  40. package/dist/wss.js +194 -46
  41. package/dist/wss.mjs +194 -46
  42. 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(optionsOrListener, requestListener) {
607
- return new Server(typeof optionsOrListener === "function" ? optionsOrListener : requestListener);
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
- this.nativeServer.listen(port, hostname, () => {
666
- this._listening = true;
667
- this.emit("listening");
668
- if (callback) callback();
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
- return new Response(body, {
798
- status: statusCode,
799
- statusText: statusMessage,
800
- headers
801
- });
825
+ if (!responseReady) {
826
+ serverResponse.end();
802
827
  }
803
- return new Promise((resolve) => {
804
- serverResponse.end = (chunk) => {
805
- if (chunk !== void 0) {
806
- body += chunk;
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: createErrorResponse
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
- handler: (req) => {
824
- return new Promise((resolve) => {
825
- const incomingMessage = new IncomingMessage(req);
826
- const serverResponse = new ServerResponse();
827
- serverResponse._setResolver(resolve);
828
- if (self.requestListener) {
829
- self.requestListener(incomingMessage, serverResponse);
830
- } else {
831
- self.emit("request", incomingMessage, serverResponse);
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
- onError: (error) => {
836
- this.emit("error", error);
837
- return createErrorResponse();
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
- this.nativeServer.listen(port, hostname, () => {
1494
- this._listening = true;
1495
- this.emit("listening");
1496
- if (callback) callback();
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-XfyK23zD.js';
2
- export { C as CLOSE_CODES, D as Data } from './websocket-XfyK23zD.js';
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-DAisuVr5.js';
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(optionsOrListener, requestListener) {
614
- return new Server(typeof optionsOrListener === "function" ? optionsOrListener : requestListener);
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
- this.nativeServer.listen(port, hostname, () => {
673
- this._listening = true;
674
- this.emit("listening");
675
- if (callback) callback();
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
- return new Response(body, {
805
- status: statusCode,
806
- statusText: statusMessage,
807
- headers
808
- });
832
+ if (!responseReady) {
833
+ serverResponse.end();
809
834
  }
810
- return new Promise((resolve) => {
811
- serverResponse.end = (chunk) => {
812
- if (chunk !== void 0) {
813
- body += chunk;
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: createErrorResponse
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
- handler: (req) => {
831
- return new Promise((resolve) => {
832
- const incomingMessage = new IncomingMessage(req);
833
- const serverResponse = new ServerResponse();
834
- serverResponse._setResolver(resolve);
835
- if (self.requestListener) {
836
- self.requestListener(incomingMessage, serverResponse);
837
- } else {
838
- self.emit("request", incomingMessage, serverResponse);
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
- onError: (error) => {
843
- this.emit("error", error);
844
- return createErrorResponse();
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
- this.nativeServer.listen(port, hostname, () => {
1487
- this._listening = true;
1488
- this.emit("listening");
1489
- if (callback) callback();
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;