283
docs/ARCHITECTURE.md
Archivo normal
283
docs/ARCHITECTURE.md
Archivo normal
@@ -0,0 +1,283 @@
|
||||
# System Architecture
|
||||
|
||||
## Overview Diagram
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ XMPP Clients │
|
||||
│ (Gajim, Pidgin, Conversations, Web Clients, Bots, etc.) │
|
||||
└────┬─────────────┬──────────────┬──────────────┬────────────────────┘
|
||||
│ │ │ │
|
||||
│ TCP/TLS │ HTTP │ WebSocket │ Components
|
||||
│ :5222 │ :5280 │ :5281 │ :5347
|
||||
│ │ │ │
|
||||
┌────▼─────────────▼──────────────▼──────────────▼────────────────────┐
|
||||
│ Network Layer │
|
||||
├────────────────────────────────────────────────────────────────────┤
|
||||
│ ┌──────────┐ ┌───────────┐ ┌────────────┐ ┌─────────────────┐│
|
||||
│ │ C2S │ │ BOSH │ │ WebSocket │ │ Component ││
|
||||
│ │ Server │ │ Server │ │ Server │ │ Server ││
|
||||
│ └────┬─────┘ └─────┬─────┘ └──────┬─────┘ └────────┬────────┘│
|
||||
└───────┼──────────────┼────────────────┼─────────────────┼─────────┘
|
||||
│ │ │ │
|
||||
└──────────────┴────────────────┴─────────────────┘
|
||||
│
|
||||
┌─────────────────────────────▼─────────────────────────────────────┐
|
||||
│ XMPP Stream Handler │
|
||||
│ • Stream Negotiation • SASL Auth • Resource Binding │
|
||||
└─────────────────────────────┬─────────────────────────────────────┘
|
||||
│
|
||||
┌─────────────────────────────▼─────────────────────────────────────┐
|
||||
│ Session Manager │
|
||||
│ • Session Creation • JID Mapping • Authentication │
|
||||
│ • Priority Handling • Presence • Cleanup │
|
||||
└─────────────────────────────┬─────────────────────────────────────┘
|
||||
│
|
||||
┌─────────────────────────────▼─────────────────────────────────────┐
|
||||
│ Stanza Router │
|
||||
│ • Message Routing • Presence Broadcasting • IQ Handling │
|
||||
│ • Filtering • Event Hooks • Error Handling │
|
||||
└──────┬──────────────────────┬──────────────────────┬──────────────┘
|
||||
│ │ │
|
||||
│ │ │
|
||||
┌──────▼──────┐ ┌─────────▼────────┐ ┌────────▼──────────┐
|
||||
│ Module │ │ Host │ │ Storage │
|
||||
│ Manager │ │ Manager │ │ Manager │
|
||||
│ │ │ │ │ │
|
||||
│ • Dynamic │ │ • Virtual Hosts │ │ • Backends │
|
||||
│ Loading │ │ • Multi-domain │ │ • Per-host │
|
||||
│ • Hooks │ │ • Config │ │ • Abstraction │
|
||||
└──────┬──────┘ └─────────┬────────┘ └────────┬─────────┘
|
||||
│ │ │
|
||||
└─────────────────────┴──────────────────────┘
|
||||
│
|
||||
┌────────────────┴────────────────┐
|
||||
│ │
|
||||
┌───────────▼──────────┐ ┌──────────▼──────────┐
|
||||
│ Modules (Plugins) │ │ Storage Backends │
|
||||
├──────────────────────┤ ├─────────────────────┤
|
||||
│ • mod_roster │ │ • Memory │
|
||||
│ • mod_disco │ │ • File │
|
||||
│ • mod_presence │ │ • PostgreSQL │
|
||||
│ • mod_message │ │ • MongoDB │
|
||||
│ • mod_mam │ │ • Redis Cache │
|
||||
│ • mod_muc │ └─────────────────────┘
|
||||
│ • mod_pubsub │
|
||||
│ • ... (extensible) │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
## Component Interaction Flow
|
||||
|
||||
### Client Connection Flow
|
||||
|
||||
```
|
||||
Client C2S Server XMPP Stream Session Mgr
|
||||
│ │ │ │
|
||||
│─── TCP Connect ────────> │ │
|
||||
│ │ │ │
|
||||
│ │─── Create Stream ───>│ │
|
||||
│ │ │ │
|
||||
│<──── Stream Start ─────│<────────────────────│ │
|
||||
│ │ │ │
|
||||
│─── SASL Auth ─────────>│─────────────────────>│ │
|
||||
│ │ │ │
|
||||
│<──── Auth Success ─────│<────────────────────│ │
|
||||
│ │ │ │
|
||||
│─── Bind Resource ─────>│─────────────────────>│─── Create ──────>│
|
||||
│ │ │ Session │
|
||||
│ │ │ │
|
||||
│<──── Bound JID ────────│<────────────────────│<─── Authenticate ─│
|
||||
│ │ │ │
|
||||
│─── Send Presence ─────>│ │ │
|
||||
│ │ │ │
|
||||
● ● ● ●
|
||||
Connected and Ready
|
||||
```
|
||||
|
||||
### Message Routing Flow
|
||||
|
||||
```
|
||||
Sender Stanza Router Session Mgr Recipient
|
||||
│ │ │ │
|
||||
│─── Send Message ──────>│ │ │
|
||||
│ │ │ │
|
||||
│ │─── Get Session ────>│ │
|
||||
│ │ by JID │ │
|
||||
│ │<──── Session ───────│ │
|
||||
│ │ │ │
|
||||
│ │───────── Route Message ──────────────>│
|
||||
│ │ │ │
|
||||
│ │<────── Delivered ───────────────────│
|
||||
│ │ │ │
|
||||
│<──── Receipt (opt) ────│ │ │
|
||||
```
|
||||
|
||||
### Module Hook Flow
|
||||
|
||||
```
|
||||
Event Stanza Router Module Manager Module
|
||||
│ │ │ │
|
||||
│─── Stanza Arrives ────>│ │ │
|
||||
│ │ │ │
|
||||
│ │─── Emit Event ─────>│ │
|
||||
│ │ (e.g., message) │ │
|
||||
│ │ │ │
|
||||
│ │ │─── Hook ─────>│
|
||||
│ │ │ Called │
|
||||
│ │ │ │
|
||||
│ │ │<── Process ───│
|
||||
│ │ │ Stanza │
|
||||
│ │ │ │
|
||||
│ │<─── Continue ───────│ │
|
||||
│ │ or Block │ │
|
||||
```
|
||||
|
||||
## Data Flow Layers
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Application Layer │
|
||||
│ (User Logic, Business Rules, Module Code) │
|
||||
└────────────────────────┬─────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────────▼─────────────────────────────────┐
|
||||
│ XMPP Protocol Layer │
|
||||
│ (Stanza Processing, Routing, Presence, Roster) │
|
||||
└────────────────────────┬─────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────────▼─────────────────────────────────┐
|
||||
│ Session Layer │
|
||||
│ (Authentication, Session Management, JID Mapping) │
|
||||
└────────────────────────┬─────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────────▼─────────────────────────────────┐
|
||||
│ Transport Layer │
|
||||
│ (TCP, TLS, HTTP, WebSocket) │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Storage Architecture
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Application Code │
|
||||
└────────────────────────┬────────────────────────────────┘
|
||||
│
|
||||
┌────────────────────────▼────────────────────────────────┐
|
||||
│ Storage Manager (Abstraction) │
|
||||
│ • getStore(host, name) │
|
||||
│ • Per-host isolation │
|
||||
└────────────────────────┬────────────────────────────────┘
|
||||
│
|
||||
┌────────────┴────────────┐
|
||||
│ │
|
||||
┌───────────▼──────────┐ ┌─────────▼─────────┐
|
||||
│ Store Interface │ │ Store Interface │
|
||||
│ (localhost:roster) │ │ (example.com:mam) │
|
||||
└───────────┬──────────┘ └─────────┬─────────┘
|
||||
│ │
|
||||
┌───────────▼────────────────────────▼─────────┐
|
||||
│ Storage Backend │
|
||||
│ ┌─────────┐ ┌──────────┐ ┌────────────┐ │
|
||||
│ │ Memory │ │ File │ │ Database │ │
|
||||
│ └─────────┘ └──────────┘ └────────────┘ │
|
||||
└──────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Security Layers
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Connection Security │
|
||||
│ • TLS/SSL Encryption │
|
||||
│ • Certificate Validation │
|
||||
└──────────────────┬──────────────────────────┘
|
||||
│
|
||||
┌──────────────────▼──────────────────────────┐
|
||||
│ Authentication Security │
|
||||
│ • SASL Mechanisms │
|
||||
│ • Credential Validation │
|
||||
│ • Session Tokens │
|
||||
└──────────────────┬──────────────────────────┘
|
||||
│
|
||||
┌──────────────────▼──────────────────────────┐
|
||||
│ Application Security │
|
||||
│ • Rate Limiting │
|
||||
│ • Connection Limits │
|
||||
│ • Input Validation │
|
||||
│ • ACL/Permissions │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Event-Driven Architecture
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ Events │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌────────────────────┼────────────────────┐
|
||||
│ │ │
|
||||
┌─────▼──────┐ ┌────────▼────────┐ ┌──────▼──────┐
|
||||
│ Session │ │ Stanza │ │ Module │
|
||||
│ Events │ │ Events │ │ Events │
|
||||
│ │ │ │ │ │
|
||||
│ • created │ │ • message │ │ • loaded │
|
||||
│ • auth │ │ • presence │ │ • unloaded │
|
||||
│ • closed │ │ • iq │ │ • error │
|
||||
└────────────┘ └─────────────────┘ └─────────────┘
|
||||
│ │ │
|
||||
└────────────────────┼────────────────────┘
|
||||
│
|
||||
┌──────▼──────┐
|
||||
│ Listeners │
|
||||
│ (Modules) │
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
## Deployment Architecture
|
||||
|
||||
### Single Instance
|
||||
|
||||
```
|
||||
┌────────────────────────────────────┐
|
||||
│ Load Balancer / Proxy │
|
||||
│ (Nginx, HAProxy) │
|
||||
└────────────┬───────────────────────┘
|
||||
│
|
||||
┌────────────▼───────────────────────┐
|
||||
│ Prosody Node.js Instance │
|
||||
│ ┌──────────────────────────────┐ │
|
||||
│ │ Network Servers │ │
|
||||
│ │ (C2S, BOSH, WebSocket) │ │
|
||||
│ └──────────────────────────────┘ │
|
||||
│ ┌──────────────────────────────┐ │
|
||||
│ │ Core Components │ │
|
||||
│ └──────────────────────────────┘ │
|
||||
└────────────┬───────────────────────┘
|
||||
│
|
||||
┌────────────▼───────────────────────┐
|
||||
│ Database │
|
||||
│ (PostgreSQL, MongoDB) │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Clustered (Future)
|
||||
|
||||
```
|
||||
┌────────────────────────────────────┐
|
||||
│ Load Balancer (HAProxy) │
|
||||
└──────┬──────────┬──────────┬───────┘
|
||||
│ │ │
|
||||
┌──────▼─────┐ ┌──▼──────┐ ┌▼────────┐
|
||||
│ Instance 1 │ │Instance 2│ │Instance3│
|
||||
└──────┬─────┘ └──┬──────┘ └┬────────┘
|
||||
│ │ │
|
||||
└──────────┼──────────┘
|
||||
│
|
||||
┌──────────▼──────────┐
|
||||
│ Shared Database │
|
||||
│ Redis Cache │
|
||||
└─────────────────────┘
|
||||
```
|
||||
Referencia en una nueva incidencia
Block a user