@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.
Files changed (106) hide show
  1. package/dist/cjs/ParaCore.js +436 -86
  2. package/dist/cjs/constants.js +1 -1
  3. package/dist/cjs/cryptography/utils.js +5 -2
  4. package/dist/cjs/errors.js +10 -0
  5. package/dist/cjs/external/userManagementClient.js +21 -4
  6. package/dist/cjs/index.js +67 -1
  7. package/dist/cjs/services/AuthService.js +66 -47
  8. package/dist/cjs/services/LoginFlowService.js +30 -27
  9. package/dist/cjs/services/PollingService.js +100 -75
  10. package/dist/cjs/services/PortalUrlService.js +112 -19
  11. package/dist/cjs/services/PregenWalletService.js +125 -76
  12. package/dist/cjs/services/SessionManagementService.js +81 -10
  13. package/dist/cjs/services/SignupFlowService.js +52 -47
  14. package/dist/cjs/services/VerificationFlowService.js +13 -10
  15. package/dist/cjs/services/WalletService.js +51 -36
  16. package/dist/cjs/shares/enclave.js +44 -24
  17. package/dist/cjs/state/CoreStateManager.js +17 -5
  18. package/dist/cjs/state/actors/setupPara.js +4 -1
  19. package/dist/cjs/state/machines/walletStateMachine.js +22 -0
  20. package/dist/cjs/telemetry/BeaconSpanProcessor.js +99 -0
  21. package/dist/cjs/telemetry/config.js +15 -0
  22. package/dist/cjs/telemetry/init.js +193 -0
  23. package/dist/cjs/telemetry/modalSession.js +54 -0
  24. package/dist/cjs/telemetry/session.js +39 -0
  25. package/dist/cjs/telemetry/tracer.js +126 -0
  26. package/dist/cjs/telemetry/uxAction.js +30 -0
  27. package/dist/cjs/telemetry/uxBaggagePropagator.js +58 -0
  28. package/dist/cjs/telemetry/uxState.js +46 -0
  29. package/dist/cjs/telemetry/uxStateSpanProcessor.js +51 -0
  30. package/dist/cjs/utils/configEncoding.js +98 -0
  31. package/dist/cjs/utils/deprecation.js +13 -13
  32. package/dist/cjs/utils/index.js +11 -0
  33. package/dist/cjs/utils/partnerConfig.js +103 -0
  34. package/dist/cjs/utils/partnerConfigGating.js +83 -0
  35. package/dist/cjs/utils/stateErrorHelpers.js +6 -1
  36. package/dist/cjs/utils/url.js +10 -2
  37. package/dist/esm/ParaCore.js +441 -88
  38. package/dist/esm/constants.js +1 -1
  39. package/dist/esm/cryptography/utils.js +5 -2
  40. package/dist/esm/errors.js +9 -0
  41. package/dist/esm/external/userManagementClient.js +21 -4
  42. package/dist/esm/index.js +58 -4
  43. package/dist/esm/services/AuthService.js +66 -47
  44. package/dist/esm/services/LoginFlowService.js +30 -27
  45. package/dist/esm/services/PollingService.js +100 -75
  46. package/dist/esm/services/PortalUrlService.js +112 -19
  47. package/dist/esm/services/PregenWalletService.js +125 -76
  48. package/dist/esm/services/SessionManagementService.js +69 -11
  49. package/dist/esm/services/SignupFlowService.js +52 -47
  50. package/dist/esm/services/VerificationFlowService.js +13 -10
  51. package/dist/esm/services/WalletService.js +51 -36
  52. package/dist/esm/shares/enclave.js +44 -24
  53. package/dist/esm/state/CoreStateManager.js +17 -5
  54. package/dist/esm/state/actors/setupPara.js +4 -1
  55. package/dist/esm/state/machines/walletStateMachine.js +22 -0
  56. package/dist/esm/telemetry/BeaconSpanProcessor.js +74 -0
  57. package/dist/esm/telemetry/config.js +0 -0
  58. package/dist/esm/telemetry/init.js +130 -0
  59. package/dist/esm/telemetry/modalSession.js +29 -0
  60. package/dist/esm/telemetry/session.js +16 -0
  61. package/dist/esm/telemetry/tracer.js +84 -0
  62. package/dist/esm/telemetry/uxAction.js +8 -0
  63. package/dist/esm/telemetry/uxBaggagePropagator.js +35 -0
  64. package/dist/esm/telemetry/uxState.js +21 -0
  65. package/dist/esm/telemetry/uxStateSpanProcessor.js +28 -0
  66. package/dist/esm/utils/configEncoding.js +45 -0
  67. package/dist/esm/utils/deprecation.js +11 -12
  68. package/dist/esm/utils/index.js +6 -0
  69. package/dist/esm/utils/partnerConfig.js +67 -0
  70. package/dist/esm/utils/partnerConfigGating.js +61 -0
  71. package/dist/esm/utils/stateErrorHelpers.js +6 -1
  72. package/dist/esm/utils/url.js +10 -2
  73. package/dist/types/ParaCore.d.ts +101 -19
  74. package/dist/types/PlatformUtils.d.ts +1 -0
  75. package/dist/types/errors.d.ts +26 -0
  76. package/dist/types/external/userManagementClient.d.ts +2 -1
  77. package/dist/types/index.d.ts +15 -3
  78. package/dist/types/services/types/AuthServiceTypes.d.ts +10 -3
  79. package/dist/types/services/types/PortalUrlServiceTypes.d.ts +3 -3
  80. package/dist/types/services/types/WalletServiceTypes.d.ts +4 -0
  81. package/dist/types/state/actors/setupPara.d.ts +18 -0
  82. package/dist/types/state/machines/authStateMachine.d.ts +1 -1
  83. package/dist/types/state/machines/coreStateMachine.d.ts +30 -6
  84. package/dist/types/state/machines/walletStateMachine.d.ts +4 -0
  85. package/dist/types/state/types/core.d.ts +7 -1
  86. package/dist/types/telemetry/BeaconSpanProcessor.d.ts +10 -0
  87. package/dist/types/telemetry/config.d.ts +4 -0
  88. package/dist/types/telemetry/init.d.ts +17 -0
  89. package/dist/types/telemetry/modalSession.d.ts +5 -0
  90. package/dist/types/telemetry/session.d.ts +2 -0
  91. package/dist/types/telemetry/tracer.d.ts +10 -0
  92. package/dist/types/telemetry/uxAction.d.ts +3 -0
  93. package/dist/types/telemetry/uxBaggagePropagator.d.ts +7 -0
  94. package/dist/types/telemetry/uxState.d.ts +8 -0
  95. package/dist/types/telemetry/uxStateSpanProcessor.d.ts +9 -0
  96. package/dist/types/types/config.d.ts +15 -3
  97. package/dist/types/types/coreApi.d.ts +7 -9
  98. package/dist/types/types/serviceInterfaces.d.ts +5 -3
  99. package/dist/types/types/util.d.ts +2 -15
  100. package/dist/types/utils/configEncoding.d.ts +51 -0
  101. package/dist/types/utils/deprecation.d.ts +3 -1
  102. package/dist/types/utils/index.d.ts +2 -0
  103. package/dist/types/utils/partnerConfig.d.ts +28 -0
  104. package/dist/types/utils/partnerConfigGating.d.ts +48 -0
  105. package/dist/types/utils/url.d.ts +3 -2
  106. 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, walletIds = {};
