mirror of
https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
synced 2025-06-04 11:13:59 +08:00
116 lines
3.5 KiB
JavaScript
116 lines
3.5 KiB
JavaScript
import $ from '@/core/app';
|
|
import {
|
|
SCRIPT_RESOURCE_CACHE_KEY,
|
|
CSR_EXPIRATION_TIME_KEY,
|
|
} from '@/constants';
|
|
|
|
class ResourceCache {
|
|
constructor() {
|
|
this.expires = getExpiredTime();
|
|
if (!$.read(SCRIPT_RESOURCE_CACHE_KEY)) {
|
|
$.write('{}', SCRIPT_RESOURCE_CACHE_KEY);
|
|
}
|
|
try {
|
|
this.resourceCache = JSON.parse($.read(SCRIPT_RESOURCE_CACHE_KEY));
|
|
} catch (e) {
|
|
$.error(
|
|
`解析持久化缓存中的 ${SCRIPT_RESOURCE_CACHE_KEY} 失败, 重置为 {}, 错误: ${
|
|
e?.message ?? e
|
|
}`,
|
|
);
|
|
this.resourceCache = {};
|
|
$.write('{}', SCRIPT_RESOURCE_CACHE_KEY);
|
|
}
|
|
this._cleanup();
|
|
}
|
|
|
|
_cleanup() {
|
|
// clear obsolete cached resource
|
|
let clear = false;
|
|
Object.entries(this.resourceCache).forEach((entry) => {
|
|
const [id, updated] = entry;
|
|
if (!updated.time) {
|
|
// clear old version cache
|
|
delete this.resourceCache[id];
|
|
$.delete(`#${id}`);
|
|
clear = true;
|
|
}
|
|
if (new Date().getTime() - updated.time > this.expires) {
|
|
delete this.resourceCache[id];
|
|
clear = true;
|
|
}
|
|
});
|
|
if (clear) this._persist();
|
|
}
|
|
|
|
revokeAll() {
|
|
this.resourceCache = {};
|
|
this._persist();
|
|
}
|
|
|
|
_persist() {
|
|
$.write(JSON.stringify(this.resourceCache), SCRIPT_RESOURCE_CACHE_KEY);
|
|
}
|
|
|
|
get(id) {
|
|
const updated = this.resourceCache[id] && this.resourceCache[id].time;
|
|
if (updated && new Date().getTime() - updated <= this.expires) {
|
|
return this.resourceCache[id].data;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
gettime(id) {
|
|
const updated = this.resourceCache[id] && this.resourceCache[id].time;
|
|
if (updated && new Date().getTime() - updated <= this.expires) {
|
|
return this.resourceCache[id].time;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
set(id, value) {
|
|
this.resourceCache[id] = { time: new Date().getTime(), data: value };
|
|
this._persist();
|
|
}
|
|
}
|
|
|
|
function getExpiredTime() {
|
|
// console.log($.read(CSR_EXPIRATION_TIME_KEY));
|
|
if (!$.read(CSR_EXPIRATION_TIME_KEY)) {
|
|
$.write('1728e5', CSR_EXPIRATION_TIME_KEY); // 48 * 3600 * 1000
|
|
}
|
|
let expiration = 1728e5;
|
|
if ($.env.isLoon) {
|
|
const loont = {
|
|
// Loon 插件自义定
|
|
'1\u5206\u949f': 6e4,
|
|
'5\u5206\u949f': 3e5,
|
|
'10\u5206\u949f': 6e5,
|
|
'30\u5206\u949f': 18e5, // "30分钟"
|
|
'1\u5c0f\u65f6': 36e5,
|
|
'2\u5c0f\u65f6': 72e5,
|
|
'3\u5c0f\u65f6': 108e5,
|
|
'6\u5c0f\u65f6': 216e5,
|
|
'12\u5c0f\u65f6': 432e5,
|
|
'24\u5c0f\u65f6': 864e5,
|
|
'48\u5c0f\u65f6': 1728e5,
|
|
'72\u5c0f\u65f6': 2592e5, // "72小时"
|
|
'\u53c2\u6570\u4f20\u5165': 'readcachets', // "参数输入"
|
|
};
|
|
let intimed = $.read('#\u8282\u70b9\u7f13\u5b58\u6709\u6548\u671f'); // Loon #节点缓存有效期
|
|
// console.log(intimed);
|
|
if (intimed in loont) {
|
|
expiration = loont[intimed];
|
|
if (expiration === 'readcachets') {
|
|
expiration = intimed;
|
|
}
|
|
}
|
|
return expiration;
|
|
} else {
|
|
expiration = $.read(CSR_EXPIRATION_TIME_KEY);
|
|
return expiration;
|
|
}
|
|
}
|
|
|
|
export default new ResourceCache();
|