@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.umd.js CHANGED
@@ -20498,7 +20498,7 @@
20498
20498
  messageType: messageInstance.messageType,
20499
20499
  isOffLineMessage: false,
20500
20500
  isPersited: messageInstance.isPersited,
20501
- messageId: Long.isLong(dialogMessage.localId) ? dialogMessage.localId.toString() : undefined,
20501
+ messageId: Long.isLong(dialogMessage.localId) ? dialogMessage.localId.toNumber : 0,
20502
20502
  messageUId: dialogMessage.msgId.toString(),
20503
20503
  sentTime: dialogMessage.seqno.toString(),
20504
20504
  sentStatus: exports.SentStatus.SENT,
@@ -20568,7 +20568,7 @@
20568
20568
  messageType: messageInstance.messageType,
20569
20569
  isOffLineMessage: false,
20570
20570
  isPersited: messageInstance.isPersited,
20571
- messageId: item.msgId + '',
20571
+ messageId: 0,
20572
20572
  messageUId: item.msgId + '',
20573
20573
  sentTime: item.msgSendTime + '',
20574
20574
  sentStatus: exports.SentStatus.SENT,
@@ -20710,6 +20710,21 @@
20710
20710
  }
20711
20711
  };
20712
20712
 
20713
+ let oldestMessageId = 0;
20714
+ let lastMessageId = 0;
20715
+ function setInitialMessageId(oldestMessageId_tmp, lastMessageId_tmp) {
20716
+ oldestMessageId = oldestMessageId_tmp;
20717
+ lastMessageId = lastMessageId_tmp;
20718
+ }
20719
+ function generateNewMessageId() {
20720
+ lastMessageId++;
20721
+ return lastMessageId;
20722
+ }
20723
+ function generateOldMessageId() {
20724
+ oldestMessageId--;
20725
+ return oldestMessageId;
20726
+ }
20727
+
20713
20728
  class MessageLoader {
20714
20729
  watcher;
20715
20730
  pullingMsg = false;
@@ -20813,6 +20828,9 @@
20813
20828
  RecallMessageStore.remove(m.content.messageUId);
20814
20829
  } else {
20815
20830
  m.isOffLineMessage = isOffLineMessage;
20831
+ if (!m.messageId) {
20832
+ m.messageId = generateNewMessageId();
20833
+ }
20816
20834
  ConversationManager$1.get().setConversationCacheByMessage(m);
20817
20835
  messageList.push(m);
20818
20836
  if (m.messageType === MessageTypes.RECALL) {
@@ -20852,8 +20870,18 @@
20852
20870
  MessageReceiptManager$1.get()?.sendArrivalReceipts(normalMessages);
20853
20871
  }
20854
20872
  if (done) {
20855
- if (seqno.ge(this.serverMsgSeqno)) {
20856
- this.serverMsgSeqno = seqno;
20873
+ let seqNo_long;
20874
+ if (seqno) {
20875
+ if (Long.isLong(seqno)) {
20876
+ seqNo_long = seqno;
20877
+ } else if (typeof seqno === 'string') {
20878
+ seqNo_long = Long.fromString(seqno);
20879
+ } else if (typeof seqno === 'number') {
20880
+ seqNo_long = Long.fromNumber(seqno);
20881
+ }
20882
+ }
20883
+ if (seqNo_long && Long.isLong(seqNo_long) && seqNo_long.ge(this.serverMsgSeqno)) {
20884
+ this.serverMsgSeqno = seqNo_long;
20857
20885
  }
20858
20886
  const isFinished = this.serverMsgSeqno.lessThanOrEqual(offset);
20859
20887
  logger.info(`pullMsg success -> syncTime: ${offset}, finished: ${isFinished}`);
@@ -20990,10 +21018,10 @@
20990
21018
  currentAppKey = '';
20991
21019
  currentUserId = '';
20992
21020
  APP_INFO_KEY = 'im_app_info';
20993
- DB_NAME_PREFIX = 'im_message_cache';
21021
+ DB_NAME_PREFIX = 'im_message_cache_new';
20994
21022
  DB_VERSION = 2;
20995
- STORE_NAME = 'messages';
20996
- DIALOG_STATE_STORE = 'dialogStates';
21023
+ STORE_NAME = 'messages_new';
21024
+ DIALOG_STATE_STORE = 'dialogStates_new';
20997
21025
  encryptKey = {
20998
21026
  key: ''
20999
21027
  };
@@ -21001,7 +21029,8 @@
21001
21029
  SALT_SUFFIX = 'im_message_cache_salt_suffix';
21002
21030
  constructor(appKey, userId) {
21003
21031
  this.generateEncryptKey(appKey, userId);
21004
- this.init(appKey, userId);
21032
+ this.currentAppKey = appKey;
21033
+ this.currentUserId = userId;
21005
21034
  }
21006
21035
  generateEncryptKey(appKey, userId) {
21007
21036
  const saltedInput = `${this.SALT_PREFIX}${appKey}_${userId}${this.SALT_SUFFIX}`;
@@ -21019,9 +21048,7 @@
21019
21048
  iv: iv
21020
21049
  };
21021
21050
  }
21022
- async init(appKey, userId) {
21023
- this.currentAppKey = appKey;
21024
- this.currentUserId = userId;
21051
+ async initDB() {
21025
21052
  await this.checkAndResetDatabase();
21026
21053
  await this.initDatabase();
21027
21054
  }
@@ -21034,7 +21061,7 @@
21034
21061
  await this.deleteDatabase();
21035
21062
  }
21036
21063
  } catch (error) {
21037
- console.error('解析存储的AppKey和UserId出错', error);
21064
+ logger.error('解析存储的AppKey和UserId出错', error);
21038
21065
  await this.deleteDatabase();
21039
21066
  }
21040
21067
  }
