java-topology/defects/jitsi-meet-0004/patch/jitsi-meet-0004-visitors-map-dedup.patch

55 lines
2.4 KiB
Diff

# UNDF: UNDF-2026-000001109
# UNDF: (to be assigned)
--- a/react/features/visitors/middleware.ts
+++ b/react/features/visitors/middleware.ts
@@ -385,22 +385,28 @@ async function _getVisitorsList(store: IStore) {
initialVisitors => {
- const visitors = initialVisitors.map(v => ({ id: v.r, name: v.n }));
-
- dispatch(updateVisitorsList(visitors));
+ // Build Map once — O(V) total, then dispatch as array for UI
+ const visitorsMap = new Map(
+ initialVisitors.map(v => [ v.r, { id: v.r, name: v.n } ])
+ );
+ dispatch(updateVisitorsList(Array.from(visitorsMap.values())));
},
// Delta updates callback - apply incremental changes
updates => {
- let visitors = [ ...(getState()['features/visitors'].visitors ?? []) ];
-
- updates.forEach(u => {
- if (u.s === 'j') {
- const index = visitors.findIndex(v => v.id === u.r);
-
- if (index === -1) {
- visitors.push({ id: u.r, name: u.n });
- } else {
- visitors[index] = { id: u.r, name: u.n };
- }
- } else if (u.s === 'l') {
- visitors = visitors.filter(v => v.id !== u.r);
- }
- });
-
- dispatch(updateVisitorsList(visitors));
+ // Rebuild Map from current array — O(V) once per batch
+ const visitorsMap = new Map(
+ (getState()['features/visitors'].visitors ?? []).map(
+ (v: { id: string; name: string }) => [ v.id, v ]
+ )
+ );
+
+ // Apply each delta update — O(1) per update via Map
+ for (const u of updates) {
+ if (u.s === 'j') {
+ visitorsMap.set(u.r, { id: u.r, name: u.n }); // O(1)
+ } else if (u.s === 'l') {
+ visitorsMap.delete(u.r); // O(1)
+ }
+ }
+
+ // Convert back to array for Redux state — O(V) once per batch
+ dispatch(updateVisitorsList(Array.from(visitorsMap.values())));
},
getState()['features/base/jwt'].jwt);
}