@herbertgao/surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
93 lines • 3.92 kB
JavaScript
;
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