jugglechat-websdk 1.5.1 → 1.5.3
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.
- package/index.js +3 -3
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* JuggleChat.js v1.5.
|
|
2
|
+
* JuggleChat.js v1.5.3
|
|
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||{},d=()=>/^(200|202)$/.test(s.status),a=t.timeout;return a&&(s.timeout=a),s.onreadystatechange=function(){if(isEqual(s.readyState,4)){let{responseText:e}=s;e=e||"{}";let t=parse(e);if(d())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
|
|
@@ -74,7 +74,7 @@ utils.isEmpty(r)||(Storage.set(p,a),Storage.setPrefix(`${d}_${a}`),l=common.getN
|
|
|
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},d=()=>{s(n)};t||n(r,d)};return{consume:s,produce:n}}function Syncer(e,t,n){let s=Consumer(),o=Cache(),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 d(e,t){let{msg:n}=e;utils.isEqual(n.type,NOTIFY_TYPE.MSG)?c(e,t):utils.isEqual(n.type,NOTIFY_TYPE.CHATROOM)?p(e,t):utils.isEqual(n.type,NOTIFY_TYPE.CHATROOM_ATTR)?a(e,t):t()}function a(n,s){let{user:o,msg:i,name:r}=n,d=i.targetId,a=E(d);if(a>=i.receiveTime)return s();let p={syncTime:a,chatroomId:d,topic:COMMAND_TOPICS.SYNC_CHATROOM_ATTRS};//TODO: 解析&存储
|
|
76
76
|
e(SIGNAL_CMD.QUERY,p,({attrs:e,code:n})=>utils.isEqual(n,ErrorType.COMMAND_SUCCESS.code)?void(utils.forEach(messages,e=>{u(e.conversationId,e.sentTime),t.emit(SIGNAL_NAME.CMD_RECEIVED,[e])}),s()):s())}function p(n,o){let{user:i,msg:r,name:d}=n,a=r.targetId,p=m(a);if(p>=r.receiveTime)return o();let c={syncTime:p,chatroomId:a,topic:COMMAND_TOPICS.SYNC_CHATROOM_MESSAGES};e(SIGNAL_CMD.QUERY,c,({isFinished:e,messages:i,code:r})=>{if(!utils.isEqual(r,ErrorType.COMMAND_SUCCESS.code))return o();utils.forEach(i,e=>{u(e.conversationId,e.sentTime),t.emit(SIGNAL_NAME.CMD_RECEIVED,[e])});let d=!e;d&&s.produce(n,d),o()})}function c(o,i){let{user:r,msg:d,name:a}=o,p=Storage.get(STORAGE.SYNC_RECEIVED_MSG_TIME).time||1700927161470,c=Storage.get(STORAGE.SYNC_SENT_MSG_TIME).time||1700927161470;// 如果本地记录时间戳大于 ntf 中的接收时间,认为消息已被当前端接收过,不再执行拉取动作
|
|
77
|
-
if(p>=d.receiveTime)return i();let l={userId:r.id,syncTime:p,containsSendBox:!0,sendBoxSyncTime:c,topic:COMMAND_TOPICS.SYNC_MESSAGES};e(SIGNAL_CMD.QUERY,l,({isFinished:e,messages:r,code:d})=>{if(!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return i();utils.forEach(r,(s,o)=>{let i=common.updateSyncTime({...s,io:n});if(i){let n=e&&utils.isEqual(r.length-1,o);t.emit(SIGNAL_NAME.CMD_RECEIVED,[s,n])}});let a=!e;a&&s.produce(o,a),i()})}function l(n,o){let{user:i,name:r,time:d,$conversation:a}=n,p=Storage.get(STORAGE.SYNC_CONVERSATION_TIME).time||0;if(!(p>d)){let r={userId:i.id,syncTime:p,topic:COMMAND_TOPICS.SYNC_CONVERSATIONS,count:200};e(SIGNAL_CMD.QUERY,r,e=>{let{isFinished:i,conversations:r,code:d}=e;if(!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),o();let c=r.length,l=r[c-1]||{syncTime:0},{syncTime:m}=l;m>p&&(Storage.set(STORAGE.SYNC_CONVERSATION_TIME,{time:m}),n=utils.extend(n,{time:m})),a._batchInsertConversations({conversations:r,syncTime:m}).then(e=>{t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATIONS_PROGRESS,e);let r=!i;r?s.produce(n,r):t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),o()})})}}function m(e){let t=`${STORAGE.SYNC_CHATROOM_RECEIVED_MSG_TIME}_${e}`,n=o.get(t);return n.time||0}function u(e,t){let n=`${STORAGE.SYNC_CHATROOM_RECEIVED_MSG_TIME}_${e}`;o.set(n,{time:t})}function E(e){let t=`${STORAGE.SYNC_CHATROOM_ATTR_TIME}_${e}`,n=o.get(t);return n.time||0}s.produce(i),s.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)&&d(e,t),utils.isEqual(n,SIGNAL_NAME.S_SYNC_CONVERSATION_NTF)&&l(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)},d=()=>{r(),i(o)};return{resume:i,pause:r,reset:d}}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}}/*
|
|
77
|
+
if(p>=d.receiveTime)return i();let l={userId:r.id,syncTime:p,containsSendBox:!0,sendBoxSyncTime:c,topic:COMMAND_TOPICS.SYNC_MESSAGES};e(SIGNAL_CMD.QUERY,l,({isFinished:e,messages:r,code:d})=>{if(!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return i();utils.forEach(r,(s,o)=>{let i=common.updateSyncTime({...s,io:n});if(i){let n=e&&utils.isEqual(r.length-1,o);t.emit(SIGNAL_NAME.CMD_RECEIVED,[s,n])}});let a=!e;a&&s.produce(o,a),i()})}function l(n,o){let{user:i,name:r,time:d,$conversation:a}=n,p=Storage.get(STORAGE.SYNC_CONVERSATION_TIME).time||0;if(!(p>d)){let r={userId:i.id,syncTime:p,topic:COMMAND_TOPICS.SYNC_CONVERSATIONS,count:200};e(SIGNAL_CMD.QUERY,r,e=>{let{isFinished:i,conversations:r,code:d}=e;if(!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),o();let c=r.length,l=r[c-1]||{syncTime:0},{syncTime:m}=l;m>p&&(Storage.set(STORAGE.SYNC_CONVERSATION_TIME,{time:m}),n=utils.extend(n,{time:m})),r=utils.clone(r),a._batchInsertConversations({conversations:r,syncTime:m}).then(e=>{t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATIONS_PROGRESS,e);let r=!i;r?s.produce(n,r):t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),o()})})}}function m(e){let t=`${STORAGE.SYNC_CHATROOM_RECEIVED_MSG_TIME}_${e}`,n=o.get(t);return n.time||0}function u(e,t){let n=`${STORAGE.SYNC_CHATROOM_RECEIVED_MSG_TIME}_${e}`;o.set(n,{time:t})}function E(e){let t=`${STORAGE.SYNC_CHATROOM_ATTR_TIME}_${e}`,n=o.get(t);return n.time||0}s.produce(i),s.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)&&d(e,t),utils.isEqual(n,SIGNAL_NAME.S_SYNC_CONVERSATION_NTF)&&l(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)},d=()=>{r(),i(o)};return{resume:i,pause:r,reset:d}}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}}/*
|
|
78
78
|
fileCompressLimit: 图片缩略图压缩限制,小于设置数值将不执行压缩,单位 KB
|
|
79
79
|
config = { appkey, nav, isSync, upload, uploadType, fileCompressLimit }
|
|
80
80
|
*/function IO(e){function t(){return N}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:d,serverList:a=[],isSync:p=!0,reconnectCount:c=100}=e;utils.isArray(d)||(d=["https://nav.juggleim.com"]);let l={},m={},u=Cache(),E=Decoder(u,m),y=Encoder(u),g=Timer({timeout:HEART_TIMEOUT}),T=Timer({timeout:SYNC_MESSAGE_TIME}),f=CONNECT_STATE.DISCONNECTED,C=[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=>{f=e.state,i.emit(SIGNAL_NAME.CONN_CHANGED,{...e})},_=()=>{g.pause(),T.pause()},I=!1,O=(e={})=>{let{code:n}=e;if(!I&&!utils.isInclude(C,n)&&!utils.isEqual(f,CONNECT_STATE.DISCONNECTED)){let e=t();return _(),M(e,({next:e})=>{e()})}if(!utils.isEqual(f,CONNECT_STATE.DISCONNECTED)){let n=t();S({state:CONNECT_STATE.DISCONNECTED,...e,user:n}),_()}},N={},A=e=>{utils.extend(N,e)},R=e=>{let t=common.getNaviStorageKey(r,e);Storage.remove(t)},v=({token:e,deviceId:t,_isReconnect:n=!1},s)=>{function o({servers:n,userId:o}){A({id:o,token:e,deviceId:t}),u.set(SIGNAL_NAME.S_CONNECT_ACK,s),Network.detect(n,(n,i)=>{// 如果嗅探失败,返回连接断开,同时清理已缓存的 CMP 地址
|
|
@@ -176,7 +176,7 @@ let{token:r=""}=t;r=r.trim(),t=utils.extend(t,{token:r}),e.connect(t,({error:t,u
|
|
|
176
176
|
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"],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:d,senders:a})=>{let c=utils.filter(p,e=>utils.isEqual(e.sentState,MESSAGE_SENT_STATE.SUCCESS)),l=()=>{// if(utils.isEqual(order, MESSAGE_ORDER.BACKWARD)){
|
|
177
177
|
// messages.reverse();
|
|
178
178
|
// }
|
|
179
|
-
let e=tools.formatMsgs({messages:p,senders:a,groups:d});s({isFinished:i,messages:e})},m=utils.isContinuous(c,"messageIndex"),u=p.length,E=i&&r.count>u;return E||!m?utils.isEmpty(r.names)?t.getMessages(n).then(t=>{let n=[],o=[];utils.forEach(t.messages,e=>{let t=utils.find(p,t=>utils.isEqual(t.messageId,e.messageId));if(utils.isEqual(t,-1))n.push(e);else{let e=p[t];o.push(e)}}),e.insertBatchMsgs({msgs:n});let i=tools.formatMsgs({messages:o,senders:a,groups:d}),r=n.concat(i);r=utils.quickSort(r,(e,t)=>e.sentTime<t.sentTime),s({isFinished:t.isFinished,messages:r})},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,d=tools.formatMsgs({messages:t,senders:o,groups:s});return{matchedList:d,matchedCount:n,conversationType:i,conversationId:r}}),{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){let t=t=>e.joinChatroom(t),n=t=>e.quitChatroom(t);return{joinChatroom:t,quitChatroom:n}}let init$1=({appkey:e,io:t,emitter:n,web:s,client:o,logger:i})=>{let{SIGNAL_NAME:r}=ENUM;// 移除 Web 监听
|
|
179
|
+
let e=tools.formatMsgs({messages:p,senders:a,groups:d});s({isFinished:i,messages:e})},m=utils.isContinuous(c,"messageIndex"),u=p.length,E=i&&r.count>u;return E||!m?utils.isEmpty(r.names)?t.getMessages(n).then(t=>{let n=[],o=[];utils.forEach(t.messages,e=>{let t=utils.find(p,t=>utils.isEqual(t.messageId,e.messageId));if(utils.isEqual(t,-1))n.push(e);else{let e=p[t];o.push(e)}}),e.insertBatchMsgs({msgs:n});let i=tools.formatMsgs({messages:o,senders:a,groups:d}),r=n.concat(i);r=utils.quickSort(r,(e,t)=>e.sentTime<t.sentTime),s({isFinished:t.isFinished,messages:r})},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,d=tools.formatMsgs({messages:t,senders:o,groups:s}),a={conversation:{id:r,type:i},users:o,groups:s},p=tools.formatConversation(a),{conversationTitle:c,conversationPortrait:l,conversationExts:m}=p;return{matchedList:d,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){let t=t=>e.joinChatroom(t),n=t=>e.quitChatroom(t);return{joinChatroom:t,quitChatroom:n}}let init$1=({appkey:e,io:t,emitter:n,web:s,client:o,logger:i})=>{let{SIGNAL_NAME:r}=ENUM;// 移除 Web 监听
|
|
180
180
|
t.off(r.CMD_CONVERSATION_CHANGED),t.off(r.CONN_CHANGED),t.off(r.CMD_RECEIVED);let d=common.ConversationUtils(),a=JGChatPCClient.init(e,{...s,emitter:n,io:t,ENUM,utils,common,MessageCacher,conversationUtils:d,tools,Storage}),p=Socket(a.socket),c=Conversation(a.conversation,{webAgent:s.conversation,conversationUtils:d}),l=Message(a.message,{webAgent:s.message}),m=Chatroom(s.chatroom);// 告知 IO 模块当前是 PC 端,做特殊处理,例如:同步会话列表
|
|
181
181
|
return t.setConfig({isPC:!0,$conversation:a.conversation,$socket:a.socket,$message:a.message,logger:i}),{socket:p,conversation:c,message:l,chatroom:m}};var Desktop={init:init$1};/*
|
|
182
182
|
let option = {
|