import * as plugins from './smartuniverse.plugins.js'; import { type ICombinatorPayload } from './smartuniverse.classes.event.reactionrequest.js'; import { UniverseChannel } from './smartuniverse.classes.universechannel.js'; import { ClientUniverseChannel } from './smartuniverse.classes.client.universechannel.js'; import { UniverseMessage } from './smartuniverse.classes.universemessage.js'; import { ClientUniverseMessage } from './smartuniverse.classes.client.universemessage.js'; 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.postMessage({ messageText: 'reactionResponse', payload, }); } } }