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:
parent
d27f66e95d
commit
be93965e13
1 changed files with 25 additions and 29 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue