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

@reventlessdev/rescript-web

v1.0.0-alpha.2

Published

ReScript bindings for the WHATWG web globals available in both browsers and Node 18+ (fetch, WebSocket, timers, base64)

Readme

@reventlessdev/rescript-web

ReScript bindings for the WHATWG web globals: fetch, WebSocket, timers and base64.

Why this exists, and where the line is

These are ambient globals, not node:* imports. Everything here works unchanged in a browser and in Node 18+ (WebSocket from 21). That is the whole distinction from rescript-node, which binds imported Node modules and is server-only by construction.

The split matters in practice because the same two APIs are needed on both sides of Reventless: the browser client subscribes to AppSync Events over WebSocket and talks to the API over fetch, and server-side scripts do the same things against the same endpoints.

Design note

The surface is driven by call sites, not by the specification.

reventless-ui already had a bindings/Fetch.res. It modelled method as [#get | #post] and carried no body field at all, so nine other files bypassed it and hand-rolled their own @val external fetch. A binding that cannot express what callers do does not reduce duplication — it becomes one more variant to maintain.

So this package binds what the real consumers need (arbitrary method strings, dict<string> headers, an optional body that is sometimes binary, an abort signal, and ok/status/text/json) and deliberately omits what nothing uses. Add to it when a consumer appears, not in anticipation of one.

Usage

open Web

let res = await Fetch.fetch(
  url,
  {
    method: "POST",
    headers: Dict.fromArray([("content-type", "application/json")]),
    body: Fetch.Body.string(payload),
  },
)
if res->Fetch.ok {
  let json = await res->Fetch.json
  // …
}
let ws = Socket.make(url, ["my-protocol"])
ws->Socket.setOnOpen(() => ws->Socket.send(`{"type":"hello"}`))
ws->Socket.setOnMessage(evt => Console.log(evt.data))
ws->Socket.setOnClose(evt => Console.log2("closed", evt.code))

Build

pnpm run build     # rescript build