UNPKG

@herbertgao/surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

93 lines 3.92 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getShadowsocksrSubscription = void 0; const assert_1 = __importDefault(require("assert")); const logger_1 = require("@surgio/logger"); const zod_1 = require("zod"); const utils_1 = require("../utils"); const relayable_url_1 = __importDefault(require("../utils/relayable-url")); const subscription_1 = require("../utils/subscription"); const ssr_1 = require("../utils/ssr"); const Provider_1 = __importDefault(require("./Provider")); const logger = (0, logger_1.createLogger)({ service: 'surgio:ShadowsocksrSubscribeProvider', }); class ShadowsocksrSubscribeProvider extends Provider_1.default { udpRelay; #originalUrl; constructor(name, config) { super(name, config); const schema = zod_1.z.object({ url: zod_1.z.string().url(), udpRelay: zod_1.z.boolean().optional(), }); const result = schema.safeParse(config); // istanbul ignore next if (!result.success) { throw new utils_1.SurgioError('ShadowsocksrSubscribeProvider 配置校验失败', { cause: result.error, providerName: name, }); } this.#originalUrl = result.data.url; this.udpRelay = result.data.udpRelay; this.supportGetSubscriptionUserInfo = true; } // istanbul ignore next get url() { return (0, relayable_url_1.default)(this.#originalUrl, this.config.relayUrl); } getSubscriptionUserInfo = async (params = {}) => { const requestUserAgent = this.determineRequestUserAgent(params.requestUserAgent); const { subscriptionUserinfo } = await (0, exports.getShadowsocksrSubscription)(this.url, this.udpRelay, requestUserAgent); if (subscriptionUserinfo) { return subscriptionUserinfo; } return undefined; }; getNodeList = async (params = {}) => { const requestUserAgent = this.determineRequestUserAgent(params.requestUserAgent); const { nodeList } = await (0, exports.getShadowsocksrSubscription)(this.url, this.udpRelay, requestUserAgent); if (this.config.hooks?.afterNodeListResponse) { const newList = await this.config.hooks.afterNodeListResponse(nodeList, params); if (newList) { return newList; } } return nodeList; }; } exports.default = ShadowsocksrSubscribeProvider; const getShadowsocksrSubscription = async (url, udpRelay, requestUserAgent) => { (0, assert_1.default)(url, '未指定订阅地址 url'); const response = await Provider_1.default.requestCacheableResource(url, { requestUserAgent, }); const nodeList = (0, utils_1.fromBase64)(response.body) .split('\n') .filter((item) => !!item && item.startsWith('ssr://')) .map((str) => { const nodeConfig = (0, ssr_1.parseSSRUri)(str); if (udpRelay !== void 0) { ; nodeConfig.udpRelay = udpRelay; } return nodeConfig; }); if (!response.subscriptionUserinfo && nodeList[0].nodeName.includes('剩余流量')) { const dataNode = nodeList[0]; const expireNode = nodeList[1]; response.subscriptionUserinfo = (0, subscription_1.parseSubscriptionNode)(dataNode.nodeName, expireNode.nodeName); logger.debug('%s received subscription node - raw: %s %s | parsed: %j', url, dataNode.nodeName, expireNode.nodeName, response.subscriptionUserinfo); } return { nodeList, subscriptionUserinfo: response.subscriptionUserinfo, }; }; exports.getShadowsocksrSubscription = getShadowsocksrSubscription; //# sourceMappingURL=ShadowsocksrSubscribeProvider.js.map