@@ -21054,11 +21081,11 @@
21054
21081
  const dbName = this.getDBName();
21055
21082
  const deleteRequest = indexedDB.deleteDatabase(dbName);
21056
21083
  deleteRequest.onsuccess = () => {
21057
- console.log(`数据库 ${dbName} 已成功删除`);
21084
+ logger.info(`数据库 ${dbName} 已成功删除`);
21058
21085
  resolve();
21059
21086
  };
21060
21087
  deleteRequest.onerror = event => {
21061
- console.error(`删除数据库 ${dbName} 失败`, event);
21088
+ logger.error(`删除数据库 ${dbName} 失败`, event);
21062
21089
  resolve();
21063
21090
  };
21064
21091
  });
@@ -21071,7 +21098,7 @@
21071
21098
  const dbName = this.getDBName();
21072
21099
  const request = indexedDB.open(dbName, this.DB_VERSION);
21073
21100
  request.onerror = event => {
21074
- console.error('数据库打开失败', event);
21101
+ logger.error('数据库打开失败', event);
21075
21102
  reject(new Error('数据库打开失败'));
21076
21103
  };
21077
21104
  request.onsuccess = event => {
@@ -21079,7 +21106,7 @@
21079
21106
  this.loadAllDialogStates().then(() => {
21080
21107
  resolve();
21081
21108
  }).catch(err => {
21082
- console.error('加载会话状态失败', err);
21109
+ logger.error('加载会话状态失败', err);
21083
21110
  resolve();
21084
21111
  });
21085
21112
  };
@@ -21087,7 +21114,10 @@
21087
21114
  const db = event.target.result;
21088
21115
  if (!db.objectStoreNames.contains(this.STORE_NAME)) {
21089
21116
  const store = db.createObjectStore(this.STORE_NAME, {
21090
- keyPath: 'messageUId'
21117
+ keyPath: 'messageId'
21118
+ });
21119
+ store.createIndex('messageUId', 'messageUId', {
21120
+ unique: true
21091
21121
  });
21092
21122
  store.createIndex('dialogId', 'dialogId', {
21093
21123
  unique: false
@@ -21151,7 +21181,7 @@
21151
21181
  resolve();
21152
21182
  };
21153
21183
  request.onerror = event => {
21154
- console.error('更新会话状态失败', event);
21184
+ logger.error('更新会话状态失败', event);
21155
21185
  reject(new Error('更新会话状态失败'));
21156
21186
  };
21157
21187
  });
