From b22a26f61e038b7947561a1db8e54d8fea7059c9 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sat, 3 Oct 2026 22:47:47 +0100 Subject: [PATCH] SignalR chat connection OK --- contrib/Makefile | 2 +- contrib/template.vhost | 22 +- .../Properties/AndroidManifest.xml | 3 +- .../{ => xml}/network_security_config.xml | 0 .../EstimateEditionPageViewModelTests.cs | 1 + src/PostIt/PostIt.Tests/StatusBarTests.cs | 7 +- src/PostIt/PostIt/Controls/StatusBar.axaml | 20 +- src/PostIt/PostIt/Models/ChatMessageDto.cs | 14 ++ src/PostIt/PostIt/Models/ChatRoomInfo.cs | 11 + src/PostIt/PostIt/Models/IWithLabel.cs | 6 + src/PostIt/PostIt/Models/StatusNotice.cs | 35 --- src/PostIt/PostIt/Models/StatusSeverity.cs | 8 + .../ViewModels/ACL/CirclesPageViewModel.cs | 2 +- .../ViewModels/ACL/PostAclDialogViewModel.cs | 1 + .../Activity/ActivitiesPageViewModel.cs | 1 + .../Activity/BillingQueriesPageViewModel.cs | 1 + .../BillingQueryDetailsPageViewModel.cs | 2 +- .../Activity/CommandFormsPageViewModel.cs | 1 + .../Activity/EstimateEditionPageViewModel.cs | 1 + .../Activity/EstimateListPageViewModel.cs | 1 + .../ProviderOngoingRequestsPageViewModel.cs | 1 + .../PostIt/ViewModels/Blogs/BlogsViewModel.cs | 1 + .../PostIt/ViewModels/Chat/ChatViewModel.cs | 104 ++++++--- .../ViewModels/Chat/RelayCheckCommand.cs | 33 +++ .../Commands/BillingCommandPageViewModel.cs | 1 + .../ViewModels/Commands/BrushViewModel.cs | 1 + .../Layout/ActionStatusViewModelExtensions.cs | 4 +- .../ViewModels/MyFiles/MyFilesViewModel.cs | 3 +- .../PostIt/ViewModels/Settings/Settings.cs | 1 + src/PostIt/PostIt/ViewModels/StatusNotice.cs | 43 ++++ src/PostIt/PostIt/Views/Chat/ChatPage.axaml | 88 +++++--- .../PostIt/Views/Chat/ChatPage.axaml.cs | 1 + src/PostIt/PostIt/Views/Layout/MainView.axaml | 1 + .../PostIt/Views/Layout/SettingsPage.axaml.cs | 1 + src/Yavsc.Abstract/Chat/ChatHubConstants.cs | 6 +- src/Yavsc.Abstract/Constants.cs | 1 + src/Yavsc.Api/Program.cs | 7 +- .../Accounting/ManageController.cs | 2 +- src/Yavsc.Org/Extensions/HostingExtensions.cs | 2 - src/Yavsc.Server/Helpers/ServiceExtensions.cs | 22 ++ src/Yavsc.Server/Hubs/ChatHub.cs | 207 ++++++++---------- .../Interfaces/IConnexionManager.cs | 2 - .../Services/HubConnectionManager.cs | 17 -- 43 files changed, 433 insertions(+), 255 deletions(-) rename src/PostIt/PostIt.Android/Resources/{ => xml}/network_security_config.xml (100%) create mode 100644 src/PostIt/PostIt/Models/ChatMessageDto.cs create mode 100644 src/PostIt/PostIt/Models/ChatRoomInfo.cs create mode 100644 src/PostIt/PostIt/Models/IWithLabel.cs delete mode 100644 src/PostIt/PostIt/Models/StatusNotice.cs create mode 100644 src/PostIt/PostIt/Models/StatusSeverity.cs create mode 100644 src/PostIt/PostIt/ViewModels/Chat/RelayCheckCommand.cs create mode 100644 src/PostIt/PostIt/ViewModels/StatusNotice.cs diff --git a/contrib/Makefile b/contrib/Makefile index deb55bcc6..5ccf773a1 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -14,7 +14,7 @@ reinstall: copy-binaries @echo "💯 backend started" reinstall-prod: - make reinstall APP_INSTALL_ENV= APP_INSTALL_PREFIX= APP_INSTALL_ENV=production + make reinstall APP_INSTALL_PREFIX= APP_INSTALL_ENV=production generated/$(APP_INSTALL_PREFIX)yavscOrg.service: generated/$(APP_INSTALL_PREFIX)yavscBlogs.service: diff --git a/contrib/template.vhost b/contrib/template.vhost index ea2c2cb6d..b4c9c139e 100644 --- a/contrib/template.vhost +++ b/contrib/template.vhost @@ -57,5 +57,25 @@ server { proxy_read_timeout 100s; proxy_buffering off; } + + # SignalR (ChatHub) : WebSocket exige Upgrade/Connection et un timeout + # long, sinon la connexion tombe au premier silence ou l'upgrade échoue. + # Connection est fixé à "upgrade" (pas de map $connection_upgrade, qui + # exigerait une directive map {} globale hors de ce vhost) : SignalR + # négocie toujours un upgrade sur ce chemin, et la négociation initiale + # (POST /negotiate, sans en-tête Upgrade) n'est pas affectée par cet + # en-tête côté Kestrel. + location /chathub { + proxy_pass $BACKEND_SCHEME://$HTTP_HOST:$BACKEND_PORT; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 3600s; + proxy_buffering off; + } include server-status.conf; -} \ No newline at end of file +} diff --git a/src/PostIt/PostIt.Android/Properties/AndroidManifest.xml b/src/PostIt/PostIt.Android/Properties/AndroidManifest.xml index 46f0bc9bb..256555df1 100644 --- a/src/PostIt/PostIt.Android/Properties/AndroidManifest.xml +++ b/src/PostIt/PostIt.Android/Properties/AndroidManifest.xml @@ -4,6 +4,7 @@ + android:networkSecurityConfig="@xml/network_security_config" + android:hardwareAccelerated="true"> diff --git a/src/PostIt/PostIt.Android/Resources/network_security_config.xml b/src/PostIt/PostIt.Android/Resources/xml/network_security_config.xml similarity index 100% rename from src/PostIt/PostIt.Android/Resources/network_security_config.xml rename to src/PostIt/PostIt.Android/Resources/xml/network_security_config.xml diff --git a/src/PostIt/PostIt.Tests/EstimateEditionPageViewModelTests.cs b/src/PostIt/PostIt.Tests/EstimateEditionPageViewModelTests.cs index 17efd391b..31c82387d 100644 --- a/src/PostIt/PostIt.Tests/EstimateEditionPageViewModelTests.cs +++ b/src/PostIt/PostIt.Tests/EstimateEditionPageViewModelTests.cs @@ -1,4 +1,5 @@ using System.Net.Http; +using PostIt.Models; using PostIt.ViewModels; using Yavsc; using Yavsc.Api.Client; diff --git a/src/PostIt/PostIt.Tests/StatusBarTests.cs b/src/PostIt/PostIt.Tests/StatusBarTests.cs index 4053dbaf3..15889e0b0 100644 --- a/src/PostIt/PostIt.Tests/StatusBarTests.cs +++ b/src/PostIt/PostIt.Tests/StatusBarTests.cs @@ -2,6 +2,7 @@ using Avalonia.Controls; using Avalonia.Headless.XUnit; using Avalonia.VisualTree; using PostIt.Controls; +using PostIt.Models; using PostIt.ViewModels; namespace PostIt.Tests; @@ -21,7 +22,9 @@ public class StatusBarTests [AvaloniaFact] public void Status_message_is_rendered_by_a_SelectableTextBlock() { - var bar = new StatusBar { DataContext = StatusNotice.Error("Échec de la suppression : boom") }; + var bar = new StatusBar { + DataContext = + StatusNotice.Error("Échec de la suppression : boom") }; var window = new Window { Content = bar }; window.Show(); @@ -32,4 +35,4 @@ public class StatusBarTests Assert.NotNull(message); Assert.Equal("Échec de la suppression : boom", message!.Text); } -} \ No newline at end of file +} diff --git a/src/PostIt/PostIt/Controls/StatusBar.axaml b/src/PostIt/PostIt/Controls/StatusBar.axaml index 2f46fee33..b279ce5ea 100644 --- a/src/PostIt/PostIt/Controls/StatusBar.axaml +++ b/src/PostIt/PostIt/Controls/StatusBar.axaml @@ -10,16 +10,18 @@ Padding="8"> - + FontWeight="Bold" + Foreground="{Binding Foreground}" + VerticalAlignment="Top"/> + Foreground="{Binding Foreground}" + TextWrapping="Wrap" + VerticalAlignment="Center"/> +