feat(ext): improve token validation and error handling

This commit is contained in:
Simon
2026-01-28 19:59:55 +08:00
parent ef2d115742
commit d6323f1488
3 changed files with 63 additions and 19 deletions

View File

@@ -35,6 +35,9 @@ export class MultiPageAgent extends PageAgentCore {
chrome.storage.local.set({
isAgentRunning: false,
})
// no need to dispose tabsController and pageController
// as they do not keep references
},
})
}

View File

@@ -13,13 +13,22 @@ export default defineContentScript({
// if auth token matches, expose agent to page
chrome.storage.local.get('PageAgentExtUserAuthToken').then((result) => {
if (!result.PageAgentExtUserAuthToken) return
if (!localStorage.getItem('PageAgentExtUserAuthToken')) return
if (localStorage.getItem('PageAgentExtUserAuthToken') !== result.PageAgentExtUserAuthToken)
return
// extension side token.
// @note this is isolated world. it is safe to assume user script cannot access it
const extToken = result.PageAgentExtUserAuthToken
if (!extToken) return
exposeAgentToPage()
injectScript('/main-world.js')
// page side token
const pageToken = localStorage.getItem('PageAgentExtUserAuthToken')
if (!pageToken) return
if (pageToken !== extToken) return
// add isolated world script
exposeAgentToPage().then(
// add main-world script
() => injectScript('/main-world.js')
)
})
},
})
@@ -42,18 +51,45 @@ async function exposeAgentToPage() {
switch (action) {
case 'execute': {
if (!multiPageAgent) multiPageAgent = new MultiPageAgent(DEMO_CONFIG)
if (multiPageAgent && multiPageAgent.status === 'running') {
window.postMessage(
{
channel: 'PAGE_AGENT_EXT_RESPONSE',
id,
action: 'execute_result',
error: 'Agent is already running a task. Please wait until it finishes.',
},
'*'
)
return
}
try {
multiPageAgent = new MultiPageAgent(DEMO_CONFIG)
const result = await multiPageAgent.execute(payload)
window.postMessage(
{
channel: 'PAGE_AGENT_EXT_RESPONSE',
id,
action: 'execute_result',
payload: result,
},
'*'
)
} catch (error) {
window.postMessage(
{
channel: 'PAGE_AGENT_EXT_RESPONSE',
id,
action: 'execute_result',
error: (error as Error).message,
},
'*'
)
}
const result = await multiPageAgent.execute(payload)
window.postMessage(
{
channel: 'PAGE_AGENT_EXT_RESPONSE',
id,
action: 'execute_result',
payload: result,
},
'*'
)
break
}

View File

@@ -10,7 +10,7 @@ export default defineUnlistedScript(() => {
w.execute = async (task: string) => {
const id = getId()
const promise = new Promise((resolve) => {
const promise = new Promise((resolve, reject) => {
function handleMessage(e: MessageEvent) {
const data = e.data
if (typeof data !== 'object' || data === null) return
@@ -19,7 +19,12 @@ export default defineUnlistedScript(() => {
if (data.id !== id) return
window.removeEventListener('message', handleMessage)
resolve(data.payload)
if (data.error) {
reject(new Error(data.error))
} else {
resolve(data.payload)
}
}
window.addEventListener('message', handleMessage)