2025-01-23 18:43:44 +08:00

87 lines
2.1 KiB
JavaScript

const { initCDP, cleanupCDP } = require("./cdp");
const { getCurrentClientPort } = require("./client");
const CDP = require("chrome-remote-interface");
const getTargets = async () => {
const port = await getCurrentClientPort();
return await CDP.List({ port });
};
const searchTarget = async (tab) => {
if (!tab || !tab.by || !tab.searchValue || tab.by === "active") {
const currentTab = await getCurrentTab();
return currentTab;
}
const targets = await getTargets();
const target = targets.find((target) =>
target[tab.by].includes(tab.searchValue)
);
if (!target) {
throw new Error(`未找到目标标签页: ${tab.by} = ${tab.searchValue}`);
}
return target;
};
const getTabs = async () => {
const targets = await getTargets();
return targets
.filter((target) => target.type === "page")
.map((target) => ({
url: target.url,
title: target.title,
id: target.id,
}));
};
const getCurrentTab = async () => {
const targets = await getTargets();
const currentTarget = targets.find((target) => target.type === "page");
if (!currentTarget) {
throw new Error("未找到当前活动标签页");
}
return {
url: currentTarget.url,
title: currentTarget.title,
id: currentTarget.id,
};
};
const activateTab = async (tab) => {
const target = await searchTarget(tab);
const port = await getCurrentClientPort();
await CDP.Activate({ id: target.id, port });
};
const createNewTab = async (url = "about:blank") => {
const currentTab = await getCurrentTab();
const { Target } = await initCDP(currentTab.id);
const { targetId } = await Target.createTarget({ url });
const { targetInfo } = await Target.getTargetInfo({ targetId });
await cleanupCDP(currentTab.id);
return {
url: targetInfo.url,
title: targetInfo.title,
id: targetId,
};
};
const closeTab = async (tab) => {
const target = await searchTarget(tab);
const port = await getCurrentClientPort();
await cleanupCDP(target.id);
await CDP.Close({ id: target.id, port });
};
module.exports = {
getTabs,
getCurrentTab,
activateTab,
createNewTab,
closeTab,
getTargets,
searchTarget,
};