smartsocket/ts/smartsocket.classes.socketfunction.ts

108 lines
3.2 KiB
TypeScript
Raw Permalink Normal View History

2018-03-15 01:29:40 +00:00
import * as plugins from './smartsocket.plugins';
2016-08-07 13:37:52 +00:00
// import classes
2018-03-15 01:29:40 +00:00
import { SocketRole } from './smartsocket.classes.socketrole';
2019-05-02 09:46:36 +00:00
import { SocketConnection } from './smartsocket.classes.socketconnection';
2019-08-12 20:31:40 +00:00
import { Smartsocket } from './smartsocket.classes.smartsocket';
import { SmartsocketClient } from './smartsocket.classes.smartsocketclient';
2016-08-07 13:37:52 +00:00
2016-08-09 09:42:21 +00:00
// export interfaces
2016-08-09 16:22:30 +00:00
/**
* interface of the contructor options of class SocketFunction
*/
2020-09-24 18:04:11 +00:00
export interface ISocketFunctionConstructorOptions<
T extends plugins.typedrequestInterfaces.ITypedRequest
> {
2019-09-09 22:21:47 +00:00
funcName: T['method'];
2019-09-09 21:58:32 +00:00
funcDef: TFuncDef<T>;
2018-03-15 01:29:40 +00:00
allowedRoles: SocketRole[]; // all roles that are allowed to execute a SocketFunction
2017-07-07 20:02:19 +00:00
}
2016-08-07 13:37:52 +00:00
2016-08-09 16:22:30 +00:00
/**
2016-08-12 01:22:36 +00:00
* interface of the Socket Function call, in other words the object that routes a call to a function
2016-08-09 16:22:30 +00:00
*/
2020-09-24 18:04:11 +00:00
export interface ISocketFunctionCallDataRequest<
T extends plugins.typedrequestInterfaces.ITypedRequest
> {
2019-09-09 21:58:32 +00:00
funcName: T['method'];
funcDataArg: T['request'];
}
/**
* interface of the Socket Function call, in other words the object that routes a call to a function
*/
2020-09-24 18:04:11 +00:00
export interface ISocketFunctionCallDataResponse<
T extends plugins.typedrequestInterfaces.ITypedRequest
> {
2019-09-09 21:58:32 +00:00
funcName: T['method'];
funcDataArg: T['response'];
2017-07-07 20:02:19 +00:00
}
2016-08-12 03:17:13 +00:00
/**
* interface for function definition of SocketFunction
*/
2020-09-24 18:04:11 +00:00
export type TFuncDef<T extends plugins.typedrequestInterfaces.ITypedRequest> = (
dataArg: T['request'],
connectionArg: SocketConnection
) => PromiseLike<T['response']>;
2016-08-09 16:22:30 +00:00
2016-08-09 09:42:21 +00:00
// export classes
/**
2016-08-09 16:22:30 +00:00
* class that respresents a function that can be transparently called using a SocketConnection
2016-08-09 09:42:21 +00:00
*/
2019-09-09 21:58:32 +00:00
export class SocketFunction<T extends plugins.typedrequestInterfaces.ITypedRequest> {
2019-08-12 20:31:40 +00:00
// STATIC
2019-09-09 21:58:32 +00:00
public static getSocketFunctionByName<Q extends plugins.typedrequestInterfaces.ITypedRequest>(
2019-08-12 20:46:57 +00:00
smartsocketRefArg: Smartsocket | SmartsocketClient,
functionNameArg: string
2019-09-09 21:58:32 +00:00
): SocketFunction<Q> {
2020-09-24 18:04:11 +00:00
return smartsocketRefArg.socketFunctions.find((socketFunctionArg) => {
2019-08-12 20:31:40 +00:00
return socketFunctionArg.name === functionNameArg;
});
}
// INSTANCE
public name: string;
2019-09-09 21:58:32 +00:00
public funcDef: TFuncDef<T>;
2019-08-12 20:31:40 +00:00
public roles: SocketRole[];
2016-08-08 16:20:00 +00:00
2017-07-07 20:02:19 +00:00
/**
* the constructor for SocketFunction
*/
2019-09-09 21:58:32 +00:00
constructor(optionsArg: ISocketFunctionConstructorOptions<T>) {
2018-03-15 01:29:40 +00:00
this.name = optionsArg.funcName;
this.funcDef = optionsArg.funcDef;
this.roles = optionsArg.allowedRoles;
2019-08-12 20:31:40 +00:00
for (const socketRoleArg of this.roles) {
2018-03-15 01:29:40 +00:00
this._notifyRole(socketRoleArg);
2017-07-07 20:02:19 +00:00
}
}
2016-08-08 16:20:00 +00:00
2017-07-07 20:02:19 +00:00
/**
* invokes the function of this SocketFunction
*/
2020-09-24 18:04:11 +00:00
public async invoke(
dataArg: ISocketFunctionCallDataRequest<T>,
socketConnectionArg: SocketConnection
): Promise<ISocketFunctionCallDataResponse<T>> {
2017-07-07 20:02:19 +00:00
if (dataArg.funcName === this.name) {
2019-09-09 21:58:32 +00:00
const funcResponseData: ISocketFunctionCallDataResponse<T> = {
funcName: this.name,
2020-09-24 18:04:11 +00:00
funcDataArg: await this.funcDef(dataArg.funcDataArg, socketConnectionArg),
2019-09-09 21:58:32 +00:00
};
return funcResponseData;
2017-07-07 20:02:19 +00:00
} else {
2018-03-15 01:29:40 +00:00
throw new Error("SocketFunction.name does not match the data argument's .name!");
2016-08-08 16:20:00 +00:00
}
2017-07-07 20:02:19 +00:00
}
2016-08-08 16:20:00 +00:00
2017-07-07 20:02:19 +00:00
/**
* notifies a role about access to this SocketFunction
*/
2018-03-15 01:29:40 +00:00
private _notifyRole(socketRoleArg: SocketRole) {
socketRoleArg.addSocketFunction(this);
2017-07-07 20:02:19 +00:00
}
}