Changes
3 changed files (+151/-3)
-
-
@@ -10,6 +10,8 @@ golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-
-
-
@@ -0,0 +1,147 @@// SPDX-FileCopyrightText: 2025 Shota FUJI <pockawoooh@gmail.com> // SPDX-License-Identifier: AGPL-3.0-only //go:build js && wasm package main import ( "context" "log/slog" "syscall/js" ) type BrowserConsoleLogHandler struct { attrs []slog.Attr group string parent *BrowserConsoleLogHandler } func NewBrowserConsoleLogHandler() *BrowserConsoleLogHandler { return &BrowserConsoleLogHandler{ attrs: nil, group: "", parent: nil, } } func (*BrowserConsoleLogHandler) Enabled(_ context.Context, _ slog.Level) bool { return true } func newObject() js.Value { obj := js.Global().Get("Object").Call("create", js.Null()) return obj } func safeJsValueOf(x slog.Value) js.Value { switch x.Kind() { case slog.KindBool: return js.ValueOf(x.Bool()) case slog.KindInt64: return js.ValueOf(x.Int64()) case slog.KindUint64: return js.ValueOf(x.Uint64()) case slog.KindFloat64: return js.ValueOf(x.Float64()) case slog.KindGroup: group := newObject() for _, g := range x.Group() { group.Set(g.Key, safeJsValueOf(g.Value)) } return group default: return js.ValueOf(x.String()) } } func (h *BrowserConsoleLogHandler) getAttrsObject() (js.Value, js.Value) { var obj js.Value var root js.Value if h.parent == nil { root = newObject() obj = root if h.group != "" { child := newObject() root.Set(h.group, child) obj = child } } else { var parent js.Value parent, root = h.parent.getAttrsObject() obj = parent if h.group != "" { child := newObject() parent.Set(h.group, child) obj = child } } if len(h.attrs) == 0 { return obj, root } for _, attr := range h.attrs { obj.Set(attr.Key, safeJsValueOf(attr.Value)) } return obj, root } func (h *BrowserConsoleLogHandler) Handle(ctx context.Context, record slog.Record) error { console := js.Global().Get("console") var method string switch record.Level { case slog.LevelDebug: method = "debug" case slog.LevelInfo: method = "info" case slog.LevelWarn: method = "warn" case slog.LevelError: method = "error" } message := record.Message + "\n" attrs, attrsRoot := h.getAttrsObject() record.Attrs(func(attr slog.Attr) bool { attrs.Set(attr.Key, safeJsValueOf(attr.Value)) return true }) properties := js.Global().Get("Object").Call("keys", attrsRoot).Get("length") if properties.Equal(js.ValueOf(0)) { console.Call(method, message) } else { console.Call(method, message, attrsRoot) } return nil } func (h *BrowserConsoleLogHandler) WithAttrs(attrs []slog.Attr) slog.Handler { return &BrowserConsoleLogHandler{ attrs: attrs, group: "", parent: h, } } func (h *BrowserConsoleLogHandler) WithGroup(name string) slog.Handler { if name == "" { return h } return &BrowserConsoleLogHandler{ attrs: nil, group: name, parent: h, } }
-
-
-
@@ -18,9 +18,8 @@_ "github.com/matrix-org/go-sqlite3-js" ) // TODO: console のメソッドを使ったロガーを実装する func main() { logger := slog.Default() logger := slog.New(NewBrowserConsoleLogHandler()) db, err := sql.Open("sqlite3", "yamori.wasm") if err != nil {
-
@@ -28,7 +27,7 @@ logger.Error("Failed to open database", "error", err)os.Exit(2) } core, err := core.New(db, slog.Default()) core, err := core.New(db, logger) if err != nil { logger.Error("Failed to create core instance", "error", err) os.Exit(3)
-