UNPKG

@herbertgao/surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

121 lines 4.92 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const logger_1 = require("@surgio/logger"); const constant_1 = require("../constant"); const cache_1 = require("../utils/cache"); const config_1 = require("../config"); const env_flag_1 = require("../utils/env-flag"); const http_client_1 = __importStar(require("../utils/http-client")); const utils_1 = require("../utils"); const validators_1 = require("../validators"); const logger = (0, logger_1.createLogger)({ service: 'surgio:Provider', }); class Provider { name; type; config; // 是否支持在订阅中获取用户流量信息 supportGetSubscriptionUserInfo; // 是否传递 Gateway 请求的 User-Agent passGatewayRequestUserAgent; constructor(name, config) { this.name = name; const result = validators_1.ProviderValidator.safeParse(config); // istanbul ignore next if (!result.success) { throw new utils_1.SurgioError('Provider 配置校验失败', { cause: result.error, providerName: name, }); } this.supportGetSubscriptionUserInfo = false; this.config = result.data; this.type = result.data.type; this.passGatewayRequestUserAgent = (0, config_1.getConfig)()?.gateway?.passRequestUserAgent ?? false; } static async requestCacheableResource(url, options = {}) { const cacheKey = `${constant_1.CACHE_KEYS.Provider}:${(0, utils_1.toMD5)((0, http_client_1.getUserAgent)(options.requestUserAgent) + url)}`; const requestResource = async () => { const headers = {}; if (options.requestUserAgent) { headers['user-agent'] = (0, http_client_1.getUserAgent)(options.requestUserAgent); } const res = await http_client_1.default.get(url, { responseType: 'text', headers, }); const subsciptionCacheItem = { body: res.body, }; if (res.headers['subscription-userinfo']) { subsciptionCacheItem.subscriptionUserinfo = (0, utils_1.parseSubscriptionUserInfo)(res.headers['subscription-userinfo']); logger.debug('%s received subscription userinfo - raw: %s | parsed: %j', url, res.headers['subscription-userinfo'], subsciptionCacheItem.subscriptionUserinfo); } return subsciptionCacheItem; }; const cachedValue = await cache_1.unifiedCache.get(cacheKey); return cachedValue ? cachedValue : await (async () => { const subsciptionCacheItem = await requestResource(); await cache_1.unifiedCache.set(cacheKey, subsciptionCacheItem, (0, env_flag_1.getProviderCacheMaxage)()); return subsciptionCacheItem; })(); } determineRequestUserAgent(requestUserAgent) { return this.passGatewayRequestUserAgent ? requestUserAgent || this.config.requestUserAgent : this.config.requestUserAgent; } get nextPort() { if (this.config.startPort) { return this.config.startPort++; } return 0; } // istanbul ignore next getSubscriptionUserInfo = async () => { throw new Error('此 Provider 不支持该功能'); }; // istanbul ignore next getNodeList = () => { return Promise.resolve([]); }; } exports.default = Provider; //# sourceMappingURL=Provider.js.map