UNPKG

softchatjs-core

Version:
2 lines 28.7 kB
"use strict";var $=Object.create;var v=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var z=(s,e)=>{for(var t in e)v(s,t,{get:e[t],enumerable:!0})},D=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of K(e))!q.call(s,o)&&o!==t&&v(s,o,{get:()=>e[o],enumerable:!(n=J(e,o))||n.enumerable});return s};var M=(s,e,t)=>(t=s!=null?$(Y(s)):{},D(e||!s||!s.__esModule?v(t,"default",{value:s,enumerable:!0}):t,s)),Q=s=>D(v({},"__esModule",{value:!0}),s);var oe={};z(oe,{connectionStates:()=>u,default:()=>N});module.exports=Q(oe);var Z=M(require("moment"));function X(s,e=0){let t=BigInt(e),n=BigInt(e),o=BigInt("0x87c37b91114253d5"),i=BigInt("0x4cf5ad432745937f"),a=s.length,c=a&15,r=a-c;for(let h=0;h<r;h+=16){let E=BigInt(s.charCodeAt(h))|BigInt(s.charCodeAt(h+1))<<BigInt(8)|BigInt(s.charCodeAt(h+2))<<BigInt(16)|BigInt(s.charCodeAt(h+3))<<BigInt(24)|BigInt(s.charCodeAt(h+4))<<BigInt(32)|BigInt(s.charCodeAt(h+5))<<BigInt(40)|BigInt(s.charCodeAt(h+6))<<BigInt(48)|BigInt(s.charCodeAt(h+7))<<BigInt(56),p=BigInt(s.charCodeAt(h+8))|BigInt(s.charCodeAt(h+9))<<BigInt(8)|BigInt(s.charCodeAt(h+10))<<BigInt(16)|BigInt(s.charCodeAt(h+11))<<BigInt(24)|BigInt(s.charCodeAt(h+12))<<BigInt(32)|BigInt(s.charCodeAt(h+13))<<BigInt(40)|BigInt(s.charCodeAt(h+14))<<BigInt(48)|BigInt(s.charCodeAt(h+15))<<BigInt(56);E=E*o,E=E<<BigInt(31)|E>>BigInt(33),E=E*i,t^=E,t=t<<BigInt(27)|t>>BigInt(37),t=t+n,t=t*BigInt(5)+BigInt("0x52dce729"),p=p*i,p=p<<BigInt(33)|p>>BigInt(31),p=p*o,n^=p,n=n<<BigInt(31)|n>>BigInt(33),n=t+n,n=n*BigInt(5)+BigInt("0x38495ab5")}let d=BigInt(0),g=BigInt(0);switch(c){case 15:g^=BigInt(s.charCodeAt(r+14))<<BigInt(48);case 14:g^=BigInt(s.charCodeAt(r+13))<<BigInt(40);case 13:g^=BigInt(s.charCodeAt(r+12))<<BigInt(32);case 12:g^=BigInt(s.charCodeAt(r+11))<<BigInt(24);case 11:g^=BigInt(s.charCodeAt(r+10))<<BigInt(16);case 10:g^=BigInt(s.charCodeAt(r+9))<<BigInt(8);case 9:g^=BigInt(s.charCodeAt(r+8)),g=g*i,g=g<<BigInt(33)|g>>BigInt(31),g=g*o,n^=g;case 8:d^=BigInt(s.charCodeAt(r+7))<<BigInt(56);case 7:d^=BigInt(s.charCodeAt(r+6))<<BigInt(48);case 6:d^=BigInt(s.charCodeAt(r+5))<<BigInt(40);case 5:d^=BigInt(s.charCodeAt(r+4))<<BigInt(32);case 4:d^=BigInt(s.charCodeAt(r+3))<<BigInt(24);case 3:d^=BigInt(s.charCodeAt(r+2))<<BigInt(16);case 2:d^=BigInt(s.charCodeAt(r+1))<<BigInt(8);case 1:d^=BigInt(s.charCodeAt(r)),d=d*o,d=d<<BigInt(31)|d>>BigInt(33),d=d*i,t^=d}return t^=BigInt(a),n^=BigInt(a),t+=n,n+=t,t^=t>>BigInt(33),t=t*BigInt("0xff51afd7ed558ccd"),t^=t>>BigInt(33),t=t*BigInt("0xc4ceb9fe1a85ec53"),t^=t>>BigInt(33),n^=n>>BigInt(33),n=n*BigInt("0xff51afd7ed558ccd"),n^=n>>BigInt(33),n=n*BigInt("0xc4ceb9fe1a85ec53"),n^=n>>BigInt(33),t+=n,n+=t,(t&BigInt("0xFFFFFFFFFFFFFFFF")).toString(16)}function _(s,e,t){let o=[s,e].sort().join("_");return X(`${t}:${o}`)}var C=()=>{let s="",e="abcdef0123456789";for(let t=0;t<32;t++){let n=Math.floor(Math.random()*e.length),o=e.charAt(n);(t===8||t===12||t===16||t===20)&&(s+="-"),s+=o}return s};var S=()=>({createdAt:new Date,updatedAt:new Date});var R=M(require("axios")),l="https://api.softchatjs.com";var I=async s=>{try{let t=(await(0,R.default)({url:s.endpoint,method:s.method,headers:{"Cache-Control":"no-cache",accessToken:s.token||"","Content-Type":"application/json",...s.headers},data:s.method==="POST"?s.body:void 0,responseType:"json",timeout:3e4})).data;return typeof t=="object"&&t&&"success"in t?t:{...t,success:!1}}catch(e){throw console.log(e,"fetch error"),R.default.isAxiosError(e)&&e.response?new Error(`HTTP error! Status: ${e.response.status}`):new Error("An unknown error occurred.")}};async function B({userId:s,subId:e,projectId:t}){return await I({endpoint:`${l}/auth/session`,body:{userId:s,projectId:t,subId:e},method:"POST"})}async function b(s){return await I({endpoint:`${l}/conversations`,body:{},method:"GET",token:s})}async function G(s,e){return await I({endpoint:`${l}/conversation/${e}`,body:{},method:"GET",token:s})}async function P(s){return await I({endpoint:`${l}/broadcastlists`,body:{},method:"GET",token:s})}async function x(s,e,t){return await I({endpoint:`${l}/messages/${e}${t?"?page="+t:""}`,body:{},method:"GET",token:s})}async function w(s,e,t){return await I({endpoint:`${l}/broadcastlist/messages/${e}${t?"?page="+t:""}`,body:{},method:"GET",token:s})}async function U(s){return await I({endpoint:`${l}/gifs/trending`,body:{},method:"GET",token:s})}async function H(s,e){return await I({endpoint:`${l}/upload`,body:e,method:"POST",token:s})}async function O(s,e){return await I({endpoint:`${l}/presigned-url`,body:e,method:"POST",token:s})}var A=M(require("moment")),j=1e3,T=class s{constructor(e,t){this.rotateAndInsertMessageList=(e,t)=>{var n=[...e];if(e.length>=25){var n=[...e];return n.unshift(),n.push(t),n}return n.push(t),n};this.showTypingIndicator=(e,t)=>{t==="START"?this.connection.emit("started_typing",{conversationId:e}):(this._clearActiveTypingIndicator(e),this.idleTimers[e]=setTimeout(()=>{this.connection.emit("stopped_typing",{conversationId:e})},4e3))};this.connection=e,this.idleTimers={},this.screen="conversations"}static getInstace(e,t){return s.message_client?(t&&(s.message_client.connection.activeConversationId=t),s.message_client):(s.message_client=new s(e,t),s.message_client)}getPublicMethods(){return{getMessages:this.getMessages.bind(this),sendMessage:this.sendMessage.bind(this),editMessage:this.editMessage.bind(this),sendTypingNotification:this.sendTypingNotification.bind(this),reactToMessage:this.reactToMessage.bind(this),uploadAttachment:this.uploadAttachment.bind(this)}}getConversationType(e){try{return this.connection.conversationListMeta[e||this.connection.activeConversationId].conversation.conversationType}catch{return"private-chat"}}_createMessage(e){try{if(e){let o={action:"sendMessage",message:{messageId:e.messageId,from:this.connection.userMeta.uid,to:e.to,conversationType:this.getConversationType(),message:{...e,messageState:3},user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}};if(this.connection.emit("new_message",{message:{...e,reactions:[],messageState:2}}),this.connection.socket&&this.connection.socket?.readyState===WebSocket.OPEN){this.connection.socket.send(JSON.stringify(o)),this.connection.emit("edited_message",{message:{...e,reactions:[],messageState:3}});var t=this.connection.conversationListMeta[e.conversationId],n=this.rotateAndInsertMessageList(t.conversation.messages,{...e,reactions:[],messageState:3});let i=t.unread;this.connection.conversationListMeta[e.conversationId]={conversation:{...t.conversation,messages:n},lastMessage:{...e},unread:i},this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta})}else this.connection.emit("edited_message",{message:{...e,reactions:[],messageState:1}}),this.connection.conversationListMeta[e.conversationId]={conversation:this.connection.conversationListMeta[e.conversationId].conversation,lastMessage:{...e,messageState:1},unread:[]},this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta})}}catch(o){o instanceof Error&&(console.error(o),this.connection.emit("deleted_message",{message:{...e,reactions:[],messageState:1}}))}}editConversationListMetaMessage({isBroadcast:e,updatedMessage:t}){var n=e?this.connection.broadcastListMeta[t.conversationId]:this.connection.conversationListMeta[t.conversationId],o=t.messageId;if(n){var i=n.conversation.messages.find(r=>r.messageId===o);if(i){var a={...i,message:t.textMessage,lastEdited:new Date},c=n.conversation.messages.map(r=>r.messageId===o?a:r);e?(this.connection.broadcastListMeta[t.conversationId]={conversation:{...n.conversation,messages:c},lastMessage:null,unread:[]},this.connection.emit("broadcast_list_meta_changed",{broadcastListMeta:this.connection.broadcastListMeta})):(this.connection.conversationListMeta[t.conversationId]={conversation:{...n.conversation,messages:c},lastMessage:{...a},unread:n.unread},this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta}))}}}_editMessage(e){try{if(e){let t={...e,message:e.textMessage,lastEdited:new Date};if(this.connection.emit("edited_message",{message:t}),this.editConversationListMetaMessage({isBroadcast:!1,updatedMessage:t}),this.editConversationListMetaMessage({isBroadcast:!0,updatedMessage:t}),this.connection.socket){let n={action:"editMessage",message:{...t,token:this.connection.wsAccessConfig.token,isBroadcast:e.isBroadcast,user:this.connection.userMeta}};this.connection.socket.send(JSON.stringify(n))}}}catch(t){console.error(t)}}_updateMessageReactions(e,t,n,o){try{if(this.connection.emit("edited_message",{message:{messageId:t,reactions:n}}),o?.ws){let g={action:"sendMessageReaction",message:{conversationId:e,messageId:t,from:this.connection.userMeta.uid,to:o.to,reactions:n,token:this.connection.wsAccessConfig.token,user:this.connection.userMeta}};this.connection.socket.send(JSON.stringify(g))}var i=this.connection.conversationListMeta[e],a=i?.lastMessage;if(a&&a.messageId===t){var c={...a,reactions:n},r=this.rotateAndInsertMessageList(i.conversation.messages,c),d={conversation:{...i.conversation,messages:r},unread:i.unread,lastMessage:{...c}};this.connection.conversationListMeta[e]=d,this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta})}}catch(g){g instanceof Error}}storeEditedMessage(e){let t=this.connection.conversationMap[e.conversationId];if(t){var n=t.messages.find(o=>o.messageId===e.messageId);if(n){let o={...n,message:e.textMessage,lastEdited:new Date};this.connection.emit("edited_message",{message:o})}}}_sendTypingNotification(e){this.connection.socket&&this.connection.socket.send(JSON.stringify({action:"userTyping",message:{uid:e,conversationId:this.connection.activeConversationId,action:"START",conversationType:this.getConversationType(this.connection.activeConversationId),user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}}))}_sendStoppedTypingNotification(e){this.connection.socket&&this.connection.socket.send(JSON.stringify({action:"userTyping",message:{uid:e,conversationId:this.connection.activeConversationId,action:"STOP",conversationType:this.getConversationType(this.connection.activeConversationId),user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}}))}addMessageToConversation(e,t){try{let n=this.connection.conversationMap[e.conversationId];if(n){let o=[...n.messages,{...e,messageState:t==="chat"?5:3}];this.connection.conversationMap[e.conversationId]={...n,messages:o},this.connection.emit("new_message",{message:{...e,messageState:t==="chat"?5:3}});let i=[...this.connection.conversationListMeta[e.conversationId].unread];e.conversationId!==this.connection.activeConversationId&&i.push(e.messageId);let a={conversation:{...this.connection.conversationListMeta[e.conversationId].conversation,messages:o},lastMessage:{...e},unread:i};this.connection.conversationListMeta[e.conversationId]=a,this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta})}}catch(n){console.error(n)}}sendReadNotification(e){this.connection.socket&&this.connection.socket.send(JSON.stringify({action:"readMessages",message:{...e,user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}}))}_clearActiveTypingIndicator(e,t){clearTimeout(this.idleTimers[e]),delete this.idleTimers[e],t===!0&&this.connection.emit("stopped_typing",{conversationId:e})}_updateConversationListMetaMessages(){}readMessages(e,t){if(this.connection.socket){let n={action:"readMessages",message:{...t,user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}};this.connection.socket.send(JSON.stringify(n));let o=this.connection.conversationListMeta[e];if(o){let i={...this.connection.conversationListMeta,[e]:{...o,unread:[]}};this.connection.conversationListMeta=i,this.connection.emit("conversation_list_meta_changed",{conversationListMeta:i})}}}clearUserUnreadNotifications(e,t){for(var n=0,o=t.length;n<o;)this.connection.emit("edited_message",{message:{messageId:t[n],messageState:5}}),n++}wsOnError(e){this.connection.emit("connection_changed",{isConnected:!1,connecting:!1,fetchingConversations:!1})}deleteMessageFromConversationMeta(e,t){try{let a=this.connection.conversationListMeta[e];var n=t===a.lastMessage?.messageId;if(a){let c=a.conversation.messages.filter(r=>r.messageId!==t);var o=c[c.length-1],i={...a,conversation:{...a.conversation,messages:c}};n&&(i.lastMessage=o||null),this.connection.conversationListMeta[e]=i,this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta})}else throw new Error(`Conversation with ID ${e} not found.`)}catch(a){a instanceof Error&&console.error(a.message)}}reactToMessage({conversationId:e,messageId:t,reactions:n,to:o}){this.connection&&this._updateMessageReactions(e,t,n,{ws:!0,to:o})}sendMessage(e){if(this.connection){let o=C();var t=S(),n={...this.connection.userMeta,...t};let i={...e,quotedMessageId:e?.quotedMessage?.messageId,from:n.uid,lastEdited:null,messageState:2,messageOwner:n,messageId:o,...t};this._createMessage(i)}}updateBroadcastList(e){try{if(this.connection.socket&&this.connection.socket?.readyState===WebSocket.OPEN){let t={action:"deleteBroadcastList",message:{broadcastListId:e.broadcastListId,participants:e.participants,name:e.name,user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}};this.connection.socket.send(JSON.stringify(t))}else console.error("Failed to send broadcast")}catch(t){t instanceof Error&&console.error(t.message)}}deleteBroadcastList(e){try{if(this.connection.socket&&this.connection.socket?.readyState===WebSocket.OPEN){let t={action:"updateUserBroadcastList",message:{broadcastListId:e.broadcastListId,participants:e.participants,name:e.name,user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}};this.connection.socket.send(JSON.stringify(t)),this.connection.broadcastListMeta[e.broadcastListId]&&(delete this.connection.broadcastListMeta[e.broadcastListId],this.connection.emit("broadcast_list_meta_changed",{broadcastListMeta:this.connection.broadcastListMeta}))}else console.error("Failed to send broadcast")}catch(t){t instanceof Error&&console.error(t.message)}}broadcastMessage({broadcastListId:e,participantsIds:t,newMessage:n}){try{if(this.connection.socket&&this.connection.socket?.readyState===WebSocket.OPEN){let d=C();var o=S(),i={...this.connection.userMeta,...o};let g={...n,quotedMessageId:n?.quotedMessage?.messageId,from:i.uid,lastEdited:null,messageState:3,messageOwner:i,messageId:d,isBroadcast:!0,broadcastListId:e,...o},h={action:"sendMessageToBroadcastList",message:{broadcastListId:e,messageId:d,from:i.uid,to:t,shouldEdit:!1,conversationType:"broadcast-chat",message:g,user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}};var a=this.connection.broadcastListMeta[e],c=[...a.conversation.messages];c.push(g);var r={conversation:{...a.conversation,messages:c},lastMessage:null,unread:[]};this.connection.broadcastListMeta[e]=r,this.connection.socket.send(JSON.stringify(h)),t.map(E=>{let p=_(E,i.uid,this.connection.projectConfig.projectId);this.connection.emit("new_message",{message:{...g,conversationId:p,reactions:[]}});var f=this.connection.conversationListMeta[p];f&&(this.connection.conversationListMeta[p]={conversation:{...f.conversation,messages:[...f.conversation.messages,{...g,conversationId:p,reactions:[]}]},lastMessage:{...g,conversationId:p,reactions:[]},unread:f.unread})}),this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta}),this.connection.emit("new_message",{message:{...g,conversationId:e,reactions:[]}}),this.connection.emit("broadcast_list_meta_changed",{broadcastListMeta:this.connection.broadcastListMeta})}else console.error("Failed to send broadcast")}catch(d){d instanceof Error&&console.error(d.message)}}editMessage(e){this.connection&&this._editMessage({...e,from:this.connection.userMeta.uid})}sendTypingNotification(e){this.connection&&this._sendTypingNotification(e)}sendStoppedTypingNotification(e){this.connection&&this._sendStoppedTypingNotification(e)}deleteMessage(e,t,n){this.connection&&(this.connection.socket.send(JSON.stringify({action:"deleteMessage",message:{messageId:e,to:t,conversationId:n,conversationType:this.getConversationType(),user:this.connection.userMeta,token:this.connection.wsAccessConfig.token}})),this.connection.emit("deleted_message",{message:{conversationId:n,messageId:e}}),this.deleteMessageFromConversationMeta(n,e))}async getMessages(e){if(this.connection)try{let t=await x(this.connection.wsAccessConfig.token,this.connection.activeConversationId,e);return t.success?[...t.data.messages].sort((o,i)=>{let a=(0,A.default)(o.createdAt).valueOf(),c=(0,A.default)(i.createdAt).valueOf();return a-c}):[]}catch(t){return console.error(t),[]}else return[]}async getBroadcastListMessages(e){if(this.connection)try{let t=await w(this.connection.wsAccessConfig.token,this.connection.activeConversationId,e);return t.success?[...t.data.messages].sort((o,i)=>{let a=(0,A.default)(o.createdAt).valueOf(),c=(0,A.default)(i.createdAt).valueOf();return a-c}):[]}catch(t){return console.error(t),[]}else return[]}async getConversation(e){if(this.connection)try{let t=await G(this.connection.wsAccessConfig.token,e);return t.success?t.data.conversation:null}catch{return null}else return null}async getEmojiList(){if(this.connection)try{return(await U(this.connection.wsAccessConfig.token)).data.gifs}catch{return[]}else return[]}async uploadAttachment({base64:e,fileKey:t}){if(this.connection)try{return await H(this.connection.wsAccessConfig?.token,{base64:e,conversationId:this.connection.activeConversationId,key:t})}catch(n){n instanceof Error&&console.error(n.message)}else throw new Error("No connection established")}isReadableStream(e){return e&&typeof e.pipe=="function"}async uploadFile(e,t){try{let n=await O(this.connection.wsAccessConfig?.token,{base64:"",conversationId:this.connection.activeConversationId,key:C(),mediaType:t.mimeType,uid:this.connection.userMeta.uid,ext:t.ext}),o,i=0;if(typeof e=="string")o=await(await fetch(e)).blob(),i=o.size;else if(e instanceof File)o=e,i=e.size;else if(Buffer.isBuffer(e))o=new Blob([e],{type:t.mimeType}),i=e.length;else if(this.isReadableStream(e)){let a=[],c=0;for await(let d of e)a.push(d),c+=d.length;let r=Buffer.concat(a);o=new Blob([r],{type:t.mimeType}),i=c}return await fetch(n.data.uploadUrl,{method:"PUT",body:o,headers:{"Content-Type":t.mimeType}}),{link:n.data.s3Link,success:n.success,fileSize:i}}catch(n){return console.log(n),console.error("Error uploading file: ",n),{link:"",success:!1,fileSize:""}}}async uploadAttachmentV2({base64:e,fileKey:t,mediaType:n,mimeType:o}){if(this.connection)try{let i=await O(this.connection.wsAccessConfig?.token,{base64:e,conversationId:this.connection.activeConversationId,key:C(),mediaType:n,uid:this.connection.userMeta.uid,ext:""}),a=await fetch(i.data.uploadUrl,{method:"PUT",body:{base64:e,fileKey:t,mediaType:n},headers:{"Content-Type":o}});return i}catch(i){i instanceof Error&&console.error(i.message)}else throw new Error("No connection established")}async setActiveConversation(){if(this.connection)this.connection.screen="chat",this.screen="chat";else throw new Error("No connection established")}async unSetActiveConversation(){if(this.connection)this.connection.activeConversationId="",this.connection.screen="conversations",this.screen="conversations";else throw new Error("No connection established")}messageEventHandler(e){try{if(!e)return null;var t=JSON.parse(e.data);let i=t.action;if(this.screen==="chat"&&this.connection.activeConversationId===t?.message?.conversationId){if(i==="incomingMessage"){let{message:a}=JSON.parse(e.data);this._clearActiveTypingIndicator(this.connection.activeConversationId,!0),this.sendReadNotification({uid:a.from,messageIds:[a.messageId]})}if(i==="messagesRead"){let{message:a}=t;this.screen==="chat"&&this.connection.activeConversationId===a.conversationId&&setTimeout(()=>{this.clearUserUnreadNotifications(a.conversationId,a.messageIds)},j)}}switch(i){case"messagesRead":let{message:a}=t;this.connection.conversationMap[a.conversationId]&&this.screen==="chat"&&setTimeout(()=>{this.clearUserUnreadNotifications(a.conversationId,a.messageIds)},j);break;case"incomingMessage":let{message:r}=t;var n=r.message;let d=this.connection.conversationMap[n.conversationId];if(this._clearActiveTypingIndicator(n.conversationId,!0),d)this.addMessageToConversation(n,this.screen);else{let W=r.conversationType==="private-chat"?_(n.from,n.to,this.connection.projectConfig.projectId):r.message.conversationId,m={...n,messageId:C(),messageState:3,createdAt:new Date};var o={participants:[m.from,m.to],conversationId:_(m.from,m.to,this.connection.projectConfig.projectId),messages:[m],admins:[m.from],meta:null,groupMeta:null,conversationType:r.conversationType,participantList:[{id:C(),uid:m.from,connectionId:"--",participantId:m.from,projectId:"--",participantDetails:{...r.senderMeta,...S()},...S()},{id:C(),uid:m.to,connectionId:"--",participantId:m.to,projectId:"--",participantDetails:{...this.connection.userMeta,...S()},...S()}],...S()};let V={conversation:o,lastMessage:m,unread:[]};this.connection.conversationListMeta[W]=V,this.connection.emit("conversation_list_meta_changed",{conversationListMeta:this.connection.conversationListMeta})}break;case"userIsTyping":let{message:g}=t;this.showTypingIndicator(g.conversationId,g.action);break;case"newMessageReaction":let{message:h}=t;this._updateMessageReactions(h.conversationId,h.messageId,h.reactions);break;case"sendMessageError":let{message:E}=t;console.error("Failed to send message, please try again",E);break;case"editedMessage":let{message:p}=t;this._clearActiveTypingIndicator(p.conversationId,!0),this.storeEditedMessage(p);break;case"deletedMessage":let{message:f}=t;this.connection.emit("deleted_message",{message:f}),this.deleteMessageFromConversationMeta(f.conversationId,f.messageId);break;case"acknowledgeHealthCheck":console.info("HEALTH_CHECK: ok!");break;default:console.log("Unknown action recieved")}this.connection.socket.onerror=a=>{this.wsOnError(a)}}catch(i){console.error(i)}}};var y=M(require("isomorphic-ws")),F=M(require("events"));var L=M(require("moment")),se={id:"",uid:"",username:"",firstname:"",lastname:"",profileUrl:"",color:"",custom:{}};var u={NO_CONNECTION:{connecting:!1,isConnected:!1,fetchingConversations:!1},GETTING_CONVERSATIONS:{connecting:!0,isConnected:!1,fetchingConversations:!0},SOCKET_CONNECTING:{connecting:!0,isConnected:!1,fetchingConversations:!1},SOCKET_CONNECTED:{connecting:!1,isConnected:!0,fetchingConversations:!1}},N=class s extends F.default{constructor(e){super(),this.connecting=!1,this.socket=null,this.conversations=[],this.conversationMap={},this.conversationListMeta={},this.broadcastListMeta={},this.wsAccessConfig={url:"",token:""},this.retry_delay_ms=5e3,this.max_retry_count=5,this.health_check_interval=3e4,this.retry_count=0,this.userMeta=se,this.projectConfig={projectId:e.projectId,subId:e.subId},this.activeConversationId="",this.screen="conversations",this.healthCheckRef=void 0,this.shouldReconnect=!0,this.connectionState=u.NO_CONNECTION,this.notificationConfig={type:null,token:null}}static getInstance(e){return s.connection||(s.connection=new s(e)),s.connection}updateConnectionState(e){this.connectionState=e,this.emit("connection_changed",e)}async _getConversations({token:e}){try{if(this.userMeta){this.updateConnectionState(u.GETTING_CONVERSATIONS);let n=await b(e);if(n.success){let o=n.data.conversations.reduce((i,a)=>{var c=this.sortConversationMessages([a]),r=c[0].messages,d=r[r.length-1];return i[a.conversationId]={conversation:c[0],lastMessage:d,unread:this._getUreadMessageIds(this.userMeta.uid,r)},i},{});var t=n.data.conversations.reduce((i,a)=>(i[a.conversationId]=a,i),{});this.conversationMap=t,this.emit("conversation_list_meta_changed",{conversationListMeta:o}),this.conversationListMeta=o,this.conversations=n.data.conversations}else console.error("An error occurred while fetching conversations")}else throw new Error("User not initialized")}catch(n){n instanceof Error&&console.error(n)}finally{}}async _getBroadcastLists({token:e}){try{if(this.userMeta){let t=await P(e);if(t.success){let n=t.data.conversations.reduce((o,i)=>{var a=this.sortConversationMessages([i]),c=a[0].messages,r=c[c.length-1];return o[i.conversationId]={conversation:a[0],lastMessage:r,unread:[]},o},{});this.emit("broadcast_list_meta_changed",{broadcastListMeta:n}),this.broadcastListMeta=n}else console.error("An error occurred while fetching broadcast lists")}else throw new Error("User not initialized")}catch(t){t instanceof Error&&console.error(t)}finally{}}async _initiateConnection(e,t){try{if(this.shouldReconnect=!0,this.userMeta=e,t?.connectionConfig?.reset&&(this.retry_count=0),!this.userMeta?.uid)return null;clearTimeout(this.retryRef),clearTimeout(this.retryRef),t?.notificationConfig&&(this.notificationConfig=t.notificationConfig);let n=await B({userId:this.userMeta.uid,projectId:this.projectConfig.projectId,subId:this.projectConfig.subId});if(n.success){this.wsAccessConfig={url:n.data.wsURI,token:n.data.token},await Promise.all([await this._getConversations({token:n.data.token}),await this._getBroadcastLists({token:n.data.token})]),this.updateConnectionState(u.SOCKET_CONNECTING);let o=JSON.stringify({from:this.userMeta.uid,to:"",action:"initialize",userMeta:{...this.userMeta},newConversation:!0,recipientMeta:{},projectId:this.projectConfig.projectId,notification:this.notificationConfig});if(this.socket&&this.socket.readyState===y.default.OPEN)this.socket.send(o),this.updateConnectionState(u.SOCKET_CONNECTED);else{this.socket&&this.socket.close();let i=new y.default(`wss://${this.wsAccessConfig.url}`);i.onopen=()=>{console.log("socket opened"),this.socket=i,i.send(o),this.setupEventHandlers(),this.connecting=!1,this.updateConnectionState(u.SOCKET_CONNECTED),this.emit("conversation_list_changed",{conversations:this.conversations}),this.retry_count=0}}}else this.updateConnectionState(u.NO_CONNECTION)}catch(n){console.error("Connection error:",n),this.updateConnectionState(u.NO_CONNECTION),console.warn("Connection error. Attempting to reconnect..."),this.retryConnection()}finally{}}sortMesssages(e){var t=e.sort((n,o)=>{let i=new Date(n.createdAt).getTime();return new Date(o.createdAt).getTime()-i});return t}sortConversationMessages(e){return e.map(t=>{let n=[...t.messages].sort((o,i)=>{let a=(0,L.default)(o.createdAt).valueOf(),c=(0,L.default)(i.createdAt).valueOf();return a-c});return{...t,messages:n}})}_getUreadMessageIds(e,t){var n=[];return t.map(o=>{o.messageState===3&&o.from!==e&&n.push(o.messageId)}),n}_wsDisconnect(e){try{if(this.socket){this.shouldReconnect=e?.shouldReconnect??!0;let t=JSON.stringify({action:"clearUserSession",message:{projectId:this.projectConfig.projectId,from:this.userMeta.uid,user:this.userMeta}});this.socket.send(t),this.socket.close(),this.conversationMap={},this.conversationListMeta={},this.broadcastListMeta={},this.updateConnectionState(u.NO_CONNECTION)}}catch(t){t instanceof Error&&console.error(t.message)}}startHealthCheck(){this.socket&&(this.healthCheckRef&&clearInterval(this.healthCheckRef),this.healthCheckRef=setInterval(()=>{if(this.socket?.readyState===y.default.OPEN){let e=JSON.stringify({action:"healthCheck",message:{message:"Hello!",from:this.userMeta.uid,token:this.wsAccessConfig.token,user:this.userMeta}});this.socket.send(e),this.emit("conversation_list_meta_changed",{conversationListMeta:this.conversationListMeta})}},3e4))}retryConnection(){if(this.retry_count>=this.max_retry_count)return console.warn("Connection attempt failed after multiple retries. Please check your network settings or try again.");this.updateConnectionState(u.SOCKET_CONNECTING),this.connectionState.isConnected||(this.retryRef=setTimeout(()=>{this._initiateConnection(this.userMeta),this.retry_count+=1},5e3))}setupEventHandlers(){this.socket&&(this.socket.onmessage=e=>{T.getInstace(this,"").messageEventHandler(e)},this.socket.onerror=e=>{this.shouldReconnect&&(console.error("Socket error. Attempting to reconnect... Event: ",e),this.retryConnection())},this.socket.onclose=()=>{this.shouldReconnect&&(console.warn("Socket closed. Attempting to reconnect..."),this.retryConnection())},this.startHealthCheck())}};0&&(module.exports={connectionStates}); //# sourceMappingURL=Connection.js.map