From 7b64bc523a3c258ca28005765aa6d6a12702030c Mon Sep 17 00:00:00 2001 From: enes Date: Thu, 5 Sep 2024 16:24:23 +0200 Subject: [PATCH 1/4] chore: add debug logs --- src/utils/nostr.ts | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/utils/nostr.ts b/src/utils/nostr.ts index eceb8d8..f4ea9a3 100644 --- a/src/utils/nostr.ts +++ b/src/utils/nostr.ts @@ -341,6 +341,12 @@ export const createWrap = (unsignedEvent: UnsignedEvent, receiver: string) => { // Check if the leading zero bits meet the required difficulty if (leadingZeroes >= difficulty) { // Finalize the event (sign it) and return the result + console.log( + 'event OUT: ', + unsignedEvent, + ' for this user ', + hexToNpub(receiver) + ) return finalizeEvent(event, randomKey) } @@ -526,13 +532,18 @@ export const updateUsersAppData = async (meta: Meta) => { if (existingMeta.modifiedAt < meta.modifiedAt) { sigits[id] = meta isUpdated = true + } else { + console.log('event NEWER EXISTS', existingMeta, meta) } } else { sigits[id] = meta isUpdated = true } - if (!isUpdated) return null + if (!isUpdated) { + console.log('event NOT UPDATED', sigits[id], meta) + return null + } const blossomUrls = [...appData.blossomUrls] @@ -869,12 +880,13 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { .processedGiftWraps if (processedEvents.includes(event.id)) return - store.dispatch(updateProcessedGiftWraps([...processedEvents, event.id])) - // validate PoW // Count the number of leading zero bits in the hash const leadingZeroes = countLeadingZeroes(event.id) - if (leadingZeroes < difficulty) return + if (leadingZeroes < difficulty) { + console.log('processReceivedEvent leading zeroes error') + return + } // decrypt the content of gift wrap event const nostrController = NostrController.getInstance() @@ -882,7 +894,6 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { event.pubkey, event.content ) - const internalUnsignedEvent = await parseJson(decrypted).catch( (err) => { console.log( @@ -893,8 +904,21 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { } ) - if (!internalUnsignedEvent || internalUnsignedEvent.kind !== 938) return + if (!internalUnsignedEvent || internalUnsignedEvent.kind !== 938) { + console.log( + 'processReceivedEvent missing internal unsigned event, or internal event not sigit kind' + ) + return + } + console.log( + 'event IN: ', + new Date(internalUnsignedEvent.created_at * 1000), + internalUnsignedEvent.kind, + internalUnsignedEvent.pubkey, + hexToNpub(internalUnsignedEvent.pubkey), + internalUnsignedEvent.content + ) const meta = await parseJson(internalUnsignedEvent.content).catch( (err) => { console.log( @@ -907,7 +931,8 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { if (!meta) return - updateUsersAppData(meta) + await updateUsersAppData(meta) + store.dispatch(updateProcessedGiftWraps([...processedEvents, event.id])) } /** -- 2.34.1 From c09837ea2049fe09d85874a0f20fdf5157bbd9dd Mon Sep 17 00:00:00 2001 From: enes Date: Fri, 6 Sep 2024 18:01:49 +0200 Subject: [PATCH 2/4] fix: processing gift wraps and notifications --- src/utils/nostr.ts | 50 +++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/src/utils/nostr.ts b/src/utils/nostr.ts index f4ea9a3..70220b3 100644 --- a/src/utils/nostr.ts +++ b/src/utils/nostr.ts @@ -341,12 +341,6 @@ export const createWrap = (unsignedEvent: UnsignedEvent, receiver: string) => { // Check if the leading zero bits meet the required difficulty if (leadingZeroes >= difficulty) { // Finalize the event (sign it) and return the result - console.log( - 'event OUT: ', - unsignedEvent, - ' for this user ', - hexToNpub(receiver) - ) return finalizeEvent(event, randomKey) } @@ -532,18 +526,13 @@ export const updateUsersAppData = async (meta: Meta) => { if (existingMeta.modifiedAt < meta.modifiedAt) { sigits[id] = meta isUpdated = true - } else { - console.log('event NEWER EXISTS', existingMeta, meta) } } else { sigits[id] = meta isUpdated = true } - if (!isUpdated) { - console.log('event NOT UPDATED', sigits[id], meta) - return null - } + if (!isUpdated) return null const blossomUrls = [...appData.blossomUrls] @@ -870,9 +859,16 @@ export const subscribeForSigits = async (pubkey: string) => { '#p': [pubkey] } - relayController.subscribeForEvents(filter, relaySet.read, (event) => { - processReceivedEvent(event) // Process the received event - }) + // Process the received event synchronously + const events = await relayController.fetchEvents(filter, relaySet.read) + for (const e of events) { + await processReceivedEvent(e) + } + + // Async processing of the events has a race condition + // relayController.subscribeForEvents(filter, relaySet.read, (event) => { + // processReceivedEvent(event) + // }) } const processReceivedEvent = async (event: Event, difficulty: number = 5) => { @@ -880,13 +876,13 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { .processedGiftWraps if (processedEvents.includes(event.id)) return + // Consider the gift wrap as processed immediately + store.dispatch(updateProcessedGiftWraps([...processedEvents, event.id])) + // validate PoW // Count the number of leading zero bits in the hash const leadingZeroes = countLeadingZeroes(event.id) - if (leadingZeroes < difficulty) { - console.log('processReceivedEvent leading zeroes error') - return - } + if (leadingZeroes < difficulty) return // decrypt the content of gift wrap event const nostrController = NostrController.getInstance() @@ -904,21 +900,8 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { } ) - if (!internalUnsignedEvent || internalUnsignedEvent.kind !== 938) { - console.log( - 'processReceivedEvent missing internal unsigned event, or internal event not sigit kind' - ) - return - } + if (!internalUnsignedEvent || internalUnsignedEvent.kind !== 938) return - console.log( - 'event IN: ', - new Date(internalUnsignedEvent.created_at * 1000), - internalUnsignedEvent.kind, - internalUnsignedEvent.pubkey, - hexToNpub(internalUnsignedEvent.pubkey), - internalUnsignedEvent.content - ) const meta = await parseJson(internalUnsignedEvent.content).catch( (err) => { console.log( @@ -932,7 +915,6 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { if (!meta) return await updateUsersAppData(meta) - store.dispatch(updateProcessedGiftWraps([...processedEvents, event.id])) } /** -- 2.34.1 From 7163f4aae1d3f2c17f5bb0111115f5a19b8e4b2f Mon Sep 17 00:00:00 2001 From: enes Date: Tue, 10 Sep 2024 13:07:41 +0200 Subject: [PATCH 3/4] chore(git): cleanup --- src/utils/nostr.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/nostr.ts b/src/utils/nostr.ts index 70220b3..0a3e052 100644 --- a/src/utils/nostr.ts +++ b/src/utils/nostr.ts @@ -876,7 +876,6 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { .processedGiftWraps if (processedEvents.includes(event.id)) return - // Consider the gift wrap as processed immediately store.dispatch(updateProcessedGiftWraps([...processedEvents, event.id])) // validate PoW @@ -890,6 +889,7 @@ const processReceivedEvent = async (event: Event, difficulty: number = 5) => { event.pubkey, event.content ) + const internalUnsignedEvent = await parseJson(decrypted).catch( (err) => { console.log( -- 2.34.1 From 522bdf54deb70bdc4c807f37fc9c719b3a492286 Mon Sep 17 00:00:00 2001 From: enes Date: Wed, 11 Sep 2024 13:12:38 +0200 Subject: [PATCH 4/4] fix: add 2m interval to sigits update hotfix until #194 --- src/layouts/Main.tsx | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/layouts/Main.tsx b/src/layouts/Main.tsx index f3962eb..5a8cca2 100644 --- a/src/layouts/Main.tsx +++ b/src/layouts/Main.tsx @@ -27,6 +27,8 @@ import { import { useAppSelector } from '../hooks' import styles from './style.module.scss' +const UPDATE_INTERVAL_MS = 120000 + export const MainLayout = () => { const dispatch: Dispatch = useDispatch() const [isLoading, setIsLoading] = useState(true) @@ -35,7 +37,7 @@ export const MainLayout = () => { const usersAppData = useAppSelector((state) => state.userAppData) // Ref to track if `subscribeForSigits` has been called - const hasSubscribed = useRef(false) + const hasSubscribed = useRef(null) useEffect(() => { const metadataController = new MetadataController() @@ -109,10 +111,27 @@ export const MainLayout = () => { if (pubkey && !hasSubscribed.current) { // Call `subscribeForSigits` only if it hasn't been called before + // #193 disabled websocket subscribtion, keep updating the sigits on UPDATE_INTERVAL_MS until #194 is done + // Set up the update sigit loop, use setTimeout to make sure times between updates are consistent + // (not affected by execution duration of subscribeForSigits call) + const loop = () => { + hasSubscribed.current = window.setTimeout(async () => { + await subscribeForSigits(pubkey) + loop() + }, UPDATE_INTERVAL_MS) + } subscribeForSigits(pubkey) + loop() // Mark `subscribeForSigits` as called - hasSubscribed.current = true + //hasSubscribed.current = true + } + } + + return () => { + if (hasSubscribed.current) { + window.clearTimeout(hasSubscribed.current) + hasSubscribed.current = null } } }, [authState, usersAppData]) -- 2.34.1