From 743fa3889ebef752178ce9982dc7c9c031cc22e9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 19 Jul 2026 05:54:24 +0100 Subject: [PATCH] Stream exact hot state over negotiated body planes --- Directory.Build.props | 2 +- src/GameCult.Mesh/CultMesh.cs | 34 +++++ src/GameCult.Mesh/CultMeshBodies.cs | 12 ++ src/GameCult.Mesh/CultMeshBodyDemand.cs | 51 +++++++ src/GameCult.Mesh/CultMeshBodyPublications.cs | 4 + .../docs/reliability-migration-plan.md | 14 ++ .../CultNetDatabaseSubscriptionServer.cs | 27 +++- src/GameCult.Networking/CultNetTransport.cs | 20 ++- .../CultMeshBodyTransportTests.cs | 24 +++ .../NetworkingTests.cs | 140 ++++++++++++++++++ unity/org.gamecult.cultlib/README.md | 4 +- .../Plugins/GameCult.Caching.MessagePack.dll | Bin 27136 -> 27136 bytes .../Plugins/GameCult.Caching.MessagePack.pdb | Bin 16744 -> 16744 bytes .../Runtime/Plugins/GameCult.Caching.dll | Bin 82944 -> 82944 bytes .../Runtime/Plugins/GameCult.Caching.pdb | Bin 29376 -> 29376 bytes .../Runtime/Plugins/GameCult.Logging.dll | Bin 6656 -> 6656 bytes .../Runtime/Plugins/GameCult.Logging.pdb | Bin 9536 -> 9536 bytes .../Runtime/Plugins/GameCult.Mesh.dll | Bin 497152 -> 499200 bytes .../Runtime/Plugins/GameCult.Mesh.pdb | Bin 178508 -> 179016 bytes .../Runtime/Plugins/GameCult.Networking.dll | Bin 433664 -> 434176 bytes .../Runtime/Plugins/GameCult.Networking.pdb | Bin 219064 -> 219256 bytes unity/org.gamecult.cultlib/package.json | 2 +- 22 files changed, 320 insertions(+), 14 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 45263613..114bea2a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,7 +14,7 @@ MIT © Meta Vens and contributors true - 1.0.22 + 1.0.23 true diff --git a/src/GameCult.Mesh/CultMesh.cs b/src/GameCult.Mesh/CultMesh.cs index 4ec7940f..d19063ef 100644 --- a/src/GameCult.Mesh/CultMesh.cs +++ b/src/GameCult.Mesh/CultMesh.cs @@ -2852,6 +2852,40 @@ namespace GameCult.Mesh return new CultMeshRudpEndpoint(host, uri.Port, $"rudp://{uriHost}:{uri.Port}"); } + /// + /// Opens one exact hot-body subscription and advertises every body plane this runtime can + /// actually open. The provider derives locality and publishes only the selected plane. + /// + public static Task> SubscribeHotBodyAsync( + CultNetDatabaseSubscriptionClient subscriptions, + IEnumerable supportedBodyTransports, + CultMeshHotBodySubscription subscription) + { + if (subscriptions == null) throw new ArgumentNullException(nameof(subscriptions)); + if (supportedBodyTransports == null) throw new ArgumentNullException(nameof(supportedBodyTransports)); + if (subscription == null) throw new ArgumentNullException(nameof(subscription)); + var transports = supportedBodyTransports.Distinct().ToArray(); + if (transports.Length == 0) + throw new ArgumentException("At least one readable body transport is required.", nameof(supportedBodyTransports)); + return subscriptions.SubscribeAsync( + subscription.SubscriptionId, + recordKeys: subscription.RecordKeys, + schemaIds: subscription.SchemaIds, + consumerRuntimeId: subscription.ConsumerRuntimeId, + bodyIds: new[] { subscription.BodyId }, + supportedBodyTransports: transports.Select(value => value.ToString())); + } + + /// Opens an exact hot-body subscription using a resolver's readable planes. + public static Task> SubscribeHotBodyAsync( + CultNetDatabaseSubscriptionClient subscriptions, + CultMeshBodyPublicationResolver bodyResolver, + CultMeshHotBodySubscription subscription) + { + if (bodyResolver == null) throw new ArgumentNullException(nameof(bodyResolver)); + return SubscribeHotBodyAsync(subscriptions, bodyResolver.SupportedTransports, subscription); + } + /// Resolves a CultMesh URI or RUDP endpoint into a concrete RUDP endpoint. public static CultMeshRudpEndpoint ResolveRudpEndpoint(string endpointOrUri) { diff --git a/src/GameCult.Mesh/CultMeshBodies.cs b/src/GameCult.Mesh/CultMeshBodies.cs index 4f2b3514..ff12e3b9 100644 --- a/src/GameCult.Mesh/CultMeshBodies.cs +++ b/src/GameCult.Mesh/CultMeshBodies.cs @@ -150,6 +150,11 @@ namespace GameCult.Mesh private readonly Func _authorizeProducer; private readonly Func? _authorizeNamedProducer; + /// Gets locally available body planes in fastest-local-first order. + public IReadOnlyList SupportedTransports => _adapters.Keys + .OrderByDescending(TransportPreference) + .ToArray(); + public CultMeshBodyTransportService( IEnumerable adapters, Func authorizeProducer) @@ -264,6 +269,13 @@ namespace GameCult.Mesh left.AccessMode == right.AccessMode && left.Synchronization == right.Synchronization && string.Equals(left.SemanticHash, right.SemanticHash, StringComparison.Ordinal); + + private static int TransportPreference(CultMeshBodyTransportKind transport) => transport switch + { + CultMeshBodyTransportKind.SharedMemory => 3, + CultMeshBodyTransportKind.SharedFileMapping => 2, + _ => 1 + }; } public sealed class CultMeshMappedBodyPublisher diff --git a/src/GameCult.Mesh/CultMeshBodyDemand.cs b/src/GameCult.Mesh/CultMeshBodyDemand.cs index 049d762a..7bfc230f 100644 --- a/src/GameCult.Mesh/CultMeshBodyDemand.cs +++ b/src/GameCult.Mesh/CultMeshBodyDemand.cs @@ -7,6 +7,57 @@ using GameCult.Networking; namespace GameCult.Mesh { + /// + /// One exact hot-body subscription. The view record, latest-publication record, consumer body + /// demand, and locally supported planes are one contract so callers cannot accidentally stream + /// body bytes through retained document snapshots. + /// + public sealed class CultMeshHotBodySubscription + { + public CultMeshHotBodySubscription( + string subscriptionId, + string consumerRuntimeId, + string viewRecordKey, + string viewSchemaId, + string bodyId, + IEnumerable? additionalRecordKeys = null, + IEnumerable? additionalSchemaIds = null) + { + SubscriptionId = Require(subscriptionId, nameof(subscriptionId)); + ConsumerRuntimeId = Require(consumerRuntimeId, nameof(consumerRuntimeId)); + BodyId = Require(bodyId, nameof(bodyId)); + RecordKeys = new[] + { + Require(viewRecordKey, nameof(viewRecordKey)), + CultMeshBodyPublicationDocument.CreateLatestRecordKey(bodyId).Value + } + .Concat(additionalRecordKeys ?? Array.Empty()) + .Where(value => !string.IsNullOrWhiteSpace(value)) + .Distinct(StringComparer.Ordinal) + .ToArray(); + SchemaIds = new[] + { + Require(viewSchemaId, nameof(viewSchemaId)), + CultMeshBodyPublicationSchemaVersions.Publication + } + .Concat(additionalSchemaIds ?? Array.Empty()) + .Where(value => !string.IsNullOrWhiteSpace(value)) + .Distinct(StringComparer.Ordinal) + .ToArray(); + } + + public string SubscriptionId { get; } + public string ConsumerRuntimeId { get; } + public string BodyId { get; } + public IReadOnlyList RecordKeys { get; } + public IReadOnlyList SchemaIds { get; } + + private static string Require(string value, string parameterName) => + string.IsNullOrWhiteSpace(value) + ? throw new ArgumentException("Value is required.", parameterName) + : value; + } + /// Derived transport work for one logical hot body. public sealed class CultMeshBodyDemandPlan { diff --git a/src/GameCult.Mesh/CultMeshBodyPublications.cs b/src/GameCult.Mesh/CultMeshBodyPublications.cs index 37f2955f..673465cc 100644 --- a/src/GameCult.Mesh/CultMeshBodyPublications.cs +++ b/src/GameCult.Mesh/CultMeshBodyPublications.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; @@ -361,6 +362,9 @@ namespace GameCult.Mesh public CultMeshBodyPublicationResolver(CultMeshBodyTransportService transport) => _transport = transport ?? throw new ArgumentNullException(nameof(transport)); + /// Gets the body planes this resolver can actually open. + public IReadOnlyList SupportedTransports => _transport.SupportedTransports; + public ICultMeshBodyReadLease ResolveReadOnly( CultMeshBodyPublicationDocument publication, CultMeshBodyValidationRequest request) => diff --git a/src/GameCult.Mesh/docs/reliability-migration-plan.md b/src/GameCult.Mesh/docs/reliability-migration-plan.md index c52ea4dd..8b183dc6 100644 --- a/src/GameCult.Mesh/docs/reliability-migration-plan.md +++ b/src/GameCult.Mesh/docs/reliability-migration-plan.md @@ -918,6 +918,14 @@ stream demand merely by existing. and server disposal all update the same typed demand projection. Stable peer identity, not per-message wrapper identity, keys subscription lifetime. +`CultMesh.SubscribeHotBodyAsync(...)` is the public construction path. Its +`CultMeshHotBodySubscription` keeps the exact view record, the body's stable +latest-publication record, consumer identity, and logical body demand in one +contract. The local `CultMeshBodyTransportService` contributes only adapters it +can actually open, ordered shared-memory first; the server combines those +capabilities with observed peer locality. Applications do not hand-assemble +transport-name arrays or request one snapshot per frame. + **Cut line:** local frame publication writes directly into a mapped write lease and commits its descriptor. The compatibility byte-array publisher is copy-in only. The current remote frame representation may still use the verified CDN @@ -925,6 +933,12 @@ body path when remote demand exists; Phase 6 must replace that expiry-sensitive traffic with a stream/datagram body plane rather than enlarging snapshot or CDN timeouts. +Reliable control messages larger than the RUDP receive mask explicitly +acknowledge the packet just received. A retransmit older than the rolling +32-packet summary can therefore always leave the sender queue; the rolling mask +remains useful for piggyback acknowledgements but is not allowed to strand a +fragment indefinitely. + ### Gate - Two local consumers map one verified CDN artifact without duplicate process diff --git a/src/GameCult.Networking/CultNetDatabaseSubscriptionServer.cs b/src/GameCult.Networking/CultNetDatabaseSubscriptionServer.cs index 0d8e4ff2..618f64df 100644 --- a/src/GameCult.Networking/CultNetDatabaseSubscriptionServer.cs +++ b/src/GameCult.Networking/CultNetDatabaseSubscriptionServer.cs @@ -163,16 +163,17 @@ namespace GameCult.Networking { var changeType = change.GetType(); var key = (CultRecordKey)(changeType.GetProperty("Key")?.GetValue(change) ?? new CultRecordKey("")); - var schemaId = (string?)changeType.GetProperty("SchemaId")?.GetValue(change) ?? ""; if (request.RecordKeys is { Length: > 0 } && !request.RecordKeys.Contains(key.Value, StringComparer.Ordinal)) return null; - if (request.SchemaIds is { Length: > 0 } && !request.SchemaIds.Contains(schemaId, StringComparer.Ordinal)) - return null; var kind = (CultNetDatabaseChangeKind)(changeType.GetProperty("Kind")?.GetValue(change) ?? CultNetDatabaseChangeKind.Updated); var document = changeType.GetProperty("Document")?.GetValue(change); if (kind == CultNetDatabaseChangeKind.Removed || document == null) { + var previous = changeType.GetProperty("PreviousDocument")?.GetValue(change); + var schemaId = ResolveWireSchemaId(previous, (string?)changeType.GetProperty("SchemaId")?.GetValue(change) ?? ""); + if (!MatchesRequestedSchema(request.SchemaIds, previous, schemaId)) + return null; return new CultNetDatabaseChangeRawMessage { MessageId = Guid.NewGuid().ToString("N"), @@ -183,15 +184,33 @@ namespace GameCult.Networking }; } + var raw = CreateRawRecord(key, document); + if (!MatchesRequestedSchema(request.SchemaIds, document, raw.SchemaId)) + return null; return new CultNetDatabaseChangeRawMessage { MessageId = Guid.NewGuid().ToString("N"), SubscriptionId = subscriptionId, ChangeKind = kind == CultNetDatabaseChangeKind.Added ? "added" : "updated", - Document = CreateRawRecord(key, document) + Document = raw }; } + private string ResolveWireSchemaId(object? document, string fallback) + { + if (document == null) return fallback; + return _database.Documents.GetByDocumentType(document.GetType())?.SchemaId ?? fallback; + } + + private bool MatchesRequestedSchema(string[]? requestedSchemaIds, object? document, string wireSchemaId) + { + if (requestedSchemaIds is not { Length: > 0 }) return true; + if (requestedSchemaIds.Contains(wireSchemaId, StringComparer.Ordinal)) return true; + return document != null && CultNetSchemaAliasMatching.MatchesAny( + requestedSchemaIds, + _database.Cache.Registry.GetRequired(document.GetType())); + } + private CultNetRawDocumentRecord CreateRawRecord(CultRecordKey key, object document) { var method = typeof(CultNetDocumentRegistry) diff --git a/src/GameCult.Networking/CultNetTransport.cs b/src/GameCult.Networking/CultNetTransport.cs index 06c6cf1a..8bdf020a 100644 --- a/src/GameCult.Networking/CultNetTransport.cs +++ b/src/GameCult.Networking/CultNetTransport.cs @@ -1141,9 +1141,14 @@ namespace GameCult.Networking /// /// Creates a packet carrying the current acknowledgement state. /// - public CultNetRudpPacket CreateAck() + public CultNetRudpPacket CreateAck(uint? acknowledgedSequence = null) { var (ack, ackMask) = AckState(); + if (acknowledgedSequence.HasValue) + { + ack = acknowledgedSequence.Value; + ackMask = 0; + } return new CultNetRudpPacket { PacketType = CultNetRudpPacketType.Ack, @@ -1955,10 +1960,9 @@ namespace GameCult.Networking delivered = _deliveredFrames.Count > 0 ? _deliveredFrames.Dequeue() : null; if (packet.PacketType == CultNetRudpPacketType.Accept || - packet.PacketType == CultNetRudpPacketType.Data || - delivered != null) + packet.PacketType == CultNetRudpPacketType.Data) { - SendPacket(_session.CreateAck()); + SendPacket(_session.CreateAck(packet.Sequence)); } return true; @@ -2108,6 +2112,10 @@ namespace GameCult.Networking /// public bool Connected => Session.Connected; /// + /// Gets the number of reliable packets still awaiting acknowledgement. + /// + public int PendingReliablePacketCount => Session.PendingReliableSequences.Count; + /// /// Gets the last transport-level remote disconnect reason, if one was received. /// public byte[]? DisconnectReason { get; internal set; } @@ -2349,9 +2357,9 @@ namespace GameCult.Networking } delivered = _deliveredFrames.Count > 0 ? _deliveredFrames.Dequeue() : null; - if (packet.PacketType == CultNetRudpPacketType.Data || delivered != null) + if (packet.PacketType == CultNetRudpPacketType.Data) { - SendPacket(existingPeer.RemoteEndPoint, existingPeer.Session.CreateAck()); + SendPacket(existingPeer.RemoteEndPoint, existingPeer.Session.CreateAck(packet.Sequence)); } return true; diff --git a/tests/GameCult.Mesh.Tests/CultMeshBodyTransportTests.cs b/tests/GameCult.Mesh.Tests/CultMeshBodyTransportTests.cs index ca3e3045..154ee587 100644 --- a/tests/GameCult.Mesh.Tests/CultMeshBodyTransportTests.cs +++ b/tests/GameCult.Mesh.Tests/CultMeshBodyTransportTests.cs @@ -357,6 +357,30 @@ public sealed class CultMeshBodyTransportTests plan.Consumers.Should().ContainSingle().Which.ConsumerRuntimeId.Should().Be("unknown"); } + [Test] + public void HotBodySubscriptionKeepsViewPublicationAndDemandInOneExactContract() + { + var subscription = new CultMeshHotBodySubscription( + "pilot-world", + "eve-unity", + "eve:view:pilot", + "gamecult.eve.entity_soa_view.v2", + "eve:body:pilot", + new[] { "eve:field:gravity" }, + new[] { "gamecult.eve.fields_splats.v1" }); + + subscription.RecordKeys.Should().Equal( + "eve:view:pilot", + CultMeshBodyPublicationDocument.CreateLatestRecordKey("eve:body:pilot").Value, + "eve:field:gravity"); + subscription.SchemaIds.Should().Equal( + "gamecult.eve.entity_soa_view.v2", + CultMeshBodyPublicationSchemaVersions.Publication, + "gamecult.eve.fields_splats.v1"); + subscription.BodyId.Should().Be("eve:body:pilot"); + subscription.ConsumerRuntimeId.Should().Be("eve-unity"); + } + private static CultMeshBodyValidationRequest Request(CultMeshBodyDescriptor descriptor, DateTimeOffset now) => new() { BodyId = descriptor.BodyId, diff --git a/tests/GameCult.Networking.Tests/NetworkingTests.cs b/tests/GameCult.Networking.Tests/NetworkingTests.cs index 8ec4e8d4..30162445 100644 --- a/tests/GameCult.Networking.Tests/NetworkingTests.cs +++ b/tests/GameCult.Networking.Tests/NetworkingTests.cs @@ -771,6 +771,43 @@ namespace GameCult.Networking.Tests Assert.That(session.DueResends(250), Is.Empty); } + [Test] + public void RudpSession_ExplicitlyAcknowledgesRetransmitsOlderThanTheReceiveMask() + { + var sender = new CultNetRudpSession(new CultNetRudpSessionOptions + { + ConnectionId = 991, + InitialSequence = 1, + ResendDelayMs = 10 + }); + var receiver = new CultNetRudpSession(new CultNetRudpSessionOptions + { + ConnectionId = 991, + InitialSequence = 500 + }); + sender.Receive(new CultNetRudpPacket + { PacketType = CultNetRudpPacketType.Accept, ConnectionId = 991, Sequence = 400, ChannelId = "control" }); + receiver.Receive(new CultNetRudpPacket + { PacketType = CultNetRudpPacketType.Accept, ConnectionId = 991, Sequence = 0, ChannelId = "control" }); + + var packets = sender.SendMany( + "snapshot", + Enumerable.Range(0, 80).Select(index => (byte)index).ToArray(), + new CultNetRudpSendOptions { Reliable = true, Ordered = true, NowMs = 0 }, + maxFragmentBytes: 1); + foreach (var packet in packets) + receiver.Receive(packet); + + sender.Receive(receiver.CreateAck()); + Assert.That(sender.PendingReliableSequences.First(), Is.EqualTo(1u)); + + var oldRetransmit = sender.DueResends(10).Single(packet => packet.Sequence == 1); + receiver.Receive(oldRetransmit); + sender.Receive(receiver.CreateAck(oldRetransmit.Sequence)); + + Assert.That(sender.PendingReliableSequences, Does.Not.Contain(1u)); + } + [Test] public async Task RudpSession_ResendsAndAcknowledgementsCanRunConcurrently() { @@ -1544,6 +1581,104 @@ namespace GameCult.Networking.Tests Assert.That(((NetworkSchemaNote)targetCache.Get(new CultRecordKey(recordKey))!).Text, Is.EqualTo("live")); } + [Test] + public async Task DatabaseSubscription_FiltersLiveChangesByWireSchemaBinding() + { + const string recordKey = "tests:subscription-client:wire-note"; + const string wireSchema = "tests.wire_note.v1"; + var sourceCache = new CultCache(); + var sourceDocuments = new CultNetDocumentRegistry(sourceCache.Registry) + .Register(CultNetDocumentBinding.ForDocument(sourceCache.Registry, wireSchema)); + using var sourceDatabase = new CultNetDatabase(sourceCache, new CultNetDatabaseOptions + { + DocumentRegistry = sourceDocuments + }); + using var server = new RudpCultNetSchemaServer(new RudpCultNetSchemaServerOptions + { + RuntimeId = "database-wire-schema-subscription-server", + Socket = BindUdpSocket() + }); + using var subscriptions = new CultNetDatabaseSubscriptionServer(server, sourceDatabase); + using var cancellation = new CancellationTokenSource(); + var serverThread = new Thread(() => + { + while (!cancellation.IsCancellationRequested) + { + _ = server.PollOnceAsync().GetAwaiter().GetResult(); + Thread.Sleep(1); + } + }) { IsBackground = true }; + serverThread.Start(); + + var targetCache = new CultCache(); + var targetDocuments = new CultNetDocumentRegistry(targetCache.Registry) + .Register(CultNetDocumentBinding.ForDocument(targetCache.Registry, wireSchema)); + var transport = CultNetSchemaClients.CreateRudp("database-wire-schema-subscription-client"); + using var client = new CultNetDatabaseSubscriptionClient(transport, targetCache, targetDocuments); + transport.Connect("127.0.0.1", server.LocalEndPoint.Port); + await WaitUntilAsync(() => transport.Connected, TimeSpan.FromSeconds(2)); + await AwaitWithTimeout( + client.SubscribeAsync("wire-notes", recordKeys: [recordKey], schemaIds: [wireSchema]), + TimeSpan.FromSeconds(2)); + var changed = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + client.Changed += change => changed.TrySetResult(change); + + await sourceDatabase.PutAsync(new CultRecordKey(recordKey), new NetworkSchemaNote + { + Schema = "tests.networking_note.v1", + Text = "wire-live" + }); + var update = await AwaitWithTimeout(changed.Task, TimeSpan.FromSeconds(2)); + + cancellation.Cancel(); + Assert.That(update.SchemaId, Is.EqualTo(wireSchema)); + Assert.That(((NetworkSchemaNote)update.Document!).Text, Is.EqualTo("wire-live")); + } + + [Test] + public void DatabaseSubscription_FiltersCanonicalWireChangesByRequestedSchemaAlias() + { + var cache = new CultCache(); + var documents = new CultNetDocumentRegistry(cache.Registry) + .Register(CultNetDocumentBinding.ForDocument(cache.Registry)); + using var database = new CultNetDatabase(cache, new CultNetDatabaseOptions + { + DocumentRegistry = documents + }); + using var server = new RudpCultNetSchemaServer(new RudpCultNetSchemaServerOptions + { + RuntimeId = "database-schema-alias-subscription-server", + Socket = BindUdpSocket() + }); + using var subscriptions = new CultNetDatabaseSubscriptionServer(server, database); + var descriptor = cache.Registry.GetRequired(); + var change = new CultNetDatabaseChange( + CultNetDatabaseChangeKind.Added, + new CultRecordKey("tests:subscription-client:alias-note"), + descriptor.SchemaId, + database.Shards[0], + new NetworkSchemaNote { Schema = "tests.networking_note.v1", Text = "alias-live" }, + previousDocument: null); + var method = typeof(CultNetDatabaseSubscriptionServer).GetMethod( + "CreateChange", + BindingFlags.Instance | BindingFlags.NonPublic)!; + + var message = (CultNetDatabaseChangeRawMessage?)method.Invoke(subscriptions, new object[] + { + change, + new CultNetDatabaseSubscribeMessage + { + SubscriptionId = "alias-notes", + SchemaIds = ["tests.networking_note.v1"], + RecordKeys = ["tests:subscription-client:alias-note"] + }, + "alias-notes" + }); + + Assert.That(message, Is.Not.Null); + Assert.That(message!.Document!.SchemaId, Is.EqualTo(descriptor.SchemaId)); + } + [Test] public async Task RudpCultNetSchemaServer_DeliversLargeSnapshotResponse() { @@ -1607,9 +1742,14 @@ namespace GameCult.Networking.Tests if (completed != responseCompletion.Task) Assert.Fail($"Large snapshot timed out; server sent {server.Stats.BytesSent} bytes, received {server.Stats.BytesReceived} bytes, transports {server.Profile.Transports.Count()}."); var response = await AwaitWithTimeout(responseCompletion.Task, TimeSpan.FromMilliseconds(1)); + await WaitUntilAsync( + () => server.Peers.Count == 1 && server.Peers.Single().PendingReliablePacketCount == 0, + TimeSpan.FromSeconds(2)); cancellation.Cancel(); Assert.That(response.Documents, Has.Length.EqualTo(1)); Assert.That(response.Documents[0].Payload, Has.Length.EqualTo(128 * 1024)); + Assert.That(server.Stats.BytesSent, Is.LessThan(512 * 1024), + "A lossless large response must not remain trapped in the reliable resend queue."); } [Test] diff --git a/unity/org.gamecult.cultlib/README.md b/unity/org.gamecult.cultlib/README.md index be09e204..28c73612 100644 --- a/unity/org.gamecult.cultlib/README.md +++ b/unity/org.gamecult.cultlib/README.md @@ -7,8 +7,8 @@ CultCache, CultNet, and CultMesh assemblies consumed through NuGet by normal Build it with `scripts/build-unity-package.ps1`. Do not edit generated plugin assemblies in the package output. -Install version `1.0.22` through Unity Package Manager with: +Install version `1.0.23` through Unity Package Manager with: ```text -https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.22 +https://github.com/GameCult/CultLib.git?path=/unity/org.gamecult.cultlib#cultlib-unity-v1.0.23 ``` diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.dll index d13a4ef8d5c7120d7d7596c261b4bea03f6c780b..79bf48c50a119921a12199ed3f453c1d11ea19b5 100644 GIT binary patch delta 308 zcmZp;!q{+yaY6@6+w+YJH}>cmGm1~%ZEVRXzWJ;1bUA_7xmKIbEf@FP`)NYC!mfp> zo96`G;GhkpaVPw!Z)HBdCGS)USF-o>bOiW2hF*Zy!w=_*kG)*=$HchiMH?}l4 zx3si0x3Dm`FgMt|E^Zbh%ef=*XD0h31PBD)&=T^HD)nf)JegzGrpI?DuSuA$02RE! z1{DOV_7UY}&$xIk?#bi_a#EX<6SWyR#TghF7=c)P^Yo<0jEu&ct5Xg$1{*VIGZ-O7lX5YQ2!ZTmlF6kI#0xemqS(q#CK-aSAjoQEv4xT%u&h3T zmz62S%GPp05LXck3tMf~i7bczaK8V1?E$t2cyesaH6OliIXtp zFFm>ohbviU)$Sjt-qzD(OkDyHAT&LfxRg3FNaLJD8D}XI2@_GuJ;CCDQkjy7NKg2o z&xuf1yInM{Uq4^UwbrJ&w>bMYY>?&N(RnE^r`F4hRy8v!jptEW+r#;@oqjRl{Ma9N zN^l3qEdW3rOI7JRB31j@J#JHQKtcd1#E=7l2r}TnG&2y8{O?E;2TwE8Rsd9w)Lm^8 bebpZyLLIJIl&6x7QE-8%=^{jh#V`H=;s9HS diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.MessagePack.pdb index a55bee747d414c9afde3c1c22f91ec90d533e496..17d72db2ed6db90ba66800dc08733a96729ef023 100644 GIT binary patch delta 1347 zcmZwFYfuwc6bJCTVM7uG1&aZ}Hk#5VfI*TNlAva^Py`A}M3i7@8xtA>Q7JD+3PwN* z$U`KcQ-l<$2Cx#56mgV?jy#Hj6&Vnyf)=MdS_t?+YXN)0_@N)VGrx20-TmL)JG(oU zijAdW`AN3oewXFG4)MO<^=Qb&wIh%2wtU%nGQUObL&T7TNI?I0kdTf+LY<(8VTJ|) z&NSsPWX;5o9ryrz1l9sB@B~|cFW3%tfp8!PQ6L5!21h{#$WudUU%V*+Ep;X!88`yc zK@QLWJ!l1w!C!#xLO?;_5?Jp_Kp{W}EY=cGEf@t-76I)8@gNzbgIpGlia?kfj-()T z9gftoQ1ZYUcN{qb4)6w%pcD*(QD6j?Y#hlzHk*W=fLCk`EwKOl=5Q3i!BH^S17siy z#DZ@@8psA3j%f{!&T!Du#les7PFyey6Cx<;HiqeYU}&C!Lnkhd8<`~NWI$P*2RSc+ zZV9Xw=OVXd(5-NwWt+uy?G07JdSg>BXqsLG$ zCI9R}Tl<7Q->zNue%Fk+y)7hq*bo%kG=JuySm~EFGqusbc{P`pKKbhc)#-F|AGJx@ z{qi*ZrfuoHY_-@c)uqgym-u(Q;<#&IZ>x*ZBlM7*^8GAUm+T(Ga?GaXt~#F1!*1$S*Oc zuZ$>T3IcQ;9aANayWiZi94McsP4_+1{oi=LQ3e(i^J;^;pq_1fIm_tX{%FC2X8 zeD5ffVJoYy)5T4GYTD}DA5Q4(Ei?4djRR-*z6~8}HsOQKZsjV6Zs2;nceAk z@gIt#M*UtU@y@Z)bbEuPZ8w3*SN7!eceCReH8 zN1rZ!(}a#9ba!mWs@Pkyz;nZM$x7pez^&5#5nl1CIJba<3Wf53;$58H;WA>1&rQAU zrLIWzE(slf+S32|F@w;-Yn54T#WjuEV?BNitN24x@6kXi!YWI!N}VQ=pJQEwRXJc) q&RB)%DpuubpbCcYl|@)}Ggke`l&gM?>2XZI2Gg@3WU$&4hW`uNlfo(h delta 1349 zcmZwFc~BEq7y$6Mn~e)-0u&TAh%f~b1Y#0$fybx;q9BKIC{`2_LK=z}A_}!e7=+5oz`-Sn3{?VQJec$(XzqkA5?R%1g zJ;}jJ4?Cu;^L#Mk!U?R(sn#Ux=Y_S5nMY5S8r4Bm3~i<2=>IMfH84qZ4cuZU)@E$DVd^$&5bw?ev3 zG)x@cUp}&Fa$p&$u3pzuYbEGEpj4Adr+R))u8XUmV#j=1 z89Uimt9A=wY%Kejt3mv>m&3j%^d zhB~xCHP?ldAx_cPhJeKqXG&XRr{<`TPjq69ziK*!U8EK}U5TA;(0nN>w$oy|MVO9- qHCmoxI)8(cc$8SA#q`~n{=TJ8{|alSV9l;rvkx>G=&QC782T56^S=xL diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Caching.dll index caa426d08a898a8b9e3d95d14f7eaa0d0d97b3d6..a06016f8d361ef68431b5bda8f0dd317cdea5ac1 100644 GIT binary patch delta 318 zcmZqZU~TANozTG&();rM#vY}^jN+5mAGTx^-~96M`2YczdF;}>_+|o2D(KOl2*fh=3+}P6G z+|tt0+`_`#!rWl{G*iY+%q+@5>~p63STY6(Y`cD8qYRsU=V6a`#i7|arJ&{?U-|By9* z`w0=oX$lrbdIk&(CX5XFhI$5iMn>9cCP@~l2IeV=rb(vBmZr((Nr{HZrWPhfMrla~ z<_2ko$;M{Ji3Z8rrU()7)Z4N mkOh)4W-tTdL?AzTda47XDXS5K9)rPlK_|u}#_fzwKq~274<^Y~H;%iB`NdMva(9s+pb%9+4cYRQ5&Ub&4 zTPiIXWpU>b`UOLvCb#|UZ$NVSt2URWMb}@ddd@qgCxeC*jYnlOc=~m37FTlB#V&DM zT(@Ki13iYQ?LAkuZjt=>4mYF-OLAfTK1SR_QGD2+`V9r+x&6c8yt98gM^n=b=Hg7} zJvoI|Y~P4)Yc^nF6;`Y@G*WaHJ>+P<#oU96rvRmRNItw>?C<4@EiK81T`ydb%45~UsWTQsNMhellfE^AC^9rM zV>n@9WMpJBF=aP7HDX~kV>UB2W;r)AIX5>sIXO2tI5#*qFtcbjr~()w$tvRjfB*pe X?*G*m6@o;ZSn1@%*j$9OC^?up)ZY<4 delta 585 zcmV-P0=E6Y26n%>g{Eiw`B?BK?QveOq&Q&;@oC-1R}JIp2OJ zw^Uj(%Hqx=^b3YSO>X|*^^_+J~Peu(X8js3m^z`e_EUx6Li&^3} zxNgZ326_xp+k38R-5~k#9d1YwmgK_FA0zG|C_d~?{f2_^-2S0(-dTU0qp4{Ib8)8g zo}5A}wr|9@H5)K73MuCQ+_^dq5&nTM~ILRmG<-|;LJT{ZF)A6{>vuRcyo0AtOm_4H3AH5Wv z*=*7^HWa-~qM7Wf-MLW~td{n|wA_QEancG@+#2Fm0;~A`leeSiFsfDCFiX>lweIr7 zNR$2+oyO}u=R?6^FI;c#sJKCH?p}9n3;66=X)Xm_d90c^b;e={NzD5RlfE^AC}uQb zIAt(5WMMU8HDft7V>e=9F=I72G%_+~VlX!_W-((kHZx%`W3y;Br~()qW|_DEfB*oA XIz>v+xRgbo%r*njFpHS8C^?upgpC;? diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Logging.dll index 75d4d5053cc9371ef77c1f06c4f3efba799b2a17..2a2596b780c1af6387adc81b78e345f0650d2210 100644 GIT binary patch delta 290 zcmZoLX)u}4!J>3h>+!}OCk{sO&F49OvIzWn_y4MxXp_sFh?h@}+=yw}e1o@v(ZX2I zfPuk;kwM>3&p^+}Slh_NDA^)0F(oC%*f7=H(lja2G}+A9G|kf7*wWnG($do0!ou9b z++gwq{yQw1{yXPQE)WP1_}H4dz=R>yV|$;;t;Jh*t(bg4pk4tgXi*Lo1gWm|KVPtE zaWXfnLe}Ta`GWF{oZ<`&42(c5zInRPVMa#d&Cw#&jKRhX+6+bvCP19bV8M_GgehQX z%wWin%3#i5$zaNm1Qay|%9}A51L-uNm^qLIB0=&XXb#kC0Vd5E3?^%enF5WE7hA{- E02vQdEC2ui delta 290 zcmZoLX)u}4!6K73bH~OWCk{rj&F49OvIulqxq4mPF~xQM88haK2Hi6@-{5Uvv@p^$ zU|=v|WY9O%Gte_K(oQo;vPd;BPf0XQGEKHLO*T(TG)y+NFflSpOENGwNHa_}HZx8% zNS-`_{|<|eY187#1p)yAu7WkI?tS#}+?g4g(>*IgWby@pdIhMUBuo&fTDd~YD#mx| z$4UB!IG1hC7nEn@6k}juU<6{Z&C`VrGcp=&juxqA3^roWW=LZ&VMt=IU`S;!U@&J$ zVMt^!1@cW9k{K+)q&bk6$Y2QMn*vptFc<-08c+5#@DXdK$Q#(%s|Y@a9oiU zNV9?23=AAVniGiC8CV%~Sk!^ymw_ZZgC_elp!zh%Z9p=TiJ6gwL2L7Rrfp31o1bm` z_H6BszH2ILnLNtsf0jxwTXIps=Jip}+0w>=KBxeTQz@c#pSQix_Da2s!_G+$1etS~7rbC}oMY_CbGJ=Dd&?}Q z4(868qS8%l)d4qHnYNv(^!Hk@Kx+Ty&kfsJ+|Agym>xGVgh$W1vgP74hI!i_HLJud z`@iDng=;eMrHyObLgia#b>Gb`@}H`x`sR%*&)+V^fZ!Sb{=9E^^6L8COQyQF{&^iK zzR0DjF`;pTt8*= zZ13lX|GnTBnezNwKUesjEo}=-=U$7Laie7I;^jH5HLYC>isYuvofxh6Eqr&HbM~ji z@V7dazRNa0DXBl_9&LG_XWycq@*l2#IUAxYaC+06xq;Kp*K^NVy?t}#)b!0Zr$5=8 z7wgWMXzToaa(U|VW4SvHwk_g4`S#etzmfbpZG28q@&_(jc&l=~>&bl0)cyHydcNBF z#Gvji4{dx+z3+;47Ww|#{i4K%>+tFQlK-7P_V0+^`~Jq14@Wm&xHProZJ>Dy>y(26 zlV*GuW@K(yTCJ3lpIn+dIf1=U!^p%a*&;D9B_+k!FxA}BG%3+E+0589&C=Z1(%jtA i($d_*!ra2#VDnG*1u~2&lV_mR8anj= delta 762 zcmX@$b--&vjfksY&8mAJeLQz&hURq7$`H{pZCX5W!ZOboMMj1^AZ`KTS&9rmz{Idx zk%{3f5Z?si2SEHBh~I(bK=Lra%F3ZG&iqj+Qw9W@K?bP zzUl}wr_QBEE_~ng_^Q&y6}2L>T#x^owE3Izu~Uub%z@^wopL@)+EC!w`^G(o9|U_( zzPnZUdZrN9N^d8{MuFw;7Jf0fbS{g1%O$0=W^a_An*K_0Ez7?4mzgiZ+|zh}{*SaJ zHum>kTiKi_-f_h5&qhUe#@18cS0COYmtEhtpw{z4i=Y|ff+`1r_qo%Y%pZQ1n!AwW zkz-KW(P;|~%9)f+Y?%8^ae`Pt$m8;Fj2EVUIC8B?X@ebC!PbSIzS+5b0vXEtCbgXY zBX9ct_N>FrdYg&Qu`u4yEo;i#^Z)rytgE|ww)XO(*Xv!F zR{OoUx}sjuQ8pl=Kd%1v%tu;gv8O)e9jH?9mUyYUU>koCK=!=H$xwGk3?Auwox|&CF zw-$z_O!f?WbMEI8E%{kf*Ju1^uL+*J%2+E+)$eM^{@Jf))*sq9Z{A!#wW(TZuBO-2 z^ZhqeIJ&=Y*0;9JIm~M|CFexmb-uUfs!}#?5x-Q#-?uDME3hEjCt5zT=7l}GwN+D~ z?xka&ZOnB_mm9sE{ipom&jOJ!{r_n{xR=^L%KNx5Ir`A_15U;9mr5NjPY}K!mV74Y zoFq<+|;)QWCP@~l2IeV=rb(vBmZr((Nr{HZrWPhfMrla~<_2ko i$;M{Ji3Z7=f3Yu+VN9MpTP2z$nQ`Hs$-h+G7#RSl%Ql+; diff --git a/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll b/unity/org.gamecult.cultlib/Runtime/Plugins/GameCult.Mesh.dll index 85a1216f529a1b517b7215903672948f3e07ac53..adb73216a59ddf051f7c14dd660d4407abf2613f 100644 GIT binary patch literal 499200 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

gPB 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