A plugable socket.io framework that does the job for you
This project is still under development
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" ) ; } ) ;