| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- /*
- Sub-Store operator (production-friendly)
- - Pull dynamic value from current_domain.json / current_ip.json
- - Replace vmess server field for matched nodes
- */
- const VALUE_JSON_URL = "https://git.dewofaurora.de/aurora/vmess-domain-rotator/raw/runtime-state/runtime/current_domain.json";
- const NODE_NAME_REGEX = /(argo|cf|vm|优选)/i;
- const CACHE_KEY = "vmess-domain-rotator:current";
- const CACHE_TTL_MS = 5 * 60 * 1000;
- const JSON_VALUE_KEYS = ["domain", "ip"];
- async function fetchValueViaSubStore() {
- const $ = $substore;
- const { body, statusCode } = await $.http.get({
- url: VALUE_JSON_URL,
- headers: {
- Accept: "application/json",
- "Cache-Control": "no-cache"
- },
- timeout: 5000
- });
- if (statusCode < 200 || statusCode >= 300) {
- throw new Error(`http status ${statusCode}`);
- }
- const obj = JSON.parse(body || "{}");
- let value = "";
- for (const key of JSON_VALUE_KEYS) {
- value = String(obj[key] || "").trim().toLowerCase();
- if (value) break;
- }
- if (!value) {
- throw new Error(`empty value field, expected one of: ${JSON_VALUE_KEYS.join(", ")}`);
- }
- return value;
- }
- async function operator(proxies = [], targetPlatform, context) {
- const cache = scriptResourceCache;
- let value = cache.get(CACHE_KEY);
- if (!value) {
- try {
- value = await fetchValueViaSubStore();
- cache.set(CACHE_KEY, value, CACHE_TTL_MS);
- } catch (e) {
- console.log(`[vmess-domain-rotator] fetch failed: ${e.message}`);
- return proxies;
- }
- }
- let updated = 0;
- for (const p of proxies) {
- if (!p || p.type !== "vmess") continue;
- if (!NODE_NAME_REGEX.test(p.name || "")) continue;
- if (p.server !== value) {
- p.server = value;
- updated += 1;
- }
- }
- console.log(`[vmess-domain-rotator] value=${value}, updated=${updated}, total=${proxies.length}, target=${targetPlatform}`);
- return proxies;
- }
|