@chidchanun/bcp 0.2.13 → 0.2.14

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.
@@ -686,32 +686,62 @@ function createRealtimeSseResponse(hub, rawChannel, options = {}) {
686
686
  options.keepAliveMs ?? 15e3,
687
687
  "SSE keepAliveMs"
688
688
  );
689
+ let closed = false;
690
+ let controller;
691
+ let timer;
692
+ let unsubscribe = () => void 0;
693
+ let abortListener;
694
+ const cleanup = () => {
695
+ if (closed) {
696
+ return false;
697
+ }
698
+ closed = true;
699
+ if (timer) {
700
+ clearTimeout(timer);
701
+ timer = void 0;
702
+ }
703
+ unsubscribe();
704
+ unsubscribe = () => void 0;
705
+ if (options.signal && abortListener) {
706
+ options.signal.removeEventListener(
707
+ "abort",
708
+ abortListener
709
+ );
710
+ abortListener = void 0;
711
+ }
712
+ return true;
713
+ };
714
+ const close = () => {
715
+ if (!cleanup()) {
716
+ return;
717
+ }
718
+ const currentController = controller;
719
+ controller = void 0;
720
+ if (!currentController) {
721
+ return;
722
+ }
723
+ try {
724
+ currentController.close();
725
+ } catch {
726
+ }
727
+ };
728
+ const write = (value) => {
729
+ const currentController = controller;
730
+ if (closed || !currentController) {
731
+ return;
732
+ }
733
+ try {
734
+ currentController.enqueue(
735
+ encoder.encode(value)
736
+ );
737
+ } catch {
738
+ cleanup();
739
+ controller = void 0;
740
+ }
741
+ };
689
742
  const stream = new ReadableStream({
690
- start(controller) {
691
- let closed = false;
692
- let timer;
693
- let unsubscribe = () => void 0;
694
- const close = () => {
695
- if (closed) {
696
- return;
697
- }
698
- closed = true;
699
- if (timer) {
700
- clearTimeout(timer);
701
- }
702
- unsubscribe();
703
- try {
704
- controller.close();
705
- } catch {
706
- }
707
- };
708
- const write = (value) => {
709
- if (!closed) {
710
- controller.enqueue(
711
- encoder.encode(value)
712
- );
713
- }
714
- };
743
+ start(streamController) {
744
+ controller = streamController;
715
745
  if (retryMs !== void 0) {
716
746
  write(
717
747
  `retry: ${retryMs}
@@ -744,28 +774,35 @@ function createRealtimeSseResponse(hub, rawChannel, options = {}) {
744
774
 
745
775
  `
746
776
  );
747
- timer = setTimeout(
748
- keepAlive,
749
- keepAliveMs
750
- );
777
+ if (!closed) {
778
+ timer = setTimeout(
779
+ keepAlive,
780
+ keepAliveMs
781
+ );
782
+ }
751
783
  };
752
784
  timer = setTimeout(
753
785
  keepAlive,
754
786
  keepAliveMs
755
787
  );
756
788
  if (options.signal) {
789
+ abortListener = close;
757
790
  if (options.signal.aborted) {
758
791
  close();
759
792
  return;
760
793
  }
761
794
  options.signal.addEventListener(
762
795
  "abort",
763
- close,
796
+ abortListener,
764
797
  {
765
798
  once: true
766
799
  }
767
800
  );
768
801
  }
802
+ },
803
+ cancel() {
804
+ cleanup();
805
+ controller = void 0;
769
806
  }
770
807
  });
771
808
  const headers = new Headers(