proxy-connection
Version:
Proxy client with automatic connection management, health checking, and fetch-like API
42 lines • 1.87 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.testProxy = void 0;
const socks_proxy_agent_1 = require("socks-proxy-agent");
const https_1 = __importDefault(require("https"));
const HEALTH_CHECK_URL = process.env.HEALTH_CHECK_URL || 'https://httpbin.org/ip';
const timeout = parseInt(process.env.TIMEOUT || '5000', 10);
const isStatusCodeValid = (statusCode) => {
return statusCode !== undefined && statusCode >= 200 && statusCode < 300;
};
const testProxy = async (proxy) => {
const agent = new socks_proxy_agent_1.SocksProxyAgent(`socks5://${encodeURIComponent(proxy.user)}:${encodeURIComponent(proxy.pass)}@${proxy.ip}:${proxy.port}`);
const controller = new AbortController();
const start = Date.now();
try {
const res = await new Promise((resolve, reject) => {
const req = https_1.default.get(HEALTH_CHECK_URL, {
agent: agent,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
},
signal: controller.signal,
timeout
}, resolve);
req.on('error', reject);
});
res.resume(); // гарантированно освобождаем сокет
return { latency: Date.now() - start, alive: isStatusCodeValid(res.statusCode) };
}
catch (e) {
controller.abort(); // гарантированно прерываем запрос
if (!process.env.SUPPRESS_PROXY_ERRORS) {
console.error('Proxy error:', e);
}
return { latency: timeout, alive: false };
}
};
exports.testProxy = testProxy;
//# sourceMappingURL=index.js.map