socket.red

Websocket server

Usage no npm install needed!

<script type="module">
  import socketRed from 'https://cdn.skypack.dev/socket.red';
</script>

README

socket.red

A websocket server for executing your apis, dispatching redux actions on clients and emitting events from server.

Installation

$ npm install --save socket.red

Usage

const startServer = require('socket.red');

// Your api provider
class ServerApi {
  constructor(session) {
    this.session = session;
  }

  // A simple api that returns a value, error or promise
  clap(numberOfHands) {
    // the api can throw error, which is received at the remote end
    if (!numberOfHands) {
      throw new Error('Cannot clap without any hands');
    }

    // The api can return via promise
    if (numberOfHands > 2) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          if (numberOfHands > 10) {
            reject(new Error('What kind of a monster are you?'));
          } else {
            resolve('its difficult to clap with so many hands');
          }
        }, 500)
      });
    }

    // The api can return immediately as well
    return `Clap Clap Clap with ${numberOfHands}`;
  }

  // A more useful api that can dispatch action to all the clients
  createRecord(schema, record) {
    const rec = db.insert(schema, record);
    Object.keys(allSessions).forEach(key => allSessions[key].dispatch({
      type: 'schema.insert', 
      schema: model, 
      payload: rec,
    }));
  }
}

const allSessions = {};

// This is how you start the server
startServer(8080, function createSession(url) {
  // You can throw an error here, to reject the connection
  const user = identify(url);

  const session = {
    onClose: () => {
      delete allSessions[user.id];
    },
    
    // A callback invoked as soon as a session is started. Return the
    // api that needs to be available from this server
    onStart: (sess) => { /* sess === session */
      // Store the session for using later
      allSessions[user.id] = session;

      // Cleanup stuff to do when the remote connection closes
      session.addCloseListener(() => {
        delete allSessions[user.id];
      });

      // An entry point for the session startup, you can use the session
      // object here iwth dispatch and emit methods
      session.emit('hi', 'A new session has started'); // Send an event to the client
      session.dispatch({ type: 'ACTION_TYPE', payload: 'Your action data' });

      return new ServerApi(session);
    },

    // Add any other properties to the session as you need
    user,
  };

  return session;
});