Commit Graph

12 Commits

Author SHA1 Message Date
abdussamedulutas 5ebd111af0 endPair/disconnect: WebRTC tamamen kapatılıyor + tiles temizleniyor
sdk/Peer.js — endPair():
  - this.rtc?.destroy() eklendi
  - Yerel akışlar durur, RTCPeerConnection kapanır

sdk/index.js — sinyal handler'ları:
  - end/pair: peer.rtc?.destroy() (alan taraf da kapatır)
  - peer/disconnect: peer.rtc?.destroy() (WebSocket kopunca RTC da kapanır)

public/studio/Studio.js:
  _clearPeerTiles(peerId):
    - data-peer-id dataset'i ile local + remote grid'den tile'ları kaldırır
    - Gizli <audio> elemanını srcObject=null + remove() ile temizler
    - CSS.escape ile güvenli selector
  tile.dataset.peerId: _addLocalTile ve _addRemoteTile her ikisinde eklendi
  tile._audioEl: ses tile'larında referans saklanır (clearPeerTiles için)
  _watchIncoming: peer.rtc.on('disconnected') → clearPeerTiles + rebuildPeerItems
  end/pair handler: clearPeerTiles(from) çağrısı eklendi
  peer/disconnect handler: clearPeerTiles(peer.socketId) çağrısı eklendi
  _addLocalTile/_addRemoteTile: peerLabel yerine peer objesi alır

go test -race ./... — yeşil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 14:59:47 +03:00
abdussamedulutas d468c95adf WebRTC sinyal fix + reaktif eşler kolonu + anlık disconnect
sdk/Peer.js — :rtcpack: her zaman WebSocket üzerinden:
  - RTC bağlandıktan sonra renegotiasyon (yeni stream ekleme) sırasında
    ICE adayları DataChannel'a yönlendiriliyordu → bağlantı kurulamıyordu
  - forceWS = pack.type === ':rtcpack:' → yönlendirme mantığını atlar,
    her koşulda WebSocket kullanır
  - Signalingi writable flag da engellemez (rtcpack her zaman geçer)

