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

@on-the-ground/proxxy

v0.1.1

Published

Async proxies that route method calls through partitioned daemon queues, with per-key ordering and cross-key concurrency.

Readme

@on-the-ground/proxxy

Async proxies that shard an object across N independently-constructed instances and dispatch method calls onto per-shard @on-the-ground/daemonizer Daemon queues — a JS/TS counterpart to proxxy (JVM).

📁 Directory Structure

src/
├── index.ts   # Entry point
└── proxxy.ts  # startProxy

✅ Features

  • Wraps a constructor — not a live instance — and builds one independent instance per shard (via new constructor()), so shards never share mutable state
  • A caller-supplied keyExtractor routes each call to a shard; calls routed to the same shard are strictly ordered, calls on different shards run concurrently
  • Every call returns Promise<Awaited<R>>, propagating the method's result or thrown error straight back to the caller — proxxy never swallows or redirects errors, that's the caller's call
  • Cancellation via AbortSignal; close() returns a Promise<void> that resolves once every shard has fully drained
  • Only methods are proxied — plain property access (get and set) throws, since a single field has no coherent value once state is sharded
  • Proxied methods must use regular method syntax (method() {}), not arrow-function class fields (method = () => {}) — see Method syntax below

Usage

import { startProxy } from "@on-the-ground/proxxy";

class Account {
  private balance = 0;
  // first arg is only used for routing below, the method itself doesn't need it
  async deposit(_accountId: string, amount: number) {
    return (this.balance += amount);
  }
}

const controller = new AbortController();
const { proxy, close } = startProxy(Account, controller.signal, {
  partitionCount: 4,
  // calls for the same accountId must land on the same shard to observe each other
  keyExtractor: (_method, args) => hashOf(args[0] as string),
});

await proxy.deposit("acct-1", 100); // 100
await proxy.deposit("acct-1", 50);  // 150 — same shard, ordered after the first call
await proxy.deposit("acct-2", 10);  // runs concurrently with acct-1's calls, different shard

await close();

Wrapping a single object with no sharding at all is just the default: omit partitionCount (defaults to 1) and keyExtractor (defaults to always routing to shard 0).

Method syntax

Define proxied methods with regular method syntax:

class Account {
  async deposit(id: string, amount: number) { /* ... */ } // ✅ visible to startProxy
}

Not as arrow-function class fields:

class Account {
  deposit = async (id: string, amount: number) => { /* ... */ }; // ❌ not recognized
}

startProxy tells methods apart from plain properties by checking constructor.prototype, without constructing a throwaway instance just to inspect its shape. Regular methods live on the prototype; arrow-function class fields are assigned per-instance in the constructor, so they're invisible until an instance already exists. This costs nothing in practice — proxxy always invokes methods via fn.apply(instance, args), so the usual reason to reach for an arrow field (auto-bound this) doesn't apply here.

🔧 Build

yarn build

🧪 Testing

yarn test       # vitest
yarn typecheck  # tsc --noEmit, covers src/ and test/