@spoosh/react 0.15.2 → 0.15.3

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
@@ -744,6 +744,7 @@ function createUseSubscription(options) {
744
744
  await controller.subscribe();
745
745
  }, [controller]);
746
746
  const loading = isPending;
747
+ const stateWithQueue = state;
747
748
  return {
748
749
  meta: {},
749
750
  data: state.data,
@@ -752,6 +753,8 @@ function createUseSubscription(options) {
752
753
  isConnected: state.isConnected,
753
754
  _queryKey: queryKey,
754
755
  _subscriptionVersion: subscriptionVersionRef.current,
756
+ _messageQueue: stateWithQueue._messageQueue,
757
+ _queueIndex: stateWithQueue._queueIndex ?? 0,
755
758
  trigger,
756
759
  disconnect
757
760
  };
@@ -844,72 +847,82 @@ function createUseSSE(options) {
844
847
  });
845
848
  const prevVersionRef = (0, import_react6.useRef)(subscription._subscriptionVersion);
846
849
  const lastMessageIndexRef = (0, import_react6.useRef)({});
850
+ const lastProcessedQueueIndexRef = (0, import_react6.useRef)(0);
847
851
  (0, import_react6.useEffect)(() => {
848
852
  if (subscription._subscriptionVersion !== prevVersionRef.current) {
849
853
  setAccumulatedData({});
850
854
  lastMessageIndexRef.current = {};
855
+ lastProcessedQueueIndexRef.current = 0;
851
856
  }
852
857
  prevVersionRef.current = subscription._subscriptionVersion;
853
858
  }, [subscription._subscriptionVersion]);
859
+ const subscriptionState = subscription;
860
+ const messageQueue = subscriptionState._messageQueue ?? [];
861
+ const queueIndex = subscriptionState._queueIndex ?? 0;
854
862
  (0, import_react6.useEffect)(() => {
855
- const data = subscription.data;
856
- if (!data) {
863
+ if (queueIndex <= lastProcessedQueueIndexRef.current) {
857
864
  return;
858
865
  }
859
- if (eventSet && !eventSet.has(data.event)) {
860
- return;
861
- }
862
- const parser = transport.utils.resolveParser(
863
- parseRef.current,
864
- data.event
865
- );
866
- let parsed;
867
- try {
868
- parsed = parser(data.data);
869
- } catch {
870
- parsed = data.data;
871
- }
872
- if (parsed === void 0) {
873
- return;
874
- }
875
- const accumulator = transport.utils.resolveAccumulator(
876
- accumulateRef.current,
877
- data.event
878
- );
879
- const parsedObj = parsed;
880
- const messageIndex = typeof parsedObj?.index === "number" ? parsedObj.index : void 0;
881
- if (messageIndex !== void 0) {
882
- const lastIndex = lastMessageIndexRef.current[data.event];
883
- if (lastIndex !== void 0 && messageIndex < lastIndex) {
884
- setAccumulatedData({});
885
- lastMessageIndexRef.current = {};
866
+ const startIndex = lastProcessedQueueIndexRef.current;
867
+ const messagesToProcess = messageQueue.slice(startIndex);
868
+ lastProcessedQueueIndexRef.current = queueIndex;
869
+ for (const data of messagesToProcess) {
870
+ if (!data) continue;
871
+ if (eventSet && !eventSet.has(data.event)) {
872
+ continue;
886
873
  }
887
- lastMessageIndexRef.current[data.event] = messageIndex;
888
- }
889
- setAccumulatedData((prev) => {
890
- const previousEventData = prev[data.event];
891
- let newEventData;
874
+ const parser = transport.utils.resolveParser(
875
+ parseRef.current,
876
+ data.event
877
+ );
878
+ let parsed;
892
879
  try {
893
- newEventData = accumulator(previousEventData, parsed);
880
+ parsed = parser(data.data);
894
881
  } catch {
895
- newEventData = parsed;
882
+ parsed = data.data;
896
883
  }
897
- const newAccumulated = {
898
- ...prev,
899
- [data.event]: newEventData
900
- };
901
- eventEmitter?.emit(
902
- "spoosh:subscription:accumulate",
903
- {
904
- queryKey: subscription._queryKey,
905
- eventType: data.event,
906
- accumulatedData: newAccumulated,
907
- timestamp: Date.now()
908
- }
884
+ if (parsed === void 0) {
885
+ continue;
886
+ }
887
+ const accumulator = transport.utils.resolveAccumulator(
888
+ accumulateRef.current,
889
+ data.event
909
890
  );
910
- return newAccumulated;
911
- });
912
- }, [subscription.data, subscription._queryKey, eventSet]);
891
+ const parsedObj = parsed;
892
+ const messageIndex = typeof parsedObj?.index === "number" ? parsedObj.index : void 0;
893
+ if (messageIndex !== void 0) {
894
+ const lastIndex = lastMessageIndexRef.current[data.event];
895
+ if (lastIndex !== void 0 && messageIndex < lastIndex) {
896
+ setAccumulatedData({});
897
+ lastMessageIndexRef.current = {};
898
+ }
899
+ lastMessageIndexRef.current[data.event] = messageIndex;
900
+ }
901
+ setAccumulatedData((prev) => {
902
+ const previousEventData = prev[data.event];
903
+ let newEventData;
904
+ try {
905
+ newEventData = accumulator(previousEventData, parsed);
906
+ } catch {
907
+ newEventData = parsed;
908
+ }
909
+ const newAccumulated = {
910
+ ...prev,
911
+ [data.event]: newEventData
912
+ };
913
+ eventEmitter?.emit(
914
+ "spoosh:subscription:accumulate",
915
+ {
916
+ queryKey: subscription._queryKey,
917
+ eventType: data.event,
918
+ accumulatedData: newAccumulated,
919
+ timestamp: Date.now()
920
+ }
921
+ );
922
+ return newAccumulated;
923
+ });
924
+ }
925
+ }, [queueIndex, subscription._queryKey, eventSet]);
913
926
  const reset = (0, import_react6.useCallback)(() => {
914
927
  setAccumulatedData({});
915
928
  }, []);
package/dist/index.mjs CHANGED
@@ -768,6 +768,7 @@ function createUseSubscription(options) {
768
768
  await controller.subscribe();
769
769
  }, [controller]);
