Pārlūkot izejas kodu

feat: move handles to flowy-block crate

appflowy 3 gadi atpakaļ
vecāks
revīzija
5c155a07bf
48 mainītis faili ar 370 papildinājumiem un 101 dzēšanām
  1. 1 1
      frontend/app_flowy/lib/workspace/application/doc/share_bloc.dart
  2. 1 1
      frontend/app_flowy/lib/workspace/application/doc/share_service.dart
  3. 1 1
      frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart
  4. 3 3
      frontend/app_flowy/packages/flowy_sdk/example/pubspec.lock
  5. 8 0
      frontend/app_flowy/packages/flowy_sdk/example/windows/flutter/generated_plugins.cmake
  6. 37 0
      frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-block/dart_event.dart
  7. 2 0
      frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart
  8. 3 3
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pb.dart
  9. 1 1
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pbenum.dart
  10. 1 1
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pbjson.dart
  11. 2 2
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pbserver.dart
  12. 11 0
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pb.dart
  13. 26 0
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pbenum.dart
  14. 21 0
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pbjson.dart
  15. 9 0
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pbserver.dart
  16. 3 0
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/protobuf.dart
  17. 0 1
      frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/protobuf.dart
  18. 16 2
      frontend/app_flowy/packages/flowy_sdk/pubspec.lock
  19. 2 2
      frontend/rust-lib/dart-ffi/Cargo.toml
  20. 5 1
      frontend/rust-lib/flowy-block/Cargo.toml
  21. 3 0
      frontend/rust-lib/flowy-block/Flowy.toml
  22. 9 0
      frontend/rust-lib/flowy-block/build.rs
  23. 0 0
      frontend/rust-lib/flowy-block/src/entities.rs
  24. 29 0
      frontend/rust-lib/flowy-block/src/event_handler.rs
  25. 26 0
      frontend/rust-lib/flowy-block/src/event_map.rs
  26. 4 0
      frontend/rust-lib/flowy-block/src/lib.rs
  27. 4 0
      frontend/rust-lib/flowy-block/src/protobuf/mod.rs
  28. 7 7
      frontend/rust-lib/flowy-block/src/protobuf/model/entities.rs
  29. 91 0
      frontend/rust-lib/flowy-block/src/protobuf/model/event_map.rs
  30. 8 0
      frontend/rust-lib/flowy-block/src/protobuf/model/mod.rs
  31. 0 0
      frontend/rust-lib/flowy-block/src/protobuf/proto/entities.proto
  32. 6 0
      frontend/rust-lib/flowy-block/src/protobuf/proto/event_map.proto
  33. 1 1
      frontend/rust-lib/flowy-block/tests/document/edit_script.rs
  34. 2 5
      frontend/rust-lib/flowy-folder/src/event_map.rs
  35. 1 1
      frontend/rust-lib/flowy-folder/src/lib.rs
  36. 2 2
      frontend/rust-lib/flowy-folder/src/manager.rs
  37. 1 1
      frontend/rust-lib/flowy-folder/src/services/folder_editor.rs
  38. 1 1
      frontend/rust-lib/flowy-folder/src/services/persistence/migration.rs
  39. 1 1
      frontend/rust-lib/flowy-folder/src/services/persistence/mod.rs
  40. 0 12
      frontend/rust-lib/flowy-folder/src/services/view/controller.rs
  41. 0 19
      frontend/rust-lib/flowy-folder/src/services/view/event_handler.rs
  42. 1 1
      frontend/rust-lib/flowy-folder/src/services/workspace/event_handler.rs
  43. 2 2
      frontend/rust-lib/flowy-sdk/Cargo.toml
  44. 3 10
      frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs
  45. 8 14
      frontend/rust-lib/flowy-sdk/src/lib.rs
  46. 7 1
      frontend/rust-lib/flowy-sdk/src/module.rs
  47. 0 1
      shared-lib/flowy-folder-data-model/src/entities/mod.rs
  48. 0 3
      shared-lib/flowy-folder-data-model/src/protobuf/model/mod.rs

+ 1 - 1
frontend/app_flowy/lib/workspace/application/doc/share_bloc.dart

@@ -1,6 +1,6 @@
 import 'package:app_flowy/workspace/application/doc/share_service.dart';
 import 'package:app_flowy/workspace/application/markdown/delta_markdown.dart';
-import 'package:flowy_sdk/protobuf/flowy-folder-data-model/share.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-block/entities.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
 import 'package:freezed_annotation/freezed_annotation.dart';

+ 1 - 1
frontend/app_flowy/lib/workspace/application/doc/share_service.dart

@@ -1,8 +1,8 @@
 import 'dart:async';
 import 'package:dartz/dartz.dart';
 import 'package:flowy_sdk/dispatch/dispatch.dart';
