helper.dart 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import 'dart:typed_data';
  2. import 'package:flowy_log/flowy_log.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-dart-notify/protobuf.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
  7. import 'package:dartz/dartz.dart';
  8. typedef UserNotificationCallback = void Function(UserNotification, Either<Uint8List, UserError>);
  9. class UserNotificationParser extends NotificationParser<UserNotification, UserError> {
  10. UserNotificationParser({required String id, required UserNotificationCallback callback})
  11. : super(
  12. id: id,
  13. callback: callback,
  14. tyParser: (ty) => UserNotification.valueOf(ty),
  15. errorParser: (bytes) => UserError.fromBuffer(bytes),
  16. );
  17. }
  18. typedef NotificationCallback = void Function(WorkspaceNotification, Either<Uint8List, WorkspaceError>);
  19. class WorkspaceNotificationParser extends NotificationParser<WorkspaceNotification, WorkspaceError> {
  20. WorkspaceNotificationParser({String? id, required NotificationCallback callback})
  21. : super(
  22. id: id,
  23. callback: callback,
  24. tyParser: (ty) => WorkspaceNotification.valueOf(ty),
  25. errorParser: (bytes) => WorkspaceError.fromBuffer(bytes),
  26. );
  27. }
  28. class NotificationParser<T, E> {
  29. String? id;
  30. void Function(T, Either<Uint8List, E>) callback;
  31. T? Function(int) tyParser;
  32. E Function(Uint8List) errorParser;
  33. NotificationParser({this.id, required this.callback, required this.errorParser, required this.tyParser});
  34. void parse(SubscribeObject subject) {
  35. if (id != null) {
  36. if (subject.id != id) {
  37. return;
  38. }
  39. }
  40. final ty = tyParser(subject.ty);
  41. if (ty == null) {
  42. return;
  43. }
  44. if (subject.hasError()) {
  45. final bytes = Uint8List.fromList(subject.error);
  46. final error = errorParser(bytes);
  47. callback(ty, right(error));
  48. } else {
  49. final bytes = Uint8List.fromList(subject.payload);
  50. callback(ty, left(bytes));
  51. }
  52. }
  53. }