@softvisio/core
Version:
Softisio core
119 lines (83 loc) • 2.92 kB
JavaScript
import mixins from "#lib/mixins";
import { getRandomArrayIndex } from "#lib/utils";
import ProxyClient from "../client.js";
import OptionsCountry from "../mixins/country.js";
import OptionsRotating from "../mixins/rotating.js";
import OptionsSession from "../mixins/session.js";
import Upstream from "../upstream.js";
export default class ProxyClientPool extends mixins( OptionsCountry, OptionsSession, OptionsRotating, Upstream ) {
#proxies = [];
// properties
get isHttp () {
return true;
}
get isSocks5 () {
return true;
}
// public
async getProxy ( options ) {
const bucket = this._getBucket( options );
if ( !bucket.proxy ) {
if ( bucket.options.session ) {
this.#setRandomProxy( bucket );
}
else {
this.#setNextProxy( bucket );
}
}
else if ( bucket.requireRotate() ) {
if ( bucket.options.rotateRandom ) {
this.#setRandomProxy( bucket );
}
else {
this.#setNextProxy( bucket );
}
}
var proxy = bucket.getProxy();
if ( proxy ) proxy = await proxy.getProxy( bucket.options );
return proxy;
}
async getNextProxy ( options ) {
const bucket = this._getBucket( options );
this.#setNextProxy( bucket );
var proxy = bucket.getProxy();
if ( proxy ) proxy = await proxy.getProxy( bucket.options );
return proxy;
}
async getRandomProxy ( options ) {
const bucket = this._getBucket( options );
this.#setRandomProxy( bucket );
var proxy = bucket.getProxy();
if ( proxy ) proxy = await proxy.getProxy( bucket.options );
return proxy;
}
// protected
_init ( url, options = {} ) {
if ( typeof url === "string" ) url = new URL( url );
if ( super._init ) super._init( url, options );
this.#addProxies( url.searchParams.getAll( "proxy" ) );
if ( options.proxies ) this.#addProxies( options.proxies );
}
_buildUrl () {
const url = super._buildUrl();
for ( const proxy of this.#proxies ) url.searchParams.append( "proxy", proxy );
return url;
}
// private
#setNextProxy ( bucket ) {
var index = bucket.index ?? -1;
index++;
if ( index >= this.#proxies.length ) index = 0;
bucket.index = index;
return bucket.setProxy( this.#proxies[ index ] );
}
#setRandomProxy ( bucket ) {
var index = getRandomArrayIndex( this.#proxies );
bucket.index = index;
return bucket.setProxy( this.#proxies[ index ] );
}
#addProxies ( proxies ) {
this.#proxies.push( ...proxies.map( proxy => ProxyClient.new( proxy ) ) );
}
}
ProxyClientPool.register( "pool:", ProxyClientPool );