# Plan: Lisans kanalını Socket.IO'ya taşıma

## Durum özeti

Fikatia lisans yönetimi şu an raw WebSocket ile çalışıyor:
- İstemci (`lisans_canli.cpp`): WinHTTP ile `/lisans-ws`'ye bağlanır
- Sunucu (`lisans_kontrol.go`): gorilla/websocket ile `/lisans-ws` endpoint'ini sunar
- Lisans karar ECDSA P-256 ile imzalanır, `{seri, engelli, mesaj, zaman, imza}` formatında yılır

Kullanıcı lisans kanalını **Socket.IO'ya taşıma** kararı verdi. Lisans olayı `/isans` namespace'i altında izole çalışmalı, merkezi modülden bağımsız.

## İki sistemin ayrılığı (kritik)

- **Merkezi modül** (`fikoyt_ctx`): Socket.IO v2, `/socket.io/`, cihaz yönetimi olayları
- **Lisans sunucusu** (`lisans_kontrol.go`): raw WebSocket, `/lisans-ws`, ECDSA lisans kararları

Bu iki sistenin ortak noktası yok. Lisans kanalı kendi başına bir sistem.

## Lisans sunucusunun Socket.IO'ya taşınması

### 1. Lisans sunucusunun ayrı bir Socket.IO sunucusu kurması

Lisans sunucusu, lisans olayının izole çalışması için kendi ayrı Socket.IO sunucusunu kurmalı. Bu merkezi modülün `/socket.io/` endpoint'ini paylaşmamalı.

**Kullanılacak API (socket.io v2.3.5 Go):**
- `socket.NewServer(srv any, opts ServerOptionsInterface) *Server`
- `server.Of(name any, fn events.Listener) Namespace`
- `namespace.On(string, ...events.Listener) error` — event handler kaydet
- `namespace.EmitUntyped(string, ...any)` — event gönder
- `namespace.To(room ...Room) *BroadcastOperator` — odaya event gönder

### 2. Lisans olayının client'a ulaştırılması

Lisans kararı client'a ulaştırmak için lisans sunucusu, karar geldiğinde ilgili client'a lisans olayını göndermeli.

**İstemci kimliği:** Client bağlandığında `merhaba` mesajında kendi kimliğini gönderir. Sunucu bu kimlikle client'ı kaydeder. `/lisans-kontrol/api/karar` endpoint'i bu kimlikle client'ı bulur ve kararı o client'a Socket.IO üzerinden gönderir.

### 3. Client tarafı lisans olayını dinlemeli

İstemci (`lisans_canli.cpp`), lisans olayını `/isans` namespace'i altında dinmeli. Bağlandıktan sonra makine bilgisini `merhaba` mesajında göndermeli. Gelen kararı `canliKararCoz` ile doğrulamalı.

## Riskler

1. **Lisans sunucusunun ayrı Socket.IO sunucusu:** İki sunucu aynı portu kullanmamalı. Lisans sunucusu kendi namespace'iyle izole çalışır.

2. **İstemci kimliği:** Client merhaba mesajında kimliğini göndermeli, sunucu bu kimlikle client'ı bulmalı.

3. **engine.io v3 desteği:** Sunucu `SetAllowEIO3(true)` ile engine.io v3 istemcilerini desteklemeli.

## Test

- Lisans sunucusunun Socket.IO sunucusunu kurması ve `/isans.socket.io/` endpoint'ini bağlaması
- Lisans olayının `/isans` namespace'i altında çalışması
- Lisans kararının client'a Socket.IO üzerinden ulaştırılması
- Client'ın lisans olayını dinlemesi ve `canliKararCoz` ile doğrulaması
- `canliKararCoz` unit testi (mevut `test_lisans_uzak.cpp`) aynen yeşil kalmalı

## RUNTIME TEST

- Lisans sunucusunun `/isans.socket.io/` endpoint'ini bağlaması ve Socket.IO sunucusunu başlatması
- Client'ın lisans sunucusuna bağlanması ve lisans olayını dinlemesi
- Lisans kararının client'a ulaştırılması ve `canliKararCoz` ile doğrulaması
