Files
kiss-translator/src/libs/subRules.js

91 lines
2.1 KiB
JavaScript
Raw Normal View History

2023-08-31 00:18:57 +08:00
import { GLOBAL_KEY } from "../config";
import {
getSyncWithDefault,
updateSync,
setSubRules,
getSubRules,
} from "./storage";
2023-09-08 21:41:32 +08:00
import { apiFetch } from "../apis";
2023-08-31 00:18:57 +08:00
import { checkRules } from "./rules";
2023-09-07 10:20:08 +08:00
import { isAllchar } from "./utils";
2023-09-13 10:26:30 +08:00
import { syncWebfix } from "./webfix";
2023-08-30 18:05:37 +08:00
2023-09-11 22:53:04 +08:00
/**
* 更新缓存同步时间
* @param {*} url
*/
const updateSyncDataCache = async (url) => {
const { dataCaches = {} } = await getSyncWithDefault();
dataCaches[url] = Date.now();
await updateSync({ dataCaches });
};
2023-08-30 18:05:37 +08:00
/**
* 同步订阅规则
* @param {*} url
* @returns
*/
export const syncSubRules = async (url, isBg = false) => {
2023-09-08 21:41:32 +08:00
const res = await apiFetch(url, isBg);
2023-08-31 00:18:57 +08:00
const rules = checkRules(res).filter(
2023-09-07 10:20:08 +08:00
({ pattern }) => !isAllchar(pattern, GLOBAL_KEY)
2023-08-31 00:18:57 +08:00
);
2023-08-30 18:05:37 +08:00
if (rules.length > 0) {
2023-08-31 00:18:57 +08:00
await setSubRules(url, rules);
2023-08-30 18:05:37 +08:00
}
return rules;
};
/**
* 同步所有订阅规则
* @param {*} url
* @returns
*/
export const syncAllSubRules = async (subrulesList, isBg = false) => {
for (let subrules of subrulesList) {
try {
await syncSubRules(subrules.url, isBg);
2023-09-11 22:53:04 +08:00
await updateSyncDataCache(subrules.url);
2023-08-30 18:05:37 +08:00
} catch (err) {
console.log(`[sync subrule error]: ${subrules.url}`, err);
}
}
};
/**
* 根据时间同步所有订阅规则
* @param {*} url
* @returns
*/
export const trySyncAllSubRules = async ({ subrulesList }, isBg = false) => {
try {
const { subRulesSyncAt } = await getSyncWithDefault();
const now = Date.now();
const interval = 24 * 60 * 60 * 1000; // 间隔一天
if (now - subRulesSyncAt > interval) {
2023-09-13 10:26:30 +08:00
// 同步订阅规则
2023-08-30 18:05:37 +08:00
await syncAllSubRules(subrulesList, isBg);
await updateSync({ subRulesSyncAt: now });
2023-09-13 10:26:30 +08:00
// 同步修复规则
await syncWebfix(process.env.REACT_APP_WEBFIXURL);
2023-08-30 18:05:37 +08:00
}
} catch (err) {
console.log("[try sync all subrules]", err);
}
};
/**
* 从缓存或远程加载订阅规则
* @param {*} url
* @returns
*/
export const loadOrFetchSubRules = async (url) => {
2023-09-11 22:53:04 +08:00
let rules = await getSubRules(url);
if (!rules || rules.length === 0) {
rules = await syncSubRules(url);
await updateSyncDataCache(url);
2023-08-30 18:05:37 +08:00
}
2023-09-11 22:53:04 +08:00
return rules || [];
2023-08-30 18:05:37 +08:00
};