smartsocket/ts/smartsocket.classes.socketrequest.ts

124 lines
3.9 KiB
TypeScript
Raw Permalink Normal View History

2018-03-15 01:29:40 +00:00
import * as plugins from './smartsocket.plugins';
2016-08-09 09:42:21 +00:00
// import interfaces
2019-08-12 20:31:40 +00:00
import { SocketFunction, ISocketFunctionCall } from './smartsocket.classes.socketfunction';
2016-08-09 09:42:21 +00:00
// import classes
import { Objectmap } from '@pushrocks/lik';
2018-03-15 01:29:40 +00:00
import { SocketConnection } from './smartsocket.classes.socketconnection';
2019-04-26 15:35:15 +00:00
import { defaultLogger } from '@pushrocks/smartlog';
2019-08-12 20:31:40 +00:00
import { Smartsocket } from './smartsocket.classes.smartsocket';
import { SmartsocketClient } from './smartsocket.classes.smartsocketclient';
2016-08-09 09:42:21 +00:00
// export interfaces
2018-03-15 01:29:40 +00:00
export type TSocketRequestStatus = 'new' | 'pending' | 'finished';
export type TSocketRequestSide = 'requesting' | 'responding';
2016-08-09 09:42:21 +00:00
2016-08-09 16:22:30 +00:00
/**
2016-08-09 21:37:25 +00:00
* interface of constructor of class SocketRequest
2016-08-09 16:22:30 +00:00
*/
2016-08-09 09:42:21 +00:00
export interface SocketRequestConstructorOptions {
2018-03-15 01:29:40 +00:00
side: TSocketRequestSide;
originSocketConnection: SocketConnection;
shortId: string;
funcCallData?: ISocketFunctionCall;
2017-07-07 20:02:19 +00:00
}
2016-08-09 09:42:21 +00:00
2016-08-09 21:37:25 +00:00
/**
* request object that is sent initially and may or may not receive a response
*/
export interface ISocketRequestDataObject {
2018-03-15 01:29:40 +00:00
funcCallData: ISocketFunctionCall;
shortId: string;
responseTimeout?: number;
2017-07-07 20:02:19 +00:00
}
2016-08-09 21:37:25 +00:00
2016-08-09 09:42:21 +00:00
// export classes
export class SocketRequest {
2019-08-12 20:31:40 +00:00
// STATIC
public static getSocketRequestById(
smartsocketRef: Smartsocket | SmartsocketClient,
shortIdArg: string
): SocketRequest {
return smartsocketRef.socketRequests.find(socketRequestArg => {
return socketRequestArg.shortid === shortIdArg;
});
}
// INSTANCE
2019-05-02 09:46:36 +00:00
public status: TSocketRequestStatus = 'new';
public side: TSocketRequestSide;
public shortid: string;
public originSocketConnection: SocketConnection;
public funcCallData: ISocketFunctionCall;
public done = plugins.smartpromise.defer();
2019-08-12 20:31:40 +00:00
public smartsocketRef: Smartsocket | SmartsocketClient;
2019-08-12 20:46:57 +00:00
constructor(
smartsocketRefArg: Smartsocket | SmartsocketClient,
optionsArg: SocketRequestConstructorOptions
) {
2019-08-12 20:31:40 +00:00
this.smartsocketRef = smartsocketRefArg;
2018-03-15 01:29:40 +00:00
this.side = optionsArg.side;
this.shortid = optionsArg.shortId;
this.funcCallData = optionsArg.funcCallData;
this.originSocketConnection = optionsArg.originSocketConnection;
2019-08-12 20:31:40 +00:00
this.smartsocketRef.socketRequests.add(this);
2017-07-07 20:02:19 +00:00
}
2016-08-12 03:17:13 +00:00
2017-07-07 20:02:19 +00:00
// requesting --------------------------
2016-08-12 03:17:13 +00:00
2017-07-07 20:02:19 +00:00
/**
* dispatches a socketrequest from the requesting to the receiving side
*/
2019-05-02 09:46:36 +00:00
public dispatch() {
2019-08-12 20:31:40 +00:00
const requestData: ISocketRequestDataObject = {
2017-07-07 20:02:19 +00:00
funcCallData: this.funcCallData,
shortId: this.shortid
2018-03-15 01:29:40 +00:00
};
this.originSocketConnection.socket.emit('function', requestData);
return this.done.promise;
2017-07-07 20:02:19 +00:00
}
2017-07-07 20:02:19 +00:00
/**
* handles the response that is received by the requesting side
*/
2019-05-02 09:46:36 +00:00
public handleResponse(responseDataArg: ISocketRequestDataObject) {
plugins.smartlog.defaultLogger.log('info', 'handling response!');
2018-03-15 01:29:40 +00:00
this.done.resolve(responseDataArg.funcCallData);
2019-08-12 20:31:40 +00:00
this.smartsocketRef.socketRequests.remove(this);
2017-07-07 20:02:19 +00:00
}
2016-08-11 23:32:57 +00:00
2017-07-07 20:02:19 +00:00
// responding --------------------------
/**
* creates the response on the responding side
*/
2019-04-26 15:35:15 +00:00
public async createResponse(): Promise<void> {
2019-08-12 20:31:40 +00:00
const targetSocketFunction: SocketFunction = SocketFunction.getSocketFunctionByName(
this.smartsocketRef,
2018-03-15 01:29:40 +00:00
this.funcCallData.funcName
);
2019-08-12 20:31:40 +00:00
2019-04-26 15:35:15 +00:00
if (!targetSocketFunction) {
2019-05-02 09:46:36 +00:00
defaultLogger.log(
'warn',
`There is no SocketFunction defined for ${this.funcCallData.funcName}`
);
2019-04-26 15:35:15 +00:00
defaultLogger.log('warn', `So now response is being sent.`);
return;
}
plugins.smartlog.defaultLogger.log('info', `invoking ${targetSocketFunction.name}`);
2019-05-02 09:46:36 +00:00
targetSocketFunction.invoke(this.funcCallData, this.originSocketConnection).then(resultData => {
plugins.smartlog.defaultLogger.log('info', 'got resultData. Sending it to requesting party.');
2019-08-12 20:31:40 +00:00
const requestData: ISocketRequestDataObject = {
2018-03-15 01:29:40 +00:00
funcCallData: resultData,
shortId: this.shortid
};
this.originSocketConnection.socket.emit('functionResponse', requestData);
2019-08-12 20:31:40 +00:00
this.smartsocketRef.socketRequests.remove(this);
2018-03-15 01:29:40 +00:00
});
2017-07-07 20:02:19 +00:00
}
}