Nathan.fooo 61fd608200
Feat/view map database (#1885)
* refactor: rename structs

* chore: read database id from view

* chore: fix open database error because of create a database view for database id

* chore: fix tests

* chore: rename datbase id to view id in flutter

* refactor: move grid and board to database view folder

* refactor: rename functions

* refactor: move calender to datbase view folder

* refactor: rename app_flowy to appflowy_flutter

* chore: reanming

* chore: fix freeze gen

* chore: remove todos

* refactor: view process events

* chore: add link database test

* chore: just open view if there is opened database
2023-02-26 16:27:17 +08:00

57 lines
1.7 KiB
Dart

import 'dart:isolate';
import 'dart:async';
import 'dart:typed_data';
import 'dart:ffi';
import 'package:appflowy_backend/log.dart';
import 'protobuf/flowy-notification/subject.pb.dart';
typedef ObserverCallback = void Function(SubscribeObject observable);
class RustStreamReceiver {
static RustStreamReceiver shared = RustStreamReceiver._internal();
late RawReceivePort _ffiPort;
late StreamController<Uint8List> _streamController;
late StreamController<SubscribeObject> _observableController;
late StreamSubscription<Uint8List> _ffiSubscription;
int get port => _ffiPort.sendPort.nativePort;
StreamController<SubscribeObject> get observable => _observableController;
RustStreamReceiver._internal() {
_ffiPort = RawReceivePort();
_streamController = StreamController();
_observableController = StreamController.broadcast();
_ffiPort.handler = _streamController.add;
_ffiSubscription = _streamController.stream.listen(_streamCallback);
}
factory RustStreamReceiver() {
return shared;
}
static StreamSubscription<SubscribeObject> listen(
void Function(SubscribeObject subject) callback) {
return RustStreamReceiver.shared.observable.stream.listen(callback);
}
void _streamCallback(Uint8List bytes) {
try {
final observable = SubscribeObject.fromBuffer(bytes);
_observableController.add(observable);
} catch (e, s) {
Log.error(
'RustStreamReceiver SubscribeObject deserialize error: ${e.runtimeType}');
Log.error('Stack trace \n $s');
rethrow;
}
}
Future<void> dispose() async {
await _ffiSubscription.cancel();
await _streamController.close();
await _observableController.close();
_ffiPort.close();
}
}