UNPKG

surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

121 lines 4.75 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTrojanSubscription = 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 trojan_1 = require("../utils/trojan"); const Provider_1 = __importDefault(require("./Provider")); class TrojanProvider extends Provider_1.default { #originalUrl; udpRelay; tls13; constructor(name, config) { super(name, config); const schema = zod_1.z.object({ url: zod_1.z.string().url(), udpRelay: zod_1.z.boolean().optional(), tls13: zod_1.z.boolean().optional(), }); const result = schema.safeParse(config); // istanbul ignore next if (!result.success) { throw new utils_1.SurgioError('TrojanProvider 配置校验失败', { cause: result.error, providerName: name, }); } this.#originalUrl = result.data.url; this.udpRelay = result.data.udpRelay; this.tls13 = result.data.tls13; this.supportGetSubscriptionUserInfo = true; if (!this.config.requestUserAgent) { this.config.requestUserAgent = 'shadowrocket'; } } // 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.getTrojanSubscription)({ url: this.url, udpRelay: this.udpRelay, tls13: this.tls13, requestHeaders, cacheKey, }); 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.getTrojanSubscription)({ url: this.url, udpRelay: this.udpRelay, tls13: this.tls13, requestHeaders, cacheKey, }); 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.getTrojanSubscription)({ url: this.url, udpRelay: this.udpRelay, tls13: this.tls13, requestHeaders, cacheKey, }); 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 = TrojanProvider; /** * @see https://github.com/trojan-gfw/trojan-url/blob/master/trojan-url.py */ const getTrojanSubscription = async ({ url, udpRelay, tls13, requestHeaders, cacheKey, }) => { (0, assert_1.default)(url, '未指定订阅地址 url'); const response = await Provider_1.default.requestCacheableResource(url, requestHeaders, cacheKey); const config = (0, utils_1.fromBase64)(response.body); const nodeList = config .split('\n') .filter((item) => !!item && item.startsWith('trojan://')) .map((item) => { const nodeConfig = (0, trojan_1.parseTrojanUri)(item); return { ...nodeConfig, udpRelay, tls13, }; }); return { nodeList, subscriptionUserInfo: response.subscriptionUserInfo, }; }; exports.getTrojanSubscription = getTrojanSubscription; //# sourceMappingURL=TrojanProvider.js.map