From 0d00d57ae8d18d576c5386cf8d6668539ead97ae Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sat, 20 Jan 2024 13:23:45 +0100 Subject: [PATCH 1/2] fix: wrong arguments passed to multiSet on broadcast --- lib/Onyx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Onyx.js b/lib/Onyx.js index f9efe7984..68b627234 100644 --- a/lib/Onyx.js +++ b/lib/Onyx.js @@ -1596,7 +1596,7 @@ function subscribeToEvents() { set(data.key, data.value); break; case METHOD.MULTI_SET: - multiSet(data.key, data.value); + multiSet(data.data); break; case METHOD.MERGE: merge(data.key, data.changes); From 1e40f9dacb4a67a2da7907f7473dd147358408ad Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Mon, 22 Jan 2024 15:38:25 +0100 Subject: [PATCH 2/2] fix: subscribers on other tabs not updated --- lib/Onyx.js | 67 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/lib/Onyx.js b/lib/Onyx.js index 68b627234..123085ebe 100644 --- a/lib/Onyx.js +++ b/lib/Onyx.js @@ -20,6 +20,8 @@ const METHOD = { MERGE_COLLECTION: 'mergecollection', MULTI_SET: 'multiset', CLEAR: 'clear', + SCHEDULE_SUBSCRIBER_UPDATE: 'scheduleSubscriberUpdate', + SCHEDULE_NOTIFY_COLLECTION_SUBSCRIBERS: 'scheduleNotifyCollectionSubscribers', }; const ON_CLEAR = 'on_clear'; @@ -947,6 +949,10 @@ function disconnect(connectionID, keyToRemoveFromEvictionBlocklist) { * @returns {Promise} */ function scheduleSubscriberUpdate(key, value, canUpdateSubscriber) { + if (ActiveClientManager.isClientTheLeader()) { + Broadcast.sendMessage({type: METHOD.SCHEDULE_SUBSCRIBER_UPDATE, key, value}); + } + const promise = Promise.resolve().then(() => keyChanged(key, value, canUpdateSubscriber, true, false)); batchUpdates(() => keyChanged(key, value, canUpdateSubscriber, false, true)); return Promise.all([maybeFlushBatchUpdates(), promise]); @@ -962,6 +968,9 @@ function scheduleSubscriberUpdate(key, value, canUpdateSubscriber) { * @returns {Promise} */ function scheduleNotifyCollectionSubscribers(key, value) { + if (ActiveClientManager.isClientTheLeader()) { + Broadcast.sendMessage({type: METHOD.SCHEDULE_NOTIFY_COLLECTION_SUBSCRIBERS, key, value}); + } const promise = Promise.resolve().then(() => keysChanged(key, value, true, false)); batchUpdates(() => keysChanged(key, value, false, true)); return Promise.all([maybeFlushBatchUpdates(), promise]); @@ -1416,7 +1425,6 @@ function clear(keysToPreserve = []) { .then(() => Storage.multiSet(defaultKeyValuePairs)) .then(() => { isClearing = false; - Broadcast.sendMessage({type: METHOD.CLEAR, keysToPreserve}); DevTools.clearState(keysToPreserve); return Promise.all(updatePromises); }); @@ -1585,30 +1593,41 @@ function onClear(callback) { */ function subscribeToEvents() { Broadcast.subscribe(({data}) => { - if (!ActiveClientManager.isClientTheLeader()) { - return; - } - switch (data.type) { - case METHOD.CLEAR: - clear(data.keysToPreserve); - break; - case METHOD.SET: - set(data.key, data.value); - break; - case METHOD.MULTI_SET: - multiSet(data.data); - break; - case METHOD.MERGE: - merge(data.key, data.changes); - break; - case ON_CLEAR: - if (!onClearCallback) { + if (ActiveClientManager.isClientTheLeader()) { + switch (data.type) { + case METHOD.CLEAR: + clear(data.keysToPreserve); break; - } - onClearCallback(); - break; - default: - break; + case METHOD.SET: + set(data.key, data.value); + break; + case METHOD.MULTI_SET: + multiSet(data.data); + break; + case METHOD.MERGE: + merge(data.key, data.changes); + break; + + case ON_CLEAR: + if (!onClearCallback) { + break; + } + onClearCallback(); + break; + default: + break; + } + } else { + switch (data.type) { + case METHOD.SCHEDULE_SUBSCRIBER_UPDATE: + scheduleSubscriberUpdate(data.key, data.value); + break; + case METHOD.SCHEDULE_NOTIFY_COLLECTION_SUBSCRIBERS: + scheduleNotifyCollectionSubscribers(data.key, data.value); + break; + default: + break; + } } }); }