UNPKG

@tencentcloud/lite-chat

Version:

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

2 lines (1 loc) 3.95 kB
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:g,appStore:l,common:{getMessagePreviewText:M}}=this._core,p=t-s,v=Math.min(20,p),h={},_=yield g.messageHistory.getGroupRoamingMessagesByAnchor({conversationID:e,sequence:s+v,direction:c.Direction.FORWARD,count:v}),{nextReqMessageIDFromServer:f,hasNoMoreHistoryMessage:S,messageList:y,serverGroupTipList:O}=_;o(O)&&n.push(...O);const E=S&&f<0,d=[];if(o(y)&&(y.forEach(e=>{g.messageReceiver.groupMessageReceiver.updateMessageProfile(e),e.from===c.CONV_SYSTEM&&(e.isSystemMessage=!1);g.messageDataHandler.storeConversationMessage(e)&&!a(e.payload)&&(d.push(e),e._isExcludedFromLastMessage||(h.lastMessage=Object.assign({},e)))}),d.length>0&&u.emitOuterEvent(i.MESSAGE_RECEIVED,{name:i.MESSAGE_RECEIVED,data:d})),!E&&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=M(h.lastMessage.type,h.lastMessage.payload),l.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)}};export{n as default};