Compare commits

..

No commits in common. "2b31505a9be9c68b95a16782bcaacf2096315591" and "fb3ca21fe6a3066f682761d8fe2bc767e7a81664" have entirely different histories.

5 changed files with 119 additions and 140 deletions

View file

@ -1,9 +1,9 @@
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/**
@ -33,7 +33,7 @@ jobs:
dotnet build RaiNote.PacketMediator.csproj -c Release 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
@ -60,7 +60,7 @@ jobs:
dotnet nuget push "*.nupkg" --api-key ${{secrets.nuget_api_key}} --source https://forge.rainote.dev/api/packages/rainote/nuget/index.json 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:efe7d859ca6f98a21b3b0471ab48455af597a064d719f65332d0f105aadcad65 container: catthehacker/ubuntu:act-latest@sha256:efe7d859ca6f98a21b3b0471ab48455af597a064d719f65332d0f105aadcad65
steps: steps:

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.7.1.15 rev: v1.6.26.11
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.14.0 rev: v2.12.0
hooks: hooks:
- id: pretty-format-yaml - id: pretty-format-yaml
args: [--autofix, --indent, '2'] args: [ --autofix, --indent, '2' ]

View file

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

View file

@ -1,4 +1,4 @@
// Licensed to Timothy Schenk under the Apache 2.0 License. // Licensed to Timothy Schenk under the Apache 2.0 License.
namespace PacketMediator.Samples; namespace PacketMediator.Samples;

View file

@ -23,14 +23,12 @@ 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>>( _channel = Channel.CreateUnbounded<ValueTuple<byte[], TPacketIdEnum, TSession>>(new UnboundedChannelOptions
new UnboundedChannelOptions
{ {
AllowSynchronousContinuations = false, AllowSynchronousContinuations = false,
SingleReader = false, SingleReader = false,
SingleWriter = 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));
@ -47,11 +45,9 @@ public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : En
{ {
var packetHandler = var packetHandler =
ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider, ActivatorUtilities.GetServiceOrCreateInstance(serviceProvider,
packetHandlerPair.Value packetHandlerPair.Value);
);
_packetHandlersInstantiation.TryAdd(packetHandlerPair.Key, packetHandler as IPacketHandler<TSession>); _packetHandlersInstantiation.TryAdd(packetHandlerPair.Key, packetHandler as IPacketHandler<TSession>);
} });
);
allIncomingPackets.ForEach(packetsType => allIncomingPackets.ForEach(packetsType =>
{ {
var lambda = CodeGenerator.Lambda<Func<byte[], IIncomingPacket>>(fun => var lambda = CodeGenerator.Lambda<Func<byte[], IIncomingPacket>>(fun =>
@ -64,12 +60,9 @@ public class PacketDistributor<TPacketIdEnum, TSession> where TPacketIdEnum : En
CodeGenerator.Call(packetVariable, nameof(IIncomingPacket.Deserialize), argPacketData); CodeGenerator.Call(packetVariable, nameof(IIncomingPacket.Deserialize), argPacketData);
CodeGenerator.Return(packetVariable); CodeGenerator.Return(packetVariable);
} }).Compile();
)
.Compile();
tempDeserializationMap.TryAdd(packetsType.Key, lambda); tempDeserializationMap.TryAdd(packetsType.Key, lambda);
} });
);
_deserializationMap = tempDeserializationMap.ToImmutableDictionary(); _deserializationMap = tempDeserializationMap.ToImmutableDictionary();
} }
@ -81,13 +74,11 @@ 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;
@ -98,32 +89,20 @@ 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 } && t is { IsClass: true, IsAbstract: false } && Array.Exists(t
Array.Exists(t .GetInterfaces(), i =>
.GetInterfaces(), i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketHandler<,>)))
i =>
i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketHandler<,>)
)
)
.Select(packetHandlerType => new .Select(packetHandlerType => new
{ {
Type = packetHandlerType, Type = packetHandlerType,
PacketId = packetHandlerType PacketId = packetHandlerType
.GetInterfaces() .GetInterfaces().First(t1 =>
.First(t1 =>
t1 is { IsGenericType: true } && t1 is { IsGenericType: true } &&
t1.GetGenericTypeDefinition() == typeof(IPacketHandler<,>) t1.GetGenericTypeDefinition() == typeof(IPacketHandler<,>)).GetGenericArguments()
) .First(genericType => genericType.GetInterfaces().Any(packetType =>
.GetGenericArguments() packetType == typeof(IPacket)))
.First(genericType => genericType.GetInterfaces()
.Any(packetType =>
packetType == typeof(IPacket)
)
)
.GetCustomAttribute<PacketIdAttribute<TPacketIdEnum>>() .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));