notification_helper.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'dart:async';
  2. import 'dart:typed_data';
  3. import 'package:flowy_sdk/protobuf/dart-notify/protobuf.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
  5. import 'package:dartz/dartz.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-folder/dart_notification.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-grid/dart_notification.pb.dart';
  9. import 'package:flowy_sdk/rust_stream.dart';
  10. // User
  11. typedef UserNotificationCallback = void Function(UserNotification, Either<Uint8List, FlowyError>);
  12. class UserNotificationParser extends NotificationParser<UserNotification, FlowyError> {
  13. UserNotificationParser({required String id, required UserNotificationCallback callback})
  14. : super(
  15. id: id,
  16. callback: callback,
  17. tyParser: (ty) => UserNotification.valueOf(ty),
  18. errorParser: (bytes) => FlowyError.fromBuffer(bytes),
  19. );
  20. }
  21. // Folder
  22. typedef FolderNotificationCallback = void Function(FolderNotification, Either<Uint8List, FlowyError>);
  23. class FolderNotificationParser extends NotificationParser<FolderNotification, FlowyError> {
  24. FolderNotificationParser({String? id, required FolderNotificationCallback callback})
  25. : super(
  26. id: id,
  27. callback: callback,
  28. tyParser: (ty) => FolderNotification.valueOf(ty),
  29. errorParser: (bytes) => FlowyError.fromBuffer(bytes),
  30. );
  31. }
  32. // Grid
  33. typedef GridNotificationCallback = void Function(GridNotification, Either<Uint8List, FlowyError>);
  34. class GridNotificationParser extends NotificationParser<GridNotification, FlowyError> {
  35. GridNotificationParser({String? id, required GridNotificationCallback callback})
  36. : super(
  37. id: id,
  38. callback: callback,
  39. tyParser: (ty) => GridNotification.valueOf(ty),
  40. errorParser: (bytes) => FlowyError.fromBuffer(bytes),
  41. );
  42. }
  43. typedef GridNotificationHandler = Function(GridNotification ty, Either<Uint8List, FlowyError> result);
  44. class GridNotificationListener {
  45. StreamSubscription<SubscribeObject>? _subscription;
  46. GridNotificationParser? _parser;
  47. GridNotificationListener({required String objectId, required GridNotificationHandler handler})
  48. : _parser = GridNotificationParser(id: objectId, callback: handler) {
  49. _subscription = RustStreamReceiver.listen((observable) => _parser?.parse(observable));
  50. }
  51. Future<void> stop() async {
  52. _parser = null;
  53. await _subscription?.cancel();
  54. }
  55. }
  56. class NotificationParser<T, E> {
  57. String? id;
  58. void Function(T, Either<Uint8List, E>) callback;
  59. T? Function(int) tyParser;
  60. E Function(Uint8List) errorParser;
  61. NotificationParser({this.id, required this.callback, required this.errorParser, required this.tyParser});
  62. void parse(SubscribeObject subject) {
  63. if (id != null) {
  64. if (subject.id != id) {
  65. return;
  66. }
  67. }
  68. final ty = tyParser(subject.ty);
  69. if (ty == null) {
  70. return;
  71. }
  72. if (subject.hasError()) {
  73. final bytes = Uint8List.fromList(subject.error);
  74. final error = errorParser(bytes);
  75. callback(ty, right(error));
  76. } else {
  77. final bytes = Uint8List.fromList(subject.payload);
  78. callback(ty, left(bytes));
  79. }
  80. }
  81. }