jugglechat-websdk 1.6.5 → 1.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/index.js +6 -5
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- * JuggleChat.js v1.6.5
2
+ * JuggleChat.js v1.6.6
3
3
  * (c) 2022-2024 JuggleChat
4
4
  * Released under the MIT License.
5
5
  */const noop=()=>{},isObject=e=>"[object Object]"===Object.prototype.toString.call(e),isArray=e=>"[object Array]"===Object.prototype.toString.call(e),isFunction=e=>"[object Function]"===Object.prototype.toString.call(e),isString=e=>"[object String]"===Object.prototype.toString.call(e),isBoolean=e=>"[object Boolean]"===Object.prototype.toString.call(e),isUndefined=e=>"[object Undefined]"===Object.prototype.toString.call(e),isNull=e=>"[object Null]"===Object.prototype.toString.call(e),isNumber=e=>"[object Number]"===Object.prototype.toString.call(e),stringify=e=>JSON.stringify(e),parse=t=>{let n={};try{n=JSON.parse(t)}catch(s){n=t}return n},forEach=(e,t)=>{t=t||noop;isObject(e)&&(()=>{for(var n in e)t(e[n],n,e)})(),isArray(e)&&(()=>{for(var n=0,s=e.length;n<s;n++)t(e[n],n,e)})()},isEmpty=e=>{let t=!0;return isObject(e)&&forEach(e,()=>{t=!1}),(isString(e)||isArray(e))&&(t=0===e.length),isNumber(e)&&(t=-1===e),t},rename=(e,t)=>{var n=isObject(e);n&&(e=[e]),e=parse(stringify(e));var s=function(e,n,s){delete s[n],n=t[n],s[n]=e};return forEach(e,e=>{forEach(e,(e,n,o)=>{var i=(n in t);(i?s:noop)(e,n,o)})}),isObject?e[0]:e},extend=(e,t)=>(t=isArray(t)?t:[t],forEach(t,t=>{for(let n in t){let s=t[n];isUndefined(s)||(e[n]=s)}}),e),Defer=Promise,deferred=e=>new Defer(e),templateFormat=(e,t,n)=>{isArray(t)||(t=[t]);let s=[],o=t=>e.replace(n||/\\?\{([^}]+)\}/g,(e,n)=>"\\"===e.charAt(0)?e.slice(1):void 0===t[n]?"{"+n+"}":t[n]);for(let r=0,i=t.length;r<i;r++)s.push(o(t[r]));return s.join("")},isContain=(e,t)=>-1<e.indexOf(t),isEqual=(e,t)=>e===t,Cache$1=e=>{isObject(e)||(e={});let t=(t,n)=>{e[t]=n},n=t=>e[t],s=t=>{delete e[t]},o=()=>{let t=[];for(let n in e)t.push(n);return t},i=()=>{e={}};return{set:t,get:n,remove:s,getKeys:o,clear:i}},request=(e,t)=>deferred((n,s)=>{requestNormal(e,t,{success:n,fail:s})}),requestNormal=(e,t,n)=>{t=t||{},n=n||{success:noop,fail:noop,progress:noop};let s=new XMLHttpRequest,o=t.method||"GET";s.open(o,e,!0);let i=t.headers||{};forEach(i,(e,t)=>{s.setRequestHeader(t,e)});let r=t.body||{},a=()=>/^(200|202)$/.test(s.status),d=t.timeout;return d&&(s.timeout=d),s.onreadystatechange=function(){if(isEqual(s.readyState,4)){let{responseText:e}=s;e=e||"{}";let t=parse(e);if(a())n.success(t,s);else{let{status:e}=s,o={status:e,result:t};n.fail(o)}}},s.upload.onprogress=function(e){e.lengthComputable&&n.progress(e)},s.onerror=e=>{n.fail(e)},s.send(r),s},map=(e,t)=>e.map(t),filter=(e,t)=>e.filter(t),uniq=(e,t)=>{let n=[],s={};return e.forEach(e=>{let n=t(e);s[n.key]=n.value}),forEach(s,e=>{n.push(e)}),n},some=(e,t)=>e.some(t),toJSON=e=>JSON.stringify(e),toArray=e=>{let t=[];return forEach(e,(e,n)=>{t.push([n,e])}),t},isInclude=(e,t)=>-1<e.indexOf(t),clone$1=e=>JSON.parse(JSON.stringify(e));// 暂时支持 String
@@ -58,7 +58,7 @@ let o=Math.pow(2,s-1),i=t[s].name;n[i]=0!==(e&o)}return n}},registerMessage=e=>{
58
58
  utils.isEqual(p,MESSAGE_TYPE.CLEAR_UNREAD)&&o.isSender&&(u=0,o=s.latestMessage),(0>u||utils.isNull(u))&&(u=0),!m&&c.isCount&&(g=o.unreadIndex||0,u=g-E);let y=getDraftKey(s),T=Storage.get(y);T=utils.isEmpty(T)?"":T,utils.extend(s,{draft:T});let f=o.sentTime||s.sortTime;// 如果是自己发发送的群发消息不更新会话列表, 自己本地发送的消息通过 isMass 区分,接收或同步消息通过消息位计算
59
59
  o.isMass&&m&&(f=s.sortTime),s=utils.extend(s,{sortTime:f,unreadCount:u,latestUnreadIndex:g,latestReadIndex:E}),e.push(s)}),e=utils.quickSort(e,(e,t)=>e.sortTime>t.sortTime);let n=1e3;e.length>1000&&(e.length=1000)},o=()=>{t=!0},i=e=>{s(e)},r=t=>{let n=t,s=utils.find(e,({conversationType:e,conversationId:n,latestMessage:s={}})=>{let o=!0;// 删除会话指令中包含 time,用来判断是否是过期的删除指令
60
60
  return 0<t.time&&(o=t.time>=s.sentTime),o&&utils.isEqual(t.conversationType,e)&&utils.isEqual(t.conversationId,n)});if(!utils.isEqual(s,-1)){let t=e.splice(s,1);n=t[0]}return n},a=()=>{t=!1,e.length=0},d=t=>{let n=utils.find(e,({conversationType:e,conversationId:n})=>utils.isEqual(t.conversationType,e)&&utils.isEqual(t.conversationId,n));return utils.isEqual(n,-1)||utils.extend(e[n],t),e[n]||{}},p=(e,t={})=>{let n=[];return e=utils.isArray(e)?e:[e],utils.forEach(e,e=>{let s=l(e);if(!utils.isEmpty(s)){utils.extend(s,t),utils.isEmpty(t)&&utils.extend(s,e);let o=d(s);n.push(o)}else n.push(e)}),n},c=()=>e,l=t=>{let n=utils.find(e,({conversationType:e,conversationId:n})=>utils.isEqual(t.conversationType,e)&&utils.isEqual(t.conversationId,n));return e[n]||{}},m=()=>t,u=t=>{t=utils.isArray(t)?t:[t];let n=[];return utils.forEach(t,t=>{let s=utils.find(e,({conversationType:e,conversationId:n})=>utils.isEqual(t.conversationType,e)&&utils.isEqual(t.conversationId,n));-1<s&&(e[s].latestReadIndex=t.unreadIndex,e[s].unreadCount=0,e[s].mentions={},e[s].unreadTag=UNREAD_TAG.READ,n.push(e[s]))}),n};return{remove:r,update:s,clear:a,get:c,isSync:m,add:i,relpace:d,setSynced:o,modify:p,getPer:l,read:u,isExisted:n}}// 特性检查
