Files
smartsocket/ts/smartsocket.classes.socketrequest.ts

124 lines
4.0 KiB
TypeScript
Raw Normal View History

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