From 67ba515b2c5186cd34c18856a1db2bbf193a3598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Thu, 24 Apr 2025 17:22:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/migrate.ts | 279 ++++++++++++++++++++--------- src/app/service/offscreen/index.ts | 4 + src/offscreen.ts | 13 +- src/pages/confirm/main.tsx | 6 +- src/pages/import/main.tsx | 6 +- src/pages/install/main.tsx | 6 +- src/pages/options/main.tsx | 3 + src/pages/popup/main.tsx | 6 +- src/service_worker.ts | 4 +- 9 files changed, 217 insertions(+), 110 deletions(-) diff --git a/src/app/migrate.ts b/src/app/migrate.ts index e2aac01..62b87b0 100644 --- a/src/app/migrate.ts +++ b/src/app/migrate.ts @@ -1,6 +1,9 @@ +import { getStorageName } from "@App/pkg/utils/utils"; import { db } from "./repo/dao"; import { Script, ScriptAndCode, ScriptCodeDAO, ScriptDAO } from "./repo/scripts"; import { Subscribe, SubscribeDAO } from "./repo/subscribe"; +import { Value, ValueDAO } from "./repo/value"; +import { Permission, PermissionDAO } from "./repo/permission"; // 0.10.0重构,重命名字段,统一使用小峰驼 function renameField() { @@ -33,99 +36,197 @@ function renameField() { // export是0.10.x时的兼容性处理 export: "++id,&scriptId", }); + const v = 36; // 将脚本数据迁移到chrome.storage - db.version(18).upgrade(async (tx) => { - // 迁移脚本 - const scripts = await tx.table("scripts").toArray(); - const scriptDAO = new ScriptDAO(); - const scriptCodeDAO = new ScriptCodeDAO(); - await Promise.all( - scripts.map((script: ScriptAndCode) => { - const { - uuid, - name, - namespace, - author, - originDomain, - subscribeUrl, - type, - sort, - status, - runStatus, - metadata, - createtime, - checktime, - code, - } = script; - return scriptDAO - .save({ - uuid, - name, - namespace, - author, - originDomain, - subscribeUrl, - type, - sort, - status, - runStatus, - metadata, - createtime, - checktime, - }) - .then((s) => - scriptCodeDAO.save({ - uuid: s.uuid, + db.version(v).upgrade(() => { + // 默认使用的事务,这里加个延时,用db.open()打开数据库后,再执行 + setTimeout(async () => { + try { + // 迁移脚本 + const scripts = await db.table("scripts").toArray(); + const scriptDAO = new ScriptDAO(); + const scriptCodeDAO = new ScriptCodeDAO(); + console.log("开始迁移脚本数据", scripts.length); + await Promise.all( + scripts.map(async (script: ScriptAndCode) => { + const { + uuid, + name, + namespace, + author, + originDomain, + subscribeUrl, + type, + sort, + status, + runStatus, + metadata, + createtime, + checktime, code, + checkUpdateUrl, + downloadUrl, + selfMetadata, + config, + error, + updatetime, + lastruntime, + nextruntime, + } = script; + const s = await scriptDAO.save({ + uuid, + name, + namespace, + author, + originDomain, + origin, + checkUpdateUrl, + downloadUrl, + metadata, + selfMetadata, + subscribeUrl, + config, + type, + status, + sort, + runStatus, + error, + createtime, + updatetime, + checktime, + lastruntime, + nextruntime, + }); + return scriptCodeDAO + .save({ + uuid: s.uuid, + code, + }) + .catch((e) => { + console.log("脚本代码迁移失败", e); + return Promise.reject(e); + }); + }) + ); + // 迁移订阅 + const subscribe = await db.table("subscribe").toArray(); + const subscribeDAO = new SubscribeDAO(); + if (subscribe.length) { + await Promise.all( + subscribe.map((s: Subscribe) => { + console.log("1234", s); + const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s; + return subscribeDAO.save({ + url, + name, + code, + author, + scripts, + metadata, + status, + createtime, + updatetime, + checktime, + }); }) ); - }) - ); - // 迁移订阅 - const subscribe = await tx.table("subscribe").toArray(); - const subscribeDAO = new SubscribeDAO(); - await Promise.all( - subscribe.map((s: Subscribe) => { - const { url, name, code, author, scripts, metadata, status, createtime, updatetime, checktime } = s; - return subscribeDAO.save({ - url, - name, - code, - author, - scripts, - metadata, - status, - createtime, - updatetime, - checktime, - }); - }) - ); - // 迁移value - interface MV2Value { - id: number; - scriptId: number; - storageName?: string; - key: string; - value: any; - createtime: number; - updatetime: number; - } - const values = await tx.table("value").toArray(); - const valueDAO = new ScriptCodeDAO(); - await Promise.all( - values.map((v) => { - const { scriptId, storageName, key, value, createtime } = v; - return valueDAO.save({ - scriptId, - storageName, - key, - value, - createtime, - }); - }) - ); - // 迁移permission + } + console.log("订阅数据迁移完成", subscribe.length); + // 迁移value + interface MV2Value { + id: number; + scriptId: number; + storageName?: string; + key: string; + value: any; + createtime: number; + updatetime: number; + } + const values = await db.table("value").toArray(); + const valueDAO = new ValueDAO(); + const valueMap = new Map(); + await Promise.all( + values.map((v: MV2Value) => { + const { scriptId, storageName, key, value, createtime } = v; + return db + .table("scripts") + .where("id") + .equals(scriptId) + .first((script: Script) => { + if (script) { + let data: { [key: string]: any } = {}; + if (!valueMap.has(script.uuid)) { + valueMap.set(script.uuid, { + uuid: script.uuid, + storageName: getStorageName(script), + data: data, + createtime, + updatetime: 0, + }); + } else { + data = valueMap.get(script.uuid)!.data; + } + data[key] = value; + } + }); + }) + ); + // 保存到数据库 + await Promise.all( + Array.from(valueMap.keys()).map((uuid) => { + const { storageName, data, createtime } = valueMap.get(uuid)!; + return valueDAO.save(storageName!, { + uuid, + storageName, + data, + createtime, + updatetime: 0, + }); + }) + ); + console.log("脚本value数据迁移完成", values.length); + // 迁移permission + const permissions = await db.table("permission").toArray(); + const permissionDAO = new PermissionDAO(); + await Promise.all( + permissions.map((p: Permission & { scriptId: number }) => { + const { scriptId, permission, permissionValue, createtime, updatetime, allow } = p; + return db + .table("scripts") + .where("id") + .equals(scriptId) + .first((script: Script) => { + if (script) { + return permissionDAO.save({ + uuid: script.uuid, + permission, + permissionValue, + createtime, + updatetime, + allow, + }); + } + }); + }) + ); + console.log("脚本permission数据迁移完成", permissions.length); + // 打开页面,告知数据储存+升级至了mv3,重启一次扩展 + setTimeout(async () => { + const scripts = await scriptDAO.all(); + console.log("脚本数据迁移完成", scripts.length); + if (scripts.length > 0) { + chrome.tabs.create({ + url: "https://docs.scriptcat.org/docs/change/v0.17/", + }); + setTimeout(() => { + chrome.runtime.reload(); + }, 1000); + } + }, 2000); + } catch (e) { + console.error("脚本数据迁移失败", e); + } + }, 200); }); return db.open(); } diff --git a/src/app/service/offscreen/index.ts b/src/app/service/offscreen/index.ts index 0251d4d..9c392e4 100644 --- a/src/app/service/offscreen/index.ts +++ b/src/app/service/offscreen/index.ts @@ -20,6 +20,10 @@ export class OffscreenManager { private serviceWorker = new ServiceWorkerClient(this.extensionMessage); + constructor(private extensionMessage:MessageSend) { + + } + logger(data: Logger) { const dao = new LoggerDAO(); dao.save(data); diff --git a/src/offscreen.ts b/src/offscreen.ts index c0e2ca4..868e30a 100644 --- a/src/offscreen.ts +++ b/src/offscreen.ts @@ -1,20 +1,19 @@ -import migrate from "./app/migrate"; +import { MessageSend } from "@Packages/message/server"; import LoggerCore from "./app/logger/core"; -import DBWriter from "./app/logger/db_writer"; -import { LoggerDAO } from "./app/repo/logger"; +import MessageWriter from "./app/logger/message_writer"; import { OffscreenManager } from "./app/service/offscreen"; - -migrate(); +import { ExtensionMessageSend } from "@Packages/message/extension_message"; function main() { // 初始化日志组件 + const extensionMessage: MessageSend = new ExtensionMessageSend(); const loggerCore = new LoggerCore({ - writer: new DBWriter(new LoggerDAO()), + writer: new MessageWriter(extensionMessage), labels: { env: "offscreen" }, }); loggerCore.logger().debug("offscreen start"); // 初始化管理器 - const manager = new OffscreenManager(); + const manager = new OffscreenManager(extensionMessage); manager.initManager(); } diff --git a/src/pages/confirm/main.tsx b/src/pages/confirm/main.tsx index 08e1a84..2b2f210 100644 --- a/src/pages/confirm/main.tsx +++ b/src/pages/confirm/main.tsx @@ -8,12 +8,12 @@ import "@App/index.css"; import { Provider } from "react-redux"; import { store } from "@App/pages/store/store.ts"; import LoggerCore from "@App/app/logger/core.ts"; -import { LoggerDAO } from "@App/app/repo/logger.ts"; -import DBWriter from "@App/app/logger/db_writer.ts"; +import MessageWriter from "@App/app/logger/message_writer.ts"; +import { message } from "../store/global.ts"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new DBWriter(new LoggerDAO()), + writer: new MessageWriter(message), labels: { env: "confirm" }, }); diff --git a/src/pages/import/main.tsx b/src/pages/import/main.tsx index 0aced25..d7fcc0c 100644 --- a/src/pages/import/main.tsx +++ b/src/pages/import/main.tsx @@ -8,12 +8,12 @@ import "@App/index.css"; import { Provider } from "react-redux"; import { store } from "@App/pages/store/store.ts"; import LoggerCore from "@App/app/logger/core.ts"; -import { LoggerDAO } from "@App/app/repo/logger.ts"; -import DBWriter from "@App/app/logger/db_writer.ts"; +import MessageWriter from "@App/app/logger/message_writer.ts"; +import { message } from "../store/global.ts"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new DBWriter(new LoggerDAO()), + writer: new MessageWriter(message), labels: { env: "import" }, }); diff --git a/src/pages/install/main.tsx b/src/pages/install/main.tsx index ed8a1a9..272bc23 100644 --- a/src/pages/install/main.tsx +++ b/src/pages/install/main.tsx @@ -8,12 +8,12 @@ import "@App/index.css"; import { Provider } from "react-redux"; import { store } from "@App/pages/store/store.ts"; import LoggerCore from "@App/app/logger/core.ts"; -import { LoggerDAO } from "@App/app/repo/logger.ts"; -import DBWriter from "@App/app/logger/db_writer.ts"; +import MessageWriter from "@App/app/logger/message_writer.ts"; +import { message } from "../store/global.ts"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new DBWriter(new LoggerDAO()), + writer: new MessageWriter(message), labels: { env: "install" }, }); diff --git a/src/pages/options/main.tsx b/src/pages/options/main.tsx index 6837f09..7d3a761 100644 --- a/src/pages/options/main.tsx +++ b/src/pages/options/main.tsx @@ -13,6 +13,9 @@ import { LoggerDAO } from "@App/app/repo/logger.ts"; import DBWriter from "@App/app/logger/db_writer.ts"; import registerEditor from "@App/pkg/utils/monaco-editor.ts"; import storeSubscribe from "../store/subscribe.ts"; +import migrate from "@App/app/migrate.ts"; + +migrate(); registerEditor(); // 初始化日志组件 diff --git a/src/pages/popup/main.tsx b/src/pages/popup/main.tsx index bcae2c1..113db71 100644 --- a/src/pages/popup/main.tsx +++ b/src/pages/popup/main.tsx @@ -2,18 +2,18 @@ import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App.tsx"; import LoggerCore from "@App/app/logger/core.ts"; -import { LoggerDAO } from "@App/app/repo/logger.ts"; -import DBWriter from "@App/app/logger/db_writer.ts"; import "@arco-design/web-react/dist/css/arco.css"; import "@App/locales/locales"; import "@App/index.css"; import "./index.css"; import { Provider } from "react-redux"; import { store } from "../store/store.ts"; +import MessageWriter from "@App/app/logger/message_writer.ts"; +import { message } from "../store/global.ts"; // 初始化日志组件 const loggerCore = new LoggerCore({ - writer: new DBWriter(new LoggerDAO()), + writer: new MessageWriter(message), labels: { env: "install" }, }); diff --git a/src/service_worker.ts b/src/service_worker.ts index 9a3d196..e891141 100644 --- a/src/service_worker.ts +++ b/src/service_worker.ts @@ -48,14 +48,14 @@ async function setupOffscreenDocument() { } async function main() { + // 初始化管理器 + const message = new ExtensionMessage(true); // 初始化日志组件 const loggerCore = new LoggerCore({ writer: new DBWriter(new LoggerDAO()), labels: { env: "service_worker" }, }); loggerCore.logger().debug("service worker start"); - // 初始化管理器 - const message = new ExtensionMessage(true); const server = new Server("serviceWorker", message); const messageQueue = new MessageQueue(); const manager = new ServiceWorkerManager(server, messageQueue, new ServiceWorkerMessageSend());