-import 'package:flowy_sdk/protobuf/flowy-folder-data-model/protobuf.dart';
 import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-block/protobuf.dart';
 
 class ShareService {
   Future<Either<ExportData, FlowyError>> export(String docId, ExportType type) {

+ 1 - 1
frontend/app_flowy/lib/workspace/presentation/plugins/doc/document.dart

@@ -21,7 +21,7 @@ import 'package:flowy_infra/theme.dart';
 import 'package:flowy_infra_ui/flowy_infra_ui.dart';
 import 'package:flowy_infra_ui/widget/rounded_button.dart';
 import 'package:flowy_sdk/log.dart';
-import 'package:flowy_sdk/protobuf/flowy-folder-data-model/share.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-block/entities.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-folder-data-model/view.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
 import 'package:flutter/material.dart';

+ 3 - 3
frontend/app_flowy/packages/flowy_sdk/example/pubspec.lock

@@ -7,7 +7,7 @@ packages:
       name: archive
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.1.6"
+    version: "3.1.8"
   async:
     dependency: transitive
     description:
@@ -200,7 +200,7 @@ packages:
       name: path
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.8.0"
+    version: "1.8.1"
   platform:
     dependency: transitive
     description:
@@ -275,7 +275,7 @@ packages:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.8"
+    version: "0.4.9"
   typed_data:
     dependency: transitive
     description:

+ 8 - 0
frontend/app_flowy/packages/flowy_sdk/example/windows/flutter/generated_plugins.cmake

@@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST
   flowy_sdk
 )
 
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
 set(PLUGIN_BUNDLED_LIBRARIES)
 
 foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -14,3 +17,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
   list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
   list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
 endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)

+ 37 - 0
frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dart_event/flowy-block/dart_event.dart

@@ -0,0 +1,37 @@
+
+/// Auto generate. Do not edit
+part of '../../dispatch.dart';
+class BlockEventApplyDocDelta {
+     BlockDelta request;
+     BlockEventApplyDocDelta(this.request);
+
+    Future<Either<BlockDelta, FlowyError>> send() {
+    final request = FFIRequest.create()
+          ..event = BlockEvent.ApplyDocDelta.toString()
+          ..payload = requestToBytes(this.request);
+
+    return Dispatch.asyncRequest(request)
+        .then((bytesResult) => bytesResult.fold(
+           (okBytes) => left(BlockDelta.fromBuffer(okBytes)),
+           (errBytes) => right(FlowyError.fromBuffer(errBytes)),
+        ));
+    }
+}
+
+class BlockEventExportDocument {
+     ExportPayload request;
+     BlockEventExportDocument(this.request);
+
+    Future<Either<ExportData, FlowyError>> send() {
+    final request = FFIRequest.create()
+          ..event = BlockEvent.ExportDocument.toString()
+          ..payload = requestToBytes(this.request);
+
+    return Dispatch.asyncRequest(request)
+        .then((bytesResult) => bytesResult.fold(
+           (okBytes) => left(ExportData.fromBuffer(okBytes)),
+           (errBytes) => right(FlowyError.fromBuffer(errBytes)),
+        ));
+    }
+}
+

+ 2 - 0
frontend/app_flowy/packages/flowy_sdk/lib/dispatch/dispatch.dart

@@ -21,6 +21,7 @@ import 'package:flowy_sdk/ffi.dart' as ffi;
 import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart';
 import 'package:flowy_sdk/protobuf/dart-ffi/protobuf.dart';
 import 'package:flowy_sdk/protobuf/flowy-folder-data-model/protobuf.dart';
+import 'package:flowy_sdk/protobuf/flowy-block/protobuf.dart';
 import 'package:flowy_sdk/protobuf/flowy-collaboration/protobuf.dart';
 import 'package:flowy_sdk/protobuf/flowy-grid-data-model/protobuf.dart';
 
@@ -33,6 +34,7 @@ part 'dart_event/flowy-folder/dart_event.dart';
 part 'dart_event/flowy-net/dart_event.dart';
 part 'dart_event/flowy-user/dart_event.dart';
 part 'dart_event/flowy-grid/dart_event.dart';
