mdm-im-v3 2.0.2 → 2.1.0

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 (33) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +69 -0
  3. package/dist/{FilePreview-u-aYsWSs.js → FilePreview-dpnc9m3Z.js} +2 -2
  4. package/dist/assets/extracted/bc26358d.woff +0 -0
  5. package/dist/assets/extracted/be398edc.ttf +0 -0
  6. package/dist/assets/extracted/de12ee92.woff2 +0 -0
  7. package/dist/core.es.js +2 -2
  8. package/dist/{index-HUSyWSoO.js → index-CNxeqkio.js} +1433 -3172
  9. package/dist/{index-Bn5zFiV_.js → index-CsaYx_7b.js} +697 -47
  10. package/dist/{index-D8yaC3ve.js → index-D5S79LNp.js} +3201 -261
  11. package/dist/index.es.js +1 -1
  12. package/dist/style/index.css +1 -1
  13. package/dist-h5/{ChatHistoryH5-Deqlnw3u.js → ChatHistoryH5-BhrGF5WR.js} +2 -2
  14. package/dist-h5/{ChatPageH5-wyLGmPhW.js → ChatPageH5-B3azJu7O.js} +975 -164
  15. package/dist-h5/{ChatSettingsH5-DD3dnI-H.js → ChatSettingsH5-CFr9Bn69.js} +169 -27
  16. package/dist-h5/{CreateGroupH5-3LIujy3_.js → CreateGroupH5-a16jkObH.js} +2 -2
  17. package/dist-h5/{GroupAnnouncementH5-5EpXQs5V.js → GroupAnnouncementH5-B-Qfzoy2.js} +1 -1
  18. package/dist-h5/{GroupInfoDialogH5-fgcrbRyp.js → GroupInfoDialogH5-BHLKs62Z.js} +1 -1
  19. package/dist-h5/{GroupMembersH5-DX2lxrLB.js → GroupMembersH5-D_f1RFjO.js} +1 -1
  20. package/dist-h5/{GroupNoticeH5-DVXrcmP9.js → GroupNoticeH5-46ZjBe92.js} +1 -1
  21. package/dist-h5/{MemberDetailH5-DAVUVr30.js → MemberDetailH5-B7nlr8ZT.js} +2 -2
  22. package/dist-h5/{SearchPageH5-BiGhJF4U.js → SearchPageH5-hYxNItvz.js} +2 -2
  23. package/dist-h5/{SelectMembersH5-DbrSnTg3.js → SelectMembersH5-DQIfX_w4.js} +2 -2
  24. package/dist-h5/assets/extracted/bc26358d.woff +0 -0
  25. package/dist-h5/assets/extracted/be398edc.ttf +0 -0
  26. package/dist-h5/assets/extracted/de12ee92.woff2 +0 -0
  27. package/dist-h5/{imChat-Cz45JFEl.js → imChat-Bfl2JS8Q.js} +1 -1
  28. package/dist-h5/index.es.js +1 -1
  29. package/dist-h5/{indexH5-BZ77bUNH.js → indexH5-CUQe-Ize.js} +97 -69
  30. package/dist-h5/{indexH5-Cx3l8YDq.js → indexH5-DAnvVyZ1.js} +3238 -261
  31. package/dist-h5/{request-rky8JSGo.js → request-CK8gkCRf.js} +1 -1
  32. package/dist-h5/style/index-h5.css +1 -1
  33. package/package.json +3 -2
@@ -475,6 +475,9 @@ const CbEvents = {
475
475
  OnRecvGroupReadReceipt: "OnRecvGroupReadReceipt",
476
476
  OnConversationChanged: "OnConversationChanged",
477
477
  OnNewConversation: "OnNewConversation",
478
+ OnSyncServerFailed: "OnSyncServerFailed",
479
+ OnSyncServerFinish: "OnSyncServerFinish",
480
+ OnSyncServerStart: "OnSyncServerStart",
478
481
  OnTotalUnreadMessageCountChanged: "OnTotalUnreadMessageCountChanged",
479
482
  OnJoinedGroupAdded: "OnJoinedGroupAdded",
480
483
  OnJoinedGroupDeleted: "OnJoinedGroupDeleted",
@@ -9996,6 +9999,8 @@ class ImKit extends EventEmitter {
9996
9999
  // SDK实例
9997
10000
  __publicField(this, "isConnecting", false);
9998
10001
  // 是否在连接中
10002
+ __publicField(this, "syncFinished", false);
10003
+ // 登录后的服务端同步是否完成(同步完成前 SDK 本地会话缓存为空)
9999
10004
  __publicField(this, "loginStatus", IM_LOGIN_STATUS.Logout);
10000
10005
  // 1 未登录 2 登录中 3 已登录
10001
10006
  __publicField(this, "groupStatus", IM_GROUP_STATUS.Nomal);
@@ -10054,6 +10059,7 @@ class ImKit extends EventEmitter {
10054
10059
  console.log("请先初始化SDK");
10055
10060
  return false;
10056
10061
  }
10062
+ this.syncFinished = false;
10057
10063
  try {
10058
10064
  const res = await this.IMSDK.login(
10059
10065
  {
@@ -10066,8 +10072,8 @@ class ImKit extends EventEmitter {
10066
10072
  operationID
10067
10073
  );
10068
10074
  return !res.errMsg;
10069
- } catch (error2) {
10070
- console.error("登陆失败:", error2);
10075
+ } catch (error) {
10076
+ console.error("登陆失败:", error);
10071
10077
  return false;
10072
10078
  }
10073
10079
  }
@@ -10120,6 +10126,31 @@ class ImKit extends EventEmitter {
10120
10126
  this.IMSDK.off(CbEvents.OnUserTokenExpired);
10121
10127
  this.IMSDK.off(CbEvents.OnKickedOffline);
10122
10128
  }
10129
+ // 登录后服务端同步监听器
10130
+ // 登录回调 OnConnectSuccess 早于同步完成 OnSyncServerFinish,同步完成前 SDK 本地会话缓存为空,
10131
+ // 此时调用 getConversationListSplit 只会拿到空数组,因此需要把同步状态暴露给上层。
10132
+ bindSyncListener() {
10133
+ if (!this.IMSDK) return;
10134
+ this.IMSDK.on(CbEvents.OnSyncServerStart, () => {
10135
+ this.syncFinished = false;
10136
+ this.emit(CbEvents.OnSyncServerStart);
10137
+ });
10138
+ this.IMSDK.on(CbEvents.OnSyncServerFinish, () => {
10139
+ this.syncFinished = true;
10140
+ this.emit(CbEvents.OnSyncServerFinish);
10141
+ });
10142
+ this.IMSDK.on(CbEvents.OnSyncServerFailed, (data) => {
10143
+ this.syncFinished = true;
10144
+ this.emit(CbEvents.OnSyncServerFailed, data);
10145
+ });
10146
+ }
10147
+ // 解除服务端同步监听器
10148
+ unbindSyncListener() {
10149
+ if (!this.IMSDK) return;
10150
+ this.IMSDK.off(CbEvents.OnSyncServerStart);
10151
+ this.IMSDK.off(CbEvents.OnSyncServerFinish);
10152
+ this.IMSDK.off(CbEvents.OnSyncServerFailed);
10153
+ }
10123
10154
  // 用户信息监听器
10124
10155
  bindUserListener() {
10125
10156
  if (!this.IMSDK) return;
@@ -10253,6 +10284,7 @@ class ImKit extends EventEmitter {
10253
10284
  // 绑定事件
10254
10285
  bindEvent() {
10255
10286
  this.bindConnectListener();
10287
+ this.bindSyncListener();
10256
10288
  this.bindUserListener();
10257
10289
  this.bindMsgListener();
10258
10290
  this.bindConversationListener();
@@ -10261,6 +10293,7 @@ class ImKit extends EventEmitter {
10261
10293
  // 解绑事件
10262
10294
  unbindEvent() {
10263
10295
  this.unbindConnectListener();
10296
+ this.unbindSyncListener();
10264
10297
  this.unbindUserListener();
10265
10298
  this.unbindMsgListener();
10266
10299
  this.unbindConversationListener();
@@ -10278,8 +10311,8 @@ class ImKit extends EventEmitter {
10278
10311
  this.IMSDK.logout().then(() => {
10279
10312
  this.getLoginStatus();
10280
10313
  return true;
10281
- }).catch((error2) => {
10282
- console.log("IM登出异常:", error2);
10314
+ }).catch((error) => {
10315
+ console.log("IM登出异常:", error);
10283
10316
  return false;
10284
10317
  });
10285
10318
  }
@@ -10296,9 +10329,9 @@ class ImKit extends EventEmitter {
10296
10329
  this.loginStatus = res.data;
10297
10330
  this.updateLoginStatus();
10298
10331
  }
10299
- } catch (error2) {
10300
- console.log("获取登陆状态失败:", error2);
10301
- this.handleError(error2);
10332
+ } catch (error) {
10333
+ console.log("获取登陆状态失败:", error);
10334
+ this.handleError(error);
10302
10335
  }
10303
10336
  }
10304
10337
  // 更新登录状态
@@ -10306,8 +10339,8 @@ class ImKit extends EventEmitter {
10306
10339
  this.emit("updateStatus", this.loginStatus);
10307
10340
  }
10308
10341
  // 处理异常
10309
- handleError(error2) {
10310
- this.emit("im-error", error2);
10342
+ handleError(error) {
10343
+ this.emit("im-error", error);
10311
10344
  }
10312
10345
  /**
10313
10346
  * --------------------------------------用户相关-------------------------------------
@@ -10326,9 +10359,9 @@ class ImKit extends EventEmitter {
10326
10359
  try {
10327
10360
  const res = await ((_a = this.IMSDK) == null ? void 0 : _a.setSelfInfo(userInfo, operationID));
10328
10361
  return !res.errMsg;
10329
- } catch (error2) {
10330
- console.error("设置个人信息失败:", error2);
10331
- this.handleError(error2);
10362
+ } catch (error) {
10363
+ console.error("设置个人信息失败:", error);
10364
+ this.handleError(error);
10332
10365
  return null;
10333
10366
  }
10334
10367
  }
@@ -10343,9 +10376,9 @@ class ImKit extends EventEmitter {
10343
10376
  return res.data;
10344
10377
  }
10345
10378
  return null;
10346
- } catch (error2) {
10347
- console.error("获取当前登录用户ID失败:", error2);
10348
- this.handleError(error2);
10379
+ } catch (error) {
10380
+ console.error("获取当前登录用户ID失败:", error);
10381
+ this.handleError(error);
10349
10382
  return null;
10350
10383
  }
10351
10384
  }
@@ -10359,9 +10392,9 @@ class ImKit extends EventEmitter {
10359
10392
  return res.data;
10360
10393
  }
10361
10394
  return null;
10362
- } catch (error2) {
10363
- console.error("获取自己用户信息失败:", error2);
10364
- this.handleError(error2);
10395
+ } catch (error) {
10396
+ console.error("获取自己用户信息失败:", error);
10397
+ this.handleError(error);
10365
10398
  return null;
10366
10399
  }
10367
10400
  }
@@ -10378,9 +10411,9 @@ class ImKit extends EventEmitter {
10378
10411
  return res.data;
10379
10412
  }
10380
10413
  return [];
10381
- } catch (error2) {
10382
- console.error("获取用户信息失败:", error2);
10383
- this.handleError(error2);
10414
+ } catch (error) {
10415
+ console.error("获取用户信息失败:", error);
10416
+ this.handleError(error);
10384
10417
  return [];
10385
10418
  }
10386
10419
  }
@@ -10398,9 +10431,9 @@ class ImKit extends EventEmitter {
10398
10431
  return res.data;
10399
10432
  }
10400
10433
  return [];
10401
- } catch (error2) {
10402
- console.error("订阅用户的在线状态失败:", error2);
10403
- this.handleError(error2);
10434
+ } catch (error) {
10435
+ console.error("订阅用户的在线状态失败:", error);
10436
+ this.handleError(error);
10404
10437
  return [];
10405
10438
  }
10406
10439
  }
@@ -10417,9 +10450,9 @@ class ImKit extends EventEmitter {
10417
10450
  return res.data;
10418
10451
  }
10419
10452
  return [];
10420
- } catch (error2) {
10421
- console.error("取消订阅用户的在线状态失败:", error2);
10422
- this.handleError(error2);
10453
+ } catch (error) {
10454
+ console.error("取消订阅用户的在线状态失败:", error);
10455
+ this.handleError(error);
10423
10456
  return [];
10424
10457
  }
10425
10458
  }
@@ -10436,9 +10469,9 @@ class ImKit extends EventEmitter {
10436
10469
  return res.data;
10437
10470
  }
10438
10471
  return [];
10439
- } catch (error2) {
10440
- console.error("获取所有已订阅用户的在线状态失败:", error2);
10441
- this.handleError(error2);
10472
+ } catch (error) {
10473
+ console.error("获取所有已订阅用户的在线状态失败:", error);
10474
+ this.handleError(error);
10442
10475
  return [];
10443
10476
  }
10444
10477
  }
@@ -10456,9 +10489,9 @@ class ImKit extends EventEmitter {
10456
10489
  return res.data;
10457
10490
  }
10458
10491
  return [];
10459
- } catch (error2) {
10460
- console.error("获取我的好友列表失败:", error2);
10461
- this.handleError(error2);
10492
+ } catch (error) {
10493
+ console.error("获取我的好友列表失败:", error);
10494
+ this.handleError(error);
10462
10495
  return [];
10463
10496
  }
10464
10497
  }
@@ -10477,9 +10510,9 @@ class ImKit extends EventEmitter {
10477
10510
  operationID
10478
10511
  );
10479
10512
  return !res.errMsg;
10480
- } catch (error2) {
10481
- console.error("添加好友失败:", error2);
10482
- this.handleError(error2);
10513
+ } catch (error) {
10514
+ console.error("添加好友失败:", error);
10515
+ this.handleError(error);
10483
10516
  return null;
10484
10517
  }
10485
10518
  }
@@ -10498,9 +10531,9 @@ class ImKit extends EventEmitter {
10498
10531
  operationID
10499
10532
  );
10500
10533
  return !res.errMsg;
10501
- } catch (error2) {
10502
- console.error("同意好友申请失败:", error2);
10503
- this.handleError(error2);
10534
+ } catch (error) {
10535
+ console.error("同意好友申请失败:", error);
10536
+ this.handleError(error);
10504
10537
  return null;
10505
10538
  }
10506
10539
  }
@@ -10519,9 +10552,9 @@ class ImKit extends EventEmitter {
10519
10552
  try {
10520
10553
  const res = await ((_a = this.IMSDK) == null ? void 0 : _a.getConversationCount(operationID));
10521
10554
  return (res == null ? void 0 : res.data) || 0;
10522
- } catch (error2) {
10523
- console.error("获取会话总数失败:", error2);
10524
- this.handleError(error2);
10555
+ } catch (error) {
10556
+ console.error("获取会话总数失败:", error);
10557
+ this.handleError(error);
10525
10558
  return 0;
10526
10559
  }
10527
10560
  }
@@ -10541,31 +10574,62 @@ class ImKit extends EventEmitter {
10541
10574
  return res.data;
10542
10575
  }
10543
10576
  return null;
10544
- } catch (error2) {
10545
- console.error("获取单个会话信息失败:", error2);
10546
- this.handleError(error2);
10577
+ } catch (error) {
10578
+ console.error("获取单个会话信息失败:", error);
10579
+ this.handleError(error);
10547
10580
  return null;
10548
10581
  }
10549
10582
  }
10550
10583
  /**
10551
10584
  * 设置会话信息,消息免打扰,置顶、阅后即焚等操作
10585
+ * 只透传调用方显式传入的字段:避免未传 ex 时被默认空串覆盖,误清"手动标记未读/隐藏会话"等会话扩展
10552
10586
  * @param {Object} conversationID-会话ID,recvMsgOpt-会话消息免打扰状态,groupAtType-会话强提醒类型,isPinned-是否置顶,isPrivateChat-是否阅后即焚,burnDuration-阅后即焚时间,ex-扩展字段
10553
10587
  */
10554
- async setConversation({ conversationID, recvMsgOpt, groupAtType, burnDuration, isPinned, isPrivateChat, ex = "" }) {
10588
+ async setConversation({ conversationID, recvMsgOpt, groupAtType, burnDuration, isPinned, isPrivateChat, ex }) {
10589
+ if (!conversationID || !this.IMSDK) return false;
10590
+ try {
10591
+ const payload = { conversationID };
10592
+ if (recvMsgOpt !== void 0) payload.recvMsgOpt = recvMsgOpt;
10593
+ if (groupAtType !== void 0) payload.groupAtType = groupAtType;
10594
+ if (burnDuration !== void 0) payload.burnDuration = burnDuration;
10595
+ if (isPinned !== void 0) payload.isPinned = isPinned;
10596
+ if (isPrivateChat !== void 0) payload.isPrivateChat = isPrivateChat;
10597
+ if (ex !== void 0) payload.ex = ex;
10598
+ const res = await this.IMSDK.setConversation(payload);
10599
+ return !res.errMsg;
10600
+ } catch (error) {
10601
+ console.error("设置会话信息失败:", error);
10602
+ this.handleError(error);
10603
+ return false;
10604
+ }
10605
+ }
10606
+ /**
10607
+ * 设置会话阅后即焚(开关与时长必须一次性提交)
10608
+ * 只提交 isPrivateChat 而不提交 burnDuration,服务端可能按默认时长处理,出现"开关开了但消息永不销毁"的假成功;
10609
+ * 只提交 burnDuration 而会话仍是关闭态,则设置不生效。
10610
+ * @param {Object} param0
10611
+ * @param {String} param0.conversationID 会话 ID
10612
+ * @param {Boolean} param0.isPrivateChat 是否开启阅后即焚
10613
+ * @param {Number} param0.burnDuration 销毁倒计时(秒);关闭时强制为 0
10614
+ * @param {String} param0.ex 会话扩展字段(本客户端用它保存"我的阅后即焚设置",按用户隔离)
10615
+ * @returns {Promise<Boolean>}
10616
+ */
10617
+ async setPrivateChat({ conversationID, isPrivateChat, burnDuration, ex }) {
10618
+ if (!conversationID || !this.IMSDK) return false;
10619
+ const enable = !!isPrivateChat;
10620
+ const duration = enable ? Math.max(1, Math.floor(Number(burnDuration) || 0)) : 0;
10555
10621
  try {
10556
- const res = await this.IMSDK.setConversation({
10622
+ const payload = {
10557
10623
  conversationID,
10558
- recvMsgOpt,
10559
- groupAtType,
10560
- burnDuration,
10561
- isPinned,
10562
- isPrivateChat,
10563
- ex
10564
- });
10624
+ isPrivateChat: enable,
10625
+ burnDuration: duration
10626
+ };
10627
+ if (ex !== void 0) payload.ex = ex;
10628
+ const res = await this.IMSDK.setConversation(payload);
10565
10629
  return !res.errMsg;
10566
- } catch (error2) {
10567
- console.error("会话置顶失败:", error2);
10568
- this.handleError(error2);
10630
+ } catch (error) {
10631
+ console.error("设置阅后即焚失败:", error);
10632
+ this.handleError(error);
10569
10633
  return false;
10570
10634
  }
10571
10635
  }
@@ -10592,7 +10656,7 @@ class ImKit extends EventEmitter {
10592
10656
  return [];
10593
10657
  } catch (err) {
10594
10658
  console.error("会话分页获取会话列表失败:", err == null ? void 0 : err.errMsg);
10595
- this.handleError(error);
10659
+ this.handleError(err);
10596
10660
  return [];
10597
10661
  }
10598
10662
  }
@@ -10611,7 +10675,7 @@ class ImKit extends EventEmitter {
10611
10675
  return [];
10612
10676
  } catch (err) {
10613
10677
  console.error("获取所有会话列表失败:", err == null ? void 0 : err.errMsg);
10614
- this.handleError(error);
10678
+ this.handleError(err);
10615
10679
  return [];
10616
10680
  }
10617
10681
  }
@@ -10627,9 +10691,9 @@ class ImKit extends EventEmitter {
10627
10691
  try {
10628
10692
  const res = await ((_a = this.IMSDK) == null ? void 0 : _a.getTotalUnreadMsgCount(operationID));
10629
10693
  return (res == null ? void 0 : res.data) || 0;
10630
- } catch (error2) {
10631
- console.error("获取未读消息总数失败:", error2);
10632
- this.handleError(error2);
10694
+ } catch (error) {
10695
+ console.error("获取未读消息总数失败:", error);
10696
+ this.handleError(error);
10633
10697
  return 0;
10634
10698
  }
10635
10699
  }
@@ -10645,8 +10709,11 @@ class ImKit extends EventEmitter {
10645
10709
  }
10646
10710
  try {
10647
10711
  const res = await this.IMSDK.markConversationMessageAsRead(conversationID, operationID);
10648
- return !res.errMsg;
10712
+ if ((res == null ? void 0 : res.errMsg) && /hasReadSeq equal max/i.test(res.errMsg)) return true;
10713
+ if (res == null ? void 0 : res.errMsg) this.handleError(res);
10714
+ return !(res == null ? void 0 : res.errMsg);
10649
10715
  } catch (err) {
10716
+ this.handleError(err);
10650
10717
  return false;
10651
10718
  }
10652
10719
  }
@@ -10726,19 +10793,22 @@ class ImKit extends EventEmitter {
10726
10793
  if (res.data && res.data.messageList) {
10727
10794
  return {
10728
10795
  list: res.data.messageList || [],
10729
- isEnd: res.data.isEnd
10796
+ isEnd: res.data.isEnd,
10797
+ error: null
10730
10798
  };
10731
10799
  }
10732
10800
  return {
10733
10801
  list: [],
10734
- isEnd: true
10802
+ isEnd: true,
10803
+ error: null
10735
10804
  };
10736
- } catch (error2) {
10737
- console.error("获取会话的历史消息失败:", error2);
10738
- this.handleError(error2);
10805
+ } catch (error) {
10806
+ console.error("获取会话的历史消息失败:", error);
10807
+ this.handleError(error);
10739
10808
  return {
10740
10809
  list: [],
10741
- isEnd: true
10810
+ isEnd: false,
10811
+ error
10742
10812
  };
10743
10813
  }
10744
10814
  }
@@ -10759,19 +10829,22 @@ class ImKit extends EventEmitter {
10759
10829
  if (res.data && res.data.messageList) {
10760
10830
  return {
10761
10831
  list: res.data.messageList || [],
10762
- isEnd: res.data.isEnd
10832
+ isEnd: res.data.isEnd,
10833
+ error: null
10763
10834
  };
10764
10835
  }
10765
10836
  return {
10766
10837
  list: [],
10767
- isEnd: true
10838
+ isEnd: true,
10839
+ error: null
10768
10840
  };
10769
- } catch (error2) {
10770
- console.error("获取会话的历史消息失败:", error2);
10771
- this.handleError(error2);
10841
+ } catch (error) {
10842
+ console.error("获取会话的历史消息失败:", error);
10843
+ this.handleError(error);
10772
10844
  return {
10773
10845
  list: [],
10774
- isEnd: true
10846
+ isEnd: false,
10847
+ error
10775
10848
  };
10776
10849
  }
10777
10850
  }
@@ -10784,9 +10857,9 @@ class ImKit extends EventEmitter {
10784
10857
  return res.data;
10785
10858
  }
10786
10859
  return null;
10787
- } catch (error2) {
10788
- console.error("创建文本消息失败:", error2);
10789
- this.handleError(error2);
10860
+ } catch (error) {
10861
+ console.error("创建文本消息失败:", error);
10862
+ this.handleError(error);
10790
10863
  return null;
10791
10864
  }
10792
10865
  }
@@ -10800,9 +10873,9 @@ class ImKit extends EventEmitter {
10800
10873
  return res.data;
10801
10874
  }
10802
10875
  return null;
10803
- } catch (error2) {
10804
- console.error("创建引用消息失败:", error2);
10805
- this.handleError(error2);
10876
+ } catch (error) {
10877
+ console.error("创建引用消息失败:", error);
10878
+ this.handleError(error);
10806
10879
  return null;
10807
10880
  }
10808
10881
  }
@@ -10824,9 +10897,9 @@ class ImKit extends EventEmitter {
10824
10897
  return res.data;
10825
10898
  }
10826
10899
  return null;
10827
- } catch (error2) {
10828
- console.error("创建@消息失败:", error2);
10829
- this.handleError(error2);
10900
+ } catch (error) {
10901
+ console.error("创建@消息失败:", error);
10902
+ this.handleError(error);
10830
10903
  return null;
10831
10904
  }
10832
10905
  }
@@ -10845,9 +10918,9 @@ class ImKit extends EventEmitter {
10845
10918
  return res.data;
10846
10919
  }
10847
10920
  return null;
10848
- } catch (error2) {
10849
- console.error("创建转发消息失败:", error2);
10850
- this.handleError(error2);
10921
+ } catch (error) {
10922
+ console.error("创建转发消息失败:", error);
10923
+ this.handleError(error);
10851
10924
  return null;
10852
10925
  }
10853
10926
  }
@@ -10871,9 +10944,9 @@ class ImKit extends EventEmitter {
10871
10944
  return res.data;
10872
10945
  }
10873
10946
  return null;
10874
- } catch (error2) {
10875
- console.error("创建自定义消息失败:", error2);
10876
- this.handleError(error2);
10947
+ } catch (error) {
10948
+ console.error("创建自定义消息失败:", error);
10949
+ this.handleError(error);
10877
10950
  return null;
10878
10951
  }
10879
10952
  }
@@ -10901,9 +10974,9 @@ class ImKit extends EventEmitter {
10901
10974
  return res.data;
10902
10975
  }
10903
10976
  return null;
10904
- } catch (error2) {
10905
- console.error("创建合并消息失败:", error2);
10906
- this.handleError(error2);
10977
+ } catch (error) {
10978
+ console.error("创建合并消息失败:", error);
10979
+ this.handleError(error);
10907
10980
  return null;
10908
10981
  }
10909
10982
  }
@@ -10915,9 +10988,9 @@ class ImKit extends EventEmitter {
10915
10988
  return res.data;
10916
10989
  }
10917
10990
  return null;
10918
- } catch (error2) {
10919
- console.error("消息发送1失败:", error2);
10920
- this.handleError(error2);
10991
+ } catch (error) {
10992
+ console.error("消息发送1失败:", error);
10993
+ this.handleError(error);
10921
10994
  return null;
10922
10995
  }
10923
10996
  }
@@ -10929,9 +11002,9 @@ class ImKit extends EventEmitter {
10929
11002
  return res.data;
10930
11003
  }
10931
11004
  return null;
10932
- } catch (error2) {
10933
- console.error("创建图片消息失败:", error2);
10934
- this.handleError(error2);
11005
+ } catch (error) {
11006
+ console.error("创建图片消息失败:", error);
11007
+ this.handleError(error);
10935
11008
  return null;
10936
11009
  }
10937
11010
  }
@@ -10953,9 +11026,9 @@ class ImKit extends EventEmitter {
10953
11026
  return res.data;
10954
11027
  }
10955
11028
  return null;
10956
- } catch (error2) {
10957
- console.error("创建文件消息失败:", error2);
10958
- this.handleError(error2);
11029
+ } catch (error) {
11030
+ console.error("创建文件消息失败:", error);
11031
+ this.handleError(error);
10959
11032
  return null;
10960
11033
  }
10961
11034
  }
@@ -10977,9 +11050,9 @@ class ImKit extends EventEmitter {
10977
11050
  return res.data;
10978
11051
  }
10979
11052
  return null;
10980
- } catch (error2) {
10981
- console.error("创建语音消息失败:", error2);
10982
- this.handleError(error2);
11053
+ } catch (error) {
11054
+ console.error("创建语音消息失败:", error);
11055
+ this.handleError(error);
10983
11056
  return null;
10984
11057
  }
10985
11058
  }
