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

ws-server-ftw

v0.1.3

Published

Mock websocket endpoints with ease

Downloads

186

Readme

ws-server-ftw

Build Status Coverage Status

Mock websocket endpoints with ease

ws-server was developed in order to allow a developer to easily mock websocket apis in a few seconds. The idea is taken from json-server, a great package which lets you mock entire rest apis.

Screenshot

Install

NPM

$ npm install ws-server-ftw --save-dev

Getting started

ws-server lets you send through a socket connection data defined in a json or js file. The mock server will serve the requested path traversing the json provided with the same path, i.e. the path /foo/bar will serve (if db is the json object) db['foo']['bar']

A js file can be used instead of a json in order to perform operations or send random stuff, such js should export an object.

Data are sent when the connection occurs. Then the application continues listening for stdin inputs, so that it is possible to:

  • send again the input data (just hit Enter)
  • send new data: just enter the new data in a valid json format and hit Enter
  • merge new data: just enter 'merge <NEW_DATA>', where <NEW_DATA> should be in a valid json format and hit Enter
  • deep-merge new data: just enter 'deepmerge <NEW_DATA>', where <NEW_DATA> should be in a valid json format and hit Enter
  • append new data (if the endpoints returns an array): just enter 'append <NEW_DATA>', where <NEW_DATA> should be in a valid json format and hit Enter

Incoming messages will be printed to the console.

Start the cli

$ ws-server -i mydb.json

Available options:

$ ws-server -h

usage: index.js [-h] [-v] [-p PORT] -i DB

ws-server cli

Optional arguments:
  -h, --help            Show this help message and exit.
  -v, --version         Show program's version number and exit.
  -p PORT, --port PORT  Websocket server port
  -i DB, --input DB     JSON or js input file which exports (es5) an object

Example

Given the following db.json:

{
  "api": {
    "v1": {
      "ui": {
        "modalIsOpen": true,
        "sidebarStyle": "dark"
      },
      "users": [
        {
          "username": "admin",
          "email": "[email protected]",
          "id": 1,
          "role": "admin"
        },
        {
          "username": "guest",
          "email": "[email protected]",
          "id": 2,
          "role": "guest"
        }
      ]
    }
  }
}

A socket client connected to the path ws://localhost:9704/api/v1/ will receive this data:

 {
  "ui": {
    "modalIsOpen": true,
    "sidebarStyle": "dark"
  },
  "users": [
    {
      "username": "admin",
      "email": "[email protected]",
      "id": 1,
      "role": "admin"
    },
    {
      "username": "guest",
      "email": "[email protected]",
      "id": 2,
      "role": "guest"
    }
  ]
}

Now hit Enter to send the data again.

Entering merge {"ui": {"foo": "bar"}} and pressing Enter the client will receive:

{
  "ui": {
    "foo": "bar"
  },
  "users": [
    {
      "username": "admin",
      "email": "[email protected]",
      "id": 1,
      "role": "admin"
    },
    {
      "username": "guest",
      "email": "[email protected]",
      "id": 2,
      "role": "guest"
    }
  ]
}

Entering deepmerge {"ui": {"foo": "bar"}} and pressing Enter the client will receive:

{
  "ui": {
    "modalIsOpen": true,
    "sidebarStyle": "dark",
    "foo": "bar"
  },
  "users": [
    {
      "username": "admin",
      "email": "[email protected]",
      "id": 1,
      "role": "admin"
    },
    {
      "username": "guest",
      "email": "[email protected]",
      "id": 2,
      "role": "guest"
    }
  ]
}

Entering deepmerge {"users": [{"username": "foo"}]} and pressing Enter, the client will receive:

{
  "ui": {
    "modalIsOpen": true,
    "sidebarStyle": "dark"
  },
  "users": [
    {
      "username": "admin",
      "email": "[email protected]",
      "id": 1,
      "role": "admin"
    },
    {
      "username": "guest",
      "email": "[email protected]",
      "id": 2,
      "role": "guest"
    },
    {
      "username": "foo"
    }
  ]
}

Contributing

This project it's quite simple actually, I've developed it to match my needs during some UI implementations with react relying upon socket communication.

Pull request and new contributions will be much appreciated. Please just make sure to be compliant with the eslint configuration before submitting.

Also I preferred not to arm ES6 and ES7 features here, so let's keep the code ES2015 compatible, in order to avoid babel transpiling.