Make SCUM logs live relay only

This commit is contained in:
npc0-hue
2026-09-01 14:26:00 +08:00
parent 3f348401a9
commit 7d9c1b7e9e
28 changed files with 1011 additions and 175 deletions
@@ -0,0 +1,66 @@
package companion
import (
"context"
"encoding/json"
"io"
"net/http"
"strings"
"testing"
"time"
)
func TestClientStreamLogEventsUsesComponentSessionBodyAndSSE(t *testing.T) {
stamp := time.Date(2026, 8, 31, 2, 0, 0, 0, time.UTC)
config := loadTestConfig(t)
client := newTestClient(t, config, roundTripFunc(func(request *http.Request) (*http.Response, error) {
if request.Method != http.MethodPost || request.URL.Scheme != "https" || request.URL.Host != "platform.example.test" || request.URL.Path != logEventsPath {
t.Fatalf("unexpected log stream request: %s %s", request.Method, request.URL.String())
}
if request.Header.Get("Authorization") != "" {
t.Fatalf("component session must stay in the typed JSON body, got Authorization header")
}
if request.Header.Get("Accept") != "text/event-stream" || request.Header.Get("Content-Type") != "application/json" {
t.Fatalf("unexpected log stream headers: %+v", request.Header)
}
var body logStreamRequest
decodeRequest(t, request, &body)
if body.SessionToken != "session-token" {
t.Fatalf("unexpected session token body: %#v", body)
}
logPayload, _ := json.Marshal(LogStreamEvent{ServerInstanceID: "server-1", StreamID: "stream-1", Source: "process", StreamKey: "stdout", LogSessionID: "session-live", SessionStartedAt: stamp, LatestSeq: 7, Entry: LogEntry{Seq: 7, Timestamp: stamp.Add(time.Second), Line: "SCUM LOGIN 76561198000000001 10.0.0.1", Redacted: true}})
bodyText := strings.Join([]string{
"event: ready",
"data: {\"serverInstanceId\":\"server-1\"}",
"",
"event: log",
"data: " + string(logPayload),
"",
": heartbeat",
"",
}, "\n")
return &http.Response{StatusCode: http.StatusOK, Header: http.Header{"Content-Type": []string{"text/event-stream"}}, Body: io.NopCloser(strings.NewReader(bodyText)), Request: request}, nil
}), stamp)
client.mu.Lock()
client.sessionToken = "session-token"
client.sessionExpiresAt = stamp.Add(time.Hour)
client.mu.Unlock()
var events []LogStreamEvent
if err := client.StreamLogEvents(context.Background(), func(event LogStreamEvent) error {
events = append(events, event)
return nil
}); err != nil {
t.Fatalf("stream log events: %v", err)
}
if len(events) != 1 || events[0].Entry.Seq != 7 || events[0].Entry.Line != "SCUM LOGIN 76561198000000001 10.0.0.1" {
t.Fatalf("unexpected streamed log events: %#v", events)
}
}
func TestReadLogEventStreamRejectsMalformedLogEvent(t *testing.T) {
err := readLogEventStream(context.Background(), strings.NewReader("event: log\ndata: {not-json}\n\n"), func(LogStreamEvent) error { return nil })
if err == nil || !strings.Contains(err.Error(), "decode log event") {
t.Fatalf("expected malformed log event rejection, got %v", err)
}
}