@onyx-p/imlib-web 1.9.9 → 2.0.1

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 +62 -44
  2. package/index.umd.js +62 -44
  3. package/package.json +1 -1
package/index.esm.js CHANGED
@@ -28376,7 +28376,8 @@ function getMessageSentTime() {
28376
28376
  class MessageCache {
28377
28377
  static instance;
28378
28378
  messageCache = new Map();
28379
- maxCacheCount = 100;
28379
+ loadedEndMap = new Map();
28380
+ maxCacheCount = 1000;
28380
28381
  constructor() {}
28381
28382
  static get() {
28382
28383
  if (!MessageCache.instance) {
@@ -28389,41 +28390,41 @@ class MessageCache {
28389
28390
  this.maxCacheCount = count;
28390
28391
  }
28391
28392
  }
28392
- addMessages(messages) {
28393
+ addMessages(messages, toConversation, isEnd = undefined) {
28393
28394
  if (!messages || messages.length === 0) {
28394
28395
  return;
28395
28396
  }
28396
- const messagesByDialog = new Map();
28397
- messages.forEach(message => {
28398
- const dialogId = getFullDialogId({
28399
- conversationType: message.conversationType,
28400
- targetId: message.targetId
28401
- });
28402
- if (!messagesByDialog.has(dialogId)) {
28403
- messagesByDialog.set(dialogId, []);
28404
- }
28405
- messagesByDialog.get(dialogId)?.push(message);
28406
- });
28407
- messagesByDialog.forEach((dialogMessages, dialogId) => {
28408
- if (!this.messageCache.has(dialogId)) {
28409
- this.messageCache.set(dialogId, []);
28410
- }
28411
- const cachedMessages = this.messageCache.get(dialogId) || [];
28412
- const allMessages = [...cachedMessages, ...dialogMessages];
28413
- if (allMessages.length > this.maxCacheCount) {
28414
- allMessages.splice(0, allMessages.length - this.maxCacheCount);
28415
- }
28416
- this.messageCache.set(dialogId, allMessages);
28417
- });
28397
+ const dialogId = getFullDialogId(toConversation);
28398
+ if (isEnd !== undefined) {
28399
+ this.loadedEndMap.set(dialogId, isEnd);
28400
+ }
28401
+ if (!this.messageCache.has(dialogId)) {
28402
+ this.messageCache.set(dialogId, []);
28403
+ }
28404
+ const cachedMessages = this.messageCache.get(dialogId) || [];
28405
+ const existingMessageIds = new Set(cachedMessages.map(msg => msg.messageUId));
28406
+ const newMessages = messages.filter(msg => !existingMessageIds.has(msg.messageUId));
28407
+ const allMessages = [...cachedMessages, ...newMessages].sort((a, b) => Long.fromString(a.sentTime).compare(Long.fromString(b.sentTime)));
28408
+ if (allMessages.length > this.maxCacheCount) {
28409
+ allMessages.splice(0, allMessages.length - this.maxCacheCount);
28410
+ }
28411
+ this.messageCache.set(dialogId, allMessages);
28418
28412
  }
28419
28413
  getPreviousMessages(conversation, timestamp = "0", count = 20) {
28420
28414
  const dialogId = getFullDialogId(conversation);
28421
28415
  const cachedMessages = this.messageCache.get(dialogId) || [];
28422
28416
  if (cachedMessages.length === 0) {
28423
- return [];
28417
+ return {
28418
+ messages: [],
28419
+ hasMore: !this.loadedEndMap.get(dialogId)
28420
+ };
28424
28421
  }
28425
28422
  if (timestamp === "0") {
28426
- return cachedMessages.slice(-count);
28423
+ const messages = cachedMessages.slice(-count);
28424
+ return {
28425
+ messages,
28426
+ hasMore: cachedMessages.length > count || !this.loadedEndMap.get(dialogId)
28427
+ };
28427
28428
  }
28428
28429
  const timestampLong = Long.fromString(timestamp);
28429
28430
  let endIndex = cachedMessages.length - 1;
@@ -28434,17 +28435,25 @@ class MessageCache {
28434
28435
  endIndex--;
28435
28436
  }
28436
28437
  if (endIndex < 0) {
28437
- return [];
28438
+ return {
28439
+ messages: [],
28440
+ hasMore: !this.loadedEndMap.get(dialogId)
28441
+ };
28438
28442
  }
28439
28443
  const startIndex = Math.max(0, endIndex - count + 1);
28440
- return cachedMessages.slice(startIndex, endIndex + 1);
28444
+ return {
28445
+ messages: cachedMessages.slice(startIndex, endIndex + 1),
28446
+ hasMore: startIndex > 0 || !this.loadedEndMap.get(dialogId)
28447
+ };
28441
28448
  }
28442
28449
  clearConversationCache(conversation) {
28443
28450
  const dialogId = getFullDialogId(conversation);
28444
28451
  this.messageCache.delete(dialogId);
28452
+ this.loadedEndMap.set(dialogId, true);
28445
28453
  }
28446
28454
  clearAllCache() {
28447
28455
  this.messageCache.clear();
28456
+ this.loadedEndMap.clear();
28448
28457
  }
28449
28458
  removeMessagesByUId(messageUIds) {
28450
28459
  if (!messageUIds || messageUIds.length === 0) {
@@ -28579,7 +28588,12 @@ class IMClient extends EventEmitter {
28579
28588
  this.emit(Events.SUSPEND, this.libLoader.getConnectionStatus());
28580
28589
  },
28581
28590
  batchMessage: messages => {
28582
- MessageCache.get().addMessages(messages);
28591
+ if (messages.length) {
28592
+ MessageCache.get().addMessages(messages, {
28593
+ conversationType: messages[0].content,
28594
+ targetId: messages[0].targetId
28595
+ });
28596
+ }
28583
28597
  const filteredMessages = messages.filter(m => {
28584
28598
  if (m.messageDirection === MessageDirection.SEND && m.messageId && SentMessageStore.has(m.messageId)) {
28585
28599
  SentMessageStore.remove(m.messageId);
@@ -28653,11 +28667,13 @@ class IMClient extends EventEmitter {
28653
28667
  return result;
28654
28668
  }
28655
28669
  async getRemoteHistoryMessages(conversation, options) {
28670
+ const timestamp = options.timestamp ?? '0';
28671
+ const count = options.count ?? 20;
28656
28672
  const dialogId = getFullDialogId(conversation);
28657
28673
  return getRemoteMessages({
28658
28674
  dialogId,
28659
- offset: options.timestamp ?? '0',
28660
- count: options.count ?? 20,
28675
+ offset: timestamp,
28676
+ count,
28661
28677
  newToOld: options.order === 0
28662
28678
  }).then(({
28663
28679
  code,
@@ -28676,9 +28692,6 @@ class IMClient extends EventEmitter {
28676
28692
  }, (_, outputMsgs) => {
28677
28693
  const messageList = outputMsgs.get(dialogId) ?? [];
28678
28694
  messageList.sort((e1, e2) => Long.fromString(e1.sentTime).lessThan(Long.fromString(e2.sentTime)) ? -1 : 1);
28679
- if (options.order === 0 && !options.timestamp) {
28680
- ConversationManager$1.get().refreshLatestMessage(conversation, messageList[messageList.length - 1]);
28681
- }
28682
28695
  resolve({
28683
28696
  code: ErrorCode.SUCCESS,
28684
28697
  data: {
@@ -28691,31 +28704,36 @@ class IMClient extends EventEmitter {
28691
28704
  });
28692
28705
  }
28693
28706
  async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
28694
- const cachedMessages = MessageCache.get().getPreviousMessages(conversation, timestamp ?? "0", count);
28695
- if (!timestamp && cachedMessages.length) {
28696
- ConversationManager$1.get().refreshLatestMessage(conversation, cachedMessages[cachedMessages.length - 1]);
28707
+ const cachedResult = MessageCache.get().getPreviousMessages(conversation, timestamp ?? '0', count);
28708
+ if (!timestamp && cachedResult.messages.length) {
28709
+ ConversationManager$1.get().refreshLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
28697
28710
  }
28698
- if (cachedMessages.length >= count) {
28711
+ if (cachedResult.messages.length >= count || !cachedResult.hasMore) {
28699
28712
  return {
28700
28713
  code: ErrorCode.SUCCESS,
28701
28714
  data: {
28702
- list: cachedMessages,
28703
- hasMore: true
28715
+ list: cachedResult.messages,
28716
+ hasMore: cachedResult.hasMore
28704
28717
  }
28705
28718
  };
28706
28719
  }
28707
28720
  const remotesResult = await this.getRemoteHistoryMessages(conversation, {
28708
- timestamp: cachedMessages[0]?.sentTime ?? timestamp,
28709
- count: count - cachedMessages.length,
28721
+ timestamp: cachedResult.messages[0]?.sentTime ?? timestamp,
28722
+ count: count - cachedResult.messages.length,
28710
28723
  order: 0
28711
28724
  });
28712
28725
  if (remotesResult.code !== ErrorCode.SUCCESS) {
28713
28726
  return remotesResult;
28714
28727
  }
28728
+ const remotesMessages = remotesResult.data.list;
28729
+ if (!timestamp && remotesMessages.length) {
28730
+ ConversationManager$1.get().refreshLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
28731
+ }
28732
+ MessageCache.get().addMessages(remotesMessages, conversation, !remotesResult.data.hasMore);
28715
28733
  return {
28716
28734
  code: ErrorCode.SUCCESS,
28717
28735
  data: {
28718
- list: [...remotesResult.data.list, ...cachedMessages],
28736
+ list: [...remotesResult.data.list, ...cachedResult.messages],
28719
28737
  hasMore: remotesResult.data.hasMore
28720
28738
  }
28721
28739
  };
@@ -28758,7 +28776,7 @@ class IMClient extends EventEmitter {
28758
28776
  if (isDef(conversationObj.latestMessage)) {
28759
28777
  conversationObj.updateTime = parseInt(conversationObj.latestMessage.sentTime);
28760
28778
  } else {
28761
- conversationObj.updateTime = (contentList[contentList.length - 1].updateTime ?? 0) + 1;
28779
+ conversationObj.updateTime = (contentList[contentList.length - 1]?.updateTime ?? 0) + 1;
28762
28780
  }
28763
28781
  ConversationManager$1.get().addLocalConversation(conversationObj);
28764
28782
  const localConversation = ConversationManager$1.get().get(conOpt);
package/index.umd.js CHANGED
@@ -28382,7 +28382,8 @@
28382
28382
  class MessageCache {
28383
28383
  static instance;
28384
28384
  messageCache = new Map();
28385
- maxCacheCount = 100;
28385
+ loadedEndMap = new Map();
28386
+ maxCacheCount = 1000;
28386
28387
  constructor() {}
28387
28388
  static get() {
28388
28389
  if (!MessageCache.instance) {
@@ -28395,41 +28396,41 @@
28395
28396
  this.maxCacheCount = count;
28396
28397
  }
28397
28398
  }
28398
- addMessages(messages) {
28399
+ addMessages(messages, toConversation, isEnd = undefined) {
28399
28400
  if (!messages || messages.length === 0) {
28400
28401
  return;
28401
28402
  }
28402
- const messagesByDialog = new Map();
28403
- messages.forEach(message => {
28404
- const dialogId = getFullDialogId({
28405
- conversationType: message.conversationType,
28406
- targetId: message.targetId
28407
- });
28408
- if (!messagesByDialog.has(dialogId)) {
28409
- messagesByDialog.set(dialogId, []);
28410
- }
28411
- messagesByDialog.get(dialogId)?.push(message);
28412
- });
28413
- messagesByDialog.forEach((dialogMessages, dialogId) => {
28414
- if (!this.messageCache.has(dialogId)) {
28415
- this.messageCache.set(dialogId, []);
28416
- }
28417
- const cachedMessages = this.messageCache.get(dialogId) || [];
28418
- const allMessages = [...cachedMessages, ...dialogMessages];
28419
- if (allMessages.length > this.maxCacheCount) {
28420
- allMessages.splice(0, allMessages.length - this.maxCacheCount);
28421
- }
28422
- this.messageCache.set(dialogId, allMessages);
28423
- });
28403
+ const dialogId = getFullDialogId(toConversation);
28404
+ if (isEnd !== undefined) {
28405
+ this.loadedEndMap.set(dialogId, isEnd);
28406
+ }
28407
+ if (!this.messageCache.has(dialogId)) {
28408
+ this.messageCache.set(dialogId, []);
28409
+ }
28410
+ const cachedMessages = this.messageCache.get(dialogId) || [];
28411
+ const existingMessageIds = new Set(cachedMessages.map(msg => msg.messageUId));
28412
+ const newMessages = messages.filter(msg => !existingMessageIds.has(msg.messageUId));
28413
+ const allMessages = [...cachedMessages, ...newMessages].sort((a, b) => Long.fromString(a.sentTime).compare(Long.fromString(b.sentTime)));
28414
+ if (allMessages.length > this.maxCacheCount) {
28415
+ allMessages.splice(0, allMessages.length - this.maxCacheCount);
28416
+ }
28417
+ this.messageCache.set(dialogId, allMessages);
28424
28418
  }
28425
28419
  getPreviousMessages(conversation, timestamp = "0", count = 20) {
28426
28420
  const dialogId = getFullDialogId(conversation);
28427
28421
  const cachedMessages = this.messageCache.get(dialogId) || [];
28428
28422
  if (cachedMessages.length === 0) {
28429
- return [];
28423
+ return {
28424
+ messages: [],
28425
+ hasMore: !this.loadedEndMap.get(dialogId)
28426
+ };
28430
28427
  }
28431
28428
  if (timestamp === "0") {
28432
- return cachedMessages.slice(-count);
28429
+ const messages = cachedMessages.slice(-count);
28430
+ return {
28431
+ messages,
28432
+ hasMore: cachedMessages.length > count || !this.loadedEndMap.get(dialogId)
28433
+ };
28433
28434
  }
28434
28435
  const timestampLong = Long.fromString(timestamp);
28435
28436
  let endIndex = cachedMessages.length - 1;
@@ -28440,17 +28441,25 @@
28440
28441
  endIndex--;
28441
28442
  }
28442
28443
  if (endIndex < 0) {
28443
- return [];
28444
+ return {
28445
+ messages: [],
28446
+ hasMore: !this.loadedEndMap.get(dialogId)
28447
+ };
28444
28448
  }
28445
28449
  const startIndex = Math.max(0, endIndex - count + 1);
28446
- return cachedMessages.slice(startIndex, endIndex + 1);
28450
+ return {
28451
+ messages: cachedMessages.slice(startIndex, endIndex + 1),
28452
+ hasMore: startIndex > 0 || !this.loadedEndMap.get(dialogId)
28453
+ };
28447
28454
  }
28448
28455
  clearConversationCache(conversation) {
28449
28456
  const dialogId = getFullDialogId(conversation);
28450
28457
  this.messageCache.delete(dialogId);
28458
+ this.loadedEndMap.set(dialogId, true);
28451
28459
  }
28452
28460
  clearAllCache() {
28453
28461
  this.messageCache.clear();
28462
+ this.loadedEndMap.clear();
28454
28463
  }
28455
28464
  removeMessagesByUId(messageUIds) {
28456
28465
  if (!messageUIds || messageUIds.length === 0) {
@@ -28585,7 +28594,12 @@
28585
28594
  this.emit(exports.Events.SUSPEND, this.libLoader.getConnectionStatus());
28586
28595
  },
28587
28596
  batchMessage: messages => {
28588
- MessageCache.get().addMessages(messages);
28597
+ if (messages.length) {
28598
+ MessageCache.get().addMessages(messages, {
28599
+ conversationType: messages[0].content,
28600
+ targetId: messages[0].targetId
28601
+ });
28602
+ }
28589
28603
  const filteredMessages = messages.filter(m => {
28590
28604
  if (m.messageDirection === exports.MessageDirection.SEND && m.messageId && SentMessageStore.has(m.messageId)) {
28591
28605
  SentMessageStore.remove(m.messageId);
@@ -28659,11 +28673,13 @@
28659
28673
  return result;
28660
28674
  }
28661
28675
  async getRemoteHistoryMessages(conversation, options) {
28676
+ const timestamp = options.timestamp ?? '0';
28677
+ const count = options.count ?? 20;
28662
28678
  const dialogId = getFullDialogId(conversation);
28663
28679
  return getRemoteMessages({
28664
28680
  dialogId,
28665
- offset: options.timestamp ?? '0',
28666
- count: options.count ?? 20,
28681
+ offset: timestamp,
28682
+ count,
28667
28683
  newToOld: options.order === 0
28668
28684
  }).then(({
28669
28685
  code,
@@ -28682,9 +28698,6 @@
28682
28698
  }, (_, outputMsgs) => {
28683
28699
  const messageList = outputMsgs.get(dialogId) ?? [];
28684
28700
  messageList.sort((e1, e2) => Long.fromString(e1.sentTime).lessThan(Long.fromString(e2.sentTime)) ? -1 : 1);
28685
- if (options.order === 0 && !options.timestamp) {
28686
- ConversationManager$1.get().refreshLatestMessage(conversation, messageList[messageList.length - 1]);
28687
- }
28688
28701
  resolve({
28689
28702
  code: exports.ErrorCode.SUCCESS,
28690
28703
  data: {
@@ -28697,31 +28710,36 @@
28697
28710
  });
28698
28711
  }
28699
28712
  async getPreviousHistoryMessages(conversation, timestamp, count = 20) {
28700
- const cachedMessages = MessageCache.get().getPreviousMessages(conversation, timestamp ?? "0", count);
28701
- if (!timestamp && cachedMessages.length) {
28702
- ConversationManager$1.get().refreshLatestMessage(conversation, cachedMessages[cachedMessages.length - 1]);
28713
+ const cachedResult = MessageCache.get().getPreviousMessages(conversation, timestamp ?? '0', count);
28714
+ if (!timestamp && cachedResult.messages.length) {
28715
+ ConversationManager$1.get().refreshLatestMessage(conversation, cachedResult.messages[cachedResult.messages.length - 1]);
28703
28716
  }
28704
- if (cachedMessages.length >= count) {
28717
+ if (cachedResult.messages.length >= count || !cachedResult.hasMore) {
28705
28718
  return {
28706
28719
  code: exports.ErrorCode.SUCCESS,
28707
28720
  data: {
28708
- list: cachedMessages,
28709
- hasMore: true
28721
+ list: cachedResult.messages,
28722
+ hasMore: cachedResult.hasMore
28710
28723
  }
28711
28724
  };
28712
28725
  }
28713
28726
  const remotesResult = await this.getRemoteHistoryMessages(conversation, {
28714
- timestamp: cachedMessages[0]?.sentTime ?? timestamp,
28715
- count: count - cachedMessages.length,
28727
+ timestamp: cachedResult.messages[0]?.sentTime ?? timestamp,
28728
+ count: count - cachedResult.messages.length,
28716
28729
  order: 0
28717
28730
  });
28718
28731
  if (remotesResult.code !== exports.ErrorCode.SUCCESS) {
28719
28732
  return remotesResult;
28720
28733
  }
28734
+ const remotesMessages = remotesResult.data.list;
28735
+ if (!timestamp && remotesMessages.length) {
28736
+ ConversationManager$1.get().refreshLatestMessage(conversation, remotesMessages[remotesMessages.length - 1]);
28737
+ }
28738
+ MessageCache.get().addMessages(remotesMessages, conversation, !remotesResult.data.hasMore);
28721
28739
  return {
28722
28740
  code: exports.ErrorCode.SUCCESS,
28723
28741
  data: {
28724
- list: [...remotesResult.data.list, ...cachedMessages],
28742
+ list: [...remotesResult.data.list, ...cachedResult.messages],
28725
28743
  hasMore: remotesResult.data.hasMore
28726
28744
  }
28727
28745
  };
@@ -28764,7 +28782,7 @@
28764
28782
  if (isDef(conversationObj.latestMessage)) {
28765
28783
  conversationObj.updateTime = parseInt(conversationObj.latestMessage.sentTime);
28766
28784
  } else {
28767
- conversationObj.updateTime = (contentList[contentList.length - 1].updateTime ?? 0) + 1;
28785
+ conversationObj.updateTime = (contentList[contentList.length - 1]?.updateTime ?? 0) + 1;
28768
28786
  }
28769
28787
  ConversationManager$1.get().addLocalConversation(conversationObj);
28770
28788
  const localConversation = ConversationManager$1.get().get(conOpt);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onyx-p/imlib-web",
3
- "version": "1.9.9",
3
+ "version": "2.0.1",
4
4
  "main": "index.umd.js",
5
5
  "module": "index.esm.js",
6
6
  "types": "types/index.d.ts",