@onyx-p/imlib-web 2.2.2 → 2.2.4

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.esm.js CHANGED
@@ -20492,7 +20492,7 @@ const parseSingleDialogMessages = (dialogId, originalMessageList, aesKey) => {
20492
20492
  messageType: messageInstance.messageType,
20493
20493
  isOffLineMessage: false,
20494
20494
  isPersited: messageInstance.isPersited,
20495
- messageId: Long.isLong(dialogMessage.localId) ? dialogMessage.localId.toString() : undefined,
20495
+ messageId: Long.isLong(dialogMessage.localId) ? dialogMessage.localId.toNumber : 0,
20496
20496
  messageUId: dialogMessage.msgId.toString(),
20497
20497
  sentTime: dialogMessage.seqno.toString(),
20498
20498
  sentStatus: SentStatus.SENT,
@@ -20562,7 +20562,7 @@ const parseChatRecordMsgDetails$1 = (conversationOpt, msgDetails) => {
20562
20562
  messageType: messageInstance.messageType,
20563
20563
  isOffLineMessage: false,
20564
20564
  isPersited: messageInstance.isPersited,
20565
- messageId: item.msgId + '',
20565
+ messageId: 0,
20566
20566
  messageUId: item.msgId + '',
20567
20567
  sentTime: item.msgSendTime + '',
20568
20568
  sentStatus: SentStatus.SENT,
@@ -20704,6 +20704,21 @@ var MessageReceiptManager$1 = {
20704
20704
  }
20705
20705
  };
20706
20706
 
20707
+ let oldestMessageId = 0;
20708
+ let lastMessageId = 0;
20709
+ function setInitialMessageId(oldestMessageId_tmp, lastMessageId_tmp) {
20710
+ oldestMessageId = oldestMessageId_tmp;
20711
+ lastMessageId = lastMessageId_tmp;
20712
+ }
20713
+ function generateNewMessageId() {
20714
+ lastMessageId++;
20715
+ return lastMessageId;
20716
+ }
20717
+ function generateOldMessageId() {
20718
+ oldestMessageId--;
20719
+ return oldestMessageId;
20720
+ }
20721
+
20707
20722
  class MessageLoader {
20708
20723
  watcher;
20709
20724
  pullingMsg = false;
@@ -20807,6 +20822,9 @@ class MessageLoader {
20807
20822
  RecallMessageStore.remove(m.content.messageUId);
20808
20823
  } else {
20809
20824
  m.isOffLineMessage = isOffLineMessage;
20825
+ if (!m.messageId) {
20826
+ m.messageId = generateNewMessageId();
20827
+ }
20810
20828
  ConversationManager$1.get().setConversationCacheByMessage(m);
20811
20829
  messageList.push(m);
20812
20830
  if (m.messageType === MessageTypes.RECALL) {
@@ -20846,8 +20864,18 @@ class MessageLoader {
20846
20864
  MessageReceiptManager$1.get()?.sendArrivalReceipts(normalMessages);
20847
20865
  }
20848
20866
  if (done) {
20849
- if (seqno.ge(this.serverMsgSeqno)) {
20850
- this.serverMsgSeqno = seqno;
20867
+ let seqNo_long;
20868
+ if (seqno) {
20869
+ if (Long.isLong(seqno)) {
20870
+ seqNo_long = seqno;
20871
+ } else if (typeof seqno === 'string') {
20872
+ seqNo_long = Long.fromString(seqno);
20873
+ } else if (typeof seqno === 'number') {
20874
+ seqNo_long = Long.fromNumber(seqno);
20875
+ }
20876
+ }
20877
+ if (seqNo_long && Long.isLong(seqNo_long) && seqNo_long.ge(this.serverMsgSeqno)) {
20878
+ this.serverMsgSeqno = seqNo_long;
20851
20879
  }
20852
20880
  const isFinished = this.serverMsgSeqno.lessThanOrEqual(offset);
20853
20881
  logger.info(`pullMsg success -> syncTime: ${offset}, finished: ${isFinished}`);
@@ -20984,10 +21012,10 @@ class MessageCache {
20984
21012
  currentAppKey = '';
20985
21013
  currentUserId = '';
20986
21014
  APP_INFO_KEY = 'im_app_info';
20987
- DB_NAME_PREFIX = 'im_message_cache';
21015
+ DB_NAME_PREFIX = 'im_message_cache_new';
20988
21016
  DB_VERSION = 2;
20989
- STORE_NAME = 'messages';
20990
- DIALOG_STATE_STORE = 'dialogStates';
21017
+ STORE_NAME = 'messages_new';
21018
+ DIALOG_STATE_STORE = 'dialogStates_new';
20991
21019
  encryptKey = {
20992
21020
  key: ''
20993
21021
  };
@@ -20995,7 +21023,8 @@ class MessageCache {
20995
21023
  SALT_SUFFIX = 'im_message_cache_salt_suffix';
20996
21024
  constructor(appKey, userId) {
20997
21025
  this.generateEncryptKey(appKey, userId);
20998
- this.init(appKey, userId);
21026
+ this.currentAppKey = appKey;
21027
+ this.currentUserId = userId;
20999
21028
  }
21000
21029
  generateEncryptKey(appKey, userId) {
21001
21030
  const saltedInput = `${this.SALT_PREFIX}${appKey}_${userId}${this.SALT_SUFFIX}`;
@@ -21013,9 +21042,7 @@ class MessageCache {
21013
21042
  iv: iv
21014
21043
  };
21015
21044
  }
21016
- async init(appKey, userId) {
21017
- this.currentAppKey = appKey;
21018
- this.currentUserId = userId;
21045
+ async initDB() {
21019
21046
  await this.checkAndResetDatabase();
21020
21047
  await this.initDatabase();
21021
21048
  }
@@ -21028,7 +21055,7 @@ class MessageCache {
21028
21055
  await this.deleteDatabase();
21029
21056
  }
21030
21057
  } catch (error) {
21031
- console.error('解析存储的AppKey和UserId出错', error);
21058
+ logger.error('解析存储的AppKey和UserId出错', error);
21032
21059
  await this.deleteDatabase();
21033
21060
  }
21034
21061
  }
@@ -21048,11 +21075,11 @@ class MessageCache {
21048
21075
  const dbName = this.getDBName();
21049
21076
  const deleteRequest = indexedDB.deleteDatabase(dbName);
21050
21077
  deleteRequest.onsuccess = () => {
21051
- console.log(`数据库 ${dbName} 已成功删除`);
21078
+ logger.info(`数据库 ${dbName} 已成功删除`);
21052
21079
  resolve();
21053
21080
  };
21054
21081
  deleteRequest.onerror = event => {
21055
- console.error(`删除数据库 ${dbName} 失败`, event);
21082
+ logger.error(`删除数据库 ${dbName} 失败`, event);
21056
21083
  resolve();
21057
21084
  };
21058
21085
  });
@@ -21065,7 +21092,7 @@ class MessageCache {
21065
21092
  const dbName = this.getDBName();
21066
21093
  const request = indexedDB.open(dbName, this.DB_VERSION);
21067
21094
  request.onerror = event => {
21068
- console.error('数据库打开失败', event);
21095
+ logger.error('数据库打开失败', event);
21069
21096
  reject(new Error('数据库打开失败'));
21070
21097
  };
21071
21098
  request.onsuccess = event => {
@@ -21073,7 +21100,7 @@ class MessageCache {
21073
21100
  this.loadAllDialogStates().then(() => {
21074
21101
  resolve();
21075
21102
  }).catch(err => {
21076
- console.error('加载会话状态失败', err);
21103
+ logger.error('加载会话状态失败', err);
21077
21104
  resolve();
21078
21105
  });
21079
21106
  };
@@ -21081,7 +21108,10 @@ class MessageCache {
21081
21108
  const db = event.target.result;
21082
21109
  if (!db.objectStoreNames.contains(this.STORE_NAME)) {
21083
21110
  const store = db.createObjectStore(this.STORE_NAME, {
21084
- keyPath: 'messageUId'
21111
+ keyPath: 'messageId'
21112
+ });
21113
+ store.createIndex('messageUId', 'messageUId', {
21114
+ unique: true
21085
21115
  });
21086
21116
  store.createIndex('dialogId', 'dialogId', {
21087
21117
  unique: false
@@ -21145,7 +21175,7 @@ class MessageCache {
21145
21175
  resolve();
21146
21176
  };
21147
21177
  request.onerror = event => {
21148
- console.error('更新会话状态失败', event);
21178
+ logger.error('更新会话状态失败', event);
21149
21179
  reject(new Error('更新会话状态失败'));
21150
21180
  };
21151
21181
  });
@@ -21156,7 +21186,7 @@ class MessageCache {
21156
21186
  const contentStr = JSON.stringify(content);
21157
21187
  return aes256Encrypt(contentStr, this.encryptKey);
21158
21188
  } catch (error) {
21159
- console.error('加密消息内容失败', error);
21189
+ logger.error('加密消息内容失败', error);
21160
21190
  return '';
21161
21191
  }
21162
21192
  }
@@ -21168,7 +21198,7 @@ class MessageCache {
21168
21198
  const decryptedStr = aes256Decrypt(encryptedHex, this.encryptKey);
21169
21199
  return JSON.parse(decryptedStr);
21170
21200
  } catch (error) {
21171
- console.error('解密消息内容失败', error);
21201
+ logger.error('解密消息内容失败', error);
21172
21202
  return null;
21173
21203
  }
21174
21204
  }
@@ -21198,7 +21228,7 @@ class MessageCache {
21198
21228
  resolve();
21199
21229
  };
21200
21230
  transaction.onerror = event => {
21201
- console.error('添加消息事务失败', event);
21231
+ logger.error('添加消息事务失败', event);
21202
21232
  reject(new Error('添加消息事务失败'));
21203
21233
  };
21204
21234
  });
@@ -21241,7 +21271,7 @@ class MessageCache {
21241
21271
  try {
21242
21272
  message.content = this.decryptContent(message.content);
21243
21273
  } catch (error) {
21244
- console.error('解密消息内容失败', error);
21274
+ logger.error('解密消息内容失败', error);
21245
21275
  message.content = null;
21246
21276
  }
21247
21277
  }
@@ -21265,7 +21295,7 @@ class MessageCache {
21265
21295
  };
21266
21296
  };
21267
21297
  transaction.onerror = event => {
21268
- console.error('获取消息事务失败', event);
21298
+ logger.error('获取消息事务失败', event);
21269
21299
  reject(new Error('获取消息事务失败'));
21270
21300
  };
21271
21301
  });
@@ -21370,7 +21400,7 @@ class MessageCache {
21370
21400
  }
21371
21401
  };
21372
21402
  deleteRequest.onerror = event => {
21373
- console.error('删除消息失败', id, event);
21403
+ logger.error('删除消息失败', id, event);
21374
21404
  if (!hasError) {
21375
21405
  hasError = true;
21376
21406
  reject(new Error('删除消息失败'));
@@ -21476,131 +21506,142 @@ class MessageCache {
21476
21506
  }
21477
21507
  };
21478
21508
  request.onerror = event => {
21479
- console.error('清除过期消息失败', event);
21509
+ logger.error('清除过期消息失败', event);
21480
21510
  reject(new Error('清除过期消息失败'));
21481
21511
  };
21482
21512
  });
21483
21513
  }
