From c62f2c86a91c3be0bf6456787c83e87c74749425 Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 21:37:15 +0000 Subject: [PATCH] fix(proxy): omit null errors from success replies Co-Authored-By: Virgil --- miner_login_test.go | 37 +++++++++++++++++++++++++++++++++++++ state_impl.go | 2 -- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/miner_login_test.go b/miner_login_test.go index 75a0862..c4fab4b 100644 --- a/miner_login_test.go +++ b/miner_login_test.go @@ -226,6 +226,43 @@ func TestMiner_HandleLogin_CustomDiffCap_Good(t *testing.T) { } } +func TestMiner_HandleKeepalived_Good(t *testing.T) { + minerConn, clientConn := net.Pipe() + defer minerConn.Close() + defer clientConn.Close() + + miner := NewMiner(minerConn, 3333, nil) + + done := make(chan struct{}) + go func() { + miner.handleKeepalived(stratumRequest{ID: 9, Method: "keepalived"}) + close(done) + }() + + line, err := bufio.NewReader(clientConn).ReadBytes('\n') + if err != nil { + t.Fatalf("read keepalived response: %v", err) + } + <-done + + var payload map[string]json.RawMessage + if err := json.Unmarshal(line, &payload); err != nil { + t.Fatalf("unmarshal keepalived response: %v", err) + } + if _, ok := payload["error"]; ok { + t.Fatalf("expected keepalived response to omit error field, got %s", string(line)) + } + var result struct { + Status string `json:"status"` + } + if err := json.Unmarshal(payload["result"], &result); err != nil { + t.Fatalf("unmarshal keepalived result: %v", err) + } + if result.Status != "KEEPALIVED" { + t.Fatalf("expected KEEPALIVED status, got %q", result.Status) + } +} + func TestMiner_ReadLoop_RFCLineLimit_Good(t *testing.T) { minerConn, clientConn := net.Pipe() defer minerConn.Close() diff --git a/state_impl.go b/state_impl.go index 4ded77d..a430795 100644 --- a/state_impl.go +++ b/state_impl.go @@ -1090,7 +1090,6 @@ func (m *Miner) replyLoginSuccess(id int64) { payload := map[string]any{ "id": id, "jsonrpc": "2.0", - "error": nil, "result": result, } _ = m.writeJSON(payload) @@ -1138,7 +1137,6 @@ func (m *Miner) Success(id int64, status string) { payload := map[string]any{ "id": id, "jsonrpc": "2.0", - "error": nil, "result": map[string]any{ "status": status, },