@onyx-p/imlib-web 1.8.6 → 1.8.7

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.
Files changed (3) hide show
  1. package/index.esm.js +129 -2
  2. package/index.umd.js +129 -2
  3. package/package.json +1 -1
package/index.esm.js CHANGED
@@ -20610,6 +20610,7 @@ let manager;
20610
20610
  var MessageReceiptManager$1 = {
20611
20611
  create(appkey, currentUserId) {
20612
20612
  manager = new MessageReceiptManager(appkey, currentUserId);
20613
+ manager.cleanExpiredMessages();
20613
20614
  },
20614
20615
  get() {
20615
20616
  return manager;
@@ -28328,6 +28329,93 @@ function getMessageSentTime() {
28328
28329
  return UniqueSentTime;
28329
28330
  }
28330
28331
 
28332
+ class MessageCache {
28333
+ static instance;
28334
+ messageCache = new Map();
28335
+ maxCacheCount = 100;
28336
+ constructor() {}
28337
+ static get() {
28338
+ if (!MessageCache.instance) {
28339
+ MessageCache.instance = new MessageCache();
28340
+ }
28341
+ return MessageCache.instance;
28342
+ }
28343
+ setMaxCacheCount(count) {
28344
+ if (count > 0) {
28345
+ this.maxCacheCount = count;
28346
+ }
28347
+ }
28348
+ addMessages(messages) {
28349
+ if (!messages || messages.length === 0) {
28350
+ return;
28351
+ }
28352
+ const messagesByDialog = new Map();
28353
+ messages.forEach(message => {
28354
+ const dialogId = getFullDialogId({
28355
+ conversationType: message.conversationType,
28356
+ targetId: message.targetId
28357
+ });
28358
+ if (!messagesByDialog.has(dialogId)) {
28359
+ messagesByDialog.set(dialogId, []);
28360
+ }
28361
+ messagesByDialog.get(dialogId)?.push(message);
28362
+ });
28363
+ messagesByDialog.forEach((dialogMessages, dialogId) => {
28364
+ if (!this.messageCache.has(dialogId)) {
28365
+ this.messageCache.set(dialogId, []);
28366
+ }
28367
+ const cachedMessages = this.messageCache.get(dialogId) || [];
28368
+ const allMessages = [...cachedMessages, ...dialogMessages];
28369
+ if (allMessages.length > this.maxCacheCount) {
28370
+ allMessages.splice(0, allMessages.length - this.maxCacheCount);
28371
+ }
28372
+ this.messageCache.set(dialogId, allMessages);
28373
+ });
28374
+ }
28375
+ getPreviousMessages(conversation, timestamp = "0", count = 20) {
28376
+ const dialogId = getFullDialogId(conversation);
28377
+ const cachedMessages = this.messageCache.get(dialogId) || [];
28378
+ if (cachedMessages.length === 0) {
28379
+ return [];
28380
+ }
28381
+ if (timestamp === "0") {
28382
+ return cachedMessages.slice(-count);
28383
+ }
28384
+ const timestampLong = Long.fromString(timestamp);
28385
+ let endIndex = cachedMessages.length - 1;
28386
+ while (endIndex >= 0) {
28387
+ if (Long.fromString(cachedMessages[endIndex].sentTime).lessThanOrEqual(timestampLong)) {
28388
+ break;
28389
+ }
28390
+ endIndex--;
28391
+ }
28392
+ if (endIndex < 0) {
28393
+ return [];
28394
+ }
28395
+ const startIndex = Math.max(0, endIndex - count + 1);
28396
+ return cachedMessages.slice(startIndex, endIndex + 1);
28397
+ }
28398
+ clearConversationCache(conversation) {
28399
+ const dialogId = getFullDialogId(conversation);
28400
+ this.messageCache.delete(dialogId);
28401
+ }
28402
+ clearAllCache() {
28403
+ this.messageCache.clear();
28404
+ }
28405
+ removeMessagesByUId(messageUIds) {
28406
+ if (!messageUIds || messageUIds.length === 0) {
28407
+ return;
28408
+ }
28409
+ const messageUIdSet = new Set(messageUIds);
28410
+ this.messageCache.forEach((messages, dialogId) => {
28411
+ const filteredMessages = messages.filter(msg => !messageUIdSet.has(msg.messageUId));
28412
+ if (filteredMessages.length !== messages.length) {
28413
+ this.messageCache.set(dialogId, filteredMessages);
28414
+ }
28415
+ });
28416
+ }
28417
+ }
28418
+
28331
28419
  class IMClient extends EventEmitter {
28332
28420
  options;
28333
28421
  static imClient;
@@ -28375,6 +28463,7 @@ class IMClient extends EventEmitter {
28375
28463
  this.emit(Events.SUSPEND, this.libLoader.getConnectionStatus());
28376
28464
  },
28377
28465
  batchMessage: messages => {
28466
+ MessageCache.get().addMessages(messages);
28378
28467
  this.emit(Events.MESSAGES, {
28379
28468
  messages
28380
28469
  });
@@ -28394,6 +28483,7 @@ class IMClient extends EventEmitter {
28394
28483
  });
28395
28484
  },
28396
28485
  onRecall: messageUids => {
28486
+ MessageCache.get().removeMessagesByUId(messageUids);
28397
28487
  messageUids.forEach(messageUId => {
28398
28488
  this.emit(Events.RECALL, messageUId);
28399
28489
  });
@@ -28436,7 +28526,7 @@ class IMClient extends EventEmitter {
28436
28526
  const dialogId = getFullDialogId(conversation);
28437
28527
  return getRemoteMessages({
28438
28528
  dialogId,
28439
- offset: options.timestamp ?? "0",
28529
+ offset: options.timestamp ?? '0',
28440
28530
  count: options.count ?? 20,
28441
28531
  newToOld: options.order === 0
28442
28532
  }).then(({
@@ -28470,10 +28560,42 @@ class IMClient extends EventEmitter {
28470
28560
  });
28471
28561
  });
28472
28562
  }
28563
+ async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
28564
+ const cachedMessages = MessageCache.get().getPreviousMessages(conversation, timestamp, count);
28565
+ if (!timestamp) {
28566
+ ConversationManager$1.get().refreshLatestMessage(conversation, cachedMessages[cachedMessages.length - 1]);
28567
+ }
28568
+ if (cachedMessages.length >= count) {
28569
+ return {
28570
+ code: ErrorCode.SUCCESS,
28571
+ data: {
28572
+ list: cachedMessages,
28573
+ hasMore: true
28574
+ }
28575
+ };
28576
+ }
28577
+ const remotesResult = await this.getRemoteHistoryMessages(conversation, {
28578
+ timestamp: cachedMessages[0].sentTime ?? timestamp,
28579
+ count: count - cachedMessages.length,
28580
+ order: 0
28581
+ });
28582
+ if (remotesResult.code !== ErrorCode.SUCCESS) {
28583
+ return remotesResult;
28584
+ }
28585
+ return {
28586
+ code: ErrorCode.SUCCESS,
28587
+ data: {
28588
+ list: [...remotesResult.data.list, ...cachedMessages],
28589
+ hasMore: remotesResult.data.hasMore
28590
+ }
28591
+ };
28592
+ }
28473
28593
  async deleteRemoteMessage(conversation, list) {
28594
+ MessageCache.get().removeMessagesByUId(list.map(e => e.messageUId));
28474
28595
  return deleteMessages$1(getFullDialogId(conversation), list.map(e => e.messageUId)).then(result => result.code);
28475
28596
  }
28476
28597
  async deleteRemoteMessageByTimestamp(conversation, timestamp) {
28598
+ MessageCache.get().clearConversationCache(conversation);
28477
28599
  ConversationManager$1.get().clearHistoryMessages(conversation);
28478
28600
  return clearHistoryMessage(getFullDialogId(conversation), timestamp === 0 ? Number.MAX_VALUE : timestamp).then(result => result.code);
28479
28601
  }
@@ -29859,7 +29981,12 @@ const getRemoteHistoryMessages = async (conversation, options) => {
29859
29981
  assert('conversation', conversation, AssertRules.CONVERSATION, true);
29860
29982
  const paramsStr = 'conversationType:' + conversation.conversationType + ',targetId:' + conversation.targetId;
29861
29983
  logger.debug('get remote history message ->' + paramsStr);
29862
- const response = await imClient.getRemoteHistoryMessages(conversation, options);
29984
+ let response;
29985
+ if (options.order === 0) {
29986
+ response = await imClient.getPreviousHistoryMessages(conversation, options.timestamp, options.count);
29987
+ } else {
29988
+ response = await imClient.getRemoteHistoryMessages(conversation, options);
29989
+ }
29863
29990
  if (response.code !== ErrorCode.SUCCESS) {
29864
29991
  logger.warn('get remote history message fail ->' + response.code + ':' + ErrorDesc(response.code) + ',' + paramsStr);
29865
29992
  }
package/index.umd.js CHANGED
@@ -20616,6 +20616,7 @@
20616
20616
  var MessageReceiptManager$1 = {
20617
20617
  create(appkey, currentUserId) {
20618
20618
  manager = new MessageReceiptManager(appkey, currentUserId);
20619
+ manager.cleanExpiredMessages();
20619
20620
  },
20620
20621
  get() {
20621
20622
  return manager;
@@ -28334,6 +28335,93 @@
28334
28335
  return UniqueSentTime;
28335
28336
  }
28336
28337
 
28338
+ class MessageCache {
28339
+ static instance;
28340
+ messageCache = new Map();
28341
+ maxCacheCount = 100;
28342
+ constructor() {}
28343
+ static get() {
28344
+ if (!MessageCache.instance) {
28345
+ MessageCache.instance = new MessageCache();
28346
+ }
28347
+ return MessageCache.instance;
28348
+ }
28349
+ setMaxCacheCount(count) {
28350
+ if (count > 0) {
28351
+ this.maxCacheCount = count;
28352
+ }
28353
+ }
28354
+ addMessages(messages) {
28355
+ if (!messages || messages.length === 0) {
28356
+ return;
28357
+ }
28358
+ const messagesByDialog = new Map();
28359
+ messages.forEach(message => {
28360
+ const dialogId = getFullDialogId({
28361
+ conversationType: message.conversationType,
28362
+ targetId: message.targetId
28363
+ });
28364
+ if (!messagesByDialog.has(dialogId)) {
28365
+ messagesByDialog.set(dialogId, []);
28366
+ }
28367
+ messagesByDialog.get(dialogId)?.push(message);
28368
+ });
28369
+ messagesByDialog.forEach((dialogMessages, dialogId) => {
28370
+ if (!this.messageCache.has(dialogId)) {
28371
+ this.messageCache.set(dialogId, []);
28372
+ }
28373
+ const cachedMessages = this.messageCache.get(dialogId) || [];
28374
+ const allMessages = [...cachedMessages, ...dialogMessages];
28375
+ if (allMessages.length > this.maxCacheCount) {
28376
+ allMessages.splice(0, allMessages.length - this.maxCacheCount);
28377
+ }
28378
+ this.messageCache.set(dialogId, allMessages);
28379
+ });
28380
+ }
28381
+ getPreviousMessages(conversation, timestamp = "0", count = 20) {
28382
+ const dialogId = getFullDialogId(conversation);
28383
+ const cachedMessages = this.messageCache.get(dialogId) || [];
28384
+ if (cachedMessages.length === 0) {
28385
+ return [];
28386
+ }
28387
+ if (timestamp === "0") {
28388
+ return cachedMessages.slice(-count);
28389
+ }
28390
+ const timestampLong = Long.fromString(timestamp);
28391
+ let endIndex = cachedMessages.length - 1;
28392
+ while (endIndex >= 0) {
28393
+ if (Long.fromString(cachedMessages[endIndex].sentTime).lessThanOrEqual(timestampLong)) {
28394
+ break;
28395
+ }
28396
+ endIndex--;
28397
+ }
28398
+ if (endIndex < 0) {
28399
+ return [];
28400
+ }
28401
+ const startIndex = Math.max(0, endIndex - count + 1);
28402
+ return cachedMessages.slice(startIndex, endIndex + 1);
28403
+ }
28404
+ clearConversationCache(conversation) {
28405
+ const dialogId = getFullDialogId(conversation);
28406
+ this.messageCache.delete(dialogId);
28407
+ }
28408
+ clearAllCache() {
28409
+ this.messageCache.clear();
28410
+ }
28411
+ removeMessagesByUId(messageUIds) {
28412
+ if (!messageUIds || messageUIds.length === 0) {
28413
+ return;
28414
+ }
28415
+ const messageUIdSet = new Set(messageUIds);
28416
+ this.messageCache.forEach((messages, dialogId) => {
28417
+ const filteredMessages = messages.filter(msg => !messageUIdSet.has(msg.messageUId));
28418
+ if (filteredMessages.length !== messages.length) {
28419
+ this.messageCache.set(dialogId, filteredMessages);
28420
+ }
28421
+ });
28422
+ }
28423
+ }
28424
+
28337
28425
  class IMClient extends EventEmitter {
28338
28426
  options;
28339
28427
  static imClient;
@@ -28381,6 +28469,7 @@
28381
28469
  this.emit(exports.Events.SUSPEND, this.libLoader.getConnectionStatus());
28382
28470
  },
28383
28471
  batchMessage: messages => {
28472
+ MessageCache.get().addMessages(messages);
28384
28473
  this.emit(exports.Events.MESSAGES, {
28385
28474
  messages
28386
28475
  });
@@ -28400,6 +28489,7 @@
28400
28489
  });
28401
28490
  },
28402
28491
  onRecall: messageUids => {
28492
+ MessageCache.get().removeMessagesByUId(messageUids);
28403
28493
  messageUids.forEach(messageUId => {
28404
28494
  this.emit(exports.Events.RECALL, messageUId);
28405
28495
  });
@@ -28442,7 +28532,7 @@
28442
28532
  const dialogId = getFullDialogId(conversation);
28443
28533
  return getRemoteMessages({
28444
28534
  dialogId,
28445
- offset: options.timestamp ?? "0",
28535
+ offset: options.timestamp ?? '0',
28446
28536
  count: options.count ?? 20,
28447
28537
  newToOld: options.order === 0
28448
28538
  }).then(({
@@ -28476,10 +28566,42 @@
28476
28566
  });
28477
28567
  });
28478
28568
  }
28569
+ async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
28570
+ const cachedMessages = MessageCache.get().getPreviousMessages(conversation, timestamp, count);
28571
+ if (!timestamp) {
28572
+ ConversationManager$1.get().refreshLatestMessage(conversation, cachedMessages[cachedMessages.length - 1]);
28573
+ }
28574
+ if (cachedMessages.length >= count) {
28575
+ return {
28576
+ code: exports.ErrorCode.SUCCESS,
28577
+ data: {
28578
+ list: cachedMessages,
28579
+ hasMore: true
28580
+ }
28581
+ };
28582
+ }
28583
+ const remotesResult = await this.getRemoteHistoryMessages(conversation, {
28584
+ timestamp: cachedMessages[0].sentTime ?? timestamp,
28585
+ count: count - cachedMessages.length,
28586
+ order: 0
28587
+ });
28588
+ if (remotesResult.code !== exports.ErrorCode.SUCCESS) {
28589
+ return remotesResult;
28590
+ }
28591
+ return {
28592
+ code: exports.ErrorCode.SUCCESS,
28593
+ data: {
28594
+ list: [...remotesResult.data.list, ...cachedMessages],
28595
+ hasMore: remotesResult.data.hasMore
28596
+ }
28597
+ };
28598
+ }
28479
28599
  async deleteRemoteMessage(conversation, list) {
28600
+ MessageCache.get().removeMessagesByUId(list.map(e => e.messageUId));
28480
28601
  return deleteMessages$1(getFullDialogId(conversation), list.map(e => e.messageUId)).then(result => result.code);
28481
28602
  }
