import * as plugins from './smartsocket.plugins' // import interfaces import { ISocketFunctionCall } from './smartsocket.classes.socketfunction' import { ISocketRequestDataObject } from './smartsocket.classes.socketrequest' // import classes import { SocketConnection } from './smartsocket.classes.socketconnection' import { SocketFunction } from './smartsocket.classes.socketfunction' import { SocketRequest } from './smartsocket.classes.socketrequest' /** * interface for class SmartsocketClient */ export interface ISmartsocketClientOptions { port: number url: string alias: string // an alias makes it easier to identify this client in a multo client environment role: string password: string // by setting a password access to functions can be limited } export class SmartsocketClient { alias: string role: string socketConnection: SocketConnection serverUrl: string serverPort: number serverPassword: string constructor(optionsArg: ISmartsocketClientOptions) { this.alias = optionsArg.alias this.role = optionsArg.role this.serverUrl = optionsArg.url this.serverPort = optionsArg.port this.serverPassword = optionsArg.password } /** * connect the client to the server */ connect () { let done = plugins.smartq.defer() plugins.beautylog.log('trying to connect...') let socketUrl = `${this.serverUrl}:${this.serverPort}` this.socketConnection = new SocketConnection({ alias: this.alias, authenticated: false, role: undefined, side: 'client', smartsocketHost: null, socket: plugins.socketIoClient(socketUrl, { multiplex: false }) }) this.socketConnection.socket.on('requestAuth', () => { console.log('server requested authentication') this.socketConnection.socket.emit('dataAuth', { role: this.role, password: this.serverPassword, alias: this.alias }) this.socketConnection.socket.on('authenticated', () => { console.log('client is authenticated') this.socketConnection.authenticated = true this.socketConnection.listenToFunctionRequests() done.resolve() }) }) return done.promise } disconnect () { let done = plugins.smartq.defer() this.socketConnection.socket.disconnect() this.socketConnection = undefined plugins.beautylog.ok('disconnected!') done.resolve() return done.promise } serverCall (functionNameArg: string, dataArg: any) { let done = plugins.smartq.defer() let socketRequest = new SocketRequest({ side: 'requesting', originSocketConnection: this.socketConnection, shortId: plugins.shortid.generate(), funcCallData: { funcName: functionNameArg, funcDataArg: dataArg } }) socketRequest.dispatch() .then((dataArg: ISocketFunctionCall) => { done.resolve(dataArg.funcDataArg) }) return done.promise } }