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';
|
2021-12-06 14:41:09 +08:00
|
|
|
import 'protobuf/dart-notify/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;
|
|
|
|
_ffiSubscription = _streamController.stream.listen(streamCallback);
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
void streamCallback(Uint8List bytes) {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|