Merge branch 'websocket-wallet-tx-updates'
This commit is contained in:
commit
ffef1bfb1d
2 changed files with 62 additions and 12 deletions
|
|
@ -76,9 +76,9 @@ export const appConfig: AppConfig = {
|
||||||
baseUrl: import.meta.env.VITE_LNBITS_BASE_URL || 'http://localhost:5000'
|
baseUrl: import.meta.env.VITE_LNBITS_BASE_URL || 'http://localhost:5000'
|
||||||
},
|
},
|
||||||
websocket: {
|
websocket: {
|
||||||
enabled: true,
|
enabled: import.meta.env.VITE_WEBSOCKET_ENABLED !== 'false', // Can be disabled via env var
|
||||||
reconnectDelay: 1000, // 1 second
|
reconnectDelay: 2000, // 2 seconds (increased from 1s to reduce server load)
|
||||||
maxReconnectAttempts: 5
|
maxReconnectAttempts: 3 // Reduced from 5 to avoid overwhelming server
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,7 @@ export class WalletWebSocketService extends BaseService {
|
||||||
* Handle WebSocket connection opened
|
* Handle WebSocket connection opened
|
||||||
*/
|
*/
|
||||||
private handleOpen(_event: Event): void {
|
private handleOpen(_event: Event): void {
|
||||||
console.log('WalletWebSocketService: Connected')
|
console.log('WalletWebSocketService: Connected successfully')
|
||||||
this.isConnected.value = true
|
this.isConnected.value = true
|
||||||
this.connectionStatus.value = 'connected'
|
this.connectionStatus.value = 'connected'
|
||||||
this.reconnectAttempts = 0
|
this.reconnectAttempts = 0
|
||||||
|
|
@ -175,6 +175,9 @@ export class WalletWebSocketService extends BaseService {
|
||||||
clearTimeout(this.reconnectTimer)
|
clearTimeout(this.reconnectTimer)
|
||||||
this.reconnectTimer = null
|
this.reconnectTimer = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send a ping to test connection stability
|
||||||
|
this.sendPing()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -282,10 +285,16 @@ export class WalletWebSocketService extends BaseService {
|
||||||
this.connectionStatus.value = 'disconnected'
|
this.connectionStatus.value = 'disconnected'
|
||||||
this.ws = null
|
this.ws = null
|
||||||
|
|
||||||
// Schedule reconnection if not a normal closure
|
// Handle specific close codes
|
||||||
if (event.code !== 1000) {
|
if (event.code === 1006) {
|
||||||
this.scheduleReconnect()
|
console.warn('WalletWebSocketService: Abnormal closure detected - possible server issue')
|
||||||
|
// For code 1006, increase delay to avoid overwhelming server
|
||||||
|
this.scheduleReconnect(true)
|
||||||
|
} else if (event.code !== 1000) {
|
||||||
|
// Normal reconnection for other non-normal closures
|
||||||
|
this.scheduleReconnect(false)
|
||||||
}
|
}
|
||||||
|
// Code 1000 = normal closure, don't reconnect
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -300,16 +309,29 @@ export class WalletWebSocketService extends BaseService {
|
||||||
console.error('WalletWebSocketService: WebSocket state:', this.ws.readyState)
|
console.error('WalletWebSocketService: WebSocket state:', this.ws.readyState)
|
||||||
console.error('WalletWebSocketService: WebSocket URL:', this.ws.url)
|
console.error('WalletWebSocketService: WebSocket URL:', this.ws.url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if this is a network connectivity issue
|
||||||
|
if (!navigator.onLine) {
|
||||||
|
console.log('WalletWebSocketService: Network appears to be offline')
|
||||||
|
this.connectionStatus.value = 'offline'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Schedule a reconnection attempt
|
* Schedule a reconnection attempt
|
||||||
*/
|
*/
|
||||||
private scheduleReconnect(): void {
|
private scheduleReconnect(isAbnormalClosure = false): void {
|
||||||
// Don't reconnect if we've exceeded max attempts
|
// Don't reconnect if we've exceeded max attempts
|
||||||
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
||||||
console.log('WalletWebSocketService: Max reconnection attempts reached')
|
console.log('WalletWebSocketService: Max reconnection attempts reached - disabling WebSocket')
|
||||||
this.connectionStatus.value = 'failed'
|
this.connectionStatus.value = 'failed'
|
||||||
|
|
||||||
|
// Show user notification about WebSocket issues
|
||||||
|
if (this.toast) {
|
||||||
|
this.toast.info('Real-time balance updates temporarily unavailable', {
|
||||||
|
description: 'WebSocket connection failed. Balance will update on page refresh.'
|
||||||
|
})
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -319,10 +341,16 @@ export class WalletWebSocketService extends BaseService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate delay with exponential backoff
|
// Calculate delay with exponential backoff
|
||||||
const delay = this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts)
|
let delay = this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts)
|
||||||
|
|
||||||
|
// For abnormal closures (1006), use longer delays to avoid overwhelming server
|
||||||
|
if (isAbnormalClosure) {
|
||||||
|
delay = Math.max(delay, 5000) // Minimum 5 second delay for 1006 errors
|
||||||
|
}
|
||||||
|
|
||||||
this.reconnectAttempts++
|
this.reconnectAttempts++
|
||||||
|
|
||||||
console.log(`WalletWebSocketService: Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`)
|
console.log(`WalletWebSocketService: Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.config.maxReconnectAttempts})${isAbnormalClosure ? ' [abnormal closure]' : ''}`)
|
||||||
this.connectionStatus.value = 'reconnecting'
|
this.connectionStatus.value = 'reconnecting'
|
||||||
|
|
||||||
this.reconnectTimer = setTimeout(() => {
|
this.reconnectTimer = setTimeout(() => {
|
||||||
|
|
@ -372,12 +400,34 @@ export class WalletWebSocketService extends BaseService {
|
||||||
this.disconnect()
|
this.disconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send ping to test connection
|
||||||
|
*/
|
||||||
|
private sendPing(): void {
|
||||||
|
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
||||||
|
try {
|
||||||
|
// Send a ping frame (most WebSocket implementations support this)
|
||||||
|
this.ws.ping?.()
|
||||||
|
} catch (error) {
|
||||||
|
console.log('WalletWebSocketService: Ping not supported, connection seems stable')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manual reconnection method
|
* Manual reconnection method
|
||||||
*/
|
*/
|
||||||
public async reconnect(): Promise<void> {
|
public async reconnect(): Promise<void> {
|
||||||
|
console.log('WalletWebSocketService: Manual reconnection triggered')
|
||||||
this.reconnectAttempts = 0
|
this.reconnectAttempts = 0
|
||||||
await this.connectIfNeeded()
|
|
||||||
|
// Disconnect current connection if any
|
||||||
|
this.disconnect()
|
||||||
|
|
||||||
|
// Wait a moment before reconnecting
|
||||||
|
setTimeout(() => {
|
||||||
|
this.connectIfNeeded()
|
||||||
|
}, 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue