Files
cremote/error.md
Josh at WLTechBlog 051b912122 fix crash
2025-12-12 07:57:09 -07:00

2.7 KiB

Cremote Daemon Crash - Rod Library Nil Map Panic

Error Summary

The daemon crashed with a panic: assignment to entry in nil map in the rod library's setHelper function.

Root Cause

This is a known issue in the go-rod library (see https://github.com/go-rod/rod/issues/331).

When pages are retrieved using browser.Pages(), the returned *rod.Page objects are not fully initialized. Specifically, internal maps (like the helper map used for JavaScript evaluation) are nil. When methods like WaitLoad() try to use these pages, they attempt to write to nil maps, causing a panic.

This typically happens when:

  1. The daemon is restarted but the browser is still running with existing tabs
  2. A tab is created outside of the daemon
  3. A tab was removed from the cache but still exists in the browser

Stack Trace

headlesschromium  | panic: assignment to entry in nil map
headlesschromium  |
headlesschromium  | goroutine 466 [running]:
headlesschromium  | github.com/go-rod/rod.(*Page).setHelper(0x95fc61?, {0xc000156888?, 0x935bc0?}, {0x9553a2, 0x8}, {0xc0003aa1b0, 0x17})
headlesschromium  |     /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:320 +0xdf
headlesschromium  | github.com/go-rod/rod.(*Page).ensureJSHelper(0xc00013e2c0, 0xf70e80)
headlesschromium  |     /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:292 +0x47c
headlesschromium  | github.com/go-rod/rod.(*Page).WaitLoad(0xc00013e2c0)
headlesschromium  |     /root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page.go:858 +0x1a5
headlesschromium  | git.teamworkapps.com/shortcut/cremote/daemon.(*Daemon).loadURL.func1()
headlesschromium  |     /tmp/cremote/daemon/daemon.go:2532 +0x9d

Fix Applied

Modified daemon/daemon.go in the findPageByID function to:

  1. Initialize pages properly: Call p.Info() on pages retrieved from browser.Pages() to ensure internal state is initialized
  2. Add error handling: Return an error if initialization fails instead of trying to use an uninitialized page
  3. Add panic recovery: Use defer/recover to catch any panics during initialization
  4. Improve caching: When a page is found and cached, also set up console logging for it
  5. Add debug logging: Log when pages are found and cached from the browser

Code Changes

See daemon/daemon.go lines 2363-2400 and 2428-2448.

Testing

The code compiles successfully. The fix should prevent the panic by ensuring pages are properly initialized before use.

Prevention

To avoid this issue in the future:

  • Always create tabs through the daemon's openTab function
  • Avoid manually creating tabs in the browser when the daemon is running
  • If the daemon is restarted, consider closing all existing browser tabs first