import * as plugins from './smartuniverse.plugins.js'; import { UniverseChannel } from './smartuniverse.classes.universechannel.js'; import { UniverseMessage } from './smartuniverse.classes.universemessage.js'; import { ObjectMap } from '@push.rocks/lik'; import { UniverseConnection } from './smartuniverse.classes.universeconnection.js'; import { Universe } from './smartuniverse.classes.universe.js'; /** * universe store handles the creation, storage and retrieval of messages. */ export class UniverseCache { // ======== // INSTANCE // ======== public standardMessageExpiry: number; public destructionTime: number = 10000; /** * stores messages for this instance */ public messageMap = new ObjectMap>(); /** * stores the channels that are available within the universe */ public channelMap = new ObjectMap(); /** * stores all connections */ public connectionMap = new plugins.lik.ObjectMap(); /** * allows messages to be processed in a blacklist mode for further analysis */ public blackListChannel: UniverseChannel; public universeRef: Universe; constructor(universeArg: Universe, standardMessageExpiryArg: number) { this.universeRef = universeArg; this.standardMessageExpiry = standardMessageExpiryArg; this.blackListChannel = new UniverseChannel(this.universeRef, 'blacklist', 'nada'); } /** * add a message to the UniverseCache * @param messageArg * @param attachedPayloadArg */ public async addMessage(messageArg: UniverseMessage) { messageArg.setUniverseCache(this); UniverseChannel.authorizeAMessageForAChannel(this, messageArg); this.messageMap.add(messageArg); messageArg.universeChannelList.forEach((universeChannel) => { universeChannel.push(messageArg); }); } /** * Read a message from the UniverseCache */ public readMessagesYoungerThan( unixTimeArg?: number, channelName?: string ): plugins.smartrx.rxjs.Observable> { const messageObservable = plugins.smartrx.rxjs.from(this.messageMap.getArray()).pipe( plugins.smartrx.rxjs.ops.filter((messageArg) => { return messageArg.smartTimestamp.isYoungerThanMilliSeconds(this.destructionTime); }) ); return messageObservable; } }