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
@@ -19,6 +19,9 @@ const CbEvents = {
19
19
  OnRecvGroupReadReceipt: "OnRecvGroupReadReceipt",
20
20
  OnConversationChanged: "OnConversationChanged",
21
21
  OnNewConversation: "OnNewConversation",
22
+ OnSyncServerFailed: "OnSyncServerFailed",
23
+ OnSyncServerFinish: "OnSyncServerFinish",
24
+ OnSyncServerStart: "OnSyncServerStart",
22
25
  OnTotalUnreadMessageCountChanged: "OnTotalUnreadMessageCountChanged",
23
26
  OnJoinedGroupAdded: "OnJoinedGroupAdded",
24
27
  OnJoinedGroupDeleted: "OnJoinedGroupDeleted",
@@ -9835,6 +9838,8 @@ class ImKit extends EventEmitter {
9835
9838
  // SDK实例
9836
9839
  __publicField(this, "isConnecting", false);
9837
9840
  // 是否在连接中
9841
+ __publicField(this, "syncFinished", false);
9842
+ // 登录后的服务端同步是否完成(同步完成前 SDK 本地会话缓存为空)
9838
9843
  __publicField(this, "loginStatus", IM_LOGIN_STATUS.Logout);
9839
9844
  // 1 未登录 2 登录中 3 已登录
9840
9845
  __publicField(this, "groupStatus", IM_GROUP_STATUS.Nomal);
@@ -9893,6 +9898,7 @@ class ImKit extends EventEmitter {
9893
9898
  console.log("请先初始化SDK");
9894
9899
  return false;
9895
9900
  }
9901
+ this.syncFinished = false;
9896
9902
  try {
9897
9903
  const res = await this.IMSDK.login(
9898
9904
  {
@@ -9905,8 +9911,8 @@ class ImKit extends EventEmitter {
9905
9911
  operationID
9906
9912
  );
9907
9913
  return !res.errMsg;
9908
- } catch (error2) {
9909
- console.error("登陆失败:", error2);
9914
+ } catch (error) {
9915
+ console.error("登陆失败:", error);
9910
9916
  return false;
9911
9917
  }
9912
9918
  }
@@ -9959,6 +9965,31 @@ class ImKit extends EventEmitter {
9959
9965
  this.IMSDK.off(CbEvents.OnUserTokenExpired);
9960
9966
  this.IMSDK.off(CbEvents.OnKickedOffline);
9961
9967
  }
9968
+ // 登录后服务端同步监听器
9969
+ // 登录回调 OnConnectSuccess 早于同步完成 OnSyncServerFinish,同步完成前 SDK 本地会话缓存为空,
9970
+ // 此时调用 getConversationListSplit 只会拿到空数组,因此需要把同步状态暴露给上层。
9971
+ bindSyncListener() {
9972
+ if (!this.IMSDK) return;
9973
+ this.IMSDK.on(CbEvents.OnSyncServerStart, () => {
9974
+ this.syncFinished = false;
9975
+ this.emit(CbEvents.OnSyncServerStart);
9976
+ });
9977
+ this.IMSDK.on(CbEvents.OnSyncServerFinish, () => {
9978
+ this.syncFinished = true;
9979
+ this.emit(CbEvents.OnSyncServerFinish);
9980
+ });
9981
+ this.IMSDK.on(CbEvents.OnSyncServerFailed, (data) => {
9982
+ this.syncFinished = true;
9983
+ this.emit(CbEvents.OnSyncServerFailed, data);
9984
+ });
9985
+ }
9986
+ // 解除服务端同步监听器
9987
+ unbindSyncListener() {
9988
+ if (!this.IMSDK) return;
9989
+ this.IMSDK.off(CbEvents.OnSyncServerStart);
9990
+ this.IMSDK.off(CbEvents.OnSyncServerFinish);
9991
+ this.IMSDK.off(CbEvents.OnSyncServerFailed);
9992
+ }
9962
9993
  // 用户信息监听器
9963
9994
  bindUserListener() {
9964
9995
  if (!this.IMSDK) return;
@@ -10092,6 +10123,7 @@ class ImKit extends EventEmitter {
10092
10123
  // 绑定事件
10093
10124
  bindEvent() {
10094
10125
  this.bindConnectListener();
10126
+ this.bindSyncListener();
10095
10127
  this.bindUserListener();
10096
10128
  this.bindMsgListener();
10097
10129
  this.bindConversationListener();
@@ -10100,6 +10132,7 @@ class ImKit extends EventEmitter {
10100
10132
  // 解绑事件
10101
10133
  unbindEvent() {
10102
10134
  this.unbindConnectListener();
10135
+ this.unbindSyncListener();
10103
10136
  this.unbindUserListener();
10104
10137
  this.unbindMsgListener();
10105
10138
  this.unbindConversationListener();
@@ -10117,8 +10150,8 @@ class ImKit extends EventEmitter {
10117
10150
  this.IMSDK.logout().then(() => {
10118
10151
  this.getLoginStatus();
10119
10152
  return true;
10120
- }).catch((error2) => {
10121
- console.log("IM登出异常:", error2);
10153
+ }).catch((error) => {
10154
+ console.log("IM登出异常:", error);
10122
10155
  return false;
10123
10156
  });
10124
10157
  }
@@ -10135,9 +10168,9 @@ class ImKit extends EventEmitter {
10135
10168
  this.loginStatus = res.data;
10136
10169
  this.updateLoginStatus();
10137
10170
  }
10138
- } catch (error2) {
10139
- console.log("获取登陆状态失败:", error2);
10140
- this.handleError(error2);
10171
+ } catch (error) {
10172
+ console.log("获取登陆状态失败:", error);
10173
+ this.handleError(error);
10141
10174
  }
10142
10175
  }
10143
10176
  // 更新登录状态
@@ -10145,8 +10178,8 @@ class ImKit extends EventEmitter {
10145
10178
  this.emit("updateStatus", this.loginStatus);
10146
10179
  }
10147
10180
  // 处理异常
10148
- handleError(error2) {
10149
- this.emit("im-error", error2);
10181
+ handleError(error) {
10182
+ this.emit("im-error", error);
10150
10183
  }
10151
10184
  /**
10152
10185
  * --------------------------------------用户相关-------------------------------------
@@ -10165,9 +10198,9 @@ class ImKit extends EventEmitter {
10165
10198
  try {
10166
10199
  const res = await ((_a = this.IMSDK) == null ? void 0 : _a.setSelfInfo(userInfo, operationID));
10167
10200
  return !res.errMsg;
10168
- } catch (error2) {
10169
- console.error("设置个人信息失败:", error2);
10170
- this.handleError(error2);
10201
+ } catch (error) {
10202
+ console.error("设置个人信息失败:", error);
10203
+ this.handleError(error);
10171
10204
  return null;
10172
10205
  }
10173
10206
  }
@@ -10182,9 +10215,9 @@ class ImKit extends EventEmitter {
10182
10215
  return res.data;
10183
10216
  }
10184
10217
  return null;
10185
- } catch (error2) {
10186
- console.error("获取当前登录用户ID失败:", error2);
10187
- this.handleError(error2);
10218
+ } catch (error) {
10219
+ console.error("获取当前登录用户ID失败:", error);
10220
+ this.handleError(error);
10188
10221
  return null;
10189
10222
  }
10190
10223
  }
@@ -10198,9 +10231,9 @@ class ImKit extends EventEmitter {
10198
10231
  return res.data;
10199
10232
  }
10200
10233
  return null;
10201
- } catch (error2) {
10202
- console.error("获取自己用户信息失败:", error2);
10203
- this.handleError(error2);
10234
+ } catch (error) {
10235
+ console.error("获取自己用户信息失败:", error);
10236
+ this.handleError(error);
10204
10237
  return null;
10205
10238
  }
10206
10239
  }
@@ -10217,9 +10250,9 @@ class ImKit extends EventEmitter {
10217
10250
  return res.data;
10218
10251
  }
10219
10252
  return [];
10220
- } catch (error2) {
10221
- console.error("获取用户信息失败:", error2);
10222
- this.handleError(error2);
10253
+ } catch (error) {
10254
+ console.error("获取用户信息失败:", error);
10255
+ this.handleError(error);
10223
10256
  return [];
10224
10257
  }
10225
10258
  }
@@ -10237,9 +10270,9 @@ class ImKit extends EventEmitter {
10237
10270
  return res.data;
10238
10271
  }
10239
10272
  return [];
10240
- } catch (error2) {
10241
- console.error("订阅用户的在线状态失败:", error2);
10242
- this.handleError(error2);
10273
+ } catch (error) {
10274
+ console.error("订阅用户的在线状态失败:", error);
10275
+ this.handleError(error);
10243
10276
  return [];
10244
10277
  }
10245
10278
  }
@@ -10256,9 +10289,9 @@ class ImKit extends EventEmitter {
10256
10289
  return res.data;
10257
10290
  }
10258
10291
  return [];
10259
- } catch (error2) {
10260
- console.error("取消订阅用户的在线状态失败:", error2);
10261
- this.handleError(error2);
10292
+ } catch (error) {
10293
+ console.error("取消订阅用户的在线状态失败:", error);
10294
+ this.handleError(error);
10262
10295
  return [];
10263
10296
  }
10264
10297
  }
@@ -10275,9 +10308,9 @@ class ImKit extends EventEmitter {
10275
10308
  return res.data;
10276
10309
  }
10277
10310
  return [];
10278
- } catch (error2) {
10279
- console.error("获取所有已订阅用户的在线状态失败:", error2);
10280
- this.handleError(error2);
10311
+ } catch (error) {
10312
+ console.error("获取所有已订阅用户的在线状态失败:", error);
10313
+ this.handleError(error);
10281
10314
  return [];
10282
10315
  }
10283
10316
  }
@@ -10295,9 +10328,9 @@ class ImKit extends EventEmitter {
10295
10328
  return res.data;
10296
10329
  }
10297
10330
  return [];
10298
- } catch (error2) {
10299
- console.error("获取我的好友列表失败:", error2);
10300
- this.handleError(error2);
10331
+ } catch (error) {
10332
+ console.error("获取我的好友列表失败:", error);
10333
+ this.handleError(error);
10301
10334
  return [];
10302
10335
  }
10303
10336
  }
@@ -10316,9 +10349,9 @@ class ImKit extends EventEmitter {
10316
10349
  operationID
10317
10350
  );
10318
10351
  return !res.errMsg;
10319
- } catch (error2) {
10320
- console.error("添加好友失败:", error2);
10321
- this.handleError(error2);
10352
+ } catch (error) {
10353
+ console.error("添加好友失败:", error);
10354
+ this.handleError(error);
10322
10355
  return null;
10323
10356
  }
10324
10357
  }
@@ -10337,9 +10370,9 @@ class ImKit extends EventEmitter {
10337
10370
  operationID
10338
10371
  );
10339
10372
  return !res.errMsg;
10340
- } catch (error2) {
10341
- console.error("同意好友申请失败:", error2);
10342
- this.handleError(error2);
10373
+ } catch (error) {
10374
+ console.error("同意好友申请失败:", error);
10375
+ this.handleError(error);
10343
10376
  return null;
10344
10377
  }
10345
10378
  }
@@ -10358,9 +10391,9 @@ class ImKit extends EventEmitter {
10358
10391
  try {
10359
10392
  const res = await ((_a = this.IMSDK) == null ? void 0 : _a.getConversationCount(operationID));
10360
10393
  return (res == null ? void 0 : res.data) || 0;
10361
- } catch (error2) {
10362
- console.error("获取会话总数失败:", error2);
10363
- this.handleError(error2);
10394
+ } catch (error) {
10395
+ console.error("获取会话总数失败:", error);
10396
+ this.handleError(error);
10364
10397
  return 0;
10365
10398
  }
10366
10399
  }
@@ -10380,31 +10413,62 @@ class ImKit extends EventEmitter {
10380
10413
  return res.data;
10381
10414
  }
10382
10415
  return null;
10383
- } catch (error2) {
10384
- console.error("获取单个会话信息失败:", error2);
10385
- this.handleError(error2);
10416
+ } catch (error) {
10417
+ console.error("获取单个会话信息失败:", error);
10418
+ this.handleError(error);
10386
10419
  return null;
10387
10420
  }
10388
10421
  }
10389
10422
  /**
10390
10423
  * 设置会话信息,消息免打扰,置顶、阅后即焚等操作
10424
+ * 只透传调用方显式传入的字段:避免未传 ex 时被默认空串覆盖,误清"手动标记未读/隐藏会话"等会话扩展
10391
10425
  * @param {Object} conversationID-会话ID,recvMsgOpt-会话消息免打扰状态,groupAtType-会话强提醒类型,isPinned-是否置顶,isPrivateChat-是否阅后即焚,burnDuration-阅后即焚时间,ex-扩展字段
10392
10426
  */
10393
- async setConversation({ conversationID, recvMsgOpt, groupAtType, burnDuration, isPinned, isPrivateChat, ex = "" }) {
10427
+ async setConversation({ conversationID, recvMsgOpt, groupAtType, burnDuration, isPinned, isPrivateChat, ex }) {
10428
+ if (!conversationID || !this.IMSDK) return false;
10394
10429
  try {
10395
- const res = await this.IMSDK.setConversation({
10430
+ const payload = { conversationID };
10431
+ if (recvMsgOpt !== void 0) payload.recvMsgOpt = recvMsgOpt;
10432
+ if (groupAtType !== void 0) payload.groupAtType = groupAtType;
10433
+ if (burnDuration !== void 0) payload.burnDuration = burnDuration;
10434
+ if (isPinned !== void 0) payload.isPinned = isPinned;
10435
+ if (isPrivateChat !== void 0) payload.isPrivateChat = isPrivateChat;
10436
+ if (ex !== void 0) payload.ex = ex;
10437
+ const res = await this.IMSDK.setConversation(payload);
10438
+ return !res.errMsg;
10439
+ } catch (error) {
10440
+ console.error("设置会话信息失败:", error);
10441
+ this.handleError(error);
10442
+ return false;
10443
+ }
10444
+ }
10445
+ /**
10446
+ * 设置会话阅后即焚(开关与时长必须一次性提交)
10447
+ * 只提交 isPrivateChat 而不提交 burnDuration,服务端可能按默认时长处理,出现"开关开了但消息永不销毁"的假成功;
10448
+ * 只提交 burnDuration 而会话仍是关闭态,则设置不生效。
10449
+ * @param {Object} param0
10450
+ * @param {String} param0.conversationID 会话 ID
10451
+ * @param {Boolean} param0.isPrivateChat 是否开启阅后即焚
10452
+ * @param {Number} param0.burnDuration 销毁倒计时(秒);关闭时强制为 0
10453
+ * @param {String} param0.ex 会话扩展字段(本客户端用它保存"我的阅后即焚设置",按用户隔离)
10454
+ * @returns {Promise<Boolean>}
10455
+ */
10456
+ async setPrivateChat({ conversationID, isPrivateChat, burnDuration, ex }) {
10457
+ if (!conversationID || !this.IMSDK) return false;
10458
+ const enable = !!isPrivateChat;
10459
+ const duration = enable ? Math.max(1, Math.floor(Number(burnDuration) || 0)) : 0;
10460
+ try {
10461
+ const payload = {
10396
10462
  conversationID,
10397
- recvMsgOpt,
10398
- groupAtType,
10399
- burnDuration,
10400
- isPinned,
10401
- isPrivateChat,
10402
- ex
10403
- });
10463
+ isPrivateChat: enable,
10464
+ burnDuration: duration
10465
+ };
10466
+ if (ex !== void 0) payload.ex = ex;
10467
+ const res = await this.IMSDK.setConversation(payload);
10404
10468
  return !res.errMsg;
10405
- } catch (error2) {
10406
- console.error("会话置顶失败:", error2);
10407
- this.handleError(error2);
10469
+ } catch (error) {
10470
+ console.error("设置阅后即焚失败:", error);
10471
+ this.handleError(error);
10408
10472
  return false;
10409
10473
  }
10410
10474
  }
@@ -10431,7 +10495,7 @@ class ImKit extends EventEmitter {
10431
10495
  return [];
10432
10496
  } catch (err) {
10433
10497
  console.error("会话分页获取会话列表失败:", err == null ? void 0 : err.errMsg);
10434
- this.handleError(error);
10498
+ this.handleError(err);
10435
10499
  return [];
10436
10500
  }
10437
10501
  }
@@ -10450,7 +10514,7 @@ class ImKit extends EventEmitter {
10450
10514
  return [];
10451
10515
  } catch (err) {
10452
10516
  console.error("获取所有会话列表失败:", err == null ? void 0 : err.errMsg);
10453
- this.handleError(error);
10517
+ this.handleError(err);
10454
10518
  return [];
10455
10519
  }
10456
10520
  }
@@ -10466,9 +10530,9 @@ class ImKit extends EventEmitter {
10466
10530
  try {
10467
10531
  const res = await ((_a = this.IMSDK) == null ? void 0 : _a.getTotalUnreadMsgCount(operationID));
10468
10532
  return (res == null ? void 0 : res.data) || 0;
10469
- } catch (error2) {
10470
- console.error("获取未读消息总数失败:", error2);
10471
- this.handleError(error2);
10533
+ } catch (error) {
10534
+ console.error("获取未读消息总数失败:", error);
10535
+ this.handleError(error);
10472
10536
  return 0;
10473
10537
  }
10474
10538
  }
@@ -10484,8 +10548,11 @@ class ImKit extends EventEmitter {
10484
10548
  }
10485
10549
  try {
10486
10550
  const res = await this.IMSDK.markConversationMessageAsRead(conversationID, operationID);
10487
- return !res.errMsg;
10551
+ if ((res == null ? void 0 : res.errMsg) && /hasReadSeq equal max/i.test(res.errMsg)) return true;
10552
+ if (res == null ? void 0 : res.errMsg) this.handleError(res);
10553
+ return !(res == null ? void 0 : res.errMsg);
10488
10554
  } catch (err) {
10555
+ this.handleError(err);
10489
10556
  return false;
10490
10557
  }
10491
10558
  }
@@ -10565,19 +10632,22 @@ class ImKit extends EventEmitter {
10565
10632
  if (res.data && res.data.messageList) {
10566
10633
  return {
10567
10634
  list: res.data.messageList || [],
10568
- isEnd: res.data.isEnd
10635
+ isEnd: res.data.isEnd,
10636
+ error: null
10569
10637
  };
10570
10638
  }
10571
10639
  return {
10572
10640
  list: [],
10573
- isEnd: true
10641
+ isEnd: true,
10642
+ error: null
10574
10643
  };
10575
- } catch (error2) {
10576
- console.error("获取会话的历史消息失败:", error2);
10577
- this.handleError(error2);
10644
+ } catch (error) {
10645
+ console.error("获取会话的历史消息失败:", error);
10646
+ this.handleError(error);
10578
10647
  return {
10579
10648
  list: [],
10580
- isEnd: true
10649
+ isEnd: false,
10650
+ error
10581
10651
  };
10582
10652
  }
10583
10653
  }
@@ -10598,19 +10668,22 @@ class ImKit extends EventEmitter {
10598
10668
  if (res.data && res.data.messageList) {
10599
10669
  return {
10600
10670
  list: res.data.messageList || [],
10601
- isEnd: res.data.isEnd
10671
+ isEnd: res.data.isEnd,
10672
+ error: null
10602
10673
  };
10603
10674
  }
10604
10675
  return {
10605
10676
  list: [],
10606
- isEnd: true
10677
+ isEnd: true,
10678
+ error: null
10607
10679
  };
10608
- } catch (error2) {
10609
- console.error("获取会话的历史消息失败:", error2);
10610
- this.handleError(error2);
10680
+ } catch (error) {
10681
+ console.error("获取会话的历史消息失败:", error);
10682
+ this.handleError(error);
10611
10683
  return {
10612
10684
  list: [],
10613
- isEnd: true
10685
+ isEnd: false,
10686
+ error
10614
10687
  };
10615
10688
  }
10616
10689
  }
@@ -10623,9 +10696,9 @@ class ImKit extends EventEmitter {
10623
10696
  return res.data;
10624
10697
  }
10625
10698
  return null;
10626
- } catch (error2) {
10627
- console.error("创建文本消息失败:", error2);
10628
- this.handleError(error2);
10699
+ } catch (error) {
10700
+ console.error("创建文本消息失败:", error);
10701
+ this.handleError(error);
10629
10702
  return null;
10630
10703
  }
10631
10704
  }
@@ -10639,9 +10712,9 @@ class ImKit extends EventEmitter {
10639
10712
  return res.data;
10640
10713
  }
10641
10714
  return null;
10642
- } catch (error2) {
10643
- console.error("创建引用消息失败:", error2);
10644
- this.handleError(error2);
10715
+ } catch (error) {
10716
+ console.error("创建引用消息失败:", error);
10717
+ this.handleError(error);
10645
10718
  return null;
10646
10719
  }
10647
10720
  }
@@ -10663,9 +10736,9 @@ class ImKit extends EventEmitter {
10663
10736
  return res.data;
10664
10737
  }
10665
10738
  return null;
10666
- } catch (error2) {
10667
- console.error("创建@消息失败:", error2);
10668
- this.handleError(error2);
10739
+ } catch (error) {
10740
+ console.error("创建@消息失败:", error);
10741
+ this.handleError(error);
10669
10742
  return null;
10670
10743
  }
10671
10744
  }
@@ -10684,9 +10757,9 @@ class ImKit extends EventEmitter {
10684
10757
  return res.data;
10685
10758
  }
10686
10759
  return null;
10687
- } catch (error2) {
10688
- console.error("创建转发消息失败:", error2);
10689
- this.handleError(error2);
10760
+ } catch (error) {
10761
+ console.error("创建转发消息失败:", error);
10762
+ this.handleError(error);
10690
10763
  return null;
10691
10764
  }
10692
10765
  }
@@ -10710,9 +10783,9 @@ class ImKit extends EventEmitter {
10710
10783
  return res.data;
10711
10784
  }
10712
10785
  return null;
10713
- } catch (error2) {
10714
- console.error("创建自定义消息失败:", error2);
10715
- this.handleError(error2);
10786
+ } catch (error) {
10787
+ console.error("创建自定义消息失败:", error);
10788
+ this.handleError(error);
10716
10789
  return null;
10717
10790
  }
