# dangduc689/e2ee-system architecture

> Architecture diagram of the GitHub repository dangduc689/e2ee-system, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dangduc689/e2ee-system
- Repository: https://github.com/dangduc689/e2ee-system

## Overview

This is a Java Swing, end-to-end encrypted 1–1 and group chat system. A user composes a message in the client UI; the controller coordinates encryption and sends an envelope over TCP to the server, which authenticates the session and routes the opaque message to recipients or queues it for offline delivery. Client-side identity, peer trust, group state, presence, and offline synchronization support that workflow. The graph also shows protocol/transport and server operations. Relationships for unsampled modules rely on SOURCE INDEX references or README claims, not inspection of their implementations.

Main entry points: [`src/e2ee/client/ChatClientController.java`](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/ChatClientController.java) (Client controller), [`src/e2ee/server/ClientHandler.java`](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ClientHandler.java) (Session handler), [`src/e2ee/common/net/SocketPacketChannel.java`](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/net/SocketPacketChannel.java) (TCP packet channel), [`src/e2ee/server/OfflineQueueRouter.java`](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/OfflineQueueRouter.java) (Offline routing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client experience"]
  node_ui["Chat UI<br/>[ChatFrame.java]"]
  node_login["Login UI<br/>[LoginFrame.java]"]
  node_controller["Client controller"]
end

subgraph group_security["Client security"]
  node_identity[("Identity store")]
  node_trust[("Peer trust")]
  node_groupstate[("Client group state")]
  node_crypto["Message crypto"]
  node_cryptoengine["Crypto engine"]
  node_groupcrypto["Group crypto"]
  node_offlinesync["Offline sync"]
end

subgraph group_server["Server messaging"]
  node_server["Chat server<br/>[ServerMain.java]"]
  node_handler["Session handler<br/>[ClientHandler.java]"]
  node_presence["Presence dispatch"]
  node_router["Message routing"]
  node_grouprouter["Group routing<br/>[GroupRouter.java]"]
  node_groupstore[("Server group store")]
  node_offlinerouter["Offline routing"]
  node_offlinequeue[("Offline queue")]
  node_dashboard["Server dashboard"]
end

subgraph group_shared["Protocol and transport"]
  node_envelope["Message envelope<br/>[Envelope.java]"]
  node_socket["TCP packet channel"]
  node_mapper["Envelope codec"]
  node_frame["TCP framing<br/>[FrameCodec.java]"]
  node_json["JSON parser<br/>[MiniJson.java]"]
end

node_user(("Chat user"))

node_user -->|"uses"| node_ui
node_user -->|"signs in"| node_login
node_ui -->|"invokes"| node_controller
node_login -.->|"starts session"| node_controller
node_controller -->|"loads identity"| node_identity
node_controller -->|"checks peer trust"| node_trust
node_controller -->|"uses group state"| node_groupstate
node_controller -->|"encrypts and decrypts"| node_crypto
node_crypto -->|"uses primitives"| node_cryptoengine
node_controller -->|"handles group messages"| node_groupcrypto
node_controller -->|"syncs offline messages"| node_offlinesync
node_controller -->|"sends and receives"| node_socket
node_socket -->|"serializes envelopes"| node_mapper
node_socket -->|"frames payloads"| node_frame
node_mapper -->|"encodes JSON"| node_json
node_controller -->|"builds protocol messages"| node_envelope
node_socket -->|"connects by TCP"| node_server
node_server -->|"creates sessions"| node_handler
node_handler -->|"updates presence"| node_presence
node_handler -->|"routes messages"| node_router
node_handler -->|"dispatches group traffic"| node_grouprouter
node_handler -->|"dispatches offline traffic"| node_offlinerouter
node_grouprouter -->|"uses group records"| node_groupstore
node_offlinerouter -->|"queues and retrieves"| node_offlinequeue
node_grouprouter -->|"queues undelivered messages"| node_offlinerouter
node_offlinerouter -->|"delivers to sessions"| node_handler
node_server -->|"opens dashboard"| node_dashboard
node_dashboard -->|"shows queue state"| node_offlinequeue

click node_ui "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/ui/ChatFrame.java"
click node_login "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/ui/LoginFrame.java"
click node_controller "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/ChatClientController.java"
click node_identity "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/identity/ClientIdentityStore.java"
click node_trust "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/security/LocalTrustStore.java"
click node_groupstate "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/security/ClientGroupStore.java"
click node_crypto "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/ClientCryptoService.java"
click node_cryptoengine "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/ClientCryptoEngine.java"
click node_groupcrypto "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/GroupCryptoService.java"
click node_offlinesync "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/OfflineSyncService.java"
click node_server "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ServerMain.java"
click node_handler "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ClientHandler.java"
click node_presence "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/PresenceDispatcher.java"
click node_router "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/Default1to1Router.java"
click node_grouprouter "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/GroupRouter.java"
click node_groupstore "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ServerGroupStore.java"
click node_offlinerouter "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/OfflineQueueRouter.java"
click node_offlinequeue "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/OfflineMessageQueue.java"
click node_dashboard "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ui/ServerDashboardFrame.java"
click node_envelope "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/contract/Envelope.java"
click node_socket "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/net/SocketPacketChannel.java"
click node_mapper "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/codec/EnvelopeMapper.java"
click node_frame "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/codec/FrameCodec.java"
click node_json "https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/json/MiniJson.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_ui,node_login,node_controller,node_user toneBlue
class node_identity,node_trust,node_groupstate,node_crypto,node_cryptoengine,node_groupcrypto,node_offlinesync toneAmber
class node_server,node_handler,node_presence,node_router,node_grouprouter,node_groupstore,node_offlinerouter,node_offlinequeue,node_dashboard toneMint
class node_envelope,node_socket,node_mapper,node_frame,node_json toneRose
```

## Components

### Client experience

- [Chat UI](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/ui/ChatFrame.java): `src/e2ee/client/ui/ChatFrame.java`
- [Login UI](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/ui/LoginFrame.java): `src/e2ee/client/ui/LoginFrame.java`
- [Client controller](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/ChatClientController.java): `src/e2ee/client/ChatClientController.java`

### Client security

- [Identity store](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/identity/ClientIdentityStore.java): `src/e2ee/client/identity/ClientIdentityStore.java`
- [Peer trust](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/security/LocalTrustStore.java): `src/e2ee/client/security/LocalTrustStore.java`
- [Client group state](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/security/ClientGroupStore.java): `src/e2ee/client/security/ClientGroupStore.java`
- [Message crypto](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/ClientCryptoService.java): `src/e2ee/client/crypto/ClientCryptoService.java`
- [Crypto engine](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/ClientCryptoEngine.java): `src/e2ee/client/crypto/ClientCryptoEngine.java`
- [Group crypto](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/GroupCryptoService.java): `src/e2ee/client/crypto/GroupCryptoService.java`
- [Offline sync](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/client/crypto/OfflineSyncService.java): `src/e2ee/client/crypto/OfflineSyncService.java`

### Server messaging

- [Chat server](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ServerMain.java): `src/e2ee/server/ServerMain.java`
- [Session handler](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ClientHandler.java): `src/e2ee/server/ClientHandler.java`
- [Presence dispatch](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/PresenceDispatcher.java): `src/e2ee/server/PresenceDispatcher.java`
- [Message routing](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/Default1to1Router.java): `src/e2ee/server/Default1to1Router.java`
- [Group routing](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/GroupRouter.java): `src/e2ee/server/GroupRouter.java`
- [Server group store](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ServerGroupStore.java): `src/e2ee/server/ServerGroupStore.java`
- [Offline routing](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/OfflineQueueRouter.java): `src/e2ee/server/OfflineQueueRouter.java`
- [Offline queue](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/OfflineMessageQueue.java): `src/e2ee/server/OfflineMessageQueue.java`
- [Server dashboard](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/server/ui/ServerDashboardFrame.java): `src/e2ee/server/ui/ServerDashboardFrame.java`

### Protocol and transport

- [Message envelope](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/contract/Envelope.java): `src/e2ee/common/contract/Envelope.java`
- [TCP packet channel](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/net/SocketPacketChannel.java): `src/e2ee/common/net/SocketPacketChannel.java`
- [Envelope codec](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/codec/EnvelopeMapper.java): `src/e2ee/common/codec/EnvelopeMapper.java`
- [TCP framing](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/codec/FrameCodec.java): `src/e2ee/common/codec/FrameCodec.java`
- [JSON parser](https://github.com/dangduc689/e2ee-system/blob/main/src/e2ee/common/json/MiniJson.java): `src/e2ee/common/json/MiniJson.java`

### Other components

- **Chat user**

## Connections

- Chat user → Chat UI: uses (evidence: `README.md`)
- Chat user → Login UI: signs in (evidence: `README.md`)
- Chat UI → Client controller: invokes (evidence: `src/e2ee/client/ui/ChatFrame.java`)
- Login UI → Client controller: starts session
- Client controller → Identity store: loads identity (evidence: `src/e2ee/client/ChatClientController.java`)
- Client controller → Peer trust: checks peer trust (evidence: `src/e2ee/client/ChatClientController.java`)
- Client controller → Client group state: uses group state (evidence: `src/e2ee/client/ChatClientController.java`)
- Client controller → Message crypto: encrypts and decrypts (evidence: `src/e2ee/client/ChatClientController.java`)
- Message crypto → Crypto engine: uses primitives (evidence: `src/e2ee/client/crypto/ClientCryptoService.java`)
- Client controller → Group crypto: handles group messages (evidence: `src/e2ee/client/ChatClientController.java`)
- Client controller → Offline sync: syncs offline messages (evidence: `src/e2ee/client/ChatClientController.java`)
- Client controller → TCP packet channel: sends and receives (evidence: `src/e2ee/client/ChatClientController.java`)
- TCP packet channel → Envelope codec: serializes envelopes (evidence: `src/e2ee/common/net/SocketPacketChannel.java`)
- TCP packet channel → TCP framing: frames payloads (evidence: `src/e2ee/common/net/SocketPacketChannel.java`)
- Envelope codec → JSON parser: encodes JSON (evidence: `src/e2ee/common/codec/EnvelopeMapper.java`)
- Client controller → Message envelope: builds protocol messages (evidence: `src/e2ee/client/ChatClientController.java`)
- TCP packet channel → Chat server: connects by TCP (evidence: `README.md`)
- Chat server → Session handler: creates sessions (evidence: `src/e2ee/server/ServerMain.java`)
- Session handler → Presence dispatch: updates presence (evidence: `src/e2ee/server/ClientHandler.java`)
- Session handler → Message routing: routes messages (evidence: `src/e2ee/server/ClientHandler.java`)
- Session handler → Group routing: dispatches group traffic (evidence: `src/e2ee/server/ClientHandler.java`)
- Session handler → Offline routing: dispatches offline traffic (evidence: `src/e2ee/server/ClientHandler.java`)
- Group routing → Server group store: uses group records (evidence: `src/e2ee/server/GroupRouter.java`)
- Offline routing → Offline queue: queues and retrieves (evidence: `src/e2ee/server/OfflineQueueRouter.java`)
- Group routing → Offline routing: queues undelivered messages (evidence: `src/e2ee/server/GroupRouter.java`)
- Offline routing → Session handler: delivers to sessions (evidence: `src/e2ee/server/OfflineQueueRouter.java`)
- Chat server → Server dashboard: opens dashboard (evidence: `src/e2ee/server/ServerMain.java`)
- Server dashboard → Offline queue: shows queue state (evidence: `src/e2ee/server/ui/ServerDashboardFrame.java`)
