Mikro WebSocket Engine
Go to file
abdussamedulutas 28abefaaa9 Frontend TS→JS ES modülleri + #42 codec altyapısı + versiyon握手
SDK (sdk/ dizini — native ES module, bundler yok):
- sdk/version.js      : SDK_VERSION="1.0.0", CODEC_JSON/BINARY sabitleri
- sdk/codec.js        : WSTSCodec — JSON (şu an), binary stub (#42 altyapısı)
  Binary çerçeveleme: opcode(1B)+length(4B)+payload; şimdilik NotImplemented fırlatır
- sdk/EventTarget.js  : MWSEEventTarget (browser EventTarget ile çakışma yok)
- sdk/Connection.js   : endpoint:"auto" → import.meta.url ile sunucu tespiti
- sdk/WSTSProtocol.js : codec üzerinden encode/decode, sinyal yönlendirme
- sdk/EventPool.js    : request()/only() ayrımı (#33 korunuyor)
- sdk/Peer.js         : WebRTC stub bağlantısı, WOM pack/to (#33)
- sdk/Room.js         : WOM pack/room (#33), createRoom/join/eject
- sdk/PeerInfo.js, RoomInfo.js, IPPressure.js, P2PFileSender.js
- sdk/WebRTC.js       : placeholder — ayrıca ele alınacak
- sdk/index.js        : MWSE ana sınıfı + versiyon el sıkışması

Versiyon el sıkışması (backend ↔ frontend zorunlu):
- internal/protocol/version.go  : WSTSVersion="1.0.0", WSTSCodecJSON=0
- internal/services/yourid.go   : bağlantı anında wsts/hello sinyali gönderir
  (v + codecs listesi; id sinyalinden ÖNCE gelir)
- sdk/index.js _awaitHello()    : scope çalıştırılmadan önce wsts/hello beklenir;
  versiyon uyuşmazsa bağlantı kapatılır + 'error' eventi ateşlenir (5s timeout)

Servis (httpserver):
- /sdk.js  → 301 /sdk/index.js  (import.meta.url doğru çözümlenir)
- /sdk/    → sdk/ dizini file server
- internal/config: MWSE_SDK_DIR env değişkeni (varsayılan ./sdk)

Demo dosyaları: public/demos/{chat,audio,video}.html
go test -race ./... yeşil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 12:24:21 +03:00
Source Revision 2026-04-23 23:10:05 +03:00
frontend #33: EventPool WOM — askıda kalan promise düzeltmesi 2026-06-17 08:11:29 +03:00
internal Frontend TS→JS ES modülleri + #42 codec altyapısı + versiyon握手 2026-06-17 12:24:21 +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 Frontend TS→JS ES modülleri + #42 codec altyapısı + versiyon握手 2026-06-17 12:24:21 +03:00
script Revision 2026-04-23 23:10:05 +03:00
sdk Frontend TS→JS ES modülleri + #42 codec altyapısı + versiyon握手 2026-06-17 12:24:21 +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 Go engine portu (0.1.0 çekirdek) — Node.js engine'i race-free Go'ya taşı 2026-06-17 07:09:36 +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
index.js Revision 2026-02-26 08:12:40 +03:00
main.go #46: 3. parti sunucu köprüsü (bridge) 2026-06-17 12:05:59 +03:00
package-lock.json Update packages #10 2023-11-04 20:37:49 +03:00
package.json Perfect nogation bugfixed 2025-07-14 23:22:37 +03:00
todo.md Ajan çalışma sözleşmesi + gitea CLI + yol haritası dosyaları 2026-06-17 08:08:05 +03:00
tsconfig.json D-TS 2023-05-16 10:49:36 +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