21484
- async getMessagesByPage(dialogId, pageSize = 20, cursorPosition = null) {
21514
+ async getLatestMessage(conversation) {
21515
+ const dialogId = getFullDialogId(conversation);
21485
21516
  if (!this.db) {
21486
- return {
21487
- messages: [],
21488
- nextCursor: null
21489
- };
21517
+ return null;
21490
21518
  }
21491
21519
  return new Promise((resolve, reject) => {
21492
21520
  const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21493
21521
  const store = transaction.objectStore(this.STORE_NAME);
21494
21522
  const index = store.index('dialogId_sentTime');
21495
- const range = IDBKeyRange.bound([dialogId, cursorPosition || ''], [dialogId, '\uffff']);
21496
- const messages = [];
21497
- let nextCursor = null;
21498
- let count = 0;
21499
- const cursorRequest = index.openCursor(range);
21523
+ const range = IDBKeyRange.bound([dialogId, ''], [dialogId, '\uffff']);
21524
+ const direction = 'prev';
21525
+ const cursorRequest = index.openCursor(range, direction);
21500
21526
  cursorRequest.onsuccess = event => {
21501
21527
  const cursor = event.target.result;
21502
- if (cursor && count < pageSize) {
21503
- messages.push(cursor.value);
21504
- count++;
21505
- cursor.continue();
21506
- } else if (cursor) {
21507
- nextCursor = cursor.value.sentTime;
21528
+ if (cursor) {
21529
+ const message = {
21530
+ ...cursor.value
21531
+ };
21532
+ if (typeof message.content === 'string' && message.content) {
21533
+ try {
21534
+ message.content = this.decryptContent(message.content);
21535
+ } catch (error) {
21536
+ logger.error('解密消息内容失败', error);
21537
+ message.content = null;
21538
+ }
21539
+ }
21540
+ resolve(message);
21508
21541
  } else {
21509
- nextCursor = null;
21510
- }
21511
- if (!cursor || count >= pageSize) {
21512
- resolve({
21513
- messages,
21514
- nextCursor
21515
- });
21542
+ resolve(null);
21516
21543
  }
21517
21544
  };
21518
21545
  cursorRequest.onerror = event => {
21519
- reject(new Error('获取分页消息失败'));
21546
+ logger.error('获取最新消息失败', event);
21547
+ resolve(null);
21520
21548
  };
21521
21549
  });
21522
21550
  }
21523
- async updateMessagesStatus(messageUIds, newStatus) {
21524
- if (!this.db || messageUIds.length === 0) {
21525
- return;
21551
+ async upsertMessage(message) {
21552
+ if (!this.db) {
21553
+ throw new Error('数据库未初始化');
21526
21554
  }
21527
21555
  return new Promise((resolve, reject) => {
21528
21556
  const transaction = this.db.transaction(this.STORE_NAME, 'readwrite');
21529
21557
  const store = transaction.objectStore(this.STORE_NAME);
21530
- let completed = 0;
21531
- let hasError = false;
21532
- messageUIds.forEach(id => {
21533
- const getRequest = store.get(id);
21534
- getRequest.onsuccess = () => {
21535
- const message = getRequest.result;
21536
- if (message) {
21537
- message.receivedStatus = newStatus;
21538
- store.put(message);
21539
- }
21540
- completed++;
21541
- if (completed === messageUIds.length && !hasError) {
21542
- resolve();
21543
- }
21544
- };
21545
- getRequest.onerror = event => {
21546
- if (!hasError) {
21547
- hasError = true;
21548
- reject(new Error('更新消息状态失败'));
21549
- }
21550
- };
21551
- });
21552
- transaction.oncomplete = () => {
21558
+ const messageToStore = {
21559
+ ...message
21560
+ };
21561
+ if (messageToStore.content) {
21562
+ const encryptedContent = this.encryptContent(messageToStore.content);
21563
+ messageToStore.content = encryptedContent;
21564
+ }
21565
+ const request = store.put(messageToStore);
21566
+ request.onsuccess = () => {
21553
21567
  resolve();
21554
21568
  };
21555
- transaction.onerror = event => {
21556
- reject(new Error('批量更新事务失败'));
21569
+ request.onerror = event => {
21570
+ logger.error('更新/插入消息失败', event);
21571
+ reject(new Error('更新/插入消息失败'));
21557
21572
  };
21558
21573
  });
21559
21574
  }
21560
- async changeUser(appKey, userId) {
21561
- if (this.currentAppKey === appKey && this.currentUserId === userId) {
21562
- return;
21563
- }
21564
- this.currentAppKey = appKey;
21565
- this.currentUserId = userId;
21566
- this.generateEncryptKey(appKey, userId);
21567
- await this.checkAndResetDatabase();
21568
- await this.initDatabase();
21569
- }
21570
- async getLatestMessage(conversation) {
21571
- const dialogId = getFullDialogId(conversation);
21575
+ async getMessageById(messageId) {
21572
21576
  if (!this.db) {
21573
21577
  return null;
21574
21578
  }
21575
21579
  return new Promise((resolve, reject) => {
21576
21580
  const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21577
21581
  const store = transaction.objectStore(this.STORE_NAME);
21578
- const index = store.index('dialogId_sentTime');
21579
- const range = IDBKeyRange.bound([dialogId, ''], [dialogId, '\uffff']);
21580
- const direction = 'prev';
21581
- const cursorRequest = index.openCursor(range, direction);
21582
- cursorRequest.onsuccess = event => {
21583
- const cursor = event.target.result;
21584
- if (cursor) {
21585
- const message = {
21586
- ...cursor.value
21582
+ const request = store.get(messageId);
21583
+ request.onsuccess = () => {
21584
+ const message = request.result;
21585
+ if (message) {
21586
+ const decryptedMessage = {
21587
+ ...message
21587
21588
  };
21588
- if (typeof message.content === 'string' && message.content) {
21589
+ if (typeof decryptedMessage.content === 'string' && decryptedMessage.content) {
21589
21590
  try {
21590
- message.content = this.decryptContent(message.content);
21591
+ decryptedMessage.content = this.decryptContent(decryptedMessage.content);
21591
21592
  } catch (error) {
21592
- console.error('解密消息内容失败', error);
21593
- message.content = null;
21593
+ logger.error('解密消息内容失败', error);
21594
+ decryptedMessage.content = null;
21594
21595
  }
21595
21596
  }
21596
- resolve(message);
21597
+ resolve(decryptedMessage);
21597
21598
  } else {
21598
21599
  resolve(null);
21599
21600
  }
21600
21601
  };
21601
- cursorRequest.onerror = event => {
21602
- console.error('获取最新消息失败', event);
21603
- reject(new Error('获取最新消息失败'));
21602
+ request.onerror = event => {
21603
+ logger.error('查询消息失败', event);
21604
+ resolve(null);
21605
+ };
21606
+ });
21607
+ }
21608
+ async getMessageIdRange() {
21609
+ if (!this.db) {
21610
+ return null;
21611
+ }
21612
+ return new Promise((resolve, reject) => {
21613
+ const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21614
+ const store = transaction.objectStore(this.STORE_NAME);
21615
+ let newest = null;
21616
+ let oldest = null;
21617
+ const oldestRequest = store.openCursor();
21618
+ oldestRequest.onsuccess = event => {
21619
+ const cursor = event.target.result;
21620
+ if (cursor) {
21621
+ oldest = cursor.value.messageId;
21622
+ const newestRequest = store.openCursor(null, 'prev');
21623
+ newestRequest.onsuccess = event => {
21624
+ const cursor = event.target.result;
21625
+ if (cursor) {
21626
+ newest = cursor.value.messageId;
21627
+ if (newest && oldest) {
21628
+ resolve({
21629
+ newest,
21630
+ oldest
21631
+ });
21632
+ } else {
21633
+ resolve(null);
21634
+ }
21635
+ } else {
21636
+ resolve(null);
21637
+ }
21638
+ };
21639
+ } else {
21640
+ resolve(null);
21641
+ }
21642
+ };
21643
+ transaction.onerror = event => {
21644
+ resolve(null);
21604
21645
  };
21605
21646
  });
21606
21647
  }
@@ -21717,16 +21758,29 @@ class LibLoader {
21717
21758
  webSocketServer.close();
21718
21759
  return Promise.resolve();
21719
21760
  }
21720
- setUserLogged() {
21761
+ async setUserLogged() {
21721
21762
  ConversationManager$1.get().destroyed();
21722
21763
  ConversationManager$1.create(this.options.appkey, accountStore.uid.toString(), this.watcher.conversationState);
21723
21764
  MessageReceiptManager$1.create(this.options.appkey, accountStore.uid.toString());
21724
- MessageCache$1.create(this.options.appkey, accountStore.uid.toString());
21725
21765
  this.messageLoader?.stop();
21726
21766
  this.messageLoader = new MessageLoader(this.watcher, this.options);
21727
21767
  SentMessageStore.reset();
21728
21768
  RecallMessageStore.reset();
21729
21769
  DialogSecretKey$1.reset();
21770
+ MessageCache$1.create(this.options.appkey, accountStore.uid.toString());
21771
+ MessageCache$1.get().initDB().then(() => {
21772
+ return MessageCache$1.get().getMessageIdRange();
21773
+ }).then(result => {
21774
+ if (result) {
21775
+ const {
21776
+ oldest,
21777
+ newest
21778
+ } = result;
21779
+ setInitialMessageId(oldest, newest);
21780
+ } else {
21781
+ setInitialMessageId(10000, 10000);
21782
+ }
21783
+ });
21730
21784
  if (this.getConnectionStatus() === ConnectionStatus.CONNECTED) {
21731
21785
  this.handleUserConnected();
21732
21786
  }
@@ -28370,37 +28424,31 @@ function requireProtobufjs () {
28370
28424
  var protobufjsExports = requireProtobufjs();
28371
28425
  var protobuf = /*@__PURE__*/getDefaultExportFromCjs(protobufjsExports);
28372
28426
 
28373
- const transSentAttrs2IReceivedMessage = (message, options, sentStatus = SentStatus.SENDING) => ({
28374
- conversationType: options.conversation.conversationType,
28375
- targetId: options.conversation.targetId,
28376
- senderUserId: options.senderUserId,
28377
- messageDirection: MessageDirection.SEND,
28378
- isCounted: message.isCounted,
28379
- isMentioned: false,
28380
- content: deepClone(message.content),
28381
- messageType: message.messageType,
28382
- isOffLineMessage: false,
28383
- isPersited: message.isPersited,
28384
- messageId: options.messageId,
28385
- messageUId: '0',
28386
- sentTime: options.sentTime,
28387
- sentStatus,
28388
- receivedTime: '0',
28389
- isStatusMessage: message.isStatusMessage,
28390
- receivedStatus: ReceivedStatus.IDLE,
28391
- disableNotification: true,
28392
- burnAfterReadingFlag: false
28393
- });
28394
-
28395
- let UniqueLocalId = 0;
28396
- function generateMessageId() {
28397
- UniqueLocalId++;
28398
- const time = getServerTime$1();
28399
- if (UniqueLocalId < time) {
28400
- UniqueLocalId = time;
28401
- }
28402
- return 230000000000000 + UniqueLocalId;
28403
- }
28427
+ const transSentAttrs2IReceivedMessage = (message, options, sentStatus = SentStatus.SENDING) => {
28428
+ const conversation = ConversationManager$1.get().get(options.conversation);
28429
+ return {
28430
+ conversationType: options.conversation.conversationType,
28431
+ targetId: options.conversation.targetId,
28432
+ senderUserId: options.senderUserId,
28433
+ messageDirection: MessageDirection.SEND,
28434
+ isCounted: message.isCounted,
28435
+ isMentioned: false,
28436
+ content: deepClone(message.content),
28437
+ messageType: message.messageType,
28438
+ isOffLineMessage: false,
28439
+ isPersited: message.isPersited,
28440
+ messageId: options.messageId,
28441
+ messageUId: '0',
28442
+ sentTime: options.sentTime,
28443
+ sentStatus,
28444
+ receivedTime: options.sentTime,
28445
+ isStatusMessage: message.isStatusMessage,
28446
+ receivedStatus: ReceivedStatus.IDLE,
28447
+ disableNotification: true,
28448
+ burnAfterReadingFlag: conversation?.burnAfterReadingFlag ?? false,
28449
+ burnAfterReadingTime: conversation?.burnAfterReadingTime ?? 0
28450
+ };
28451
+ };
28404
28452
 
28405
28453
  const getBlobUrl = blob => {
28406
28454
  const URL = window.URL || window.webkitURL;
@@ -28871,10 +28919,12 @@ const sendRecallMessage = async (conversation, options) => {
28871
28919
  const sentAttris = {
28872
28920
  conversation,
28873
28921
  senderUserId: accountStore.uid,
28874
- messageId: '0',
28922
+ messageId: 0,
28875
28923
  sentTime: getServerTime$1().toString()
28876
28924
  };
28877
28925
  const receivedMessage = transSentAttrs2IReceivedMessage(recallCommandMessage, sentAttris, SentStatus.SENT);
28926
+ receivedMessage.burnAfterReadingFlag = false;
28927
+ receivedMessage.burnAfterReadingTime = 0;
28878
28928
  ConversationManager$1.get().setConversationCacheByMessage(receivedMessage);
28879
28929
  return {
28880
28930
  code: ErrorCode.SUCCESS,
@@ -28923,12 +28973,16 @@ async function createSendFunction(fileType, conversation, msgBody, hooks, sendOp
28923
28973
  });
28924
28974
  }
28925
28975
  async function internal_sendMessage(conversation, message, options, uploadOptions) {
28926
- const checkResult = beforeSend(conversation, message, options);
28976
+ const checkResult = await beforeSend(conversation, message, options);
28927
28977
  if (checkResult.code !== ErrorCode.SUCCESS || !checkResult.message || !checkResult.sentArgs) {
28928
28978
  return {
28929
28979
  code: checkResult.code
28930
28980
  };
28931
28981
  }
28982
+ {
28983
+ const receivedMessage = transSentAttrs2IReceivedMessage(checkResult.message, checkResult.sentArgs);
28984
+ await saveSentMessage(receivedMessage, checkResult.sentArgs);
28985
+ }
28932
28986
  let {
28933
28987
  message: sentMessage,
28934
28988
  sentArgs
@@ -28937,30 +28991,30 @@ async function internal_sendMessage(conversation, message, options, uploadOption
28937
28991
  const uploadResult = await uploadOptions.task(sentMessage, uploadOptions.files);
28938
28992
  sentMessage = uploadResult.message;
28939
28993
  if (!uploadResult.finished) {
28994
+ const receivedMessage = transSentAttrs2IReceivedMessage(checkResult.message, checkResult.sentArgs, SentStatus.FAILED);
28995
+ await saveSentMessage(receivedMessage, sentArgs);
28940
28996
  return {
28941
28997
  code: ErrorCode.UPLOAD_FILE_FAILED,
28942
- data: transSentAttrs2IReceivedMessage(sentMessage, sentArgs, SentStatus.FAILED)
28998
+ data: receivedMessage
28943
28999
  };
28944
29000
  }
28945
29001
  }
28946
29002
  return send(sentMessage, sentArgs);
28947
29003
  }
28948
- function beforeSend(conversation, message, options) {
28949
- if (!LibLoader.loader || LibLoader.loader.getConnectionStatus() !== ConnectionStatus.CONNECTED) {
28950
- return {
28951
- code: ErrorCode.RC_NET_CHANNEL_INVALID
28952
- };
28953
- }
29004
+ async function beforeSend(conversation, message, options) {
28954
29005
  const mediaAttribute = JSON.stringify(filterNullProperty(message.content));
28955
29006
  if (getByteLength(mediaAttribute) > MAX_MESSAGE_CONTENT_BYTES) {
28956
29007
  return {
28957
29008
  code: ErrorCode.RC_MSG_CONTENT_EXCEED_LIMIT
28958
29009
  };
28959
29010
  }
29011
+ if (message.isPersited) {
29012
+ await ConversationManager$1.get().loadConvsationsIfNotExist([conversation]);
29013
+ }
28960
29014
  const sentArgs = {
28961
29015
  conversation: conversation,
28962
29016
  senderUserId: accountStore.uid,
28963
- messageId: options?.messageId ?? generateMessageId().toString(),
29017
+ messageId: generateNewMessageId(),
28964
29018
  sentTime: getMessageSentTime().toString(),
28965
29019
  pushConfig: options?.pushConfig
28966
29020
  };
@@ -28977,12 +29031,6 @@ function beforeSend(conversation, message, options) {
28977
29031
  async function send(message, sentArgs) {
28978
29032
  const dialogId = getFullDialogId(sentArgs.conversation);
28979
29033
  const receivedMessage = transSentAttrs2IReceivedMessage(message, sentArgs);
28980
- if (message.isPersited) {
28981
- await ConversationManager$1.get().loadConvsationsIfNotExist([sentArgs.conversation]);
28982
- }
28983
- const conversation = ConversationManager$1.get().get(sentArgs.conversation);
28984
- receivedMessage.burnAfterReadingFlag = conversation?.burnAfterReadingFlag ?? false;
28985
- receivedMessage.burnAfterReadingTime = conversation?.burnAfterReadingTime ?? 0;
28986
29034
  const secretKey = await DialogSecretKey$1.getDialogAesKey(dialogId.toString());
28987
29035
  if (!secretKey) {
28988
29036
  receivedMessage.sentStatus = SentStatus.FAILED;
@@ -29005,7 +29053,7 @@ async function send(message, sentArgs) {
29005
29053
  const mediaEncryptedString = aes256Encrypt(mediaAttribute, secretKey);
29006
29054
  SentMessageStore.addMessage(sentArgs.messageId);
29007
29055
  const baseParams = {
29008
- localId: Long.fromString(sentArgs.messageId),
29056
+ localId: Long.fromNumber(sentArgs.messageId),
29009
29057
  mediaFlag: message.messageType !== MessageTypes.TEXT,
29010
29058
  mediaConstructor: message.messageType,
29011
29059
  msgPreContent: '',
@@ -29036,9 +29084,10 @@ async function send(message, sentArgs) {
29036
29084
  receivedMessage.sentTime = response.data.msgSendTime.toString();
29037
29085
  receivedMessage.messageUId = response.data.msgId.toString();
29038
29086
  receivedMessage.sentStatus = SentStatus.SENT;
29039
- ConversationManager$1.get().setConversationCacheByMessage(receivedMessage);
29087
+ await saveSentMessage(receivedMessage, sentArgs);
29040
29088
  } else {
29041
29089
  receivedMessage.sentStatus = SentStatus.FAILED;
29090
+ await saveSentMessage(receivedMessage, sentArgs);
29042
29091
  }
29043
29092
  return {
29044
29093
  code: response.code,
@@ -29054,6 +29103,18 @@ function getMessageSentTime() {
29054
29103
  }
29055
29104
  return UniqueSentTime;
29056
29105
  }
29106
+ async function saveSentMessage(receivedMessage, options) {
29107
+ try {
29108
+ const cache = MessageCache$1.get();
29109
+ if (receivedMessage.isPersited && cache) {
29110
+ await cache.upsertMessage(receivedMessage);
29111
+ const latestMessage = await cache.getLatestMessage(options.conversation);
29112
+ ConversationManager$1.get().updateLatestMessage(options.conversation, latestMessage);
29113
+ }
29114
+ } catch (error) {
29115
+ logger.error('saveSentMessage -> ', error);
29116
+ }
29117
+ }
29057
29118
 
29058
29119
  class IMClient extends EventEmitter {
29059
29120
  options;
@@ -29230,7 +29291,6 @@ class IMClient extends EventEmitter {
29230
29291
  });
29231
29292
  }
29232
29293
  async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
29233
- debugger;
29234
29294
  const cachedResult = await MessageCache$1.get().getPreviousMessages(conversation, timestamp ?? '0', count);
29235
29295
  if (!timestamp && cachedResult.messages.length) {
29236
29296
  ConversationManager$1.get().updateLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
@@ -29254,8 +29314,13 @@ class IMClient extends EventEmitter {
29254
29314
  return remotesResult;
29255
29315
  }
29256
29316
  const remotesMessages = remotesResult.data.list;
29317
+ for (let i = remotesMessages.length - 1; i >= 0; i--) {
29318
+ const message = remotesMessages[i];
29319
+ if (!message.messageId) {
29320
+ message.messageId = generateOldMessageId();
29321
+ }
29322
+ }
29257
29323
  if (!remotesTimestamp || remotesTimestamp == '0') {
29258
- debugger;
29259
29324
  ConversationManager$1.get().updateLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
29260
29325
  }
29261
29326
  MessageCache$1.get().addMessages(remotesMessages, conversation, !remotesResult.data.hasMore);