64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import { handlePageControlMessage } from '@/agent/RemotePageController.background'
|
|
import { handleTabControlMessage, setupTabEventsPort } from '@/agent/TabsController.background'
|
|
|
|
export default defineBackground(() => {
|
|
console.log('[Background] Service Worker started')
|
|
|
|
// tab change events
|
|
|
|
setupTabEventsPort()
|
|
|
|
// generate user auth token
|
|
|
|
chrome.storage.local.get('PageAgentExtUserAuthToken').then((result) => {
|
|
if (result.PageAgentExtUserAuthToken) return
|
|
|
|
const userAuthToken = crypto.randomUUID()
|
|
chrome.storage.local.set({ PageAgentExtUserAuthToken: userAuthToken })
|
|
})
|
|
|
|
// 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
|
|
}
|
|
})
|
|
|
|
// 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
|
|
}
|
|
})
|
|
|
|
// setup
|
|
|
|
chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true }).catch(() => {})
|
|
})
|
|
|
|
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 })
|
|
}
|