Files
DorkNet/docs/architecture.md
T
Alexa bcc5fe1bcb Add initial documentation and structure for DorkNet project
- Create README.md for project overview and setup instructions
- Add admin-ui/README.md for admin UI details and development setup
- Introduce client-mod/README.md explaining the MelonLoader mod functionality
- Establish docker/README.md for Docker setup and configuration
- Create docs/README.md to index project documentation
- Implement advanced-setup.md for Docker stack configuration
- Document architecture in architecture.md
- Provide easy-setup.md for hosting instructions
- Add FAQ.md for common questions and legal considerations
- Create joining-a-server.md for player connection instructions
- Establish troubleshooting.md for common issues and resolutions
- Introduce easy-app/README.md for the unified desktop application
- Add server/README.md for ASP.NET Core backend details
- Document tools/README.md for CLI helper scripts
2026-05-21 13:26:46 +03:00

4.9 KiB

Architecture

┌──────────────────────────────────────────────────────────────────┐
│  Rec Room 2020.03.10 client (patched)                            │
│  ┌────────────────────┐    ┌──────────────────────────────────┐  │
│  │  IL2CPP game code  │    │  MelonLoader + client-mod        │  │
│  │  • set_BaseUri     │←───│  • rewrites *.rec.net hosts      │  │
│  │  • Photon client   │    │  • injects Photon AppId          │  │
│  │  • BouncyCastle TLS│    │  • bypasses TLS trust check      │  │
│  └─────────┬──────────┘    └──────────────────────────────────┘  │
└────────────┼─────────────────────────────────────────────────────┘
             │ HTTPS to *.your-server.example.com
             ▼
┌──────────────────────────────────────────────────────────────────┐
│  DorkNet server (ASP.NET Core)                                   │
│                                                                  │
│  Subdomain-multiplexed routing:                                  │
│    api.*       → REST endpoints (rooms, players, store, etc.)    │
│    auth.*      → OAuth-style /connect/token, /photon/customauth  │
│    accounts.*  → /account/bulk, /account/me, /account/{id}/bio   │
│    match.*     → /goto/room/*, /player/heartbeat, /roominstance/*│
│    chat.*      → /thread, /thread/{id}/message                   │
│    cdn.*       → static asset serving (room blobs, images)       │
│    notify.*    → SignalR hub for push notifications              │
│    img.*       → signed image fetch + on-the-fly resize          │
│    leaderboard.* → /leaderboard/SetStat, GetPlayerRank, etc.     │
│    admin.*     → React SPA + /api/admin/v1/*                     │
│                                                                  │
│  Storage:                                                        │
│    • Postgres (advanced mode) / SQLite (easy mode)               │
│    • Redis presence cache (advanced) / in-memory (easy)          │
│    • data/images/ — room thumbnails + player polaroids           │
└──────────────┬───────────────────────────────────────────────────┘
               │
               │   The server does NOT host Photon. Players' clients
               │   connect to Photon Cloud directly via the AppId
               │   the server hands them.
               ▼
┌──────────────────────────────────────────────────────────────────┐
│  Photon Cloud (external — Exit Games)                            │
│  Each Rec Room instance = one Photon room. Photon handles        │
│  realtime sync between clients in the same instance.             │
│  Server only touches Photon to authenticate connections via      │
│  /photon/customauth.                                             │
└──────────────────────────────────────────────────────────────────┘

Why subdomains?

The 2020 Rec Room client routes every request through a hardcoded service map (RecNet.Core.SendRequest(method, Service.Match, …)) that picks a host per service. We mirror the official *.rec.net layout so the watch's URI synthesis works unmodified after a single root-host rewrite by the client mod.

Why SignalR?

The 2020 client expects WebSocket push notifications from a long-poll-or- WebSocket "Notifications" service. SignalR's transport negotiation matches what the client expects after a small DTO-shape wrap; see Services/NotificationService.cs.

Why a separate Photon Cloud?

The 2020 build is tightly coupled to Photon Realtime SDK 4 — replacing it would mean shipping a custom game client. Using Photon Cloud as-is means clients talk peer-to-peer through Photon's relay; our server only witnesses the auth handshake. That's also why voice chat needs a Photon Voice AppId — voice runs through Photon Voice (a separate service from Photon Realtime).