@rongcloud/imkit-store
Version:
RongCloud IM UIKit Store
2 lines (1 loc) • 37.1 kB
JavaScript
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@rongcloud/imlib-next"),t=require("@rongcloud/engine"),s=require("mobx");const o=e=>`[${e.targetId}][${e.conversationType}][${e.channelId||""}]`,i=e=>{const[t,s,o]=e.split("][");return{targetId:t.replace("[",""),conversationType:~~s,channelId:o.replace("]","")}},r=(e,t)=>e.targetId===t.targetId&&e.conversationType===t.conversationType&&(e.channelId===t.channelId||!t.channelId);e.ConversationType.PRIVATE,e.ConversationType.GROUP,e.ConversationType.SYSTEM;const n=(e,t)=>{const s=e.messageUId&&t.messageUId?"messageUId":"messageId";return e[s]===t[s]},a=e=>JSON.parse(JSON.stringify(e)),c=(e,t=new WeakMap)=>{if(null===e||"object"!=typeof e||!e)return e;if(t.has(e))return t.get(e);let s;if(e instanceof Date)s=new Date(e.getTime());else if(e instanceof RegExp)s=new RegExp(e);else if(e instanceof Map)s=new Map,t.set(e,s),e.forEach(((e,o)=>{s.set(o,c(e,t))}));else if(e instanceof Set)s=new Set,t.set(e,s),e.forEach((e=>{s.add(c(e,t))}));else if(Array.isArray(e)){s=[],t.set(e,s);for(let o=0;o<e.length;o++)s[o]=c(e[o],t)}else{s=Object.create(Object.getPrototypeOf(e)),t.set(e,s);for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(s[o]=c(e[o],t))}return s};class h{queue=[];maxSize;constructor(e){this.maxSize=e,s.makeAutoObservable(this)}push(e,t){this.queue.push(c(e)),t&&this._trimExcess(!0)}pop(){return this.queue.pop()}unshift(e,t){this.queue.unshift(...c(e)),t&&this._trimExcess(!1)}shift(){return this.queue.shift()}clear(){this.queue=[]}set(e,t=!0){this.queue=c(e),t&&this._trimExcess()}get(){return c(this.queue)}resetExcess(){this._trimExcess()}splice(e,t,...s){this.queue.splice(e,t,...c(s))}_trimExcess(e=!0){0!==this.maxSize&&(this.queue.length<this.maxSize||(e?this.queue.splice(0,this.queue.length-this.maxSize):this.queue.splice(this.maxSize,this.queue.length-this.maxSize)))}get length(){return this.queue.length}}class _{maxKeySize;map=new Map;activeMap=new Map;constructor(e=30){this.maxKeySize=e,s.makeAutoObservable(this,{map:s.observable,activeMap:!1})}get(e){const t=this.map.get(e);if(t)return this.activeMap.set(e,Date.now()),t.get()}getQueue(e){const t=this.map.get(e);if(t)return this.activeMap.set(e,Date.now()),t}set(e,t,s=!0,o=30){const i=new h(o);i.set(t,s),this.map.set(e,i),this.activeMap.set(e,Date.now()),this.removeOverdueKey()}removeOverdueKey(){if(this.map.size<=this.maxKeySize)return;const e=Array.from(this.activeMap.entries());e.sort(((e,t)=>t[1]-e[1]));e.slice(this.maxKeySize).forEach((e=>{this.delete(e[0])}))}delete(e){this.map.get(e)?.clear(),this.map.delete(e),this.activeMap.delete(e)}resetAllExcess(){this.map.forEach((e=>{e.resetExcess()}))}resetExcess(e){this.map.get(e)?.resetExcess()}clear(){this.map.forEach((e=>{e.clear()})),this.map.clear(),this.activeMap.clear()}}var u,d,g;!function(e){e.K_INIT_O="K_INIT_O",e.K_NOTIFY_GET_CONVERSATIONS_O="K_NOTIFY-GET-CONVERSATIONS_O",e.K_REMOVE_CONVERSATION_O="K_REMOVE-CONVERSATION_O",e.K_OPEN_CONVERSATION_O="K_OPEN-CONVERSATION_O",e.K_USER_PROFILE_NOT_FOUND_O="K_USER-PROFILE-NOT-FOUND_O",e.K_GROUP_PROFILE_NOT_FOUND_O="K_GROUP-PROFILE-NOT-FOUND_O",e.K_SYSTEM_PROFILE_NOT_FOUND_O="K_SYSTEM-PROFILE-NOT-FOUND_O",e.S_UPDATE_CACHE_O="S_UPDATE-CACHE_O",e.S_GET_CONVERSATION_E="S_GET-CONVERSATION_E",e.S_GET_CONVERSATION_T="S_GET-CONVERSATION_T",e.S_GET_CONVERSATION_R="S_GET-CONVERSATION_R",e.S_PUSH_2_QUEUE_O="S_PUSH-2-QUEUE_O",e.S_TASK_QUEUE_EXECUTE_O="S_PICK-ITEM-FROM-QUEUE_O",e.S_SEND_MSG_T="S_SEND-MSG_T",e.S_SEND_MSG_R="S_SEND-MSG_R",e.S_SEND_MSG_E="S_SEND-MSG_E",e.L_PARSE_CONVERSATION_E="L_PARSE_CONVERSATION_E",e.S_GET_GROUP_MEMBERS_HOOK_T="S_GET-GROUP-MEMBERS-HOOK_T",e.S_GET_GROUP_MEMBERS_HOOK_R="S_GET-GROUP-MEMBERS-HOOK_R",e.S_GET_GROUP_MEMBERS_HOOK_E="S_GET-GROUP-MEMBERS-HOOK_E",e.S_PARSE_CONVERSATION_E="S_PARSE-CONVERSATION_E",e.S_REMOVE_CONVERSATION_O="S_REMOVE-CONVERSATION_O",e.S_UPDATE_CONVERSATION_O="S_UPDATE-CONVERSATION_O",e.S_INSERT_MESSAGE_O="S_INSERT-MESSAGE_O",e.S_UPDATE_MESSAGE_O="S_UPDATE-MESSAGE_O",e.S_REMOVE_MESSAGE_O="S_REMOVE-MESSAGE_O",e.S_RECALL_MESSAGE_O="S_RECALL-MESSAGE_O",e.S_GET_HISTORY_MESSAGE_O="S_GET-HISTORY-MESSAGE_O",e.S_SEND_MESSAGE_O="S_SEND-MESSAGE_O",e.S_FORWARD_MESSAGE_O="S_FORWARD-MESSAGE_O",e.S_CANCEL_SEND_MEDIA_MESSAGE_O="S_CANCEL-SEND-MEDIA-MESSAGE_O",e.S_GET_SELECTED_MESSAGES_O="S_GET-SELECTED-MESSAGES_O",e.S_SET_SELECTED_MESSAGES_O="S_SET-SELECTED-MESSAGES_O",e.S_ON_SEND_BEFORE_S="S_ON-SEND-BEFORE_S",e.S_CLEAR_UNREAD_COUNT_O="S_CLEAR-UNREAD-COUNT_O",e.S_CLEAR_MESSAGES_UNREAD_STATUS_T="S_CLEAR-MESSAGES-UNREAD-STATUS_T",e.S_CLEAR_MESSAGES_UNREAD_STATUS_R="S_CLEAR-MESSAGES-UNREAD-STATUS_R",e.S_REMOVE_CONVERSATION_T="S_REMOVE-CONVERSATION_T",e.S_REMOVE_CONVERSATION_R="S_REMOVE-CONVERSATION_R",e.S_SET_CONVERSATION_NOTIFICATION_LEVEL_T="S_SET-CONVERSATION-NOTIFICATION-LEVEL_T",e.S_SET_CONVERSATION_NOTIFICATION_LEVEL_R="S_SET-CONVERSATION-NOTIFICATION-LEVEL_R",e.S_SET_CONVERSATION_TO_TOP_T="S_SET-CONVERSATION-TO-TOP_T",e.S_SET_CONVERSATION_TO_TOP_R="S_SET-CONVERSATION-TO-TOP_R",e.S_RECALL_MESSAGE_T="S_RECALL-MESSAGE_T",e.S_RECALL_MESSAGE_R="S_RECALL-MESSAGE_R",e.S_RECEIVE_DISCONNECT_NOTIFICATION_O="S_RECEIVE-DISCONNECT-NOTIFICATION_O"}(u||(u={})),function(e){e[e.TASK_CANCEL=39001]="TASK_CANCEL"}(d||(d={}));class S{_parallel;_fps;_logger;_timestamps=[];_queue=[];_executing=[];_timer=-1;constructor(e=5,t=5,s){this._parallel=e,this._fps=t,this._logger=s}destroy(){clearTimeout(this._timer),this._timer=-1}async push(e){return new Promise((t=>{this._queue.push({params:e,resolve:t}),this._logger.info(u.S_PUSH_2_QUEUE_O,`${this._tag}: queue length: ${this._queue.length}`),this._execute()}))}async _execute(){if(this._paused||0===this._queue.length||this._executing.length>=this._parallel)return;if(this._timestamps.length>=this._fps)return void this._logger.warn(u.S_TASK_QUEUE_EXECUTE_O,`${this._tag}: trigger limiting`);-1===this._timer&&(this._timer=setTimeout((()=>{this._timestamps.length=0,this._timer=-1,this._execute()}),1e3));const e=this._queue.shift();this._executing.push(e),this._timestamps.push(Date.now()),this._logger.info(u.S_TASK_QUEUE_EXECUTE_O,`${this._tag}: queue length: ${this._queue.length}, executing length: ${this._executing.length}`);const t=this._handle(e.params);this._execute();const{code:s,data:o}=await t;e.code=s,e.result=o,this._checkResolve()}_checkResolve(){for(;this._executing.length&&void 0!==this._executing[0].code;){const{resolve:e,code:t,result:s}=this._executing.shift();e({code:t,data:s})}this._execute()}_paused=!1}class l extends S{_logger;_tag="MessageSendQueue";constructor(e){super(10,5,e),this._logger=e}async _handle(s){const{conversation:o,message:i,options:r}=s,{conversationType:n,targetId:c,channelId:h}=o,_=this._logger.createTraceId();this._logger.info(u.S_SEND_MSG_T,`type: ${i.messageType}, conversationType: ${n}, targetId: ${c}, channelId: ${h||""}`,_);const{isCounted:d,isPersited:g,content:S,messageType:l}=i,E=new e.BaseMessage(l,S,g,d);if(t.isObject(E.content))try{E.content=a(E.content)}catch(e){this._logger.warn(u.S_SEND_MSG_E,e.message)}const{code:p,data:m}=await e.sendMessage(o,E,{...r,onSendBefore(e){i.messageId=e.messageId,r?.onSendBefore?.(e)}});return p!==t.ErrorCode.SUCCESS?this._logger.warn(u.S_SEND_MSG_R,`code: ${p}`,_):this._logger.info(u.S_SEND_MSG_R,"success",_),{code:p,data:m}}}!function(e){e.ALIYUN="aliyun",e.S3="s3",e.STC="stc",e.MINIO="minio",e.QINIU="qiniu",e.BAIDU="baidu",e.RCX="rcx"}(g||(g={}));class E{_url;_getFileToken;_serverType=0;constructor(e,t,s){this._url=e,this._getFileToken=t,this._serverType=s}prepareUpload(e){return this.prepareUploadData(e)}prepareMultipart(e){return this.prepareMultipartData(e)}}const p={[g.QINIU]:class extends E{async prepareUploadData(e){const{fileSize:s,fileType:o}=e;try{const e=await this._getFileToken(o,void 0,void 0,void 0),{code:s,data:i}=e;if(s!==t.ErrorCode.SUCCESS)return{code:s,msg:i};const{token:r,fileName:n}=i,a={token:r,key:n};return{code:t.ErrorCode.SUCCESS,data:{url:t.fixUrlProtocol(this._url),headers:{},body:a,fileName:n,uniqueName:n,uploadMethod:t.UploadMethod.QINIU}}}catch(e){return console.error("QINIU prepareUploadData error",e),{code:e}}}prepareMultipartData(e){throw new Error("Method not implemented.")}}};async function m(s,o,i){const{serverType:r,customDomain:n,ossConfig:a,uploadServer:c,bosAddr:h}=o;if(!a||0===a.length)return{code:t.ErrorCode.INVALID_PARAMETER_MEDIA_URL,msg:"ossConfig is empty"};const _=function(e,t,s,o,i){if(s)return[{type:g.RCX,url:s,p:"1"}];if(e)return JSON.parse(e).map((e=>{const t={type:g.QINIU,url:"",p:""};return Object.keys(e).forEach((s=>{"p"===s?t.p=e[s]:(t.type=s,t.url=e[s])})),t})).sort(((e,t)=>e.p-t.p));const r=[];return o&&r.push({type:g.QINIU,url:o,p:"1"}),i&&r.push({type:g.BAIDU,url:i,p:"2"}),r}(a,0,n,c,h);if(0===_.length)return{code:t.ErrorCode.INVALID_PARAMETER_MEDIA_URL,msg:"uploadUrlList is empty"};const u=[];for(let o=0;o<_.length;o++){const n=_[o];if(!(n.type in p))continue;const a=new p[n.type](n.url,e.getFileToken,r),c=await a.prepareUpload(s);if(c.code===t.ErrorCode.SUCCESS&&c.data)try{i.setRequestData(c.data);const{uploadMethod:o,uniqueName:r}=c.data,a=await i.execute(),{code:h,data:_,msg:d}=a;if(h===t.ErrorCode.RC_FILE_SIZE_EXCEED_LIMIT)return{code:h,msg:"File size exceeds the limit"};if(h===t.ErrorCode.INVALID_PARAMETER_SIZE_NOT_FOUND)return{code:h,msg:"File size not found"};if(i.isAbort())return{code:h,msg:d};if(h===t.ErrorCode.SUCCESS&&_){let{downloadUrl:i,name:n}=_;if(!i){const a=await e.getFileUrl(s.fileType,r||"",n,void 0,o),{code:c,data:h}=a;c===t.ErrorCode.SUCCESS&&h&&(i=h.downloadUrl)}return i?{code:t.ErrorCode.SUCCESS,data:{downloadUrl:i}}:{code:t.ErrorCode.UPLOAD_FAIL,msg:"Get download url fail"}}u.push({type:n.type,url:n.url,code:a.code,msg:a.msg})}catch(e){u.push({type:n.type,url:n.url,code:t.ErrorCode.UPLOAD_FAIL,msg:e instanceof Error?e.message:String(e)})}else u.push({type:n.type,url:n.url,code:c.code,msg:c.msg})}return{code:t.ErrorCode.UPLOAD_FAIL,msg:`Failed to upload through all channels, msg: ${JSON.stringify(u)}`}}class C extends S{_logger;constructor(e){super(2,5,e),this._logger=e}_tag="UploadQueue";_handle(e){const{info:t,config:s,request:o}=e;return m(t,s,o)}}class T{_logger;rootStore;_context;#e=new _(10);#t;#s;#o=new Map;#i={[e.MessageType.IMAGE]:"imageUri",[e.MessageType.SIGHT]:"sightUrl",[e.MessageType.HQ_VOICE]:"remoteUrl",[e.MessageType.GIF]:"remoteUrl",[e.MessageType.FILE]:"fileUrl"};#r=[];constructor(t,o,i){this._logger=t,this.rootStore=o,this._context=i,s.makeAutoObservable(this),e.addEventListener(e.Events.MESSAGES,this.#n.bind(this)),this.#t=new l(this._logger),this.#s=new C(this._logger)}getMessages(t){const s=this.#e.get(t);if(!s||0===s.length)return[];const{conversationType:o}=i(t);switch(o){case e.ConversationType.GROUP:return this.#a(s);case e.ConversationType.SYSTEM:return this.#c(s);default:return this.#h(s)}}#a(e){if(0===e.length)return[];const t=this.rootStore.appData.groupMembersCache.getGroupMemberMap(e[0].targetId);return e.map((e=>({...e,user:{nickname:t.get(e.senderUserId)?.user.nickname||"",portraitUri:t.get(e.senderUserId)?.user.portraitUri||"",groupNickname:t.get(e.senderUserId)?.groupNickname||""}})))}#h(e){return 0===e.length?[]:e.map((e=>{const t=this.rootStore.appData.getUserInfo(e.senderUserId);return{...e,user:{nickname:t?.name||"",portraitUri:t?.portraitUri||""}}}))}#c(e){if(0===e.length)return[];const t=this.rootStore.appData.getSystemProfile(e[0].senderUserId);return e.map((e=>({...e,user:{nickname:t?.name||"",portraitUri:t?.portraitUri||""}})))}#_=()=>{const e=this._context.getNaviInfo();if(e&&"ossConfig"in e)return e.ossConfig};async getHistoryMsgList(t,o,r,n=20){this._logger.info(u.S_GET_HISTORY_MESSAGE_O,`${t}, ${o}, ${r}, ${n}`);const{code:a,data:c}=await e.getHistoryMessages(i(t),{timestamp:o,count:n});if(a===e.ErrorCode.SUCCESS&&c){const{list:e}=c;s.runInAction((()=>{r?this.#e.getQueue(t)?.unshift(e,!1):this.#e.set(t,e,!0)}))}return{code:a,data:c}}insertMessage(e,t=!0,s=!0){const i=o({conversationType:e.conversationType,targetId:e.targetId,channelId:e.channelId});e.messageId&&0!==e.messageId||(e.messageId=(()=>{let e=0;const t=((4294967295&Date.now())>>>0).toString(2),s=Math.floor(255*Math.random()),o=t+e.toString(2).padStart(11,"0")+s.toString(2).padStart(8,"0");return e=2047&++e,parseInt(o,2)})());const r=this.#e.get(i);let a=!1;return r&&(a=r.some((t=>n(t,e)))),s&&this._logger.info(u.S_INSERT_MESSAGE_O,`${i}, ${e.messageUId}, ${e.messageId}, isRepeat: ${a}`),a||this.#e.getQueue(i)?.push(e,t),e}updateCatchedMessage(e){const t=o({conversationType:e.conversationType,targetId:e.targetId,channelId:e.channelId});this._logger.info(u.S_UPDATE_MESSAGE_O,`${t}, ${e.messageUId}, ${e.messageId}, ${e.messageType}, ${e.senderUserId}, ${e.sentTime}, ${e.sentStatus}`);const s=this.#e.getQueue(t);if(!s)return;const i=s.get(),r=i.findIndex((t=>n(t,e)));-1!==r&&s.splice(r,1,{...e,sentTime:e.sentTime||i[r].sentTime})}removeCatchedMessage(e){const t=o({conversationType:e.conversationType,targetId:e.targetId,channelId:e.channelId});this._logger.info(u.S_REMOVE_MESSAGE_O,`${t}, ${e.messageUId}, ${e.messageId}`);const s=this.#e.getQueue(t);if(!s)return;const i=s.get().findIndex((t=>n(t,e)));-1!==i&&s.splice(i,1)}async recallMessage(t){const{conversationType:s,targetId:o,channelId:i}=t;return this._logger.info(u.S_RECALL_MESSAGE_O,`${s}, ${o}, ${i}, ${t.messageUId}`),e.recallMessage({conversationType:s,targetId:o,channelId:i},{messageUId:t.messageUId,sentTime:t.sentTime})}async sendMessage(e,t,s){return this._logger.info(u.S_SEND_MESSAGE_O,`${e}, ${t.messageType}, ${s?.messageId}`),this.#t.push({conversation:i(e),message:this.#u(i(e),t),options:s})}async sendMediaMessage(t){const{conversationKey:s,message:o,info:r,request:n,sendOptions:a}=t;if(o.messageType!==e.MessageType.IMAGE&&o.messageType!==e.MessageType.SIGHT&&o.messageType!==e.MessageType.HQ_VOICE&&o.messageType!==e.MessageType.GIF&&o.messageType!==e.MessageType.FILE)return{code:e.ErrorCode.INVALID_PARAMETER_MESSAGE_CONTENT,msg:"Invalid message type"};const c=r?.path,h=this.#u(i(s),o,a,c);let _,d;if(a?.messageId?(d=a.messageId,h.sentStatus=e.SentStatus.SENDING,this.updateCatchedMessage(h),_=h):(_=this.insertMessage(h,!1,!0),d=_.messageId),!d)return{code:e.ErrorCode.UPLOAD_FAIL,msg:"Insert message failed"};this.#o.set(d,n);try{const t={ossConfig:this.#_()},i=await this.#s.push({info:r,request:n,config:t});if(i.code===e.ErrorCode.SUCCESS&&i.data){const{data:e}=i,t=this.#i[o.messageType];if(t&&e?.downloadUrl){o.content[t]=e.downloadUrl;const i={...a||{},messageId:d};return await this.sendMessage(s,o,i)}this._logger.warn(u.S_SEND_MSG_E,`Cannot set media URL: propertyName=${t}, hasUrl=${!!e?.downloadUrl}`)}else this._logger.warn(u.S_SEND_MSG_E,`Media upload failed: code=${i.code}, error=${i.code}`)}catch(e){this._logger.error(u.S_SEND_MSG_E,`Exception in sendMediaMessage: ${e}`)}finally{this.#o.delete(d)}return _.sentStatus=e.SentStatus.FAILED,this.updateCatchedMessage(_),{code:e.ErrorCode.UPLOAD_FAIL,msg:"Upload failed",data:_}}forwardMessage(e,t){return this._logger.info(u.S_FORWARD_MESSAGE_O,`${e}, ${t.messageType}, ${t.messageUId}`),this.#t.push({conversation:i(e),message:t})}cancelSendMediaMessage(e){this._logger.info(u.S_CANCEL_SEND_MEDIA_MESSAGE_O,`${e}`);const t=this.#o.get(e);t&&(t.abort(),this.#o.delete(e))}getSelectedMessages(){return this._logger.info(u.S_GET_SELECTED_MESSAGES_O),a(this.#r)}setSelectedMessages(e){this._logger.info(u.S_SET_SELECTED_MESSAGES_O,`${e.length}`),this.#r=e}clearExcessMessage(e){this.#e.resetExcess(e)}#n(t){t.messages.forEach((t=>{const{conversationType:s,targetId:i,channelId:r,isPersited:n}=t,a=o({conversationType:s,targetId:i,channelId:r});switch(t.messageType){case e.MessageType.RECALL_MESSAGE_TYPE:this.removeCatchedMessage({...t,messageUId:t.content.messageUId});break;case"RC:SRSMsg":e.clearMessagesUnreadStatus({conversationType:s,targetId:i,channelId:r})}n&&this.insertMessage(t,a!==this.rootStore.conversationStore?.openedConversation?.key,!1)}))}#u(t,s,o,i){const{conversationType:r,targetId:n,channelId:a}=t,{isCounted:c,isPersited:h,content:_,messageType:u}=s;return{targetId:n,conversationType:r,messageDirection:1,messageType:u,sentTime:this._context.getServerTime(),isStatusMessage:o?.isStatusMessage,isCounted:c,isPersited:h,content:_,channelId:a||"",senderUserId:this._context.getCurrentId(),receivedTime:0,messageUId:"",sentStatus:e.SentStatus.SENDING,isOffLineMessage:!1,canIncludeExpansion:o?.canIncludeExpansion||!1,receivedStatus:0,isMentioned:o?.isMentioned,expansion:o?.expansion,messageId:o?.messageId,localTmpPath:i}}destroy(){e.removeEventListener(e.Events.MESSAGES,this.#n),this.clearMemoryData()}clearMemoryData(){this.#e.clear(),this.#t.destroy(),this.#s.destroy(),this.#o.clear(),this.#r=[]}}class O{#d;#g=null;#S=()=>{};#l=()=>{};#E=()=>{};#p=null;#m=!1;#C=null;#T=null;#O=!1;#M=0;list=[];#f=new Map;#I=[];constructor(t,o){this.#d=t,this.#g=o,s.makeAutoObservable(this),e.addEventListener(e.Events.CONNECTED,this._onConnected.bind(this)),e.addEventListener(e.Events.CONVERSATION,this._onRecvConversationNtf.bind(this)),e.addEventListener(e.Events.PULL_OFFLINE_MESSAGE_FINISHED,this._onPullOfflineMessageFinished.bind(this)),this.#S=this.#v(this.#d.getUsersCache(),e.ConversationType.PRIVATE),this.#l=this.#v(this.#d.getGroupsCache(),e.ConversationType.GROUP),this.#E=this.#v(this.#d.getSystemsCache(),e.ConversationType.SYSTEM)}#v(e,t){return s.reaction((()=>Array.from(e.entries())),(o=>{s.runInAction((()=>{this.list.forEach((s=>{if(s.conversationType===t&&e.has(s.targetId)){const{data:t}=e.get(s.targetId);s.name=t.name||"",s.portraitUri=t.portraitUri||"",this.#f.set(s.key,s)}}))}))}),{fireImmediately:!1,equals:s.comparer.structural})}getCachedConversationList(){return this.list.slice()}getOpenedConversation(){return this.#p}destroy(){e.removeEventListener(e.Events.CONNECTED,(()=>this._getMoreRemoteConversation)),e.removeEventListener(e.Events.CONVERSATION,this._onRecvConversationNtf),e.removeEventListener(e.Events.PULL_OFFLINE_MESSAGE_FINISHED,this._onPullOfflineMessageFinished),this.#S(),this.#l(),this.#E(),this.clearMemoryData()}clearMemoryData(){this.#I.length=0,this.#m=!1,this.#O=!1,this.#p=null,this.#M=0,this.list.length=0,this.#f.clear(),this.#g?.info(u.S_RECEIVE_DISCONNECT_NOTIFICATION_O,"clear memory data")}_onRecvConversationNtf(e){this.#I.push(...e.conversationList),this._handleQueue()}_onPullOfflineMessageFinished(){this.#C&&(clearTimeout(this.#C),this.#C=null),this.#T&&(clearTimeout(this.#T),this.#T=null),this.#O||this._getMoreRemoteConversation(!1),this.#O=!0}_handleQueueDelay(){this.#T||(this.#T=setTimeout((()=>{this.#T=null,this._handleQueue()}),20))}_onConnected(){this.#M+=1,this.#m||this._getMoreRemoteConversation(!0)}async _getMoreRemoteConversation(t=!1,s=0){const o=0===s?20:200,{code:i,data:r}=await e.getConversationList({count:o,startTime:s});if(t&&this.#O)return;if(i!==e.ErrorCode.SUCCESS&&!t)return this.#g?.error(u.S_GET_CONVERSATION_E,`get conversation list failed: code = ${i}, count = ${o}, startTime = ${s}`),void(this.#C=setTimeout((()=>this._getMoreRemoteConversation(t,s)),3e3));const n=r||[];if(0===n.length||t)return void this._onGetRemoteConversationListDone(t);const a=0===s&&!t;a&&(this.list.length=0);const c=this._parseConversationList(n);let h=s;if(h=this._handleNextRequestTimestamp(h,c),t||a){const e=c.filter((e=>!this.list.some((t=>t.key===e.key))));this.list.push(...e)}t||n.length<o?this._onGetRemoteConversationListDone(t):this.#C=setTimeout((()=>this._getMoreRemoteConversation(!1,h)),300)}_handleNextRequestTimestamp(e,t){return this._updatePositionToConversationList(t,!1),t.forEach((t=>{t.updateTime&&(e=0===e?t.updateTime:Math.min(t.updateTime,e))})),e}_updatePositionToConversationList(e,t=!0){const s=[...this.list];e.forEach((e=>{let o=s.findIndex((t=>r(t,e)));if(o>-1){if(!t)return{origin:o,current:o};s.splice(o,1)}const{isTop:i,updateTime:n}=e;let a=s.findIndex((e=>i?!e.isTop||n>e.updateTime:!e.isTop&&n>e.updateTime));-1===a&&(a=s.length),s.splice(a,0,e)})),this.list=s}_onGetRemoteConversationListDone(e){e||(this.#m=!0),this._handleQueue()}_handleQueue(){if(0===this.#I.length)return;if(this.list.length>=20&&!this.#m)return;const e=new Set,t=new Set,s=new Set,o=Number.MAX_SAFE_INTEGER,i=Date.now();if(this._handleQueueNotify((o=>{const{changeType:i,conversation:r}=o;1===i?(s.add(r),e.add(r)):2===i&&(t.add(r),e.add(r))}),e,o,i),t.size&&this._recalculatePosition(t),s.size){const e=[...s].filter((e=>!t.has(e)));e.length&&e.forEach((e=>{this.list.indexOf(e)>-1&&this.list.splice(this.list.indexOf(e),1,e)}))}this._handleQueueDelay()}_recalculatePosition(e){const t=[...e].sort(((e,t)=>e.updateTime-t.updateTime));this._updatePositionToConversationList(t)}_handleQueueNotify(e,t,s,o){if(this.#m)for(;this.#I.length&&Date.now()-o<20&&t.size<s;){const t=this.#I.shift();this.#M<=1&&t.updatedItems?.latestMessage?.val.isOffLineMessage||e(this._handleConversationNtf(t))}else{let i=0;for(;i<this.#I.length&&Date.now()-o<20&&t.size<s;){const t=this.#I[i];if(t.updatedItems?.latestMessage){if(!t.updatedItems.latestMessage.val.isOffLineMessage)break;this.#I.splice(i,1),e(this._handleConversationNtf(t))}else i+=1}}}_handleConversationNtf(t){const{conversation:s,updatedItems:i}=t,r=o(s);let n=this.#f.get(r);return n&&i?this._handleUpdatedItems(n,i,s):!n&&i?.latestMessage?(s.conversationType===e.ConversationType.PRIVATE?n=this._transPriConversation(s):s.conversationType===e.ConversationType.GROUP?n=this._transGroupConversation(s):s.conversationType===e.ConversationType.SYSTEM&&(n=this._transSystemConversation(s)),n&&this.#f.set(n.key,n),{changeType:2,conversation:n}):{changeType:0}}_handleUpdatedItems(e,t,s){let o=0;return t.isTop&&(e.isTop=t.isTop.val,o=Math.max(2,o)),t.notificationLevel&&(e.notificationLevel=t.notificationLevel.val,o=Math.max(1,o)),t.latestMessage?.val&&(this._paddingData(e,s),o=Math.max(2,o)),{changeType:o,conversation:e}}getMoreConversationList(t,s){let o=t?this.list.findIndex((e=>r(e,t))):-1;-1===o?o=0:o+=1;const i=o+(s||20),n=this.list.slice(o,i),a=this.list.length>i||!this.#m;return this.#g?.info(u.K_NOTIFY_GET_CONVERSATIONS_O,`get more conversation, conversation: ${t?.key}, count: ${s}, list: ${JSON.stringify(n.length)}`),{hasMore:a,code:e.ErrorCode.SUCCESS,list:n,isFirstScreen:!t}}openConversation(t){if(t){const s=this.#N(t);return this.#p=s,this.#g?.info(u.K_OPEN_CONVERSATION_O,`open conversation, key: ${s.key}`),void(t.conversationType===e.ConversationType.GROUP&&this.#d.groupMembersCache.initGroupMembers(t.targetId))}this.#g?.info(u.K_OPEN_CONVERSATION_O,`close conversation, key: ${this.#p?.key}`),this.#p=null}async removeConversation(e){const t=this.list.findIndex((t=>t.key===e));if(t>-1){const[s]=this.list.splice(t,1);return this.#f.delete(e),void this.#g?.info(u.S_REMOVE_CONVERSATION_O,`remove conversation: ${s}`)}this.#g?.warn(u.S_REMOVE_CONVERSATION_O,`remove conversation failed: ${e} not found`)}_parseConversationList(t){const s=[];return t.forEach((t=>{const{conversationType:o,targetId:i}=t;switch(o){case e.ConversationType.PRIVATE:s.push(this._transPriConversation(t));break;case e.ConversationType.GROUP:s.push(this._transGroupConversation(t));break;case e.ConversationType.SYSTEM:s.push(this._transSystemConversation(t));break;default:this.#g?.warn(u.S_PARSE_CONVERSATION_E,`unknown conversation type: ${o}, targetId: ${i}`)}})),s}_paddingData(e,t){e.unreadCount=t.unreadMessageCount||0,e.isTop=!!t.isTop,e.latestMessage=t.latestMessage,e.updateTime=t.operationTime||t.latestMessage?.sentTime||0,t.notificationLevel&&(e.notificationLevel=t.notificationLevel)}_transPriConversation(e){const t=this.#d?.getUserProfile(e.targetId),s=this.#N(e);return t&&(s.name=t.name,s.nickName=t.remark||"",s.portraitUri=t.portraitUri||""),this._paddingData(s,e),s}_transSystemConversation(e){const t=this.#d?.getSystemProfile(e.targetId),s=this.#N(e);return t&&(s.name=t.name,s.portraitUri=t.portraitUri||""),this._paddingData(s,e),s}_transGroupConversation(e){const t=this.#d?.getGroupProfile(e.targetId),s=this.#N(e);return t&&(s.name=t.name,s.nickName=t.remark||"",s.portraitUri=t.portraitUri||""),this._paddingData(s,e),s}count=0;#N(t){const s=o(t);if(this.#f.has(s))return this.#f.get(s);this.count++;const i={key:s,targetId:t.targetId,conversationType:t.conversationType,channelId:t.channelId||"",name:"",nickName:"",portraitUri:"",draft:"",latestMessage:null,isTop:!1,notificationLevel:e.NotificationLevel.ALL_MESSAGE,unreadCount:0,updateTime:0,memberCount:0};return this.#f.set(s,i),i}createCachedConversation(e){const t=this.#N(e);if(-1===this.list.findIndex((e=>e.key===t.key))){const e=this.list.findIndex((e=>!e.isTop));e>-1?this.list.splice(e,0,t):this.list.unshift(t)}return t}updateCacheConversation(e,t){if(!this.#O)return;const s=this.list.findIndex((t=>t.key===e));if(s>-1)return Object.keys(t).forEach((e=>{if(e in this.list[s]){const o=e;this.list[s][o]=t[e]}})),this.#f.set(e,this.list[s]),void this.#g?.info(u.S_UPDATE_CONVERSATION_O,`update conversation: ${e}`);this.#g?.warn(u.S_UPDATE_CONVERSATION_O,`update conversation failed: ${e} not found`)}async clearUnreadCount(t){const s=this.list.find((e=>e.key===t));if(s){const t={conversationType:s.conversationType,targetId:s.targetId,channelId:s.channelId};await e.clearMessagesUnreadStatus(t),await e.sendSyncReadStatusMessage(t,(new Date).getTime())}}}class M{_kitStore;openedConversation=null;conversations=[];#R=null;#g=null;constructor(e,t){this._kitStore=e,this.#g=t,s.makeAutoObservable(this),this.#y(e)}async#y(e){this.#R=new O(e.appData,this.#g),this.#A(),s.reaction((()=>this.#R?.list),(e=>{e&&(this.conversations=e?.slice())}))}#A(){const e=this.#R?.getCachedConversationList()||[];s.runInAction((()=>{this.conversations=e}))}getConversations(e=null,t=10){return this.#R?.getMoreConversationList(e,t)}openConversation(e){!e&&this.openedConversation&&this._kitStore.messageStore.clearExcessMessage(this.openedConversation?.key),this.#R?.openConversation(e),s.runInAction((()=>{this.openedConversation=e}))}createCachedConversation(e){return this.#R?.createCachedConversation(e)}removeConversation(e){this.#g?.info(u.K_REMOVE_CONVERSATION_O,`remove conversation: ${e}`),this.#R?.removeConversation(e),s.runInAction((()=>{this.conversations=this.conversations.filter((t=>t.key!==e)),this.#g?.info(u.K_REMOVE_CONVERSATION_O,`remove conversation: ${e}, current conversations length: ${this.conversations.length}`)}))}updateCacheConversation(e,t){this.#R?.updateCacheConversation(e,t)}getTotalUnreadCount(){return(this.#R?.getCachedConversationList()||[]).reduce(((e,t)=>e+t.unreadCount),0)}async clearUnreadCount(e){await(this.#R?.clearUnreadCount(e))}clearMemoryData(){this.#R?.clearMemoryData()}destroy(){this.#R?.destroy()}}class f{config;constructor(e){this.config={timeout:5e3,...e}}async getUserProfile(e){return this.withTimeout(this.fetchUser(e))}async getGroupProfile(e){return this.withTimeout(this.fetchGroup(e))}async getSystemProfile(e){return this.withTimeout(this.fetchSystem(e))}async getGroupMembers(e){return this.withTimeout(this.fetchGroupMembers(e))}async withTimeout(e){return Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t("Request timeout")),this.config.timeout)))])}}class I extends f{_hooks;constructor(e){super({timeout:8e3}),this._hooks=e}async fetchUser(e){if(!this._hooks.reqUserProfiles)throw new Error("reqUserProfiles hook not implemented");return this._hooks.reqUserProfiles(e)}async fetchGroup(e){if(!this._hooks.reqGroupProfiles)throw new Error("reqGroupProfiles hook not implemented");return this._hooks.reqGroupProfiles(e)}async fetchSystem(e){if(!this._hooks.reqSystemProfiles)throw new Error("reqSystemProfiles hook not implemented");return this._hooks.reqSystemProfiles(e)}fetchGroupMembers(e){if(!this._hooks.reqGroupMembers)throw new Error("reqGroupMembers hook not implemented");return this._hooks.reqGroupMembers(e)}}class v{logger;dataSource;#U=new _(20);#D=new Map;constructor(e,t){this.logger=e,this.dataSource=t,s.makeAutoObservable(this)}async initGroupMembers(e){if(this.#U.get(e))return;if(this.#D.get(e))return;const t=this.dataSource.getGroupMembers(e);this.#D.set(e,t);try{const s=this.logger.createTraceId();this.logger.info(u.S_GET_GROUP_MEMBERS_HOOK_T,e,s);const o=await t;if(this.#D.delete(e),!o||!Array.isArray(o))return void this.logger.error(u.S_GET_GROUP_MEMBERS_HOOK_E,"result must be a Array",s);const i=o.filter(((e,t)=>!this.#G(e)||(this.logger.error(u.S_GET_GROUP_MEMBERS_HOOK_E,`result[${t}] is invalid, member: ${JSON.stringify(e)}`,s),!1))).map(this.#P);this.logger.info(u.S_GET_GROUP_MEMBERS_HOOK_R,`groupId: ${e}, memberCount: ${o.length}`,s),this.#U.set(e,i,!1,0)}catch(t){this.#D.delete(e),this.logger.error(u.S_GET_GROUP_MEMBERS_HOOK_E,e,t)}}getGroupMembers(e){return this.#U.get(e)||[]}getGroupMember(e,t){const s=this.#U.get(e),o=s?.find((e=>e.user.id===t));return o?{...o}:void 0}getGroupMemberMap(e){const t=this.#U.get(e),s=new Map;return t?.forEach((e=>{s.set(e.user.id,{...e})})),s}#G(e){return"object"!=typeof e||"string"!=typeof e.groupNickname||"object"!=typeof e.user||!e.user.id||"string"!=typeof e.user.id||"string"!=typeof e.user.nickname}#P(e){const{groupNickname:t,user:s}=e;return{user:{...s},groupNickname:t}}clearMemoryData(){this.#U.clear(),this.#D.clear()}}class N{logger;#L;#w=s.observable.map();#b=s.observable.map();#x=s.observable.map();groupMembersCache;#F={ids:[]};#V={ids:[],timer:void 0};#q={ids:[],timer:void 0};constructor(e,t={}){this.logger=e,this.#L=new I(t),this.groupMembersCache=new v(e,this.#L),s.makeAutoObservable(this)}getUserProfile(e){return this.#$({id:e,cache:this.#w,queue:this.#F,batchFetch:e=>this.#L.getUserProfile(e)})}getGroupProfile(e){return this.#$({id:e,cache:this.#b,queue:this.#V,batchFetch:e=>this.#L.getGroupProfile(e)})}getSystemProfile(e){return this.#$({id:e,cache:this.#x,queue:this.#q,batchFetch:e=>this.#L.getSystemProfile(e)})}getUserInfo(e){return this.#w.get(e)?.data}getUsersCache(){return this.#w}getGroupsCache(){return this.#b}getSystemsCache(){return this.#x}updateUserProfile(e,t){this.#w.get(e)?this.#k(this.#w,[e],[t]):this.logger.warn(u.K_USER_PROFILE_NOT_FOUND_O,`user id ${e} not found`)}updateGroupProfile(e,t){this.#b.get(e)?this.#k(this.#b,[e],[t]):this.logger.warn(u.K_GROUP_PROFILE_NOT_FOUND_O,`group id ${e} not found`)}updateSystemProfile(e,t){this.#x.get(e)?this.#k(this.#x,[e],[t]):this.logger.warn(u.K_SYSTEM_PROFILE_NOT_FOUND_O,`system id ${e} not found`)}async getProfileSync(e,s){if(s===t.ConversationType.PRIVATE){return(await this.#L.getUserProfile([e]))[0]}if(s===t.ConversationType.GROUP){return(await this.#L.getGroupProfile([e]))[0]}return(await this.#L.getSystemProfile([e]))[0]}#$(e){const t=Date.now(),s=e.cache.get(e.id);if(s)return s.expires>t||s.pending||this.#Q({id:e.id,cache:e.cache,queue:e.queue,batchFetch:e.batchFetch}),s.data;this.#Q({id:e.id,cache:e.cache,queue:e.queue,batchFetch:e.batchFetch})}#Q(e){let t=e.cache.get(e.id);t&&e.cache.set(e.id,{...t,pending:!0}),e.queue.ids=[...new Set([...e.queue.ids,e.id])],e.queue.timer&&clearTimeout(e.queue.timer),e.queue.timer=setTimeout((()=>this.#K(e.cache,e.queue,e.batchFetch)),200)}async#K(e,t,o){const i=[...t.ids];if(t.ids=[],t.timer=void 0,0!==i.length)try{const t=await o(i);s.runInAction((()=>this.#k(e,i,t)))}catch(t){s.runInAction((()=>this.#B(e,i)))}}#k(e,t,s){const o=Date.now();s.forEach((t=>{const{id:s}=t;s&&(e.set(s,{data:t,expires:o+6e5,pending:!1}),this.logger.info(u.S_UPDATE_CACHE_O,`update cache ${s} success, data: ${JSON.stringify(t)}`))}))}#B(e,t){t.forEach((t=>{const s=e.get(t);s&&e.set(t,{...s,pending:!1})}))}clearMemoryData(){[this.#F,this.#V,this.#q].forEach((e=>{e.timer&&clearTimeout(e.timer)})),this.#w.clear(),this.#b.clear(),this.#x.clear(),this.groupMembersCache.clearMemoryData()}}class R{rootStore;_logger;constructor(e,t){this.rootStore=e,this._logger=t}_monitorIds=[];init(){const e=Object.getOwnPropertyNames(Object.getPrototypeOf(this));for(const t of e)t.startsWith("monitor")&&"function"==typeof this[t]&&this._monitorIds.push(this[t]())}destroy(){this._monitorIds.forEach((t=>{e.removeMonitor(t)}))}monitorSendMessage(){return e.addMonitor(e.sendMessage,(async(t,s)=>{const{code:i,data:r}=await s;if(r?.isPersited){const s={...r,sentStatus:i===e.ErrorCode.SUCCESS?e.SentStatus.SENT:e.SentStatus.FAILED,...t[2]};this.rootStore.messageStore?.updateCatchedMessage(s),this.rootStore.conversationStore?.updateCacheConversation(o(t[0]),{latestMessage:s})}}),(e=>{const[,,t]=e;if(t){const{messageId:s}=t,i=t?.onSendBefore;t.onSendBefore=t=>{this._logger.info(u.S_ON_SEND_BEFORE_S,`${s}, isPersited: ${t.isPersited}`),t.isPersited&&(s?this.rootStore.messageStore?.updateCatchedMessage(t):this.rootStore.messageStore?.insertMessage(t),this.rootStore.conversationStore?.updateCacheConversation(o(e[0]),{latestMessage:t,draft:""})),i?.(t)}}return e}))}monitorClearMessagesUnreadStatus(){return e.addMonitor(e.clearMessagesUnreadStatus,(async(e,t)=>{this._logger.info(u.S_CLEAR_MESSAGES_UNREAD_STATUS_T,JSON.stringify(e));const s=await t;this._logger.info(u.S_CLEAR_MESSAGES_UNREAD_STATUS_R,JSON.stringify(s));const i=e[0],r=o(i);this.rootStore.conversationStore?.updateCacheConversation(r,{unreadCount:0})}))}monitorRemoveConversation(){return e.addMonitor(e.removeConversation,(async(e,t)=>{this._logger.info(u.S_REMOVE_CONVERSATION_T,JSON.stringify(e));const s=await t;this._logger.info(u.S_REMOVE_CONVERSATION_R,JSON.stringify(s));const i=e[0],r=o(i);this.rootStore.conversationStore?.removeConversation(r)}))}monitorSetConversationNotificationLevel(){return e.addMonitor(e.setConversationNotificationLevel,(async(e,t)=>{this._logger.info(u.S_SET_CONVERSATION_NOTIFICATION_LEVEL_T,JSON.stringify(e));const s=await t;this._logger.info(u.S_SET_CONVERSATION_NOTIFICATION_LEVEL_R,JSON.stringify(s));const i=e[0],r=e[1],n=o(i);this.rootStore.conversationStore?.updateCacheConversation(n,{notificationLevel:r})}))}monitorSetConversationToTop(){return e.addMonitor(e.setConversationToTop,(async(e,t)=>{this._logger.info(u.S_SET_CONVERSATION_TO_TOP_T,JSON.stringify(e));const s=await t;this._logger.info(u.S_SET_CONVERSATION_TO_TOP_R,JSON.stringify(s));const i=e[0],r=e[1],n=o(i);this.rootStore.conversationStore?.updateCacheConversation(n,{isTop:r})}))}monitorRecallMessage(){return e.addMonitor(e.recallMessage,(async(t,s)=>{const{code:o,data:i}=await s;if(o===e.ErrorCode.SUCCESS&&i){const[e,s]=t;this._logger.info(u.S_RECALL_MESSAGE_T,JSON.stringify(t)),this.rootStore.messageStore?.removeCatchedMessage({...e,messageUId:s.messageUId,channelId:e.channelId||""}),this._logger.info(u.S_RECALL_MESSAGE_R,JSON.stringify(i)),this.rootStore.messageStore?.insertMessage(i,!1,!0)}}))}monitorDisconnect(){return e.addMonitor(e.disconnect,(async(e,t)=>{this.rootStore.conversationStore?.clearMemoryData(),this.rootStore.messageStore?.clearMemoryData()}))}}const y="1.0.0";class A{_context;_logger;_option;messageStore;conversationStore;appData;currentUserId="";connectStatus=s.observable.box(t.RCConnectionStatus.DISCONNECTED);constructor(t,s,o){this._context=t,this._logger=s,this._option=o,this.appData=new N(this._logger,this._option.hooks),e.addEventListener(e.Events.CONNECTED,this._onConnected),e.addEventListener(e.Events.DISCONNECT,this._onDisconnected),e.addEventListener(e.Events.SUSPEND,this._onSuspend),e.addEventListener(e.Events.CONNECTING,this._onConnecting),new R(this,this._logger).init(),this.messageStore=new T(this._logger,this,this._context),this.conversationStore=new M(this,this._logger),e.__addSDKVersion("imkit-store",y)}_onConnected=()=>{this.currentUserId=this._context.getCurrentId(),this.appData.getUserProfile(this.currentUserId),s.runInAction((()=>{this.connectStatus.set(t.RCConnectionStatus.CONNECTED)}))};_onDisconnected=()=>{s.runInAction((()=>{this.connectStatus.set(t.RCConnectionStatus.DISCONNECTED)}))};_onSuspend=()=>{s.runInAction((()=>{this.connectStatus.set(t.RCConnectionStatus.SUSPENDED)}))};_onConnecting=()=>{s.runInAction((()=>{this.connectStatus.set(t.RCConnectionStatus.CONNECTING)}))};destroy(){e.removeEventListener(e.Events.CONNECTED,this._onConnected),e.removeEventListener(e.Events.DISCONNECT,this._onDisconnected),e.removeEventListener(e.Events.SUSPEND,this._onSuspend),e.removeEventListener(e.Events.CONNECTING,this._onConnecting),this.clearMemoryData()}clearMemoryData(){this.conversationStore.clearMemoryData(),this.messageStore.clearMemoryData(),this.appData.clearMemoryData()}}const U={tag:"UIKitStore",verify:()=>!0,setup(e,t,s){const o=e.createLogger("UIKitStore","IM");return s.logLevel&&o.setOutputLevel(s.logLevel),o.warn(u.K_INIT_O,`Commit: d825b5aa3c607e2050a1c1fbd7443da2e1d79dbe, Version: ${y}`),new A(e,o,s)}};exports.AKitUploadRequest=class{uploadInfo;_abortStatus=!1;_requestData;constructor(e){this.uploadInfo=e}setRequestData(e){this._requestData=e}abort(){this._abortStatus=!0}isAbort(){return this._abortStatus}},exports.AppDataModule=N,exports.GroupMembersCache=v,exports.RCKitConversationStore=M,exports.RCKitMessageStore=T,exports.RCKitStore=A,exports.RCKitStoreInstaller=t=>e.installPlugin(U,t),exports.trans2ConversationKey=o;