A socket.io framework that does the job for you.


Keywords
npm, socket.io, framework
License
MIT
Install
npm install ternion@0.8.5

Documentation

Ternion

Build Status Coverage Status Known Vulnerabilities Packagist DeepScan grade

A plugable socket.io framework that does the job for you

This project is still under development

Sample usage

const ternion = require('ternion');
const sockio = require('socket.io');
const io = sockio(8000);

const IDENTIFIER = 'id';
const emitter = ternion.buildTools.constructEmitter();
const defaultBuild = ternion.builds.defaultBuild();

const names = [];
const loggedIn = {};
const nameExistsValidator = ternion.buildTools.buildValidator((data, response, id) => names.indexOf(data.name) === -1, 'Name exists');
const nameLengthValidator = ternion.buildTools.buildValidator((data, response, id) => data.name.length > 2, 'Name must be of length 3 atleast');
const hasNameValidator = ternion.buildTools.buildValidator((data, response, id) => !!data.name, 'No Name provided');
const loggedInValidator = ternion.buildTools.buildValidator((data, response, id) => !!loggedIn[id], 'Not logged in');
const hasMsgValidator = ternion.buildTools.buildValidator((data, response, id) => !!data.msg, 'No message provided');
const msgEmptyValidator = ternion.buildTools.buildValidator((data, response, id) => data.msg.length > 2, 'Message must be of length 3 at least');
const nameFillMiddleware = (data, response, id) => { data.name = loggedIn[id]; };
const loginHandler = (data, response, id) => {
  loggedIn[id] = data.name;
  names.push(data.name);
  response.respond('loginsuccess');
};
const msgHandler = (data, response, id) => {
  response.broadcast('message', { name: data.name, msg: data.msg });
  response.respond('message', { name: data.name, msg: data.msg });
};
const welcomeMsg = (data, response, id) => {
  response.respond('misc', { name: data.name, msg: 'Welcome' });
};
const disconnect = (data, response, id) => {
  delete loggedIn[id];
  names.splice(names.indexOf(data.name), 1);
};

const buildSpec =
{
  events:
    {
      newclient:
        {
          handlers: [ welcomeMsg ]
        },
      disconnect:
        {
          middlewares: [ nameFillMiddleware ],
          handlers: [ disconnect ]
        },
      login:
        {
          preValidators: [ hasNameValidator, nameLengthValidator, nameExistsValidator ],
          handlers: [ loginHandler ]
        },
      message:
        {
          preValidators: [ loggedInValidator, hasMsgValidator, msgEmptyValidator ],
          middlewares: [ nameFillMiddleware ],
          handlers: [ msgHandler ]
        }
    }
};
const newBuild = ternion.buildTools.constructBuild(
  {
    buildSpec,
    opts: { preFailFast: true, postFailFast: true, unknownActionMsg: 'unknown', ignoreUnregisteredEvents: false }
  });

const build = ternion.buildTools.mergeBuilds({ builds: [ defaultBuild, newBuild ] });
const handler = ternion.buildTools.constructHandler({ build, emitter, identifier: IDENTIFIER });
const sock = ternion.buildTools.constructManager({ eventSource: io, emitter, identifier: IDENTIFIER });

sock.start();
handler.start();
const io = require('socket.io-client');

const client = io('http://localhost:8000/');
client.on('connect', function () {
  console.log('connected');
  client.emit('message', { msgType: 'login', msgData: { name: 'testname' } });
});
client.on('message', function (data) {
  const mdata = data.msgData;
  switch (data.msgType) {
    case 'validationErrors': console.log(mdata); break;
    case 'loginsuccess': { console.log('logged in'); client.emit('message', { msgType: 'message', msgData: { msg: 'some random msg' } }); break; }
    case 'misc': console.log(mdata.msg); break;
    case 'message': console.log('message from ' + mdata.name + ' : ' + mdata.msg); break;
    case 'unhandledError': console.log('unhandled: ' + mdata); break;
    case 'unrecongnizedMessage': console.log('unrecongnized: ' + mdata); break;
  }
});
client.on('disconnect', function () { console.log('server closed connection'); });