fix: websocket only listen to filtered wallets (#3627)

This commit is contained in:
dni ⚡ 2025-12-06 16:31:12 +01:00 committed by GitHub
parent 5adc419c74
commit d2aedde21b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 70 additions and 65 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -6,6 +6,11 @@ window.app.component('lnbits-manage-wallet-list', {
activeWalletId: null activeWalletId: null
} }
}, },
computed: {
maxWallets() {
return this.g.user?.extra?.visible_wallet_count || 10
}
},
watch: { watch: {
$route(to) { $route(to) {
if (to.path.startsWith('/wallet/')) { if (to.path.startsWith('/wallet/')) {
@ -14,5 +19,67 @@ window.app.component('lnbits-manage-wallet-list', {
this.activeWalletId = null this.activeWalletId = null
} }
} }
},
created() {
if (this.g.user && this.g.walletEventListeners.length === 0) {
this.paymentEvents()
}
},
methods: {
onWebsocketMessage(ev) {
const data = JSON.parse(ev.data)
if (!data.payment) {
console.error('ws message no payment', data)
return
}
// update sidebar wallet balances
this.g.user.wallets.forEach(w => {
if (w.id === data.payment.wallet_id) {
w.sat = data.wallet_balance
}
})
// if current wallet, update balance and payments
if (this.g.wallet.id === data.payment.wallet_id) {
this.g.wallet.sat = data.wallet_balance
// lnbits-payment-list is watching
this.g.updatePayments = !this.g.updatePayments
this.g.updatePaymentsHash = !this.g.updatePaymentsHash
}
// NOTE: react only on incoming payments for now
if (data.payment.amount > 0) {
eventReaction(data.wallet_balance * 1000)
}
},
paymentEvents() {
if (!this.g.user) return
let timeout
const wallets = this.g.user.wallets.slice(0, this.maxWallets)
wallets.forEach(wallet => {
if (!this.g.walletEventListeners.includes(wallet.id)) {
this.g.walletEventListeners.push(wallet.id)
const ws = new WebSocket(`${websocketUrl}/${wallet.inkey}`)
ws.onmessage = this.onWebsocketMessage
ws.onopen = () => console.log('ws connected for wallet', wallet.id)
// onclose and onerror can both happen on their own or together,
// so we add a clearTimeout to avoid multiple reconnections
ws.onclose = () => {
console.log('ws closed, reconnecting...', wallet.id)
this.g.walletEventListeners = this.g.walletEventListeners.filter(
id => id !== wallet.id
)
clearTimeout(timeout)
timeout = setTimeout(this.paymentEvents, 5000)
}
ws.onerror = () => {
console.warn('ws error, reconnecting...', wallet.id)
this.g.walletEventListeners = this.g.walletEventListeners.filter(
id => id !== wallet.id
)
clearTimeout(timeout)
timeout = setTimeout(this.paymentEvents, 5000)
}
}
})
}
} }
}) })

View file

@ -3,65 +3,6 @@ window.windowMixin = {
openNewWalletDialog(walletType = 'lightning') { openNewWalletDialog(walletType = 'lightning') {
this.g.newWalletType = walletType this.g.newWalletType = walletType
this.g.showNewWalletDialog = true this.g.showNewWalletDialog = true
},
onWebsocketMessage(ev) {
const data = JSON.parse(ev.data)
if (!data.payment) {
console.error('ws message no payment', data)
return
}
// update sidebar wallet balances
this.g.user.wallets.forEach(w => {
if (w.id === data.payment.wallet_id) {
w.sat = data.wallet_balance
}
})
// if current wallet, update balance and payments
if (this.g.wallet.id === data.payment.wallet_id) {
this.g.wallet.sat = data.wallet_balance
// lnbits-payment-list is watching
this.g.updatePayments = !this.g.updatePayments
this.g.updatePaymentsHash = !this.g.updatePaymentsHash
}
// NOTE: react only on incoming payments for now
if (data.payment.amount > 0) {
eventReaction(data.wallet_balance * 1000)
}
},
paymentEvents() {
if (!this.g.user) return
let timeout
this.g.user.wallets.forEach(wallet => {
if (!this.g.walletEventListeners.includes(wallet.id)) {
this.g.walletEventListeners.push(wallet.id)
const ws = new WebSocket(`${websocketUrl}/${wallet.inkey}`)
ws.onmessage = this.onWebsocketMessage
ws.onopen = () => console.log('ws connected for wallet', wallet.id)
// onclose and onerror can both happen on their own or together,
// so we add a clearTimeout to avoid multiple reconnections
ws.onclose = () => {
console.log('ws closed, reconnecting...', wallet.id)
this.g.walletEventListeners = this.g.walletEventListeners.filter(
id => id !== wallet.id
)
clearTimeout(timeout)
timeout = setTimeout(this.paymentEvents, 5000)
}
ws.onerror = () => {
console.warn('ws error, reconnecting...', wallet.id)
this.g.walletEventListeners = this.g.walletEventListeners.filter(
id => id !== wallet.id
)
clearTimeout(timeout)
timeout = setTimeout(this.paymentEvents, 5000)
}
}
})
}
},
created() {
if (this.g.user && this.g.walletEventListeners.length === 0) {
this.paymentEvents()
} }
} }
} }

View file

@ -5,10 +5,7 @@
class="lnbits-drawer__q-list" class="lnbits-drawer__q-list"
> >
<q-item <q-item
v-for="walletRec in g.user.wallets.slice( v-for="walletRec in g.user.wallets.slice(0, maxWallets)"
0,
g.user.extra.visible_wallet_count || 10
)"
:key="walletRec.id" :key="walletRec.id"
clickable clickable
:active="walletRec.id === activeWalletId" :active="walletRec.id === activeWalletId"