@@ -21162,7 +21192,7 @@
21162
21192
  const contentStr = JSON.stringify(content);
21163
21193
  return aes256Encrypt(contentStr, this.encryptKey);
21164
21194
  } catch (error) {
21165
- console.error('加密消息内容失败', error);
21195
+ logger.error('加密消息内容失败', error);
21166
21196
  return '';
21167
21197
  }
21168
21198
  }
@@ -21174,7 +21204,7 @@
21174
21204
  const decryptedStr = aes256Decrypt(encryptedHex, this.encryptKey);
21175
21205
  return JSON.parse(decryptedStr);
21176
21206
  } catch (error) {
21177
- console.error('解密消息内容失败', error);
21207
+ logger.error('解密消息内容失败', error);
21178
21208
  return null;
21179
21209
  }
21180
21210
  }
@@ -21204,7 +21234,7 @@
21204
21234
  resolve();
21205
21235
  };
21206
21236
  transaction.onerror = event => {
21207
- console.error('添加消息事务失败', event);
21237
+ logger.error('添加消息事务失败', event);
21208
21238
  reject(new Error('添加消息事务失败'));
21209
21239
  };
21210
21240
  });
@@ -21247,7 +21277,7 @@
21247
21277
  try {
21248
21278
  message.content = this.decryptContent(message.content);
21249
21279
  } catch (error) {
21250
- console.error('解密消息内容失败', error);
21280
+ logger.error('解密消息内容失败', error);
21251
21281
  message.content = null;
21252
21282
  }
21253
21283
  }
@@ -21271,7 +21301,7 @@
21271
21301
  };
21272
21302
  };
21273
21303
  transaction.onerror = event => {
21274
- console.error('获取消息事务失败', event);
21304
+ logger.error('获取消息事务失败', event);
21275
21305
  reject(new Error('获取消息事务失败'));
21276
21306
  };
21277
21307
  });
@@ -21376,7 +21406,7 @@
21376
21406
  }
21377
21407
  };
21378
21408
  deleteRequest.onerror = event => {
21379
- console.error('删除消息失败', id, event);
21409
+ logger.error('删除消息失败', id, event);
21380
21410
  if (!hasError) {
21381
21411
  hasError = true;
21382
21412
  reject(new Error('删除消息失败'));
@@ -21482,131 +21512,142 @@
21482
21512
  }
21483
21513
  };
21484
21514
  request.onerror = event => {
21485
- console.error('清除过期消息失败', event);
21515
+ logger.error('清除过期消息失败', event);
21486
21516
  reject(new Error('清除过期消息失败'));
21487
21517
  };
21488
21518
  });
21489
21519
  }
