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

@dtelecom/vodozemac-wasm

v0.3.0

Published

Browser/Node WASM bindings for vodozemac (Olm primitives), tailored for non-Matrix chat use.

Readme

@dtelecom/vodozemac-wasm

Browser + Node + React Native WASM bindings for vodozemac, exposing only the Olm primitives needed for non-Matrix 1:1 chat protocols. No Matrix-specific types, no protocol assumptions about user/device id shape.

Built from a small Rust crate that wraps vodozemac via wasm-bindgen. Same wire format as libolm (Olm v1), so existing libolm-pickled state is migration-friendly via the standalone vodozemac::olm::libolm_compat path (not exposed in v0.1.0 — add when needed).

Why

@matrix-org/olm (libolm) has been EOL since Oct 2023 with known CVEs. The Matrix-recommended successor (@matrix-org/matrix-sdk-crypto-wasm) only exposes the high-level Matrix-protocol OlmMachine, not raw Olm primitives. This package fills the gap.

API surface

import init, { Account, Session, InboundResult } from "@dtelecom/vodozemac-wasm";
// Node loads WASM synchronously at module import — `init()` is a no-op.
// Browser fetches the .wasm asset on first init().
// React Native (Hermes V1 / RN 0.84+) decodes the embedded base64 on first init().
// Same call site in all three; the conditional package exports route to the
// right loader automatically.
await init();

const a = new Account();
a.identityKeys();                               // { curve25519, ed25519 }
a.generateOneTimeKeys(100);
a.oneTimeKeys();                                // { curve25519: { <id>: <publicKey>, ... } }
a.markKeysAsPublished();
a.generateFallbackKey();
a.fallbackKey();
a.sign("message");                              // base64 Ed25519 sig
const pickle: string = a.pickle();
const restored = Account.fromPickle(pickle);

// Outbound:
const session: Session = a.createOutboundSession(theirIdKey, theirOTK);
const { type, body } = session.encrypt("hi");   // type=0 prekey, type=1 normal

// Inbound:
const result: InboundResult = a.createInboundSession(theirIdKey, prekeyBody);
const session2 = result.takeSession();
const plaintext = result.plaintext;

// Persistence:
const sp: string = session.pickle();
const restored2 = Session.fromPickle(sp);

Build

Requires Rust 1.85+ (edition 2024) and wasm-pack.

npm run build       # all three targets
npm run build:web   # browser bundlers (vite, webpack)
npm run build:node  # Node test runners
npm run build:rn    # React Native (Hermes V1 / RN 0.84+) — derives from pkg-web; no Rust rebuild

Output:

  • pkg-web/ — ESM, browser-targeted; calls init(url) to load .wasm via fetch
  • pkg-node/ — CommonJS-like, Node-targeted; loads .wasm synchronously via fs
  • pkg-rn/ — ESM, React Native-targeted (Hermes V1 / RN 0.84+); WASM bytes are base64-embedded into the JS bundle so Metro doesn't need to ship them as a separate asset. The browser glue is reused with __wbg_init and __wbg_load stripped (those depend on import.meta.url + fetch which Metro can't resolve to a real .wasm asset). Caller calls the default async init() once; subsequent calls are no-ops.

Bundle size: ~400 KB raw WASM, ~150 KB gzipped (vs libolm's ~750 KB unoptimized). The RN target adds ~520 KB of base64 string for the WASM bytes — measurable but acceptable for an RN bundle.

Status

v0.2.0 — adds the React Native target (pkg-rn/). Same Olm primitives as v0.1.0, no API or wire-format changes from the consumer's POV. Megolm (group sessions), libolm-pickle migration, and SAS verification still not bound — add when a consumer needs them.