Skip to content

Commit 0794cd3

Browse files
committed
✨ 添加安装脚本成功后的提示与资源过期机制 #158
1 parent 4c4b15f commit 0794cd3

File tree

3 files changed

+160
-5
lines changed

3 files changed

+160
-5
lines changed

src/app/service/resource/manager.ts

+132
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,138 @@ export class ResourceManager extends Manager {
163163
return Promise.resolve(ret);
164164
}
165165

166+
// 更新资源
167+
async checkScriptResource(script: Script) {
168+
return Promise.resolve({
169+
...((await this.checkRequireResource(script)) || {}),
170+
...((await this.checkRequireCssResource(script)) || {}),
171+
...((await this.checkResourceResource(script)) || {}),
172+
});
173+
}
174+
175+
async checkRequireResource(script: Script) {
176+
if (!script.metadata.require) {
177+
return Promise.resolve({});
178+
}
179+
const ret: { [key: string]: Resource } = {};
180+
await Promise.allSettled(
181+
script.metadata.require.map(async (u) => {
182+
const res = await this.checkResource(script.id, u, "require");
183+
if (res) {
184+
ret[u] = res;
185+
}
186+
})
187+
);
188+
return Promise.resolve(ret);
189+
}
190+
191+
async checkRequireCssResource(script: Script) {
192+
if (!script.metadata["require-css"]) {
193+
return Promise.resolve({});
194+
}
195+
const ret: { [key: string]: Resource } = {};
196+
await Promise.allSettled(
197+
script.metadata.require.map(async (u) => {
198+
const res = await this.checkResource(script.id, u, "require-css");
199+
if (res) {
200+
ret[u] = res;
201+
}
202+
})
203+
);
204+
return Promise.resolve(ret);
205+
}
206+
207+
async checkResourceResource(script: Script) {
208+
if (!script.metadata.resource) {
209+
return Promise.resolve({});
210+
}
211+
const ret: { [key: string]: Resource } = {};
212+
await Promise.allSettled(
213+
script.metadata.resource.map(async (u) => {
214+
const split = u.split(/\s+/);
215+
if (split.length === 2) {
216+
const res = await this.checkResource(script.id, split[1], "resource");
217+
if (res) {
218+
ret[split[0]] = res;
219+
}
220+
}
221+
})
222+
);
223+
return Promise.resolve(ret);
224+
}
225+
226+
async checkResource(id: number, url: string, type: ResourceType) {
227+
let res = await this.getResourceModel(url);
228+
if (res) {
229+
// 判断1分钟过期
230+
if ((res.updatetime || 0) > new Date().getTime() - 1000 * 60) {
231+
return Promise.resolve(res);
232+
}
233+
}
234+
try {
235+
res = await this.updateResource(url, id, type);
236+
if (res) {
237+
return Promise.resolve(res);
238+
}
239+
} catch (e) {
240+
// ignore
241+
// this.logger.error("get resource failed", { id, url }, Logger.E(e));
242+
}
243+
return Promise.resolve(undefined);
244+
}
245+
246+
async updateResource(url: string, scriptId: number, type: ResourceType) {
247+
// 重新加载
248+
const u = this.parseUrl(url);
249+
let result = await this.getResourceModel(u.url);
250+
try {
251+
const resource = await this.loadByUrl(u.url, type);
252+
resource.updatetime = new Date().getTime();
253+
Cache.getInstance().set(CacheKey.resourceByUrl(u.url), resource);
254+
if (!result) {
255+
// 资源不存在,保存
256+
resource.createtime = new Date().getTime();
257+
const id = await this.resourceDAO.save(resource);
258+
result = resource;
259+
this.logger.info("reload new resource success", { url: u.url, id });
260+
} else {
261+
result.base64 = resource.base64;
262+
result.content = resource.content;
263+
result.contentType = resource.contentType;
264+
result.hash = resource.hash;
265+
result.updatetime = resource.updatetime;
266+
await this.resourceDAO.update(result.id, result);
267+
this.logger.info("reload resource success", {
268+
url: u.url,
269+
id: result.id,
270+
});
271+
}
272+
} catch (e) {
273+
this.logger.error("load resource error", { url: u.url }, Logger.E(e));
274+
throw e;
275+
}
276+
277+
const link = await this.resourceLinkDAO.findOne({
278+
url: u.url,
279+
scriptId,
280+
});
281+
if (link) {
282+
return Promise.resolve(result);
283+
}
284+
const id = await this.resourceLinkDAO.save({
285+
id: 0,
286+
url: u.url,
287+
scriptId,
288+
createtime: new Date().getTime(),
289+
});
290+
this.logger.debug("resource link", {
291+
url: u.url,
292+
resourceID: result.id,
293+
id,
294+
});
295+
return Promise.resolve(result);
296+
}
297+
166298
public async addResource(
167299
url: string,
168300
scriptId: number,

src/pages/install/description.tsx

+25-4
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ export default function Description() {
9292
SubscribeController
9393
) as SubscribeController;
9494
const [isSub, setIsSub] = useState<boolean>(false);
95+
// 按钮文案
96+
const [btnText, setBtnText] = useState<string>();
97+
useEffect(() => {
98+
if (isSub) {
99+
setBtnText(isUpdate ? "更新订阅" : "安装订阅");
100+
} else {
101+
setBtnText(isUpdate ? "更新" : "安装");
102+
}
103+
}, [isSub, isUpdate]);
95104
useEffect(() => {
96105
if (countdown === -1) {
97106
return;
@@ -290,7 +299,11 @@ export default function Description() {
290299
subscribeCtrl
291300
.upsert(upsertScript as Subscribe)
292301
.then(() => {
293-
closeWindow();
302+
Message.success("订阅成功,1秒后关闭窗口");
303+
setBtnText("订阅成功");
304+
setTimeout(() => {
305+
closeWindow();
306+
}, 1000);
294307
})
295308
.catch((e) => {
296309
Message.error(`订阅失败: ${e}`);
@@ -300,15 +313,23 @@ export default function Description() {
300313
scriptCtrl
301314
.upsert(upsertScript as Script)
302315
.then(() => {
303-
closeWindow();
316+
if (isUpdate) {
317+
Message.success("更新成功,1秒后关闭窗口");
318+
setBtnText("更新成功");
319+
} else {
320+
Message.success("安装成功,1秒后关闭窗口");
321+
setBtnText("安装成功");
322+
}
323+
setTimeout(() => {
324+
closeWindow();
325+
}, 1000);
304326
})
305327
.catch((e) => {
306328
Message.error(`安装失败: ${e}`);
307329
});
308330
}}
309331
>
310-
{isSub && (isUpdate ? "更新订阅" : "订阅")}
311-
{!isSub && (isUpdate ? "更新" : "安装")}
332+
{btnText}
312333
</Button>
313334
<Button
314335
type="primary"

src/runtime/background/runtime.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,9 @@ export default class Runtime extends Manager {
511511
}
512512

513513
// 脚本发生变动
514-
scriptUpdate(script: Script): Promise<boolean> {
514+
async scriptUpdate(script: Script): Promise<boolean> {
515+
// 脚本更新先更新资源
516+
await this.resourceManager.checkScriptResource(script);
515517
if (script.status === SCRIPT_STATUS_ENABLE) {
516518
return this.enable(script as ScriptRunResouce);
517519
}

0 commit comments

Comments
 (0)