# bikhizlit/travel-app-socket architecture

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

- Interactive diagram: https://gitdiagram.com/bikhizlit/travel-app-socket
- Repository: https://github.com/bikhizlit/travel-app-socket

## Overview

This is a Socket.IO backend for a travel app, centered on authenticated real-time conversation, messaging, and presence. Clients connect through the socket server; conversation actions check participant records, messages are persisted and broadcast to conversation rooms, and presence changes are shared across those rooms. A separate authenticated internal endpoint emits events to user rooms. The README documents no further product capabilities; Match and User-related entity files indicate domain state, but matching behavior is not present in the sampled handlers.

Main entry points: [`src/socket/index.ts`](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/index.ts) (Socket server), [`src/socket/handlers/message.handlers.ts`](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/message.handlers.ts) (Message handlers), [`src/socket/handlers/presence.handlers.ts`](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/presence.handlers.ts) (Presence handlers), [`src/socket/rooms.ts`](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/rooms.ts) (Room addressing)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Service runtime"]
  node_server["HTTP bootstrap<br/>[server.ts]"]
  node_app["Express app<br/>[app.ts]"]
  node_health["Health endpoint<br/>[health.routes.ts]"]
end

subgraph group_realtime["Realtime features"]
  node_socket["Socket server<br/>[index.ts]"]
  node_auth_middleware["Socket authentication"]
  node_jwt["JWT verification<br/>[jwt.ts]"]
  node_conversation_handlers["Conversation handlers"]
  node_message_handlers["Message handlers"]
  node_presence_handlers["Presence handlers"]
  node_presence_state["Connection presence<br/>[presence.ts]"]
  node_socket_rooms["Room addressing<br/>[rooms.ts]"]
end

subgraph group_internal["Internal events"]
  node_internal_router["Internal emit API<br/>[router.ts]"]
  node_internal_events["Event allowlist<br/>[events.ts]"]
end

subgraph group_domain["Domain state"]
  node_data_source["Database connection<br/>[data-source.ts]"]
  node_database[("MySQL database")]
  node_user_entity["User records<br/>[User.entity.ts]"]
  node_conversation_entity["Conversation records"]
  node_participant_entity["Participant records"]
  node_message_entity["Message records<br/>[Message.entity.ts]"]
  node_match_entity["Match records<br/>[Match.entity.ts]"]
end

node_client(("Realtime client"))
node_internal_sender(("Internal caller"))

node_client -->|"connects"| node_socket
node_server -->|"creates"| node_app
node_server -->|"initializes"| node_data_source
node_server -->|"starts"| node_socket
node_socket -->|"registers"| node_auth_middleware
node_auth_middleware -->|"verifies token"| node_jwt
node_socket -->|"registers"| node_conversation_handlers
node_socket -->|"registers"| node_message_handlers
node_socket -->|"registers"| node_presence_handlers
node_socket -->|"tracks connections"| node_presence_state
node_socket -->|"addresses rooms"| node_socket_rooms
node_conversation_handlers -->|"checks membership"| node_participant_entity
node_conversation_handlers -->|"requests snapshot"| node_presence_handlers
node_conversation_handlers -->|"joins room"| node_socket_rooms
node_message_handlers -->|"checks membership"| node_participant_entity
node_message_handlers -->|"persists message"| node_message_entity
node_message_handlers -->|"updates timestamp"| node_conversation_entity
node_message_handlers -->|"broadcasts message"| node_socket_rooms
node_presence_handlers -->|"reads participants"| node_participant_entity
node_presence_handlers -->|"reads status"| node_presence_state
node_presence_handlers -->|"broadcasts status"| node_socket_rooms
node_app -->|"mounts route"| node_internal_router
node_internal_sender -->|"requests emission"| node_internal_router
node_internal_router -->|"validates event"| node_internal_events
node_internal_router -->|"targets user room"| node_socket_rooms
node_app -->|"checks database"| node_data_source
node_data_source -->|"connects"| node_database
node_message_entity -->|"stored in"| node_database
node_conversation_entity -->|"stored in"| node_database
node_participant_entity -->|"stored in"| node_database
node_user_entity -->|"stored in"| node_database
node_match_entity -->|"stored in"| node_database

