2026-01-27 17:21:32 +08:00
|
|
|
import { handlePageControlMessage } from '@/agent/RemotePageController.background'
|
2026-03-30 21:40:16 +08:00
|
|
|
import { handleTabControlMessage, setupTabEventsPort } from '@/agent/TabsController.background'
|
2026-01-21 18:46:50 +08:00
|
|
|
|
2026-01-24 19:29:27 +08:00
|
|
|
export default defineBackground(() => {
|
2026-01-26 21:03:51 +08:00
|
|
|
console.log('[Background] Service Worker started')
|
2026-01-21 18:46:50 +08:00
|
|
|
|
2026-02-11 19:51:19 +08:00
|
|
|
// tab change events
|
|
|
|
|
|
2026-03-30 21:40:16 +08:00
|
|
|
setupTabEventsPort()
|
2026-02-11 19:51:19 +08:00
|
|
|
|
2026-01-28 23:03:03 +08:00
|
|
|
// generate user auth token
|
|
|
|
|
|
2026-01-28 19:47:15 +08:00
|
|
|
chrome.storage.local.get('PageAgentExtUserAuthToken').then((result) => {
|
|
|
|
|
if (result.PageAgentExtUserAuthToken) return
|
|
|
|
|
|
|
|
|
|
const userAuthToken = crypto.randomUUID()
|
|
|
|
|
chrome.storage.local.set({ PageAgentExtUserAuthToken: userAuthToken })
|
|
|
|
|
})
|
|
|
|
|
|
2026-02-10 21:59:58 +08:00
|
|
|
// message proxy
|
|
|
|
|
|
|
|
|
|
chrome.runtime.onMessage.addListener((message, sender, sendResponse): true | undefined => {
|
|
|
|
|
if (message.type === 'TAB_CONTROL') {
|
|
|
|
|
return handleTabControlMessage(message, sender, sendResponse)
|
|
|
|
|
} else if (message.type === 'PAGE_CONTROL') {
|
|
|
|
|
return handlePageControlMessage(message, sender, sendResponse)
|
|
|
|
|
} else {
|
|
|
|
|
sendResponse({ error: 'Unknown message type' })
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-01-28 23:03:03 +08:00
|
|
|
})
|
|
|
|
|
|
2026-03-18 03:12:20 +08:00
|
|
|
// external messages (from localhost launcher page via externally_connectable)
|
|
|
|
|
|
|
|
|
|
chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
|
|
|
|
|
if (message.type === 'OPEN_HUB') {
|
|
|
|
|
openOrFocusHubTab(message.wsPort).then(() => {
|
|
|
|
|
if (sender.tab?.id) chrome.tabs.remove(sender.tab.id)
|
|
|
|
|
sendResponse({ ok: true })
|
|
|
|
|
})
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2026-02-11 19:51:19 +08:00
|
|
|
// setup
|
2026-02-10 21:59:58 +08:00
|
|
|
|
2026-02-11 19:51:19 +08:00
|
|
|
chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }).catch(() => {})
|
2026-01-24 19:29:27 +08:00
|
|
|
})
|
2026-03-18 03:12:20 +08:00
|
|
|
|
|
|
|
|
async function openOrFocusHubTab(wsPort: number) {
|
|
|
|
|
const hubUrl = chrome.runtime.getURL('hub.html')
|
|
|
|
|
const existing = await chrome.tabs.query({ url: `${hubUrl}*` })
|
|
|
|
|
|
|
|
|
|
if (existing.length > 0 && existing[0].id) {
|
|
|
|
|
await chrome.tabs.update(existing[0].id, {
|
|
|
|
|
active: true,
|
|
|
|
|
url: `${hubUrl}?ws=${wsPort}`,
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await chrome.tabs.create({ url: `${hubUrl}?ws=${wsPort}`, pinned: true })
|
|
|
|
|
}
|