21490
- async getMessagesByPage(dialogId, pageSize = 20, cursorPosition = null) {
21520
+ async getLatestMessage(conversation) {
21521
+ const dialogId = getFullDialogId(conversation);
21491
21522
  if (!this.db) {
21492
- return {
21493
- messages: [],
21494
- nextCursor: null
21495
- };
21523
+ return null;
21496
21524
  }
21497
21525
  return new Promise((resolve, reject) => {
21498
21526
  const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21499
21527
  const store = transaction.objectStore(this.STORE_NAME);
21500
21528
  const index = store.index('dialogId_sentTime');
21501
- const range = IDBKeyRange.bound([dialogId, cursorPosition || ''], [dialogId, '\uffff']);
21502
- const messages = [];
21503
- let nextCursor = null;
21504
- let count = 0;
21505
- const cursorRequest = index.openCursor(range);
21529
+ const range = IDBKeyRange.bound([dialogId, ''], [dialogId, '\uffff']);
21530
+ const direction = 'prev';
21531
+ const cursorRequest = index.openCursor(range, direction);
21506
21532
  cursorRequest.onsuccess = event => {
21507
21533
  const cursor = event.target.result;
21508
- if (cursor && count < pageSize) {
21509
- messages.push(cursor.value);
21510
- count++;
21511
- cursor.continue();
21512
- } else if (cursor) {
21513
- nextCursor = cursor.value.sentTime;
21534
+ if (cursor) {
21535
+ const message = {
21536
+ ...cursor.value
21537
+ };
21538
+ if (typeof message.content === 'string' && message.content) {
21539
+ try {
21540
+ message.content = this.decryptContent(message.content);
21541
+ } catch (error) {
21542
+ logger.error('解密消息内容失败', error);
21543
+ message.content = null;
21544
+ }
21545
+ }
21546
+ resolve(message);
21514
21547
  } else {
21515
- nextCursor = null;
21516
- }
21517
- if (!cursor || count >= pageSize) {
21518
- resolve({
21519
- messages,
21520
- nextCursor
21521
- });
21548
+ resolve(null);
21522
21549
  }
21523
21550
  };
21524
21551
  cursorRequest.onerror = event => {
21525
- reject(new Error('获取分页消息失败'));
21552
+ logger.error('获取最新消息失败', event);
21553
+ resolve(null);
21526
21554
  };
21527
21555
  });
21528
21556
  }
21529
- async updateMessagesStatus(messageUIds, newStatus) {
21530
- if (!this.db || messageUIds.length === 0) {
21531
- return;
21557
+ async upsertMessage(message) {
21558
+ if (!this.db) {
21559
+ throw new Error('数据库未初始化');
21532
21560
  }
21533
21561
  return new Promise((resolve, reject) => {
21534
21562
  const transaction = this.db.transaction(this.STORE_NAME, 'readwrite');
21535
21563
  const store = transaction.objectStore(this.STORE_NAME);
21536
- let completed = 0;
21537
- let hasError = false;
21538
- messageUIds.forEach(id => {
21539
- const getRequest = store.get(id);
21540
- getRequest.onsuccess = () => {
21541
- const message = getRequest.result;
21542
- if (message) {
21543
- message.receivedStatus = newStatus;
21544
- store.put(message);
21545
- }
21546
- completed++;
21547
- if (completed === messageUIds.length && !hasError) {
21548
- resolve();
21549
- }
21550
- };
21551
- getRequest.onerror = event => {
21552
- if (!hasError) {
21553
- hasError = true;
21554
- reject(new Error('更新消息状态失败'));
21555
- }
21556
- };
21557
- });
21558
- transaction.oncomplete = () => {
21564
+ const messageToStore = {
21565
+ ...message
21566
+ };
21567
+ if (messageToStore.content) {
21568
+ const encryptedContent = this.encryptContent(messageToStore.content);
21569
+ messageToStore.content = encryptedContent;
21570
+ }
21571
+ const request = store.put(messageToStore);
21572
+ request.onsuccess = () => {
21559
21573
  resolve();
21560
21574
  };
21561
- transaction.onerror = event => {
21562
- reject(new Error('批量更新事务失败'));
21575
+ request.onerror = event => {
21576
+ logger.error('更新/插入消息失败', event);
21577
+ reject(new Error('更新/插入消息失败'));
21563
21578
  };
21564
21579
  });
21565
21580
  }
21566
- async changeUser(appKey, userId) {
21567
- if (this.currentAppKey === appKey && this.currentUserId === userId) {
21568
- return;
21569
- }
21570
- this.currentAppKey = appKey;
21571
- this.currentUserId = userId;
21572
- this.generateEncryptKey(appKey, userId);
21573
- await this.checkAndResetDatabase();
21574
- await this.initDatabase();
21575
- }
21576
- async getLatestMessage(conversation) {
21577
- const dialogId = getFullDialogId(conversation);
21581
+ async getMessageById(messageId) {
21578
21582
  if (!this.db) {
21579
21583
  return null;
21580
21584
  }
21581
21585
  return new Promise((resolve, reject) => {
21582
21586
  const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21583
21587
  const store = transaction.objectStore(this.STORE_NAME);
21584
- const index = store.index('dialogId_sentTime');
21585
- const range = IDBKeyRange.bound([dialogId, ''], [dialogId, '\uffff']);
21586
- const direction = 'prev';
21587
- const cursorRequest = index.openCursor(range, direction);
21588
- cursorRequest.onsuccess = event => {
21589
- const cursor = event.target.result;
21590
- if (cursor) {
21591
- const message = {
21592
- ...cursor.value
21588
+ const request = store.get(messageId);
21589
+ request.onsuccess = () => {
21590
+ const message = request.result;
21591
+ if (message) {
21592
+ const decryptedMessage = {
21593
+ ...message
21593
21594
  };
21594
- if (typeof message.content === 'string' && message.content) {
21595
+ if (typeof decryptedMessage.content === 'string' && decryptedMessage.content) {
21595
21596
  try {
21596
- message.content = this.decryptContent(message.content);
21597
+ decryptedMessage.content = this.decryptContent(decryptedMessage.content);
21597
21598
  } catch (error) {
21598
- console.error('解密消息内容失败', error);
21599
- message.content = null;
21599
+ logger.error('解密消息内容失败', error);
21600
+ decryptedMessage.content = null;
21600
21601
  }
21601
21602
  }
21602
- resolve(message);
21603
+ resolve(decryptedMessage);
21603
21604
  } else {
21604
21605
  resolve(null);
21605
21606
  }
21606
21607
  };
21607
- cursorRequest.onerror = event => {
21608
- console.error('获取最新消息失败', event);
21609
- reject(new Error('获取最新消息失败'));
21608
+ request.onerror = event => {
21609
+ logger.error('查询消息失败', event);
21610
+ resolve(null);
21611
+ };
21612
+ });
21613
+ }
21614
+ async getMessageIdRange() {
21615
+ if (!this.db) {
21616
+ return null;
21617
+ }
21618
+ return new Promise((resolve, reject) => {
21619
+ const transaction = this.db.transaction(this.STORE_NAME, 'readonly');
21620
+ const store = transaction.objectStore(this.STORE_NAME);
21621
+ let newest = null;
21622
+ let oldest = null;
21623
+ const oldestRequest = store.openCursor();
21624
+ oldestRequest.onsuccess = event => {
21625
+ const cursor = event.target.result;
21626
+ if (cursor) {
21627
+ oldest = cursor.value.messageId;
21628
+ const newestRequest = store.openCursor(null, 'prev');
21629
+ newestRequest.onsuccess = event => {
21630
+ const cursor = event.target.result;
21631
+ if (cursor) {
21632
+ newest = cursor.value.messageId;
21633
+ if (newest && oldest) {
21634
+ resolve({
21635
+ newest,
21636
+ oldest
21637
+ });
21638
+ } else {
21639
+ resolve(null);
21640
+ }
21641
+ } else {
21642
+ resolve(null);
21643
+ }
21644
+ };
21645
+ } else {
21646
+ resolve(null);
21647
+ }
21648
+ };
21649
+ transaction.onerror = event => {
21650
+ resolve(null);
21610
21651
  };
21611
21652
  });
21612
21653
  }
@@ -21723,16 +21764,29 @@
21723
21764
  webSocketServer.close();
21724
21765
  return Promise.resolve();
21725
21766
  }
21726
- setUserLogged() {
21767
+ async setUserLogged() {
21727
21768
  ConversationManager$1.get().destroyed();
21728
21769
  ConversationManager$1.create(this.options.appkey, accountStore.uid.toString(), this.watcher.conversationState);
21729
21770
  MessageReceiptManager$1.create(this.options.appkey, accountStore.uid.toString());
21730
- MessageCache$1.create(this.options.appkey, accountStore.uid.toString());
21731
21771
  this.messageLoader?.stop();
21732
21772
  this.messageLoader = new MessageLoader(this.watcher, this.options);
21733
21773
  SentMessageStore.reset();
21734
21774
  RecallMessageStore.reset();
21735
21775
  DialogSecretKey$1.reset();
21776
+ MessageCache$1.create(this.options.appkey, accountStore.uid.toString());
21777
+ MessageCache$1.get().initDB().then(() => {
21778
+ return MessageCache$1.get().getMessageIdRange();
21779
+ }).then(result => {
21780
+ if (result) {
21781
+ const {
21782
+ oldest,
21783
+ newest
21784
+ } = result;
21785
+ setInitialMessageId(oldest, newest);
21786
+ } else {
21787
+ setInitialMessageId(10000, 10000);
21788
+ }
21789
+ });
21736
21790
  if (this.getConnectionStatus() === exports.ConnectionStatus.CONNECTED) {
21737
21791
  this.handleUserConnected();
21738
21792
  }
@@ -28376,37 +28430,31 @@
28376
28430
  var protobufjsExports = requireProtobufjs();
28377
28431
  var protobuf = /*@__PURE__*/getDefaultExportFromCjs(protobufjsExports);
28378
28432
 
28379
- const transSentAttrs2IReceivedMessage = (message, options, sentStatus = exports.SentStatus.SENDING) => ({
28380
- conversationType: options.conversation.conversationType,
28381
- targetId: options.conversation.targetId,
28382
- senderUserId: options.senderUserId,
28383
- messageDirection: exports.MessageDirection.SEND,
28384
- isCounted: message.isCounted,
28385
- isMentioned: false,
28386
- content: deepClone(message.content),
28387
- messageType: message.messageType,
28388
- isOffLineMessage: false,
28389
- isPersited: message.isPersited,
28390
- messageId: options.messageId,
28391
- messageUId: '0',
28392
- sentTime: options.sentTime,
28393
- sentStatus,
28394
- receivedTime: '0',
28395
- isStatusMessage: message.isStatusMessage,
28396
- receivedStatus: exports.ReceivedStatus.IDLE,
28397
- disableNotification: true,
28398
- burnAfterReadingFlag: false
28399
- });
28400
-
28401
- let UniqueLocalId = 0;
28402
- function generateMessageId() {
28403
- UniqueLocalId++;
28404
- const time = getServerTime$1();
28405
- if (UniqueLocalId < time) {
28406
- UniqueLocalId = time;
28407
- }
28408
- return 230000000000000 + UniqueLocalId;
28409
- }
28433
+ const transSentAttrs2IReceivedMessage = (message, options, sentStatus = exports.SentStatus.SENDING) => {
28434
+ const conversation = ConversationManager$1.get().get(options.conversation);
28435
+ return {
28436
+ conversationType: options.conversation.conversationType,
28437
+ targetId: options.conversation.targetId,
28438
+ senderUserId: options.senderUserId,
28439
+ messageDirection: exports.MessageDirection.SEND,
28440
+ isCounted: message.isCounted,
28441
+ isMentioned: false,
28442
+ content: deepClone(message.content),
28443
+ messageType: message.messageType,
28444
+ isOffLineMessage: false,
28445
+ isPersited: message.isPersited,
28446
+ messageId: options.messageId,
28447
+ messageUId: '0',
28448
+ sentTime: options.sentTime,
28449
+ sentStatus,
28450
+ receivedTime: options.sentTime,
28451
+ isStatusMessage: message.isStatusMessage,
28452
+ receivedStatus: exports.ReceivedStatus.IDLE,
28453
+ disableNotification: true,
28454
+ burnAfterReadingFlag: conversation?.burnAfterReadingFlag ?? false,
28455
+ burnAfterReadingTime: conversation?.burnAfterReadingTime ?? 0
28456
+ };
28457
+ };
28410
28458
 
28411
28459
  const getBlobUrl = blob => {
28412
28460
  const URL = window.URL || window.webkitURL;
@@ -28877,10 +28925,12 @@
28877
28925
  const sentAttris = {
28878
28926
  conversation,
28879
28927
  senderUserId: accountStore.uid,
28880
- messageId: '0',
28928
+ messageId: 0,
28881
28929
  sentTime: getServerTime$1().toString()
28882
28930
  };
28883
28931
  const receivedMessage = transSentAttrs2IReceivedMessage(recallCommandMessage, sentAttris, exports.SentStatus.SENT);
28932
+ receivedMessage.burnAfterReadingFlag = false;
28933
+ receivedMessage.burnAfterReadingTime = 0;
28884
28934
  ConversationManager$1.get().setConversationCacheByMessage(receivedMessage);
28885
28935
  return {
28886
28936
  code: exports.ErrorCode.SUCCESS,
@@ -28929,12 +28979,16 @@
28929
28979
  });
28930
28980
  }
28931
28981
  async function internal_sendMessage(conversation, message, options, uploadOptions) {
28932
- const checkResult = beforeSend(conversation, message, options);
28982
+ const checkResult = await beforeSend(conversation, message, options);
28933
28983
  if (checkResult.code !== exports.ErrorCode.SUCCESS || !checkResult.message || !checkResult.sentArgs) {
28934
28984
  return {
28935
28985
  code: checkResult.code
28936
28986
  };
28937
28987
  }
28988
+ {
28989
+ const receivedMessage = transSentAttrs2IReceivedMessage(checkResult.message, checkResult.sentArgs);
28990
+ await saveSentMessage(receivedMessage, checkResult.sentArgs);
28991
+ }
28938
28992
  let {
28939
28993
  message: sentMessage,
28940
28994
  sentArgs
@@ -28943,30 +28997,30 @@
28943
28997
  const uploadResult = await uploadOptions.task(sentMessage, uploadOptions.files);
28944
28998
  sentMessage = uploadResult.message;
28945
28999
  if (!uploadResult.finished) {
29000
+ const receivedMessage = transSentAttrs2IReceivedMessage(checkResult.message, checkResult.sentArgs, exports.SentStatus.FAILED);
29001
+ await saveSentMessage(receivedMessage, sentArgs);
28946
29002
  return {
28947
29003
  code: exports.ErrorCode.UPLOAD_FILE_FAILED,
28948
- data: transSentAttrs2IReceivedMessage(sentMessage, sentArgs, exports.SentStatus.FAILED)
29004
+ data: receivedMessage
28949
29005
  };
28950
29006
  }
28951
29007
  }
28952
29008
  return send(sentMessage, sentArgs);
28953
29009
  }
28954
- function beforeSend(conversation, message, options) {
28955
- if (!LibLoader.loader || LibLoader.loader.getConnectionStatus() !== exports.ConnectionStatus.CONNECTED) {
28956
- return {
28957
- code: exports.ErrorCode.RC_NET_CHANNEL_INVALID
28958
- };
28959
- }
29010
+ async function beforeSend(conversation, message, options) {
28960
29011
  const mediaAttribute = JSON.stringify(filterNullProperty(message.content));
28961
29012
  if (getByteLength(mediaAttribute) > MAX_MESSAGE_CONTENT_BYTES) {
28962
29013
  return {
28963
29014
  code: exports.ErrorCode.RC_MSG_CONTENT_EXCEED_LIMIT
28964
29015
  };
28965
29016
  }
29017
+ if (message.isPersited) {
29018
+ await ConversationManager$1.get().loadConvsationsIfNotExist([conversation]);
29019
+ }
28966
29020
  const sentArgs = {
28967
29021
  conversation: conversation,
28968
29022
  senderUserId: accountStore.uid,
28969
- messageId: options?.messageId ?? generateMessageId().toString(),
29023
+ messageId: generateNewMessageId(),
28970
29024
  sentTime: getMessageSentTime().toString(),
28971
29025
  pushConfig: options?.pushConfig
28972
29026
  };
@@ -28983,12 +29037,6 @@
28983
29037
  async function send(message, sentArgs) {
28984
29038
  const dialogId = getFullDialogId(sentArgs.conversation);
28985
29039
  const receivedMessage = transSentAttrs2IReceivedMessage(message, sentArgs);
28986
- if (message.isPersited) {
28987
- await ConversationManager$1.get().loadConvsationsIfNotExist([sentArgs.conversation]);
28988
- }
28989
- const conversation = ConversationManager$1.get().get(sentArgs.conversation);
28990
- receivedMessage.burnAfterReadingFlag = conversation?.burnAfterReadingFlag ?? false;
28991
- receivedMessage.burnAfterReadingTime = conversation?.burnAfterReadingTime ?? 0;
28992
29040
  const secretKey = await DialogSecretKey$1.getDialogAesKey(dialogId.toString());
28993
29041
  if (!secretKey) {
28994
29042
  receivedMessage.sentStatus = exports.SentStatus.FAILED;
@@ -29011,7 +29059,7 @@
29011
29059
  const mediaEncryptedString = aes256Encrypt(mediaAttribute, secretKey);
29012
29060
  SentMessageStore.addMessage(sentArgs.messageId);
29013
29061
  const baseParams = {
29014
- localId: Long.fromString(sentArgs.messageId),
29062
+ localId: Long.fromNumber(sentArgs.messageId),
29015
29063
  mediaFlag: message.messageType !== MessageTypes.TEXT,
29016
29064
  mediaConstructor: message.messageType,
29017
29065
  msgPreContent: '',
@@ -29042,9 +29090,10 @@
29042
29090
  receivedMessage.sentTime = response.data.msgSendTime.toString();
29043
29091
  receivedMessage.messageUId = response.data.msgId.toString();
29044
29092
  receivedMessage.sentStatus = exports.SentStatus.SENT;
29045
- ConversationManager$1.get().setConversationCacheByMessage(receivedMessage);
29093
+ await saveSentMessage(receivedMessage, sentArgs);
29046
29094
  } else {
29047
29095
  receivedMessage.sentStatus = exports.SentStatus.FAILED;
29096
+ await saveSentMessage(receivedMessage, sentArgs);
29048
29097
  }
29049
29098
  return {
29050
29099
  code: response.code,
@@ -29060,6 +29109,18 @@
29060
29109
  }
29061
29110
  return UniqueSentTime;
29062
29111
  }
29112
+ async function saveSentMessage(receivedMessage, options) {
29113
+ try {
29114
+ const cache = MessageCache$1.get();
29115
+ if (receivedMessage.isPersited && cache) {
29116
+ await cache.upsertMessage(receivedMessage);
29117
+ const latestMessage = await cache.getLatestMessage(options.conversation);
29118
+ ConversationManager$1.get().updateLatestMessage(options.conversation, latestMessage);
29119
+ }
29120
+ } catch (error) {
29121
+ logger.error('saveSentMessage -> ', error);
29122
+ }
29123
+ }
29063
29124
 
29064
29125
  class IMClient extends EventEmitter {
29065
29126
  options;
@@ -29236,7 +29297,6 @@
29236
29297
  });
29237
29298
  }
29238
29299
  async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
29239
- debugger;
29240
29300
  const cachedResult = await MessageCache$1.get().getPreviousMessages(conversation, timestamp ?? '0', count);
29241
29301
  if (!timestamp && cachedResult.messages.length) {
29242
29302
  ConversationManager$1.get().updateLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
@@ -29260,8 +29320,13 @@
29260
29320
  return remotesResult;
29261
29321
  }
29262
29322
  const remotesMessages = remotesResult.data.list;
29323
+ for (let i = remotesMessages.length - 1; i >= 0; i--) {
29324
+ const message = remotesMessages[i];
29325
+ if (!message.messageId) {
29326
+ message.messageId = generateOldMessageId();
29327
+ }
29328
+ }
29263
29329
  if (!remotesTimestamp || remotesTimestamp == '0') {
29264
- debugger;
29265
29330
  ConversationManager$1.get().updateLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
29266
29331
  }
29267
29332
  MessageCache$1.get().addMessages(remotesMessages, conversation, !remotesResult.data.hasMore);