diff --git a/NineChronicles.Headless.Tests/GraphTypes/GraphQLTestBase.cs b/NineChronicles.Headless.Tests/GraphTypes/GraphQLTestBase.cs index b6f34e436..0a1757c3b 100644 --- a/NineChronicles.Headless.Tests/GraphTypes/GraphQLTestBase.cs +++ b/NineChronicles.Headless.Tests/GraphTypes/GraphQLTestBase.cs @@ -75,6 +75,7 @@ public GraphQLTestBase(ITestOutputHelper output) StandaloneContextFx = new StandaloneContext { KeyStore = keyStore, + DifferentAppProtocolVersionEncounterInterval = TimeSpan.FromSeconds(1), }; ncService.ConfigureContext(StandaloneContextFx); diff --git a/NineChronicles.Headless.Tests/GraphTypes/StandaloneSubscriptionTest.cs b/NineChronicles.Headless.Tests/GraphTypes/StandaloneSubscriptionTest.cs index 367ad9533..37fb73932 100644 --- a/NineChronicles.Headless.Tests/GraphTypes/StandaloneSubscriptionTest.cs +++ b/NineChronicles.Headless.Tests/GraphTypes/StandaloneSubscriptionTest.cs @@ -172,9 +172,13 @@ await Assert.ThrowsAsync(async () => var apv1 = AppProtocolVersion.Sign(apvPrivateKey, 1); var apv2 = AppProtocolVersion.Sign(apvPrivateKey, 0); var peer = new BoundPeer(apvPrivateKey.PublicKey, new DnsEndPoint("0.0.0.0", 0)); - StandaloneContextFx.DifferentAppProtocolVersionEncounterSubject.OnNext( - new DifferentAppProtocolVersionEncounter(peer, apv1, apv2) - ); + _ = Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(1)); + StandaloneContextFx.DifferentAppProtocolVersionEncounterSubject.OnNext( + new DifferentAppProtocolVersionEncounter(peer, apv1, apv2) + ); + }); var rawEvents = await stream.Take(1); var rawEvent = (Dictionary)((ExecutionNode)rawEvents.Data!).ToValue()!; var differentAppProtocolVersionEncounter = diff --git a/NineChronicles.Headless/GraphTypes/StandaloneSubscription.cs b/NineChronicles.Headless/GraphTypes/StandaloneSubscription.cs index a7a89b698..85bbe64ed 100644 --- a/NineChronicles.Headless/GraphTypes/StandaloneSubscription.cs +++ b/NineChronicles.Headless/GraphTypes/StandaloneSubscription.cs @@ -137,7 +137,10 @@ public StandaloneSubscription(StandaloneContext standaloneContext) Resolver = new FuncFieldResolver(context => (DifferentAppProtocolVersionEncounter)context.Source!), Subscriber = new EventStreamResolver(context => - StandaloneContext.DifferentAppProtocolVersionEncounterSubject.AsObservable()), + StandaloneContext.DifferentAppProtocolVersionEncounterSubject + .Sample(standaloneContext.DifferentAppProtocolVersionEncounterInterval) + .AsObservable() + ), }); AddField(new EventStreamFieldType { diff --git a/NineChronicles.Headless/StandaloneContext.cs b/NineChronicles.Headless/StandaloneContext.cs index 1357a4e50..af0ff1b1b 100644 --- a/NineChronicles.Headless/StandaloneContext.cs +++ b/NineChronicles.Headless/StandaloneContext.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Concurrent; using System.Reactive.Subjects; using Libplanet; @@ -22,8 +23,8 @@ public class StandaloneContext public bool IsMining { get; set; } public ReplaySubject NodeStatusSubject { get; } = new ReplaySubject(); public ReplaySubject PreloadStateSubject { get; } = new ReplaySubject(); - public ReplaySubject DifferentAppProtocolVersionEncounterSubject { get; } - = new ReplaySubject(); + public Subject DifferentAppProtocolVersionEncounterSubject { get; } + = new Subject(); public ReplaySubject NotificationSubject { get; } = new ReplaySubject(1); public ReplaySubject NodeExceptionSubject { get; } = new ReplaySubject(); public ReplaySubject MonsterCollectionStateSubject { get; } = new ReplaySubject(); @@ -44,5 +45,7 @@ public class StandaloneContext }; public IStore? Store { get; internal set; } + + internal TimeSpan DifferentAppProtocolVersionEncounterInterval { get; set; } = TimeSpan.FromSeconds(30); } }