@@ -11002,9 +11075,9 @@ class ImKit extends EventEmitter {
11002
11075
  return res.data;
11003
11076
  }
11004
11077
  return null;
11005
- } catch (error2) {
11006
- console.error("创建语音消息失败:", error2);
11007
- this.handleError(error2);
11078
+ } catch (error) {
11079
+ console.error("创建语音消息失败:", error);
11080
+ this.handleError(error);
11008
11081
  return null;
11009
11082
  }
11010
11083
  }
@@ -11016,9 +11089,9 @@ class ImKit extends EventEmitter {
11016
11089
  return res.data;
11017
11090
  }
11018
11091
  return null;
11019
- } catch (error2) {
11020
- console.error("创建视频消息失败:", error2);
11021
- this.handleError(error2);
11092
+ } catch (error) {
11093
+ console.error("创建视频消息失败:", error);
11094
+ this.handleError(error);
11022
11095
  return null;
11023
11096
  }
11024
11097
  }
@@ -11027,8 +11100,8 @@ class ImKit extends EventEmitter {
11027
11100
  try {
11028
11101
  const res = await this.IMSDK.deleteMessage({ conversationID, clientMsgID }, operationID);
11029
11102
  return !res.errMsg;
11030
- } catch (error2) {
11031
- this.handleError(error2);
11103
+ } catch (error) {
11104
+ this.handleError(error);
11032
11105
  return false;
11033
11106
  }
11034
11107
  }
@@ -11037,8 +11110,8 @@ class ImKit extends EventEmitter {
11037
11110
  try {
11038
11111
  const res = await this.IMSDK.revokeMessage({ conversationID, clientMsgID }, operationID);
11039
11112
  return !res.errMsg;
11040
- } catch (error2) {
11041
- this.handleError(error2);
11113
+ } catch (error) {
11114
+ this.handleError(error);
11042
11115
  return false;
11043
11116
  }
11044
11117
  }
@@ -11050,9 +11123,9 @@ class ImKit extends EventEmitter {
11050
11123
  return res.data;
11051
11124
  }
11052
11125
  return null;
11053
- } catch (error2) {
11054
- console.error("消息发送2失败:", error2);
11055
- this.handleError(error2);
11126
+ } catch (error) {
11127
+ console.error("消息发送2失败:", error);
11128
+ this.handleError(error);
11056
11129
  return null;
11057
11130
  }
11058
11131
  }
@@ -11067,9 +11140,9 @@ class ImKit extends EventEmitter {
11067
11140
  return res.data;
11068
11141
  }
11069
11142
  return [];
11070
- } catch (error2) {
11071
- console.error("获取群组信息失败:", error2);
11072
- this.handleError(error2);
11143
+ } catch (error) {
11144
+ console.error("获取群组信息失败:", error);
11145
+ this.handleError(error);
11073
11146
  return [];
11074
11147
  }
11075
11148
  }
@@ -11095,9 +11168,9 @@ class ImKit extends EventEmitter {
11095
11168
  operationID
11096
11169
  ));
11097
11170
  return !res.errMsg;
11098
- } catch (error2) {
11099
- console.error("创建群聊失败:", error2);
11100
- this.handleError(error2);
11171
+ } catch (error) {
11172
+ console.error("创建群聊失败:", error);
11173
+ this.handleError(error);
11101
11174
  return false;
11102
11175
  }
11103
11176
  }
@@ -11117,9 +11190,9 @@ class ImKit extends EventEmitter {
11117
11190
  return res.data;
11118
11191
  }
11119
11192
  return [];
11120
- } catch (error2) {
11121
- console.error("获取群组成员失败:", error2);
11122
- this.handleError(error2);
11193
+ } catch (error) {
11194
+ console.error("获取群组成员失败:", error);
11195
+ this.handleError(error);
11123
11196
  return [];
11124
11197
  }
11125
11198
  }
@@ -11139,9 +11212,9 @@ class ImKit extends EventEmitter {
11139
11212
  return res.data;
11140
11213
  }
11141
11214
  return [];
11142
- } catch (error2) {
11143
- console.error("获取群成员信息失败:", error2);
11144
- this.handleError(error2);
11215
+ } catch (error) {
11216
+ console.error("获取群成员信息失败:", error);
11217
+ this.handleError(error);
11145
11218
  return [];
11146
11219
  }
11147
11220
  }
@@ -11158,9 +11231,9 @@ class ImKit extends EventEmitter {
11158
11231
  try {
11159
11232
  const res = await this.IMSDK.inviteUserToGroup({ groupID, userIDList: userIDList2, reason }, operationID);
11160
11233
  return !res.errMsg;
11161
- } catch (error2) {
11162
- console.error("邀请用户进群失败:", error2);
11163
- this.handleError(error2);
11234
+ } catch (error) {
11235
+ console.error("邀请用户进群失败:", error);
11236
+ this.handleError(error);
11164
11237
  return false;
11165
11238
  }
11166
11239
  }
@@ -11177,9 +11250,9 @@ class ImKit extends EventEmitter {
11177
11250
  try {
11178
11251
  const res = await this.IMSDK.kickGroupMember({ groupID, userIDList: userIDList2, reason }, operationID);
11179
11252
  return !res.errMsg;
11180
- } catch (error2) {
11181
- console.error("移出用户失败:", error2);
11182
- this.handleError(error2);
11253
+ } catch (error) {
11254
+ console.error("移出用户失败:", error);
11255
+ this.handleError(error);
11183
11256
  return false;
11184
11257
  }
11185
11258
  }
@@ -11206,9 +11279,9 @@ class ImKit extends EventEmitter {
11206
11279
  operationID
11207
11280
  );
11208
11281
  return !res.errMsg;
11209
- } catch (error2) {
11210
- console.error("设置群组信息失败:", error2);
11211
- this.handleError(error2);
11282
+ } catch (error) {
11283
+ console.error("设置群组信息失败:", error);
11284
+ this.handleError(error);
11212
11285
  return false;
11213
11286
  }
11214
11287
  }
@@ -11231,9 +11304,9 @@ class ImKit extends EventEmitter {
11231
11304
  }
11232
11305
  const res = await this.IMSDK.setGroupMemberInfo(params, operationID);
11233
11306
  return !res.errMsg;
11234
- } catch (error2) {
11235
- console.error("修改群组成员信息失败:", error2);
11236
- this.handleError(error2);
11307
+ } catch (error) {
11308
+ console.error("修改群组成员信息失败:", error);
11309
+ this.handleError(error);
11237
11310
  return false;
11238
11311
  }
11239
11312
  }
@@ -11250,9 +11323,9 @@ class ImKit extends EventEmitter {
11250
11323
  try {
11251
11324
  const res = await this.IMSDK.changeGroupMute({ groupID, isMute }, operationID);
11252
11325
  return !res.errMsg;
11253
- } catch (error2) {
11254
- console.error("修改群组禁言失败:", error2);
11255
- this.handleError(error2);
11326
+ } catch (error) {
11327
+ console.error("修改群组禁言失败:", error);
11328
+ this.handleError(error);
11256
11329
  return false;
11257
11330
  }
11258
11331
  }
@@ -11271,9 +11344,9 @@ class ImKit extends EventEmitter {
11271
11344
  try {
11272
11345
  const res = await this.IMSDK.changeGroupMemberMute({ groupID, userID, mutedSeconds }, operationID);
11273
11346
  return !res.errMsg;
11274
- } catch (error2) {
11275
- console.error("设置群组成员禁言失败:", error2);
11276
- this.handleError(error2);
11347
+ } catch (error) {
11348
+ console.error("设置群组成员禁言失败:", error);
11349
+ this.handleError(error);
11277
11350
  return false;
11278
11351
  }
11279
11352
  }
@@ -11287,9 +11360,9 @@ class ImKit extends EventEmitter {
11287
11360
  try {
11288
11361
  const res = await this.IMSDK.dismissGroup(groupID, operationID);
11289
11362
  return !res.errMsg;
11290
- } catch (error2) {
11291
- console.error("解散群失败:", error2);
11292
- this.handleError(error2);
11363
+ } catch (error) {
11364
+ console.error("解散群失败:", error);
11365
+ this.handleError(error);
11293
11366
  return false;
11294
11367
  }
11295
11368
  }
@@ -11306,9 +11379,9 @@ class ImKit extends EventEmitter {
11306
11379
  try {
11307
11380
  const res = await this.IMSDK.quitGroup(groupID, operationID);
11308
11381
  return !res.errMsg;
11309
- } catch (error2) {
11310
- console.error("退出群组失败:", error2);
11311
- this.handleError(error2);
11382
+ } catch (error) {
11383
+ console.error("退出群组失败:", error);
11384
+ this.handleError(error);
11312
11385
  return false;
11313
11386
  }
11314
11387
  }
@@ -11326,9 +11399,9 @@ class ImKit extends EventEmitter {
11326
11399
  try {
11327
11400
  const res = await this.IMSDK.transferGroupOwner({ groupID, newOwnerUserID, oldOwnerUserID }, operationID);
11328
11401
  return !res.errMsg;
11329
- } catch (error2) {
11330
- console.error("转让群主失败:", error2);
11331
- this.handleError(error2);
11402
+ } catch (error) {
11403
+ console.error("转让群主失败:", error);
11404
+ this.handleError(error);
11332
11405
  return false;
11333
11406
  }
11334
11407
  }
@@ -11344,9 +11417,9 @@ class ImKit extends EventEmitter {
11344
11417
  try {
11345
11418
  const res = await this.IMSDK.isJoinGroup(groupID, operationID);
11346
11419
  return !res.errMsg;
11347
- } catch (error2) {
11348
- console.error("获取群成员信息失败:", error2);
11349
- this.handleError(error2);
11420
+ } catch (error) {
11421
+ console.error("获取群成员信息失败:", error);
11422
+ this.handleError(error);
11350
11423
  return false;
11351
11424
  }
11352
11425
  }
@@ -11364,9 +11437,9 @@ class ImKit extends EventEmitter {
11364
11437
  operationID
11365
11438
  );
11366
11439
  return !res.errMsg;
11367
- } catch (error2) {
11368
- console.error("申请加入群组失败:", error2);
11369
- this.handleError(error2);
11440
+ } catch (error) {
11441
+ console.error("申请加入群组失败:", error);
11442
+ this.handleError(error);
11370
11443
  return false;
11371
11444
  }
11372
11445
  }
@@ -11384,9 +11457,9 @@ class ImKit extends EventEmitter {
11384
11457
  operationID
11385
11458
  );
11386
11459
  return !res.errMsg;
11387
- } catch (error2) {
11388
- console.error("同意入群申请失败:", error2);
11389
- this.handleError(error2);
11460
+ } catch (error) {
11461
+ console.error("同意入群申请失败:", error);
11462
+ this.handleError(error);
11390
11463
  return false;
11391
11464
  }
11392
11465
  }
@@ -11404,9 +11477,9 @@ class ImKit extends EventEmitter {
11404
11477
  operationID
11405
11478
  );
11406
11479
  return !res.errMsg;
11407
- } catch (error2) {
11408
- console.error("拒绝入群申请失败:", error2);
11409
- this.handleError(error2);
11480
+ } catch (error) {
11481
+ console.error("拒绝入群申请失败:", error);
11482
+ this.handleError(error);
11410
11483
  return false;
11411
11484
  }
11412
11485
  }
@@ -11426,9 +11499,9 @@ class ImKit extends EventEmitter {
11426
11499
  return res.data;
11427
11500
  }
11428
11501
  return [];
11429
- } catch (error2) {
11430
- console.error("获取群申请列表(管理员)失败:", error2);
11431
- this.handleError(error2);
11502
+ } catch (error) {
11503
+ console.error("获取群申请列表(管理员)失败:", error);
11504
+ this.handleError(error);
11432
11505
  return [];
11433
11506
  }
11434
11507
  }
@@ -11448,9 +11521,9 @@ class ImKit extends EventEmitter {
11448
11521
  return res.data;
11449
11522
  }
11450
11523
  return [];
11451
- } catch (error2) {
11452
- console.error("获取群申请列表(申请者)失败:", error2);
11453
- this.handleError(error2);
11524
+ } catch (error) {
11525
+ console.error("获取群申请列表(申请者)失败:", error);
11526
+ this.handleError(error);
11454
11527
  return [];
11455
11528
  }
11456
11529
  }
@@ -11471,9 +11544,9 @@ class ImKit extends EventEmitter {
11471
11544
  return res.data;
11472
11545
  }
11473
11546
  return [];
11474
- } catch (error2) {
11475
- console.error("搜索群组失败:", error2);
11476
- this.handleError(error2);
11547
+ } catch (error) {
11548
+ console.error("搜索群组失败:", error);
11549
+ this.handleError(error);
11477
11550
  return [];
11478
11551
  }
11479
11552
  }
@@ -11493,9 +11566,9 @@ class ImKit extends EventEmitter {
11493
11566
  return res.data;
11494
11567
  }
11495
11568
  return [];
11496
- } catch (error2) {
11497
- console.error("获取已加入群组列表失败:", error2);
11498
- this.handleError(error2);
11569
+ } catch (error) {
11570
+ console.error("获取已加入群组列表失败:", error);
11571
+ this.handleError(error);
11499
11572
  return [];
11500
11573
  }
11501
11574
  }
