| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  | import 'dart:isolate'; | 
					
						
							|  |  |  | import 'dart:async'; | 
					
						
							|  |  |  | import 'dart:typed_data'; | 
					
						
							|  |  |  | import 'dart:ffi'; | 
					
						
							| 
									
										
										
										
											2023-01-08 12:10:53 +08:00
										 |  |  | import 'package:appflowy_backend/log.dart'; | 
					
						
							| 
									
										
										
										
											2023-01-26 15:40:23 +08:00
										 |  |  | import 'protobuf/flowy-notification/subject.pb.dart'; | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  | typedef ObserverCallback = void Function(SubscribeObject observable); | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class RustStreamReceiver { | 
					
						
							|  |  |  |   static RustStreamReceiver shared = RustStreamReceiver._internal(); | 
					
						
							|  |  |  |   late RawReceivePort _ffiPort; | 
					
						
							|  |  |  |   late StreamController<Uint8List> _streamController; | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  |   late StreamController<SubscribeObject> _observableController; | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  |   late StreamSubscription<Uint8List> _ffiSubscription; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int get port => _ffiPort.sendPort.nativePort; | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  |   StreamController<SubscribeObject> get observable => _observableController; | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   RustStreamReceiver._internal() { | 
					
						
							|  |  |  |     _ffiPort = RawReceivePort(); | 
					
						
							|  |  |  |     _streamController = StreamController(); | 
					
						
							|  |  |  |     _observableController = StreamController.broadcast(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _ffiPort.handler = _streamController.add; | 
					
						
							| 
									
										
										
										
											2023-02-07 10:48:28 +08:00
										 |  |  |     _ffiSubscription = _streamController.stream.listen(_streamCallback); | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   factory RustStreamReceiver() { | 
					
						
							|  |  |  |     return shared; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-08 12:10:53 +08:00
										 |  |  |   static StreamSubscription<SubscribeObject> listen( | 
					
						
							|  |  |  |       void Function(SubscribeObject subject) callback) { | 
					
						
							| 
									
										
										
										
											2022-01-30 10:33:05 +08:00
										 |  |  |     return RustStreamReceiver.shared.observable.stream.listen(callback); | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-07 10:48:28 +08:00
										 |  |  |   void _streamCallback(Uint8List bytes) { | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  |     try { | 
					
						
							| 
									
										
										
										
											2021-10-14 14:34:22 +08:00
										 |  |  |       final observable = SubscribeObject.fromBuffer(bytes); | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  |       _observableController.add(observable); | 
					
						
							|  |  |  |     } catch (e, s) { | 
					
						
							| 
									
										
										
										
											2023-01-08 12:10:53 +08:00
										 |  |  |       Log.error( | 
					
						
							|  |  |  |           'RustStreamReceiver SubscribeObject deserialize error: ${e.runtimeType}'); | 
					
						
							| 
									
										
										
										
											2021-07-21 15:43:05 +08:00
										 |  |  |       Log.error('Stack trace \n $s'); | 
					
						
							|  |  |  |       rethrow; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<void> dispose() async { | 
					
						
							|  |  |  |     await _ffiSubscription.cancel(); | 
					
						
							|  |  |  |     await _streamController.close(); | 
					
						
							|  |  |  |     await _observableController.close(); | 
					
						
							|  |  |  |     _ffiPort.close(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |