import ServiceWorkerManager from "./app/service/service_worker"; import migrate from "./app/migrate"; import LoggerCore from "./app/logger/core"; import DBWriter from "./app/logger/db_writer"; import { LoggerDAO } from "./app/repo/logger"; import { ExtensionMessage } from "@Packages/message/extension_message"; import { Server } from "@Packages/message/server"; import { MessageQueue } from "@Packages/message/message_queue"; import { ServiceWorkerMessageSend } from "@Packages/message/window_message"; const OFFSCREEN_DOCUMENT_PATH = "src/offscreen.html"; let creating: Promise | null; async function hasDocument() { const offscreenUrl = chrome.runtime.getURL(OFFSCREEN_DOCUMENT_PATH); const existingContexts = await chrome.runtime.getContexts({ contextTypes: [chrome.runtime.ContextType.OFFSCREEN_DOCUMENT], documentUrls: [offscreenUrl], }); return existingContexts.length > 0; } async function setupOffscreenDocument() { //if we do not have a document, we are already setup and can skip if (!(await hasDocument())) { // create offscreen document if (creating) { await creating; } else { creating = chrome.offscreen.createDocument({ url: OFFSCREEN_DOCUMENT_PATH, reasons: [ chrome.offscreen.Reason.BLOBS, chrome.offscreen.Reason.CLIPBOARD, chrome.offscreen.Reason.DOM_SCRAPING, chrome.offscreen.Reason.LOCAL_STORAGE, ], justification: "offscreen page", }); await creating; creating = null; } } } async function main() { // 初始化数据库 migrate(); // 初始化日志组件 const loggerCore = new LoggerCore({ writer: new DBWriter(new LoggerDAO()), labels: { env: "service_worker" }, }); loggerCore.logger().debug("service worker start"); // 初始化管理器 const server = new Server("serviceWorker", new ExtensionMessage()); const manager = new ServiceWorkerManager(server, new MessageQueue(), new ServiceWorkerMessageSend()); manager.initManager(); // 初始化沙盒环境 await setupOffscreenDocument(); } main();