Compare commits

..

30 commits

Author SHA1 Message Date
1bd3334dae chore(deps): update dependency meziantou.analyzer to v2.0.163
Signed-off-by: noreply@rainote.dev
2024-08-15 20:20:17 +00:00
9e505b9eb2 chore(deps): update dependency xunit to v2.9.0
Signed-off-by: noreply@rainote.dev
2024-08-15 20:20:08 +00:00
32d843bdc6 chore(deps): update dependency dotnet-sdk to v8.0.400
Signed-off-by: noreply@rainote.dev
2024-08-15 20:20:02 +00:00
b70a73e344 chore(deps): update dependency microsoft.visualstudio.threading.analyzers to v17.11.20
Signed-off-by: noreply@rainote.dev
2024-08-15 20:19:55 +00:00
495dac671c chore(deps): update .net dotnext to v5.12.0
Signed-off-by: noreply@rainote.dev
2024-08-14 00:01:25 +00:00
2b31505a9b
chore: formatting 2024-08-07 21:57:19 +02:00
2955b62012
chore: update pre-commit 2024-08-07 21:55:55 +02:00
fb3ca21fe6
fix: nullable must be handled 2024-08-07 21:33:12 +02:00
f749ae2058
chore: avoid error for now 2024-08-07 21:33:12 +02:00
b34628b673 chore(deps): update dependency xunit.runner.visualstudio to v2.8.2
Signed-off-by: noreply@rainote.dev
2024-08-07 19:32:02 +00:00
c0f3db95ce chore(deps): update dependency microsoft.visualstudio.threading.analyzers to v17.10.48
Signed-off-by: noreply@rainote.dev
2024-08-07 19:31:49 +00:00
dc03cbd848 chore(deps): update dependency microsoft.net.test.sdk to v17.10.0
Signed-off-by: noreply@rainote.dev
2024-08-07 19:31:35 +00:00
436335cb65 chore(deps): update dependency jetbrains.annotations to v2024
Signed-off-by: noreply@rainote.dev
2024-08-07 19:31:31 +00:00
b6da3f68a3 chore(deps): update dependency dotnet-sdk to v8.0.303
Signed-off-by: noreply@rainote.dev
2024-08-07 19:30:59 +00:00
b5ac05a853
chore: minor improvements 2024-08-07 19:05:41 +02:00
2e9539c3c0
chore: weird issue 2024-04-04 17:24:38 +02:00
d27e6eb8b4
chore: nuget improvements
Some checks failed
Release Rai.PacketMediator / preprocess (push) Successful in 2s
Release Rai.PacketMediator / build (push) Successful in 21s
Release Rai.PacketMediator / generate-licences (push) Successful in 33s
Release Rai.PacketMediator / publish (push) Failing after 23s
2024-04-04 17:21:43 +02:00
a66cb25802
fix: incorrect path
All checks were successful
Release Rai.PacketMediator / preprocess (push) Successful in 3s
Release Rai.PacketMediator / build (push) Successful in 22s
Release Rai.PacketMediator / publish (push) Successful in 25s
Release Rai.PacketMediator / generate-licences (push) Successful in 33s
2024-04-04 16:40:47 +02:00
4dc8fbe845
chore: nuget adjustments for packet ID
Some checks failed
Release Rai.PacketMediator / preprocess (push) Successful in 3s
Release Rai.PacketMediator / build (push) Failing after 18s
Release Rai.PacketMediator / publish (push) Has been skipped
Release Rai.PacketMediator / generate-licences (push) Has been skipped
2024-04-04 16:32:04 +02:00
3b7cf431fa Merge pull request 'chore(deps): update catthehacker/ubuntu:act-latest docker digest to efe7d85' (#17) from renovate/catthehacker-ubuntu-act-latest into main
Reviewed-on: #17
2024-04-04 14:18:17 +00:00
94f96ef5c2 chore(deps): update catthehacker/ubuntu:act-latest docker digest to efe7d85
Signed-off-by: noreply@rainote.dev
2024-04-04 14:18:17 +00:00
5a8b5478b5 Merge pull request 'chore(deps): update dependency microsoft.extensions.logging.abstractions to v8.0.1' (#10) from renovate/microsoft.extensions.logging.abstractions-8.x into main
Reviewed-on: #10
2024-04-04 14:10:14 +00:00
60736d7e60 chore(deps): update dependency microsoft.extensions.logging.abstractions to v8.0.1
Signed-off-by: noreply@rainote.dev
2024-04-04 14:10:14 +00:00
3caa69af9b Merge pull request 'chore(deps): update .net dotnext' (#18) from renovate/net-dotnext into main
Reviewed-on: #18
2024-04-04 14:10:05 +00:00
77c3f881d9 chore(deps): update .net dotnext
Signed-off-by: noreply@rainote.dev
2024-03-20 20:01:51 +00:00
22869ad78f Merge pull request 'chore(deps): update dependency dotnet-sdk to v8.0.203' (#15) from renovate/dotnet-sdk-8.x into main
Reviewed-on: #15
2024-03-15 07:00:03 +00:00
5daf90ca65 chore(deps): update dependency dotnet-sdk to v8.0.203
Signed-off-by: noreply@rainote.dev
2024-03-15 07:00:03 +00:00
6c32c74a27 Merge pull request 'chore(deps): update dependency meziantou.analyzer to v2.0.146' (#16) from renovate/meziantou.analyzer-2.x into main
Reviewed-on: #16
2024-03-15 06:59:57 +00:00
c0124d4d75 chore(deps): update dependency meziantou.analyzer to v2.0.146
Signed-off-by: noreply@rainote.dev
2024-03-15 02:01:46 +00:00
f3c896f13c chore(deps): update .net dotnext to v5.2.0
Signed-off-by: noreply@rainote.dev
2024-03-14 14:02:07 +00:00
17 changed files with 192 additions and 148 deletions

View file

@ -1,11 +1,11 @@
name: Release Rai.PacketMediator name: Release Rai.PacketMediator
run-name: ${{ gitea.actor }} is building the Server application run-name: ${{ gitea.actor }} is building the Server application
on: on:
push: push:
tags: tags:
- 'v*.*.*' - v*.*.*
paths-ignore: paths-ignore:
- .run/** - .run/**
jobs: jobs:
preprocess: preprocess:
@ -13,72 +13,75 @@ jobs:
outputs: outputs:
sanitized_branch_name: ${{ steps.sanitize.outputs.sanitized_branch_name }} sanitized_branch_name: ${{ steps.sanitize.outputs.sanitized_branch_name }}
steps: steps:
- name: Sanitize branch name - name: Sanitize branch name
id: sanitize id: sanitize
run: echo "::set-output name=sanitized_branch_name::$(echo ${{ github.ref_name }} | sed 's/\//-/g')" run: echo "::set-output name=sanitized_branch_name::$(echo ${{ github.ref_name }} | sed 's/\//-/g')"
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup dotnet - name: Setup dotnet
uses: https://github.com/actions/setup-dotnet@v3 uses: https://github.com/actions/setup-dotnet@v3
with: with:
global-json-file: global.json global-json-file: global.json
- name: Install dependencies - name: Install dependencies
run: dotnet restore run: dotnet restore
- name: Build - name: Build
run: | run: |
dotnet build Rai.PacketMediator.csproj -c Release cd RaiNote.PacketMediator
dotnet build RaiNote.PacketMediator.csproj -c Release
publish: publish:
needs: [ build ] needs: [build]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup dotnet - name: Setup dotnet
uses: https://github.com/actions/setup-dotnet@v3 uses: https://github.com/actions/setup-dotnet@v3
with: with:
global-json-file: global.json global-json-file: global.json
- name: Install dependencies - name: Install dependencies
run: dotnet restore run: dotnet restore
- name: Extract Version - name: Extract Version
run: | run: |
VERSION=${GITHUB_REF#refs/tags/v} VERSION=${GITHUB_REF#refs/tags/v}
echo "Extracted version is $VERSION" echo "Extracted version is $VERSION"
echo "VERSION=$VERSION" >> $GITHUB_ENV echo "VERSION=$VERSION" >> $GITHUB_ENV
shell: bash shell: bash
- name: Pack nugets - name: Pack nuget package
run: | run: |
dotnet build Rai.PacketMediator.csproj -c Release -p:PackageVersion=${{env.VERSION}} cd RaiNote.PacketMediator
dotnet pack -c Release -p:PackageVersion=${{env.VERSION}} --output . dotnet build RaiNote.PacketMediator.csproj -c Release -p:PackageVersion=${{env.VERSION}}
- name: Push to NuGet dotnet pack -c Release -p:PackageVersion=${{env.VERSION}} --output .
run: | - name: Push to NuGet
dotnet nuget push "*.nupkg" --api-key ${{secrets.nuget_api_key}} --source https://forge.rainote.dev/api/packages/rainote/nuget/index.json run: |
cd RaiNote.PacketMediator
dotnet nuget push "*.nupkg" --api-key ${{secrets.nuget_api_key}} --source https://forge.rainote.dev/api/packages/rainote/nuget/index.json
generate-licences: generate-licences:
needs: [ build, preprocess ] needs: [build, preprocess]
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: catthehacker/ubuntu:act-latest@sha256:be6661897e8b51abab7e30728b387475dcb340da5ebf13a53965ef7c642034ff container: catthehacker/ubuntu:act-latest@sha256:efe7d859ca6f98a21b3b0471ab48455af597a064d719f65332d0f105aadcad65
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Setup dotnet - name: Setup dotnet
uses: https://github.com/actions/setup-dotnet@v3 uses: https://github.com/actions/setup-dotnet@v3
with: with:
dotnet-version: | dotnet-version: |
7.0 7.0
8.0 8.0
- name: Install dependencies - name: Install dependencies
run: | run: |
dotnet restore dotnet restore
echo "::add-path::$HOME/.dotnet/tools" echo "::add-path::$HOME/.dotnet/tools"
- name: Install nuget-license - name: Install nuget-license
run: dotnet tool install --global dotnet-project-licenses run: dotnet tool install --global dotnet-project-licenses
- name: Export licenses - name: Export licenses
run: dotnet-project-licenses -i . -u --projects-filter projects_ignore_licenses.json -m -j -e -f licenses run: dotnet-project-licenses -i . -u --projects-filter projects_ignore_licenses.json -m -j -e -f licenses
- name: Upload licenses - name: Upload licenses
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v3
with: with:
name: licenses name: licenses
path: licenses path: licenses
retention-days: 31 retention-days: 31

View file

@ -1,19 +1,19 @@
repos: repos:
- repo: local - repo: local
hooks: hooks:
#Use dotnet format already installed on your machine #Use dotnet format already installed on your machine
- id: dotnet-format - id: dotnet-format
name: dotnet-format name: dotnet-format
language: system language: system
entry: dotnet format --include entry: dotnet format --include
types_or: [ c#, vb ] types_or: [c#, vb]
- repo: https://github.com/Mateusz-Grzelinski/actionlint-py - repo: https://github.com/Mateusz-Grzelinski/actionlint-py
rev: v1.6.26.11 rev: v1.7.1.15
hooks: hooks:
- id: actionlint - id: actionlint
additional_dependencies: [ pyflakes>=3.0.1, shellcheck-py>=0.9.0.5 ] additional_dependencies: [pyflakes>=3.0.1, shellcheck-py>=0.9.0.5]
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
rev: v2.12.0 rev: v2.14.0
hooks: hooks:
- id: pretty-format-yaml - id: pretty-format-yaml
args: [ --autofix, --indent, '2' ] args: [--autofix, --indent, '2']

View file

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Rai.PacketMediator\Rai.PacketMediator.csproj" /> <ProjectReference Include="..\RaiNote.PacketMediator\RaiNote.PacketMediator.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -0,0 +1,3 @@
// Licensed to Timothy Schenk under the Apache 2.0 License.
Console.WriteLine("Hello World!");

View file

@ -0,0 +1,8 @@
// Licensed to Timothy Schenk under the Apache 2.0 License.
namespace PacketMediator.Samples;
public class Sample
{
}

View file

@ -15,9 +15,9 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="FluentAssertions" Version="6.12.0" /> <PackageReference Include="FluentAssertions" Version="6.12.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="xunit" Version="2.7.0" /> <PackageReference Include="xunit" Version="2.9.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7"> <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
@ -28,7 +28,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Rai.PacketMediator\Rai.PacketMediator.csproj" /> <ProjectReference Include="..\RaiNote.PacketMediator\RaiNote.PacketMediator.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59 VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rai.PacketMediator", "Rai.PacketMediator\Rai.PacketMediator.csproj", "{13243A92-DC1E-4DBF-8E2C-13CE9ABFEAD3}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RaiNote.PacketMediator", "RaiNote.PacketMediator\RaiNote.PacketMediator.csproj", "{13243A92-DC1E-4DBF-8E2C-13CE9ABFEAD3}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PacketMediator.Samples", "PacketMediator.Samples\PacketMediator.Samples.csproj", "{C20254E6-0C15-43A4-9C4A-1D0B547F7983}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PacketMediator.Samples", "PacketMediator.Samples\PacketMediator.Samples.csproj", "{C20254E6-0C15-43A4-9C4A-1D0B547F7983}"
EndProject EndProject

View file

@ -2,7 +2,7 @@
using JetBrains.Annotations; using JetBrains.Annotations;
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
[UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)] [UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)]
public interface IBidirectionalPacket : IOutgoingPacket, IIncomingPacket; public interface IBidirectionalPacket : IOutgoingPacket, IIncomingPacket;

View file

@ -2,7 +2,7 @@
using JetBrains.Annotations; using JetBrains.Annotations;
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
[UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)] [UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)]
public interface IIncomingPacket : IPacket public interface IIncomingPacket : IPacket

View file

@ -2,7 +2,7 @@
using JetBrains.Annotations; using JetBrains.Annotations;
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
[UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)] [UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)]
public interface IOutgoingPacket : IPacket public interface IOutgoingPacket : IPacket

View file

@ -1,5 +1,5 @@
// Licensed to Timothy Schenk under the Apache 2.0 License. // Licensed to Timothy Schenk under the Apache 2.0 License.
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
public interface IPacket; public interface IPacket;

View file

@ -3,7 +3,7 @@
using System.Diagnostics; using System.Diagnostics;
using JetBrains.Annotations; using JetBrains.Annotations;
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
[UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)] [UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)]
public interface IPacketHandler<in TIncomingPacket, in TSession> : IPacketHandler<TSession> public interface IPacketHandler<in TIncomingPacket, in TSession> : IPacketHandler<TSession>

View file

@ -9,7 +9,7 @@ using DotNext.Linq.Expressions;
using DotNext.Metaprogramming; using DotNext.Metaprogramming;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : Enum public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : Enum
{ {
@ -23,12 +23,14 @@ public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : En
public PacketDistributor(IServiceProvider serviceProvider, public PacketDistributor(IServiceProvider serviceProvider,
IEnumerable<Assembly> sourcesContainingPackets, IEnumerable<Assembly> sourcesContainingPacketHandlers) IEnumerable<Assembly> sourcesContainingPackets, IEnumerable<Assembly> sourcesContainingPacketHandlers)
{ {
_channel = Channel.CreateUnbounded<ValueTuple<byte[], TPacketIdEnum, TSession>>(new UnboundedChannelOptions _channel = Channel.CreateUnbounded<ValueTuple<byte[], TPacketIdEnum, TSession>>(
{ new UnboundedChannelOptions
AllowSynchronousContinuations = false, {
SingleReader = false, AllowSynchronousContinuations = false,
SingleWriter = false SingleReader = false,
}); SingleWriter = false
}
);
var containingPackets = sourcesContainingPackets as Assembly[] ?? sourcesContainingPackets.ToArray(); var containingPackets = sourcesContainingPackets as Assembly[] ?? sourcesContainingPackets.ToArray();
var allIncomingPackets = GetAllPackets(containingPackets, typeof(IIncomingPacket)); var allIncomingPackets = GetAllPackets(containingPackets, typeof(IIncomingPacket));
var allOutgoingPackets = GetAllPackets(containingPackets, typeof(IOutgoingPacket)); var allOutgoingPackets = GetAllPackets(containingPackets, typeof(IOutgoingPacket));
@ -42,27 +44,32 @@ public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : En
new ConcurrentDictionary<TPacketIdEnum, Func<byte[], IIncomingPacket>>(); new ConcurrentDictionary<TPacketIdEnum, Func<byte[], IIncomingPacket>>();
_packetHandlersInstantiation = new ConcurrentDictionary<TPacketIdEnum, IPacketHandler<TSession>?>(); _packetHandlersInstantiation = new ConcurrentDictionary<TPacketIdEnum, IPacketHandler<TSession>?>();
packetHandlers.ForEach(packetHandlerPair => packetHandlers.ForEach(packetHandlerPair =>
{
var packetHandler =
ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider,
packetHandlerPair.Value);
_packetHandlersInstantiation.TryAdd(packetHandlerPair.Key, packetHandler as IPacketHandler<TSession>);
});
allIncomingPackets.ForEach(packetsType =>
{
var lambda = CodeGenerator.Lambda<Func<byte[], IIncomingPacket>>(fun =>
{ {
var argPacketData = fun[0]; var packetHandler =
var newPacket = packetsType.Value.New(); ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider,
packetHandlerPair.Value
);
_packetHandlersInstantiation.TryAdd(packetHandlerPair.Key, packetHandler as IPacketHandler<TSession>);
}
);
allIncomingPackets.ForEach(packetsType =>
{
var lambda = CodeGenerator.Lambda<Func<byte[], IIncomingPacket>>(fun =>
{
var argPacketData = fun[0];
var newPacket = packetsType.Value.New();
var packetVariable = CodeGenerator.DeclareVariable(packetsType.Value, "packet"); var packetVariable = CodeGenerator.DeclareVariable(packetsType.Value, "packet");
CodeGenerator.Assign(packetVariable, newPacket); CodeGenerator.Assign(packetVariable, newPacket);
CodeGenerator.Call(packetVariable, nameof(IIncomingPacket.Deserialize), argPacketData); CodeGenerator.Call(packetVariable, nameof(IIncomingPacket.Deserialize), argPacketData);
CodeGenerator.Return(packetVariable); CodeGenerator.Return(packetVariable);
}).Compile(); }
tempDeserializationMap.TryAdd(packetsType.Key, lambda); )
}); .Compile();
tempDeserializationMap.TryAdd(packetsType.Key, lambda);
}
);
_deserializationMap = tempDeserializationMap.ToImmutableDictionary(); _deserializationMap = tempDeserializationMap.ToImmutableDictionary();
} }
@ -74,11 +81,13 @@ public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : En
{ {
var packetsWithId = sourcesContainingPackets.SelectMany(a => a.GetTypes() var packetsWithId = sourcesContainingPackets.SelectMany(a => a.GetTypes()
.Where(type => type is { IsInterface: false, IsAbstract: false } && .Where(type => type is { IsInterface: false, IsAbstract: false } &&
type.GetInterfaces().Contains(packetType) type.GetInterfaces().Contains(packetType) &&
&& type.GetCustomAttributes<PacketIdAttribute<TPacketIdEnum>>().Any() type.GetCustomAttributes<PacketIdAttribute<TPacketIdEnum>>().Any()
)) )
)
.Select(type => .Select(type =>
new { Type = type, Attribute = type.GetCustomAttribute<PacketIdAttribute<TPacketIdEnum>>() }) new { Type = type, Attribute = type.GetCustomAttribute<PacketIdAttribute<TPacketIdEnum>>() }
)
.Select(x => new KeyValuePair<TPacketIdEnum, Type>(x.Attribute!.Code, x.Type)); .Select(x => new KeyValuePair<TPacketIdEnum, Type>(x.Attribute!.Code, x.Type));
return packetsWithId; return packetsWithId;
@ -89,20 +98,32 @@ public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : En
{ {
var packetHandlersWithId = sourcesContainingPacketHandlers.SelectMany(assembly => assembly.GetTypes() var packetHandlersWithId = sourcesContainingPacketHandlers.SelectMany(assembly => assembly.GetTypes()
.Where(t => .Where(t =>
t is { IsClass: true, IsAbstract: false } && Array.Exists(t t is { IsClass: true, IsAbstract: false } &&
.GetInterfaces(), i => Array.Exists(t
i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketHandler<,>))) .GetInterfaces(),
i =>
i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketHandler<,>)
)
)
.Select(packetHandlerType => new .Select(packetHandlerType => new
{ {
Type = packetHandlerType, Type = packetHandlerType,
PacketId = packetHandlerType PacketId = packetHandlerType
.GetInterfaces().First(t1 => .GetInterfaces()
t1 is { IsGenericType: true } && .First(t1 =>
t1.GetGenericTypeDefinition() == typeof(IPacketHandler<,>)).GetGenericArguments() t1 is { IsGenericType: true } &&
.First(genericType => genericType.GetInterfaces().Any(packetType => t1.GetGenericTypeDefinition() == typeof(IPacketHandler<,>)
packetType == typeof(IPacket))) )
.GetCustomAttribute<PacketIdAttribute<TPacketIdEnum>>() .GetGenericArguments()
})) .First(genericType => genericType.GetInterfaces()
.Any(packetType =>
packetType == typeof(IPacket)
)
)
.GetCustomAttribute<PacketIdAttribute<TPacketIdEnum>>()
}
)
)
.Where(x => x.PacketId != null) .Where(x => x.PacketId != null)
.Select(x => new KeyValuePair<TPacketIdEnum, Type>(x.PacketId!.Code, x.Type)); .Select(x => new KeyValuePair<TPacketIdEnum, Type>(x.PacketId!.Code, x.Type));

View file

@ -3,7 +3,7 @@
using System.Reflection; using System.Reflection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
public class PacketDistributorService<TPacketIdEnum, TSession> : IHostedService public class PacketDistributorService<TPacketIdEnum, TSession> : IHostedService
where TPacketIdEnum : Enum where TPacketIdEnum : Enum
@ -13,13 +13,15 @@ public class PacketDistributorService<TPacketIdEnum, TSession> : IHostedService
public PacketDistributorService(IServiceProvider serviceProvider, public PacketDistributorService(IServiceProvider serviceProvider,
IEnumerable<Assembly> sourcesContainingPackets, IEnumerable<Assembly> sourcesContainingPacketHandlers) IEnumerable<Assembly> sourcesContainingPackets, IEnumerable<Assembly> sourcesContainingPacketHandlers)
{ {
_packetDistributor = new PacketDistributor<TPacketIdEnum, TSession>(serviceProvider, sourcesContainingPackets, _packetDistributor = new PacketDistributor<TPacketIdEnum, TSession>(serviceProvider,
sourcesContainingPacketHandlers); sourcesContainingPackets,
sourcesContainingPacketHandlers
);
} }
public Task StartAsync(CancellationToken cancellationToken) public async Task StartAsync(CancellationToken cancellationToken)
{ {
return _packetDistributor.DequeuePacketAsync(cancellationToken); await _packetDistributor.DequeuePacketAsync(cancellationToken);
} }
public Task StopAsync(CancellationToken cancellationToken) public Task StopAsync(CancellationToken cancellationToken)
@ -32,15 +34,10 @@ public class PacketDistributorService<TPacketIdEnum, TSession> : IHostedService
return _packetDistributor.AddPacketAsync(packetData, operationCode, session); return _packetDistributor.AddPacketAsync(packetData, operationCode, session);
} }
public TPacketIdEnum GetOperationCodeByPacketType(IPacket packet) public DotNext.Optional<TPacketIdEnum> GetOperationCodeByPacketType(IPacket packet)
{ {
var type = packet.GetType(); var type = packet.GetType();
_packetDistributor.PacketIdMap.TryGetValue(type, out var value); _packetDistributor.PacketIdMap.TryGetValue(type, out var value);
if (value is null) return value ?? DotNext.Optional<TPacketIdEnum>.None;
{
throw new ArgumentOutOfRangeException(type.Name);
}
return value;
} }
} }

View file

@ -1,6 +1,6 @@
// Licensed to Timothy Schenk under the Apache 2.0 License. // Licensed to Timothy Schenk under the Apache 2.0 License.
namespace Rai.PacketMediator; namespace RaiNote.PacketMediator;
[AttributeUsage(AttributeTargets.Class, Inherited = false)] [AttributeUsage(AttributeTargets.Class, Inherited = false)]
public abstract class PacketIdAttribute<TPacketIdEnum> : Attribute where TPacketIdEnum : Enum public abstract class PacketIdAttribute<TPacketIdEnum> : Attribute where TPacketIdEnum : Enum

View file

@ -6,23 +6,35 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<PackageVersion>$(PackageVersion)</PackageVersion> <PackageVersion>$(PackageVersion)</PackageVersion>
<PackageProjectUrl>https://forge.rainote.dev/rainote/PacketMediator</PackageProjectUrl> <PackageProjectUrl>https://forge.rainote.dev/rainote/PacketMediator</PackageProjectUrl>
<PackageLicenseUrl>https://forge.rainote.dev/rainote/PacketMediator/src/branch/main/LICENSE</PackageLicenseUrl> <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<RepositoryUrl>https://forge.rainote.dev/rainote/PacketMediator</RepositoryUrl> <RepositoryUrl>https://forge.rainote.dev/rainote/PacketMediator</RepositoryUrl>
<RepositoryType>GIT</RepositoryType> <RepositoryType>GIT</RepositoryType>
<Version>$(PackageVersion)</Version> <Version>$(PackageVersion)</Version>
<Authors>Timothy (RaiNote) Schenk</Authors>
<AssemblyName>RaiNote.PacketMediator</AssemblyName>
<RootNamespace>RaiNote.PacketMediator</RootNamespace>
<PackageId>RaiNote.PacketMediator</PackageId>
<Title>Packet Mediator</Title>
<Description>A mediator specifically for packet handling when dispatching to respective packet handlers.</Description>
<Product>RaiNote.PacketMediator</Product>
<PackageReadmeFile>README.md</PackageReadmeFile>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<WarningsAsErrors>Nullable</WarningsAsErrors>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DotNext" Version="5.0.2"/> <None Include="../README.md" Pack="true" PackagePath="\"/>
<PackageReference Include="DotNext.Metaprogramming" Version="5.0.2"/> <PackageReference Include="DotNext" Version="5.12.0"/>
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0"/> <PackageReference Include="DotNext.Metaprogramming" Version="5.12.0"/>
<PackageReference Include="Meziantou.Analyzer" Version="2.0.145"> <PackageReference Include="JetBrains.Annotations" Version="2024.2.0"/>
<PackageReference Include="Meziantou.Analyzer" Version="2.0.163">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0"/> <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0"/>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0"/> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1"/>
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.9.28"> <PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.11.20">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

View file

@ -1,6 +1,6 @@
{ {
"sdk": { "sdk": {
"version": "8.0.202", "version": "8.0.400",
"rollForward": "latestMinor", "rollForward": "latestMinor",
"allowPrerelease": false "allowPrerelease": false
} }