fix: stabilize im server startup and p2p topic scans

This commit is contained in:
richjohnrambo
2026-08-24 16:20:02 +08:00
parent e61058ec03
commit 07376c70e3
8 changed files with 124 additions and 30 deletions
+30
View File
@@ -0,0 +1,30 @@
package types
import "testing"
func TestDefaultAccessScanAllowsNil(t *testing.T) {
var da DefaultAccess
if err := da.Scan(nil); err != nil {
t.Fatalf("Scan(nil) returned error: %v", err)
}
if da.Auth != ModeNone || da.Anon != ModeNone {
t.Fatalf("Scan(nil) changed default access: %#v", da)
}
}
func TestDefaultAccessScanJSON(t *testing.T) {
for name, input := range map[string]any{
"bytes": []byte(`{"Auth":"JRWP","Anon":"N"}`),
"string": `{"Auth":"JRWP","Anon":"N"}`,
} {
t.Run(name, func(t *testing.T) {
var da DefaultAccess
if err := da.Scan(input); err != nil {
t.Fatalf("Scan returned error: %v", err)
}
if da.Auth.String() != "JRWP" || da.Anon.String() != "N" {
t.Fatalf("unexpected default access: %#v", da)
}
})
}
}
+11 -1
View File
@@ -863,7 +863,17 @@ type DefaultAccess struct {
// Scan is an implementation of Scanner interface so the value can be read from SQL DBs
// It assumes the value is serialized and stored as JSON
func (da *DefaultAccess) Scan(val any) error {
return json.Unmarshal(val.([]byte), da)
if val == nil {
return nil
}
switch v := val.(type) {
case []byte:
return json.Unmarshal(v, da)
case string:
return json.Unmarshal([]byte(v), da)
default:
return errors.New("scan failed: data is not a byte slice or string")
}
}
// Value implements sql's driver.Valuer interface.