@herbertgao/surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
121 lines • 4.92 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const logger_1 = require("@surgio/logger");
const constant_1 = require("../constant");
const cache_1 = require("../utils/cache");
const config_1 = require("../config");
const env_flag_1 = require("../utils/env-flag");
const http_client_1 = __importStar(require("../utils/http-client"));
const utils_1 = require("../utils");
const validators_1 = require("../validators");
const logger = (0, logger_1.createLogger)({
service: 'surgio:Provider',
});
class Provider {
name;
type;
config;
// 是否支持在订阅中获取用户流量信息
supportGetSubscriptionUserInfo;
// 是否传递 Gateway 请求的 User-Agent
passGatewayRequestUserAgent;
constructor(name, config) {
this.name = name;
const result = validators_1.ProviderValidator.safeParse(config);
// istanbul ignore next
if (!result.success) {
throw new utils_1.SurgioError('Provider 配置校验失败', {
cause: result.error,
providerName: name,
});
}
this.supportGetSubscriptionUserInfo = false;
this.config = result.data;
this.type = result.data.type;
this.passGatewayRequestUserAgent =
(0, config_1.getConfig)()?.gateway?.passRequestUserAgent ?? false;
}
static async requestCacheableResource(url, options = {}) {
const cacheKey = `${constant_1.CACHE_KEYS.Provider}:${(0, utils_1.toMD5)((0, http_client_1.getUserAgent)(options.requestUserAgent) + url)}`;
const requestResource = async () => {
const headers = {};
if (options.requestUserAgent) {
headers['user-agent'] = (0, http_client_1.getUserAgent)(options.requestUserAgent);
}
const res = await http_client_1.default.get(url, {
responseType: 'text',
headers,
});
const subsciptionCacheItem = {
body: res.body,
};
if (res.headers['subscription-userinfo']) {
subsciptionCacheItem.subscriptionUserinfo = (0, utils_1.parseSubscriptionUserInfo)(res.headers['subscription-userinfo']);
logger.debug('%s received subscription userinfo - raw: %s | parsed: %j', url, res.headers['subscription-userinfo'], subsciptionCacheItem.subscriptionUserinfo);
}
return subsciptionCacheItem;
};
const cachedValue = await cache_1.unifiedCache.get(cacheKey);
return cachedValue
? cachedValue
: await (async () => {
const subsciptionCacheItem = await requestResource();
await cache_1.unifiedCache.set(cacheKey, subsciptionCacheItem, (0, env_flag_1.getProviderCacheMaxage)());
return subsciptionCacheItem;
})();
}
determineRequestUserAgent(requestUserAgent) {
return this.passGatewayRequestUserAgent
? requestUserAgent || this.config.requestUserAgent
: this.config.requestUserAgent;
}
get nextPort() {
if (this.config.startPort) {
return this.config.startPort++;
}
return 0;
}
// istanbul ignore next
getSubscriptionUserInfo = async () => {
throw new Error('此 Provider 不支持该功能');
};
// istanbul ignore next
getNodeList = () => {
return Promise.resolve([]);
};
}
exports.default = Provider;
//# sourceMappingURL=Provider.js.map