@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
@@ -70,8 +70,9 @@ var import_utils = require("../utils/index.js");
70
70
  var import_events = require("../types/events.js");
71
71
  var import_shareDistribution = require("../shares/shareDistribution.js");
72
72
  var import_constants = require("../constants.js");
73
+ var import_tracer = require("../telemetry/tracer.js");
73
74
  var import_stateListener = require("../utils/stateListener.js");
74
- var _stateManager, _authService, _walletService, _pollingService, _paraCoreInterface, _isCreateGuestWalletsPending, _fetchOverridePromise;
75
+ var _stateManager, _authService, _walletService, _pollingService, _paraCoreInterface, _isCreateGuestWalletsPending, _fetchOverridePromise, _claimPregenWalletEntities;
75
76
  class PregenWalletService {
76
77
  constructor(paraCore) {
77
78
  __privateAdd(this, _stateManager);
@@ -129,37 +130,50 @@ class PregenWalletService {
129
130
  }
130
131
  const { supportedWalletTypes } = yield __privateGet(this, _paraCoreInterface).assertPartner();
131
132
  const pregenWallets = yield this.getPregenWallets();
132
- let recoverySecret, walletIds = {};
133
+ let recoverySecret;
134
+ let walletIds = {};
133
135
  if (pregenWallets.length > 0) {
134
- try {
135
- const shares = yield __privateGet(this, _paraCoreInterface).ctx.enclaveClient.getPregenShares({
136
- userId: __privateGet(this, _authService).userId,
137
- walletIds: pregenWallets.map((w) => w.id),
138
- partnerId: pregenWallets[0].partnerId
139
- });
140
- for (const share of shares) {
141
- const wallet = pregenWallets.find((w) => w.id === share.walletId);
142
- if (wallet) {
143
- __privateGet(this, _walletService).wallets[wallet.id] = {
144
- id: wallet.id,
145
- address: wallet.address,
146
- scheme: wallet.scheme,
147
- type: wallet.type,
148
- partnerId: wallet.partnerId,
149
- isPregen: wallet.isPregen,
150
- pregenIdentifier: wallet.pregenIdentifier,
151
- pregenIdentifierType: wallet.pregenIdentifierType,
152
- signer: share.signer,
153
- createdAt: String(wallet.createdAt)
154
- };
136
+ let candidates = pregenWallets.filter((w) => {
137
+ var _a;
138
+ return !!((_a = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a.signer);
139
+ });
140
+ if (candidates.length === 0) {
141
+ try {
142
+ const shares = yield __privateGet(this, _paraCoreInterface).ctx.enclaveClient.getPregenShares({
143
+ userId: __privateGet(this, _authService).userId,
144
+ walletIds: pregenWallets.map((w) => w.id),
145
+ partnerId: pregenWallets[0].partnerId
146
+ });
147
+ for (const share of shares) {
148
+ const wallet = pregenWallets.find((w) => w.id === share.walletId);
149
+ if (wallet) {
150
+ __privateGet(this, _walletService).wallets[wallet.id] = {
151
+ id: wallet.id,
152
+ address: wallet.address,
153
+ scheme: wallet.scheme,
154
+ type: wallet.type,
155
+ partnerId: wallet.partnerId,
156
+ isPregen: wallet.isPregen,
157
+ pregenIdentifier: wallet.pregenIdentifier,
158
+ pregenIdentifierType: wallet.pregenIdentifierType,
159
+ signer: share.signer,
160
+ createdAt: String(wallet.createdAt)
161
+ };
162
+ }
155
163
  }
164
+ } catch (err) {
165
+ console.warn("[performClaimPregenWallets] Failed to fetch pregen shares:", err);
156
166
  }
157
- } catch (err) {
158
- console.warn("[performClaimPregenWallets] Failed to fetch pregen shares:", err);
167
+ candidates = pregenWallets.filter((w) => {
168
+ var _a;
169
+ return !!((_a = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a.signer);
170
+ });
159
171
  }
160
- recoverySecret = yield this.claimPregenWallets();
172
+ const { recoverySecret: claimRecoverySecret, claimedWalletIds } = yield __privateGet(this, _claimPregenWalletEntities).call(this, candidates);
173
+ recoverySecret = claimRecoverySecret;
174
+ const claimed = candidates.filter((w) => claimedWalletIds.includes(w.id));
161
175
  walletIds = supportedWalletTypes.reduce((acc, { type }) => {
162
- const wallet = pregenWallets.find((w) => !!import_wallet2.WalletSchemeTypeMap[w.scheme][type]);
176
+ const wallet = claimed.find((w) => !!import_wallet2.WalletSchemeTypeMap[w.scheme][type]);
163
177
  if (!wallet) {
164
178
  return acc;
165
179
  }
@@ -173,48 +187,76 @@ class PregenWalletService {
173
187
  return resp;
174
188
  });
175
189
  this.claimPregenWallets = (..._0) => __async(this, [..._0], function* ({ pregenId } = {}) {
176
- var _a;
177
190
  __privateGet(this, _paraCoreInterface).requireApiKey();
178
191
  const pregenWallets = pregenId ? yield this.getPregenWallets({ pregenId }) : yield this.getPregenWallets();
179
192
  if (pregenWallets.length === 0) {
180
193
  return void 0;
181
194
  }
182
- const missingWallets = pregenWallets.filter((wallet) => !__privateGet(this, _walletService).wallets[wallet.id]);
183
- if (missingWallets.length > 0) {
184
- throw new Error(
185
- `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(", ")}`
195
+ const { recoverySecret } = yield __privateGet(this, _claimPregenWalletEntities).call(this, pregenWallets);
196
+ return recoverySecret;
197
+ });
198
+ // Claims only the pregen entities for which the SDK has local signer
199
+ // material. Wallets without signer material are skipped (warned, not
200
+ // thrown) so a stale/duplicate backend row cannot block login.
201
+ // Returns the wallet IDs the backend confirmed claiming so callers can
202
+ // surface only confirmed wallets.
203
+ __privateAdd(this, _claimPregenWalletEntities, (pregenWallets) => __async(this, null, function* () {
204
+ var _a;
205
+ const claimable = pregenWallets.filter((w) => {
206
+ var _a2;
207
+ return !!((_a2 = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a2.signer);
208
+ });
209
+ const skipped = pregenWallets.filter((w) => {
210
+ var _a2;
211
+ return !((_a2 = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a2.signer);
212
+ });
213
+ if (skipped.length > 0) {
214
+ console.warn(
215
+ "[claimPregenWallets] Skipping pregen wallets without local share material:",
216
+ skipped.map((w) => w.id)
186
217
  );
187
218
  }
219
+ if (claimable.length === 0) {
220
+ return { recoverySecret: void 0, claimedWalletIds: [] };
221
+ }
188
222
  let newRecoverySecret;
189
223
  const { walletIds } = yield __privateGet(this, _paraCoreInterface).ctx.client.claimPregenWallets({
190
224
  userId: __privateGet(this, _authService).userId,
191
- walletIds: pregenWallets.map((w) => w.id)
225
+ walletIds: claimable.map((w) => w.id)
192
226
  });
193
227
  for (const walletId of walletIds) {
194
228
  const wallet = __privateGet(this, _walletService).wallets[walletId];
195
229
  let refreshedShare;
196
230
  if (wallet.scheme === "ED25519") {
197
- const distributeRes = yield (0, import_shareDistribution.distributeNewShare)({
198
- ctx: __privateGet(this, _paraCoreInterface).ctx,
199
- userId: __privateGet(this, _authService).userId,
200
- walletId: wallet.id,
201
- userShare: __privateGet(this, _walletService).wallets[wallet.id].signer,
202
- emailProps: __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
203
- partnerId: wallet.partnerId,
204
- isEnclaveUser: __privateGet(this, _authService).isEnclaveUser,
205
- walletScheme: wallet.scheme
206
- });
231
+ const distributeRes = yield (0, import_tracer.wrapWithSpan)(
232
+ "mpc.claim",
233
+ () => (0, import_shareDistribution.distributeNewShare)({
234
+ ctx: __privateGet(this, _paraCoreInterface).ctx,
235
+ userId: __privateGet(this, _authService).userId,
236
+ walletId: wallet.id,
237
+ userShare: __privateGet(this, _walletService).wallets[wallet.id].signer,
238
+ emailProps: __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
239
+ partnerId: wallet.partnerId,
240
+ isEnclaveUser: __privateGet(this, _authService).isEnclaveUser,
241
+ walletScheme: wallet.scheme
242
+ }),
243
+ { "wallet.id": wallet.id, "wallet.scheme": "ED25519" }
244
+ );
207
245
  if (distributeRes.length > 0) {
208
246
  newRecoverySecret = distributeRes;
209
247
  }
210
248
  } else {
211
- refreshedShare = yield __privateGet(this, _walletService).refreshShare({
212
- walletId: wallet.id,
213
- share: __privateGet(this, _walletService).wallets[wallet.id].signer,
214
- oldPartnerId: wallet.partnerId,
215
- newPartnerId: wallet.partnerId,
216
- redistributeBackupEncryptedShares: true
217
- });
249
+ refreshedShare = yield (0, import_tracer.wrapWithSpan)(
250
+ "mpc.claim",
251
+ () => __privateGet(this, _walletService).refreshShare({
252
+ walletId: wallet.id,
253
+ share: __privateGet(this, _walletService).wallets[wallet.id].signer,
254
+ oldPartnerId: wallet.partnerId,
255
+ newPartnerId: wallet.partnerId,
256
+ redistributeBackupEncryptedShares: true
257
+ }),
258
+ { "wallet.id": wallet.id, "wallet.scheme": wallet.scheme }
259
+ );
218
260
  if (refreshedShare.recoverySecret) {
219
261
  newRecoverySecret = refreshedShare.recoverySecret;
220
262
  }
@@ -233,8 +275,8 @@ class PregenWalletService {
233
275
  });
234
276
  }
235
277
  yield __privateGet(this, _walletService).setWallets(__privateGet(this, _walletService).wallets);
236
- return newRecoverySecret;
237
- });
278
+ return { recoverySecret: newRecoverySecret, claimedWalletIds: walletIds };
279
+ }));
238
280
  this.getPregenWallets = (..._0) => __async(this, [..._0], function* ({ pregenId } = {}) {
239
281
  const pregenIds = pregenId ? (0, import_user_management_client.toPregenIds)(pregenId) : this.pregenIds;
240
282
  if (!pregenIds || Object.keys(pregenIds).length === 0) {
@@ -266,30 +308,36 @@ class PregenWalletService {
266
308
  _type != null ? _type : (_b = supportedWalletTypes.find(({ optional }) => !optional)) == null ? void 0 : _b.type
267
309
  );
268
310
  const [pregenIdentifierType, pregenIdentifier] = (0, import_user_management_client.toPregenTypeAndId)(pregenId);
269
- let keygenRes;
270
- switch (walletType) {
271
- case "STELLAR":
272
- case "SOLANA":
273
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.ed25519PreKeygen(
274
- __privateGet(this, _paraCoreInterface).ctx,
275
- pregenIdentifier,
276
- pregenIdentifierType,
277
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
278
- walletType
279
- );
280
- break;
281
- default:
282
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.preKeygen(
283
- __privateGet(this, _paraCoreInterface).ctx,
284
- void 0,
285
- pregenIdentifier,
286
- pregenIdentifierType,
287
- walletType,
288
- null,
289
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie()
290
- );
291
- break;
292
- }
311
+ const keygenRes = yield (0, import_tracer.wrapWithSpan)(
312
+ "mpc.keygen",
313
+ () => __async(this, null, function* () {
314
+ switch (walletType) {
315
+ case "STELLAR":
316
+ case "SOLANA":
317
+ return __privateGet(this, _paraCoreInterface).platformUtils.ed25519PreKeygen(
318
+ __privateGet(this, _paraCoreInterface).ctx,
319
+ pregenIdentifier,
320
+ pregenIdentifierType,
321
+ __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
322
+ walletType
323
+ );
324
+ default:
325
+ return __privateGet(this, _paraCoreInterface).platformUtils.preKeygen(
326
+ __privateGet(this, _paraCoreInterface).ctx,
327
+ void 0,
328
+ pregenIdentifier,
329
+ pregenIdentifierType,
330
+ walletType,
331
+ null,
332
+ __privateGet(this, _paraCoreInterface).retrieveSessionCookie()
333
+ );
334
+ }
335
+ }),
336
+ {
337
+ "wallet.type": walletType,
338
+ "wallet.scheme": walletType === "SOLANA" || walletType === "STELLAR" ? "ED25519" : "DKLS"
339
+ }
340
+ );
293
341
  const { signer, walletId } = keygenRes;
294
342
  __privateGet(this, _walletService).wallets[walletId] = {
295
343
  id: walletId,
@@ -438,6 +486,7 @@ _pollingService = new WeakMap();
438
486
  _paraCoreInterface = new WeakMap();
439
487
  _isCreateGuestWalletsPending = new WeakMap();
440
488
  _fetchOverridePromise = new WeakMap();
489
+ _claimPregenWalletEntities = new WeakMap();
441
490
  // Annotate the CommonJS export names for ESM import in node:
442
491
  0 && (module.exports = {
443
492
  PregenWalletService
@@ -1,10 +1,24 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
3
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
4
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
7
  var __typeError = (msg) => {
6
8
  throw TypeError(msg);
7
9
  };
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
8
22
  var __export = (target, all) => {
9
23
  for (var name in all)
10
24
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -48,8 +62,9 @@ __export(SessionManagementService_exports, {
48
62
  });
49
63
  module.exports = __toCommonJS(SessionManagementService_exports);
50
64
  var import_wallet = require("../utils/wallet.js");
51
- var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _handleTouchSessionError, _doTouchSession;
52
- class SessionManagementService {
65
+ var import_tracer = require("../telemetry/tracer.js");
66
+ var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _touchPromise, _touchCachedAt, _touchCached, _TOUCH_TTL_MS, _handleTouchSessionError, _shouldDedupeTouch, _doTouchSession;
67
+ const _SessionManagementService = class _SessionManagementService {
53
68
  constructor(paraCore) {
54
69
  __privateAdd(this, _authService);
55
70
  __privateAdd(this, _portalUrlService);
@@ -59,6 +74,21 @@ class SessionManagementService {
59
74
  __privateAdd(this, _paraCoreInterface);
60
75
  __privateAdd(this, _isImportedSession);
61
76
  __privateAdd(this, _regeneratePromise);
77
+ // In-flight + short TTL dedupe for touchSession(regenerate=false). Prevents
78
+ // the post-login storm where useIsFullyLoggedIn → isFullyLoggedIn →
79
+ // isSessionActive → touchSession() fires once per render across many
80
+ // consumers (we observed 68 /touch round-trips in a 663ms window during
81
+ // AccountReady). The result is still authoritative — just shared across
82
+ // concurrent and immediately-following callers instead of refetched per call.
83
+ //
84
+ // IMPORTANT: this is disabled in the portal (see #shouldDedupeTouch). The
85
+ // portal reuses this same service and depends on touchSession() running its
86
+ // side-effects (currentWalletIds / partner sync) and returning fresh state on
87
+ // every sequential poll; a previous unconditional version of this cache
88
+ // (eb8e5f843, reverted in 58c8dadd6) broke that portal flow.
89
+ __privateAdd(this, _touchPromise);
90
+ __privateAdd(this, _touchCachedAt);
91
+ __privateAdd(this, _touchCached);
62
92
  this.init = ({
63
93
  authService,
64
94
  portalUrlService,
@@ -96,14 +126,48 @@ class SessionManagementService {
96
126
  if (regenerate && __privateGet(this, _regeneratePromise) !== void 0) {
97
127
  return __privateGet(this, _regeneratePromise);
98
128
  }
99
- const promise = __privateGet(this, _doTouchSession).call(this, regenerate);
100
- if (regenerate) {
101
- __privateSet(this, _regeneratePromise, promise);
102
- yield promise.finally(() => {
103
- __privateSet(this, _regeneratePromise, void 0);
104
- });
129
+ const dedupe = __privateGet(this, _shouldDedupeTouch).call(this, regenerate);
130
+ if (dedupe) {
131
+ if (__privateGet(this, _touchPromise) !== void 0) {
132
+ return __privateGet(this, _touchPromise);
133
+ }
134
+ if (__privateGet(this, _touchCached) !== void 0 && __privateGet(this, _touchCachedAt) !== void 0 && Date.now() - __privateGet(this, _touchCachedAt) < __privateGet(_SessionManagementService, _TOUCH_TTL_MS)) {
135
+ return __spreadValues({}, __privateGet(this, _touchCached));
136
+ }
105
137
  }
106
- return promise;
138
+ return (0, import_tracer.wrapWithSpan)(
139
+ "session.touch",
140
+ () => __async(this, null, function* () {
141
+ const promise = __privateGet(this, _doTouchSession).call(this, regenerate);
142
+ if (regenerate) {
143
+ __privateSet(this, _regeneratePromise, promise);
144
+ yield promise.finally(() => {
145
+ __privateSet(this, _regeneratePromise, void 0);
146
+ __privateSet(this, _touchCached, void 0);
147
+ __privateSet(this, _touchCachedAt, void 0);
148
+ });
149
+ } else if (dedupe) {
150
+ __privateSet(this, _touchPromise, promise);
151
+ try {
152
+ const result = yield promise;
153
+ if (result.userId) {
154
+ __privateSet(this, _touchCached, result);
155
+ __privateSet(this, _touchCachedAt, Date.now());
156
+ }
157
+ } finally {
158
+ __privateSet(this, _touchPromise, void 0);
159
+ }
160
+ }
161
+ return promise;
162
+ }),
163
+ { "session.regenerate": regenerate }
164
+ );
165
+ });
166
+ // Whether the non-regenerate dedupe/cache should apply. Disabled in the portal,
167
+ // which depends on every touchSession() call running its side-effects and
168
+ // returning fresh session state (see #touchCached docs).
169
+ __privateAdd(this, _shouldDedupeTouch, (regenerate) => {
170
+ return !regenerate && !__privateGet(this, _paraCoreInterface).isPortal();
107
171
  });
108
172
  __privateAdd(this, _doTouchSession, (regenerate) => __async(this, null, function* () {
109
173
  var _a, _b;
@@ -263,7 +327,7 @@ class SessionManagementService {
263
327
  set isImportedSession(value) {
264
328
  __privateSet(this, _isImportedSession, value);
265
329
  }
266
- }
330
+ };
267
331
  _authService = new WeakMap();
268
332
  _portalUrlService = new WeakMap();
269
333
  _walletService = new WeakMap();
@@ -272,8 +336,15 @@ _externalWalletService = new WeakMap();
272
336
  _paraCoreInterface = new WeakMap();
273
337
  _isImportedSession = new WeakMap();
274
338
  _regeneratePromise = new WeakMap();
339
+ _touchPromise = new WeakMap();
340
+ _touchCachedAt = new WeakMap();
341
+ _touchCached = new WeakMap();
342
+ _TOUCH_TTL_MS = new WeakMap();
275
343
  _handleTouchSessionError = new WeakMap();
344
+ _shouldDedupeTouch = new WeakMap();
276
345
  _doTouchSession = new WeakMap();
346
+ __privateAdd(_SessionManagementService, _TOUCH_TTL_MS, 1e3);
347
+ let SessionManagementService = _SessionManagementService;
277
348
  // Annotate the CommonJS export names for ESM import in node:
278
349
  0 && (module.exports = {
279
350
  SessionManagementService
@@ -75,6 +75,7 @@ var import_types = require("../types/index.js");
75
75
  var import_utils = require("../utils/index.js");
76
76
  var import_stateErrorHelpers = require("../utils/stateErrorHelpers.js");
77
77
  var import_stateListener = require("../utils/stateListener.js");
78
+ var import_tracer = require("../telemetry/tracer.js");
78
79
  class SignupFlowService extends import_BaseAuthFlowService.BaseAuthFlowService {
79
80
  constructor() {
80
81
  super(...arguments);
@@ -139,58 +140,62 @@ class SignupFlowService extends import_BaseAuthFlowService.BaseAuthFlowService {
139
140
  return signupState;
140
141
  });
141
142
  this.waitForSignup = (_0) => __async(this, [_0], function* ({ isCanceled = () => false, onCancel, onPoll }) {
142
- this.stateManager.send({
143
- type: "WAIT_FOR_SESSION",
144
- data: {
145
- onCancel,
146
- onPoll,
147
- isCanceled
148
- }
149
- });
150
- return yield (0, import_stateListener.waitForAuthStateChange)({
151
- stateManager: this.stateManager,
152
- resolvePhases: [
153
- {
154
- phase: "authenticated",
155
- onPhase: () => {
156
- (0, import_utils.dispatchEvent)(import_types.ParaEvent.ACCOUNT_CREATION_EVENT, true);
157
- return true;
158
- }
143
+ return (0, import_tracer.wrapWithSpan)("auth.signup_wait", () => __async(this, null, function* () {
144
+ this.stateManager.send({
145
+ type: "WAIT_FOR_SESSION",
146
+ data: {
147
+ onCancel,
148
+ onPoll,
149
+ isCanceled
159
150
  }
160
- ],
161
- onReject: (state) => {
162
- var _a;
163
- (_a = import_utils.dispatchEvent) == null ? void 0 : _a(import_types.ParaEvent.ACCOUNT_CREATION_EVENT, {}, (0, import_stateErrorHelpers.extractErrorMessage)(state.error, "failed to sign up user"));
164
- },
165
- waitForCoreAuthenticated: false
166
- });
151
+ });
152
+ return yield (0, import_stateListener.waitForAuthStateChange)({
153
+ stateManager: this.stateManager,
154
+ resolvePhases: [
155
+ {
156
+ phase: "authenticated",
157
+ onPhase: () => {
158
+ (0, import_utils.dispatchEvent)(import_types.ParaEvent.ACCOUNT_CREATION_EVENT, true);
159
+ return true;
160
+ }
161
+ }
162
+ ],
163
+ onReject: (state) => {
164
+ var _a;
165
+ (_a = import_utils.dispatchEvent) == null ? void 0 : _a(import_types.ParaEvent.ACCOUNT_CREATION_EVENT, {}, (0, import_stateErrorHelpers.extractErrorMessage)(state.error, "failed to sign up user"));
166
+ },
167
+ waitForCoreAuthenticated: false
168
+ });
169
+ }));
167
170
  });
168
171
  this.waitForWalletCreation = (..._0) => __async(this, [..._0], function* ({ isCanceled = () => false, onCancel, onPoll } = {}) {
169
- this.stateManager.send({
170
- type: "WAIT_FOR_WALLET_CREATION",
171
- data: {
172
- onCancel,
173
- onPoll,
174
- isCanceled
175
- }
176
- });
177
- return yield (0, import_stateListener.waitForCoreStateChange)({
178
- stateManager: this.stateManager,
179
- resolvePhases: [
180
- {
181
- phase: "authenticated",
182
- onPhase: (state) => {
183
- const resp = state.newWalletsResult;
184
- (0, import_utils.dispatchEvent)(import_types.ParaEvent.ACCOUNT_SETUP_EVENT, resp);
185
- return resp;
172
+ return (0, import_tracer.wrapWithSpan)("wallet.creation_wait", () => __async(this, null, function* () {
173
+ this.stateManager.send({
174
+ type: "WAIT_FOR_WALLET_CREATION",
175
+ data: {
176
+ onCancel,
177
+ onPoll,
178
+ isCanceled
179
+ }
180
+ });
181
+ return yield (0, import_stateListener.waitForCoreStateChange)({
182
+ stateManager: this.stateManager,
183
+ resolvePhases: [
184
+ {
185
+ phase: "authenticated",
186
+ onPhase: (state) => {
187
+ const resp = state.newWalletsResult;
188
+ (0, import_utils.dispatchEvent)(import_types.ParaEvent.ACCOUNT_SETUP_EVENT, resp);
189
+ return resp;
190
+ }
186
191
  }
192
+ ],
193
+ onReject: (state) => {
194
+ var _a;
195
+ (_a = import_utils.dispatchEvent) == null ? void 0 : _a(import_types.ParaEvent.ACCOUNT_SETUP_EVENT, {}, (0, import_stateErrorHelpers.extractErrorMessage)(state.error, "failed to sign up user"));
187
196
  }
188
- ],
189
- onReject: (state) => {
190
- var _a;
191
- (_a = import_utils.dispatchEvent) == null ? void 0 : _a(import_types.ParaEvent.ACCOUNT_SETUP_EVENT, {}, (0, import_stateErrorHelpers.extractErrorMessage)(state.error, "failed to sign up user"));
192
- }
193
- });
197
+ });
198
+ }));
194
199
  });
195
200
  }
196
201
  }
@@ -70,6 +70,7 @@ var import_user_management_client = require("@getpara/user-management-client");
70
70
  var import_BaseAuthFlowService = require("./BaseAuthFlowService.js");
71
71
  var import_constants = require("../constants.js");
72
72
  var import_stateListener = require("../utils/stateListener.js");
73
+ var import_tracer = require("../telemetry/tracer.js");
73
74
  class VerificationFlowService extends import_BaseAuthFlowService.BaseAuthFlowService {
74
75
  constructor() {
75
76
  super(...arguments);
@@ -101,16 +102,18 @@ class VerificationFlowService extends import_BaseAuthFlowService.BaseAuthFlowSer
101
102
  return __spreadValues(__spreadValues({}, serverAuthState), loginUrl ? { loginUrl, loginFullUrl } : {});
102
103
  });
103
104
  this.performVerifyNewAccount = (params) => __async(this, null, function* () {
104
- this.services.authService.assertIsAuthSet(["email", "phone"]);
105
- const _a = params, { verificationCode } = _a, urlOptions = __objRest(_a, ["verificationCode"]);
106
- const serverAuthState = yield this.paraCoreInterface.ctx.client.verifyAccount(this.services.authService.userId, {
107
- verificationCode
108
- });
109
- if (serverAuthState.stage === "login" || serverAuthState.stage === "done") {
110
- throw new Error("Account already exists.");
111
- }
112
- yield this.services.sessionManagementService.touchSession(true);
113
- return { authState: serverAuthState, opts: urlOptions };
105
+ return (0, import_tracer.wrapWithSpan)("verification.verify_otp", () => __async(this, null, function* () {
106
+ this.services.authService.assertIsAuthSet(["email", "phone"]);
107
+ const _a = params, { verificationCode } = _a, urlOptions = __objRest(_a, ["verificationCode"]);
108
+ const serverAuthState = yield this.paraCoreInterface.ctx.client.verifyAccount(this.services.authService.userId, {
109
+ verificationCode
110
+ });
111
+ if (serverAuthState.stage === "login" || serverAuthState.stage === "done") {
112
+ throw new Error("Account already exists.");
113
+ }
114
+ yield this.services.sessionManagementService.touchSession(true);
115
+ return { authState: serverAuthState, opts: urlOptions };
116
+ }));
114
117
  });
115
118
  this.verifyNewAccount = (params) => __async(this, null, function* () {
116
119
  this.stateManager.send({ type: "VERIFY_NEW_ACCOUNT", data: params });