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