surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
92 lines • 3.87 kB
JavaScript
;
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