diff --git a/dist/smartsocket.classes.smartsocket.d.ts b/dist/smartsocket.classes.smartsocket.d.ts index a4fe738..932de9f 100644 --- a/dist/smartsocket.classes.smartsocket.d.ts +++ b/dist/smartsocket.classes.smartsocket.d.ts @@ -1,12 +1,6 @@ /// import { Objectmap } from "lik"; import { SocketRole } from "./smartsocket.classes.socketrole"; -export interface ISocketObject { - alias?: string; - authenticated: boolean; - role?: string; - socket: SocketIO.Socket; -} export interface ISmartsocketConstructorOptions { port: number; } @@ -14,13 +8,13 @@ export declare class Smartsocket { options: ISmartsocketConstructorOptions; io: SocketIO.Server; openSockets: Objectmap; - registeredRoles: Objectmap; + registeredFunctions: Objectmap; constructor(optionsArg: ISmartsocketConstructorOptions); /** * the standard handler for new socket connections */ - private _handleSocket(socket); - registerFunctions(socketRoleArg: SocketRole): void; + private _handleSocket(socketArg); + registerFunction(socketRoleArg: SocketRole): void; /** * starts listening to incling sockets: */ diff --git a/dist/smartsocket.classes.smartsocket.js b/dist/smartsocket.classes.smartsocket.js index f1b467b..68ae306 100644 --- a/dist/smartsocket.classes.smartsocket.js +++ b/dist/smartsocket.classes.smartsocket.js @@ -3,12 +3,12 @@ const plugins = require("./smartsocket.plugins"); const helpers = require("./smartsocket.helpers"); // classes const lik_1 = require("lik"); -; +const smartsocket_classes_socketconnection_1 = require("./smartsocket.classes.socketconnection"); ; class Smartsocket { constructor(optionsArg) { this.openSockets = new lik_1.Objectmap(); - this.registeredRoles = new lik_1.Objectmap(); + this.registeredFunctions = new lik_1.Objectmap(); /** * starts listening to incling sockets: */ @@ -32,20 +32,20 @@ class Smartsocket { /** * the standard handler for new socket connections */ - _handleSocket(socket) { - let socketObject = { - socket: socket, - authenticated: false - }; + _handleSocket(socketArg) { + let socketConnection = new smartsocket_classes_socketconnection_1.SocketConnection({ + authenticated: false, + socket: socketArg + }); plugins.beautylog.log("Socket connected. Trying to authenticate..."); - this.openSockets.add(socketObject); - helpers.authenticateSocket(socketObject) + this.openSockets.add(socketConnection); + helpers.authenticateSocket(socketConnection) .then(); } - registerFunctions(socketRoleArg) { - this.registeredRoles.add(socketRoleArg); + registerFunction(socketRoleArg) { + this.registeredFunctions.add(socketRoleArg); } ; } exports.Smartsocket = Smartsocket; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFDakQsTUFBWSxPQUFPLFdBQU0sdUJBQXVCLENBQUMsQ0FBQTtBQUVqRCxVQUFVO0FBQ1Ysc0JBQTBCLEtBQUssQ0FBQyxDQUFBO0FBVS9CLENBQUM7QUFLRCxDQUFDO0FBRUY7SUFLSSxZQUFZLFVBQTBDO1FBRnRELGdCQUFXLEdBQUcsSUFBSSxlQUFTLEVBQUUsQ0FBQztRQUM5QixvQkFBZSxHQUFHLElBQUksZUFBUyxFQUFFLENBQUM7UUF3QmxDOztXQUVHO1FBRUgsZ0JBQVcsR0FBRztZQUNWLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVM7Z0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUE7UUFDRCxnQkFBVyxHQUFHO1lBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUE4QjtnQkFDcEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRixlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQTtRQXZDRyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM5QixDQUFDOztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLE1BQU07UUFDeEIsSUFBSSxZQUFZLEdBQWtCO1lBQzlCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsYUFBYSxFQUFFLEtBQUs7U0FDdkIsQ0FBQztRQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQzthQUNuQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsYUFBd0I7UUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7QUFxQkwsQ0FBQztBQTlDWSxtQkFBVyxjQThDdkIsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zbWFydHNvY2tldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc21hcnRzb2NrZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFDakQsTUFBWSxPQUFPLFdBQU0sdUJBQXVCLENBQUMsQ0FBQTtBQUVqRCxVQUFVO0FBQ1Ysc0JBQTBCLEtBQUssQ0FBQyxDQUFBO0FBR2hDLHVEQUFpQyx3Q0FBd0MsQ0FBQyxDQUFBO0FBS3pFLENBQUM7QUFFRjtJQUtJLFlBQVksVUFBMEM7UUFGdEQsZ0JBQVcsR0FBRyxJQUFJLGVBQVMsRUFBRSxDQUFDO1FBQzlCLHdCQUFtQixHQUFHLElBQUksZUFBUyxFQUFFLENBQUM7UUF3QnRDOztXQUVHO1FBRUgsZ0JBQVcsR0FBRztZQUNWLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVM7Z0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUE7UUFDRCxnQkFBVyxHQUFHO1lBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUE4QjtnQkFDcEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRixlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQTtRQXZDRyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUM5QixDQUFDOztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLFNBQVM7UUFDM0IsSUFBSSxnQkFBZ0IsR0FBc0IsSUFBSSx1REFBZ0IsQ0FBQztZQUMzRCxhQUFhLEVBQUMsS0FBSztZQUNuQixNQUFNLEVBQUMsU0FBUztTQUNuQixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdkMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDO2FBQ3ZDLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxhQUF5QjtRQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRWhELENBQUM7O0FBb0JMLENBQUM7QUE5Q1ksbUJBQVcsY0E4Q3ZCLENBQUEifQ== \ No newline at end of file diff --git a/dist/smartsocket.classes.socketconnection.d.ts b/dist/smartsocket.classes.socketconnection.d.ts new file mode 100644 index 0000000..e17707b --- /dev/null +++ b/dist/smartsocket.classes.socketconnection.d.ts @@ -0,0 +1,14 @@ +/// +export interface ISocketConnectionOptions { + alias?: string; + authenticated: boolean; + role?: string; + socket: SocketIO.Socket; +} +export declare class SocketConnection { + alias?: string; + authenticated: boolean; + role?: string; + socket: SocketIO.Socket; + constructor(optionsArg: ISocketConnectionOptions); +} diff --git a/dist/smartsocket.classes.socketconnection.js b/dist/smartsocket.classes.socketconnection.js new file mode 100644 index 0000000..6c02d4b --- /dev/null +++ b/dist/smartsocket.classes.socketconnection.js @@ -0,0 +1,13 @@ +"use strict"; +; +class SocketConnection { + constructor(optionsArg) { + this.alias = optionsArg.alias; + this.authenticated = optionsArg.authenticated; + this.role = optionsArg.role; + this.socket = optionsArg.socket; + } +} +exports.SocketConnection = SocketConnection; +; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFPQyxDQUFDO0FBRUY7SUFLSSxZQUFZLFVBQW1DO1FBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNwQyxDQUFDO0FBQ0wsQ0FBQztBQVhZLHdCQUFnQixtQkFXNUIsQ0FBQTtBQUFBLENBQUMifQ== \ No newline at end of file diff --git a/dist/smartsocket.classes.socketfunction.d.ts b/dist/smartsocket.classes.socketfunction.d.ts index f2ecd87..c0ad626 100644 --- a/dist/smartsocket.classes.socketfunction.d.ts +++ b/dist/smartsocket.classes.socketfunction.d.ts @@ -1,4 +1,9 @@ import { SocketRole } from "./smartsocket.classes.socketrole"; +export interface ISocketFunctionData { + functionName: string; + functionData: any; + responseTimeout?: number; +} export interface SocketFunctionOptions { name: string; func: any; @@ -9,4 +14,6 @@ export declare class SocketFunction { func: any; roles: SocketRole[]; constructor(optionsArg: SocketFunctionOptions); + private _notifyRole(socketRoleArg); + functionRequest(dataArg: ISocketFunctionData): void; } diff --git a/dist/smartsocket.classes.socketfunction.js b/dist/smartsocket.classes.socketfunction.js index 3ab3af9..882ad0a 100644 --- a/dist/smartsocket.classes.socketfunction.js +++ b/dist/smartsocket.classes.socketfunction.js @@ -1,12 +1,21 @@ "use strict"; ; +; class SocketFunction { constructor(optionsArg) { this.name = optionsArg.name; this.func = optionsArg.func; this.roles = optionsArg.roles; + for (let socketRoleArg of this.roles) { + this._notifyRole(socketRoleArg); + } } ; + _notifyRole(socketRoleArg) { + socketRoleArg.addSocketFunction(this); + } + functionRequest(dataArg) { + } } exports.SocketFunction = SocketFunction; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRmdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc29ja2V0ZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQVlDLENBQUM7QUFFRjtJQUlJLFlBQVksVUFBaUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDbEMsQ0FBQzs7QUFDTCxDQUFDO0FBVFksc0JBQWMsaUJBUzFCLENBQUEifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRmdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmNsYXNzZXMuc29ja2V0ZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQVVDLENBQUM7QUFNRCxDQUFDO0FBRUY7SUFJSSxZQUFZLFVBQWlDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxDQUFDLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNMLENBQUM7O0lBQ08sV0FBVyxDQUFDLGFBQXdCO1FBQ3hDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsZUFBZSxDQUFDLE9BQTJCO0lBRTNDLENBQUM7QUFDTCxDQUFDO0FBbEJZLHNCQUFjLGlCQWtCMUIsQ0FBQSJ9 \ No newline at end of file diff --git a/dist/smartsocket.classes.socketrole.d.ts b/dist/smartsocket.classes.socketrole.d.ts index 02dc56d..4e7c947 100644 --- a/dist/smartsocket.classes.socketrole.d.ts +++ b/dist/smartsocket.classes.socketrole.d.ts @@ -1,3 +1,4 @@ +import { SocketFunction } from "./smartsocket.classes.socketfunction"; /** * interface for class SocketRole */ @@ -11,5 +12,7 @@ export interface SocketRoleOptions { export declare class SocketRole { name: string; passwordHash: string; + allowedFunctions: SocketFunction[]; constructor(optionsArg: SocketRoleOptions); + addSocketFunction(socketFunctionArg: SocketFunction): void; } diff --git a/dist/smartsocket.classes.socketrole.js b/dist/smartsocket.classes.socketrole.js index efbe61f..dd32d4a 100644 --- a/dist/smartsocket.classes.socketrole.js +++ b/dist/smartsocket.classes.socketrole.js @@ -7,6 +7,10 @@ class SocketRole { this.name = optionsArg.name; this.passwordHash = optionsArg.passwordHash; } + ; + addSocketFunction(socketFunctionArg) { + this.allowedFunctions.push(socketFunctionArg); + } } exports.SocketRole = SocketRole; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFjQTs7R0FFRztBQUNIO0lBR0ksWUFBWSxVQUE0QjtRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO0lBQ2hELENBQUM7QUFDTCxDQUFDO0FBUFksa0JBQVUsYUFPdEIsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRyb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFjQTs7R0FFRztBQUNIO0lBSUksWUFBWSxVQUE2QjtRQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO0lBQ2hELENBQUM7O0lBQ0QsaUJBQWlCLENBQUMsaUJBQWdDO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0FBQ0wsQ0FBQztBQVhZLGtCQUFVLGFBV3RCLENBQUEifQ== \ No newline at end of file diff --git a/dist/smartsocket.helpers.d.ts b/dist/smartsocket.helpers.d.ts index d30673c..97d5898 100644 --- a/dist/smartsocket.helpers.d.ts +++ b/dist/smartsocket.helpers.d.ts @@ -1,7 +1,8 @@ /// import * as plugins from "./smartsocket.plugins"; -import { ISocketObject } from "./smartsocket.classes.smartsocket"; +import { SocketConnection } from "./smartsocket.classes.socketconnection"; /** * authenticate a socket */ -export declare let authenticateSocket: (socketObjectArg: ISocketObject) => plugins.q.Promise<{}>; +export declare let authenticateSocket: (socketConnectionArg: SocketConnection) => plugins.q.Promise<{}>; +export declare let listenToReadySocket: (socketConnectionArg: SocketConnection) => plugins.q.Promise<{}>; diff --git a/dist/smartsocket.helpers.js b/dist/smartsocket.helpers.js index fc62b3d..b730c04 100644 --- a/dist/smartsocket.helpers.js +++ b/dist/smartsocket.helpers.js @@ -3,26 +3,31 @@ const plugins = require("./smartsocket.plugins"); /** * authenticate a socket */ -exports.authenticateSocket = (socketObjectArg) => { +exports.authenticateSocket = (socketConnectionArg) => { let done = plugins.q.defer(); - socketObjectArg.socket.on("dataAuth", dataArg => { + socketConnectionArg.socket.on("dataAuth", dataArg => { plugins.beautylog.log("received authentication data. now hashing and comparing..."); - socketObjectArg.socket.removeListener("dataAuth", () => { }); + socketConnectionArg.socket.removeListener("dataAuth", () => { }); if ((true)) { - socketObjectArg.alias = dataArg.alias; - socketObjectArg.authenticated = true; - socketObjectArg.role = dataArg.role; - socketObjectArg.socket.emit("authenticated"); - plugins.beautylog.ok(`socket with >>alias ${socketObjectArg.alias} >>role ${socketObjectArg.role} is authenticated!`); - done.resolve(socketObjectArg); + socketConnectionArg.alias = dataArg.alias; + socketConnectionArg.authenticated = true; + socketConnectionArg.role = dataArg.role; + socketConnectionArg.socket.emit("authenticated"); + plugins.beautylog.ok(`socket with >>alias ${socketConnectionArg.alias} >>role ${socketConnectionArg.role} is authenticated!`); + done.resolve(socketConnectionArg); } else { - socketObjectArg.socket.disconnect(); + socketConnectionArg.socket.disconnect(); done.reject("not authenticated"); } ; }); - socketObjectArg.socket.emit("requestAuth"); + socketConnectionArg.socket.emit("requestAuth"); return done.promise; }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFRakQ7O0dBRUc7QUFDUSwwQkFBa0IsR0FBRyxDQUFDLGVBQThCO0lBQzNELElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLE9BQU87UUFDekMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUNwRixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM3RCxFQUFFLENBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQztZQUNQLGVBQWUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtZQUNyQyxlQUFlLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUNyQyxlQUFlLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDcEMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDN0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxLQUFLLFdBQVcsZUFBZSxDQUFDLElBQUksb0JBQW9CLENBQUMsQ0FBQTtZQUNySCxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFBQSxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFDSCxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUMifQ== \ No newline at end of file +exports.listenToReadySocket = (socketConnectionArg) => { + let done = plugins.q.defer(); + // socketConnectionArg.socket.listen("function", ) + return done.promise; +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0c29ja2V0LmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQVksT0FBTyxXQUFNLHVCQUF1QixDQUFDLENBQUE7QUFRakQ7O0dBRUc7QUFDUSwwQkFBa0IsR0FBRyxDQUFDLG1CQUFxQztJQUNsRSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLE9BQU87UUFDN0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUNwRixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1QsbUJBQW1CLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7WUFDekMsbUJBQW1CLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUN6QyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztZQUN4QyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLHVCQUF1QixtQkFBbUIsQ0FBQyxLQUFLLFdBQVcsbUJBQW1CLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFBO1lBQzdILElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFBQSxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFDSCxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUMsQ0FBQztBQUVTLDJCQUFtQixHQUFHLENBQUMsbUJBQXFDO0lBQ25FLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0Isa0RBQWtEO0lBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/package.json b/package.json index 4cf49bf..06ef741 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,13 @@ "homepage": "https://gitlab.com/pushrocks/smartsocket#README", "dependencies": { "@types/q": "0.x.x", + "@types/shortid": "0.0.27", "@types/socket.io": "^1.4.26", "@types/socket.io-client": "^1.4.26", "beautylog": "^5.0.20", - "lik": "^1.0.10", + "lik": "^1.0.15", "q": "^1.4.1", + "shortid": "^2.2.6", "socket.io": "^1.4.8", "socket.io-client": "^1.4.8", "taskbuffer": "^1.0.7" diff --git a/ts/smartsocket.classes.smartsocket.ts b/ts/smartsocket.classes.smartsocket.ts index 8504b65..d7b4cfe 100644 --- a/ts/smartsocket.classes.smartsocket.ts +++ b/ts/smartsocket.classes.smartsocket.ts @@ -3,16 +3,9 @@ import * as helpers from "./smartsocket.helpers"; // classes import { Objectmap } from "lik"; -import {SocketRole} from "./smartsocket.classes.socketrole"; -import {SocketFunction} from "./smartsocket.classes.socketfunction"; - - -export interface ISocketObject { - alias?:string; - authenticated: boolean - role?:string, - socket: SocketIO.Socket, -}; +import { SocketRole } from "./smartsocket.classes.socketrole"; +import { SocketFunction } from "./smartsocket.classes.socketfunction"; +import { SocketConnection } from "./smartsocket.classes.socketconnection"; export interface ISmartsocketConstructorOptions { port: number; @@ -20,10 +13,9 @@ export interface ISmartsocketConstructorOptions { }; export class Smartsocket { - options:ISmartsocketConstructorOptions + options: ISmartsocketConstructorOptions io: SocketIO.Server; - openSockets = new Objectmap(); - registeredRoles = new Objectmap(); + openSockets = new Objectmap(); constructor(optionsArg: ISmartsocketConstructorOptions) { this.options = optionsArg; }; @@ -31,22 +23,17 @@ export class Smartsocket { /** * the standard handler for new socket connections */ - private _handleSocket(socket) { - let socketObject: ISocketObject = { - socket: socket, - authenticated: false - }; + private _handleSocket(socketArg) { + let socketConnection: SocketConnection = new SocketConnection({ + authenticated:false, + socket:socketArg + }); plugins.beautylog.log("Socket connected. Trying to authenticate...") - this.openSockets.add(socketObject); - helpers.authenticateSocket(socketObject) - .then(); - } - - registerFunctions(socketRoleArg:SocketRole){ - this.registeredRoles.add(socketRoleArg); + this.openSockets.add(socketConnection); + socketConnection.authenticate() + .then(socketConnection.listenToFunctionRequests); }; - /** * starts listening to incling sockets: */ @@ -58,7 +45,7 @@ export class Smartsocket { }); } closeServer = () => { - this.openSockets.forEach((socketObjectArg: ISocketObject) => { + this.openSockets.forEach((socketObjectArg: SocketConnection) => { plugins.beautylog.log(`disconnect socket with >>alias ${socketObjectArg.alias}`); socketObjectArg.socket.disconnect(); }); diff --git a/ts/smartsocket.classes.socketconnection.ts b/ts/smartsocket.classes.socketconnection.ts new file mode 100644 index 0000000..285bfff --- /dev/null +++ b/ts/smartsocket.classes.socketconnection.ts @@ -0,0 +1,64 @@ +import * as plugins from "./smartsocket.plugins"; +import * as helpers from "./smartsocket.helpers"; + +// import classes +import { SocketRole } from "./smartsocket.classes.socketrole"; +import { SocketFunction, ISocketFunctionData } from "./smartsocket.classes.socketfunction"; + +export interface ISocketConnectionOptions { + alias?: string; + authenticated: boolean; + role?: SocketRole; + socket: SocketIO.Socket; +}; + +export class SocketConnection { + alias?: string; + authenticated: boolean; + role?: SocketRole; + socket: SocketIO.Socket; + constructor(optionsArg: ISocketConnectionOptions) { + this.alias = optionsArg.alias; + this.authenticated = optionsArg.authenticated; + this.role = optionsArg.role; + this.socket = optionsArg.socket; + } + /** + * authenticate the socket + */ + authenticate() { + let done = plugins.q.defer(); + this.socket.on("dataAuth", dataArg => { + plugins.beautylog.log("received authentication data. now hashing and comparing..."); + this.socket.removeListener("dataAuth", () => { }); + if ((true)) { // TODO: authenticate password + this.alias = dataArg.alias + this.authenticated = true; + this.role = helpers.findSocketRoleByString(dataArg.role); + this.socket.emit("authenticated"); + plugins.beautylog.ok(`socket with >>alias ${this.alias} >>role ${this.role} is authenticated!`); + done.resolve(this); + } else { + this.socket.disconnect(); + done.reject("not authenticated"); + }; + }); + this.socket.emit("requestAuth"); + return done.promise; + }; + + /** + * listen to function requests + */ + listenToFunctionRequests() { + let done = plugins.q.defer(); + if(this.authenticated){ + this.socket.on("function", (dataArg:ISocketFunctionData) => { + this.role.allowedFunctions + }) + } else { + done.reject("socket needs to be authenticated first"); + }; + return done.promise; + } +}; diff --git a/ts/smartsocket.classes.socketfunction.ts b/ts/smartsocket.classes.socketfunction.ts index efd3522..1b6215e 100644 --- a/ts/smartsocket.classes.socketfunction.ts +++ b/ts/smartsocket.classes.socketfunction.ts @@ -4,7 +4,11 @@ import * as plugins from "./smartsocket.plugins"; import { Stringmap } from "lik"; import { SocketRole } from "./smartsocket.classes.socketrole"; - +export interface ISocketFunctionData { + functionName:string, + functionData:any, + responseTimeout?:number +}; export interface SocketFunctionOptions { name: string; @@ -16,9 +20,31 @@ export class SocketFunction { name: string; func: any; roles: SocketRole[]; + + /** + * the constructor for SocketFunction + */ constructor(optionsArg: SocketFunctionOptions) { this.name = optionsArg.name; this.func = optionsArg.func; this.roles = optionsArg.roles; + for (let socketRoleArg of this.roles){ + this._notifyRole(socketRoleArg); + } }; + + /** + * notifies a role about access to this SocketFunction + */ + private _notifyRole(socketRoleArg:SocketRole){ + socketRoleArg.addSocketFunction(this); + } + + /** + * handles a function request to this SocketFunction + */ + functionRequest(dataArg:ISocketFunctionData){ + + }; + } \ No newline at end of file diff --git a/ts/smartsocket.classes.socketrole.ts b/ts/smartsocket.classes.socketrole.ts index 4af71c7..442ba03 100644 --- a/ts/smartsocket.classes.socketrole.ts +++ b/ts/smartsocket.classes.socketrole.ts @@ -1,25 +1,34 @@ import * as plugins from "./smartsocket.plugins"; // import classes -import { Stringmap } from "lik"; +import { Objectmap } from "lik"; +import { SocketFunction } from "./smartsocket.classes.socketfunction"; + + +export let allSocketRoles = new Objectmap(); + /** * interface for class SocketRole */ export interface SocketRoleOptions { - name:string; - passwordHash:string; + name: string; + passwordHash: string; } - /** * A socketrole defines access to certain routines. */ export class SocketRole { - name:string; - passwordHash:string; - constructor(optionsArg:SocketRoleOptions){ + name: string; + passwordHash: string; + allowedFunctions = new Objectmap(); + constructor(optionsArg: SocketRoleOptions) { this.name = optionsArg.name; this.passwordHash = optionsArg.passwordHash; + allSocketRoles.add(this); + }; + addSocketFunction(socketFunctionArg:SocketFunction){ + this.allowedFunctions.add(socketFunctionArg); } } \ No newline at end of file diff --git a/ts/smartsocket.helpers.ts b/ts/smartsocket.helpers.ts index cb0e545..87fc82a 100644 --- a/ts/smartsocket.helpers.ts +++ b/ts/smartsocket.helpers.ts @@ -1,31 +1,14 @@ import * as plugins from "./smartsocket.plugins"; -// interfaces -import {ISocketObject} from "./smartsocket.classes.smartsocket"; +// classes +import { Smartsocket } from "./smartsocket.classes.smartsocket"; +import { SocketFunction } from "./smartsocket.classes.socketfunction"; +import { SocketConnection } from "./smartsocket.classes.socketconnection"; +import { SocketRole, allSocketRoles } from "./smartsocket.classes.socketrole"; +// SocketRole helpers +export let findSocketRoleByString = (socketRoleNameArg: string): SocketRole => { + return allSocketRoles.find((socketRoleArg) => { return socketRoleArg.name === socketRoleNameArg }) +}; - -/** - * authenticate a socket - */ -export let authenticateSocket = (socketObjectArg: ISocketObject) => { - let done = plugins.q.defer(); - socketObjectArg.socket.on("dataAuth", dataArg => { - plugins.beautylog.log("received authentication data. now hashing and comparing..."); - socketObjectArg.socket.removeListener("dataAuth", () => { }); - if((true)){ // TODO: authenticate password - socketObjectArg.alias = dataArg.alias - socketObjectArg.authenticated = true; - socketObjectArg.role = dataArg.role; - socketObjectArg.socket.emit("authenticated"); - plugins.beautylog.ok(`socket with >>alias ${socketObjectArg.alias} >>role ${socketObjectArg.role} is authenticated!`) - done.resolve(socketObjectArg); - } else { - socketObjectArg.socket.disconnect(); - done.reject("not authenticated"); - }; - }); - socketObjectArg.socket.emit("requestAuth"); - return done.promise; -}; \ No newline at end of file