import {filter, last, lastIndexOf, merge, reject, split} from "lodash"; import {BaseDemultiplexedHttpResource} from "./baseDemultiplexedHttp.resource"; import {ChatMessage} from "../core/entities/message"; import {StreamListener} from "../core/websockets/websocketManager"; import {Observable} from "rxjs"; export class TopicMessageData { } export class TopicMessage { stream: string; content: string; msg_meta: { [key: string]: any }; getContents() { return { content: this.content ? this.content : '', msg_meta: this.msg_meta, }; } } export class TopicData { id: number; name: string; description: string; image: string; topic_meta: { [key: string]: any }; slug: string; } /** * Chats resource, base class for the Chat. */ export abstract class BaseDemultiplexedHttpTopicsResource extends BaseDemultiplexedHttpResource { baseResource = '/topics/'; id: number; slug: string; sessionKey: string; description: string; name: string; messages: TopicMessage[] = []; topic_meta: { [key: string]: any }; messagesObservable: Observable; constructor(data: TopicData) { super(['messages', 'chat']); this.slug = data.slug; this.resourceIdentifier = data.uuid; this.id = data.id; this.name = data.name; this.description = data.description; this.topic_meta = data.topic_meta; this.stream_endpoint = '/topics/'; this.resourceIdentifyingMetadata = { slug: this.slug } } /** * Send a message on this chat * @param {ChatMessage} message */ sendMessage(message: TopicMessage) { this.ensureListeningForMessages(); // Make sure we're listening. let newMessage = merge({ chat: this.data.id }, message.getContents()); this.sendDataOnStream(newMessage, message.stream); } /** * Listen for messages on this chat. Should be idempotent. * @return {Chat} */ ensureListeningForMessages() { this.ensureListeningOnStream('topics', ['create']); return this; }; _findMessagesListener(listener: StreamListener): boolean { return listener.stream === 'topics'; }; }