- ApiClient HTTP/SSE: login, sessioni, chat/start, stream SSE, transcribe, tts - ChatModel: streaming live + risincronizzazione dallo stato del server - CookieJar persistente (0600, mai la password); Settings - Recorder OGG/Opus (fallback WAV/PCM, retry); Player TTS (QMediaPlayer) - UI Silica: splash, login, sessioni, chat (dettatura + read-aloud), settings, cover - Sailjail Internet;Audio;Microphone; icone; spec RPM; docs PROTOCOL/BUILD - tests/core_test: unit parser SSE + integrazione live (probe :8899)
41 lines
1018 B
C++
41 lines
1018 B
C++
#ifndef SSEPARSER_H
|
|
#define SSEPARSER_H
|
|
|
|
#include <QByteArray>
|
|
#include <QList>
|
|
#include <QString>
|
|
|
|
// Parser incrementale di Server-Sent Events (text/event-stream).
|
|
//
|
|
// Il WebUI di Hermes emette eventi nella forma:
|
|
// id: <stream_id>:<seq>
|
|
// event: token
|
|
// data: {"text": "..."}
|
|
// <riga vuota>
|
|
// piu' commenti di keepalive (": heartbeat") da ignorare.
|
|
//
|
|
// Logica pura, senza dipendenze da rete: alimentato con i chunk grezzi,
|
|
// restituisce gli eventi completi. Testabile in locale (tests/sse_test.cpp).
|
|
class SseParser
|
|
{
|
|
public:
|
|
struct Event {
|
|
QString name; // campo "event:" (vuoto => "message" SSE standard)
|
|
QString data; // campi "data:" concatenati con "\n"
|
|
QString id; // campo "id:" (cursore per replay)
|
|
};
|
|
|
|
SseParser();
|
|
|
|
// Aggiunge un chunk e restituisce tutti gli eventi completati.
|
|
QList<Event> feed(const QByteArray &chunk);
|
|
|
|
void reset();
|
|
QByteArray pending() const;
|
|
|
|
private:
|
|
QByteArray m_buffer;
|
|
};
|
|
|
|
#endif // SSEPARSER_H
|