@@ -11828,7 +11901,7 @@ function requireDayjs_min() {
11828
11901
  var dayjs_minExports = requireDayjs_min();
11829
11902
  const dayjs = /* @__PURE__ */ getDefaultExportFromCjs(dayjs_minExports);
11830
11903
  const useDate = () => {
11831
- const now = ref("");
11904
+ const now2 = ref("");
11832
11905
  const getDate = (date) => {
11833
11906
  return dayjs(date).format("YYYY-MM-DD");
11834
11907
  };
@@ -11842,7 +11915,7 @@ const useDate = () => {
11842
11915
  return dayjs(date).format(format);
11843
11916
  };
11844
11917
  return {
11845
- now,
11918
+ now: now2,
11846
11919
  getDate,
11847
11920
  getTime,
11848
11921
  getDateTime,
@@ -11858,10 +11931,10 @@ function handleDateUtil(date = Date.now(), ifFullDay = false) {
11858
11931
  const year = parseInt(fullDay.slice(0, 4), 10);
11859
11932
  const month = parseInt(fullDay.slice(5, 7), 10);
11860
11933
  const day = parseInt(fullDay.slice(8, 10), 10);
11861
- const now = /* @__PURE__ */ new Date();
11862
- const cYear = now.getFullYear();
11863
- const cMonth = now.getMonth() + 1;
11864
- const cDay = now.getDate();
11934
+ const now2 = /* @__PURE__ */ new Date();
11935
+ const cYear = now2.getFullYear();
11936
+ const cMonth = now2.getMonth() + 1;
11937
+ const cDay = now2.getDate();
11865
11938
  if (year !== cYear) {
11866
11939
  return getFormatTime(date, "YYYY/MM/DD HH:mm");
11867
11940
  } else if (month !== cMonth || cDay !== day) {
@@ -36213,7 +36286,7 @@ const useConversations = () => {
36213
36286
  isSelfMuted = (mutedUser == null ? void 0 : mutedUser.muteEndTime) && (mutedUser == null ? void 0 : mutedUser.muteEndTime) > Date.now();
36214
36287
  }
36215
36288
  if (item.conversationType === IM_CVS_TYPE.Single || item.userID) {
36216
- const userInfo = getUserStatus(item.userID);
36289
+ const userInfo = getUserStatus(item.userID) || {};
36217
36290
  item.onlineStatus = userInfo.status || 0;
36218
36291
  item.platformIDs = userInfo.platformIDs || [];
36219
36292
  }
@@ -36398,6 +36471,7 @@ const ga3 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABJCAYAAACesWDiA
36398
36471
  const ga4 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABJCAYAAACesWDiAAAPJUlEQVR4AeRcC3SU5Zl+328yENRCZiagQJiZAJ4WdMHVbsUFdo9SV8+uWC+F1drdVdcuq1IyiXbV0oXAuraUNZmJ0F3autrVtSXusV09p9XexNpTa48VscUKYjKTICgk/yRAEiAz39vn/TOJuZPLjBD4z/f+3/29PP/3f9d/xtBJuGrD5fnJ4qr5yRnRa51Q9K7GUOX6ZCha0Z0ag9E1jcHYP2mZxmDFBULleSdBVTIfhVBn5pZJTjB6TTIYrQQgOybZgsNi7Rti6P8hfzMT/6sQlXYnZlrHLFu0DLP5fTJY0Ia6v1UeyXDldcoTdXPucgbQ++duPLspGF3WGIo+Q6m2BmJ6TpgiRDQPxiNKNcTyYyb5NiIbSOj+HsS0QYQeF7cM1Wgd1L1YeYjw9yndtt8Jx551wpU3y+yq8cjLics6QHi64Ua8HuPzvXWWqZqJrs8Y9ysA8DVLsuRI2k70JSKz/PHSq3yJ0i/445H7/XWRDT0IaYG6yG0Bt0xkVir/mF/rEvNXheQV8PWSyFISfqqp3e5zgrGH3p+1cUq2UcoaQEfCm89LhmKbxNI7AGQdXhc/lN3OzBGTtuf6E5GFAOCBwkTpz2fsLWujYV6Td913WOv64yVfDiRK/1x5onWVgs12VxbLA+NS3rgTqnzw8OyqyUjPihs1QO+geTcEo6uOS/suPNm78YQZ/jMktBigXOyLl8Qm7S1zsqJtNybKE60rqjLQUhcQ0wtoVbCHVx9vt4nGYKxEdetWZURBMBxRPbeSUxydF2hPv2qYYkiYSMQ/FDHz8IRvRGv5JX1EV2E88ipe06vJmEsh8kUANYFZov52u+1QcfTjSBuxGzFATji6giy9RsTziShOxl7rT5T8TaBu1Vt0ki5f7aodaFFXkNhrAVIctCBl+XV05HeOVKVhAyRFFRMw3P4vXqH/glAvRpXHj7ZPuMBfW/Yc4qeE89eVPdcGnYjkCdBZJPwN1Vnmlo8broLDAmg/Oj/HY16EkM+BjhDzzYF45LZp+1a0In5KOdXJnyj9e2P4b6FYM+hzyZaCnx0pjp6L8JDdkAH6AIzHt9uX0GwvxaixH0PupzCifG/Ikk5SwYLakmroepnqDBUWHbf0otqC8JDckADS+YXX0s/BcQ5GqJ351vNJDLl/QHxMONVVdVbdofActUVtQviE7oQAHfz4ho9hfvECOM0FvYURa9HZ9V/ch/CYcqqz6g6ldRCZqzbpbB/xQd2gAMklW7yetvHfAoeLiDiBoXOhL17aRGP0Ut3VBoYtMOGiceO9j1bTMg/CA7pBAWpqaLuPmLSTa6R0eqkKoAFZjY0MtcFj5CoiTqptS4KLvkKDXAMCdCj4yEJ0bP/GRO1s6Xb/3rLfDcJnTGVNrI3sIrK3uLaxlGO75bKBDOgXIO13Upz+jlayIg/56iPPavh0IkwBfoS1XIXaxMJbB+qP+gXIczT/q6g4C/SHQF1pOfzT0vnjpfcT8Q68ajPG5Y9Tm6n31QegA0UVs4nkbhRMoUPTCSGCp68zZG+HdSnY/MVkuBKDEWLdXB+A8jzmm24+y3+jQ3vDDZ/Gt4JE6etYLn1DTUSfu1797tQDoGRx9C+QeTmoxXfWuHvgnxHOf5Z3NcBpxZptaQaDLrt7AIStzNWaw8QV/NbdRzR8JpDaaogfVlutlRL1O8l0BhpClXNI5K+I+Ggq/+hGOsMuT8qje1rH0ThucLHI2N8FkCFe6aaJPK7bm274DLpNfG9lI0azx9Rkw+ZW9ZWM3qp1ui20XMNCdpP6uSaMGAUHimLnNwar5jbNqJo10Dwk13p052+JXIDwJt1SrZgg0wXoyvDiRUCvEB3VrkBd2U6k58zpEY0Tij0owsk8j+xmtjutsXvG5XuPOKHol4TKXZ1ypsAgjHXrVph3o8j0JcGFV8DvODgUSS/TCLPoQZ4Gc0JC1Z5kyv4Ycw53MOhHyNed0KRvnUyQSOxW1cswX+36esPTROeMkOHncM+ZSwb33UtCOpUYUAYT354MFnyhs0Bj+OEFTij2pEvhipv2TdtyVmdeLnz2MB4gHiHpgpbIHJyxYRoznQ9hLf6aSC5OIsCayH2nmb7sRk5wgz4dAwbKsXh0X/kWqHwLifluvrdtf2tRxXRk5cRlMGgB8wv2TfuPQuMx+e70Gv3Pq0jMmVsSXKzHLzgaOrEI6HJhfVGFHjxq4d/orRtNPGrMNn1du6VlO+iuIPK9nksNOmc9tlEBO/SWKzImPaxj4XPy2AUT/eLBPjoxzW4Ivef2EX3yspCAB9TxUNjMM0zyCeVphHMKkBhpVDlDJJw/HktqWSs8Tf3eBMW1W+idnJ248NsdjGS+EZKQGzEcd/0c3fw17obbu0Nhjyf4ur/m/uZqzEXwADsGkF4VjeWsH2d3isBRETbUNCbnGSLuAIjSCcr1ZaiciGE/DXYJW1OqBZaEFkaIeBL1vazkTcjZlCTF9n1XpHDIkFABdVw534z310aehKiHQAM5YaI1/vpVL9eGy/MR/np/BZG+1l+zQg8D+8sedVqeyAcZJgVoQeQChL2fnANEuPyJkq+wMTpyap+E1sQgAjD8Ljrkmb5E5EEUo+J4+VGUuxjhTDnSci3W2us6yyAvJ64bFi5AOREyEFNdg4nIZcKyCbRe2IJkvWX7JNZCtzrh2E0Sfixf62c+Rij0JyImQ+cU1pfl7NVSmb3J9E7IVbwxGF3jhKJpwRqMRP6ThddyP4S87yaluS0ZijUki6vcKUgyVPWnTiiadEIx64AHaE9nXq707eSrALmvlj7ZzsRs+k5xdB4MOsxM68BX5cE7sROSgH7o6WBh60us2u472l6EtAOoqTxmdeRFc7I06oZFk8Gg0tHZsbe/0QL6jNw5xVWL2fLr4HAOaIROVjuhyo38wZdavO2pCwkbevThdU1DKCcguf0yljfNBrLcFmTl2FSEs+bcz3StfQZPfdCj3aEJNPc4MyoWT9x3bwOG3a51mtaFAdcAQD2F0WhWKE3sfiIjQh+AP2fmP57MfCgrMojSbRvBqRCUBScsxqxVRpMSTY8RU52Gu0i4vCuchUCeZRcLNhQHQOJOq40lXUxmgT2RM/NrkxjbFiNm1k9F8LvCmRkNMpVbEup50stUiEHgyn6qjSgpnVl+ERkAJMZdg1kmd8QYEcdelUx6wjIh8fRKHmVU2AgvcJmw6CcsbrDzxkw6t6KsXBksMPF626TS6Y6VK5F+IZoV/mA84McAoxGQFusuXJlof28+eAnP7p020jj4u1ikU+mXzeS9pbqAPIjE6c2z9Nh5pGw/rCdkO/dyPkwcI6EDHRhMh7oHFRvDGOcR+QmIUmmzVP0s0OEs8BgWCyY6NqwKAxTOS3muymT9hIENOmkiLO9fdBOt/LXrj/JmxLifzoySTZ/qecSvaKJQpi/SSAcdSqePZ0cm22XK0hp5Xn0XIMttTzOeADMvaSga/X5vQV3Jz9LW/pkQuSOkCholNVjiGybFI+62cIqOR9nkhZXIQ6FUq3f65Pr7Rv3dpNrOYhaproaPuSOlC5BuTgmzLgIZrQkb5FpkdDS5vuy1QCIyB4tMzgJNLkyUfL9Toynxf3nfV7syoYRN9ropB7PzHYHxeO4UHX2ZtiomKs8FSAMYIf5HfQAVUf/MJPkH125LXafLXQAVJpp/hBnqm3jVpiZDVTe4Bc+gG2zWD6mKmHm3r26a29ep+V0AZWaoWzRRyK5V/0yiLptZ/p1pebrT9i6ANMHnNY8SyR6E5znh6Ar4Z4RrDMdug6FBZnrnjdqmpxDucj0A4j2rjlmi+zSXhdYfmLv5HA2fzqQ2soj7tauILb+cylPd7e0BkGYEEs0/IOaXMURPyWtt36xppzN5Wo5Xwj7s/8hLvuJD1Qj3cH0A0r4obVJ3MNFxEvq8E4plZfLYQ2r2IyPi2BCuvI6x68CwNZWWO3hbz9ajTPsApImTa+7ZLSzlCCNfnhjOz4dQZ0y4xtlVRdgdQJ9LhgzfO2Vvmfa9fXQHAH3S3ARfvHkDEet02++18sLOucP/tR6dopfaYtqtToyxqObnC/z5+uvJfrUdECCmcutJpzGr5loinn9eS8FTdJpcU1sKHheii4Vkd157+9/xb1e0D2TagABpBf3pNRu+HuEWvKc3OqHomO+0Mzbc7NqUls/qPjfCA7pBAdJaenjnMeYKhFtAdyVD0Ufgj0mX0f0uKN/igU1D+QXTCQECM5pUu+o3VvgzaJatoJX6fxyS40/hVG62SC7Z4oXO/6e6g1rVFrVpKPyHBJAyKsQWBpF8GuFWvG7XO962l5yZ0SDip7Q7GKqc6jS0/Qo63whFW9WGDlsQG4IbMkDKK5AofYUM6X5zDQR+ktL064ZwxWc071QkB3M4D/EOV1eiGsyUP+XaMAxlhwWQ8vXXRt4cT7IIs2099p2K3cMfOMHY1n3TynP69anKHiodmr4pgP7m22gtuumlf3TyvDdv/GWBEXwDPmyAVMmzE6X7G/NYj3buwTvdhq3b5RO8BQmcTXV9vqvlPmp6DX1NMhgrSeeldkKvf0TLsSyyypeYds3H3r1Tz/WHrdKIAFIp52Nhi+ZagbnEJYi/CoUKmembTij6VkMw+nmkfWROgXHCVXfObGjbISxR6KJHx9twADjfV1f6SPfti+EqNWKAOgXpj/b9icgCMVZ/Hf0e0ucYpiecYLTeCcUeTBZvCiEtJ055N4aj62Y1tO0msfqjuDkA520RWr4j0XSl6jZawaMGqFOBQG1Ztc9rZhHTP0PJXfCL0AesJpva44Qrf4HXb00yXHlRZ/mR+srDCcceUJ7Km4XWQF4YtEuYbnoz0fQngbrI05f32rYYqbysAaQK6H6SPx7ZEkhEPoG5xqeZ6Gko3k7Ci/H6rRPh7Un9MCoU/WkSE04nFL3rYHHF0mTxw/ObgpUze1LsEs3TMo3ByqgTqtyWRF3lQSIPKU8Bc1cG09UA5sJAPLL18qECowoPgbIKUHd5OtfwJSLLyTNhKjHfDFseJaZ60Q+jiJYgvhLlN3useVas5w3L/G5Pktc0T8swcwkR/6XWdXmwfIfAk/ImFKoMAPNCtoGhzJUzgDL8yV+zotkfL/keWtUd/ngkyCzFAOezePprmegxGP1TGKt/WhBHnW7E2zVPyyB9tWV7ndZVHoF46a3KU3kjL6fujwAAAP//uOpimgAAAAZJREFUAwBJYxdivNCNQgAAAABJRU5ErkJggg==";
36399
36472
  const ga5 = "data:image/png;base64,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";
36400
36473
  const ga6 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABJCAYAAACesWDiAAAPbklEQVR4AeRcDXhU5ZU+595JIASVRQKZmSis0G1FF1x1K66yu2q79XGlVbtGIRMUtBvJDPjXPtXShei6utZnESEzIVWaQmaCxq2t+jyttla07lOXPq5Kd/0BgQ1KZgKJRIQA8/edvueSYBISSCYz/N7nnPv9n++c937fd7+fO2PRMbgm1NUN9z69YqpnTeibxeFgpScSfNBdH1zSnYvD1YvckdA/O3kaqs+jtVWuY6AqHRWAzmmsPcMbrrnWHQ49DjDWx/M6dptU+l1Jy/NMFBShfyGmu6kbM/EDJFLr5DH8f+7mMfvc4eD/ODIaQtepzKMBWM4AGrd6daE3EroRRj23L5FsM2ReJJK7AMYUAhLgLUT0axJ+SpgfZZb7urPGCdFPSfMwIy/DSxc6Moz8fF8iFfNEgi946oMzJ/1y2TBNzAVnHaDiNTUTPOgelr3nYyPSCKWvJ1bj+Pfw/7sx5ip7R/z0mK9yYszn/0asvPI7LWWV90XLAo92Z41r8fnnOHnKKicm48NHWygLgB4RkjeJKQ9gzxCmho52V9Qdrn543Oqasagjq5Q1gIoag8WeSKia0+mP5ED3GE3M75DQXXZefFzMV3lZzOe/f/vs+a9uu+eefYO1ou2223Y3o2zMF/hBiy/wNyoTYKFbah0ymojvtyzT5A4HHypuXFZEWbqGDNCkZcuGeSLVC1wJ2iAifgIqRPQcWzQ9VlZ5Yazc/8S20nt2Ii6rpDIB1lKtw9gyDWC9TExqz0JO2FvdkeCdqhsN8VKBGYsoaQhN2TvaWifCT0DI6VDwl0L2FLSUb0dn+f8LcUeFts8MrANYV6dN+hJUuBZcgJa7dO9o+zVPfejLCGdMGQPkbghWGCNvoTtNBTBNbOibsTL/P7b47ng/Y22GWHBH+YL1eDhXqi7E3CRE04TlbW+kel6mogcNUEnjkgK8aiNkaAUUyGO8aXiP67zobD/eUpmqkd1yqgvvsc8j4noiGmGEQ6rz5MbGfIQHRYMCqPgny4rS8WFowjILtexhtmZG8aaJVlTsRfi4ItUp5qucLZbcxEy7MEbNak+2/nZsw5PjBqPogAEa27B0HOfbrxPTJWg1MbSgr0bL5j09mMqORd6WWYFGSdOljs5Cl9smsVZtGaguAwJI5xe2cb0KoefiSbxn2+bi2Gz/BwifEKS6qs5Q9j3wubbJf1Vtgv+IdESAxjy/8jTML14m4skA5/1hyeTln8ycH6UT7FKdhyUTlxMxXiIyWW0at/qxQjrCdXiAamvz8nfvfxIyLgBvHVZYeFnTnLs/g/+EJNV9WGHBZVB+K/gCtkaspMYbbfj7pcMC5B6Z/j7eVDeh9KdYS81oun7OZ4TAiUxqAwt/Aza0Y1y6yZP8+x/C3y/1C5AnXHMZVtP/CiFJCJy73Tf/f/uVcoIlRMsrNwhxmdomQlXehhWX9mdCnwCNWbnyNGJZ5RQSehgCX3D8J9GtxVf5Kyyml6hJxqSf6W886hOg/GHxR7CumojCH0TL/VVwT0pqKQ/cx8TrYdxZbBU8AvcQOgSgovrgJCFddFLKYtIJ4SGFTqYIETMX9qQA1HxvJKgvIwS/oEMAcjH92Elm+Ulzmf9dx38S32LlgbcxfQmpiWlDD6rbnXsA5I5U/y0SrwB3pPL4XrinBKXyeSFW/3uZaUYnBgft7gEQCTIiCRmXtJb698B7SpDaiv2r/3CMFb7TcTtvBwFyrw5iGUH/QMT7E/uHP0an2MUFgj0tScDsGzqxgJfoIEBAMODEkPxUtzcP+E+de/MNgU+JuI5wiYtupc7rAECNjbYQlWoctgeq1c01T6h7fFRJ5IkvFYeXTT7r6dqJ/c1Dcq1Hd/m2EQcgNlxGwETTHICKU21YxNEYRGzA9oCueOHNDU3CEY1urMfz8tvT4trIZL+XSqU2WdaIPZ6G0PdIqhyd6Bhc22YH1mE7ZyPeal5PfMeVqsIBZQzdqAG0oufVzRnjqXTstH8N+QvBh5AY+VFxpOhJqjp2IDHRM6qYWHS1ug5AuGFwJrLSlNNtU0+y7buoVKcScPomJprr/otx3+lK9YZD09yRYFgZpyc3e2prR3Sl5cRNkT5ANCJnQUvWWWuWezBz/hIq64je4s/FSQREg9B6ROQH8B2ZjHS+MKAnST0JlSmL8BopTMVKGmu8RxaSWY5ODDpQ+jw8jDFWMsnO9JqZ1yEyZ1ScaPkyhJ8OHgDJ+SVPLcFhoAPQH3oVOD2VMK91DaK90rIUZGcFYUakL7HYsqaqVPR/XbSpNyfskrxBHQunCgsOgMnc2lshJppUHG9zxojeaVkJizgPhZmmWNjW+IoKFeacAkScwjxDaxoQS9y22p2cQh7H7XVjNjos9IrNVpA/VElMMtUi4vGkl6EmyuG1DRtuLLJ5gFW83V5asUu7EVqL8wLpXQ4PNOvH2V11iNAG9aOOYgBEBwDKY92n1ficsbBVRcyYTRy2CiHhuzVHcaL1LmQ+Q/292MTzXDmbkmCbp6WzvvEWnuooDQzfPzznm/ExX2UY27gPa339sADARbHyyjcm1FUNR+v5UZ/5mBc7LazPxKFH5o8s2K5SFBtLiByAmubMyTlAhCvm8/8w7bL1zaljEqonh5l5syQT58TKKh9CNmqaU7Uf+S6Ev3u+DjTA67ryIC0n1NR5OAHFRlk5qeEwQifU1Y3KS5lL0dGqwQ92MRkJW678Wz2RmpsnrK0briJ23HzHegA6Bmx18shoWSBnXUvr7M1HDSBPOLQIa7B0PG9vuyGpEabFfbKYNfHmvfo9Ypt+6KkKe9bU/JW7vrrdHQkZleGJhDZ1pWl6LhnjETlda1Td405XoyxfJQ2hKTBqN0beByB6MA/kTJNKv4uyD0VnznvHyL4SErNDZWBGPlHTAHpOlkZdWGAM/EzHoF2olAryT+vrbaFJGbO7ftn0tBHs+dLIjIUQLfREgo9tn/29Drbyzmds6HXJAujX5gIk9G+nsWAM2oUWxE4LMpJwd1WcDffPGmvPILafgywbPCTCvORed31oenRWRRsmtgfXaSrUAWl1tV/92WKx8zo/kZHtaPKmc/4jB+ZDWapleCKl27a6x5QNiYy312IVFP2oFZta/LH6u1gsruryZ8N1uWwHCyZuAkBd02rWxSRl43JaD7YtMpbVR0FhvtKzqvZs7BUZYel90jvGU1/99T6KZRSVNmln+UUWOQA5azA8IWfRmpHEXoWGp9K6ATfkrtVDrAibPDNN47A1+r663dnY1gXdw0Pxo7kewCLNH1rJzpUrGdIvRIci92BZNqbfjwEOZsrAwybtLFzFtmK9i1tpKewdl2kYczMHiyTJG1arr3Iz5rKtxOQtwbFzpkK7l8PDHt09fCL5FQO8vbyKiWJjEfoW3gy/USPSFs1Qd8jMsnvIMgYpAGNUfJBF+sxuWPTbIQIuvwGLRXpZ1lp1gNo1jjvEG4SuGqKIPosbm97UBCPkjEXq7+TPk3Y6K3Wi9ev4ScTmJcIFW4gKdn/+LPqdPoGrSlYNfb+32Rf4LRnz15DvbDzBHSq1EckN+kW9CkonZCmxTFDmtGt8Kp+8bVn4brJk1RIvMekRGBXk7XHelA5AWyru24UEXQSysU2ZKjFUjs2e/xYWmOeCOQtcFPMFft6lU+scf0usLLBVOXpLxcd6tt6VNhQ3bQ/TL/JtwdHPllJgAmEOQHDxMNKr1QXfBT5FSW5Rwy2LqtVVPghQ8+adv0I3+yPQc+MM6gZNPJXYE66eS8Ql6Ekbo64iZ6wjXAcB0hmqYapFHPLQYnVPJUbDcGwWQ/9GpaXpLtu/AAgxI0enVzLRJhGa4q4PViDqlCBP/fI5RHw2ZtAftWxubaBuVw+ANl2zIC4m/X0nnenBosbgSMd/Et8cG9la4pgo6Sqqqko5/s5bD4A0LrZl5y/gvgEe64pTEO5JTa6kPI7uNQrjyutR76f6G9se9h4CEBA0WNfczsQJFPIVR6qzMnnsUWv2AxlJ9NSHriPDc3FAmEgZup2u6Nl6VOihACG2+ZbARqCqeywW3mz1g/2NFUQc9+T92ZMl2B9YiUZgkWV9t7Xcv6kvpfsESDPGynY8ChfTbR5tm/jLkxurBv1rPZQ/LkltMfsSmBizLqpfiu62V/SnaL8AEVcZe39cZ9X/T8RT25Nje4zudAJf7Yki/cOCC9F6NrLlKqeKimR/5vQPEEpsu/2enZbLvh7eDhL5tidcc8IP2p5wUG2YqTYZMf/k7HMj0B8dFiAt1IzDO2FLv9frEDL6RyTLNf5EZJyOLMfYWgndO9SmgfyC6YgAQRi1lM37g0XyLRLaK0IBnFU953kxx5/CacVZ4oveqs1zR0L/qbqrDWqL2jQQ8QMCSAXpFoZl21/TChC+Xj5Pve5pxCY6Asczja+vdUc/SP5ehwjVXW1QWwaq84ABUoHNs+5407ZZ95u3oLKLKZH+b0+k+luadjxy8erqaxKUWk/MF0O/LWLLV9UG+AdMgwJIpW6bVfnHpLguF6YXhcQtwr/AwPeMJ9dfn2rlA2Tvquoz0aWeYotfIKYiFHvJGOvSTL4BHzRAqIzayitiIz/F0Y7IvUSyDwNfqRSmtmJsOvj5ruY72nxRLcaa+uCdxub30KVuY8I8mXhBLL/o2u2z5+m5/qBVygggrWXTggXxWHlgCVS4COF1YD1F/TFAet8dDvkQPmqkwHgjNfOihdqdaCkR4ehYXhNDU6O+yuXdty+QNijKGKCuWmKz/R9gS3WaiOivo5sRfy6R1AOoT8APuX/21HjE5YRUtidc/UB0ZHoj5jQhVKJ1f4glRGlsU9vXVTfEDYmGDFBX7S3lgcbC0emJGLzvQJx+BFkCdyHtj28CUL/zhEOLvH385BF5BkUqAy30fvDvVLYQL0J3mgAhG5joZgDzly1l85/ForvHtgXSM6KsAaS1635SrNxfixb1Fcw1voYB8lkAptP46ULyAI5r3gFYbcXh4CueSHA53ErP6uAMb/2KqWdHQud0ZwyyF2lacUOw0l0fXIpt4Ne0rMpAC30YPB3AQDw9S8ZcHfO2nh/1+Z8ZMDCq8AA4qwB1r68ZRz+xMn/p/nyXG2eTM2HJSqR/Aj4TT/oqEQrADeJk7gXD6XdxBL65O8P4tzSNDQUB9J0o/3daFvwJk6xSmfvz88a0+PylOEF5ma44dKsCeYdMOQOoSzP9GjVaFngaLet2tKyzJZn4c8IaiIkXw8g65HsFrH9aoN9pf8H6/2dErzh5WBbCvU7LqoyoL3CrylTZKJtT+hMAAAD///Be3vIAAAAGSURBVAMANR1kocUpbgMAAAAASUVORK5CYII=";
36474
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
36401
36475
  const selfOrOther = (userId, userInfo) => userId === userInfo.userID ? "你" : "";
36402
36476
  const buildAtTextMsg = (obj, userInfo) => {
36403
36477
  const { atUserList, atUsersInfo, sendID, senderNickname } = obj;
@@ -36439,7 +36513,12 @@ const buildMemberMuted = (obj, userInfo, canceled) => {
36439
36513
  const MESSAGE_BUILDERS = {
36440
36514
  [106]: (obj, userInfo) => buildAtTextMsg(obj, userInfo),
36441
36515
  [1501]: (obj, userInfo) => `${selfOrOther((obj.opUser || {}).userID, userInfo) || (obj.opUser || {}).nickname} 创建了群聊`,
36442
- [1701]: (obj) => obj.isPrivate ? "已关闭阅后即焚" : "已开启阅后即焚",
36516
+ // 1701 阅后即焚开关通知:detail 形如 { isPrivate: true },isPrivate 表示"变更后的私密状态"
36517
+ // 文案需要带上操作人:消息 sendID 即调用 setConversation 的用户;单聊里用会话对方昵称兜底
36518
+ [1701]: (obj, userInfo, msg, senderName) => {
36519
+ const operator = (msg == null ? void 0 : msg.sendID) === (userInfo == null ? void 0 : userInfo.userID) ? "你" : senderName || (msg == null ? void 0 : msg.senderNickname) || (msg == null ? void 0 : msg.sendID) || "对方";
36520
+ return `${operator} ${obj.isPrivate ? "开启了阅后即焚" : "关闭了阅后即焚"}`;
36521
+ },
36443
36522
  [1509]: (obj, userInfo) => buildMemberInvited(obj, userInfo),
36444
36523
  [1510]: (obj, userInfo) => buildEntrantMsg(obj, userInfo),
36445
36524
  [1508]: (obj, userInfo) => buildMemberKicked(obj, userInfo),
@@ -36454,17 +36533,24 @@ const MESSAGE_BUILDERS = {
36454
36533
  [1513]: (obj, userInfo) => buildMemberMuted(obj, userInfo, true),
36455
36534
  [1519]: (obj, userInfo) => `${selfOrOther((obj.opUser || {}).userID, userInfo) || (obj.opUser || {}).nickname} ${(obj.group || {}).notification !== "&d&" ? "修改" : "删除"}了群公告`
36456
36535
  };
36457
- const getJsonDetail = (jsonObj, type) => {
36536
+ const getJsonDetail = (jsonObj, type, msg, senderName = "") => {
36458
36537
  const obj = jsonObj.indexOf("{") > -1 ? JSON.parse(jsonObj) : {};
36459
36538
  const chatMessage = useChatStore();
36460
36539
  const userInfo = chatMessage.getUserInfo;
36461
36540
  const builder = MESSAGE_BUILDERS[type];
36462
- return builder ? builder(obj, userInfo) : "有通知消息";
36541
+ return builder ? builder(obj, userInfo, msg, senderName) : "有通知消息";
36542
+ };
36543
+ const HTML_TAG_HINT_REG = /<\/?(?:p|div|span|br|img|strong|b|em|i|u|s|a|ul|ol|li|blockquote|pre|code|h[1-6]|table|thead|tbody|tr|td|th|section|font|video|audio)\b[^>]*>/i;
36544
+ const formatMsgPreview = (content) => {
36545
+ if (typeof content !== "string" || !content) return content || "";
36546
+ if (!HTML_TAG_HINT_REG.test(content)) return content;
36547
+ const text = content.replace(/<video\b[^>]*>[\s\S]*?<\/video\s*>/gi, " [视频] ").replace(/<audio\b[^>]*>[\s\S]*?<\/audio\s*>/gi, " [音频] ").replace(/<video\b[^>]*\/?>/gi, " [视频] ").replace(/<audio\b[^>]*\/?>/gi, " [音频] ").replace(/<img\b[^>]*\/?>/gi, " [图片] ").replace(/<br\s*\/?>/gi, " ").replace(/<[^>]+>/g, "").replace(/&nbsp;/gi, " ");
36548
+ return text.replace(/\s+/g, " ").trim();
36463
36549
  };
36464
36550
  const MSG_TYPE_LABELS = {
36465
36551
  [101]: (msg) => {
36466
36552
  var _a;
36467
- return (_a = msg.textElem) == null ? void 0 : _a.content;
36553
+ return formatMsgPreview((_a = msg.textElem) == null ? void 0 : _a.content);
36468
36554
  },
36469
36555
  [102]: () => "[图片]",
36470
36556
  [105]: (msg) => {
@@ -36480,7 +36566,7 @@ const MSG_TYPE_LABELS = {
36480
36566
  [106]: () => "[@消息]",
36481
36567
  [114]: (msg) => {
36482
36568
  var _a;
36483
- return (_a = msg.quoteElem) == null ? void 0 : _a.text;
36569
+ return formatMsgPreview((_a = msg.quoteElem) == null ? void 0 : _a.text);
36484
36570
  },
36485
36571
  [110]: (msg) => {
36486
36572
  var _a;
@@ -36672,6 +36758,37 @@ function debounce(func, wait, options = {}) {
36672
36758
  };
36673
36759
  return debounced;
36674
36760
  }
36761
+ const getMediaDuration = (file) => {
36762
+ return new Promise((resolve, reject) => {
36763
+ const url = URL.createObjectURL(file);
36764
+ if (file.type.startsWith("audio/")) {
36765
+ const audio = new Audio();
36766
+ audio.src = url;
36767
+ audio.addEventListener("loadedmetadata", function() {
36768
+ resolve(audio.duration);
36769
+ URL.revokeObjectURL(url);
36770
+ });
36771
+ audio.addEventListener("error", function(e2) {
36772
+ reject(0);
36773
+ URL.revokeObjectURL(url);
36774
+ });
36775
+ } else if (file.type.startsWith("video/")) {
36776
+ const video = document.createElement("video");
36777
+ video.src = url;
36778
+ video.addEventListener("loadedmetadata", function() {
36779
+ resolve(video.duration);
36780
+ URL.revokeObjectURL(url);
36781
+ });
36782
+ video.addEventListener("error", function(e2) {
36783
+ reject(0);
36784
+ URL.revokeObjectURL(url);
36785
+ });
36786
+ } else {
36787
+ reject(0);
36788
+ URL.revokeObjectURL(url);
36789
+ }
36790
+ });
36791
+ };
36675
36792
  const handleLinks = (text = "") => {
36676
36793
  if (!text) return text;
36677
36794
  const urlRegex = /(https?:\/\/[^\s<>"']+)|(ftp:\/\/[^\s<>"']+)/gi;
@@ -36679,6 +36796,32 @@ const handleLinks = (text = "") => {
36679
36796
  return `<a href="${url}" target="_blank" class="message-link" style="color: var(--chat-theme-color); text-decoration: underline; cursor: pointer;">${url}</a>`;
36680
36797
  });
36681
36798
  };
36799
+ const NOTICE_AGENT_PREFIX = "agent_";
36800
+ const isNoticeAgentConversation = (cvs) => {
36801
+ if (!cvs || cvs.conversationType !== IM_CVS_TYPE.Single) return false;
36802
+ return String(cvs.userID || "").startsWith(NOTICE_AGENT_PREFIX);
36803
+ };
36804
+ const createCvsId = (msg) => {
36805
+ if (msg.sessionType === IM_CVS_TYPE.Single) {
36806
+ const t3 = [msg.sendID, msg.recvID].sort();
36807
+ return "si_" + t3[0] + "_" + t3[1];
36808
+ }
36809
+ return msg.sessionType === IM_CVS_TYPE.Group ? "sg_" + msg.groupID : msg.sessionType === IM_CVS_TYPE.Notification ? "sn_" + msg.sendID + "_" + msg.recvID : "";
36810
+ };
36811
+ const dedupeMessages = (list = [], seen = /* @__PURE__ */ new Set()) => {
36812
+ const result = [];
36813
+ for (const item of list) {
36814
+ const id = item == null ? void 0 : item.clientMsgID;
36815
+ if (!id) {
36816
+ result.push(item);
36817
+ continue;
36818
+ }
36819
+ if (seen.has(id)) continue;
36820
+ seen.add(id);
36821
+ result.push(item);
36822
+ }
36823
+ return result;
36824
+ };
36682
36825
  const downloadFileByBlob = async (url, fileName, uniqueId) => {
36683
36826
  if (!url || !fileName) return;
36684
36827
  const downMsg = ElMessage({ message: "正在下载...", type: "info", duration: 0 });
@@ -36810,11 +36953,29 @@ const useMsgList = () => {
36810
36953
  const newList = handleMessageList(list);
36811
36954
  if (type === "init") {
36812
36955
  startClientMsgID.value = "";
36813
- messageList.value = newList.length === 0 ? messageList.value : newList;
36956
+ messageList.value = dedupeMessages(newList);
36814
36957
  } else if (type === "add") {
36815
- messageList.value = [...messageList.value, ...newList];
36958
+ const merged = [...messageList.value];
36959
+ const indexByID = /* @__PURE__ */ new Map();
36960
+ merged.forEach((item, i3) => {
36961
+ if (item == null ? void 0 : item.clientMsgID) indexByID.set(item.clientMsgID, i3);
36962
+ });
36963
+ dedupeMessages(newList).forEach((item) => {
36964
+ const id = item == null ? void 0 : item.clientMsgID;
36965
+ if (id && indexByID.has(id)) {
36966
+ merged[indexByID.get(id)] = item;
36967
+ } else {
36968
+ if (id) indexByID.set(id, merged.length);
36969
+ merged.push(item);
36970
+ }
36971
+ });
36972
+ messageList.value = merged;
36816
36973
  } else if (type === "loadmore") {
36817
- messageList.value = [...newList, ...messageList.value];
36974
+ const seen = /* @__PURE__ */ new Set();
36975
+ messageList.value.forEach((item) => {
36976
+ if (item == null ? void 0 : item.clientMsgID) seen.add(item.clientMsgID);
36977
+ });
36978
+ messageList.value = [...dedupeMessages(newList, seen), ...messageList.value];
36818
36979
  } else if (type === "update") {
36819
36980
  if (messageList.value.length === 0) {
36820
36981
  messageList.value = newList;
@@ -36887,13 +37048,14 @@ const useMsgList = () => {
36887
37048
  return isGroup ? `${obj.senderNickname}: ${label}` : label;
36888
37049
  };
36889
37050
  const MESSAGE_HANDLERS = {
37051
+ // 富文本消息的 content 是 HTML,会话列表预览需要转成纯文案(图片显示为 [图片])
36890
37052
  textElem: (obj) => {
36891
37053
  var _a;
36892
- return formatSenderMsg(obj, (_a = obj.textElem) == null ? void 0 : _a.content);
37054
+ return formatSenderMsg(obj, formatMsgPreview((_a = obj.textElem) == null ? void 0 : _a.content));
36893
37055
  },
36894
37056
  quoteElem: (obj) => {
36895
37057
  var _a;
36896
- return formatSenderMsg(obj, (_a = obj.quoteElem) == null ? void 0 : _a.text);
37058
+ return formatSenderMsg(obj, formatMsgPreview((_a = obj.quoteElem) == null ? void 0 : _a.text));
36897
37059
  },
36898
37060
  pictureElem: (obj) => obj.sessionType === IM_CVS_TYPE.Group ? `${obj.senderNickname}: [图片]` : `${obj.senderNickname}发送了图片`,
36899
37061
  fileElem: (obj) => obj.sessionType === IM_CVS_TYPE.Group ? `${obj.senderNickname}: [文件]` : `${obj.senderNickname}发送了文件`,
@@ -36916,7 +37078,7 @@ const useMsgList = () => {
36916
37078
  },
36917
37079
  notificationElem: (obj) => {
36918
37080
  var _a, _b;
36919
- return ((_a = obj.notificationElem) == null ? void 0 : _a.detail) ? getJsonDetail((_b = obj.notificationElem) == null ? void 0 : _b.detail, obj.contentType) : "有通知消息";
37081
+ return ((_a = obj.notificationElem) == null ? void 0 : _a.detail) ? getJsonDetail((_b = obj.notificationElem) == null ? void 0 : _b.detail, obj.contentType, obj) : "有通知消息";
36920
37082
  }
36921
37083
  };
36922
37084
  const MESSAGE_ELEM_KEYS = ["textElem", "quoteElem", "pictureElem", "fileElem", "soundElem", "videoElem", "locationElem", "mergeElem", "atTextElem", "customElem", "notificationElem"];
@@ -36943,9 +37105,2592 @@ const useMsgList = () => {
36943
37105
  updateMessageSenderInfo
36944
37106
  };
36945
37107
  };
37108
+ const BURN_PRESETS = [10, 30, 60, 300, 1800, 3600];
37109
+ const BURN_MIN = 1;
37110
+ const BURN_MAX = 86400;
37111
+ const BURN_DEFAULT = 30;
37112
+ const isBurnNoticeMessage = (msg) => Number(msg == null ? void 0 : msg.contentType) > 200;
37113
+ const parseJsonEx = (ex) => {
37114
+ if (!ex) return {};
37115
+ if (typeof ex === "object") return ex;
37116
+ try {
37117
+ const obj = JSON.parse(ex);
37118
+ return obj && typeof obj === "object" ? obj : {};
37119
+ } catch {
37120
+ return {};
37121
+ }
37122
+ };
37123
+ const getConversationBurnSetting = (conversation, userID) => {
37124
+ const burn = parseJsonEx(conversation == null ? void 0 : conversation.ex).burn || {};
37125
+ const fromUserID = burn.fromUserID ? String(burn.fromUserID) : "";
37126
+ const enabled = burn.enabled === true && (!userID || !fromUserID || fromUserID === String(userID));
37127
+ return {
37128
+ enabled,
37129
+ duration: enabled ? clampBurnDuration(burn.duration) : 0,
37130
+ fromUserID,
37131
+ toUserID: burn.toUserID ? String(burn.toUserID) : ""
37132
+ };
37133
+ };
37134
+ const buildBurnEx = (prevEx, { enabled, duration, fromUserID, toUserID }) => {
37135
+ const obj = parseJsonEx(prevEx);
37136
+ if (enabled) {
37137
+ obj.burn = {
37138
+ enabled: true,
37139
+ duration: clampBurnDuration(duration),
37140
+ fromUserID: fromUserID ? String(fromUserID) : "",
37141
+ toUserID: toUserID ? String(toUserID) : "",
37142
+ updatedAt: Date.now()
37143
+ };
37144
+ } else {
37145
+ delete obj.burn;
37146
+ }
37147
+ return JSON.stringify(obj);
37148
+ };
37149
+ const preserveBurnInEx = (nextEx, prevEx) => {
37150
+ const burn = parseJsonEx(prevEx).burn;
37151
+ if (!burn) return typeof nextEx === "string" ? nextEx : JSON.stringify(parseJsonEx(nextEx));
37152
+ const obj = parseJsonEx(nextEx);
37153
+ obj.burn = burn;
37154
+ return JSON.stringify(obj);
37155
+ };
37156
+ const getMessageBurnMeta = (msg) => {
37157
+ const ex = parseJsonEx(msg == null ? void 0 : msg.ex);
37158
+ const duration = Number(ex.burnDuration) || 0;
37159
+ return {
37160
+ bySender: ex.burnBySender === true && duration > 0,
37161
+ duration,
37162
+ fromUserID: ex.burnFromUserID ? String(ex.burnFromUserID) : "",
37163
+ toUserID: ex.burnToUserID ? String(ex.burnToUserID) : ""
37164
+ };
37165
+ };
37166
+ const getBurnDuration = (msg) => getMessageBurnMeta(msg).duration;
37167
+ const isBurnMessage = (msg) => {
37168
+ if (!msg || isBurnNoticeMessage(msg)) return false;
37169
+ const { bySender, duration } = getMessageBurnMeta(msg);
37170
+ return bySender && duration > 0;
37171
+ };
37172
+ const clampBurnDuration = (value) => {
37173
+ const num = Math.floor(Number(value));
37174
+ if (!Number.isFinite(num) || num < BURN_MIN) return BURN_DEFAULT;
37175
+ return Math.min(num, BURN_MAX);
37176
+ };
37177
+ const formatBurnDuration = (seconds) => {
37178
+ const num = Number(seconds) || 0;
37179
+ if (num >= 3600 && num % 3600 === 0) return `${num / 3600} 小时`;
37180
+ if (num >= 60 && num % 60 === 0) return `${num / 60} 分钟`;
37181
+ return `${num} 秒`;
37182
+ };
37183
+ const formatBurnRemain = (seconds) => {
37184
+ const num = Number(seconds) || 0;
37185
+ if (num >= 3600) return `${Math.ceil(num / 3600)}h`;
37186
+ if (num >= 60) return `${Math.ceil(num / 60)}m`;
37187
+ return `${num}s`;
37188
+ };
37189
+ const isBurned = (msg) => {
37190
+ var _a;
37191
+ const { bySender, duration } = getMessageBurnMeta(msg);
37192
+ if (!bySender || !duration) return false;
37193
+ const readTime = Number((_a = msg == null ? void 0 : msg.attachedInfoElem) == null ? void 0 : _a.hasReadTime) || 0;
37194
+ if (!readTime) return false;
37195
+ return Date.now() >= readTime + duration * 1e3;
37196
+ };
37197
+ const keyOf = (conversationID, clientMsgID) => `${conversationID}::${clientMsgID}`;
37198
+ const timers = /* @__PURE__ */ new Map();
37199
+ const deadlines = /* @__PURE__ */ new Map();
37200
+ const handlers = /* @__PURE__ */ new Set();
37201
+ const now = ref(Date.now());
37202
+ let ticker = null;
37203
+ const stopTicker = () => {
37204
+ if (ticker) {
37205
+ clearInterval(ticker);
37206
+ ticker = null;
37207
+ }
37208
+ };
37209
+ const startTicker = () => {
37210
+ if (ticker) return;
37211
+ ticker = setInterval(() => {
37212
+ now.value = Date.now();
37213
+ if (deadlines.size === 0) stopTicker();
37214
+ }, 1e3);
37215
+ };
37216
+ const runHandlers = (conversationID, clientMsgID) => {
37217
+ handlers.forEach((fn) => {
37218
+ try {
37219
+ fn(conversationID, clientMsgID);
37220
+ } catch (error) {
37221
+ console.error("[IM] 焚毁回调执行失败:", error);
37222
+ }
37223
+ });
37224
+ };
37225
+ const fireBurn = (conversationID, clientMsgID) => {
37226
+ const key = keyOf(conversationID, clientMsgID);
37227
+ timers.delete(key);
37228
+ deadlines.delete(key);
37229
+ runHandlers(conversationID, clientMsgID);
37230
+ };
37231
+ const useBurnAfterReading = () => {
37232
+ const onBurn = (fn) => {
37233
+ if (typeof fn === "function") handlers.add(fn);
37234
+ return () => handlers.delete(fn);
37235
+ };
37236
+ const cancelBurn = (conversationID, clientMsgID) => {
37237
+ if (!conversationID || !clientMsgID) return;
37238
+ const key = keyOf(conversationID, clientMsgID);
37239
+ const timer = timers.get(key);
37240
+ if (timer) clearTimeout(timer);
37241
+ timers.delete(key);
37242
+ deadlines.delete(key);
37243
+ if (deadlines.size === 0) stopTicker();
37244
+ };
37245
+ const cancelConversation = (conversationID) => {
37246
+ if (!conversationID) return;
37247
+ const prefix = `${conversationID}::`;
37248
+ for (const key of [...timers.keys()]) {
37249
+ if (!key.startsWith(prefix)) continue;
37250
+ clearTimeout(timers.get(key));
37251
+ timers.delete(key);
37252
+ deadlines.delete(key);
37253
+ }
37254
+ for (const key of [...deadlines.keys()]) {
37255
+ if (key.startsWith(prefix)) deadlines.delete(key);
37256
+ }
37257
+ if (deadlines.size === 0) stopTicker();
37258
+ };
37259
+ const cancelAll = () => {
37260
+ for (const timer of timers.values()) clearTimeout(timer);
37261
+ timers.clear();
37262
+ deadlines.clear();
37263
+ stopTicker();
37264
+ };
37265
+ const scheduleBurn = (conversationID, msg, startAt = Date.now()) => {
37266
+ if (!conversationID || !(msg == null ? void 0 : msg.clientMsgID) || !isBurnMessage(msg)) return;
37267
+ const duration = getBurnDuration(msg);
37268
+ if (duration <= 0) return;
37269
+ const key = keyOf(conversationID, msg.clientMsgID);
37270
+ if (deadlines.has(key) || timers.has(key)) return;
37271
+ const origin = Number(startAt) || Date.now();
37272
+ const deadline = origin + duration * 1e3;
37273
+ if (deadline <= Date.now()) {
37274
+ setTimeout(() => runHandlers(conversationID, msg.clientMsgID), 0);
37275
+ return;
37276
+ }
37277
+ deadlines.set(key, deadline);
37278
+ timers.set(
37279
+ key,
37280
+ setTimeout(() => fireBurn(conversationID, msg.clientMsgID), deadline - Date.now())
37281
+ );
37282
+ startTicker();
37283
+ };
37284
+ const burnRemain = (msg, conversationID = msg == null ? void 0 : msg.conversationID) => {
37285
+ var _a;
37286
+ void now.value;
37287
+ const duration = getBurnDuration(msg);
37288
+ if (!duration) return 0;
37289
+ const key = keyOf(conversationID, msg == null ? void 0 : msg.clientMsgID);
37290
+ const hasReadTime = Number((_a = msg == null ? void 0 : msg.attachedInfoElem) == null ? void 0 : _a.hasReadTime) || 0;
37291
+ const deadline = deadlines.get(key) || (hasReadTime ? hasReadTime + duration * 1e3 : 0);
37292
+ if (!deadline) return 0;
37293
+ return Math.max(0, Math.ceil((deadline - Date.now()) / 1e3));
37294
+ };
37295
+ return {
37296
+ onBurn,
37297
+ scheduleBurn,
37298
+ cancelBurn,
37299
+ cancelConversation,
37300
+ cancelAll,
37301
+ burnRemain
37302
+ };
37303
+ };
37304
+ function commonjsRequire(path) {
37305
+ throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
37306
+ }
37307
+ var localforage$1 = { exports: {} };
37308
+ /*!
37309
+ localForage -- Offline Storage, Improved
37310
+ Version 1.10.0
37311
+ https://localforage.github.io/localForage
37312
+ (c) 2013-2017 Mozilla, Apache License 2.0
37313
+ */
37314
+ var hasRequiredLocalforage;
37315
+ function requireLocalforage() {
37316
+ if (hasRequiredLocalforage) return localforage$1.exports;
37317
+ hasRequiredLocalforage = 1;
37318
+ (function(module, exports) {
37319
+ (function(f2) {
37320
+ {
37321
+ module.exports = f2();
37322
+ }
37323
+ })(function() {
37324
+ return (function e2(t2, n2, r) {
37325
+ function s2(o2, u2) {
37326
+ if (!n2[o2]) {
37327
+ if (!t2[o2]) {
37328
+ var a2 = typeof commonjsRequire == "function" && commonjsRequire;
37329
+ if (!u2 && a2) return a2(o2, true);
37330
+ if (i3) return i3(o2, true);
37331
+ var f2 = new Error("Cannot find module '" + o2 + "'");
37332
+ throw f2.code = "MODULE_NOT_FOUND", f2;
37333
+ }
37334
+ var l3 = n2[o2] = { exports: {} };
37335
+ t2[o2][0].call(l3.exports, function(e22) {
37336
+ var n22 = t2[o2][1][e22];
37337
+ return s2(n22 ? n22 : e22);
37338
+ }, l3, l3.exports, e2, t2, n2, r);
37339
+ }
37340
+ return n2[o2].exports;
37341
+ }
37342
+ var i3 = typeof commonjsRequire == "function" && commonjsRequire;
37343
+ for (var o = 0; o < r.length; o++) s2(r[o]);
37344
+ return s2;
37345
+ })({ 1: [function(_dereq_, module3, exports3) {
37346
+ (function(global2) {
37347
+ var Mutation = global2.MutationObserver || global2.WebKitMutationObserver;
37348
+ var scheduleDrain;
37349
+ {
37350
+ if (Mutation) {
37351
+ var called = 0;
37352
+ var observer = new Mutation(nextTick);
37353
+ var element = global2.document.createTextNode("");
37354
+ observer.observe(element, {
37355
+ characterData: true
37356
+ });
37357
+ scheduleDrain = function() {
37358
+ element.data = called = ++called % 2;
37359
+ };
37360
+ } else if (!global2.setImmediate && typeof global2.MessageChannel !== "undefined") {
37361
+ var channel = new global2.MessageChannel();
37362
+ channel.port1.onmessage = nextTick;
37363
+ scheduleDrain = function() {
37364
+ channel.port2.postMessage(0);
37365
+ };
37366
+ } else if ("document" in global2 && "onreadystatechange" in global2.document.createElement("script")) {
37367
+ scheduleDrain = function() {
37368
+ var scriptEl = global2.document.createElement("script");
37369
+ scriptEl.onreadystatechange = function() {
37370
+ nextTick();
37371
+ scriptEl.onreadystatechange = null;
37372
+ scriptEl.parentNode.removeChild(scriptEl);
37373
+ scriptEl = null;
37374
+ };
37375
+ global2.document.documentElement.appendChild(scriptEl);
37376
+ };
37377
+ } else {
37378
+ scheduleDrain = function() {
37379
+ setTimeout(nextTick, 0);
37380
+ };
37381
+ }
37382
+ }
37383
+ var draining;
37384
+ var queue = [];
37385
+ function nextTick() {
37386
+ draining = true;
37387
+ var i3, oldQueue;
37388
+ var len = queue.length;
37389
+ while (len) {
37390
+ oldQueue = queue;
37391
+ queue = [];
37392
+ i3 = -1;
37393
+ while (++i3 < len) {
37394
+ oldQueue[i3]();
37395
+ }
37396
+ len = queue.length;
37397
+ }
37398
+ draining = false;
37399
+ }
37400
+ module3.exports = immediate;
37401
+ function immediate(task) {
37402
+ if (queue.push(task) === 1 && !draining) {
37403
+ scheduleDrain();
37404
+ }
37405
+ }
37406
+ }).call(this, typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
37407
+ }, {}], 2: [function(_dereq_, module3, exports3) {
37408
+ var immediate = _dereq_(1);
37409
+ function INTERNAL() {
37410
+ }
37411
+ var handlers2 = {};
37412
+ var REJECTED = ["REJECTED"];
37413
+ var FULFILLED = ["FULFILLED"];
37414
+ var PENDING = ["PENDING"];
37415
+ module3.exports = Promise2;
37416
+ function Promise2(resolver) {
37417
+ if (typeof resolver !== "function") {
37418
+ throw new TypeError("resolver must be a function");
37419
+ }
37420
+ this.state = PENDING;
37421
+ this.queue = [];
37422
+ this.outcome = void 0;
37423
+ if (resolver !== INTERNAL) {
37424
+ safelyResolveThenable(this, resolver);
37425
+ }
37426
+ }
37427
+ Promise2.prototype["catch"] = function(onRejected) {
37428
+ return this.then(null, onRejected);
37429
+ };
37430
+ Promise2.prototype.then = function(onFulfilled, onRejected) {
37431
+ if (typeof onFulfilled !== "function" && this.state === FULFILLED || typeof onRejected !== "function" && this.state === REJECTED) {
37432
+ return this;
37433
+ }
37434
+ var promise = new this.constructor(INTERNAL);
37435
+ if (this.state !== PENDING) {
37436
+ var resolver = this.state === FULFILLED ? onFulfilled : onRejected;
37437
+ unwrap(promise, resolver, this.outcome);
37438
+ } else {
37439
+ this.queue.push(new QueueItem(promise, onFulfilled, onRejected));
37440
+ }
37441
+ return promise;
37442
+ };
37443
+ function QueueItem(promise, onFulfilled, onRejected) {
37444
+ this.promise = promise;
37445
+ if (typeof onFulfilled === "function") {
37446
+ this.onFulfilled = onFulfilled;
37447
+ this.callFulfilled = this.otherCallFulfilled;
37448
+ }
37449
+ if (typeof onRejected === "function") {
37450
+ this.onRejected = onRejected;
37451
+ this.callRejected = this.otherCallRejected;
37452
+ }
37453
+ }
37454
+ QueueItem.prototype.callFulfilled = function(value) {
37455
+ handlers2.resolve(this.promise, value);
37456
+ };
37457
+ QueueItem.prototype.otherCallFulfilled = function(value) {
37458
+ unwrap(this.promise, this.onFulfilled, value);
37459
+ };
37460
+ QueueItem.prototype.callRejected = function(value) {
37461
+ handlers2.reject(this.promise, value);
37462
+ };
37463
+ QueueItem.prototype.otherCallRejected = function(value) {
37464
+ unwrap(this.promise, this.onRejected, value);
37465
+ };
37466
+ function unwrap(promise, func, value) {
37467
+ immediate(function() {
37468
+ var returnValue;
37469
+ try {
37470
+ returnValue = func(value);
37471
+ } catch (e2) {
37472
+ return handlers2.reject(promise, e2);
37473
+ }
37474
+ if (returnValue === promise) {
37475
+ handlers2.reject(promise, new TypeError("Cannot resolve promise with itself"));
37476
+ } else {
37477
+ handlers2.resolve(promise, returnValue);
37478
+ }
37479
+ });
37480
+ }
37481
+ handlers2.resolve = function(self2, value) {
37482
+ var result = tryCatch(getThen, value);
37483
+ if (result.status === "error") {
37484
+ return handlers2.reject(self2, result.value);
37485
+ }
37486
+ var thenable = result.value;
37487
+ if (thenable) {
37488
+ safelyResolveThenable(self2, thenable);
37489
+ } else {
37490
+ self2.state = FULFILLED;
37491
+ self2.outcome = value;
37492
+ var i3 = -1;
37493
+ var len = self2.queue.length;
37494
+ while (++i3 < len) {
37495
+ self2.queue[i3].callFulfilled(value);
37496
+ }
37497
+ }
37498
+ return self2;
37499
+ };
37500
+ handlers2.reject = function(self2, error) {
37501
+ self2.state = REJECTED;
37502
+ self2.outcome = error;
37503
+ var i3 = -1;
37504
+ var len = self2.queue.length;
37505
+ while (++i3 < len) {
37506
+ self2.queue[i3].callRejected(error);
37507
+ }
37508
+ return self2;
37509
+ };
37510
+ function getThen(obj) {
37511
+ var then = obj && obj.then;
37512
+ if (obj && (typeof obj === "object" || typeof obj === "function") && typeof then === "function") {
37513
+ return function appyThen() {
37514
+ then.apply(obj, arguments);
37515
+ };
37516
+ }
37517
+ }
37518
+ function safelyResolveThenable(self2, thenable) {
37519
+ var called = false;
37520
+ function onError(value) {
37521
+ if (called) {
37522
+ return;
37523
+ }
37524
+ called = true;
37525
+ handlers2.reject(self2, value);
37526
+ }
37527
+ function onSuccess(value) {
37528
+ if (called) {
37529
+ return;
37530
+ }
37531
+ called = true;
37532
+ handlers2.resolve(self2, value);
37533
+ }
37534
+ function tryToUnwrap() {
37535
+ thenable(onSuccess, onError);
37536
+ }
37537
+ var result = tryCatch(tryToUnwrap);
37538
+ if (result.status === "error") {
37539
+ onError(result.value);
37540
+ }
37541
+ }
37542
+ function tryCatch(func, value) {
37543
+ var out = {};
37544
+ try {
37545
+ out.value = func(value);
37546
+ out.status = "success";
37547
+ } catch (e2) {
37548
+ out.status = "error";
37549
+ out.value = e2;
37550
+ }
37551
+ return out;
37552
+ }
37553
+ Promise2.resolve = resolve;
37554
+ function resolve(value) {
37555
+ if (value instanceof this) {
37556
+ return value;
37557
+ }
37558
+ return handlers2.resolve(new this(INTERNAL), value);
37559
+ }
37560
+ Promise2.reject = reject;
37561
+ function reject(reason) {
37562
+ var promise = new this(INTERNAL);
37563
+ return handlers2.reject(promise, reason);
37564
+ }
37565
+ Promise2.all = all;
37566
+ function all(iterable) {
37567
+ var self2 = this;
37568
+ if (Object.prototype.toString.call(iterable) !== "[object Array]") {
37569
+ return this.reject(new TypeError("must be an array"));
37570
+ }
37571
+ var len = iterable.length;
37572
+ var called = false;
37573
+ if (!len) {
37574
+ return this.resolve([]);
37575
+ }
37576
+ var values = new Array(len);
37577
+ var resolved = 0;
37578
+ var i3 = -1;
37579
+ var promise = new this(INTERNAL);
37580
+ while (++i3 < len) {
37581
+ allResolver(iterable[i3], i3);
37582
+ }
37583
+ return promise;
37584
+ function allResolver(value, i22) {
37585
+ self2.resolve(value).then(resolveFromAll, function(error) {
37586
+ if (!called) {
37587
+ called = true;
37588
+ handlers2.reject(promise, error);
37589
+ }
37590
+ });
37591
+ function resolveFromAll(outValue) {
37592
+ values[i22] = outValue;
37593
+ if (++resolved === len && !called) {
37594
+ called = true;
37595
+ handlers2.resolve(promise, values);
37596
+ }
37597
+ }
37598
+ }
37599
+ }
37600
+ Promise2.race = race;
37601
+ function race(iterable) {
37602
+ var self2 = this;
37603
+ if (Object.prototype.toString.call(iterable) !== "[object Array]") {
37604
+ return this.reject(new TypeError("must be an array"));
37605
+ }
37606
+ var len = iterable.length;
37607
+ var called = false;
37608
+ if (!len) {
37609
+ return this.resolve([]);
37610
+ }
37611
+ var i3 = -1;
37612
+ var promise = new this(INTERNAL);
37613
+ while (++i3 < len) {
37614
+ resolver(iterable[i3]);
37615
+ }
37616
+ return promise;
37617
+ function resolver(value) {
37618
+ self2.resolve(value).then(function(response) {
37619
+ if (!called) {
37620
+ called = true;
37621
+ handlers2.resolve(promise, response);
37622
+ }
37623
+ }, function(error) {
37624
+ if (!called) {
37625
+ called = true;
37626
+ handlers2.reject(promise, error);
37627
+ }
37628
+ });
37629
+ }
37630
+ }
37631
+ }, { "1": 1 }], 3: [function(_dereq_, module3, exports3) {
37632
+ (function(global2) {
37633
+ if (typeof global2.Promise !== "function") {
37634
+ global2.Promise = _dereq_(2);
37635
+ }
37636
+ }).call(this, typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
37637
+ }, { "2": 2 }], 4: [function(_dereq_, module3, exports3) {
37638
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) {
37639
+ return typeof obj;
37640
+ } : function(obj) {
37641
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
37642
+ };
37643
+ function _classCallCheck(instance, Constructor) {
37644
+ if (!(instance instanceof Constructor)) {
37645
+ throw new TypeError("Cannot call a class as a function");
37646
+ }
37647
+ }
37648
+ function getIDB() {
37649
+ try {
37650
+ if (typeof indexedDB !== "undefined") {
37651
+ return indexedDB;
37652
+ }
37653
+ if (typeof webkitIndexedDB !== "undefined") {
37654
+ return webkitIndexedDB;
37655
+ }
37656
+ if (typeof mozIndexedDB !== "undefined") {
37657
+ return mozIndexedDB;
37658
+ }
37659
+ if (typeof OIndexedDB !== "undefined") {
37660
+ return OIndexedDB;
37661
+ }
37662
+ if (typeof msIndexedDB !== "undefined") {
37663
+ return msIndexedDB;
37664
+ }
37665
+ } catch (e2) {
37666
+ return;
37667
+ }
37668
+ }
37669
+ var idb = getIDB();
37670
+ function isIndexedDBValid() {
37671
+ try {
37672
+ if (!idb || !idb.open) {
37673
+ return false;
37674
+ }
37675
+ var isSafari = typeof openDatabase !== "undefined" && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);
37676
+ var hasFetch = typeof fetch === "function" && fetch.toString().indexOf("[native code") !== -1;
37677
+ return (!isSafari || hasFetch) && typeof indexedDB !== "undefined" && // some outdated implementations of IDB that appear on Samsung
37678
+ // and HTC Android devices <4.4 are missing IDBKeyRange
37679
+ // See: https://github.com/mozilla/localForage/issues/128
37680
+ // See: https://github.com/mozilla/localForage/issues/272
37681
+ typeof IDBKeyRange !== "undefined";
37682
+ } catch (e2) {
37683
+ return false;
37684
+ }
37685
+ }
37686
+ function createBlob(parts, properties) {
37687
+ parts = parts || [];
37688
+ properties = properties || {};
37689
+ try {
37690
+ return new Blob(parts, properties);
37691
+ } catch (e2) {
37692
+ if (e2.name !== "TypeError") {
37693
+ throw e2;
37694
+ }
37695
+ var Builder = typeof BlobBuilder !== "undefined" ? BlobBuilder : typeof MSBlobBuilder !== "undefined" ? MSBlobBuilder : typeof MozBlobBuilder !== "undefined" ? MozBlobBuilder : WebKitBlobBuilder;
37696
+ var builder = new Builder();
37697
+ for (var i3 = 0; i3 < parts.length; i3 += 1) {
37698
+ builder.append(parts[i3]);
37699
+ }
37700
+ return builder.getBlob(properties.type);
37701
+ }
37702
+ }
37703
+ if (typeof Promise === "undefined") {
37704
+ _dereq_(3);
37705
+ }
37706
+ var Promise$1 = Promise;
37707
+ function executeCallback(promise, callback) {
37708
+ if (callback) {
37709
+ promise.then(function(result) {
37710
+ callback(null, result);
37711
+ }, function(error) {
37712
+ callback(error);
37713
+ });
37714
+ }
37715
+ }
37716
+ function executeTwoCallbacks(promise, callback, errorCallback) {
37717
+ if (typeof callback === "function") {
37718
+ promise.then(callback);
37719
+ }
37720
+ if (typeof errorCallback === "function") {
37721
+ promise["catch"](errorCallback);
37722
+ }
37723
+ }
37724
+ function normalizeKey(key2) {
37725
+ if (typeof key2 !== "string") {
37726
+ console.warn(key2 + " used as a key, but it is not a string.");
37727
+ key2 = String(key2);
37728
+ }
37729
+ return key2;
37730
+ }
37731
+ function getCallback() {
37732
+ if (arguments.length && typeof arguments[arguments.length - 1] === "function") {
37733
+ return arguments[arguments.length - 1];
37734
+ }
37735
+ }
37736
+ var DETECT_BLOB_SUPPORT_STORE = "local-forage-detect-blob-support";
37737
+ var supportsBlobs = void 0;
37738
+ var dbContexts = {};
37739
+ var toString = Object.prototype.toString;
37740
+ var READ_ONLY = "readonly";
37741
+ var READ_WRITE = "readwrite";
37742
+ function _binStringToArrayBuffer(bin) {
37743
+ var length2 = bin.length;
37744
+ var buf = new ArrayBuffer(length2);
37745
+ var arr = new Uint8Array(buf);
37746
+ for (var i3 = 0; i3 < length2; i3++) {
37747
+ arr[i3] = bin.charCodeAt(i3);
37748
+ }
37749
+ return buf;
37750
+ }
37751
+ function _checkBlobSupportWithoutCaching(idb2) {
37752
+ return new Promise$1(function(resolve) {
37753
+ var txn = idb2.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);
37754
+ var blob = createBlob([""]);
37755
+ txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, "key");
37756
+ txn.onabort = function(e2) {
37757
+ e2.preventDefault();
37758
+ e2.stopPropagation();
37759
+ resolve(false);
37760
+ };
37761
+ txn.oncomplete = function() {
37762
+ var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/);
37763
+ var matchedEdge = navigator.userAgent.match(/Edge\//);
37764
+ resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);
37765
+ };
37766
+ })["catch"](function() {
37767
+ return false;
37768
+ });
37769
+ }
37770
+ function _checkBlobSupport(idb2) {
37771
+ if (typeof supportsBlobs === "boolean") {
37772
+ return Promise$1.resolve(supportsBlobs);
37773
+ }
37774
+ return _checkBlobSupportWithoutCaching(idb2).then(function(value) {
37775
+ supportsBlobs = value;
37776
+ return supportsBlobs;
37777
+ });
37778
+ }
37779
+ function _deferReadiness(dbInfo) {
37780
+ var dbContext = dbContexts[dbInfo.name];
37781
+ var deferredOperation = {};
37782
+ deferredOperation.promise = new Promise$1(function(resolve, reject) {
37783
+ deferredOperation.resolve = resolve;
37784
+ deferredOperation.reject = reject;
37785
+ });
37786
+ dbContext.deferredOperations.push(deferredOperation);
37787
+ if (!dbContext.dbReady) {
37788
+ dbContext.dbReady = deferredOperation.promise;
37789
+ } else {
37790
+ dbContext.dbReady = dbContext.dbReady.then(function() {
37791
+ return deferredOperation.promise;
37792
+ });
37793
+ }
37794
+ }
37795
+ function _advanceReadiness(dbInfo) {
37796
+ var dbContext = dbContexts[dbInfo.name];
37797
+ var deferredOperation = dbContext.deferredOperations.pop();
37798
+ if (deferredOperation) {
37799
+ deferredOperation.resolve();
37800
+ return deferredOperation.promise;
37801
+ }
37802
+ }
37803
+ function _rejectReadiness(dbInfo, err) {
37804
+ var dbContext = dbContexts[dbInfo.name];
37805
+ var deferredOperation = dbContext.deferredOperations.pop();
37806
+ if (deferredOperation) {
37807
+ deferredOperation.reject(err);
37808
+ return deferredOperation.promise;
37809
+ }
37810
+ }
37811
+ function _getConnection(dbInfo, upgradeNeeded) {
37812
+ return new Promise$1(function(resolve, reject) {
37813
+ dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();
37814
+ if (dbInfo.db) {
37815
+ if (upgradeNeeded) {
37816
+ _deferReadiness(dbInfo);
37817
+ dbInfo.db.close();
37818
+ } else {
37819
+ return resolve(dbInfo.db);
37820
+ }
37821
+ }
37822
+ var dbArgs = [dbInfo.name];
37823
+ if (upgradeNeeded) {
37824
+ dbArgs.push(dbInfo.version);
37825
+ }
37826
+ var openreq = idb.open.apply(idb, dbArgs);
37827
+ if (upgradeNeeded) {
37828
+ openreq.onupgradeneeded = function(e2) {
37829
+ var db = openreq.result;
37830
+ try {
37831
+ db.createObjectStore(dbInfo.storeName);
37832
+ if (e2.oldVersion <= 1) {
37833
+ db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);
37834
+ }
37835
+ } catch (ex) {
37836
+ if (ex.name === "ConstraintError") {
37837
+ console.warn('The database "' + dbInfo.name + '" has been upgraded from version ' + e2.oldVersion + " to version " + e2.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.');
37838
+ } else {
37839
+ throw ex;
37840
+ }
37841
+ }
37842
+ };
37843
+ }
37844
+ openreq.onerror = function(e2) {
37845
+ e2.preventDefault();
37846
+ reject(openreq.error);
37847
+ };
37848
+ openreq.onsuccess = function() {
37849
+ var db = openreq.result;
37850
+ db.onversionchange = function(e2) {
37851
+ e2.target.close();
37852
+ };
37853
+ resolve(db);
37854
+ _advanceReadiness(dbInfo);
37855
+ };
37856
+ });
37857
+ }
37858
+ function _getOriginalConnection(dbInfo) {
37859
+ return _getConnection(dbInfo, false);
37860
+ }
37861
+ function _getUpgradedConnection(dbInfo) {
37862
+ return _getConnection(dbInfo, true);
37863
+ }
37864
+ function _isUpgradeNeeded(dbInfo, defaultVersion) {
37865
+ if (!dbInfo.db) {
37866
+ return true;
37867
+ }
37868
+ var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);
37869
+ var isDowngrade = dbInfo.version < dbInfo.db.version;
37870
+ var isUpgrade = dbInfo.version > dbInfo.db.version;
37871
+ if (isDowngrade) {
37872
+ if (dbInfo.version !== defaultVersion) {
37873
+ console.warn('The database "' + dbInfo.name + `" can't be downgraded from version ` + dbInfo.db.version + " to version " + dbInfo.version + ".");
37874
+ }
37875
+ dbInfo.version = dbInfo.db.version;
37876
+ }
37877
+ if (isUpgrade || isNewStore) {
37878
+ if (isNewStore) {
37879
+ var incVersion = dbInfo.db.version + 1;
37880
+ if (incVersion > dbInfo.version) {
37881
+ dbInfo.version = incVersion;
37882
+ }
37883
+ }
37884
+ return true;
37885
+ }
37886
+ return false;
37887
+ }
37888
+ function _encodeBlob(blob) {
37889
+ return new Promise$1(function(resolve, reject) {
37890
+ var reader = new FileReader();
37891
+ reader.onerror = reject;
37892
+ reader.onloadend = function(e2) {
37893
+ var base64 = btoa(e2.target.result || "");
37894
+ resolve({
37895
+ __local_forage_encoded_blob: true,
37896
+ data: base64,
37897
+ type: blob.type
37898
+ });
37899
+ };
37900
+ reader.readAsBinaryString(blob);
37901
+ });
37902
+ }
37903
+ function _decodeBlob(encodedBlob) {
37904
+ var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));
37905
+ return createBlob([arrayBuff], { type: encodedBlob.type });
37906
+ }
37907
+ function _isEncodedBlob(value) {
37908
+ return value && value.__local_forage_encoded_blob;
37909
+ }
37910
+ function _fullyReady(callback) {
37911
+ var self2 = this;
37912
+ var promise = self2._initReady().then(function() {
37913
+ var dbContext = dbContexts[self2._dbInfo.name];
37914
+ if (dbContext && dbContext.dbReady) {
37915
+ return dbContext.dbReady;
37916
+ }
37917
+ });
37918
+ executeTwoCallbacks(promise, callback, callback);
37919
+ return promise;
37920
+ }
37921
+ function _tryReconnect(dbInfo) {
37922
+ _deferReadiness(dbInfo);
37923
+ var dbContext = dbContexts[dbInfo.name];
37924
+ var forages = dbContext.forages;
37925
+ for (var i3 = 0; i3 < forages.length; i3++) {
37926
+ var forage = forages[i3];
37927
+ if (forage._dbInfo.db) {
37928
+ forage._dbInfo.db.close();
37929
+ forage._dbInfo.db = null;
37930
+ }
37931
+ }
37932
+ dbInfo.db = null;
37933
+ return _getOriginalConnection(dbInfo).then(function(db) {
37934
+ dbInfo.db = db;
37935
+ if (_isUpgradeNeeded(dbInfo)) {
37936
+ return _getUpgradedConnection(dbInfo);
37937
+ }
37938
+ return db;
37939
+ }).then(function(db) {
37940
+ dbInfo.db = dbContext.db = db;
37941
+ for (var i22 = 0; i22 < forages.length; i22++) {
37942
+ forages[i22]._dbInfo.db = db;
37943
+ }
37944
+ })["catch"](function(err) {
37945
+ _rejectReadiness(dbInfo, err);
37946
+ throw err;
37947
+ });
37948
+ }
37949
+ function createTransaction(dbInfo, mode, callback, retries) {
37950
+ if (retries === void 0) {
37951
+ retries = 1;
37952
+ }
37953
+ try {
37954
+ var tx = dbInfo.db.transaction(dbInfo.storeName, mode);
37955
+ callback(null, tx);
37956
+ } catch (err) {
37957
+ if (retries > 0 && (!dbInfo.db || err.name === "InvalidStateError" || err.name === "NotFoundError")) {
37958
+ return Promise$1.resolve().then(function() {
37959
+ if (!dbInfo.db || err.name === "NotFoundError" && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {
37960
+ if (dbInfo.db) {
37961
+ dbInfo.version = dbInfo.db.version + 1;
37962
+ }
37963
+ return _getUpgradedConnection(dbInfo);
37964
+ }
37965
+ }).then(function() {
37966
+ return _tryReconnect(dbInfo).then(function() {
37967
+ createTransaction(dbInfo, mode, callback, retries - 1);
37968
+ });
37969
+ })["catch"](callback);
37970
+ }
37971
+ callback(err);
37972
+ }
37973
+ }
37974
+ function createDbContext() {
37975
+ return {
37976
+ // Running localForages sharing a database.
37977
+ forages: [],
37978
+ // Shared database.
37979
+ db: null,
37980
+ // Database readiness (promise).
37981
+ dbReady: null,
37982
+ // Deferred operations on the database.
37983
+ deferredOperations: []
37984
+ };
37985
+ }
37986
+ function _initStorage(options) {
37987
+ var self2 = this;
37988
+ var dbInfo = {
37989
+ db: null
37990
+ };
37991
+ if (options) {
37992
+ for (var i3 in options) {
37993
+ dbInfo[i3] = options[i3];
37994
+ }
37995
+ }
37996
+ var dbContext = dbContexts[dbInfo.name];
37997
+ if (!dbContext) {
37998
+ dbContext = createDbContext();
37999
+ dbContexts[dbInfo.name] = dbContext;
38000
+ }
38001
+ dbContext.forages.push(self2);
38002
+ if (!self2._initReady) {
38003
+ self2._initReady = self2.ready;
38004
+ self2.ready = _fullyReady;
38005
+ }
38006
+ var initPromises = [];
38007
+ function ignoreErrors() {
38008
+ return Promise$1.resolve();
38009
+ }
38010
+ for (var j3 = 0; j3 < dbContext.forages.length; j3++) {
38011
+ var forage = dbContext.forages[j3];
38012
+ if (forage !== self2) {
38013
+ initPromises.push(forage._initReady()["catch"](ignoreErrors));
38014
+ }
38015
+ }
38016
+ var forages = dbContext.forages.slice(0);
38017
+ return Promise$1.all(initPromises).then(function() {
38018
+ dbInfo.db = dbContext.db;
38019
+ return _getOriginalConnection(dbInfo);
38020
+ }).then(function(db) {
38021
+ dbInfo.db = db;
38022
+ if (_isUpgradeNeeded(dbInfo, self2._defaultConfig.version)) {
38023
+ return _getUpgradedConnection(dbInfo);
38024
+ }
38025
+ return db;
38026
+ }).then(function(db) {
38027
+ dbInfo.db = dbContext.db = db;
38028
+ self2._dbInfo = dbInfo;
38029
+ for (var k2 = 0; k2 < forages.length; k2++) {
38030
+ var forage2 = forages[k2];
38031
+ if (forage2 !== self2) {
38032
+ forage2._dbInfo.db = dbInfo.db;
38033
+ forage2._dbInfo.version = dbInfo.version;
38034
+ }
38035
+ }
38036
+ });
38037
+ }
38038
+ function getItem(key2, callback) {
38039
+ var self2 = this;
38040
+ key2 = normalizeKey(key2);
38041
+ var promise = new Promise$1(function(resolve, reject) {
38042
+ self2.ready().then(function() {
38043
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38044
+ if (err) {
38045
+ return reject(err);
38046
+ }
38047
+ try {
38048
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38049
+ var req = store.get(key2);
38050
+ req.onsuccess = function() {
38051
+ var value = req.result;
38052
+ if (value === void 0) {
38053
+ value = null;
38054
+ }
38055
+ if (_isEncodedBlob(value)) {
38056
+ value = _decodeBlob(value);
38057
+ }
38058
+ resolve(value);
38059
+ };
38060
+ req.onerror = function() {
38061
+ reject(req.error);
38062
+ };
38063
+ } catch (e2) {
38064
+ reject(e2);
38065
+ }
38066
+ });
38067
+ })["catch"](reject);
38068
+ });
38069
+ executeCallback(promise, callback);
38070
+ return promise;
38071
+ }
38072
+ function iterate(iterator, callback) {
38073
+ var self2 = this;
38074
+ var promise = new Promise$1(function(resolve, reject) {
38075
+ self2.ready().then(function() {
38076
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38077
+ if (err) {
38078
+ return reject(err);
38079
+ }
38080
+ try {
38081
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38082
+ var req = store.openCursor();
38083
+ var iterationNumber = 1;
38084
+ req.onsuccess = function() {
38085
+ var cursor = req.result;
38086
+ if (cursor) {
38087
+ var value = cursor.value;
38088
+ if (_isEncodedBlob(value)) {
38089
+ value = _decodeBlob(value);
38090
+ }
38091
+ var result = iterator(value, cursor.key, iterationNumber++);
38092
+ if (result !== void 0) {
38093
+ resolve(result);
38094
+ } else {
38095
+ cursor["continue"]();
38096
+ }
38097
+ } else {
38098
+ resolve();
38099
+ }
38100
+ };
38101
+ req.onerror = function() {
38102
+ reject(req.error);
38103
+ };
38104
+ } catch (e2) {
38105
+ reject(e2);
38106
+ }
38107
+ });
38108
+ })["catch"](reject);
38109
+ });
38110
+ executeCallback(promise, callback);
38111
+ return promise;
38112
+ }
38113
+ function setItem(key2, value, callback) {
38114
+ var self2 = this;
38115
+ key2 = normalizeKey(key2);
38116
+ var promise = new Promise$1(function(resolve, reject) {
38117
+ var dbInfo;
38118
+ self2.ready().then(function() {
38119
+ dbInfo = self2._dbInfo;
38120
+ if (toString.call(value) === "[object Blob]") {
38121
+ return _checkBlobSupport(dbInfo.db).then(function(blobSupport) {
38122
+ if (blobSupport) {
38123
+ return value;
38124
+ }
38125
+ return _encodeBlob(value);
38126
+ });
38127
+ }
38128
+ return value;
38129
+ }).then(function(value2) {
38130
+ createTransaction(self2._dbInfo, READ_WRITE, function(err, transaction) {
38131
+ if (err) {
38132
+ return reject(err);
38133
+ }
38134
+ try {
38135
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38136
+ if (value2 === null) {
38137
+ value2 = void 0;
38138
+ }
38139
+ var req = store.put(value2, key2);
38140
+ transaction.oncomplete = function() {
38141
+ if (value2 === void 0) {
38142
+ value2 = null;
38143
+ }
38144
+ resolve(value2);
38145
+ };
38146
+ transaction.onabort = transaction.onerror = function() {
38147
+ var err2 = req.error ? req.error : req.transaction.error;
38148
+ reject(err2);
38149
+ };
38150
+ } catch (e2) {
38151
+ reject(e2);
38152
+ }
38153
+ });
38154
+ })["catch"](reject);
38155
+ });
38156
+ executeCallback(promise, callback);
38157
+ return promise;
38158
+ }
38159
+ function removeItem(key2, callback) {
38160
+ var self2 = this;
38161
+ key2 = normalizeKey(key2);
38162
+ var promise = new Promise$1(function(resolve, reject) {
38163
+ self2.ready().then(function() {
38164
+ createTransaction(self2._dbInfo, READ_WRITE, function(err, transaction) {
38165
+ if (err) {
38166
+ return reject(err);
38167
+ }
38168
+ try {
38169
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38170
+ var req = store["delete"](key2);
38171
+ transaction.oncomplete = function() {
38172
+ resolve();
38173
+ };
38174
+ transaction.onerror = function() {
38175
+ reject(req.error);
38176
+ };
38177
+ transaction.onabort = function() {
38178
+ var err2 = req.error ? req.error : req.transaction.error;
38179
+ reject(err2);
38180
+ };
38181
+ } catch (e2) {
38182
+ reject(e2);
38183
+ }
38184
+ });
38185
+ })["catch"](reject);
38186
+ });
38187
+ executeCallback(promise, callback);
38188
+ return promise;
38189
+ }
38190
+ function clear(callback) {
38191
+ var self2 = this;
38192
+ var promise = new Promise$1(function(resolve, reject) {
38193
+ self2.ready().then(function() {
38194
+ createTransaction(self2._dbInfo, READ_WRITE, function(err, transaction) {
38195
+ if (err) {
38196
+ return reject(err);
38197
+ }
38198
+ try {
38199
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38200
+ var req = store.clear();
38201
+ transaction.oncomplete = function() {
38202
+ resolve();
38203
+ };
38204
+ transaction.onabort = transaction.onerror = function() {
38205
+ var err2 = req.error ? req.error : req.transaction.error;
38206
+ reject(err2);
38207
+ };
38208
+ } catch (e2) {
38209
+ reject(e2);
38210
+ }
38211
+ });
38212
+ })["catch"](reject);
38213
+ });
38214
+ executeCallback(promise, callback);
38215
+ return promise;
38216
+ }
38217
+ function length(callback) {
38218
+ var self2 = this;
38219
+ var promise = new Promise$1(function(resolve, reject) {
38220
+ self2.ready().then(function() {
38221
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38222
+ if (err) {
38223
+ return reject(err);
38224
+ }
38225
+ try {
38226
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38227
+ var req = store.count();
38228
+ req.onsuccess = function() {
38229
+ resolve(req.result);
38230
+ };
38231
+ req.onerror = function() {
38232
+ reject(req.error);
38233
+ };
38234
+ } catch (e2) {
38235
+ reject(e2);
38236
+ }
38237
+ });
38238
+ })["catch"](reject);
38239
+ });
38240
+ executeCallback(promise, callback);
38241
+ return promise;
38242
+ }
38243
+ function key(n2, callback) {
38244
+ var self2 = this;
38245
+ var promise = new Promise$1(function(resolve, reject) {
38246
+ if (n2 < 0) {
38247
+ resolve(null);
38248
+ return;
38249
+ }
38250
+ self2.ready().then(function() {
38251
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38252
+ if (err) {
38253
+ return reject(err);
38254
+ }
38255
+ try {
38256
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38257
+ var advanced = false;
38258
+ var req = store.openKeyCursor();
38259
+ req.onsuccess = function() {
38260
+ var cursor = req.result;
38261
+ if (!cursor) {
38262
+ resolve(null);
38263
+ return;
38264
+ }
38265
+ if (n2 === 0) {
38266
+ resolve(cursor.key);
38267
+ } else {
38268
+ if (!advanced) {
38269
+ advanced = true;
38270
+ cursor.advance(n2);
38271
+ } else {
38272
+ resolve(cursor.key);
38273
+ }
38274
+ }
38275
+ };
38276
+ req.onerror = function() {
38277
+ reject(req.error);
38278
+ };
38279
+ } catch (e2) {
38280
+ reject(e2);
38281
+ }
38282
+ });
38283
+ })["catch"](reject);
38284
+ });
38285
+ executeCallback(promise, callback);
38286
+ return promise;
38287
+ }
38288
+ function keys(callback) {
38289
+ var self2 = this;
38290
+ var promise = new Promise$1(function(resolve, reject) {
38291
+ self2.ready().then(function() {
38292
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38293
+ if (err) {
38294
+ return reject(err);
38295
+ }
38296
+ try {
38297
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38298
+ var req = store.openKeyCursor();
38299
+ var keys2 = [];
38300
+ req.onsuccess = function() {
38301
+ var cursor = req.result;
38302
+ if (!cursor) {
38303
+ resolve(keys2);
38304
+ return;
38305
+ }
38306
+ keys2.push(cursor.key);
38307
+ cursor["continue"]();
38308
+ };
38309
+ req.onerror = function() {
38310
+ reject(req.error);
38311
+ };
38312
+ } catch (e2) {
38313
+ reject(e2);
38314
+ }
38315
+ });
38316
+ })["catch"](reject);
38317
+ });
38318
+ executeCallback(promise, callback);
38319
+ return promise;
38320
+ }
38321
+ function dropInstance(options, callback) {
38322
+ callback = getCallback.apply(this, arguments);
38323
+ var currentConfig = this.config();
38324
+ options = typeof options !== "function" && options || {};
38325
+ if (!options.name) {
38326
+ options.name = options.name || currentConfig.name;
38327
+ options.storeName = options.storeName || currentConfig.storeName;
38328
+ }
38329
+ var self2 = this;
38330
+ var promise;
38331
+ if (!options.name) {
38332
+ promise = Promise$1.reject("Invalid arguments");
38333
+ } else {
38334
+ var isCurrentDb = options.name === currentConfig.name && self2._dbInfo.db;
38335
+ var dbPromise = isCurrentDb ? Promise$1.resolve(self2._dbInfo.db) : _getOriginalConnection(options).then(function(db) {
38336
+ var dbContext = dbContexts[options.name];
38337
+ var forages = dbContext.forages;
38338
+ dbContext.db = db;
38339
+ for (var i3 = 0; i3 < forages.length; i3++) {
38340
+ forages[i3]._dbInfo.db = db;
38341
+ }
38342
+ return db;
38343
+ });
38344
+ if (!options.storeName) {
38345
+ promise = dbPromise.then(function(db) {
38346
+ _deferReadiness(options);
38347
+ var dbContext = dbContexts[options.name];
38348
+ var forages = dbContext.forages;
38349
+ db.close();
38350
+ for (var i3 = 0; i3 < forages.length; i3++) {
38351
+ var forage = forages[i3];
38352
+ forage._dbInfo.db = null;
38353
+ }
38354
+ var dropDBPromise = new Promise$1(function(resolve, reject) {
38355
+ var req = idb.deleteDatabase(options.name);
38356
+ req.onerror = function() {
38357
+ var db2 = req.result;
38358
+ if (db2) {
38359
+ db2.close();
38360
+ }
38361
+ reject(req.error);
38362
+ };
38363
+ req.onblocked = function() {
38364
+ console.warn('dropInstance blocked for database "' + options.name + '" until all open connections are closed');
38365
+ };
38366
+ req.onsuccess = function() {
38367
+ var db2 = req.result;
38368
+ if (db2) {
38369
+ db2.close();
38370
+ }
38371
+ resolve(db2);
38372
+ };
38373
+ });
38374
+ return dropDBPromise.then(function(db2) {
38375
+ dbContext.db = db2;
38376
+ for (var i22 = 0; i22 < forages.length; i22++) {
38377
+ var _forage = forages[i22];
38378
+ _advanceReadiness(_forage._dbInfo);
38379
+ }
38380
+ })["catch"](function(err) {
38381
+ (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function() {
38382
+ });
38383
+ throw err;
38384
+ });
38385
+ });
38386
+ } else {
38387
+ promise = dbPromise.then(function(db) {
38388
+ if (!db.objectStoreNames.contains(options.storeName)) {
38389
+ return;
38390
+ }
38391
+ var newVersion = db.version + 1;
38392
+ _deferReadiness(options);
38393
+ var dbContext = dbContexts[options.name];
38394
+ var forages = dbContext.forages;
38395
+ db.close();
38396
+ for (var i3 = 0; i3 < forages.length; i3++) {
38397
+ var forage = forages[i3];
38398
+ forage._dbInfo.db = null;
38399
+ forage._dbInfo.version = newVersion;
38400
+ }
38401
+ var dropObjectPromise = new Promise$1(function(resolve, reject) {
38402
+ var req = idb.open(options.name, newVersion);
38403
+ req.onerror = function(err) {
38404
+ var db2 = req.result;
38405
+ db2.close();
38406
+ reject(err);
38407
+ };
38408
+ req.onupgradeneeded = function() {
38409
+ var db2 = req.result;
38410
+ db2.deleteObjectStore(options.storeName);
38411
+ };
38412
+ req.onsuccess = function() {
38413
+ var db2 = req.result;
38414
+ db2.close();
38415
+ resolve(db2);
38416
+ };
38417
+ });
38418
+ return dropObjectPromise.then(function(db2) {
38419
+ dbContext.db = db2;
38420
+ for (var j3 = 0; j3 < forages.length; j3++) {
38421
+ var _forage2 = forages[j3];
38422
+ _forage2._dbInfo.db = db2;
38423
+ _advanceReadiness(_forage2._dbInfo);
38424
+ }
38425
+ })["catch"](function(err) {
38426
+ (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function() {
38427
+ });
38428
+ throw err;
38429
+ });
38430
+ });
38431
+ }
38432
+ }
38433
+ executeCallback(promise, callback);
38434
+ return promise;
38435
+ }
38436
+ var asyncStorage = {
38437
+ _driver: "asyncStorage",
38438
+ _initStorage,
38439
+ _support: isIndexedDBValid(),
38440
+ iterate,
38441
+ getItem,
38442
+ setItem,
38443
+ removeItem,
38444
+ clear,
38445
+ length,
38446
+ key,
38447
+ keys,
38448
+ dropInstance
38449
+ };
38450
+ function isWebSQLValid() {
38451
+ return typeof openDatabase === "function";
38452
+ }
38453
+ var BASE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
38454
+ var BLOB_TYPE_PREFIX = "~~local_forage_type~";
38455
+ var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;
38456
+ var SERIALIZED_MARKER = "__lfsc__:";
38457
+ var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;
38458
+ var TYPE_ARRAYBUFFER = "arbf";
38459
+ var TYPE_BLOB = "blob";
38460
+ var TYPE_INT8ARRAY = "si08";
38461
+ var TYPE_UINT8ARRAY = "ui08";
38462
+ var TYPE_UINT8CLAMPEDARRAY = "uic8";
38463
+ var TYPE_INT16ARRAY = "si16";
38464
+ var TYPE_INT32ARRAY = "si32";
38465
+ var TYPE_UINT16ARRAY = "ur16";
38466
+ var TYPE_UINT32ARRAY = "ui32";
38467
+ var TYPE_FLOAT32ARRAY = "fl32";
38468
+ var TYPE_FLOAT64ARRAY = "fl64";
38469
+ var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;
38470
+ var toString$1 = Object.prototype.toString;
38471
+ function stringToBuffer(serializedString) {
38472
+ var bufferLength = serializedString.length * 0.75;
38473
+ var len = serializedString.length;
38474
+ var i3;
38475
+ var p2 = 0;
38476
+ var encoded1, encoded2, encoded3, encoded4;
38477
+ if (serializedString[serializedString.length - 1] === "=") {
38478
+ bufferLength--;
38479
+ if (serializedString[serializedString.length - 2] === "=") {
38480
+ bufferLength--;
38481
+ }
38482
+ }
38483
+ var buffer = new ArrayBuffer(bufferLength);
38484
+ var bytes = new Uint8Array(buffer);
38485
+ for (i3 = 0; i3 < len; i3 += 4) {
38486
+ encoded1 = BASE_CHARS.indexOf(serializedString[i3]);
38487
+ encoded2 = BASE_CHARS.indexOf(serializedString[i3 + 1]);
38488
+ encoded3 = BASE_CHARS.indexOf(serializedString[i3 + 2]);
38489
+ encoded4 = BASE_CHARS.indexOf(serializedString[i3 + 3]);
38490
+ bytes[p2++] = encoded1 << 2 | encoded2 >> 4;
38491
+ bytes[p2++] = (encoded2 & 15) << 4 | encoded3 >> 2;
38492
+ bytes[p2++] = (encoded3 & 3) << 6 | encoded4 & 63;
38493
+ }
38494
+ return buffer;
38495
+ }
38496
+ function bufferToString(buffer) {
38497
+ var bytes = new Uint8Array(buffer);
38498
+ var base64String = "";
38499
+ var i3;
38500
+ for (i3 = 0; i3 < bytes.length; i3 += 3) {
38501
+ base64String += BASE_CHARS[bytes[i3] >> 2];
38502
+ base64String += BASE_CHARS[(bytes[i3] & 3) << 4 | bytes[i3 + 1] >> 4];
38503
+ base64String += BASE_CHARS[(bytes[i3 + 1] & 15) << 2 | bytes[i3 + 2] >> 6];
38504
+ base64String += BASE_CHARS[bytes[i3 + 2] & 63];
38505
+ }
38506
+ if (bytes.length % 3 === 2) {
38507
+ base64String = base64String.substring(0, base64String.length - 1) + "=";
38508
+ } else if (bytes.length % 3 === 1) {
38509
+ base64String = base64String.substring(0, base64String.length - 2) + "==";
38510
+ }
38511
+ return base64String;
38512
+ }
38513
+ function serialize(value, callback) {
38514
+ var valueType = "";
38515
+ if (value) {
38516
+ valueType = toString$1.call(value);
38517
+ }
38518
+ if (value && (valueType === "[object ArrayBuffer]" || value.buffer && toString$1.call(value.buffer) === "[object ArrayBuffer]")) {
38519
+ var buffer;
38520
+ var marker = SERIALIZED_MARKER;
38521
+ if (value instanceof ArrayBuffer) {
38522
+ buffer = value;
38523
+ marker += TYPE_ARRAYBUFFER;
38524
+ } else {
38525
+ buffer = value.buffer;
38526
+ if (valueType === "[object Int8Array]") {
38527
+ marker += TYPE_INT8ARRAY;
38528
+ } else if (valueType === "[object Uint8Array]") {
38529
+ marker += TYPE_UINT8ARRAY;
38530
+ } else if (valueType === "[object Uint8ClampedArray]") {
38531
+ marker += TYPE_UINT8CLAMPEDARRAY;
38532
+ } else if (valueType === "[object Int16Array]") {
38533
+ marker += TYPE_INT16ARRAY;
38534
+ } else if (valueType === "[object Uint16Array]") {
38535
+ marker += TYPE_UINT16ARRAY;
38536
+ } else if (valueType === "[object Int32Array]") {
38537
+ marker += TYPE_INT32ARRAY;
38538
+ } else if (valueType === "[object Uint32Array]") {
38539
+ marker += TYPE_UINT32ARRAY;
38540
+ } else if (valueType === "[object Float32Array]") {
38541
+ marker += TYPE_FLOAT32ARRAY;
38542
+ } else if (valueType === "[object Float64Array]") {
38543
+ marker += TYPE_FLOAT64ARRAY;
38544
+ } else {
38545
+ callback(new Error("Failed to get type for BinaryArray"));
38546
+ }
38547
+ }
38548
+ callback(marker + bufferToString(buffer));
38549
+ } else if (valueType === "[object Blob]") {
38550
+ var fileReader = new FileReader();
38551
+ fileReader.onload = function() {
38552
+ var str = BLOB_TYPE_PREFIX + value.type + "~" + bufferToString(this.result);
38553
+ callback(SERIALIZED_MARKER + TYPE_BLOB + str);
38554
+ };
38555
+ fileReader.readAsArrayBuffer(value);
38556
+ } else {
38557
+ try {
38558
+ callback(JSON.stringify(value));
38559
+ } catch (e2) {
38560
+ console.error("Couldn't convert value into a JSON string: ", value);
38561
+ callback(null, e2);
38562
+ }
38563
+ }
38564
+ }
38565
+ function deserialize(value) {
38566
+ if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {
38567
+ return JSON.parse(value);
38568
+ }
38569
+ var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);
38570
+ var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);
38571
+ var blobType;
38572
+ if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {
38573
+ var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);
38574
+ blobType = matcher[1];
38575
+ serializedString = serializedString.substring(matcher[0].length);
38576
+ }
38577
+ var buffer = stringToBuffer(serializedString);
38578
+ switch (type) {
38579
+ case TYPE_ARRAYBUFFER:
38580
+ return buffer;
38581
+ case TYPE_BLOB:
38582
+ return createBlob([buffer], { type: blobType });
38583
+ case TYPE_INT8ARRAY:
38584
+ return new Int8Array(buffer);
38585
+ case TYPE_UINT8ARRAY:
38586
+ return new Uint8Array(buffer);
38587
+ case TYPE_UINT8CLAMPEDARRAY:
38588
+ return new Uint8ClampedArray(buffer);
38589
+ case TYPE_INT16ARRAY:
38590
+ return new Int16Array(buffer);
38591
+ case TYPE_UINT16ARRAY:
38592
+ return new Uint16Array(buffer);
38593
+ case TYPE_INT32ARRAY:
38594
+ return new Int32Array(buffer);
38595
+ case TYPE_UINT32ARRAY:
38596
+ return new Uint32Array(buffer);
38597
+ case TYPE_FLOAT32ARRAY:
38598
+ return new Float32Array(buffer);
38599
+ case TYPE_FLOAT64ARRAY:
38600
+ return new Float64Array(buffer);
38601
+ default:
38602
+ throw new Error("Unkown type: " + type);
38603
+ }
38604
+ }
38605
+ var localforageSerializer = {
38606
+ serialize,
38607
+ deserialize,
38608
+ stringToBuffer,
38609
+ bufferToString
38610
+ };
38611
+ function createDbTable(t2, dbInfo, callback, errorCallback) {
38612
+ t2.executeSql("CREATE TABLE IF NOT EXISTS " + dbInfo.storeName + " (id INTEGER PRIMARY KEY, key unique, value)", [], callback, errorCallback);
38613
+ }
38614
+ function _initStorage$1(options) {
38615
+ var self2 = this;
38616
+ var dbInfo = {
38617
+ db: null
38618
+ };
38619
+ if (options) {
38620
+ for (var i3 in options) {
38621
+ dbInfo[i3] = typeof options[i3] !== "string" ? options[i3].toString() : options[i3];
38622
+ }
38623
+ }
38624
+ var dbInfoPromise = new Promise$1(function(resolve, reject) {
38625
+ try {
38626
+ dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);
38627
+ } catch (e2) {
38628
+ return reject(e2);
38629
+ }
38630
+ dbInfo.db.transaction(function(t2) {
38631
+ createDbTable(t2, dbInfo, function() {
38632
+ self2._dbInfo = dbInfo;
38633
+ resolve();
38634
+ }, function(t22, error) {
38635
+ reject(error);
38636
+ });
38637
+ }, reject);
38638
+ });
38639
+ dbInfo.serializer = localforageSerializer;
38640
+ return dbInfoPromise;
38641
+ }
38642
+ function tryExecuteSql(t2, dbInfo, sqlStatement, args, callback, errorCallback) {
38643
+ t2.executeSql(sqlStatement, args, callback, function(t22, error) {
38644
+ if (error.code === error.SYNTAX_ERR) {
38645
+ t22.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?", [dbInfo.storeName], function(t3, results) {
38646
+ if (!results.rows.length) {
38647
+ createDbTable(t3, dbInfo, function() {
38648
+ t3.executeSql(sqlStatement, args, callback, errorCallback);
38649
+ }, errorCallback);
38650
+ } else {
38651
+ errorCallback(t3, error);
38652
+ }
38653
+ }, errorCallback);
38654
+ } else {
38655
+ errorCallback(t22, error);
38656
+ }
38657
+ }, errorCallback);
38658
+ }
38659
+ function getItem$1(key2, callback) {
38660
+ var self2 = this;
38661
+ key2 = normalizeKey(key2);
38662
+ var promise = new Promise$1(function(resolve, reject) {
38663
+ self2.ready().then(function() {
38664
+ var dbInfo = self2._dbInfo;
38665
+ dbInfo.db.transaction(function(t2) {
38666
+ tryExecuteSql(t2, dbInfo, "SELECT * FROM " + dbInfo.storeName + " WHERE key = ? LIMIT 1", [key2], function(t22, results) {
38667
+ var result = results.rows.length ? results.rows.item(0).value : null;
38668
+ if (result) {
38669
+ result = dbInfo.serializer.deserialize(result);
38670
+ }
38671
+ resolve(result);
38672
+ }, function(t22, error) {
38673
+ reject(error);
38674
+ });
38675
+ });
38676
+ })["catch"](reject);
38677
+ });
38678
+ executeCallback(promise, callback);
38679
+ return promise;
38680
+ }
38681
+ function iterate$1(iterator, callback) {
38682
+ var self2 = this;
38683
+ var promise = new Promise$1(function(resolve, reject) {
38684
+ self2.ready().then(function() {
38685
+ var dbInfo = self2._dbInfo;
38686
+ dbInfo.db.transaction(function(t2) {
38687
+ tryExecuteSql(t2, dbInfo, "SELECT * FROM " + dbInfo.storeName, [], function(t22, results) {
38688
+ var rows = results.rows;
38689
+ var length2 = rows.length;
38690
+ for (var i3 = 0; i3 < length2; i3++) {
38691
+ var item = rows.item(i3);
38692
+ var result = item.value;
38693
+ if (result) {
38694
+ result = dbInfo.serializer.deserialize(result);
38695
+ }
38696
+ result = iterator(result, item.key, i3 + 1);
38697
+ if (result !== void 0) {
38698
+ resolve(result);
38699
+ return;
38700
+ }
38701
+ }
38702
+ resolve();
38703
+ }, function(t22, error) {
38704
+ reject(error);
38705
+ });
38706
+ });
38707
+ })["catch"](reject);
38708
+ });
38709
+ executeCallback(promise, callback);
38710
+ return promise;
38711
+ }
38712
+ function _setItem(key2, value, callback, retriesLeft) {
38713
+ var self2 = this;
38714
+ key2 = normalizeKey(key2);
38715
+ var promise = new Promise$1(function(resolve, reject) {
38716
+ self2.ready().then(function() {
38717
+ if (value === void 0) {
38718
+ value = null;
38719
+ }
38720
+ var originalValue = value;
38721
+ var dbInfo = self2._dbInfo;
38722
+ dbInfo.serializer.serialize(value, function(value2, error) {
38723
+ if (error) {
38724
+ reject(error);
38725
+ } else {
38726
+ dbInfo.db.transaction(function(t2) {
38727
+ tryExecuteSql(t2, dbInfo, "INSERT OR REPLACE INTO " + dbInfo.storeName + " (key, value) VALUES (?, ?)", [key2, value2], function() {
38728
+ resolve(originalValue);
38729
+ }, function(t22, error2) {
38730
+ reject(error2);
38731
+ });
38732
+ }, function(sqlError) {
38733
+ if (sqlError.code === sqlError.QUOTA_ERR) {
38734
+ if (retriesLeft > 0) {
38735
+ resolve(_setItem.apply(self2, [key2, originalValue, callback, retriesLeft - 1]));
38736
+ return;
38737
+ }
38738
+ reject(sqlError);
38739
+ }
38740
+ });
38741
+ }
38742
+ });
38743
+ })["catch"](reject);
38744
+ });
38745
+ executeCallback(promise, callback);
38746
+ return promise;
38747
+ }
38748
+ function setItem$1(key2, value, callback) {
38749
+ return _setItem.apply(this, [key2, value, callback, 1]);
38750
+ }
38751
+ function removeItem$1(key2, callback) {
38752
+ var self2 = this;
38753
+ key2 = normalizeKey(key2);
38754
+ var promise = new Promise$1(function(resolve, reject) {
38755
+ self2.ready().then(function() {
38756
+ var dbInfo = self2._dbInfo;
38757
+ dbInfo.db.transaction(function(t2) {
38758
+ tryExecuteSql(t2, dbInfo, "DELETE FROM " + dbInfo.storeName + " WHERE key = ?", [key2], function() {
38759
+ resolve();
38760
+ }, function(t22, error) {
38761
+ reject(error);
38762
+ });
38763
+ });
38764
+ })["catch"](reject);
38765
+ });
38766
+ executeCallback(promise, callback);
38767
+ return promise;
38768
+ }
38769
+ function clear$1(callback) {
38770
+ var self2 = this;
38771
+ var promise = new Promise$1(function(resolve, reject) {
38772
+ self2.ready().then(function() {
38773
+ var dbInfo = self2._dbInfo;
38774
+ dbInfo.db.transaction(function(t2) {
38775
+ tryExecuteSql(t2, dbInfo, "DELETE FROM " + dbInfo.storeName, [], function() {
38776
+ resolve();
38777
+ }, function(t22, error) {
38778
+ reject(error);
38779
+ });
38780
+ });
38781
+ })["catch"](reject);
38782
+ });
38783
+ executeCallback(promise, callback);
38784
+ return promise;
38785
+ }
38786
+ function length$1(callback) {
38787
+ var self2 = this;
38788
+ var promise = new Promise$1(function(resolve, reject) {
38789
+ self2.ready().then(function() {
38790
+ var dbInfo = self2._dbInfo;
38791
+ dbInfo.db.transaction(function(t2) {
38792
+ tryExecuteSql(t2, dbInfo, "SELECT COUNT(key) as c FROM " + dbInfo.storeName, [], function(t22, results) {
38793
+ var result = results.rows.item(0).c;
38794
+ resolve(result);
38795
+ }, function(t22, error) {
38796
+ reject(error);
38797
+ });
38798
+ });
38799
+ })["catch"](reject);
38800
+ });
38801
+ executeCallback(promise, callback);
38802
+ return promise;
38803
+ }
38804
+ function key$1(n2, callback) {
38805
+ var self2 = this;
38806
+ var promise = new Promise$1(function(resolve, reject) {
38807
+ self2.ready().then(function() {
38808
+ var dbInfo = self2._dbInfo;
38809
+ dbInfo.db.transaction(function(t2) {
38810
+ tryExecuteSql(t2, dbInfo, "SELECT key FROM " + dbInfo.storeName + " WHERE id = ? LIMIT 1", [n2 + 1], function(t22, results) {
38811
+ var result = results.rows.length ? results.rows.item(0).key : null;
38812
+ resolve(result);
38813
+ }, function(t22, error) {
38814
+ reject(error);
38815
+ });
38816
+ });
38817
+ })["catch"](reject);
38818
+ });
38819
+ executeCallback(promise, callback);
38820
+ return promise;
38821
+ }
38822
+ function keys$1(callback) {
38823
+ var self2 = this;
38824
+ var promise = new Promise$1(function(resolve, reject) {
38825
+ self2.ready().then(function() {
38826
+ var dbInfo = self2._dbInfo;
38827
+ dbInfo.db.transaction(function(t2) {
38828
+ tryExecuteSql(t2, dbInfo, "SELECT key FROM " + dbInfo.storeName, [], function(t22, results) {
38829
+ var keys2 = [];
38830
+ for (var i3 = 0; i3 < results.rows.length; i3++) {
38831
+ keys2.push(results.rows.item(i3).key);
38832
+ }
38833
+ resolve(keys2);
38834
+ }, function(t22, error) {
38835
+ reject(error);
38836
+ });
38837
+ });
38838
+ })["catch"](reject);
38839
+ });
38840
+ executeCallback(promise, callback);
38841
+ return promise;
38842
+ }
38843
+ function getAllStoreNames(db) {
38844
+ return new Promise$1(function(resolve, reject) {
38845
+ db.transaction(function(t2) {
38846
+ t2.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function(t22, results) {
38847
+ var storeNames = [];
38848
+ for (var i3 = 0; i3 < results.rows.length; i3++) {
38849
+ storeNames.push(results.rows.item(i3).name);
38850
+ }
38851
+ resolve({
38852
+ db,
38853
+ storeNames
38854
+ });
38855
+ }, function(t22, error) {
38856
+ reject(error);
38857
+ });
38858
+ }, function(sqlError) {
38859
+ reject(sqlError);
38860
+ });
38861
+ });
38862
+ }
38863
+ function dropInstance$1(options, callback) {
38864
+ callback = getCallback.apply(this, arguments);
38865
+ var currentConfig = this.config();
38866
+ options = typeof options !== "function" && options || {};
38867
+ if (!options.name) {
38868
+ options.name = options.name || currentConfig.name;
38869
+ options.storeName = options.storeName || currentConfig.storeName;
38870
+ }
38871
+ var self2 = this;
38872
+ var promise;
38873
+ if (!options.name) {
38874
+ promise = Promise$1.reject("Invalid arguments");
38875
+ } else {
38876
+ promise = new Promise$1(function(resolve) {
38877
+ var db;
38878
+ if (options.name === currentConfig.name) {
38879
+ db = self2._dbInfo.db;
38880
+ } else {
38881
+ db = openDatabase(options.name, "", "", 0);
38882
+ }
38883
+ if (!options.storeName) {
38884
+ resolve(getAllStoreNames(db));
38885
+ } else {
38886
+ resolve({
38887
+ db,
38888
+ storeNames: [options.storeName]
38889
+ });
38890
+ }
38891
+ }).then(function(operationInfo) {
38892
+ return new Promise$1(function(resolve, reject) {
38893
+ operationInfo.db.transaction(function(t2) {
38894
+ function dropTable(storeName) {
38895
+ return new Promise$1(function(resolve2, reject2) {
38896
+ t2.executeSql("DROP TABLE IF EXISTS " + storeName, [], function() {
38897
+ resolve2();
38898
+ }, function(t22, error) {
38899
+ reject2(error);
38900
+ });
38901
+ });
38902
+ }
38903
+ var operations = [];
38904
+ for (var i3 = 0, len = operationInfo.storeNames.length; i3 < len; i3++) {
38905
+ operations.push(dropTable(operationInfo.storeNames[i3]));
38906
+ }
38907
+ Promise$1.all(operations).then(function() {
38908
+ resolve();
38909
+ })["catch"](function(e2) {
38910
+ reject(e2);
38911
+ });
38912
+ }, function(sqlError) {
38913
+ reject(sqlError);
38914
+ });
38915
+ });
38916
+ });
38917
+ }
38918
+ executeCallback(promise, callback);
38919
+ return promise;
38920
+ }
38921
+ var webSQLStorage = {
38922
+ _driver: "webSQLStorage",
38923
+ _initStorage: _initStorage$1,
38924
+ _support: isWebSQLValid(),
38925
+ iterate: iterate$1,
38926
+ getItem: getItem$1,
38927
+ setItem: setItem$1,
38928
+ removeItem: removeItem$1,
38929
+ clear: clear$1,
38930
+ length: length$1,
38931
+ key: key$1,
38932
+ keys: keys$1,
38933
+ dropInstance: dropInstance$1
38934
+ };
38935
+ function isLocalStorageValid() {
38936
+ try {
38937
+ return typeof localStorage !== "undefined" && "setItem" in localStorage && // in IE8 typeof localStorage.setItem === 'object'
38938
+ !!localStorage.setItem;
38939
+ } catch (e2) {
38940
+ return false;
38941
+ }
38942
+ }
38943
+ function _getKeyPrefix(options, defaultConfig) {
38944
+ var keyPrefix = options.name + "/";
38945
+ if (options.storeName !== defaultConfig.storeName) {
38946
+ keyPrefix += options.storeName + "/";
38947
+ }
38948
+ return keyPrefix;
38949
+ }
38950
+ function checkIfLocalStorageThrows() {
38951
+ var localStorageTestKey = "_localforage_support_test";
38952
+ try {
38953
+ localStorage.setItem(localStorageTestKey, true);
38954
+ localStorage.removeItem(localStorageTestKey);
38955
+ return false;
38956
+ } catch (e2) {
38957
+ return true;
38958
+ }
38959
+ }
38960
+ function _isLocalStorageUsable() {
38961
+ return !checkIfLocalStorageThrows() || localStorage.length > 0;
38962
+ }
38963
+ function _initStorage$2(options) {
38964
+ var self2 = this;
38965
+ var dbInfo = {};
38966
+ if (options) {
38967
+ for (var i3 in options) {
38968
+ dbInfo[i3] = options[i3];
38969
+ }
38970
+ }
38971
+ dbInfo.keyPrefix = _getKeyPrefix(options, self2._defaultConfig);
38972
+ if (!_isLocalStorageUsable()) {
38973
+ return Promise$1.reject();
38974
+ }
38975
+ self2._dbInfo = dbInfo;
38976
+ dbInfo.serializer = localforageSerializer;
38977
+ return Promise$1.resolve();
38978
+ }
38979
+ function clear$2(callback) {
38980
+ var self2 = this;
38981
+ var promise = self2.ready().then(function() {
38982
+ var keyPrefix = self2._dbInfo.keyPrefix;
38983
+ for (var i3 = localStorage.length - 1; i3 >= 0; i3--) {
38984
+ var key2 = localStorage.key(i3);
38985
+ if (key2.indexOf(keyPrefix) === 0) {
38986
+ localStorage.removeItem(key2);
38987
+ }
38988
+ }
38989
+ });
38990
+ executeCallback(promise, callback);
38991
+ return promise;
38992
+ }
38993
+ function getItem$2(key2, callback) {
38994
+ var self2 = this;
38995
+ key2 = normalizeKey(key2);
38996
+ var promise = self2.ready().then(function() {
38997
+ var dbInfo = self2._dbInfo;
38998
+ var result = localStorage.getItem(dbInfo.keyPrefix + key2);
38999
+ if (result) {
39000
+ result = dbInfo.serializer.deserialize(result);
39001
+ }
39002
+ return result;
39003
+ });
39004
+ executeCallback(promise, callback);
39005
+ return promise;
39006
+ }
39007
+ function iterate$2(iterator, callback) {
39008
+ var self2 = this;
39009
+ var promise = self2.ready().then(function() {
39010
+ var dbInfo = self2._dbInfo;
39011
+ var keyPrefix = dbInfo.keyPrefix;
39012
+ var keyPrefixLength = keyPrefix.length;
39013
+ var length2 = localStorage.length;
39014
+ var iterationNumber = 1;
39015
+ for (var i3 = 0; i3 < length2; i3++) {
39016
+ var key2 = localStorage.key(i3);
39017
+ if (key2.indexOf(keyPrefix) !== 0) {
39018
+ continue;
39019
+ }
39020
+ var value = localStorage.getItem(key2);
39021
+ if (value) {
39022
+ value = dbInfo.serializer.deserialize(value);
39023
+ }
39024
+ value = iterator(value, key2.substring(keyPrefixLength), iterationNumber++);
39025
+ if (value !== void 0) {
39026
+ return value;
39027
+ }
39028
+ }
39029
+ });
39030
+ executeCallback(promise, callback);
39031
+ return promise;
39032
+ }
39033
+ function key$2(n2, callback) {
39034
+ var self2 = this;
39035
+ var promise = self2.ready().then(function() {
39036
+ var dbInfo = self2._dbInfo;
39037
+ var result;
39038
+ try {
39039
+ result = localStorage.key(n2);
39040
+ } catch (error) {
39041
+ result = null;
39042
+ }
39043
+ if (result) {
39044
+ result = result.substring(dbInfo.keyPrefix.length);
39045
+ }
39046
+ return result;
39047
+ });
39048
+ executeCallback(promise, callback);
39049
+ return promise;
39050
+ }
39051
+ function keys$2(callback) {
39052
+ var self2 = this;
39053
+ var promise = self2.ready().then(function() {
39054
+ var dbInfo = self2._dbInfo;
39055
+ var length2 = localStorage.length;
39056
+ var keys2 = [];
39057
+ for (var i3 = 0; i3 < length2; i3++) {
39058
+ var itemKey = localStorage.key(i3);
39059
+ if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {
39060
+ keys2.push(itemKey.substring(dbInfo.keyPrefix.length));
39061
+ }
39062
+ }
39063
+ return keys2;
39064
+ });
39065
+ executeCallback(promise, callback);
39066
+ return promise;
39067
+ }
39068
+ function length$2(callback) {
39069
+ var self2 = this;
39070
+ var promise = self2.keys().then(function(keys2) {
39071
+ return keys2.length;
39072
+ });
39073
+ executeCallback(promise, callback);
39074
+ return promise;
39075
+ }
39076
+ function removeItem$2(key2, callback) {
39077
+ var self2 = this;
39078
+ key2 = normalizeKey(key2);
39079
+ var promise = self2.ready().then(function() {
39080
+ var dbInfo = self2._dbInfo;
39081
+ localStorage.removeItem(dbInfo.keyPrefix + key2);
39082
+ });
39083
+ executeCallback(promise, callback);
39084
+ return promise;
39085
+ }
39086
+ function setItem$2(key2, value, callback) {
39087
+ var self2 = this;
39088
+ key2 = normalizeKey(key2);
39089
+ var promise = self2.ready().then(function() {
39090
+ if (value === void 0) {
39091
+ value = null;
39092
+ }
39093
+ var originalValue = value;
39094
+ return new Promise$1(function(resolve, reject) {
39095
+ var dbInfo = self2._dbInfo;
39096
+ dbInfo.serializer.serialize(value, function(value2, error) {
39097
+ if (error) {
39098
+ reject(error);
39099
+ } else {
39100
+ try {
39101
+ localStorage.setItem(dbInfo.keyPrefix + key2, value2);
39102
+ resolve(originalValue);
39103
+ } catch (e2) {
39104
+ if (e2.name === "QuotaExceededError" || e2.name === "NS_ERROR_DOM_QUOTA_REACHED") {
39105
+ reject(e2);
39106
+ }
39107
+ reject(e2);
39108
+ }
39109
+ }
39110
+ });
39111
+ });
39112
+ });
39113
+ executeCallback(promise, callback);
39114
+ return promise;
39115
+ }
39116
+ function dropInstance$2(options, callback) {
39117
+ callback = getCallback.apply(this, arguments);
39118
+ options = typeof options !== "function" && options || {};
39119
+ if (!options.name) {
39120
+ var currentConfig = this.config();
39121
+ options.name = options.name || currentConfig.name;
39122
+ options.storeName = options.storeName || currentConfig.storeName;
39123
+ }
39124
+ var self2 = this;
39125
+ var promise;
39126
+ if (!options.name) {
39127
+ promise = Promise$1.reject("Invalid arguments");
39128
+ } else {
39129
+ promise = new Promise$1(function(resolve) {
39130
+ if (!options.storeName) {
39131
+ resolve(options.name + "/");
39132
+ } else {
39133
+ resolve(_getKeyPrefix(options, self2._defaultConfig));
39134
+ }
39135
+ }).then(function(keyPrefix) {
39136
+ for (var i3 = localStorage.length - 1; i3 >= 0; i3--) {
39137
+ var key2 = localStorage.key(i3);
39138
+ if (key2.indexOf(keyPrefix) === 0) {
39139
+ localStorage.removeItem(key2);
39140
+ }
39141
+ }
39142
+ });
39143
+ }
39144
+ executeCallback(promise, callback);
39145
+ return promise;
39146
+ }
39147
+ var localStorageWrapper = {
39148
+ _driver: "localStorageWrapper",
39149
+ _initStorage: _initStorage$2,
39150
+ _support: isLocalStorageValid(),
39151
+ iterate: iterate$2,
39152
+ getItem: getItem$2,
39153
+ setItem: setItem$2,
39154
+ removeItem: removeItem$2,
39155
+ clear: clear$2,
39156
+ length: length$2,
39157
+ key: key$2,
39158
+ keys: keys$2,
39159
+ dropInstance: dropInstance$2
39160
+ };
39161
+ var sameValue = function sameValue2(x3, y3) {
39162
+ return x3 === y3 || typeof x3 === "number" && typeof y3 === "number" && isNaN(x3) && isNaN(y3);
39163
+ };
39164
+ var includes = function includes2(array, searchElement) {
39165
+ var len = array.length;
39166
+ var i3 = 0;
39167
+ while (i3 < len) {
39168
+ if (sameValue(array[i3], searchElement)) {
39169
+ return true;
39170
+ }
39171
+ i3++;
39172
+ }
39173
+ return false;
39174
+ };
39175
+ var isArray = Array.isArray || function(arg) {
39176
+ return Object.prototype.toString.call(arg) === "[object Array]";
39177
+ };
39178
+ var DefinedDrivers = {};
39179
+ var DriverSupport = {};
39180
+ var DefaultDrivers = {
39181
+ INDEXEDDB: asyncStorage,
39182
+ WEBSQL: webSQLStorage,
39183
+ LOCALSTORAGE: localStorageWrapper
39184
+ };
39185
+ var DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];
39186
+ var OptionalDriverMethods = ["dropInstance"];
39187
+ var LibraryMethods = ["clear", "getItem", "iterate", "key", "keys", "length", "removeItem", "setItem"].concat(OptionalDriverMethods);
39188
+ var DefaultConfig = {
39189
+ description: "",
39190
+ driver: DefaultDriverOrder.slice(),
39191
+ name: "localforage",
39192
+ // Default DB size is _JUST UNDER_ 5MB, as it's the highest size
39193
+ // we can use without a prompt.
39194
+ size: 4980736,
39195
+ storeName: "keyvaluepairs",
39196
+ version: 1
39197
+ };
39198
+ function callWhenReady(localForageInstance, libraryMethod) {
39199
+ localForageInstance[libraryMethod] = function() {
39200
+ var _args = arguments;
39201
+ return localForageInstance.ready().then(function() {
39202
+ return localForageInstance[libraryMethod].apply(localForageInstance, _args);
39203
+ });
39204
+ };
39205
+ }
39206
+ function extend() {
39207
+ for (var i3 = 1; i3 < arguments.length; i3++) {
39208
+ var arg = arguments[i3];
39209
+ if (arg) {
39210
+ for (var _key in arg) {
39211
+ if (arg.hasOwnProperty(_key)) {
39212
+ if (isArray(arg[_key])) {
39213
+ arguments[0][_key] = arg[_key].slice();
39214
+ } else {
39215
+ arguments[0][_key] = arg[_key];
39216
+ }
39217
+ }
39218
+ }
39219
+ }
39220
+ }
39221
+ return arguments[0];
39222
+ }
39223
+ var LocalForage = (function() {
39224
+ function LocalForage2(options) {
39225
+ _classCallCheck(this, LocalForage2);
39226
+ for (var driverTypeKey in DefaultDrivers) {
39227
+ if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {
39228
+ var driver = DefaultDrivers[driverTypeKey];
39229
+ var driverName = driver._driver;
39230
+ this[driverTypeKey] = driverName;
39231
+ if (!DefinedDrivers[driverName]) {
39232
+ this.defineDriver(driver);
39233
+ }
39234
+ }
39235
+ }
39236
+ this._defaultConfig = extend({}, DefaultConfig);
39237
+ this._config = extend({}, this._defaultConfig, options);
39238
+ this._driverSet = null;
39239
+ this._initDriver = null;
39240
+ this._ready = false;
39241
+ this._dbInfo = null;
39242
+ this._wrapLibraryMethodsWithReady();
39243
+ this.setDriver(this._config.driver)["catch"](function() {
39244
+ });
39245
+ }
39246
+ LocalForage2.prototype.config = function config(options) {
39247
+ if ((typeof options === "undefined" ? "undefined" : _typeof(options)) === "object") {
39248
+ if (this._ready) {
39249
+ return new Error("Can't call config() after localforage has been used.");
39250
+ }
39251
+ for (var i3 in options) {
39252
+ if (i3 === "storeName") {
39253
+ options[i3] = options[i3].replace(/\W/g, "_");
39254
+ }
39255
+ if (i3 === "version" && typeof options[i3] !== "number") {
39256
+ return new Error("Database version must be a number.");
39257
+ }
39258
+ this._config[i3] = options[i3];
39259
+ }
39260
+ if ("driver" in options && options.driver) {
39261
+ return this.setDriver(this._config.driver);
39262
+ }
39263
+ return true;
39264
+ } else if (typeof options === "string") {
39265
+ return this._config[options];
39266
+ } else {
39267
+ return this._config;
39268
+ }
39269
+ };
39270
+ LocalForage2.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {
39271
+ var promise = new Promise$1(function(resolve, reject) {
39272
+ try {
39273
+ var driverName = driverObject._driver;
39274
+ var complianceError = new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");
39275
+ if (!driverObject._driver) {
39276
+ reject(complianceError);
39277
+ return;
39278
+ }
39279
+ var driverMethods = LibraryMethods.concat("_initStorage");
39280
+ for (var i3 = 0, len = driverMethods.length; i3 < len; i3++) {
39281
+ var driverMethodName = driverMethods[i3];
39282
+ var isRequired = !includes(OptionalDriverMethods, driverMethodName);
39283
+ if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== "function") {
39284
+ reject(complianceError);
39285
+ return;
39286
+ }
39287
+ }
39288
+ var configureMissingMethods = function configureMissingMethods2() {
39289
+ var methodNotImplementedFactory = function methodNotImplementedFactory2(methodName) {
39290
+ return function() {
39291
+ var error = new Error("Method " + methodName + " is not implemented by the current driver");
39292
+ var promise2 = Promise$1.reject(error);
39293
+ executeCallback(promise2, arguments[arguments.length - 1]);
39294
+ return promise2;
39295
+ };
39296
+ };
39297
+ for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {
39298
+ var optionalDriverMethod = OptionalDriverMethods[_i];
39299
+ if (!driverObject[optionalDriverMethod]) {
39300
+ driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);
39301
+ }
39302
+ }
39303
+ };
39304
+ configureMissingMethods();
39305
+ var setDriverSupport = function setDriverSupport2(support) {
39306
+ if (DefinedDrivers[driverName]) {
39307
+ console.info("Redefining LocalForage driver: " + driverName);
39308
+ }
39309
+ DefinedDrivers[driverName] = driverObject;
39310
+ DriverSupport[driverName] = support;
39311
+ resolve();
39312
+ };
39313
+ if ("_support" in driverObject) {
39314
+ if (driverObject._support && typeof driverObject._support === "function") {
39315
+ driverObject._support().then(setDriverSupport, reject);
39316
+ } else {
39317
+ setDriverSupport(!!driverObject._support);
39318
+ }
39319
+ } else {
39320
+ setDriverSupport(true);
39321
+ }
39322
+ } catch (e2) {
39323
+ reject(e2);
39324
+ }
39325
+ });
39326
+ executeTwoCallbacks(promise, callback, errorCallback);
39327
+ return promise;
39328
+ };
39329
+ LocalForage2.prototype.driver = function driver() {
39330
+ return this._driver || null;
39331
+ };
39332
+ LocalForage2.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {
39333
+ var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error("Driver not found."));
39334
+ executeTwoCallbacks(getDriverPromise, callback, errorCallback);
39335
+ return getDriverPromise;
39336
+ };
39337
+ LocalForage2.prototype.getSerializer = function getSerializer(callback) {
39338
+ var serializerPromise = Promise$1.resolve(localforageSerializer);
39339
+ executeTwoCallbacks(serializerPromise, callback);
39340
+ return serializerPromise;
39341
+ };
39342
+ LocalForage2.prototype.ready = function ready(callback) {
39343
+ var self2 = this;
39344
+ var promise = self2._driverSet.then(function() {
39345
+ if (self2._ready === null) {
39346
+ self2._ready = self2._initDriver();
39347
+ }
39348
+ return self2._ready;
39349
+ });
39350
+ executeTwoCallbacks(promise, callback, callback);
39351
+ return promise;
39352
+ };
39353
+ LocalForage2.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {
39354
+ var self2 = this;
39355
+ if (!isArray(drivers)) {
39356
+ drivers = [drivers];
39357
+ }
39358
+ var supportedDrivers = this._getSupportedDrivers(drivers);
39359
+ function setDriverToConfig() {
39360
+ self2._config.driver = self2.driver();
39361
+ }
39362
+ function extendSelfWithDriver(driver) {
39363
+ self2._extend(driver);
39364
+ setDriverToConfig();
39365
+ self2._ready = self2._initStorage(self2._config);
39366
+ return self2._ready;
39367
+ }
39368
+ function initDriver(supportedDrivers2) {
39369
+ return function() {
39370
+ var currentDriverIndex = 0;
39371
+ function driverPromiseLoop() {
39372
+ while (currentDriverIndex < supportedDrivers2.length) {
39373
+ var driverName = supportedDrivers2[currentDriverIndex];
39374
+ currentDriverIndex++;
39375
+ self2._dbInfo = null;
39376
+ self2._ready = null;
39377
+ return self2.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop);
39378
+ }
39379
+ setDriverToConfig();
39380
+ var error = new Error("No available storage method found.");
39381
+ self2._driverSet = Promise$1.reject(error);
39382
+ return self2._driverSet;
39383
+ }
39384
+ return driverPromiseLoop();
39385
+ };
39386
+ }
39387
+ var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"](function() {
39388
+ return Promise$1.resolve();
39389
+ }) : Promise$1.resolve();
39390
+ this._driverSet = oldDriverSetDone.then(function() {
39391
+ var driverName = supportedDrivers[0];
39392
+ self2._dbInfo = null;
39393
+ self2._ready = null;
39394
+ return self2.getDriver(driverName).then(function(driver) {
39395
+ self2._driver = driver._driver;
39396
+ setDriverToConfig();
39397
+ self2._wrapLibraryMethodsWithReady();
39398
+ self2._initDriver = initDriver(supportedDrivers);
39399
+ });
39400
+ })["catch"](function() {
39401
+ setDriverToConfig();
39402
+ var error = new Error("No available storage method found.");
39403
+ self2._driverSet = Promise$1.reject(error);
39404
+ return self2._driverSet;
39405
+ });
39406
+ executeTwoCallbacks(this._driverSet, callback, errorCallback);
39407
+ return this._driverSet;
39408
+ };
39409
+ LocalForage2.prototype.supports = function supports(driverName) {
39410
+ return !!DriverSupport[driverName];
39411
+ };
39412
+ LocalForage2.prototype._extend = function _extend(libraryMethodsAndProperties) {
39413
+ extend(this, libraryMethodsAndProperties);
39414
+ };
39415
+ LocalForage2.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {
39416
+ var supportedDrivers = [];
39417
+ for (var i3 = 0, len = drivers.length; i3 < len; i3++) {
39418
+ var driverName = drivers[i3];
39419
+ if (this.supports(driverName)) {
39420
+ supportedDrivers.push(driverName);
39421
+ }
39422
+ }
39423
+ return supportedDrivers;
39424
+ };
39425
+ LocalForage2.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {
39426
+ for (var i3 = 0, len = LibraryMethods.length; i3 < len; i3++) {
39427
+ callWhenReady(this, LibraryMethods[i3]);
39428
+ }
39429
+ };
39430
+ LocalForage2.prototype.createInstance = function createInstance(options) {
39431
+ return new LocalForage2(options);
39432
+ };
39433
+ return LocalForage2;
39434
+ })();
39435
+ var localforage_js = new LocalForage();
39436
+ module3.exports = localforage_js;
39437
+ }, { "3": 3 }] }, {}, [4])(4);
39438
+ });
39439
+ })(localforage$1);
39440
+ return localforage$1.exports;
39441
+ }
39442
+ var localforageExports = requireLocalforage();
39443
+ const localforage = /* @__PURE__ */ getDefaultExportFromCjs(localforageExports);
39444
+ const CACHE_TTL = 7 * 24 * 60 * 60 * 1e3;
39445
+ const cacheStore = localforage.createInstance({
39446
+ name: "IMCache",
39447
+ storeName: "messages"
39448
+ });
39449
+ function _buildKey(userID, type, conversationID) {
39450
+ if (type === "messages" && conversationID) {
39451
+ return `msg_${userID}_${conversationID}`;
39452
+ }
39453
+ return `cvs_${userID}`;
39454
+ }
39455
+ async function saveConversations(userID, list) {
39456
+ if (!userID || !list) return;
39457
+ try {
39458
+ const key = _buildKey(userID, "conversations");
39459
+ const data = {
39460
+ list,
39461
+ timestamp: Date.now()
39462
+ };
39463
+ await cacheStore.setItem(key, data);
39464
+ } catch {
39465
+ }
39466
+ }
39467
+ async function loadConversations(userID) {
39468
+ if (!userID) return null;
39469
+ try {
39470
+ const key = _buildKey(userID, "conversations");
39471
+ const data = await cacheStore.getItem(key);
39472
+ if (!data || !data.list) return null;
39473
+ if (Date.now() - data.timestamp > CACHE_TTL) {
39474
+ await cacheStore.removeItem(key);
39475
+ return null;
39476
+ }
39477
+ return data.list;
39478
+ } catch {
39479
+ return null;
39480
+ }
39481
+ }
39482
+ async function saveMessages(userID, conversationID, list) {
39483
+ if (!userID || !conversationID || !list) return;
39484
+ try {
39485
+ const key = _buildKey(userID, "messages", conversationID);
39486
+ const data = {
39487
+ list,
39488
+ timestamp: Date.now()
39489
+ };
39490
+ await cacheStore.setItem(key, data);
39491
+ } catch {
39492
+ }
39493
+ }
39494
+ async function loadMessages(userID, conversationID) {
39495
+ if (!userID || !conversationID) return null;
39496
+ try {
39497
+ const key = _buildKey(userID, "messages", conversationID);
39498
+ const data = await cacheStore.getItem(key);
39499
+ if (!data || !data.list) return null;
39500
+ if (Date.now() - data.timestamp > CACHE_TTL) {
39501
+ await cacheStore.removeItem(key);
39502
+ return null;
39503
+ }
39504
+ return data.list;
39505
+ } catch {
39506
+ return null;
39507
+ }
39508
+ }
39509
+ async function clearCache(userID) {
39510
+ if (!userID) return;
39511
+ try {
39512
+ const cvsKey = _buildKey(userID, "conversations");
39513
+ await cacheStore.removeItem(cvsKey);
39514
+ const keys = await cacheStore.keys();
39515
+ const msgPrefix = `msg_${userID}_`;
39516
+ for (const key of keys) {
39517
+ if (key.startsWith(msgPrefix)) {
39518
+ await cacheStore.removeItem(key);
39519
+ }
39520
+ }
39521
+ } catch {
39522
+ }
39523
+ }
39524
+ function useMessageCache() {
39525
+ const chatMessage = useChatStore();
39526
+ function _getUserID() {
39527
+ return chatMessage.userID || "";
39528
+ }
39529
+ async function loadConversationsFromCache() {
39530
+ const userID = _getUserID();
39531
+ if (!userID) return null;
39532
+ try {
39533
+ const list = await loadConversations(userID);
39534
+ if (list && Array.isArray(list) && list.length > 0) {
39535
+ console.log(
39536
+ `[MessageCache] Loaded ${list.length} conversations from IndexedDB cache`
39537
+ );
39538
+ return { list };
39539
+ }
39540
+ return null;
39541
+ } catch (e2) {
39542
+ console.warn("[MessageCache] Failed to load conversations from cache:", e2);
39543
+ return null;
39544
+ }
39545
+ }
39546
+ async function saveConversationsToCache(list) {
39547
+ const userID = _getUserID();
39548
+ if (!userID || !Array.isArray(list)) return;
39549
+ try {
39550
+ await saveConversations(userID, list);
39551
+ console.log(`[MessageCache] Saved ${list.length} conversations to IndexedDB cache`);
39552
+ } catch (e2) {
39553
+ console.warn("[MessageCache] Failed to save conversations:", e2);
39554
+ }
39555
+ }
39556
+ async function loadMessagesFromCache(conversationID) {
39557
+ const userID = _getUserID();
39558
+ if (!userID || !conversationID) return null;
39559
+ try {
39560
+ const list = await loadMessages(userID, conversationID);
39561
+ if (list && Array.isArray(list) && list.length > 0) {
39562
+ console.log(
39563
+ `[MessageCache] Loaded ${list.length} messages for ${conversationID} from IndexedDB cache`
39564
+ );
39565
+ return { list, conversationID };
39566
+ }
39567
+ return null;
39568
+ } catch (e2) {
39569
+ console.warn("[MessageCache] Failed to load messages from cache:", e2);
39570
+ return null;
39571
+ }
39572
+ }
39573
+ async function saveMessagesToCache(conversationID, list) {
39574
+ const userID = _getUserID();
39575
+ if (!userID || !conversationID || !Array.isArray(list)) return;
39576
+ try {
39577
+ await saveMessages(userID, conversationID, list);
39578
+ console.log(`[MessageCache] Saved ${list.length} messages for ${conversationID} to IndexedDB cache`);
39579
+ } catch (e2) {
39580
+ console.warn("[MessageCache] Failed to save messages:", e2);
39581
+ }
39582
+ }
39583
+ async function clearMessageCache() {
39584
+ const userID = _getUserID();
39585
+ if (!userID) return;
39586
+ try {
39587
+ await clearCache(userID);
39588
+ console.log("[MessageCache] Cleared all cache for user:", userID);
39589
+ } catch (e2) {
39590
+ console.warn("[MessageCache] Failed to clear cache:", e2);
39591
+ }
39592
+ }
39593
+ return {
39594
+ loadConversationsFromCache,
39595
+ saveConversationsToCache,
39596
+ loadMessagesFromCache,
39597
+ saveMessagesToCache,
39598
+ clearMessageCache
39599
+ };
39600
+ }
36946
39601
  const mittBus = mitt();
