mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-17 08:02:12 -06:00
8362f74c99
* feat(browser): add all-tabs extension access * fix(browser): preserve cancel revocation during startup * test(browser): align all-tabs Chromium fixtures
89 lines
2.9 KiB
JavaScript
89 lines
2.9 KiB
JavaScript
/** Build the authenticated application-command dispatcher for the relay socket. */
|
|
export function createRelayCommandHandler({
|
|
send,
|
|
attachDebugger,
|
|
detachDebugger,
|
|
addTabToOpenClawGroup,
|
|
focusWindowForTab,
|
|
scheduleTabsSync,
|
|
captureAccess,
|
|
requireAccessibleTab,
|
|
}) {
|
|
return async (message) => {
|
|
const { seq } = message;
|
|
try {
|
|
switch (message.type) {
|
|
case "ping":
|
|
send({ type: "pong" });
|
|
return;
|
|
case "attach":
|
|
send({ type: "result", seq, result: await attachDebugger(message.tabId) });
|
|
return;
|
|
case "detach":
|
|
await detachDebugger(message.tabId);
|
|
send({ type: "result", seq, result: {} });
|
|
return;
|
|
case "cdp": {
|
|
const epoch = captureAccess(message.tabId);
|
|
await requireAccessibleTab(message.tabId, epoch);
|
|
const target = message.sessionId
|
|
? { tabId: message.tabId, sessionId: message.sessionId }
|
|
: { tabId: message.tabId };
|
|
const result = await chrome.debugger.sendCommand(
|
|
target,
|
|
message.method,
|
|
message.params ?? {},
|
|
);
|
|
await requireAccessibleTab(message.tabId, epoch);
|
|
send({ type: "result", seq, result: result ?? {} });
|
|
return;
|
|
}
|
|
case "createTab": {
|
|
const tab = await chrome.tabs.create({
|
|
url: message.url,
|
|
active: message.background !== true,
|
|
});
|
|
await addTabToOpenClawGroup(tab.id);
|
|
if (message.focus === true) {
|
|
await focusWindowForTab(tab);
|
|
}
|
|
scheduleTabsSync();
|
|
send({ type: "result", seq, result: { tabId: tab.id } });
|
|
return;
|
|
}
|
|
case "closeTab": {
|
|
const epoch = captureAccess(message.tabId);
|
|
await requireAccessibleTab(message.tabId, epoch);
|
|
await detachDebugger(message.tabId);
|
|
await requireAccessibleTab(message.tabId, epoch);
|
|
await chrome.tabs.remove(message.tabId);
|
|
send({ type: "result", seq, result: {} });
|
|
return;
|
|
}
|
|
case "activateTab": {
|
|
const epoch = captureAccess(message.tabId);
|
|
const tab = await requireAccessibleTab(message.tabId, epoch);
|
|
await chrome.tabs.update(message.tabId, { active: true });
|
|
await requireAccessibleTab(message.tabId, epoch);
|
|
await focusWindowForTab(tab);
|
|
await requireAccessibleTab(message.tabId, epoch);
|
|
send({ type: "result", seq, result: {} });
|
|
return;
|
|
}
|
|
default:
|
|
if (typeof seq === "number") {
|
|
send({ type: "error", seq, message: `unknown relay command: ${message.type}` });
|
|
}
|
|
}
|
|
} catch (error) {
|
|
if (typeof seq === "number") {
|
|
send({
|
|
type: "error",
|
|
seq,
|
|
message: error instanceof Error ? error.message : String(error),
|
|
});
|
|
}
|
|
}
|
|
};
|
|
}
|