Files
cremote/error.md
Josh at WLTechBlog f09cdc2973 crash fix
2025-12-24 11:00:37 -07:00

3.0 KiB

FIXED: Rod Library Nil Map Panic in loadURL

Original Error

panic: assignment to entry in nil map

goroutine 78 [running]:
github.com/go-rod/rod.(*Page).setHelper(0x962da8?, {0xc000212258?, 0x938c80?}, {0x9584a2, 0x8}, {0xc000212288, 0x17})
    /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:320 +0xdf
github.com/go-rod/rod.(*Page).ensureJSHelper(0xc000140210, 0xf76e80)
    /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:292 +0x47c
github.com/go-rod/rod.(*Page).formatArgs(0xc000140210, 0xc00012eda8?)
    /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:234 +0x1e5
github.com/go-rod/rod.(*Page).evaluate(0xc000140210, 0xc0000d5f00)
    /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:150 +0x32
github.com/go-rod/rod.(*Page).Evaluate(0xc000140210, 0xc0000d5f00)
    /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:129 +0x4a
github.com/go-rod/rod.(*Page).WaitLoad(0xc000140210)
    /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page.go:858 +0x1a5
git.teamworkapps.com/shortcut/cremote/daemon.(*Daemon).loadURL.func1()
    /tmp/cremote/daemon/daemon.go:2616 +0x9d
created by git.teamworkapps.com/shortcut/cremote/daemon.(*Daemon).loadURL in goroutine 74
    /tmp/cremote/daemon/daemon.go:2608 +0x345

Root Cause

This is a known issue in go-rod v0.116.2 (https://github.com/go-rod/rod/issues/331).

When page.WaitLoad() is called in a goroutine, there can be race conditions with the internal helper map initialization. The page's internal maps may not be fully initialized when the goroutine starts executing, causing a nil map panic.

Solution Applied

Modified daemon/daemon.go in the loadURL function (lines 2589-2629):

  1. Added page initialization before goroutine (lines 2597-2603):

    • Call page.Info() to ensure internal state is initialized
    • This prevents the nil map issue by forcing initialization on the main goroutine
  2. Added panic recovery in goroutine (lines 2618-2622):

    • Added defer/recover block to catch any panics
    • Returns descriptive error message if panic occurs
    • Prevents daemon crash and allows graceful error handling

Code Changes

// Ensure page is fully initialized before using in goroutine
// This prevents "assignment to entry in nil map" panics in rod library
// See: https://github.com/go-rod/rod/issues/331
_, err = page.Info()
if err != nil {
    d.debugLog("Warning: failed to initialize page %s: %v", tabID, err)
    // Continue anyway, as the page might still work
}

// Execute the navigation in a goroutine
go func() {
    defer func() {
        if r := recover(); r != nil {
            done <- fmt.Errorf("navigation panicked: %v", r)
        }
    }()

    err := page.Navigate(url)
    // ... rest of navigation code
}()

Testing

Code compiles successfully Panic recovery in place Page initialization added before goroutine Consistent with fix in waitNavigation function

This is similar to the fix previously applied to findPageByID() and waitNavigation(), but was missing in loadURL().