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 🙏

© 2025 – Pkg Stats / Ryan Hefner

fenetre

v0.0.5

Published

A Socket Router

Downloads

21

Readme

https://travis-ci.org/dckesler/fenetre

fenetre is essentially a socket router. You set up route listeners with one or two callbacks. The first callback will define how the socket receives data. The second will define how the server receives data from the socket.

import fenetre from "fenetre";
fenetre.init({port: 8335});
fenetre.at("/socket/test/:id", function(req){
  //This is the send data callback
  //This socket is considered read only
  this.send({message: "I work!"});
});
fenetre.at("/socket/test2/:id", function(req){
  //This is the send data callback
  this.send({message: "I'm the read callback"});
}, function(req){
  //This is the receiving data callback
  console.log("I received ", req.data, " from the browser");
});
fenetre.at("/socket/test3/:id", null, function(req){
  //This is the receiving data callback
  console.log("I'm a write only route.")
})

##Request object Each call back inside of a fenetre.at will have a request parameter. The request parameter will have a params property and a query property. In the case of a write callback there will also be a data property that represents whatever the socket send to your server.

###Example

/*If the following route received a socket at this address "ws://localhost:8335/socket/the/123?my=data"
And the same socket sent the string "test"
Then all of the contained comparative expression would be true */
fenetre.at("/socket/the/:test", function(req){
  req.params.test === 123;
  req.query.my === "data";
}, function(req){
  req.params.test === 123;
  req.query.my === "data";
  req.data === "test";
});

##Sending data In each callback function whether sending data or receiving data the context (this) will always be the server-side socket that is sending or receiving the data. This is most important for sending back data as the send method is on this.

fenetre.at("/socket/test", function(req){
  this.send("I got yer message");
});

##Route priority Sometimes some routes will be very similar such as "/test/example" and "/test/:id". In this case a request to "ws://localhost:8335/test/example" would prefer "/test/example" over "/test/:id". Hard coded values are always matched over parameters. More route complications are explained as such

"/ptest/test/test" > "/ptest/:id/test" > "/ptest/:id/:sid" > "/:id/:sid/:ssid"

More hard matches are preferred over parameters, but really I'd hope you never need to know any of this.