UNPKG

softchatjs-core

Version:
2 lines 21.4 kB
import x from"moment";function b(s,e=0){let t=BigInt(e),n=BigInt(e),o=BigInt("0x87c37b91114253d5"),i=BigInt("0x4cf5ad432745937f"),a=s.length,p=a&15,r=a-p;for(let d=0;d<r;d+=16){let E=BigInt(s.charCodeAt(d))|BigInt(s.charCodeAt(d+1))<<BigInt(8)|BigInt(s.charCodeAt(d+2))<<BigInt(16)|BigInt(s.charCodeAt(d+3))<<BigInt(24)|BigInt(s.charCodeAt(d+4))<<BigInt(32)|BigInt(s.charCodeAt(d+5))<<BigInt(40)|BigInt(s.charCodeAt(d+6))<<BigInt(48)|BigInt(s.charCodeAt(d+7))<<BigInt(56),h=BigInt(s.charCodeAt(d+8))|BigInt(s.charCodeAt(d+9))<<BigInt(8)|BigInt(s.charCodeAt(d+10))<<BigInt(16)|BigInt(s.charCodeAt(d+11))<<BigInt(24)|BigInt(s.charCodeAt(d+12))<<BigInt(32)|BigInt(s.charCodeAt(d+13))<<BigInt(40)|BigInt(s.charCodeAt(d+14))<<BigInt(48)|BigInt(s.charCodeAt(d+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"),h=h*i,h=h<<BigInt(33)|h>>BigInt(31),h=h*o,n^=h,n=n<<BigInt(31)|n>>BigInt(33),n=t+n,n=n*BigInt(5)+BigInt("0x38495ab5")}let c=BigInt(0),g=BigInt(0);switch(p){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:c^=BigInt(s.charCodeAt(r+7))<<BigInt(56);case 7:c^=BigInt(s.charCodeAt(r+6))<<BigInt(48);case 6:c^=BigInt(s.charCodeAt(r+5))<<BigInt(40);case 5:c^=BigInt(s.charCodeAt(r+4))<<BigInt(32);case 4:c^=BigInt(s.charCodeAt(r+3))<<BigInt(24);case 3:c^=BigInt(s.charCodeAt(r+2))<<BigInt(16);case 2:c^=BigInt(s.charCodeAt(r+1))<<BigInt(8);case 1:c^=BigInt(s.charCodeAt(r)),c=c*o,c=c<<BigInt(31)|c>>BigInt(33),c=c*i,t^=c}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 T(s,e,t){let o=[s,e].sort().join("_");return b(`${t}:${o}`)}var u=()=>{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 A=()=>({createdAt:new Date,updatedAt:new Date});import C from"axios";var l="https://api.softchatjs.com";var S=async s=>{try{let t=(await C({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"),C.isAxiosError(e)&&e.response?new Error(`HTTP error! Status: ${e.response.status}`):new Error("An unknown error occurred.")}};async function y(s,e){return await S({endpoint:`${l}/conversation/${e}`,body:{},method:"GET",token:s})}async function _(s,e,t){return await S({endpoint:`${l}/messages/${e}${t?"?page="+t:""}`,body:{},method:"GET",token:s})}async function N(s,e,t){return await S({endpoint:`${l}/broadcastlist/messages/${e}${t?"?page="+t:""}`,body:{},method:"GET",token:s})}async function R(s){return await S({endpoint:`${l}/gifs/trending`,body:{},method:"GET",token:s})}async function L(s,e){return await S({endpoint:`${l}/upload`,body:e,method:"POST",token:s})}async function f(s,e){return await S({endpoint:`${l}/presigned-url`,body:e,method:"POST",token:s})}import M from"moment";var O=1e3,v=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},p=n.conversation.messages.map(r=>r.messageId===o?a:r);e?(this.connection.broadcastListMeta[t.conversationId]={conversation:{...n.conversation,messages:p},lastMessage:null,unread:[]},this.connection.emit("broadcast_list_meta_changed",{broadcastListMeta:this.connection.broadcastListMeta})):(this.connection.conversationListMeta[t.conversationId]={conversation:{...n.conversation,messages:p},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 p={...a,reactions:n},r=this.rotateAndInsertMessageList(i.conversation.messages,p),c={conversation:{...i.conversation,messages:r},unread:i.unread,lastMessage:{...p}};this.connection.conversationListMeta[e]=c,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 p=a.conversation.messages.filter(r=>r.messageId!==t);var o=p[p.length-1],i={...a,conversation:{...a.conversation,messages:p}};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=u();var t=A(),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 c=u();var o=A(),i={...this.connection.userMeta,...o};let g={...n,quotedMessageId:n?.quotedMessage?.messageId,from:i.uid,lastEdited:null,messageState:3,messageOwner:i,messageId:c,isBroadcast:!0,broadcastListId:e,...o},d={action:"sendMessageToBroadcastList",message:{broadcastListId:e,messageId:c,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],p=[...a.conversation.messages];p.push(g);var r={conversation:{...a.conversation,messages:p},lastMessage:null,unread:[]};this.connection.broadcastListMeta[e]=r,this.connection.socket.send(JSON.stringify(d)),t.map(E=>{let h=T(E,i.uid,this.connection.projectConfig.projectId);this.connection.emit("new_message",{message:{...g,conversationId:h,reactions:[]}});var I=this.connection.conversationListMeta[h];I&&(this.connection.conversationListMeta[h]={conversation:{...I.conversation,messages:[...I.conversation.messages,{...g,conversationId:h,reactions:[]}]},lastMessage:{...g,conversationId:h,reactions:[]},unread:I.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(c){c instanceof Error&&console.error(c.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 _(this.connection.wsAccessConfig.token,this.connection.activeConversationId,e);return t.success?[...t.data.messages].sort((o,i)=>{let a=M(o.createdAt).valueOf(),p=M(i.createdAt).valueOf();return a-p}):[]}catch(t){return console.error(t),[]}else return[]}async getBroadcastListMessages(e){if(this.connection)try{let t=await N(this.connection.wsAccessConfig.token,this.connection.activeConversationId,e);return t.success?[...t.data.messages].sort((o,i)=>{let a=M(o.createdAt).valueOf(),p=M(i.createdAt).valueOf();return a-p}):[]}catch(t){return console.error(t),[]}else return[]}async getConversation(e){if(this.connection)try{let t=await y(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 R(this.connection.wsAccessConfig.token)).data.gifs}catch{return[]}else return[]}async uploadAttachment({base64:e,fileKey:t}){if(this.connection)try{return await L(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 f(this.connection.wsAccessConfig?.token,{base64:"",conversationId:this.connection.activeConversationId,key:u(),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=[],p=0;for await(let c of e)a.push(c),p+=c.length;let r=Buffer.concat(a);o=new Blob([r],{type:t.mimeType}),i=p}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 f(this.connection.wsAccessConfig?.token,{base64:e,conversationId:this.connection.activeConversationId,key:u(),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)},O)}}switch(i){case"messagesRead":let{message:a}=t;this.connection.conversationMap[a.conversationId]&&this.screen==="chat"&&setTimeout(()=>{this.clearUserUnreadNotifications(a.conversationId,a.messageIds)},O);break;case"incomingMessage":let{message:r}=t;var n=r.message;let c=this.connection.conversationMap[n.conversationId];if(this._clearActiveTypingIndicator(n.conversationId,!0),c)this.addMessageToConversation(n,this.screen);else{let D=r.conversationType==="private-chat"?T(n.from,n.to,this.connection.projectConfig.projectId):r.message.conversationId,m={...n,messageId:u(),messageState:3,createdAt:new Date};var o={participants:[m.from,m.to],conversationId:T(m.from,m.to,this.connection.projectConfig.projectId),messages:[m],admins:[m.from],meta:null,groupMeta:null,conversationType:r.conversationType,participantList:[{id:u(),uid:m.from,connectionId:"--",participantId:m.from,projectId:"--",participantDetails:{...r.senderMeta,...A()},...A()},{id:u(),uid:m.to,connectionId:"--",participantId:m.to,projectId:"--",participantDetails:{...this.connection.userMeta,...A()},...A()}],...A()};let B={conversation:o,lastMessage:m,unread:[]};this.connection.conversationListMeta[D]=B,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:d}=t;this._updateMessageReactions(d.conversationId,d.messageId,d.reactions);break;case"sendMessageError":let{message:E}=t;console.error("Failed to send message, please try again",E);break;case"editedMessage":let{message:h}=t;this._clearActiveTypingIndicator(h.conversationId,!0),this.storeEditedMessage(h);break;case"deletedMessage":let{message:I}=t;this.connection.emit("deleted_message",{message:I}),this.deleteMessageFromConversationMeta(I.conversationId,I.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)}}};export{v as default}; //# sourceMappingURL=MessageClient.mjs.map