From 5fbeaf28db084c1a07b26a9d08f67cbd8475b396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Jasi=C5=84ski?= Date: Mon, 1 Jun 2026 19:16:11 +0200 Subject: [PATCH] chore(infra): fix qdrant healthcheck and reader canvas dotnet object reference leaks --- docker-compose.test.yml | 2 +- .../Components/Organisms/ReaderCanvas.razor | 24 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/docker-compose.test.yml b/docker-compose.test.yml index ea3688b..570ae65 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -59,7 +59,7 @@ services: volumes: - qdrant_test_data:/qdrant/storage healthcheck: - test: ["CMD-SHELL", "bash -c 'exec 3<>/dev/tcp/127.0.0.1/6333'"] + test: ["CMD-SHELL", "curl -sf http://localhost:6333/healthz || exit 1"] interval: 5s timeout: 5s retries: 5 diff --git a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor index 98aa195..98d2323 100644 --- a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor +++ b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor @@ -141,6 +141,7 @@ { if (firstRender) { + _selfReference = DotNetObjectReference.Create(this); await SyncService.InitializeAsync(); _isInteractive = true; if (ViewModel != null) @@ -173,10 +174,12 @@ try { var module = await EnsureViewportModuleAsync(); - _selfReference = DotNetObjectReference.Create(this); var isMobileViewport = await module.InvokeAsync("isMobileViewport"); await OnViewportChanged(isMobileViewport); - await module.InvokeVoidAsync("registerViewportObserver", _selfReference); + if (_selfReference != null) + { + await module.InvokeVoidAsync("registerViewportObserver", _selfReference); + } } catch (Exception ex) { @@ -199,7 +202,10 @@ try { var module = await JS.InvokeAsync("import", "./_content/NexusReader.UI.Shared/js/selectionHandler.js"); - await module.InvokeVoidAsync("initSelectionListener", DotNetObjectReference.Create(this), _containerRef); + if (_selfReference != null) + { + await module.InvokeVoidAsync("initSelectionListener", _selfReference, _containerRef); + } } catch (Exception ex) { @@ -214,8 +220,11 @@ try { var module = await JS.InvokeAsync("import", "./_content/NexusReader.UI.Shared/js/readerObserver.js"); - await module.InvokeVoidAsync("initObserver", DotNetObjectReference.Create(this), ".reader-flow-container", ".block-wrapper"); - _scrollListenerReference = await module.InvokeAsync("initScrollListener", DotNetObjectReference.Create(this), ".reader-flow-container"); + if (_selfReference != null) + { + await module.InvokeVoidAsync("initObserver", _selfReference, ".reader-flow-container", ".block-wrapper"); + _scrollListenerReference = await module.InvokeAsync("initScrollListener", _selfReference, ".reader-flow-container"); + } } catch (Exception ex) { @@ -454,7 +463,10 @@ await _scrollListenerReference.DisposeAsync(); } } - catch { } + catch (Exception ex) + { + Logger.LogDebug(ex, "Teardown of scroll listener reference failed in ReaderCanvas disposal."); + } _selfReference?.Dispose(); }