85
+ let recoverySecret;
86
+ let walletIds = {};
85
87
  if (pregenWallets.length > 0) {
86
- try {
87
- const shares = yield __privateGet(this, _paraCoreInterface).ctx.enclaveClient.getPregenShares({
88
- userId: __privateGet(this, _authService).userId,
89
- walletIds: pregenWallets.map((w) => w.id),
90
- partnerId: pregenWallets[0].partnerId
91
- });
92
- for (const share of shares) {
93
- const wallet = pregenWallets.find((w) => w.id === share.walletId);
94
- if (wallet) {
95
- __privateGet(this, _walletService).wallets[wallet.id] = {
96
- id: wallet.id,
97
- address: wallet.address,
98
- scheme: wallet.scheme,
99
- type: wallet.type,
100
- partnerId: wallet.partnerId,
101
- isPregen: wallet.isPregen,
102
- pregenIdentifier: wallet.pregenIdentifier,
103
- pregenIdentifierType: wallet.pregenIdentifierType,
104
- signer: share.signer,
105
- createdAt: String(wallet.createdAt)
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
- } catch (err) {
110
- console.warn("[performClaimPregenWallets] Failed to fetch pregen shares:", err);
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.claimPregenWallets();
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 = pregenWallets.find((w) => !!WalletSchemeTypeMap[w.scheme][type]);
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 missingWallets = pregenWallets.filter((wallet) => !__privateGet(this, _walletService).wallets[wallet.id]);
135
- if (missingWallets.length > 0) {
136
- throw new Error(
137
- `Cannot claim pregen wallets because wallet data is missing. Please call setUserShare first to load the wallet data for the following wallet IDs: ${missingWallets.map((w) => w.id).join(", ")}`
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: pregenWallets.map((w) => w.id)
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 distributeNewShare({
150
- ctx: __privateGet(this, _paraCoreInterface).ctx,
151
- userId: __privateGet(this, _authService).userId,
152
- walletId: wallet.id,
153
- userShare: __privateGet(this, _walletService).wallets[wallet.id].signer,
154
- emailProps: __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
155
- partnerId: wallet.partnerId,
156
- isEnclaveUser: __privateGet(this, _authService).isEnclaveUser,
157
- walletScheme: wallet.scheme
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 __privateGet(this, _walletService).refreshShare({
164
- walletId: wallet.id,
165
- share: __privateGet(this, _walletService).wallets[wallet.id].signer,
166
- oldPartnerId: wallet.partnerId,
167
- newPartnerId: wallet.partnerId,
168
- redistributeBackupEncryptedShares: true
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
- let keygenRes;
222
- switch (walletType) {
223
- case "STELLAR":
224
- case "SOLANA":
225
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.ed25519PreKeygen(
226
- __privateGet(this, _paraCoreInterface).ctx,
227
- pregenIdentifier,
228
- pregenIdentifierType,
229
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
230
- walletType
231
- );
232
- break;
233
- default:
234
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.preKeygen(
235
- __privateGet(this, _paraCoreInterface).ctx,
236
- void 0,
237
- pregenIdentifier,
238
- pregenIdentifierType,
239
- walletType,
240
- null,
241
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie()
242
- );
243
- break;
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
- class SessionManagementService {
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 promise = __privateGet(this, _doTouchSession).call(this, regenerate);
57
- if (regenerate) {
58
- __privateSet(this, _regeneratePromise, promise);
59
- yield promise.finally(() => {
60
- __privateSet(this, _regeneratePromise, void 0);
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 promise;
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
- this.stateManager.send({
78
- type: "WAIT_FOR_SESSION",
79
- data: {
80
- onCancel,
81
- onPoll,
82
- isCanceled
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
- onReject: (state) => {
97
- var _a;
98
- (_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_CREATION_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
99
- },
100
- waitForCoreAuthenticated: false
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
- this.stateManager.send({
105
- type: "WAIT_FOR_WALLET_CREATION",
106
- data: {
107
- onCancel,
108
- onPoll,
109
- isCanceled
110
- }
111
- });
112
- return yield waitForCoreStateChange({
113
- stateManager: this.stateManager,
114
- resolvePhases: [
115
- {
116
- phase: "authenticated",
117
- onPhase: (state) => {
118
- const resp = state.newWalletsResult;
119
- dispatchEvent(ParaEvent.ACCOUNT_SETUP_EVENT, resp);
120
- return resp;
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
- onReject: (state) => {
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
- this.services.authService.assertIsAuthSet(["email", "phone"]);
42
- const _a = params, { verificationCode } = _a, urlOptions = __objRest(_a, ["verificationCode"]);
43
- const serverAuthState = yield this.paraCoreInterface.ctx.client.verifyAccount(this.services.authService.userId, {
44
- verificationCode
45
- });
46
- if (serverAuthState.stage === "login" || serverAuthState.stage === "done") {
47
- throw new Error("Account already exists.");
48
- }
49
- yield this.services.sessionManagementService.touchSession(true);
50
- return { authState: serverAuthState, opts: urlOptions };
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 });