# Plan: Lisans sunucusunu 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 yollar

Kullanıcı lisans sunucusunu **Socket.IO**'ya taşıma kararı verdi. Lisans olayı izole çalışmalı, merkezi modülden bağımsız.

## Lisans sunucusunun Socket.IO'ya taşıması için gerekenler

### 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ı.

**Lisans sunucusu:**
```go
// lisans_kontrol.go
var FikoLisansSocketIo *socket.Server

func Ayarla(app *fiber.App) {
    // ... mevcut ayarlamalar
    
    // Lisans için ayrı Socket.IO sunucusu
    lisansSettings := socket.DefaultServerOptions()
    lisansSettings.SetServeClient(true)
    lisansSettings.SetAllowEIO3(true)  // engine.io v3 istemcilerini destekle
    lisansSettings.SetCors(&types.Cors{
        Origin:      "*",
        Credentials: true,
    })
    
    FikoLisansSocketIo = socket.NewServer(nil, lisansSettings)
    
    // Lisans olayları /isans namespace'i altında
    lisansNamespace := FikoLisansSocketIo.Of("/isans")
    lisansNamespace.On("connection", func(args ...interface{}) {
        socket := args[0].(*socket.Socket)
        lisansNamespace.On("makine-bilgi", func(args ...interface{}) {
            // istemciden makine bilgisi al
            data := args[0].(map[string]interface{})
            // ... istemci kaydı
        })
    })
    
    // Lisans Socket.IO endpoint'ini bağla
    app.Get("/isans.socket.io/", adaptor.HTTPHandler(FikoLisansSocketIo.ServeHandler(lisansSettings)))
    app.Post("/isans.socket.io/", adaptor.HTTPHandler(FikoLisansSocketIo.ServeHandler(lisansSettings)))
}
```

### 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.

**Lisans kararı:**
- Sunucu `/lisans-kontrol/api/karar` endpoint'ine gelen kararı imzalar
- İmzalı kararı ilgili client'a Socket.IO üzerinden gönderir
- Client bu olayı alır ve `canliKararCoz` ile doğrular

**Kod:**
```go
// lisans_kontrol.go - karar ver endpoint'i
g.Post("/karar", func(c fiber.Ctx) error {
    // ... mevcut imzalama ve kaydetme
    
    // İmzalı kararı ilgili client'a Socket.IO üzerinden gönder
    if FikoLisansSocketIo != nil {
        lisansNamespace := FikoLisansSocketIo.Of("/isans")
        lisansNamespace.Emit("lisans-karar", k)  // client'a lisans olayı
    }
    
    return c.JSON(fiber.Map{"tamam": true})
})
```

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

İstemci (`lisans_canli.cpp`), lisans olayını `/isans` namespace'i altında dinlemeli.

**Client:**
- Bağlandıktan sonra makine bilgisini event ile gönderir (kullanıcı "event ile" seçti)
- `/isans` namespace'i altında `lisans-karar` olayını dinler
- Gelen kararı `canliKararCoz` ile doğrular

## Riskler

1. **Lisans sunucusunun ayrı Socket.IO sunucusu:** Lisans sunucusunun ayrı bir Socket.IO sunucusu kurması, port çakışmasına yol açabilir. İki sunucu aynı portu kullanmamalı.

2. **Lisans olayının namespace'i:** `/isans` namespace'i kullanımı, lisans olayının izole çalışmasını sağlar ama client'ın doğru namespace'i kullanması gerekir.

3. **Makine bilgisinin event ile alınması:** Client bağlandıktan sonra makine bilgisini event ile göndermeli. Bu, lisans sunucusunun makine bilgisini event geldiğinde alması anlamına gelir.

4. **Lisans kararının client'a ulaştırılması:** Lisans kararı client'a Socket.IO üzerinden gönderilmeli. Bu, lisans sunucusunun karar geldiğinde ilgili client'a olay göndermesi anlamına gelir.

5. **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ı
