@emeryld/rrroutes-client 2.2.12 → 2.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.
package/dist/index.mjs CHANGED
@@ -751,72 +751,84 @@ function normalizeRooms(rooms) {
751
751
  }
752
752
  return normalized;
753
753
  }
754
+ function mergeRoomState(prev, toRoomsResult) {
755
+ const merged = new Set(prev.rooms);
756
+ for (const r of normalizeRooms(toRoomsResult.rooms)) merged.add(r);
757
+ return {
758
+ rooms: Array.from(merged),
759
+ joinMeta: toRoomsResult.joinMeta ?? prev.joinMeta,
760
+ leaveMeta: toRoomsResult.leaveMeta ?? prev.leaveMeta
761
+ };
762
+ }
754
763
  function roomsFromData(data, toRooms) {
755
- if (data == null) return [];
756
- const merge = /* @__PURE__ */ new Set();
764
+ if (data == null) return { rooms: [] };
765
+ let state = { rooms: [] };
757
766
  const add = (input) => {
758
- for (const r of normalizeRooms(input)) merge.add(r);
767
+ state = mergeRoomState(state, toRooms(input));
759
768
  };
760
769
  const maybePages = data?.pages;
761
770
  if (Array.isArray(maybePages)) {
762
- for (const page of maybePages) add(toRooms(page));
763
- return Array.from(merge);
771
+ for (const page of maybePages) add(page);
772
+ return state;
764
773
  }
765
- add(toRooms(data));
766
- return Array.from(merge);
774
+ add(data);
775
+ return state;
767
776
  }
768
777
  function buildSocketedRoute(options) {
769
- const { built, event, toRooms, applyMessage, joinMeta, leaveMeta, useSocketClient: useSocketClient2 } = options;
778
+ const { built, toRooms, applySocket, useSocketClient: useSocketClient2 } = options;
770
779
  return (...useArgs) => {
771
780
  const client = useSocketClient2();
772
781
  const endpointResult = built.useEndpoint(...useArgs);
773
782
  const argsKey = useMemo2(() => JSON.stringify(useArgs[0] ?? null), [useArgs]);
774
- const [rooms, setRooms] = useState2(
783
+ const [roomState, setRoomState] = useState2(
775
784
  () => roomsFromData(endpointResult.data, toRooms)
776
785
  );
777
- const roomsKey = useMemo2(() => rooms.join("|"), [rooms]);
786
+ const roomsKey = useMemo2(() => roomState.rooms.join("|"), [roomState.rooms]);
787
+ const joinMetaKey = useMemo2(() => JSON.stringify(roomState.joinMeta ?? null), [roomState.joinMeta]);
788
+ const leaveMetaKey = useMemo2(() => JSON.stringify(roomState.leaveMeta ?? null), [roomState.leaveMeta]);
778
789
  useEffect2(() => {
779
790
  const unsubscribe = endpointResult.onReceive((data) => {
780
- setRooms((prev) => {
781
- const next = normalizeRooms(toRooms(data));
782
- if (next.length === 0) return prev;
783
- const merged = new Set(prev);
784
- next.forEach((r) => merged.add(r));
785
- return Array.from(merged);
786
- });
791
+ setRoomState((prev) => mergeRoomState(prev, toRooms(data)));
787
792
  });
788
793
  return unsubscribe;
789
794
  }, [endpointResult, toRooms]);
790
795
  useEffect2(() => {
791
- setRooms(roomsFromData(endpointResult.data, toRooms));
796
+ setRoomState(roomsFromData(endpointResult.data, toRooms));
792
797
  }, [endpointResult.data, toRooms]);
793
798
  useEffect2(() => {
794
- if (rooms.length === 0) return;
799
+ if (roomState.rooms.length === 0) return;
800
+ const { joinMeta, leaveMeta } = roomState;
801
+ if (!joinMeta || !leaveMeta) return;
795
802
  let active = true;
796
803
  (async () => {
797
804
  try {
798
- await client.joinRooms(rooms, joinMeta);
805
+ await client.joinRooms(roomState.rooms, joinMeta);
799
806
  } catch {
800
807
  }
801
808
  })();
802
809
  return () => {
803
- if (!active || rooms.length === 0) return;
810
+ if (!active || roomState.rooms.length === 0) return;
804
811
  active = false;
805
- void client.leaveRooms(rooms, leaveMeta).catch(() => {
812
+ void client.leaveRooms(roomState.rooms, leaveMeta).catch(() => {
806
813
  });
807
814
  };
808
- }, [client, joinMeta, leaveMeta, roomsKey]);
815
+ }, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);
809
816
  useEffect2(() => {
810
- const unsubscribe = client.on(event, (payload, meta) => {
811
- built.setData((prev) => {
812
- const next = applyMessage(prev, payload, meta);
813
- setRooms(roomsFromData(next, toRooms));
814
- return next;
815
- }, ...useArgs);
816
- });
817
- return unsubscribe;
818
- }, [client, event, applyMessage, built, argsKey]);
819
- return { ...endpointResult, rooms };
817
+ const entries = Object.entries(applySocket).filter(
818
+ ([_event, fn]) => typeof fn === "function"
819
+ );
820
+ const unsubscribes = entries.map(
821
+ ([ev, fn]) => client.on(ev, (payload, meta) => {
822
+ built.setData((prev) => {
823
+ const next = fn(prev, payload, meta);
824
+ setRoomState(roomsFromData(next, toRooms));
825
+ return next;
826
+ }, ...useArgs);
827
+ })
828
+ );
829
+ return () => unsubscribes.forEach((u) => u?.());
830
+ }, [client, applySocket, built, argsKey, toRooms]);
831
+ return { ...endpointResult, rooms: roomState.rooms };
820
832
  };
821
833
  }
822
834