# Clocker ## Sequence diagram ```plantuml @startuml participant FE as "Frontend" << React >> participant Funnel as "Funnel" << Python >> participant Hours as "ServeHours" << Go >> participant Minutes as "ServeMinutes" << Go >> participant Seconds as "ServeSeconds" << Go >> participant Milliseconds as "ServeMilliseconds" << Go >> participant CurrentTime as "ServeCurrentTime" << Rust >> activate FE #hotpink FE -> FE: Load page FE -> Funnel: WS Connect loop #ivory activate Funnel #gold Funnel -> Hours: GetHours() activate Hours #skyblue Hours -> CurrentTime: GetCurrentTime() activate CurrentTime #sandybrown return HH:MM:SS.ms return HH Funnel -> Minutes: GetMinutes() activate Minutes #skyblue Minutes -> CurrentTime: GetCurrentTime() activate CurrentTime #sandybrown return HH:MM:SS.ms return MM Funnel -> Seconds: GetSeconds() activate Seconds #skyblue Seconds -> CurrentTime: GetCurrentTime() activate CurrentTime #sandybrown return HH:MM:SS.ms return SS Funnel -> Milliseconds: GetMilliseconds() activate Milliseconds #skyblue Milliseconds -> CurrentTime: GetCurrentTime() activate CurrentTime #sandybrown return HH:MM:SS.ms return ms Funnel -> FE: WS: Send formatted time deactivate Funnel end deactivate FE @enduml ``` ## Services | Service | Language | Port | | -- | -- | -- | | Funnel | Python | - | | ServeCurrentTime | Rust | 50000 | | ServeHours | Go | 50001 | | ServeMinutes | Go | 50002 | | ServeSeconds | Go | 50003 | | ServeMilliseconds | Go | 50004 | ### Funnel Requirements: - python 3.8+ - grpcio - grpcio-tools Install virtualenv and libs ```sh cd src/funnel virtualenv env source env/bin/activate pip install -r requirements.txt ``` Compile proto stubs: ```sh cd src/funnel make proto ``` Run service: ```sh cd src/funnel make run ``` ### Go services [gRPC Source](https://github.com/grpc/grpc-go) Install protobuf compiler ```sh go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 ``` ### Rust services #### [Tonic](https://github.com/hyperium/tonic) Tonic is a gRPC over HTTP/2 implementation focused on high performance, interoperability, and flexibility. This library was created to have first class support of async/await and to act as a core building block for production systems written in Rust. [Rust and gRPC: A complete guide](https://blog.logrocket.com/rust-and-grpc-a-complete-guide/)