SPB Git forge

spb/fetcha

Public
11commits 1branches 0releases
1.5 MBsize
maindefault branch
16 days agolast push
TypeScript 97.5% SQL 1.4% Python 0.8%
2.5 KB · 72 lines typescript
Raw Blame History
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