# π₯³ AppFlowy - Event Driven System * [Goals of the System](#goals-of-the-system) * [Some Design Considerations](#some-design-Considerations) * [High Level Design](#high-level-design) * [Component Design](#component-design) ## π― Goals of the System The AppFlowy project is an attempt to build a high performance application. Here are the top-level requirements for our system. 1. **High Performance.** 2. **Cross-platform.** 3. **Reliability.** 4. **Safety.** ## π€ Some Design Considerations ## π High Level Design ## π Component Design ### π Event Dispatch ``` Frontend FLowySDK β βββββββββββ β β7ββΆβHandler Aβ β β βββββββββββ β βββββββββββ β βββββββββββ ββββββββ ββββββ ββββββββββββββββ β βββββΆβModule A ββββΌβββΆβHandler Bβ βWidgetββ1ββΆβBlocββ2ββΆβ Repository A ββ3ββ β β βββββββββββ β βββββββββββ ββββββββ ββββββ ββββββββββββββββ β β β β βββββββββββ ββββββββββββββββ β βββββββββ βββ΄βββ βββββββββββββ β βββββββββββ ββββΆβHandler Cβ β Repository B βββββΌββββΆβ Event ββ4ββΆβFFI ββ5βββΆβDispatcher ββ6ββΌββββΆβModule B β βββββββββββ ββββββββββββββββ β βββββββββ βββ¬βββ βββββββββββββ β βββββββββββ ββββββββββββββββ β β β β Repository C βββββ β β βββββββββββ ββββββββββββββββ β βββββΆβModule C β β βββββββββββ β β ``` Here is the event flow: 1. User click on the `Widget`(The user interface) that invokes the `Bloc` actions 2. `Bloc` calls the repositories to perform additional operations to handle the actions. 3. `Repository` offers the functionalities by combining the event, defined in the `FlowySDK`. 4. `Events` will be passed in the `FlowySDK` through the [FFI](https://en.wikipedia.org/wiki/Foreign_function_interface) interface. 5. `Dispatcher` parses the event and generates the specific action scheduled in the `FlowySDK` runtime. 6. `Dispatcher` find the event handler declared by the modules. 7. `Handler` consumes the event and generates the response. The response will be returned to the widget through the `FFI`. The event flow will be discussed in two parts: the frontend implemented in flutter and the FlowySDK implemented in Rust. #### FlowySDK #### Frontend The Frontend follows the DDD design pattern, you can recap from [**here**](DOMAIN_DRIVEN_DESIGN.md). ``` ββββββββ ββββββ ββββββββββββββββ βWidgetβββ1βββββΆβBlocβββ2βββββΆβ Repository A ββ3βββ ββββββββ ββββββ ββββββββββββββββ β ββββββββββββββββ β βββββββββ β Repository B ββββββΌβββββΆβ Event β ββββββββββββββββ β βββββββββ ββββββββββββββββ β β Repository C ββββββ ββββββββββββββββ ```