jugglechat-websdk 1.5.2 → 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 +2 -2
- 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 地址
|