61
- function checkUploadType(e){e=e||{};let t=UPLOAD_TYPE.NONE;return e.QiniuError&&(t=UPLOAD_TYPE.QINIU),e.urllib&&(t=UPLOAD_TYPE.ALI),t}function formatMediaMessage(e,t){let{name:n,content:s}=e;if(utils.isEqual(n,MESSAGE_TYPE.FILE)){let{file:n}=s,o=n.size/1e3;utils.extend(e.content,{size:o,url:t})}if(utils.isEqual(n,MESSAGE_TYPE.IMAGE)){let{height:n,width:o}=s,i="h";o>n&&(i="w");let r=`${t}&imageView2/2/${i}/100`;utils.extend(e.content,{url:t,thumbnail:r})}return utils.isInclude([MESSAGE_TYPE.VIDEO,MESSAGE_TYPE.VOICE],n)&&utils.extend(e.content,{url:t}),e}function uploadThumbnail(e,t,n){let{type:s,token:o,domain:i,file:r,url:a}=t,d=Uploder(e,{type:s});d.compress(r,(e,t)=>{let s={file:e},r={token:o,domain:i,url:a},p={onprogress:utils.noop,oncompleted:({url:e})=>{let s=null;n(s,e,t)},onerror:e=>{n(e)}};d.exec(s,r,p)},t)}function uploadFrame(e,t,n){let{type:s,token:o,domain:i,file:r,url:a}=t,d=Uploder(e,{type:s});d.capture(r,(e,t)=>{let s={file:e},r={token:o,domain:i,url:a},p={onprogress:utils.noop,oncompleted:({url:e})=>{let s=null;n(s,e,t)},onerror:e=>{n(e)}};d.exec(s,r,p)},t)}function getDraftKey(e){return`draft_${e.conversationType}_${e.conversationId}`}function formatUser(e){let t=utils.toObject(e.extFields);return{id:e.userId,name:e.nickname||"",portrait:e.userPortrait||"",updatedTime:e.updatedTime||0,exts:t||{}}}function toKVs(e){let t=[];return utils.forEach(e,(e,n)=>{t.push({key:n,value:e})}),t}function formatProvider(e,t){let n={};return utils.forEach(e,e=>{n[e]=function(){let n=[];for(let e=0;e<arguments.length;e++){let t=arguments[e],s={};s=utils.isArray(t)?t:clone(t),n.push(s)}let s=t[e];return s?s(...n):Promise.reject(ErrorType.SDK_FUNC_NOT_DEFINED)}}),n}function clone(e){let t=e=>{let n={};return utils.forEach(e,(e,s)=>{n[s]=utils.isObject(e)?t(e):utils.isArray(e)?utils.clone(e):e}),n},n=t(e);return n}function isDesktop(){return"undefined"!=typeof JGChatPCClient}function getSessionId(){return"s-xxxxxxxxxx".replace(/[xy]/g,function(e){let t=0|16*Math.random(),n="x"==e?t:8|3&t;return n.toString(16)})}function getTokenKey(e,t){return`${e}_${t}`}function genUId(){return"xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=0|16*Math.random(),n="x"==e?t:8|3&t;return n.toString(16)})}function getClientSession(){let e=sessionStorage.getItem(STORAGE.CLIENT_SESSION);return e||(e=genUId(),sessionStorage.setItem(STORAGE.CLIENT_SESSION,e)),e}function encrypto(e,t){let n=[];return e.forEach((e,s)=>{let o=s%8,i=e^t[o];n.push(i)}),new Uint8Array(n)}function decrypto(e,t){let n=[];return e.forEach((e,s)=>{let o=s%8,i=e^t[o];n.push(i)}),new Uint8Array(n)}function reportLogs({logger:e,params:t}){return e.report({...t})}var common={check,getNum,getTokenKey,getNaviStorageKey,initSyncTime,updateSyncTime,getError,ConversationUtils,checkUploadType,formatMediaMessage,uploadThumbnail,uploadFrame,getDraftKey,formatUser,toKVs,registerMessage,getMsgFlag,formatter,formatProvider,isDesktop,getSessionId,getClientSession,encrypto,decrypto,reportLogs};function getConnectBody({data:e}){let{appkey:t,token:n,deviceId:s,platform:o,clientSession:i}=e,r="jug9le1m",a=$root.lookup("codec.ConnectMsgBody"),d=a.create({appkey:t,token:n,platform:o,deviceId:s,clientSession:i,protoId:r}),p=a.encode(d).finish();return{buffer:p}}function getPublishBody({data:e,callback:t,index:n}){let{conversationId:s,conversationType:o,topic:i}=e,r=[];if(utils.isInclude([COMMAND_TOPICS.SEND_GROUP,COMMAND_TOPICS.SEND_PRIVATE,COMMAND_TOPICS.SEND_CHATROOM],i)){let{name:t,content:n,mentionInfo:s,flag:o,mergeMsg:i,referMsg:a}=e;n=utils.toJSON(n);let d=$root.lookup("codec.UpMsg"),p={};if(s){let{members:t=[],type:e}=s;t=utils.map(t,e=>({userId:e.id})),utils.extend(p,{mentionType:e,targetUsers:t})}if(!utils.isEmpty(a)){let{messageIndex:e,sentTime:t,messageId:n,sender:s={exts:{}}}=a,o=utils.toJSON(a.content);// let referTarget = {
61
+ function checkUploadType(e){e=e||{};let t=UPLOAD_TYPE.NONE;return e.QiniuError&&(t=UPLOAD_TYPE.QINIU),e.urllib&&(t=UPLOAD_TYPE.ALI),t}function formatMediaMessage(e,t){let{name:n,content:s}=e;if(utils.isEqual(n,MESSAGE_TYPE.FILE)){let{file:n}=s,o=n.size/1e3;utils.extend(e.content,{size:o,url:t})}if(utils.isEqual(n,MESSAGE_TYPE.IMAGE)){let{height:n,width:o}=s,i="h";o>n&&(i="w");let r=`${t}&imageView2/2/${i}/100`;utils.extend(e.content,{url:t,thumbnail:r})}return utils.isInclude([MESSAGE_TYPE.VIDEO,MESSAGE_TYPE.VOICE],n)&&utils.extend(e.content,{url:t}),e}function uploadThumbnail(e,t,n){let{type:s,token:o,domain:i,file:r,url:a}=t,d=Uploder(e,{type:s});d.compress(r,(e,t)=>{let s={file:e},r={token:o,domain:i,url:a},p={onprogress:utils.noop,oncompleted:({url:e})=>{let s=null;n(s,e,t)},onerror:e=>{n(e)}};d.exec(s,r,p)},t)}function uploadFrame(e,t,n){let{type:s,token:o,domain:i,file:r,url:a}=t,d=Uploder(e,{type:s});d.capture(r,(e,t)=>{let s={file:e},r={token:o,domain:i,url:a},p={onprogress:utils.noop,oncompleted:({url:e})=>{let s=null;n(s,e,t)},onerror:e=>{n(e)}};d.exec(s,r,p)},t)}function getDraftKey(e){return`draft_${e.conversationType}_${e.conversationId}`}function formatUser(e){let t=utils.toObject(e.extFields);return{id:e.userId,name:e.nickname||"",portrait:e.userPortrait||"",updatedTime:e.updatedTime||0,exts:t||{}}}function toKVs(e){let t=[];return utils.forEach(e,(e,n)=>{t.push({key:n,value:e})}),t}function formatProvider(e,t){let n={};return utils.forEach(e,e=>{n[e]=function(){let n=[];for(let e=0;e<arguments.length;e++){let t=arguments[e],s={};s=utils.isArray(t)?t:clone(t),n.push(s)}let s=t[e];return s?s(...n):Promise.reject(ErrorType.SDK_FUNC_NOT_DEFINED)}}),n}function clone(e){let t=e=>{let n={};return utils.forEach(e,(e,s)=>{n[s]=utils.isObject(e)?t(e):utils.isArray(e)?utils.clone(e):e}),n},n=t(e);return n}function isDesktop(){return"undefined"!=typeof JGChatPCClient}function getSessionId(){return"s-xxxxxxxxxx".replace(/[xy]/g,function(e){let t=0|16*Math.random(),n="x"==e?t:8|3&t;return n.toString(16)})}function getTokenKey(e,t){return`${e}_${t}`}function genUId(){return"xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=0|16*Math.random(),n="x"==e?t:8|3&t;return n.toString(16)})}function getClientSession(){let e=sessionStorage.getItem(STORAGE.CLIENT_SESSION);return e||(e=genUId(),sessionStorage.setItem(STORAGE.CLIENT_SESSION,e)),e}function encrypto(e,t){let n=[];return e.forEach((e,s)=>{let o=s%8,i=e^t[o];n.push(i)}),new Uint8Array(n)}function decrypto(e,t){let n=[];return e.forEach((e,s)=>{let o=s%8,i=e^t[o];n.push(i)}),new Uint8Array(n)}function reportLogs({logger:e,params:t}){return e.report({...t})}var common={check,getNum,getTokenKey,getNaviStorageKey,initSyncTime,updateSyncTime,getError,ConversationUtils,checkUploadType,formatMediaMessage,uploadThumbnail,uploadFrame,getDraftKey,formatUser,toKVs,registerMessage,getMsgFlag,formatter,formatProvider,isDesktop,getSessionId,getClientSession,encrypto,decrypto,reportLogs};function getConnectBody({data:e}){let{appkey:t,token:n,deviceId:s,platform:o,clientSession:i,sdkVersion:r}=e,a="jug9le1m",d=$root.lookup("codec.ConnectMsgBody"),p=d.create({appkey:t,token:n,platform:o,deviceId:s,clientSession:i,protoId:a,sdkVersion:r}),c=d.encode(p).finish();return{buffer:c}}function getPublishBody({data:e,callback:t,index:n}){let{conversationId:s,conversationType:o,topic:i}=e,r=[];if(utils.isInclude([COMMAND_TOPICS.SEND_GROUP,COMMAND_TOPICS.SEND_PRIVATE,COMMAND_TOPICS.SEND_CHATROOM],i)){let{name:t,content:n,mentionInfo:s,flag:o,mergeMsg:i,referMsg:a}=e;n=utils.toJSON(n);let d=$root.lookup("codec.UpMsg"),p={};if(s){let{members:t=[],mentionType:e}=s;t=utils.map(t,e=>({userId:e.id})),utils.extend(p,{mentionType:e,targetUsers:t})}if(!utils.isEmpty(a)){let{messageIndex:e,sentTime:t,messageId:n,sender:s={exts:{}}}=a,o=utils.toJSON(a.content);// let referTarget = {
62
62
  // userId: sender.id,
63
63
  // nickname: sender.name,
64
64
  // userPortrait: sender.portrait,
@@ -73,11 +73,11 @@ utils.isEmpty(l)||Storage.setPrefix(`${d}_${l}`);let m=common.getNaviStorageKey(
73
73
  utils.isEmpty(u)||(Storage.set(c,E),Storage.setPrefix(`${d}_${E}`),m=common.getNaviStorageKey(),Storage.set(m,g),o.info({tag:LOG_MODULE.NAV_REQEST,remote:g})),n(g),s()}},fail:function(t){a.push(t),utils.isEqual(a.length,e.length)&&n(t.result)}});i.push(g)}):(o.info({tag:LOG_MODULE.NAV_REQEST,local:u}),n(u))};var Network={detect,getNavis};function Consumer(){let e=[],t=!1,n=(t,n)=>n?e.unshift(t):void e.push(t),s=n=>{// 如果正在执行,终止本次任务,执行任务结束后自动消费队列 ntf, 1 是首次,所以判断大于 1
74
74
  let o=1<e.length;if(o)return;// 队列消费结束,标志完成,此处先判断是否完成,再截取数组,避免数组长度为 1 时,最后一次被丢弃
75
75
  t=utils.isEqual(e.length,0);let i=e.shift(),r={item:i},a=()=>{s(n)};t||n(r,a)};return{consume:s,produce:n}}let chatroomCacher=Cache();var chatroomCacher$1={set:(e,t)=>{let n=chatroomCacher.get(e),{msgs:s=[]}=t;200<=s.length&&(s.shift(0),t=utils.extend(t,{msgs:s})),n=utils.extend(n,t),chatroomCacher.set(e,n)},get:e=>{let t=chatroomCacher.get(e);return t},remove:e=>{chatroomCacher.remove(e)},getAll:()=>chatroomCacher.getAll()};function Syncer(e,t,n,{logger:s}){let o=Consumer(),i=i=>{function r(s,o){let{msg:i}=s,r=common.updateSyncTime({...i,io:n});if(r){let{msgIndex:n,ackIndex:s}=i,o={msgIndex:n,ackIndex:s};e(SIGNAL_CMD.PUBLISH_ACK,o),t.emit(SIGNAL_NAME.CMD_RECEIVED,i)}o()}function a(e,t){s.info({tag:LOG_MODULE.MSG_SYNC,...e});let{msg:n}=e,o=chatroomCacher$1.get(n.targetId),{isJoined:i}=o;utils.isEqual(n.type,NOTIFY_TYPE.MSG)?l(e,t):utils.isEqual(n.type,NOTIFY_TYPE.CHATROOM)?i&&c(e,t):utils.isEqual(n.type,NOTIFY_TYPE.CHATROOM_ATTR)?i&&p(e,t):utils.isEqual(n.type,NOTIFY_TYPE.CHATROOM_DESTORY)?i&&d(e,t):t()}function d(e,n){let{msg:s}=e,o=s.targetId;t.emit(SIGNAL_NAME.CMD_CHATROOM_DESTROY,{id:o}),n()}function p(n,o){let{msg:i}=n,r=i.targetId,a=g(r);if(a>=i.receiveTime&&0<i.receiveTime)return o();let d={syncTime:a,chatroomId:r,targetId:r,topic:COMMAND_TOPICS.SYNC_CHATROOM_ATTRS};e(SIGNAL_CMD.QUERY,d,e=>{let{code:n,attrs:r,chatroomId:a}=e;return s.info({tag:LOG_MODULE.MSG_SYNC,data:d,msg:i,code:n,count:r.length}),utils.isEqual(n,ErrorType.COMMAND_SUCCESS.code)?void(utils.forEach(r,e=>{y(a,e.updateTime)}),t.emit(SIGNAL_NAME.CMD_CHATROOM_ATTR_RECEIVED,{attrs:r,chatroomId:a}),o()):o()})}function c(n,o){let{msg:i}=n,r=i.targetId,a=u(r);if(a>=i.receiveTime&&0<i.receiveTime)return s.info({tag:LOG_MODULE.MSG_SYNC,syncTime:a,msg:i}),o();let d={syncTime:a,chatroomId:r,topic:COMMAND_TOPICS.SYNC_CHATROOM_MESSAGES};e(SIGNAL_CMD.QUERY,d,({messages:e,code:n})=>{if(s.info({tag:LOG_MODULE.MSG_SYNC,data:d,msg:i,code:n,count:e.length}),!utils.isEqual(n,ErrorType.COMMAND_SUCCESS.code))return o();let{msgs:a=[]}=chatroomCacher$1.get(r);utils.forEach(e,e=>{E(e.conversationId,e.sentTime);let{messageId:n}=e,s=utils.isInclude(a,n);s||(a.push(n),t.emit(SIGNAL_NAME.CMD_RECEIVED,[e]))}),chatroomCacher$1.set(r,{msgs:a}),o()})}function l(i,r){let{user:a,msg:d,name:p}=i,c=Storage.get(STORAGE.SYNC_RECEIVED_MSG_TIME).time||1700927161470,l=Storage.get(STORAGE.SYNC_SENT_MSG_TIME).time||1700927161470;// 如果本地记录时间戳大于 ntf 中的接收时间,认为消息已被当前端接收过,不再执行拉取动作
76
- if(c>=d.receiveTime)return s.info({tag:LOG_MODULE.MSG_SYNC,syncReceiveTime:c,msg:d}),r();let m={userId:a.id,syncTime:c,containsSendBox:!0,sendBoxSyncTime:l,topic:COMMAND_TOPICS.SYNC_MESSAGES};e(SIGNAL_CMD.QUERY,m,({isFinished:e,messages:a,code:p})=>{if(s.info({tag:LOG_MODULE.MSG_SYNC,data:m,msg:d,code:p,count:a.length}),!utils.isEqual(p,ErrorType.COMMAND_SUCCESS.code))return r();utils.forEach(a,(s,o)=>{let i=common.updateSyncTime({...s,io:n});if(i){let n=e&&utils.isEqual(a.length-1,o);t.emit(SIGNAL_NAME.CMD_RECEIVED,[s,n])}});let c=!e;c&&o.produce(i,c),r()})}function m(n,i){let{user:r,name:a,time:d,$conversation:p}=n,c=Storage.get(STORAGE.SYNC_CONVERSATION_TIME).time||0;if(c>d)return void s.info({tag:LOG_MODULE.CONV_SYNC,syncTime:c,time:d});let l={userId:r.id,syncTime:c,topic:COMMAND_TOPICS.SYNC_CONVERSATIONS,count:200};e(SIGNAL_CMD.QUERY,l,e=>{let{isFinished:r,conversations:a,code:d}=e;if(s.info({tag:LOG_MODULE.CONV_SYNC,data:l,code:d,count:a.length}),!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),i();let m=a.length,u=a[m-1]||{syncTime:0},{syncTime:E}=u;E>c&&(Storage.set(STORAGE.SYNC_CONVERSATION_TIME,{time:E}),n=utils.extend(n,{time:E})),a=utils.clone(a),p._batchInsertConversations({conversations:a,syncTime:E}).then(e=>{t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATIONS_PROGRESS,e);let s=!r;s?o.produce(n,s):t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),i()})})}function u(e){let t=chatroomCacher$1.get(e);return t.syncMsgTime||0}function E(e,t){let n=u(e);t>n&&chatroomCacher$1.set(e,{syncMsgTime:t})}function g(e){let t=chatroomCacher$1.get(e);return t.syncAttTime||0}function y(e,t){let n=g(e);t>n&&chatroomCacher$1.set(e,{syncAttTime:t})}o.produce(i),o.consume(({item:e},t)=>{let{name:n}=e;utils.isEqual(n,SIGNAL_NAME.CMD_RECEIVED)&&r(e,t),utils.isEqual(n,SIGNAL_NAME.S_NTF)&&a(e,t),utils.isEqual(n,SIGNAL_NAME.S_SYNC_CONVERSATION_NTF)&&m(e,t)})};return{exec:i}}function Timer(e={}){let t={timeout:60000};utils.extend(t,e);let{timeout:n}=t,s=0,o=utils.noop,i=e=>{o=e,s=setInterval(()=>{o()},n)},r=()=>{clearInterval(s)},a=()=>{r(),i(o)};return{resume:i,pause:r,reset:a}}function Counter(e={}){let t={timeout:10000};utils.extend(t,e);let{timeout:n}=t,s=0,o=e=>{s=setTimeout(()=>{e(t)},n)},i=()=>{clearTimeout(s)};return{start:o,clear:i}}let VERSION="1.6.5";/*
76
+ if(c>=d.receiveTime)return s.info({tag:LOG_MODULE.MSG_SYNC,syncReceiveTime:c,msg:d}),r();let m={userId:a.id,syncTime:c,containsSendBox:!0,sendBoxSyncTime:l,topic:COMMAND_TOPICS.SYNC_MESSAGES};e(SIGNAL_CMD.QUERY,m,({isFinished:e,messages:a,code:p})=>{if(s.info({tag:LOG_MODULE.MSG_SYNC,data:m,msg:d,code:p,count:a.length}),!utils.isEqual(p,ErrorType.COMMAND_SUCCESS.code))return r();utils.forEach(a,(s,o)=>{let i=common.updateSyncTime({...s,io:n});if(i){let n=e&&utils.isEqual(a.length-1,o);t.emit(SIGNAL_NAME.CMD_RECEIVED,[s,n])}});let c=!e;c&&o.produce(i,c),r()})}function m(n,i){let{user:r,name:a,time:d,$conversation:p}=n,c=Storage.get(STORAGE.SYNC_CONVERSATION_TIME).time||0;if(c>d)return void s.info({tag:LOG_MODULE.CONV_SYNC,syncTime:c,time:d});let l={userId:r.id,syncTime:c,topic:COMMAND_TOPICS.SYNC_CONVERSATIONS,count:200};e(SIGNAL_CMD.QUERY,l,e=>{let{isFinished:r,conversations:a,code:d}=e;if(s.info({tag:LOG_MODULE.CONV_SYNC,data:l,code:d,count:a.length}),!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),i();let m=a.length,u=a[m-1]||{syncTime:0},{syncTime:E}=u;E>c&&(Storage.set(STORAGE.SYNC_CONVERSATION_TIME,{time:E}),n=utils.extend(n,{time:E})),a=utils.clone(a),p._batchInsertConversations({conversations:a,syncTime:E}).then(e=>{t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATIONS_PROGRESS,e);let s=!r;s?o.produce(n,s):t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),i()})})}function u(e){let t=chatroomCacher$1.get(e);return t.syncMsgTime||0}function E(e,t){let n=u(e);t>n&&chatroomCacher$1.set(e,{syncMsgTime:t})}function g(e){let t=chatroomCacher$1.get(e);return t.syncAttTime||0}function y(e,t){let n=g(e);t>n&&chatroomCacher$1.set(e,{syncAttTime:t})}o.produce(i),o.consume(({item:e},t)=>{let{name:n}=e;utils.isEqual(n,SIGNAL_NAME.CMD_RECEIVED)&&r(e,t),utils.isEqual(n,SIGNAL_NAME.S_NTF)&&a(e,t),utils.isEqual(n,SIGNAL_NAME.S_SYNC_CONVERSATION_NTF)&&m(e,t)})};return{exec:i}}function Timer(e={}){let t={timeout:60000};utils.extend(t,e);let{timeout:n}=t,s=0,o=utils.noop,i=e=>{o=e,s=setInterval(()=>{o()},n)},r=()=>{clearInterval(s)},a=()=>{r(),i(o)};return{resume:i,pause:r,reset:a}}function Counter(e={}){let t={timeout:10000};utils.extend(t,e);let{timeout:n}=t,s=0,o=e=>{s=setTimeout(()=>{e(t)},n)},i=()=>{clearTimeout(s)};return{start:o,clear:i}}let VERSION="1.6.6";/*
77
77
  fileCompressLimit: 图片缩略图压缩限制,小于设置数值将不执行压缩,单位 KB
78
78
  config = { appkey, nav, isSync, upload, uploadType, fileCompressLimit }
79
79
  */function IO(e){function t(){return A}function n(){return e}function s(t){utils.extend(e,t)}function o(e,t){let n={topic:COMMAND_TOPICS.GET_USER_INFO,userId:e.id};x(SIGNAL_CMD.QUERY,n,e=>{t(e)})}let i=Emitter(),{appkey:r,navList:a,serverList:p=[],isSync:c=!0,reconnectCount:l=100,logger:d}=e;utils.isArray(a)||(a=["https://nav.juggleim.com"]);let m={},u={},E=Cache(),g=Decoder(E,u),y=Encoder(E),T=Timer({timeout:HEART_TIMEOUT}),f=Timer({timeout:SYNC_MESSAGE_TIME}),C=CONNECT_STATE.DISCONNECTED,_=[ErrorType.CONNECT_APPKEY_IS_REQUIRE.code,ErrorType.CONNECT_TOKEN_NOT_EXISTS.code,ErrorType.CONNECT_APPKEY_NOT_EXISTS.code,ErrorType.CONNECT_TOKEN_ILLEGAL.code,ErrorType.CONNECT_TOKEN_UNAUTHORIZED.code,ErrorType.CONNECT_TOKEN_EXPIRE.code,ErrorType.CONNECT_APP_BLOCKED.code,ErrorType.CONNECT_USER_BLOCKED.code,ErrorType.CONNECT_USER_KICKED.code,ErrorType.CONNECT_USER_LOGOUT.code],S=e=>{C=e.state,i.emit(SIGNAL_NAME.CONN_CHANGED,{...e})},O=()=>{T.pause(),f.pause()},I=!1,N=(e={})=>{let{code:n}=e;if(!I&&!utils.isInclude(_,n)&&!utils.isEqual(C,CONNECT_STATE.DISCONNECTED)){let e=t();return O(),v(e,({next:e})=>{e()})}if(!utils.isEqual(C,CONNECT_STATE.DISCONNECTED)){let n=t();S({state:CONNECT_STATE.DISCONNECTED,...e,user:n}),O()}},A={},R=e=>{utils.extend(A,e)},M=e=>{let t=common.getNaviStorageKey(r,e);Storage.remove(t)},h=({token:e,deviceId:t,_isReconnect:n=!1},s)=>{function o({servers:n,userId:o}){R({id:o,token:e,deviceId:t}),E.set(SIGNAL_NAME.S_CONNECT_ACK,s),Network.detect(n,(n,i)=>{// 如果嗅探失败,返回连接断开,同时清理已缓存的 CMP 地址
80
- if(i)return M(o),v({token:e,userId:o,deviceId:t},s);n=n.replaceAll(/http:\/\/|https:\/\/|file:\/\/|wss:\/\/|ws:\/\//g,"");let{ws:a}=utils.getProtocol(),p=`${a}//${n}/im`;m=new WebSocket(p),d.info({tag:LOG_MODULE.WS_CONNECT}),m.onopen=function(){let n=PLATFORM.WEB;common.isDesktop()&&(n=PLATFORM.DESKTOP);let s=common.getClientSession();x(SIGNAL_CMD.CONNECT,{appkey:r,token:e,deviceId:t,platform:n,clientSession:s})},m.onclose=t=>{N({type:DISCONNECT_TYPE.CLOSE})},m.onerror=()=>{N({type:DISCONNECT_TYPE.ERROR})},m.onmessage=function({data:e}){let t=new FileReader;t.onload=function(){G(this.result)},t.readAsArrayBuffer(e)}})}E.set(STORAGE.CRYPTO_RANDOM,utils.getRandoms(8));let i=n?CONNECT_STATE.RECONNECTING:CONNECT_STATE.CONNECTING;return S({state:i}),utils.isEmpty(p)?Network.getNavis(a,{appkey:r,token:e,logger:d},e=>{let{code:t,servers:n,userId:i}=e;if(!utils.isEqual(t,ErrorType.COMMAND_SUCCESS.code)){let e=common.getError(t);return M(i),t||(e=ErrorType.IM_SERVER_CONNECT_ERROR),S({state:CONNECT_STATE.DISCONNECTED,code:e.code}),s({error:e})}o({servers:n,userId:i})}):o({servers:p})},v=({token:e,userId:t,deviceId:n},s)=>{d.info({tag:LOG_MODULE.CON_RECONNECT,userId:t,deviceId:n});let o=E.get(CONNECT_TOOL.RECONNECT_COUNT),r=o.count||1,a=r>l;if(a)return E.remove(CONNECT_TOOL.RECONNECT_COUNT),E.remove(CONNECT_TOOL.RECONNECT_FREQUENCY),S({state:CONNECT_STATE.DISCONNECTED,code:ErrorType.IM_SERVER_CONNECT_ERROR.code});let p=E.get(CONNECT_TOOL.RECONNECT_FREQUENCY),c=p.frequency||1,m=1e3*c;setTimeout(()=>{r+=1,E.set(CONNECT_TOOL.RECONNECT_COUNT,{count:r}),c*=2,E.set(CONNECT_TOOL.RECONNECT_FREQUENCY,{frequency:c}),h({token:e,userId:t,deviceId:n,_isReconnect:!0},e=>{let{error:t}=e;utils.isEqual(t.code,ErrorType.COMMAND_SUCCESS.code)&&i.emit(SIGNAL_NAME.CMD_CHATROOM_REJOIN,{}),s(e)})},m)},D=[],b=()=>{m&&m.close&&m.close(),T.pause(),f.pause(),D.length=0},U=()=>{I=!0,b()},x=(e,t,n)=>{n=n||utils.noop;let s=common.getNum();utils.isEqual(e,SIGNAL_CMD.CONNECT)&&(s=CONNECT_ACK_INDEX),utils.isEqual(e,SIGNAL_CMD.PING)&&(s=PONG_INDEX);let o=Counter({cmd:e}),i=y.encode(e,{callback:n,data:t,index:s,counter:o});m.send(i),d.info({tag:LOG_MODULE.WS_SEND,cmd:e,...t}),utils.isEqual(SIGNAL_CMD.PUBLISH_ACK,e)||o.start(({cmd:e})=>utils.isEqual(e,SIGNAL_CMD.PING)&&3>D.length?D.push({cmd:e}):void(n(ErrorType.COMMAND_FAILED),b()))},k=Syncer(x,i,u,{logger:d}),G=t=>{let{cmd:n,result:s,name:a}=g.decode(t);d.info({tag:LOG_MODULE.WS_RECEIVE,cmd:n,code:s.code});let{index:p}=s,{callback:l,data:m,counter:y}=E.get(p);// 清空计时器,与 counter.start 对应
80
+ if(i)return M(o),v({token:e,userId:o,deviceId:t},s);n=n.replaceAll(/http:\/\/|https:\/\/|file:\/\/|wss:\/\/|ws:\/\//g,"");let{ws:a}=utils.getProtocol(),p=`${a}//${n}/im`;m=new WebSocket(p),d.info({tag:LOG_MODULE.WS_CONNECT}),m.onopen=function(){let n=PLATFORM.WEB;common.isDesktop()&&(n=PLATFORM.DESKTOP);let s=common.getClientSession();x(SIGNAL_CMD.CONNECT,{appkey:r,token:e,deviceId:t,platform:n,clientSession:s,sdkVerion:VERSION})},m.onclose=t=>{N({type:DISCONNECT_TYPE.CLOSE})},m.onerror=()=>{N({type:DISCONNECT_TYPE.ERROR})},m.onmessage=function({data:e}){let t=new FileReader;t.onload=function(){G(this.result)},t.readAsArrayBuffer(e)}})}E.set(STORAGE.CRYPTO_RANDOM,utils.getRandoms(8));let i=n?CONNECT_STATE.RECONNECTING:CONNECT_STATE.CONNECTING;return S({state:i}),utils.isEmpty(p)?Network.getNavis(a,{appkey:r,token:e,logger:d},e=>{let{code:t,servers:n,userId:i}=e;if(!utils.isEqual(t,ErrorType.COMMAND_SUCCESS.code)){let e=common.getError(t);return M(i),t||(e=ErrorType.IM_SERVER_CONNECT_ERROR),S({state:CONNECT_STATE.DISCONNECTED,code:e.code}),s({error:e})}o({servers:n,userId:i})}):o({servers:p})},v=({token:e,userId:t,deviceId:n},s)=>{d.info({tag:LOG_MODULE.CON_RECONNECT,userId:t,deviceId:n});let o=E.get(CONNECT_TOOL.RECONNECT_COUNT),r=o.count||1,a=r>l;if(a)return E.remove(CONNECT_TOOL.RECONNECT_COUNT),E.remove(CONNECT_TOOL.RECONNECT_FREQUENCY),S({state:CONNECT_STATE.DISCONNECTED,code:ErrorType.IM_SERVER_CONNECT_ERROR.code});let p=E.get(CONNECT_TOOL.RECONNECT_FREQUENCY),c=p.frequency||1,m=1e3*c;setTimeout(()=>{r+=1,E.set(CONNECT_TOOL.RECONNECT_COUNT,{count:r}),c*=2,E.set(CONNECT_TOOL.RECONNECT_FREQUENCY,{frequency:c}),h({token:e,userId:t,deviceId:n,_isReconnect:!0},e=>{let{error:t}=e;utils.isEqual(t.code,ErrorType.COMMAND_SUCCESS.code)&&i.emit(SIGNAL_NAME.CMD_CHATROOM_REJOIN,{}),s(e)})},m)},D=[],b=()=>{m&&m.close&&m.close(),T.pause(),f.pause(),D.length=0},U=()=>{I=!0,b()},x=(e,t,n)=>{n=n||utils.noop;let s=common.getNum();utils.isEqual(e,SIGNAL_CMD.CONNECT)&&(s=CONNECT_ACK_INDEX),utils.isEqual(e,SIGNAL_CMD.PING)&&(s=PONG_INDEX);let o=Counter({cmd:e}),i=y.encode(e,{callback:n,data:t,index:s,counter:o});m.send(i),d.info({tag:LOG_MODULE.WS_SEND,cmd:e,...t}),utils.isEqual(SIGNAL_CMD.PUBLISH_ACK,e)||o.start(({cmd:e})=>utils.isEqual(e,SIGNAL_CMD.PING)&&3>D.length?D.push({cmd:e}):void(n(ErrorType.COMMAND_FAILED),b()))},k=Syncer(x,i,u,{logger:d}),G=t=>{let{cmd:n,result:s,name:a}=g.decode(t);d.info({tag:LOG_MODULE.WS_RECEIVE,cmd:n,code:s.code});let{index:p}=s,{callback:l,data:m,counter:y}=E.get(p);// 清空计时器,与 counter.start 对应
81
81
  if(y&&(y.clear(),D.length=0),utils.isEqual(a,SIGNAL_NAME.S_CHATROOM_USER_NTF)){let{chatroomId:e,time:t,type:n}=s;i.emit(SIGNAL_NAME.CMD_CHATROOM_EVENT,{chatroomId:e,time:t,type:n})}if((utils.isEqual(a,SIGNAL_NAME.S_NTF)||utils.isEqual(a,SIGNAL_NAME.CMD_RECEIVED))&&(k.exec({msg:s,name:a,user:{id:A.id}}),f.reset()),utils.isEqual(n,SIGNAL_CMD.PUBLISH_ACK)){utils.extend(m,s);let{conversationType:e}=m;// 单群聊和聊天室通知和拉取消息时间戳分开计算,只有发送单群聊消息更新发件箱
82
82
  utils.isEqual(e,CONVERATION_TYPE.CHATROOM)||common.updateSyncTime({...m,io:u}),l(m)}if(utils.isEqual(n,SIGNAL_CMD.QUERY_ACK)&&l(s),utils.isEqual(n,SIGNAL_CMD.CONNECT_ACK)){I=!1;let t=E.get(SIGNAL_NAME.S_CONNECT_ACK)||utils.noop,{ack:{code:n,userId:i}}=s,a=CONNECT_STATE.CONNECT_FAILED,p=common.getError(n);if(utils.isEqual(n,ErrorType.CONNECT_SUCCESS.code))return a=CONNECT_STATE.CONNECTED,R({id:i}),Storage.setPrefix(`${r}_${i}`),E.remove(CONNECT_TOOL.RECONNECT_FREQUENCY),o({id:i},({user:n})=>{n=n||{};let s=n.nickname,o=n.userPortrait,l=utils.toObject(n.extFields);// 同步会话和同步消息顺序不能调整,保证先同步会话再同步消息,规避会话列表最后一条消息不是最新的
83
83
  if(R({name:s,portrait:o,exts:l,updatedTime:n.updatedTime}),t({user:A,error:p,next:()=>{S({state:a,user:A})}}),e.isPC){let t=()=>{k.exec({time:Storage.get(STORAGE.SYNC_CONVERSATION_TIME).time||0,name:SIGNAL_NAME.S_SYNC_CONVERSATION_NTF,user:{id:A.id},$conversation:e.$conversation})},n=Storage.get(STORAGE.SYNC_CONVERSATION_TIME).time||0;// PC 中先连接后打开数据库,优先将本地数据库中的同步时间更新至 LocalStorage 中,避免换 Token 不换用户 Id 重复同步会话
@@ -152,7 +152,8 @@ let{snapshotUrl:t}=u;if(t)return o(e,n);common.uploadFrame(r,s,(t,s,i)=>{let{hei
152
152
  let chatroom = {
153
153
  id: 'chatroomId',
154
154
  };
155
- */return{joinChatroom:i,quitChatroom:r,setChatroomAttributes:a,getChatroomAttributes:p,removeChatroomAttributes:d,getAllChatRoomAttributes:c}}let init$2=({io:e,emitter:t,logger:n})=>{let s=Socket$1(e,t,n),o=Conversation$1(e,t),i=Message$1(e,t,n),r=Chatroom$1(e,t,n);return e.setConfig({logger:n}),{socket:s,conversation:o,message:i,chatroom:r}};var Web={init:init$2};let isGroup=e=>utils.isEqual(CONVERATION_TYPE.GROUP,e),formatMsg=({message:e,senders:t,groups:n})=>{let{content:p="{}",senderId:s,conversationType:o,conversationId:i,mentionInfo:c="{}",isRead:r,isSender:a,isUpdated:d,referMsg:l="{}",mergeMsg:m="{}",attribute:u=""}=e;p=utils.parse(p),c=utils.parse(c);let E=utils.filter(t,e=>utils.isEqual(e.id,s))[0]||{},g={};return g=isGroup(o)?utils.filter(n,e=>utils.isEqual(e.id,i))[0]||{}:utils.filter(t,e=>utils.isEqual(e.id,i))[0]||{},e=utils.extend(e,{mergeMsg:utils.parse(m),referMsg:utils.parse(l),conversationTitle:g.name,conversationPortrait:g.portrait,conversationExts:g.exts,content:p,sender:E,mentionInfo:c,sentTime:+e.sentTime,isRead:!!r,isSender:!!a,isUpdated:!!d,attribute:u}),e},formatMsgs=({messages:e,senders:t,groups:n})=>{let s=utils.map(e,e=>{let s=formatMsg({message:e,senders:t,groups:n});return s});return s},formatConversation=({conversation:e,users:t,groups:n})=>{if(utils.isEmpty(e))return e;let{id:s,type:o,draft:i,unreadCount:r,isTop:a,undisturbType:d,sortTime:p,mentions:c,latestMessageTid:l,latestMessageId:m,latestMessageName:u,latestMessageIsSender:E,latestMessageIsUpdated:g,latestMessageSentTime:y,latestMessageSenderId:T,latestMessageContent:f,latestMessageMessageIndex:C,latestMessageIsRead:_,latestMessageIsMass:S,latestUnreadCount:O,latestReadCount:I,latestReadIndex:N,latestUnreadIndex:A,latestMentionInfo:R,unreadTag:M}=e;c=c||"{}";let h=utils.filter(t,e=>utils.isEqual(e.id,T))[0]||{id:T},v={};v=isGroup(o)?utils.filter(n,e=>utils.isEqual(e.id,s))[0]||{id:s}:utils.filter(t,e=>utils.isEqual(e.id,s))[0]||{id:s},r=0<r?r:0;let D={conversationId:s,conversationType:o,conversationPortrait:v.portrait,conversationTitle:v.name,conversationExts:v.exts,draft:i||"",isTop:!!a,undisturbType:d,latestReadIndex:+N,latestUnreadIndex:+A,latestMessage:{conversationId:s,conversationType:o,conversationPortrait:v.portrait,conversationTitle:v.name,conversationExts:v.exts,content:utils.parse(f),isRead:!!_,isSender:!!E,isUpdated:!!g,isMass:!!S,messageId:m,tid:l,mentionInfo:utils.parse(R),messageIndex:C,name:u,readCount:+(I||0),unreadCount:+(O||0),sentTime:+y,referMsg:{},sender:h},sortTime:+p||0,unreadCount:r||0,mentions:utils.parse(c),unreadTag:M||UNREAD_TAG.READ};return utils.isEmpty(m)&&(D.latestMessage={}),D},formatConversations=({conversations:e,users:t,groups:n})=>{let s=utils.map(e,e=>{let s=formatConversation({conversation:e,users:t,groups:n});return s});return s},createMentions=(e,t,n)=>{let{mentionInfo:s}=t;if(utils.isEmpty(s))return e;let{members:o,type:i}=s,r=utils.find(o,e=>utils.isEqual(n.id,e.id));if(-1<r||utils.isEqual(i,MENTION_TYPE.ALL)){let{isMentioned:n=!0,senders:s=[],msgs:o=[]}=e;o.push({senderId:t.sender.id,messageId:t.messageId,sentTime:t.sentTime});let i=utils.find(s,e=>utils.isEqual(t.sender.id,e.id));utils.isEqual(i,-1)&&s.push(t.sender),e={isMentioned:n,senders:s,msgs:o,count:o.length}}return e};var tools={isGroup,formatMsg,formatMsgs,formatConversations,formatConversation,createMentions};function Conversation(e,{conversationUtils:t,webAgent:n}){let s=["removeConversation","clearUnreadcount","getTotalUnreadcount","clearTotalUnreadcount","markUnread","setDraft","getDraft","removeDraft","insertConversation","disturbConversation","setTopConversation","getTopConversations","setAllDisturb","getAllDisturb","getAllDisturb","_batchInsertConversations"],o=common.formatProvider(s,e);return o.getConversations=(n={})=>e.getConversations(n).then(({conversations:e,groups:s,users:o,isFinished:i})=>{let r=tools.formatConversations({conversations:e,users:o,groups:s});// 不指定会话类型时向内存中插入数据
155
+ */return{joinChatroom:i,quitChatroom:r,setChatroomAttributes:a,getChatroomAttributes:p,removeChatroomAttributes:d,getAllChatRoomAttributes:c}}let init$2=({io:e,emitter:t,logger:n})=>{let s=Socket$1(e,t,n),o=Conversation$1(e,t),i=Message$1(e,t,n),r=Chatroom$1(e,t,n);return e.setConfig({logger:n}),{socket:s,conversation:o,message:i,chatroom:r}};var Web={init:init$2};let isGroup=e=>utils.isEqual(CONVERATION_TYPE.GROUP,e),formatMsg=({message:e,senders:t,groups:n})=>{let{content:p="{}",senderId:s,conversationType:o,conversationId:i,mentionInfo:c="{}",isRead:r,isSender:a,isUpdated:d,referMsg:l="{}",mergeMsg:m="{}",attribute:u=""}=e;p=utils.parse(p),c=utils.parse(c);let E=utils.filter(t,e=>utils.isEqual(e.id,s))[0]||{},g={};return g=isGroup(o)?utils.filter(n,e=>utils.isEqual(e.id,i))[0]||{}:utils.filter(t,e=>utils.isEqual(e.id,i))[0]||{},e=utils.extend(e,{mergeMsg:utils.parse(m),referMsg:utils.parse(l),conversationTitle:g.name,conversationPortrait:g.portrait,conversationExts:g.exts,content:p,sender:E,mentionInfo:c,sentTime:+e.sentTime,isRead:!!r,isSender:!!a,isUpdated:!!d,attribute:u}),e},formatMsgs=({messages:e,senders:t,groups:n})=>{let s=utils.map(e,e=>{let s=formatMsg({message:e,senders:t,groups:n});return s});return s},formatConversation=({conversation:e,users:t,groups:n})=>{if(utils.isEmpty(e))return e;let{id:s,type:o,draft:i,unreadCount:r,isTop:a,undisturbType:d,sortTime:p,mentions:c,latestMessageTid:l,latestMessageId:m,latestMessageName:u,latestMessageIsSender:E,latestMessageIsUpdated:g,latestMessageSentTime:y,latestMessageSenderId:T,latestMessageContent:f,latestMessageMessageIndex:C,latestMessageIsRead:_,latestMessageIsMass:S,latestUnreadCount:O,latestReadCount:I,latestReadIndex:N,latestUnreadIndex:A,latestMentionInfo:R,unreadTag:M}=e;c=c||"{}";let h=utils.filter(t,e=>utils.isEqual(e.id,T))[0]||{id:T},v={};v=isGroup(o)?utils.filter(n,e=>utils.isEqual(e.id,s))[0]||{id:s}:utils.filter(t,e=>utils.isEqual(e.id,s))[0]||{id:s},r=0<r?r:0;let D={conversationId:s,conversationType:o,conversationPortrait:v.portrait,conversationTitle:v.name,conversationExts:v.exts,draft:i||"",isTop:!!a,undisturbType:d,latestReadIndex:+N,latestUnreadIndex:+A,latestMessage:{conversationId:s,conversationType:o,conversationPortrait:v.portrait,conversationTitle:v.name,conversationExts:v.exts,content:utils.parse(f),isRead:!!_,isSender:!!E,isUpdated:!!g,isMass:!!S,messageId:m,tid:l,mentionInfo:utils.parse(R),messageIndex:C,name:u,readCount:+(I||0),unreadCount:+(O||0),sentTime:+y,referMsg:{},sender:h},sortTime:+p||0,unreadCount:r||0,mentions:utils.parse(c),unreadTag:M||UNREAD_TAG.READ};return utils.isEmpty(m)&&(D.latestMessage={}),D},formatConversations=({conversations:e,users:t,groups:n})=>{let s=utils.map(e,e=>{let s=formatConversation({conversation:e,users:t,groups:n});return s});return s},createMentions=(e,t,n)=>{let{mentionInfo:s}=t,{senders:o=[],msgs:i=[]}=e;if(utils.isEqual(t.name,MESSAGE_TYPE.RECALL_INFO)){let{content:{messageId:n},sender:e}=t,s=utils.find(i,e=>utils.isEqual(e.messageId,n));-1<s&&i.splice(s,1);// 如果没有消息撤回发送人的消息,移除 senders 中的发送人信息
156
+ let r=-1<utils.find(i,t=>utils.isEqual(t.senderId,e.id));if(!r){let e=utils.find(o,e=>utils.isEqual(t.sender.id,e.id));utils.isEqual(e,-1)||o.splice(e,1)}let a=i.length;return{isMentioned:0<a,senders:o,msgs:i,count:a}}if(utils.isEmpty(s))return e;let{members:r,type:a}=s,d=utils.find(r,e=>utils.isEqual(n.id,e.id));if(-1<d||utils.isEqual(a,MENTION_TYPE.ALL)){i.push({senderId:t.sender.id,messageId:t.messageId,sentTime:t.sentTime});let e=utils.find(o,e=>utils.isEqual(t.sender.id,e.id));utils.isEqual(e,-1)&&o.push(t.sender)}let p=i.length;return{isMentioned:0<p,senders:o,msgs:i,count:p}};var tools={isGroup,formatMsg,formatMsgs,formatConversations,formatConversation,createMentions};function Conversation(e,{conversationUtils:t,webAgent:n}){let s=["removeConversation","clearUnreadcount","getTotalUnreadcount","clearTotalUnreadcount","markUnread","setDraft","getDraft","removeDraft","insertConversation","disturbConversation","setTopConversation","getTopConversations","setAllDisturb","getAllDisturb","getAllDisturb","_batchInsertConversations"],o=common.formatProvider(s,e);return o.getConversations=(n={})=>e.getConversations(n).then(({conversations:e,groups:s,users:o,isFinished:i})=>{let r=tools.formatConversations({conversations:e,users:o,groups:s});// 不指定会话类型时向内存中插入数据
156
157
  return utils.isUndefined(n.conversationType)&&t.add(r),{isFinished:i,conversations:utils.clone(r)}}),o.getConversation=t=>e.getConversation(t).then(e=>{let{conversation:t,groups:n,users:s}=e,o={};return t.isNew||(o=tools.formatConversation({conversation:t,users:s,groups:n})),{conversation:o}}),o}function Message(e,{webAgent:t}){let n=["sendMessage","updateMessageAttr","removeMessages","sendMassMessage","getMessagesByIds","clearMessage","recallMessage","readMessage","getMessageReadDetails","updateMessage","insertMessage","getMentionMessages","getFileToken","sendFileMessage","sendImageMessage","sendVoiceMessage","sendVideoMessage","sendMergeMessage","getMergeMessages","setSearchContent","getFirstUnreadMessage"],s=common.formatProvider(n,e);return s.getMessages=n=>utils.deferred((s,o)=>{let{order:i=MESSAGE_ORDER.BACKWARD}=n,r={time:n.time||0,order:i,count:n.count||20,names:n.names||[],conversationType:n.conversationType,conversationId:n.conversationId};return e.getMessages(r).then(({messages:p=[],isFinished:i,groups:a,senders:d})=>{let c=utils.filter(p,e=>utils.isEqual(e.sentState,MESSAGE_SENT_STATE.SUCCESS)),l=()=>{let e=tools.formatMsgs({messages:p,senders:d,groups:a});s({isFinished:i,messages:e})},m=utils.isContinuous(c,"messageIndex"),u=p.length,E=i&&r.count>u;// 如果首次获取历史消息,从远端拉取历史消息
157
158
  return E||!m||utils.isEqual(r.time,0)?utils.isEmpty(r.names)?t.getMessages(n).then(t=>{let n=[];utils.forEach(t.messages,e=>{let t=utils.find(p,t=>utils.isEqual(t.messageId,e.messageId));utils.isEqual(t,-1)?n.push(e):p[t]}),e.insertBatchMsgs({msgs:n});let o=tools.formatMsgs({messages:p,senders:d,groups:a}),i=n.concat(o);i=utils.quickSort(i,(e,t)=>e.sentTime<t.sentTime),s({isFinished:t.isFinished,messages:i})},o):l():void l()})}),s.searchMessages=t=>e.searchMessages(t).then(e=>{let{total:t,list:n,groups:s,senders:o,isFinished:i}=e;return n=utils.map(n,e=>{let{matchedList:t,matchedCount:n,conversationType:i,conversationId:r}=e,a=tools.formatMsgs({messages:t,senders:o,groups:s}),d={conversation:{id:r,type:i},users:o,groups:s},p=tools.formatConversation(d),{conversationTitle:c,conversationPortrait:l,conversationExts:m}=p;return{matchedList:a,matchedCount:n,conversationType:i,conversationId:r,conversationTitle:c,conversationPortrait:l,conversationExts:m}}),{total:t,list:n,isFinished:i}}),s}function Socket(e){let t=["connect","disconnect","getDevice","isConnected","getCurrentUser"],n=common.formatProvider(t,e);return n}function Chatroom(e,{io:t,emitter:n,logger:s}){function o(e){chatroomCacher$1.remove(e),attrCaher.removeAll(e)}t.on(SIGNAL_NAME.CMD_CHATROOM_ATTR_RECEIVED,e=>{s.info({tag:LOG_MODULE.CHATROOM_ATTR_RECEIVE,...e});let{dels:t,updates:o}=attrCaher.heap(e),{chatroomId:i}=e;utils.isEmpty(t)||n.emit(EVENT.CHATROOM_ATTRIBUTE_DELETED,{id:i,attributes:t}),utils.isEmpty(o)||n.emit(EVENT.CHATROOM_ATTRIBUTE_UPDATED,{id:i,attributes:o})}),t.on(SIGNAL_NAME.CMD_CHATROOM_DESTROY,e=>{n.emit(EVENT.CHATROOM_DESTROYED,e)}),t.on(SIGNAL_NAME.CMD_CHATROOM_EVENT,e=>{let{type:t,chatroomId:s}=e;(utils.isEqual(CHATROOM_EVENT_TYPE.FALLOUT,t)||utils.isEqual(CHATROOM_EVENT_TYPE.QUIT,t))&&(o(s),n.emit(EVENT.CHATROOM_USER_QUIT,e)),utils.isEqual(CHATROOM_EVENT_TYPE.KICK,t)&&(o(s),n.emit(EVENT.CHATROOM_USER_KICKED,e))});let i=t=>e.joinChatroom(t),r=t=>e.quitChatroom(t),a=t=>e.setChatroomAttributes(t),d=t=>e.getChatroomAttributes(t),p=t=>e.removeChatroomAttributes(t),c=t=>e.getAllChatRoomAttributes(t);return{joinChatroom:i,quitChatroom:r,setChatroomAttributes:a,getChatroomAttributes:d,removeChatroomAttributes:p,getAllChatRoomAttributes:c}}let init$1=({appkey:e,io:t,emitter:n,web:s,client:o,logger:i})=>{let{SIGNAL_NAME:r}=ENUM;// 移除 Web 监听
158
159
  t.off(r.CMD_CONVERSATION_CHANGED),t.off(r.CONN_CHANGED),t.off(r.CMD_RECEIVED);let a=common.ConversationUtils(),d=JGChatPCClient.init(e,{...s,emitter:n,io:t,ENUM,utils,common,MessageCacher,conversationUtils:a,chatroomCacher:chatroomCacher$1,tools,Storage,logger:i}),p=Socket(d.socket),c=Conversation(d.conversation,{webAgent:s.conversation,conversationUtils:a}),l=Message(d.message,{webAgent:s.message}),m=Chatroom(s.chatroom,{io:t,emitter:n});// 告知 IO 模块当前是 PC 端,做特殊处理,例如:同步会话列表
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  {
3
3
  "name": "jugglechat-websdk",
4
- "version": "1.6.5",
4
+ "version": "1.6.6",
5
5
  "description": "JuggleChat SDK, IM, Chat",
6
6
  "main": "index.js",
7
7
  "scripts": { },