Skip to content

Commit

Permalink
✨ 添加安装脚本成功后的提示与资源过期机制 #158
Browse files Browse the repository at this point in the history
  • Loading branch information
CodFrm committed Mar 25, 2023
1 parent 4c4b15f commit 0794cd3
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 5 deletions.
132 changes: 132 additions & 0 deletions src/app/service/resource/manager.ts
Expand Up @@ -163,6 +163,138 @@ export class ResourceManager extends Manager {
return Promise.resolve(ret);
}

// 更新资源
async checkScriptResource(script: Script) {
return Promise.resolve({
...((await this.checkRequireResource(script)) || {}),
...((await this.checkRequireCssResource(script)) || {}),
...((await this.checkResourceResource(script)) || {}),
});
}

async checkRequireResource(script: Script) {
if (!script.metadata.require) {
return Promise.resolve({});
}
const ret: { [key: string]: Resource } = {};
await Promise.allSettled(
script.metadata.require.map(async (u) => {
const res = await this.checkResource(script.id, u, "require");
if (res) {
ret[u] = res;
}
})
);
return Promise.resolve(ret);
}

async checkRequireCssResource(script: Script) {
if (!script.metadata["require-css"]) {
return Promise.resolve({});
}
const ret: { [key: string]: Resource } = {};
await Promise.allSettled(
script.metadata.require.map(async (u) => {
const res = await this.checkResource(script.id, u, "require-css");
if (res) {
ret[u] = res;
}
})
);
return Promise.resolve(ret);
}

async checkResourceResource(script: Script) {
if (!script.metadata.resource) {
return Promise.resolve({});
}
const ret: { [key: string]: Resource } = {};
await Promise.allSettled(
script.metadata.resource.map(async (u) => {
const split = u.split(/\s+/);
if (split.length === 2) {
const res = await this.checkResource(script.id, split[1], "resource");
if (res) {
ret[split[0]] = res;
}
}
})
);
return Promise.resolve(ret);
}

async checkResource(id: number, url: string, type: ResourceType) {
let res = await this.getResourceModel(url);
if (res) {
// 判断1分钟过期
if ((res.updatetime || 0) > new Date().getTime() - 1000 * 60) {
return Promise.resolve(res);
}
}
try {
res = await this.updateResource(url, id, type);
if (res) {
return Promise.resolve(res);
}
} catch (e) {
// ignore
// this.logger.error("get resource failed", { id, url }, Logger.E(e));
}
return Promise.resolve(undefined);
}

async updateResource(url: string, scriptId: number, type: ResourceType) {
// 重新加载
const u = this.parseUrl(url);
let result = await this.getResourceModel(u.url);
try {
const resource = await this.loadByUrl(u.url, type);
resource.updatetime = new Date().getTime();
Cache.getInstance().set(CacheKey.resourceByUrl(u.url), resource);
if (!result) {
// 资源不存在,保存
resource.createtime = new Date().getTime();
const id = await this.resourceDAO.save(resource);
result = resource;
this.logger.info("reload new resource success", { url: u.url, id });
} else {
result.base64 = resource.base64;
result.content = resource.content;
result.contentType = resource.contentType;
result.hash = resource.hash;
result.updatetime = resource.updatetime;
await this.resourceDAO.update(result.id, result);
this.logger.info("reload resource success", {
url: u.url,
id: result.id,
});
}
} catch (e) {
this.logger.error("load resource error", { url: u.url }, Logger.E(e));
throw e;
}

const link = await this.resourceLinkDAO.findOne({
url: u.url,
scriptId,
});
if (link) {
return Promise.resolve(result);
}
const id = await this.resourceLinkDAO.save({
id: 0,
url: u.url,
scriptId,
createtime: new Date().getTime(),
});
this.logger.debug("resource link", {
url: u.url,
resourceID: result.id,
id,
});
return Promise.resolve(result);
}

public async addResource(
url: string,
scriptId: number,
Expand Down
29 changes: 25 additions & 4 deletions src/pages/install/description.tsx
Expand Up @@ -92,6 +92,15 @@ export default function Description() {
SubscribeController
) as SubscribeController;
const [isSub, setIsSub] = useState<boolean>(false);
// 按钮文案
const [btnText, setBtnText] = useState<string>();
useEffect(() => {
if (isSub) {
setBtnText(isUpdate ? "更新订阅" : "安装订阅");
} else {
setBtnText(isUpdate ? "更新" : "安装");
}
}, [isSub, isUpdate]);
useEffect(() => {
if (countdown === -1) {
return;
Expand Down Expand Up @@ -290,7 +299,11 @@ export default function Description() {
subscribeCtrl
.upsert(upsertScript as Subscribe)
.then(() => {
closeWindow();
Message.success("订阅成功,1秒后关闭窗口");
setBtnText("订阅成功");
setTimeout(() => {
closeWindow();
}, 1000);
})
.catch((e) => {
Message.error(`订阅失败: ${e}`);
Expand All @@ -300,15 +313,23 @@ export default function Description() {
scriptCtrl
.upsert(upsertScript as Script)
.then(() => {
closeWindow();
if (isUpdate) {
Message.success("更新成功,1秒后关闭窗口");
setBtnText("更新成功");
} else {
Message.success("安装成功,1秒后关闭窗口");
setBtnText("安装成功");
}
setTimeout(() => {
closeWindow();
}, 1000);
})
.catch((e) => {
Message.error(`安装失败: ${e}`);
});
}}
>
{isSub && (isUpdate ? "更新订阅" : "订阅")}
{!isSub && (isUpdate ? "更新" : "安装")}
{btnText}
</Button>
<Button
type="primary"
Expand Down
4 changes: 3 additions & 1 deletion src/runtime/background/runtime.ts
Expand Up @@ -511,7 +511,9 @@ export default class Runtime extends Manager {
}

// 脚本发生变动
scriptUpdate(script: Script): Promise<boolean> {
async scriptUpdate(script: Script): Promise<boolean> {
// 脚本更新先更新资源
await this.resourceManager.checkScriptResource(script);
if (script.status === SCRIPT_STATUS_ENABLE) {
return this.enable(script as ScriptRunResouce);
}
Expand Down

0 comments on commit 0794cd3

Please sign in to comment.