feat: cache and use RemoteInfo - #21
Merged
Merged
Conversation
# UniScan.Client.App - You can no longer add a Display Name from `AddRemoteDialogView` # UniScan.Client.Core - `RemoteServer` now uses the Connection Method's display string ## Breaking Changes - `RemoteDto`, `RemoteServer` no longer accept custom display names - `IRemoteFactory.Create` no longer accepts a `displayName` parameter # UniScan.Network.Client - Added `IRemoteConnectionMethod.ToDisplayString()` - Implemented `TCPRemoteConnectionMethod.ToDisplayString()`
…ded_display_names # Conflicts: # Client/UniScan.Client.App/ViewModels/RemoteViewModel.cs
DexrnZacAttack
had a problem deploying
to
github-pages
August 24, 2026 01:33 — with
GitHub Actions
Failure
…eline
# UniScan.Client.App
- Created `RemoteConnectionPipeline`, which handles the flow for connecting to a remote, negotiation, and finalization
- `TaskPipeline` now accepts a `CancellationToken` and will handle when an exception is thrown.
- `LoadingViewModel` now accepts loading text
## Breaking Changes
- `ITaskStage` tasks now require a `CancellationToken`
# UniScan.Client.Core
- Connecting is no longer done through `RemoteServer`
- Instead, it has been transformed into a `TaskPipeline` in `UniScan.Client.App`
- I intend on bringing `TaskPipeline` into either `Shiki.Common` or `UniScan.Client.Core` in the future, and moving the pipeline creation back into RemoteServer
## Breaking Changes
- Removed `RemoteServer.RunConnectionAsync`
# UniScan.Network
- `ISocket.SendRequestAsync` now accepts a `CancellationToken`
# UniScan.Network.Client
- `TCPRemoteConnectionMethod.ConnectAsync` now awaits `bootstrap.ConnectAsync()`
- `ClientSocket.StartAsync` now stops the socket on exception
- `ClientSocket.SendRequestAsync` now accepts a `CancellationToken`
# UniScan.Server.Core
- Now has extra logging on exit
# UniScan.Client.App - Now sets `ServerAttribute` on the `RemoteServer` after connecting - `RemoteControlView` and `MainPageView` now bind to `Remote.DisplayName.Value` # UniScan.Client.Core - Added `RemoteServer.RemoteInfo`, `RemoteServer._remoteInfo`, and `IRemoteServerMutationProxy.SetRemoteInfo(RemoteInfo)` - Made logger in `DisconnectPacketHandler` use the correct context - Created `RemoteInfoPacketHandler` which handles and calls `IRemoteServerMutationProxy.SetRemoteInfo(RemoteInfo)` on `RemoteServer` - Later I will make this be cached too. - Added `Microsoft.Extensions.Logging.Abstractions` and `Serilog.Extensions.Logging` ## Breaking Changes - `RemoteServer.DisplayName` is now an IReadOnlyBindableReactiveProperty<string> and will automatically use `RemoteServer.RemoteInfo.DisplayName` if available # UniScan.Network ## Breaking Changes - The protocol version is now `2` - `RemoteInfo` is no longer a `readonly record struct` - `RemoteInfoPacket` is no longer a response packet - Removed `GetRemoteInfoPacket` # UniScan.Server.Core - Now sends `RemoteInfoPacket` after receiving `ClientSoftwareInfoPacket` - Removed `GetRemoteInfoPacketHandler` - Created a temporary test `RemoteInfo` instance at `UniScanServer.RemoteInfo`
# UniScan.Client.Core - Added an overload for `IRemoteFactory.Create` which accepts a `RemoteDto` - `RemotesListFile.LoadAsync` now calls the new `IRemoteFactory.Create` overload - Added a constructor overload for `RemoteServer` which accepts a nullable `RemoteInfo` instance - `UniScanClient` now tracks remotes ## Breaking Changes - `RemoteDto` now requires an instance of `RemoteCacheDto`
…n separate folder, etc note: Storage stuff is brought from diff project I was working on also note: taskpipeline moved to Shiki
…anager.EnumerateAsync`, also implement for web.
DexrnZacAttack
had a problem deploying
to
github-pages
August 26, 2026 00:43 — with
GitHub Actions
Failure
# UniScan.Client.App - Subscribing to a device now functions like it should, sending the packet correctly. - Added `RemoteInfoView` - Displays the remote info like the title, logo, description, and links. - Added `RemoteLinkView` - Displays the link's logo, title, and clicking will open its URL in your browser - `RemoteViewModel` now stores a `RemoteInfoViewModel` which is passed to other viewmodels that may need it - `RemoteControlView` now shows the logo provided by the server, if available. - `MainPageView`'s remote cards now show the logo provided by the server, if available. - `MainRemotePageView` now displays the `RemoteInfoView`, and an extra bottom toolbar containing the server's MOTD, if available. - `MainView`'s DrawerPage sidebar has been widened while compact. - `MainWindow` now uses the correct window title. ## Breaking Changes - Packet registration and remote loading have been moved out of `UniScanClient` and into our app initialization pipeline - App initialization task contexts no longer store `UniScanClient` - Updated `MainViewModel` according to the changes in `UniScanClient` # UniScan.Client.Core ## Breaking Changes - Dissolved most of `UniScanClient` in favor of a method that adds its services to DI. - This means that `UniScanClient` now doesn't do much; however, it will not be removed incase it needs to store anything that isn't a service. - Added `UniScanClientDependencyInjection.AddUniScanClient` - This method performs most of the functions of the old `UniScanClient`'s `CreateInstanceAsync`, but on an existing DI container. # UniScan.Device ## Breaking Changes - `Scanner.State` is now `IReadOnlyBindableReactiveProperty<DeviceState?>` - Removed `IScannerEvents.OnStateUpdated` # UniScan.Network - Properly set up `SubscribePacket` as a MessagePack object ## Breaking Changes - The protocol version is now `3` - `RemoteLink.Url` is now a `Uri` - Removed `ScannerRegistrationPacket` # UniScan.Network.Client - Created `IClientSocketFactory` and `ClientSocketFactory` - Intended to be passed wherever a socket may be needed, instead of having to pass all of `ClientSocket`'s ctor's param types. # UniScan.Network.Server - Created `ClientsManager` - Used to keep track of all connected clients, and allows for broadcasting a single packet across all connected clients. - Added `ServerSocket.ClientManager` # UniScan.Server.Core - `HostClientsHandler` now subscribes to `Scanner.State` instead of subscribing to the old `IScannerEvents.OnStateUpdated` - Added more info to the temporary `UniScanServer.RemoteInfo` - `UniScanServer.ExitAsync()` now sends a `DisconnectPacket` to all clients. ## Breaking Changes - `SubscribePacketHandler` no longer responds with a `ScannerRegistrationPacket`, as that has been removed.
# UniScan.Client.App - `NotConnectedRemotePageViewModel` now handles disconnects better - `MainRemotePageVIew` is now tabbed, with an added Announcements page. # UniScan.Network - Added `RemoteAnnouncementAuthor` - I am almost certain that this will be replaced once we have a proper user system in place. ## Breaking Changes - The protocol version is now `4` - `RemoteAnnouncement` now stores a list of `RemoteAnnouncementAuthors` # UniScan.Network.Server - Added `SubscribableGroup.Contains(IChannel)` # UniScan.Server.Core - Added `HostClientsHandler.Contains(IChannel)` - Clients are now sent a falsy acknowledgement when they attempt to subscribe to the same scanner more than once - `UniScanServer._networkGroupManager` now temporarily uses `MultithreadedGroupManager` until settings and a provider is made. - Fixed opening and never closing the file handle in `ScannerMeta.SaveAsync`
DexrnZacAttack
had a problem deploying
to
github-pages
August 27, 2026 07:44 — with
GitHub Actions
Failure
DexrnZacAttack
had a problem deploying
to
github-pages
August 27, 2026 10:43 — with
GitHub Actions
Failure
DexrnZacAttack
marked this pull request as ready for review
August 27, 2026 10:54
DexrnZacAttack
marked this pull request as draft
August 27, 2026 10:55
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
UniScan.Client.App.Platform.Android
UniScanPlatformAttributeto assemblyUniScan.Client.App.Platform.Browser
UniScanPlatformAttributeto assemblyUniScan.Client.App.Platform.Desktop
UniScanPlatformAttributeto assemblyUniScan.Client.App
RemoteInfois now usedAdded several remote controls:
RemoteInfoControl: Displays the remote logo, title, description, and a set of linksRemoteLinkControl: Displays the link's logo, title, and urlRemoteInfoViewnow showsRemoteInfoControlin addition to a bottom area for an optional MOTD that the server may provide.RemoteInfoViewis now tabbed, with an Announcements tab for viewing server announcementsImproved the look of several views:
NotConnectedRemotePageViewnow shows the remote logo and name, and is now centeredDisconnectedRemotePageViewnow shows the remote logo and name, and is now centeredMainViewhas been expanded to properly show remote logosHomePageViewnow shows a message when not connected to any remotesHomePageViewnow shows a logo in each remote expander when availableImproved the look of several controls:
DeviceListControlnow properly fills its available space with devicesSidebarRemoteItemControlnow displays a logo next to the name if availableLoadingViewModelnow accepts any TaskPipeline to listen toA loading screen is now shown when connecting to a Remote
Added
UniScanPlatformAttributeGetEntryAssembly()failing due to JNIBreaking Changes
UniScan.Client.Core
Added
RemoteCacheDtofor caching RemoteInfoAdded
RemoteInfoPacketHandlerfor handling and setting RemoteInfoCreated a new remote connection pipeline (
RemoteConnectionPipeline)Added
IRemoteServerMutationProxyfor mutatingRemoteServerwithout explicitly allowing mutation in the original class definitionAdded a large storage system (from another project I was working on)
Breaking Changes
UniScanClientand into our app initialization pipelineUniScanClientUniScanClientin favor of a method that adds its services to DI.UniScanClientnow doesn't do much; however, it will not be removed incase it needs to store anything that isn't a service.UniScanClientDependencyInjection.AddUniScanClientUniScanClient'sCreateInstanceAsync, but on an existing DI container.RemoteDtono longer holds a display nameRemotesListFilein favor ofRemoteStoragewhich observes a list of Remotes inside IRemoteManager to determine when to saveIRemoteFactorynow requires a GUID in bothCreatemethod definitionsRemoteServerconstructors now require a GUID andIClientSocketFactoryinstanceUniScan.Device
Breaking Changes
DeviceState.LockandDeviceState.AttributesIScannerEvents.OnStateUpdatedScanner.Stateis now aIReadOnlyBindableReactivePropertyUniScan.Network.Client
IRemoteConnectionMethod.ToDisplayString()IClientSocketFactoryandClientSocketFactoryClientSocketUniScan.Network.Server
ClientsManagerServerSocket.ClientManagerSubscribableGroup.Contains(IChannel)UniScan.Network
RemoteAnnouncementAuthorBreaking Changes
The protocol version is now
4ISocket.SendRequestAsyncnow accepts a CancellationTokenRemoteAnnouncementnow stores a list of authorsRemoteLink.Urlis now aUriRemoteInfoPacketis no longer a request packet, and is instead sent by the server whenever desired and consumed by the clientRemoved
GetRemoteInfoPacketSubscribePacketis now a properMessagePackObjectUniScan.Platform
IPlatformDirectoryManager.DeleteAsyncIPlatformDirectoryManager.EnumerateAsyncBreaking Changes
IPlatformFileSystemManagerIPlatformFileManager.ExistsAsyncin favor ofIPlatformFileSystemManager.ExistsAsyncIPlatformDirectoryManager.ExistsAsyncin favor ofIPlatformFileSystemManager.ExistsAsyncPlatformDirectoryManager.cstoIPlatformDirectoryManager.csUniScan.Platform.Implementations.Native
UniScan.PlatformchangesUniScan.Platform.Implementations.Web
UniScan.PlatformchangesBreaking Changes
UniScan.Platform.Implementations.Web.BrowserPathstoUniScan.Client.App.Platform.BrowserBrowserFileManager.TransferAsyncnow creates all subfolders leading up to the destination fileUniScan.Server.Core
HostClientsHandlernow listens toScanner.Stateas anObservableSubscribePacketHandlerRemoteInfoinstance inUniScanServerDisconnectPacketto all clients on shutdownBreaking Changes
ClientSoftwareInfoPacketHandlernow sends aRemoteInfoPacketafter being acceptedGetRemoteInfoPacketHandlerSubscribePacketHandlerno longer allows subscribing to the same device twiceSubscribePacketHandlerno longer attempts to send the scanner state when it is nullUniScanServer._networkGroupManagernow usesMultithreadedGroupManagerUniScan.Server.Host
ScannerMeta.SaveAsyncnow properly disposes of the filestreamFixes #12
Fixes #25