@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/README.md +17 -14
- package/dist/index.cjs +45 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +45 -33
- package/dist/index.mjs.map +1 -1
- package/dist/sockets/socketedRoute/socket.client.helper.d.ts +13 -10
- package/package.json +2 -2
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
|
-
|
|
764
|
+
if (data == null) return { rooms: [] };
|
|
765
|
+
let state = { rooms: [] };
|
|
757
766
|
const add = (input) => {
|
|
758
|
-
|
|
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(
|
|
763
|
-
return
|
|
771
|
+
for (const page of maybePages) add(page);
|
|
772
|
+
return state;
|
|
764
773
|
}
|
|
765
|
-
add(
|
|
766
|
-
return
|
|
774
|
+
add(data);
|
|
775
|
+
return state;
|
|
767
776
|
}
|
|
768
777
|
function buildSocketedRoute(options) {
|
|
769
|
-
const { built,
|
|
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 [
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
815
|
+
}, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);
|
|
809
816
|
useEffect2(() => {
|
|
810
|
-
const
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
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
|
|