36947
39602
  const newMsgAudioUrl = "data:audio/mpeg;base64,SUQzAwAAAAAgAFRJVDMAAAAYAAAA1b6zpMvYssQoc2MuY2hpbmF6LmNvbSlUUFVCAAAAGAAAANW+s6TL2LLEKHNjLmNoaW5hei5jb20pV09BUgAAABcAANW+s6TL2LLEKHNjLmNoaW5hei5jb20pVEVOQwAAABgAAADVvrOky9iyxChzYy5jaGluYXouY29tKVRBTEIAAAAYAAAA1b6zpMvYssQoc2MuY2hpbmF6LmNvbSlUWUVSAAAABQAAADIwMjBUUEUyAAAAGAAAANW+s6TL2LLEKHNjLmNoaW5hei5jb20pVElUMgAAABgAAADVvrOky9iyxChzYy5jaGluYXouY29tKVRDT04AAAAYAAAA1b6zpMvYssQoc2MuY2hpbmF6LmNvbSlDT01NAAAAHAAAAGNoaQDVvrOky9iyxChzYy5jaGluYXouY29tKVRQRTEAAAAYAAAA1b6zpMvYssQoc2MuY2hpbmF6LmNvbSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJRDMEAAAAADYkVFhYWAAAAAsAAANUREFUADMwMDYAVFhYWAAAAAsAAANUSU1FADIxMzEAVFhYWAAAAAoAAANjb21tZW50AABQUklWAAA1OQAAWE1QADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQzIDc5LjE2MTIxMCwgMjAxNy8wOC8xMS0xMDoyODozNiAgICAgICAgIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgeG1sbnM6eG1wRE09Imh0dHA6Ly9ucy5hZG9iZS5jb20veG1wLzEuMC9EeW5hbWljTWVkaWEvIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6Y3JlYXRvckF0b209Imh0dHA6Ly9ucy5hZG9iZS5jb20vY3JlYXRvckF0b20vMS4wLyIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3YjdlYjE0OC03ZTllLTA3NDctYTNlNS05NzlmN2IzZTQ4ODEiCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImU4YTMzOWUyLWI5YjQtM2I5MC02OTFkLWMwZWMwMDAwMDAzZCIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjM2ZDgxZDUxLWYxM2QtMWQ0MS1hODYxLWIxZTlmZDEyMzgxOCIKICAgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMC0wNi0zMFQyMTozMTozNCswODowMCIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjAtMDYtMzBUMjE6MzE6MzQrMDg6MDAiCiAgIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUHJlbWllcmUgUHJvIENDIDIwMTguMCAoV2luZG93cykiCiAgIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTA2LTMwVDIxOjMxOjA0KzA4OjAwIgogICB4bXBETTphdWRpb1NhbXBsZVJhdGU9Ii0xIgogICB4bXBETTphdWRpb1NhbXBsZVR5cGU9IjE2SW50IgogICB4bXBETTphdWRpb0NoYW5uZWxUeXBlPSJTdGVyZW8iCiAgIHhtcERNOnN0YXJ0VGltZVNjYWxlPSIzMDAwMCIKICAgeG1wRE06c3RhcnRUaW1lU2FtcGxlU2l6ZT0iMTAwMSIKICAgZGM6Zm9ybWF0PSJNUDMiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0iZDEwNTQ1NzMtNjlmMS02Y2M2LTJhYTItNzk0ZDAwMDAwMDZhIgogICAgICBzdEV2dDp3aGVuPSIyMDIwLTA2LTMwVDIxOjMxOjM0KzA4OjAwIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQcmVtaWVyZSBQcm8gQ0MgMjAxOC4wIChXaW5kb3dzKSIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIvPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjIwYWNhNWE3LTAwMzQtNDM0OC05ZWQ4LTBlMWY3Y2IwOGVhZCIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMC0wNi0zMFQyMTozMTozNCswODowMCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUHJlbWllcmUgUHJvIENDIDIwMTguMCAoV2luZG93cykiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmYxY2M1NmItMmUyMS1kMTRlLThhMGEtYTZlYWVjY2ZjODVmIgogICAgICBzdEV2dDp3aGVuPSIyMDIwLTA2LTMwVDIxOjMxOjM0KzA4OjAwIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQcmVtaWVyZSBQcm8gQ0MgMjAxOC4wIChXaW5kb3dzKSIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIvPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3YjdlYjE0OC03ZTllLTA3NDctYTNlNS05NzlmN2IzZTQ4ODEiCiAgICAgIHN0RXZ0OndoZW49IjIwMjAtMDYtMzBUMjE6MzE6MzQrMDg6MDAiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFByZW1pZXJlIFBybyBDQyAyMDE4LjAgKFdpbmRvd3MpIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvbWV0YWRhdGEiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogICA8eG1wTU06SW5ncmVkaWVudHM+CiAgICA8cmRmOkJhZz4KICAgICA8cmRmOmxpCiAgICAgIHN0UmVmOmluc3RhbmNlSUQ9IjBmODZjODFiLTgxYzAtOTY2Mi1lNGZlLTcyOTMwMDAwMDA2YSIKICAgICAgc3RSZWY6ZG9jdW1lbnRJRD0iZjNjYTE3ZDItZjhlNi1lNjY1LTMyZmEtYTI3ZDAwMDAwMDNkIgogICAgICBzdFJlZjpmcm9tUGFydD0idGltZTo1MDU1NzM4NjQ5NTBmMjU0MDE2MDAwMDAwZDIwOTIwMjk3ODYwMGYyNTQwMTYwMDAwMDAiCiAgICAgIHN0UmVmOnRvUGFydD0idGltZTowZDIwOTIwMjk3ODYwMGYyNTQwMTYwMDAwMDAiCiAgICAgIHN0UmVmOmZpbGVQYXRoPSLlvq7kv6HmnaXkv6Hmga8ubXA0IgogICAgICBzdFJlZjptYXNrTWFya2Vycz0iTm9uZSIvPgogICAgPC9yZGY6QmFnPgogICA8L3htcE1NOkluZ3JlZGllbnRzPgogICA8eG1wTU06UGFudHJ5PgogICAgPHJkZjpCYWc+CiAgICAgPHJkZjpsaT4KICAgICAgPHJkZjpEZXNjcmlwdGlvbgogICAgICAgeG1wOkNyZWF0ZURhdGU9IjE5MDQtMDEtMDFUMDA6MDBaIgogICAgICAgeG1wOk1vZGlmeURhdGU9IjIwMjAtMDYtMzBUMjE6MzA6MzQrMDg6MDAiCiAgICAgICB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTA2LTMwVDIxOjMwOjM0KzA4OjAwIgogICAgICAgeG1wRE06bG9nQ29tbWVudD0i5pys6KeG6aKR55Sx5rmW5Y2X5LiA5ZSv5L+h5oGv56eR5oqA5byA5Y+R55qERVblvZXlsY/ova/ku7blvZXliLbvvIx3d3cuaWV3YXkuY24iCiAgICAgICB4bXBNTTpJbnN0YW5jZUlEPSIwZjg2YzgxYi04MWMwLTk2NjItZTRmZS03MjkzMDAwMDAwNmEiCiAgICAgICB4bXBNTTpEb2N1bWVudElEPSJmM2NhMTdkMi1mOGU2LWU2NjUtMzJmYS1hMjdkMDAwMDAwM2QiCiAgICAgICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6OTk4YTUwOGUtY2IxMC01ODQ1LWI3YmItYzBhMTg2Yjk5YmJkIj4KICAgICAgPHhtcERNOmR1cmF0aW9uCiAgICAgICB4bXBETTp2YWx1ZT0iMTAyMTkiCiAgICAgICB4bXBETTpzY2FsZT0iMS8xMDAwIi8+CiAgICAgIDxkYzp0aXRsZT4KICAgICAgIDxyZGY6QWx0PgogICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+RVblvZXlsY8zLjkuN+i9r+S7tuW9leWItjwvcmRmOmxpPgogICAgICAgPC9yZGY6QWx0PgogICAgICA8L2RjOnRpdGxlPgogICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgIDxyZGY6U2VxPgogICAgICAgIDxyZGY6bGkKICAgICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0iMGY4NmM4MWItODFjMC05NjYyLWU0ZmUtNzI5MzAwMDAwMDZhIgogICAgICAgICBzdEV2dDp3aGVuPSIyMDIwLTA2LTMwVDIxOjMwOjM0KzA4OjAwIgogICAgICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQcmVtaWVyZSBQcm8gQ0MgMjAxOC4wIChXaW5kb3dzKSIKICAgICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIvPgogICAgICAgPC9yZGY6U2VxPgogICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgIDwvcmRmOmxpPgogICAgPC9yZGY6QmFnPgogICA8L3htcE1NOlBhbnRyeT4KICAgPHhtcE1NOkRlcml2ZWRGcm9tCiAgICBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjIwYWNhNWE3LTAwMzQtNDM0OC05ZWQ4LTBlMWY3Y2IwOGVhZCIKICAgIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MjBhY2E1YTctMDAzNC00MzQ4LTllZDgtMGUxZjdjYjA4ZWFkIgogICAgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjIwYWNhNWE3LTAwMzQtNDM0OC05ZWQ4LTBlMWY3Y2IwOGVhZCIvPgogICA8Y3JlYXRvckF0b206d2luZG93c0F0b20KICAgIGNyZWF0b3JBdG9tOmV4dGVuc2lvbj0iLnBycHJvaiIKICAgIGNyZWF0b3JBdG9tOmludm9jYXRpb25GbGFncz0iL0wiCiAgICBjcmVhdG9yQXRvbTp1bmNQcm9qZWN0UGF0aD0iXFw/XEM6XFVzZXJzXEFkbWluaXN0cmF0b3JcRGVza3RvcFzpn7PmlYgucHJwcm9qIi8+CiAgIDxjcmVhdG9yQXRvbTptYWNBdG9tCiAgICBjcmVhdG9yQXRvbTphcHBsaWNhdGlvbkNvZGU9IjEzNDc0NDk0NTUiCiAgICBjcmVhdG9yQXRvbTppbnZvY2F0aW9uQXBwbGVFdmVudD0iMTEyOTQ2ODAxOCIvPgogICA8eG1wRE06cHJvamVjdFJlZgogICAgeG1wRE06dHlwZT0ibW92aWUiLz4KICAgPHhtcERNOmR1cmF0aW9uCiAgICB4bXBETTp2YWx1ZT0iMjQiCiAgICB4bXBETTpzY2FsZT0iMTAwMS8zMDAwMCIvPgogICA8eG1wRE06c3RhcnRUaW1lY29kZQogICAgeG1wRE06dGltZUZvcm1hdD0iMjk5N0Ryb3BUaW1lY29kZSIKICAgIHhtcERNOnRpbWVWYWx1ZT0iMDA7MDA7MDA7MDAiLz4KICAgPHhtcERNOmFsdFRpbWVjb2RlCiAgICB4bXBETTp0aW1lVmFsdWU9IjAwOzAwOzAwOzAwIgogICAgeG1wRE06dGltZUZvcm1hdD0iMjk5N0Ryb3BUaW1lY29kZSIvPgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg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R+ysrWhKgCe0AAAE////qEyAWeDSGdWZw2wAAAAAAA7PDy2vdviCQp8RAEQmECDyBc0BSO/M6dMN+qqSJlakAAgAYNLPMBcAqVkgNNRfSGxEAVUdCVoDEYqqM/kx96JCmFQDo5y2hvcRYcEUqljw70MeUb1TjyqNJFYy0te9HIr9amt56hKwQlBiAAOqUP+gJNVXC8qDUFX/yj2/T///9cUqAUFriUAu//uUZOiAAs400H1poAomobnNpAgBFw0hSfm8AkCqBqi/DDABgrUeDsQ1TEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tUZOSD8lwZSU8kYAAbgTk54YAAAWwBJwAAACAAAD/AAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZOGP8AAAf4AAAAgAAA/wAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV";
