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

reconnecting-socket

v2.0.1

Published

WIP - nothing to see here

Downloads

24

Readme

reconnecting-socket

Actions Status

Generic state machine for sockets. Provides granular state handling, and start/stop functionality. Decouples socket creation and destruction in tandem with reconnect, start and stop logic, from what the socket is acually doing.

npm install reconnecting-socket

Usage

const ReconnectingSocket = require('reconnecting-socket')
const net = require('net')

const reconnectingTCP = new ReconnectingSocket({
  backoff: {
    failAfter: 4
  },
  create () {
    const socket = new net.Socket()
    // You are also free to redirect this info.
    // Indicate the socket is exausted/failed/done.
    socket.once('close', this.close)
    // Capture errors.  The last one will be availabl in onfail
    socket.once('error', this.error)
    // Notify the socket is open/connected/ready for use
    socket.once('connect', this.open)
    socket.connect(8124)

    return socket
  },
  destroy (socket) {
    // Clean up and stop a socket when reconnectingTCP.stop() is called
    socket.destroy()
  },
  onopen (socket, firstOpen) {
    // Do stuff with the socket here
    // pump(socket, something, socket)
  },
  onclose (socket) {
    // Remove event listeners, stop intervals etc.
  },
  onfail (err) {
    console.error(err)
    // Handle the final error that was emitted that caused retry to stop.
  }
})

// Hook reactive UIs to these events
reconnectingTCP.on('info', console.log) // debugging info
reconnectingTCP.on('state', console.log) // state inof

You can also extend ReconnectingSocket if you would prefer a class.

const ReconnectingSocket = require('reconnecting-socket')
const net = require('net')

class ReconnectingTCP extends ReconnectingSocket {
  constructor (opts) {
    super(opts)

    this.someHandler = this.someHandler.bind(this)
  }

  create () {
    const socket = new net.Socket()
    socket.on('close', this.close)
    socket.on('error', this.error)
    socket.on('connect', this.open)
    socket.connect(8124)

    return socket
  }

  destroy (socket) {
    socket.destroy()
  }

  someHandler (buf) {
    // whatever
  }

  onopen (socket, firstOpen) {
    socket.on('data', this.someHandler)
  }

  onclose (socket) {
    socket.removeListener('data', this.somehandler)
  }

  onfail (err) {
    console.error(err)
    // Handle the final error that was emitted that caused retry to stop.
  }
}

module.exports = ReconnectingTCP

API

const ReconnectingSocket = require('reconnecting-socket')

Require the ReconnectingSocket class.

reconnectingSocket = new ReconnectingSocket(opts)

Create a new reconnecting socket instance. The opts object can receive the user implemented methods listed below as well as the following optional options:

{
  backoff: {
    strategy: 'fibonacci', // the backoff strategey to use
    failAfter: null, // the number of consecutive times to attemt a reconnect before failing
    ...backoffOptions // all the options from the backoff module
  }
}

See full set of backoff options here: MathieuTurcotte/node-backoff

reconnectingSocket Events

  • state: The state emmits the following state strings:
    • stopped
    • opening
    • opened
    • closing
    • closed
    • reopening
    • failed
  • info: Messages that can be used for debugging.

reconnectingSocket.start()

Start the reconnecting socket.

reconnectingSocket.stop()

Stop the reconnecting socket.

User Implemented Methods

socket = reconnectingSocket.create()

Implement the .create method that is run when a new socket should be created. The method should return a socket, and attatch listeners or callbacks to trigger the following methods:

  • this.open(): Called when the socket is connected or ready.
  • this.error(err): Called when the socket encounters an error. Used to capture the last error emited to be returned onfail.
  • this.close(): Called when the socket is fully closed or exausted. This triggers the reconnect.

The returned socket will be passed to various other hooks and events.

reconnectingSocket.destroy(socket)

The body of this method should destroy the socket (e.g. socket.destroy()). This is called when reconnectingSocket.stop() is called.

reconnectingSocket.onopen(socket, firstOpen)

This method is called whenever a new socket is created and the this.open() method has been called, so the socket should be live and ready for data. It receives the socket as well as firstOpen boolean which indicates if this is the first successful connection since calling reconnectingSocket.start(). Interact with the socket in this function body.

reconnectingSocket.onclose(socket)

This method is called when the this.close() method is called. Use this to clean up any event listeners or intervals used on the socket.

reconnectingSocket.onfail(err)

This method is called when the reconnectignSocket fails to connect after failAfter concecutive attempts. It receives the last error emitted by the various moving parts.

See also

License

MIT