http/chrome.go

83 lines
1.9 KiB
Go
Raw Normal View History

2025-07-21 00:09:21 +08:00
package http
import (
"runtime"
"sync"
"apigo.cc/gojs"
"apigo.cc/gojs/goja"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
"github.com/ssgo/u"
)
type Chrome struct {
id string
launcher *launcher.Launcher
browser *rod.Browser
}
var chromes = map[string]*Chrome{}
var chromesLock sync.Mutex
2025-07-22 20:45:03 +08:00
func (ch *Chrome) Close(vm *goja.Runtime) {
logger := gojs.GetLogger(vm)
2025-07-21 00:09:21 +08:00
if ch.browser != nil {
2025-07-22 20:45:03 +08:00
logger.Info("关闭本地 Chrome 浏览器", "id", ch.id)
2025-07-21 00:09:21 +08:00
ch.browser.Close()
ch.browser = nil
}
if ch.launcher != nil {
ch.launcher.Cleanup()
ch.launcher = nil
}
chromesLock.Lock()
delete(chromes, ch.id)
chromesLock.Unlock()
}
2025-07-22 20:45:03 +08:00
func CloseAllChrome(vm *goja.Runtime) {
2025-07-21 00:09:21 +08:00
n := len(chromes)
if n > 0 {
for _, ch := range chromes {
2025-07-22 20:45:03 +08:00
ch.Close(vm)
2025-07-21 00:09:21 +08:00
}
2025-07-22 20:45:03 +08:00
logger := gojs.GetLogger(vm)
logger.Info("关闭所有 Chrome 浏览器", "count", n)
2025-07-21 00:09:21 +08:00
}
}
func StartChrome(showWindow *bool, vm *goja.Runtime) (*Chrome, error) {
logger := gojs.GetLogger(vm)
ch := &Chrome{}
2025-07-22 20:45:03 +08:00
ch.id = u.UniqueId()
2025-07-21 00:09:21 +08:00
ch.browser = rod.New()
if localBrowserPath, hasLocalBrowser := launcher.LookPath(); hasLocalBrowser {
ch.launcher = launcher.New().Bin(localBrowserPath).Headless(!u.Bool(showWindow)).Set("no-sandbox").Set("disable-gpu").Set("disable-dev-shm-usage").Set("single-process")
switch runtime.GOOS {
case "linux":
ch.launcher.Set("disable-setuid-sandbox")
case "windows":
ch.launcher.Set("disable-features=RendererCodeIntegrity")
}
localChromeURL, err := ch.launcher.Launch()
if err != nil {
2025-07-22 20:45:03 +08:00
ch.Close(vm)
2025-07-21 00:09:21 +08:00
return nil, gojs.Err(err)
}
2025-07-22 20:45:03 +08:00
logger.Info("启动本地 Chrome 浏览器", "id", ch.id, "url", localChromeURL, "path", localBrowserPath)
2025-07-21 00:09:21 +08:00
ch.browser.ControlURL(localChromeURL)
}
if err := ch.browser.Connect(); err != nil {
2025-07-22 20:45:03 +08:00
ch.Close(vm)
2025-07-21 00:09:21 +08:00
return nil, gojs.Err(err)
}
chromesLock.Lock()
chromes[ch.id] = ch
chromesLock.Unlock()
return ch, nil
}