36948
39603
  let imInstance = null;
39604
+ let initPromise = null;
39605
+ let httpAuthBroken = false;
39606
+ let syncFinished = false;
39607
+ let syncWaiters = [];
39608
+ let conversationBusBound = false;
39609
+ let burnHandlerBound = false;
39610
+ const resolveSyncWaiters = (ok) => {
39611
+ syncFinished = true;
39612
+ const waiters = syncWaiters.splice(0);
39613
+ waiters.forEach((fn) => {
39614
+ try {
39615
+ fn(ok);
39616
+ } catch (error) {
39617
+ console.error("[IM] 同步回调执行失败:", error);
39618
+ }
39619
+ });
39620
+ };
39621
+ const resetSyncState = () => {
39622
+ syncFinished = false;
39623
+ syncWaiters = [];
39624
+ };
39625
+ const buildConversationFromMessage = (msg, selfUserID) => {
39626
+ if (!msg) return null;
39627
+ const conversationID = createCvsId(msg);
39628
+ if (!conversationID) return null;
39629
+ const isGroup = msg.sessionType === IM_CVS_TYPE.Group;
39630
+ const isSelfMsg = msg.msgFrom === 100 || msg.sendID === selfUserID;
39631
+ const peerID = isGroup ? "" : isSelfMsg ? msg.recvID : msg.sendID;
39632
+ return {
39633
+ conversationID,
39634
+ conversationType: msg.sessionType,
39635
+ userID: peerID,
39636
+ groupID: isGroup ? msg.groupID : "",
39637
+ showName: isGroup ? msg.groupID : !isSelfMsg && msg.senderNickname || peerID,
39638
+ faceURL: isGroup ? "" : !isSelfMsg && msg.senderFaceUrl || "",
39639
+ recvMsgOpt: 0,
39640
+ unreadCount: isSelfMsg ? 0 : 1,
39641
+ groupAtType: 0,
39642
+ latestMsg: JSON.stringify({ ...msg, conversationID }),
39643
+ latestMsgSendTime: msg.sendTime || msg.createTime || Date.now(),
39644
+ draftText: "",
39645
+ draftTextTime: 0,
39646
+ burnDuration: 0,
39647
+ msgDestructTime: 0,
39648
+ isPinned: false,
39649
+ isPrivateChat: false,
39650
+ isMsgDestruct: false,
39651
+ attachedInfo: "",
39652
+ ex: "",
39653
+ // 标记为「本地兜底构造」:服务端会话列表刷新时要保留,避免刚出现的会话被网络列表冲掉
39654
+ isLocalFallback: true
39655
+ };
39656
+ };
39657
+ const TOKEN_ERROR_CODES = [1501, 1502, 1503, 1504, 1505, 1506, 1507];
39658
+ const TOKEN_ERROR_TEXT = /Token(NotExist|Kicked|Expired|Invalid|Malformed|Unknown|NotValidYet)/i;
39659
+ const isTokenInvalidError = (error) => {
39660
+ if (!error) return false;
39661
+ if (TOKEN_ERROR_CODES.includes(error.errCode)) return true;
39662
+ return TOKEN_ERROR_TEXT.test(String(error.errMsg || error.message || ""));
39663
+ };
39664
+ let unhandledRejectionBound = false;
39665
+ const bindUnhandledRejection = (onTokenError) => {
39666
+ if (unhandledRejectionBound || typeof window === "undefined") return;
39667
+ unhandledRejectionBound = true;
39668
+ window.addEventListener("unhandledrejection", (event) => {
39669
+ if (!isTokenInvalidError(event.reason)) return;
39670
+ event.preventDefault();
39671
+ onTokenError(event.reason);
39672
+ });
39673
+ };
39674
+ const waitForSyncFinish = (timeout = 8e3) => {
39675
+ if (syncFinished || (imInstance == null ? void 0 : imInstance.syncFinished)) return Promise.resolve(true);
39676
+ return new Promise((resolve) => {
39677
+ let timer = null;
39678
+ const done = (ok) => {
39679
+ if (timer) {
39680
+ clearTimeout(timer);
39681
+ timer = null;
39682
+ }
39683
+ resolve(ok);
39684
+ };
39685
+ syncWaiters.push(done);
39686
+ timer = setTimeout(() => {
39687
+ const index = syncWaiters.indexOf(done);
39688
+ if (index > -1) syncWaiters.splice(index, 1);
39689
+ console.warn(`[IM] 等待服务端同步超时(${timeout}ms),按兜底流程继续`);
39690
+ resolve(false);
39691
+ }, timeout);
39692
+ });
39693
+ };
36949
39694
  const useMessage = (config = {}) => {
36950
39695
  const messageStore = useChatStore();
36951
39696
  if (config.userID || config.apiUrl || config.imToken) {
@@ -36967,10 +39712,63 @@ const useMessage = (config = {}) => {
36967
39712
  updateConversationLatestMessage,
36968
39713
  getConversationIDBySessionType,
36969
39714
  getConversationByKey,
36970
- getCurrentConversation,
36971
39715
  clearConversationList
36972
39716
  } = useConversations();
36973
- const { updateMessageList, updateMessageIsRead, handleMessage, revokeMessage, updateMessageSenderInfo } = useMsgList();
39717
+ const {
39718
+ messageList: messageList2,
39719
+ updateMessageList,
39720
+ updateMessageIsRead,
39721
+ handleMessage,
39722
+ deleteMessageById,
39723
+ revokeMessage,
39724
+ updateMessageSenderInfo
39725
+ } = useMsgList();
39726
+ const { cancelAll: cancelAllBurns, onBurn } = useBurnAfterReading();
39727
+ const { loadMessagesFromCache, saveMessagesToCache } = useMessageCache();
39728
+ if (!burnHandlerBound) {
39729
+ burnHandlerBound = true;
39730
+ onBurn(async (conversationID, clientMsgID) => {
39731
+ var _a;
39732
+ if (!conversationID || !clientMsgID) return;
39733
+ const inCurrentList = messageList2.value.some((item) => item.clientMsgID === clientMsgID);
39734
+ if (inCurrentList) deleteMessageById(clientMsgID);
39735
+ try {
39736
+ await (imInstance == null ? void 0 : imInstance.deleteMessage({ conversationID, clientMsgID }));
39737
+ } catch (error) {
39738
+ console.error("[IM] 删除焚毁消息失败:", error);
39739
+ }
39740
+ if (inCurrentList) {
39741
+ const rest = JSON.parse(JSON.stringify(messageList2.value));
39742
+ saveMessagesToCache(conversationID, rest);
39743
+ const latest = rest[rest.length - 1];
39744
+ updateConversationLatestMessage(conversationID, latest || {}, latest ? handleMessage(latest) : "");
39745
+ return;
39746
+ }
39747
+ try {
39748
+ const cached = await loadMessagesFromCache(conversationID);
39749
+ if ((_a = cached == null ? void 0 : cached.list) == null ? void 0 : _a.length) {
39750
+ const rest = cached.list.filter((item) => item.clientMsgID !== clientMsgID);
39751
+ saveMessagesToCache(conversationID, rest);
39752
+ }
39753
+ } catch (error) {
39754
+ console.warn("[IM] 清理焚毁消息缓存失败:", error);
39755
+ }
39756
+ });
39757
+ }
39758
+ if (!conversationBusBound) {
39759
+ conversationBusBound = true;
39760
+ mittBus.on("OnConversationChanged", (data) => {
39761
+ var _a;
39762
+ if (!(data == null ? void 0 : data.conversationID)) return;
39763
+ const inx = conversationList2.value.findIndex((item) => item.conversationID === data.conversationID);
39764
+ if (inx > -1) {
39765
+ conversationList2.value[inx] = { ...conversationList2.value[inx], ...data };
39766
+ }
39767
+ if (((_a = currentConversation2.value) == null ? void 0 : _a.conversationID) === data.conversationID) {
39768
+ currentConversation2.value = { ...currentConversation2.value, ...data };
39769
+ }
39770
+ });
39771
+ }
36974
39772
  const getUnReadMessageCount = async (bool = false) => {
36975
39773
  if (bool) {
36976
39774
  if (!imInstance) return;
@@ -36985,38 +39783,139 @@ const useMessage = (config = {}) => {
36985
39783
  }
36986
39784
  };
36987
39785
  const setConversationMsgAsRead = async (id) => {
39786
+ var _a;
36988
39787
  if (!imInstance) return;
36989
39788
  if (!messageStore.getIsFocused) return;
36990
39789
  const cvsId = id || currentConversation2.value.conversationID;
36991
39790
  if (!cvsId) return;
36992
- const cvs = getCurrentConversation(cvsId) || currentConversation2.value;
36993
- if (cvs.unreadCount === 0) return;
39791
+ const inx = conversationList2.value.findIndex((item) => item.conversationID === cvsId);
39792
+ if (inx > -1 && conversationList2.value[inx].unreadCount > 0) {
39793
+ conversationList2.value[inx] = { ...conversationList2.value[inx], unreadCount: 0 };
39794
+ }
39795
+ if (((_a = currentConversation2.value) == null ? void 0 : _a.conversationID) === cvsId && currentConversation2.value.unreadCount > 0) {
39796
+ currentConversation2.value = { ...currentConversation2.value, unreadCount: 0 };
39797
+ }
39798
+ if (inx > -1) getUnReadMessageCount();
36994
39799
  const bool = await (imInstance == null ? void 0 : imInstance.setConversationMsgAsRead(cvsId));
39800
+ if (!bool) {
39801
+ console.warn("[IM] 会话已读上报失败(本地未读已清零):", cvsId);
39802
+ }
36995
39803
  return bool;
36996
39804
  };
36997
- const initIMSDK = async () => {
39805
+ const initIMSDK = async (force = false) => {
39806
+ if (initPromise) return initPromise;
39807
+ const sameSession = !force && !!imInstance && messageStore.loginStatus === IM_LOGIN_STATUS.Logged && imInstance.userID === String(messageStore.userID || "") && imInstance.imToken === messageStore.imToken && imInstance.apiUrl === `${messageStore.apiUrl}/imapi` && imInstance.wsUrl === `${messageStore.wsUrl}/imws`;
39808
+ if (sameSession) {
39809
+ window["imInstance"] = imInstance;
39810
+ return true;
39811
+ }
39812
+ initPromise = (async () => {
39813
+ if (messageStore.loginStatus === IM_LOGIN_STATUS.Logged) {
39814
+ await clearInstance();
39815
+ }
39816
+ resetSyncState();
39817
+ if (!imInstance) {
39818
+ imInstance = new ImKit({
39819
+ userID: messageStore.userID,
39820
+ imToken: messageStore.imToken,
39821
+ chatToken: messageStore.chatToken,
39822
+ apiUrl: messageStore.apiUrl,
39823
+ wsUrl: messageStore.wsUrl
39824
+ });
39825
+ } else {
39826
+ imInstance.userID = String(messageStore.userID || "");
39827
+ imInstance.imToken = messageStore.imToken;
39828
+ imInstance.chatToken = messageStore.chatToken;
39829
+ imInstance.apiUrl = `${messageStore.apiUrl}/imapi`;
39830
+ imInstance.wsUrl = `${messageStore.wsUrl}/imws`;
39831
+ }
39832
+ imInstance == null ? void 0 : imInstance.initSDK();
39833
+ bindMessageEvent();
39834
+ const loginOk = await (imInstance == null ? void 0 : imInstance.login());
39835
+ if (loginOk !== false) httpAuthBroken = false;
39836
+ window["imInstance"] = imInstance;
39837
+ return loginOk !== false;
39838
+ })();
39839
+ try {
39840
+ return await initPromise;
39841
+ } finally {
39842
+ initPromise = null;
39843
+ }
39844
+ };
39845
+ let reloginTimer = null;
39846
+ let reloginAttempts = 0;
39847
+ let tokenInvalidNotified = false;
39848
+ let recoveredToken = "";
39849
+ const MAX_RELOGIN_ATTEMPTS = 3;
39850
+ const tryRelogin = () => {
39851
+ const token = messageStore.imToken || "";
39852
+ if (token && token !== recoveredToken) {
39853
+ reloginAttempts = 0;
39854
+ tokenInvalidNotified = false;
39855
+ }
39856
+ if (reloginTimer) return;
39857
+ if (reloginAttempts >= MAX_RELOGIN_ATTEMPTS) {
39858
+ console.error("[IM] token 已失效且自动重新登录未成功,请重新登录");
39859
+ notifyTokenInvalid({ errMsg: "auto relogin exhausted" });
39860
+ return;
39861
+ }
39862
+ reloginTimer = setTimeout(async () => {
39863
+ reloginTimer = null;
39864
+ reloginAttempts += 1;
39865
+ console.warn(`[IM] token 已失效,自动重新登录(第 ${reloginAttempts} 次)`);
39866
+ const ok = await initIMSDK(true);
39867
+ if (!ok) {
39868
+ tryRelogin();
39869
+ return;
39870
+ }
39871
+ recoveredToken = messageStore.imToken || "";
39872
+ tokenInvalidNotified = false;
39873
+ try {
39874
+ await waitForSyncFinish(8e3);
39875
+ const list = await (imInstance == null ? void 0 : imInstance.getConversationListSplit(0, 200));
39876
+ if (list == null ? void 0 : list.length) {
39877
+ handleConversationList(list, "init", handleMessage);
39878
+ }
39879
+ mittBus.emit("IM_TOKEN_RECOVERED");
39880
+ } catch (error) {
39881
+ console.warn("[IM] 重新登录后刷新会话列表失败:", error);
39882
+ }
39883
+ }, 1e3);
39884
+ };
39885
+ let lastTokenWarnAt = 0;
39886
+ const notifyTokenInvalid = (error) => {
39887
+ httpAuthBroken = true;
39888
+ const now2 = Date.now();
39889
+ if (now2 - lastTokenWarnAt > 1e4) {
39890
+ lastTokenWarnAt = now2;
39891
+ console.warn(
39892
+ "[IM] token 已失效(接口返回 " + ((error == null ? void 0 : error.errMsg) || (error == null ? void 0 : error.errCode)) + "),等待宿主刷新 token 后重新登录"
39893
+ );
39894
+ }
39895
+ if (!tokenInvalidNotified) {
39896
+ tokenInvalidNotified = true;
39897
+ mittBus.emit("IM_TOKEN_INVALID");
39898
+ }
39899
+ };
39900
+ const handleImError = (error) => {
39901
+ if (!isTokenInvalidError(error)) return;
36998
39902
  if (messageStore.loginStatus === IM_LOGIN_STATUS.Logged) {
36999
- await clearInstance();
37000
- }
37001
- if (!imInstance) {
37002
- imInstance = new ImKit({
37003
- userID: messageStore.userID,
37004
- imToken: messageStore.imToken,
37005
- chatToken: messageStore.chatToken,
37006
- apiUrl: messageStore.apiUrl,
37007
- wsUrl: messageStore.wsUrl
37008
- });
39903
+ notifyTokenInvalid(error);
39904
+ return;
37009
39905
  }
37010
- imInstance == null ? void 0 : imInstance.initSDK();
37011
- bindMessageEvent();
37012
- await (imInstance == null ? void 0 : imInstance.login());
37013
- window["imInstance"] = imInstance;
39906
+ tokenInvalidNotified = false;
39907
+ tryRelogin();
37014
39908
  };
37015
39909
  const clearInstance = async (bool) => {
37016
39910
  unbindMessageEvent();
39911
+ cancelAllBurns();
37017
39912
  imInstance == null ? void 0 : imInstance.removeAllListeners();
37018
39913
  await (imInstance == null ? void 0 : imInstance.logout());
37019
39914
  imInstance == null ? void 0 : imInstance.clearSDK();
39915
+ if (imInstance) {
39916
+ imInstance.syncFinished = false;
39917
+ }
39918
+ resetSyncState();
37020
39919
  if (bool) {
37021
39920
  imInstance = null;
37022
39921
  window.imInstance = null;
@@ -37026,6 +39925,8 @@ const useMessage = (config = {}) => {
37026
39925
  };
37027
39926
  const bindMessageEvent = () => {
37028
39927
  if (!imInstance || !imInstance.on) return;
39928
+ imInstance.on("im-error", handleImError);
39929
+ bindUnhandledRejection(handleImError);
37029
39930
  imInstance.on(CbEvents.OnUserTokenExpired, () => {
37030
39931
  console.log("用户授权信息过期,重新登录");
37031
39932
  });
@@ -37090,14 +39991,22 @@ const useMessage = (config = {}) => {
37090
39991
  }
37091
39992
  });
37092
39993
  const resolveConversationIDs = async (list) => {
39994
+ var _a;
37093
39995
  for (let i3 = 0; i3 < list.length; i3++) {
37094
39996
  const item = list[i3];
37095
39997
  let cvsId = getConversationIDBySessionType(item, "sendID");
37096
39998
  if (!cvsId) {
37097
- const info = await (imInstance == null ? void 0 : imInstance.getOneConversation(
37098
- item.sessionType === IM_CVS_TYPE.Single ? item.sendID : item.groupID,
37099
- item == null ? void 0 : item.sessionType
37100
- ));
39999
+ let info = null;
40000
+ if (!httpAuthBroken) {
40001
+ try {
40002
+ info = await (imInstance == null ? void 0 : imInstance.getOneConversation(
40003
+ item.sessionType === IM_CVS_TYPE.Single ? item.sendID : item.groupID,
40004
+ item == null ? void 0 : item.sessionType
40005
+ ));
40006
+ } catch (error) {
40007
+ console.warn("[IM] 获取会话信息失败,改用消息数据兜底:", error);
40008
+ }
40009
+ }
37101
40010
  if (info == null ? void 0 : info.conversationID) {
37102
40011
  item.showName = info.showName;
37103
40012
  item.faceURL = info.faceURL;
@@ -37105,7 +40014,19 @@ const useMessage = (config = {}) => {
37105
40014
  cvsId = info.conversationID;
37106
40015
  handleConversationList([info], "add", handleMessage);
37107
40016
  if (info.ex) {
37108
- await (imInstance == null ? void 0 : imInstance.setConversation({ conversationID: cvsId, ex: "" }));
40017
+ const clearedEx = preserveBurnInEx("", info.ex);
40018
+ await (imInstance == null ? void 0 : imInstance.setConversation({ conversationID: cvsId, ex: clearedEx }));
40019
+ info.ex = clearedEx;
40020
+ }
40021
+ } else {
40022
+ const fallbackCvs = buildConversationFromMessage(item, (_a = messageStore.getUserInfo) == null ? void 0 : _a.userID);
40023
+ if (fallbackCvs) {
40024
+ cvsId = fallbackCvs.conversationID;
40025
+ item.showName = fallbackCvs.showName;
40026
+ item.faceURL = fallbackCvs.faceURL;
40027
+ item.unreadCount = fallbackCvs.unreadCount;
40028
+ handleConversationList([fallbackCvs], "add", handleMessage);
40029
+ console.warn("[IM] 会话信息获取失败,已用消息数据兜底展示会话:", cvsId);
37109
40030
  }
37110
40031
  }
37111
40032
  } else {
@@ -37115,6 +40036,26 @@ const useMessage = (config = {}) => {
37115
40036
  item.showMsgStr = handleMessage(item);
37116
40037
  }
37117
40038
  };
40039
+ const cacheFallbackMessages = async (msgs) => {
40040
+ var _a;
40041
+ const grouped = /* @__PURE__ */ new Map();
40042
+ msgs.forEach((item) => {
40043
+ if (!(item == null ? void 0 : item.conversationID)) return;
40044
+ const cvs = conversationList2.value.find((c2) => c2.conversationID === item.conversationID);
40045
+ if (!(cvs == null ? void 0 : cvs.isLocalFallback)) return;
40046
+ const arr = grouped.get(item.conversationID) || [];
40047
+ arr.push(item);
40048
+ grouped.set(item.conversationID, arr);
40049
+ });
40050
+ for (const [cvsID, items] of grouped) {
40051
+ try {
40052
+ const cached = ((_a = await loadMessagesFromCache(cvsID)) == null ? void 0 : _a.list) || [];
40053
+ saveMessagesToCache(cvsID, dedupeMessages([...cached, ...items]));
40054
+ } catch (error) {
40055
+ console.warn("[IM] 兜底会话消息写入缓存失败:", error);
40056
+ }
40057
+ }
40058
+ };
37118
40059
  const routeMessages = (list) => {
37119
40060
  const curMsgList = [];
37120
40061
  const cvs = currentConversation2.value;
@@ -37140,6 +40081,7 @@ const useMessage = (config = {}) => {
37140
40081
  console.log("批量接收消息:", list);
37141
40082
  if ((list == null ? void 0 : list.length) > 0) {
37142
40083
  await resolveConversationIDs(list);
40084
+ await cacheFallbackMessages(list);
37143
40085
  const curMsgList = routeMessages(list);
37144
40086
  if (curMsgList.length > 0) {
37145
40087
  const cvs = currentConversation2.value;
@@ -37181,6 +40123,20 @@ const useMessage = (config = {}) => {
37181
40123
  mittBus.emit("IM_LOGOUT");
37182
40124
  }
37183
40125
  });
40126
+ imInstance.on(CbEvents.OnSyncServerStart, () => {
40127
+ console.log("IM 服务端同步开始");
40128
+ syncFinished = false;
40129
+ });
40130
+ imInstance.on(CbEvents.OnSyncServerFinish, () => {
40131
+ console.log("IM 服务端同步完成");
40132
+ resolveSyncWaiters(true);
40133
+ mittBus.emit("IM_SYNC_SERVER_FINISH", true);
40134
+ });
40135
+ imInstance.on(CbEvents.OnSyncServerFailed, (data) => {
40136
+ console.warn("IM 服务端同步失败:", data);
40137
+ resolveSyncWaiters(false);
40138
+ mittBus.emit("IM_SYNC_SERVER_FINISH", false);
40139
+ });
37184
40140
  imInstance.on("im-error", async (err) => {
37185
40141
  });
37186
40142
  imInstance.on(CbEvents.OnConversationChanged, (data) => {
@@ -37263,6 +40219,7 @@ const useMessage = (config = {}) => {
37263
40219
  };
37264
40220
  const unbindMessageEvent = () => {
37265
40221
  if (!imInstance || !imInstance.off) return;
40222
+ imInstance.off("im-error");
37266
40223
  imInstance.off(CbEvents.OnUserTokenExpired);
37267
40224
  imInstance.off(CbEvents.OnSelfInfoUpdated);
37268
40225
  imInstance.off(CbEvents.OnUserStatusChanged);
@@ -37272,6 +40229,9 @@ const useMessage = (config = {}) => {
37272
40229
  imInstance.off(CbEvents.OnNewRecvMessageRevoked);
37273
40230
  imInstance.off("updateStatus");
37274
40231
  imInstance.off("im-error");
40232
+ imInstance.off(CbEvents.OnSyncServerStart);
40233
+ imInstance.off(CbEvents.OnSyncServerFinish);
40234
+ imInstance.off(CbEvents.OnSyncServerFailed);
37275
40235
  imInstance.off(CbEvents.OnConversationChanged);
37276
40236
  imInstance.off(CbEvents.OnNewConversation);
37277
40237
  imInstance.off(CbEvents.OnGroupInfoChanged);
@@ -37292,7 +40252,8 @@ const useMessage = (config = {}) => {
37292
40252
  initIMSDK,
37293
40253
  clearInstance,
37294
40254
  getUnReadMessageCount,
37295
- setConversationMsgAsRead
40255
+ setConversationMsgAsRead,
40256
+ waitForSyncFinish
37296
40257
  };
37297
40258
  };
37298
40259
  const _sfc_main = {
@@ -37340,7 +40301,7 @@ const _sfc_main = {
37340
40301
  {
37341
40302
  path: "/messages",
37342
40303
  name: "Messages",
37343
- component: () => import("./indexH5-BZ77bUNH.js"),
40304
+ component: () => import("./indexH5-CUQe-Ize.js"),
37344
40305
  meta: { title: "消息" }
37345
40306
  },
37346
40307
  // 根路径重定向到会话列表页
@@ -37351,61 +40312,61 @@ const _sfc_main = {
37351
40312
  {
37352
40313
  path: "/chat",
37353
40314
  name: "Chat",
37354
- component: () => import("./ChatPageH5-wyLGmPhW.js"),
40315
+ component: () => import("./ChatPageH5-B3azJu7O.js"),
37355
40316
  meta: { title: "聊天" }
37356
40317
  },
37357
40318
  {
37358
40319
  path: "/search",
37359
40320
  name: "Search",
37360
- component: () => import("./SearchPageH5-BiGhJF4U.js"),
40321
+ component: () => import("./SearchPageH5-hYxNItvz.js"),
37361
40322
  meta: { title: "搜索" }
37362
40323
  },
37363
40324
  {
37364
40325
  path: "/notice",
37365
40326
  name: "Notice",
37366
- component: () => import("./GroupNoticeH5-DVXrcmP9.js"),
40327
+ component: () => import("./GroupNoticeH5-46ZjBe92.js"),
37367
40328
  meta: { title: "群通知" }
37368
40329
  },
37369
40330
  {
37370
40331
  path: "/create-group",
37371
40332
  name: "CreateGroup",
37372
- component: () => import("./CreateGroupH5-3LIujy3_.js"),
40333
+ component: () => import("./CreateGroupH5-a16jkObH.js"),
37373
40334
  meta: { title: "创建群组" }
37374
40335
  },
37375
40336
  {
37376
40337
  path: "/select-members",
37377
40338
  name: "SelectMembers",
37378
- component: () => import("./SelectMembersH5-DbrSnTg3.js"),
40339
+ component: () => import("./SelectMembersH5-DQIfX_w4.js"),
37379
40340
  meta: { title: "成员选择" }
37380
40341
  },
37381
40342
  {
37382
40343
  path: "/member-detail",
37383
40344
  name: "MemberDetail",
37384
- component: () => import("./MemberDetailH5-DAVUVr30.js"),
40345
+ component: () => import("./MemberDetailH5-B7nlr8ZT.js"),
37385
40346
  meta: { title: "个人详情" }
37386
40347
  },
37387
40348
  {
37388
40349
  path: "/chat-settings",
37389
40350
  name: "ChatSettings",
37390
- component: () => import("./ChatSettingsH5-DD3dnI-H.js"),
40351
+ component: () => import("./ChatSettingsH5-CFr9Bn69.js"),
37391
40352
  meta: { title: "聊天设置" }
37392
40353
  },
37393
40354
  {
37394
40355
  path: "/group-announcement",
37395
40356
  name: "GroupAnnouncement",
37396
- component: () => import("./GroupAnnouncementH5-5EpXQs5V.js"),
40357
+ component: () => import("./GroupAnnouncementH5-B-Qfzoy2.js"),
37397
40358
  meta: { title: "群公告" }
37398
40359
  },
37399
40360
  {
37400
40361
  path: "/chat-history",
37401
40362
  name: "ChatHistory",
37402
- component: () => import("./ChatHistoryH5-Deqlnw3u.js"),
40363
+ component: () => import("./ChatHistoryH5-BhrGF5WR.js"),
37403
40364
  meta: { title: "聊天记录" }
37404
40365
  },
37405
40366
  {
37406
40367
  path: "/group-members",
37407
40368
  name: "GroupMembers",
37408
- component: () => import("./GroupMembersH5-DX2lxrLB.js"),
40369
+ component: () => import("./GroupMembersH5-D_f1RFjO.js"),
37409
40370
  meta: { title: "群成员" }
37410
40371
  }
37411
40372
  ];
@@ -37499,40 +40460,56 @@ const _sfc_main = {
37499
40460
  }
37500
40461
  };
37501
40462
  export {
37502
- handleDateUtil as A,
37503
- IM_GROUP_MEMBER_ROLE as B,
37504
- GROUP_VERIFICATION_TYPE as C,
37505
- IM_GROUP_TYPE as D,
37506
- copyToClipboard as E,
37507
- downloadFileByBlob as F,
37508
- GROUP_JOIN_SOURCE as G,
37509
- EXIT_CODE as H,
40463
+ useBurnAfterReading as A,
40464
+ dedupeMessages as B,
40465
+ getDefaultExportFromCjs as C,
40466
+ getMediaDuration as D,
40467
+ getReplyDetail as E,
40468
+ IM_FONT_FAMILY as F,
40469
+ IM_FONT_SIZE as G,
40470
+ IM_FONT_STYLE as H,
37510
40471
  IM_CVS_TYPE as I,
40472
+ IM_GROUP_STATUS as J,
40473
+ uuidv4 as K,
40474
+ debounce as L,
40475
+ handleDateUtil as M,
40476
+ GROUP_JOIN_SOURCE as N,
40477
+ IM_GROUP_MEMBER_ROLE as O,
40478
+ GROUP_VERIFICATION_TYPE as P,
40479
+ IM_GROUP_TYPE as Q,
40480
+ BURN_DEFAULT as R,
40481
+ BURN_PRESETS as S,
40482
+ formatBurnDuration as T,
40483
+ copyToClipboard as U,
40484
+ clampBurnDuration as V,
40485
+ buildBurnEx as W,
40486
+ downloadFileByBlob as X,
40487
+ EXIT_CODE as Y,
37511
40488
  _sfc_main as _,
37512
40489
  getAvatarBg as a,
37513
40490
  getAvatarText as b,
37514
40491
  cloneDeep as c,
37515
- useMessage as d,
37516
- useUsers as e,
37517
- useConversations as f,
40492
+ getConversationBurnSetting as d,
40493
+ useMessage as e,
40494
+ useUsers as f,
37518
40495
  getGroupAvatarBg as g,
37519
- useMsgList as h,
40496
+ useConversations as h,
37520
40497
  isDefaultAvatar as i,
37521
- IM_LOGIN_STATUS as j,
37522
- handleUrl as k,
40498
+ useMsgList as j,
40499
+ IM_LOGIN_STATUS as k,
37523
40500
  IM_LOGIN_PLATFORM as l,
37524
40501
  mittBus as m,
37525
- formatFileSize as n,
37526
- handleLinks as o,
37527
- IM_MSG_TYPE as p,
37528
- useDate as q,
37529
- getJsonDetail as r,
37530
- getReplyDetail as s,
37531
- IM_FONT_FAMILY as t,
40502
+ handleUrl as n,
40503
+ isNoticeAgentConversation as o,
40504
+ preserveBurnInEx as p,
40505
+ formatFileSize as q,
40506
+ handleLinks as r,
40507
+ sleep as s,
40508
+ IM_MSG_TYPE as t,
37532
40509
  useChatStore as u,
37533
- IM_FONT_SIZE as v,
37534
- IM_FONT_STYLE as w,
37535
- IM_GROUP_STATUS as x,
37536
- uuidv4 as y,
37537
- debounce as z
40510
+ useDate as v,
40511
+ isBurnMessage as w,
40512
+ formatBurnRemain as x,
40513
+ isBurned as y,
40514
+ getJsonDetail as z
37538
40515
  };