fix: improve nostr message subscription reliability

- Add limit parameter to ensure historical messages are retrieved
- Remove premature subscription timeouts
- Add EOSE (End of Stored Events) handlers for better message tracking
- Keep subscriptions open even when no initial messages received
- Simplify subscription success logic
- Improve debug logging for subscription statesThis change helps ensure
messages persist across page refreshes andimproves the reliability of
message retrieval, particularly on mobiledevices.
This commit is contained in:
padreug 2025-02-15 00:06:10 +01:00
parent d27f66e95d
commit be93965e13

View file

@ -248,13 +248,12 @@ export const useNostrStore = defineStore('nostr', () => {
// Get timestamp from 24 hours ago // Get timestamp from 24 hours ago
const since = Math.floor(Date.now() / 1000) - (24 * 60 * 60) const since = Math.floor(Date.now() / 1000) - (24 * 60 * 60)
let hasReceivedMessages = false
try { try {
const subscribeToRelay = (relay: any) => { const subscribeToRelay = (relay: any) => {
return new Promise((resolve) => { return new Promise((resolve) => {
const subs: any[] = [] const subs: any[] = []
let messageReceived = false
let isResolved = false
try { try {
console.log('Setting up subscriptions for relay...') console.log('Setting up subscriptions for relay...')
@ -264,6 +263,7 @@ export const useNostrStore = defineStore('nostr', () => {
kinds: [4], kinds: [4],
'#p': [account.value!.pubkey], '#p': [account.value!.pubkey],
since, since,
limit: 100 // Add limit to ensure we get historical messages
}]) }])
subs.push(receivedSub) subs.push(receivedSub)
@ -272,13 +272,13 @@ export const useNostrStore = defineStore('nostr', () => {
kinds: [4], kinds: [4],
authors: [account.value!.pubkey], authors: [account.value!.pubkey],
since, since,
limit: 100 // Add limit to ensure we get historical messages
}]) }])
subs.push(sentSub) subs.push(sentSub)
// Handle received messages // Handle received messages
receivedSub.on('event', async (event: NostrEvent) => { receivedSub.on('event', async (event: NostrEvent) => {
messageReceived = true hasReceivedMessages = true
if (isResolved) return // Don't process events after resolution
try { try {
if (processedMessageIds.value.has(event.id)) return if (processedMessageIds.value.has(event.id)) return
@ -305,8 +305,7 @@ export const useNostrStore = defineStore('nostr', () => {
// Handle sent messages // Handle sent messages
sentSub.on('event', async (event: NostrEvent) => { sentSub.on('event', async (event: NostrEvent) => {
messageReceived = true hasReceivedMessages = true
if (isResolved) return // Don't process events after resolution
try { try {
if (processedMessageIds.value.has(event.id)) return if (processedMessageIds.value.has(event.id)) return
@ -334,6 +333,21 @@ export const useNostrStore = defineStore('nostr', () => {
} }
}) })
// Handle EOSE (End of Stored Events)
receivedSub.on('eose', () => {
console.log('Received EOSE for received messages')
if (!hasReceivedMessages) {
console.log('No messages received yet, keeping subscription open')
}
})
sentSub.on('eose', () => {
console.log('Received EOSE for sent messages')
if (!hasReceivedMessages) {
console.log('No messages received yet, keeping subscription open')
}
})
// Store subscriptions for cleanup // Store subscriptions for cleanup
currentSubscription.value = { currentSubscription.value = {
unsub: () => { unsub: () => {
@ -349,25 +363,13 @@ export const useNostrStore = defineStore('nostr', () => {
} }
} }
// Consider subscription successful after a short delay // Keep subscription open
setTimeout(() => {
if (!isResolved) {
isResolved = true
console.debug(messageReceived ?
'Subscription successful with messages' :
'Subscription successful, no messages yet'
)
resolve(true) resolve(true)
}
}, 3000)
} catch (err) { } catch (err) {
console.debug('Error in subscription setup:', err) console.debug('Error in subscription setup:', err)
if (!isResolved) {
isResolved = true
resolve(false) resolve(false)
} }
}
}) })
} }
@ -377,16 +379,10 @@ export const useNostrStore = defineStore('nostr', () => {
) )
// Consider success if at least one relay worked // Consider success if at least one relay worked
const success = results.some(result => result) return results.some(result => result)
if (!success) {
console.debug('No relays successfully subscribed')
return false // Return false instead of throwing
}
return true
} catch (err) { } catch (err) {
console.debug('Subscription process failed:', err) console.debug('Subscription process failed:', err)
return false // Return false instead of throwing return false
} }
} }