Skip to content

Commit ebdfcfb

Browse files
feat!: make PacketRegistry no longer a singleton, move packet registration to an IPacketSource interface instead of per module.
- Added CI for UniScan.Server.Host # UniScan.Client.Core - Use DI for `PacketRegistry` - Update `RemoteFactory.Create` to pass `PacketRegistry` instance from DI ## Breaking Changes - Updated `RemoteServer` constructors to take an instance of `PacketRegistry` - Removed `InternalUniScanClientPacketConfigurator` - Packets are now registered from `AssembliesPacketSource` - `InternalUniScanClientModule` no longer adds an `IPacketConfigurator` to DI as this class has been removed. # UniScan.Network ## Breaking Changes - Renamed `ScannerInfoPacket` -> `ScannerRegistrationPacket` - The new ID for this packet is `UniScan:packet/clientbound/device/registration` - This fixes a bug where there were two instances of the same packet ID used for different packets in the codebase - Removed `BuiltinPacketRegistrar` - Removed `IPacketConfigurator` - Moved `PacketRegistry` and `RegistryPacketAttribute` to `UniScan.Network.Registry` - Created `IPacketSource` and `AssembliesPacketSource` - `AssembliesPacketSource` collects all classes that inherit `IPacket` and have the `RegistryPacket` attribute. - Removed the singleton Instance property from `PacketRegistry` - Created `PacketRegistry.RegisterFromSource` and `PacketRegistry.RegisterFromSource<TPacketSource>` - `PacketRegistry.RegisterFromSource` takes a given `IPacketSource` and registers all the packets it provides. - `PacketRegistry.RegisterFromSource<TPacketSource>` creates a new instance of the given `TPacketSource` type and passes it to `PacketRegistry.RegisterFromSource` # UniScan.Server.Core - `SubscribePacketHandler` now sends the newly renamed `ScannerRegistrationPacket` ## Breaking Changes - Removed `PacketRegistry.RegisterFromSource` - `InternalUniScanServerModule` no longer adds an `IPacketConfigurator` to DI as this class has been removed. - Packets are now registered from `AssembliesPacketSource` # UniScan.Server.Host - Now creates its own `PacketRegistry` and passes it to the `UniScanServer` constructor. # UniScan.Tests - Now creates its own `PacketRegistry` and passes it to the `ClientSocket` constructor.
1 parent ae6b374 commit ebdfcfb

25 files changed

Lines changed: 238 additions & 117 deletions
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This starter workflow is for a CMake project running on multiple platforms. There is a different starter workflow if you just want a single platform.
22
# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-single-platform.yml
3-
name: Build UniScan
3+
name: Build UniScan Client
44

55
on:
66
workflow_dispatch:
@@ -108,8 +108,8 @@ jobs:
108108
name: UniScan.Client_${{matrix.type}}_${{matrix.id}}
109109
path: |
110110
${{steps.strings.outputs.build-output-dir}}
111-
112-
release:
111+
112+
release-client:
113113
needs: [build-client-desktop, build-client-android]
114114
if: ${{ inputs.create_release == true }}
115115
runs-on: ubuntu-latest

