UNPKG

surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

92 lines 3.87 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getShadowsocksJSONConfig = void 0; const assert_1 = __importDefault(require("assert")); const zod_1 = require("zod"); const types_1 = require("../types"); const utils_1 = require("../utils"); const relayable_url_1 = __importDefault(require("../utils/relayable-url")); const Provider_1 = __importDefault(require("./Provider")); class ShadowsocksJsonSubscribeProvider extends Provider_1.default { #originalUrl; udpRelay; 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('ShadowsocksJsonSubscribeProvider 配置校验失败', { cause: result.error, providerName: name, }); } this.#originalUrl = result.data.url; this.udpRelay = result.data.udpRelay; if (!this.config.requestUserAgent) { this.config.requestUserAgent = 'shadowrocket'; } } // istanbul ignore next get url() { return (0, relayable_url_1.default)(this.#originalUrl, this.config.relayUrl); } 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.getShadowsocksJSONConfig)(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 nodeList = await this.getNodeList(params); return { nodeList }; }; } exports.default = ShadowsocksJsonSubscribeProvider; const getShadowsocksJSONConfig = async (url, requestHeaders, cacheKey, udpRelay) => { (0, assert_1.default)(url, '未指定订阅地址 url'); async function requestConfigFromRemote() { const response = await Provider_1.default.requestCacheableResource(url, requestHeaders, cacheKey); const config = JSON.parse(response.body); if (!config || !config.configs) { throw new Error('订阅地址返回的数据格式不正确'); } return config.configs.map((item) => { const nodeConfig = { nodeName: item.remarks, type: types_1.NodeTypeEnum.Shadowsocks, hostname: item.server, port: item.server_port, method: item.method, password: item.password, }; if (typeof udpRelay === 'boolean') { nodeConfig.udpRelay = udpRelay; } if (item.plugin === 'obfs-local') { const obfs = item.plugin_opts.match(/obfs=(\w+)/); const obfsHost = item.plugin_opts.match(/obfs-host=(.+)$/); if (obfs) { nodeConfig.obfs = obfs[1]; nodeConfig.obfsHost = obfsHost ? obfsHost[1] : 'www.bing.com'; } } return nodeConfig; }); } return await requestConfigFromRemote(); }; exports.getShadowsocksJSONConfig = getShadowsocksJSONConfig; //# sourceMappingURL=ShadowsocksJsonSubscribeProvider.js.map