# MWSE — Micro Web Socket Engine
MWSE, kendisine bağlanan eşleri birbirleriyle eşleştirerek eşler arası veri
tünelleri oluşturan geniş ölçekli bir WebSocket mikroservis altyapısıdır.
Servis; cihazları senkronize etmek, odalar oluşturmak, sohbet ve görüntülü
görüşme yazılımları için gerçek zamanlı altyapı sağlamak amacıyla kullanılır.
Sunucu cihazları sanallaştırdığı için eşler birbirlerinin gerçek IP adresini veya
cihaz bilgisini bilmeden düşük gecikmeli, çift yönlü iletişim kurabilir.
## Durum (Go engine, v0.1.0 paritesi ✅)
Motor Node.js'ten **Go** ile yeniden yazıldı. Concurrency modeli goroutine +
`sync.RWMutex` + bağlantı başına tek-yazıcı (actor) deseni üzerine kuruludur;
Node.js'teki "leave-while-send" race condition ve EventPool promise takılması
(#33) giderildi.
| Özellik | Durum |
|---|---|
| WebSocket bağlantı yaşam döngüsü | ✅ |
| Oda oluşturma / katılma / çıkma | ✅ |
| Eşleme (pair) sistemi | ✅ |
| Paket tünelleme (pack/to, pack/room) | ✅ |
| Veri senkronizasyonu (data/sync, sync/pool) | ✅ |
| Bildirim + suit yanıtı (notify/send, notify/reply) | ✅ |
| 3. parti sunucu köprüsü (bridge) | ✅ |
| İkili çerçeveleme (binary framing) | ⏳ 2.5.0 |
| Studio (akış/WebRTC sunucusu) | ⏳ 2.0.0 |
## Kurulum ve çalıştırma
### Gereksinimler
- Go 1.22+
- (Opsiyonel) TypeScript — SDK derlemek için `npm run build`
### Sunucuyu başlat
```bash
# Bağımlılıklar
go mod tidy
# Çalıştır (varsayılan: 0.0.0.0:7707)
go run .
# Yapılandırma env değişkenleriyle:
MWSE_ADDR=:8080 \
MWSE_OUTBOUND_BUFFER=2048 \
MWSE_MAX_MESSAGE_SIZE=33554432 \
go run .
```
### Ortam değişkenleri
| Değişken | Varsayılan | Açıklama |
|---|---|---|
| `MWSE_ADDR` | `:7707` | Dinleme adresi |
| `MWSE_OUTBOUND_BUFFER` | `1024` | Bağlantı başına gönderim kuyruğu |
| `MWSE_MAX_MESSAGE_SIZE` | `16777216` | Maksimum gelen frame boyutu (bayt) |
| `MWSE_PING_INTERVAL` | `10s` | Heartbeat ping aralığı |
| `BRIDGE_APPROVE_URL` | — | Bağlantı onay URL'i (3. parti köprü) |
| `BRIDGE_TRIGGER_URL` | — | Suit yanıtı push URL'i |
| `BRIDGE_INBOX` | — | `1` ile inbox'ı etkinleştir |
### Testler
```bash
go test -race ./...
```
## Frontend SDK entegrasyonu
SDK, TypeScript ile yazılmış ve derlenmiş JavaScript olarak `/script`
endpoint'inden sunulur. Herhangi bir bundler gerekmez.
```html
```
## Demo dosyaları
| Demo | Yol | Açıklama |
|---|---|---|
| Chat | `/demos/chat.html` | ~20 satır JS ile odalı sohbet |
| Sesli görüşme | `/demos/audio.html` | P2P WebRTC ses (eşler arası) |
| Video görüşme | `/demos/video.html` | P2P WebRTC video (kamera ızgara görünümü) |
## API kontrolü (/api)
API anahtarı al, sonra kullan:
```bash
# Anahtar al
KEY=$(curl -s -X POST localhost:7707/api/auth/key \
-H 'Content-Type: application/json' \
-d '{"domain":"myapp"}' | jq -r .key)
# Tüm odaları listele
curl -s localhost:7707/api/rooms | jq .
# Belirli bir istemciye mesaj gönder
curl -s -X POST localhost:7707/api/client//send \
-H "x-api-key: $KEY" \
-H 'Content-Type: application/json' \
-d '{"pack": {"hello": "world"}}'
# 3. parti köprü — inbox boşalt
curl -s -X POST localhost:7707/api/bridge/inbox \
-H "x-api-key: $KEY"
```
## Mimari
```
Client (WebSocket)
│
▼
ws.Hub (router + registry)
├─ services/auth.go Pairing, IP adresi, erişilebilirlik
├─ services/room.go Oda oluşturma / yönetimi
├─ services/datatransfer.go pack/to, request/to, response/to tünelleri
├─ services/notify.go Store-and-forward bildirim + suit yanıtı
├─ services/datastore.go Aktif senkronizasyon (CRUD broadcast)
│ Pasif senkronizasyon (hash-dedup merge pool)
├─ services/bridge.go 3. parti sunucu inbox (bridge/send)
└─ services/ippressure.go Sanal IP basıncı
httpserver
├─ GET/POST /api/* Kontrol düzlemi (API anahtarı, oda/istemci yönetimi)
├─ POST /api/bridge/inbox 3. parti sunucu inbox boşaltma
└─ /* (WebSocket değilse) SDK (script/index.js) + statik dosyalar
```
## Güvenlik
- Bağlı cihazların mesajları **sokete iletilmeden önce** kullanıcılar tarafından
manipüle edilebilir; MWSE bu doğrulamayı yapmaz. Hassas veriler için
uygulama katmanında imzalama/şifreleme ekleyin.
- 3. parti köprü (`BRIDGE_APPROVE_URL`) kullanılıyorsa bağlantı onayı uygulama
sunucusuna delege edilir (fail-closed: onay gelmezse bağlantı reddedilir).
## Geliştirici dökümanı
Tüm wiki sayfaları: