@@ -21,26 +21,10 @@ final class PluginController {
2121 }
2222 }
2323 }
24- var discoveryQueue : [ PlatformMethodResult ] = [ ] ;
24+ var messageQueue : [ CharacteristicValueInfo ] = [ ] ;
2525 var connectedDeviceSink : EventSink ?
26-
27- var valueQueue : [ PlatformMethodResult ] = [ ] ;
2826 var characteristicValueUpdateSink : EventSink ?
2927
30- func flushQueue( sink: EventSink , queue: inout [ PlatformMethodResult ] ) {
31- queue. forEach ( sink. add)
32- queue. removeAll ( )
33- }
34-
35- func sinkOrQueue( sink: EventSink ? , queue: inout [ PlatformMethodResult ] , value: PlatformMethodResult ) {
36- if let sink = sink {
37- flushQueue ( sink: sink, queue: & queue)
38- sink. add ( value)
39- } else {
40- queue. append ( value)
41- }
42- }
43-
4428 func initialize( name: String , completion: @escaping PlatformMethodCompletionHandler ) {
4529 if let central = central {
4630 central. stopScan ( )
@@ -99,9 +83,12 @@ final class PluginController {
9983 }
10084 }
10185
102- context. sinkOrQueue ( sink : context . connectedDeviceSink, queue : & context . discoveryQueue , value : . success( message) )
86+ context. connectedDeviceSink? . add ( . success( message) )
10387 } ,
10488 onServicesWithCharacteristicsInitialDiscovery: papply ( weak: self ) { context, central, peripheral, errors in
89+ guard let sink = context. connectedDeviceSink
90+ else { assert ( false ) ; return }
91+
10592 let message = DeviceInfo . with {
10693 $0. id = peripheral. identifier. uuidString
10794 $0. connectionState = encode ( peripheral. state)
@@ -112,7 +99,8 @@ final class PluginController {
11299 }
113100 }
114101 }
115- context. sinkOrQueue ( sink: context. connectedDeviceSink, queue: & context. discoveryQueue, value: . success( message) )
102+
103+ sink. add ( . success( message) )
116104 } ,
117105 onCharacteristicValueUpdate: papply ( weak: self ) { context, central, characteristic, value, error in
118106 let message = CharacteristicValueInfo . with {
@@ -131,7 +119,14 @@ final class PluginController {
131119 }
132120 }
133121 }
134- context. sinkOrQueue ( sink: context. characteristicValueUpdateSink, queue: & context. valueQueue, value: . success( message) )
122+ let sink = context. characteristicValueUpdateSink
123+ if ( sink != nil ) {
124+ sink!. add ( . success( message) )
125+ } else {
126+ // In case message arrives before sink is created
127+ context. messageQueue. append ( message) ;
128+ }
129+
135130 }
136131 )
137132
@@ -218,12 +213,16 @@ final class PluginController {
218213 let timeout = args. timeoutInMs > 0 ? TimeInterval ( args. timeoutInMs) / 1000 : nil
219214
220215 completion ( . success( nil ) )
221-
222- let message = DeviceInfo . with {
223- $0. id = args. deviceID
224- $0. connectionState = encode ( . connecting)
216+
217+ if let sink = connectedDeviceSink {
218+ let message = DeviceInfo . with {
219+ $0. id = args. deviceID
220+ $0. connectionState = encode ( . connecting)
221+ }
222+ sink. add ( . success( message) )
223+ } else {
224+ print ( " Warning! No event channel set up to report a connection update " )
225225 }
226- sinkOrQueue ( sink: connectedDeviceSink, queue: & discoveryQueue, value: . success( message) )
227226
228227 do {
229228 try central. connect (
@@ -232,6 +231,12 @@ final class PluginController {
232231 timeout: timeout
233232 )
234233 } catch {
234+ guard let sink = connectedDeviceSink
235+ else {
236+ print ( " Warning! No event channel set up to report a connection failure: \( error) " )
237+ return
238+ }
239+
235240 let message = DeviceInfo . with {
236241 $0. id = args. deviceID
237242 $0. connectionState = encode ( . disconnected)
@@ -240,7 +245,8 @@ final class PluginController {
240245 $0. message = " \( error) "
241246 }
242247 }
243- sinkOrQueue ( sink: connectedDeviceSink, queue: & discoveryQueue, value: . success( message) )
248+
249+ sink. add ( . success( message) )
244250 }
245251 }
246252
0 commit comments