import * as plugins from './smartuniverse.plugins'; import { ICombinatorPayload } from './smartuniverse.classes.reactionrequest'; import { UniverseChannel } from './smartuniverse.classes.universechannel'; import { ClientUniverseChannel } from './smartuniverse.classes.clientuniversechannel'; import { UniverseMessage } from './smartuniverse.classes.universemessage'; import { ClientUniverseMessage } from './smartuniverse.classes.clientuniversemessage'; export type TReactionResponseFuncDef = ( dataArg: T['request'] ) => Promise; export interface IReactionResponseConstructorOptions< T extends plugins.typedrequestInterfaces.ITypedRequest > { method: T['method']; channels: Array; funcDef: TReactionResponseFuncDef; } export class ReactionResponse { public method: T['method']; public channels = new plugins.lik.ObjectMap(); public funcDef: TReactionResponseFuncDef; constructor(optionsArg: IReactionResponseConstructorOptions) { this.method = optionsArg.method; this.channels.addArray(optionsArg.channels); this.funcDef = optionsArg.funcDef; for (const channel of this.channels.getArray()) { channel.subscribe((messageArg) => { this.processMessageForReaction(channel, messageArg); }); } } private async processMessageForReaction( channelArg: UniverseChannel | ClientUniverseChannel, messageArg: | UniverseMessage> | ClientUniverseMessage> ) { if ( messageArg.messageText === 'reactionRequest' && messageArg.payload.typedRequestPayload.method === this.method ) { const response: T['response'] = await this.funcDef( messageArg.payload.typedRequestPayload.request ); const payload: ICombinatorPayload = { ...messageArg.payload, typedRequestPayload: { ...messageArg.payload.typedRequestPayload, response, }, }; channelArg.sendMessage({ messageText: 'reactionResponse', payload, }); } } }