softchatjs-core
Version:
Javascript client for JS based frameworks
1 lines • 25.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils.ts","../src/Conversation.ts"],"sourcesContent":["import moment from 'moment';\r\n\r\nimport { Conversation, StringOrNumber, Participant, ParticipantListInfo, Message, MessageStates, UserMeta } from \"./types\";\r\n\r\nfunction murmurHash3_x64_64(str: string, seed = 0) {\r\n let h1 = BigInt(seed);\r\n let h2 = BigInt(seed);\r\n const c1 = BigInt(\"0x87c37b91114253d5\");\r\n const c2 = BigInt(\"0x4cf5ad432745937f\");\r\n\r\n let length = str.length;\r\n const remainder = length & 15; // length % 16\r\n const bytes = length - remainder;\r\n\r\n for (let i = 0; i < bytes; i += 16) {\r\n let k1 =\r\n BigInt(str.charCodeAt(i)) |\r\n (BigInt(str.charCodeAt(i + 1)) << BigInt(8)) |\r\n (BigInt(str.charCodeAt(i + 2)) << BigInt(16)) |\r\n (BigInt(str.charCodeAt(i + 3)) << BigInt(24)) |\r\n (BigInt(str.charCodeAt(i + 4)) << BigInt(32)) |\r\n (BigInt(str.charCodeAt(i + 5)) << BigInt(40)) |\r\n (BigInt(str.charCodeAt(i + 6)) << BigInt(48)) |\r\n (BigInt(str.charCodeAt(i + 7)) << BigInt(56));\r\n\r\n let k2 =\r\n BigInt(str.charCodeAt(i + 8)) |\r\n (BigInt(str.charCodeAt(i + 9)) << BigInt(8)) |\r\n (BigInt(str.charCodeAt(i + 10)) << BigInt(16)) |\r\n (BigInt(str.charCodeAt(i + 11)) << BigInt(24)) |\r\n (BigInt(str.charCodeAt(i + 12)) << BigInt(32)) |\r\n (BigInt(str.charCodeAt(i + 13)) << BigInt(40)) |\r\n (BigInt(str.charCodeAt(i + 14)) << BigInt(48)) |\r\n (BigInt(str.charCodeAt(i + 15)) << BigInt(56));\r\n\r\n k1 = k1 * c1;\r\n k1 = (k1 << BigInt(31)) | (k1 >> BigInt(33));\r\n k1 = k1 * c2;\r\n h1 ^= k1;\r\n\r\n h1 = (h1 << BigInt(27)) | (h1 >> BigInt(37));\r\n h1 = h1 + h2;\r\n h1 = h1 * BigInt(5) + BigInt(\"0x52dce729\");\r\n\r\n k2 = k2 * c2;\r\n k2 = (k2 << BigInt(33)) | (k2 >> BigInt(31));\r\n k2 = k2 * c1;\r\n h2 ^= k2;\r\n\r\n h2 = (h2 << BigInt(31)) | (h2 >> BigInt(33));\r\n h2 = h1 + h2;\r\n h2 = h2 * BigInt(5) + BigInt(\"0x38495ab5\");\r\n }\r\n\r\n let k1 = BigInt(0);\r\n let k2 = BigInt(0);\r\n\r\n switch (remainder) {\r\n case 15:\r\n k2 ^= BigInt(str.charCodeAt(bytes + 14)) << BigInt(48);\r\n case 14:\r\n k2 ^= BigInt(str.charCodeAt(bytes + 13)) << BigInt(40);\r\n case 13:\r\n k2 ^= BigInt(str.charCodeAt(bytes + 12)) << BigInt(32);\r\n case 12:\r\n k2 ^= BigInt(str.charCodeAt(bytes + 11)) << BigInt(24);\r\n case 11:\r\n k2 ^= BigInt(str.charCodeAt(bytes + 10)) << BigInt(16);\r\n case 10:\r\n k2 ^= BigInt(str.charCodeAt(bytes + 9)) << BigInt(8);\r\n case 9:\r\n k2 ^= BigInt(str.charCodeAt(bytes + 8));\r\n k2 = k2 * c2;\r\n k2 = (k2 << BigInt(33)) | (k2 >> BigInt(31));\r\n k2 = k2 * c1;\r\n h2 ^= k2;\r\n case 8:\r\n k1 ^= BigInt(str.charCodeAt(bytes + 7)) << BigInt(56);\r\n case 7:\r\n k1 ^= BigInt(str.charCodeAt(bytes + 6)) << BigInt(48);\r\n case 6:\r\n k1 ^= BigInt(str.charCodeAt(bytes + 5)) << BigInt(40);\r\n case 5:\r\n k1 ^= BigInt(str.charCodeAt(bytes + 4)) << BigInt(32);\r\n case 4:\r\n k1 ^= BigInt(str.charCodeAt(bytes + 3)) << BigInt(24);\r\n case 3:\r\n k1 ^= BigInt(str.charCodeAt(bytes + 2)) << BigInt(16);\r\n case 2:\r\n k1 ^= BigInt(str.charCodeAt(bytes + 1)) << BigInt(8);\r\n case 1:\r\n k1 ^= BigInt(str.charCodeAt(bytes));\r\n k1 = k1 * c1;\r\n k1 = (k1 << BigInt(31)) | (k1 >> BigInt(33));\r\n k1 = k1 * c2;\r\n h1 ^= k1;\r\n }\r\n\r\n h1 ^= BigInt(length);\r\n h2 ^= BigInt(length);\r\n\r\n h1 += h2;\r\n h2 += h1;\r\n\r\n h1 ^= h1 >> BigInt(33);\r\n h1 = h1 * BigInt(\"0xff51afd7ed558ccd\");\r\n h1 ^= h1 >> BigInt(33);\r\n h1 = h1 * BigInt(\"0xc4ceb9fe1a85ec53\");\r\n h1 ^= h1 >> BigInt(33);\r\n\r\n h2 ^= h2 >> BigInt(33);\r\n h2 = h2 * BigInt(\"0xff51afd7ed558ccd\");\r\n h2 ^= h2 >> BigInt(33);\r\n h2 = h2 * BigInt(\"0xc4ceb9fe1a85ec53\");\r\n h2 ^= h2 >> BigInt(33);\r\n\r\n h1 += h2;\r\n h2 += h1;\r\n\r\n // Combine h1 and h2 to return a 64-bit hash\r\n return (h1 & BigInt(\"0xFFFFFFFFFFFFFFFF\")).toString(16);\r\n}\r\n\r\n// Updated generateConversationId using MurmurHash3 x64 (64-bit)\r\nexport function generateConversationId(str1: string, str2: string, projectId: string) {\r\n // Sort the strings alphabetically to ensure consistency\r\n const sortedStrings = [str1, str2].sort();\r\n // Concatenate the sorted strings with a delimiter\r\n const combinedString = sortedStrings.join(\"_\");\r\n // Generate a 64-bit hash of the combined string using MurmurHash3 x64\r\n const hash = murmurHash3_x64_64(`${projectId}:${combinedString}`);\r\n // Return the hash as the unique ID\r\n return hash;\r\n}\r\n\r\nexport const generateId = () => {\r\n let uuid = '';\r\n const characters = 'abcdef0123456789';\r\n for (let i = 0; i < 32; i++) {\r\n const randomNumber = Math.floor(Math.random() * characters.length);\r\n const character = characters.charAt(randomNumber);\r\n if (i === 8 || i === 12 || i === 16 || i === 20) {\r\n uuid += '-';\r\n }\r\n uuid += character;\r\n }\r\n return uuid;\r\n}\r\n\r\n\r\nexport const getUserInfoWithId = (userId: string, participantList: ParticipantListInfo[]): {\r\n presentUser: UserMeta | undefined,\r\n receivingUser: UserMeta | undefined,\r\n} => {\r\n let presentUser = participantList.find(participant => participant.participantId === userId);\r\n let otherParticipants = participantList.filter(participant => participant.participantId !== userId)\r\n return { presentUser: presentUser?.participantDetails, receivingUser: otherParticipants[0]?.participantDetails };\r\n};\r\n\r\nexport const truncate = (str: string, len: number) => {\r\n return str.length > len ? str.substring(0, len)+'...' : str;\r\n}\r\n\r\nexport const getConversationTitle = (userId: string, converstaion: Conversation) => {\r\n if(converstaion.conversationType === 'private-chat'){\r\n const userInfos = getUserInfoWithId(userId, converstaion.participantList);\r\n\r\n const firstname = userInfos.receivingUser?.firstname\r\n const username = userInfos.receivingUser?.username\r\n return firstname? firstname : username\r\n }\r\n if(converstaion.conversationType === 'group-chat') {\r\n return converstaion.groupMeta?.groupName || 'no-groupname'\r\n }\r\n}\r\n\r\nexport const getUsernameInitials = (username: string) =>{\r\n return username.substring(0, 1)\r\n}\r\n\r\nexport function formatMessageTime(time: Date | string) {\r\n return moment(new Date(time)).format(\"hh:mm a\");\r\n}\r\n\r\nexport function formatConversationTime(time: Date | string) {\r\n const now = moment();\r\n const then = moment(time);\r\n const duration = moment.duration(now.diff(then));\r\n\r\n // Get the largest unit\r\n const years = Math.floor(duration.asYears());\r\n if (years > 0) return years + 'yr';\r\n\r\n const months = Math.floor(duration.asMonths());\r\n if (months > 0) return months + 'mo';\r\n\r\n const weeks = Math.floor(duration.asWeeks());\r\n if (weeks > 0) return weeks + 'w';\r\n\r\n const days = Math.floor(duration.asDays());\r\n if (days > 0) return days + 'd';\r\n\r\n const hours = Math.floor(duration.asHours());\r\n if (hours > 0) return hours + 'h';\r\n\r\n const minutes = Math.floor(duration.asMinutes());\r\n if (minutes > 0) return minutes + 'm';\r\n\r\n // If duration is less than 1 minute\r\n return 'Just now';\r\n}\r\n\r\nexport const generateFillerTimestamps = () => {\r\n return {\r\n createdAt: new Date(),\r\n updatedAt: new Date(),\r\n }\r\n}\r\n\r\nexport const getUnreadMessageIds = (conversation: Conversation, userId: string) => {\r\n var ids: string[] = []\r\n conversation.messages.map(m => {\r\n if (m.messageState === MessageStates.SENT && m.from !== userId) {\r\n ids.push(m.messageId)\r\n }\r\n })\r\n return ids\r\n}\r\n\r\nexport const getQuotedMessage = (messageId: string, messages: Message[]) => {\r\n const message = messages.find(msg => msg.messageId === messageId)\r\n return message\r\n}\r\n","import Connection from \"./Connection\";\r\nimport { Errors } from \"./error\";\r\nimport { Events } from \"./events\";\r\nimport {\r\n AttachmentTypes,\r\n ConversationListItem,\r\n ConversationType,\r\n GroupChatMeta,\r\n Message,\r\n MessageStates,\r\n Participant,\r\n Prettify,\r\n SendGroupMessageGenerics,\r\n SendMessageGenerics,\r\n ServerActions,\r\n UserMeta,\r\n} from \"./types\";\r\nimport {\r\n generateConversationId,\r\n generateFillerTimestamps,\r\n generateId,\r\n} from \"./utils\";\r\n\r\nlet userMetaSample = {\r\n id: \"\",\r\n username: \"\",\r\n email: \"\",\r\n firstname: \"\",\r\n lastname: \"\",\r\n profileImgUrl: \"\",\r\n phone: \"\",\r\n profileBannerUrl: \"\",\r\n custom: {},\r\n};\r\nexport default class Conversation {\r\n private static conversation: Conversation | null = null;\r\n private connection: Connection;\r\n private participants: UserMeta[];\r\n private otherParticipant: UserMeta | null;\r\n private conversationType: \"group-chat\" | \"private-chat\";\r\n private groupMeta: GroupChatMeta | null;\r\n\r\n constructor(\r\n connection: Connection,\r\n participantDetails: UserMeta[] | UserMeta,\r\n groupMeta: GroupChatMeta | null\r\n ) {\r\n this.connection = connection;\r\n this.participants = [];\r\n this.otherParticipant = null;\r\n this.conversationType = \"private-chat\";\r\n\r\n if (Array.isArray(participantDetails)) {\r\n this.conversationType = \"group-chat\";\r\n this.participants = participantDetails.map((p) => ({\r\n ...userMetaSample,\r\n ...p,\r\n }));\r\n this.groupMeta = groupMeta;\r\n } else {\r\n this.otherParticipant = { ...userMetaSample, ...participantDetails };\r\n this.conversationType = \"private-chat\";\r\n this.groupMeta = null;\r\n }\r\n }\r\n\r\n static getInstance(\r\n connection: Connection,\r\n participantDetails: UserMeta[] | UserMeta,\r\n groupMeta: GroupChatMeta | null\r\n ): Conversation {\r\n if (Conversation.conversation) {\r\n return Conversation.conversation;\r\n }\r\n Conversation.conversation = new Conversation(\r\n connection,\r\n participantDetails,\r\n groupMeta\r\n );\r\n return Conversation.conversation;\r\n }\r\n\r\n private generateConversation(\r\n conversationId: string,\r\n participants: UserMeta[],\r\n message: Message,\r\n conversationType: \"group-chat\" | \"private-chat\"\r\n ) {\r\n const timeStamps = generateFillerTimestamps();\r\n const participantIds = participants.map((p) => p.uid);\r\n const senderObject = {\r\n id: generateId(),\r\n uid: this.connection.userMeta.uid,\r\n participantId: this.connection.userMeta.uid,\r\n participantDetails: {\r\n ...this.connection.userMeta,\r\n ...timeStamps,\r\n },\r\n ...timeStamps,\r\n };\r\n\r\n const updatedParticipantList = participants.map((participant) => ({\r\n id: generateId(),\r\n uid: participant.uid,\r\n participantId: participant.uid,\r\n participantDetails: {\r\n ...participant,\r\n ...timeStamps,\r\n },\r\n ...timeStamps,\r\n }));\r\n\r\n const participantList = [senderObject, ...updatedParticipantList];\r\n\r\n return {\r\n participants: [this.connection.userMeta.uid, ...participantIds],\r\n admins: [this.connection.userMeta.uid],\r\n conversationId,\r\n messages: message.message.length > 0 ? [message] : [],\r\n conversationType,\r\n participantList,\r\n meta: null,\r\n groupMeta: conversationType === \"group-chat\" ? this.groupMeta : null,\r\n ...timeStamps,\r\n };\r\n }\r\n\r\n create(text?: string) {\r\n try {\r\n const messageId = generateId();\r\n const groupConversationId = generateId();\r\n\r\n const fullMessage = {\r\n messageId,\r\n from: this.connection.userMeta.uid,\r\n to: [{}],\r\n conversationType: this.conversationType,\r\n groupMeta: this.groupMeta || {\r\n groupName: \"My group\",\r\n groupIcon: \"https://picsum.photos/200/300\",\r\n groupBanner: \"https://picsum.photos/200/300\",\r\n },\r\n senderMeta: this.connection.userMeta,\r\n participantIds: [] as string[],\r\n message: {\r\n message: text ? text : \"\",\r\n messageId,\r\n messageState: MessageStates.SENT,\r\n conversationId: \"\",\r\n from: this.connection.userMeta.uid,\r\n to: \"\",\r\n attachmentType: AttachmentTypes.NONE,\r\n messageOwner: {\r\n ...this.connection.userMeta,\r\n meta: this.connection.userMeta,\r\n ...generateFillerTimestamps(),\r\n },\r\n attachedMedia: [],\r\n quotedMessageId: \"\",\r\n quotedMessage: null,\r\n reactions: [],\r\n lastEdited: null,\r\n ...generateFillerTimestamps(),\r\n },\r\n token: this.connection.wsAccessConfig.token,\r\n };\r\n\r\n if (this.conversationType === \"group-chat\") {\r\n if (this.participants.length === 0) {\r\n throw new Error(Errors.CONVERSATION_NOT_PREPARED);\r\n }\r\n\r\n const participantIds = this.participants.map((p) => p.uid);\r\n fullMessage.message.conversationId = groupConversationId;\r\n fullMessage.to = this.participants;\r\n fullMessage.participantIds = [\r\n ...participantIds,\r\n this.connection.userMeta.uid,\r\n ];\r\n\r\n this.sendMessage(\r\n fullMessage,\r\n groupConversationId,\r\n this.participants,\r\n \"group-chat\"\r\n );\r\n } else {\r\n if (!this.otherParticipant) {\r\n throw new Error(Errors.CONVERSATION_NOT_PREPARED);\r\n }\r\n\r\n const privateConversationId = generateConversationId(\r\n this.connection.userMeta.uid,\r\n this.otherParticipant.uid,\r\n this.connection.projectConfig.projectId\r\n );\r\n\r\n fullMessage.message.conversationId = privateConversationId;\r\n fullMessage.message.to = this.otherParticipant.uid;\r\n fullMessage.to = [this.otherParticipant];\r\n fullMessage.participantIds = [\r\n this.otherParticipant.uid,\r\n this.connection.userMeta.uid,\r\n ];\r\n\r\n var res = this.sendMessage(\r\n fullMessage,\r\n privateConversationId,\r\n [this.otherParticipant],\r\n \"private-chat\"\r\n );\r\n return res;\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n console.error(error.message);\r\n }\r\n }\r\n }\r\n\r\n private sendMessage(\r\n fullMessage: any,\r\n conversationId: string,\r\n participants: UserMeta[],\r\n type: \"group-chat\" | \"private-chat\"\r\n ) {\r\n try {\r\n const socketMessage = {\r\n action: ServerActions.CREATE_CONVERSATION,\r\n message: fullMessage,\r\n user: this.connection.userMeta,\r\n };\r\n var result: ConversationListItem;\r\n if (this.connection.socket) {\r\n this.connection.socket.send(JSON.stringify(socketMessage));\r\n if (!this.connection.conversationListMeta[conversationId]) {\r\n const conversation = this.generateConversation(\r\n conversationId,\r\n participants,\r\n fullMessage.message,\r\n type\r\n );\r\n\r\n var hasMessage = fullMessage.message.message.length > 0;\r\n\r\n this.connection.conversationListMeta[conversationId] = {\r\n conversation,\r\n lastMessage: hasMessage ? fullMessage.message : null,\r\n unread: [],\r\n };\r\n result = {\r\n conversation,\r\n lastMessage: fullMessage.message,\r\n unread: [],\r\n };\r\n } else {\r\n // check tthis out\r\n const prevConversation =\r\n this.connection.conversationListMeta[conversationId];\r\n var messages = [...prevConversation.conversation.messages];\r\n\r\n // check if the user created the conversation with an initial message.\r\n if (fullMessage.message.message.length > 0) {\r\n messages.unshift(fullMessage.message);\r\n }\r\n var updatedConversationListMeta = {\r\n conversation: { ...prevConversation.conversation, messages },\r\n lastMessage: fullMessage.message,\r\n unread: [],\r\n };\r\n this.connection.conversationListMeta[conversationId] =\r\n updatedConversationListMeta;\r\n result = updatedConversationListMeta;\r\n }\r\n\r\n this.connection.emit(Events.CONVERSATION_LIST_META_CHANGED, {\r\n conversationListMeta: this.connection.conversationListMeta,\r\n });\r\n this.reset();\r\n return result;\r\n }\r\n } catch (error) {\r\n if(error instanceof Error){\r\n console.error(error.message)\r\n }\r\n }\r\n }\r\n\r\n reset() {\r\n Conversation.conversation = null;\r\n }\r\n}\r\n"],"mappings":"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","names":["moment","murmurHash3_x64_64","str","seed","h1","h2","c1","c2","length","remainder","bytes","i","k1","k2","generateConversationId","str1","str2","projectId","combinedString","generateId","uuid","characters","randomNumber","character","generateFillerTimestamps","userMetaSample","_Conversation","connection","participantDetails","groupMeta","p","conversationId","participants","message","conversationType","timeStamps","generateFillerTimestamps","participantIds","senderObject","generateId","updatedParticipantList","participant","participantList","text","messageId","groupConversationId","fullMessage","privateConversationId","generateConversationId","res","error","type","socketMessage","result","prevConversation","messages","updatedConversationListMeta","conversation","hasMessage","Conversation"]}