jugglechat-websdk 1.7.10 → 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 +110 -106
- 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,20 +255,20 @@ 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
|
}
|
|
269
269
|
declare class DisturbInfo {
|
|
270
|
-
type: UNDISTURB_TYPE
|
|
271
|
-
timezone: string
|
|
270
|
+
type: UNDISTURB_TYPE;
|
|
271
|
+
timezone: string;
|
|
272
272
|
times: TimeZone[];
|
|
273
273
|
}
|
|
274
274
|
declare class TagInfo {
|
|
@@ -276,47 +276,51 @@ declare class TagInfo {
|
|
|
276
276
|
name?: string;
|
|
277
277
|
conversations?: Conversation[]
|
|
278
278
|
}
|
|
279
|
-
interface
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
279
|
+
interface SendMsgCbData { message: Message, percent?: number, count?: number, total?: number }
|
|
280
|
+
interface SendMsgCbCompleteData {
|
|
281
|
+
messages: Message[]
|
|
282
|
+
}
|
|
283
|
+
interface SendMsgCallbacks {
|
|
284
|
+
onbefore?(message: Message): void;
|
|
285
|
+
onerror?(error: Error): void;
|
|
286
|
+
onprogress?(data: SendMsgCbData): void;
|
|
287
|
+
oncompleted?(data: SendMsgCbCompleteData): void;
|
|
284
288
|
}
|
|
285
|
-
interface GetMsgByIdOptions{
|
|
289
|
+
interface GetMsgByIdOptions {
|
|
286
290
|
conversationType: CONVERATION_TYPE,
|
|
287
291
|
conversationId: string;
|
|
288
292
|
messageIds: string[];
|
|
289
293
|
}
|
|
290
|
-
interface ClearMsgsOptions{
|
|
294
|
+
interface ClearMsgsOptions {
|
|
291
295
|
conversationType: CONVERATION_TYPE,
|
|
292
296
|
conversationId: string;
|
|
293
297
|
time: number;
|
|
294
298
|
}
|
|
295
|
-
interface ReadMember{
|
|
299
|
+
interface ReadMember {
|
|
296
300
|
readTime: number;
|
|
297
301
|
member: IMUser;
|
|
298
302
|
}
|
|
299
|
-
interface GetGroupMessageDetailResult{
|
|
303
|
+
interface GetGroupMessageDetailResult {
|
|
300
304
|
readCount: number;
|
|
301
305
|
unreadCount: number;
|
|
302
306
|
unreadMembers: ReadMember[];
|
|
303
307
|
readMembers: ReadMember[];
|
|
304
308
|
}
|
|
305
|
-
interface GetMentionOptions{
|
|
309
|
+
interface GetMentionOptions {
|
|
306
310
|
conversationType: CONVERATION_TYPE,
|
|
307
311
|
conversationId: string;
|
|
308
312
|
messageIndex: number;
|
|
309
313
|
count?: number;
|
|
310
314
|
order?: number;
|
|
311
315
|
}
|
|
312
|
-
interface SendMergeOptions{
|
|
316
|
+
interface SendMergeOptions {
|
|
313
317
|
conversationType: CONVERATION_TYPE,
|
|
314
318
|
conversationId: string;
|
|
315
319
|
messageIdList: string[];
|
|
316
|
-
previewList:
|
|
320
|
+
previewList: any;
|
|
317
321
|
title: string;
|
|
318
322
|
}
|
|
319
|
-
interface SearchOptions{
|
|
323
|
+
interface SearchOptions {
|
|
320
324
|
conversationType?: CONVERATION_TYPE,
|
|
321
325
|
conversationId?: string;
|
|
322
326
|
keywords: string[];
|
|
@@ -327,7 +331,7 @@ interface SearchOptions{
|
|
|
327
331
|
page?: number;
|
|
328
332
|
pageSize?: number;
|
|
329
333
|
}
|
|
330
|
-
interface SearchMatchMsg{
|
|
334
|
+
interface SearchMatchMsg {
|
|
331
335
|
conversationType: CONVERATION_TYPE;
|
|
332
336
|
conversationId: string;
|
|
333
337
|
conversationExts: string;
|
|
@@ -336,18 +340,18 @@ interface SearchMatchMsg{
|
|
|
336
340
|
matchedCount: number;
|
|
337
341
|
matchedList: Message[];
|
|
338
342
|
}
|
|
339
|
-
interface SearchResult{
|
|
343
|
+
interface SearchResult {
|
|
340
344
|
isFinished: boolean;
|
|
341
345
|
total: number;
|
|
342
346
|
list: SearchMatchMsg[];
|
|
343
347
|
}
|
|
344
|
-
interface ReactionOptions{
|
|
348
|
+
interface ReactionOptions {
|
|
345
349
|
conversationType: CONVERATION_TYPE;
|
|
346
350
|
conversationId: string;
|
|
347
351
|
messageId: string;
|
|
348
352
|
reactionId: string;
|
|
349
353
|
}
|
|
350
|
-
interface CustomMsgOption{
|
|
354
|
+
interface CustomMsgOption {
|
|
351
355
|
name: string;
|
|
352
356
|
isCount?: boolean;
|
|
353
357
|
isStorage?: boolean;
|
|
@@ -355,7 +359,7 @@ interface CustomMsgOption{
|
|
|
355
359
|
}
|
|
356
360
|
|
|
357
361
|
declare class IMProvider {
|
|
358
|
-
connect: (user: IMUser) => Promise
|
|
362
|
+
connect: (user: IMUser) => Promise<any>;
|
|
359
363
|
disconnect: () => Promise<any>;
|
|
360
364
|
getDevice: () => Promise<any>;
|
|
361
365
|
isConnected: () => boolean;
|
|
@@ -390,7 +394,7 @@ declare class IMProvider {
|
|
|
390
394
|
sendMessage: (message: Message, callbacks?: SendMsgCallbacks) => Promise<Message>;
|
|
391
395
|
sendMassMessage: (messages: Message[], callbacks?: SendMsgCallbacks) => Promise<any>;
|
|
392
396
|
getMessages: (conversation: Conversation) => Promise<{ isFinished: boolean, messages: Message[] }>;
|
|
393
|
-
removeMessages: (messages:
|
|
397
|
+
removeMessages: (messages: Message[]) => Promise<any>;
|
|
394
398
|
getMessagesByIds: (options: GetMsgByIdOptions) => Promise<{ messages: Message[] }>;
|
|
395
399
|
clearMessage: (options: ClearMsgsOptions) => Promise<any>;
|
|
396
400
|
recallMessage: (message: Message) => Promise<any>;
|
|
@@ -413,11 +417,11 @@ declare class IMProvider {
|
|
|
413
417
|
addMessageReaction: (message: ReactionOptions) => Promise<any>;
|
|
414
418
|
removeMessageReaction: (message: ReactionOptions) => Promise<any>;
|
|
415
419
|
registerMessage: (names: CustomMsgOption[]) => any;
|
|
416
|
-
isDesktop:
|
|
417
|
-
on: (name: string, event:
|
|
420
|
+
isDesktop: () => boolean;
|
|
421
|
+
on: (name: string, event: any) => any;
|
|
418
422
|
off: (name: string) => any;
|
|
419
423
|
clear: () => any;
|
|
420
|
-
once: (name: string, event:
|
|
424
|
+
once: (name: string, event: any) => any;
|
|
421
425
|
Event: EVENT;
|
|
422
426
|
ConnectionState: CONNECT_STATE;
|
|
423
427
|
ConversationType: CONVERATION_TYPE;
|
|
@@ -439,7 +443,7 @@ declare class IMProvider {
|
|
|
439
443
|
|
|
440
444
|
interface InitOptions {
|
|
441
445
|
appkey: string;
|
|
442
|
-
navList?:
|
|
446
|
+
navList?: string[];
|
|
443
447
|
isSync?: boolean;
|
|
444
448
|
upload?: Object;
|
|
445
449
|
}
|
|
@@ -465,4 +469,4 @@ declare namespace IMCore {
|
|
|
465
469
|
export let IMProvider: IMProvider;
|
|
466
470
|
}
|
|
467
471
|
|
|
468
|
-
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 地址
|