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