10718
10791
  }
@@ -10740,9 +10813,9 @@ class ImKit extends EventEmitter {
10740
10813
  return res.data;
10741
10814
  }
10742
10815
  return null;
10743
- } catch (error2) {
10744
- console.error("创建合并消息失败:", error2);
10745
- this.handleError(error2);
10816
+ } catch (error) {
10817
+ console.error("创建合并消息失败:", error);
10818
+ this.handleError(error);
10746
10819
  return null;
10747
10820
  }
10748
10821
  }
@@ -10754,9 +10827,9 @@ class ImKit extends EventEmitter {
10754
10827
  return res.data;
10755
10828
  }
10756
10829
  return null;
10757
- } catch (error2) {
10758
- console.error("消息发送1失败:", error2);
10759
- this.handleError(error2);
10830
+ } catch (error) {
10831
+ console.error("消息发送1失败:", error);
10832
+ this.handleError(error);
10760
10833
  return null;
10761
10834
  }
10762
10835
  }
@@ -10768,9 +10841,9 @@ class ImKit extends EventEmitter {
10768
10841
  return res.data;
10769
10842
  }
10770
10843
  return null;
10771
- } catch (error2) {
10772
- console.error("创建图片消息失败:", error2);
10773
- this.handleError(error2);
10844
+ } catch (error) {
10845
+ console.error("创建图片消息失败:", error);
10846
+ this.handleError(error);
10774
10847
  return null;
10775
10848
  }
10776
10849
  }
@@ -10792,9 +10865,9 @@ class ImKit extends EventEmitter {
10792
10865
  return res.data;
10793
10866
  }
10794
10867
  return null;
10795
- } catch (error2) {
10796
- console.error("创建文件消息失败:", error2);
10797
- this.handleError(error2);
10868
+ } catch (error) {
10869
+ console.error("创建文件消息失败:", error);
10870
+ this.handleError(error);
10798
10871
  return null;
10799
10872
  }
10800
10873
  }
@@ -10816,9 +10889,9 @@ class ImKit extends EventEmitter {
10816
10889
  return res.data;
10817
10890
  }
10818
10891
  return null;
10819
- } catch (error2) {
10820
- console.error("创建语音消息失败:", error2);
10821
- this.handleError(error2);
10892
+ } catch (error) {
10893
+ console.error("创建语音消息失败:", error);
10894
+ this.handleError(error);
10822
10895
  return null;
10823
10896
  }
10824
10897
  }
@@ -10841,9 +10914,9 @@ class ImKit extends EventEmitter {
10841
10914
  return res.data;
10842
10915
  }
10843
10916
  return null;
10844
- } catch (error2) {
10845
- console.error("创建语音消息失败:", error2);
10846
- this.handleError(error2);
10917
+ } catch (error) {
10918
+ console.error("创建语音消息失败:", error);
10919
+ this.handleError(error);
10847
10920
  return null;
10848
10921
  }
10849
10922
  }
@@ -10855,9 +10928,9 @@ class ImKit extends EventEmitter {
10855
10928
  return res.data;
10856
10929
  }
10857
10930
  return null;
10858
- } catch (error2) {
10859
- console.error("创建视频消息失败:", error2);
10860
- this.handleError(error2);
10931
+ } catch (error) {
10932
+ console.error("创建视频消息失败:", error);
10933
+ this.handleError(error);
10861
10934
  return null;
10862
10935
  }
10863
10936
  }
@@ -10866,8 +10939,8 @@ class ImKit extends EventEmitter {
10866
10939
  try {
10867
10940
  const res = await this.IMSDK.deleteMessage({ conversationID, clientMsgID }, operationID);
10868
10941
  return !res.errMsg;
10869
- } catch (error2) {
10870
- this.handleError(error2);
10942
+ } catch (error) {
10943
+ this.handleError(error);
10871
10944
  return false;
10872
10945
  }
10873
10946
  }
@@ -10876,8 +10949,8 @@ class ImKit extends EventEmitter {
10876
10949
  try {
10877
10950
  const res = await this.IMSDK.revokeMessage({ conversationID, clientMsgID }, operationID);
10878
10951
  return !res.errMsg;
10879
- } catch (error2) {
10880
- this.handleError(error2);
10952
+ } catch (error) {
10953
+ this.handleError(error);
10881
10954
  return false;
10882
10955
  }
10883
10956
  }
@@ -10889,9 +10962,9 @@ class ImKit extends EventEmitter {
10889
10962
  return res.data;
10890
10963
  }
10891
10964
  return null;
10892
- } catch (error2) {
10893
- console.error("消息发送2失败:", error2);
10894
- this.handleError(error2);
10965
+ } catch (error) {
10966
+ console.error("消息发送2失败:", error);
10967
+ this.handleError(error);
10895
10968
  return null;
10896
10969
  }
10897
10970
  }
@@ -10906,9 +10979,9 @@ class ImKit extends EventEmitter {
10906
10979
  return res.data;
10907
10980
  }
10908
10981
  return [];
10909
- } catch (error2) {
10910
- console.error("获取群组信息失败:", error2);
10911
- this.handleError(error2);
10982
+ } catch (error) {
10983
+ console.error("获取群组信息失败:", error);
10984
+ this.handleError(error);
10912
10985
  return [];
10913
10986
  }
10914
10987
  }
@@ -10934,9 +11007,9 @@ class ImKit extends EventEmitter {
10934
11007
  operationID
10935
11008
  ));
10936
11009
  return !res.errMsg;
10937
- } catch (error2) {
10938
- console.error("创建群聊失败:", error2);
10939
- this.handleError(error2);
11010
+ } catch (error) {
11011
+ console.error("创建群聊失败:", error);
11012
+ this.handleError(error);
10940
11013
  return false;
10941
11014
  }
10942
11015
  }
@@ -10956,9 +11029,9 @@ class ImKit extends EventEmitter {
10956
11029
  return res.data;
10957
11030
  }
10958
11031
  return [];
10959
- } catch (error2) {
10960
- console.error("获取群组成员失败:", error2);
10961
- this.handleError(error2);
11032
+ } catch (error) {
11033
+ console.error("获取群组成员失败:", error);
11034
+ this.handleError(error);
10962
11035
  return [];
10963
11036
  }
10964
11037
  }
@@ -10978,9 +11051,9 @@ class ImKit extends EventEmitter {
10978
11051
  return res.data;
10979
11052
  }
10980
11053
  return [];
10981
- } catch (error2) {
10982
- console.error("获取群成员信息失败:", error2);
10983
- this.handleError(error2);
11054
+ } catch (error) {
11055
+ console.error("获取群成员信息失败:", error);
11056
+ this.handleError(error);
10984
11057
  return [];
10985
11058
  }
10986
11059
  }
@@ -10997,9 +11070,9 @@ class ImKit extends EventEmitter {
10997
11070
  try {
10998
11071
  const res = await this.IMSDK.inviteUserToGroup({ groupID, userIDList: userIDList2, reason }, operationID);
10999
11072
  return !res.errMsg;
11000
- } catch (error2) {
11001
- console.error("邀请用户进群失败:", error2);
11002
- this.handleError(error2);
11073
+ } catch (error) {
11074
+ console.error("邀请用户进群失败:", error);
11075
+ this.handleError(error);
11003
11076
  return false;
11004
11077
  }
11005
11078
  }
@@ -11016,9 +11089,9 @@ class ImKit extends EventEmitter {
11016
11089
  try {
11017
11090
  const res = await this.IMSDK.kickGroupMember({ groupID, userIDList: userIDList2, reason }, operationID);
11018
11091
  return !res.errMsg;
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 false;
11023
11096
  }
11024
11097
  }
@@ -11045,9 +11118,9 @@ class ImKit extends EventEmitter {
11045
11118
  operationID
11046
11119
  );
11047
11120
  return !res.errMsg;
11048
- } catch (error2) {
11049
- console.error("设置群组信息失败:", error2);
11050
- this.handleError(error2);
11121
+ } catch (error) {
11122
+ console.error("设置群组信息失败:", error);
11123
+ this.handleError(error);
11051
11124
  return false;
11052
11125
  }
11053
11126
  }
@@ -11070,9 +11143,9 @@ class ImKit extends EventEmitter {
11070
11143
  }
11071
11144
  const res = await this.IMSDK.setGroupMemberInfo(params, operationID);
11072
11145
  return !res.errMsg;
11073
- } catch (error2) {
11074
- console.error("修改群组成员信息失败:", error2);
11075
- this.handleError(error2);
11146
+ } catch (error) {
11147
+ console.error("修改群组成员信息失败:", error);
11148
+ this.handleError(error);
11076
11149
  return false;
11077
11150
  }
11078
11151
  }
@@ -11089,9 +11162,9 @@ class ImKit extends EventEmitter {
11089
11162
  try {
11090
11163
  const res = await this.IMSDK.changeGroupMute({ groupID, isMute }, operationID);
11091
11164
  return !res.errMsg;
11092
- } catch (error2) {
11093
- console.error("修改群组禁言失败:", error2);
11094
- this.handleError(error2);
11165
+ } catch (error) {
11166
+ console.error("修改群组禁言失败:", error);
11167
+ this.handleError(error);
11095
11168
  return false;
11096
11169
  }
11097
11170
  }
@@ -11110,9 +11183,9 @@ class ImKit extends EventEmitter {
11110
11183
  try {
11111
11184
  const res = await this.IMSDK.changeGroupMemberMute({ groupID, userID, mutedSeconds }, operationID);
11112
11185
  return !res.errMsg;
11113
- } catch (error2) {
11114
- console.error("设置群组成员禁言失败:", error2);
11115
- this.handleError(error2);
11186
+ } catch (error) {
11187
+ console.error("设置群组成员禁言失败:", error);
11188
+ this.handleError(error);
11116
11189
  return false;
11117
11190
  }
11118
11191
  }
@@ -11126,9 +11199,9 @@ class ImKit extends EventEmitter {
11126
11199
  try {
11127
11200
  const res = await this.IMSDK.dismissGroup(groupID, operationID);
11128
11201
  return !res.errMsg;
11129
- } catch (error2) {
11130
- console.error("解散群失败:", error2);
11131
- this.handleError(error2);
11202
+ } catch (error) {
11203
+ console.error("解散群失败:", error);
11204
+ this.handleError(error);
11132
11205
  return false;
11133
11206
  }
11134
11207
  }
@@ -11145,9 +11218,9 @@ class ImKit extends EventEmitter {
11145
11218
  try {
11146
11219
  const res = await this.IMSDK.quitGroup(groupID, operationID);
11147
11220
  return !res.errMsg;
11148
- } catch (error2) {
11149
- console.error("退出群组失败:", error2);
11150
- this.handleError(error2);
11221
+ } catch (error) {
11222
+ console.error("退出群组失败:", error);
11223
+ this.handleError(error);
11151
11224
  return false;
11152
11225
  }
11153
11226
  }
@@ -11165,9 +11238,9 @@ class ImKit extends EventEmitter {
11165
11238
  try {
11166
11239
  const res = await this.IMSDK.transferGroupOwner({ groupID, newOwnerUserID, oldOwnerUserID }, operationID);
11167
11240
  return !res.errMsg;
11168
- } catch (error2) {
11169
- console.error("转让群主失败:", error2);
11170
- this.handleError(error2);
11241
+ } catch (error) {
11242
+ console.error("转让群主失败:", error);
11243
+ this.handleError(error);
11171
11244
  return false;
11172
11245
  }
11173
11246
  }
@@ -11183,9 +11256,9 @@ class ImKit extends EventEmitter {
11183
11256
  try {
11184
11257
  const res = await this.IMSDK.isJoinGroup(groupID, operationID);
11185
11258
  return !res.errMsg;
11186
- } catch (error2) {
11187
- console.error("获取群成员信息失败:", error2);
11188
- this.handleError(error2);
11259
+ } catch (error) {
11260
+ console.error("获取群成员信息失败:", error);
11261
+ this.handleError(error);
11189
11262
  return false;
11190
11263
  }
11191
11264
  }
@@ -11203,9 +11276,9 @@ class ImKit extends EventEmitter {
11203
11276
  operationID
11204
11277
  );
11205
11278
  return !res.errMsg;
11206
- } catch (error2) {
11207
- console.error("申请加入群组失败:", error2);
11208
- this.handleError(error2);
11279
+ } catch (error) {
11280
+ console.error("申请加入群组失败:", error);
11281
+ this.handleError(error);
11209
11282
  return false;
11210
11283
  }
11211
11284
  }
@@ -11223,9 +11296,9 @@ class ImKit extends EventEmitter {
11223
11296
  operationID
11224
11297
  );
11225
11298
  return !res.errMsg;
11226
- } catch (error2) {
11227
- console.error("同意入群申请失败:", error2);
11228
- this.handleError(error2);
11299
+ } catch (error) {
11300
+ console.error("同意入群申请失败:", error);
11301
+ this.handleError(error);
11229
11302
  return false;
11230
11303
  }
11231
11304
  }
@@ -11243,9 +11316,9 @@ class ImKit extends EventEmitter {
11243
11316
  operationID
11244
11317
  );
11245
11318
  return !res.errMsg;
11246
- } catch (error2) {
11247
- console.error("拒绝入群申请失败:", error2);
11248
- this.handleError(error2);
11319
+ } catch (error) {
11320
+ console.error("拒绝入群申请失败:", error);
11321
+ this.handleError(error);
11249
11322
  return false;
11250
11323
  }
11251
11324
  }
@@ -11265,9 +11338,9 @@ class ImKit extends EventEmitter {
11265
11338
  return res.data;
11266
11339
  }
11267
11340
  return [];
11268
- } catch (error2) {
11269
- console.error("获取群申请列表(管理员)失败:", error2);
11270
- this.handleError(error2);
11341
+ } catch (error) {
11342
+ console.error("获取群申请列表(管理员)失败:", error);
11343
+ this.handleError(error);
11271
11344
  return [];
11272
11345
  }
11273
11346
  }
@@ -11287,9 +11360,9 @@ class ImKit extends EventEmitter {
11287
11360
  return res.data;
11288
11361
  }
11289
11362
  return [];
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 [];
11294
11367
  }
11295
11368
  }
@@ -11310,9 +11383,9 @@ class ImKit extends EventEmitter {
11310
11383
  return res.data;
11311
11384
  }
11312
11385
  return [];
11313
- } catch (error2) {
11314
- console.error("搜索群组失败:", error2);
11315
- this.handleError(error2);
11386
+ } catch (error) {
11387
+ console.error("搜索群组失败:", error);
11388
+ this.handleError(error);
11316
11389
  return [];
11317
11390
  }
11318
11391
  }
@@ -11332,9 +11405,9 @@ class ImKit extends EventEmitter {
11332
11405
  return res.data;
11333
11406
  }
11334
11407
  return [];
11335
- } catch (error2) {
11336
- console.error("获取已加入群组列表失败:", error2);
11337
- this.handleError(error2);
11408
+ } catch (error) {
11409
+ console.error("获取已加入群组列表失败:", error);
11410
+ this.handleError(error);
11338
11411
  return [];
11339
11412
  }
11340
11413
  }
