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

message-socket

v1.0.4

Published

A TCP client socket with customizable message parsing, outgoing message queueing, and more

Downloads

36

Readme

message-socket

A TCP client socket with customizable message parsing, automatic restoration of lost connections, outgoing message queueing, and more

NPM Version GitHub license

message-socket is a Node.js library that makes writing raw TCP clients much easier. Two features are primarily responsible for this ease of use: customizable incoming message parsing, and queueing of outgoing messages during lost connections.

But those aren't the MessageSocket's only tricks! Just like plain net.Socket objects, MessageSockets can act as as duplex streams, but they can also be easily converted to Observables of incoming messages.

Getting Started

message-socket is distributed through NPM:

npm install message-socket

# or, if you prefer:
yarn add message-socket

Examples

For these examples, assume that echo.example.com is an echo server. If you need one to test with, try this:

sudo socat PIPE TCP-LISTEN:7,fork

By default, MessageSocket will treat the entire incoming buffer as a single message encoded in utf8. However, this behavior can be easily customized by providing either a RegExp or a parsing function. The encoding can also be changed, or removed entirely if you need a binary Buffer.

import MessageSocket from 'message-socket';

const sock = new MessageSocket('echo.example.com', 7);
sock.on('data', function(message) {
  console.dir(message)
});

sock.send("My message");
sock.close();

// 'My message' is printed to the console

In this example, the 'data' event is fired twice because the RegExp matches twice on the given buffer.

import MessageSocket from 'message-socket';

let sock = new MessageSocket('echo.example.com', 7, /([^:]+):/g);
sock.on('data', function(message) {
  console.dir(message) # prints 'My message'
});

sock.send("My:message:");
sock.close();

// 'My' is printed to the console
// 'message' is printed to the console.

The final constructor argument is an optional encoding to be used instead of utf8; passing null will cause the socket to return binary Buffer objects instead of strings.

If a simple RegExp isn't enough to parse your messages, you an provide a parsing function:

function parseMessage(buffer) {
    // Do the actual parsing work
    // ...

    // for the below, assume:
    //  - messages is an array of parsed messages
    //  - leftovers is whatever data was left at the end of the buffer that does not represent an entire message

    return [ messages, leftovers ];
}

Another helpful feature of the MessageSocket is that it can help you weather temporary connection losses without losing messages. If the underlying network connection should happen to get closed, outgoing messages will start going into a queue. Each attempt to send another message will trigger an attempt to reconnect. Upon successful reconnection, pending messages will be sent. As of now, this behavior is not configurable, but future enhancements could include controlling the size and lifetime of the queue, or disabling it entirely.

A MessageSocket can also be easily converted to an Observable of messages:

import MessageSocket from 'message-socket';

const sock = new MessageSocket('echo.example.com', 7);

sock
  .asObservable()
  .subscribe(
      msg => console.dir(msg)
  )

sock.send("My message");
sock.close();

// 'My message' is printed to the console

Or with a more feature-rich Observable library:

import MessageSocket from 'message-socket';
import { Observable } from 'rxjs';

const sock = new MessageSocket('echo.example.com', 7);

Observable
  .from(
      sock
  )
  .map(x => x.toUpperCase()
  .subscribe(
      msg => console.dir(msg)
  )

sock.send("My message");
sock.close();

// 'MY MESSAGE' is printed to the console

Compatibility

message-socket is built to support Node.js version 6.0 or higher.

Contributing

Contributions are of course always welcome. If you find problems, please report them in the Issue Tracker. If you've made an improvement, open a pull request.

Getting set up for development is very easy:

git clone <your fork>
cd message-socket
yarn

And the development workflow is likewise straightforward:

# make a change to the src/ file, then...
yarn build
node dist/index.js

# or if you want to clean up all the leftover build products:
yarn run clean

Release History

  • 1.0.4

    • Minor debugging updates
  • 1.0.0

    • The first release.

Meta

Zach Bean – [email protected]

Distributed under the MIT license. See LICENSE for more detail.