UNPKG

@tencentcloud/lite-chat

Version:

Tencent Cloud Chat SDK for Web/Mini Program/uni-app/React Native/Donut

2 lines (1 loc) 4.21 kB
!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)["TencentCloudChatOffline-message-synchronizer"]=s()}(this,function(){"use strict";function e(e,s,t,n){return new(t||(t=Promise))(function(o,r){function a(e){try{c(n.next(e))}catch(e){r(e)}}function i(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var s;e.done?o(e.value):(s=e.value,s instanceof t?s:new t(function(e){e(s)})).then(a,i)}c((n=n.apply(e,s||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;const s=1,t=300;var n=new class{constructor(){this.name="OfflineMessageSynchronizer",this._lastMessageSequenceMapOnDisconnect=new Map}install(e){this._core=e;const{common:{workflowManager:s},constants:{WORKFLOW_NAME:t,WORKFLOW_STEP:n,InnerEvent:o}}=e;s.registerWorkflowStep(t.SYNC_SERVER_INFO_AFTER_RE_ONLINE,n.HISTORY_MESSAGE_RECOVER,this._syncOfflineMessage,this),e.notificationCenter.subscribeInnerEvent(o.SOCKET_DISCONNECTED,this._updateLastMessageSequenceMapOnDisconnect,this)}_syncOfflineMessage(e){const{conversationList:s}=(null==e?void 0:e.result)||{},{OuterConstant:t,utils:{isArray:n}}=this._core;if(n(s)){const e=s.filter(e=>e.type===t.CONV_GROUP&&e.groupProfile.type!==t.GRP_AVCHATROOM);return this._recoverGroupHistoryMessage(e)}}_recoverGroupHistoryMessage(s){return e(this,void 0,void 0,function*(){const{OuterConstant:t}=this._core,n=[],o=[];return yield Promise.all(null==s?void 0:s.map(s=>e(this,void 0,void 0,function*(){const{groupProfile:{groupID:e}={},lastMessage:{lastSequence:r}={}}=s,a=`${t.CONV_GROUP}${e}`;let i=this._getLocalLastMessageSequence(a);this._shouldRecoverHistory({localLastMessageSequence:i,serverLastMessageSequence:r})&&(yield this._recoverHistoryForConversation({conversationID:a,localLastMessageSequence:i,serverLastMessageSequence:r,groupTipList:o})),n.push(a.replace(t.CONV_GROUP,""))}))),{recoverRevokeNoticeGroupIDList:n,groupTipList:o}})}_recoverHistoryForConversation(s){return e(this,arguments,void 0,function*({conversationID:e,localLastMessageSequence:s,serverLastMessageSequence:t,groupTipList:n}){try{const{utils:{isArray:o,isObject:r,isEmpty:a},OuterEvent:i,OuterConstant:c,notificationCenter:u,message:l,appStore:g,common:{getMessagePreviewText:p}}=this._core,f=t-s,M=Math.min(20,f),h={},v=yield l.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:e,sequence:s+M,direction:c.Direction.FORWARD,count:M}),{nextReqMessageIDFromServer:d,hasNoMoreHistoryMessage:_,messageList:y,serverGroupTipList:S}=v;o(S)&&n.push(...S);const O=_&&d<0,m=[];if(o(y)&&(y.forEach(e=>{l.messageReceiver.groupMessageReceiver.updateMessageProfile(e),e.from===c.CONV_SYSTEM&&(e.isSystemMessage=!1);l.messageDataHandler.storeConversationMessage(e)&&!a(e.payload)&&(m.push(e),e._isExcludedFromLastMessage||(h.lastMessage=Object.assign({},e)))}),m.length>0&&u.emitOuterEvent(i.MESSAGE_RECEIVED,{name:i.MESSAGE_RECEIVED,data:m})),!O&&y.length>0){const s=y[y.length-1].sequence;yield this._recoverHistoryForConversation({conversationID:e,localLastMessageSequence:s,serverLastMessageSequence:t,groupTipList:n})}r(h.lastMessage)&&(h.lastMessage.messageForShow=p(h.lastMessage.type,h.lastMessage.payload),g.conversationStore.updateConversation(e,h))}catch(s){this._core.ssoLog.error("_recoverHistoryForConversation",`Recovery failed for conversation:${e}`,{error:s})}})}_updateLastMessageSequenceMapOnDisconnect(){const{message:e}=this._core,s=e.messageDataHandler.getContinuousMessagesByConversation();for(const[e,t]of s){if(e.startsWith("C2C"))continue;const s=Array.from(t.values());if((null==s?void 0:s.length)>0){const t=s[s.length-1].sequence;this._lastMessageSequenceMapOnDisconnect.set(e,t)}}}_getLocalLastMessageSequence(e){const{message:s}=this._core;if(this._lastMessageSequenceMapOnDisconnect.has(e))return this._lastMessageSequenceMapOnDisconnect.get(e);const t=s.messageDataHandler.getLocalMessageList(e),n=t[t.length-1];return null==n?void 0:n.sequence}_shouldRecoverHistory(e){const{localLastMessageSequence:n,serverLastMessageSequence:o}=e;if("number"!=typeof n||"number"!=typeof o)return!1;const r=o-n;return 0!==o&&n>0&&(r>=s&&r<t)}};return n});