@@ -11826,7 +11899,7 @@ function requireDayjs_min() {
11826
11899
  var dayjs_minExports = requireDayjs_min();
11827
11900
  const dayjs = /* @__PURE__ */ getDefaultExportFromCjs(dayjs_minExports);
11828
11901
  const useDate = () => {
11829
- const now = ref("");
11902
+ const now2 = ref("");
11830
11903
  const getDate = (date) => {
11831
11904
  return dayjs(date).format("YYYY-MM-DD");
11832
11905
  };
@@ -11840,7 +11913,7 @@ const useDate = () => {
11840
11913
  return dayjs(date).format(format);
11841
11914
  };
11842
11915
  return {
11843
- now,
11916
+ now: now2,
11844
11917
  getDate,
11845
11918
  getTime,
11846
11919
  getDateTime,
@@ -11856,10 +11929,10 @@ function handleDate(date = Date.now(), ifFullDay = false) {
11856
11929
  const year = parseInt(fullDay.slice(0, 4), 10);
11857
11930
  const month = parseInt(fullDay.slice(5, 7), 10);
11858
11931
  const day = parseInt(fullDay.slice(8, 10), 10);
11859
- const now = /* @__PURE__ */ new Date();
11860
- const cYear = now.getFullYear();
11861
- const cMonth = now.getMonth() + 1;
11862
- const cDay = now.getDate();
11932
+ const now2 = /* @__PURE__ */ new Date();
11933
+ const cYear = now2.getFullYear();
11934
+ const cMonth = now2.getMonth() + 1;
11935
+ const cDay = now2.getDate();
11863
11936
  if (year !== cYear) {
11864
11937
  return getFormatTime(date, "YYYY/MM/DD HH:mm");
11865
11938
  } else if (month !== cMonth || cDay !== day) {
@@ -36211,7 +36284,7 @@ const useConversations = () => {
36211
36284
  isSelfMuted = (mutedUser == null ? void 0 : mutedUser.muteEndTime) && (mutedUser == null ? void 0 : mutedUser.muteEndTime) > Date.now();
36212
36285
  }
36213
36286
  if (item.conversationType === IM_CVS_TYPE.Single || item.userID) {
36214
- const userInfo = getUserStatus(item.userID);
36287
+ const userInfo = getUserStatus(item.userID) || {};
36215
36288
  item.onlineStatus = userInfo.status || 0;
36216
36289
  item.platformIDs = userInfo.platformIDs || [];
36217
36290
  }
@@ -36399,6 +36472,7 @@ const ga6 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABJCAYAAACesWDiA
36399
36472
  const easeInOutCubic = (t2) => {
36400
36473
  return t2 < 0.5 ? 4 * t2 * t2 * t2 : 1 - Math.pow(-2 * t2 + 2, 3) / 2;
36401
36474
  };
36475
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
36402
36476
  const smoothScrollTo = (element, to, duration = 500) => {
36403
36477
  const start = element.scrollTop;
36404
36478
  const change = to - start;
@@ -36455,7 +36529,12 @@ const buildMemberMuted = (obj, userInfo, canceled) => {
36455
36529
  const MESSAGE_BUILDERS = {
36456
36530
  [106]: (obj, userInfo) => buildAtTextMsg(obj, userInfo),
36457
36531
  [1501]: (obj, userInfo) => `${selfOrOther((obj.opUser || {}).userID, userInfo) || (obj.opUser || {}).nickname} 创建了群聊`,
36458
- [1701]: (obj) => obj.isPrivate ? "已关闭阅后即焚" : "已开启阅后即焚",
36532
+ // 1701 阅后即焚开关通知:detail 形如 { isPrivate: true },isPrivate 表示"变更后的私密状态"
36533
+ // 文案需要带上操作人:消息 sendID 即调用 setConversation 的用户;单聊里用会话对方昵称兜底
36534
+ [1701]: (obj, userInfo, msg, senderName) => {
36535
+ 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) || "对方";
36536
+ return `${operator} ${obj.isPrivate ? "开启了阅后即焚" : "关闭了阅后即焚"}`;
36537
+ },
36459
36538
  [1509]: (obj, userInfo) => buildMemberInvited(obj, userInfo),
36460
36539
  [1510]: (obj, userInfo) => buildEntrantMsg(obj, userInfo),
36461
36540
  [1508]: (obj, userInfo) => buildMemberKicked(obj, userInfo),
@@ -36470,17 +36549,24 @@ const MESSAGE_BUILDERS = {
36470
36549
  [1513]: (obj, userInfo) => buildMemberMuted(obj, userInfo, true),
36471
36550
  [1519]: (obj, userInfo) => `${selfOrOther((obj.opUser || {}).userID, userInfo) || (obj.opUser || {}).nickname} ${(obj.group || {}).notification !== "&d&" ? "修改" : "删除"}了群公告`
36472
36551
  };
36473
- const getJsonDetail = (jsonObj, type) => {
36552
+ const getJsonDetail = (jsonObj, type, msg, senderName = "") => {
36474
36553
  const obj = jsonObj.indexOf("{") > -1 ? JSON.parse(jsonObj) : {};
36475
36554
  const chatMessage = useChatStore();
36476
36555
  const userInfo = chatMessage.getUserInfo;
36477
36556
  const builder = MESSAGE_BUILDERS[type];
36478
- return builder ? builder(obj, userInfo) : "有通知消息";
36557
+ return builder ? builder(obj, userInfo, msg, senderName) : "有通知消息";
36558
+ };
36559
+ 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;
36560
+ const formatMsgPreview = (content) => {
36561
+ if (typeof content !== "string" || !content) return content || "";
36562
+ if (!HTML_TAG_HINT_REG.test(content)) return content;
36563
+ 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, " ");
36564
+ return text.replace(/\s+/g, " ").trim();
36479
36565
  };
36480
36566
  const MSG_TYPE_LABELS = {
36481
36567
  [101]: (msg) => {
36482
36568
  var _a;
36483
- return (_a = msg.textElem) == null ? void 0 : _a.content;
36569
+ return formatMsgPreview((_a = msg.textElem) == null ? void 0 : _a.content);
36484
36570
  },
36485
36571
  [102]: () => "[图片]",
36486
36572
  [105]: (msg) => {
@@ -36496,7 +36582,7 @@ const MSG_TYPE_LABELS = {
36496
36582
  [106]: () => "[@消息]",
36497
36583
  [114]: (msg) => {
36498
36584
  var _a;
36499
- return (_a = msg.quoteElem) == null ? void 0 : _a.text;
36585
+ return formatMsgPreview((_a = msg.quoteElem) == null ? void 0 : _a.text);
36500
36586
  },
36501
36587
  [110]: (msg) => {
36502
36588
  var _a;
@@ -36761,6 +36847,11 @@ const getSelectionText = () => {
36761
36847
  }
36762
36848
  return "";
36763
36849
  };
36850
+ const NOTICE_AGENT_PREFIX = "agent_";
36851
+ const isNoticeAgentConversation = (cvs) => {
36852
+ if (!cvs || cvs.conversationType !== IM_CVS_TYPE.Single) return false;
36853
+ return String(cvs.userID || "").startsWith(NOTICE_AGENT_PREFIX);
36854
+ };
36764
36855
  const createCvsId = (msg) => {
36765
36856
  if (msg.sessionType === IM_CVS_TYPE.Single) {
36766
36857
  const t3 = [msg.sendID, msg.recvID].sort();
@@ -36768,6 +36859,20 @@ const createCvsId = (msg) => {
36768
36859
  }
36769
36860
  return msg.sessionType === IM_CVS_TYPE.Group ? "sg_" + msg.groupID : msg.sessionType === IM_CVS_TYPE.Notification ? "sn_" + msg.sendID + "_" + msg.recvID : "";
36770
36861
  };
36862
+ const dedupeMessages = (list = [], seen = /* @__PURE__ */ new Set()) => {
36863
+ const result = [];
36864
+ for (const item of list) {
36865
+ const id = item == null ? void 0 : item.clientMsgID;
36866
+ if (!id) {
36867
+ result.push(item);
36868
+ continue;
36869
+ }
36870
+ if (seen.has(id)) continue;
36871
+ seen.add(id);
36872
+ result.push(item);
36873
+ }
36874
+ return result;
36875
+ };
36771
36876
  const downloadFileByBlob = async (url, fileName, uniqueId) => {
36772
36877
  if (!url || !fileName) return;
36773
36878
  const downMsg = ElMessage({ message: "正在下载...", type: "info", duration: 0 });
@@ -36899,11 +37004,29 @@ const useMsgList = () => {
36899
37004
  const newList = handleMessageList(list);
36900
37005
  if (type === "init") {
36901
37006
  startClientMsgID.value = "";
36902
- messageList.value = newList.length === 0 ? messageList.value : newList;
37007
+ messageList.value = dedupeMessages(newList);
36903
37008
  } else if (type === "add") {
36904
- messageList.value = [...messageList.value, ...newList];
37009
+ const merged = [...messageList.value];
37010
+ const indexByID = /* @__PURE__ */ new Map();
37011
+ merged.forEach((item, i3) => {
37012
+ if (item == null ? void 0 : item.clientMsgID) indexByID.set(item.clientMsgID, i3);
37013
+ });
37014
+ dedupeMessages(newList).forEach((item) => {
37015
+ const id = item == null ? void 0 : item.clientMsgID;
37016
+ if (id && indexByID.has(id)) {
37017
+ merged[indexByID.get(id)] = item;
37018
+ } else {
37019
+ if (id) indexByID.set(id, merged.length);
37020
+ merged.push(item);
37021
+ }
37022
+ });
37023
+ messageList.value = merged;
36905
37024
  } else if (type === "loadmore") {
36906
- messageList.value = [...newList, ...messageList.value];
37025
+ const seen = /* @__PURE__ */ new Set();
37026
+ messageList.value.forEach((item) => {
37027
+ if (item == null ? void 0 : item.clientMsgID) seen.add(item.clientMsgID);
37028
+ });
37029
+ messageList.value = [...dedupeMessages(newList, seen), ...messageList.value];
36907
37030
  } else if (type === "update") {
36908
37031
  if (messageList.value.length === 0) {
36909
37032
  messageList.value = newList;
@@ -36976,13 +37099,14 @@ const useMsgList = () => {
36976
37099
  return isGroup ? `${obj.senderNickname}: ${label}` : label;
36977
37100
  };
36978
37101
  const MESSAGE_HANDLERS = {
37102
+ // 富文本消息的 content 是 HTML,会话列表预览需要转成纯文案(图片显示为 [图片])
36979
37103
  textElem: (obj) => {
36980
37104
  var _a;
36981
- return formatSenderMsg(obj, (_a = obj.textElem) == null ? void 0 : _a.content);
37105
+ return formatSenderMsg(obj, formatMsgPreview((_a = obj.textElem) == null ? void 0 : _a.content));
36982
37106
  },
36983
37107
  quoteElem: (obj) => {
36984
37108
  var _a;
36985
- return formatSenderMsg(obj, (_a = obj.quoteElem) == null ? void 0 : _a.text);
37109
+ return formatSenderMsg(obj, formatMsgPreview((_a = obj.quoteElem) == null ? void 0 : _a.text));
36986
37110
  },
36987
37111
  pictureElem: (obj) => obj.sessionType === IM_CVS_TYPE.Group ? `${obj.senderNickname}: [图片]` : `${obj.senderNickname}发送了图片`,
36988
37112
  fileElem: (obj) => obj.sessionType === IM_CVS_TYPE.Group ? `${obj.senderNickname}: [文件]` : `${obj.senderNickname}发送了文件`,
@@ -37005,7 +37129,7 @@ const useMsgList = () => {
37005
37129
  },
37006
37130
  notificationElem: (obj) => {
37007
37131
  var _a, _b;
37008
- return ((_a = obj.notificationElem) == null ? void 0 : _a.detail) ? getJsonDetail((_b = obj.notificationElem) == null ? void 0 : _b.detail, obj.contentType) : "有通知消息";
37132
+ return ((_a = obj.notificationElem) == null ? void 0 : _a.detail) ? getJsonDetail((_b = obj.notificationElem) == null ? void 0 : _b.detail, obj.contentType, obj) : "有通知消息";
37009
37133
  }
37010
37134
  };
37011
37135
  const MESSAGE_ELEM_KEYS = ["textElem", "quoteElem", "pictureElem", "fileElem", "soundElem", "videoElem", "locationElem", "mergeElem", "atTextElem", "customElem", "notificationElem"];
@@ -37032,9 +37156,2592 @@ const useMsgList = () => {
37032
37156
  updateMessageSenderInfo
37033
37157
  };
37034
37158
  };
37159
+ const BURN_PRESETS = [10, 30, 60, 300, 1800, 3600];
37160
+ const BURN_MIN = 1;
37161
+ const BURN_MAX = 86400;
37162
+ const BURN_DEFAULT = 30;
37163
+ const isBurnNoticeMessage = (msg) => Number(msg == null ? void 0 : msg.contentType) > 200;
37164
+ const parseJsonEx = (ex) => {
37165
+ if (!ex) return {};
37166
+ if (typeof ex === "object") return ex;
37167
+ try {
37168
+ const obj = JSON.parse(ex);
37169
+ return obj && typeof obj === "object" ? obj : {};
37170
+ } catch {
37171
+ return {};
37172
+ }
37173
+ };
37174
+ const getConversationBurnSetting = (conversation, userID) => {
37175
+ const burn = parseJsonEx(conversation == null ? void 0 : conversation.ex).burn || {};
37176
+ const fromUserID = burn.fromUserID ? String(burn.fromUserID) : "";
37177
+ const enabled = burn.enabled === true && (!userID || !fromUserID || fromUserID === String(userID));
37178
+ return {
37179
+ enabled,
37180
+ duration: enabled ? clampBurnDuration(burn.duration) : 0,
37181
+ fromUserID,
37182
+ toUserID: burn.toUserID ? String(burn.toUserID) : ""
37183
+ };
37184
+ };
37185
+ const buildBurnEx = (prevEx, { enabled, duration, fromUserID, toUserID }) => {
37186
+ const obj = parseJsonEx(prevEx);
37187
+ if (enabled) {
37188
+ obj.burn = {
37189
+ enabled: true,
37190
+ duration: clampBurnDuration(duration),
37191
+ fromUserID: fromUserID ? String(fromUserID) : "",
37192
+ toUserID: toUserID ? String(toUserID) : "",
37193
+ updatedAt: Date.now()
37194
+ };
37195
+ } else {
37196
+ delete obj.burn;
37197
+ }
37198
+ return JSON.stringify(obj);
37199
+ };
37200
+ const preserveBurnInEx = (nextEx, prevEx) => {
37201
+ const burn = parseJsonEx(prevEx).burn;
37202
+ if (!burn) return typeof nextEx === "string" ? nextEx : JSON.stringify(parseJsonEx(nextEx));
37203
+ const obj = parseJsonEx(nextEx);
37204
+ obj.burn = burn;
37205
+ return JSON.stringify(obj);
37206
+ };
37207
+ const getMessageBurnMeta = (msg) => {
37208
+ const ex = parseJsonEx(msg == null ? void 0 : msg.ex);
37209
+ const duration = Number(ex.burnDuration) || 0;
37210
+ return {
37211
+ bySender: ex.burnBySender === true && duration > 0,
37212
+ duration,
37213
+ fromUserID: ex.burnFromUserID ? String(ex.burnFromUserID) : "",
37214
+ toUserID: ex.burnToUserID ? String(ex.burnToUserID) : ""
37215
+ };
37216
+ };
37217
+ const getBurnDuration = (msg) => getMessageBurnMeta(msg).duration;
37218
+ const isBurnMessage = (msg) => {
37219
+ if (!msg || isBurnNoticeMessage(msg)) return false;
37220
+ const { bySender, duration } = getMessageBurnMeta(msg);
37221
+ return bySender && duration > 0;
37222
+ };
37223
+ const clampBurnDuration = (value) => {
37224
+ const num = Math.floor(Number(value));
37225
+ if (!Number.isFinite(num) || num < BURN_MIN) return BURN_DEFAULT;
37226
+ return Math.min(num, BURN_MAX);
37227
+ };
37228
+ const formatBurnDuration = (seconds) => {
37229
+ const num = Number(seconds) || 0;
37230
+ if (num >= 3600 && num % 3600 === 0) return `${num / 3600} 小时`;
37231
+ if (num >= 60 && num % 60 === 0) return `${num / 60} 分钟`;
37232
+ return `${num} 秒`;
37233
+ };
37234
+ const formatBurnRemain = (seconds) => {
37235
+ const num = Number(seconds) || 0;
37236
+ if (num >= 3600) return `${Math.ceil(num / 3600)}h`;
37237
+ if (num >= 60) return `${Math.ceil(num / 60)}m`;
37238
+ return `${num}s`;
37239
+ };
37240
+ const isBurned = (msg) => {
37241
+ var _a;
37242
+ const { bySender, duration } = getMessageBurnMeta(msg);
37243
+ if (!bySender || !duration) return false;
37244
+ const readTime = Number((_a = msg == null ? void 0 : msg.attachedInfoElem) == null ? void 0 : _a.hasReadTime) || 0;
37245
+ if (!readTime) return false;
37246
+ return Date.now() >= readTime + duration * 1e3;
37247
+ };
37248
+ const keyOf = (conversationID, clientMsgID) => `${conversationID}::${clientMsgID}`;
37249
+ const timers = /* @__PURE__ */ new Map();
37250
+ const deadlines = /* @__PURE__ */ new Map();
37251
+ const handlers = /* @__PURE__ */ new Set();
37252
+ const now = ref(Date.now());
37253
+ let ticker = null;
37254
+ const stopTicker = () => {
37255
+ if (ticker) {
37256
+ clearInterval(ticker);
37257
+ ticker = null;
37258
+ }
37259
+ };
37260
+ const startTicker = () => {
37261
+ if (ticker) return;
37262
+ ticker = setInterval(() => {
37263
+ now.value = Date.now();
37264
+ if (deadlines.size === 0) stopTicker();
37265
+ }, 1e3);
37266
+ };
37267
+ const runHandlers = (conversationID, clientMsgID) => {
37268
+ handlers.forEach((fn) => {
37269
+ try {
37270
+ fn(conversationID, clientMsgID);
37271
+ } catch (error) {
37272
+ console.error("[IM] 焚毁回调执行失败:", error);
37273
+ }
37274
+ });
37275
+ };
37276
+ const fireBurn = (conversationID, clientMsgID) => {
37277
+ const key = keyOf(conversationID, clientMsgID);
37278
+ timers.delete(key);
37279
+ deadlines.delete(key);
37280
+ runHandlers(conversationID, clientMsgID);
37281
+ };
37282
+ const useBurnAfterReading = () => {
37283
+ const onBurn = (fn) => {
37284
+ if (typeof fn === "function") handlers.add(fn);
37285
+ return () => handlers.delete(fn);
37286
+ };
37287
+ const cancelBurn = (conversationID, clientMsgID) => {
37288
+ if (!conversationID || !clientMsgID) return;
37289
+ const key = keyOf(conversationID, clientMsgID);
37290
+ const timer = timers.get(key);
37291
+ if (timer) clearTimeout(timer);
37292
+ timers.delete(key);
37293
+ deadlines.delete(key);
37294
+ if (deadlines.size === 0) stopTicker();
37295
+ };
37296
+ const cancelConversation = (conversationID) => {
37297
+ if (!conversationID) return;
37298
+ const prefix = `${conversationID}::`;
37299
+ for (const key of [...timers.keys()]) {
37300
+ if (!key.startsWith(prefix)) continue;
37301
+ clearTimeout(timers.get(key));
37302
+ timers.delete(key);
37303
+ deadlines.delete(key);
37304
+ }
37305
+ for (const key of [...deadlines.keys()]) {
37306
+ if (key.startsWith(prefix)) deadlines.delete(key);
37307
+ }
37308
+ if (deadlines.size === 0) stopTicker();
37309
+ };
37310
+ const cancelAll = () => {
37311
+ for (const timer of timers.values()) clearTimeout(timer);
37312
+ timers.clear();
37313
+ deadlines.clear();
37314
+ stopTicker();
37315
+ };
37316
+ const scheduleBurn = (conversationID, msg, startAt = Date.now()) => {
37317
+ if (!conversationID || !(msg == null ? void 0 : msg.clientMsgID) || !isBurnMessage(msg)) return;
37318
+ const duration = getBurnDuration(msg);
37319
+ if (duration <= 0) return;
37320
+ const key = keyOf(conversationID, msg.clientMsgID);
37321
+ if (deadlines.has(key) || timers.has(key)) return;
37322
+ const origin = Number(startAt) || Date.now();
37323
+ const deadline = origin + duration * 1e3;
37324
+ if (deadline <= Date.now()) {
37325
+ setTimeout(() => runHandlers(conversationID, msg.clientMsgID), 0);
37326
+ return;
37327
+ }
37328
+ deadlines.set(key, deadline);
37329
+ timers.set(
37330
+ key,
37331
+ setTimeout(() => fireBurn(conversationID, msg.clientMsgID), deadline - Date.now())
37332
+ );
37333
+ startTicker();
37334
+ };
37335
+ const burnRemain = (msg, conversationID = msg == null ? void 0 : msg.conversationID) => {
37336
+ var _a;
37337
+ void now.value;
37338
+ const duration = getBurnDuration(msg);
37339
+ if (!duration) return 0;
37340
+ const key = keyOf(conversationID, msg == null ? void 0 : msg.clientMsgID);
37341
+ const hasReadTime = Number((_a = msg == null ? void 0 : msg.attachedInfoElem) == null ? void 0 : _a.hasReadTime) || 0;
37342
+ const deadline = deadlines.get(key) || (hasReadTime ? hasReadTime + duration * 1e3 : 0);
37343
+ if (!deadline) return 0;
37344
+ return Math.max(0, Math.ceil((deadline - Date.now()) / 1e3));
37345
+ };
37346
+ return {
37347
+ onBurn,
37348
+ scheduleBurn,
37349
+ cancelBurn,
37350
+ cancelConversation,
37351
+ cancelAll,
37352
+ burnRemain
37353
+ };
37354
+ };
37355
+ function commonjsRequire(path) {
37356
+ 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.');
37357
+ }
37358
+ var localforage$1 = { exports: {} };
37359
+ /*!
37360
+ localForage -- Offline Storage, Improved
37361
+ Version 1.10.0
37362
+ https://localforage.github.io/localForage
37363
+ (c) 2013-2017 Mozilla, Apache License 2.0
37364
+ */
37365
+ var hasRequiredLocalforage;
37366
+ function requireLocalforage() {
37367
+ if (hasRequiredLocalforage) return localforage$1.exports;
37368
+ hasRequiredLocalforage = 1;
37369
+ (function(module, exports) {
37370
+ (function(f2) {
37371
+ {
37372
+ module.exports = f2();
37373
+ }
37374
+ })(function() {
37375
+ return (function e2(t2, n2, r) {
37376
+ function s2(o2, u2) {
37377
+ if (!n2[o2]) {
37378
+ if (!t2[o2]) {
37379
+ var a2 = typeof commonjsRequire == "function" && commonjsRequire;
37380
+ if (!u2 && a2) return a2(o2, true);
37381
+ if (i3) return i3(o2, true);
37382
+ var f2 = new Error("Cannot find module '" + o2 + "'");
37383
+ throw f2.code = "MODULE_NOT_FOUND", f2;
37384
+ }
37385
+ var l3 = n2[o2] = { exports: {} };
37386
+ t2[o2][0].call(l3.exports, function(e22) {
37387
+ var n22 = t2[o2][1][e22];
37388
+ return s2(n22 ? n22 : e22);
37389
+ }, l3, l3.exports, e2, t2, n2, r);
37390
+ }
37391
+ return n2[o2].exports;
37392
+ }
37393
+ var i3 = typeof commonjsRequire == "function" && commonjsRequire;
37394
+ for (var o = 0; o < r.length; o++) s2(r[o]);
37395
+ return s2;
37396
+ })({ 1: [function(_dereq_, module3, exports3) {
37397
+ (function(global2) {
37398
+ var Mutation = global2.MutationObserver || global2.WebKitMutationObserver;
37399
+ var scheduleDrain;
37400
+ {
37401
+ if (Mutation) {
37402
+ var called = 0;
37403
+ var observer = new Mutation(nextTick);
37404
+ var element = global2.document.createTextNode("");
37405
+ observer.observe(element, {
37406
+ characterData: true
37407
+ });
37408
+ scheduleDrain = function() {
37409
+ element.data = called = ++called % 2;
37410
+ };
37411
+ } else if (!global2.setImmediate && typeof global2.MessageChannel !== "undefined") {
37412
+ var channel = new global2.MessageChannel();
37413
+ channel.port1.onmessage = nextTick;
37414
+ scheduleDrain = function() {
37415
+ channel.port2.postMessage(0);
37416
+ };
37417
+ } else if ("document" in global2 && "onreadystatechange" in global2.document.createElement("script")) {
37418
+ scheduleDrain = function() {
37419
+ var scriptEl = global2.document.createElement("script");
37420
+ scriptEl.onreadystatechange = function() {
37421
+ nextTick();
37422
+ scriptEl.onreadystatechange = null;
37423
+ scriptEl.parentNode.removeChild(scriptEl);
37424
+ scriptEl = null;
37425
+ };
37426
+ global2.document.documentElement.appendChild(scriptEl);
37427
+ };
37428
+ } else {
37429
+ scheduleDrain = function() {
37430
+ setTimeout(nextTick, 0);
37431
+ };
37432
+ }
37433
+ }
37434
+ var draining;
37435
+ var queue = [];
37436
+ function nextTick() {
37437
+ draining = true;
37438
+ var i3, oldQueue;
37439
+ var len = queue.length;
37440
+ while (len) {
37441
+ oldQueue = queue;
37442
+ queue = [];
37443
+ i3 = -1;
37444
+ while (++i3 < len) {
37445
+ oldQueue[i3]();
37446
+ }
37447
+ len = queue.length;
37448
+ }
37449
+ draining = false;
37450
+ }
37451
+ module3.exports = immediate;
37452
+ function immediate(task) {
37453
+ if (queue.push(task) === 1 && !draining) {
37454
+ scheduleDrain();
37455
+ }
37456
+ }
37457
+ }).call(this, typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
37458
+ }, {}], 2: [function(_dereq_, module3, exports3) {
37459
+ var immediate = _dereq_(1);
37460
+ function INTERNAL() {
37461
+ }
37462
+ var handlers2 = {};
37463
+ var REJECTED = ["REJECTED"];
37464
+ var FULFILLED = ["FULFILLED"];
37465
+ var PENDING = ["PENDING"];
37466
+ module3.exports = Promise2;
37467
+ function Promise2(resolver) {
37468
+ if (typeof resolver !== "function") {
37469
+ throw new TypeError("resolver must be a function");
37470
+ }
37471
+ this.state = PENDING;
37472
+ this.queue = [];
37473
+ this.outcome = void 0;
37474
+ if (resolver !== INTERNAL) {
37475
+ safelyResolveThenable(this, resolver);
37476
+ }
37477
+ }
37478
+ Promise2.prototype["catch"] = function(onRejected) {
37479
+ return this.then(null, onRejected);
37480
+ };
37481
+ Promise2.prototype.then = function(onFulfilled, onRejected) {
37482
+ if (typeof onFulfilled !== "function" && this.state === FULFILLED || typeof onRejected !== "function" && this.state === REJECTED) {
37483
+ return this;
37484
+ }
37485
+ var promise = new this.constructor(INTERNAL);
37486
+ if (this.state !== PENDING) {
37487
+ var resolver = this.state === FULFILLED ? onFulfilled : onRejected;
37488
+ unwrap(promise, resolver, this.outcome);
37489
+ } else {
37490
+ this.queue.push(new QueueItem(promise, onFulfilled, onRejected));
37491
+ }
37492
+ return promise;
37493
+ };
37494
+ function QueueItem(promise, onFulfilled, onRejected) {
37495
+ this.promise = promise;
37496
+ if (typeof onFulfilled === "function") {
37497
+ this.onFulfilled = onFulfilled;
37498
+ this.callFulfilled = this.otherCallFulfilled;
37499
+ }
37500
+ if (typeof onRejected === "function") {
37501
+ this.onRejected = onRejected;
37502
+ this.callRejected = this.otherCallRejected;
37503
+ }
37504
+ }
37505
+ QueueItem.prototype.callFulfilled = function(value) {
37506
+ handlers2.resolve(this.promise, value);
37507
+ };
37508
+ QueueItem.prototype.otherCallFulfilled = function(value) {
37509
+ unwrap(this.promise, this.onFulfilled, value);
37510
+ };
37511
+ QueueItem.prototype.callRejected = function(value) {
37512
+ handlers2.reject(this.promise, value);
37513
+ };
37514
+ QueueItem.prototype.otherCallRejected = function(value) {
37515
+ unwrap(this.promise, this.onRejected, value);
37516
+ };
37517
+ function unwrap(promise, func, value) {
37518
+ immediate(function() {
37519
+ var returnValue;
37520
+ try {
37521
+ returnValue = func(value);
37522
+ } catch (e2) {
37523
+ return handlers2.reject(promise, e2);
37524
+ }
37525
+ if (returnValue === promise) {
37526
+ handlers2.reject(promise, new TypeError("Cannot resolve promise with itself"));
37527
+ } else {
37528
+ handlers2.resolve(promise, returnValue);
37529
+ }
37530
+ });
37531
+ }
37532
+ handlers2.resolve = function(self2, value) {
37533
+ var result = tryCatch(getThen, value);
37534
+ if (result.status === "error") {
37535
+ return handlers2.reject(self2, result.value);
37536
+ }
37537
+ var thenable = result.value;
37538
+ if (thenable) {
37539
+ safelyResolveThenable(self2, thenable);
37540
+ } else {
37541
+ self2.state = FULFILLED;
37542
+ self2.outcome = value;
37543
+ var i3 = -1;
37544
+ var len = self2.queue.length;
37545
+ while (++i3 < len) {
37546
+ self2.queue[i3].callFulfilled(value);
37547
+ }
37548
+ }
37549
+ return self2;
37550
+ };
37551
+ handlers2.reject = function(self2, error) {
37552
+ self2.state = REJECTED;
37553
+ self2.outcome = error;
37554
+ var i3 = -1;
37555
+ var len = self2.queue.length;
37556
+ while (++i3 < len) {
37557
+ self2.queue[i3].callRejected(error);
37558
+ }
37559
+ return self2;
37560
+ };
37561
+ function getThen(obj) {
37562
+ var then = obj && obj.then;
37563
+ if (obj && (typeof obj === "object" || typeof obj === "function") && typeof then === "function") {
37564
+ return function appyThen() {
37565
+ then.apply(obj, arguments);
37566
+ };
37567
+ }
37568
+ }
37569
+ function safelyResolveThenable(self2, thenable) {
37570
+ var called = false;
37571
+ function onError(value) {
37572
+ if (called) {
37573
+ return;
37574
+ }
37575
+ called = true;
37576
+ handlers2.reject(self2, value);
37577
+ }
37578
+ function onSuccess(value) {
37579
+ if (called) {
37580
+ return;
37581
+ }
37582
+ called = true;
37583
+ handlers2.resolve(self2, value);
37584
+ }
37585
+ function tryToUnwrap() {
37586
+ thenable(onSuccess, onError);
37587
+ }
37588
+ var result = tryCatch(tryToUnwrap);
37589
+ if (result.status === "error") {
37590
+ onError(result.value);
37591
+ }
37592
+ }
37593
+ function tryCatch(func, value) {
37594
+ var out = {};
37595
+ try {
37596
+ out.value = func(value);
37597
+ out.status = "success";
37598
+ } catch (e2) {
37599
+ out.status = "error";
37600
+ out.value = e2;
37601
+ }
37602
+ return out;
37603
+ }
37604
+ Promise2.resolve = resolve;
37605
+ function resolve(value) {
37606
+ if (value instanceof this) {
37607
+ return value;
37608
+ }
37609
+ return handlers2.resolve(new this(INTERNAL), value);
37610
+ }
37611
+ Promise2.reject = reject;
37612
+ function reject(reason) {
37613
+ var promise = new this(INTERNAL);
37614
+ return handlers2.reject(promise, reason);
37615
+ }
37616
+ Promise2.all = all;
37617
+ function all(iterable) {
37618
+ var self2 = this;
37619
+ if (Object.prototype.toString.call(iterable) !== "[object Array]") {
37620
+ return this.reject(new TypeError("must be an array"));
37621
+ }
37622
+ var len = iterable.length;
37623
+ var called = false;
37624
+ if (!len) {
37625
+ return this.resolve([]);
37626
+ }
37627
+ var values = new Array(len);
37628
+ var resolved = 0;
37629
+ var i3 = -1;
37630
+ var promise = new this(INTERNAL);
37631
+ while (++i3 < len) {
37632
+ allResolver(iterable[i3], i3);
37633
+ }
37634
+ return promise;
37635
+ function allResolver(value, i22) {
37636
+ self2.resolve(value).then(resolveFromAll, function(error) {
37637
+ if (!called) {
37638
+ called = true;
37639
+ handlers2.reject(promise, error);
37640
+ }
37641
+ });
37642
+ function resolveFromAll(outValue) {
37643
+ values[i22] = outValue;
37644
+ if (++resolved === len && !called) {
37645
+ called = true;
37646
+ handlers2.resolve(promise, values);
37647
+ }
37648
+ }
37649
+ }
37650
+ }
37651
+ Promise2.race = race;
37652
+ function race(iterable) {
37653
+ var self2 = this;
37654
+ if (Object.prototype.toString.call(iterable) !== "[object Array]") {
37655
+ return this.reject(new TypeError("must be an array"));
37656
+ }
37657
+ var len = iterable.length;
37658
+ var called = false;
37659
+ if (!len) {
37660
+ return this.resolve([]);
37661
+ }
37662
+ var i3 = -1;
37663
+ var promise = new this(INTERNAL);
37664
+ while (++i3 < len) {
37665
+ resolver(iterable[i3]);
37666
+ }
37667
+ return promise;
37668
+ function resolver(value) {
37669
+ self2.resolve(value).then(function(response) {
37670
+ if (!called) {
37671
+ called = true;
37672
+ handlers2.resolve(promise, response);
37673
+ }
37674
+ }, function(error) {
37675
+ if (!called) {
37676
+ called = true;
37677
+ handlers2.reject(promise, error);
37678
+ }
37679
+ });
37680
+ }
37681
+ }
37682
+ }, { "1": 1 }], 3: [function(_dereq_, module3, exports3) {
37683
+ (function(global2) {
37684
+ if (typeof global2.Promise !== "function") {
37685
+ global2.Promise = _dereq_(2);
37686
+ }
37687
+ }).call(this, typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
37688
+ }, { "2": 2 }], 4: [function(_dereq_, module3, exports3) {
37689
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) {
37690
+ return typeof obj;
37691
+ } : function(obj) {
37692
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
37693
+ };
37694
+ function _classCallCheck(instance, Constructor) {
37695
+ if (!(instance instanceof Constructor)) {
37696
+ throw new TypeError("Cannot call a class as a function");
37697
+ }
37698
+ }
37699
+ function getIDB() {
37700
+ try {
37701
+ if (typeof indexedDB !== "undefined") {
37702
+ return indexedDB;
37703
+ }
37704
+ if (typeof webkitIndexedDB !== "undefined") {
37705
+ return webkitIndexedDB;
37706
+ }
37707
+ if (typeof mozIndexedDB !== "undefined") {
37708
+ return mozIndexedDB;
37709
+ }
37710
+ if (typeof OIndexedDB !== "undefined") {
37711
+ return OIndexedDB;
37712
+ }
37713
+ if (typeof msIndexedDB !== "undefined") {
37714
+ return msIndexedDB;
37715
+ }
37716
+ } catch (e2) {
37717
+ return;
37718
+ }
37719
+ }
37720
+ var idb = getIDB();
37721
+ function isIndexedDBValid() {
37722
+ try {
37723
+ if (!idb || !idb.open) {
37724
+ return false;
37725
+ }
37726
+ var isSafari = typeof openDatabase !== "undefined" && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);
37727
+ var hasFetch = typeof fetch === "function" && fetch.toString().indexOf("[native code") !== -1;
37728
+ return (!isSafari || hasFetch) && typeof indexedDB !== "undefined" && // some outdated implementations of IDB that appear on Samsung
37729
+ // and HTC Android devices <4.4 are missing IDBKeyRange
37730
+ // See: https://github.com/mozilla/localForage/issues/128
37731
+ // See: https://github.com/mozilla/localForage/issues/272
37732
+ typeof IDBKeyRange !== "undefined";
37733
+ } catch (e2) {
37734
+ return false;
37735
+ }
37736
+ }
37737
+ function createBlob(parts, properties) {
37738
+ parts = parts || [];
37739
+ properties = properties || {};
37740
+ try {
37741
+ return new Blob(parts, properties);
37742
+ } catch (e2) {
37743
+ if (e2.name !== "TypeError") {
37744
+ throw e2;
37745
+ }
37746
+ var Builder = typeof BlobBuilder !== "undefined" ? BlobBuilder : typeof MSBlobBuilder !== "undefined" ? MSBlobBuilder : typeof MozBlobBuilder !== "undefined" ? MozBlobBuilder : WebKitBlobBuilder;
37747
+ var builder = new Builder();
37748
+ for (var i3 = 0; i3 < parts.length; i3 += 1) {
37749
+ builder.append(parts[i3]);
37750
+ }
37751
+ return builder.getBlob(properties.type);
37752
+ }
37753
+ }
37754
+ if (typeof Promise === "undefined") {
37755
+ _dereq_(3);
37756
+ }
37757
+ var Promise$1 = Promise;
37758
+ function executeCallback(promise, callback) {
37759
+ if (callback) {
37760
+ promise.then(function(result) {
37761
+ callback(null, result);
37762
+ }, function(error) {
37763
+ callback(error);
37764
+ });
37765
+ }
37766
+ }
37767
+ function executeTwoCallbacks(promise, callback, errorCallback) {
37768
+ if (typeof callback === "function") {
37769
+ promise.then(callback);
37770
+ }
37771
+ if (typeof errorCallback === "function") {
37772
+ promise["catch"](errorCallback);
37773
+ }
37774
+ }
37775
+ function normalizeKey(key2) {
37776
+ if (typeof key2 !== "string") {
37777
+ console.warn(key2 + " used as a key, but it is not a string.");
37778
+ key2 = String(key2);
37779
+ }
37780
+ return key2;
37781
+ }
37782
+ function getCallback() {
37783
+ if (arguments.length && typeof arguments[arguments.length - 1] === "function") {
37784
+ return arguments[arguments.length - 1];
37785
+ }
37786
+ }
37787
+ var DETECT_BLOB_SUPPORT_STORE = "local-forage-detect-blob-support";
37788
+ var supportsBlobs = void 0;
37789
+ var dbContexts = {};
37790
+ var toString = Object.prototype.toString;
37791
+ var READ_ONLY = "readonly";
37792
+ var READ_WRITE = "readwrite";
37793
+ function _binStringToArrayBuffer(bin) {
37794
+ var length2 = bin.length;
37795
+ var buf = new ArrayBuffer(length2);
37796
+ var arr = new Uint8Array(buf);
37797
+ for (var i3 = 0; i3 < length2; i3++) {
37798
+ arr[i3] = bin.charCodeAt(i3);
37799
+ }
37800
+ return buf;
37801
+ }
37802
+ function _checkBlobSupportWithoutCaching(idb2) {
37803
+ return new Promise$1(function(resolve) {
37804
+ var txn = idb2.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);
37805
+ var blob = createBlob([""]);
37806
+ txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, "key");
37807
+ txn.onabort = function(e2) {
37808
+ e2.preventDefault();
37809
+ e2.stopPropagation();
37810
+ resolve(false);
37811
+ };
37812
+ txn.oncomplete = function() {
37813
+ var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/);
37814
+ var matchedEdge = navigator.userAgent.match(/Edge\//);
37815
+ resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);
37816
+ };
37817
+ })["catch"](function() {
37818
+ return false;
37819
+ });
37820
+ }
37821
+ function _checkBlobSupport(idb2) {
37822
+ if (typeof supportsBlobs === "boolean") {
37823
+ return Promise$1.resolve(supportsBlobs);
37824
+ }
37825
+ return _checkBlobSupportWithoutCaching(idb2).then(function(value) {
37826
+ supportsBlobs = value;
37827
+ return supportsBlobs;
37828
+ });
37829
+ }
37830
+ function _deferReadiness(dbInfo) {
37831
+ var dbContext = dbContexts[dbInfo.name];
37832
+ var deferredOperation = {};
37833
+ deferredOperation.promise = new Promise$1(function(resolve, reject) {
37834
+ deferredOperation.resolve = resolve;
37835
+ deferredOperation.reject = reject;
37836
+ });
37837
+ dbContext.deferredOperations.push(deferredOperation);
37838
+ if (!dbContext.dbReady) {
37839
+ dbContext.dbReady = deferredOperation.promise;
37840
+ } else {
37841
+ dbContext.dbReady = dbContext.dbReady.then(function() {
37842
+ return deferredOperation.promise;
37843
+ });
37844
+ }
37845
+ }
37846
+ function _advanceReadiness(dbInfo) {
37847
+ var dbContext = dbContexts[dbInfo.name];
37848
+ var deferredOperation = dbContext.deferredOperations.pop();
37849
+ if (deferredOperation) {
37850
+ deferredOperation.resolve();
37851
+ return deferredOperation.promise;
37852
+ }
37853
+ }
37854
+ function _rejectReadiness(dbInfo, err) {
37855
+ var dbContext = dbContexts[dbInfo.name];
37856
+ var deferredOperation = dbContext.deferredOperations.pop();
37857
+ if (deferredOperation) {
37858
+ deferredOperation.reject(err);
37859
+ return deferredOperation.promise;
37860
+ }
37861
+ }
37862
+ function _getConnection(dbInfo, upgradeNeeded) {
37863
+ return new Promise$1(function(resolve, reject) {
37864
+ dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();
37865
+ if (dbInfo.db) {
37866
+ if (upgradeNeeded) {
37867
+ _deferReadiness(dbInfo);
37868
+ dbInfo.db.close();
37869
+ } else {
37870
+ return resolve(dbInfo.db);
37871
+ }
37872
+ }
37873
+ var dbArgs = [dbInfo.name];
37874
+ if (upgradeNeeded) {
37875
+ dbArgs.push(dbInfo.version);
37876
+ }
37877
+ var openreq = idb.open.apply(idb, dbArgs);
37878
+ if (upgradeNeeded) {
37879
+ openreq.onupgradeneeded = function(e2) {
37880
+ var db = openreq.result;
37881
+ try {
37882
+ db.createObjectStore(dbInfo.storeName);
37883
+ if (e2.oldVersion <= 1) {
37884
+ db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);
37885
+ }
37886
+ } catch (ex) {
37887
+ if (ex.name === "ConstraintError") {
37888
+ console.warn('The database "' + dbInfo.name + '" has been upgraded from version ' + e2.oldVersion + " to version " + e2.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.');
37889
+ } else {
37890
+ throw ex;
37891
+ }
37892
+ }
37893
+ };
37894
+ }
37895
+ openreq.onerror = function(e2) {
37896
+ e2.preventDefault();
37897
+ reject(openreq.error);
37898
+ };
37899
+ openreq.onsuccess = function() {
37900
+ var db = openreq.result;
37901
+ db.onversionchange = function(e2) {
37902
+ e2.target.close();
37903
+ };
37904
+ resolve(db);
37905
+ _advanceReadiness(dbInfo);
37906
+ };
37907
+ });
37908
+ }
37909
+ function _getOriginalConnection(dbInfo) {
37910
+ return _getConnection(dbInfo, false);
37911
+ }
37912
+ function _getUpgradedConnection(dbInfo) {
37913
+ return _getConnection(dbInfo, true);
37914
+ }
37915
+ function _isUpgradeNeeded(dbInfo, defaultVersion) {
37916
+ if (!dbInfo.db) {
37917
+ return true;
37918
+ }
37919
+ var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);
37920
+ var isDowngrade = dbInfo.version < dbInfo.db.version;
37921
+ var isUpgrade = dbInfo.version > dbInfo.db.version;
37922
+ if (isDowngrade) {
37923
+ if (dbInfo.version !== defaultVersion) {
37924
+ console.warn('The database "' + dbInfo.name + `" can't be downgraded from version ` + dbInfo.db.version + " to version " + dbInfo.version + ".");
37925
+ }
37926
+ dbInfo.version = dbInfo.db.version;
37927
+ }
37928
+ if (isUpgrade || isNewStore) {
37929
+ if (isNewStore) {
37930
+ var incVersion = dbInfo.db.version + 1;
37931
+ if (incVersion > dbInfo.version) {
37932
+ dbInfo.version = incVersion;
37933
+ }
37934
+ }
37935
+ return true;
37936
+ }
37937
+ return false;
37938
+ }
37939
+ function _encodeBlob(blob) {
37940
+ return new Promise$1(function(resolve, reject) {
37941
+ var reader = new FileReader();
37942
+ reader.onerror = reject;
37943
+ reader.onloadend = function(e2) {
37944
+ var base64 = btoa(e2.target.result || "");
37945
+ resolve({
37946
+ __local_forage_encoded_blob: true,
37947
+ data: base64,
37948
+ type: blob.type
37949
+ });
37950
+ };
37951
+ reader.readAsBinaryString(blob);
37952
+ });
37953
+ }
37954
+ function _decodeBlob(encodedBlob) {
37955
+ var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));
37956
+ return createBlob([arrayBuff], { type: encodedBlob.type });
37957
+ }
37958
+ function _isEncodedBlob(value) {
37959
+ return value && value.__local_forage_encoded_blob;
37960
+ }
37961
+ function _fullyReady(callback) {
37962
+ var self2 = this;
37963
+ var promise = self2._initReady().then(function() {
37964
+ var dbContext = dbContexts[self2._dbInfo.name];
37965
+ if (dbContext && dbContext.dbReady) {
37966
+ return dbContext.dbReady;
37967
+ }
37968
+ });
37969
+ executeTwoCallbacks(promise, callback, callback);
37970
+ return promise;
37971
+ }
37972
+ function _tryReconnect(dbInfo) {
37973
+ _deferReadiness(dbInfo);
37974
+ var dbContext = dbContexts[dbInfo.name];
37975
+ var forages = dbContext.forages;
37976
+ for (var i3 = 0; i3 < forages.length; i3++) {
37977
+ var forage = forages[i3];
37978
+ if (forage._dbInfo.db) {
37979
+ forage._dbInfo.db.close();
37980
+ forage._dbInfo.db = null;
37981
+ }
37982
+ }
37983
+ dbInfo.db = null;
37984
+ return _getOriginalConnection(dbInfo).then(function(db) {
37985
+ dbInfo.db = db;
37986
+ if (_isUpgradeNeeded(dbInfo)) {
37987
+ return _getUpgradedConnection(dbInfo);
37988
+ }
37989
+ return db;
37990
+ }).then(function(db) {
37991
+ dbInfo.db = dbContext.db = db;
37992
+ for (var i22 = 0; i22 < forages.length; i22++) {
37993
+ forages[i22]._dbInfo.db = db;
37994
+ }
37995
+ })["catch"](function(err) {
37996
+ _rejectReadiness(dbInfo, err);
37997
+ throw err;
37998
+ });
37999
+ }
38000
+ function createTransaction(dbInfo, mode, callback, retries) {
38001
+ if (retries === void 0) {
38002
+ retries = 1;
38003
+ }
38004
+ try {
38005
+ var tx = dbInfo.db.transaction(dbInfo.storeName, mode);
38006
+ callback(null, tx);
38007
+ } catch (err) {
38008
+ if (retries > 0 && (!dbInfo.db || err.name === "InvalidStateError" || err.name === "NotFoundError")) {
38009
+ return Promise$1.resolve().then(function() {
38010
+ if (!dbInfo.db || err.name === "NotFoundError" && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {
38011
+ if (dbInfo.db) {
38012
+ dbInfo.version = dbInfo.db.version + 1;
38013
+ }
38014
+ return _getUpgradedConnection(dbInfo);
38015
+ }
38016
+ }).then(function() {
38017
+ return _tryReconnect(dbInfo).then(function() {
38018
+ createTransaction(dbInfo, mode, callback, retries - 1);
38019
+ });
38020
+ })["catch"](callback);
38021
+ }
38022
+ callback(err);
38023
+ }
38024
+ }
38025
+ function createDbContext() {
38026
+ return {
38027
+ // Running localForages sharing a database.
38028
+ forages: [],
38029
+ // Shared database.
38030
+ db: null,
38031
+ // Database readiness (promise).
38032
+ dbReady: null,
38033
+ // Deferred operations on the database.
38034
+ deferredOperations: []
38035
+ };
38036
+ }
38037
+ function _initStorage(options) {
38038
+ var self2 = this;
38039
+ var dbInfo = {
38040
+ db: null
38041
+ };
38042
+ if (options) {
38043
+ for (var i3 in options) {
38044
+ dbInfo[i3] = options[i3];
38045
+ }
38046
+ }
38047
+ var dbContext = dbContexts[dbInfo.name];
38048
+ if (!dbContext) {
38049
+ dbContext = createDbContext();
38050
+ dbContexts[dbInfo.name] = dbContext;
38051
+ }
38052
+ dbContext.forages.push(self2);
38053
+ if (!self2._initReady) {
38054
+ self2._initReady = self2.ready;
38055
+ self2.ready = _fullyReady;
38056
+ }
38057
+ var initPromises = [];
38058
+ function ignoreErrors() {
38059
+ return Promise$1.resolve();
38060
+ }
38061
+ for (var j3 = 0; j3 < dbContext.forages.length; j3++) {
38062
+ var forage = dbContext.forages[j3];
38063
+ if (forage !== self2) {
38064
+ initPromises.push(forage._initReady()["catch"](ignoreErrors));
38065
+ }
38066
+ }
38067
+ var forages = dbContext.forages.slice(0);
38068
+ return Promise$1.all(initPromises).then(function() {
38069
+ dbInfo.db = dbContext.db;
38070
+ return _getOriginalConnection(dbInfo);
38071
+ }).then(function(db) {
38072
+ dbInfo.db = db;
38073
+ if (_isUpgradeNeeded(dbInfo, self2._defaultConfig.version)) {
38074
+ return _getUpgradedConnection(dbInfo);
38075
+ }
38076
+ return db;
38077
+ }).then(function(db) {
38078
+ dbInfo.db = dbContext.db = db;
38079
+ self2._dbInfo = dbInfo;
38080
+ for (var k2 = 0; k2 < forages.length; k2++) {
38081
+ var forage2 = forages[k2];
38082
+ if (forage2 !== self2) {
38083
+ forage2._dbInfo.db = dbInfo.db;
38084
+ forage2._dbInfo.version = dbInfo.version;
38085
+ }
38086
+ }
38087
+ });
38088
+ }
38089
+ function getItem(key2, callback) {
38090
+ var self2 = this;
38091
+ key2 = normalizeKey(key2);
38092
+ var promise = new Promise$1(function(resolve, reject) {
38093
+ self2.ready().then(function() {
38094
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38095
+ if (err) {
38096
+ return reject(err);
38097
+ }
38098
+ try {
38099
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38100
+ var req = store.get(key2);
38101
+ req.onsuccess = function() {
38102
+ var value = req.result;
38103
+ if (value === void 0) {
38104
+ value = null;
38105
+ }
38106
+ if (_isEncodedBlob(value)) {
38107
+ value = _decodeBlob(value);
38108
+ }
38109
+ resolve(value);
38110
+ };
38111
+ req.onerror = function() {
38112
+ reject(req.error);
38113
+ };
38114
+ } catch (e2) {
38115
+ reject(e2);
38116
+ }
38117
+ });
38118
+ })["catch"](reject);
38119
+ });
38120
+ executeCallback(promise, callback);
38121
+ return promise;
38122
+ }
38123
+ function iterate(iterator, callback) {
38124
+ var self2 = this;
38125
+ var promise = new Promise$1(function(resolve, reject) {
38126
+ self2.ready().then(function() {
38127
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38128
+ if (err) {
38129
+ return reject(err);
38130
+ }
38131
+ try {
38132
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38133
+ var req = store.openCursor();
38134
+ var iterationNumber = 1;
38135
+ req.onsuccess = function() {
38136
+ var cursor = req.result;
38137
+ if (cursor) {
38138
+ var value = cursor.value;
38139
+ if (_isEncodedBlob(value)) {
38140
+ value = _decodeBlob(value);
38141
+ }
38142
+ var result = iterator(value, cursor.key, iterationNumber++);
38143
+ if (result !== void 0) {
38144
+ resolve(result);
38145
+ } else {
38146
+ cursor["continue"]();
38147
+ }
38148
+ } else {
38149
+ resolve();
38150
+ }
38151
+ };
38152
+ req.onerror = function() {
38153
+ reject(req.error);
38154
+ };
38155
+ } catch (e2) {
38156
+ reject(e2);
38157
+ }
38158
+ });
38159
+ })["catch"](reject);
38160
+ });
38161
+ executeCallback(promise, callback);
38162
+ return promise;
38163
+ }
38164
+ function setItem(key2, value, callback) {
38165
+ var self2 = this;
38166
+ key2 = normalizeKey(key2);
38167
+ var promise = new Promise$1(function(resolve, reject) {
38168
+ var dbInfo;
38169
+ self2.ready().then(function() {
38170
+ dbInfo = self2._dbInfo;
38171
+ if (toString.call(value) === "[object Blob]") {
38172
+ return _checkBlobSupport(dbInfo.db).then(function(blobSupport) {
38173
+ if (blobSupport) {
38174
+ return value;
38175
+ }
38176
+ return _encodeBlob(value);
38177
+ });
38178
+ }
38179
+ return value;
38180
+ }).then(function(value2) {
38181
+ createTransaction(self2._dbInfo, READ_WRITE, function(err, transaction) {
38182
+ if (err) {
38183
+ return reject(err);
38184
+ }
38185
+ try {
38186
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38187
+ if (value2 === null) {
38188
+ value2 = void 0;
38189
+ }
38190
+ var req = store.put(value2, key2);
38191
+ transaction.oncomplete = function() {
38192
+ if (value2 === void 0) {
38193
+ value2 = null;
38194
+ }
38195
+ resolve(value2);
38196
+ };
38197
+ transaction.onabort = transaction.onerror = function() {
38198
+ var err2 = req.error ? req.error : req.transaction.error;
38199
+ reject(err2);
38200
+ };
38201
+ } catch (e2) {
38202
+ reject(e2);
38203
+ }
38204
+ });
38205
+ })["catch"](reject);
38206
+ });
38207
+ executeCallback(promise, callback);
38208
+ return promise;
38209
+ }
38210
+ function removeItem(key2, callback) {
38211
+ var self2 = this;
38212
+ key2 = normalizeKey(key2);
38213
+ var promise = new Promise$1(function(resolve, reject) {
38214
+ self2.ready().then(function() {
38215
+ createTransaction(self2._dbInfo, READ_WRITE, function(err, transaction) {
38216
+ if (err) {
38217
+ return reject(err);
38218
+ }
38219
+ try {
38220
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38221
+ var req = store["delete"](key2);
38222
+ transaction.oncomplete = function() {
38223
+ resolve();
38224
+ };
38225
+ transaction.onerror = function() {
38226
+ reject(req.error);
38227
+ };
38228
+ transaction.onabort = function() {
38229
+ var err2 = req.error ? req.error : req.transaction.error;
38230
+ reject(err2);
38231
+ };
38232
+ } catch (e2) {
38233
+ reject(e2);
38234
+ }
38235
+ });
38236
+ })["catch"](reject);
38237
+ });
38238
+ executeCallback(promise, callback);
38239
+ return promise;
38240
+ }
38241
+ function clear(callback) {
38242
+ var self2 = this;
38243
+ var promise = new Promise$1(function(resolve, reject) {
38244
+ self2.ready().then(function() {
38245
+ createTransaction(self2._dbInfo, READ_WRITE, function(err, transaction) {
38246
+ if (err) {
38247
+ return reject(err);
38248
+ }
38249
+ try {
38250
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38251
+ var req = store.clear();
38252
+ transaction.oncomplete = function() {
38253
+ resolve();
38254
+ };
38255
+ transaction.onabort = transaction.onerror = function() {
38256
+ var err2 = req.error ? req.error : req.transaction.error;
38257
+ reject(err2);
38258
+ };
38259
+ } catch (e2) {
38260
+ reject(e2);
38261
+ }
38262
+ });
38263
+ })["catch"](reject);
38264
+ });
38265
+ executeCallback(promise, callback);
38266
+ return promise;
38267
+ }
38268
+ function length(callback) {
38269
+ var self2 = this;
38270
+ var promise = new Promise$1(function(resolve, reject) {
38271
+ self2.ready().then(function() {
38272
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38273
+ if (err) {
38274
+ return reject(err);
38275
+ }
38276
+ try {
38277
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38278
+ var req = store.count();
38279
+ req.onsuccess = function() {
38280
+ resolve(req.result);
38281
+ };
38282
+ req.onerror = function() {
38283
+ reject(req.error);
38284
+ };
38285
+ } catch (e2) {
38286
+ reject(e2);
38287
+ }
38288
+ });
38289
+ })["catch"](reject);
38290
+ });
38291
+ executeCallback(promise, callback);
38292
+ return promise;
38293
+ }
38294
+ function key(n2, callback) {
38295
+ var self2 = this;
38296
+ var promise = new Promise$1(function(resolve, reject) {
38297
+ if (n2 < 0) {
38298
+ resolve(null);
38299
+ return;
38300
+ }
38301
+ self2.ready().then(function() {
38302
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38303
+ if (err) {
38304
+ return reject(err);
38305
+ }
38306
+ try {
38307
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38308
+ var advanced = false;
38309
+ var req = store.openKeyCursor();
38310
+ req.onsuccess = function() {
38311
+ var cursor = req.result;
38312
+ if (!cursor) {
38313
+ resolve(null);
38314
+ return;
38315
+ }
38316
+ if (n2 === 0) {
38317
+ resolve(cursor.key);
38318
+ } else {
38319
+ if (!advanced) {
38320
+ advanced = true;
38321
+ cursor.advance(n2);
38322
+ } else {
38323
+ resolve(cursor.key);
38324
+ }
38325
+ }
38326
+ };
38327
+ req.onerror = function() {
38328
+ reject(req.error);
38329
+ };
38330
+ } catch (e2) {
38331
+ reject(e2);
38332
+ }
38333
+ });
38334
+ })["catch"](reject);
38335
+ });
38336
+ executeCallback(promise, callback);
38337
+ return promise;
38338
+ }
38339
+ function keys(callback) {
38340
+ var self2 = this;
38341
+ var promise = new Promise$1(function(resolve, reject) {
38342
+ self2.ready().then(function() {
38343
+ createTransaction(self2._dbInfo, READ_ONLY, function(err, transaction) {
38344
+ if (err) {
38345
+ return reject(err);
38346
+ }
38347
+ try {
38348
+ var store = transaction.objectStore(self2._dbInfo.storeName);
38349
+ var req = store.openKeyCursor();
38350
+ var keys2 = [];
38351
+ req.onsuccess = function() {
38352
+ var cursor = req.result;
38353
+ if (!cursor) {
38354
+ resolve(keys2);
38355
+ return;
38356
+ }
38357
+ keys2.push(cursor.key);
38358
+ cursor["continue"]();
38359
+ };
38360
+ req.onerror = function() {
38361
+ reject(req.error);
38362
+ };
38363
+ } catch (e2) {
38364
+ reject(e2);
38365
+ }
38366
+ });
38367
+ })["catch"](reject);
38368
+ });
38369
+ executeCallback(promise, callback);
38370
+ return promise;
38371
+ }
38372
+ function dropInstance(options, callback) {
38373
+ callback = getCallback.apply(this, arguments);
38374
+ var currentConfig = this.config();
38375
+ options = typeof options !== "function" && options || {};
38376
+ if (!options.name) {
38377
+ options.name = options.name || currentConfig.name;
38378
+ options.storeName = options.storeName || currentConfig.storeName;
38379
+ }
38380
+ var self2 = this;
38381
+ var promise;
38382
+ if (!options.name) {
38383
+ promise = Promise$1.reject("Invalid arguments");
38384
+ } else {
38385
+ var isCurrentDb = options.name === currentConfig.name && self2._dbInfo.db;
38386
+ var dbPromise = isCurrentDb ? Promise$1.resolve(self2._dbInfo.db) : _getOriginalConnection(options).then(function(db) {
38387
+ var dbContext = dbContexts[options.name];
38388
+ var forages = dbContext.forages;
38389
+ dbContext.db = db;
38390
+ for (var i3 = 0; i3 < forages.length; i3++) {
38391
+ forages[i3]._dbInfo.db = db;
38392
+ }
38393
+ return db;
38394
+ });
38395
+ if (!options.storeName) {
38396
+ promise = dbPromise.then(function(db) {
38397
+ _deferReadiness(options);
38398
+ var dbContext = dbContexts[options.name];
38399
+ var forages = dbContext.forages;
38400
+ db.close();
38401
+ for (var i3 = 0; i3 < forages.length; i3++) {
38402
+ var forage = forages[i3];
38403
+ forage._dbInfo.db = null;
38404
+ }
38405
+ var dropDBPromise = new Promise$1(function(resolve, reject) {
38406
+ var req = idb.deleteDatabase(options.name);
38407
+ req.onerror = function() {
38408
+ var db2 = req.result;
38409
+ if (db2) {
38410
+ db2.close();
38411
+ }
38412
+ reject(req.error);
38413
+ };
38414
+ req.onblocked = function() {
38415
+ console.warn('dropInstance blocked for database "' + options.name + '" until all open connections are closed');
38416
+ };
38417
+ req.onsuccess = function() {
38418
+ var db2 = req.result;
38419
+ if (db2) {
38420
+ db2.close();
38421
+ }
38422
+ resolve(db2);
38423
+ };
38424
+ });
38425
+ return dropDBPromise.then(function(db2) {
38426
+ dbContext.db = db2;
38427
+ for (var i22 = 0; i22 < forages.length; i22++) {
38428
+ var _forage = forages[i22];
38429
+ _advanceReadiness(_forage._dbInfo);
38430
+ }
38431
+ })["catch"](function(err) {
38432
+ (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function() {
38433
+ });
38434
+ throw err;
38435
+ });
38436
+ });
38437
+ } else {
38438
+ promise = dbPromise.then(function(db) {
38439
+ if (!db.objectStoreNames.contains(options.storeName)) {
38440
+ return;
38441
+ }
38442
+ var newVersion = db.version + 1;
38443
+ _deferReadiness(options);
38444
+ var dbContext = dbContexts[options.name];
38445
+ var forages = dbContext.forages;
38446
+ db.close();
38447
+ for (var i3 = 0; i3 < forages.length; i3++) {
38448
+ var forage = forages[i3];
38449
+ forage._dbInfo.db = null;
38450
+ forage._dbInfo.version = newVersion;
38451
+ }
38452
+ var dropObjectPromise = new Promise$1(function(resolve, reject) {
38453
+ var req = idb.open(options.name, newVersion);
38454
+ req.onerror = function(err) {
38455
+ var db2 = req.result;
38456
+ db2.close();
38457
+ reject(err);
38458
+ };
38459
+ req.onupgradeneeded = function() {
38460
+ var db2 = req.result;
38461
+ db2.deleteObjectStore(options.storeName);
38462
+ };
38463
+ req.onsuccess = function() {
38464
+ var db2 = req.result;
38465
+ db2.close();
38466
+ resolve(db2);
38467
+ };
38468
+ });
38469
+ return dropObjectPromise.then(function(db2) {
38470
+ dbContext.db = db2;
38471
+ for (var j3 = 0; j3 < forages.length; j3++) {
38472
+ var _forage2 = forages[j3];
38473
+ _forage2._dbInfo.db = db2;
38474
+ _advanceReadiness(_forage2._dbInfo);
38475
+ }
38476
+ })["catch"](function(err) {
38477
+ (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function() {
38478
+ });
38479
+ throw err;
38480
+ });
38481
+ });
38482
+ }
38483
+ }
38484
+ executeCallback(promise, callback);
38485
+ return promise;
38486
+ }
38487
+ var asyncStorage = {
38488
+ _driver: "asyncStorage",
38489
+ _initStorage,
38490
+ _support: isIndexedDBValid(),
38491
+ iterate,
38492
+ getItem,
38493
+ setItem,
38494
+ removeItem,
38495
+ clear,
38496
+ length,
38497
+ key,
38498
+ keys,
38499
+ dropInstance
38500
+ };
38501
+ function isWebSQLValid() {
38502
+ return typeof openDatabase === "function";
38503
+ }
38504
+ var BASE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
38505
+ var BLOB_TYPE_PREFIX = "~~local_forage_type~";
38506
+ var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;
38507
+ var SERIALIZED_MARKER = "__lfsc__:";
38508
+ var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;
38509
+ var TYPE_ARRAYBUFFER = "arbf";
38510
+ var TYPE_BLOB = "blob";
38511
+ var TYPE_INT8ARRAY = "si08";
38512
+ var TYPE_UINT8ARRAY = "ui08";
38513
+ var TYPE_UINT8CLAMPEDARRAY = "uic8";
38514
+ var TYPE_INT16ARRAY = "si16";
38515
+ var TYPE_INT32ARRAY = "si32";
38516
+ var TYPE_UINT16ARRAY = "ur16";
38517
+ var TYPE_UINT32ARRAY = "ui32";
38518
+ var TYPE_FLOAT32ARRAY = "fl32";
38519
+ var TYPE_FLOAT64ARRAY = "fl64";
38520
+ var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;
38521
+ var toString$1 = Object.prototype.toString;
38522
+ function stringToBuffer(serializedString) {
38523
+ var bufferLength = serializedString.length * 0.75;
38524
+ var len = serializedString.length;
38525
+ var i3;
38526
+ var p2 = 0;
38527
+ var encoded1, encoded2, encoded3, encoded4;
38528
+ if (serializedString[serializedString.length - 1] === "=") {
38529
+ bufferLength--;
38530
+ if (serializedString[serializedString.length - 2] === "=") {
38531
+ bufferLength--;
38532
+ }
38533
+ }
38534
+ var buffer = new ArrayBuffer(bufferLength);
38535
+ var bytes = new Uint8Array(buffer);
38536
+ for (i3 = 0; i3 < len; i3 += 4) {
38537
+ encoded1 = BASE_CHARS.indexOf(serializedString[i3]);
38538
+ encoded2 = BASE_CHARS.indexOf(serializedString[i3 + 1]);
38539
+ encoded3 = BASE_CHARS.indexOf(serializedString[i3 + 2]);
38540
+ encoded4 = BASE_CHARS.indexOf(serializedString[i3 + 3]);
38541
+ bytes[p2++] = encoded1 << 2 | encoded2 >> 4;
38542
+ bytes[p2++] = (encoded2 & 15) << 4 | encoded3 >> 2;
38543
+ bytes[p2++] = (encoded3 & 3) << 6 | encoded4 & 63;
38544
+ }
38545
+ return buffer;
38546
+ }
38547
+ function bufferToString(buffer) {
38548
+ var bytes = new Uint8Array(buffer);
38549
+ var base64String = "";
38550
+ var i3;
38551
+ for (i3 = 0; i3 < bytes.length; i3 += 3) {
38552
+ base64String += BASE_CHARS[bytes[i3] >> 2];
38553
+ base64String += BASE_CHARS[(bytes[i3] & 3) << 4 | bytes[i3 + 1] >> 4];
38554
+ base64String += BASE_CHARS[(bytes[i3 + 1] & 15) << 2 | bytes[i3 + 2] >> 6];
38555
+ base64String += BASE_CHARS[bytes[i3 + 2] & 63];
38556
+ }
38557
+ if (bytes.length % 3 === 2) {
38558
+ base64String = base64String.substring(0, base64String.length - 1) + "=";
38559
+ } else if (bytes.length % 3 === 1) {
38560
+ base64String = base64String.substring(0, base64String.length - 2) + "==";
38561
+ }
38562
+ return base64String;
38563
+ }
38564
+ function serialize(value, callback) {
38565
+ var valueType = "";
38566
+ if (value) {
38567
+ valueType = toString$1.call(value);
38568
+ }
38569
+ if (value && (valueType === "[object ArrayBuffer]" || value.buffer && toString$1.call(value.buffer) === "[object ArrayBuffer]")) {
38570
+ var buffer;
38571
+ var marker = SERIALIZED_MARKER;
38572
+ if (value instanceof ArrayBuffer) {
38573
+ buffer = value;
38574
+ marker += TYPE_ARRAYBUFFER;
38575
+ } else {
38576
+ buffer = value.buffer;
38577
+ if (valueType === "[object Int8Array]") {
38578
+ marker += TYPE_INT8ARRAY;
38579
+ } else if (valueType === "[object Uint8Array]") {
38580
+ marker += TYPE_UINT8ARRAY;
38581
+ } else if (valueType === "[object Uint8ClampedArray]") {
38582
+ marker += TYPE_UINT8CLAMPEDARRAY;
38583
+ } else if (valueType === "[object Int16Array]") {
38584
+ marker += TYPE_INT16ARRAY;
38585
+ } else if (valueType === "[object Uint16Array]") {
38586
+ marker += TYPE_UINT16ARRAY;
38587
+ } else if (valueType === "[object Int32Array]") {
38588
+ marker += TYPE_INT32ARRAY;
38589
+ } else if (valueType === "[object Uint32Array]") {
38590
+ marker += TYPE_UINT32ARRAY;
38591
+ } else if (valueType === "[object Float32Array]") {
38592
+ marker += TYPE_FLOAT32ARRAY;
38593
+ } else if (valueType === "[object Float64Array]") {
38594
+ marker += TYPE_FLOAT64ARRAY;
38595
+ } else {
38596
+ callback(new Error("Failed to get type for BinaryArray"));
38597
+ }
38598
+ }
38599
+ callback(marker + bufferToString(buffer));
38600
+ } else if (valueType === "[object Blob]") {
38601
+ var fileReader = new FileReader();
38602
+ fileReader.onload = function() {
38603
+ var str = BLOB_TYPE_PREFIX + value.type + "~" + bufferToString(this.result);
38604
+ callback(SERIALIZED_MARKER + TYPE_BLOB + str);
38605
+ };
38606
+ fileReader.readAsArrayBuffer(value);
38607
+ } else {
38608
+ try {
38609
+ callback(JSON.stringify(value));
38610
+ } catch (e2) {
38611
+ console.error("Couldn't convert value into a JSON string: ", value);
38612
+ callback(null, e2);
38613
+ }
38614
+ }
38615
+ }
38616
+ function deserialize(value) {
38617
+ if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {
38618
+ return JSON.parse(value);
38619
+ }
38620
+ var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);
38621
+ var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);
38622
+ var blobType;
38623
+ if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {
38624
+ var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);
38625
+ blobType = matcher[1];
38626
+ serializedString = serializedString.substring(matcher[0].length);
38627
+ }
38628
+ var buffer = stringToBuffer(serializedString);
38629
+ switch (type) {
38630
+ case TYPE_ARRAYBUFFER:
38631
+ return buffer;
38632
+ case TYPE_BLOB:
38633
+ return createBlob([buffer], { type: blobType });
38634
+ case TYPE_INT8ARRAY:
38635
+ return new Int8Array(buffer);
38636
+ case TYPE_UINT8ARRAY:
38637
+ return new Uint8Array(buffer);
38638
+ case TYPE_UINT8CLAMPEDARRAY:
38639
+ return new Uint8ClampedArray(buffer);
38640
+ case TYPE_INT16ARRAY:
38641
+ return new Int16Array(buffer);
38642
+ case TYPE_UINT16ARRAY:
38643
+ return new Uint16Array(buffer);
38644
+ case TYPE_INT32ARRAY:
38645
+ return new Int32Array(buffer);
38646
+ case TYPE_UINT32ARRAY:
38647
+ return new Uint32Array(buffer);
38648
+ case TYPE_FLOAT32ARRAY:
38649
+ return new Float32Array(buffer);
38650
+ case TYPE_FLOAT64ARRAY:
38651
+ return new Float64Array(buffer);
38652
+ default:
38653
+ throw new Error("Unkown type: " + type);
38654
+ }
38655
+ }
38656
+ var localforageSerializer = {
38657
+ serialize,
38658
+ deserialize,
38659
+ stringToBuffer,
38660
+ bufferToString
38661
+ };
38662
+ function createDbTable(t2, dbInfo, callback, errorCallback) {
38663
+ t2.executeSql("CREATE TABLE IF NOT EXISTS " + dbInfo.storeName + " (id INTEGER PRIMARY KEY, key unique, value)", [], callback, errorCallback);
38664
+ }
38665
+ function _initStorage$1(options) {
38666
+ var self2 = this;
38667
+ var dbInfo = {
38668
+ db: null
38669
+ };
38670
+ if (options) {
38671
+ for (var i3 in options) {
38672
+ dbInfo[i3] = typeof options[i3] !== "string" ? options[i3].toString() : options[i3];
38673
+ }
38674
+ }
38675
+ var dbInfoPromise = new Promise$1(function(resolve, reject) {
38676
+ try {
38677
+ dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);
38678
+ } catch (e2) {
38679
+ return reject(e2);
38680
+ }
38681
+ dbInfo.db.transaction(function(t2) {
38682
+ createDbTable(t2, dbInfo, function() {
38683
+ self2._dbInfo = dbInfo;
38684
+ resolve();
38685
+ }, function(t22, error) {
38686
+ reject(error);
38687
+ });
38688
+ }, reject);
38689
+ });
38690
+ dbInfo.serializer = localforageSerializer;
38691
+ return dbInfoPromise;
38692
+ }
38693
+ function tryExecuteSql(t2, dbInfo, sqlStatement, args, callback, errorCallback) {
38694
+ t2.executeSql(sqlStatement, args, callback, function(t22, error) {
38695
+ if (error.code === error.SYNTAX_ERR) {
38696
+ t22.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?", [dbInfo.storeName], function(t3, results) {
38697
+ if (!results.rows.length) {
38698
+ createDbTable(t3, dbInfo, function() {
38699
+ t3.executeSql(sqlStatement, args, callback, errorCallback);
38700
+ }, errorCallback);
38701
+ } else {
38702
+ errorCallback(t3, error);
38703
+ }
38704
+ }, errorCallback);
38705
+ } else {
38706
+ errorCallback(t22, error);
38707
+ }
38708
+ }, errorCallback);
38709
+ }
38710
+ function getItem$1(key2, callback) {
38711
+ var self2 = this;
38712
+ key2 = normalizeKey(key2);
38713
+ var promise = new Promise$1(function(resolve, reject) {
38714
+ self2.ready().then(function() {
38715
+ var dbInfo = self2._dbInfo;
38716
+ dbInfo.db.transaction(function(t2) {
38717
+ tryExecuteSql(t2, dbInfo, "SELECT * FROM " + dbInfo.storeName + " WHERE key = ? LIMIT 1", [key2], function(t22, results) {
38718
+ var result = results.rows.length ? results.rows.item(0).value : null;
38719
+ if (result) {
38720
+ result = dbInfo.serializer.deserialize(result);
38721
+ }
38722
+ resolve(result);
38723
+ }, function(t22, error) {
38724
+ reject(error);
38725
+ });
38726
+ });
38727
+ })["catch"](reject);
38728
+ });
38729
+ executeCallback(promise, callback);
38730
+ return promise;
38731
+ }
38732
+ function iterate$1(iterator, callback) {
38733
+ var self2 = this;
38734
+ var promise = new Promise$1(function(resolve, reject) {
38735
+ self2.ready().then(function() {
38736
+ var dbInfo = self2._dbInfo;
38737
+ dbInfo.db.transaction(function(t2) {
38738
+ tryExecuteSql(t2, dbInfo, "SELECT * FROM " + dbInfo.storeName, [], function(t22, results) {
38739
+ var rows = results.rows;
38740
+ var length2 = rows.length;
38741
+ for (var i3 = 0; i3 < length2; i3++) {
38742
+ var item = rows.item(i3);
38743
+ var result = item.value;
38744
+ if (result) {
38745
+ result = dbInfo.serializer.deserialize(result);
38746
+ }
38747
+ result = iterator(result, item.key, i3 + 1);
38748
+ if (result !== void 0) {
38749
+ resolve(result);
38750
+ return;
38751
+ }
38752
+ }
38753
+ resolve();
38754
+ }, function(t22, error) {
38755
+ reject(error);
38756
+ });
38757
+ });
38758
+ })["catch"](reject);
38759
+ });
38760
+ executeCallback(promise, callback);
38761
+ return promise;
38762
+ }
38763
+ function _setItem(key2, value, callback, retriesLeft) {
38764
+ var self2 = this;
38765
+ key2 = normalizeKey(key2);
38766
+ var promise = new Promise$1(function(resolve, reject) {
38767
+ self2.ready().then(function() {
38768
+ if (value === void 0) {
38769
+ value = null;
38770
+ }
38771
+ var originalValue = value;
38772
+ var dbInfo = self2._dbInfo;
38773
+ dbInfo.serializer.serialize(value, function(value2, error) {
38774
+ if (error) {
38775
+ reject(error);
38776
+ } else {
38777
+ dbInfo.db.transaction(function(t2) {
38778
+ tryExecuteSql(t2, dbInfo, "INSERT OR REPLACE INTO " + dbInfo.storeName + " (key, value) VALUES (?, ?)", [key2, value2], function() {
38779
+ resolve(originalValue);
38780
+ }, function(t22, error2) {
38781
+ reject(error2);
38782
+ });
38783
+ }, function(sqlError) {
38784
+ if (sqlError.code === sqlError.QUOTA_ERR) {
38785
+ if (retriesLeft > 0) {
38786
+ resolve(_setItem.apply(self2, [key2, originalValue, callback, retriesLeft - 1]));
38787
+ return;
38788
+ }
38789
+ reject(sqlError);
38790
+ }
38791
+ });
38792
+ }
38793
+ });
38794
+ })["catch"](reject);
38795
+ });
38796
+ executeCallback(promise, callback);
38797
+ return promise;
38798
+ }
38799
+ function setItem$1(key2, value, callback) {
38800
+ return _setItem.apply(this, [key2, value, callback, 1]);
38801
+ }
38802
+ function removeItem$1(key2, callback) {
38803
+ var self2 = this;
38804
+ key2 = normalizeKey(key2);
38805
+ var promise = new Promise$1(function(resolve, reject) {
38806
+ self2.ready().then(function() {
38807
+ var dbInfo = self2._dbInfo;
38808
+ dbInfo.db.transaction(function(t2) {
38809
+ tryExecuteSql(t2, dbInfo, "DELETE FROM " + dbInfo.storeName + " WHERE key = ?", [key2], function() {
38810
+ resolve();
38811
+ }, function(t22, error) {
38812
+ reject(error);
38813
+ });
38814
+ });
38815
+ })["catch"](reject);
38816
+ });
38817
+ executeCallback(promise, callback);
38818
+ return promise;
38819
+ }
38820
+ function clear$1(callback) {
38821
+ var self2 = this;
38822
+ var promise = new Promise$1(function(resolve, reject) {
38823
+ self2.ready().then(function() {
38824
+ var dbInfo = self2._dbInfo;
38825
+ dbInfo.db.transaction(function(t2) {
38826
+ tryExecuteSql(t2, dbInfo, "DELETE FROM " + dbInfo.storeName, [], function() {
38827
+ resolve();
38828
+ }, function(t22, error) {
38829
+ reject(error);
38830
+ });
38831
+ });
38832
+ })["catch"](reject);
38833
+ });
38834
+ executeCallback(promise, callback);
38835
+ return promise;
38836
+ }
38837
+ function length$1(callback) {
38838
+ var self2 = this;
38839
+ var promise = new Promise$1(function(resolve, reject) {
38840
+ self2.ready().then(function() {
38841
+ var dbInfo = self2._dbInfo;
38842
+ dbInfo.db.transaction(function(t2) {
38843
+ tryExecuteSql(t2, dbInfo, "SELECT COUNT(key) as c FROM " + dbInfo.storeName, [], function(t22, results) {
38844
+ var result = results.rows.item(0).c;
38845
+ resolve(result);
38846
+ }, function(t22, error) {
38847
+ reject(error);
38848
+ });
38849
+ });
38850
+ })["catch"](reject);
38851
+ });
38852
+ executeCallback(promise, callback);
38853
+ return promise;
38854
+ }
38855
+ function key$1(n2, callback) {
38856
+ var self2 = this;
38857
+ var promise = new Promise$1(function(resolve, reject) {
38858
+ self2.ready().then(function() {
38859
+ var dbInfo = self2._dbInfo;
38860
+ dbInfo.db.transaction(function(t2) {
38861
+ tryExecuteSql(t2, dbInfo, "SELECT key FROM " + dbInfo.storeName + " WHERE id = ? LIMIT 1", [n2 + 1], function(t22, results) {
38862
+ var result = results.rows.length ? results.rows.item(0).key : null;
38863
+ resolve(result);
38864
+ }, function(t22, error) {
38865
+ reject(error);
38866
+ });
38867
+ });
38868
+ })["catch"](reject);
38869
+ });
38870
+ executeCallback(promise, callback);
38871
+ return promise;
38872
+ }
38873
+ function keys$1(callback) {
38874
+ var self2 = this;
38875
+ var promise = new Promise$1(function(resolve, reject) {
38876
+ self2.ready().then(function() {
38877
+ var dbInfo = self2._dbInfo;
38878
+ dbInfo.db.transaction(function(t2) {
38879
+ tryExecuteSql(t2, dbInfo, "SELECT key FROM " + dbInfo.storeName, [], function(t22, results) {
38880
+ var keys2 = [];
38881
+ for (var i3 = 0; i3 < results.rows.length; i3++) {
38882
+ keys2.push(results.rows.item(i3).key);
38883
+ }
38884
+ resolve(keys2);
38885
+ }, function(t22, error) {
38886
+ reject(error);
38887
+ });
38888
+ });
38889
+ })["catch"](reject);
38890
+ });
38891
+ executeCallback(promise, callback);
38892
+ return promise;
38893
+ }
38894
+ function getAllStoreNames(db) {
38895
+ return new Promise$1(function(resolve, reject) {
38896
+ db.transaction(function(t2) {
38897
+ t2.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function(t22, results) {
38898
+ var storeNames = [];
38899
+ for (var i3 = 0; i3 < results.rows.length; i3++) {
38900
+ storeNames.push(results.rows.item(i3).name);
38901
+ }
38902
+ resolve({
38903
+ db,
38904
+ storeNames
38905
+ });
38906
+ }, function(t22, error) {
38907
+ reject(error);
38908
+ });
38909
+ }, function(sqlError) {
38910
+ reject(sqlError);
38911
+ });
38912
+ });
38913
+ }
38914
+ function dropInstance$1(options, callback) {
38915
+ callback = getCallback.apply(this, arguments);
38916
+ var currentConfig = this.config();
38917
+ options = typeof options !== "function" && options || {};
38918
+ if (!options.name) {
38919
+ options.name = options.name || currentConfig.name;
38920
+ options.storeName = options.storeName || currentConfig.storeName;
38921
+ }
38922
+ var self2 = this;
38923
+ var promise;
38924
+ if (!options.name) {
38925
+ promise = Promise$1.reject("Invalid arguments");
38926
+ } else {
38927
+ promise = new Promise$1(function(resolve) {
38928
+ var db;
38929
+ if (options.name === currentConfig.name) {
38930
+ db = self2._dbInfo.db;
38931
+ } else {
38932
+ db = openDatabase(options.name, "", "", 0);
38933
+ }
38934
+ if (!options.storeName) {
38935
+ resolve(getAllStoreNames(db));
38936
+ } else {
38937
+ resolve({
38938
+ db,
38939
+ storeNames: [options.storeName]
38940
+ });
38941
+ }
38942
+ }).then(function(operationInfo) {
38943
+ return new Promise$1(function(resolve, reject) {
38944
+ operationInfo.db.transaction(function(t2) {
38945
+ function dropTable(storeName) {
38946
+ return new Promise$1(function(resolve2, reject2) {
38947
+ t2.executeSql("DROP TABLE IF EXISTS " + storeName, [], function() {
38948
+ resolve2();
38949
+ }, function(t22, error) {
38950
+ reject2(error);
38951
+ });
38952
+ });
38953
+ }
38954
+ var operations = [];
38955
+ for (var i3 = 0, len = operationInfo.storeNames.length; i3 < len; i3++) {
38956
+ operations.push(dropTable(operationInfo.storeNames[i3]));
38957
+ }
38958
+ Promise$1.all(operations).then(function() {
38959
+ resolve();
38960
+ })["catch"](function(e2) {
38961
+ reject(e2);
38962
+ });
38963
+ }, function(sqlError) {
38964
+ reject(sqlError);
38965
+ });
38966
+ });
38967
+ });
38968
+ }
38969
+ executeCallback(promise, callback);
38970
+ return promise;
38971
+ }
38972
+ var webSQLStorage = {
38973
+ _driver: "webSQLStorage",
38974
+ _initStorage: _initStorage$1,
38975
+ _support: isWebSQLValid(),
38976
+ iterate: iterate$1,
38977
+ getItem: getItem$1,
38978
+ setItem: setItem$1,
38979
+ removeItem: removeItem$1,
38980
+ clear: clear$1,
38981
+ length: length$1,
38982
+ key: key$1,
38983
+ keys: keys$1,
38984
+ dropInstance: dropInstance$1
38985
+ };
38986
+ function isLocalStorageValid() {
38987
+ try {
38988
+ return typeof localStorage !== "undefined" && "setItem" in localStorage && // in IE8 typeof localStorage.setItem === 'object'
38989
+ !!localStorage.setItem;
38990
+ } catch (e2) {
38991
+ return false;
38992
+ }
38993
+ }
38994
+ function _getKeyPrefix(options, defaultConfig) {
38995
+ var keyPrefix = options.name + "/";
38996
+ if (options.storeName !== defaultConfig.storeName) {
38997
+ keyPrefix += options.storeName + "/";
38998
+ }
38999
+ return keyPrefix;
39000
+ }
39001
+ function checkIfLocalStorageThrows() {
39002
+ var localStorageTestKey = "_localforage_support_test";
39003
+ try {
39004
+ localStorage.setItem(localStorageTestKey, true);
39005
+ localStorage.removeItem(localStorageTestKey);
39006
+ return false;
39007
+ } catch (e2) {
39008
+ return true;
39009
+ }
39010
+ }
39011
+ function _isLocalStorageUsable() {
39012
+ return !checkIfLocalStorageThrows() || localStorage.length > 0;
39013
+ }
39014
+ function _initStorage$2(options) {
39015
+ var self2 = this;
39016
+ var dbInfo = {};
39017
+ if (options) {
39018
+ for (var i3 in options) {
39019
+ dbInfo[i3] = options[i3];
39020
+ }
39021
+ }
39022
+ dbInfo.keyPrefix = _getKeyPrefix(options, self2._defaultConfig);
39023
+ if (!_isLocalStorageUsable()) {
39024
+ return Promise$1.reject();
39025
+ }
39026
+ self2._dbInfo = dbInfo;
39027
+ dbInfo.serializer = localforageSerializer;
39028
+ return Promise$1.resolve();
39029
+ }
39030
+ function clear$2(callback) {
39031
+ var self2 = this;
39032
+ var promise = self2.ready().then(function() {
39033
+ var keyPrefix = self2._dbInfo.keyPrefix;
39034
+ for (var i3 = localStorage.length - 1; i3 >= 0; i3--) {
39035
+ var key2 = localStorage.key(i3);
39036
+ if (key2.indexOf(keyPrefix) === 0) {
39037
+ localStorage.removeItem(key2);
39038
+ }
39039
+ }
39040
+ });
39041
+ executeCallback(promise, callback);
39042
+ return promise;
39043
+ }
39044
+ function getItem$2(key2, callback) {
39045
+ var self2 = this;
39046
+ key2 = normalizeKey(key2);
39047
+ var promise = self2.ready().then(function() {
39048
+ var dbInfo = self2._dbInfo;
39049
+ var result = localStorage.getItem(dbInfo.keyPrefix + key2);
39050
+ if (result) {
39051
+ result = dbInfo.serializer.deserialize(result);
39052
+ }
39053
+ return result;
39054
+ });
39055
+ executeCallback(promise, callback);
39056
+ return promise;
39057
+ }
39058
+ function iterate$2(iterator, callback) {
39059
+ var self2 = this;
39060
+ var promise = self2.ready().then(function() {
39061
+ var dbInfo = self2._dbInfo;
39062
+ var keyPrefix = dbInfo.keyPrefix;
39063
+ var keyPrefixLength = keyPrefix.length;
39064
+ var length2 = localStorage.length;
39065
+ var iterationNumber = 1;
39066
+ for (var i3 = 0; i3 < length2; i3++) {
39067
+ var key2 = localStorage.key(i3);
39068
+ if (key2.indexOf(keyPrefix) !== 0) {
39069
+ continue;
39070
+ }
39071
+ var value = localStorage.getItem(key2);
39072
+ if (value) {
39073
+ value = dbInfo.serializer.deserialize(value);
39074
+ }
39075
+ value = iterator(value, key2.substring(keyPrefixLength), iterationNumber++);
39076
+ if (value !== void 0) {
39077
+ return value;
39078
+ }
39079
+ }
39080
+ });
39081
+ executeCallback(promise, callback);
39082
+ return promise;
39083
+ }
39084
+ function key$2(n2, callback) {
39085
+ var self2 = this;
39086
+ var promise = self2.ready().then(function() {
39087
+ var dbInfo = self2._dbInfo;
39088
+ var result;
39089
+ try {
39090
+ result = localStorage.key(n2);
39091
+ } catch (error) {
39092
+ result = null;
39093
+ }
39094
+ if (result) {
39095
+ result = result.substring(dbInfo.keyPrefix.length);
39096
+ }
39097
+ return result;
39098
+ });
39099
+ executeCallback(promise, callback);
39100
+ return promise;
39101
+ }
39102
+ function keys$2(callback) {
39103
+ var self2 = this;
39104
+ var promise = self2.ready().then(function() {
39105
+ var dbInfo = self2._dbInfo;
39106
+ var length2 = localStorage.length;
39107
+ var keys2 = [];
39108
+ for (var i3 = 0; i3 < length2; i3++) {
39109
+ var itemKey = localStorage.key(i3);
39110
+ if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {
39111
+ keys2.push(itemKey.substring(dbInfo.keyPrefix.length));
39112
+ }
39113
+ }
39114
+ return keys2;
39115
+ });
39116
+ executeCallback(promise, callback);
39117
+ return promise;
39118
+ }
39119
+ function length$2(callback) {
39120
+ var self2 = this;
39121
+ var promise = self2.keys().then(function(keys2) {
39122
+ return keys2.length;
39123
+ });
39124
+ executeCallback(promise, callback);
39125
+ return promise;
39126
+ }
39127
+ function removeItem$2(key2, callback) {
39128
+ var self2 = this;
39129
+ key2 = normalizeKey(key2);
39130
+ var promise = self2.ready().then(function() {
39131
+ var dbInfo = self2._dbInfo;
39132
+ localStorage.removeItem(dbInfo.keyPrefix + key2);
39133
+ });
39134
+ executeCallback(promise, callback);
39135
+ return promise;
39136
+ }
39137
+ function setItem$2(key2, value, callback) {
39138
+ var self2 = this;
39139
+ key2 = normalizeKey(key2);
39140
+ var promise = self2.ready().then(function() {
39141
+ if (value === void 0) {
39142
+ value = null;
39143
+ }
39144
+ var originalValue = value;
39145
+ return new Promise$1(function(resolve, reject) {
39146
+ var dbInfo = self2._dbInfo;
39147
+ dbInfo.serializer.serialize(value, function(value2, error) {
39148
+ if (error) {
39149
+ reject(error);
39150
+ } else {
39151
+ try {
39152
+ localStorage.setItem(dbInfo.keyPrefix + key2, value2);
39153
+ resolve(originalValue);
39154
+ } catch (e2) {
39155
+ if (e2.name === "QuotaExceededError" || e2.name === "NS_ERROR_DOM_QUOTA_REACHED") {
39156
+ reject(e2);
39157
+ }
39158
+ reject(e2);
39159
+ }
39160
+ }
39161
+ });
39162
+ });
39163
+ });
39164
+ executeCallback(promise, callback);
39165
+ return promise;
39166
+ }
39167
+ function dropInstance$2(options, callback) {
39168
+ callback = getCallback.apply(this, arguments);
39169
+ options = typeof options !== "function" && options || {};
39170
+ if (!options.name) {
39171
+ var currentConfig = this.config();
39172
+ options.name = options.name || currentConfig.name;
39173
+ options.storeName = options.storeName || currentConfig.storeName;
39174
+ }
39175
+ var self2 = this;
39176
+ var promise;
39177
+ if (!options.name) {
39178
+ promise = Promise$1.reject("Invalid arguments");
39179
+ } else {
39180
+ promise = new Promise$1(function(resolve) {
39181
+ if (!options.storeName) {
39182
+ resolve(options.name + "/");
39183
+ } else {
39184
+ resolve(_getKeyPrefix(options, self2._defaultConfig));
39185
+ }
39186
+ }).then(function(keyPrefix) {
39187
+ for (var i3 = localStorage.length - 1; i3 >= 0; i3--) {
39188
+ var key2 = localStorage.key(i3);
39189
+ if (key2.indexOf(keyPrefix) === 0) {
39190
+ localStorage.removeItem(key2);
39191
+ }
39192
+ }
39193
+ });
39194
+ }
39195
+ executeCallback(promise, callback);
39196
+ return promise;
39197
+ }
39198
+ var localStorageWrapper = {
39199
+ _driver: "localStorageWrapper",
39200
+ _initStorage: _initStorage$2,
39201
+ _support: isLocalStorageValid(),
39202
+ iterate: iterate$2,
39203
+ getItem: getItem$2,
39204
+ setItem: setItem$2,
39205
+ removeItem: removeItem$2,
39206
+ clear: clear$2,
39207
+ length: length$2,
39208
+ key: key$2,
39209
+ keys: keys$2,
39210
+ dropInstance: dropInstance$2
39211
+ };
39212
+ var sameValue = function sameValue2(x3, y3) {
39213
+ return x3 === y3 || typeof x3 === "number" && typeof y3 === "number" && isNaN(x3) && isNaN(y3);
39214
+ };
39215
+ var includes = function includes2(array, searchElement) {
39216
+ var len = array.length;
39217
+ var i3 = 0;
39218
+ while (i3 < len) {
39219
+ if (sameValue(array[i3], searchElement)) {
39220
+ return true;
39221
+ }
39222
+ i3++;
39223
+ }
39224
+ return false;
39225
+ };
39226
+ var isArray = Array.isArray || function(arg) {
39227
+ return Object.prototype.toString.call(arg) === "[object Array]";
39228
+ };
39229
+ var DefinedDrivers = {};
39230
+ var DriverSupport = {};
39231
+ var DefaultDrivers = {
39232
+ INDEXEDDB: asyncStorage,
39233
+ WEBSQL: webSQLStorage,
39234
+ LOCALSTORAGE: localStorageWrapper
39235
+ };
39236
+ var DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];
39237
+ var OptionalDriverMethods = ["dropInstance"];
39238
+ var LibraryMethods = ["clear", "getItem", "iterate", "key", "keys", "length", "removeItem", "setItem"].concat(OptionalDriverMethods);
39239
+ var DefaultConfig = {
39240
+ description: "",
39241
+ driver: DefaultDriverOrder.slice(),
39242
+ name: "localforage",
39243
+ // Default DB size is _JUST UNDER_ 5MB, as it's the highest size
39244
+ // we can use without a prompt.
39245
+ size: 4980736,
39246
+ storeName: "keyvaluepairs",
39247
+ version: 1
39248
+ };
39249
+ function callWhenReady(localForageInstance, libraryMethod) {
39250
+ localForageInstance[libraryMethod] = function() {
39251
+ var _args = arguments;
39252
+ return localForageInstance.ready().then(function() {
39253
+ return localForageInstance[libraryMethod].apply(localForageInstance, _args);
39254
+ });
39255
+ };
39256
+ }
39257
+ function extend() {
39258
+ for (var i3 = 1; i3 < arguments.length; i3++) {
39259
+ var arg = arguments[i3];
39260
+ if (arg) {
39261
+ for (var _key in arg) {
39262
+ if (arg.hasOwnProperty(_key)) {
39263
+ if (isArray(arg[_key])) {
39264
+ arguments[0][_key] = arg[_key].slice();
39265
+ } else {
39266
+ arguments[0][_key] = arg[_key];
39267
+ }
39268
+ }
39269
+ }
39270
+ }
39271
+ }
39272
+ return arguments[0];
39273
+ }
39274
+ var LocalForage = (function() {
39275
+ function LocalForage2(options) {
39276
+ _classCallCheck(this, LocalForage2);
39277
+ for (var driverTypeKey in DefaultDrivers) {
39278
+ if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {
39279
+ var driver = DefaultDrivers[driverTypeKey];
39280
+ var driverName = driver._driver;
39281
+ this[driverTypeKey] = driverName;
39282
+ if (!DefinedDrivers[driverName]) {
39283
+ this.defineDriver(driver);
39284
+ }
39285
+ }
39286
+ }
39287
+ this._defaultConfig = extend({}, DefaultConfig);
39288
+ this._config = extend({}, this._defaultConfig, options);
39289
+ this._driverSet = null;
39290
+ this._initDriver = null;
39291
+ this._ready = false;
39292
+ this._dbInfo = null;
39293
+ this._wrapLibraryMethodsWithReady();
39294
+ this.setDriver(this._config.driver)["catch"](function() {
39295
+ });
39296
+ }
39297
+ LocalForage2.prototype.config = function config(options) {
39298
+ if ((typeof options === "undefined" ? "undefined" : _typeof(options)) === "object") {
39299
+ if (this._ready) {
39300
+ return new Error("Can't call config() after localforage has been used.");
39301
+ }
39302
+ for (var i3 in options) {
39303
+ if (i3 === "storeName") {
39304
+ options[i3] = options[i3].replace(/\W/g, "_");
39305
+ }
39306
+ if (i3 === "version" && typeof options[i3] !== "number") {
39307
+ return new Error("Database version must be a number.");
39308
+ }
39309
+ this._config[i3] = options[i3];
39310
+ }
39311
+ if ("driver" in options && options.driver) {
39312
+ return this.setDriver(this._config.driver);
39313
+ }
39314
+ return true;
39315
+ } else if (typeof options === "string") {
39316
+ return this._config[options];
39317
+ } else {
39318
+ return this._config;
39319
+ }
39320
+ };
39321
+ LocalForage2.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {
39322
+ var promise = new Promise$1(function(resolve, reject) {
39323
+ try {
39324
+ var driverName = driverObject._driver;
39325
+ var complianceError = new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");
39326
+ if (!driverObject._driver) {
39327
+ reject(complianceError);
39328
+ return;
39329
+ }
39330
+ var driverMethods = LibraryMethods.concat("_initStorage");
39331
+ for (var i3 = 0, len = driverMethods.length; i3 < len; i3++) {
39332
+ var driverMethodName = driverMethods[i3];
39333
+ var isRequired = !includes(OptionalDriverMethods, driverMethodName);
39334
+ if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== "function") {
39335
+ reject(complianceError);
39336
+ return;
39337
+ }
39338
+ }
39339
+ var configureMissingMethods = function configureMissingMethods2() {
39340
+ var methodNotImplementedFactory = function methodNotImplementedFactory2(methodName) {
39341
+ return function() {
39342
+ var error = new Error("Method " + methodName + " is not implemented by the current driver");
39343
+ var promise2 = Promise$1.reject(error);
39344
+ executeCallback(promise2, arguments[arguments.length - 1]);
39345
+ return promise2;
39346
+ };
39347
+ };
39348
+ for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {
39349
+ var optionalDriverMethod = OptionalDriverMethods[_i];
39350
+ if (!driverObject[optionalDriverMethod]) {
39351
+ driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);
39352
+ }
39353
+ }
39354
+ };
39355
+ configureMissingMethods();
39356
+ var setDriverSupport = function setDriverSupport2(support) {
39357
+ if (DefinedDrivers[driverName]) {
39358
+ console.info("Redefining LocalForage driver: " + driverName);
39359
+ }
39360
+ DefinedDrivers[driverName] = driverObject;
39361
+ DriverSupport[driverName] = support;
39362
+ resolve();
39363
+ };
39364
+ if ("_support" in driverObject) {
39365
+ if (driverObject._support && typeof driverObject._support === "function") {
39366
+ driverObject._support().then(setDriverSupport, reject);
39367
+ } else {
39368
+ setDriverSupport(!!driverObject._support);
39369
+ }
39370
+ } else {
39371
+ setDriverSupport(true);
39372
+ }
39373
+ } catch (e2) {
39374
+ reject(e2);
39375
+ }
39376
+ });
39377
+ executeTwoCallbacks(promise, callback, errorCallback);
39378
+ return promise;
39379
+ };
39380
+ LocalForage2.prototype.driver = function driver() {
39381
+ return this._driver || null;
39382
+ };
39383
+ LocalForage2.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {
39384
+ var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error("Driver not found."));
39385
+ executeTwoCallbacks(getDriverPromise, callback, errorCallback);
39386
+ return getDriverPromise;
39387
+ };
39388
+ LocalForage2.prototype.getSerializer = function getSerializer(callback) {
39389
+ var serializerPromise = Promise$1.resolve(localforageSerializer);
39390
+ executeTwoCallbacks(serializerPromise, callback);
39391
+ return serializerPromise;
39392
+ };
39393
+ LocalForage2.prototype.ready = function ready(callback) {
39394
+ var self2 = this;
39395
+ var promise = self2._driverSet.then(function() {
39396
+ if (self2._ready === null) {
39397
+ self2._ready = self2._initDriver();
39398
+ }
39399
+ return self2._ready;
39400
+ });
39401
+ executeTwoCallbacks(promise, callback, callback);
39402
+ return promise;
39403
+ };
39404
+ LocalForage2.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {
39405
+ var self2 = this;
39406
+ if (!isArray(drivers)) {
39407
+ drivers = [drivers];
39408
+ }
39409
+ var supportedDrivers = this._getSupportedDrivers(drivers);
39410
+ function setDriverToConfig() {
39411
+ self2._config.driver = self2.driver();
39412
+ }
39413
+ function extendSelfWithDriver(driver) {
39414
+ self2._extend(driver);
39415
+ setDriverToConfig();
39416
+ self2._ready = self2._initStorage(self2._config);
39417
+ return self2._ready;
39418
+ }
39419
+ function initDriver(supportedDrivers2) {
39420
+ return function() {
39421
+ var currentDriverIndex = 0;
39422
+ function driverPromiseLoop() {
39423
+ while (currentDriverIndex < supportedDrivers2.length) {
39424
+ var driverName = supportedDrivers2[currentDriverIndex];
39425
+ currentDriverIndex++;
39426
+ self2._dbInfo = null;
39427
+ self2._ready = null;
39428
+ return self2.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop);
39429
+ }
39430
+ setDriverToConfig();
39431
+ var error = new Error("No available storage method found.");
39432
+ self2._driverSet = Promise$1.reject(error);
39433
+ return self2._driverSet;
39434
+ }
39435
+ return driverPromiseLoop();
39436
+ };
39437
+ }
39438
+ var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"](function() {
39439
+ return Promise$1.resolve();
39440
+ }) : Promise$1.resolve();
39441
+ this._driverSet = oldDriverSetDone.then(function() {
39442
+ var driverName = supportedDrivers[0];
39443
+ self2._dbInfo = null;
39444
+ self2._ready = null;
39445
+ return self2.getDriver(driverName).then(function(driver) {
39446
+ self2._driver = driver._driver;
39447
+ setDriverToConfig();
39448
+ self2._wrapLibraryMethodsWithReady();
39449
+ self2._initDriver = initDriver(supportedDrivers);
39450
+ });
39451
+ })["catch"](function() {
39452
+ setDriverToConfig();
39453
+ var error = new Error("No available storage method found.");
39454
+ self2._driverSet = Promise$1.reject(error);
39455
+ return self2._driverSet;
39456
+ });
39457
+ executeTwoCallbacks(this._driverSet, callback, errorCallback);
39458
+ return this._driverSet;
39459
+ };
39460
+ LocalForage2.prototype.supports = function supports(driverName) {
39461
+ return !!DriverSupport[driverName];
39462
+ };
39463
+ LocalForage2.prototype._extend = function _extend(libraryMethodsAndProperties) {
39464
+ extend(this, libraryMethodsAndProperties);
39465
+ };
39466
+ LocalForage2.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {
39467
+ var supportedDrivers = [];
39468
+ for (var i3 = 0, len = drivers.length; i3 < len; i3++) {
39469
+ var driverName = drivers[i3];
39470
+ if (this.supports(driverName)) {
39471
+ supportedDrivers.push(driverName);
39472
+ }
39473
+ }
39474
+ return supportedDrivers;
39475
+ };
39476
+ LocalForage2.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {
39477
+ for (var i3 = 0, len = LibraryMethods.length; i3 < len; i3++) {
39478
+ callWhenReady(this, LibraryMethods[i3]);
39479
+ }
39480
+ };
39481
+ LocalForage2.prototype.createInstance = function createInstance(options) {
39482
+ return new LocalForage2(options);
39483
+ };
39484
+ return LocalForage2;
39485
+ })();
39486
+ var localforage_js = new LocalForage();
39487
+ module3.exports = localforage_js;
39488
+ }, { "3": 3 }] }, {}, [4])(4);
39489
+ });
39490
+ })(localforage$1);
39491
+ return localforage$1.exports;
39492
+ }
39493
+ var localforageExports = requireLocalforage();
39494
+ const localforage = /* @__PURE__ */ getDefaultExportFromCjs(localforageExports);
39495
+ const CACHE_TTL = 7 * 24 * 60 * 60 * 1e3;
39496
+ const cacheStore = localforage.createInstance({
39497
+ name: "IMCache",
39498
+ storeName: "messages"
39499
+ });
39500
+ function _buildKey(userID, type, conversationID) {
39501
+ if (type === "messages" && conversationID) {
39502
+ return `msg_${userID}_${conversationID}`;
39503
+ }
39504
+ return `cvs_${userID}`;
39505
+ }
39506
+ async function saveConversations(userID, list) {
39507
+ if (!userID || !list) return;
39508
+ try {
39509
+ const key = _buildKey(userID, "conversations");
39510
+ const data = {
39511
+ list,
39512
+ timestamp: Date.now()
39513
+ };
39514
+ await cacheStore.setItem(key, data);
39515
+ } catch {
39516
+ }
39517
+ }
39518
+ async function loadConversations(userID) {
39519
+ if (!userID) return null;
39520
+ try {
39521
+ const key = _buildKey(userID, "conversations");
39522
+ const data = await cacheStore.getItem(key);
39523
+ if (!data || !data.list) return null;
39524
+ if (Date.now() - data.timestamp > CACHE_TTL) {
39525
+ await cacheStore.removeItem(key);
39526
+ return null;
39527
+ }
39528
+ return data.list;
39529
+ } catch {
39530
+ return null;
39531
+ }
39532
+ }
39533
+ async function saveMessages(userID, conversationID, list) {
39534
+ if (!userID || !conversationID || !list) return;
39535
+ try {
39536
+ const key = _buildKey(userID, "messages", conversationID);
39537
+ const data = {
39538
+ list,
39539
+ timestamp: Date.now()
39540
+ };
39541
+ await cacheStore.setItem(key, data);
39542
+ } catch {
39543
+ }
39544
+ }
39545
+ async function loadMessages(userID, conversationID) {
39546
+ if (!userID || !conversationID) return null;
39547
+ try {
39548
+ const key = _buildKey(userID, "messages", conversationID);
39549
+ const data = await cacheStore.getItem(key);
39550
+ if (!data || !data.list) return null;
39551
+ if (Date.now() - data.timestamp > CACHE_TTL) {
39552
+ await cacheStore.removeItem(key);
39553
+ return null;
39554
+ }
39555
+ return data.list;
39556
+ } catch {
39557
+ return null;
39558
+ }
39559
+ }
39560
+ async function clearCache(userID) {
39561
+ if (!userID) return;
39562
+ try {
39563
+ const cvsKey = _buildKey(userID, "conversations");
39564
+ await cacheStore.removeItem(cvsKey);
39565
+ const keys = await cacheStore.keys();
39566
+ const msgPrefix = `msg_${userID}_`;
39567
+ for (const key of keys) {
39568
+ if (key.startsWith(msgPrefix)) {
39569
+ await cacheStore.removeItem(key);
39570
+ }
39571
+ }
39572
+ } catch {
39573
+ }
39574
+ }
39575
+ function useMessageCache() {
39576
+ const chatMessage = useChatStore();
39577
+ function _getUserID() {
39578
+ return chatMessage.userID || "";
39579
+ }
39580
+ async function loadConversationsFromCache() {
39581
+ const userID = _getUserID();
39582
+ if (!userID) return null;
39583
+ try {
39584
+ const list = await loadConversations(userID);
39585
+ if (list && Array.isArray(list) && list.length > 0) {
39586
+ console.log(
39587
+ `[MessageCache] Loaded ${list.length} conversations from IndexedDB cache`
39588
+ );
39589
+ return { list };
39590
+ }
39591
+ return null;
39592
+ } catch (e2) {
39593
+ console.warn("[MessageCache] Failed to load conversations from cache:", e2);
39594
+ return null;
39595
+ }
39596
+ }
39597
+ async function saveConversationsToCache(list) {
39598
+ const userID = _getUserID();
39599
+ if (!userID || !Array.isArray(list)) return;
39600
+ try {
39601
+ await saveConversations(userID, list);
39602
+ console.log(`[MessageCache] Saved ${list.length} conversations to IndexedDB cache`);
39603
+ } catch (e2) {
39604
+ console.warn("[MessageCache] Failed to save conversations:", e2);
39605
+ }
39606
+ }
39607
+ async function loadMessagesFromCache(conversationID) {
39608
+ const userID = _getUserID();
39609
+ if (!userID || !conversationID) return null;
39610
+ try {
39611
+ const list = await loadMessages(userID, conversationID);
39612
+ if (list && Array.isArray(list) && list.length > 0) {
39613
+ console.log(
39614
+ `[MessageCache] Loaded ${list.length} messages for ${conversationID} from IndexedDB cache`
39615
+ );
39616
+ return { list, conversationID };
39617
+ }
39618
+ return null;
39619
+ } catch (e2) {
39620
+ console.warn("[MessageCache] Failed to load messages from cache:", e2);
39621
+ return null;
39622
+ }
39623
+ }
39624
+ async function saveMessagesToCache(conversationID, list) {
39625
+ const userID = _getUserID();
39626
+ if (!userID || !conversationID || !Array.isArray(list)) return;
39627
+ try {
39628
+ await saveMessages(userID, conversationID, list);
39629
+ console.log(`[MessageCache] Saved ${list.length} messages for ${conversationID} to IndexedDB cache`);
39630
+ } catch (e2) {
39631
+ console.warn("[MessageCache] Failed to save messages:", e2);
39632
+ }
39633
+ }
39634
+ async function clearMessageCache() {
39635
+ const userID = _getUserID();
39636
+ if (!userID) return;
39637
+ try {
39638
+ await clearCache(userID);
39639
+ console.log("[MessageCache] Cleared all cache for user:", userID);
39640
+ } catch (e2) {
39641
+ console.warn("[MessageCache] Failed to clear cache:", e2);
39642
+ }
39643
+ }
39644
+ return {
39645
+ loadConversationsFromCache,
39646
+ saveConversationsToCache,
39647
+ loadMessagesFromCache,
39648
+ saveMessagesToCache,
39649
+ clearMessageCache
39650
+ };
39651
+ }
37035
39652
  const mittBus = mitt();
