diff --git a/app/library/Events.py b/app/library/Events.py index d9665b7e..f7528927 100644 --- a/app/library/Events.py +++ b/app/library/Events.py @@ -24,6 +24,8 @@ class Events: CONNECTED: str = "connected" + CONFIGURATION: str = "configuration" + LOG_INFO: str = "log_info" LOG_WARNING: str = "log_warning" LOG_ERROR: str = "log_error" @@ -90,6 +92,7 @@ class Events: """ return [ + Events.CONFIGURATION, Events.CONNECTED, Events.LOG_INFO, Events.LOG_WARNING, diff --git a/app/library/HttpSocket.py b/app/library/HttpSocket.py index 543ccf2a..16f3e4b2 100644 --- a/app/library/HttpSocket.py +++ b/app/library/HttpSocket.py @@ -44,7 +44,7 @@ class HttpSocket: self.sio = sio or socketio.AsyncServer( async_handlers=True, async_mode="aiohttp", - cors_allowed_origins=[], + cors_allowed_origins="*", transports=["websocket", "polling"], logger=self.config.debug, engineio_logger=self.config.debug, diff --git a/app/routes/socket/connection.py b/app/routes/socket/connection.py index 34c685d9..3364386d 100644 --- a/app/routes/socket/connection.py +++ b/app/routes/socket/connection.py @@ -23,25 +23,31 @@ class _Data: @route(RouteType.SOCKET, "connect", "socket_connect") async def connect(config: Config, queue: DownloadQueue, notify: EventBus, sid: str): - data = { - **queue.get(), - "config": config.frontend(), - "presets": Presets.get_instance().get_all(), - "dl_fields": DLFields.get_instance().get_all(), - "paused": queue.is_paused(), - } - - data["folders"] = list_folders( - path=Path(config.download_path), - base=Path(config.download_path), - depth_limit=config.download_path_depth-1, + notify.emit( + Events.CONFIGURATION, + data={ + "config": config.frontend(), + "presets": Presets.get_instance().get_all(), + "dl_fields": DLFields.get_instance().get_all(), + "paused": queue.is_paused(), + }, + title="Client connected", + message=f"Client '{sid}' connected.", + to=sid, ) notify.emit( Events.CONNECTED, - data=data, - title="Client connected", - message=f"Client '{sid}' connected.", + data={ + "folders": list_folders( + path=Path(config.download_path), + base=Path(config.download_path), + depth_limit=config.download_path_depth - 1, + ), + **queue.get(), + }, + title="Sending initial download data", + message=f"Sending initial download data to client '{sid}'.", to=sid, ) diff --git a/ui/app/stores/SocketStore.ts b/ui/app/stores/SocketStore.ts index 0e24cad9..8c226a93 100644 --- a/ui/app/stores/SocketStore.ts +++ b/ui/app/stores/SocketStore.ts @@ -54,8 +54,10 @@ export const useSocketStore = defineStore('socket', () => { transports: ['websocket', 'polling'], withCredentials: true, reconnection: true, - reconnectionAttempts: 30, - reconnectionDelay: 5000 + reconnectionAttempts: 50, + reconnectionDelay: 5000, + tryAllTransports: true, + timeout: 10000 * 5, } as Partial let url = runtimeConfig.public.wss @@ -70,28 +72,38 @@ export const useSocketStore = defineStore('socket', () => { connectionStatus.value = 'connecting'; socket.value = io(url, opts) - socket.value.on('connect', () => { + on("connect_error", (e: any) => { + if (!socket.value) { + return; + } + console.error("Socket connection error:", e); + socket.value.io.opts.transports = ["polling", "websocket"]; + }); + + on('connect', () => { isConnected.value = true connectionStatus.value = 'connected'; }); - socket.value.on('disconnect', () => { + on('disconnect', () => { isConnected.value = false connectionStatus.value = 'disconnected'; }); - socket.value.on('connected', stream => { + on('configuration', stream => { const json = JSON.parse(stream) - config.setAll({ app: json.data.config, tasks: json.data.tasks, - folders: json.data.folders, presets: json.data.presets, dl_fields: json.data.dl_fields, paused: Boolean(json.data.paused) } as Partial) + }) + on('connected', stream => { + const json = JSON.parse(stream); + config.add('folders', json.data.folders) stateStore.addAll('queue', json.data.queue || {}) stateStore.addAll('history', json.data.done || {}) })