@ai-ecoverse/slicc-kernel 1.58.1 → 1.59.1

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/dist/index.js CHANGED
@@ -604,6 +604,11 @@ function blockedReason(url, e) {
604
604
  }
605
605
  return `${url}: ${e instanceof Error ? e.message : String(e)}`;
606
606
  }
607
+ function unopened(url, code) {
608
+ return Object.assign(new Error(`${url}: the WebSocket closed (${code}) before it opened`), {
609
+ status: 502
610
+ });
611
+ }
607
612
  function openWebSocket(Socket, request, withHeaders) {
608
613
  const { url, protocols, signal } = request;
609
614
  signal.throwIfAborted();
@@ -617,13 +622,22 @@ function openWebSocket(Socket, request, withHeaders) {
617
622
  const queue = new MessageQueue(() => socket.close(1e3, "too many waiting messages"));
618
623
  return new Promise((resolve, reject) => {
619
624
  let open = false;
625
+ let settled = false;
626
+ const fail = (error) => {
627
+ if (settled) return;
628
+ settled = true;
629
+ signal.removeEventListener("abort", abort);
630
+ reject(error);
631
+ };
620
632
  const abort = () => {
621
633
  socket.close(1e3, "aborted");
622
- reject(signal.reason);
634
+ fail(signal.reason);
623
635
  };
624
636
  signal.addEventListener("abort", abort, { once: true });
625
637
  socket.addEventListener("open", () => {
638
+ if (settled) return;
626
639
  open = true;
640
+ settled = true;
627
641
  signal.removeEventListener("abort", abort);
628
642
  resolve({
629
643
  protocol: socket.protocol,
@@ -639,15 +653,19 @@ function openWebSocket(Socket, request, withHeaders) {
639
653
  socket.addEventListener("message", (event) => {
640
654
  queue.push(typeof event.data === "string" ? event.data : new Uint8Array(event.data));
641
655
  });
656
+ socket.addEventListener("error", () => {
657
+ if (open || settled) return;
658
+ try {
659
+ socket.close();
660
+ } catch {
661
+ }
662
+ queue.end({ code: 1006, reason: "" });
663
+ fail(unopened(url, 1006));
664
+ });
642
665
  socket.addEventListener("close", (event) => {
643
666
  queue.end({ code: event.code, reason: event.reason });
644
667
  if (open) return;
645
- signal.removeEventListener("abort", abort);
646
- reject(
647
- Object.assign(new Error(`${url}: the WebSocket closed (${event.code}) before it opened`), {
648
- status: 502
649
- })
650
- );
668
+ fail(unopened(url, event.code));
651
669
  });
652
670
  });
653
671
  }