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>
|
||
|---|---|---|
| internal | ||
| loadtest | ||
| public | ||
| sdk | ||
| tools | ||
| .agent-prompt-port.txt | ||
| .agent-prompt.txt | ||
| .gitea-auth.example.json | ||
| .gitignore | ||
| CLAUDE.md | ||
| LICENSE | ||
| PORT-PROGRESS.md | ||
| README.md | ||
| REVIEW.md | ||
| decisions.md | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| todo.md | ||
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 | 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
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 | 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:
# 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.
-
- parti köprü (
BRIDGE_APPROVE_URL) kullanılıyorsa bağlantı onayı uygulama sunucusuna delege edilir (fail-closed: onay gelmezse bağlantı reddedilir).
- parti köprü (
Geliştirici dökümanı
Tüm wiki sayfaları: https://git.saqut.com/saqut/MWSE/wiki