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

cagey-client-messenger

v0.1.1

Published

Client/server messaging for the Cagey game framework

Downloads

8

Readme

Client/server messaging for the Cagey game framework

Greenkeeper badge

The purpose of the client messenger is to integrate with WebSocket, TCP, or similar APIs in order to establish a message-passing communication style between client and server. Once integrated into your project, you should easily be able to switch between APIs, without having to change how your project interfaces with cagey-client-messenger.

Its API is written in a way to allow various optimization patterns, such as early serialization for broadcasting, and object pools to reduce GC overhead.

Installation

This installs cagey-client-messenger into your project:

npm install cagey-client-messenger --save

API

Client Messenger

factory

Instantiating a ClientMessenger requires you to have prepared a cagey-logger object. Passing it (or a child logger) on to the factory will allow it to log debug information for when you need it. A single ClientMessenger instance represents communication between a single client and the server-process this is running in.

const apis = {
    log: cageyLogger
};

const options = {
    // ...
};

const clientMessenger = require('cagey-client-messenger').create(apis, options);

Creates and returns an instance of the ClientMessenger class and passes its options on to the constructor. See the ClientMessenger constructor below for valid options.

ClientMessenger(options) (constructor)

  • options.serialize (Function) Needs to serialize all given arguments into a single value.
  • options.deserialize (Function) Needs to deserialize a value into an array of arguments.
  • options.send (Function, optional) Needs to take a serialized message and send it to the client.
  • options.disconnect (Function, optional) Needs to disconnect from the client.

The serialize/deserialize pair of functions will be used when sending and receiving data between client and server. If they throw an error, it will be logged and further ignored. If serialize returns undefined for a given input, that input will be silently ignored.

setSendHandler(Function handler)

Unless you already provided options.send in the constructor, you must call this function once. This function receives a serialized message, which it should send to the client.

setDisconnectHandler(Function handler)

Unless you already provided options.disconnect in the constructor, you must call this function once. This function must disconnect from the client.

setAddressDescription(string addressDescription)

Call this to describe the address of this connection. You would typically call this when a connection is established. Whenever you want to log something happening to the connection, you can call getAddressDescription (see below) to give the log entry some more context. Also, when an error occurs and is not thrown inside the ClientMessenger, it will log the error with the current address-description.

getAddressDescription() -> string

Returns the current address description. This can be useful when logging connection related information.

connected([string addressDescription])

This tells the ClientMessenger that a connection has been established. If any messages have been queued up by trying to send to the client while the connection was not established, they will now be sent.

If an address-description is passed, it will be registered. See setAddressDescription for more information.

disconnected()

This tells the ClientMessenger that the connection has been lost. Any messages that you attempt to send to the client will be queued up so that they can be sent when the connection comes back.

disconnect()

This tells the ClientMessenger to disconnect from the client, and invokes the handler you set up when you called setDisconnectHandler or via options.disconnect in the constructor.

receiveMessage(any serialized)

When you receive a message from your WebSocket (or other protocol), call this function to pass the serialized message. It will be sent to your registered deserialize-function, which must return an array. The ClientMessenger will then emit the arguments, meaning that the first array-element is the event name and the remaining elements are the arguments passed to your event handler. After this, it will emit delivered with the deserialized arguments-array as a single argument. This allows you to do any cleanup operations, like passing objects back into a pool.

Example:

If your deserialize function returns ['message', { hello: 'world' }], the ClientMessenger will emit the event "message" and pass the object { hello: 'world' } as the only argument. After this, the ClientMessenger will emit "delivered" and pass the array ['message', { hello: 'world' }] as the only argument.

async send(any ...args)

You may pass any amount of arguments to this function to have it serialized and sent.

Whether you want to use a single argument as message source, or multiple (so you can for example combine an emittable event-name with message-data as a 2nd argument), is completely up to you.

If the client is currently not connected, the message will be queued. Once the client reconnects, the message will automatically be sent.

If serialization throws, the error will be logged.

async trySend(any ...args)

You may pass any amount of arguments to this function to have it serialized and sent.

Whether you want to use a single argument as message source, or multiple (so you can for example combine an emittable event-name with message-data as a 2nd argument), is completely up to you.

If the client is currently not connected, the message will be dropped.

If serialization throws, the error will be logged.

prepare(any ...args) -> any

You may pass any amount of arguments to this function to have it serialized and returned. Preparing a message is useful when you want to send the same message to more than one client-messenger. You can serialize once, and then distribute at a lower performance cost using sendPrepared.

Whether you want to use a single argument as message source, or multiple (so you can for example combine an emittable event-name with message-data as a 2nd argument), is completely up to you.

If serialization throws, the error will be logged and prepare will return undefined.

async sendPrepared(any serializedMessage)

This will send the serialized message to the client. If the client is currently not connected, the message will be queued. Once the client reconnects, the message will automatically be sent.

async trySendPrepared(any serializedMessage)

This will send the serialized message to the client. If the client is currently not connected, the message will be dropped.

License

MIT

Credit

Cagey is developed and maintained by Wizcorp.