770
770
  const loading = isPending;
771
+ const stateWithQueue = state;
771
772
  return {
772
773
  meta: {},
773
774
  data: state.data,
@@ -776,6 +777,8 @@ function createUseSubscription(options) {
776
777
  isConnected: state.isConnected,
777
778
  _queryKey: queryKey,
778
779
  _subscriptionVersion: subscriptionVersionRef.current,
780
+ _messageQueue: stateWithQueue._messageQueue,
781
+ _queueIndex: stateWithQueue._queueIndex ?? 0,
779
782
  trigger,
780
783
  disconnect
781
784
  };
@@ -868,72 +871,82 @@ function createUseSSE(options) {
868
871
  });
869
872
  const prevVersionRef = useRef6(subscription._subscriptionVersion);
870
873
  const lastMessageIndexRef = useRef6({});
874
+ const lastProcessedQueueIndexRef = useRef6(0);
871
875
  useEffect5(() => {
872
876
  if (subscription._subscriptionVersion !== prevVersionRef.current) {
873
877
  setAccumulatedData({});
874
878
  lastMessageIndexRef.current = {};
879
+ lastProcessedQueueIndexRef.current = 0;
875
880
  }
876
881
  prevVersionRef.current = subscription._subscriptionVersion;
877
882
  }, [subscription._subscriptionVersion]);
