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

@inkly/node

v0.0.0

Published

Node.js runtime adapter for inkly, built on the `ws` WebSocket server.

Downloads

17

Readme

@inkly/node

The Node.js reference adapter for inkly — a small ws-based bridge from Node's HTTP upgrade event to @inkly/core's adapter handlers.

This is the adapter shape other runtimes mirror. Use serve() for a standalone server or attachInkly() when an existing HTTP framework already owns the port.

Why it exists

@inkly/node keeps Node-specific socket handling out of your app: it negotiates the inkly.v1 subprotocol, normalizes IncomingMessage into an inkly upgrade request, optionally pre-authorizes at HTTP upgrade time, and forwards messages into app.handlers. Because this adapter is the reference implementation, Bun, Deno, Cloudflare, and framework adapters can mirror the same serve(app, opts) / attachInkly(server, app, opts) shape.

Install

pnpm add @inkly/node @inkly/core zod

Quickstart

import { inkly, contract } from "@inkly/core";
import { serve } from "@inkly/node";
import { z } from "zod";

const api = contract({
  actions: {
    echo: { input: z.object({ msg: z.string() }), output: z.object({ msg: z.string(), user: z.string() }) },
  },
  events: {},
  streams: {},
});

const app = inkly(api, {
  async authorize(_request, params) {
    const token = (params as { token?: string } | undefined)?.token;
    if (token !== "demo-token") throw new inkly.Unauthorized("bad token");
    return { user: "daryl" };
  },
});

app.defineAction("echo", (peer, input) => ({ msg: input.msg, user: peer.context.user }));

const handle = serve(app, { port: 3000, path: "/ws" });
console.log(`inkly listening on ${handle.port}`);

API reference

| API | Purpose | | --- | --- | | serve(app, { port?, server?, host?, path?, authorize?, compression?, ws? }) | Starts a standalone Node server when port is provided, or embeds into an existing http.Server when server is provided. | | ServeHandle.server | The Node HTTP server. | | ServeHandle.wss | The underlying ws WebSocketServer. | | ServeHandle.port | Bound port getter; null until listening. | | ServeHandle.close() | Closes clients, detaches the adapter, and stops the owned server. | | attachInkly(server, app, opts) | Low-level upgrade interceptor for sharing a port with another HTTP framework. | | AttachHandle.wss | The underlying ws WebSocketServer. | | AttachHandle.detach() | Removes the upgrade listener and closes the WebSocketServer. | | opts.path | Only handles upgrades for this path; defaults to /. | | opts.authorize(request) | Pre-authorizes at HTTP upgrade time; throw an inkly error to control rejection status, otherwise rejection is 401. | | opts.compression | Enables permessage-deflate (RFC 7692). Shorthand for ws: { perMessageDeflate: true }; an explicit ws.perMessageDeflate wins. Off by default (it trades CPU for bandwidth). | | opts.ws | Extra ws server options such as maxPayload or perMessageDeflate. |

Docs

Examples

License

Dazza Public License 1.0 (LicenseRef-Dazza-1.0).