+part 'dart_event/flowy-block/dart_event.dart';
 
 enum FFIException {
   RequestIsEmpty,

+ 3 - 3
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/share.pb.dart → frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pb.dart

@@ -1,6 +1,6 @@
 ///
 //  Generated code. Do not modify.
-//  source: share.proto
+//  source: entities.proto
 //
 // @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
@@ -9,9 +9,9 @@ import 'dart:core' as $core;
 
 import 'package:protobuf/protobuf.dart' as $pb;
 
-import 'share.pbenum.dart';
+import 'entities.pbenum.dart';
 
-export 'share.pbenum.dart';
+export 'entities.pbenum.dart';
 
 class ExportPayload extends $pb.GeneratedMessage {
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ExportPayload', createEmptyInstance: create)

+ 1 - 1
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/share.pbenum.dart → frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pbenum.dart

@@ -1,6 +1,6 @@
 ///
 //  Generated code. Do not modify.
-//  source: share.proto
+//  source: entities.proto
 //
 // @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields

+ 1 - 1
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/share.pbjson.dart → frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pbjson.dart

@@ -1,6 +1,6 @@
 ///
 //  Generated code. Do not modify.
-//  source: share.proto
+//  source: entities.proto
 //
 // @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package

+ 2 - 2
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/share.pbserver.dart → frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/entities.pbserver.dart

@@ -1,9 +1,9 @@
 ///
 //  Generated code. Do not modify.
-//  source: share.proto
+//  source: entities.proto
 //
 // @dart = 2.12
 // ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
 
-export 'share.pb.dart';
+export 'entities.pb.dart';
 

+ 11 - 0
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pb.dart

@@ -0,0 +1,11 @@
+///
+//  Generated code. Do not modify.
+//  source: event_map.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
+
+import 'dart:core' as $core;
+
+export 'event_map.pbenum.dart';
+

+ 26 - 0
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pbenum.dart

@@ -0,0 +1,26 @@
+///
+//  Generated code. Do not modify.
+//  source: event_map.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class BlockEvent extends $pb.ProtobufEnum {
+  static const BlockEvent ApplyDocDelta = BlockEvent._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ApplyDocDelta');
+  static const BlockEvent ExportDocument = BlockEvent._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ExportDocument');
+
+  static const $core.List<BlockEvent> values = <BlockEvent> [
+    ApplyDocDelta,
+    ExportDocument,
+  ];
+
+  static final $core.Map<$core.int, BlockEvent> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static BlockEvent? valueOf($core.int value) => _byValue[value];
+
+  const BlockEvent._($core.int v, $core.String n) : super(v, n);
+}
+

+ 21 - 0
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pbjson.dart

@@ -0,0 +1,21 @@
+///
+//  Generated code. Do not modify.
+//  source: event_map.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+@$core.Deprecated('Use blockEventDescriptor instead')
+const BlockEvent$json = const {
+  '1': 'BlockEvent',
+  '2': const [
+    const {'1': 'ApplyDocDelta', '2': 0},
+    const {'1': 'ExportDocument', '2': 1},
+  ],
+};
+
+/// Descriptor for `BlockEvent`. Decode as a `google.protobuf.EnumDescriptorProto`.
+final $typed_data.Uint8List blockEventDescriptor = $convert.base64Decode('CgpCbG9ja0V2ZW50EhEKDUFwcGx5RG9jRGVsdGEQABISCg5FeHBvcnREb2N1bWVudBAB');

+ 9 - 0
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/event_map.pbserver.dart

@@ -0,0 +1,9 @@
+///
+//  Generated code. Do not modify.
+//  source: event_map.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
+
+export 'event_map.pb.dart';
+

+ 3 - 0
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-block/protobuf.dart

@@ -0,0 +1,3 @@
+// Auto-generated, do not edit 
+export './entities.pb.dart';
+export './event_map.pb.dart';

+ 0 - 1
frontend/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-folder-data-model/protobuf.dart

@@ -1,5 +1,4 @@
 // Auto-generated, do not edit 
-export './share.pb.dart';
 export './app.pb.dart';
 export './view.pb.dart';
 export './trash.pb.dart';

+ 16 - 2
frontend/app_flowy/packages/flowy_sdk/pubspec.lock

@@ -214,6 +214,13 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
+  freezed:
+    dependency: "direct dev"
+    description:
+      name: freezed
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.14.1+2"
   freezed_annotation:
     dependency: "direct main"
     description:
@@ -339,7 +346,7 @@ packages:
       name: path
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.8.0"
+    version: "1.8.1"
   pedantic:
     dependency: transitive
     description:
@@ -394,6 +401,13 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.99"
+  source_gen:
+    dependency: transitive
+    description:
+      name: source_gen
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "1.0.0"
   source_span:
     dependency: transitive
     description:
@@ -442,7 +456,7 @@ packages:
       name: test_api
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.4.8"
+    version: "0.4.9"
   timing:
     dependency: transitive
     description:

+ 2 - 2
frontend/rust-lib/dart-ffi/Cargo.toml

@@ -7,8 +7,8 @@ edition = "2018"
 [lib]
 name = "dart_ffi"
 # this value will change depending on the target os
-# default staticlib
-crate-type = ["staticlib"]
+# default cdylib
+crate-type = ["cdylib"]
 
 
 [dependencies]

+ 5 - 1
frontend/rust-lib/flowy-block/Cargo.toml

@@ -52,6 +52,10 @@ color-eyre = { version = "0.5", default-features = false }
 criterion = "0.3"
 rand = "0.7.3"
 
+[build-dependencies]
+lib-infra = { path = "../../../shared-lib/lib-infra", features = ["protobuf_file_gen", "proto_gen"] }
+
 [features]
 http_server = []
-flowy_unit_test = ["lib-ot/flowy_unit_test", "flowy-sync/flowy_unit_test"]
+flowy_unit_test = ["lib-ot/flowy_unit_test", "flowy-sync/flowy_unit_test"]
+dart = ["lib-infra/dart"]

+ 3 - 0
frontend/rust-lib/flowy-block/Flowy.toml

@@ -0,0 +1,3 @@
+
+proto_crates = ["src/event_map.rs", "src/entities.rs"]
+event_files = ["src/event_map.rs"]

+ 9 - 0
frontend/rust-lib/flowy-block/build.rs

@@ -0,0 +1,9 @@
+use lib_infra::code_gen;
+
+fn main() {
+    let crate_name = env!("CARGO_PKG_NAME");
+    code_gen::protobuf_file::gen(crate_name, "./src/protobuf/proto");
+
+    #[cfg(feature = "dart")]
+    code_gen::dart_event::gen(crate_name);
+}

+ 0 - 0
shared-lib/flowy-folder-data-model/src/entities/share.rs → frontend/rust-lib/flowy-block/src/entities.rs


+ 29 - 0
frontend/rust-lib/flowy-block/src/event_handler.rs

@@ -0,0 +1,29 @@
+use crate::entities::{ExportData, ExportParams, ExportPayload};
+use crate::BlockManager;
+use flowy_collaboration::entities::document_info::BlockDelta;
+use flowy_error::FlowyError;
+use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
+use std::convert::TryInto;
+use std::sync::Arc;
+
+pub(crate) async fn apply_delta_handler(
+    data: Data<BlockDelta>,
+    manager: AppData<Arc<BlockManager>>,
+) -> DataResult<BlockDelta, FlowyError> {
+    let block_delta = manager.receive_local_delta(data.into_inner()).await?;
+    data_result(block_delta)
+}
+
+#[tracing::instrument(skip(data, manager), err)]
+pub(crate) async fn export_handler(
+    data: Data<ExportPayload>,
+    manager: AppData<Arc<BlockManager>>,
+) -> DataResult<ExportData, FlowyError> {
+    let params: ExportParams = data.into_inner().try_into()?;
+    let editor = manager.open_block(&params.view_id).await?;
+    let delta_json = editor.block_json().await?;
+    data_result(ExportData {
+        data: delta_json,
+        export_type: params.export_type,
+    })
+}

+ 26 - 0
frontend/rust-lib/flowy-block/src/event_map.rs

@@ -0,0 +1,26 @@
+use crate::event_handler::*;
+use crate::BlockManager;
+use flowy_derive::{Flowy_Event, ProtoBuf_Enum};
+use lib_dispatch::prelude::Module;
+use std::sync::Arc;
+use strum_macros::Display;
+
+pub fn create(block_manager: Arc<BlockManager>) -> Module {
+    let mut module = Module::new().name(env!("CARGO_PKG_NAME")).data(block_manager);
+
+    module = module
+        .event(BlockEvent::ApplyDocDelta, apply_delta_handler)
+        .event(BlockEvent::ExportDocument, export_handler);
+
+    module
+}
+
+#[derive(Clone, Copy, PartialEq, Eq, Debug, Display, Hash, ProtoBuf_Enum, Flowy_Event)]
+#[event_err = "FlowyError"]
+pub enum BlockEvent {
+    #[event(input = "BlockDelta", output = "BlockDelta")]
+    ApplyDocDelta = 0,
+
+    #[event(input = "ExportPayload", output = "ExportData")]
+    ExportDocument = 1,
+}

+ 4 - 0
frontend/rust-lib/flowy-block/src/lib.rs

@@ -1,8 +1,12 @@
 pub mod block_editor;
+mod entities;
+mod event_handler;
+pub mod event_map;
 pub mod manager;
 mod queue;
 mod web_socket;
 
+pub mod protobuf;
 pub use manager::*;
 pub mod errors {
     pub use flowy_error::{internal_error, ErrorCode, FlowyError};

+ 4 - 0
frontend/rust-lib/flowy-block/src/protobuf/mod.rs

@@ -0,0 +1,4 @@
+#![cfg_attr(rustfmt, rustfmt::skip)]
+// Auto-generated, do not edit
+mod model;
+pub use model::*;

+ 7 - 7
shared-lib/flowy-folder-data-model/src/protobuf/model/share.rs → frontend/rust-lib/flowy-block/src/protobuf/model/entities.rs

@@ -17,7 +17,7 @@
 #![allow(trivial_casts)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
-//! Generated file from `share.proto`
+//! Generated file from `entities.proto`
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
@@ -457,12 +457,12 @@ impl ::protobuf::reflect::ProtobufValue for ExportType {
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
-    \n\x0bshare.proto\"V\n\rExportPayload\x12\x17\n\x07view_id\x18\x01\x20\
-    \x01(\tR\x06viewId\x12,\n\x0bexport_type\x18\x02\x20\x01(\x0e2\x0b.Expor\
-    tTypeR\nexportType\"N\n\nExportData\x12\x12\n\x04data\x18\x01\x20\x01(\t\
-    R\x04data\x12,\n\x0bexport_type\x18\x02\x20\x01(\x0e2\x0b.ExportTypeR\ne\
-    xportType*.\n\nExportType\x12\x08\n\x04Text\x10\0\x12\x0c\n\x08Markdown\
-    \x10\x01\x12\x08\n\x04Link\x10\x02b\x06proto3\
+    \n\x0eentities.proto\"V\n\rExportPayload\x12\x17\n\x07view_id\x18\x01\
+    \x20\x01(\tR\x06viewId\x12,\n\x0bexport_type\x18\x02\x20\x01(\x0e2\x0b.E\
+    xportTypeR\nexportType\"N\n\nExportData\x12\x12\n\x04data\x18\x01\x20\
+    \x01(\tR\x04data\x12,\n\x0bexport_type\x18\x02\x20\x01(\x0e2\x0b.ExportT\
+    ypeR\nexportType*.\n\nExportType\x12\x08\n\x04Text\x10\0\x12\x0c\n\x08Ma\
+    rkdown\x10\x01\x12\x08\n\x04Link\x10\x02b\x06proto3\
 ";
 
 static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;

+ 91 - 0
frontend/rust-lib/flowy-block/src/protobuf/model/event_map.rs

@@ -0,0 +1,91 @@
+// This file is generated by rust-protobuf 2.25.2. Do not edit
+// @generated
+
+// https://github.com/rust-lang/rust-clippy/issues/702
+#![allow(unknown_lints)]
+#![allow(clippy::all)]
+
+#![allow(unused_attributes)]
+#![cfg_attr(rustfmt, rustfmt::skip)]
+
+#![allow(box_pointers)]
+#![allow(dead_code)]
+#![allow(missing_docs)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+#![allow(trivial_casts)]
+#![allow(unused_imports)]
+#![allow(unused_results)]
+//! Generated file from `event_map.proto`
+
+/// Generated files are compatible only with the same version
+/// of protobuf runtime.
+// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_25_2;
+
+#[derive(Clone,PartialEq,Eq,Debug,Hash)]
+pub enum BlockEvent {
+    ApplyDocDelta = 0,
+    ExportDocument = 1,
+}
+
+impl ::protobuf::ProtobufEnum for BlockEvent {
+    fn value(&self) -> i32 {
+        *self as i32
+    }
+
+    fn from_i32(value: i32) -> ::std::option::Option<BlockEvent> {
+        match value {
+            0 => ::std::option::Option::Some(BlockEvent::ApplyDocDelta),
+            1 => ::std::option::Option::Some(BlockEvent::ExportDocument),
+            _ => ::std::option::Option::None
+        }
+    }
+
+    fn values() -> &'static [Self] {
+        static values: &'static [BlockEvent] = &[
+            BlockEvent::ApplyDocDelta,
+            BlockEvent::ExportDocument,
+        ];
+        values
+    }
+
+    fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor {
+        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT;
+        descriptor.get(|| {
+            ::protobuf::reflect::EnumDescriptor::new_pb_name::<BlockEvent>("BlockEvent", file_descriptor_proto())
+        })
+    }
+}
+
+impl ::std::marker::Copy for BlockEvent {
+}
+
+impl ::std::default::Default for BlockEvent {
+    fn default() -> Self {
+        BlockEvent::ApplyDocDelta
+    }
+}
+
+impl ::protobuf::reflect::ProtobufValue for BlockEvent {
+    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
+        ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self))
+    }
+}
+
+static file_descriptor_proto_data: &'static [u8] = b"\
+    \n\x0fevent_map.proto*3\n\nBlockEvent\x12\x11\n\rApplyDocDelta\x10\0\x12\
+    \x12\n\x0eExportDocument\x10\x01b\x06proto3\
+";
+
+static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
+
+fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
+    ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+}
+
+pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
+    file_descriptor_proto_lazy.get(|| {
+        parse_descriptor_proto()
+    })
+}

