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