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

@tulipes/socket.io

v0.1.1

Published

Socket.IO sockets provider for Tulipes apps: module-owned namespaces on the backend's HTTP server, behind core's sockets capability

Readme

@tulipes/socket.io

The Socket.IO sockets provider for Tulipes apps. Every module's sockets/*.sockets.ts claims its namespace on one Socket.IO server that core attaches to the backend's HTTP server just before it listens. Core itself no longer installs Socket.IO; an app without realtime features declares no provider and never pays for one.

Requires Node 24.x and a core that ships the provider contract with situations and attach. socket.io is this package's own dependency.

Select it

{ "tulipes": { "providers": { "sockets": "@tulipes/socket.io" } } }

A sockets/ directory requires the provider automatically; a module that only emits declares "tulipes": { "requires": ["sockets"] }. Installing this package without the declaration selects nothing.

Use it

// modules/billing/sockets/billing.sockets.ts
import type { Ctx } from "@tulipes/core/boot";
import type { SocketRegistry } from "@tulipes/socket.io";

export default function billingSockets(ctx: Ctx, sockets: SocketRegistry): void {
  sockets.namespace("/billing", (nsp) => nsp.on("connection", (socket) => socket.emit("ready")));
}

// anywhere in the backend after acquisition
ctx.sockets!.of("/billing").emit("invoice", { id });

Behavior

  • Backend only (situations: ["backend"]): worker, script and inspection boots report the provider as not used and never import a socket file.
  • Namespaces are claimed during acquisition on an unattached server; core attaches the HTTP server after routes mount and before listen(), so no client can reach an unwired namespace. An attach failure is a boot error.
  • Shutdown: the server closes in the drain phase alongside the HTTP drain, disconnecting clients and releasing the listener as before.
  • A namespace is claimed by exactly one module; of() throws on unclaimed names; names are / or /kebab-case.

Versions

0.1.0-rc.1 requires core ^0.10.0-rc.2, the candidate that added the situations/attach contract; install both with @next. See core's MIGRATING.md.