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

express-stockings

v0.2.2

Published

Express middleware for the socketized observable framework

Readme

Express-stockings

Express middleware for the socketized observable framework

Installation

npm install express-stockings

Purpose

Express is a widely used framework to create REST APIs in Node.js -- but to add realtime support, you usually have to create your own socket listeners, socket connections, and manage the modification of state yourself. Even if you're utilizing a tool such as socket.io, this can get very ugly very quickly. Stockings provides a way of cleanly and seamlessly subscribing to and broadcasting socket messages such that you don't have to worry about it at all. On the server side, the express-stockings middleware adds functions directly to the express Request and Response objects. The API footprint is small and easy to learn and use. It introduces three new functions:

  • request.hasStockingsClient()
  • response.subscribe(eventId, [mergeStrategy, upsertKey])
  • response.broadcast(eventId, payload, [callback])

Usage

Apply middleware:

Minimal setup:

import { middleware } from 'express-stockings'

let app = express()
app.use(middleware({
  server: 3001, // the port where socket connections should be made
  privateKey: 'SUPER SECRET PRIVATE KEY' // private key for jwt
}))

Avanced setup:

import { middleware } from 'express-stockings'

let app = express()
let server = new http.Server(app)

app.use(middleware({
  server: server, // use the same http server and port as express
  privateKey: 'SUPER SECRET PRIVATE KEY', // private key for jwt
  publicKey: 'PUBLIC KEY -- SHARE ME!', // public key for jwt if the algorithm is asymmetric
  algorithm: 'RS256', // jwt algorithm -- this also is enforced upon decryption
  requestFilter: (req) => req.resource.indexOf('stockings') >= 0, // only serve requests made to the resources whose path contains 'stockings'
  disposeMetaAfter: 30 * 60 * 1000 // dispose connection metadata after half an hour of not being used or transferred (specified in milliseconds)
}))

Usage in a request:

Subscribing to a single event type:

app.get('/user/:id', (req, res) => {
  let user
  // ... get user

  res.subscribe(`user:${user._id}`)

  res.send(user)
})

Subscribing to multiple events and specifying merge strategy:

app.get('/user', (req, res) => {
  let users
  // ... get users

  users.each((user) => {
    res.subscribe(`user:${user._id}`, 'upsert', '_id')
  })

  res.send(users)
})

Broadcasting an event:

app.put('/user/:id', (req, res) => {
  let user
  // ... get / update user

  res.broadcast(`user:${user._id}`, user)

  res.send(user)
})

Broadcasting an event with callback:

app.put('/user/:id', (req, res) => {
  let user
  // ... get / update user
  res.broadcast(`user:${user._id}`, user, (err) => {
    if (err) {
      res.status(400).send(err)
    } else {
      res.send(user)
    }
  })
})

Checking if the request has a stockings socket connection:

app.get('/user/:id', (req, res) => {
  let user
  // ... get user

  if (req.hasStockingsClient()) {
    // handle stockings-specific logic here
  }

  res.send(user)
})