click node_server "https://github.com/bikhizlit/travel-app-socket/blob/main/src/server.ts"
click node_app "https://github.com/bikhizlit/travel-app-socket/blob/main/src/app.ts"
click node_socket "https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/index.ts"
click node_auth_middleware "https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/middleware/socket-auth.middleware.ts"
click node_jwt "https://github.com/bikhizlit/travel-app-socket/blob/main/src/auth/jwt.ts"
click node_conversation_handlers "https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/conversation.handlers.ts"
click node_message_handlers "https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/message.handlers.ts"
click node_presence_handlers "https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/presence.handlers.ts"
click node_presence_state "https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/presence.ts"
click node_socket_rooms "https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/rooms.ts"
click node_internal_router "https://github.com/bikhizlit/travel-app-socket/blob/main/src/internal/router.ts"
click node_internal_events "https://github.com/bikhizlit/travel-app-socket/blob/main/src/internal/events.ts"
click node_health "https://github.com/bikhizlit/travel-app-socket/blob/main/src/health/health.routes.ts"
click node_data_source "https://github.com/bikhizlit/travel-app-socket/blob/main/src/db/data-source.ts"
click node_user_entity "https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/User.entity.ts"
click node_conversation_entity "https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/Conversation.entity.ts"
click node_participant_entity "https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/ConversationParticipant.entity.ts"
click node_message_entity "https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/Message.entity.ts"
click node_match_entity "https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/Match.entity.ts"

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_server,node_app,node_health,node_client toneBlue
class node_socket,node_auth_middleware,node_jwt,node_conversation_handlers,node_message_handlers,node_presence_handlers,node_presence_state,node_socket_rooms toneAmber
class node_internal_router,node_internal_events toneMint
class node_data_source,node_database,node_user_entity,node_conversation_entity,node_participant_entity,node_message_entity,node_match_entity toneRose
class node_internal_sender toneIndigo
```

## Components

### Service runtime

- [HTTP bootstrap](https://github.com/bikhizlit/travel-app-socket/blob/main/src/server.ts): `src/server.ts`
- [Express app](https://github.com/bikhizlit/travel-app-socket/blob/main/src/app.ts): `src/app.ts`
- [Health endpoint](https://github.com/bikhizlit/travel-app-socket/blob/main/src/health/health.routes.ts): `src/health/health.routes.ts`

### Realtime features

- [Socket server](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/index.ts): `src/socket/index.ts`
- [Socket authentication](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/middleware/socket-auth.middleware.ts): `src/socket/middleware/socket-auth.middleware.ts`
- [JWT verification](https://github.com/bikhizlit/travel-app-socket/blob/main/src/auth/jwt.ts): `src/auth/jwt.ts`
- [Conversation handlers](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/conversation.handlers.ts): `src/socket/handlers/conversation.handlers.ts`
- [Message handlers](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/message.handlers.ts): `src/socket/handlers/message.handlers.ts`
- [Presence handlers](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/handlers/presence.handlers.ts): `src/socket/handlers/presence.handlers.ts`
- [Connection presence](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/presence.ts): `src/socket/presence.ts`
- [Room addressing](https://github.com/bikhizlit/travel-app-socket/blob/main/src/socket/rooms.ts): `src/socket/rooms.ts`

### Internal events

- [Internal emit API](https://github.com/bikhizlit/travel-app-socket/blob/main/src/internal/router.ts): `src/internal/router.ts`
- [Event allowlist](https://github.com/bikhizlit/travel-app-socket/blob/main/src/internal/events.ts): `src/internal/events.ts`

### Domain state

- [Database connection](https://github.com/bikhizlit/travel-app-socket/blob/main/src/db/data-source.ts): `src/db/data-source.ts`
- **MySQL database**
- [User records](https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/User.entity.ts): `src/entities/User.entity.ts`
- [Conversation records](https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/Conversation.entity.ts): `src/entities/Conversation.entity.ts`
- [Participant records](https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/ConversationParticipant.entity.ts): `src/entities/ConversationParticipant.entity.ts`
- [Message records](https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/Message.entity.ts): `src/entities/Message.entity.ts`
- [Match records](https://github.com/bikhizlit/travel-app-socket/blob/main/src/entities/Match.entity.ts): `src/entities/Match.entity.ts`

### Other components

- **Realtime client**
- **Internal caller**

## Connections

- Realtime client → Socket server: connects
- HTTP bootstrap → Express app: creates
- HTTP bootstrap → Database connection: initializes
- HTTP bootstrap → Socket server: starts
- Socket server → Socket authentication: registers
- Socket authentication → JWT verification: verifies token
- Socket server → Conversation handlers: registers
- Socket server → Message handlers: registers
- Socket server → Presence handlers: registers
- Socket server → Connection presence: tracks connections
- Socket server → Room addressing: addresses rooms
- Conversation handlers → Participant records: checks membership
- Conversation handlers → Presence handlers: requests snapshot
- Conversation handlers → Room addressing: joins room
- Message handlers → Participant records: checks membership
- Message handlers → Message records: persists message
- Message handlers → Conversation records: updates timestamp
- Message handlers → Room addressing: broadcasts message
- Presence handlers → Participant records: reads participants
- Presence handlers → Connection presence: reads status
- Presence handlers → Room addressing: broadcasts status
- Express app → Internal emit API: mounts route
- Internal caller → Internal emit API: requests emission
- Internal emit API → Event allowlist: validates event
- Internal emit API → Room addressing: targets user room
- Express app → Database connection: checks database
- Database connection → MySQL database: connects
- Message records → MySQL database: stored in
- Conversation records → MySQL database: stored in
- Participant records → MySQL database: stored in
- User records → MySQL database: stored in
- Match records → MySQL database: stored in