sdk/index.js — peer/disconnect tam işleme:
  - pairs.delete(id) eklendi (kopan eş pairs'ten çıkar)
  - me.emit('peer/disconnect', peer) eklendi (Studio dinleyebilsin)

public/studio/Studio.js — reaktif eşler kolonu:
  - _peersCol referansı: _pushPeersColumn'da saklanır
  - _rebuildPeerItems(): mwse.pairs'i okuyup Column.setItems() çağırır
    → kolon her zaman anında güncellenir (tıklama gerekmez)
  - Olaylar: accepted/pair + end/pair + peer/disconnect → _rebuildPeerItems()
  - Kabul eden taraf: _pushPeersColumn yoksa aç, varsa rebuild
  - Disconnect status bar'da kırmızı hata mesajı

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 14:35:33 +03:00
abdussamedulutas f5565f5df0 Studio: gelen akış fix + ses kısma kontrolü
_watchIncoming: _ensureRTC(peer) çağrısı eklendi
  - Önceden RTC başlatılmıyordu → gelen :rtcpack: sinyalleri receive() içinde
    _neg=null nedeniyle sessizce düşüyordu → track olayı hiç ateşlenmiyordu
  - Şimdi kabul/eşleşme anında RTC başlatılıyor (polite = küçük socketId)
  - Gelen offer'ı Negotiator işleyebiliyor → answer gönderiliyor → track geliyor

_addRemoteTile yeniden yazıldı:
  - streams parametresi eklendi (RTCPeerConnection'ın streams dizisi kullanılır)
  - Video: <video autoplay> (muted=false, gerçek ses çalar)
  - Ses: gizli <audio autoplay> + görsel tile (graphic_eq ikonu)
  - Ses kıs/aç butonu (volume_up ↔ volume_off, Material Icons)
  - Kapatınca audio.srcObject=null + remove() (bellek sızıntısı önlendi)
  - Track ended → tile otomatik kalkar

CSS:
  .mwse-stream-tile__mute (yeşil=açık, kırmızı=sessiz)
  .mwse-stream-tile__close Material Icons 'close' metni

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 14:03:42 +03:00
abdussamedulutas c1d1ddf383 Studio: akış monitörü + Material Icons + saat + başlık büyütme
Akış monitör paneli (sağ kenar, akış varken görünür):
  - Gönderiyorum / Geliyor bölümleri ayrı ayrı
  - Video tile: <video> önizleme, aspect-ratio 16/9
  - Ses tile: mic ikonu + mavi arka plan
  - Her tile: etiket, peer IP/ID, ✕ kapat butonu
  - Track 'ended' olunca tile otomatik kalkar
  - addStream çağrısında localTile eklendi (_call + cihaz seçimi)
  - _watchIncoming → remoteTile eklendi

Material Icons Round (@import Google Fonts):
  - Tüm item ikonları: people/videocam/mic/screen_share/upload_file/
    live_tv/hd/sd/link_off/stop_circle/meeting_room/sensors vb.
  - chevron_right ok ikonu
  - Column.js: icon string → Material Icons textContent,
    HTML içeriyorsa innerHTML (ikonlu butonlar için)
  - addAction label: innerHTML → butonlara ikon eklenebilir
  - Bildirim banner'ında wifi ikonu

Araç çubuğu:
  - Başlık: 12px → 17px, font-weight 700, yükseklik 46px
  - ID kartı: "Kimliğim" etiket metni kaldırıldı, sadece IP + UUID + ⎘
  - Sağ üst köşe: HH:MM:SS canlı saat (setInterval 1s)

Layout:
  - .mwse-studio__main: flex-row → kolonlar sol, panel sağ
  - ColumnView artık mainArea'ya mount ediliyor

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:54:11 +03:00
abdussamedulutas 0c654ae4c8 Studio: UUID yerine sanal IP gösterimi
Akış:
  - scope sonrası allocAPIPAddress() → 10.x.x.x al
  - PeerInfo.set('ip', ip) → auth/info → tüm mevcut pairlere yayımlar
  - accepted/pair sonrası tekrar set() → yeni paire de ulaşır
  - pair/info sinyali → peer.info.info.ip güncellenir (SDK zaten yapıyor)

Araç çubuğu ID kartı:
  - Sanal IP: büyük, mavi (10.x.x.x) — IP alındıkça güncellenir
  - Kısa UUID: küçük, soluk (son 8 karakter) — scope'ta dolar
  - Tıkla → tam UUID kopyalanır (paylaşmak için hâlâ gerekli)

Eşler kolonunda:
  - Etiket: peer.info.info.ip (varsa) yoksa kısa UUID
  - Meta: kısa UUID · bağlantı türü · akış sayısı

Eş eylem kolonu başlığı: IP veya kısa UUID
Oda üyeleri: kendi kaydı için sanal IP gösterilir

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:46:27 +03:00
abdussamedulutas d9598ba15f Studio: kabul sonrası Eşler kolonuna yönlendir + addStream duplicate fix
- acceptPair başarılı → popTo(1) + pushPeersColumn() → kabul eden taraf
  anında Eşler kolonunda yeni eşi görür
- _call(): aynı type (cam+mic/mic/screen) zaten varsa removeStream sonra addStream
- _pushDevicesColumn: aynı cihaz label'ı varsa removeStream sonra addStream
  (kullanıcı ikinci kez cihaz seçtiğinde 'already exists' hatası önlendi)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:43:49 +03:00
abdussamedulutas 3736d78dfe Studio: eşleşme akışı tam çalışır hale getirildi
sdk/index.js:
  - accepted/pair sinyali → mwse.pairs.set(from, peer)
  - end/pair sinyali      → mwse.pairs.delete(from)
  (İstek gönderen taraf pairs haritasına eklendi)

sdk/Peer.js:
  - acceptPair() başarısında → mwse.pairs.set(socketId, this)
  - rejectPair() → mwse.pairs.delete(socketId)
  - endPair()    → mwse.pairs.delete(socketId)
  (Kabul eden taraf da pairs haritasına eklendi)

public/studio/Studio.js — tamamen yeniden yazıldı:
  Gelen eşleme isteği → bildirim banner'ı:
    - Yeşil arka plan, socket ID kodu olarak gösterilir
    - [Reddet] → rejectPair() → banner kapanır
    - [Kabul Et] → acceptPair() → banner kapanır, eşler yenilenir
  Eşler kolonu: artık mwse.pairs'tan doğru veriler geliyor
  Oda oluşturma: description alanı eklendi (sunucu zorunlu tutuyordu)
  Oda oluştur → "Oda adı / Açıklama / Şifre" modal
  ID ile ara → prompt() yerine modal
  Araç çubuğu: "Kimliğim" kartı, kopyala butonu (⎘→✓ flash)

public/studio/style.css:
  .mwse-notif-area / .mwse-notif-bar / __msg / __dot / __actions

go test -race ./... — yeşil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:38:17 +03:00
abdussamedulutas 3bba5af340 Studio: ID kartı, modal, oda oluşturma, Ana butonu kaldırıldı
Araç çubuğu:
  - Socket ID → kopyalanabilir kart (tıkla → clipboard, yeşil flash)
  - "Ana" butonu kaldırıldı (kafakarıştırıcıydı, Miller kolon kendisi navigasyon sağlıyor)
  - Durum mesajı sağda kaldı

Modal sistemi (_showModal):
  - Başlık + label'lı input alanları + İptal/Tamam butonları
  - Arka plana tıkla veya ✕ ile kapat
  - Enter → onayla, Esc → kapat
  - İlk alana otomatik focus

Eşler kolonu:
  - "ID ile ara" → prompt() yerine modal
  - Alan: Socket ID, placeholder: 'xxxxxxxx-xxxx-…'

Odalar kolonu:
  - "Oda Oluştur" (primary buton) → modal
  - Alanlar: oda adı + opsiyonel şifre
  - Oluşturunca oda kolonunu yeniler

style.css:
  - .mwse-id-card + __label/__value/__copy + --copied
  - .mwse-modal-overlay / .mwse-modal / __header/__body/__field/__footer/__input/__close

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:31:09 +03:00
abdussamedulutas 66158b1f74 Studio bağlantı fix + tam WebRTC/cihaz yönetimi
sdk/index.js — bağlantı hatası düzeltildi:
  - new MWSE() options=undefined → TypeError patlaması
  - constructor(options) → opts = { endpoint:'auto', ...options }
  - Artık new MWSE() / new MWSE('ws://host') / new MWSE({…}) hepsi çalışıyor

public/studio/Studio.js — tamamen yeniden yazıldı:
  Eşler kolonu:
    - mwse.pairs'ten gerçek eşleri gösteriyor
    - Her eş için: Video+Ses / Sesli Ara / Ekran Paylaş / Kamera Seç /
      Mikrofon Seç / Dosya Gönder / Aktif Akışlar / Eşleşmeyi Bitir
    - "ID ile ara" → prompt ile direkt peer ID girerek requestPair()
  Odalar kolonu: mwse.rooms'tan oda + üye listesi
  Cihazlar kolonu:
    - MediaSources.devices() ile kamera ve mikrofon listesi
    - Her cihaza tıkla → seçili eşe akış başlat veya önizle (floating video)
    - İzin İste butonu → izin alındıktan sonra listeyi yenile
  Akışlar kolonu: peer.rtc._streams.list() canlı gösterimi
  Kalite kolonu: Yüksek/Orta/Düşük preset + mute/stop
  Araç çubuğu: socket ID, durum mesajı, Ana butonu (popTo(0))
  Gelen track'ler: audio otomatik çalınır, status bar bildirir
  Cihaz önizleme: floating video element (✕ ile kapatılır)

public/studio/app.js: studio.mount() await ile çağrılıyor

go test -race ./... — yeşil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:22:03 +03:00
abdussamedulutas 764644176c Studio ürünü sdk/'dan public/studio/'a taşındı + /studio route
sdk/studio/ → public/studio/:
  - index.js      → Studio.js (import yolları güncellendi:
                     ../webrtc/ → /sdk/webrtc/, ./ColumnView → /studio/ColumnView)
  - ColumnView.js → /studio/ altında (import: ./Column → /studio/Column)
  - Column.js, style.css → taşındı, değişmedi

public/studio/index.html — tam ürün HTML'i:
  - Loading overlay (spinner, hata durumu)
  - <script type="module" src="/studio/app.js">

public/studio/app.js — uygulama başlangıcı:
  - MWSE /sdk/index.js'den import
  - Studio /studio/Studio.js'den import
  - scope/close/error olaylarına göre loading overlay yönetimi

httpserver.go:
  - /studio     → public/studio/index.html
  - /studio/    → http.FileServer(public/studio/) — JS/CSS asset'leri

localhost:PORT/studio → Studio açılıyor
go test -race ./... — tüm testler yeşil

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:13:56 +03:00
abdussamedulutas c623016841 Revision 2026-04-23 23:10:05 +03:00
abdussamedulutas 33b57d7e67 WebDevice suite 2025-10-17 09:37:09 +03:00