883
+ const subscriptionState = subscription;
884
+ const messageQueue = subscriptionState._messageQueue ?? [];
885
+ const queueIndex = subscriptionState._queueIndex ?? 0;
878
886
  useEffect5(() => {
879
- const data = subscription.data;
880
- if (!data) {
887
+ if (queueIndex <= lastProcessedQueueIndexRef.current) {
881
888
  return;
882
889
  }
883
- if (eventSet && !eventSet.has(data.event)) {
884
- return;
885
- }
886
- const parser = transport.utils.resolveParser(
887
- parseRef.current,
888
- data.event
889
- );
890
- let parsed;
891
- try {
892
- parsed = parser(data.data);
893
- } catch {
894
- parsed = data.data;
895
- }
896
- if (parsed === void 0) {
897
- return;
898
- }
899
- const accumulator = transport.utils.resolveAccumulator(
900
- accumulateRef.current,
901
- data.event
902
- );
903
- const parsedObj = parsed;
904
- const messageIndex = typeof parsedObj?.index === "number" ? parsedObj.index : void 0;
905
- if (messageIndex !== void 0) {
906
- const lastIndex = lastMessageIndexRef.current[data.event];
907
- if (lastIndex !== void 0 && messageIndex < lastIndex) {
908
- setAccumulatedData({});
909
- lastMessageIndexRef.current = {};
890
+ const startIndex = lastProcessedQueueIndexRef.current;
891
+ const messagesToProcess = messageQueue.slice(startIndex);
892
+ lastProcessedQueueIndexRef.current = queueIndex;
893
+ for (const data of messagesToProcess) {
894
+ if (!data) continue;
895
+ if (eventSet && !eventSet.has(data.event)) {
896
+ continue;
910
897
  }
911
- lastMessageIndexRef.current[data.event] = messageIndex;
912
- }
913
- setAccumulatedData((prev) => {
914
- const previousEventData = prev[data.event];
915
- let newEventData;
898
+ const parser = transport.utils.resolveParser(
899
+ parseRef.current,
900
+ data.event
901
+ );
902
+ let parsed;
916
903
  try {
917
- newEventData = accumulator(previousEventData, parsed);
904
+ parsed = parser(data.data);
918
905
  } catch {
919
- newEventData = parsed;
906
+ parsed = data.data;
920
907
  }
921
- const newAccumulated = {
922
- ...prev,
923
- [data.event]: newEventData
924
- };
925
- eventEmitter?.emit(
926
- "spoosh:subscription:accumulate",
927
- {
928
- queryKey: subscription._queryKey,
929
- eventType: data.event,
930
- accumulatedData: newAccumulated,
931
- timestamp: Date.now()
932
- }
908
+ if (parsed === void 0) {
909
+ continue;
910
+ }
911
+ const accumulator = transport.utils.resolveAccumulator(
912
+ accumulateRef.current,
913
+ data.event
933
914
  );
934
- return newAccumulated;
935
- });
936
- }, [subscription.data, subscription._queryKey, eventSet]);
915
+ const parsedObj = parsed;
916
+ const messageIndex = typeof parsedObj?.index === "number" ? parsedObj.index : void 0;
917
+ if (messageIndex !== void 0) {
918
+ const lastIndex = lastMessageIndexRef.current[data.event];
919
+ if (lastIndex !== void 0 && messageIndex < lastIndex) {
920
+ setAccumulatedData({});
921
+ lastMessageIndexRef.current = {};
922
+ }
923
+ lastMessageIndexRef.current[data.event] = messageIndex;
924
+ }
925
+ setAccumulatedData((prev) => {
926
+ const previousEventData = prev[data.event];
927
+ let newEventData;
928
+ try {
929
+ newEventData = accumulator(previousEventData, parsed);
930
+ } catch {
931
+ newEventData = parsed;
932
+ }
933
+ const newAccumulated = {
934
+ ...prev,
935
+ [data.event]: newEventData
936
+ };
937
+ eventEmitter?.emit(
938
+ "spoosh:subscription:accumulate",
939
+ {
940
+ queryKey: subscription._queryKey,
941
+ eventType: data.event,
942
+ accumulatedData: newAccumulated,
943
+ timestamp: Date.now()
944
+ }
945
+ );
946
+ return newAccumulated;
947
+ });
948
+ }
949
+ }, [queueIndex, subscription._queryKey, eventSet]);
937
950
  const reset = useCallback5(() => {
938
951
  setAccumulatedData({});
939
952
  }, []);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spoosh/react",
3
- "version": "0.15.2",
3
+ "version": "0.15.3",
4
4
  "license": "MIT",
5
5
  "description": "React hooks for Spoosh API toolkit",
6
6
  "keywords": [
@@ -34,7 +34,7 @@
34
34
  }
35
35
  },
36
36
  "peerDependencies": {
37
- "@spoosh/core": ">=0.18.2",
37
+ "@spoosh/core": ">=0.18.3",
38
38
  "@spoosh/transport-sse": ">=0.1.0",
39
39
  "react": "^18 || ^19"
40
40
  },
@@ -46,7 +46,7 @@
46
46
  "devDependencies": {
47
47
  "@testing-library/react": "^16.0.0",
48
48
  "jsdom": "^26.0.0",
49
- "@spoosh/core": "0.18.2",
49
+ "@spoosh/core": "0.18.3",
50
50
  "@spoosh/transport-sse": "0.1.2",
51
51
  "@spoosh/test-utils": "0.3.0"
52
52
  },