global-event-handler
Version:
A hierarchical global event handler. Runs as its own fork or standalone server and syncs events acros forks and or servers
137 lines (108 loc) • 4.08 kB
text/typescript
import {Observable,Subject} from 'rxjs'
var now = require("performance-now")
export class globalEventHandlerClient{
_socket;
eventListeners:{ [id:string]: globalEventLissener} = {};
events:globalEvent[] = [];
msgsToSend = []
on = false
constructor(public port:number, public host:String){
var tA, tB, tId = [];
var net = require('net'),
JsonSocket = require('json-socket');
//var port = 9838; //The same port that the server is listening on
//var host = '127.0.0.1';
this._socket = new JsonSocket(new net.Socket()); //Decorate a standard net.Socket with JsonSocket
let vm = this;
setTimeout(()=>{
vm._socket.connect(port, host);
},3000)
let localSubjects = [];
vm.msgsToSend = [];
this._socket.on('connect', function() { //Don't send until we're connected
//console.log('connected');
vm.on = true
vm.events.forEach((n)=>{
n.connectToSocket(vm._socket);
})
for(var n in vm.eventListeners){
vm.eventListeners[n].connectToSocket(vm._socket);
}
vm._socket.on('message', function(message) {
if(vm.eventListeners[message.eventId]) vm.eventListeners[message.eventId].subject.next(message.evPackage)
});
vm._socket.on('error', function (exc) {
console.log("ignoring exception: " + exc);
});
vm.msgsToSend.forEach(_m =>{
vm._socket.sendMessage(_m)
})
vm.msgsToSend = []
});
vm._socket.__sendMessage = (val)=>{
if(vm.on) vm._socket.sendMessage(val);
else vm.msgsToSend.push(val)
}
}
createEvent = (_eventName, key)=>{
let newEvent = new globalEvent(_eventName,key,this._socket,this.disposeEvent);
this.events.push(newEvent);
return newEvent;
}
disposeEvent = (_eventId) =>{
let c = this.events.length;
for (var index = 0; index < c; index++) {
if(this.events[index].eventId == _eventId){
this.events.slice(index,1);
}
}
}
createEventLissener = (_eventName, key) =>{
let newEventLissener = new globalEventLissener(_eventName,key,this._socket, this.disposeEventLissener);
this.eventListeners[newEventLissener.eventId] = newEventLissener;
return newEventLissener;
}
disposeEventLissener = (_eventId) =>{
delete this.eventListeners[_eventId];
}
}
export class globalEvent{
eventId:string = Math.random().toString() + now().toString();
constructor(public eventName, public key ,private socket, private _dispose){
this.connectToSocket(socket);
}
connectToSocket = (_socket)=>{
this.socket = _socket;
}
next = (_msg)=>{
this.socket.__sendMessage({type:'onEvent',key:this.key, evPackage:{name:this.eventName,tId:this.eventId,msg:_msg}});
}
dispose = ()=>{
this._dispose(this.eventId)
}
}
export class globalEventLissener{
eventId:string = Math.random().toString() + now().toString();
subject:Subject<any>;
observable:Observable<any>;
constructor(public eventName,public key, private _socket, private _dispose){
let vm = this;
this.observable = Observable.create((_subject)=>{
vm.subject = _subject;
vm.connectToSocket(vm._socket);
return vm.dispose;
})
}
connectToSocket = (_socket)=>{
this._socket = _socket;
try {
this._socket.__sendMessage({type:'addEvent',eventId:this.eventId, key:this.key});
} catch (error) {
}
}
dispose = ()=>{
this._socket.__sendMessage({type:'removeEvent',eventId:this.eventId});
this.subject.complete();
this._dispose(this.eventId);
}
}