@getpara/core-sdk 3.0.0-alpha.1 → 3.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/dist/cjs/ParaCore.js +436 -86
- package/dist/cjs/constants.js +1 -1
- package/dist/cjs/cryptography/utils.js +5 -2
- package/dist/cjs/errors.js +10 -0
- package/dist/cjs/external/userManagementClient.js +21 -4
- package/dist/cjs/index.js +67 -1
- package/dist/cjs/services/AuthService.js +66 -47
- package/dist/cjs/services/LoginFlowService.js +30 -27
- package/dist/cjs/services/PollingService.js +100 -75
- package/dist/cjs/services/PortalUrlService.js +112 -19
- package/dist/cjs/services/PregenWalletService.js +125 -76
- package/dist/cjs/services/SessionManagementService.js +81 -10
- package/dist/cjs/services/SignupFlowService.js +52 -47
- package/dist/cjs/services/VerificationFlowService.js +13 -10
- package/dist/cjs/services/WalletService.js +51 -36
- package/dist/cjs/shares/enclave.js +44 -24
- package/dist/cjs/state/CoreStateManager.js +17 -5
- package/dist/cjs/state/actors/setupPara.js +4 -1
- package/dist/cjs/state/machines/walletStateMachine.js +22 -0
- package/dist/cjs/telemetry/BeaconSpanProcessor.js +99 -0
- package/dist/cjs/telemetry/config.js +15 -0
- package/dist/cjs/telemetry/init.js +193 -0
- package/dist/cjs/telemetry/modalSession.js +54 -0
- package/dist/cjs/telemetry/session.js +39 -0
- package/dist/cjs/telemetry/tracer.js +126 -0
- package/dist/cjs/telemetry/uxAction.js +30 -0
- package/dist/cjs/telemetry/uxBaggagePropagator.js +58 -0
- package/dist/cjs/telemetry/uxState.js +46 -0
- package/dist/cjs/telemetry/uxStateSpanProcessor.js +51 -0
- package/dist/cjs/utils/configEncoding.js +98 -0
- package/dist/cjs/utils/deprecation.js +13 -13
- package/dist/cjs/utils/index.js +11 -0
- package/dist/cjs/utils/partnerConfig.js +103 -0
- package/dist/cjs/utils/partnerConfigGating.js +83 -0
- package/dist/cjs/utils/stateErrorHelpers.js +6 -1
- package/dist/cjs/utils/url.js +10 -2
- package/dist/esm/ParaCore.js +441 -88
- package/dist/esm/constants.js +1 -1
- package/dist/esm/cryptography/utils.js +5 -2
- package/dist/esm/errors.js +9 -0
- package/dist/esm/external/userManagementClient.js +21 -4
- package/dist/esm/index.js +58 -4
- package/dist/esm/services/AuthService.js +66 -47
- package/dist/esm/services/LoginFlowService.js +30 -27
- package/dist/esm/services/PollingService.js +100 -75
- package/dist/esm/services/PortalUrlService.js +112 -19
- package/dist/esm/services/PregenWalletService.js +125 -76
- package/dist/esm/services/SessionManagementService.js +69 -11
- package/dist/esm/services/SignupFlowService.js +52 -47
- package/dist/esm/services/VerificationFlowService.js +13 -10
- package/dist/esm/services/WalletService.js +51 -36
- package/dist/esm/shares/enclave.js +44 -24
- package/dist/esm/state/CoreStateManager.js +17 -5
- package/dist/esm/state/actors/setupPara.js +4 -1
- package/dist/esm/state/machines/walletStateMachine.js +22 -0
- package/dist/esm/telemetry/BeaconSpanProcessor.js +74 -0
- package/dist/esm/telemetry/config.js +0 -0
- package/dist/esm/telemetry/init.js +130 -0
- package/dist/esm/telemetry/modalSession.js +29 -0
- package/dist/esm/telemetry/session.js +16 -0
- package/dist/esm/telemetry/tracer.js +84 -0
- package/dist/esm/telemetry/uxAction.js +8 -0
- package/dist/esm/telemetry/uxBaggagePropagator.js +35 -0
- package/dist/esm/telemetry/uxState.js +21 -0
- package/dist/esm/telemetry/uxStateSpanProcessor.js +28 -0
- package/dist/esm/utils/configEncoding.js +45 -0
- package/dist/esm/utils/deprecation.js +11 -12
- package/dist/esm/utils/index.js +6 -0
- package/dist/esm/utils/partnerConfig.js +67 -0
- package/dist/esm/utils/partnerConfigGating.js +61 -0
- package/dist/esm/utils/stateErrorHelpers.js +6 -1
- package/dist/esm/utils/url.js +10 -2
- package/dist/types/ParaCore.d.ts +101 -19
- package/dist/types/PlatformUtils.d.ts +1 -0
- package/dist/types/errors.d.ts +26 -0
- package/dist/types/external/userManagementClient.d.ts +2 -1
- package/dist/types/index.d.ts +15 -3
- package/dist/types/services/types/AuthServiceTypes.d.ts +10 -3
- package/dist/types/services/types/PortalUrlServiceTypes.d.ts +3 -3
- package/dist/types/services/types/WalletServiceTypes.d.ts +4 -0
- package/dist/types/state/actors/setupPara.d.ts +18 -0
- package/dist/types/state/machines/authStateMachine.d.ts +1 -1
- package/dist/types/state/machines/coreStateMachine.d.ts +30 -6
- package/dist/types/state/machines/walletStateMachine.d.ts +4 -0
- package/dist/types/state/types/core.d.ts +7 -1
- package/dist/types/telemetry/BeaconSpanProcessor.d.ts +10 -0
- package/dist/types/telemetry/config.d.ts +4 -0
- package/dist/types/telemetry/init.d.ts +17 -0
- package/dist/types/telemetry/modalSession.d.ts +5 -0
- package/dist/types/telemetry/session.d.ts +2 -0
- package/dist/types/telemetry/tracer.d.ts +10 -0
- package/dist/types/telemetry/uxAction.d.ts +3 -0
- package/dist/types/telemetry/uxBaggagePropagator.d.ts +7 -0
- package/dist/types/telemetry/uxState.d.ts +8 -0
- package/dist/types/telemetry/uxStateSpanProcessor.d.ts +9 -0
- package/dist/types/types/config.d.ts +15 -3
- package/dist/types/types/coreApi.d.ts +7 -9
- package/dist/types/types/serviceInterfaces.d.ts +5 -3
- package/dist/types/types/util.d.ts +2 -15
- package/dist/types/utils/configEncoding.d.ts +51 -0
- package/dist/types/utils/deprecation.d.ts +3 -1
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/partnerConfig.d.ts +28 -0
- package/dist/types/utils/partnerConfigGating.d.ts +48 -0
- package/dist/types/utils/url.d.ts +3 -2
- package/package.json +15 -4
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
__spreadProps,
|
|
7
7
|
__spreadValues
|
|
8
8
|
} from "../chunk-7B52C2XE.js";
|
|
9
|
-
var _stateManager, _authService, _walletService, _pollingService, _paraCoreInterface, _isCreateGuestWalletsPending, _fetchOverridePromise;
|
|
9
|
+
var _stateManager, _authService, _walletService, _pollingService, _paraCoreInterface, _isCreateGuestWalletsPending, _fetchOverridePromise, _claimPregenWalletEntities;
|
|
10
10
|
import {
|
|
11
11
|
isPregenAuth,
|
|
12
12
|
toPregenIds,
|
|
@@ -23,6 +23,7 @@ import { dispatchEvent } from "../utils/index.js";
|
|
|
23
23
|
import { ParaEvent } from "../types/events.js";
|
|
24
24
|
import { distributeNewShare } from "../shares/shareDistribution.js";
|
|
25
25
|
import { SHORT_POLLING_INTERVAL_MS } from "../constants.js";
|
|
26
|
+
import { wrapWithSpan } from "../telemetry/tracer.js";
|
|
26
27
|
import { waitForCoreStateChange } from "../utils/stateListener.js";
|
|
27
28
|
class PregenWalletService {
|
|
28
29
|
constructor(paraCore) {
|
|
@@ -81,37 +82,50 @@ class PregenWalletService {
|
|
|
81
82
|
}
|
|
82
83
|
const { supportedWalletTypes } = yield __privateGet(this, _paraCoreInterface).assertPartner();
|
|
83
84
|
const pregenWallets = yield this.getPregenWallets();
|
|
84
|
-
let recoverySecret
|
|
85
|
+
let recoverySecret;
|
|
86
|
+
let walletIds = {};
|
|
85
87
|
if (pregenWallets.length > 0) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
88
|
+
let candidates = pregenWallets.filter((w) => {
|
|
89
|
+
var _a;
|
|
90
|
+
return !!((_a = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a.signer);
|
|
91
|
+
});
|
|
92
|
+
if (candidates.length === 0) {
|
|
93
|
+
try {
|
|
94
|
+
const shares = yield __privateGet(this, _paraCoreInterface).ctx.enclaveClient.getPregenShares({
|
|
95
|
+
userId: __privateGet(this, _authService).userId,
|
|
96
|
+
walletIds: pregenWallets.map((w) => w.id),
|
|
97
|
+
partnerId: pregenWallets[0].partnerId
|
|
98
|
+
});
|
|
99
|
+
for (const share of shares) {
|
|
100
|
+
const wallet = pregenWallets.find((w) => w.id === share.walletId);
|
|
101
|
+
if (wallet) {
|
|
102
|
+
__privateGet(this, _walletService).wallets[wallet.id] = {
|
|
103
|
+
id: wallet.id,
|
|
104
|
+
address: wallet.address,
|
|
105
|
+
scheme: wallet.scheme,
|
|
106
|
+
type: wallet.type,
|
|
107
|
+
partnerId: wallet.partnerId,
|
|
108
|
+
isPregen: wallet.isPregen,
|
|
109
|
+
pregenIdentifier: wallet.pregenIdentifier,
|
|
110
|
+
pregenIdentifierType: wallet.pregenIdentifierType,
|
|
111
|
+
signer: share.signer,
|
|
112
|
+
createdAt: String(wallet.createdAt)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
107
115
|
}
|
|
116
|
+
} catch (err) {
|
|
117
|
+
console.warn("[performClaimPregenWallets] Failed to fetch pregen shares:", err);
|
|
108
118
|
}
|
|
109
|
-
|
|
110
|
-
|
|
119
|
+
candidates = pregenWallets.filter((w) => {
|
|
120
|
+
var _a;
|
|
121
|
+
return !!((_a = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a.signer);
|
|
122
|
+
});
|
|
111
123
|
}
|
|
112
|
-
recoverySecret = yield this.
|
|
124
|
+
const { recoverySecret: claimRecoverySecret, claimedWalletIds } = yield __privateGet(this, _claimPregenWalletEntities).call(this, candidates);
|
|
125
|
+
recoverySecret = claimRecoverySecret;
|
|
126
|
+
const claimed = candidates.filter((w) => claimedWalletIds.includes(w.id));
|
|
113
127
|
walletIds = supportedWalletTypes.reduce((acc, { type }) => {
|
|
114
|
-
const wallet =
|
|
128
|
+
const wallet = claimed.find((w) => !!WalletSchemeTypeMap[w.scheme][type]);
|
|
115
129
|
if (!wallet) {
|
|
116
130
|
return acc;
|
|
117
131
|
}
|
|
@@ -125,48 +139,76 @@ class PregenWalletService {
|
|
|
125
139
|
return resp;
|
|
126
140
|
});
|
|
127
141
|
this.claimPregenWallets = (..._0) => __async(this, [..._0], function* ({ pregenId } = {}) {
|
|
128
|
-
var _a;
|
|
129
142
|
__privateGet(this, _paraCoreInterface).requireApiKey();
|
|
130
143
|
const pregenWallets = pregenId ? yield this.getPregenWallets({ pregenId }) : yield this.getPregenWallets();
|
|
131
144
|
if (pregenWallets.length === 0) {
|
|
132
145
|
return void 0;
|
|
133
146
|
}
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
147
|
+
const { recoverySecret } = yield __privateGet(this, _claimPregenWalletEntities).call(this, pregenWallets);
|
|
148
|
+
return recoverySecret;
|
|
149
|
+
});
|
|
150
|
+
// Claims only the pregen entities for which the SDK has local signer
|
|
151
|
+
// material. Wallets without signer material are skipped (warned, not
|
|
152
|
+
// thrown) so a stale/duplicate backend row cannot block login.
|
|
153
|
+
// Returns the wallet IDs the backend confirmed claiming so callers can
|
|
154
|
+
// surface only confirmed wallets.
|
|
155
|
+
__privateAdd(this, _claimPregenWalletEntities, (pregenWallets) => __async(this, null, function* () {
|
|
156
|
+
var _a;
|
|
157
|
+
const claimable = pregenWallets.filter((w) => {
|
|
158
|
+
var _a2;
|
|
159
|
+
return !!((_a2 = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a2.signer);
|
|
160
|
+
});
|
|
161
|
+
const skipped = pregenWallets.filter((w) => {
|
|
162
|
+
var _a2;
|
|
163
|
+
return !((_a2 = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a2.signer);
|
|
164
|
+
});
|
|
165
|
+
if (skipped.length > 0) {
|
|
166
|
+
console.warn(
|
|
167
|
+
"[claimPregenWallets] Skipping pregen wallets without local share material:",
|
|
168
|
+
skipped.map((w) => w.id)
|
|
138
169
|
);
|
|
139
170
|
}
|
|
171
|
+
if (claimable.length === 0) {
|
|
172
|
+
return { recoverySecret: void 0, claimedWalletIds: [] };
|
|
173
|
+
}
|
|
140
174
|
let newRecoverySecret;
|
|
141
175
|
const { walletIds } = yield __privateGet(this, _paraCoreInterface).ctx.client.claimPregenWallets({
|
|
142
176
|
userId: __privateGet(this, _authService).userId,
|
|
143
|
-
walletIds:
|
|
177
|
+
walletIds: claimable.map((w) => w.id)
|
|
144
178
|
});
|
|
145
179
|
for (const walletId of walletIds) {
|
|
146
180
|
const wallet = __privateGet(this, _walletService).wallets[walletId];
|
|
147
181
|
let refreshedShare;
|
|
148
182
|
if (wallet.scheme === "ED25519") {
|
|
149
|
-
const distributeRes = yield
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
183
|
+
const distributeRes = yield wrapWithSpan(
|
|
184
|
+
"mpc.claim",
|
|
185
|
+
() => distributeNewShare({
|
|
186
|
+
ctx: __privateGet(this, _paraCoreInterface).ctx,
|
|
187
|
+
userId: __privateGet(this, _authService).userId,
|
|
188
|
+
walletId: wallet.id,
|
|
189
|
+
userShare: __privateGet(this, _walletService).wallets[wallet.id].signer,
|
|
190
|
+
emailProps: __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
|
|
191
|
+
partnerId: wallet.partnerId,
|
|
192
|
+
isEnclaveUser: __privateGet(this, _authService).isEnclaveUser,
|
|
193
|
+
walletScheme: wallet.scheme
|
|
194
|
+
}),
|
|
195
|
+
{ "wallet.id": wallet.id, "wallet.scheme": "ED25519" }
|
|
196
|
+
);
|
|
159
197
|
if (distributeRes.length > 0) {
|
|
160
198
|
newRecoverySecret = distributeRes;
|
|
161
199
|
}
|
|
162
200
|
} else {
|
|
163
|
-
refreshedShare = yield
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
201
|
+
refreshedShare = yield wrapWithSpan(
|
|
202
|
+
"mpc.claim",
|
|
203
|
+
() => __privateGet(this, _walletService).refreshShare({
|
|
204
|
+
walletId: wallet.id,
|
|
205
|
+
share: __privateGet(this, _walletService).wallets[wallet.id].signer,
|
|
206
|
+
oldPartnerId: wallet.partnerId,
|
|
207
|
+
newPartnerId: wallet.partnerId,
|
|
208
|
+
redistributeBackupEncryptedShares: true
|
|
209
|
+
}),
|
|
210
|
+
{ "wallet.id": wallet.id, "wallet.scheme": wallet.scheme }
|
|
211
|
+
);
|
|
170
212
|
if (refreshedShare.recoverySecret) {
|
|
171
213
|
newRecoverySecret = refreshedShare.recoverySecret;
|
|
172
214
|
}
|
|
@@ -185,8 +227,8 @@ class PregenWalletService {
|
|
|
185
227
|
});
|
|
186
228
|
}
|
|
187
229
|
yield __privateGet(this, _walletService).setWallets(__privateGet(this, _walletService).wallets);
|
|
188
|
-
return newRecoverySecret;
|
|
189
|
-
});
|
|
230
|
+
return { recoverySecret: newRecoverySecret, claimedWalletIds: walletIds };
|
|
231
|
+
}));
|
|
190
232
|
this.getPregenWallets = (..._0) => __async(this, [..._0], function* ({ pregenId } = {}) {
|
|
191
233
|
const pregenIds = pregenId ? toPregenIds(pregenId) : this.pregenIds;
|
|
192
234
|
if (!pregenIds || Object.keys(pregenIds).length === 0) {
|
|
@@ -218,30 +260,36 @@ class PregenWalletService {
|
|
|
218
260
|
_type != null ? _type : (_b = supportedWalletTypes.find(({ optional }) => !optional)) == null ? void 0 : _b.type
|
|
219
261
|
);
|
|
220
262
|
const [pregenIdentifierType, pregenIdentifier] = toPregenTypeAndId(pregenId);
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
263
|
+
const keygenRes = yield wrapWithSpan(
|
|
264
|
+
"mpc.keygen",
|
|
265
|
+
() => __async(this, null, function* () {
|
|
266
|
+
switch (walletType) {
|
|
267
|
+
case "STELLAR":
|
|
268
|
+
case "SOLANA":
|
|
269
|
+
return __privateGet(this, _paraCoreInterface).platformUtils.ed25519PreKeygen(
|
|
270
|
+
__privateGet(this, _paraCoreInterface).ctx,
|
|
271
|
+
pregenIdentifier,
|
|
272
|
+
pregenIdentifierType,
|
|
273
|
+
__privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
|
|
274
|
+
walletType
|
|
275
|
+
);
|
|
276
|
+
default:
|
|
277
|
+
return __privateGet(this, _paraCoreInterface).platformUtils.preKeygen(
|
|
278
|
+
__privateGet(this, _paraCoreInterface).ctx,
|
|
279
|
+
void 0,
|
|
280
|
+
pregenIdentifier,
|
|
281
|
+
pregenIdentifierType,
|
|
282
|
+
walletType,
|
|
283
|
+
null,
|
|
284
|
+
__privateGet(this, _paraCoreInterface).retrieveSessionCookie()
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
}),
|
|
288
|
+
{
|
|
289
|
+
"wallet.type": walletType,
|
|
290
|
+
"wallet.scheme": walletType === "SOLANA" || walletType === "STELLAR" ? "ED25519" : "DKLS"
|
|
291
|
+
}
|
|
292
|
+
);
|
|
245
293
|
const { signer, walletId } = keygenRes;
|
|
246
294
|
__privateGet(this, _walletService).wallets[walletId] = {
|
|
247
295
|
id: walletId,
|
|
@@ -390,6 +438,7 @@ _pollingService = new WeakMap();
|
|
|
390
438
|
_paraCoreInterface = new WeakMap();
|
|
391
439
|
_isCreateGuestWalletsPending = new WeakMap();
|
|
392
440
|
_fetchOverridePromise = new WeakMap();
|
|
441
|
+
_claimPregenWalletEntities = new WeakMap();
|
|
393
442
|
export {
|
|
394
443
|
PregenWalletService
|
|
395
444
|
};
|
|
@@ -2,11 +2,13 @@ import {
|
|
|
2
2
|
__async,
|
|
3
3
|
__privateAdd,
|
|
4
4
|
__privateGet,
|
|
5
|
-
__privateSet
|
|
5
|
+
__privateSet,
|
|
6
|
+
__spreadValues
|
|
6
7
|
} from "../chunk-7B52C2XE.js";
|
|
7
|
-
var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _handleTouchSessionError, _doTouchSession;
|
|
8
|
+
var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _touchPromise, _touchCachedAt, _touchCached, _TOUCH_TTL_MS, _handleTouchSessionError, _shouldDedupeTouch, _doTouchSession;
|
|
8
9
|
import { currentWalletIdsEq, supportedWalletTypesEq } from "../utils/wallet.js";
|
|
9
|
-
|
|
10
|
+
import { wrapWithSpan } from "../telemetry/tracer.js";
|
|
11
|
+
const _SessionManagementService = class _SessionManagementService {
|
|
10
12
|
constructor(paraCore) {
|
|
11
13
|
__privateAdd(this, _authService);
|
|
12
14
|
__privateAdd(this, _portalUrlService);
|
|
@@ -16,6 +18,21 @@ class SessionManagementService {
|
|
|
16
18
|
__privateAdd(this, _paraCoreInterface);
|
|
17
19
|
__privateAdd(this, _isImportedSession);
|
|
18
20
|
__privateAdd(this, _regeneratePromise);
|
|
21
|
+
// In-flight + short TTL dedupe for touchSession(regenerate=false). Prevents
|
|
22
|
+
// the post-login storm where useIsFullyLoggedIn → isFullyLoggedIn →
|
|
23
|
+
// isSessionActive → touchSession() fires once per render across many
|
|
24
|
+
// consumers (we observed 68 /touch round-trips in a 663ms window during
|
|
25
|
+
// AccountReady). The result is still authoritative — just shared across
|
|
26
|
+
// concurrent and immediately-following callers instead of refetched per call.
|
|
27
|
+
//
|
|
28
|
+
// IMPORTANT: this is disabled in the portal (see #shouldDedupeTouch). The
|
|
29
|
+
// portal reuses this same service and depends on touchSession() running its
|
|
30
|
+
// side-effects (currentWalletIds / partner sync) and returning fresh state on
|
|
31
|
+
// every sequential poll; a previous unconditional version of this cache
|
|
32
|
+
// (eb8e5f843, reverted in 58c8dadd6) broke that portal flow.
|
|
33
|
+
__privateAdd(this, _touchPromise);
|
|
34
|
+
__privateAdd(this, _touchCachedAt);
|
|
35
|
+
__privateAdd(this, _touchCached);
|
|
19
36
|
this.init = ({
|
|
20
37
|
authService,
|
|
21
38
|
portalUrlService,
|
|
@@ -53,14 +70,48 @@ class SessionManagementService {
|
|
|
53
70
|
if (regenerate && __privateGet(this, _regeneratePromise) !== void 0) {
|
|
54
71
|
return __privateGet(this, _regeneratePromise);
|
|
55
72
|
}
|
|
56
|
-
const
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
const dedupe = __privateGet(this, _shouldDedupeTouch).call(this, regenerate);
|
|
74
|
+
if (dedupe) {
|
|
75
|
+
if (__privateGet(this, _touchPromise) !== void 0) {
|
|
76
|
+
return __privateGet(this, _touchPromise);
|
|
77
|
+
}
|
|
78
|
+
if (__privateGet(this, _touchCached) !== void 0 && __privateGet(this, _touchCachedAt) !== void 0 && Date.now() - __privateGet(this, _touchCachedAt) < __privateGet(_SessionManagementService, _TOUCH_TTL_MS)) {
|
|
79
|
+
return __spreadValues({}, __privateGet(this, _touchCached));
|
|
80
|
+
}
|
|
62
81
|
}
|
|
63
|
-
return
|
|
82
|
+
return wrapWithSpan(
|
|
83
|
+
"session.touch",
|
|
84
|
+
() => __async(this, null, function* () {
|
|
85
|
+
const promise = __privateGet(this, _doTouchSession).call(this, regenerate);
|
|
86
|
+
if (regenerate) {
|
|
87
|
+
__privateSet(this, _regeneratePromise, promise);
|
|
88
|
+
yield promise.finally(() => {
|
|
89
|
+
__privateSet(this, _regeneratePromise, void 0);
|
|
90
|
+
__privateSet(this, _touchCached, void 0);
|
|
91
|
+
__privateSet(this, _touchCachedAt, void 0);
|
|
92
|
+
});
|
|
93
|
+
} else if (dedupe) {
|
|
94
|
+
__privateSet(this, _touchPromise, promise);
|
|
95
|
+
try {
|
|
96
|
+
const result = yield promise;
|
|
97
|
+
if (result.userId) {
|
|
98
|
+
__privateSet(this, _touchCached, result);
|
|
99
|
+
__privateSet(this, _touchCachedAt, Date.now());
|
|
100
|
+
}
|
|
101
|
+
} finally {
|
|
102
|
+
__privateSet(this, _touchPromise, void 0);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return promise;
|
|
106
|
+
}),
|
|
107
|
+
{ "session.regenerate": regenerate }
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
// Whether the non-regenerate dedupe/cache should apply. Disabled in the portal,
|
|
111
|
+
// which depends on every touchSession() call running its side-effects and
|
|
112
|
+
// returning fresh session state (see #touchCached docs).
|
|
113
|
+
__privateAdd(this, _shouldDedupeTouch, (regenerate) => {
|
|
114
|
+
return !regenerate && !__privateGet(this, _paraCoreInterface).isPortal();
|
|
64
115
|
});
|
|
65
116
|
__privateAdd(this, _doTouchSession, (regenerate) => __async(this, null, function* () {
|
|
66
117
|
var _a, _b;
|
|
@@ -220,7 +271,7 @@ class SessionManagementService {
|
|
|
220
271
|
set isImportedSession(value) {
|
|
221
272
|
__privateSet(this, _isImportedSession, value);
|
|
222
273
|
}
|
|
223
|
-
}
|
|
274
|
+
};
|
|
224
275
|
_authService = new WeakMap();
|
|
225
276
|
_portalUrlService = new WeakMap();
|
|
226
277
|
_walletService = new WeakMap();
|
|
@@ -229,8 +280,15 @@ _externalWalletService = new WeakMap();
|
|
|
229
280
|
_paraCoreInterface = new WeakMap();
|
|
230
281
|
_isImportedSession = new WeakMap();
|
|
231
282
|
_regeneratePromise = new WeakMap();
|
|
283
|
+
_touchPromise = new WeakMap();
|
|
284
|
+
_touchCachedAt = new WeakMap();
|
|
285
|
+
_touchCached = new WeakMap();
|
|
286
|
+
_TOUCH_TTL_MS = new WeakMap();
|
|
232
287
|
_handleTouchSessionError = new WeakMap();
|
|
288
|
+
_shouldDedupeTouch = new WeakMap();
|
|
233
289
|
_doTouchSession = new WeakMap();
|
|
290
|
+
__privateAdd(_SessionManagementService, _TOUCH_TTL_MS, 1e3);
|
|
291
|
+
let SessionManagementService = _SessionManagementService;
|
|
234
292
|
export {
|
|
235
293
|
SessionManagementService
|
|
236
294
|
};
|
|
@@ -10,6 +10,7 @@ import { ParaEvent } from "../types/index.js";
|
|
|
10
10
|
import { dispatchEvent } from "../utils/index.js";
|
|
11
11
|
import { extractErrorMessage } from "../utils/stateErrorHelpers.js";
|
|
12
12
|
import { waitForAuthStateChange, waitForCoreStateChange } from "../utils/stateListener.js";
|
|
13
|
+
import { wrapWithSpan } from "../telemetry/tracer.js";
|
|
13
14
|
class SignupFlowService extends BaseAuthFlowService {
|
|
14
15
|
constructor() {
|
|
15
16
|
super(...arguments);
|
|
@@ -74,58 +75,62 @@ class SignupFlowService extends BaseAuthFlowService {
|
|
|
74
75
|
return signupState;
|
|
75
76
|
});
|
|
76
77
|
this.waitForSignup = (_0) => __async(this, [_0], function* ({ isCanceled = () => false, onCancel, onPoll }) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
});
|
|
85
|
-
return yield waitForAuthStateChange({
|
|
86
|
-
stateManager: this.stateManager,
|
|
87
|
-
resolvePhases: [
|
|
88
|
-
{
|
|
89
|
-
phase: "authenticated",
|
|
90
|
-
onPhase: () => {
|
|
91
|
-
dispatchEvent(ParaEvent.ACCOUNT_CREATION_EVENT, true);
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
78
|
+
return wrapWithSpan("auth.signup_wait", () => __async(this, null, function* () {
|
|
79
|
+
this.stateManager.send({
|
|
80
|
+
type: "WAIT_FOR_SESSION",
|
|
81
|
+
data: {
|
|
82
|
+
onCancel,
|
|
83
|
+
onPoll,
|
|
84
|
+
isCanceled
|
|
94
85
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
86
|
+
});
|
|
87
|
+
return yield waitForAuthStateChange({
|
|
88
|
+
stateManager: this.stateManager,
|
|
89
|
+
resolvePhases: [
|
|
90
|
+
{
|
|
91
|
+
phase: "authenticated",
|
|
92
|
+
onPhase: () => {
|
|
93
|
+
dispatchEvent(ParaEvent.ACCOUNT_CREATION_EVENT, true);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
onReject: (state) => {
|
|
99
|
+
var _a;
|
|
100
|
+
(_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_CREATION_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
|
|
101
|
+
},
|
|
102
|
+
waitForCoreAuthenticated: false
|
|
103
|
+
});
|
|
104
|
+
}));
|
|
102
105
|
});
|
|
103
106
|
this.waitForWalletCreation = (..._0) => __async(this, [..._0], function* ({ isCanceled = () => false, onCancel, onPoll } = {}) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
107
|
+
return wrapWithSpan("wallet.creation_wait", () => __async(this, null, function* () {
|
|
108
|
+
this.stateManager.send({
|
|
109
|
+
type: "WAIT_FOR_WALLET_CREATION",
|
|
110
|
+
data: {
|
|
111
|
+
onCancel,
|
|
112
|
+
onPoll,
|
|
113
|
+
isCanceled
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
return yield waitForCoreStateChange({
|
|
117
|
+
stateManager: this.stateManager,
|
|
118
|
+
resolvePhases: [
|
|
119
|
+
{
|
|
120
|
+
phase: "authenticated",
|
|
121
|
+
onPhase: (state) => {
|
|
122
|
+
const resp = state.newWalletsResult;
|
|
123
|
+
dispatchEvent(ParaEvent.ACCOUNT_SETUP_EVENT, resp);
|
|
124
|
+
return resp;
|
|
125
|
+
}
|
|
121
126
|
}
|
|
127
|
+
],
|
|
128
|
+
onReject: (state) => {
|
|
129
|
+
var _a;
|
|
130
|
+
(_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_SETUP_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
|
|
122
131
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
var _a;
|
|
126
|
-
(_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_SETUP_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
|
|
127
|
-
}
|
|
128
|
-
});
|
|
132
|
+
});
|
|
133
|
+
}));
|
|
129
134
|
});
|
|
130
135
|
}
|
|
131
136
|
}
|
|
@@ -7,6 +7,7 @@ import { AuthMethod } from "@getpara/user-management-client";
|
|
|
7
7
|
import { BaseAuthFlowService } from "./BaseAuthFlowService.js";
|
|
8
8
|
import { LOCAL_STORAGE_IS_ENCLAVE_USER } from "../constants.js";
|
|
9
9
|
import { waitForAuthStateChange } from "../utils/stateListener.js";
|
|
10
|
+
import { wrapWithSpan } from "../telemetry/tracer.js";
|
|
10
11
|
class VerificationFlowService extends BaseAuthFlowService {
|
|
11
12
|
constructor() {
|
|
12
13
|
super(...arguments);
|
|
@@ -38,16 +39,18 @@ class VerificationFlowService extends BaseAuthFlowService {
|
|
|
38
39
|
return __spreadValues(__spreadValues({}, serverAuthState), loginUrl ? { loginUrl, loginFullUrl } : {});
|
|
39
40
|
});
|
|
40
41
|
this.performVerifyNewAccount = (params) => __async(this, null, function* () {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
42
|
+
return wrapWithSpan("verification.verify_otp", () => __async(this, null, function* () {
|
|
43
|
+
this.services.authService.assertIsAuthSet(["email", "phone"]);
|
|
44
|
+
const _a = params, { verificationCode } = _a, urlOptions = __objRest(_a, ["verificationCode"]);
|
|
45
|
+
const serverAuthState = yield this.paraCoreInterface.ctx.client.verifyAccount(this.services.authService.userId, {
|
|
46
|
+
verificationCode
|
|
47
|
+
});
|
|
48
|
+
if (serverAuthState.stage === "login" || serverAuthState.stage === "done") {
|
|
49
|
+
throw new Error("Account already exists.");
|
|
50
|
+
}
|
|
51
|
+
yield this.services.sessionManagementService.touchSession(true);
|
|
52
|
+
return { authState: serverAuthState, opts: urlOptions };
|
|
53
|
+
}));
|
|
51
54
|
});
|
|
52
55
|
this.verifyNewAccount = (params) => __async(this, null, function* () {
|
|
53
56
|
this.stateManager.send({ type: "VERIFY_NEW_ACCOUNT", data: params });
|