TypeScript 97.5%
SQL 1.4%
Python 0.8%
1import type { ConcreteNetwork } from "@fetcha/core";2import { DecodoProvider } from "./decodo";3import { DirectProvider } from "./direct";4import { OxylabsProvider } from "./oxylabs";5import { SoaxProvider } from "./soax";6import type { ProviderId, ProxyProvider } from "./types";78export * from "./types";9export { OxylabsProvider } from "./oxylabs";10export { DecodoProvider } from "./decodo";11export { SoaxProvider } from "./soax";12export { DirectProvider } from "./direct";13export { closeAllDispatchers } from "./http";14export * from "./fingerprint";15export * from "./cookies";1617export interface ProviderRegistryOptions {18 env?: NodeJS.ProcessEnv;19 /** Per-provider per-network price overrides (USD/GB), typically loaded from `provider_configs`. */20 prices?: Partial<Record<ProviderId, Record<string, number>>>;21 /** Providers disabled by the admin. */22 disabled?: ProviderId[];23}2425export class ProviderRegistry {26 private readonly providers = new Map<ProviderId, ProxyProvider>();27 private readonly disabled: Set<ProviderId>;2829 constructor(opts: ProviderRegistryOptions = {}) {30 const env = opts.env ?? process.env;31 const p = opts.prices ?? {};32 this.disabled = new Set(opts.disabled ?? []);33 for (const provider of [new OxylabsProvider(env, p.oxylabs), new DecodoProvider(env, p.decodo), new SoaxProvider(env, p.soax), new DirectProvider(env)]) {34 this.providers.set(provider.id, provider);35 }36 }3738 get(id: ProviderId): ProxyProvider | undefined {39 return this.providers.get(id);40 }4142 all(): ProxyProvider[] {43 return [...this.providers.values()];44 }4546 /** Providers that are configured, enabled, and can serve `network`. */47 available(network?: ConcreteNetwork): ProxyProvider[] {48 return this.all().filter((p) => p.isConfigured() && !this.disabled.has(p.id) && (!network || p.networks.includes(network)));49 }5051 /** Network classes the platform can actually serve right now. */52 availableNetworks(): ConcreteNetwork[] {53 const set = new Set<ConcreteNetwork>();54 for (const p of this.available()) for (const n of p.networks) set.add(n);55 return [...set];56 }5758 setDisabled(id: ProviderId, disabled: boolean): void {59 if (disabled) this.disabled.add(id);60 else this.disabled.delete(id);61 }62}6364/** Customer-facing display names for network classes. */65export const NETWORK_LABELS: Record<ConcreteNetwork | "direct", string> = {66 datacenter: "Datacenter",67 residential: "Residential",68 isp: "ISP",69 mobile: "Mobile",70 direct: "Datacenter",71};72