@@ -83,11 +83,27 @@ impl StoreEventListener {
83
83
}
84
84
}
85
85
86
+ #[ async_trait]
87
+ trait EventSink : Send + Sync {
88
+ async fn send ( & self , event : Arc < StoreEvent > ) -> Result < ( ) , Error > ;
89
+ fn is_closed ( & self ) -> bool ;
90
+ }
91
+
92
+ #[ async_trait]
93
+ impl EventSink for Sender < Arc < StoreEvent > > {
94
+ async fn send ( & self , event : Arc < StoreEvent > ) -> Result < ( ) , Error > {
95
+ Ok ( self . send ( event) . await ?)
96
+ }
97
+
98
+ fn is_closed ( & self ) -> bool {
99
+ self . is_closed ( )
100
+ }
101
+ }
102
+
86
103
/// Manage subscriptions to the `StoreEvent` stream. Keep a list of
87
104
/// currently active subscribers and forward new events to each of them
88
105
pub struct SubscriptionManager {
89
- subscriptions :
90
- Arc < RwLock < HashMap < String , ( Arc < Vec < SubscriptionFilter > > , Sender < Arc < StoreEvent > > ) > > > ,
106
+ subscriptions : Arc < RwLock < HashMap < String , ( Arc < Vec < SubscriptionFilter > > , Arc < dyn EventSink > ) > > > ,
91
107
92
108
/// Keep the notification listener alive
93
109
listener : StoreEventListener ,
@@ -182,7 +198,7 @@ impl SubscriptionManagerTrait for SubscriptionManager {
182
198
self . subscriptions
183
199
. write ( )
184
200
. unwrap ( )
185
- . insert ( id, ( Arc :: new ( entities. clone ( ) ) , sender) ) ;
201
+ . insert ( id, ( Arc :: new ( entities. clone ( ) ) , Arc :: new ( sender) ) ) ;
186
202
187
203
// Return the subscription ID and entity change stream
188
204
StoreEventStream :: new ( Box :: new ( ReceiverStream :: new ( receiver) . map ( Ok ) . compat ( ) ) )
0 commit comments