npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

proxy-builder-sdk

v0.2.0

Published

Tiny, dependency-free proxy SDK — one clean country/city/session/lifetime API for Aethyn residential proxies (and Bright Data, Oxylabs, Decodo, IPRoyal, SOAX, NetNut), ready for got, axios, fetch, Playwright and Puppeteer.

Readme

proxy-builder-sdk

A tiny, dependency-free Node/TypeScript SDK for aethyn.io residential proxies. Build correct proxy URLs with country / city / sticky-session / lifetime targeting and hand them straight to got, axios, fetch, Playwright, or Puppeteer — without hand-assembling fragile username strings.

npm install proxy-builder-sdk
import { AethynClient } from "proxy-builder-sdk";

const client = new AethynClient({ username: "aethyn-XXXXX", password: "secret" });
// or set AETHYN_USERNAME / AETHYN_PASSWORD

// rotating residential exit in the US
const p = client.proxy({ country: "us" });

const res = await fetch("https://api.ipify.org?format=json", {
  // node fetch via undici ProxyAgent, got { proxy: p.url }, axios, etc.
});

No hand-built aethyn-XXXXX-country-us-session-...-lifetime-... strings, no off-by-one dashes, no guessing the port. Ships types; works in ESM and CommonJS.

Why

Aethyn encodes targeting inside the proxy username — country, city, ISP, a sticky-session id, and a lifetime. It's powerful but easy to get subtly wrong (a stray - in a session id silently corrupts the whole thing, and city/ISP only work on the Elite tier). This SDK gives you a typed, validated API and keeps the wire format an internal detail, so if Aethyn ever changes the username scheme, you just upgrade the package — your code doesn't move.

Usage

Sticky sessions

Hold the same exit IP for a multi-step flow (login → cart → checkout):

const p = client.session({ country: "de", session: "cart42", ttl: 10 }); // same IP for 10 min
// p.username -> "aethyn-XXXXX-country-de-session-cart42-lifetime-10"

ttl is minutes (1–1440). Omit session for per-request rotation (the default).

City / ISP targeting (Elite tier)

const p = client.session({ country: "us", city: "chicago", isp: "comcast", session: "run1", ttl: 30, tier: "elite" });

city, state, isp, and zip are Elite-only — the SDK throws a clear error if you pass them on Premium.

got / axios

import got from "got";
const p = client.proxy({ country: "gb" });
await got("https://example.com", { proxy: p.url });

Playwright / Puppeteer

import { chromium } from "playwright";
const p = client.session({ country: "fr", session: "s1", ttl: 15, tier: "elite" });
const browser = await chromium.launch({ proxy: p.forPlaywright() });

SOCKS5

const p = client.proxy({ country: "jp", protocol: "socks5" }); // socks5://[email protected]:1099

What you get back

const p = client.session({ country: "us", session: "run1", ttl: 10 });
p.username;         // "aethyn-XXXXX-country-us-session-run1-lifetime-10"
p.host; p.port;     // "proxy.aethyn.io", 2099
p.url;              // "http://aethyn-XXXXX-...:[email protected]:2099"
p.proxies;          // { http, https }
p.forPlaywright();  // { server, username, password }
String(p);          // password-redacted, safe to log

Ports are picked for you: Premium 2099 (HTTP) / 1099 (SOCKS5), Elite 5499 (HTTP) / 3499 (SOCKS5). Self-hosting or white-labeling? Pass new AethynClient({ ..., host: "gate.example.com" }).

Other providers

Aethyn is the default, but the same clean API drives other big residential providers too — use ProxyClient with a provider:

import { ProxyClient } from "proxy-builder-sdk";

// Oxylabs — the SDK emits customer-...-cc-us-sessid-run1-sesstime-10
const p = new ProxyClient({ username: "customer-me", password: "pw", provider: "oxylabs" })
  .session({ country: "us", session: "run1", ttl: 10 });

| provider | gateway | notes | |---|---|---| | aethyn (default) | proxy.aethyn.io | Premium/Elite tiers, city/ISP/state/zip | | brightdata | brd.superproxy.io | pass brd-customer-<id>-zone-<zone> as the username | | oxylabs | pr.oxylabs.io | cc/sessid/sesstime; state as us_california | | smartproxy / decodo | gate.decodo.com | sessionduration (minutes) | | iproyal | geo.iproyal.com | targeting goes in the password | | soax | proxy.soax.com | ⚠️ community-verified; lifetime in seconds | | netnut | gw.netnut.net | country + sticky session only |

Every non-Aethyn dialect was verified against the provider's official docs (each provider file records the source URL + a confidence level). soax is medium confidence — sanity-check it against SOAX's current docs before you lean on it. Each provider maps the same semantic call (country, city, state, session, ttl) to its own username/password format and throws a clear error for anything it can't express.

Adding another proxy provider

Contributions of new providers are welcome. Most providers are a ~12-line dialect config — drop a file in src/providers/, register it, add one import line to src/providers/index.ts, and open a PR:

import { DialectProvider } from "./dialect";
import { registerProvider } from "./base";

registerProvider(new DialectProvider({
  name: "myprovider", display: "My Provider",
  host: "gateway.myprovider.com", httpPort: 8000, socks5Port: null,
  authIn: "username", delim: "-",
  keys: { country: "cc", session: "sess", ttl: "ttl" }, // our param -> their keyword
  order: ["country", "session", "ttl"],
  source: "https://docs.myprovider.com/...", confidence: "high",
}));

For anything that doesn't fit the dialect model, implement the one-method Provider interface directly. See CONTRIBUTING.md for the full walkthrough and PR checklist.

Links

License

MIT