2023-08-31 00:18:57 +08:00
|
|
|
import { GLOBAL_KEY } from "../config";
|
|
|
|
|
import {
|
|
|
|
|
getSyncWithDefault,
|
|
|
|
|
updateSync,
|
|
|
|
|
setSubRules,
|
|
|
|
|
getSubRules,
|
2023-09-08 15:16:10 +08:00
|
|
|
updateSetting,
|
2023-08-31 00:18:57 +08:00
|
|
|
} 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-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);
|
|
|
|
|
} 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) {
|
|
|
|
|
await syncAllSubRules(subrulesList, isBg);
|
|
|
|
|
await updateSync({ subRulesSyncAt: now });
|
|
|
|
|
}
|
2023-09-08 15:16:10 +08:00
|
|
|
subrulesList.forEach((item) => {
|
|
|
|
|
item.syncAt = now;
|
|
|
|
|
});
|
|
|
|
|
await updateSetting({ subrulesList });
|
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-08-31 00:18:57 +08:00
|
|
|
const rules = await getSubRules(url);
|
2023-08-30 18:05:37 +08:00
|
|
|
if (rules?.length) {
|
|
|
|
|
return rules;
|
|
|
|
|
}
|
2023-08-31 13:38:06 +08:00
|
|
|
return syncSubRules(url);
|
2023-08-30 18:05:37 +08:00
|
|
|
};
|