@arcblock/did-connect-react 3.3.9 → 3.4.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/lib/Connect/connect.js +501 -0
- package/lib/Connect/contexts/state.js +3 -3
- package/lib/Connect/fallback-connect.js +53 -0
- package/lib/Connect/hooks/provider-list.js +25 -19
- package/lib/Connect/hooks/token.js +128 -136
- package/lib/Connect/index.js +13 -502
- package/lib/Connect/use-connect.js +10 -10
- package/lib/OAuth/context.js +3 -3
- package/lib/Passkey/context.js +3 -3
- package/lib/Passkey/dialog.js +7 -7
- package/lib/Session/assets/did-spaces-guide-cover.svg.js +74 -98
- package/lib/Session/index.js +189 -189
- package/lib/index.js +47 -46
- package/lib/package.json.js +1 -1
- package/lib/utils.js +97 -88
- package/package.json +8 -8
- package/src/Connect/connect.jsx +616 -0
- package/src/Connect/fallback-connect.jsx +47 -0
- package/src/Connect/hooks/provider-list.js +5 -0
- package/src/Connect/hooks/token.js +1 -13
- package/src/Connect/index.jsx +8 -605
- package/src/Connect/use-connect.jsx +1 -1
- package/src/Session/assets/did-spaces-guide-cover.svg +1 -128
- package/src/Session/index.jsx +3 -4
- package/src/utils.js +19 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useRef as I, useEffect as
|
|
2
|
-
import
|
|
1
|
+
import { useRef as I, useEffect as C } from "react";
|
|
2
|
+
import T from "lodash/get";
|
|
3
3
|
import ue from "js-cookie";
|
|
4
4
|
import B from "lodash/omitBy";
|
|
5
5
|
import M from "lodash/isNil";
|
|
@@ -9,71 +9,63 @@ import { useReactive as H, useCreation as pe, useMemoizedFn as E } from "ahooks"
|
|
|
9
9
|
import ke from "@arcblock/react-hooks/lib/useInterval";
|
|
10
10
|
import me from "@arcblock/react-hooks/lib/useBrowser";
|
|
11
11
|
import { getVisitorId as he, stringifyQuery as $, isUrl as ge } from "@arcblock/ux/lib/Util";
|
|
12
|
-
import { WsClient as
|
|
13
|
-
import { sleep as q, getConnectedInfo as
|
|
12
|
+
import { WsClient as be } from "@arcblock/ws";
|
|
13
|
+
import { sleep as q, getExtraHeaders as x, getConnectedInfo as we, updateConnectedInfo as Ce, parseNextWorkflow as Q, createAxios as z, decodeConnectUrl as Se, parseTokenFromConnectUrl as Ie } from "../../utils.js";
|
|
14
14
|
import V from "../assets/locale.js";
|
|
15
|
-
import
|
|
16
|
-
import
|
|
15
|
+
import $e from "./security.js";
|
|
16
|
+
import xe from "./page-show.js";
|
|
17
17
|
import { RELAY_SOCKET_PREFIX as G } from "../../constant.js";
|
|
18
18
|
function ve(o) {
|
|
19
|
-
const
|
|
20
|
-
return new URL(
|
|
19
|
+
const l = o || window.location.href;
|
|
20
|
+
return new URL(l).host;
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return a;
|
|
29
|
-
}
|
|
30
|
-
const R = {};
|
|
31
|
-
function Ue({ action: o, prefix: a, checkFn: d, extraParams: w, baseUrl: i }) {
|
|
32
|
-
const p = `${a}/token?${$(w)}`;
|
|
33
|
-
return R[p] || (R[p] = async function() {
|
|
34
|
-
const k = +/* @__PURE__ */ new Date(), h = await d(p, { headers: v(i) }), g = +/* @__PURE__ */ new Date();
|
|
35
|
-
if (g - k < 500 && await q(500 - (g - k)), h?.data?.token)
|
|
22
|
+
const P = {};
|
|
23
|
+
function Ue({ action: o, prefix: l, checkFn: k, extraParams: v, baseUrl: m }) {
|
|
24
|
+
const d = `${l}/token?${$(v)}`;
|
|
25
|
+
return P[d] || (P[d] = async function() {
|
|
26
|
+
const f = +/* @__PURE__ */ new Date(), h = await k(d, { headers: x(m) }), g = +/* @__PURE__ */ new Date();
|
|
27
|
+
if (g - f < 500 && await q(500 - (g - f)), h?.data?.token)
|
|
36
28
|
return h.data;
|
|
37
29
|
if (h?.data?.error)
|
|
38
30
|
throw new Error(h.data.error);
|
|
39
|
-
const U = ge(
|
|
31
|
+
const U = ge(l) ? l : `${m}${l}`;
|
|
40
32
|
throw new Error(`Error generating ${o} QR Code from: ${U}`);
|
|
41
|
-
}),
|
|
33
|
+
}), P[d];
|
|
42
34
|
}
|
|
43
35
|
const Ae = () => {
|
|
44
36
|
try {
|
|
45
|
-
const
|
|
46
|
-
if (!
|
|
37
|
+
const l = new URL(window.location.href).searchParams.get("__connect_url__");
|
|
38
|
+
if (!l)
|
|
47
39
|
return null;
|
|
48
|
-
const
|
|
40
|
+
const k = Se(l);
|
|
49
41
|
return {
|
|
50
|
-
token:
|
|
51
|
-
url:
|
|
42
|
+
token: Ie(k),
|
|
43
|
+
url: k
|
|
52
44
|
};
|
|
53
45
|
} catch (o) {
|
|
54
46
|
return {
|
|
55
47
|
error: o
|
|
56
48
|
};
|
|
57
49
|
}
|
|
58
|
-
}, J = () =>
|
|
50
|
+
}, J = () => T(globalThis, "blocklet.appPid") || T(globalThis, "blocklet.appId") || T(globalThis, "env.appId") || "", ye = () => (T(globalThis, "env.apiPrefix") || "/").replace(/\/$/, "").replace(G, ""), R = (o) => `relay:${J()}:${o}`, Ee = () => window.location.protocol === "https:" ? "wss:" : "ws:", X = (o) => !o || new URL(o).origin === window.location.origin, Y = (o) => ["succeed", "error", "timeout", "busy"].includes(o);
|
|
59
51
|
function Xe({
|
|
60
52
|
action: o,
|
|
61
|
-
checkFn:
|
|
62
|
-
checkInterval:
|
|
63
|
-
checkTimeout:
|
|
64
|
-
extraParams:
|
|
65
|
-
locale:
|
|
53
|
+
checkFn: l,
|
|
54
|
+
checkInterval: k,
|
|
55
|
+
checkTimeout: v,
|
|
56
|
+
extraParams: m,
|
|
57
|
+
locale: d,
|
|
66
58
|
prefix: _,
|
|
67
|
-
tokenKey:
|
|
59
|
+
tokenKey: f,
|
|
68
60
|
encKey: h,
|
|
69
61
|
onError: g,
|
|
70
62
|
onSuccess: U,
|
|
71
63
|
baseUrl: Z,
|
|
72
64
|
autoConnect: K = !0,
|
|
73
65
|
forceConnected: ee = !0,
|
|
74
|
-
saveConnect:
|
|
66
|
+
saveConnect: re = !0,
|
|
75
67
|
// FIXME: @zhanghan 将来需要设置为默认 false,仅在需要的时候进行保存 login, switch/role/profile
|
|
76
|
-
useSocket:
|
|
68
|
+
useSocket: te = !0,
|
|
77
69
|
provider: ne = "wallet"
|
|
78
70
|
}) {
|
|
79
71
|
const e = H({
|
|
@@ -94,41 +86,41 @@ function Xe({
|
|
|
94
86
|
nextWorkflow: "",
|
|
95
87
|
baseUrl: Z,
|
|
96
88
|
prefix: `${_}/${o}`,
|
|
97
|
-
extraParams: B(
|
|
98
|
-
checkFn:
|
|
89
|
+
extraParams: B(m, M),
|
|
90
|
+
checkFn: l,
|
|
99
91
|
results: {},
|
|
100
92
|
action: o,
|
|
101
93
|
provider: ne,
|
|
102
94
|
reset() {
|
|
103
95
|
this.error = "", this.status = "created";
|
|
104
96
|
}
|
|
105
|
-
}), F = I(null),
|
|
97
|
+
}), F = I(null), S = V[d] || V.en, u = pe(() => Ae(), []), oe = Math.ceil(v / k), c = H({
|
|
106
98
|
onSuccessCalled: !1,
|
|
107
99
|
cancelWhenScannedCounter: 0,
|
|
108
100
|
isSocketAvailable: !1
|
|
109
|
-
}), { encryptKey: se, decrypt: A } =
|
|
101
|
+
}), { encryptKey: se, decrypt: A } = $e(), D = me(), O = he(), a = I(null), p = I(null), b = {
|
|
110
102
|
...e.extraParams,
|
|
111
|
-
locale:
|
|
112
|
-
[
|
|
103
|
+
locale: d,
|
|
104
|
+
[f]: e.token || u?.token,
|
|
113
105
|
provider: e.provider
|
|
114
106
|
}, L = async () => {
|
|
115
|
-
if (!(
|
|
107
|
+
if (!(u?.token && u?.token === e.token)) {
|
|
116
108
|
try {
|
|
117
|
-
b[
|
|
118
|
-
headers:
|
|
109
|
+
b[f] && e.status === "created" && await e.checkFn(`${e.prefix}/timeout?${$(b)}`, {
|
|
110
|
+
headers: x(e.baseUrl)
|
|
119
111
|
});
|
|
120
112
|
} catch {
|
|
121
113
|
}
|
|
122
114
|
try {
|
|
123
|
-
e.token &&
|
|
115
|
+
e.token && p.current && (await a.current.unsubscribe(R(e.token)), p.current = null);
|
|
124
116
|
} catch {
|
|
125
117
|
}
|
|
126
118
|
}
|
|
127
|
-
}, ae = E((...
|
|
128
|
-
const
|
|
119
|
+
}, ae = E((...t) => {
|
|
120
|
+
const r = {
|
|
129
121
|
[h]: se,
|
|
130
122
|
...e.extraParams,
|
|
131
|
-
locale:
|
|
123
|
+
locale: d,
|
|
132
124
|
forceConnected: ee,
|
|
133
125
|
// - autoConnect 请求参数用于控制服务端是否给钱包应用发送自动连接通知
|
|
134
126
|
// - 使用 connect 组件时明确传入了 autoConnect = false, 则 autoConnect 请求参数 为 false
|
|
@@ -136,97 +128,97 @@ function Xe({
|
|
|
136
128
|
// (避免 "无限自动连接问题")
|
|
137
129
|
// - 如果上次连接设备 (connected_wallet_os) 不是 ios/android, 则禁用自动连接
|
|
138
130
|
autoConnect: K && // 如果是 wallet webview 环境, 不发送通知, 避免 wallet 连续弹出 auth 窗口 2 次 (#341)
|
|
139
|
-
!(D.wallet || D.arcSphere) && !
|
|
131
|
+
!(D.wallet || D.arcSphere) && !c.cancelWhenScannedCounter && ["ios", "android"].includes(ue.get("connected_wallet_os")),
|
|
140
132
|
provider: e.provider
|
|
141
133
|
};
|
|
142
|
-
O && (
|
|
134
|
+
O && (r.visitorId = O);
|
|
143
135
|
const n = fe(F.current || {}, ["sourceAppPid", "verbose"]);
|
|
144
136
|
return Object.keys(n).forEach((s) => {
|
|
145
|
-
(!
|
|
146
|
-
}),
|
|
137
|
+
(!r[s] || s === h && n[s]) && (r[s] = n[s]);
|
|
138
|
+
}), u?.token && !r.sourceToken && (r.sourceToken = u?.token), Ue({
|
|
147
139
|
action: o,
|
|
148
140
|
prefix: e.prefix,
|
|
149
141
|
baseUrl: e.baseUrl,
|
|
150
142
|
checkFn: e.checkFn,
|
|
151
|
-
extraParams:
|
|
152
|
-
})(...
|
|
153
|
-
}), y = E(async (
|
|
154
|
-
|
|
143
|
+
extraParams: r
|
|
144
|
+
})(...t);
|
|
145
|
+
}), y = E(async (t = !0) => {
|
|
146
|
+
t && L();
|
|
155
147
|
try {
|
|
156
|
-
e.loading = !0, e.token = "", e.url = "", e.store = null, e.extraParams = B(
|
|
157
|
-
const
|
|
158
|
-
e.loading = !1, e.token =
|
|
159
|
-
} catch (
|
|
160
|
-
e.loading = !1, e.status = "error", e.error = `${
|
|
148
|
+
e.loading = !0, e.token = "", e.url = "", e.store = null, e.extraParams = B(m, M), await q();
|
|
149
|
+
const r = await ae(), n = r.extra || {};
|
|
150
|
+
e.loading = !1, e.token = r.token, e.url = r.url, e.status = "created", e.error = "", e.checkCount = 0, e.appInfo = r.appInfo, e.memberAppInfo = r.memberAppInfo, e.connectedDid = n.connectedDid, e.saveConnect = n.saveConnect;
|
|
151
|
+
} catch (r) {
|
|
152
|
+
e.loading = !1, e.status = "error", e.error = `${S.generateError}: ${r.message}`;
|
|
161
153
|
}
|
|
162
154
|
}), ce = E(() => {
|
|
163
|
-
|
|
155
|
+
c.cancelWhenScannedCounter++;
|
|
164
156
|
});
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}, [
|
|
157
|
+
C(() => {
|
|
158
|
+
c.cancelWhenScannedCounter > 0 && (m.nw ? g(new Error(S.retryForbidden)) : y());
|
|
159
|
+
}, [c.cancelWhenScannedCounter]), C(() => (!(/^((?!chrome|android).)*safari/i.test(globalThis.navigator.userAgent) || Object.hasOwn(globalThis?.blocklet || {}, "DID_CONNECT_DISABLE_SOCKET")) && te && X(e.baseUrl) && J() ? (!a.current || a.current.isConnected() === !1 || a.current.baseUrl !== e.baseUrl) && (a.current = new be(
|
|
168
160
|
`${Ee()}//${ve(e.baseUrl)}${ye()}${G}/relay`,
|
|
169
161
|
{
|
|
170
162
|
longpollerTimeout: 5e3,
|
|
171
163
|
// connection timeout
|
|
172
164
|
heartbeatIntervalMs: 30 * 1e3
|
|
173
165
|
}
|
|
174
|
-
),
|
|
175
|
-
|
|
176
|
-
}),
|
|
177
|
-
|
|
166
|
+
), a.current.baseUrl = e.baseUrl, a.current.onOpen(() => {
|
|
167
|
+
c.isSocketAvailable = !0;
|
|
168
|
+
}), a.current.connect()) : c.isSocketAvailable && (c.isSocketAvailable = !1), () => {
|
|
169
|
+
a.current && (a.current.disconnect(), a.current = null);
|
|
178
170
|
}), [e.baseUrl]);
|
|
179
|
-
const ie = () => !e.token || e.loading || Y(e.status) ? null :
|
|
180
|
-
|
|
171
|
+
const ie = () => !e.token || e.loading || Y(e.status) ? null : k, j = I(null);
|
|
172
|
+
C(() => {
|
|
181
173
|
j.current = { state: e, params: b };
|
|
182
|
-
}),
|
|
183
|
-
const { state:
|
|
184
|
-
|
|
185
|
-
headers:
|
|
174
|
+
}), C(() => () => {
|
|
175
|
+
const { state: t, params: r } = j.current;
|
|
176
|
+
t.status === "created" && r[f] && t.checkFn(`${t.prefix}/timeout?${$(r)}`, {
|
|
177
|
+
headers: x(t.baseUrl)
|
|
186
178
|
});
|
|
187
179
|
}, []);
|
|
188
|
-
const
|
|
189
|
-
if ((e.checking || document.hidden) && !
|
|
180
|
+
const w = E(async (t = !1) => {
|
|
181
|
+
if ((e.checking || document.hidden) && !t || (e.status === "created" && e.checkCount++, c.isSocketAvailable && !t))
|
|
190
182
|
return null;
|
|
191
183
|
try {
|
|
192
184
|
e.checking = !0;
|
|
193
|
-
const
|
|
194
|
-
headers:
|
|
195
|
-
}), { status: n, error:
|
|
196
|
-
if (e.store =
|
|
197
|
-
const N = new Error(
|
|
198
|
-
throw N.response =
|
|
185
|
+
const r = await e.checkFn(`${e.prefix}/status?${$(b)}`, {
|
|
186
|
+
headers: x(e.baseUrl)
|
|
187
|
+
}), { status: n, error: i, mfaCode: s = 0 } = r.data;
|
|
188
|
+
if (e.store = r.data, e.mfaCode = s, e.checking = !1, e.status === "scanned" && n === "created" || (e.status = n), n === "error" && i) {
|
|
189
|
+
const N = new Error(i);
|
|
190
|
+
throw N.response = r, N;
|
|
199
191
|
}
|
|
200
|
-
return
|
|
201
|
-
} catch (
|
|
202
|
-
const { response: n } =
|
|
192
|
+
return r.data;
|
|
193
|
+
} catch (r) {
|
|
194
|
+
const { response: n } = r;
|
|
203
195
|
if (n?.status) {
|
|
204
|
-
b[
|
|
205
|
-
headers:
|
|
196
|
+
b[f] && e.checkFn(`${e.prefix}/timeout?${$(b)}`, {
|
|
197
|
+
headers: x(e.baseUrl)
|
|
206
198
|
});
|
|
207
|
-
const
|
|
208
|
-
s.code = n.status, e.status = "error", e.checking = !1, e.error =
|
|
199
|
+
const i = n?.data?.error ? n.data.error : r.message, s = new Error(i);
|
|
200
|
+
s.code = n.status, e.status = "error", e.checking = !1, e.error = i, g(s, e?.store, A);
|
|
209
201
|
} else
|
|
210
|
-
e.status = "error", e.checking = !1, e.error =
|
|
202
|
+
e.status = "error", e.checking = !1, e.error = S.generateError;
|
|
211
203
|
}
|
|
212
204
|
return null;
|
|
213
205
|
}), le = async () => {
|
|
214
206
|
try {
|
|
215
|
-
if (
|
|
216
|
-
throw
|
|
217
|
-
e.loading = !0, e.token =
|
|
218
|
-
let
|
|
219
|
-
if ((["scanned"].includes(
|
|
220
|
-
throw new Error(`${
|
|
221
|
-
} catch (
|
|
222
|
-
e.status = "error", e.error =
|
|
207
|
+
if (u.error)
|
|
208
|
+
throw u.error;
|
|
209
|
+
e.loading = !0, e.token = u.token, e.url = u.url, e.inExistingSession = !0;
|
|
210
|
+
let t = await w();
|
|
211
|
+
if ((["scanned"].includes(t?.status) || t?.sourceToken === u?.token) && (await y(!1), t = await w()), F.current = t?.extraParams || null, t?.status && !["created"].includes(t?.status))
|
|
212
|
+
throw new Error(`${S.invalidSessionStatus} [${t.status}]`);
|
|
213
|
+
} catch (t) {
|
|
214
|
+
e.status = "error", e.error = t.message, g(t, e?.store, A);
|
|
223
215
|
} finally {
|
|
224
216
|
e.loading = !1;
|
|
225
217
|
}
|
|
226
218
|
};
|
|
227
|
-
|
|
219
|
+
C(() => {
|
|
228
220
|
if (!e.token && !e.store && !e.loading && !e.error)
|
|
229
|
-
if (
|
|
221
|
+
if (u)
|
|
230
222
|
le();
|
|
231
223
|
else {
|
|
232
224
|
y(!1);
|
|
@@ -236,67 +228,67 @@ function Xe({
|
|
|
236
228
|
e.status = "timeout", L();
|
|
237
229
|
return;
|
|
238
230
|
}
|
|
239
|
-
if (e.status === "succeed" && !
|
|
240
|
-
const
|
|
231
|
+
if (e.status === "succeed" && !c.onSuccessCalled) {
|
|
232
|
+
const t = we({
|
|
241
233
|
...e.store,
|
|
242
234
|
appInfo: e.appInfo,
|
|
243
235
|
memberAppInfo: e.memberAppInfo
|
|
244
236
|
});
|
|
245
|
-
if (X(e.baseUrl) &&
|
|
246
|
-
const { nextWorkflow:
|
|
247
|
-
if (
|
|
237
|
+
if (X(e.baseUrl) && re && e.saveConnect && e.store.did && Ce(t, !0), e.store) {
|
|
238
|
+
const { nextWorkflow: r } = e.store;
|
|
239
|
+
if (r)
|
|
248
240
|
try {
|
|
249
|
-
const n = Q(
|
|
250
|
-
e.nextWorkflow = n?.nextWorkflow ||
|
|
241
|
+
const n = Q(r, f);
|
|
242
|
+
e.nextWorkflow = n?.nextWorkflow || r, Object.assign(e, n), e.store = null, e.error = "", e.url = "", e.appInfo = null, e.memberAppInfo = null, e.checkCount = 0, e.status = "scanned", e.results = {
|
|
251
243
|
...e.results,
|
|
252
244
|
[e.token]: e.store
|
|
253
|
-
}, e.checkFn = z({ baseURL: n.baseUrl, timeout: 8e3 }).get,
|
|
245
|
+
}, e.checkFn = z({ baseURL: n.baseUrl, timeout: 8e3 }).get, w();
|
|
254
246
|
} catch (n) {
|
|
255
|
-
console.error(`Invalid nextWorkflow: ${
|
|
247
|
+
console.error(`Invalid nextWorkflow: ${r}`, n), e.status = "error", e.error = `Invalid nextWorkflow: ${r}: ${n.message}`;
|
|
256
248
|
}
|
|
257
249
|
else if (e.nextWorkflow && (e.nextWorkflow = "", e.url = ""), typeof U == "function") {
|
|
258
250
|
const n = Object.values({ ...e.results, [e.token]: e.store });
|
|
259
|
-
|
|
260
|
-
const
|
|
251
|
+
c.onSuccessCalled = !0;
|
|
252
|
+
const i = n.length > 1 ? n : n[0], s = de(i);
|
|
261
253
|
U(s, A, {
|
|
262
|
-
sourceAppPid:
|
|
263
|
-
...
|
|
254
|
+
sourceAppPid: m?.sourceAppPid,
|
|
255
|
+
...t
|
|
264
256
|
});
|
|
265
257
|
}
|
|
266
258
|
}
|
|
267
259
|
return;
|
|
268
260
|
}
|
|
269
261
|
if (e.store?.nextWorkflow) {
|
|
270
|
-
const { nextWorkflow:
|
|
262
|
+
const { nextWorkflow: t } = e.store;
|
|
271
263
|
try {
|
|
272
|
-
const
|
|
273
|
-
e.nextWorkflow =
|
|
264
|
+
const r = Q(t, f);
|
|
265
|
+
e.nextWorkflow = r?.nextWorkflow || t, Object.assign(e, r), e.store = null, e.error = "", e.url = "", e.appInfo = null, e.memberAppInfo = null, e.checkCount = 0, e.status = "scanned", e.results = {
|
|
274
266
|
...e.results,
|
|
275
267
|
[e.token]: e.store
|
|
276
|
-
}, e.checkFn = z({ baseURL:
|
|
277
|
-
} catch (
|
|
278
|
-
console.error(`Invalid nextWorkflow: ${
|
|
268
|
+
}, e.checkFn = z({ baseURL: r.baseUrl, timeout: 8e3 }).get, w();
|
|
269
|
+
} catch (r) {
|
|
270
|
+
console.error(`Invalid nextWorkflow: ${t}`, r), e.status = "error", e.error = `Invalid nextWorkflow: ${t}: ${r.message}`;
|
|
279
271
|
}
|
|
280
272
|
}
|
|
281
273
|
});
|
|
282
|
-
const
|
|
283
|
-
return
|
|
284
|
-
if (e.token &&
|
|
285
|
-
let
|
|
286
|
-
|
|
287
|
-
const n = +new Date(
|
|
288
|
-
if (n <=
|
|
289
|
-
console.warn("Ignore outdated message",
|
|
274
|
+
const W = I(0);
|
|
275
|
+
return C(() => {
|
|
276
|
+
if (e.token && c.isSocketAvailable && a.current) {
|
|
277
|
+
let t = !1;
|
|
278
|
+
p.current ? p.current.token !== e.token && (a.current.unsubscribe(R(p.current.token)), t = !0) : t = !0, t && (p.current = a.current.subscribe(R(e.token)), W.current = 0, p.current.token = e.token, p.current.on("updated", ({ response: r }) => {
|
|
279
|
+
const n = +new Date(r.updatedAt);
|
|
280
|
+
if (n <= W.current) {
|
|
281
|
+
console.warn("Ignore outdated message", r);
|
|
290
282
|
return;
|
|
291
283
|
}
|
|
292
|
-
|
|
293
|
-
let { status:
|
|
294
|
-
|
|
284
|
+
W.current = n;
|
|
285
|
+
let { status: i, error: s } = r;
|
|
286
|
+
i === "forbidden" && (s = S.forbidden, i = "error"), e.status = i, e.mfaCode = r.mfaCode || 0, e.store = r, e.error = s, s && g(new Error(s), e?.store, A);
|
|
295
287
|
}));
|
|
296
288
|
}
|
|
297
|
-
}, [e.token,
|
|
289
|
+
}, [e.token, c.isSocketAvailable, a.current]), ke(w, ie()), xe(() => {
|
|
298
290
|
e.token && Y(e.status) === !1 && (e.checking = !1, setTimeout(() => {
|
|
299
|
-
|
|
291
|
+
w(!0);
|
|
300
292
|
}, 100));
|
|
301
293
|
}), { state: e, generate: y, cancelWhenScanned: ce };
|
|
302
294
|
}
|