+ 8 - 0
frontend/rust-lib/flowy-block/src/protobuf/model/mod.rs

@@ -0,0 +1,8 @@
+#![cfg_attr(rustfmt, rustfmt::skip)]
+// Auto-generated, do not edit
+
+mod entities;
+pub use entities::*;
+
+mod event_map;
+pub use event_map::*;

+ 0 - 0
shared-lib/flowy-folder-data-model/src/protobuf/proto/share.proto → frontend/rust-lib/flowy-block/src/protobuf/proto/entities.proto


+ 6 - 0
frontend/rust-lib/flowy-block/src/protobuf/proto/event_map.proto

@@ -0,0 +1,6 @@
+syntax = "proto3";
+
+enum BlockEvent {
+    ApplyDocDelta = 0;
+    ExportDocument = 1;
+}

+ 1 - 1
frontend/rust-lib/flowy-block/tests/document/edit_script.rs

@@ -27,7 +27,7 @@ impl EditorTest {
         let sdk = FlowySDKTest::default();
         let _ = sdk.init_user().await;
         let test = ViewTest::new(&sdk).await;
-        let editor = sdk.document_manager.open_block(&test.view.id).await.unwrap();
+        let editor = sdk.block_manager.open_block(&test.view.id).await.unwrap();
         Self { sdk, editor }
     }
 

