software steht so weit.

jetzt build + docker build und testen
This commit is contained in:
br committed 2026-10-02 13:25:34 +02:00
1 parent 42f0c0accb
commit ca6cdcca63
90 files changed
+10298 -480

No files matched your search

+16 -6
View File
@@ -1,6 +1,7 @@
package stream
import (
"crypto/ed25519"
"errors"
"fmt"
"net/http"
@@ -41,6 +42,9 @@ type Hub struct {
// nur ein weiteres OnConnect, kein OnDisconnect.
OnConnect func(nodeID string)
OnDisconnect func(nodeID string)
// SigningKey: Ist er gesetzt, signiert der Hub jedes Event, nachdem er ID,
// Zeitstempel und Knoten-ID ergänzt hat.
SigningKey ed25519.PrivateKey
mu sync.Mutex
conns map[string]*conn
@@ -86,6 +90,15 @@ func (h *Hub) Serve(w http.ResponseWriter, r *http.Request, nodeID string) error
return ErrHubClosed
}
// Erst registrieren, dann die Header senden: Sobald der Client die
// Antwort sieht, muss der Knoten als verbunden gelten (der Agent schickt
// direkt danach seinen Zustand).
c := &conn{frames: make(chan []byte, h.bufferSize()), done: make(chan struct{})}
if err := h.register(nodeID, c); err != nil {
return err
}
defer h.unregister(nodeID, c)
rc := http.NewResponseController(w)
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
@@ -98,12 +111,6 @@ func (h *Hub) Serve(w http.ResponseWriter, r *http.Request, nodeID string) error
return err
}
c := &conn{frames: make(chan []byte, h.bufferSize()), done: make(chan struct{})}
if err := h.register(nodeID, c); err != nil {
return err
}
defer h.unregister(nodeID, c)
ticker := time.NewTicker(h.keepAlive())
defer ticker.Stop()
write := func(p []byte) error {
@@ -185,6 +192,9 @@ func (h *Hub) Send(nodeID string, ev Event) error {
ev.Timestamp = time.Now().Unix()
}
ev.NodeID = nodeID
if h.SigningKey != nil {
ev = SignEvent(ev, h.SigningKey)
}
frame, err := encode(ev)
if err != nil {
return err