55using Newtonsoft . Json ;
66using SqlStreamStore ;
77using SqlStreamStore . Streams ;
8+ using SqlStreamStore . Subscriptions ;
89
910namespace Config . SqlStreamStore
1011{
@@ -15,6 +16,8 @@ public interface IConfigRepository
1516
1617 public class ConfigRepository : IConfigRepository
1718 {
19+ public delegate Task OnSettingsChanged ( ConfigurationSettings settings , CancellationToken ct ) ;
20+
1821 private readonly IStreamStore _streamStore ;
1922 private readonly StreamId _streamId ;
2023
@@ -38,11 +41,17 @@ public async Task<ConfigurationSettings> GetLatest(CancellationToken ct)
3841 }
3942
4043 var lastMessage = lastPage . Messages . First ( ) ;
41- var data = await lastMessage . GetJsonData ( ct ) ;
44+ return await BuildConfigurationSettingsFromMessage ( lastMessage , ct ) ;
45+ }
46+
47+ private static async Task < ConfigurationSettings > BuildConfigurationSettingsFromMessage (
48+ StreamMessage message , CancellationToken ct )
49+ {
50+ var data = await message . GetJsonData ( ct ) ;
4251
4352 var configChanged = JsonConvert . DeserializeObject < ConfigChanged > ( data ) ;
4453
45- return new ConfigurationSettings ( lastMessage . StreamVersion , lastMessage . CreatedUtc , configChanged . AllSettings ) ;
54+ return new ConfigurationSettings ( message . StreamVersion , message . CreatedUtc , configChanged . AllSettings ) ;
4655 }
4756
4857 public async Task < IConfigurationSettings > WriteChanges ( IConfigurationSettings settings , CancellationToken ct )
@@ -61,6 +70,56 @@ public async Task<IConfigurationSettings> WriteChanges(IConfigurationSettings se
6170
6271 return new ConfigurationSettings ( result . CurrentVersion , null , changes . AllSettings ) ;
6372 }
64-
73+
74+ public IDisposable SubscribeToChanges ( int version ,
75+ OnSettingsChanged onSettingsChanged ,
76+ CancellationToken ct )
77+ {
78+ IStreamSubscription subscription = null ;
79+
80+
81+ async Task StreamMessageReceived ( IStreamSubscription _ , StreamMessage streamMessage ,
82+ CancellationToken cancellationToken )
83+ {
84+ var settings = await BuildConfigurationSettingsFromMessage ( streamMessage , ct ) ;
85+ await onSettingsChanged ( settings , ct ) ;
86+ } ;
87+
88+ void SubscriptionDropped ( IStreamSubscription _ , SubscriptionDroppedReason reason ,
89+ Exception exception = null )
90+ {
91+ if ( reason != SubscriptionDroppedReason . Disposed )
92+ {
93+ SetupSubscription ( ) ;
94+ }
95+ } ;
96+
97+ void SetupSubscription ( )
98+ {
99+ subscription = _streamStore . SubscribeToStream (
100+ streamId : _streamId ,
101+ continueAfterVersion : version ,
102+ streamMessageReceived : StreamMessageReceived ,
103+ subscriptionDropped : SubscriptionDropped ) ;
104+ }
105+
106+ SetupSubscription ( ) ;
107+
108+ return subscription ;
109+ }
110+
111+ private class DelegateDisposable : IDisposable
112+ {
113+ public readonly Action Action ;
114+ public DelegateDisposable ( Action action )
115+ {
116+ Action = action ;
117+ }
118+
119+ public void Dispose ( )
120+ {
121+ Action ( ) ;
122+ }
123+ }
65124 }
66125}
0 commit comments