+ 2 - 5
frontend/rust-lib/flowy-folder/src/event_map.rs

@@ -1,5 +1,4 @@
 use crate::{
-    controller::FolderManager,
     entities::{
         app::{App, AppId, CreateAppParams, UpdateAppParams},
         trash::{RepeatedTrash, RepeatedTrashId},
@@ -7,6 +6,7 @@ use crate::{
         workspace::{CreateWorkspaceParams, RepeatedWorkspace, UpdateWorkspaceParams, Workspace, WorkspaceId},
     },
     errors::FlowyError,
+    manager::FolderManager,
     services::{app::event_handler::*, trash::event_handler::*, view::event_handler::*, workspace::event_handler::*},
 };
 use flowy_database::DBConnection;
@@ -64,8 +64,7 @@ pub fn create(folder: Arc<FolderManager>) -> Module {
         .event(FolderEvent::DeleteView, delete_view_handler)
         .event(FolderEvent::DuplicateView, duplicate_view_handler)
         .event(FolderEvent::OpenView, open_view_handler)
-        .event(FolderEvent::CloseView, close_view_handler)
-        .event(FolderEvent::ApplyDocDelta, block_delta_handler);
+        .event(FolderEvent::CloseView, close_view_handler);
 
     module = module
         .event(FolderEvent::ReadTrash, read_trash_handler)
@@ -74,8 +73,6 @@ pub fn create(folder: Arc<FolderManager>) -> Module {
         .event(FolderEvent::RestoreAllTrash, restore_all_trash_handler)
         .event(FolderEvent::DeleteAllTrash, delete_all_trash_handler);
 
-    module = module.event(FolderEvent::ExportDocument, export_handler);
-
     module
 }
 

+ 1 - 1
frontend/rust-lib/flowy-folder/src/lib.rs

@@ -8,8 +8,8 @@ mod macros;
 #[macro_use]
 extern crate flowy_database;
 
-pub mod controller;
 mod dart_notification;
+pub mod manager;
 pub mod protobuf;
 mod util;
 

+ 2 - 2
frontend/rust-lib/flowy-folder/src/controller.rs → frontend/rust-lib/flowy-folder/src/manager.rs

@@ -72,7 +72,7 @@ impl FolderManager {
         user: Arc<dyn WorkspaceUser>,
         cloud_service: Arc<dyn FolderCouldServiceV1>,
         database: Arc<dyn WorkspaceDatabase>,
-        document_manager: Arc<BlockManager>,
+        block_manager: Arc<BlockManager>,
         web_socket: Arc<dyn RevisionWebSocket>,
     ) -> Self {
         if let Ok(user_id) = user.user_id() {
@@ -95,7 +95,7 @@ impl FolderManager {
             persistence.clone(),
             cloud_service.clone(),
             trash_controller.clone(),
-            document_manager,
+            block_manager,
         ));
 
         let app_controller = Arc::new(AppController::new(

+ 1 - 1
frontend/rust-lib/flowy-folder/src/services/folder_editor.rs

@@ -4,7 +4,7 @@ use flowy_collaboration::{
     entities::{revision::Revision, ws_data::ServerRevisionWSData},
 };
 
-use crate::controller::FolderId;
+use crate::manager::FolderId;
 use flowy_collaboration::util::make_delta_from_revisions;
 use flowy_error::{FlowyError, FlowyResult};
 use flowy_sync::{

+ 1 - 1
frontend/rust-lib/flowy-folder/src/services/persistence/migration.rs

@@ -1,4 +1,4 @@
-use crate::controller::FolderId;
+use crate::manager::FolderId;
 use crate::{
     event_map::WorkspaceDatabase,
     services::persistence::{AppTableSql, TrashTableSql, ViewTableSql, WorkspaceTableSql},

+ 1 - 1
frontend/rust-lib/flowy-folder/src/services/persistence/mod.rs

@@ -12,8 +12,8 @@ use tokio::sync::RwLock;
 pub use version_1::{app_sql::*, trash_sql::*, v1_impl::V1Transaction, view_sql::*, workspace_sql::*};
 
 use crate::{
-    controller::FolderId,
     event_map::WorkspaceDatabase,
+    manager::FolderId,
     services::{folder_editor::ClientFolderEditor, persistence::migration::FolderMigration},
 };
 use flowy_error::{FlowyError, FlowyResult};

+ 0 - 12
frontend/rust-lib/flowy-folder/src/services/view/controller.rs

@@ -23,8 +23,6 @@ use crate::{
 };
 use flowy_block::BlockManager;
 use flowy_database::kv::KV;
-use flowy_folder_data_model::entities::share::{ExportData, ExportParams};
-
 use lib_infra::uuid;
 
 const LATEST_VIEW_ID: &str = "latest_view_id";
@@ -179,16 +177,6 @@ impl ViewController {
         Ok(())
     }
 
-    #[tracing::instrument(level = "debug", skip(self, params), err)]
-    pub(crate) async fn export_view(&self, params: ExportParams) -> Result<ExportData, FlowyError> {
-        let editor = self.block_manager.open_block(&params.view_id).await?;
-        let delta_json = editor.block_json().await?;
-        Ok(ExportData {
-            data: delta_json,
-            export_type: params.export_type,
-        })
-    }
-
     // belong_to_id will be the app_id or view_id.
     #[tracing::instrument(level = "debug", skip(self), err)]
     pub(crate) async fn read_views_belong_to(&self, belong_to_id: &str) -> Result<RepeatedView, FlowyError> {

+ 0 - 19
frontend/rust-lib/flowy-folder/src/services/view/event_handler.rs

@@ -9,7 +9,6 @@ use crate::{
     services::{TrashController, ViewController},
 };
 use flowy_collaboration::entities::document_info::BlockDelta;
-use flowy_folder_data_model::entities::share::{ExportData, ExportParams, ExportPayload};
 use lib_dispatch::prelude::{data_result, AppData, Data, DataResult};
 use std::{convert::TryInto, sync::Arc};
 
@@ -46,14 +45,6 @@ pub(crate) async fn update_view_handler(
     Ok(())
 }
 
-pub(crate) async fn block_delta_handler(
-    data: Data<BlockDelta>,
-    controller: AppData<Arc<ViewController>>,
-) -> DataResult<BlockDelta, FlowyError> {
-    let block_delta = controller.receive_delta(data.into_inner()).await?;
-    data_result(block_delta)
-}
-
 pub(crate) async fn delete_view_handler(
     data: Data<RepeatedViewId>,
     view_controller: AppData<Arc<ViewController>>,
@@ -102,13 +93,3 @@ pub(crate) async fn duplicate_view_handler(
     let _ = controller.duplicate_view(&view_id.value).await?;
     Ok(())
 }
-
-#[tracing::instrument(skip(data, controller), err)]
-pub(crate) async fn export_handler(
-    data: Data<ExportPayload>,
-    controller: AppData<Arc<ViewController>>,
-) -> DataResult<ExportData, FlowyError> {
-    let params: ExportParams = data.into_inner().try_into()?;
-    let data = controller.export_view(params).await?;
-    data_result(data)
-}

+ 1 - 1
frontend/rust-lib/flowy-folder/src/services/workspace/event_handler.rs

@@ -1,7 +1,7 @@
 use crate::{
-    controller::FolderManager,
     dart_notification::{send_dart_notification, FolderNotification},
     errors::FlowyError,
+    manager::FolderManager,
     services::{get_current_workspace, read_local_workspace_apps, WorkspaceController},
 };
 use flowy_folder_data_model::entities::{

+ 2 - 2
frontend/rust-lib/flowy-sdk/Cargo.toml

@@ -13,7 +13,7 @@ flowy-net = { path = "../flowy-net" }
 flowy-folder = { path = "../flowy-folder", default-features = false }
 flowy-grid = { path = "../flowy-grid", default-features = false }
 flowy-database = { path = "../flowy-database" }
-flowy-block = { path = "../flowy-block" }
+flowy-block = { path = "../flowy-block", default-features = false }
 flowy-sync = { path = "../flowy-sync" }
 
 tracing = { version = "0.1" }
@@ -40,4 +40,4 @@ futures-util = "0.3.15"
 [features]
 http_server = ["flowy-user/http_server", "flowy-folder/http_server", "flowy-block/http_server"]
 use_bunyan = ["lib-log/use_bunyan"]
-dart = ["flowy-user/dart", "flowy-net/dart", "flowy-folder/dart", "flowy-collaboration/dart", "flowy-grid/dart"]
+dart = ["flowy-user/dart", "flowy-net/dart", "flowy-folder/dart", "flowy-collaboration/dart", "flowy-grid/dart", "flowy-block/dart"]

+ 3 - 10
frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs

@@ -3,9 +3,9 @@ use flowy_block::BlockManager;
 use flowy_collaboration::entities::ws_data::ClientRevisionWSData;
 use flowy_database::ConnectionPool;
 use flowy_folder::{
-    controller::FolderManager,
     errors::{internal_error, FlowyError},
     event_map::{FolderCouldServiceV1, WorkspaceDatabase, WorkspaceUser},
+    manager::FolderManager,
 };
 use flowy_net::ClientServerConfiguration;
 use flowy_net::{
@@ -24,7 +24,7 @@ impl FolderDepsResolver {
         local_server: Option<Arc<LocalServer>>,
         user_session: Arc<UserSession>,
         server_config: &ClientServerConfiguration,
-        document_manager: &Arc<BlockManager>,
+        block_manager: &Arc<BlockManager>,
         ws_conn: Arc<FlowyWebSocketConnect>,
     ) -> Arc<FolderManager> {
         let user: Arc<dyn WorkspaceUser> = Arc::new(WorkspaceUserImpl(user_session.clone()));
@@ -36,14 +36,7 @@ impl FolderDepsResolver {
         };
 
         let folder_manager = Arc::new(
-            FolderManager::new(
-                user.clone(),
-                cloud_service,
-                database,
-                document_manager.clone(),
-                web_socket,
-            )
-            .await,
+            FolderManager::new(user.clone(), cloud_service, database, block_manager.clone(), web_socket).await,
         );
 
         if let (Ok(user_id), Ok(token)) = (user.user_id(), user.token()) {

+ 8 - 14
frontend/rust-lib/flowy-sdk/src/lib.rs

@@ -4,7 +4,7 @@ pub use flowy_net::get_client_server_configuration;
 
 use crate::deps_resolve::*;
 use flowy_block::BlockManager;
-use flowy_folder::{controller::FolderManager, errors::FlowyError};
+use flowy_folder::{errors::FlowyError, manager::FolderManager};
 use flowy_grid::manager::GridManager;
 use flowy_net::ClientServerConfiguration;
 use flowy_net::{
@@ -87,7 +87,7 @@ pub struct FlowySDK {
     #[allow(dead_code)]
     config: FlowySDKConfig,
     pub user_session: Arc<UserSession>,
-    pub document_manager: Arc<BlockManager>,
+    pub block_manager: Arc<BlockManager>,
     pub folder_manager: Arc<FolderManager>,
     pub grid_manager: Arc<GridManager>,
     pub dispatcher: Arc<EventDispatcher>,
@@ -102,9 +102,9 @@ impl FlowySDK {
         tracing::debug!("🔥 {:?}", config);
         let runtime = tokio_default_runtime().unwrap();
         let (local_server, ws_conn) = mk_local_server(&config.server_config);
-        let (user_session, document_manager, folder_manager, local_server, grid_manager) = runtime.block_on(async {
+        let (user_session, block_manager, folder_manager, local_server, grid_manager) = runtime.block_on(async {
             let user_session = mk_user_session(&config, &local_server, &config.server_config);
-            let document_manager = BlockDepsResolver::resolve(
+            let block_manager = BlockDepsResolver::resolve(
                 local_server.clone(),
                 ws_conn.clone(),
                 user_session.clone(),
@@ -115,7 +115,7 @@ impl FlowySDK {
                 local_server.clone(),
                 user_session.clone(),
                 &config.server_config,
-                &document_manager,
+                &block_manager,
                 ws_conn.clone(),
             )
             .await;
@@ -126,17 +126,11 @@ impl FlowySDK {
                 local_server.run();
             }
             ws_conn.init().await;
-            (
-                user_session,
-                document_manager,
-                folder_manager,
-                local_server,
-                grid_manager,
-            )
+            (user_session, block_manager, folder_manager, local_server, grid_manager)
         });
 
         let dispatcher = Arc::new(EventDispatcher::construct(runtime, || {
-            mk_modules(&ws_conn, &folder_manager, &grid_manager, &user_session)
+            mk_modules(&ws_conn, &folder_manager, &grid_manager, &user_session, &block_manager)
         }));
 
         _start_listening(&dispatcher, &ws_conn, &user_session, &folder_manager);
@@ -144,7 +138,7 @@ impl FlowySDK {
         Self {
             config,
             user_session,
-            document_manager,
+            block_manager,
             folder_manager,
             grid_manager,
             dispatcher,

+ 7 - 1
frontend/rust-lib/flowy-sdk/src/module.rs

@@ -1,4 +1,5 @@
-use flowy_folder::controller::FolderManager;
+use flowy_block::BlockManager;
+use flowy_folder::manager::FolderManager;
 use flowy_grid::manager::GridManager;
 use flowy_net::ws::connection::FlowyWebSocketConnect;
 use flowy_user::services::UserSession;
@@ -10,6 +11,7 @@ pub fn mk_modules(
     folder_manager: &Arc<FolderManager>,
     grid_manager: &Arc<GridManager>,
     user_session: &Arc<UserSession>,
+    block_manager: &Arc<BlockManager>,
 ) -> Vec<Module> {
     let user_module = mk_user_module(user_session.clone());
     let folder_module = mk_folder_module(folder_manager.clone());
@@ -33,3 +35,7 @@ fn mk_network_module(ws_conn: Arc<FlowyWebSocketConnect>) -> Module {
 fn mk_grid_module(grid_manager: Arc<GridManager>) -> Module {
     flowy_grid::event_map::create(grid_manager)
 }
+
+fn mk_block_module(block_manager: Arc<BlockManager>) -> Module {
+    flowy_block::event_map::create(block_manager)
+}

+ 0 - 1
shared-lib/flowy-folder-data-model/src/entities/mod.rs

@@ -1,5 +1,4 @@
 pub mod app;
-pub mod share;
 pub mod trash;
 pub mod view;
 pub mod workspace;

+ 0 - 3
shared-lib/flowy-folder-data-model/src/protobuf/model/mod.rs

@@ -1,9 +1,6 @@
 #![cfg_attr(rustfmt, rustfmt::skip)]
 // Auto-generated, do not edit
 
-mod share;
-pub use share::*;
-
 mod app;
 pub use app::*;