# sabbir248/arenastrike architecture

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

- Interactive diagram: https://gitdiagram.com/sabbir248/arenastrike
- Repository: https://github.com/sabbir248/arenastrike

## Overview

ArenaStrike is a browser-based multiplayer arena shooter backed by a Spring Boot service. Players authenticate or use guest accounts, create or join a lobby, launch a match, and exchange movement and combat events over STOMP/WebSocket; the server maintains game state and verifies shots, then records match results for player statistics. The frontend renders the game and supplies audio. The README documents the stack but not product flows; edges below are limited to source-index references and shown calls/routes, so unsampled integrations are not inferred.

Main entry points: [`backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java`](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java) (Game state service), [`frontend/js/main.js`](https://github.com/sabbir248/arenastrike/blob/main/frontend/js/main.js) (Browser client), [`backend/src/main/java/com/arenastrike/lobby/service/LobbyService.java`](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/service/LobbyService.java) (Lobby service), [`backend/src/main/java/com/arenastrike/player/service/StatsService.java`](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/service/StatsService.java) (Stats service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Game client"]
  node_browser["Browser client<br/>[main.js]"]
  node_socket["STOMP client<br/>[stomp-client.js]"]
  node_renderer["Game renderer<br/>[renderer.js]"]
  node_audio["Sound manager<br/>[sound-manager.js]"]
end

subgraph group_identity["Identity and players"]
  node_auth["Auth endpoints"]
  node_oauth["OAuth endpoints"]
  node_jwt["JWT service<br/>[JwtService.java]"]
  node_playerservice["Player service<br/>[PlayerService.java]"]
  node_playerstore[("Player records")]
end

subgraph group_lobbies["Lobby management"]
  node_lobbyapi["Lobby API"]
  node_lobbyws["Lobby WebSocket"]
  node_lobbyservice["Lobby service<br/>[LobbyService.java]"]
  node_lobbystore[("Lobby records")]
end

subgraph group_match["Live match"]
  node_gameroomws["Game WebSocket"]
  node_gamestate["Game state service"]
  node_roomstate["Room state<br/>[GameRoomState.java]"]
  node_combat["Combat system"]
end

subgraph group_records["Stats and records"]
  node_statsapi["Stats endpoints"]
  node_statsservice["Stats service<br/>[StatsService.java]"]
  node_matchrecords[("Match history")]
end

node_player(("Player"))

node_player -->|"plays through"| node_browser
node_browser -->|"renders with"| node_renderer
node_browser -->|"connects through"| node_socket
node_browser -->|"plays effects"| node_audio
node_socket -->|"publishes commands"| node_gameroomws
node_socket -->|"publishes start"| node_lobbyws
node_player -->|"requests identity"| node_auth
node_auth -->|"issues tokens"| node_jwt
node_auth -->|"creates guest"| node_playerservice
node_oauth -->|"issues tokens"| node_jwt
node_oauth -->|"finds or creates"| node_playerservice
node_playerservice -->|"reads and writes"| node_playerstore
node_player -->|"creates or joins"| node_lobbyapi
node_lobbyapi -->|"validates token"| node_jwt
node_lobbyapi -->|"handles requests"| node_lobbyservice
node_lobbyws -->|"handles commands"| node_lobbyservice
node_lobbyservice -->|"reads and writes"| node_lobbystore
node_lobbyservice -->|"loads players"| node_playerstore
node_gameroomws -->|"dispatches commands"| node_gamestate
node_gamestate -->|"updates state"| node_roomstate
node_gamestate -->|"verifies shots"| node_combat
node_gamestate -->|"loads lobby"| node_lobbystore
node_player -->|"requests statistics"| node_statsapi
node_statsapi -->|"queries statistics"| node_statsservice
node_gamestate -->|"records match"| node_statsservice
node_statsservice -->|"updates player totals"| node_playerstore
node_statsservice -->|"saves match history"| node_matchrecords

click node_browser "https://github.com/sabbir248/arenastrike/blob/main/frontend/js/main.js"
click node_socket "https://github.com/sabbir248/arenastrike/blob/main/frontend/js/network/stomp-client.js"
click node_renderer "https://github.com/sabbir248/arenastrike/blob/main/frontend/js/game/renderer.js"
click node_audio "https://github.com/sabbir248/arenastrike/blob/main/frontend/js/audio/sound-manager.js"
click node_auth "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/auth/AuthController.java"
click node_oauth "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/auth/OAuthController.java"
click node_jwt "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/auth/JwtService.java"
click node_playerservice "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/service/PlayerService.java"
click node_playerstore "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/repository/PlayerRepository.java"
click node_lobbyapi "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/controller/LobbyController.java"
click node_lobbyws "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/controller/LobbyWebSocketController.java"
click node_lobbyservice "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/service/LobbyService.java"
click node_lobbystore "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/repository/LobbyRepository.java"
click node_gameroomws "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/realtime/controller/GameRoomWebSocketController.java"
click node_gamestate "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java"
click node_roomstate "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/realtime/service/GameRoomState.java"
click node_combat "https://github.com/sabbir248/arenastrike/tree/main/backend/src/main/java/com/arenastrike/combat"
click node_statsapi "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/controller/StatsController.java"
click node_statsservice "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/service/StatsService.java"
click node_matchrecords "https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/match/repository/MatchHistoryRepository.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_browser,node_socket,node_renderer,node_audio toneBlue
class node_auth,node_oauth,node_jwt,node_playerservice,node_playerstore toneAmber
class node_lobbyapi,node_lobbyws,node_lobbyservice,node_lobbystore toneMint
class node_gameroomws,node_gamestate,node_roomstate,node_combat toneRose
class node_statsapi,node_statsservice,node_matchrecords,node_player toneIndigo
```

## Components

### Game client

- [Browser client](https://github.com/sabbir248/arenastrike/blob/main/frontend/js/main.js): `frontend/js/main.js`
- [STOMP client](https://github.com/sabbir248/arenastrike/blob/main/frontend/js/network/stomp-client.js): `frontend/js/network/stomp-client.js`
- [Game renderer](https://github.com/sabbir248/arenastrike/blob/main/frontend/js/game/renderer.js): `frontend/js/game/renderer.js`
- [Sound manager](https://github.com/sabbir248/arenastrike/blob/main/frontend/js/audio/sound-manager.js): `frontend/js/audio/sound-manager.js`

### Identity and players

- [Auth endpoints](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/auth/AuthController.java): `backend/src/main/java/com/arenastrike/auth/AuthController.java`
- [OAuth endpoints](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/auth/OAuthController.java): `backend/src/main/java/com/arenastrike/auth/OAuthController.java`
- [JWT service](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/auth/JwtService.java): `backend/src/main/java/com/arenastrike/auth/JwtService.java`
- [Player service](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/service/PlayerService.java): `backend/src/main/java/com/arenastrike/player/service/PlayerService.java`
- [Player records](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/repository/PlayerRepository.java): `backend/src/main/java/com/arenastrike/player/repository/PlayerRepository.java`

### Lobby management

- [Lobby API](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/controller/LobbyController.java): `backend/src/main/java/com/arenastrike/lobby/controller/LobbyController.java`
- [Lobby WebSocket](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/controller/LobbyWebSocketController.java): `backend/src/main/java/com/arenastrike/lobby/controller/LobbyWebSocketController.java`
- [Lobby service](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/service/LobbyService.java): `backend/src/main/java/com/arenastrike/lobby/service/LobbyService.java`
- [Lobby records](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/lobby/repository/LobbyRepository.java): `backend/src/main/java/com/arenastrike/lobby/repository/LobbyRepository.java`

### Live match

- [Game WebSocket](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/realtime/controller/GameRoomWebSocketController.java): `backend/src/main/java/com/arenastrike/realtime/controller/GameRoomWebSocketController.java`
- [Game state service](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java): `backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java`
- [Room state](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/realtime/service/GameRoomState.java): `backend/src/main/java/com/arenastrike/realtime/service/GameRoomState.java`
- [Combat system](https://github.com/sabbir248/arenastrike/tree/main/backend/src/main/java/com/arenastrike/combat): `backend/src/main/java/com/arenastrike/combat`

### Stats and records

- [Stats endpoints](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/controller/StatsController.java): `backend/src/main/java/com/arenastrike/player/controller/StatsController.java`
- [Stats service](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/player/service/StatsService.java): `backend/src/main/java/com/arenastrike/player/service/StatsService.java`
- [Match history](https://github.com/sabbir248/arenastrike/blob/main/backend/src/main/java/com/arenastrike/match/repository/MatchHistoryRepository.java): `backend/src/main/java/com/arenastrike/match/repository/MatchHistoryRepository.java`

### Other components

- **Player**

## Connections

- Player → Browser client: plays through
- Browser client → Game renderer: renders with (evidence: `frontend/js/main.js`)
- Browser client → STOMP client: connects through (evidence: `frontend/js/main.js`)
- Browser client → Sound manager: plays effects (evidence: `frontend/js/main.js`)
- STOMP client → Game WebSocket: publishes commands (evidence: `frontend/js/network/stomp-client.js`)
- STOMP client → Lobby WebSocket: publishes start (evidence: `frontend/js/network/stomp-client.js`)
- Player → Auth endpoints: requests identity
- Auth endpoints → JWT service: issues tokens (evidence: `backend/src/main/java/com/arenastrike/auth/AuthController.java`)
- Auth endpoints → Player service: creates guest (evidence: `backend/src/main/java/com/arenastrike/auth/AuthController.java`)
- OAuth endpoints → JWT service: issues tokens (evidence: `backend/src/main/java/com/arenastrike/auth/OAuthController.java`)
- OAuth endpoints → Player service: finds or creates (evidence: `backend/src/main/java/com/arenastrike/auth/OAuthController.java`)
- Player service → Player records: reads and writes (evidence: `backend/src/main/java/com/arenastrike/player/service/PlayerService.java`)
- Player → Lobby API: creates or joins
- Lobby API → JWT service: validates token (evidence: `backend/src/main/java/com/arenastrike/lobby/controller/LobbyController.java`)
- Lobby API → Lobby service: handles requests (evidence: `backend/src/main/java/com/arenastrike/lobby/controller/LobbyController.java`)
- Lobby WebSocket → Lobby service: handles commands (evidence: `backend/src/main/java/com/arenastrike/lobby/controller/LobbyWebSocketController.java`)
- Lobby service → Lobby records: reads and writes (evidence: `backend/src/main/java/com/arenastrike/lobby/service/LobbyService.java`)
- Lobby service → Player records: loads players (evidence: `backend/src/main/java/com/arenastrike/lobby/service/LobbyService.java`)
- Game WebSocket → Game state service: dispatches commands (evidence: `backend/src/main/java/com/arenastrike/realtime/controller/GameRoomWebSocketController.java`)
- Game state service → Room state: updates state (evidence: `backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java`)
- Game state service → Combat system: verifies shots (evidence: `backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java`)
- Game state service → Lobby records: loads lobby (evidence: `backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java`)
- Player → Stats endpoints: requests statistics
- Stats endpoints → Stats service: queries statistics (evidence: `backend/src/main/java/com/arenastrike/player/controller/StatsController.java`)
- Game state service → Stats service: records match (evidence: `backend/src/main/java/com/arenastrike/realtime/service/GameStateService.java`)
- Stats service → Player records: updates player totals (evidence: `backend/src/main/java/com/arenastrike/player/service/StatsService.java`)
- Stats service → Match history: saves match history (evidence: `backend/src/main/java/com/arenastrike/player/service/StatsService.java`)
