Mikro WebSocket Engine
Go to file
abdussamedulutas 777f422873 #38/#34: CanvasCompositor ve demo güncellemesi
sdk/webrtc/CanvasCompositor.js (#38):
  - Gelen video track'lerini tek canvas'ta birleştirme (grid/pip/side-by-side/focus)
  - OffscreenCanvas öncelikli (DOM gerektirmiyor), yoksa <canvas> kullanır
  - setFPS(), setLayout(), setFocus() ile runtime kontrol
  - stream() → MediaStream; StreamManager.addStream('composite', ...) ile gönderilir
  - setEncodings() ile bitrate/fps zaten StreamManager üzerinden destekleniyor

sdk/webrtc/index.js: CanvasCompositor re-export eklendi

public/demos/ (#34): Tüm demo'lar yeni SDK API'sine güncellendi:
  - <script src="/script"> → <script type="module"> import MWSE from '/sdk/index.js'
  - new MWSE() (endpoint otomatik import.meta.url'den alınıyor)
  - rtc.connect({ polite }) ile perfect negotiation polite/impolite tayini
  - rtc.addStream() / rtc.on('track') yeni API
  - rtc.on('failed') durumu gösteriliyor
  - window.send() module scope sorununu çözüyor (onclick handler)

go test -race ./... — tüm testler yeşil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:02:58 +03:00
internal #36/#37/#40/#41/#47: WebRTC kütüphanesi, sub-network ve Studio UI 2026-06-17 12:59:16 +03:00
loadtest Go engine portu (0.1.0 çekirdek) — Node.js engine'i race-free Go'ya taşı 2026-06-17 07:09:36 +03:00
public #38/#34: CanvasCompositor ve demo güncellemesi 2026-06-17 13:02:58 +03:00
sdk #38/#34: CanvasCompositor ve demo güncellemesi 2026-06-17 13:02:58 +03:00
tools Ajan çalışma sözleşmesi + gitea CLI + yol haritası dosyaları 2026-06-17 08:08:05 +03:00
.agent-prompt-port.txt Ajan çalışma sözleşmesi + gitea CLI + yol haritası dosyaları 2026-06-17 08:08:05 +03:00
.agent-prompt.txt Ajan çalışma sözleşmesi + gitea CLI + yol haritası dosyaları 2026-06-17 08:08:05 +03:00
.gitea-auth.example.json Ajan çalışma sözleşmesi + gitea CLI + yol haritası dosyaları 2026-06-17 08:08:05 +03:00
.gitignore Eski Node.js / TypeScript yapı dosyaları temizlendi 2026-06-17 12:28:37 +03:00
CLAUDE.md Ajan çalışma sözleşmesi + gitea CLI + yol haritası dosyaları 2026-06-17 08:08:05 +03:00
LICENSE Initial commit 2022-11-16 20:31:27 +01:00
PORT-PROGRESS.md Go engine portu (0.1.0 çekirdek) — Node.js engine'i race-free Go'ya taşı 2026-06-17 07:09:36 +03:00
README.md Frontend TS→JS ES modülleri + #42 codec altyapısı + versiyon握手 2026-06-17 12:24:21 +03:00
REVIEW.md #33: EventPool WOM — askıda kalan promise düzeltmesi 2026-06-17 08:11:29 +03:00
decisions.md #43/#44/#45: Notify (store-and-forward + suit) ve data-sync alt sistemleri 2026-06-17 08:30:20 +03:00
go.mod Go engine portu (0.1.0 çekirdek) — Node.js engine'i race-free Go'ya taşı 2026-06-17 07:09:36 +03:00
go.sum Go engine portu (0.1.0 çekirdek) — Node.js engine'i race-free Go'ya taşı 2026-06-17 07:09:36 +03:00
main.go #46: 3. parti sunucu köprüsü (bridge) 2026-06-17 12:05:59 +03:00
todo.md Ajan çalışma sözleşmesi + gitea CLI + yol haritası dosyaları 2026-06-17 08:08:05 +03:00

README.md

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

# 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 ı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

go test -race ./...

Frontend SDK entegrasyonu

SDK, TypeScript ile yazılmış ve derlenmiş JavaScript olarak /script endpoint'inden sunulur. Herhangi bir bundler gerekmez.

<!-- Sunucu çalışırken -->
<script src="http://localhost:7707/script"></script>

<script>
const mwse = new MWSE({
    endpoint: "ws://localhost:7707",
    autoReconnect: true
});

mwse.on('scope', async () => {
    console.log('Bağlandı:', mwse.me.socketId);
    // Oda oluştur / katıl
    const room = mwse.room({ name: 'genel', joinType: 'free', ifexistsJoin: true });
    await room.createRoom();
    room.on('message', (pack, peer) => console.log(peer.socketId, ':', pack));
    room.send({ text: 'merhaba!' });
});
</script>

Demo dosyaları

Demo Yol ı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:

# 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/<id>/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.
    1. 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ı: https://git.saqut.com/saqut/MWSE/wiki