UNPKG

surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

96 lines 4.27 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getShadowsocksSubscription = void 0; const assert_1 = __importDefault(require("assert")); const zod_1 = require("zod"); const utils_1 = require("../utils"); const relayable_url_1 = __importDefault(require("../utils/relayable-url")); const ss_1 = require("../utils/ss"); const Provider_1 = __importDefault(require("./Provider")); class ShadowsocksSubscribeProvider 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('ShadowsocksSubscribeProvider 配置校验失败', { 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 requestHeaders = this.determineRequestHeaders(params.requestUserAgent, params.requestHeaders); const cacheKey = Provider_1.default.getResourceCacheKey(requestHeaders, this.url); const { subscriptionUserInfo } = await (0, exports.getShadowsocksSubscription)(this.url, requestHeaders, cacheKey, this.udpRelay); if (subscriptionUserInfo) { return subscriptionUserInfo; } return undefined; }; getNodeList = async (params = {}) => { const requestHeaders = this.determineRequestHeaders(params.requestUserAgent, params.requestHeaders); const cacheKey = Provider_1.default.getResourceCacheKey(requestHeaders, this.url); const { nodeList } = await (0, exports.getShadowsocksSubscription)(this.url, requestHeaders, cacheKey, this.udpRelay); if (this.config.hooks?.afterNodeListResponse) { const newList = await this.config.hooks.afterNodeListResponse(nodeList, params); if (newList) { return newList; } } return nodeList; }; getNodeListV2 = async (params = {}) => { const requestHeaders = this.determineRequestHeaders(params.requestUserAgent, params.requestHeaders); const cacheKey = Provider_1.default.getResourceCacheKey(requestHeaders, this.url); const { nodeList, subscriptionUserInfo } = await (0, exports.getShadowsocksSubscription)(this.url, requestHeaders, cacheKey, this.udpRelay); if (this.config.hooks?.afterNodeListResponse) { const newList = await this.config.hooks.afterNodeListResponse(nodeList, params); if (newList) { return { nodeList: newList, subscriptionUserInfo }; } } return { nodeList, subscriptionUserInfo }; }; } exports.default = ShadowsocksSubscribeProvider; /** * @see https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html */ const getShadowsocksSubscription = async (url, requestHeaders, cacheKey, udpRelay) => { (0, assert_1.default)(url, '未指定订阅地址 url'); const response = await Provider_1.default.requestCacheableResource(url, requestHeaders, cacheKey); const nodeList = (0, utils_1.fromBase64)(response.body) .split('\n') .filter((item) => !!item && item.startsWith('ss://')) .map((item) => { const nodeConfig = (0, ss_1.parseSSUri)(item); if (udpRelay !== void 0) { ; nodeConfig.udpRelay = udpRelay; } return nodeConfig; }); return { nodeList, subscriptionUserInfo: response.subscriptionUserInfo, }; }; exports.getShadowsocksSubscription = getShadowsocksSubscription; //# sourceMappingURL=ShadowsocksSubscribeProvider.js.map