‎.github/workflows/build-server.yml‎

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# This starter workflow is for a CMake project running on multiple platforms. There is a different starter workflow if you just want a single platform.
2+
# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-single-platform.yml
3+
name: Build UniScan Server
4+
5+
on:
6+
workflow_dispatch:
7+
inputs:
8+
create_release:
9+
description: "Create release"
10+
type: boolean
11+
required: false
12+
default: false
13+
push:
14+
branches: [ "main" ]
15+
pull_request:
16+
branches: [ "main" ]
17+
18+
jobs:
19+
build-server:
20+
runs-on: ubuntu-latest
21+
22+
strategy:
23+
fail-fast: false
24+
matrix:
25+
id: [
26+
"win-x64", "win-x86", "win-arm64",
27+
"linux-x64", "linux-arm", "linux-arm64", "linux-musl-x64", "linux-musl-arm64", "linux-bionic-arm64",
28+
"osx-x64", "osx-arm64"
29+
]
30+
type: ["Release", "Debug"]
31+
32+
steps:
33+
- uses: actions/checkout@v7
34+
with:
35+
submodules: 'recursive'
36+
37+
- uses: actions/setup-dotnet@v6
38+
with:
39+
dotnet-version: '10.0.x'
40+
41+
- name: Set reusable strings
42+
# Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file.
43+
id: strings
44+
shell: bash
45+
run: |
46+
echo "build-output-dir=${{ github.workspace }}/publish/${{matrix.id}}" >> "$GITHUB_OUTPUT"
47+
48+
- name: Build
49+
# Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
50+
run: >
51+
dotnet publish ${{github.workspace}}/Server/UniScan.Server.Host
52+
-c ${{matrix.type}}
53+
-r ${{matrix.id}}
54+
-o ${{steps.strings.outputs.build-output-dir}}
55+
56+
- name: Upload Artifact
57+
uses: actions/upload-artifact@v7
58+
with:
59+
name: UniScan.Server.Host_${{matrix.type}}_${{matrix.id}}
60+
path: |
61+
${{steps.strings.outputs.build-output-dir}}
62+
63+
release-server:
64+
needs: build-server
65+
if: ${{ inputs.create_release == true }}
66+
runs-on: ubuntu-latest
67+
permissions:
68+
contents: write
69+
steps:
70+
- uses: actions/checkout@v7
71+
with:
72+
submodules: 'recursive'
73+
74+
- uses: actions/setup-dotnet@v6
75+
with:
76+
dotnet-version: '10.0.x'
77+
78+
- name: Download artifacts
79+
uses: actions/download-artifact@v8
80+
with:
81+
path: ./artifacts
82+
pattern: UniScan.Server.Host_*
83+
skip-decompress: true
84+
85+
- name: Move zips
86+
run: |
87+
mkdir -p ./zip
88+
89+
find ./artifacts/ -mindepth 2 -maxdepth 2 -name "*.zip" -exec mv -t ./zip {} +
90+
91+
- name: Create release
92+
if: ${{ inputs.create_release == true }}
93+
env:
94+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
95+
run: |
96+
VERSION=$(dotnet msbuild ${{github.workspace}}/Server/UniScan.Server.Host/UniScan.Server.Host.csproj -nologo -getProperty:AssemblyVersion | xargs)
97+
TAG=$(echo UniScan.Server.Host/$VERSION)
98+
99+
gh release create "$TAG" \
100+
./zip/* \
101+
--title "UniScan Server v$VERSION" \
102+
--generate-notes

‎Client/UniScan.Client.Core/Config/Types/RemoteServer.cs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ public class RemoteServer
6363

6464
private readonly IServiceProvider _serviceProvider;
6565

66-
public RemoteServer(string displayName, IRemoteConnectionMethod connectionMethod, IEnumerable<IPipelineConfigurator> configurators, IServiceProvider serviceProvider)
66+
public RemoteServer(string displayName, IRemoteConnectionMethod connectionMethod, IEnumerable<IPipelineConfigurator> configurators, PacketRegistry packetRegistry, IServiceProvider serviceProvider)
6767
{
6868
DisplayName = displayName;
6969
ConnectionMethod = connectionMethod;
7070
_serviceProvider = serviceProvider;
7171

72-
Socket = new ClientSocket(new UniScanClientChannelInitializer(PacketRegistry.Instance, configurators, _serviceProvider), ConnectionMethod);
72+
Socket = new ClientSocket(new UniScanClientChannelInitializer(packetRegistry, configurators, _serviceProvider), ConnectionMethod);
7373
Socket.ConnectionState.Connected += (sender, args) =>
7474
{
7575
_connected.Value = true;
@@ -83,7 +83,7 @@ public RemoteServer(string displayName, IRemoteConnectionMethod connectionMethod
8383
};
8484
}
8585

86-
public RemoteServer(RemoteDto dto, IEnumerable<IPipelineConfigurator> configurators, IServiceProvider serviceProvider) : this(dto.DisplayName, dto.ConnectionMethod, configurators, serviceProvider) {}
86+
public RemoteServer(RemoteDto dto, IEnumerable<IPipelineConfigurator> configurators, PacketRegistry packetRegistry, IServiceProvider serviceProvider) : this(dto.DisplayName, dto.ConnectionMethod, configurators, packetRegistry, serviceProvider) {}
8787

8888
public async Task RunConnectionAsync()
8989
{

‎Client/UniScan.Client.Core/DI/Factory/RemoteFactory.cs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.Extensions.DependencyInjection;
22
using Shiki.Common.Identity;
33
using UniScan.Client.Core.Config.Types;
4+
using UniScan.Network;
45
using UniScan.Network.Client.Remote.Connection;
56
using UniScan.Network.Data.Info.Software;
67
using UniScan.Network.Packet.Packets.Serverbound.Client;
@@ -15,5 +16,5 @@ public interface IRemoteFactory
1516

1617
public class RemoteFactory(IServiceProvider provider) : IRemoteFactory
1718
{
18-
public RemoteServer Create(string displayName, IRemoteConnectionMethod connectionMethod) => new(displayName, connectionMethod, provider.GetServices<IPipelineConfigurator>(), provider);
19+
public RemoteServer Create(string displayName, IRemoteConnectionMethod connectionMethod) => new(displayName, connectionMethod, provider.GetServices<IPipelineConfigurator>(), provider.GetRequiredService<PacketRegistry>(), provider);
1920
}

‎Client/UniScan.Client.Core/Module/Modules/Internal/InternalUniScanClientModule.cs‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ public void ConfigureDi(IServiceCollection services)
1818
{
1919
services.AddTransient<DisconnectPacketHandler>();
2020

21-
services.AddSingleton<IPacketConfigurator, InternalUniScanClientPacketConfigurator>();
2221
services.AddSingleton<IPipelineConfigurator, InternalUniScanClientPipelineConfigurator>();
2322
}
2423
}

‎Client/UniScan.Client.Core/Module/Modules/Internal/InternalUniScanClientPacketConfigurator.cs‎

Lines changed: 0 additions & 16 deletions
This file was deleted.

‎Client/UniScan.Client.Core/UniScan.Client.Core.csproj‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<Nullable>enable</Nullable>
77
<LangVersion>14</LangVersion>
88
<Company>UniScan</Company>
9-
<AssemblyVersion>0.0.1</AssemblyVersion>
10-
<FileVersion>0.0.1</FileVersion>
9+
<AssemblyVersion>0.1.0</AssemblyVersion>
10+
<FileVersion>0.1.0</FileVersion>
1111
</PropertyGroup>
1212

1313
<ItemGroup>

‎Client/UniScan.Client.Core/UniScanClient.cs‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using UniScan.Core.Serialization;
1414
using UniScan.Network;
1515
using UniScan.Network.Data.Info.Software;
16+
using UniScan.Network.Registry.Source.Sources;
1617
using UniScan.Network.Socket.Configuration;
1718
using UniScan.Platform;
1819
using Constants = UniScan.Core.Constants;
@@ -64,16 +65,14 @@ public static async Task<UniScanClient> CreateInstanceAsync(HostEnvironment envi
6465

6566
services.AddKeyedSingleton("PolymorphicJsonOptions", PolymorphicJsonOptionsFactory.Get());
6667
services.AddSingleton<IRemoteFactory, RemoteFactory>();
68+
69+
services.AddSingleton<PacketRegistry>();
6770

6871
ServiceProvider serviceProvider = services.BuildServiceProvider();
6972

7073
logger.Information("Registering packets");
71-
72-
var packetConfigurators = serviceProvider.GetServices<IPacketConfigurator>();
73-
foreach (IPacketConfigurator configurator in packetConfigurators)
74-
{
75-
configurator.ConfigurePackets(PacketRegistry.Instance);
76-
}
74+
PacketRegistry registry = serviceProvider.GetRequiredService<PacketRegistry>();
75+
registry.RegisterFromSource<AssembliesPacketSource>();
7776

7877
IRemoteFactory rf = serviceProvider.GetRequiredService<IRemoteFactory>();
7978
JsonSerializerOptions opt = serviceProvider.GetRequiredKeyedService<JsonSerializerOptions>("PolymorphicJsonOptions");

‎Network/UniScan.Network/BuiltinPacketRegistrar.cs‎

Lines changed: 0 additions & 35 deletions
This file was deleted.

Network/UniScan.Network/Packet/Packets/Clientbound/Device/ScannerInfoPacket.cs renamed to Network/UniScan.Network/Packet/Packets/Clientbound/Device/ScannerRegistrationPacket.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
namespace UniScan.Network.Packet.Packets.Clientbound.Device;
55

6-
[RegistryPacket("UniScan", "packet", "clientbound", "device", "info")]
7-
public record ScannerInfoPacket(
6+
[RegistryPacket("UniScan", "packet", "clientbound", "device", "registration")]
7+
public record ScannerRegistrationPacket(
88
string? DisplayName,
99
Guid? RequestId,
1010
Identifier ScannerIdentifier

0 commit comments

Comments
 (0)