From 98fc1800166e1a7233a5076c7f22bbdbb6e7eb1e Mon Sep 17 00:00:00 2001 From: Win Date: Mon, 17 Feb 2025 09:30:02 +0700 Subject: [PATCH] chat room --- .../__MACOSX/._rust-chat-server | Bin .../__MACOSX/rust-chat-server/._.DS_Store | Bin .../__MACOSX/rust-chat-server/._.git | Bin .../__MACOSX/rust-chat-server/._.gitignore | Bin .../__MACOSX/rust-chat-server/._.idea | Bin .../__MACOSX/rust-chat-server/._.vscode | Bin .../__MACOSX/rust-chat-server/._Cargo.lock | Bin .../__MACOSX/rust-chat-server/._Cargo.toml | Bin .../__MACOSX/rust-chat-server/._LICENSE | Bin .../__MACOSX/rust-chat-server/._README.md | Bin .../__MACOSX/rust-chat-server/._comms | Bin .../__MACOSX/rust-chat-server/._server | Bin .../__MACOSX/rust-chat-server/._tui | Bin .../rust-chat-server/.idea/._.gitignore | Bin .../rust-chat-server/.idea/._modules.xml | Bin .../.idea/._rust-chat-server.iml | Bin .../__MACOSX/rust-chat-server/.idea/._vcs.xml | Bin .../rust-chat-server/.idea/._workspace.xml | Bin .../rust-chat-server/.vscode/._settings.json | Bin .../rust-chat-server/comms/._.gitignore | Bin .../rust-chat-server/comms/._Cargo.toml | Bin .../rust-chat-server/comms/._README.md | Bin .../__MACOSX/rust-chat-server/comms/._src | Bin .../__MACOSX/rust-chat-server/comms/._tests | Bin .../rust-chat-server/comms/src/._command.rs | Bin .../rust-chat-server/comms/src/._event.rs | Bin .../rust-chat-server/comms/src/._lib.rs | Bin .../rust-chat-server/comms/src/._transport | Bin .../comms/src/transport/._client.rs | Bin .../comms/src/transport/._common.rs | Bin .../comms/src/transport/._mod.rs | Bin .../comms/src/transport/._server.rs | Bin .../._e2e_server_and_client_transport.rs | Bin .../rust-chat-server/server/._.gitignore | Bin .../rust-chat-server/server/._Cargo.toml | Bin .../rust-chat-server/server/._README.md | Bin .../__MACOSX/rust-chat-server/server/._docs | Bin .../rust-chat-server/server/._examples | Bin .../rust-chat-server/server/._resources | Bin .../__MACOSX/rust-chat-server/server/._src | Bin .../docs/._high-level-architecture.plantuml | Bin .../server/docs/._high-level-architecture.svg | Bin .../server/examples/._stress_test.rs | Bin .../resources/._chat_rooms_metadata.json | Bin .../rust-chat-server/server/src/._main.rs | Bin .../server/src/._room_manager | Bin .../rust-chat-server/server/src/._session | Bin .../server/src/room_manager/._mod.rs | Bin .../server/src/room_manager/._room | Bin .../server/src/room_manager/._room_manager.rs | Bin .../src/room_manager/room/._chat_room.rs | Bin .../server/src/room_manager/room/._mod.rs | Bin .../src/room_manager/room/._user_registry.rs | Bin .../room/._user_session_handle.rs | Bin .../server/src/session/._chat_session.rs | Bin .../server/src/session/._mod.rs | Bin .../rust-chat-server/tui/._.gitignore | Bin .../rust-chat-server/tui/._Cargo.toml | Bin .../__MACOSX/rust-chat-server/tui/._README.md | Bin .../__MACOSX/rust-chat-server/tui/._docs | Bin .../__MACOSX/rust-chat-server/tui/._src | Bin .../docs/._high-level-architecture.plantuml | Bin .../tui/docs/._high-level-architecture.svg | Bin .../rust-chat-server/tui/docs/._tui.gif | Bin .../rust-chat-server/tui/src/._main.rs | Bin .../rust-chat-server/tui/src/._state_store | Bin .../rust-chat-server/tui/src/._termination.rs | Bin .../rust-chat-server/tui/src/._ui_management | Bin .../tui/src/state_store/._action.rs | Bin .../tui/src/state_store/._mod.rs | Bin .../tui/src/state_store/._state.rs | Bin .../tui/src/state_store/._state_store.rs | Bin .../tui/src/ui_management/._components | Bin .../tui/src/ui_management/._mod.rs | Bin .../tui/src/ui_management/._pages | Bin .../tui/src/ui_management/._ui_manager.rs | Bin .../ui_management/components/._component.rs | Bin .../ui_management/components/._input_box.rs | Bin .../tui/src/ui_management/components/._mod.rs | Bin .../tui/src/ui_management/pages/._chat_page | Bin .../src/ui_management/pages/._connect_page | Bin .../tui/src/ui_management/pages/._mod.rs | Bin .../pages/chat_page/._chat_page.rs | Bin .../pages/chat_page/._components | Bin .../ui_management/pages/chat_page/._mod.rs | Bin .../ui_management/pages/chat_page/._section | Bin .../components/._message_input_box.rs | Bin .../pages/chat_page/components/._mod.rs | Bin .../pages/chat_page/components/._room_list.rs | Bin .../pages/chat_page/section/._mod.rs | Bin .../pages/chat_page/section/._usage.rs | Bin .../pages/connect_page/._connect_page.rs | Bin .../ui_management/pages/connect_page/._mod.rs | Bin .../.devcontainer/devcontainer.json | 31 ++ .../sen-109/00010/rust-chat-server/.gitignore | 98 ++++ .../00010/rust-chat-server/.idea/.gitignore | 8 + .../00010/rust-chat-server/.idea/modules.xml | 8 + .../.idea/rust-chat-server.iml | 15 + .../00010/rust-chat-server/.idea/vcs.xml | 6 + .../rust-chat-server/.vscode/settings.json | 3 + .../sen-109/00010/rust-chat-server/Cargo.toml | 7 + .../sen-109/00010/rust-chat-server/LICENSE | 21 + .../sen-109/00010/rust-chat-server/README.md | 29 ++ .../00010/rust-chat-server/comms/.gitignore | 2 + .../00010/rust-chat-server/comms/Cargo.toml | 23 + .../00010/rust-chat-server/comms/README.md | 66 +++ .../rust-chat-server/comms/src/command.rs | 95 ++++ .../00010/rust-chat-server/comms/src/event.rs | 169 +++++++ .../00010/rust-chat-server/comms/src/lib.rs | 7 + .../comms/src/transport/client.rs | 69 +++ .../comms/src/transport/common.rs | 7 + .../comms/src/transport/mod.rs | 8 + .../comms/src/transport/server.rs | 69 +++ .../tests/e2e_server_and_client_transport.rs | 120 +++++ .../00010/rust-chat-server/rust-chat-server | 1 - .../00010/rust-chat-server/server/.gitignore | 1 + .../00010/rust-chat-server/server/Cargo.toml | 19 + .../00010/rust-chat-server/server/README.md | 61 +++ .../docs/high-level-architecture.plantuml | 39 ++ .../server/docs/high-level-architecture.svg | 67 +++ .../server/examples/stress_test.rs | 168 +++++++ .../server/resources/chat_rooms_metadata.json | 98 ++++ .../00010/rust-chat-server/server/src/main.rs | 50 ++ .../server/src/room_manager/mod.rs | 47 ++ .../server/src/room_manager/room/chat_room.rs | 88 ++++ .../server/src/room_manager/room/mod.rs | 6 + .../src/room_manager/room/user_registry.rs | 70 +++ .../room_manager/room/user_session_handle.rs | 64 +++ .../server/src/room_manager/room_manager.rs | 69 +++ .../server/src/session/chat_session.rs | 132 +++++ .../server/src/session/mod.rs | 88 ++++ .../00010/rust-chat-server/tui/.gitignore | 1 + .../00010/rust-chat-server/tui/Cargo.toml | 15 + .../00010/rust-chat-server/tui/README.md | 33 ++ .../tui/docs/high-level-architecture.plantuml | 54 +++ .../tui/docs/high-level-architecture.svg | 96 ++++ .../00010/rust-chat-server/tui/docs/tui.gif | Bin 0 -> 510025 bytes .../00010/rust-chat-server/tui/src/main.rs | 32 ++ .../tui/src/state_store/action.rs | 7 + .../tui/src/state_store/mod.rs | 7 + .../tui/src/state_store/state.rs | 189 ++++++++ .../tui/src/state_store/state_store.rs | 157 ++++++ .../rust-chat-server/tui/src/termination.rs | 49 ++ .../src/ui_management/components/component.rs | 22 + .../src/ui_management/components/input_box.rs | 159 ++++++ .../tui/src/ui_management/components/mod.rs | 4 + .../tui/src/ui_management/mod.rs | 5 + .../pages/chat_page/chat_page.rs | 457 ++++++++++++++++++ .../chat_page/components/message_input_box.rs | 148 ++++++ .../pages/chat_page/components/mod.rs | 2 + .../pages/chat_page/components/room_list.rs | 259 ++++++++++ .../src/ui_management/pages/chat_page/mod.rs | 6 + .../pages/chat_page/section/mod.rs | 6 + .../pages/chat_page/section/usage.rs | 62 +++ .../pages/connect_page/connect_page.rs | 186 +++++++ .../ui_management/pages/connect_page/mod.rs | 4 + .../tui/src/ui_management/pages/mod.rs | 100 ++++ .../tui/src/ui_management/ui_manager.rs | 112 +++++ 158 files changed, 4100 insertions(+), 1 deletion(-) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/._rust-chat-server (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._.DS_Store (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._.git (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._.gitignore (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._.idea (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._.vscode (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._Cargo.lock (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._Cargo.toml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._LICENSE (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._README.md (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._comms (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._server (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/._tui (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/.idea/._.gitignore (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/.idea/._modules.xml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/.idea/._rust-chat-server.iml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/.idea/._vcs.xml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/.idea/._workspace.xml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/.vscode/._settings.json (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/._.gitignore (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/._Cargo.toml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/._README.md (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/._src (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/._tests (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/._command.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/._event.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/._lib.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/._transport (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/transport/._client.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/transport/._common.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/transport/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/src/transport/._server.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/comms/tests/._e2e_server_and_client_transport.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/._.gitignore (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/._Cargo.toml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/._README.md (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/._docs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/._examples (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/._resources (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/._src (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.plantuml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.svg (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/examples/._stress_test.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/resources/._chat_rooms_metadata.json (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/._main.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/._room_manager (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/._session (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/room_manager/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/room_manager/._room (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/room_manager/._room_manager.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/room_manager/room/._chat_room.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/room_manager/room/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_registry.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_session_handle.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/session/._chat_session.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/server/src/session/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/._.gitignore (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/._Cargo.toml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/._README.md (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/._docs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/._src (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.plantuml (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.svg (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/docs/._tui.gif (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/._main.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/._state_store (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/._termination.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/._ui_management (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/state_store/._action.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/state_store/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/state_store/._state.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/state_store/._state_store.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/._components (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/._pages (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/._ui_manager.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/components/._component.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/components/._input_box.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/components/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._chat_page (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._connect_page (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._chat_page.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._components (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._section (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._message_input_box.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._room_list.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._mod.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._usage.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._connect_page.rs (100%) rename spring-2025/sen-109/00010/{rust-chat-server => rust-chat-server-2}/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._mod.rs (100%) create mode 100644 spring-2025/sen-109/00010/rust-chat-server/.devcontainer/devcontainer.json create mode 100644 spring-2025/sen-109/00010/rust-chat-server/.gitignore create mode 100644 spring-2025/sen-109/00010/rust-chat-server/.idea/.gitignore create mode 100644 spring-2025/sen-109/00010/rust-chat-server/.idea/modules.xml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/.idea/rust-chat-server.iml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/.idea/vcs.xml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/.vscode/settings.json create mode 100644 spring-2025/sen-109/00010/rust-chat-server/Cargo.toml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/LICENSE create mode 100644 spring-2025/sen-109/00010/rust-chat-server/README.md create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/.gitignore create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/Cargo.toml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/README.md create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/src/command.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/src/event.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/src/lib.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/client.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/common.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/server.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/comms/tests/e2e_server_and_client_transport.rs delete mode 160000 spring-2025/sen-109/00010/rust-chat-server/rust-chat-server create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/.gitignore create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/Cargo.toml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/README.md create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.plantuml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.svg create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/examples/stress_test.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/resources/chat_rooms_metadata.json create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/main.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/chat_room.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_registry.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_session_handle.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room_manager.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/session/chat_session.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/server/src/session/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/.gitignore create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/Cargo.toml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/README.md create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.plantuml create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.svg create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/docs/tui.gif create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/main.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/action.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state_store.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/termination.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/component.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/input_box.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/chat_page.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/message_input_box.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/room_list.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/usage.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/connect_page.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/mod.rs create mode 100644 spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/ui_manager.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/._rust-chat-server b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/._rust-chat-server similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/._rust-chat-server rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/._rust-chat-server diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.DS_Store b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.DS_Store similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.DS_Store rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.DS_Store diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.git b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.git similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.git rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.git diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.gitignore b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.gitignore similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.gitignore rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.gitignore diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.idea b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.idea similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.idea rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.idea diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.vscode b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.vscode similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._.vscode rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._.vscode diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._Cargo.lock b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._Cargo.lock similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._Cargo.lock rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._Cargo.lock diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._Cargo.toml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._Cargo.toml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._Cargo.toml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._LICENSE b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._LICENSE similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._LICENSE rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._LICENSE diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._README.md b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._README.md similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._README.md rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._README.md diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._comms b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._comms similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._comms rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._comms diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._server b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._server similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._server rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._server diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._tui b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._tui similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/._tui rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/._tui diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._.gitignore b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._.gitignore similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._.gitignore rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._.gitignore diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._modules.xml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._modules.xml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._modules.xml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._modules.xml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._rust-chat-server.iml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._rust-chat-server.iml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._rust-chat-server.iml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._rust-chat-server.iml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._vcs.xml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._vcs.xml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._vcs.xml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._vcs.xml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._workspace.xml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._workspace.xml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.idea/._workspace.xml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.idea/._workspace.xml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.vscode/._settings.json b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.vscode/._settings.json similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/.vscode/._settings.json rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/.vscode/._settings.json diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._.gitignore b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._.gitignore similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._.gitignore rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._.gitignore diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._Cargo.toml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._Cargo.toml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._Cargo.toml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._README.md b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._README.md similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._README.md rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._README.md diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._src b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._src similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._src rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._src diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._tests b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._tests similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/._tests rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/._tests diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._command.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._command.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._command.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._command.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._event.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._event.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._event.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._event.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._lib.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._lib.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._lib.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._lib.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._transport b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._transport similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/._transport rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/._transport diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._client.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._client.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._client.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._client.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._common.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._common.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._common.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._common.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._server.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._server.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/src/transport/._server.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/src/transport/._server.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/tests/._e2e_server_and_client_transport.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/tests/._e2e_server_and_client_transport.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/comms/tests/._e2e_server_and_client_transport.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/comms/tests/._e2e_server_and_client_transport.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._.gitignore b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._.gitignore similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._.gitignore rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._.gitignore diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._Cargo.toml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._Cargo.toml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._Cargo.toml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._README.md b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._README.md similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._README.md rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._README.md diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._docs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._docs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._docs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._docs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._examples b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._examples similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._examples rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._examples diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._resources b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._resources similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._resources rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._resources diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._src b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._src similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/._src rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/._src diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.plantuml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.plantuml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.plantuml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.plantuml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.svg b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.svg similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.svg rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/docs/._high-level-architecture.svg diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/examples/._stress_test.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/examples/._stress_test.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/examples/._stress_test.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/examples/._stress_test.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/resources/._chat_rooms_metadata.json b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/resources/._chat_rooms_metadata.json similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/resources/._chat_rooms_metadata.json rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/resources/._chat_rooms_metadata.json diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/._main.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/._main.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/._main.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/._main.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/._room_manager b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/._room_manager similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/._room_manager rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/._room_manager diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/._session b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/._session similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/._session rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/._session diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/._room b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/._room similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/._room rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/._room diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/._room_manager.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/._room_manager.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/._room_manager.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/._room_manager.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._chat_room.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._chat_room.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._chat_room.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._chat_room.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_registry.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_registry.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_registry.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_registry.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_session_handle.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_session_handle.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_session_handle.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/room_manager/room/._user_session_handle.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/session/._chat_session.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/session/._chat_session.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/session/._chat_session.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/session/._chat_session.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/session/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/session/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/server/src/session/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/server/src/session/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._.gitignore b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._.gitignore similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._.gitignore rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._.gitignore diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._Cargo.toml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._Cargo.toml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._Cargo.toml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._README.md b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._README.md similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._README.md rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._README.md diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._docs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._docs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._docs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._docs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._src b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._src similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/._src rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/._src diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.plantuml b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.plantuml similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.plantuml rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.plantuml diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.svg b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.svg similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.svg rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/docs/._high-level-architecture.svg diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/docs/._tui.gif b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/docs/._tui.gif similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/docs/._tui.gif rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/docs/._tui.gif diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._main.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._main.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._main.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._main.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._state_store b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._state_store similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._state_store rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._state_store diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._termination.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._termination.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._termination.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._termination.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._ui_management b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._ui_management similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/._ui_management rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/._ui_management diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._action.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._action.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._action.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._action.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._state.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._state.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._state.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._state.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._state_store.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._state_store.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/state_store/._state_store.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/state_store/._state_store.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._components b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._components similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._components rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._components diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._pages b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._pages similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._pages rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._pages diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._ui_manager.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._ui_manager.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/._ui_manager.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/._ui_manager.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/components/._component.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/components/._component.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/components/._component.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/components/._component.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/components/._input_box.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/components/._input_box.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/components/._input_box.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/components/._input_box.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/components/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/components/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/components/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/components/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._chat_page b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._chat_page similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._chat_page rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._chat_page diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._connect_page b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._connect_page similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._connect_page rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._connect_page diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._chat_page.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._chat_page.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._chat_page.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._chat_page.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._components b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._components similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._components rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._components diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._section b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._section similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._section rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/._section diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._message_input_box.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._message_input_box.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._message_input_box.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._message_input_box.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._room_list.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._room_list.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._room_list.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/components/._room_list.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._usage.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._usage.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._usage.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/chat_page/section/._usage.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._connect_page.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._connect_page.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._connect_page.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._connect_page.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._mod.rs b/spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._mod.rs similarity index 100% rename from spring-2025/sen-109/00010/rust-chat-server/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._mod.rs rename to spring-2025/sen-109/00010/rust-chat-server-2/__MACOSX/rust-chat-server/tui/src/ui_management/pages/connect_page/._mod.rs diff --git a/spring-2025/sen-109/00010/rust-chat-server/.devcontainer/devcontainer.json b/spring-2025/sen-109/00010/rust-chat-server/.devcontainer/devcontainer.json new file mode 100644 index 0000000..f8fff10 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/rust +{ + "name": "Rust", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/rust:1-1-bullseye" + + // Use 'mounts' to make the cargo cache persistent in a Docker Volume. + // "mounts": [ + // { + // "source": "devcontainer-cargo-cache-${devcontainerId}", + // "target": "/usr/local/cargo", + // "type": "volume" + // } + // ] + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "rustc --version", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/.gitignore b/spring-2025/sen-109/00010/rust-chat-server/.gitignore new file mode 100644 index 0000000..ebd3c5a --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/.gitignore @@ -0,0 +1,98 @@ +# Created by https://www.toptal.com/developers/gitignore/api/rust,rust-analyzer,visualstudiocode,macos,vim +# Edit at https://www.toptal.com/developers/gitignore?templates=rust,rust-analyzer,visualstudiocode,macos,vim + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Rust ### +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +### rust-analyzer ### +# Can be generated by other build systems other than cargo (ex: bazelbuild/rust_rules) +rust-project.json + + +### Vim ### +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +*~ +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# End of https://www.toptal.com/developers/gitignore/api/rust,rust-analyzer,visualstudiocode,macos,vim diff --git a/spring-2025/sen-109/00010/rust-chat-server/.idea/.gitignore b/spring-2025/sen-109/00010/rust-chat-server/.idea/.gitignore new file mode 100644 index 0000000..1c2fda5 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/spring-2025/sen-109/00010/rust-chat-server/.idea/modules.xml b/spring-2025/sen-109/00010/rust-chat-server/.idea/modules.xml new file mode 100644 index 0000000..0fc65da --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/.idea/rust-chat-server.iml b/spring-2025/sen-109/00010/rust-chat-server/.idea/rust-chat-server.iml new file mode 100644 index 0000000..6da8f22 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/.idea/rust-chat-server.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/.idea/vcs.xml b/spring-2025/sen-109/00010/rust-chat-server/.idea/vcs.xml new file mode 100644 index 0000000..c8397c9 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/.vscode/settings.json b/spring-2025/sen-109/00010/rust-chat-server/.vscode/settings.json new file mode 100644 index 0000000..7fd1bb3 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "rust-analyzer.cargo.features": ["client", "server"] +} \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server/Cargo.toml new file mode 100644 index 0000000..b625b15 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/Cargo.toml @@ -0,0 +1,7 @@ +[workspace] +resolver = "2" +members = [ + "comms", + "tui", + "server", +] diff --git a/spring-2025/sen-109/00010/rust-chat-server/LICENSE b/spring-2025/sen-109/00010/rust-chat-server/LICENSE new file mode 100644 index 0000000..0518834 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Yiğitcan UÇUM + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/spring-2025/sen-109/00010/rust-chat-server/README.md b/spring-2025/sen-109/00010/rust-chat-server/README.md new file mode 100644 index 0000000..a15af58 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/README.md @@ -0,0 +1,29 @@ +# Rust Chat Server + +This project serves as a learning exercise in [Rust](https://www.rust-lang.org/), [Tokio](https://tokio.rs/), [Channels](https://tokio.rs/tokio/tutorial/channels), and TUI (Terminal User Interface) programming. It features a room-based chat server with a Terminal User Interface (TUI), utilizing technologies such as Tokio, Ratatui, and a Redux-inspired architecture. + +![TUI Demo](./tui/docs/tui.gif) + +**Note**: This project is not suitable for production use. It's designed strictly for educational purposes. + +## Setup Instructions + +To get the project up and running, follow these steps: + +1. Clone the repository: `git clone git@github.com:Yengas/rust-chat-server.git` +2. Make sure you have [Rust and Cargo](https://www.rust-lang.org/tools/install) installed. +3. Change to the project directory: `cd rust-chat-server` +4. Start the server: `cargo run --bin server` +5. Launch one or more TUI instances: `cargo run --bin tui` + +## Project Overview + +The project utilizes Rust Workspaces to divide itself into three subprojects, each with its own README that details the concepts and architecture. Below is a brief overview: + +- [comms](./comms/): This subproject houses a library crate that provides Events and Commands used for server-client communication. It also offers client/server socket utilities, enabled via feature flags, to assist in serializing and deserializing events and commands. +- [server](./server/): Built on the [Tokio Runtime](https://tokio.rs/) and using [Tokio Channels](https://tokio.rs/tokio/tutorial/channels), this subproject implements a single-instance chat server that manages room states and user participation. +- [tui](./tui/): Leveraging [Ratatui](https://github.com/ratatui-org/ratatui), this subproject implements a terminal-based user interface. Users can connect to a chat server, join rooms, and send/receive messages. The code follows a Redux-inspired structure to separate state management from TUI rendering. + +## License + +The project is distributed under the [MIT License](./LICENSE). diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/.gitignore b/spring-2025/sen-109/00010/rust-chat-server/comms/.gitignore new file mode 100644 index 0000000..9d08e3f --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server/comms/Cargo.toml new file mode 100644 index 0000000..09e5182 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "comms" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[features] +default = [] +client = ["serde_json", "tokio", "tokio-stream"] +server = ["serde_json", "tokio", "tokio-stream"] + +[dependencies] +anyhow = "1" +serde = { version = "1.0", features = ["derive"] } +serde_json = { version = "1.0", optional = true } +tokio = { version = "1.43.0", default-features = false, features = ["net"], optional = true } +tokio-stream = { version = "0.1.17", default-features = false, features = ["io-util"], optional = true } + +[dev-dependencies] +serde_json = "1.0" +tokio = { version = "1.43.0", features = ["full"] } +tokio-stream = { version = "0.1.17" } diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/README.md b/spring-2025/sen-109/00010/rust-chat-server/comms/README.md new file mode 100644 index 0000000..971a7b2 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/README.md @@ -0,0 +1,66 @@ +# Comms Library + +The `comms` library, short for "communications," serves as an auxiliary module for the [rust-chat-server](../) project. It provides definitions and utilities for handling events and commands. + +## Features + +- Definitions and documentation for [events](./src/event.rs) and [commands](./src/command.rs) utilized by the [rust-chat-server](../). +- TCP transport support for both **events** and **commands**. + - [`comms::transport::client`](./src/transport/client.rs) assists in splitting a [tokio::net::TcpStream](https://docs.rs/tokio/latest/tokio/net/struct.TcpStream.html) into an **EventStream** and a **CommandWriter**. + - [`comms::transport::server`](./src/transport/server.rs) enables the partitioning of a [tokio::net::TcpStream](https://docs.rs/tokio/latest/tokio/net/struct.TcpStream.html) into a **CommandStream** and an **EventWriter**. + +## Example Usage + +Execute the e2e test for client and server with the following command: `cargo test --features="client,server"` + +[This e2e test](./tests/e2e_server_and_client_transport.rs) spawns a server and a client. The server accepts one client, sends it an event, and listens for commands until the connection is closed. Conversely, the client receives one event, sends two commands, and then terminates its connection. + +Here's a simplified pseudocode version of the [e2e test code](./tests/e2e_server_and_client_transport.rs): + +```rust +// full e2e test code: src/tests/e2e_server_and_client_transport.rs + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + tokio::try_join!(server_example(), client_example())?; + // All examples succeed if this line is reached. + Ok(()) +} + +async fn server_example() -> anyhow::Result<()> { + let listener = /* Create a TcpListener */; + let tcp_stream = /* Accept a single client from `listener` */; + // Use comms::transport to elevate the TcpStream to a higher-level API. + let (mut command_stream, mut event_writer) = transport::server::split_tcp_stream(tcp_stream); + + event_writer.write(/* Login Successful Event */).await?; + + // Loop to read and print commands until the client closes the connection. + while let Some(result) = command_stream.next().await { + match result { + Ok(command) => println!("SERVER: Command received: {:?}", command), + Err(e) => println!("SERVER: Failed to read command: {}", e), + } + } + + Ok(()) +} + +async fn client_example() -> anyhow::Result<()> { + let tcp_stream = /* Connect to the server */; + // Use comms::transport to elevate the TcpStream to a higher-level API. + let (mut event_stream, mut command_writer) = transport::client::split_tcp_stream(tcp_stream); + + // Read and print a single event. + match event_stream.next().await { + Some(Ok(event)) => println!("CLIENT: Event received: {:?}", event), + Some(Err(e)) => println!("CLIENT: Failed to read event: {}", e), + None => return Err(anyhow::anyhow!("Server closed the connection")), + } + + command_writer.write(/* Join Room Command */).await?; + command_writer.write(/* Send Message Command */).await?; + + Ok(()) +} +``` \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/src/command.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/src/command.rs new file mode 100644 index 0000000..82542fd --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/src/command.rs @@ -0,0 +1,95 @@ +use serde::{Deserialize, Serialize}; + +/// User Command for joining a room. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct JoinRoomCommand { + // The room to join. + #[serde(rename = "r")] + pub room: String, +} + +/// User Command for leaving a room. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct LeaveRoomCommand { + // The room to leave. + #[serde(rename = "r")] + pub room: String, +} + +/// User Command for sending a message. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct SendMessageCommand { + // The room to send the message to. + #[serde(rename = "r")] + pub room: String, + // The content of the message. + #[serde(rename = "c")] + pub content: String, +} + +pub struct GetHistory { + +} + +/// User Command for quitting the whole chat session. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct QuitCommand; + +/// A user command which can be sent to the server by a single user session. +/// All commands are processed in the context of the chat server paired with an individual user session. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "_ct", rename_all = "snake_case")] +pub enum UserCommand { + JoinRoom(JoinRoomCommand), + LeaveRoom(LeaveRoomCommand), + SendMessage(SendMessageCommand), + Quit(QuitCommand), +} + +#[cfg(test)] +mod tests { + use super::*; + + // given a command enum, and an expect string, asserts that command is serialized / deserialized appropriately + fn assert_command_serialization(command: &UserCommand, expected: &str) { + let serialized = serde_json::to_string(&command).unwrap(); + assert_eq!(serialized, expected); + let deserialized: UserCommand = serde_json::from_str(&serialized).unwrap(); + assert_eq!(deserialized, *command); + } + + #[test] + fn test_join_command() { + let command = UserCommand::JoinRoom(JoinRoomCommand { + room: "test".to_string(), + }); + + assert_command_serialization(&command, r#"{"_ct":"join_room","r":"test"}"#); + } + + #[test] + fn test_leave_command() { + let command = UserCommand::LeaveRoom(LeaveRoomCommand { + room: "test".to_string(), + }); + + assert_command_serialization(&command, r#"{"_ct":"leave_room","r":"test"}"#); + } + + #[test] + fn test_message_command() { + let command = UserCommand::SendMessage(SendMessageCommand { + room: "test".to_string(), + content: "test".to_string(), + }); + + assert_command_serialization(&command, r#"{"_ct":"send_message","r":"test","c":"test"}"#); + } + + #[test] + fn test_quit_command() { + let command = UserCommand::Quit(QuitCommand); + + assert_command_serialization(&command, r#"{"_ct":"quit"}"#); + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/src/event.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/src/event.rs new file mode 100644 index 0000000..5e45c0b --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/src/event.rs @@ -0,0 +1,169 @@ +use serde::{Deserialize, Serialize}; + +/// The detail of a given room +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct RoomDetail { + /// The slug of the room + #[serde(rename = "n")] + pub name: String, + /// The description of the room + #[serde(rename = "d")] + pub description: String, +} + +/// A user has successfully logged in +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct LoginSuccessfulReplyEvent { + /// The session id for the connection + #[serde(rename = "s")] + pub session_id: String, + /// The id of the user that has logged in + #[serde(rename = "u")] + pub user_id: String, + /// The list of rooms the user can participate, unique and ordered + #[serde(rename = "rs")] + pub rooms: Vec, +} + +/// Users new room participation status +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum RoomParticipationStatus { + Joined, + Left, +} + +/// A user has joined or left a room +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct RoomParticipationBroadcastEvent { + /// The slug of the room the user has joined or left + #[serde(rename = "r")] + pub room: String, + /// The id of the user that has joined or left + #[serde(rename = "u")] + pub user_id: String, + /// The new status of the user in the room + #[serde(rename = "s")] + pub status: RoomParticipationStatus, +} + +/// A reply to the user when they have joined a room +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct UserJoinedRoomReplyEvent { + /// The slug of the room the user has joined + #[serde(rename = "r")] + pub room: String, + /// The users currently in the room, unique and ordered + #[serde(rename = "us")] + pub users: Vec, +} + +/// A user has sent a message to a room +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct UserMessageBroadcastEvent { + /// The slug of the room the user has sent the message to + #[serde(rename = "r")] + pub room: String, + /// The id of the user that has sent the message + #[serde(rename = "u")] + pub user_id: String, + /// The content of the message + #[serde(rename = "c")] + pub content: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "_et", rename_all = "snake_case")] +/// Events that can be sent to the client +/// Events maybe related to different users and rooms, the recipient is a single chat session +pub enum Event { + LoginSuccessful(LoginSuccessfulReplyEvent), + RoomParticipation(RoomParticipationBroadcastEvent), + UserJoinedRoom(UserJoinedRoomReplyEvent), + UserMessage(UserMessageBroadcastEvent), +} + +#[cfg(test)] +mod tests { + use super::*; + + // given an event enum, and an expect string, asserts that event is serialized / deserialized appropriately + fn assert_event_serialization(event: &Event, expected: &str) { + let serialized = serde_json::to_string(&event).unwrap(); + assert_eq!(serialized, expected); + let deserialized: Event = serde_json::from_str(&serialized).unwrap(); + assert_eq!(deserialized, *event); + } + + #[test] + fn test_login_successful_event() { + let event = Event::LoginSuccessful(LoginSuccessfulReplyEvent { + session_id: "session-id-1".to_string(), + user_id: "user-id-1".to_string(), + rooms: vec![RoomDetail { + name: "room-1".to_string(), + description: "some description".to_string(), + }], + }); + + assert_event_serialization( + &event, + r#"{"_et":"login_successful","s":"session-id-1","u":"user-id-1","rs":[{"n":"room-1","d":"some description"}]}"#, + ); + } + + #[test] + fn test_room_participation_join_event() { + let event = Event::RoomParticipation(RoomParticipationBroadcastEvent { + room: "test".to_string(), + user_id: "test".to_string(), + status: RoomParticipationStatus::Joined, + }); + + assert_event_serialization( + &event, + r#"{"_et":"room_participation","r":"test","u":"test","s":"joined"}"#, + ); + } + + #[test] + fn test_room_participation_leave_event() { + let event = Event::RoomParticipation(RoomParticipationBroadcastEvent { + room: "test".to_string(), + user_id: "test".to_string(), + status: RoomParticipationStatus::Left, + }); + + assert_event_serialization( + &event, + r#"{"_et":"room_participation","r":"test","u":"test","s":"left"}"#, + ); + } + + #[test] + fn test_user_joined_room_event() { + let event = Event::UserJoinedRoom(UserJoinedRoomReplyEvent { + room: "test".to_string(), + users: vec!["test".to_string()], + }); + + assert_event_serialization( + &event, + r#"{"_et":"user_joined_room","r":"test","us":["test"]}"#, + ); + } + + #[test] + fn test_user_message_event() { + let event = Event::UserMessage(UserMessageBroadcastEvent { + room: "test".to_string(), + user_id: "test".to_string(), + content: "test".to_string(), + }); + + assert_event_serialization( + &event, + r#"{"_et":"user_message","r":"test","u":"test","c":"test"}"#, + ); + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/src/lib.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/src/lib.rs new file mode 100644 index 0000000..8e11d06 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/src/lib.rs @@ -0,0 +1,7 @@ +/// Set of commands which the server can receive and process +pub mod command; +/// Set of events split into Broadcast and Reply events according to their source +pub mod event; +/// Implementation of event and command transportation over TCP Streams. +/// Requires 'server' or 'client' features to be enabled and will bring in tokio dependency alongside with other dependencies +pub mod transport; diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/client.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/client.rs new file mode 100644 index 0000000..193a7b9 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/client.rs @@ -0,0 +1,69 @@ +use anyhow::Context; +use tokio::{ + io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, + net::{tcp::OwnedWriteHalf, TcpStream}, +}; +use tokio_stream::{wrappers::LinesStream, StreamExt}; + +use crate::{command, event}; + +use super::common::{BoxedStream, NEW_LINE}; + +/// [EventStream] is a stream of [event::Event]s sent by the server +/// +/// # Cancel Safety +/// +/// This stream is cancel-safe, meaning that it can be used in [tokio::select] +/// without the risk of missing events. +pub type EventStream = BoxedStream>; + +/// [CommandWriter] is a wrapper around a [TcpStream] which writes [command::UserCommand]s to the server +pub struct CommandWriter { + writer: OwnedWriteHalf, +} + +impl CommandWriter { + pub fn new(writer: OwnedWriteHalf) -> Self { + Self { writer } + } + + /// Send a [command::UserCommand] to the backing [TcpStream] + /// + /// # Cancel Safety + /// + /// This method is not cancellation safe. If it is used as the event + /// in a [tokio::select!] statement and some other + /// branch completes first, then the provided [command::UserCommand] may have been + /// partially written, but future calls to `write` will start over + /// from the beginning of the buffer. Causing undefined behaviour. + pub async fn write(&mut self, command: &command::UserCommand) -> anyhow::Result<()> { + let mut serialized_bytes = serde_json::to_vec(command)?; + serialized_bytes.extend_from_slice(NEW_LINE); + + self.writer.write_all(serialized_bytes.as_slice()).await?; + + Ok(()) + } +} + +/// Splits a TCP stream into a stream of events and a command writer. +/// +/// # Arguments +/// +/// - `stream` - A [TcpStream] to split +pub fn split_tcp_stream(stream: TcpStream) -> (EventStream, CommandWriter) { + let (reader, writer) = stream.into_split(); + + ( + Box::pin( + LinesStream::new(BufReader::new(reader).lines()).map(|line| { + line.context("could not read line from the server") + .and_then(|line| { + serde_json::from_str::(&line) + .context("failed to deserialize event from the server") + }) + }), + ), + CommandWriter::new(writer), + ) +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/common.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/common.rs new file mode 100644 index 0000000..4168d97 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/common.rs @@ -0,0 +1,7 @@ +use std::pin::Pin; + +use tokio_stream::Stream; + +pub const NEW_LINE: &[u8; 2] = b"\r\n"; + +pub type BoxedStream = Pin + Send>>; diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/mod.rs new file mode 100644 index 0000000..531fdec --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/mod.rs @@ -0,0 +1,8 @@ +/// Transport over TCP implementation for a client to be able to interact with the server +#[cfg(feature = "client")] +pub mod client; +#[cfg(any(feature = "client", feature = "server"))] +mod common; +/// Transport over TCP implementation for a server to interact with a single client TCP Stream +#[cfg(feature = "server")] +pub mod server; diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/server.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/server.rs new file mode 100644 index 0000000..b8d3c64 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/src/transport/server.rs @@ -0,0 +1,69 @@ +use anyhow::Context; +use tokio::{ + io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, + net::{tcp::OwnedWriteHalf, TcpStream}, +}; +use tokio_stream::{wrappers::LinesStream, StreamExt}; + +use crate::{command, event}; + +use super::common::{BoxedStream, NEW_LINE}; + +/// [CommandStream] is a stream of [command::UserCommand]s sent by the client +/// +/// # Cancel Safety +/// +/// This stream is cancel-safe, meaning that it can be used in [tokio::select!] +/// without the risk of missing commands. +pub type CommandStream = BoxedStream>; + +/// [EventWriter] is a wrapper around a [TcpStream] which writes [event::Event]s to the client +pub struct EventWriter { + writer: OwnedWriteHalf, +} + +impl EventWriter { + pub fn new(writer: OwnedWriteHalf) -> Self { + Self { writer } + } + + /// Send a [event::Event] to the backing [TcpStream] + /// + /// # Cancel Safety + /// + /// This method is not cancellation safe. If it is used as the event + /// in a [tokio::select!] statement and some other + /// branch completes first, then the provided [event::Event] may have been + /// partially written, but future calls to `write` will start over + /// from the beginning of the buffer. Causing undefined behaviour. + pub async fn write(&mut self, event: &event::Event) -> anyhow::Result<()> { + let mut serialized_bytes = serde_json::to_vec(event)?; + serialized_bytes.extend_from_slice(NEW_LINE); + + self.writer.write_all(serialized_bytes.as_slice()).await?; + + Ok(()) + } +} + +/// Splits a TCP stream into a stream of commands and an event writer. +/// +/// # Arguments +/// +/// - `stream` - A [TcpStream] to split +pub fn split_tcp_stream(stream: TcpStream) -> (CommandStream, EventWriter) { + let (reader, writer) = stream.into_split(); + + ( + Box::pin( + LinesStream::new(BufReader::new(reader).lines()).map(|line| { + line.context("could not read line from the client") + .and_then(|line| { + serde_json::from_str::(&line) + .context("failed to deserialize command from client") + }) + }), + ), + EventWriter::new(writer), + ) +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/comms/tests/e2e_server_and_client_transport.rs b/spring-2025/sen-109/00010/rust-chat-server/comms/tests/e2e_server_and_client_transport.rs new file mode 100644 index 0000000..f47c957 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/comms/tests/e2e_server_and_client_transport.rs @@ -0,0 +1,120 @@ +use comms::{ + command::{self, UserCommand}, + event::{self, Event}, + transport, +}; +use tokio::net::{TcpListener, TcpStream}; +use tokio_stream::StreamExt; + +const PORT: usize = 8081; + +#[tokio::test] +async fn assert_server_client_transport() { + let (server_collected_commands, client_collected_events) = + tokio::join!(execute_server(), execute_client()); + + assert!(server_collected_commands.is_ok()); + assert!(client_collected_events.is_ok()); + + assert_eq!( + server_collected_commands.unwrap(), + vec![ + UserCommand::JoinRoom(command::JoinRoomCommand { + room: "room-1".into(), + }), + UserCommand::SendMessage(command::SendMessageCommand { + room: "room-1".into(), + content: "content-1".into(), + }), + ] + ); + + assert_eq!( + client_collected_events.unwrap(), + vec![Event::LoginSuccessful(event::LoginSuccessfulReplyEvent { + user_id: "user-id-1".into(), + session_id: "session-id-1".into(), + rooms: Vec::default(), + }),] + ); +} + +async fn execute_server() -> anyhow::Result> { + // bind to the example port to wait for client connection + let listener = TcpListener::bind(format!("0.0.0.0:{}", PORT)) + .await + .expect("could not bind to the port"); + + // accept the only client connection we will have + let tcp_stream = match listener.accept().await { + Ok((tcp_stream, _addr)) => tcp_stream, + Err(e) => return Err(anyhow::anyhow!("failed to accept client: {}", e)), + }; + + // break the client connection into higher level API for ease of use + let (mut command_stream, mut event_writer) = transport::server::split_tcp_stream(tcp_stream); + // store commands received from the client + let mut collected_commands = Vec::new(); + + // welcome the user with some login successful reply event + event_writer + .write(&Event::LoginSuccessful(event::LoginSuccessfulReplyEvent { + user_id: "user-id-1".into(), + session_id: "session-id-1".into(), + rooms: Vec::default(), + })) + .await?; + + // listen for commands from the client until the connection is closed + while let Some(result) = command_stream.next().await { + match result { + // client has sent a valid command which we could read and parse + Ok(command) => collected_commands.push(command), + // client has sent a command which we could not read or parse + // could be a bug in the client, malicious client, breaking api changes etc. + Err(e) => return Err(anyhow::anyhow!("failed to read command: {}", e)), + } + } + + Ok(collected_commands) +} + +async fn execute_client() -> anyhow::Result> { + // create a client connection to the server + let tcp_stream = match TcpStream::connect(format!("localhost:{}", PORT)).await { + Ok(tcp_stream) => tcp_stream, + Err(e) => return Err(anyhow::anyhow!("failed to connect to server: {}", e)), + }; + + // break the server connection into higher level API for ease of use + let (mut event_stream, mut command_writer) = transport::client::split_tcp_stream(tcp_stream); + // store events received from the server + let mut collected_events = Vec::new(); + + // read the welcome event from the server + match event_stream.next().await { + // server has sent a valid event which we could read and parse + Some(Ok(event)) => collected_events.push(event), + // server has sent an event which we could not read or parse + // could be a bug in the server, malicious server, breaking api changes etc. + Some(Err(e)) => return Err(anyhow::anyhow!("could not parse event: {}", e)), + // server has closed the connection, return an error + None => return Err(anyhow::anyhow!("server closed the connection")), + } + + // send some commands to the server + command_writer + .write(&UserCommand::JoinRoom(command::JoinRoomCommand { + room: "room-1".into(), + })) + .await?; + + command_writer + .write(&UserCommand::SendMessage(command::SendMessageCommand { + room: "room-1".into(), + content: "content-1".into(), + })) + .await?; + + Ok(collected_events) +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/rust-chat-server b/spring-2025/sen-109/00010/rust-chat-server/rust-chat-server deleted file mode 160000 index 12b8850..0000000 --- a/spring-2025/sen-109/00010/rust-chat-server/rust-chat-server +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 12b88508ce69530bdebfef69d641e222842e93b1 diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/.gitignore b/spring-2025/sen-109/00010/rust-chat-server/server/.gitignore new file mode 100644 index 0000000..0b42d2d --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/.gitignore @@ -0,0 +1 @@ +/target diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server/server/Cargo.toml new file mode 100644 index 0000000..98c09ba --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "server" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.75" +comms = { path = "../comms", features = ["server"] } +nanoid = "0.4.0" +serde = "1.0" +serde_json = "1.0" +tokio = { version = "1.43.0", features = ["full"] } +tokio-stream = { version = "0.1.17" } + +[dev-dependencies] +comms = { path = "../comms", features = ["client"] } +rand = "0.8.5" diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/README.md b/spring-2025/sen-109/00010/rust-chat-server/server/README.md new file mode 100644 index 0000000..7417a9a --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/README.md @@ -0,0 +1,61 @@ +# Rust Chat Server - Server Binary + +The `server` binary is the backbone of the [rust-chat-server](../). It establishes a TCP server, listening for events and commands through our [comms library](../comms). + +--- + +## 🛠 Technical Overview + +- **Async I/O**: Utilizes [Tokio Runtime](https://tokio.rs/) and [Tokio Streams](https://tokio.rs/tokio/tutorial/streams) for asynchronous, non-blocking I/O. +- **Actor-like Model**: Uses [Tokio Channels](https://tokio.rs/tokio/tutorial/channels) for an actor-inspired, lightweight architecture. +- **Chat Rooms**: File-based (JSON) chat room definitions in the [resources/](./resources/chat_rooms_metadata.json) folder. + +## 🏗 High-Level Architecture + +![High Level Architecture Diagram](./docs/high-level-architecture.svg) + +1. **Bootstrap**: Reads from [resources/](./resources/chat_rooms_metadata.json) to initialize chat rooms. +2. **Server Start**: Handles a variable number of concurrent users. For a terminal-based client, see the [tui project](../tui/). + - **Commands**: Join, leave rooms or send room-specific messages. +3. **ChatSession**: Manages individual user commands and room subscriptions. + - Joins rooms via interaction with `RoomManager`, receiving a `broadcast::Receiver` and a `UserSessionHandle`. + - On room exit, `UserSessionHandle` is returned to `RoomManager`. +4. **Messaging**: Maintains an in-memory list of `UserSessionHandle`s for room messaging. + - Tasks are created to unify messages from different rooms into a single `mpsc::Receiver`. +5. **User Output**: Unified events are sent to the user through the TCP socket. + +## 🚀 Getting Started + +Run the server with `cargo run` or `cargo run --bin server` according to your working directory. Defaults to port `:8080`. Any bootstrap issues will result in an application exiting with error. + +## 🧪 Stress Testing + +- **Example**: Check [stress_test](./examples/stress_test.rs) in the examples directory. +- 🚨 **Socket Limits**: Ensure both server and stress test socket limits are configured for high user volumes. + +Run the stress test with `cargo run --example stress_test`. + +### 📈 Stress Test Outcomes + +> 🚫 No rigorous load testing was conducted, but several preliminary tests were done. + +Using a $4/month [DigitalOcean](https://www.digitalocean.com/pricing/droplets) Droplet, a test was run with 48 users (2 per room), each sending 200 messages per second. This resulted in **576k RPM Write** and **1.152M RPM Read**. + +CPU reached 100% utilization without any significant lag or memory impact. When the load was reduced by 50%, CPU utilization decreased to 56-60%. With higher loads, there were delivery lags. + +On an Apple Silicone M2 Pro, the system could easily handle 10k concurrent users with a lower message rate. + +## 📈 Scaling Further + +The server is currently optimized for vertical scaling by making full use of multiple cores. However, it can only scale so far within a single instance, bound by the hardware or code optimization limits. + +To truly scale horizontally, several strategies can be employed: + +1. **Sharding Rooms**: Distribute chat rooms among multiple server instances, directing users to the correct instance based on their room selection. +2. **Fan-Out Queue**: Incorporate a fan-out message queue architecture where each server instance consumes and broadcasts messages to its connected users. + +Your choice will depend on specific requirements: + +- **Limited Users, Multiple Rooms**: Option #1 is ideal for a Discord-like architecture with multiple rooms but limited users per server (e.g., up to 1,000). +- **Global Rooms, High Concurrency**: For a setup where room lists are global and user counts are high, option #2 offers better scalability. +- **High Volume, Hybrid Approach**: If you expect both high user counts and multiple servers, a hybrid approach of options #1 and #2 would provide the greatest scalability. diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.plantuml b/spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.plantuml new file mode 100644 index 0000000..f4f9c27 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.plantuml @@ -0,0 +1,39 @@ +@startuml High Level Architecture - Diagram + +skinparam linetype orthogonally +skinparam orthogonalSpace 30 + +together { + entity "Bootstrap" as bootstrap <> + actor User as user +} + +together { + package "Room Manager" as rm_p { + package "Room" { + component "Chat Room" as chat_room + } + + component "Room Manager" as room_manager + } + + package "Session" as s_p { + component "Chat Session" as chat_session + } +} + +bootstrap -[hidden]d-> user +bootstrap -[hidden]r-> rm_p +user -[hidden]r-> s_p +rm_p -[hidden]d-> s_p + +bootstrap -> rm_p: 1. Setup Each Room and\nRoom Manager Globally +user -> s_p: 2. Connect to Server\nand send Commands + +chat_session -u-> room_manager: 3. Join/Leave Rooms per User Request,\n store and manage the **UserSessionHandle**\n returned for each room +room_manager -> chat_room: 3.1. Join/Leave Room utilizing\n the **UserSessionHandle** +chat_session -> chat_session: 4. Handle Message Sending and\nCreate Unified Event Stream\nof dynamic number of joined rooms + +user <- s_p: 5. Send Events + +@enduml \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.svg b/spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.svg new file mode 100644 index 0000000..1214b49 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/docs/high-level-architecture.svg @@ -0,0 +1,67 @@ +Room ManagerRoomSessionBootstrap«Bootstrap»UserRoom ManagerChat RoomChat Session1. Setup Each Room andRoom Manager Globally2. Connect to Serverand send Commands5. Send Events3. Join/Leave Rooms per User Request,store and manage theUserSessionHandlereturned for each room3.1. Join/Leave Room utilizingtheUserSessionHandle4. Handle Message Sending andCreate Unified Event Streamof dynamic number of joined rooms \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/examples/stress_test.rs b/spring-2025/sen-109/00010/rust-chat-server/server/examples/stress_test.rs new file mode 100644 index 0000000..289f1f5 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/examples/stress_test.rs @@ -0,0 +1,168 @@ +use std::time::Duration; + +use comms::{ + command::{JoinRoomCommand, UserCommand}, + event::Event, + transport, +}; +use nanoid::nanoid; +use rand::{rngs::StdRng, Rng, SeedableRng}; +use serde::{Deserialize, Serialize}; +use tokio::{net::TcpStream, task::JoinSet}; +use tokio_stream::StreamExt; + +/// Stress Test for the Chat Server +/// +/// Generates synthetic load with users who joins and sends messages to random roms. +/// The number of users, number of rooms joined per user and chatting of users can be configured. +/// +/// !IMPORTANT! Be sure to check and configure your socket limits, before you run the tests + +const SERVER_ADDR: &str = "localhost:8080"; +const CHAT_ROOMS_METADATA: &str = include_str!("../resources/chat_rooms_metadata.json"); + +/// Stress Test Configuration +// The number of users to spawn, distributed across the load increments +const LOAD_INCREMENTS: &str = r#"[ + { "user_count": 1200, "after": { "secs": 60, "nanos": 0 }, "steps": 60 }, + { "user_count": 2400, "after": { "secs": 120, "nanos": 0 }, "steps": 60 } +]"#; +// How many rooms a user should join, this affects the total tokio task count +const NUMBER_OF_ROOMS_TO_JOIN: usize = 5; +// How many milliseconds to wait between each user message +const USER_CHAT_DELAY_MILLIS: u64 = 10_000; + +/// [RotatingIterator] is a simple iterator that rotates through a list of items +/// and starts from the beginning when the end is reached. +struct RotatingIterator { + items: Vec, + current: usize, +} + +impl RotatingIterator { + fn new(items: Vec) -> Self { + Self { items, current: 0 } + } +} + +impl Iterator for RotatingIterator { + type Item = T; + + fn next(&mut self) -> Option { + let item = self.items.get(self.current).cloned(); + self.current = (self.current + 1) % self.items.len(); + item + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ChatRoomMetadata { + name: String, + description: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct LoadIncrements { + user_count: usize, + after: Duration, + steps: usize, +} + +async fn spawn_single_user(rooms_to_join: Vec) -> anyhow::Result<()> { + let result = spawn_single_user_raw(rooms_to_join).await; + + match result.as_ref() { + Ok(_) => println!("exited without problems"), + Err(err) => println!("some error occurred = {}", err.to_string()), + } + + result +} + +async fn spawn_single_user_raw(rooms_to_join: Vec) -> anyhow::Result<()> { + let tcp_stream = TcpStream::connect(SERVER_ADDR).await?; + let (mut event_stream, mut command_writer) = transport::client::split_tcp_stream(tcp_stream); + + let _login_event = match event_stream.next().await { + Some(Ok(Event::LoginSuccessful(login_event))) => login_event, + _ => return Err(anyhow::anyhow!("server did not send login successful")), + }; + + for room_name in rooms_to_join.iter() { + command_writer + .write(&UserCommand::JoinRoom(JoinRoomCommand { + room: String::from(room_name), + })) + .await?; + } + + let join_handle = tokio::spawn({ + let mut rng = StdRng::from_entropy(); + let mut rooms_iterator = RotatingIterator::new(rooms_to_join); + let to_sleep = Duration::from_millis(USER_CHAT_DELAY_MILLIS); + + async move { + // sleep initially for a time to distribute the messaging times + tokio::time::sleep(Duration::from_millis( + rng.gen_range(1..USER_CHAT_DELAY_MILLIS), + )) + .await; + + loop { + let room_name = rooms_iterator.next().unwrap(); + let _ = command_writer + .write(&UserCommand::SendMessage( + comms::command::SendMessageCommand { + room: String::from(room_name), + content: nanoid!(), + }, + )) + .await; + + tokio::time::sleep(to_sleep).await; + } + } + }); + + while let Some(_) = event_stream.next().await {} + + join_handle.abort(); + Ok(()) +} + +#[tokio::main] +async fn main() { + let load_increments: Vec = + serde_json::from_str(LOAD_INCREMENTS).expect("could not parse the load increments"); + let chat_room_metadata: Vec = serde_json::from_str(CHAT_ROOMS_METADATA) + .expect("could not parse the chat rooms metadata"); + + let mut room_iterator = RotatingIterator::new(chat_room_metadata); + let mut join_set: JoinSet> = JoinSet::new(); + + let mut current: usize = 0; + for li in load_increments { + let diff = li.user_count - current; + let sleep_duration = + Duration::from_millis((li.after.as_millis() / li.steps as u128) as u64); + let to_increment = diff / li.steps; + + for _ in 0..li.steps { + for _ in 0..to_increment { + let rooms_to_join = room_iterator + .by_ref() + .take(NUMBER_OF_ROOMS_TO_JOIN) + .map(|metadata| metadata.name.clone()) + .collect(); + + join_set.spawn(spawn_single_user(rooms_to_join)); + } + + current += to_increment; + println!("total users: {}", current); + tokio::time::sleep(sleep_duration).await; + } + } + + while let Some(_) = join_set.join_next().await {} +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/resources/chat_rooms_metadata.json b/spring-2025/sen-109/00010/rust-chat-server/server/resources/chat_rooms_metadata.json new file mode 100644 index 0000000..2163e9b --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/resources/chat_rooms_metadata.json @@ -0,0 +1,98 @@ +[ + { + "name": "general", + "description": "General discussions and community bonding" + }, + { + "name": "rust", + "description": "Talk about the Rust programming language" + }, + { + "name": "web-dev", + "description": "All about web development" + }, + { + "name": "ml", + "description": "Machine learning algorithms and research" + }, + { + "name": "tech-news", + "description": "Latest tech news and opinions" + }, + { + "name": "gaming", + "description": "Discuss games and gaming hardware" + }, + { + "name": "open-src", + "description": "Open source collaboration and projects" + }, + { + "name": "blockchain", + "description": "Blockchain and cryptocurrencies" + }, + { + "name": "startups", + "description": "Startup ideas and entrepreneurship" + }, + { + "name": "design", + "description": "Design principles and user experience" + }, + { + "name": "cloud-devops", + "description": "Cloud computing and DevOps practices" + }, + { + "name": "security", + "description": "Cybersecurity and ethical hacking" + }, + { + "name": "freelance", + "description": "Freelancing experiences and networking" + }, + { + "name": "hardware", + "description": "Hardware development and IoT" + }, + { + "name": "ai", + "description": "Discuss artificial intelligence topics" + }, + { + "name": "mobile-dev", + "description": "Mobile app development and tools" + }, + { + "name": "data-sci", + "description": "Data science techniques and tools" + }, + { + "name": "networking", + "description": "Networking protocols and technologies" + }, + { + "name": "os-dev", + "description": "Operating system development and kernel hacking" + }, + { + "name": "databases", + "description": "Database management and SQL" + }, + { + "name": "frontend", + "description": "Frontend development and frameworks" + }, + { + "name": "robotics", + "description": "Robotics engineering and automation" + }, + { + "name": "academia", + "description": "Research, papers, and academic discussions" + }, + { + "name": "career-advice", + "description": "Career growth and job-hunting tips" + } +] \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/main.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/main.rs new file mode 100644 index 0000000..3d71ea4 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/main.rs @@ -0,0 +1,50 @@ +use std::sync::Arc; + +use anyhow::Context; +use room_manager::RoomManagerBuilder; +use tokio::{net::TcpListener, signal::ctrl_c, sync::broadcast, task::JoinSet}; + +use crate::room_manager::ChatRoomMetadata; + +mod room_manager; +mod session; + +const PORT: u16 = 8080; +const CHAT_ROOMS_METADATA: &str = include_str!("../resources/chat_rooms_metadata.json"); + +#[tokio::main] +async fn main() { + let chat_room_metadata: Vec = serde_json::from_str(CHAT_ROOMS_METADATA) + .expect("could not parse the chat rooms metadatas"); + let room_manager = Arc::new( + chat_room_metadata + .into_iter() + .fold(RoomManagerBuilder::new(), |builder, metadata| { + builder.create_room(metadata) + }) + .build(), + ); + + let mut join_set: JoinSet> = JoinSet::new(); + let server = TcpListener::bind(format!("0.0.0.0:{}", PORT)) + .await + .expect("could not bind to the port"); + let (quit_tx, quit_rx) = broadcast::channel::<()>(1); + + println!("Listening on port {}", PORT); + loop { + tokio::select! { + Ok(_) = ctrl_c() => { + println!("Server interrupted. Gracefully shutting down."); + quit_tx.send(()).context("failed to send quit signal").unwrap(); + break; + } + Ok((socket, _)) = server.accept() => { + join_set.spawn(session::handle_user_session(Arc::clone(&room_manager), quit_rx.resubscribe(), socket)); + } + } + } + + while join_set.join_next().await.is_some() {} + println!("Server shut down"); +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/mod.rs new file mode 100644 index 0000000..c058c79 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/mod.rs @@ -0,0 +1,47 @@ +use std::sync::Arc; + +use tokio::sync::Mutex; + +use self::room::ChatRoom; +pub use self::room::{ChatRoomMetadata, SessionAndUserId, UserSessionHandle}; + +pub use self::room_manager::RoomManager; + +mod room; +#[allow(clippy::module_inception)] +mod room_manager; + +#[derive(Debug)] +pub struct RoomManagerBuilder { + chat_rooms: Vec<(ChatRoomMetadata, Arc>)>, +} + +impl RoomManagerBuilder { + pub fn new() -> Self { + RoomManagerBuilder { + chat_rooms: Vec::new(), + } + } + + /// Add a room to the room manager + /// Will panic if a room with the same name already exists + pub fn create_room(mut self, metadata: ChatRoomMetadata) -> Self { + let chat_room = Arc::new(Mutex::new(ChatRoom::new(metadata.clone()))); + + if self + .chat_rooms + .iter() + .any(|(m, _)| m.name.eq(&metadata.name)) + { + panic!("room with the same name already exists"); + } + + self.chat_rooms.push((metadata, chat_room)); + + self + } + + pub fn build(self) -> RoomManager { + RoomManager::new(self.chat_rooms) + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/chat_room.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/chat_room.rs new file mode 100644 index 0000000..1921bcf --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/chat_room.rs @@ -0,0 +1,88 @@ +use comms::event::{self, Event}; +use serde::{Deserialize, Serialize}; +use tokio::sync::broadcast; + +use super::{ + user_registry::UserRegistry, user_session_handle::UserSessionHandle, SessionAndUserId, +}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +/// [ChatRoomMetadata] holds the metadata that identifies a chat room +pub struct ChatRoomMetadata { + pub name: String, + pub description: String, +} + +const BROADCAST_CHANNEL_CAPACITY: usize = 100; + +#[derive(Debug)] +/// [ChatRoom] handles the participants of a chat room and the primary broadcast channel +/// A [UserSessionHandle] is handed out to a user when they join the room +pub struct ChatRoom { + metadata: ChatRoomMetadata, + broadcast_tx: broadcast::Sender, + user_registry: UserRegistry, +} + +impl ChatRoom { + pub fn new(metadata: ChatRoomMetadata) -> Self { + let (broadcast_tx, _) = broadcast::channel(BROADCAST_CHANNEL_CAPACITY); + + ChatRoom { + metadata, + broadcast_tx, + user_registry: UserRegistry::new(), + } + } + + pub fn get_unique_user_ids(&self) -> Vec { + self.user_registry.get_unique_user_ids() + } + + /// Add a participant to the room and broadcast that they joined + /// + /// # Returns + /// + /// - A broadcast receiver for the user to receive messages from the room + /// - A [UserSessionHandle] for the user to be able to interact with the room + pub fn join( + &mut self, + session_and_user_id: &SessionAndUserId, + ) -> (broadcast::Receiver, UserSessionHandle) { + let broadcast_tx = self.broadcast_tx.clone(); + let broadcast_rx = broadcast_tx.subscribe(); + let user_session_handle = UserSessionHandle::new( + self.metadata.name.clone(), + broadcast_tx, + session_and_user_id.clone(), + ); + + // If the user is new e.g. they do not have another session with same user id, + // broadcast that they joined to all users + if self.user_registry.insert(&user_session_handle) { + let _ = self.broadcast_tx.send(Event::RoomParticipation( + event::RoomParticipationBroadcastEvent { + user_id: session_and_user_id.user_id.clone(), + room: self.metadata.name.clone(), + status: event::RoomParticipationStatus::Joined, + }, + )); + } + + (broadcast_rx, user_session_handle) + } + + /// Remove a participant from the room and broadcast that they left + /// Consume the [UserSessionHandle] to drop it + pub fn leave(&mut self, user_session_handle: UserSessionHandle) { + if self.user_registry.remove(&user_session_handle) { + let _ = self.broadcast_tx.send(Event::RoomParticipation( + event::RoomParticipationBroadcastEvent { + user_id: String::from(user_session_handle.user_id()), + room: self.metadata.name.clone(), + status: event::RoomParticipationStatus::Left, + }, + )); + } + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/mod.rs new file mode 100644 index 0000000..a9455a5 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/mod.rs @@ -0,0 +1,6 @@ +mod chat_room; +mod user_registry; +mod user_session_handle; + +pub use self::chat_room::{ChatRoom, ChatRoomMetadata}; +pub use self::user_session_handle::{SessionAndUserId, UserSessionHandle}; diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_registry.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_registry.rs new file mode 100644 index 0000000..586732a --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_registry.rs @@ -0,0 +1,70 @@ +use std::collections::{HashMap, HashSet}; + +use super::user_session_handle::UserSessionHandle; + +#[derive(Debug)] +pub struct UserRegistry { + user_id_to_sessions: HashMap>, + user_ids: HashSet, +} + +/// [UserRegistry] is a smart container for keeping track of which unique list of users are in a room +/// +/// Since a user can have multiple sessions, we need to keep track of which sessions belong to which users +impl UserRegistry { + pub fn new() -> Self { + UserRegistry { + user_id_to_sessions: HashMap::new(), + user_ids: HashSet::new(), + } + } + + /// Add a user to the room, returns true if the user is a new user + pub fn insert(&mut self, user_session_handle: &UserSessionHandle) -> bool { + let user_id = String::from(user_session_handle.user_id()); + let session_id = String::from(user_session_handle.session_id()); + + let sessions = self + .user_id_to_sessions + .entry(user_id.clone()) + .or_insert_with(HashSet::new); + + sessions.insert(session_id); + + let is_new_user = sessions.len() == 1; + + if is_new_user { + self.user_ids.insert(user_id); + } + + is_new_user + } + + /// Removes a given session from the participant list, returns true if the user is no longer in the room + /// Does nothing and returns false if the user does not exist + pub fn remove(&mut self, user_session_handle: &UserSessionHandle) -> bool { + let user_id = String::from(user_session_handle.user_id()); + let session_id = String::from(user_session_handle.session_id()); + + let to_remove = self.user_id_to_sessions.get_mut(&user_id); + + if let Some(sessions) = to_remove { + sessions.remove(&session_id); + + if sessions.is_empty() { + self.user_id_to_sessions.remove(&user_id); + self.user_ids.remove(&user_id); + + true + } else { + false + } + } else { + false + } + } + + pub fn get_unique_user_ids(&self) -> Vec { + self.user_ids.iter().cloned().collect() + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_session_handle.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_session_handle.rs new file mode 100644 index 0000000..4ddb0cb --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room/user_session_handle.rs @@ -0,0 +1,64 @@ +use anyhow::Context; +use comms::event; +use tokio::sync::broadcast; + +#[derive(Debug, Clone)] +pub struct SessionAndUserId { + pub session_id: String, + pub user_id: String, +} + +#[derive(Debug)] +/// [UserSessionHandle] is a handle that allows a specific user/session pair to +/// send messages to a specific room. +/// +/// It is created when a user joins a room and is handed out to the user. +pub struct UserSessionHandle { + /// The name of the room which is associated with this handle + room: String, + /// The channel to use for sending events to the all users of the room + broadcast_tx: broadcast::Sender, + /// The session and user id associated with this handle + session_and_user_id: SessionAndUserId, +} + +impl UserSessionHandle { + pub(super) fn new( + room: String, + broadcast_tx: broadcast::Sender, + session_and_user_id: SessionAndUserId, + ) -> Self { + UserSessionHandle { + room, + broadcast_tx, + session_and_user_id, + } + } + + pub fn room(&self) -> &str { + &self.room + } + + pub fn session_id(&self) -> &str { + &self.session_and_user_id.session_id + } + + pub fn user_id(&self) -> &str { + &self.session_and_user_id.user_id + } + + /// Send a message to the room + pub fn send_message(&self, content: String) -> anyhow::Result<()> { + self.broadcast_tx + .send(event::Event::UserMessage( + event::UserMessageBroadcastEvent { + room: self.room.clone(), + user_id: self.session_and_user_id.user_id.clone(), + content, + }, + )) + .context("could not write to the broadcast channel")?; + + Ok(()) + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room_manager.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room_manager.rs new file mode 100644 index 0000000..f118a5c --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/room_manager/room_manager.rs @@ -0,0 +1,69 @@ +use std::{collections::HashMap, sync::Arc}; + +use comms::event::Event; +use tokio::sync::{broadcast, Mutex}; + +use super::room::{ChatRoom, ChatRoomMetadata, SessionAndUserId, UserSessionHandle}; + +pub type RoomJoinResult = (broadcast::Receiver, UserSessionHandle, Vec); + +#[derive(Debug, Clone)] +pub struct RoomManager { + chat_rooms: HashMap>>, + chat_room_metadata: Vec, +} + +impl RoomManager { + pub(super) fn new(chat_rooms: Vec<(ChatRoomMetadata, Arc>)>) -> RoomManager { + let chat_room_metadata = chat_rooms + .iter() + .map(|(metadata, _)| metadata.clone()) + .collect(); + + RoomManager { + chat_room_metadata, + chat_rooms: chat_rooms + .into_iter() + .map(|(metadata, chat_room)| (metadata.name.clone(), chat_room)) + .collect(), + } + } + + pub fn chat_room_metadata(&self) -> &Vec { + &self.chat_room_metadata + } + + /// Joins to a room given a user session + pub async fn join_room( + &self, + room_name: &str, + session_and_user_id: &SessionAndUserId, + ) -> anyhow::Result { + let room = self + .chat_rooms + .get(room_name) + .ok_or_else(|| anyhow::anyhow!("room '{}' not found", room_name))?; + + let mut room = room.lock().await; + let (broadcast_rx, user_session_handle) = room.join(session_and_user_id); + + Ok(( + broadcast_rx, + user_session_handle, + room.get_unique_user_ids().clone(), + )) + } + + pub async fn drop_user_session_handle(&self, handle: UserSessionHandle) -> anyhow::Result<()> { + let room = self + .chat_rooms + .get(handle.room()) + .ok_or_else(|| anyhow::anyhow!("room '{}' not found", handle.room()))?; + + let mut room = room.lock().await; + + room.leave(handle); + + Ok(()) + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/session/chat_session.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/session/chat_session.rs new file mode 100644 index 0000000..8b0ac59 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/session/chat_session.rs @@ -0,0 +1,132 @@ +use std::{collections::HashMap, sync::Arc}; + +use anyhow::Context; +use comms::{ + command::UserCommand, + event::{self, Event}, +}; +use tokio::{ + sync::mpsc, + task::{AbortHandle, JoinSet}, +}; + +use crate::room_manager::{RoomManager, SessionAndUserId, UserSessionHandle}; + +pub(super) struct ChatSession { + session_and_user_id: SessionAndUserId, + room_manager: Arc, + joined_rooms: HashMap, + join_set: JoinSet<()>, + mpsc_tx: mpsc::Sender, + mpsc_rx: mpsc::Receiver, +} + +impl ChatSession { + pub fn new(session_id: &str, user_id: &str, room_manager: Arc) -> Self { + let (mpsc_tx, mpsc_rx) = mpsc::channel(100); + let session_and_user_id = SessionAndUserId { + session_id: String::from(session_id), + user_id: String::from(user_id), + }; + + ChatSession { + session_and_user_id, + room_manager, + joined_rooms: HashMap::new(), + join_set: JoinSet::new(), + mpsc_tx, + mpsc_rx, + } + } + + /// Handle a user command related to room management such as; join, leave, send message + pub async fn handle_user_command(&mut self, cmd: UserCommand) -> anyhow::Result<()> { + match cmd { + UserCommand::JoinRoom(cmd) => { + if self.joined_rooms.contains_key(&cmd.room) { + return Err(anyhow::anyhow!("already joined room '{}'", &cmd.room)); + } + + let (mut broadcast_rx, user_session_handle, user_ids) = self + .room_manager + .join_room(&cmd.room, &self.session_and_user_id) + .await?; + + // spawn a task to forward broadcast messages to the users' mpsc channel + // hence the user can receive messages from different rooms via single channel + let abort_handle = self.join_set.spawn({ + let mpsc_tx = self.mpsc_tx.clone(); + + // start with sending the user joined room event as a reply to the user + mpsc_tx + .send(Event::UserJoinedRoom(event::UserJoinedRoomReplyEvent { + room: cmd.room.clone(), + users: user_ids, + })) + .await?; + + async move { + while let Ok(event) = broadcast_rx.recv().await { + let _ = mpsc_tx.send(event).await; + } + } + }); + + // store references to the user session handle and abort handle + // this is used to send messages to the room and to cancel the task when user leaves the room + self.joined_rooms + .insert(cmd.room.clone(), (user_session_handle, abort_handle)); + } + UserCommand::SendMessage(cmd) => { + if let Some((user_session_handle, _)) = self.joined_rooms.get(&cmd.room) { + let _ = user_session_handle.send_message(cmd.content); + } + } + UserCommand::LeaveRoom(cmd) => { + // remove the room from joined rooms and drop user session handle for the room + if let Some(urp) = self.joined_rooms.remove(&cmd.room) { + self.cleanup_room(urp).await?; + } + } + _ => {} + } + + Ok(()) + } + + // TODO: optimize the performance of this function. leaving one by one may not be a good idea. + /// Leave all the rooms the user is currently participating in + pub async fn leave_all_rooms(&mut self) -> anyhow::Result<()> { + // drain the joined rooms to a variable, necessary to avoid borrowing self + let drained = self.joined_rooms.drain().collect::>(); + + for (_, urp) in drained { + self.cleanup_room(urp).await?; + } + + Ok(()) + } + + /// Cleanup the room by removing the user from the room and + /// aborting the task that forwards broadcast messages to the user + async fn cleanup_room( + &mut self, + (user_session_handle, abort_handle): (UserSessionHandle, AbortHandle), + ) -> anyhow::Result<()> { + self.room_manager + .drop_user_session_handle(user_session_handle) + .await?; + + abort_handle.abort(); + + Ok(()) + } + + /// Receive an event that may have originated from any of the rooms the user is actively participating in + pub async fn recv(&mut self) -> anyhow::Result { + self.mpsc_rx + .recv() + .await + .context("could not recv from the broadcast channel") + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/server/src/session/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/server/src/session/mod.rs new file mode 100644 index 0000000..54f62fe --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/server/src/session/mod.rs @@ -0,0 +1,88 @@ +use std::sync::Arc; + +use comms::{ + command::UserCommand, + event::{self, RoomDetail}, + transport, +}; +use nanoid::nanoid; +use tokio::{net::TcpStream, sync::broadcast}; +use tokio_stream::StreamExt; + +use crate::room_manager::RoomManager; + +use self::chat_session::ChatSession; + +mod chat_session; + +/// Given a tcp stream and a room manager, handles the user session +/// until the user quits the session, or the tcp stream is closed for some reason, or the server shuts down +pub async fn handle_user_session( + room_manager: Arc, + mut quit_rx: broadcast::Receiver<()>, + stream: TcpStream, +) -> anyhow::Result<()> { + let session_id = nanoid!(); + // Generate a random id for the user, since we don't have a login system + let user_id = String::from(&nanoid!()[0..5]); + // Split the tcp stream into a command stream and an event writer with better ergonomics + let (mut commands, mut event_writer) = transport::server::split_tcp_stream(stream); + + // Welcoming the user with a login successful event and necessary information about the server + event_writer + .write(&event::Event::LoginSuccessful( + event::LoginSuccessfulReplyEvent { + session_id: session_id.clone(), + user_id: user_id.clone(), + rooms: room_manager + .chat_room_metadata() + .iter() + .map(|metadata| RoomDetail { + name: metadata.name.clone(), + description: metadata.description.clone(), + }) + .collect(), + }, + )) + .await?; + + // Create a chat session with the given room manager + // Chat Session will abstract the user session handling logic for multiple rooms + let mut chat_session = ChatSession::new(&session_id, &user_id, room_manager); + + loop { + tokio::select! { + cmd = commands.next() => match cmd { + // If the user closes the tcp stream, or sends a quit cmd + // We need to clean up resources in a way that the other users are notified about the user's departure + None | Some(Ok(UserCommand::Quit(_))) => { + chat_session.leave_all_rooms().await?; + break; + } + // Handle a valid user command + Some(Ok(cmd)) => match cmd { + // For user session related commands, we need to handle them in the chat session + UserCommand::JoinRoom(_) | UserCommand::SendMessage(_) | UserCommand::LeaveRoom(_) => { + chat_session.handle_user_command(cmd).await?; + } + _ => {} + } + _ => {} + }, + // Aggregated events from the chat session are sent to the user + Ok(event) = chat_session.recv() => { + event_writer.write(&event).await?; + } + // If the server is shutting down, we can just close the tcp streams + // and exit the session handler. Since the server is shutting down, + // we don't need to notify other users about the user's departure or cleanup resources + Ok(_) = quit_rx.recv() => { + drop(event_writer); + println!("Gracefully shutting down user tcp stream."); + break; + } + } + } + + Ok(()) +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/.gitignore b/spring-2025/sen-109/00010/rust-chat-server/tui/.gitignore new file mode 100644 index 0000000..0b42d2d --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/.gitignore @@ -0,0 +1 @@ +/target diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/Cargo.toml b/spring-2025/sen-109/00010/rust-chat-server/tui/Cargo.toml new file mode 100644 index 0000000..f7aecd2 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "tui" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0" +circular-queue = "0.2.6" +comms = { path = "../comms", features = ["client"] } +crossterm = { version = "0.28.1", features = ["event-stream"] } +ratatui = { version = "0.29.0", features = ["all-widgets"] } +tokio = { version = "1.43.0", features = ["full"] } +tokio-stream = { version = "0.1.17" } diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/README.md b/spring-2025/sen-109/00010/rust-chat-server/tui/README.md new file mode 100644 index 0000000..7e16f02 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/README.md @@ -0,0 +1,33 @@ +# 🎮 Rust Chat Server - TUI Client + +The `tui` binary provides a terminal-based UI for the [rust-chat-server](../). This interface communicates with the server using a TCP client via our [comms library](../comms). + +![TUI Demo](./docs/tui.gif) + +--- + +## 🛠 Technical Stack + +- **Async I/O**: Leverages [Tokio](https://tokio.rs/) for asynchronous tasks and non-blocking I/O, integrating both [Tokio Streams](https://tokio.rs/tokio/tutorial/streams) and [Crossterm's EventStream](https://docs.rs/crossterm/latest/crossterm/event/struct.EventStream.html). +- **Flux-inspired Design**: Implements a simplified [Flux Architecture](https://facebookarchive.github.io/flux/docs/in-depth-overview) to decouple UI and user/server interactions, facilitated by [Tokio Channels](https://tokio.rs/tokio/tutorial/channels). +- **TUI Rendering**: Utilizes [ratatui-org/ratatui](https://github.com/ratatui-org/ratatui) for terminal-based UI rendering. + +## 🏗 Architectural Overview + +![High Level Architecture](./docs/high-level-architecture.svg) + +1. **State Store & UI Management Loop**: On startup, the application initializes loops for both **State Store** and **UI Management**, and sets up channels for **State Updates** and **User Actions**. +2. **UI Management**: + - **Pages** and **Components** sub-modules separate UI-related logic, resembling the structural design in modern web SPAs. + - State-linked components can emit **User Actions** like server connection requests, room joins, and message sends. + - A dedicated loop orchestrates the UI updates based on both state changes and terminal events. +3. **State Store**: + - **State Store** subscribes to **User Actions** to manage server connections and commands. + - Upon processing **User Actions** or **Server Events**, **State Store** pushes the new state to the **State Channel** for UI updates. + +## 🚀 Quick Start + +Run the TUI client using `cargo run` or `cargo run --bin tui`. Upon bootstrap, you will be asked to enter a server address. The server address field will default to `localhost:8080`. Press `` after entering the server you want to connect to. + +Server disconnections will trigger a state reset, requiring re-login. + diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.plantuml b/spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.plantuml new file mode 100644 index 0000000..a50b6e7 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.plantuml @@ -0,0 +1,54 @@ +@startuml High Level Architecture - Diagram + +skinparam linetype orthogonally + +entity "Chat Server" as chat_server <> + +package "State Store" as ss_p { + component "Server Handle" as server_handle + component "State Store\nMain Loop" as state_store + component "State" as state + component "State Channel" as state_ch + + state_store -[hidden]u-> server_handle + state -[hidden]d-> state_ch +} + +chat_server <-d-> server_handle: TCP Communication\nvia the Comms Library + +package "UI Management" as um_p { + component "User Management\nMain Loop" as user_management + component "User Action\nChannel" as action_ch + + package "Pages" as pages { + component "Chat Page" as chat_page + component "Connect Page" as connect_page + + chat_page -[hidden]d-> connect_page + } + + package "Components" as components { + component "Input Box" as input_box + } + + action_ch -[hidden]d-> user_management + user_management -[hidden]l-> pages + components -[hidden]d-> pages + user_management -d-> pages: Render Pages\nAccording to the\nState Changes + pages -d-> components: ...Uses pure Components + pages -> action_ch: Send the User Actions +} + +actor User as user +user -d-> um_p: Interact via\nthe Terminal + +state_store <-u-> server_handle: Subscribe to the Server Events\nand Send Commands +state_store -> action_ch: Subscribe to the User Actions +state_store -> state: Update the State\nper user actions\nand server events +state_store -> state_ch: Send Updated State + +state_ch <- user_management: Subscribe to State Changes + +ss_p -[hidden]d-> um_p + +@enduml \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.svg b/spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.svg new file mode 100644 index 0000000..aca6292 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/docs/high-level-architecture.svg @@ -0,0 +1,96 @@ +State StoreUI ManagementPagesComponentsServer HandleState StoreMain LoopStateState ChannelUser ManagementMain LoopUser ActionChannelChat PageConnect PageInput BoxChat Server«Chat Server»UserSubscribe to the Server Eventsand Send CommandsTCP Communicationvia the Comms LibraryRender PagesAccording to theState Changes...Uses pure ComponentsSend the User ActionsInteract viathe TerminalSubscribe to the User ActionsUpdate the Stateper user actionsand server eventsSend Updated StateSubscribe to State Changes \ No newline at end of file diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/docs/tui.gif b/spring-2025/sen-109/00010/rust-chat-server/tui/docs/tui.gif new file mode 100644 index 0000000000000000000000000000000000000000..46b7ae8f7772d7c1e4dccdd81c6b1bc6859160e4 GIT binary patch literal 510025 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

xX=P?1N97J$=(ZmUW(Ej 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%0A>kUZxp8iL&+wvW-?I- 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 z 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 wGqi anyhow::Result<()> { + let (terminator, mut interrupt_rx) = create_termination(); + let (state_store, state_rx) = StateStore::new(); + let (ui_manager, action_rx) = UiManager::new(); + + tokio::try_join!( + state_store.main_loop(terminator, action_rx, interrupt_rx.resubscribe()), + ui_manager.main_loop(state_rx, interrupt_rx.resubscribe()), + )?; + + if let Ok(reason) = interrupt_rx.recv().await { + match reason { + Interrupted::UserInt => println!("exited per user request"), + Interrupted::OsSigInt => println!("exited because of an os sig int"), + } + } else { + println!("exited because of an unexpected error"); + } + + Ok(()) +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/action.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/action.rs new file mode 100644 index 0000000..f8a09cb --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/action.rs @@ -0,0 +1,7 @@ +#[derive(Debug, Clone)] +pub enum Action { + ConnectToServerRequest { addr: String }, + SendMessage { content: String }, + SelectRoom { room: String }, + Exit, +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/mod.rs new file mode 100644 index 0000000..69ef8ab --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/mod.rs @@ -0,0 +1,7 @@ +pub use self::state::*; +pub use self::state_store::StateStore; + +pub mod action; +mod state; +#[allow(clippy::module_inception)] +mod state_store; diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state.rs new file mode 100644 index 0000000..697581f --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state.rs @@ -0,0 +1,189 @@ +use std::collections::{HashMap, HashSet}; +use std::fmt; +use std::fmt::Formatter; +use circular_queue::CircularQueue; +use comms::event; + +#[derive(Debug, Clone)] +pub enum MessageBoxItem { + Message { user_id: String, content: String }, + Notification(String), +} + +const MAX_MESSAGES_TO_STORE_PER_ROOM: usize = 100; + +/// RoomData holds the data for a room +#[derive(Debug, Clone)] +pub struct RoomData { + /// The name of the room + pub name: String, + /// The description of the Room + pub description: String, + /// List of users in the room + pub users: HashSet, + /// History of recorded messages + pub messages: CircularQueue, + /// Has joined the room + pub has_joined: bool, + /// Has unread messages + pub has_unread: bool, +} + +impl Default for RoomData { + fn default() -> Self { + RoomData { + name: String::new(), + description: String::new(), + users: HashSet::new(), + messages: CircularQueue::with_capacity(MAX_MESSAGES_TO_STORE_PER_ROOM), + has_joined: false, + has_unread: false, + } + } +} + +impl RoomData { + pub fn new(name: String, description: String) -> Self { + RoomData { + name, + description, + ..Default::default() + } + } +} + +#[derive(Debug, Clone)] +pub enum ServerConnectionStatus { + Uninitialized, + Connecting, + Connected { addr: String }, + Errored { err: String }, +} + +impl fmt::Display for ServerConnectionStatus { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + ServerConnectionStatus::Uninitialized => write!(f, "Uninitialized"), + ServerConnectionStatus::Connecting => write!(f, "Connecting"), + ServerConnectionStatus::Connected { addr } => write!(f, "Connected to {}", addr), + ServerConnectionStatus::Errored { err } => write!(f, "Errored: {}", err), + } + } +} + +/// State holds the state of the application +#[derive(Debug, Clone)] +pub struct State { + pub server_connection_status: ServerConnectionStatus, + /// Currently active room + pub active_room: Option, + /// The id of the user + pub user_id: String, + /// Storage of room data + pub room_data_map: HashMap, + /// Timer since app was opened + pub timer: usize, +} + +impl Default for State { + fn default() -> Self { + State { + server_connection_status: ServerConnectionStatus::Uninitialized, + active_room: None, + user_id: String::new(), + room_data_map: HashMap::new(), + timer: 0, + } + } +} + +impl State { + pub fn handle_server_event(&mut self, event: &event::Event) { + match event { + event::Event::LoginSuccessful(event) => { + self.user_id = event.user_id.clone(); + self.room_data_map = event + .rooms + .clone() + .into_iter() + .map(|r| (r.name.clone(), RoomData::new(r.name, r.description))) + .collect(); + } + event::Event::RoomParticipation(event) => { + if let Some(room_data) = self.room_data_map.get_mut(&event.room) { + match event.status { + event::RoomParticipationStatus::Joined => { + room_data.users.insert(event.user_id.clone()); + if event.user_id == self.user_id { + room_data.has_joined = true; + } + } + event::RoomParticipationStatus::Left => { + room_data.users.remove(&event.user_id); + if event.user_id == self.user_id { + room_data.has_joined = false; + } + } + } + + room_data + .messages + .push(MessageBoxItem::Notification(format!( + "{} has {} the room", + event.user_id, + match event.status { + event::RoomParticipationStatus::Joined => "joined", + event::RoomParticipationStatus::Left => "left", + } + ))); + } + } + event::Event::UserJoinedRoom(event) => { + self.room_data_map.get_mut(&event.room).unwrap().users = + event.users.clone().into_iter().collect(); + } + event::Event::UserMessage(event) => { + let room_data = self.room_data_map.get_mut(&event.room).unwrap(); + + room_data.messages.push(MessageBoxItem::Message { + user_id: event.user_id.clone(), + content: event.content.clone(), + }); + + if let Some(active_room) = self.active_room.as_ref() { + if !active_room.eq(&event.room) { + room_data.has_unread = true; + } + } + } + } + } + + pub fn mark_connection_request_start(&mut self) { + self.server_connection_status = ServerConnectionStatus::Connecting; + } + + /// Processes the result of a connection request to change the state of the application + pub fn process_connection_request_result(&mut self, result: anyhow::Result) { + self.server_connection_status = match result { + Ok(addr) => ServerConnectionStatus::Connected { addr: addr.clone() }, + Err(err) => ServerConnectionStatus::Errored { + err: err.to_string(), + }, + } + } + + /// Tries to set the active room as the given room. Returns the [RoomData] associated to the room. + pub fn try_set_active_room(&mut self, room: &str) -> Option<&RoomData> { + let room_data = self.room_data_map.get_mut(room)?; + room_data.has_unread = false; + + self.active_room = Some(String::from(room)); + + Some(room_data) + } + + pub fn tick_timer(&mut self) { + self.timer += 1; + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state_store.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state_store.rs new file mode 100644 index 0000000..2ac5672 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/state_store/state_store.rs @@ -0,0 +1,157 @@ +use std::time::Duration; + +use anyhow::Context; +use comms::{ + command, + transport::{ + self, + client::{CommandWriter, EventStream}, + }, +}; +use tokio::{ + net::TcpStream, + sync::{ + broadcast, + mpsc::{self, UnboundedReceiver, UnboundedSender}, + }, +}; +use tokio_stream::StreamExt; + +use crate::{Interrupted, Terminator}; + +use super::{action::Action, State}; + +pub struct StateStore { + state_tx: UnboundedSender, +} + +impl StateStore { + pub fn new() -> (Self, UnboundedReceiver) { + let (state_tx, state_rx) = mpsc::unbounded_channel::(); + + (StateStore { state_tx }, state_rx) + } +} + +type ServerHandle = (EventStream, CommandWriter); + +async fn create_server_handle(addr: &str) -> anyhow::Result { + let stream = TcpStream::connect(addr).await?; + let (event_stream, command_writer) = transport::client::split_tcp_stream(stream); + + Ok((event_stream, command_writer)) +} + +impl StateStore { + pub async fn main_loop( + self, + mut terminator: Terminator, + mut action_rx: UnboundedReceiver, + mut interrupt_rx: broadcast::Receiver, + ) -> anyhow::Result { + let mut opt_server_handle: Option = None; + let mut state = State::default(); + + // the initial state once + self.state_tx.send(state.clone())?; + + let mut ticker = tokio::time::interval(Duration::from_secs(1)); + + let result = loop { + if let Some((event_stream, command_writer)) = opt_server_handle.as_mut() { + tokio::select! { + // Handle the server events as they come in + maybe_event = event_stream.next() => match maybe_event { + Some(Ok(event)) => { + state.handle_server_event(&event); + }, + // server disconnected, we need to reset the state + None => { + opt_server_handle = None; + state = State::default(); + }, + _ => (), + }, + // Handle the actions coming from the UI + // and process them to do async operations + Some(action) = action_rx.recv() => match action { + Action::SendMessage { content } => { + if let Some(active_room) = state.active_room.as_ref() { + command_writer + .write(&command::UserCommand::SendMessage( + command::SendMessageCommand { + room: active_room.clone(), + content, + }, + )) + .await + .context("could not send message")?; + } + }, + Action::SelectRoom { room } => { + if let Some(false) = state.try_set_active_room(room.as_str()).map(|room_data| room_data.has_joined) { + command_writer + .write(&command::UserCommand::JoinRoom(command::JoinRoomCommand { + room, + })) + .await + .context("could not join room")?; + } + }, + Action::Exit => { + let _ = terminator.terminate(Interrupted::UserInt); + + break Interrupted::UserInt; + }, + _ => (), + }, + // Tick to terminate the select every N milliseconds + _ = ticker.tick() => { + state.tick_timer(); + }, + // Catch and handle interrupt signal to gracefully shutdown + Ok(interrupted) = interrupt_rx.recv() => { + break interrupted; + } + } + } else { + tokio::select! { + Some(action) = action_rx.recv() => match action { + Action::ConnectToServerRequest { addr } => { + state.mark_connection_request_start(); + // emit event to re-render any part depending on the connection status + self.state_tx.send(state.clone())?; + + match create_server_handle(&addr).await { + Ok(server_handle) => { + // set the server handle and change status for further processing + let _ = opt_server_handle.insert(server_handle); + state.process_connection_request_result(Ok(addr)); + // ticker needs to be reset to avoid showing time spent inputting and connecting to the server address + ticker.reset(); + }, + Err(err) => { + state.process_connection_request_result(Err(err)); + } + } + }, + Action::Exit => { + let _ = terminator.terminate(Interrupted::UserInt); + + break Interrupted::UserInt; + }, + _ => (), + }, + // Catch and handle interrupt signal to gracefully shutdown + Ok(interrupted) = interrupt_rx.recv() => { + break interrupted; + } + } + } + + self.state_tx.send(state.clone())?; + }; + + Ok(result) + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/termination.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/termination.rs new file mode 100644 index 0000000..a1437f2 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/termination.rs @@ -0,0 +1,49 @@ +#[cfg(unix)] +use tokio::signal::unix::signal; +use tokio::sync::broadcast; + +#[derive(Debug, Clone)] +pub enum Interrupted { + OsSigInt, + UserInt, +} + +#[derive(Debug, Clone)] +pub struct Terminator { + interrupt_tx: broadcast::Sender, +} + +impl Terminator { + pub fn new(interrupt_tx: broadcast::Sender) -> Self { + Self { interrupt_tx } + } + + pub fn terminate(&mut self, interrupted: Interrupted) -> anyhow::Result<()> { + self.interrupt_tx.send(interrupted)?; + + Ok(()) + } +} + +#[cfg(unix)] +async fn terminate_by_unix_signal(mut terminator: Terminator) { + let mut interrupt_signal = signal(tokio::signal::unix::SignalKind::interrupt()) + .expect("failed to create interrupt signal stream"); + + interrupt_signal.recv().await; + + terminator + .terminate(Interrupted::OsSigInt) + .expect("failed to send interrupt signal"); +} + +// create a broadcast channel for retrieving the application kill signal +pub fn create_termination() -> (Terminator, broadcast::Receiver) { + let (tx, rx) = broadcast::channel(1); + let terminator = Terminator::new(tx); + + #[cfg(unix)] + tokio::spawn(terminate_by_unix_signal(terminator.clone())); + + (terminator, rx) +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/component.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/component.rs new file mode 100644 index 0000000..85359d4 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/component.rs @@ -0,0 +1,22 @@ +use crossterm::event::KeyEvent; +use ratatui::Frame; +use tokio::sync::mpsc::UnboundedSender; + +use crate::state_store::{action::Action, State}; + +pub trait Component { + fn new(state: &State, action_tx: UnboundedSender) -> Self + where + Self: Sized; + fn move_with_state(self, state: &State) -> Self + where + Self: Sized; + + fn name(&self) -> &str; + + fn handle_key_event(&mut self, key: KeyEvent); +} + +pub trait ComponentRender { + fn render(&self, frame: &mut Frame, props: Props); +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/input_box.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/input_box.rs new file mode 100644 index 0000000..d65e685 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/input_box.rs @@ -0,0 +1,159 @@ +use crossterm::event::{KeyCode, KeyEvent, KeyEventKind}; +use ratatui::{ + prelude::Rect, + style::{Color, Style, Stylize}, + widgets::{Block, Borders, Paragraph}, + Frame, +}; +use ratatui::prelude::Position; +use tokio::sync::mpsc::UnboundedSender; + +use crate::state_store::{action::Action, State}; + +use super::{Component, ComponentRender}; + +pub struct InputBox { + /// Current value of the input box + text: String, + /// Position of cursor in the editor area. + cursor_position: usize, +} + +impl InputBox { + pub fn text(&self) -> &str { + &self.text + } + + pub fn set_text(&mut self, new_text: &str) { + self.text = String::from(new_text); + self.cursor_position = self.text.len(); + } + + pub fn reset(&mut self) { + self.cursor_position = 0; + self.text.clear(); + } + + pub fn is_empty(&self) -> bool { + self.text.is_empty() + } + + fn move_cursor_left(&mut self) { + let cursor_moved_left = self.cursor_position.saturating_sub(1); + self.cursor_position = self.clamp_cursor(cursor_moved_left); + } + + fn move_cursor_right(&mut self) { + let cursor_moved_right = self.cursor_position.saturating_add(1); + self.cursor_position = self.clamp_cursor(cursor_moved_right); + } + + fn enter_char(&mut self, new_char: char) { + self.text.insert(self.cursor_position, new_char); + + self.move_cursor_right(); + } + + fn delete_char(&mut self) { + let is_not_cursor_leftmost = self.cursor_position != 0; + if is_not_cursor_leftmost { + // Method "remove" is not used on the saved text for deleting the selected char. + // Reason: Using remove on String works on bytes instead of the chars. + // Using remove would require special care because of char boundaries. + + let current_index = self.cursor_position; + let from_left_to_current_index = current_index - 1; + + // Getting all characters before the selected character. + let before_char_to_delete = self.text.chars().take(from_left_to_current_index); + // Getting all characters after selected character. + let after_char_to_delete = self.text.chars().skip(current_index); + + // Put all characters together except the selected one. + // By leaving the selected one out, it is forgotten and therefore deleted. + self.text = before_char_to_delete.chain(after_char_to_delete).collect(); + self.move_cursor_left(); + } + } + + fn clamp_cursor(&self, new_cursor_pos: usize) -> usize { + new_cursor_pos.clamp(0, self.text.len()) + } +} + +impl Component for InputBox { + fn new(_state: &State, _action_tx: UnboundedSender) -> Self { + Self { + // + text: String::new(), + cursor_position: 0, + } + } + + fn move_with_state(self, _state: &State) -> Self + where + Self: Sized, + { + Self { ..self } + } + + fn name(&self) -> &str { + "Input Box" + } + + fn handle_key_event(&mut self, key: KeyEvent) { + if key.kind != KeyEventKind::Press { + return; + } + + match key.code { + KeyCode::Char(to_insert) => { + self.enter_char(to_insert); + } + KeyCode::Backspace => { + self.delete_char(); + } + KeyCode::Left => { + self.move_cursor_left(); + } + KeyCode::Right => { + self.move_cursor_right(); + } + _ => {} + } + } +} + +pub struct RenderProps { + pub title: String, + pub area: Rect, + pub border_color: Color, + pub show_cursor: bool, +} + +impl ComponentRender for InputBox { + fn render(&self, frame: &mut Frame, props: RenderProps) { + let input = Paragraph::new(self.text.as_str()) + .style(Style::default().fg(Color::Yellow)) + .block( + Block::default() + .borders(Borders::ALL) + .fg(props.border_color) + .title(props.title), + ); + frame.render_widget(input, props.area); + + // Cursor is hidden by default, so we need to make it visible if the input box is selected + if props.show_cursor { + // Make the cursor visible and ask ratatui to put it at the specified coordinates after + // rendering + frame.set_cursor_position(Position::new( + // Draw the cursor at the current position in the input field. + // This position is can be controlled via the left and right arrow key + props.area.x + self.cursor_position as u16 + 1, + // Move one line down, from the border to the input line + props.area.y + 1, + )) + } + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/mod.rs new file mode 100644 index 0000000..e0d6418 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/components/mod.rs @@ -0,0 +1,4 @@ +mod component; + +pub mod input_box; +pub use component::{Component, ComponentRender}; diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/mod.rs new file mode 100644 index 0000000..60751cf --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/mod.rs @@ -0,0 +1,5 @@ +pub use ui_manager::UiManager; + +mod components; +mod pages; +mod ui_manager; diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/chat_page.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/chat_page.rs new file mode 100644 index 0000000..871c31a --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/chat_page.rs @@ -0,0 +1,457 @@ +use std::collections::HashMap; + +use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers}; +use ratatui::{prelude::*, widgets::*, Frame}; +use tokio::sync::mpsc::UnboundedSender; + +use crate::state_store::{action::Action, MessageBoxItem, RoomData, ServerConnectionStatus, State}; + +use super::{ + components::{ + message_input_box::{self, MessageInputBox}, + room_list::{self, RoomList}, + }, + section::{ + usage::{widget_usage_to_text, HasUsageInfo, UsageInfo, UsageInfoLine}, + SectionActivation, + }, +}; +use crate::ui_management::components::{Component, ComponentRender}; + +#[derive(Debug, Clone, PartialEq)] +pub enum Section { + MessageInput, + RoomList, +} + +impl Section { + pub const COUNT: usize = 2; + + fn to_usize(&self) -> usize { + match self { + Section::MessageInput => 0, + Section::RoomList => 1, + } + } +} + +impl TryFrom for Section { + type Error = (); + + fn try_from(value: usize) -> Result { + match value { + 0 => Ok(Section::MessageInput), + 1 => Ok(Section::RoomList), + _ => Err(()), + } + } +} + +struct Props { + /// The logged-in user + user_id: String, + /// The currently active room + active_room: Option, + /// The timer for the chat page + timer: usize, + /// The room data map + room_data_map: HashMap, + /// Connection status for the current connection + connection_status: ServerConnectionStatus, +} + +impl From<&State> for Props { + fn from(state: &State) -> Self { + Props { + user_id: state.user_id.clone(), + active_room: state.active_room.clone(), + timer: state.timer, + room_data_map: state.room_data_map.clone(), + connection_status: state.server_connection_status.clone(), + } + } +} + +const DEFAULT_HOVERED_SECTION: Section = Section::MessageInput; + +/// ChatPage handles the UI and the state of the chat page +pub struct ChatPage { + /// Action sender + pub action_tx: UnboundedSender, + /// State Mapped ChatPage Props + props: Props, + // Internal State + /// Currently active section, handling input + pub active_section: Option

, + /// Section that is currently hovered + pub last_hovered_section: Section, + // Child Components + /// The room list widget that handles the listing of the rooms + pub room_list: RoomList, + /// The input box widget that handles the message input + pub message_input_box: MessageInputBox, +} + +impl ChatPage { + fn get_room_data(&self, name: &str) -> Option<&RoomData> { + self.props.room_data_map.get(name) + } + + fn get_component_for_section<'a>(&'a self, section: &Section) -> &'a dyn Component { + match section { + Section::MessageInput => &self.message_input_box, + Section::RoomList => &self.room_list, + } + } + + fn get_component_for_section_mut<'a>(&'a mut self, section: &Section) -> &'a mut dyn Component { + match section { + Section::MessageInput => &mut self.message_input_box, + Section::RoomList => &mut self.room_list, + } + } + + fn get_section_activation_for_section<'a>( + &'a mut self, + section: &Section, + ) -> &'a mut dyn SectionActivation { + match section { + Section::MessageInput => &mut self.message_input_box, + Section::RoomList => &mut self.room_list, + } + } + + fn hover_next(&mut self) { + let idx: usize = self.last_hovered_section.to_usize(); + let next_idx = (idx + 1) % Section::COUNT; + self.last_hovered_section = Section::try_from(next_idx).unwrap(); + } + + fn hover_previous(&mut self) { + let idx: usize = self.last_hovered_section.to_usize(); + let previous_idx = if idx == 0 { + Section::COUNT - 1 + } else { + idx - 1 + }; + self.last_hovered_section = Section::try_from(previous_idx).unwrap(); + } + + fn calculate_border_color(&self, section: Section) -> Color { + match (self.active_section.as_ref(), &self.last_hovered_section) { + (Some(active_section), _) if active_section.eq(§ion) => Color::Yellow, + (_, last_hovered_section) if last_hovered_section.eq(§ion) => Color::Blue, + _ => Color::Reset, + } + } + + fn disable_section(&mut self, section: &Section) { + self.get_section_activation_for_section(section) + .deactivate(); + + self.active_section = None; + } +} + +impl Component for ChatPage { + fn new(state: &State, action_tx: UnboundedSender) -> Self + where + Self: Sized, + { + ChatPage { + action_tx: action_tx.clone(), + // set the props + props: Props::from(state), + // internal component state + active_section: None, + last_hovered_section: DEFAULT_HOVERED_SECTION, + // child components + room_list: RoomList::new(state, action_tx.clone()), + message_input_box: MessageInputBox::new(state, action_tx), + } + .move_with_state(state) + } + + fn move_with_state(self, state: &State) -> Self + where + Self: Sized, + { + ChatPage { + props: Props::from(state), + // propagate the update to the child components + room_list: self.room_list.move_with_state(state), + message_input_box: self.message_input_box.move_with_state(state), + ..self + } + } + + fn name(&self) -> &str { + "Chat Page" + } + + fn handle_key_event(&mut self, key: KeyEvent) { + if key.kind != KeyEventKind::Press { + return; + } + + let active_section = self.active_section.clone(); + + match active_section { + None => match key.code { + KeyCode::Enter => { + let last_hovered_section = self.last_hovered_section.clone(); + + self.active_section = Some(last_hovered_section.clone()); + self.get_section_activation_for_section(&last_hovered_section) + .activate(); + } + KeyCode::Left => self.hover_previous(), + KeyCode::Right => self.hover_next(), + KeyCode::Char('q') => { + let _ = self.action_tx.send(Action::Exit); + } + KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { + let _ = self.action_tx.send(Action::Exit); + } + _ => {} + }, + Some(section) => { + self.get_component_for_section_mut(§ion) + .handle_key_event(key); + + // disable the section according to the action taken + // the section is disabled when escape is pressed + // or when enter is pressed on the room list + match section { + Section::RoomList if key.code == KeyCode::Enter => { + self.disable_section(§ion) + } + _ if key.code == KeyCode::Esc => self.disable_section(§ion), + _ => (), + } + } + } + } +} + +const NO_ROOM_SELECTED_MESSAGE: &str = "Join at least one room to start chatting!"; + +fn calculate_list_offset(height: u16, items_len: usize) -> usize { + // go back by (container height + 2 for borders) to get the offset + items_len.saturating_sub(height as usize - 2) +} + +impl ComponentRender<()> for ChatPage { + fn render(&self, frame: &mut Frame, _props: ()) { + let [left, middle, right] = *Layout::default() + .direction(Direction::Horizontal) + .constraints( + [ + Constraint::Percentage(20), + Constraint::Percentage(60), + Constraint::Percentage(20), + ] + .as_ref(), + ) + .split(frame.area()) + else { + panic!("The main layout should have 3 chunks") + }; + + let [container_room_list, container_user_info] = *Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Min(1), Constraint::Length(6)].as_ref()) + .split(left) + else { + panic!("The left layout should have 2 chunks") + }; + + self.room_list.render( + frame, + room_list::RenderProps { + border_color: self.calculate_border_color(Section::RoomList), + area: container_room_list, + }, + ); + + let user_info = Paragraph::new(Text::from(vec![ + Line::from(format!("User: @{}", self.props.user_id)), + Line::from(format!("Chatting for: {} secs", self.props.timer)), + Line::from(format!("Server: {}", self.props.connection_status)), + ])).wrap(Wrap { trim: false }) + .block( + Block::default() + .borders(Borders::ALL) + .title("User Information"), + ); + frame.render_widget(user_info, container_user_info); + + let [container_highlight, container_messages, container_input] = *Layout::default() + .direction(Direction::Vertical) + .constraints( + [ + Constraint::Length(3), + Constraint::Min(1), + Constraint::Length(3), + ] + .as_ref(), + ) + .split(middle) + else { + panic!("The middle layout should have 3 chunks") + }; + + let top_line = if let Some(room_data) = self + .props + .active_room + .as_ref() + .and_then(|active_room| self.get_room_data(active_room)) + { + Line::from(vec![ + "on ".into(), + Span::from(format!("#{}", room_data.name)).bold(), + " for ".into(), + Span::from(format!(r#""{}""#, room_data.description)).italic(), + ]) + } else { + Line::from(NO_ROOM_SELECTED_MESSAGE) + }; + let text = Text::from(top_line); + + let help_message = Paragraph::new(text).block( + Block::default() + .borders(Borders::ALL) + .title("Active Room Information"), + ); + frame.render_widget(help_message, container_highlight); + + let messages = if let Some(active_room) = self.props.active_room.as_ref() { + self.get_room_data(active_room) + .map(|room_data| { + let message_offset = + calculate_list_offset(container_messages.height, room_data.messages.len()); + + room_data + .messages + .asc_iter() + .skip(message_offset) + .map(|mbi| { + let line = match mbi { + MessageBoxItem::Message { user_id, content } => { + Line::from(Span::raw(format!("@{}: {}", user_id, content))) + } + MessageBoxItem::Notification(content) => { + Line::from(Span::raw(content.clone()).italic()) + } + }; + + ListItem::new(line) + }) + .collect::>() + }) + .unwrap_or_default() + } else { + vec![ListItem::new(Line::from(NO_ROOM_SELECTED_MESSAGE))] + }; + + let messages = + List::new(messages).block(Block::default().borders(Borders::ALL).title("Messages")); + frame.render_widget(messages, container_messages); + + self.message_input_box.render( + frame, + message_input_box::RenderProps { + border_color: self.calculate_border_color(Section::MessageInput), + area: container_input, + show_cursor: self + .active_section + .as_ref() + .map(|active_section| active_section.eq(&Section::MessageInput)) + .unwrap_or(false), + }, + ); + + let [container_room_users, container_usage] = *Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Min(1), Constraint::Length(10)].as_ref()) + .split(right) + else { + panic!("The left layout should have 2 chunks") + }; + + let (room_users_list_items, room_users_len) = self + .props + .active_room + .as_ref() + .and_then(|active_room| { + self.get_room_data(active_room).map(|room_data| { + let room_users_len = room_data.users.len(); + let users_offset = + calculate_list_offset(container_room_users.height, room_users_len); + + ( + room_data + .users + .iter() + .skip(users_offset) + .map(|user_id| { + ListItem::new(Line::from(Span::raw(format!("@{user_id}")))) + }) + .collect::>>(), + room_users_len, + ) + }) + }) + .unwrap_or_else(|| (vec![], 0)); + + let room_users_list = List::new(room_users_list_items).block( + Block::default() + .borders(Borders::ALL) + .title(format!("Room Users ({})", room_users_len)), + ); + + frame.render_widget(room_users_list, container_room_users); + + let mut usage_text: Text = widget_usage_to_text(self.usage_info()); + usage_text = usage_text.patch_style(Style::default()); + let usage = Paragraph::new(usage_text) + .wrap(Wrap { trim: true }) + .block(Block::default().borders(Borders::ALL).title("Usage")); + frame.render_widget(usage, container_usage); + } +} + +impl HasUsageInfo for ChatPage { + fn usage_info(&self) -> UsageInfo { + if let Some(section) = self.active_section.as_ref() { + let handler: &dyn HasUsageInfo = match section { + Section::RoomList => &self.room_list, + Section::MessageInput => &self.message_input_box, + }; + + handler.usage_info() + } else { + UsageInfo { + description: Some("Select a widget".into()), + lines: vec![ + UsageInfoLine { + keys: vec!["q".into()], + description: "to exit".into(), + }, + UsageInfoLine { + keys: vec!["←".into(), "→".into()], + description: "to hover widgets".into(), + }, + UsageInfoLine { + keys: vec!["Enter".into()], + description: format!( + "to activate {}", + self.get_component_for_section(&self.last_hovered_section) + .name() + ), + }, + ], + } + } + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/message_input_box.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/message_input_box.rs new file mode 100644 index 0000000..b1eab66 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/message_input_box.rs @@ -0,0 +1,148 @@ +use crossterm::event::{KeyCode, KeyEvent, KeyEventKind}; +use ratatui::{ + prelude::Rect, + style::Color, + Frame, +}; +use tokio::sync::mpsc::UnboundedSender; + +use super::super::section::usage::{HasUsageInfo, UsageInfo, UsageInfoLine}; +use crate::ui_management::components::{ + input_box::{self, InputBox}, + Component, ComponentRender, +}; +use crate::{ + state_store::{action::Action, State}, + ui_management::pages::chat_page::section::SectionActivation, +}; + +struct Props { + /// Active room that the user is chatting in + active_room: Option, +} + +impl From<&State> for Props { + fn from(state: &State) -> Self { + Self { + active_room: state.active_room.clone(), + } + } +} + +pub struct MessageInputBox { + action_tx: UnboundedSender, + /// State Mapped MessageInputBox Props + props: Props, + // Internal State for the Component + pub input_box: InputBox, +} + +impl MessageInputBox { + fn submit_message(&mut self) { + if self.input_box.is_empty() { + return; + } + + // TODO: handle the error scenario + let _ = self.action_tx.send(Action::SendMessage { + content: String::from(self.input_box.text()), + }); + + self.input_box.reset(); + } +} + +impl Component for MessageInputBox { + fn new(state: &State, action_tx: UnboundedSender) -> Self { + Self { + action_tx: action_tx.clone(), + props: Props::from(state), + // + input_box: InputBox::new(state, action_tx), + } + } + + fn move_with_state(self, state: &State) -> Self + where + Self: Sized, + { + Self { + props: Props::from(state), + ..self + } + } + + fn name(&self) -> &str { + "Message Input" + } + + fn handle_key_event(&mut self, key: KeyEvent) { + if key.kind != KeyEventKind::Press { + return; + } + + if self.props.active_room.is_some() { + self.input_box.handle_key_event(key); + + if key.code == KeyCode::Enter { + self.submit_message(); + } + } + } +} + +impl SectionActivation for MessageInputBox { + fn activate(&mut self) {} + + fn deactivate(&mut self) { + self.input_box.reset(); + } +} + +pub struct RenderProps { + pub area: Rect, + pub border_color: Color, + pub show_cursor: bool, +} + +impl ComponentRender for MessageInputBox { + fn render(&self, frame: &mut Frame, props: RenderProps) { + self.input_box.render( + frame, + input_box::RenderProps { + title: "Message Input".into(), + area: props.area, + border_color: props.border_color, + show_cursor: props.show_cursor, + }, + ) + } +} + +impl HasUsageInfo for MessageInputBox { + fn usage_info(&self) -> UsageInfo { + if self.props.active_room.is_none() { + UsageInfo { + description: Some("You can not send a message until you enter a room.".into()), + lines: vec![UsageInfoLine { + keys: vec!["Esc".into()], + description: "to cancel".into(), + }], + } + } else { + UsageInfo { + description: Some("Type your message to send a message to the active room".into()), + lines: vec![ + UsageInfoLine { + keys: vec!["Esc".into()], + description: "to cancel".into(), + }, + UsageInfoLine { + keys: vec!["Enter".into()], + description: "to send your message".into(), + }, + ], + } + } + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/mod.rs new file mode 100644 index 0000000..2375cc2 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/mod.rs @@ -0,0 +1,2 @@ +pub mod message_input_box; +pub mod room_list; diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/room_list.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/room_list.rs new file mode 100644 index 0000000..6d66ff3 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/components/room_list.rs @@ -0,0 +1,259 @@ +use crossterm::event::{KeyCode, KeyEvent, KeyEventKind}; +use ratatui::{ + prelude::Rect, + style::{Color, Modifier, Style}, + text::{Line, Span}, + widgets::{Block, Borders, List, ListItem, ListState}, + Frame, +}; +use tokio::sync::mpsc::UnboundedSender; + +use super::super::section::usage::{HasUsageInfo, UsageInfo, UsageInfoLine}; +use crate::{ + state_store::{action::Action, State}, + ui_management::pages::chat_page::section::SectionActivation, +}; + +use crate::ui_management::components::{Component, ComponentRender}; + +pub struct RoomState { + pub name: String, + pub description: String, + pub has_joined: bool, + pub has_unread: bool, +} + +struct Props { + /// List of rooms and current state of those rooms + rooms: Vec, + /// Current active room + active_room: Option, +} + +impl From<&State> for Props { + fn from(state: &State) -> Self { + let mut rooms = state + .room_data_map + .iter() + .map(|(name, room_data)| RoomState { + name: name.clone(), + description: room_data.description.clone(), + has_joined: room_data.has_joined, + has_unread: room_data.has_unread, + }) + .collect::>(); + + rooms.sort_by(|room_a, room_b| room_a.name.cmp(&room_b.name)); + + Self { + rooms, + active_room: state.active_room.clone(), + } + } +} + +pub struct RoomList { + /// Sending actions to the state store + action_tx: UnboundedSender, + /// State Mapped RoomList Props + props: Props, + // Internal Component State + /// List with optional selection and current offset + pub list_state: ListState, +} + +impl RoomList { + fn next(&mut self) { + let i = match self.list_state.selected() { + Some(i) => { + if i >= self.props.rooms.len() - 1 { + 0 + } else { + i + 1 + } + } + None => 0, + }; + self.list_state.select(Some(i)); + } + + fn previous(&mut self) { + let i = match self.list_state.selected() { + Some(i) => { + if i == 0 { + self.props.rooms.len() - 1 + } else { + i - 1 + } + } + None => 0, + }; + + self.list_state.select(Some(i)); + } + + pub(super) fn rooms(&self) -> &Vec { + &self.props.rooms + } + + fn get_room_idx(&self, name: &str) -> Option { + self.props + .rooms + .iter() + .enumerate() + .find_map(|(idx, room_state)| { + if room_state.name == name { + Some(idx) + } else { + None + } + }) + } +} + +impl Component for RoomList { + fn new(state: &State, action_tx: UnboundedSender) -> Self { + Self { + action_tx, + props: Props::from(state), + // + list_state: ListState::default(), + } + } + + fn move_with_state(self, state: &State) -> Self + where + Self: Sized, + { + Self { + props: Props::from(state), + ..self + } + } + + fn name(&self) -> &str { + "Room List" + } + + fn handle_key_event(&mut self, key: KeyEvent) { + if key.kind != KeyEventKind::Press { + return; + } + + match key.code { + KeyCode::Up => { + self.previous(); + } + KeyCode::Down => { + self.next(); + } + KeyCode::Enter if self.list_state.selected().is_some() => { + let selected_idx = self.list_state.selected().unwrap(); + + let rooms = self.rooms(); + let room_state = rooms.get(selected_idx).unwrap(); + + // TODO: handle the error scenario somehow + let _ = self.action_tx.send(Action::SelectRoom { + room: room_state.name.clone(), + }); + } + _ => (), + } + } +} + +impl SectionActivation for RoomList { + fn activate(&mut self) { + let idx: usize = self + .props + .active_room + .as_ref() + .and_then(|room_name| self.get_room_idx(room_name.as_str())) + .unwrap_or(0); + + *self.list_state.offset_mut() = 0; + self.list_state.select(Some(idx)); + } + + fn deactivate(&mut self) { + *self.list_state.offset_mut() = 0; + self.list_state.select(None); + } +} + +pub struct RenderProps { + pub border_color: Color, + pub area: Rect, +} + +impl ComponentRender for RoomList { + fn render(&self, frame: &mut Frame, props: RenderProps) { + let active_room = self.props.active_room.clone(); + let room_list: Vec = self + .rooms() + .iter() + .map(|room_state| { + let room_tag = format!( + "#{}{}", + room_state.name, + if room_state.has_unread { "*" } else { "" } + ); + let content = Line::from(Span::raw(room_tag)); + + let style = if self.list_state.selected().is_none() + && active_room.is_some() + && active_room.as_ref().unwrap().eq(&room_state.name) + { + Style::default().add_modifier(Modifier::BOLD) + } else if room_state.has_unread { + Style::default().add_modifier(Modifier::SLOW_BLINK | Modifier::ITALIC) + } else { + Style::default() + }; + + ListItem::new(content).style(style.bg(Color::Reset)) + }) + .collect(); + + let room_list = List::new(room_list) + .block( + Block::default() + .borders(Borders::ALL) + .border_style(Style::new().fg(props.border_color)) + .title("Rooms"), + ) + .highlight_style( + Style::default() + // yellow that would work for both dark / light modes + .bg(Color::Rgb(255, 223, 102)) + .add_modifier(Modifier::BOLD), + ) + .highlight_symbol(">"); + + let mut app_room_list_state = self.list_state.clone(); + frame.render_stateful_widget(room_list, props.area, &mut app_room_list_state); + } +} + +impl HasUsageInfo for RoomList { + fn usage_info(&self) -> UsageInfo { + UsageInfo { + description: Some("Select the room to talk in".into()), + lines: vec![ + UsageInfoLine { + keys: vec!["Esc".into()], + description: "to cancel".into(), + }, + UsageInfoLine { + keys: vec!["↑".into(), "↓".into()], + description: "to navigate".into(), + }, + UsageInfoLine { + keys: vec!["Enter".into()], + description: "to join room".into(), + }, + ], + } + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/mod.rs new file mode 100644 index 0000000..8b05cf2 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/mod.rs @@ -0,0 +1,6 @@ +#[allow(clippy::module_inception)] +mod chat_page; +mod components; +mod section; + +pub use chat_page::ChatPage; diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/mod.rs new file mode 100644 index 0000000..c5e1131 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/mod.rs @@ -0,0 +1,6 @@ +pub mod usage; + +pub trait SectionActivation { + fn activate(&mut self); + fn deactivate(&mut self); +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/usage.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/usage.rs new file mode 100644 index 0000000..1437f79 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/chat_page/section/usage.rs @@ -0,0 +1,62 @@ +use ratatui::{ + style::Stylize, + text::{Line, Span, Text}, +}; + +#[derive(Debug, Clone)] +pub struct UsageInfoLine { + pub keys: Vec, + pub description: String, +} + +#[derive(Debug, Clone)] +pub struct UsageInfo { + pub description: Option, + pub lines: Vec, +} + +pub trait HasUsageInfo { + fn usage_info(&self) -> UsageInfo; +} + +fn key_to_span<'a>(key: &String) -> Span<'a> { + Span::from(format!("({})", key)).bold() +} + +pub fn widget_usage_to_text<'a>(usage: UsageInfo) -> Text<'a> { + let mut lines: Vec = vec![]; + if let Some(description) = usage.description { + lines.push(Line::from(description)); + } + + for wuk in usage.lines { + let mut bindings: Vec = match wuk.keys.len() { + 0 => vec![], + 1 => vec![key_to_span(&wuk.keys[0])], + 2 => vec![ + key_to_span(&wuk.keys[0]), + " or ".into(), + key_to_span(&wuk.keys[1]), + ], + _ => { + let mut bindings: Vec = Vec::with_capacity(wuk.keys.len() * 2); + + for key in wuk.keys.iter().take(wuk.keys.len() - 1) { + bindings.push(key_to_span(key)); + bindings.push(", ".into()); + } + + bindings.push("or".into()); + bindings.push(key_to_span(wuk.keys.last().unwrap())); + + bindings + } + }; + + bindings.push(Span::from(format!(" {}", wuk.description))); + + lines.push(Line::from(bindings)); + } + + Text::from(lines) +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/connect_page.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/connect_page.rs new file mode 100644 index 0000000..f16ca14 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/connect_page.rs @@ -0,0 +1,186 @@ +use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers}; +use ratatui::{prelude::*, widgets::*, Frame}; +use tokio::sync::mpsc::UnboundedSender; + +use crate::state_store::ServerConnectionStatus; +use crate::state_store::{action::Action, State}; + +use crate::ui_management::components::input_box; +use crate::ui_management::components::{input_box::InputBox, Component, ComponentRender}; + +struct Props { + error_message: Option, +} + +impl From<&State> for Props { + fn from(state: &State) -> Self { + Props { + error_message: if let ServerConnectionStatus::Errored { err } = + &state.server_connection_status + { + Some(err.to_string()) + } else { + None + }, + } + } +} + +/// ConnectPage handles the connection to the server +pub struct ConnectPage { + /// Action sender + pub action_tx: UnboundedSender, + // Mapped Props from State + props: Props, + // Internal Components + input_box: InputBox, +} + +impl ConnectPage { + fn connect_to_server(&mut self) { + if self.input_box.is_empty() { + return; + } + + let _ = self.action_tx.send(Action::ConnectToServerRequest { + addr: self.input_box.text().to_string(), + }); + } +} + +const DEFAULT_SERVER_ADDR: &str = "localhost:8080"; + +impl Component for ConnectPage { + fn new(state: &State, action_tx: UnboundedSender) -> Self + where + Self: Sized, + { + let mut input_box = InputBox::new(state, action_tx.clone()); + input_box.set_text(DEFAULT_SERVER_ADDR); + + ConnectPage { + action_tx: action_tx.clone(), + // + props: Props::from(state), + // + input_box, + } + .move_with_state(state) + } + + fn move_with_state(self, state: &State) -> Self + where + Self: Sized, + { + ConnectPage { + props: Props::from(state), + ..self + } + } + + fn name(&self) -> &str { + "Connect Page" + } + + fn handle_key_event(&mut self, key: KeyEvent) { + self.input_box.handle_key_event(key); + + if key.kind != KeyEventKind::Press { + return; + } + + match key.code { + KeyCode::Enter => { + self.connect_to_server(); + } + KeyCode::Char('q') => { + let _ = self.action_tx.send(Action::Exit); + } + KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => { + let _ = self.action_tx.send(Action::Exit); + } + _ => {} + } + } +} + +impl ComponentRender<()> for ConnectPage { + fn render(&self, frame: &mut Frame, _props: ()) { + let [_, vertical_centered, _] = *Layout::default() + .direction(Direction::Vertical) + .constraints( + [ + Constraint::Ratio(1, 3), + Constraint::Min(1), + Constraint::Ratio(1, 3), + ] + .as_ref(), + ) + .split(frame.area()) + else { + panic!("The main layout should have 3 chunks") + }; + + let [_, both_centered, _] = *Layout::default() + .direction(Direction::Horizontal) + .constraints( + [ + Constraint::Ratio(1, 3), + Constraint::Min(1), + Constraint::Ratio(1, 3), + ] + .as_ref(), + ) + .split(vertical_centered) + else { + panic!("The horizontal layout should have 3 chunks") + }; + + let [container_addr_input, container_help_text, container_error_message] = + *Layout::default() + .direction(Direction::Vertical) + .constraints( + [ + Constraint::Length(3), + Constraint::Length(3), + Constraint::Min(1), + ] + .as_ref(), + ) + .split(both_centered) + else { + panic!("The left layout should have 3 chunks") + }; + + self.input_box.render( + frame, + input_box::RenderProps { + title: "Server Host and Port".into(), + area: container_addr_input, + border_color: Color::Yellow, + show_cursor: true, + }, + ); + + let help_text = Paragraph::new(Text::from(Line::from(vec![ + "Press ".into(), + "".bold(), + " to connect".into(), + ]))); + frame.render_widget(help_text, container_help_text); + + let error_message = Paragraph::new(if let Some(err) = self.props.error_message.as_ref() { + Text::from(format!("Error: {}", err.as_str())) + } else { + Text::from("") + }) + .wrap(Wrap { trim: true }) + .style( + Style::default() + .fg(Color::Red) + .add_modifier(Modifier::SLOW_BLINK | Modifier::ITALIC), + ); + + frame.render_widget(error_message, container_error_message); + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/mod.rs new file mode 100644 index 0000000..d49052c --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/connect_page/mod.rs @@ -0,0 +1,4 @@ +#[allow(clippy::module_inception)] +mod connect_page; + +pub use connect_page::ConnectPage; diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/mod.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/mod.rs new file mode 100644 index 0000000..2f42dd8 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/pages/mod.rs @@ -0,0 +1,100 @@ +use crossterm::event::KeyEvent; +use ratatui::Frame; +use tokio::sync::mpsc::UnboundedSender; + +use crate::state_store::{action::Action, ServerConnectionStatus, State}; + +use self::{chat_page::ChatPage, connect_page::ConnectPage}; + +use super::components::{Component, ComponentRender}; + +mod chat_page; +mod connect_page; + +enum ActivePage { + ChatPage, + ConnectPage, +} + +struct Props { + active_page: ActivePage, +} + +impl From<&State> for Props { + fn from(state: &State) -> Self { + Props { + active_page: match state.server_connection_status { + ServerConnectionStatus::Connected { .. } => ActivePage::ChatPage, + _ => ActivePage::ConnectPage, + }, + } + } +} + +pub struct AppRouter { + props: Props, + // + chat_page: ChatPage, + connect_page: ConnectPage, +} + +impl AppRouter { + fn get_active_page_component(&self) -> &dyn Component { + match self.props.active_page { + ActivePage::ChatPage => &self.chat_page, + ActivePage::ConnectPage => &self.connect_page, + } + } + + fn get_active_page_component_mut(&mut self) -> &mut dyn Component { + match self.props.active_page { + ActivePage::ChatPage => &mut self.chat_page, + ActivePage::ConnectPage => &mut self.connect_page, + } + } +} + +impl Component for AppRouter { + fn new(state: &State, action_tx: UnboundedSender) -> Self + where + Self: Sized, + { + AppRouter { + props: Props::from(state), + // + chat_page: ChatPage::new(state, action_tx.clone()), + connect_page: ConnectPage::new(state, action_tx.clone()), + } + .move_with_state(state) + } + + fn move_with_state(self, state: &State) -> Self + where + Self: Sized, + { + AppRouter { + props: Props::from(state), + // + chat_page: self.chat_page.move_with_state(state), + connect_page: self.connect_page.move_with_state(state), + } + } + + // route all functions to the active page + fn name(&self) -> &str { + self.get_active_page_component().name() + } + + fn handle_key_event(&mut self, key: KeyEvent) { + self.get_active_page_component_mut().handle_key_event(key) + } +} + +impl ComponentRender<()> for AppRouter { + fn render(&self, frame: &mut Frame, props: ()) { + match self.props.active_page { + ActivePage::ChatPage => self.chat_page.render(frame, props), + ActivePage::ConnectPage => self.connect_page.render(frame, props), + } + } +} diff --git a/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/ui_manager.rs b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/ui_manager.rs new file mode 100644 index 0000000..42b8430 --- /dev/null +++ b/spring-2025/sen-109/00010/rust-chat-server/tui/src/ui_management/ui_manager.rs @@ -0,0 +1,112 @@ +use std::{ + io::{self, Stdout}, + time::Duration, +}; + +use anyhow::Context; +use crossterm::{ + event::{DisableMouseCapture, EnableMouseCapture, Event, EventStream}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +}; +use ratatui::prelude::*; +use tokio::sync::{ + broadcast, + mpsc::{self, UnboundedReceiver}, +}; +use tokio_stream::StreamExt; + +use crate::{ + state_store::{action::Action, State}, + ui_management::components::{Component, ComponentRender}, + Interrupted, +}; + +use super::pages::AppRouter; + +const RENDERING_TICK_RATE: Duration = Duration::from_millis(250); + +pub struct UiManager { + action_tx: mpsc::UnboundedSender, +} + +impl UiManager { + pub fn new() -> (Self, UnboundedReceiver) { + let (action_tx, action_rx) = mpsc::unbounded_channel(); + + (Self { action_tx }, action_rx) + } + + pub async fn main_loop( + self, + mut state_rx: UnboundedReceiver, + mut interrupt_rx: broadcast::Receiver, + ) -> anyhow::Result { + // consume the first state to initialize the ui app + let mut app_router = { + let state = state_rx.recv().await.unwrap(); + + AppRouter::new(&state, self.action_tx.clone()) + }; + + let mut terminal = setup_terminal()?; + let mut ticker = tokio::time::interval(RENDERING_TICK_RATE); + let mut crossterm_events = EventStream::new(); + + let result: anyhow::Result = loop { + tokio::select! { + // Tick to terminate the select every N milliseconds + _ = ticker.tick() => (), + // Catch and handle crossterm events + maybe_event = crossterm_events.next() => match maybe_event { + Some(Ok(Event::Key(key))) => { + app_router.handle_key_event(key); + }, + None => break Ok(Interrupted::UserInt), + _ => (), + }, + // Handle state updates + Some(state) = state_rx.recv() => { + app_router = app_router.move_with_state(&state); + }, + // Catch and handle interrupt signal to gracefully shutdown + Ok(interrupted) = interrupt_rx.recv() => { + break Ok(interrupted); + } + } + + if let Err(err) = terminal + .draw(|frame| app_router.render(frame, ())) + .context("could not render to the terminal") + { + break Err(err); + } + }; + + restore_terminal(&mut terminal)?; + + result + } +} + +fn setup_terminal() -> anyhow::Result>> { + let mut stdout = io::stdout(); + + enable_raw_mode()?; + + execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; + + Ok(Terminal::new(CrosstermBackend::new(stdout))?) +} + +fn restore_terminal(terminal: &mut Terminal>) -> anyhow::Result<()> { + disable_raw_mode()?; + + execute!( + terminal.backend_mut(), + LeaveAlternateScreen, + DisableMouseCapture + )?; + + Ok(terminal.show_cursor()?) +}