now handling responses

This commit is contained in:
Philipp Kunz 2016-08-12 05:17:13 +02:00
parent da510eb87a
commit 3afede95fc
4 changed files with 60 additions and 34 deletions

View File

@ -3,7 +3,7 @@ import * as helpers from "./smartsocket.helpers";
// import classes // import classes
import { SocketFunction } from "./smartsocket.classes.socketfunction"; import { SocketFunction } from "./smartsocket.classes.socketfunction";
import { SocketRequest, ISocketRequestDataObject } from "./smartsocket.classes.socketrequest"; import { SocketRequest, ISocketRequestDataObject, allSocketRequests } from "./smartsocket.classes.socketrequest";
import { SocketRole } from "./smartsocket.classes.socketrole"; import { SocketRole } from "./smartsocket.classes.socketrole";
// export interfaces // export interfaces
@ -96,7 +96,8 @@ export class SocketConnection {
}; };
}); });
this.socket.on("functionResponse", (dataArg:ISocketRequestDataObject) => { this.socket.on("functionResponse", (dataArg:ISocketRequestDataObject) => {
let targetSocketRequest = helpers.getSocketRequestById(dataArg.shortId);
targetSocketRequest.handleResponse(dataArg);
}) })
} else { } else {
done.reject("socket needs to be authenticated first"); done.reject("socket needs to be authenticated first");

View File

@ -6,9 +6,6 @@ import { SocketRole } from "./smartsocket.classes.socketrole";
// export interfaces // export interfaces
/** /**
* interface of the contructor options of class SocketFunction * interface of the contructor options of class SocketFunction
*/ */
@ -24,6 +21,13 @@ export interface ISocketFunctionConstructorOptions {
export interface ISocketFunctionCall { export interface ISocketFunctionCall {
funcName:string; funcName:string;
funcDataArg:any; funcDataArg:any;
};
/**
* interface for function definition of SocketFunction
*/
export interface IFuncDef {
(dataArg:any):PromiseLike<any>
} }
// export objects // export objects
@ -36,7 +40,7 @@ export let allSocketFunctions = new Objectmap<SocketFunction>();
*/ */
export class SocketFunction { export class SocketFunction {
name: string; name: string;
func: any; funcDef: IFuncDef;
roles: SocketRole[]; roles: SocketRole[];
/** /**
@ -44,7 +48,7 @@ export class SocketFunction {
*/ */
constructor(optionsArg: ISocketFunctionConstructorOptions) { constructor(optionsArg: ISocketFunctionConstructorOptions) {
this.name = optionsArg.funcName; this.name = optionsArg.funcName;
this.func = optionsArg.funcDef; this.funcDef = optionsArg.funcDef;
this.roles = optionsArg.allowedRoles; this.roles = optionsArg.allowedRoles;
for (let socketRoleArg of this.roles){ for (let socketRoleArg of this.roles){
this._notifyRole(socketRoleArg); this._notifyRole(socketRoleArg);
@ -62,9 +66,17 @@ export class SocketFunction {
/** /**
* invokes the function of this SocketFunction * invokes the function of this SocketFunction
*/ */
invoke(dataArg:any):plugins.q.Promise<any> { invoke(dataArg:ISocketFunctionCall):plugins.q.Promise<any> {
let done = plugins.q.defer(); let done = plugins.q.defer();
if(dataArg.funcName === this.name){
this.funcDef(dataArg.funcDataArg)
.then((resultData:any) => {
done.resolve(resultData);
});
} else {
throw new Error("SocketFunction.name does not match the data argument's .name!");
}
return done.promise; return done.promise;
}; };

View File

@ -1,4 +1,5 @@
import * as plugins from "./smartsocket.plugins"; import * as plugins from "./smartsocket.plugins";
import * as helpers from "./smartsocket.helpers";
// import interfaces // import interfaces
import { ISocketFunctionCall } from "./smartsocket.classes.socketfunction"; import { ISocketFunctionCall } from "./smartsocket.classes.socketfunction";
@ -17,7 +18,7 @@ export type TSocketRequestSide = "requesting" | "responding";
*/ */
export interface SocketRequestConstructorOptions { export interface SocketRequestConstructorOptions {
side: TSocketRequestSide; side: TSocketRequestSide;
originSocketConnection:SocketConnection; originSocketConnection: SocketConnection;
shortId: string; shortId: string;
funcCallData?: ISocketFunctionCall; funcCallData?: ISocketFunctionCall;
}; };
@ -26,52 +27,47 @@ export interface SocketRequestConstructorOptions {
* request object that is sent initially and may or may not receive a response * request object that is sent initially and may or may not receive a response
*/ */
export interface ISocketRequestDataObject { export interface ISocketRequestDataObject {
funcCallData:ISocketFunctionCall; funcCallData: ISocketFunctionCall;
shortId:string; shortId: string;
responseTimeout?:number; responseTimeout?: number;
}; };
//export objects //export objects
export let allRequestingSocketRequests = new Objectmap<SocketRequest>(); export let allSocketRequests = new Objectmap<SocketRequest>();
export let allRespondingSocketRequests = new Objectmap<SocketRequest>();
// export classes // export classes
export class SocketRequest { export class SocketRequest {
status: TSocketRequestStatus = "new"; status: TSocketRequestStatus = "new";
side: TSocketRequestSide; side: TSocketRequestSide;
shortid: string; shortid: string;
originSocketConnection:SocketConnection; originSocketConnection: SocketConnection;
funcCallData: ISocketFunctionCall funcCallData: ISocketFunctionCall
done = plugins.q.defer(); done = plugins.q.defer();
constructor(optionsArg: SocketRequestConstructorOptions) { constructor(optionsArg: SocketRequestConstructorOptions) {
this.side = optionsArg.side; this.side = optionsArg.side;
this.shortid = optionsArg.shortId; this.shortid = optionsArg.shortId;
this.funcCallData = optionsArg.funcCallData; this.funcCallData = optionsArg.funcCallData;
if(this.side === "requesting"){ allSocketRequests.add(this);
allRequestingSocketRequests.add(this);
} else {
allRespondingSocketRequests.add(this);
};
}; };
// requesting -------------------------- // requesting --------------------------
/** /**
* dispatches a socketrequest from the requesting to the receiving side * dispatches a socketrequest from the requesting to the receiving side
*/ */
dispatch(){ dispatch() {
let requestData:ISocketRequestDataObject = { let requestData: ISocketRequestDataObject = {
funcCallData:this.funcCallData, funcCallData: this.funcCallData,
shortId:this.shortid shortId: this.shortid
} }
this.originSocketConnection.socket.emit("function",requestData); this.originSocketConnection.socket.emit("function", requestData);
return this.done.promise; return this.done.promise;
}; };
/** /**
* handles the response that is received by the requesting side * handles the response that is received by the requesting side
*/ */
private _handleResponse(responseDataArg:ISocketRequestDataObject){ handleResponse(responseDataArg: ISocketRequestDataObject) {
this.done.resolve(responseDataArg); this.done.resolve(responseDataArg);
} }
@ -80,7 +76,15 @@ export class SocketRequest {
/** /**
* creates the response on the responding side * creates the response on the responding side
*/ */
createResponse(){ createResponse() {
let targetSocketFunction: SocketFunction = helpers.getSocketFunctionByName(this.funcCallData.funcName);
targetSocketFunction.invoke(this.funcCallData)
.then((resultData) => {
let requestData: ISocketRequestDataObject = {
funcCallData: resultData,
shortId: this.shortid
}
this.originSocketConnection.socket.emit("functionResponse",requestData);
});
} }
}; };

View File

@ -4,18 +4,27 @@ import * as plugins from "./smartsocket.plugins";
import { Smartsocket } from "./smartsocket.classes.smartsocket"; import { Smartsocket } from "./smartsocket.classes.smartsocket";
import { SocketFunction, allSocketFunctions } from "./smartsocket.classes.socketfunction"; import { SocketFunction, allSocketFunctions } from "./smartsocket.classes.socketfunction";
import { SocketConnection } from "./smartsocket.classes.socketconnection"; import { SocketConnection } from "./smartsocket.classes.socketconnection";
import { SocketRequest, allSocketRequests, TSocketRequestSide } from "./smartsocket.classes.socketrequest";
import { SocketRole, allSocketRoles } from "./smartsocket.classes.socketrole"; import { SocketRole, allSocketRoles } from "./smartsocket.classes.socketrole";
// SocketFunction helpers // SocketFunction helpers
export let getSocketFunctionByName = (functionNameArg:string) => { export let getSocketFunctionByName = (functionNameArg: string):SocketFunction => {
return allSocketFunctions.find((socketFunctionArg) => { return socketFunctionArg.name === functionNameArg}); return allSocketFunctions.find((socketFunctionArg) => { return socketFunctionArg.name === functionNameArg });
} }
// SocketRequest helpers
/**
* get corresponding Socketrequest instance by shortId
*/
export let getSocketRequestById = (shortIdArg:string,requestSide?:TSocketRequestSide):SocketRequest => {
return allSocketRequests.find((socketRequestArg) => {return socketRequestArg.shortid === shortIdArg})
}
// SocketRole helpers // SocketRole helpers
/** /**
* get corresponding SocketRequest instance by name * get corresponding SocketRole instance by name
*/ */
export let getSocketRoleByName = (socketRoleNameArg: string): SocketRole => { export let getSocketRoleByName = (socketRoleNameArg: string): SocketRole => {
return allSocketRoles.find((socketRoleArg) => { return socketRoleArg.name === socketRoleNameArg }) return allSocketRoles.find((socketRoleArg) => { return socketRoleArg.name === socketRoleNameArg })