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 🙏

© 2024 – Pkg Stats / Ryan Hefner

bestws

v1.1.0

Published

Best WebSocket library, long gone are the days of the idiotic Socket.io

Downloads

3

Readme

BestWS

The best WebSocket library for fast, small send size, binary protocols. Long gone is Socket.io's slow and stringified packets.

Time to use small and fast binary protocols

Quick server-client example

const bws = require("../src/export.js");

// Create the server.
const server = new bws.Server(bws.new.HTTP(3000));

// When a client requests an initialize response:
server.on("initialize", (ws, res, init, req) => {
    console.log("Initial data received: ", init);

    // Give back this data and a initialize response.
    res(["I", { got: "the" }, "message", 1111, [",", "you", { may: "connect" }, true]]);

    // Handle the client:
    ws.on("message", (data) => {
        console.log("Got data from client: ", data);
        ws.send("Hello!");
    });
});

server.on("listening", () => {
    // Try to connect the client when the server is listing.
    console.log("Listening.");

    // Connect the client sending that init data.
    const client = new bws.Client("ws://localhost:3000", [1, { a: "Init request data" }, 2]);

    // When the socket has opened and a init packet is requesting:
    client.on("initializing", () => console.log("Client connecting..."));

    // When everything is finalized:
    client.on("open", (init) => {
        console.log("Server sent their own initial data: ", init);

        // Send the server a message once connected.
        client.send("Hi!");
    });

    // Log the data when the server sends a message.
    client.on("message", (data) => {
        console.log("Got data from server: ", data);
    });
});

Where this library shines

The variables/class stored in BestWS.buffer is what makes this library shine. The encoding and binary functionality is beyond every other library on npm, especially Socket.io. The socket part is just a wrapper mostly of node ws.

Documentation

All documentation shown below will be only the binary/encoding functionality, for the rest just look at the source or examples.

Encoding to a buffer/binary

const bestEncoder = require("../src/export.js").buffer;

// Allocate 1000 bytes initially.
const writer = new bestEncoder.Writer(1000);

// Data to be encoded.
const data = {
    hello: "byte",
    one: 2,
    3: "four",
    array: [
        5,
        {
            object: true,
        },
        6,
        false,
        true,
        [7, 8],
    ],
    buffer: new Uint8Array([9, 10, 11, 12]),
    float: 13.1,
};

// Write it in the writer.
writer.write(data);

// Get the binary data.
const encoded = writer.buffer;

// Reader the binary data.
const reader = new bestEncoder.Reader(encoded);

// Get the contents.
const decoded = reader.read();

decoded === data; // True

Bi-encoding data

const bestEncoder = require("../src/export.js").buffer;

// Allocate 1000 bytes initially
const writer = new bestEncoder.Writer(1000);

// In the first slot, make a normal object.
writer.write({
    object: true,
    array: false,
});

// In the second one, make a normal array.
writer.write([false, true]);

const reader = new bestEncoder.Reader(writer.buffer);

reader.read(); // Get the object stored in the first slot.
reader.read(); // Get the array stored in the second slot.

/**
 * Of course you don't need to do this and just make an array including everything you want
 * However, this is still an option.
 */

Warning

I didn't make the above work with browsers, NodeJS only.

Please!

If you want to, make this protocol or encoder in your own language. Eventually the horrors and optimized garbage that is socket.io will disappear.