jugglechat-websdk 1.7.11 → 1.7.12
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.d.ts +102 -102
- package/index.js +3 -3
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -26,116 +26,116 @@ interface EVENT {
|
|
|
26
26
|
CHATROOM_DESTROYED: string;
|
|
27
27
|
CHATROOM_USER_QUIT: string;
|
|
28
28
|
CHATROOM_USER_KICKED: string;
|
|
29
|
-
}
|
|
29
|
+
}
|
|
30
30
|
interface CONNECT_STATE {
|
|
31
|
-
CONNECTED
|
|
32
|
-
CONNECTING
|
|
33
|
-
DISCONNECTED
|
|
34
|
-
CONNECT_FAILED
|
|
35
|
-
DB_OPENED
|
|
36
|
-
DB_CLOSED
|
|
37
|
-
RECONNECTING
|
|
31
|
+
CONNECTED: number;
|
|
32
|
+
CONNECTING: number;
|
|
33
|
+
DISCONNECTED: number;
|
|
34
|
+
CONNECT_FAILED: number;
|
|
35
|
+
DB_OPENED: number;
|
|
36
|
+
DB_CLOSED: number;
|
|
37
|
+
RECONNECTING: number;
|
|
38
38
|
}
|
|
39
39
|
interface CONVERATION_TYPE {
|
|
40
|
-
PRIVATE
|
|
41
|
-
GROUP
|
|
42
|
-
CHATROOM
|
|
43
|
-
SYSTEM
|
|
40
|
+
PRIVATE: number;
|
|
41
|
+
GROUP: number;
|
|
42
|
+
CHATROOM: number;
|
|
43
|
+
SYSTEM: number;
|
|
44
44
|
}
|
|
45
45
|
interface MESSAGE_ORDER {
|
|
46
|
-
FORWARD
|
|
47
|
-
BACKWARD
|
|
46
|
+
FORWARD: number;
|
|
47
|
+
BACKWARD: number;
|
|
48
48
|
}
|
|
49
49
|
interface CONVERSATION_ORDER {
|
|
50
|
-
BACKWARD
|
|
51
|
-
FORWARD
|
|
50
|
+
BACKWARD: number;
|
|
51
|
+
FORWARD: number;
|
|
52
52
|
}
|
|
53
53
|
interface MENTION_ORDER {
|
|
54
|
-
BACKWARD
|
|
55
|
-
FORWARD
|
|
54
|
+
BACKWARD: number;
|
|
55
|
+
FORWARD: number;
|
|
56
56
|
}
|
|
57
57
|
interface UPLOAD_TYPE {
|
|
58
|
-
NONE
|
|
59
|
-
QINIU
|
|
60
|
-
ALI
|
|
58
|
+
NONE: number;
|
|
59
|
+
QINIU: number;
|
|
60
|
+
ALI: number;
|
|
61
61
|
}
|
|
62
62
|
interface UNDISTURB_TYPE {
|
|
63
|
-
DISTURB
|
|
64
|
-
UNDISTURB
|
|
63
|
+
DISTURB: number;
|
|
64
|
+
UNDISTURB: number;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
interface MESSAGE_TYPE {
|
|
68
|
-
TEXT
|
|
69
|
-
IMAGE
|
|
70
|
-
VOICE
|
|
71
|
-
VIDEO
|
|
72
|
-
FILE
|
|
73
|
-
MERGE
|
|
74
|
-
RECALL
|
|
75
|
-
RECALL_INFO
|
|
76
|
-
READ_MSG
|
|
77
|
-
READ_GROUP_MSG
|
|
78
|
-
MODIFY
|
|
79
|
-
CLEAR_MSG
|
|
80
|
-
CLEAR_UNREAD
|
|
81
|
-
COMMAND_DELETE_MSGS
|
|
82
|
-
COMMAND_UNDISTURB
|
|
83
|
-
COMMAND_TOPCONVERS
|
|
84
|
-
COMMAND_REMOVE_CONVERS
|
|
85
|
-
COMMAND_ADD_CONVER
|
|
86
|
-
COMMAND_CLEAR_TOTALUNREAD
|
|
87
|
-
COMMAND_MARK_UNREAD
|
|
88
|
-
COMMAND_LOG_REPORT
|
|
89
|
-
COMMAND_MSG_EXSET
|
|
90
|
-
COMMAND_CONVERSATION_TAG_ADD
|
|
91
|
-
COMMAND_REMOVE_CONVERS_FROM_TAG
|
|
92
|
-
COMMAND_CONVERSATION_TAG_REMOVE
|
|
93
|
-
CLIENT_REMOVE_MSGS
|
|
94
|
-
CLIENT_REMOVE_CONVERS
|
|
95
|
-
CLIENT_RECALL_MSG
|
|
96
|
-
CLIENT_MARK_UNREAD
|
|
68
|
+
TEXT: string;
|
|
69
|
+
IMAGE: string;
|
|
70
|
+
VOICE: string;
|
|
71
|
+
VIDEO: string;
|
|
72
|
+
FILE: string;
|
|
73
|
+
MERGE: string;
|
|
74
|
+
RECALL: string;
|
|
75
|
+
RECALL_INFO: string;
|
|
76
|
+
READ_MSG: string;
|
|
77
|
+
READ_GROUP_MSG: string;
|
|
78
|
+
MODIFY: string;
|
|
79
|
+
CLEAR_MSG: string;
|
|
80
|
+
CLEAR_UNREAD: string;
|
|
81
|
+
COMMAND_DELETE_MSGS: string;
|
|
82
|
+
COMMAND_UNDISTURB: string;
|
|
83
|
+
COMMAND_TOPCONVERS: string;
|
|
84
|
+
COMMAND_REMOVE_CONVERS: string;
|
|
85
|
+
COMMAND_ADD_CONVER: string;
|
|
86
|
+
COMMAND_CLEAR_TOTALUNREAD: string;
|
|
87
|
+
COMMAND_MARK_UNREAD: string;
|
|
88
|
+
COMMAND_LOG_REPORT: string;
|
|
89
|
+
COMMAND_MSG_EXSET: string;
|
|
90
|
+
COMMAND_CONVERSATION_TAG_ADD: string;
|
|
91
|
+
COMMAND_REMOVE_CONVERS_FROM_TAG: string;
|
|
92
|
+
COMMAND_CONVERSATION_TAG_REMOVE: string;
|
|
93
|
+
CLIENT_REMOVE_MSGS: string;
|
|
94
|
+
CLIENT_REMOVE_CONVERS: string;
|
|
95
|
+
CLIENT_RECALL_MSG: string;
|
|
96
|
+
CLIENT_MARK_UNREAD: string;
|
|
97
97
|
}
|
|
98
98
|
interface MENTION_TYPE {
|
|
99
|
-
ALL
|
|
100
|
-
SOMEONE
|
|
101
|
-
ALL_SOMEONE
|
|
99
|
+
ALL: string;
|
|
100
|
+
SOMEONE: string;
|
|
101
|
+
ALL_SOMEONE: string;
|
|
102
102
|
}
|
|
103
103
|
interface FILE_TYPE {
|
|
104
|
-
IMAGE
|
|
105
|
-
AUDIO
|
|
106
|
-
VIDEO
|
|
107
|
-
FILE
|
|
104
|
+
IMAGE: number;
|
|
105
|
+
AUDIO: number;
|
|
106
|
+
VIDEO: number;
|
|
107
|
+
FILE: number;
|
|
108
108
|
}
|
|
109
109
|
interface MESSAGE_SENT_STATE {
|
|
110
|
-
NONE
|
|
111
|
-
SENDING
|
|
112
|
-
SUCCESS
|
|
113
|
-
FAILED
|
|
114
|
-
UPLOADING
|
|
110
|
+
NONE: number;
|
|
111
|
+
SENDING: number;
|
|
112
|
+
SUCCESS: number;
|
|
113
|
+
FAILED: number;
|
|
114
|
+
UPLOADING: number;
|
|
115
115
|
}
|
|
116
116
|
interface DISCONNECT_TYPE {
|
|
117
|
-
DISCONNECT
|
|
118
|
-
CLOSE
|
|
119
|
-
ERROR
|
|
120
|
-
SERVER
|
|
117
|
+
DISCONNECT: number;
|
|
118
|
+
CLOSE: number;
|
|
119
|
+
ERROR: number;
|
|
120
|
+
SERVER: number;
|
|
121
121
|
}
|
|
122
122
|
interface UNREAD_TAG {
|
|
123
|
-
READ
|
|
124
|
-
UNREAD
|
|
123
|
+
READ: number;
|
|
124
|
+
UNREAD: number;
|
|
125
125
|
}
|
|
126
126
|
interface SET_SEARCH_CONTENT_TYPE {
|
|
127
|
-
APPEND
|
|
128
|
-
REPLACE
|
|
127
|
+
APPEND: number;
|
|
128
|
+
REPLACE: number;
|
|
129
129
|
}
|
|
130
130
|
interface CONVERATION_TAG_TYPE {
|
|
131
|
-
USER
|
|
132
|
-
SYSNTEM
|
|
133
|
-
GLOBAL
|
|
131
|
+
USER: number;
|
|
132
|
+
SYSNTEM: number;
|
|
133
|
+
GLOBAL: number;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
interface Error {
|
|
137
|
-
code: number
|
|
138
|
-
msg: string
|
|
137
|
+
code: number;
|
|
138
|
+
msg: string;
|
|
139
139
|
}
|
|
140
140
|
declare class IMUser {
|
|
141
141
|
id?: string;
|
|
@@ -255,14 +255,14 @@ interface GetConversationOptions {
|
|
|
255
255
|
count?: number;
|
|
256
256
|
time?: number;
|
|
257
257
|
}
|
|
258
|
-
interface TotalUnreadResult{
|
|
258
|
+
interface TotalUnreadResult {
|
|
259
259
|
total: number;
|
|
260
260
|
}
|
|
261
|
-
interface GetTotalOptions{
|
|
261
|
+
interface GetTotalOptions {
|
|
262
262
|
conversationTypes?: CONVERATION_TYPE[];
|
|
263
263
|
ignoreConversations?: Conversation[];
|
|
264
264
|
}
|
|
265
|
-
declare class TimeZone{
|
|
265
|
+
declare class TimeZone {
|
|
266
266
|
start: string;
|
|
267
267
|
end: string;
|
|
268
268
|
}
|
|
@@ -276,51 +276,51 @@ declare class TagInfo {
|
|
|
276
276
|
name?: string;
|
|
277
277
|
conversations?: Conversation[]
|
|
278
278
|
}
|
|
279
|
-
interface SendMsgCbData { message: Message, percent?: number, count?: number, total?: number
|
|
280
|
-
interface SendMsgCbCompleteData {
|
|
281
|
-
messages: Message[]
|
|
279
|
+
interface SendMsgCbData { message: Message, percent?: number, count?: number, total?: number }
|
|
280
|
+
interface SendMsgCbCompleteData {
|
|
281
|
+
messages: Message[]
|
|
282
282
|
}
|
|
283
|
-
interface SendMsgCallbacks{
|
|
283
|
+
interface SendMsgCallbacks {
|
|
284
284
|
onbefore?(message: Message): void;
|
|
285
285
|
onerror?(error: Error): void;
|
|
286
|
-
onprogress?(data: SendMsgCbData):void;
|
|
286
|
+
onprogress?(data: SendMsgCbData): void;
|
|
287
287
|
oncompleted?(data: SendMsgCbCompleteData): void;
|
|
288
288
|
}
|
|
289
|
-
interface GetMsgByIdOptions{
|
|
289
|
+
interface GetMsgByIdOptions {
|
|
290
290
|
conversationType: CONVERATION_TYPE,
|
|
291
291
|
conversationId: string;
|
|
292
292
|
messageIds: string[];
|
|
293
293
|
}
|
|
294
|
-
interface ClearMsgsOptions{
|
|
294
|
+
interface ClearMsgsOptions {
|
|
295
295
|
conversationType: CONVERATION_TYPE,
|
|
296
296
|
conversationId: string;
|
|
297
297
|
time: number;
|
|
298
298
|
}
|
|
299
|
-
interface ReadMember{
|
|
299
|
+
interface ReadMember {
|
|
300
300
|
readTime: number;
|
|
301
301
|
member: IMUser;
|
|
302
302
|
}
|
|
303
|
-
interface GetGroupMessageDetailResult{
|
|
303
|
+
interface GetGroupMessageDetailResult {
|
|
304
304
|
readCount: number;
|
|
305
305
|
unreadCount: number;
|
|
306
306
|
unreadMembers: ReadMember[];
|
|
307
307
|
readMembers: ReadMember[];
|
|
308
308
|
}
|
|
309
|
-
interface GetMentionOptions{
|
|
309
|
+
interface GetMentionOptions {
|
|
310
310
|
conversationType: CONVERATION_TYPE,
|
|
311
311
|
conversationId: string;
|
|
312
312
|
messageIndex: number;
|
|
313
313
|
count?: number;
|
|
314
314
|
order?: number;
|
|
315
315
|
}
|
|
316
|
-
interface SendMergeOptions{
|
|
316
|
+
interface SendMergeOptions {
|
|
317
317
|
conversationType: CONVERATION_TYPE,
|
|
318
318
|
conversationId: string;
|
|
319
319
|
messageIdList: string[];
|
|
320
|
-
previewList:
|
|
320
|
+
previewList: any;
|
|
321
321
|
title: string;
|
|
322
322
|
}
|
|
323
|
-
interface SearchOptions{
|
|
323
|
+
interface SearchOptions {
|
|
324
324
|
conversationType?: CONVERATION_TYPE,
|
|
325
325
|
conversationId?: string;
|
|
326
326
|
keywords: string[];
|
|
@@ -331,7 +331,7 @@ interface SearchOptions{
|
|
|
331
331
|
page?: number;
|
|
332
332
|
pageSize?: number;
|
|
333
333
|
}
|
|
334
|
-
interface SearchMatchMsg{
|
|
334
|
+
interface SearchMatchMsg {
|
|
335
335
|
conversationType: CONVERATION_TYPE;
|
|
336
336
|
conversationId: string;
|
|
337
337
|
conversationExts: string;
|
|
@@ -340,18 +340,18 @@ interface SearchMatchMsg{
|
|
|
340
340
|
matchedCount: number;
|
|
341
341
|
matchedList: Message[];
|
|
342
342
|
}
|
|
343
|
-
interface SearchResult{
|
|
343
|
+
interface SearchResult {
|
|
344
344
|
isFinished: boolean;
|
|
345
345
|
total: number;
|
|
346
346
|
list: SearchMatchMsg[];
|
|
347
347
|
}
|
|
348
|
-
interface ReactionOptions{
|
|
348
|
+
interface ReactionOptions {
|
|
349
349
|
conversationType: CONVERATION_TYPE;
|
|
350
350
|
conversationId: string;
|
|
351
351
|
messageId: string;
|
|
352
352
|
reactionId: string;
|
|
353
353
|
}
|
|
354
|
-
interface CustomMsgOption{
|
|
354
|
+
interface CustomMsgOption {
|
|
355
355
|
name: string;
|
|
356
356
|
isCount?: boolean;
|
|
357
357
|
isStorage?: boolean;
|
|
@@ -359,7 +359,7 @@ interface CustomMsgOption{
|
|
|
359
359
|
}
|
|
360
360
|
|
|
361
361
|
declare class IMProvider {
|
|
362
|
-
connect: (user: IMUser) => Promise
|
|
362
|
+
connect: (user: IMUser) => Promise<any>;
|
|
363
363
|
disconnect: () => Promise<any>;
|
|
364
364
|
getDevice: () => Promise<any>;
|
|
365
365
|
isConnected: () => boolean;
|
|
@@ -394,7 +394,7 @@ declare class IMProvider {
|
|
|
394
394
|
sendMessage: (message: Message, callbacks?: SendMsgCallbacks) => Promise<Message>;
|
|
395
395
|
sendMassMessage: (messages: Message[], callbacks?: SendMsgCallbacks) => Promise<any>;
|
|
396
396
|
getMessages: (conversation: Conversation) => Promise<{ isFinished: boolean, messages: Message[] }>;
|
|
397
|
-
removeMessages: (messages:
|
|
397
|
+
removeMessages: (messages: Message[]) => Promise<any>;
|
|
398
398
|
getMessagesByIds: (options: GetMsgByIdOptions) => Promise<{ messages: Message[] }>;
|
|
399
399
|
clearMessage: (options: ClearMsgsOptions) => Promise<any>;
|
|
400
400
|
recallMessage: (message: Message) => Promise<any>;
|
|
@@ -417,7 +417,7 @@ declare class IMProvider {
|
|
|
417
417
|
addMessageReaction: (message: ReactionOptions) => Promise<any>;
|
|
418
418
|
removeMessageReaction: (message: ReactionOptions) => Promise<any>;
|
|
419
419
|
registerMessage: (names: CustomMsgOption[]) => any;
|
|
420
|
-
isDesktop:
|
|
420
|
+
isDesktop: () => boolean;
|
|
421
421
|
on: (name: string, event: any) => any;
|
|
422
422
|
off: (name: string) => any;
|
|
423
423
|
clear: () => any;
|
|
@@ -443,7 +443,7 @@ declare class IMProvider {
|
|
|
443
443
|
|
|
444
444
|
interface InitOptions {
|
|
445
445
|
appkey: string;
|
|
446
|
-
navList?:
|
|
446
|
+
navList?: string[];
|
|
447
447
|
isSync?: boolean;
|
|
448
448
|
upload?: Object;
|
|
449
449
|
}
|
|
@@ -469,4 +469,4 @@ declare namespace IMCore {
|
|
|
469
469
|
export let IMProvider: IMProvider;
|
|
470
470
|
}
|
|
471
471
|
|
|
472
|
-
export default
|
|
472
|
+
export default IMCore;
|
package/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* JuggleIM.js v1.7.
|
|
2
|
+
* JuggleIM.js v1.7.12
|
|
3
3
|
* (c) 2022-2024 JuggleIM
|
|
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
|
|
@@ -59,7 +59,7 @@ let props = [
|
|
|
59
59
|
function initSyncTime(e){let{appkey:t,userId:n,times:s}=e;Storage.setPrefix(`${t}_${n}`),utils.forEach(s,(e,t)=>{if(utils.isInclude([STORAGE.SYNC_RECEIVED_MSG_TIME,STORAGE.SYNC_SENT_MSG_TIME,STORAGE.SYNC_CONVERSATION_TIME],t)){let n=Storage.get(t),s=n.time||0;e>s&&Storage.set(t,{time:e})}})}function getError(e){let t=ErrorMessages.find(t=>t.code==e)||{code:e,msg:""},{msg:n}=t;return{code:e,msg:n}}// 内置消息类型和动态注入的自定消息类型
|
|
60
60
|
let _MSG_FLAG_NAMES=[{name:MESSAGE_TYPE.TEXT,isCount:!0,isStorage:!0},{name:MESSAGE_TYPE.FILE,isCount:!0,isStorage:!0},{name:MESSAGE_TYPE.IMAGE,isCount:!0,isStorage:!0},{name:MESSAGE_TYPE.VOICE,isCount:!0,isStorage:!0},{name:MESSAGE_TYPE.VIDEO,isCount:!0,isStorage:!0},{name:MESSAGE_TYPE.MERGE,isCount:!0,isStorage:!0,isMerge:!0},{name:MESSAGE_TYPE.RECALL,isCommand:!0},{name:MESSAGE_TYPE.RECALL_INFO,isCommand:!0},{name:MESSAGE_TYPE.READ_MSG,isCommand:!0},{name:MESSAGE_TYPE.READ_GROUP_MSG,isCommand:!0},{name:MESSAGE_TYPE.MODIFY,isCommand:!0},{name:MESSAGE_TYPE.CLEAR_MSG,isCommand:!0},{name:MESSAGE_TYPE.CLEAR_UNREAD,isCommand:!0,isCount:!1,isStorage:!1}],formatter={toFlag:({isCommand:e,isCount:t,isStorage:n,isMerge:s,isMass:o})=>{let i=0;return e&&(i|=1),t&&(i|=2),n&&(i|=8),s&&(i|=32),o&&(i|=128),i},toMsg:e=>{let t={1:{name:"isCommand"},2:{name:"isCount"},3:{name:"isStatus"},4:{name:"isStorage"},5:{name:"isUpdated"},6:{name:"isMerge"},7:{name:"isMute"},8:{name:"isMass"}},n={};for(let s in t){// 创建一个只有第 N 位为 1 其他都为 0 的掩码
|
|
61
61
|
let o=Math.pow(2,s-1),i=t[s].name;n[i]=0!==(e&o)}return n}},registerMessage=e=>{e=utils.isArray(e)?e:[e],utils.forEach(e,e=>{_MSG_FLAG_NAMES.push(e)})},getMsgFlag=(e,t={})=>{let n=utils.filter(_MSG_FLAG_NAMES,t=>utils.isEqual(t.name,e))[0]||{},s={...n,...t},o=formatter.toFlag(s);return o};function ConversationUtils(){let e=[],t=!1,n=t=>{let n=utils.find(e,({conversationType:e,conversationId:n})=>utils.isEqual(t.conversationType,e)&&utils.isEqual(t.conversationId,n));return-1<n},s=t=>{t=utils.isArray(t)?t:[t],utils.forEach(t,t=>{let n=utils.find(e,({conversationType:e,conversationId:n})=>utils.isEqual(t.conversationType,e)&&utils.isEqual(t.conversationId,n)),s=t,{latestMessage:o,updatedTime:i,conversationExts:r,mentions:a,undisturbType:d}=t,p=o.tags,c=o.name,m=formatter.toMsg(o.flags)||{},l=o.isSender,E=utils.isBoolean(l)&&l;if(!utils.isEqual(n,-1)){s=e.splice(n,1)[0];let{conversationTitle:p,conversationPortrait:c}=o;p=p||t.conversationTitle,c=c||t.conversationPortrait,utils.isEmpty(p)&&(p=s.conversationTitle),utils.isEmpty(c)&&(c=s.conversationPortrait),utils.isEmpty(r)&&(r=s.conversationExts),utils.isEqual(o.name,MESSAGE_TYPE.CLEAR_MSG)&&o.isSender&&(o={}),s=utils.extend(s,{latestMessage:o,conversationTitle:p,conversationPortrait:c,conversationExts:r,mentions:a,updatedTime:i,undisturbType:d})}let{unreadCount:u=0,latestReadIndex:g=0,latestUnreadIndex:y=0}=s;// 自己发送的多端同步清空消息,未读数设置为 0,最后一条消息保持不变
|
|
62
|
-
utils.isEqual(c,MESSAGE_TYPE.CLEAR_UNREAD)&&o.isSender&&(u=0,o=s.latestMessage),(0>u||utils.isNull(u))&&(u=0),!E&&m.isCount&&(y=o.unreadIndex||
|
|
62
|
+
utils.isEqual(c,MESSAGE_TYPE.CLEAR_UNREAD)&&o.isSender&&(u=0,o=s.latestMessage),(0>u||utils.isNull(u))&&(u=0),!E&&m.isCount&&(y=o.unreadIndex||y,u=y-g);let T=getDraftKey(s),_=Storage.get(T);_=utils.isEmpty(_)?"":_,utils.extend(s,{draft:_}),utils.isEmpty(p)||utils.extend(s,{tags:p});let C=o.sentTime||s.sortTime;// 如果是自己发发送的群发消息不更新会话列表, 自己本地发送的消息通过 isMass 区分,接收或同步消息通过消息位计算
|
|
63
63
|
o.isMass&&E&&(C=s.sortTime),s=utils.extend(s,{sortTime:C,unreadCount:u,latestUnreadIndex:y,latestReadIndex:g}),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,用来判断是否是过期的删除指令
|
|
64
64
|
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=m(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,m=t=>{let n=utils.find(e,({conversationType:e,conversationId:n})=>utils.isEqual(t.conversationType,e)&&utils.isEqual(t.conversationId,n));return e[n]||{}},l=()=>t,E=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:l,add:i,relpace:d,setSynced:o,modify:p,getPer:m,read:E,isExisted:n}}// 特性检查
|
|
65
65
|
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,push:d}=e;n=utils.toJSON(n);let p=$root.lookup("codec.UpMsg"),c={};if(s){let{members:t=[],mentionType:e}=s;t=utils.map(t,e=>({userId:e.id})),utils.extend(c,{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 = {
|
|
@@ -76,7 +76,7 @@ if(utils.isUndefined(R.name)){let e=UserCacher.get(A);R=utils.isEmpty(e)?{id:A}:
|
|
|
76
76
|
utils.isEmpty(m)||Storage.setPrefix(`${d}_${m}`);let l=common.getNaviStorageKey(d,m),E=Storage.get(l);return utils.isEmpty(E)?void utils.forEach(e,t=>{let m=t.replaceAll(/http:\/\/|https:\/\/|file:\/\//g,""),{http:E}=utils.getProtocol(t);m=`${E}//${m}/navigator/general`;let u={headers:{"x-appkey":d,"x-token":p}},g=utils.requestNormal(m,u,{success:function(e,t){if(!r){let{responseURL:i}=t,a=i.replace(/(\/navigator\/general)/g,"");r=!0;let{code:p,data:m={}}=e,{servers:E,user_id:u}=m,g={servers:E,userId:u,code:p,url:a};// 默认规则:导航和 CMP 的协议必须一致
|
|
77
77
|
utils.isEmpty(E)||(Storage.set(c,u),Storage.setPrefix(`${d}_${u}`),l=common.getNaviStorageKey(),Storage.set(l,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:E}),n(E))};var Network={detect,getNavis};function Consumer(){let e=[],t=!1,n=!1,s=(t,n)=>n?e.unshift(t):void e.push(t),o=s=>{// 如果正在执行,终止本次任务,执行任务结束后自动消费队列 ntf, 1 是首次,所以判断大于 1
|
|
78
78
|
if(n)return;n=!0,t=utils.isEqual(e.length,0);let i=e.shift(),r={item:i},a=()=>{n=!1,o(s)};t?n=!1:s(r,a)};return{consume:o,produce:s}}function MessageSyncer(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(i,r){let{user:a,msg:d,name:p,$message:c}=i,m=Storage.get(STORAGE.SYNC_RECEIVED_MSG_TIME).time||1700927161470,l=Storage.get(STORAGE.SYNC_SENT_MSG_TIME).time||1700927161470;// 如果本地记录时间戳大于 ntf 中的接收时间,认为消息已被当前端接收过,不再执行拉取动作
|
|
79
|
-
if(m>=d.receiveTime)return s.info({tag:LOG_MODULE.MSG_SYNC,syncReceiveTime:m,msg:d}),r();let E={userId:a.id,syncTime:m,containsSendBox:!0,sendBoxSyncTime:l,topic:COMMAND_TOPICS.SYNC_MESSAGES};e(SIGNAL_CMD.QUERY,E,({isFinished:e,messages:a,code:p})=>{if(s.info({tag:LOG_MODULE.MSG_SYNC,data:E,msg:d,code:p,count:a.length}),!utils.isEqual(p,ErrorType.COMMAND_SUCCESS.code))return r();let m=[];utils.forEach(a,(e,t)=>{let{flags:n,sentTime:s,isSender:o}=e,i=common.formatter.toMsg(n);i.isStorage&&m.push(e)}),c.insertBatchMsgs({msgs:utils.clone(m)}).then(()=>{utils.forEach(a,(s,o)=>{let{sentTime:i,isSender:r}=s,d=common.updateSyncTime({sentTime:i,isSender:r,io:n});if(d){let n=e&&utils.isEqual(a.length-1,o);t.emit(SIGNAL_NAME.CMD_RECEIVED,[s,n])}});let s=!e;s&&o.produce(i,s),r()})})}function d(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 s.info({tag:LOG_MODULE.CONV_SYNC,syncTime:c,time:d}),i();let m={userId:r.id,syncTime:c,topic:COMMAND_TOPICS.SYNC_CONVERSATIONS,count:200};e(SIGNAL_CMD.QUERY,m,e=>{let{isFinished:r,conversations:a,code:d}=e;if(s.info({tag:LOG_MODULE.CONV_SYNC,data:m,code:d,count:a.length}),!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),i();let l=a.length,E=a[l-1]||{syncTime:0},{syncTime:u}=E;u>c&&(Storage.set(STORAGE.SYNC_CONVERSATION_TIME,{time:u}),n=utils.extend(n,{time:u})),a=utils.clone(a),p._batchInsertConversations({conversations:a,syncTime:u}).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()})})}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_SYNC_CONVERSATION_NTF)&&d(e,t),utils.isEqual(n,SIGNAL_NAME.S_NTF)&&a(e,t)})};return{exec:i}}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 ChatroomSyncer(e,t,n,{logger:s}){let o=Consumer(),i=n=>{function i(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.CHATROOM)&&i&&a(e,t),utils.isEqual(n.type,NOTIFY_TYPE.CHATROOM_DESTORY)&&i&&r(e,t)}function r(e,n){let{msg:s}=e,o=s.targetId;t.emit(SIGNAL_NAME.CMD_CHATROOM_DESTROY,{id:o}),n()}function a(n,o){let{msg:i}=n,r=i.targetId,a=d(r);if(a>=i.receiveTime&&0<i.receiveTime)return s.info({tag:LOG_MODULE.MSG_SYNC,syncTime:a,msg:i}),o();let c={syncTime:a,chatroomId:r,topic:COMMAND_TOPICS.SYNC_CHATROOM_MESSAGES};e(SIGNAL_CMD.QUERY,c,({messages:e,code:n})=>{if(s.info({tag:LOG_MODULE.MSG_SYNC,data:c,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=>{p(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 d(e){let t=chatroomCacher$1.get(e);return t.syncMsgTime||0}function p(e,t){let n=d(e);t>n&&chatroomCacher$1.set(e,{syncMsgTime:t})}o.produce(n),o.consume(({item:e},t)=>{let{name:n}=e;utils.isEqual(n,SIGNAL_NAME.S_NTF)&&i(e,t)})};return{exec:i}}function ChatroomAttSyncer(e,t,n,{logger:s}){let o=Consumer(),i=n=>{function i(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.CHATROOM_ATTR)&&i&&r(e,t)}function r(n,o){let{msg:i}=n,r=i.targetId,p=a(r);if(p>=i.receiveTime&&0<i.receiveTime)return o();let c={syncTime:p,chatroomId:r,targetId:r,topic:COMMAND_TOPICS.SYNC_CHATROOM_ATTRS};e(SIGNAL_CMD.QUERY,c,e=>{let{code:n,attrs:r,chatroomId:a}=e;return s.info({tag:LOG_MODULE.MSG_SYNC,data:c,msg:i,code:n,count:r.length}),utils.isEqual(n,ErrorType.COMMAND_SUCCESS.code)?void(utils.forEach(r,e=>{d(a,e.updateTime)}),t.emit(SIGNAL_NAME.CMD_CHATROOM_ATTR_RECEIVED,{attrs:r,chatroomId:a}),o()):o()})}function a(e){let t=chatroomCacher$1.get(e);return t.syncAttTime||0}function d(e,t){let n=a(e);t>n&&chatroomCacher$1.set(e,{syncAttTime:t})}o.produce(n),o.consume(({item:e},t)=>{let{name:n}=e;utils.isEqual(n,SIGNAL_NAME.S_NTF)&&i(e,t)})};return{exec:i}}function TagSyncer(e,t,n,{logger:s}){let o=({$conversation:e})=>{let{id:s}=n.getCurrentUser(),o={topic:COMMAND_TOPICS.CONVERSATION_TAG_QUERY,userId:s};n.sendCommand(SIGNAL_CMD.QUERY,o,n=>{let{code:s,tags:o}=n;utils.isEqual(ErrorType.COMMAND_SUCCESS.code,s)&&(utils.map(o,e=>{let t=CONVERSATION_TAG[e.id]||{};return utils.extend(e,t),e}),e._batchInsertTags(o).then(e=>{t.emit(SIGNAL_NAME.CMD_SYNC_TAG_FINISHED,e)}))})};return{exec:o}}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.7.
|
|
79
|
+
if(m>=d.receiveTime)return s.info({tag:LOG_MODULE.MSG_SYNC,syncReceiveTime:m,msg:d}),r();let E={userId:a.id,syncTime:m,containsSendBox:!0,sendBoxSyncTime:l,topic:COMMAND_TOPICS.SYNC_MESSAGES};e(SIGNAL_CMD.QUERY,E,({isFinished:e,messages:a,code:p})=>{if(s.info({tag:LOG_MODULE.MSG_SYNC,data:E,msg:d,code:p,count:a.length}),!utils.isEqual(p,ErrorType.COMMAND_SUCCESS.code))return r();let m=[];utils.forEach(a,(e,t)=>{let{flags:n,sentTime:s,isSender:o}=e,i=common.formatter.toMsg(n);i.isStorage&&m.push(e)}),c.insertBatchMsgs({msgs:utils.clone(m)}).then(()=>{utils.forEach(a,(s,o)=>{let{sentTime:i,isSender:r}=s,d=common.updateSyncTime({sentTime:i,isSender:r,io:n});if(d){let n=e&&utils.isEqual(a.length-1,o);t.emit(SIGNAL_NAME.CMD_RECEIVED,[s,n])}});let s=!e;s&&o.produce(i,s),r()})})}function d(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 s.info({tag:LOG_MODULE.CONV_SYNC,syncTime:c,time:d}),i();let m={userId:r.id,syncTime:c,topic:COMMAND_TOPICS.SYNC_CONVERSATIONS,count:200};e(SIGNAL_CMD.QUERY,m,e=>{let{isFinished:r,conversations:a,code:d}=e;if(s.info({tag:LOG_MODULE.CONV_SYNC,data:m,code:d,count:a.length}),!utils.isEqual(d,ErrorType.COMMAND_SUCCESS.code))return t.emit(SIGNAL_NAME.CMD_SYNC_CONVERSATION_FINISHED,{}),i();let l=a.length,E=a[l-1]||{syncTime:0},{syncTime:u}=E;u>c&&(Storage.set(STORAGE.SYNC_CONVERSATION_TIME,{time:u}),n=utils.extend(n,{time:u})),a=utils.clone(a),p._batchInsertConversations({conversations:a,syncTime:u}).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()})})}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_SYNC_CONVERSATION_NTF)&&d(e,t),utils.isEqual(n,SIGNAL_NAME.S_NTF)&&a(e,t)})};return{exec:i}}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 ChatroomSyncer(e,t,n,{logger:s}){let o=Consumer(),i=n=>{function i(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.CHATROOM)&&i&&a(e,t),utils.isEqual(n.type,NOTIFY_TYPE.CHATROOM_DESTORY)&&i&&r(e,t)}function r(e,n){let{msg:s}=e,o=s.targetId;t.emit(SIGNAL_NAME.CMD_CHATROOM_DESTROY,{id:o}),n()}function a(n,o){let{msg:i}=n,r=i.targetId,a=d(r);if(a>=i.receiveTime&&0<i.receiveTime)return s.info({tag:LOG_MODULE.MSG_SYNC,syncTime:a,msg:i}),o();let c={syncTime:a,chatroomId:r,topic:COMMAND_TOPICS.SYNC_CHATROOM_MESSAGES};e(SIGNAL_CMD.QUERY,c,({messages:e,code:n})=>{if(s.info({tag:LOG_MODULE.MSG_SYNC,data:c,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=>{p(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 d(e){let t=chatroomCacher$1.get(e);return t.syncMsgTime||0}function p(e,t){let n=d(e);t>n&&chatroomCacher$1.set(e,{syncMsgTime:t})}o.produce(n),o.consume(({item:e},t)=>{let{name:n}=e;utils.isEqual(n,SIGNAL_NAME.S_NTF)&&i(e,t)})};return{exec:i}}function ChatroomAttSyncer(e,t,n,{logger:s}){let o=Consumer(),i=n=>{function i(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.CHATROOM_ATTR)&&i&&r(e,t)}function r(n,o){let{msg:i}=n,r=i.targetId,p=a(r);if(p>=i.receiveTime&&0<i.receiveTime)return o();let c={syncTime:p,chatroomId:r,targetId:r,topic:COMMAND_TOPICS.SYNC_CHATROOM_ATTRS};e(SIGNAL_CMD.QUERY,c,e=>{let{code:n,attrs:r,chatroomId:a}=e;return s.info({tag:LOG_MODULE.MSG_SYNC,data:c,msg:i,code:n,count:r.length}),utils.isEqual(n,ErrorType.COMMAND_SUCCESS.code)?void(utils.forEach(r,e=>{d(a,e.updateTime)}),t.emit(SIGNAL_NAME.CMD_CHATROOM_ATTR_RECEIVED,{attrs:r,chatroomId:a}),o()):o()})}function a(e){let t=chatroomCacher$1.get(e);return t.syncAttTime||0}function d(e,t){let n=a(e);t>n&&chatroomCacher$1.set(e,{syncAttTime:t})}o.produce(n),o.consume(({item:e},t)=>{let{name:n}=e;utils.isEqual(n,SIGNAL_NAME.S_NTF)&&i(e,t)})};return{exec:i}}function TagSyncer(e,t,n,{logger:s}){let o=({$conversation:e})=>{let{id:s}=n.getCurrentUser(),o={topic:COMMAND_TOPICS.CONVERSATION_TAG_QUERY,userId:s};n.sendCommand(SIGNAL_CMD.QUERY,o,n=>{let{code:s,tags:o}=n;utils.isEqual(ErrorType.COMMAND_SUCCESS.code,s)&&(utils.map(o,e=>{let t=CONVERSATION_TAG[e.id]||{};return utils.extend(e,t),e}),e._batchInsertTags(o).then(e=>{t.emit(SIGNAL_NAME.CMD_SYNC_TAG_FINISHED,e)}))})};return{exec:o}}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.7.12";/*
|
|
80
80
|
fileCompressLimit: 图片缩略图压缩限制,小于设置数值将不执行压缩,单位 KB
|
|
81
81
|
config = { appkey, nav, isSync, upload, uploadType, fileCompressLimit }
|
|
82
82
|
*/function IO(e){function t(){m&&L.exec({msg:{type:NOTIFY_TYPE.MSG},name:SIGNAL_NAME.S_NTF,$message:e.$message,user:{id:M.id}})}function n(){return M}function s(){return e}function o(t){utils.extend(e,t)}function i(e,t){let n={topic:COMMAND_TOPICS.GET_USER_INFO,userId:e.id};k(SIGNAL_CMD.QUERY,n,e=>{t(e)})}let r=Emitter(),{appkey:a,navList:d,serverList:c=[],isSync:m=!0,reconnectCount:l=100,logger:p}=e;utils.isArray(d)||(d=["https://nav.fake.com"]);let E={},u={},g=Cache(),y=Decoder(g,u),T=Encoder(g),_=Timer({timeout:HEART_TIMEOUT}),C=Timer({timeout:SYNC_MESSAGE_TIME}),f=!0,S=CONNECT_STATE.DISCONNECTED,O=[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],I=e=>{S=e.state,r.emit(SIGNAL_NAME.CONN_CHANGED,{...e})},A=()=>{_.pause(),C.pause()},N=!1,R=(e={})=>{let{code:t}=e;if(!N&&!utils.isInclude(O,t)&&!utils.isEqual(S,CONNECT_STATE.DISCONNECTED)){let e=n();return A(),U(e,({next:e})=>{e()})}if(!utils.isEqual(S,CONNECT_STATE.DISCONNECTED)){let t=n();I({state:CONNECT_STATE.DISCONNECTED,...e,user:t}),A()}},M={},v=e=>{utils.extend(M,e)},h=e=>{let t=common.getNaviStorageKey(a,e);Storage.remove(t)},D=({token:e,deviceId:t,_isReconnect:n=!1},s)=>{function o({servers:n,userId:o}){v({id:o,token:e,deviceId:t}),g.set(SIGNAL_NAME.S_CONNECT_ACK,s),Network.detect(n,(n,i)=>{// 如果嗅探失败,返回连接断开,同时清理已缓存的 CMP 地址
|