aboutsummaryrefslogtreecommitdiffstats
path: root/relay/server.go
diff options
context:
space:
mode:
authorbndw <ben@bdw.to>2026-03-09 12:48:39 -0700
committerbndw <ben@bdw.to>2026-03-09 12:48:39 -0700
commit0bd392e076e36c80a152abe00cbcd0bc9efedd9c (patch)
tree2727cf8a030e675fa86082b56faf9fee4ddc45b1 /relay/server.go
parent2c1ec8f9e964c2e89eee900299db667d9a58db25 (diff)
feat: add axon CLI for pub/sub; fix relay hijack context bug
- cmd/axon: new CLI module with keygen, pub, and req subcommands - keygen: generate Ed25519 keypair, print hex seed and pubkey - pub: sign and publish an event; accepts --kind, --content, --tag - req: query/stream events as JSON lines; accepts --kind, --author, --tag, --since, --until, --limit, --stream - key loaded from --key flag or AXON_KEY env var - relay/websocket: add Dial() for client-side WebSocket handshake (ws:// and wss://, RFC 6455 masking via client:true) - relay/server: fix broken-pipe on auth by switching hijacked conn goroutine from r.Context() to context.Background(); r.Context() is cancelled by net/http immediately after Hijack is called
Diffstat (limited to 'relay/server.go')
-rw-r--r--relay/server.go5
1 files changed, 4 insertions, 1 deletions
diff --git a/relay/server.go b/relay/server.go
index 085929c..d4a1edd 100644
--- a/relay/server.go
+++ b/relay/server.go
@@ -98,7 +98,10 @@ func (s *Server) handleWS(w http.ResponseWriter, r *http.Request) {
98 s.mu.Add(1) 98 s.mu.Add(1)
99 go func() { 99 go func() {
100 defer s.mu.Done() 100 defer s.mu.Done()
101 ctx := r.Context() 101 // r.Context() is cancelled by the HTTP server when Hijack is called,
102 // so we use a fresh context. The connection manages its own lifecycle
103 // via the ping loop and WebSocket close frames.
104 ctx := context.Background()
102 h.serve(ctx) 105 h.serve(ctx)
103 if err := c.CloseConn(); err != nil { 106 if err := c.CloseConn(); err != nil {
104 // Ignore close errors — connection may already be gone. 107 // Ignore close errors — connection may already be gone.