From 90bf31a83ce43c3672be4b86275702241511f524 Mon Sep 17 00:00:00 2001 From: Kaioru Date: Tue, 20 Aug 2024 19:10:41 +0800 Subject: [PATCH] Add dispatch service implementation --- Edelstein.sln | 7 + .../Edelstein.Application.Server.csproj | 1 + .../ProgramHostBuilder.cs | 3 + .../packages.lock.json | 17 +++ .../packages.lock.json | 8 + .../packages.lock.json | 8 + .../packages.lock.json | 8 + .../packages.lock.json | 8 + .../packages.lock.json | 8 + .../DispatchService.Send.cs | 81 +++++++++++ .../DispatchService.Subscribe.cs | 27 ++++ .../DispatchService.cs | 13 ++ .../DispatchServiceEntry.cs | 10 ++ .../DispatchServiceEntryRepository.cs | 6 + .../Edelstein.Common.Services.Dispatch.csproj | 8 + .../packages.lock.json | 137 ++++++++++++++++++ .../packages.lock.json | 8 + .../packages.lock.json | 8 + .../packages.lock.json | 8 + .../Edelstein.Plugin.Rue/packages.lock.json | 8 + .../Contexts/LoginContextServices.cs | 2 + .../Edelstein.Protocol.Gameplay.Login.csproj | 1 + .../packages.lock.json | 7 + .../packages.lock.json | 8 + .../DispatchServiceSubscribeResponse.cs | 9 -- .../DispatchTarget.cs | 3 +- .../IDispatchService.cs | 2 +- 27 files changed, 403 insertions(+), 11 deletions(-) create mode 100644 src/common/Edelstein.Common.Services.Dispatch/DispatchService.Send.cs create mode 100644 src/common/Edelstein.Common.Services.Dispatch/DispatchService.Subscribe.cs create mode 100644 src/common/Edelstein.Common.Services.Dispatch/DispatchService.cs create mode 100644 src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntry.cs create mode 100644 src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntryRepository.cs create mode 100644 src/common/Edelstein.Common.Services.Dispatch/Edelstein.Common.Services.Dispatch.csproj create mode 100644 src/common/Edelstein.Common.Services.Dispatch/packages.lock.json delete mode 100644 src/protocol/Edelstein.Protocol.Services.Dispatch/Contracts/DispatchServiceSubscribeResponse.cs diff --git a/Edelstein.sln b/Edelstein.sln index f1651fa01..3614a29a0 100644 --- a/Edelstein.sln +++ b/Edelstein.sln @@ -85,6 +85,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Edelstein.Common.Services.M EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Edelstein.Protocol.Services.Dispatch", "src\protocol\Edelstein.Protocol.Services.Dispatch\Edelstein.Protocol.Services.Dispatch.csproj", "{C9F8DA52-DDA0-4A43-A104-47F38CD6DAE3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Edelstein.Common.Services.Dispatch", "src\common\Edelstein.Common.Services.Dispatch\Edelstein.Common.Services.Dispatch.csproj", "{55B6632F-D547-4133-BDD8-5655B5DD2D64}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -124,6 +126,7 @@ Global {1E8C9556-7283-4C7A-8E2C-D41072FBCE9E} = {82D7864B-19AD-484C-BD2E-897F05B5852C} {AEF75B30-6D2E-44F3-A43A-A99EC4942435} = {E50DFCDF-39D5-4D0D-A46E-94D11D795087} {C9F8DA52-DDA0-4A43-A104-47F38CD6DAE3} = {82D7864B-19AD-484C-BD2E-897F05B5852C} + {55B6632F-D547-4133-BDD8-5655B5DD2D64} = {E50DFCDF-39D5-4D0D-A46E-94D11D795087} EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6527D18C-B0E2-49BA-B649-4D5DB6216069}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -232,5 +235,9 @@ Global {C9F8DA52-DDA0-4A43-A104-47F38CD6DAE3}.Debug|Any CPU.Build.0 = Debug|Any CPU {C9F8DA52-DDA0-4A43-A104-47F38CD6DAE3}.Release|Any CPU.ActiveCfg = Release|Any CPU {C9F8DA52-DDA0-4A43-A104-47F38CD6DAE3}.Release|Any CPU.Build.0 = Release|Any CPU + {55B6632F-D547-4133-BDD8-5655B5DD2D64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55B6632F-D547-4133-BDD8-5655B5DD2D64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55B6632F-D547-4133-BDD8-5655B5DD2D64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55B6632F-D547-4133-BDD8-5655B5DD2D64}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/app/Edelstein.Application.Server/Edelstein.Application.Server.csproj b/src/app/Edelstein.Application.Server/Edelstein.Application.Server.csproj index 1d214f3ed..0d606ad20 100644 --- a/src/app/Edelstein.Application.Server/Edelstein.Application.Server.csproj +++ b/src/app/Edelstein.Application.Server/Edelstein.Application.Server.csproj @@ -32,6 +32,7 @@ + diff --git a/src/app/Edelstein.Application.Server/ProgramHostBuilder.cs b/src/app/Edelstein.Application.Server/ProgramHostBuilder.cs index 4c6c13ea4..2dc05677a 100644 --- a/src/app/Edelstein.Application.Server/ProgramHostBuilder.cs +++ b/src/app/Edelstein.Application.Server/ProgramHostBuilder.cs @@ -7,6 +7,7 @@ using Edelstein.Common.Gameplay.Handling; using Edelstein.Common.Plugin; using Edelstein.Common.Services.Auth; +using Edelstein.Common.Services.Dispatch; using Edelstein.Common.Services.Migration; using Edelstein.Common.Services.Server; using Edelstein.Common.Services.Session; @@ -18,6 +19,7 @@ using Edelstein.Protocol.Gameplay.Login.Contexts; using Edelstein.Protocol.Plugin; using Edelstein.Protocol.Services.Auth; +using Edelstein.Protocol.Services.Dispatch; using Edelstein.Protocol.Services.Migration; using Edelstein.Protocol.Services.Server; using Edelstein.Protocol.Services.Session; @@ -84,6 +86,7 @@ internal static HostApplicationBuilder CreateBuilder() .WithSingletonLifetime()); // TODO gRPC + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); diff --git a/src/app/Edelstein.Application.Server/packages.lock.json b/src/app/Edelstein.Application.Server/packages.lock.json index e50c04106..046af63a8 100644 --- a/src/app/Edelstein.Application.Server/packages.lock.json +++ b/src/app/Edelstein.Application.Server/packages.lock.json @@ -1587,6 +1587,15 @@ "EntityFrameworkCore.Exceptions.Common": "[8.1.3, )" } }, + "edelstein.common.services.dispatch": { + "type": "Project", + "dependencies": { + "Edelstein.Common.Utilities": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", + "Edelstein.Protocol.Services.Session": "[1.0.0, )", + "Edelstein.Protocol.Utilities": "[1.0.0, )" + } + }, "edelstein.common.services.migration": { "type": "Project", "dependencies": { @@ -1634,6 +1643,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1661,6 +1671,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Database.Pgsql/packages.lock.json b/src/common/Edelstein.Common.Database.Pgsql/packages.lock.json index 7a1d31d0d..5ec8db028 100644 --- a/src/common/Edelstein.Common.Database.Pgsql/packages.lock.json +++ b/src/common/Edelstein.Common.Database.Pgsql/packages.lock.json @@ -1342,6 +1342,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1363,6 +1364,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Database.Sqlite/packages.lock.json b/src/common/Edelstein.Common.Database.Sqlite/packages.lock.json index 8694449b4..12fd34beb 100644 --- a/src/common/Edelstein.Common.Database.Sqlite/packages.lock.json +++ b/src/common/Edelstein.Common.Database.Sqlite/packages.lock.json @@ -1380,6 +1380,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1401,6 +1402,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Database/packages.lock.json b/src/common/Edelstein.Common.Database/packages.lock.json index e3061a8f0..8a39b411e 100644 --- a/src/common/Edelstein.Common.Database/packages.lock.json +++ b/src/common/Edelstein.Common.Database/packages.lock.json @@ -1093,6 +1093,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1114,6 +1115,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Gameplay.Login/packages.lock.json b/src/common/Edelstein.Common.Gameplay.Login/packages.lock.json index 275d7262c..c523fb40a 100644 --- a/src/common/Edelstein.Common.Gameplay.Login/packages.lock.json +++ b/src/common/Edelstein.Common.Gameplay.Login/packages.lock.json @@ -983,6 +983,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1004,6 +1005,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Gameplay/packages.lock.json b/src/common/Edelstein.Common.Gameplay/packages.lock.json index 0f6be6880..27f9aba9e 100644 --- a/src/common/Edelstein.Common.Gameplay/packages.lock.json +++ b/src/common/Edelstein.Common.Gameplay/packages.lock.json @@ -977,6 +977,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -998,6 +999,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Services.Dispatch/DispatchService.Send.cs b/src/common/Edelstein.Common.Services.Dispatch/DispatchService.Send.cs new file mode 100644 index 000000000..a1f32f255 --- /dev/null +++ b/src/common/Edelstein.Common.Services.Dispatch/DispatchService.Send.cs @@ -0,0 +1,81 @@ +using System.Linq; +using System.Threading.Tasks; +using Edelstein.Protocol.Services.Dispatch; +using Edelstein.Protocol.Services.Dispatch.Contracts; +using Edelstein.Protocol.Services.Session.Contracts; +using ProtoBuf.Grpc; + +namespace Edelstein.Common.Services.Dispatch; + +public partial class DispatchService +{ + public async Task Send(DispatchServiceSendRequest request, CallContext context = default) + { + switch (request.Info.TargetType) + { + case DispatchTarget.All: + await Task.WhenAll( + (await _serverIdIndex.RetrieveAll()) + .Select(async e + => await e.Channel.WriteAsync(request.Info, context.CancellationToken))); + break; + case DispatchTarget.World: + { + var entry = await _worldIdIndex.Retrieve(request.Info.TargetID); + + if (entry == null) + return new DispatchServiceResponse + { + Result = DispatchServiceResult.FailedUnknown + }; + + await entry.Channel.WriteAsync(request.Info, context.CancellationToken); + break; + } + case DispatchTarget.Channel: + { + var entry = await _channelIdIndex.Retrieve(request.Info.TargetID); + + if (entry == null) + return new DispatchServiceResponse + { + Result = DispatchServiceResult.FailedUnknown + }; + + await entry.Channel.WriteAsync(request.Info, context.CancellationToken); + break; + } + case DispatchTarget.Character: + { + var session = await sessions.GetByActiveCharacter(new SessionServiceGetByActiveCharacterRequest + { + CharacterID = request.Info.TargetID + }); + + if (session.Info != null) + { + var entry = await _serverIdIndex.Retrieve(session.Info.ServerID); + + if (entry == null) + return new DispatchServiceResponse + { + Result = DispatchServiceResult.FailedUnknown + }; + + await entry.Channel.WriteAsync(request.Info, context.CancellationToken); + } + break; + } + default: + return new DispatchServiceResponse + { + Result = DispatchServiceResult.FailedUnknown + }; + } + + return new DispatchServiceResponse + { + Result = DispatchServiceResult.Success + }; + } +} diff --git a/src/common/Edelstein.Common.Services.Dispatch/DispatchService.Subscribe.cs b/src/common/Edelstein.Common.Services.Dispatch/DispatchService.Subscribe.cs new file mode 100644 index 000000000..611e0ccda --- /dev/null +++ b/src/common/Edelstein.Common.Services.Dispatch/DispatchService.Subscribe.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Threading.Channels; +using Edelstein.Protocol.Services.Dispatch.Contracts; +using ProtoBuf.Grpc; + +namespace Edelstein.Common.Services.Dispatch; + +public partial class DispatchService +{ + public async IAsyncEnumerable Subscribe(DispatchServiceSubscribeRequest request, CallContext context = default) + { + var channel = Channel.CreateUnbounded(); + + await _serverIdIndex.Insert(new DispatchServiceEntry(request.ServerID, channel)); + if (request.WorldID.HasValue) await _worldIdIndex.Insert(new DispatchServiceEntry(request.WorldID.Value, channel)); + if (request.ChannelID.HasValue) await _channelIdIndex.Insert(new DispatchServiceEntry(request.ChannelID.Value, channel)); + + while (!context.CancellationToken.IsCancellationRequested) + yield return await channel.Reader.ReadAsync(context.CancellationToken); + + await _serverIdIndex.Delete(request.ServerID); + if (request.WorldID.HasValue) await _worldIdIndex.Delete(request.WorldID.Value); + if (request.ChannelID.HasValue) await _channelIdIndex.Delete(request.ChannelID.Value); + + channel.Writer.Complete(); + } +} diff --git a/src/common/Edelstein.Common.Services.Dispatch/DispatchService.cs b/src/common/Edelstein.Common.Services.Dispatch/DispatchService.cs new file mode 100644 index 000000000..239199dcb --- /dev/null +++ b/src/common/Edelstein.Common.Services.Dispatch/DispatchService.cs @@ -0,0 +1,13 @@ +using Edelstein.Protocol.Services.Dispatch; +using Edelstein.Protocol.Services.Session; + +namespace Edelstein.Common.Services.Dispatch; + +public partial class DispatchService( + ISessionService sessions +) : IDispatchService +{ + private readonly DispatchServiceEntryRepository _serverIdIndex = new(); + private readonly DispatchServiceEntryRepository _worldIdIndex = new(); + private readonly DispatchServiceEntryRepository _channelIdIndex = new(); +} diff --git a/src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntry.cs b/src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntry.cs new file mode 100644 index 000000000..ae3a6e23e --- /dev/null +++ b/src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntry.cs @@ -0,0 +1,10 @@ +using System.Threading.Channels; +using Edelstein.Protocol.Services.Dispatch.Contracts; +using Edelstein.Protocol.Utilities.Repositories; + +namespace Edelstein.Common.Services.Dispatch; + +public record DispatchServiceEntry( + TKey ID, + ChannelWriter Channel +) : IRepositoryEntry; diff --git a/src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntryRepository.cs b/src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntryRepository.cs new file mode 100644 index 000000000..aa9103639 --- /dev/null +++ b/src/common/Edelstein.Common.Services.Dispatch/DispatchServiceEntryRepository.cs @@ -0,0 +1,6 @@ +using Edelstein.Common.Utilities.Repositories; + +namespace Edelstein.Common.Services.Dispatch; + +public class DispatchServiceEntryRepository : Repository> + where TKey : notnull; diff --git a/src/common/Edelstein.Common.Services.Dispatch/Edelstein.Common.Services.Dispatch.csproj b/src/common/Edelstein.Common.Services.Dispatch/Edelstein.Common.Services.Dispatch.csproj new file mode 100644 index 000000000..465087091 --- /dev/null +++ b/src/common/Edelstein.Common.Services.Dispatch/Edelstein.Common.Services.Dispatch.csproj @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/common/Edelstein.Common.Services.Dispatch/packages.lock.json b/src/common/Edelstein.Common.Services.Dispatch/packages.lock.json new file mode 100644 index 000000000..f55bdda8c --- /dev/null +++ b/src/common/Edelstein.Common.Services.Dispatch/packages.lock.json @@ -0,0 +1,137 @@ +{ + "version": 2, + "dependencies": { + "net9.0": { + "MinVer": { + "type": "Direct", + "requested": "[5.0.0, )", + "resolved": "5.0.0", + "contentHash": "ybkgpQMtt0Fo91l5rYtE3TZtD+Nmy5Ko091xvfXXOosQdMi30XO2EZ2+ShZt89gdu7RMmJqZaJ+e1q6d+6+KNw==" + }, + "Grpc.Core.Api": { + "type": "Transitive", + "resolved": "2.51.0", + "contentHash": "WUYCnxZKfdBWCKNs08lWFRoTjESt3iyFDthsZu5KcWguZ4OnnXrTu/K5mIdO+R9dUhuw5Xm1ygUrI1e2q8d1YA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.0-preview.7.24405.7", + "contentHash": "ZuoB/44UTW4IbYfHk0yHtZH9LdHkfEeclxvniWs90T+f9x/NQtN4556iNIKar3MASCcrD0n2AE5y/Kv6buuNIA==" + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "6.0.16", + "contentHash": "OVX5tlKg6LY+XKqlUn7i9KY+6Liut0iewWff2DNr7129i/NJ8rpUzbmxavPydZgcLREEWHklXZiPKCS895tNIQ==" + }, + "protobuf-net": { + "type": "Transitive", + "resolved": "2.4.8", + "contentHash": "O+vbVVDxTWlFRBe5OsAmMKqqD7WQ7TPIH97Nr/Pk8gDxtNW77seiDmXfxnODuWIkm0fYW7kE5ILq8jHsgH79yg==", + "dependencies": { + "System.ServiceModel.Primitives": "4.5.3" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.0-preview.7.24405.7", + "contentHash": "aAM2ASxG7VL+BPIO4SgSnIkrFSkrgXff6oENeHJig2JDeQyo6HjoP5X6kSuMxUUOTLpHWVvoEnK1fJHJUtMItg==" + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "ynmbW2GjIGg9K1wXmVIRs4IlyDolf0JXNpzFQ8JCVgwM+myUC2JeUggl2PwQig2PNVMegKmN1aAx7WPQ8tI3vA==", + "dependencies": { + "System.Formats.Asn1": "6.0.0" + } + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Security.Cryptography.Pkcs": "6.0.1" + } + }, + "edelstein.common.utilities": { + "type": "Project", + "dependencies": { + "Edelstein.Protocol.Utilities": "[1.0.0, )", + "LogicLooper": "[1.6.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.0-preview.7.24405.7, )" + } + }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, + "edelstein.protocol.services.session": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, + "edelstein.protocol.utilities": { + "type": "Project" + }, + "LogicLooper": { + "type": "CentralTransitive", + "requested": "[1.6.0, )", + "resolved": "1.6.0", + "contentHash": "qbQ+kukflXfbsLbqZtMfqLPPo0oUgKISLt7ylqrEt3PbIfFVci2dlU9X94k7B++g2h7Rp4oOhL1aY2VCXovzag==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "CentralTransitive", + "requested": "[9.0.0-preview.7.24405.7, )", + "resolved": "9.0.0-preview.7.24405.7", + "contentHash": "WFzKiQ5cfQruJgK4vQEklG5Wwiu/Wt+T+eP80AGzzCq9iVgbOo7O1VC9amyO+Bw5WERAt1Yzfye0I0+wVSLhKA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0-preview.7.24405.7", + "System.Diagnostics.DiagnosticSource": "9.0.0-preview.7.24405.7" + } + }, + "protobuf-net.Grpc": { + "type": "CentralTransitive", + "requested": "[1.1.1, )", + "resolved": "1.1.1", + "contentHash": "uThFb/iUplzuXEa/cztJaNGpKLRQRb515STtQX99IS1MKh8Qsunw6MjjU+9rjo8s9UymR6lN9Ab6xT3adBlyDg==", + "dependencies": { + "Grpc.Core.Api": "2.51.0", + "protobuf-net": "2.4.8" + } + }, + "System.ServiceModel.Primitives": { + "type": "CentralTransitive", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "hVzK77Bl00H+1V7ho7h03tKlgxAIKssV3eUnRdH+gTCZCK4Ywnv2CR35AV9ly/tRpvsGwNL1d/jkAwB1MWw3Fw==", + "dependencies": { + "Microsoft.Extensions.ObjectPool": "6.0.16", + "System.Security.Cryptography.Xml": "6.0.1" + } + } + } + } +} \ No newline at end of file diff --git a/src/common/Edelstein.Common.Services.Migration/packages.lock.json b/src/common/Edelstein.Common.Services.Migration/packages.lock.json index 2964c419e..ff368a5bc 100644 --- a/src/common/Edelstein.Common.Services.Migration/packages.lock.json +++ b/src/common/Edelstein.Common.Services.Migration/packages.lock.json @@ -1081,6 +1081,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1102,6 +1103,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Services.Server/packages.lock.json b/src/common/Edelstein.Common.Services.Server/packages.lock.json index 15f25556e..268029ca7 100644 --- a/src/common/Edelstein.Common.Services.Server/packages.lock.json +++ b/src/common/Edelstein.Common.Services.Server/packages.lock.json @@ -1060,6 +1060,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1081,6 +1082,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/common/Edelstein.Common.Services.Session/packages.lock.json b/src/common/Edelstein.Common.Services.Session/packages.lock.json index 2964c419e..ff368a5bc 100644 --- a/src/common/Edelstein.Common.Services.Session/packages.lock.json +++ b/src/common/Edelstein.Common.Services.Session/packages.lock.json @@ -1081,6 +1081,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1102,6 +1103,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/plugin/Edelstein.Plugin.Rue/packages.lock.json b/src/plugin/Edelstein.Plugin.Rue/packages.lock.json index 527f9824f..f1d7398cd 100644 --- a/src/plugin/Edelstein.Plugin.Rue/packages.lock.json +++ b/src/plugin/Edelstein.Plugin.Rue/packages.lock.json @@ -969,6 +969,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -1003,6 +1004,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/protocol/Edelstein.Protocol.Gameplay.Login/Contexts/LoginContextServices.cs b/src/protocol/Edelstein.Protocol.Gameplay.Login/Contexts/LoginContextServices.cs index a7fe0b662..a3280db02 100644 --- a/src/protocol/Edelstein.Protocol.Gameplay.Login/Contexts/LoginContextServices.cs +++ b/src/protocol/Edelstein.Protocol.Gameplay.Login/Contexts/LoginContextServices.cs @@ -1,4 +1,5 @@ using Edelstein.Protocol.Services.Auth; +using Edelstein.Protocol.Services.Dispatch; using Edelstein.Protocol.Services.Migration; using Edelstein.Protocol.Services.Server; using Edelstein.Protocol.Services.Session; @@ -6,6 +7,7 @@ namespace Edelstein.Protocol.Gameplay.Login.Contexts; public record LoginContextServices( + IDispatchService Dispatch, IAuthService Auth, IServerService Server, ISessionService Session, diff --git a/src/protocol/Edelstein.Protocol.Gameplay.Login/Edelstein.Protocol.Gameplay.Login.csproj b/src/protocol/Edelstein.Protocol.Gameplay.Login/Edelstein.Protocol.Gameplay.Login.csproj index 30c1b37ab..80f710edb 100644 --- a/src/protocol/Edelstein.Protocol.Gameplay.Login/Edelstein.Protocol.Gameplay.Login.csproj +++ b/src/protocol/Edelstein.Protocol.Gameplay.Login/Edelstein.Protocol.Gameplay.Login.csproj @@ -3,6 +3,7 @@ + diff --git a/src/protocol/Edelstein.Protocol.Gameplay.Login/packages.lock.json b/src/protocol/Edelstein.Protocol.Gameplay.Login/packages.lock.json index e970a86e5..686ee5eee 100644 --- a/src/protocol/Edelstein.Protocol.Gameplay.Login/packages.lock.json +++ b/src/protocol/Edelstein.Protocol.Gameplay.Login/packages.lock.json @@ -983,6 +983,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/protocol/Edelstein.Protocol.Plugin.Login/packages.lock.json b/src/protocol/Edelstein.Protocol.Plugin.Login/packages.lock.json index 80e5dd96d..7a2986bbc 100644 --- a/src/protocol/Edelstein.Protocol.Plugin.Login/packages.lock.json +++ b/src/protocol/Edelstein.Protocol.Plugin.Login/packages.lock.json @@ -969,6 +969,7 @@ "Edelstein.Protocol.Gameplay": "[1.0.0, )", "Edelstein.Protocol.Network": "[1.0.0, )", "Edelstein.Protocol.Services.Auth": "[1.0.0, )", + "Edelstein.Protocol.Services.Dispatch": "[1.0.0, )", "Edelstein.Protocol.Services.Migration": "[1.0.0, )", "Edelstein.Protocol.Services.Server": "[1.0.0, )", "Edelstein.Protocol.Services.Session": "[1.0.0, )", @@ -996,6 +997,13 @@ "protobuf-net.Grpc": "[1.1.1, )" } }, + "edelstein.protocol.services.dispatch": { + "type": "Project", + "dependencies": { + "System.ServiceModel.Primitives": "[8.0.0, )", + "protobuf-net.Grpc": "[1.1.1, )" + } + }, "edelstein.protocol.services.migration": { "type": "Project", "dependencies": { diff --git a/src/protocol/Edelstein.Protocol.Services.Dispatch/Contracts/DispatchServiceSubscribeResponse.cs b/src/protocol/Edelstein.Protocol.Services.Dispatch/Contracts/DispatchServiceSubscribeResponse.cs deleted file mode 100644 index d6f492315..000000000 --- a/src/protocol/Edelstein.Protocol.Services.Dispatch/Contracts/DispatchServiceSubscribeResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Runtime.Serialization; - -namespace Edelstein.Protocol.Services.Dispatch.Contracts; - -[DataContract] -public record DispatchServiceSubscribeResponse -{ - [DataMember(Order = 1)] public required DispatchInfo Info { get; init; } -} diff --git a/src/protocol/Edelstein.Protocol.Services.Dispatch/DispatchTarget.cs b/src/protocol/Edelstein.Protocol.Services.Dispatch/DispatchTarget.cs index 3d72c6315..8a55f5179 100644 --- a/src/protocol/Edelstein.Protocol.Services.Dispatch/DispatchTarget.cs +++ b/src/protocol/Edelstein.Protocol.Services.Dispatch/DispatchTarget.cs @@ -4,9 +4,10 @@ public enum DispatchTarget { All, + Server, + World, Channel, - Field, Character } diff --git a/src/protocol/Edelstein.Protocol.Services.Dispatch/IDispatchService.cs b/src/protocol/Edelstein.Protocol.Services.Dispatch/IDispatchService.cs index 002330a9e..c3d36abbe 100644 --- a/src/protocol/Edelstein.Protocol.Services.Dispatch/IDispatchService.cs +++ b/src/protocol/Edelstein.Protocol.Services.Dispatch/IDispatchService.cs @@ -13,5 +13,5 @@ public interface IDispatchService Task Send(DispatchServiceSendRequest request, CallContext context = default); [OperationContract] - IAsyncEnumerable Subscribe(DispatchServiceSubscribeRequest request, CallContext context = default); + IAsyncEnumerable Subscribe(DispatchServiceSubscribeRequest request, CallContext context = default); }