UNPKG

@ably/chat

Version:

Ably Chat is a set of purpose-built APIs for a host of chat features enabling you to create 1:1, 1:Many, Many:1 and Many:Many chat rooms for any scale. It is designed to meet a wide range of chat use cases, such as livestreams, in-game communication, cust

69 lines (60 loc) 1.96 kB
import * as Ably from 'ably'; import { ChatMessageAction } from './events.js'; import { DefaultMessage, emptyMessageReactions, Message, MessageHeaders, MessageMetadata, Operation, } from './message.js'; interface MessagePayload { data?: { text?: string; metadata?: MessageMetadata; }; clientId?: string; timestamp: number; extras?: { headers?: MessageHeaders; }; serial: string; createdAt: number; version: string; action: Ably.MessageAction; operation?: Ably.Operation; } // Parse a realtime message to a chat message export const parseMessage = (inboundMessage: Ably.InboundMessage): Message => { const message = inboundMessage as MessagePayload; // Provide default values for all fields const data = message.data && typeof message.data === 'object' ? message.data : {}; const extras = message.extras && typeof message.extras === 'object' ? message.extras : {}; const clientId = message.clientId || ''; const text = data.text || ''; const serial = message.serial || ''; const version = message.version || ''; const metadata = data.metadata && typeof data.metadata === 'object' ? data.metadata : {}; const headers = extras.headers || {}; // Use current time as default for missing timestamps const currentTime = Date.now(); const createdAt = new Date(message.createdAt || currentTime); const timestamp = new Date(message.timestamp || currentTime); // Convert the action to a ChatMessageAction enum, defaulting to MessageCreate if the action is not found. const action = Object.values(ChatMessageAction).includes(message.action as ChatMessageAction) ? (message.action as ChatMessageAction) : ChatMessageAction.MessageCreate; return new DefaultMessage({ serial, clientId, text, metadata, headers, action, version, createdAt, timestamp, reactions: emptyMessageReactions(), operation: message.operation as Operation, }); };