37036
39653
  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";
37037
39654
  let imInstance = null;
39655
+ let initPromise = null;
39656
+ let httpAuthBroken = false;
39657
+ let syncFinished = false;
39658
+ let syncWaiters = [];
39659
+ let conversationBusBound = false;
39660
+ let burnHandlerBound = false;
39661
+ const resolveSyncWaiters = (ok) => {
39662
+ syncFinished = true;
39663
+ const waiters = syncWaiters.splice(0);
39664
+ waiters.forEach((fn) => {
39665
+ try {
39666
+ fn(ok);
39667
+ } catch (error) {
39668
+ console.error("[IM] 同步回调执行失败:", error);
39669
+ }
39670
+ });
39671
+ };
39672
+ const resetSyncState = () => {
39673
+ syncFinished = false;
39674
+ syncWaiters = [];
39675
+ };
39676
+ const buildConversationFromMessage = (msg, selfUserID) => {
39677
+ if (!msg) return null;
39678
+ const conversationID = createCvsId(msg);
39679
+ if (!conversationID) return null;
39680
+ const isGroup = msg.sessionType === IM_CVS_TYPE.Group;
39681
+ const isSelfMsg = msg.msgFrom === 100 || msg.sendID === selfUserID;
39682
+ const peerID = isGroup ? "" : isSelfMsg ? msg.recvID : msg.sendID;
39683
+ return {
39684
+ conversationID,
39685
+ conversationType: msg.sessionType,
39686
+ userID: peerID,
39687
+ groupID: isGroup ? msg.groupID : "",
39688
+ showName: isGroup ? msg.groupID : !isSelfMsg && msg.senderNickname || peerID,
39689
+ faceURL: isGroup ? "" : !isSelfMsg && msg.senderFaceUrl || "",
39690
+ recvMsgOpt: 0,
39691
+ unreadCount: isSelfMsg ? 0 : 1,
39692
+ groupAtType: 0,
39693
+ latestMsg: JSON.stringify({ ...msg, conversationID }),
39694
+ latestMsgSendTime: msg.sendTime || msg.createTime || Date.now(),
39695
+ draftText: "",
39696
+ draftTextTime: 0,
39697
+ burnDuration: 0,
39698
+ msgDestructTime: 0,
39699
+ isPinned: false,
39700
+ isPrivateChat: false,
39701
+ isMsgDestruct: false,
39702
+ attachedInfo: "",
39703
+ ex: "",
39704
+ // 标记为「本地兜底构造」:服务端会话列表刷新时要保留,避免刚出现的会话被网络列表冲掉
39705
+ isLocalFallback: true
39706
+ };
39707
+ };
39708
+ const TOKEN_ERROR_CODES = [1501, 1502, 1503, 1504, 1505, 1506, 1507];
39709
+ const TOKEN_ERROR_TEXT = /Token(NotExist|Kicked|Expired|Invalid|Malformed|Unknown|NotValidYet)/i;
39710
+ const isTokenInvalidError = (error) => {
39711
+ if (!error) return false;
39712
+ if (TOKEN_ERROR_CODES.includes(error.errCode)) return true;
39713
+ return TOKEN_ERROR_TEXT.test(String(error.errMsg || error.message || ""));
39714
+ };
39715
+ let unhandledRejectionBound = false;
39716
+ const bindUnhandledRejection = (onTokenError) => {
39717
+ if (unhandledRejectionBound || typeof window === "undefined") return;
39718
+ unhandledRejectionBound = true;
39719
+ window.addEventListener("unhandledrejection", (event) => {
39720
+ if (!isTokenInvalidError(event.reason)) return;
39721
+ event.preventDefault();
39722
+ onTokenError(event.reason);
39723
+ });
39724
+ };
39725
+ const waitForSyncFinish = (timeout = 8e3) => {
39726
+ if (syncFinished || (imInstance == null ? void 0 : imInstance.syncFinished)) return Promise.resolve(true);
39727
+ return new Promise((resolve) => {
39728
+ let timer = null;
39729
+ const done = (ok) => {
39730
+ if (timer) {
39731
+ clearTimeout(timer);
39732
+ timer = null;
39733
+ }
39734
+ resolve(ok);
39735
+ };
39736
+ syncWaiters.push(done);
39737
+ timer = setTimeout(() => {
39738
+ const index = syncWaiters.indexOf(done);
39739
+ if (index > -1) syncWaiters.splice(index, 1);
39740
+ console.warn(`[IM] 等待服务端同步超时(${timeout}ms),按兜底流程继续`);
39741
+ resolve(false);
39742
+ }, timeout);
39743
+ });
39744
+ };
37038
39745
  const useMessage = (config = {}) => {
37039
39746
  const messageStore = useChatStore();
37040
39747
  if (config.userID || config.apiUrl || config.imToken) {
@@ -37056,10 +39763,63 @@ const useMessage = (config = {}) => {
37056
39763
  updateConversationLatestMessage,
37057
39764
  getConversationIDBySessionType,
37058
39765
  getConversationByKey,
37059
- getCurrentConversation,
37060
39766
  clearConversationList
37061
39767
  } = useConversations();
37062
- const { updateMessageList, updateMessageIsRead, handleMessage, revokeMessage, updateMessageSenderInfo } = useMsgList();
39768
+ const {
39769
+ messageList: messageList2,
39770
+ updateMessageList,
39771
+ updateMessageIsRead,
39772
+ handleMessage,
39773
+ deleteMessageById,
39774
+ revokeMessage,
39775
+ updateMessageSenderInfo
39776
+ } = useMsgList();
39777
+ const { cancelAll: cancelAllBurns, onBurn } = useBurnAfterReading();
39778
+ const { loadMessagesFromCache, saveMessagesToCache } = useMessageCache();
39779
+ if (!burnHandlerBound) {
39780
+ burnHandlerBound = true;
39781
+ onBurn(async (conversationID, clientMsgID) => {
39782
+ var _a;
39783
+ if (!conversationID || !clientMsgID) return;
39784
+ const inCurrentList = messageList2.value.some((item) => item.clientMsgID === clientMsgID);
39785
+ if (inCurrentList) deleteMessageById(clientMsgID);
39786
+ try {
39787
+ await (imInstance == null ? void 0 : imInstance.deleteMessage({ conversationID, clientMsgID }));
39788
+ } catch (error) {
39789
+ console.error("[IM] 删除焚毁消息失败:", error);
39790
+ }
39791
+ if (inCurrentList) {
39792
+ const rest = JSON.parse(JSON.stringify(messageList2.value));
39793
+ saveMessagesToCache(conversationID, rest);
39794
+ const latest = rest[rest.length - 1];
39795
+ updateConversationLatestMessage(conversationID, latest || {}, latest ? handleMessage(latest) : "");
39796
+ return;
39797
+ }
39798
+ try {
39799
+ const cached = await loadMessagesFromCache(conversationID);
39800
+ if ((_a = cached == null ? void 0 : cached.list) == null ? void 0 : _a.length) {
39801
+ const rest = cached.list.filter((item) => item.clientMsgID !== clientMsgID);
39802
+ saveMessagesToCache(conversationID, rest);
39803
+ }
39804
+ } catch (error) {
39805
+ console.warn("[IM] 清理焚毁消息缓存失败:", error);
39806
+ }
39807
+ });
39808
+ }
39809
+ if (!conversationBusBound) {
39810
+ conversationBusBound = true;
39811
+ mittBus.on("OnConversationChanged", (data) => {
39812
+ var _a;
39813
+ if (!(data == null ? void 0 : data.conversationID)) return;
39814
+ const inx = conversationList2.value.findIndex((item) => item.conversationID === data.conversationID);
39815
+ if (inx > -1) {
39816
+ conversationList2.value[inx] = { ...conversationList2.value[inx], ...data };
39817
+ }
39818
+ if (((_a = currentConversation2.value) == null ? void 0 : _a.conversationID) === data.conversationID) {
39819
+ currentConversation2.value = { ...currentConversation2.value, ...data };
39820
+ }
39821
+ });
39822
+ }
37063
39823
  const getUnReadMessageCount = async (bool = false) => {
37064
39824
  if (bool) {
37065
39825
  if (!imInstance) return;
@@ -37074,38 +39834,139 @@ const useMessage = (config = {}) => {
37074
39834
  }
37075
39835
  };
37076
39836
  const setConversationMsgAsRead = async (id) => {
39837
+ var _a;
37077
39838
  if (!imInstance) return;
37078
39839
  if (!messageStore.getIsFocused) return;
37079
39840
  const cvsId = id || currentConversation2.value.conversationID;
37080
39841
  if (!cvsId) return;
37081
- const cvs = getCurrentConversation(cvsId) || currentConversation2.value;
37082
- if (cvs.unreadCount === 0) return;
39842
+ const inx = conversationList2.value.findIndex((item) => item.conversationID === cvsId);
39843
+ if (inx > -1 && conversationList2.value[inx].unreadCount > 0) {
39844
+ conversationList2.value[inx] = { ...conversationList2.value[inx], unreadCount: 0 };
39845
+ }
39846
+ if (((_a = currentConversation2.value) == null ? void 0 : _a.conversationID) === cvsId && currentConversation2.value.unreadCount > 0) {
39847
+ currentConversation2.value = { ...currentConversation2.value, unreadCount: 0 };
39848
+ }
39849
+ if (inx > -1) getUnReadMessageCount();
37083
39850
  const bool = await (imInstance == null ? void 0 : imInstance.setConversationMsgAsRead(cvsId));
39851
+ if (!bool) {
39852
+ console.warn("[IM] 会话已读上报失败(本地未读已清零):", cvsId);
39853
+ }
37084
39854
  return bool;
37085
39855
  };
37086
- const initIMSDK = async () => {
39856
+ const initIMSDK = async (force = false) => {
39857
+ if (initPromise) return initPromise;
39858
+ 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`;
39859
+ if (sameSession) {
39860
+ window["imInstance"] = imInstance;
39861
+ return true;
39862
+ }
39863
+ initPromise = (async () => {
39864
+ if (messageStore.loginStatus === IM_LOGIN_STATUS.Logged) {
39865
+ await clearInstance();
39866
+ }
39867
+ resetSyncState();
39868
+ if (!imInstance) {
39869
+ imInstance = new ImKit({
39870
+ userID: messageStore.userID,
39871
+ imToken: messageStore.imToken,
39872
+ chatToken: messageStore.chatToken,
39873
+ apiUrl: messageStore.apiUrl,
39874
+ wsUrl: messageStore.wsUrl
39875
+ });
39876
+ } else {
39877
+ imInstance.userID = String(messageStore.userID || "");
39878
+ imInstance.imToken = messageStore.imToken;
39879
+ imInstance.chatToken = messageStore.chatToken;
39880
+ imInstance.apiUrl = `${messageStore.apiUrl}/imapi`;
39881
+ imInstance.wsUrl = `${messageStore.wsUrl}/imws`;
39882
+ }
39883
+ imInstance == null ? void 0 : imInstance.initSDK();
39884
+ bindMessageEvent();
39885
+ const loginOk = await (imInstance == null ? void 0 : imInstance.login());
39886
+ if (loginOk !== false) httpAuthBroken = false;
39887
+ window["imInstance"] = imInstance;
39888
+ return loginOk !== false;
39889
+ })();
39890
+ try {
39891
+ return await initPromise;
39892
+ } finally {
39893
+ initPromise = null;
39894
+ }
39895
+ };
39896
+ let reloginTimer = null;
39897
+ let reloginAttempts = 0;
39898
+ let tokenInvalidNotified = false;
39899
+ let recoveredToken = "";
39900
+ const MAX_RELOGIN_ATTEMPTS = 3;
39901
+ const tryRelogin = () => {
39902
+ const token = messageStore.imToken || "";
39903
+ if (token && token !== recoveredToken) {
39904
+ reloginAttempts = 0;
39905
+ tokenInvalidNotified = false;
39906
+ }
39907
+ if (reloginTimer) return;
39908
+ if (reloginAttempts >= MAX_RELOGIN_ATTEMPTS) {
39909
+ console.error("[IM] token 已失效且自动重新登录未成功,请重新登录");
39910
+ notifyTokenInvalid({ errMsg: "auto relogin exhausted" });
39911
+ return;
39912
+ }
39913
+ reloginTimer = setTimeout(async () => {
39914
+ reloginTimer = null;
39915
+ reloginAttempts += 1;
39916
+ console.warn(`[IM] token 已失效,自动重新登录(第 ${reloginAttempts} 次)`);
39917
+ const ok = await initIMSDK(true);
39918
+ if (!ok) {
39919
+ tryRelogin();
39920
+ return;
39921
+ }
39922
+ recoveredToken = messageStore.imToken || "";
39923
+ tokenInvalidNotified = false;
39924
+ try {
39925
+ await waitForSyncFinish(8e3);
39926
+ const list = await (imInstance == null ? void 0 : imInstance.getConversationListSplit(0, 200));
39927
+ if (list == null ? void 0 : list.length) {
39928
+ handleConversationList(list, "init", handleMessage);
39929
+ }
39930
+ mittBus.emit("IM_TOKEN_RECOVERED");
39931
+ } catch (error) {
39932
+ console.warn("[IM] 重新登录后刷新会话列表失败:", error);
39933
+ }
39934
+ }, 1e3);
39935
+ };
39936
+ let lastTokenWarnAt = 0;
39937
+ const notifyTokenInvalid = (error) => {
39938
+ httpAuthBroken = true;
39939
+ const now2 = Date.now();
39940
+ if (now2 - lastTokenWarnAt > 1e4) {
39941
+ lastTokenWarnAt = now2;
39942
+ console.warn(
39943
+ "[IM] token 已失效(接口返回 " + ((error == null ? void 0 : error.errMsg) || (error == null ? void 0 : error.errCode)) + "),等待宿主刷新 token 后重新登录"
39944
+ );
39945
+ }
39946
+ if (!tokenInvalidNotified) {
39947
+ tokenInvalidNotified = true;
39948
+ mittBus.emit("IM_TOKEN_INVALID");
39949
+ }
39950
+ };
39951
+ const handleImError = (error) => {
39952
+ if (!isTokenInvalidError(error)) return;
37087
39953
  if (messageStore.loginStatus === IM_LOGIN_STATUS.Logged) {
37088
- await clearInstance();
37089
- }
37090
- if (!imInstance) {
37091
- imInstance = new ImKit({
37092
- userID: messageStore.userID,
37093
- imToken: messageStore.imToken,
37094
- chatToken: messageStore.chatToken,
37095
- apiUrl: messageStore.apiUrl,
37096
- wsUrl: messageStore.wsUrl
37097
- });
39954
+ notifyTokenInvalid(error);
39955
+ return;
37098
39956
  }
37099
- imInstance == null ? void 0 : imInstance.initSDK();
37100
- bindMessageEvent();
37101
- await (imInstance == null ? void 0 : imInstance.login());
37102
- window["imInstance"] = imInstance;
39957
+ tokenInvalidNotified = false;
39958
+ tryRelogin();
37103
39959
  };
37104
39960
  const clearInstance = async (bool) => {
37105
39961
  unbindMessageEvent();
39962
+ cancelAllBurns();
37106
39963
  imInstance == null ? void 0 : imInstance.removeAllListeners();
37107
39964
  await (imInstance == null ? void 0 : imInstance.logout());
37108
39965
  imInstance == null ? void 0 : imInstance.clearSDK();
39966
+ if (imInstance) {
39967
+ imInstance.syncFinished = false;
39968
+ }
39969
+ resetSyncState();
37109
39970
  if (bool) {
37110
39971
  imInstance = null;
37111
39972
  window.imInstance = null;
@@ -37115,6 +39976,8 @@ const useMessage = (config = {}) => {
37115
39976
  };
37116
39977
  const bindMessageEvent = () => {
37117
39978
  if (!imInstance || !imInstance.on) return;
39979
+ imInstance.on("im-error", handleImError);
39980
+ bindUnhandledRejection(handleImError);
37118
39981
  imInstance.on(CbEvents.OnUserTokenExpired, () => {
37119
39982
  console.log("用户授权信息过期,重新登录");
37120
39983
  });
@@ -37179,14 +40042,22 @@ const useMessage = (config = {}) => {
37179
40042
  }
37180
40043
  });
37181
40044
  const resolveConversationIDs = async (list) => {
40045
+ var _a;
37182
40046
  for (let i3 = 0; i3 < list.length; i3++) {
37183
40047
  const item = list[i3];
37184
40048
  let cvsId = getConversationIDBySessionType(item, "sendID");
37185
40049
  if (!cvsId) {
37186
- const info = await (imInstance == null ? void 0 : imInstance.getOneConversation(
37187
- item.sessionType === IM_CVS_TYPE.Single ? item.sendID : item.groupID,
37188
- item == null ? void 0 : item.sessionType
37189
- ));
40050
+ let info = null;
40051
+ if (!httpAuthBroken) {
40052
+ try {
40053
+ info = await (imInstance == null ? void 0 : imInstance.getOneConversation(
40054
+ item.sessionType === IM_CVS_TYPE.Single ? item.sendID : item.groupID,
40055
+ item == null ? void 0 : item.sessionType
40056
+ ));
40057
+ } catch (error) {
40058
+ console.warn("[IM] 获取会话信息失败,改用消息数据兜底:", error);
40059
+ }
40060
+ }
37190
40061
  if (info == null ? void 0 : info.conversationID) {
37191
40062
  item.showName = info.showName;
37192
40063
  item.faceURL = info.faceURL;
@@ -37194,7 +40065,19 @@ const useMessage = (config = {}) => {
37194
40065
  cvsId = info.conversationID;
37195
40066
  handleConversationList([info], "add", handleMessage);
37196
40067
  if (info.ex) {
37197
- await (imInstance == null ? void 0 : imInstance.setConversation({ conversationID: cvsId, ex: "" }));
40068
+ const clearedEx = preserveBurnInEx("", info.ex);
40069
+ await (imInstance == null ? void 0 : imInstance.setConversation({ conversationID: cvsId, ex: clearedEx }));
40070
+ info.ex = clearedEx;
40071
+ }
40072
+ } else {
40073
+ const fallbackCvs = buildConversationFromMessage(item, (_a = messageStore.getUserInfo) == null ? void 0 : _a.userID);
40074
+ if (fallbackCvs) {
40075
+ cvsId = fallbackCvs.conversationID;
40076
+ item.showName = fallbackCvs.showName;
40077
+ item.faceURL = fallbackCvs.faceURL;
40078
+ item.unreadCount = fallbackCvs.unreadCount;
40079
+ handleConversationList([fallbackCvs], "add", handleMessage);
40080
+ console.warn("[IM] 会话信息获取失败,已用消息数据兜底展示会话:", cvsId);
37198
40081
  }
37199
40082
  }
37200
40083
  } else {
@@ -37204,6 +40087,26 @@ const useMessage = (config = {}) => {
37204
40087
  item.showMsgStr = handleMessage(item);
37205
40088
  }
37206
40089
  };
40090
+ const cacheFallbackMessages = async (msgs) => {
40091
+ var _a;
40092
+ const grouped = /* @__PURE__ */ new Map();
40093
+ msgs.forEach((item) => {
40094
+ if (!(item == null ? void 0 : item.conversationID)) return;
40095
+ const cvs = conversationList2.value.find((c2) => c2.conversationID === item.conversationID);
40096
+ if (!(cvs == null ? void 0 : cvs.isLocalFallback)) return;
40097
+ const arr = grouped.get(item.conversationID) || [];
40098
+ arr.push(item);
40099
+ grouped.set(item.conversationID, arr);
40100
+ });
40101
+ for (const [cvsID, items] of grouped) {
40102
+ try {
40103
+ const cached = ((_a = await loadMessagesFromCache(cvsID)) == null ? void 0 : _a.list) || [];
40104
+ saveMessagesToCache(cvsID, dedupeMessages([...cached, ...items]));
40105
+ } catch (error) {
40106
+ console.warn("[IM] 兜底会话消息写入缓存失败:", error);
40107
+ }
40108
+ }
40109
+ };
37207
40110
  const routeMessages = (list) => {
37208
40111
  const curMsgList = [];
37209
40112
  const cvs = currentConversation2.value;
@@ -37229,6 +40132,7 @@ const useMessage = (config = {}) => {
37229
40132
  console.log("批量接收消息:", list);
37230
40133
  if ((list == null ? void 0 : list.length) > 0) {
37231
40134
  await resolveConversationIDs(list);
40135
+ await cacheFallbackMessages(list);
37232
40136
  const curMsgList = routeMessages(list);
37233
40137
  if (curMsgList.length > 0) {
37234
40138
  const cvs = currentConversation2.value;
@@ -37270,6 +40174,20 @@ const useMessage = (config = {}) => {
37270
40174
  mittBus.emit("IM_LOGOUT");
37271
40175
  }
37272
40176
  });
40177
+ imInstance.on(CbEvents.OnSyncServerStart, () => {
40178
+ console.log("IM 服务端同步开始");
40179
+ syncFinished = false;
40180
+ });
40181
+ imInstance.on(CbEvents.OnSyncServerFinish, () => {
40182
+ console.log("IM 服务端同步完成");
40183
+ resolveSyncWaiters(true);
40184
+ mittBus.emit("IM_SYNC_SERVER_FINISH", true);
40185
+ });
40186
+ imInstance.on(CbEvents.OnSyncServerFailed, (data) => {
40187
+ console.warn("IM 服务端同步失败:", data);
40188
+ resolveSyncWaiters(false);
40189
+ mittBus.emit("IM_SYNC_SERVER_FINISH", false);
40190
+ });
37273
40191
  imInstance.on("im-error", async (err) => {
37274
40192
  });
37275
40193
  imInstance.on(CbEvents.OnConversationChanged, (data) => {
@@ -37352,6 +40270,7 @@ const useMessage = (config = {}) => {
37352
40270
  };
37353
40271
  const unbindMessageEvent = () => {
37354
40272
  if (!imInstance || !imInstance.off) return;
40273
+ imInstance.off("im-error");
37355
40274
  imInstance.off(CbEvents.OnUserTokenExpired);
37356
40275
  imInstance.off(CbEvents.OnSelfInfoUpdated);
37357
40276
  imInstance.off(CbEvents.OnUserStatusChanged);
@@ -37361,6 +40280,9 @@ const useMessage = (config = {}) => {
37361
40280
  imInstance.off(CbEvents.OnNewRecvMessageRevoked);
37362
40281
  imInstance.off("updateStatus");
37363
40282
  imInstance.off("im-error");
40283
+ imInstance.off(CbEvents.OnSyncServerStart);
40284
+ imInstance.off(CbEvents.OnSyncServerFinish);
40285
+ imInstance.off(CbEvents.OnSyncServerFailed);
37364
40286
  imInstance.off(CbEvents.OnConversationChanged);
37365
40287
  imInstance.off(CbEvents.OnNewConversation);
37366
40288
  imInstance.off(CbEvents.OnGroupInfoChanged);
@@ -37381,50 +40303,68 @@ const useMessage = (config = {}) => {
37381
40303
  initIMSDK,
37382
40304
  clearInstance,
37383
40305
  getUnReadMessageCount,
37384
- setConversationMsgAsRead
40306
+ setConversationMsgAsRead,
40307
+ waitForSyncFinish
37385
40308
  };
37386
40309
  };
37387
40310
  export {
37388
- GROUP_APPLICATION_STATUS as A,
37389
- useMessage as B,
37390
- useUsers as C,
37391
- useConversations as D,
40311
+ getDefaultExportFromCjs as $,
40312
+ isBurnMessage as A,
40313
+ BURN_DEFAULT as B,
40314
+ formatBurnRemain as C,
40315
+ isBurned as D,
37392
40316
  EXIT_CODE as E,
37393
- mittBus as F,
37394
- GROUP_JOIN_SOURCE as G,
37395
- IM_LOGIN_STATUS as H,
40317
+ smoothScrollTo as F,
40318
+ getJsonDetail as G,
40319
+ getSelectionText as H,
37396
40320
  IM_CVS_TYPE as I,
37397
- uuidv4 as J,
37398
- GROUP_VERIFICATION_TYPE as K,
37399
- IM_FONT_SIZE as L,
37400
- IM_FONT_FAMILY as M,
37401
- IM_FONT_STYLE as N,
37402
- formatFileSize as O,
37403
- getMediaDuration as P,
37404
- getGroupAvatarBg as a,
37405
- getAvatarBg as b,
37406
- getAvatarText as c,
37407
- cloneDeep as d,
40321
+ useBurnAfterReading as J,
40322
+ createCvsId as K,
40323
+ dedupeMessages as L,
40324
+ handleUrl as M,
40325
+ handleDate as N,
40326
+ GROUP_JOIN_SOURCE as O,
40327
+ GROUP_APPLICATION_STATUS as P,
40328
+ useMessage as Q,
40329
+ useUsers as R,
40330
+ useConversations as S,
40331
+ useMessageCache as T,
40332
+ mittBus as U,
40333
+ IM_LOGIN_STATUS as V,
40334
+ preserveBurnInEx as W,
40335
+ buildBurnEx as X,
40336
+ sleep as Y,
40337
+ uuidv4 as Z,
40338
+ GROUP_VERIFICATION_TYPE as _,
40339
+ getAvatarBg as a,
40340
+ getMediaDuration as a0,
40341
+ IM_FONT_SIZE as a1,
40342
+ IM_FONT_FAMILY as a2,
40343
+ IM_FONT_STYLE as a3,
40344
+ formatFileSize as a4,
40345
+ getAvatarText as b,
40346
+ cloneDeep as c,
40347
+ getConversationBurnSetting as d,
37408
40348
  useDate as e,
37409
- IM_GROUP_MEMBER_ROLE as f,
37410
- getDefaultExportFromCjs as g,
37411
- IM_MSG_TYPE as h,
40349
+ isNoticeAgentConversation as f,
40350
+ getGroupAvatarBg as g,
40351
+ IM_GROUP_MEMBER_ROLE as h,
37412
40352
  isDefaultAvatar as i,
37413
- debounce as j,
37414
- IM_GROUP_STATUS as k,
37415
- IM_LOGIN_PLATFORM as l,
37416
- handleLinks as m,
37417
- copyToClipboard as n,
37418
- downloadFileByBlob as o,
37419
- formatSeconds as p,
37420
- getReplyDetail as q,
37421
- useMsgList as r,
37422
- smoothScrollTo as s,
37423
- throttle as t,
40353
+ IM_MSG_TYPE as j,
40354
+ debounce as k,
40355
+ IM_GROUP_STATUS as l,
40356
+ IM_LOGIN_PLATFORM as m,
40357
+ BURN_PRESETS as n,
40358
+ formatBurnDuration as o,
40359
+ BURN_MAX as p,
40360
+ BURN_MIN as q,
40361
+ handleLinks as r,
40362
+ clampBurnDuration as s,
40363
+ copyToClipboard as t,
37424
40364
  useChatStore as u,
37425
- getJsonDetail as v,
37426
- getSelectionText as w,
37427
- createCvsId as x,
37428
- handleUrl as y,
37429
- handleDate as z
40365
+ downloadFileByBlob as v,
40366
+ formatSeconds as w,
40367
+ getReplyDetail as x,
40368
+ useMsgList as y,
40369
+ throttle as z
37430
40370
  };