worker+voice: per-conn context, store error hygiene, StateDir wiring, pipe leak

worker/server.go: dispatch now receives a per-connection context instead of
context.Background(), so handler cancellation propagates on conn close.

voice/server.go: same — per-conn context fed through safeDispatch into
HandlePushToTalk instead of context.Background().

store/reminders.go: propagate LastInsertId error.
store/nudges.go: propagate LastInsertId and RowsAffected errors.
store/tools.go: propagate RowsAffected error.

config/config.go: applyDefaults now respects StateDir when set, using it as
the base for empty DBPath/SocketPath instead of silently ignoring it.

phraser/llmphraser.go: close stderr pipe fd when cmd.Start() fails.
This commit is contained in:
kami
2026-07-03 11:03:14 +02:00
parent b77f209686
commit 861e418669
7 changed files with 47 additions and 18 deletions
+8 -6
View File
@@ -115,12 +115,14 @@ func (srv *Server) Serve() error {
func (srv *Server) serveConn(c net.Conn) {
id := srv.connCount.Add(1)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
for {
var req Request
if err := readFrame(c, &req); err != nil {
return // EOF / malformed ⇒ end this conn
}
result, err := srv.safeDispatch(c.RemoteAddr(), id, req)
result, err := srv.safeDispatch(ctx, c.RemoteAddr(), id, req)
resp := Response{}
if err != nil {
resp.Error = rpcErr(err)
@@ -133,16 +135,16 @@ func (srv *Server) serveConn(c net.Conn) {
}
}
func (srv *Server) safeDispatch(addr net.Addr, id uint64, req Request) (result json.RawMessage, err error) {
func (srv *Server) safeDispatch(ctx context.Context, addr net.Addr, id uint64, req Request) (result json.RawMessage, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("worker: panic dispatching %s (conn %d): %v", req.Method, id, r)
}
}()
return srv.dispatch(req)
return srv.dispatch(ctx, req)
}
func (srv *Server) dispatch(req Request) (json.RawMessage, error) {
func (srv *Server) dispatch(ctx context.Context, req Request) (json.RawMessage, error) {
switch req.Method {
case MethodTranscribe:
if srv.t == nil {
@@ -152,7 +154,7 @@ func (srv *Server) dispatch(req Request) (json.RawMessage, error) {
if err := unmarshalParams(req.Params, &p); err != nil {
return nil, err
}
resp, err := srv.t.Transcribe(context.Background(), p)
resp, err := srv.t.Transcribe(ctx, p)
if err != nil {
return nil, err
}
@@ -166,7 +168,7 @@ func (srv *Server) dispatch(req Request) (json.RawMessage, error) {
if err := unmarshalParams(req.Params, &p); err != nil {
return nil, err
}
resp, err := srv.s.Synthesize(context.Background(), p)
resp, err := srv.s.Synthesize(ctx, p)
if err != nil {
return nil, err
}