@tencentcloud/lite-chat
Version:
Tencent Cloud Chat SDK for Web/Mini Program/uni-app
2 lines (1 loc) • 17 kB
JavaScript
!function(e,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s():"function"==typeof define&&define.amd?define(s):(e="undefined"!=typeof globalThis?globalThis:e||self)["TencentCloudChatHistory-message"]=s()}(this,function(){"use strict";const e=new class{init(e){this.core=e}};function s(e,s,t,o){return new(t||(t=Promise))(function(n,a){function r(e){try{c(o.next(e))}catch(e){a(e)}}function i(e){try{c(o.throw(e))}catch(e){a(e)}}function c(e){var s;e.done?n(e.value):(s=e.value,s instanceof t?s:new t(function(e){e(s)})).then(r,i)}c((o=o.apply(e,s||[])).next())})}function t(t){return s(this,void 0,void 0,function*(){var s;const{message:o,user:n,appStore:a,constants:{OuterConstant:r}}=e.core,i=a.conversationStore.getConversationMap();if(i.has(t)){const o=null===(s=i.get(t))||void 0===s?void 0:s.userProfile;if(o&&t.startsWith(r.CONV_C2C)){const{avatar:s,nick:n}=o;e.core.message.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:t,latestAvatar:s,latestNick:n,isSentByMe:!1})}}const{data:c}=(yield n.userProfile.getMyProfile())||{};if(c){const{avatar:e,nick:s}=c;o.messageDataHandler.updateNickAndAvatarOfSentMessage({conversationID:t,latestAvatar:e,latestNick:s,isSentByMe:!0})}})}function o(t){return s(this,void 0,void 0,function*(){const o=t.map(e=>e.revoker);try{const n=yield function(t){return s(this,void 0,void 0,function*(){var s,o;const n=yield null===(s=e.core.user.userProfile)||void 0===s?void 0:s.getUserProfile({userIDList:t});return(null==n?void 0:n.data)?null===(o=n.data)||void 0===o?void 0:o.reduce((e,{userID:s,nick:t,avatar:o})=>(e[s]={nick:t||"",avatar:o||""},e),{}):null})}(o);n&&t.forEach(e=>{const{revoker:s}=e;n[s]&&(e.revokerInfo.nick=n[s].nick||"",e.revokerInfo.avatar=n[s].avatar||"",e.revokerInfo.userID=s)})}catch(e){console.debug(e)}})}"function"==typeof SuppressedError&&SuppressedError;const n=1,a=2,r=20,i=2500,c=1,l=300;function g(t){return s(this,void 0,void 0,function*(){var o,n;const{appStore:a,utils:{isEmpty:r},common:{getCurrentUserID:i},notificationCenter:c,OuterEvent:l,OuterConstant:{CONV_C2C:g}}=e.core,{messageList:u,conversationID:d}=t,v=a.conversationStore.getConversationMap();let m=null===(o=v.get(d))||void 0===o?void 0:o.peerReadTime;if(!m){const t=d.replace(g,""),o=yield function(t){return s(this,void 0,void 0,function*(){const s={To_Account:t};return e.core.common.buildAndSendPacket({servcmd:"openim.get_peer_read_time",data:s})})}([t]);if(o){const{ReadTime:e}=o;m=null==e?void 0:e[0],v.has(d)&&(v.get(d).peerReadTime=m)}}if(v.has(d)){const e=null===(n=v.get(d))||void 0===n?void 0:n.lastMessage;r(e)||e.fromAccount===i()&&e.lastTime<=m&&!e.isPeerRead&&(e.isPeerRead=!0,a.conversationStore.updateConversation(d,{lastMessage:e}))}const h=[];u.forEach(e=>{e.time<=m&&!e.isPeerRead&&"out"===e.flow&&(e.isPeerRead=!0,h.push(e))}),h.length>0&&c.emitOuterEvent(l.MESSAGE_READ_BY_PEER,{name:l.MESSAGE_READ_BY_PEER,data:h})})}var u=new class{init(e){this._core=e,e.helper.registerApi({apiName:"getMessageList",context:this}),e.helper.registerApi({apiName:"getMessageListHopping",context:this}),e.helper.registerApi({apiName:"clearHistoryMessage",context:this})}getMessageList(n){return s(this,void 0,void 0,function*(){try{const{message:s,OuterConstant:{Direction:a,CONV_C2C:i,CONV_GROUP:c},InnerEvent:{HISTORY_MESSAGE_FETCHED:l},notificationCenter:u}=this._core,{conversationID:d,nextReqMessageID:v}=n,m=r;if("@TIM#SYSTEM"===d)return{code:0,data:{messageList:[],isCompleted:!1,nextMessageSeq:""}};const h=this._getAvailableLocalMessagesCount({conversationID:d,nextReqMessageID:v});if(this._needFetchHistoryMessageList({conversationID:d,availableLocalMessagesCount:h,targetCount:m})){let n=null;if(d.startsWith(c)?n=yield s.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:d,sequence:Number(v),count:m,direction:a.FORWARD,shouldMarkCompleted:!0}):d.startsWith(i)&&(n=yield s.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:d,messageID:v,count:m,direction:a.FORWARD,shouldMarkCompleted:!0})),n){const{nextReqMessageIDFromServer:a,hasNoMoreHistoryMessage:r,messageList:c}=n,m=s.messageDataHandler.prependLocalMessageList({messageList:c,conversationID:d});!function(s){const{appStore:t,message:o,OuterConstant:n}=e.core,a=t.conversationStore.getConversation(s),r=o.messageDataHandler.getLocalMessageList(s);if(!a||0===r.length||s===n.CONV_SYSTEM)return;const i=[];for(let e=0;e<r.length;e++)"in"!==r[e].flow?"out"!==r[e].flow||r[e].isRead||r[e].setIsRead(!0):i.push(r[e]);let c=0;if(a.type===n.CONV_C2C){const e=i.slice(-a.unreadCount).filter(e=>e.isRevoked).length;c=i.length-a.unreadCount-e}else c=i.length-a.unreadCount;for(let e=0;e<c&&!i[e].isRead;e++)i[e].setIsRead(!0)}(d),yield t(d),d.startsWith(i)&&(yield g({messageList:c,conversationID:d}));const M=this._core.message.messageDataHandler.getLocalMessageList(d).slice(0,m.length+h),p=M.filter(e=>e.isRevoked);yield o(p),u.emitInnerEvent(l,m);const C={nextReqMessageID:r?"":String(a),messageList:M,isCompleted:r},f=M.map(e=>e.sequence);return{code:0,data:C,successLog:{message:`conversationID: ${d} nextReqMessageID: ${v} availableLocalMessagesCount: ${h} sequenceList: ${JSON.stringify(f)}`}}}return{code:0,data:{messageList:[],isCompleted:!1,nextReqMessageID:""}}}return{code:0,data:yield this._getMessageListFromMemory({conversationID:d,nextReqMessageID:v,count:m}),successLog:{message:`conversationID: ${d} nextReqMessageID: ${v} availableLocalMessagesCount: ${h}}`}}}catch(e){throw new this._core.helper.ChatError({code:null==e?void 0:e.code})}})}getMessageListHopping(e){return s(this,void 0,void 0,function*(){var s,t;const{OuterConstant:{Direction:o,CONV_C2C:n,CONV_GROUP:a}}=this._core,{conversationID:i,sequence:c,time:l,direction:u=o.FORWARD}=e,{utils:{isEmpty:d},message:v,notificationCenter:m,InnerEvent:{HISTORY_MESSAGE_FETCHED:h}}=this._core;if(![o.BACKWARD,o.FORWARD].includes(u))throw new this._core.helper.ChatError({message:"direction must be 0 or 1"});let{count:M=r}=e;M=M>r?r:M;let p=null;if(i.startsWith(a)){if(p=yield v.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:i,sequence:c,count:M,direction:u}),p){const{nextReqMessageIDFromServer:e,hasNoMoreHistoryMessage:n,messageList:a,invisibleSequenceList:r}=p;if(this._core.message.messageDataHandler.storeSparseMessageList(a),m.emitInnerEvent(h,a),u===o.FORWARD){const s=n&&e<1;return{code:0,data:{messageList:a,isCompleted:s,nextMessageSeq:s?"":e}}}if(u===o.BACKWARD){if(d(a)&&d(r))return{code:0,data:{messageList:[],isCompleted:!0,nextMessageSeq:""}};const e=(null===(s=null==a?void 0:a[a.length-1])||void 0===s?void 0:s.sequence)||0,o=(null===(t=null==r?void 0:r[r.length-1])||void 0===t?void 0:t.sequence)||0;return{code:0,data:{messageList:a.filter(e=>e.sequence>=c),isCompleted:!n,nextMessageSeq:n?Math.max(e,o)+1:""}}}return{code:0,data:p}}}else if(i.startsWith(n)&&(p=yield v.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:i,count:M+1,time:l,direction:u}),p)){const{messageList:e,lastMessageTime:s,hasNoMoreHistoryMessage:t}=p;return m.emitInnerEvent(h,e),t||(u===o.FORWARD?e.shift():e.pop()),v.messageDataHandler.storeSparseMessageList(e),yield g({messageList:e,conversationID:i}),{code:0,data:{messageList:e,isCompleted:t,nextMessageTime:t?"":s}}}})}clearHistoryMessage(t){return s(this,void 0,void 0,function*(){var o;const{appStore:r,common:{ChatError:c,getCurrentUserID:l},OuterConstant:{CONV_C2C:g,CONV_GROUP:u},apiMap:d,message:v}=this._core,m=r.conversationStore.getConversation(t);if(!m)throw new c({code:i});const h={fromAccount:l()},{type:M}=m;M===g?(h.type=n,h.toAccount=t.replace(g,"")):M===u&&(h.type=a,h.toGroupID=t.replace(u,""));try{yield null===(o=null==d?void 0:d.setMessageRead)||void 0===o?void 0:o.call(d,{conversationID:t});const n=yield function(t){return s(this,void 0,void 0,function*(){const{fromAccount:s,type:o,toAccount:n,toGroupID:a}=t,r={From_Account:s,Type:o,To_Account:n,ToGroupid:a};return e.core.common.buildAndSendPacket({servcmd:"recentcontact.clear_msg",data:r})})}(h);return n&&(v.messageDataHandler.deleteConversationMessageList(t),v.messageHistory.completedHistoryConversations.delete(t),v.messageHistory.clearHistoryMessageListFetchAnchors(t),this._updateConversationLastMessage(t)),{code:0,data:{conversationID:t},successLog:{message:`convID:${t}`}}}catch(e){const{errorCode:s}=e;throw new this._core.helper.ChatError({functionName:"clearHistoryMessage",code:s,moreMessage:`convID:${t}`})}})}_updateConversationLastMessage(e){const{appStore:s}=this._core;s.conversationStore.updateConversation(e,{lastMessage:this._generateLastMessage()},{needSort:!0})}_getAvailableLocalMessagesCount({conversationID:e,nextReqMessageID:s}){const{OuterConstant:{CONV_C2C:t,CONV_GROUP:o}}=this._core,n=this._core.message.messageDataHandler.getLocalMessageList(e),{length:a}=n;if(!s)return a;let r=-1;return(null==e?void 0:e.startsWith(t))?r=n.findIndex(e=>e.ID===s):(null==e?void 0:e.startsWith(o))&&(r=n.findIndex(e=>s.includes("-")?e.ID===s:String(e.sequence)===s)),-1===r?0:r}_needFetchHistoryMessageList({conversationID:e,availableLocalMessagesCount:s,targetCount:t}){const{message:o}=this._core;return s<t&&!o.messageHistory.completedHistoryConversations.has(e)}_getMessageListFromMemory(e){return s(this,arguments,void 0,function*({conversationID:e,nextReqMessageID:s,count:o}){const{OuterConstant:{CONV_C2C:n},message:a}=this._core,r=this._core.message.messageDataHandler.getLocalMessageList(e),i=r.length;let c=i,l={isCompleted:!1,nextReqMessageID:"",messageList:[]},u=0,d=i;return s?s&&(d=r.findIndex(t=>e.startsWith(n)?t.ID===s:String(t.sequence)===s),u=d>o?d-o:0,c=d):u=i>o?i-o:0,l.messageList=r.slice(u,d),l.isCompleted=c<=o&&a.messageHistory.completedHistoryConversations.has(e),l.isCompleted?l.nextReqMessageID="":l.nextReqMessageID=this._generateNextReqMessageID({conversationID:e,targetIndex:u}),e.startsWith(n)&&(yield t(e),yield g({messageList:l.messageList,conversationID:e})),l})}_generateNextReqMessageID({conversationID:e,targetIndex:s}){const t=this._core.message.messageDataHandler.getLocalMessageList(e);return e.startsWith("C2C")?t[s].ID:String(t[s].sequence)}_generateLastMessage(){return{lastTime:0,lastSequence:0,fromAccount:"",messageForShow:"",payload:null,type:"",isRevoked:!1,cloudCustomData:"",onlineOnlyFlag:!1,nick:"",nameCard:"",version:0,isPeerRead:!1,revoker:null}}};var d=new class{constructor(){this._lastMessageSequenceMapOnDisconnect=new Map,this._lastMessageTimeMapOnDisconnect=new Map}init(e){this._core=e;const{common:{workflowManager:s},constants:{WORKFLOW_NAME:t,WORKFLOW_STEP:o,InnerEvent:n}}=e;s.registerWorkflowStep(t.SYNC_SERVER_INFO_AFTER_RE_ONLINE,o.HISTORY_MESSAGE_RECOVER,this._syncGroupOfflineMessage,this),s.registerWorkflowStep(t.SYNC_SERVER_INFO_AFTER_RE_ONLINE,o.C2C_HISTORY_MESSAGE_RECOVER,this._syncC2COfflineMessage,this),e.notificationCenter.subscribeInnerEvent(n.SOCKET_DISCONNECTED,this._updateLastMessageSequenceMapOnDisconnect,this)}_syncGroupOfflineMessage(e){const{conversationList:s}=(null==e?void 0:e.result)||{},{OuterConstant:t,utils:{isArray:o}}=this._core;if(o(s)){const e=s.filter(e=>e.type===t.CONV_GROUP&&e.groupProfile.type!==t.GRP_AVCHATROOM);return this._recoverGroupHistoryMessage(e)}}_recoverGroupHistoryMessage(e){return s(this,void 0,void 0,function*(){const{OuterConstant:t}=this._core,o=[],n=[];return yield Promise.all(null==e?void 0:e.map(e=>s(this,void 0,void 0,function*(){const{groupProfile:{groupID:s}={},lastMessage:{lastSequence:a}={}}=e,r=`${t.CONV_GROUP}${s}`;let i=this._getLocalLastMessageSequence(r);this._shouldRecoverHistory({localLastMessageSequence:i,serverLastMessageSequence:a})&&(yield this._recoverGroupHistoryForConversation({conversationID:r,localLastMessageSequence:i,serverLastMessageSequence:a,groupTipList:n})),o.push(r.replace(t.CONV_GROUP,""))}))),{recoverRevokeNoticeGroupIDList:o,groupTipList:n}})}_recoverGroupHistoryForConversation(e){return s(this,arguments,void 0,function*({conversationID:e,localLastMessageSequence:s,serverLastMessageSequence:t,groupTipList:o}){try{const{utils:{isArray:n,isObject:a,isEmpty:r},OuterEvent:i,OuterConstant:c,notificationCenter:l,message:g,appStore:u,common:{getMessagePreviewText:d}}=this._core,v=t-s,m=Math.min(20,v),h={},M=yield g.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:e,sequence:s+m,direction:c.Direction.FORWARD,count:m}),{nextReqMessageIDFromServer:p,hasNoMoreHistoryMessage:C,messageList:f,serverGroupTipList:_}=M;n(_)&&o.push(..._);const y=C&&p<0,D=[];if(n(f)&&(f.forEach(e=>{g.messageReceiver.groupMessageReceiver.updateMessageProfile(e),e.from===c.CONV_SYSTEM&&(e.isSystemMessage=!1);g.messageDataHandler.storeConversationMessage(e)&&!r(e.payload)&&(D.push(e),e._isExcludedFromLastMessage||(h.lastMessage=Object.assign({},e)))}),D.length>0&&l.emitOuterEvent(i.MESSAGE_RECEIVED,{name:i.MESSAGE_RECEIVED,data:D})),!y&&f.length>0){const s=f[f.length-1].sequence;yield this._recoverGroupHistoryForConversation({conversationID:e,localLastMessageSequence:s,serverLastMessageSequence:t,groupTipList:o})}a(h.lastMessage)&&(h.lastMessage.messageForShow=d(h.lastMessage.type,h.lastMessage.payload),u.conversationStore.updateConversation(e,h))}catch(s){this._core.ssoLog.error("_recoverGroupHistoryForConversation",`Recovery failed for conversation:${e}`,{error:s})}})}_updateLastMessageSequenceMapOnDisconnect(){const{message:e}=this._core,s=e.messageDataHandler.getContinuousMessagesByConversation();for(const[e,t]of s){const s=Array.from(t.values());if((null==s?void 0:s.length)>0){const t=s[s.length-1];e.startsWith("C2C")?this._lastMessageTimeMapOnDisconnect.set(e,t.time):e.startsWith("GROUP")&&this._lastMessageSequenceMapOnDisconnect.set(e,t.sequence)}}}_getLocalLastMessageSequence(e){const{message:s}=this._core;if(this._lastMessageSequenceMapOnDisconnect.has(e))return this._lastMessageSequenceMapOnDisconnect.get(e);const t=s.messageDataHandler.getLocalMessageList(e),o=t[t.length-1];return null==o?void 0:o.sequence}_shouldRecoverHistory(e){const{localLastMessageSequence:s,serverLastMessageSequence:t}=e;if("number"!=typeof s||"number"!=typeof t)return!1;const o=t-s;return 0!==t&&s>0&&(o>=c&&o<l)}_syncC2COfflineMessage(e){const{conversationList:s}=(null==e?void 0:e.result)||{},{OuterConstant:t,utils:{isArray:o}}=this._core;if(o(s)){const e=[];return s.forEach(s=>{s.type===t.CONV_C2C&&e.push(s)}),this._recoverC2CHistoryMessage(e)}}_recoverC2CHistoryMessage(e){return s(this,void 0,void 0,function*(){yield Promise.all(null==e?void 0:e.map(e=>s(this,void 0,void 0,function*(){const{conversationID:s,lastMessage:{lastTime:t}={}}=e,o=this._getLocalLastMessageTime(s);this._shouldRecoverC2CHistory({localLastMessageTime:o,serverLastMessageTime:t})&&(yield this._recoverHistoryForC2CConversation({conversationID:s,localLastMessageTime:o,serverLastMessageTime:t}))})))})}_shouldRecoverC2CHistory(e){const{localLastMessageTime:s,serverLastMessageTime:t}=e,o=t-s;return s>0&&o>=1&&o<=600}_recoverHistoryForC2CConversation(e){return s(this,void 0,void 0,function*(){var s;const{conversationID:t,localLastMessageTime:o,serverLastMessageTime:n}=e,{utils:{isArray:a,isObject:r,isEmpty:i,safeStringify:c},OuterEvent:l,OuterConstant:g,notificationCenter:u,message:d,appStore:v,common:{getMessagePreviewText:m}}=this._core;try{const e={},c=yield d.messageHistory.getC2CRoamingMessagesByAnchor({conversationID:t,direction:g.Direction.BACKWARD,time:o,count:20});if(i(c))return;const{hasNoMoreHistoryMessage:h,messageList:M}=c,p=[];a(M)&&(M.forEach(s=>{d.messageDataHandler.storeConversationMessage(s)&&!i(s.payload)&&(p.push(s),s._isExcludedFromLastMessage||(e.lastMessage=Object.assign({},s)))}),p.length>0&&u.emitOuterEvent(l.MESSAGE_RECEIVED,{name:l.MESSAGE_RECEIVED,data:p}));const C=null===(s=M[M.length-1])||void 0===s?void 0:s.time;!h&&C>n&&(yield this._recoverHistoryForC2CConversation({conversationID:t,localLastMessageTime:C,serverLastMessageTime:n})),r(e.lastMessage)&&(e.lastMessage.messageForShow=m(e.lastMessage.type,e.lastMessage.payload),v.conversationStore.updateConversation(t,e))}catch(e){this._core.ssoLog.error("_recoverHistoryForC2CConversation",`Recovery failed for conversation:${t} error: ${c(e)}`)}})}_getLocalLastMessageTime(e){const{message:s}=this._core;if(this._lastMessageTimeMapOnDisconnect.has(e))return this._lastMessageTimeMapOnDisconnect.get(e);const t=s.messageDataHandler.getLocalMessageList(e),o=t[t.length-1];return null==o?void 0:o.time}reset(){this._lastMessageSequenceMapOnDisconnect.clear(),this._lastMessageTimeMapOnDisconnect.clear()}dispose(){this.reset()}};return new class{constructor(){this.name="HistoryMessage"}install(s){this._core=s,e.init(s),u.init(s),d.init(s),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.LOGOUT,this._reset,this),s.notificationCenter.subscribeInnerEvent(s.InnerEvent.DESTROY,this.dispose,this)}dispose(){const{notificationCenter:e,InnerEvent:s}=this._core;e.unSubscribeInnerEvent(s.LOGOUT,this._reset,this),e.unSubscribeInnerEvent(s.DESTROY,this.dispose,this),d.dispose()}_reset(){d.reset()}}});