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

@gofsd/shmring

v0.3.0

Published

Cross-thread/cross-tab shared-memory ring buffer for the browser (SharedArrayBuffer-backed), compiled from the same Rust crate as the native backend via wasm-bindgen

Readme

shmring (web)

Browser build of shmring: a fixed-capacity, single-producer/single-consumer byte ring buffer, backed here by a SharedArrayBuffer and compiled via wasm-bindgen from the same Rust crate (shmring on crates.io) that runs natively on desktop. One thread (main thread or a Worker) creates the ring and gets a Writer; another thread opens the same SharedArrayBuffer and gets a Reader. Bytes written on one side become readable on the other, in order.

Requirements

SharedArrayBuffer is only available on pages that are cross-origin isolated, which requires your server to send:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Install

npm install @gofsd/shmring

Usage

loadShmring instantiates the wasm module and must be called once per thread that will act as a Writer or Reader (once on the main thread, once per Worker).

Main thread (creates the ring, writes into it):

import { loadShmring, createWriter, wasmURL } from "@gofsd/shmring";

const raw = await loadShmring(wasmURL);
const { writer, sab } = createWriter(raw, 4096); // capacity: power of two, bytes

const worker = new Worker("worker.js", { type: "module" });
worker.postMessage({ sab, capacity: 4096 });

const encoder = new TextEncoder();
await writer.write(encoder.encode("hello\n"));
writer.close(); // signals EOF once the reader drains what's left

Worker (worker.js; opens the same ring, reads from it):

import { loadShmring, openReader, wasmURL } from "@gofsd/shmring";

const readyPromise = loadShmring(wasmURL);

self.onmessage = async (e) => {
  const raw = await readyPromise;
  const { sab, capacity } = e.data;
  const reader = openReader(raw, sab, capacity);

  const buf = new Uint8Array(256);
  for (;;) {
    const { n, eof } = await reader.read(buf);
    if (n > 0) postMessage(buf.slice(0, n));
    if (eof) {
      reader.close();
      return;
    }
  }
};

wasmURL is a new URL("./shmring_wasm_bg.wasm", import.meta.url) reference; bundlers that understand that pattern (Vite, webpack 5+, esbuild) will resolve and copy the .wasm asset automatically. If yours doesn't, fetch node_modules/@gofsd/shmring/shmring_wasm_bg.wasm yourself and pass that URL/path instead.

API

  • loadShmring(wasmUrl) -> Promise<raw> — instantiate the wasm module for the current thread.
  • createWriter(raw, capacity) -> { writer, sab } — create a new ring; sab is the SharedArrayBuffer to hand to the Reader's thread.
  • openReader(raw, sab, capacity) -> reader — open the Reader side of a ring created by createWriter on another thread.
  • Writer#write(data) -> Promise<n> / Writer#tryWrite(data) -> n — blocking (async) and non-blocking writes.
  • Writer#close() — marks the ring closed; already-written data is still readable until drained.
  • Reader#read(into) -> Promise<{n, eof}> / Reader#tryRead(into) -> {n, eof} — blocking (async) and non-blocking reads; eof is true once the writer has closed and all data has been drained.
  • Reader#close() — releases this thread's handle on the SharedArrayBuffer.

See the main README and web/example for a complete working demo.