Mikro WebSocket Engine
Go to file
abdussamedulutas 75d5999b4a #36/#37/#40/#41/#47: WebRTC kütüphanesi, sub-network ve Studio UI
sdk/webrtc/ — kapsamlı RTCEngine kütüphanesi:
  - PeerConnection.js: RTCPeerConnection wrapper; connectionstatechange +
    iceconnectionstatechange her ikisi de izleniyor (eski 'bağlantı kopsa
    fark etmez' hatası bu şekilde önleniyor)
  - Negotiator.js: perfect negotiation (RFC 8829); polite/impolite roller,
    teklif çakışması rollback, ICE adayları sıraya alınıyor
  - StreamManager.js: addStream/replaceTrack/removeStream/setEncodings —
    runtime'da track ekle/çıkar/değiştir, yeniden müzakere gerekmiyor
  - DataChannel.js: birincil veri kanalı, bağlantı canlıyken kapanırsa
    otomatik yeniden oluşturulur, açılana kadar mesaj kuyruğu
  - MediaSources.js: camera/microphone/screen/cameraAndMic fabrika metodları,
    AudioBuffer→MediaStream, canvas.captureStream, AudioContext mix bus
  - FileSender.js: en fazla 5 paralel DataChannel üzerinden dosya transferi,
    progress olayı, 16 KB chunk + bufferedAmountLow akış kontrolü
  - index.js (RTCEngine): tüm alt sistemleri koordine eder; ICE restart
    exponential backoff (1s→2s→4s); Peer.js ile geriye dönük uyumlu

sdk/WebRTC.js → ./webrtc/index.js'e ince re-export (Peer.js değişmedi)

sdk/studio/ — masaüstü-first Miller-kolon UI (#47):
  - Column.js: başlık + arama filtresi + öğe listesi
  - ColumnView.js: yatay kayan kolon yöneticisi, popTo() ile derine git
  - index.js (Studio): Server→Groups→Peers→Devices→Streams→Quality hiyerarşisi;
    WebRTC bağlantısını otomatik başlatır (polite = küçük socketId)
  - style.css: koyu masaüstü teması, aktif öğe vurgusu, ilerleme çubuğu

internal/services/ippressure.go — rastgele atama + sub-network (#40/#41):
  - lockIP/lockNumber/lockCode: önce 256 rastgele deneme, sonra sıralı yedek;
    yüksek bağlantı sayısında O(1) ortalama atama
  - SubNet: /24 sanal alt ağ (10.A.B.0/24); Alloc/Release/Whois metodları
  - alloc|release|whois APSubNet + APSubNetIP HTTP handler'ları eklendi
  - Bağlantı kesildiğinde subnet IP'leri ve prefix otomatik serbest bırakılıyor

sdk/IPPressure.js: allocSubNet/releaseSubNet/allocSubNetIP/releaseSubNetIP/
  querySubNetIP metodları eklendi

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

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 12:59:16 +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 Eski Node.js / TypeScript yapı dosyaları temizlendi 2026-06-17 12:28:37 +03:00
sdk #36/#37/#40/#41/#47: WebRTC kütüphanesi, sub-network ve Studio UI 2026-06-17 12:59:16 +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