Skip to content

michael-kamel/ternion

Repository files navigation

Ternion

Build Status Coverage Status Known Vulnerabilities Packagist DeepScan grade Maintainability Codacy Badge

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"); });

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published