28482
28603
  async deleteRemoteMessageByTimestamp(conversation, timestamp) {
28604
+ MessageCache.get().clearConversationCache(conversation);
28483
28605
  ConversationManager$1.get().clearHistoryMessages(conversation);
28484
28606
  return clearHistoryMessage(getFullDialogId(conversation), timestamp === 0 ? Number.MAX_VALUE : timestamp).then(result => result.code);
28485
28607
  }
@@ -29865,7 +29987,12 @@
29865
29987
  assert('conversation', conversation, AssertRules.CONVERSATION, true);
29866
29988
  const paramsStr = 'conversationType:' + conversation.conversationType + ',targetId:' + conversation.targetId;
29867
29989
  logger.debug('get remote history message ->' + paramsStr);
29868
- const response = await imClient.getRemoteHistoryMessages(conversation, options);
29990
+ let response;
29991
+ if (options.order === 0) {
29992
+ response = await imClient.getPreviousHistoryMessages(conversation, options.timestamp, options.count);
29993
+ } else {
29994
+ response = await imClient.getRemoteHistoryMessages(conversation, options);
29995
+ }
29869
29996
  if (response.code !== exports.ErrorCode.SUCCESS) {
29870
29997
  logger.warn('get remote history message fail ->' + response.code + ':' + ErrorDesc(response.code) + ',' + paramsStr);
29871
29998
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onyx-p/imlib-web",
3
- "version": "1.8.6",
3
+ "version": "1.8.7",
4
4
  "main": "index.umd.js",
5
5
  "module": "index.esm.js",
6
6
  "types": "types/index.d.ts",