From 37f66725c96e5565720baef9238ae605925721e4 Mon Sep 17 00:00:00 2001 From: Overtorment Date: Thu, 4 Nov 2021 17:32:18 +0000 Subject: [PATCH] FIX: dedupe persist events and fix race conditions --- package.json | 2 +- src/index.tsx | 42 ++++++++++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 632c0e6..35ea523 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rn-ldk", - "version": "0.6.2", + "version": "0.6.3", "description": "rn-ldk", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/src/index.tsx b/src/index.tsx index eb0fe4a..44f3c4f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -853,24 +853,42 @@ eventEmitter.addListener(MARKER_BROADCAST, (event: BroadcastMsg) => { RnLdk._broadcast(event).then(console.log); }); +const channelPersisterTimeouts: any = {}; eventEmitter.addListener(MARKER_PERSIST, async (event: PersistMsg) => { - try { - if (!event.id || !event.data) throw new Error('Unexpected data passed for persister: ' + JSON.stringify(event)); - await RnLdk._persist(event); - } catch (error: any) { - console.error(error.message); - Alert.alert('persister: ' + error.message); + // dumb way to dedup bulk updates: + if (channelPersisterTimeouts[event.id]) { + console.log('deduping channel monitor persist events'); + clearTimeout(channelPersisterTimeouts[event.id]); } + channelPersisterTimeouts[event.id] = setTimeout(async () => { + channelPersisterTimeouts[event.id] = null; + try { + if (!event.id || !event.data) throw new Error('Unexpected data passed for persister: ' + JSON.stringify(event)); + await RnLdk._persist(event); + } catch (error: any) { + console.error(error.message); + Alert.alert('persister: ' + error.message); + } + }, 1000); }); +let managerPersisterTimeout: NodeJS.Timeout | null; eventEmitter.addListener(MARKER_PERSIST_MANAGER, async (event: PersistManagerMsg) => { - try { - if (!event.channel_manager_bytes) throw new Error('Unexpected data passed for manager persister: ' + JSON.stringify(event)); - await RnLdk._persistManager(event); - } catch (error: any) { - console.error(error.message); - Alert.alert('manager persister: ' + error.message); + // dumb way to dedup bulk updates: + if (managerPersisterTimeout) { + console.log('deduping channel manager persist events'); + clearTimeout(managerPersisterTimeout); } + managerPersisterTimeout = setTimeout(async () => { + managerPersisterTimeout = null; + try { + if (!event.channel_manager_bytes) throw new Error('Unexpected data passed for manager persister: ' + JSON.stringify(event)); + await RnLdk._persistManager(event); + } catch (error: any) { + console.error(error.message); + Alert.alert('manager persister: ' + error.message); + } + }, 1000); }); eventEmitter.addListener(MARKER_PAYMENT_FAILED, (event: PaymentFailedMsg) => {