@embarkai/ui-kit 0.4.57 → 0.4.59

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.
@@ -15,7 +15,7 @@
15
15
  <meta http-equiv="X-Content-Type-Options" content="nosniff" />
16
16
  <meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin" />
17
17
 
18
- <title>EmbarkAI Secure Wallet - iframe version 0.4.57</title>
18
+ <title>EmbarkAI Secure Wallet - iframe version 0.4.59</title>
19
19
 
20
20
  <!-- Styles will be injected by build process -->
21
21
  <style>
@@ -480,35 +480,26 @@ __export(server_backup_exports, {
480
480
  backupToServer: () => backupToServer,
481
481
  restoreFromServer: () => restoreFromServer
482
482
  });
483
- async function getShareVaultToken(scopes, accessToken) {
484
- const headers = {
485
- "Content-Type": "application/json"
486
- };
487
- if (accessToken) {
488
- headers["Authorization"] = `Bearer ${accessToken}`;
489
- }
490
- const response = await fetch(`${TSS_URL}/api/auth/token/exchange`, {
491
- method: "POST",
492
- headers,
493
- credentials: "include",
494
- body: JSON.stringify({
483
+ async function getShareVaultToken(tokenClient, scopes, accessToken) {
484
+ const data = await tokenClient.apiCall(
485
+ "POST",
486
+ "/api/auth/token/exchange",
487
+ {
495
488
  scopes,
496
489
  audience: "lumia-passport-share-vault-service",
497
490
  // TODO: embarkai audience ?
498
491
  ttl: 300
499
- })
500
- });
501
- if (!response.ok) {
502
- throw new Error(`Failed to get Share Vault token: ${response.status}`);
503
- }
504
- const data = await response.json();
492
+ },
493
+ void 0,
494
+ accessToken
495
+ );
505
496
  if (!data?.resourceToken) {
506
497
  throw new Error("Invalid token response");
507
498
  }
508
499
  return data.resourceToken;
509
500
  }
510
- async function uploadShareToVault(encryptedShare, accessToken) {
511
- const token = await getShareVaultToken(["share:put"], accessToken);
501
+ async function uploadShareToVault(tokenClient, encryptedShare, accessToken) {
502
+ const token = await getShareVaultToken(tokenClient, ["share:put"], accessToken);
512
503
  const idempotencyKey = crypto.randomUUID ? crypto.randomUUID() : `backup-${Date.now()}`;
513
504
  const response = await fetch(`${SHARE_VAULT_URL}/v1/shares/me`, {
514
505
  method: "PUT",
@@ -531,10 +522,10 @@ async function backupToServer(data, tokenClient, password, accessToken) {
531
522
  } else {
532
523
  encryptedShare = await envelopeEncryptKeyshare(data, data.userId);
533
524
  }
534
- await uploadShareToVault(encryptedShare, accessToken);
525
+ await uploadShareToVault(tokenClient, encryptedShare, accessToken);
535
526
  }
536
- async function downloadShareFromVault(accessToken) {
537
- const token = await getShareVaultToken(["share:get"], accessToken);
527
+ async function downloadShareFromVault(tokenClient, accessToken) {
528
+ const token = await getShareVaultToken(tokenClient, ["share:get"], accessToken);
538
529
  const response = await fetch(`${SHARE_VAULT_URL}/v1/shares/me`, {
539
530
  method: "GET",
540
531
  headers: {
@@ -560,7 +551,7 @@ async function restoreFromServer(userId, tokenClient, password, accessToken) {
560
551
  console.log("[iframe][restoreFromServer] Starting restore for userId:", userId);
561
552
  console.log("[iframe][restoreFromServer] Using password:", !!password);
562
553
  console.log("[iframe][restoreFromServer] Downloading share from vault...");
563
- const envelope = await downloadShareFromVault(accessToken);
554
+ const envelope = await downloadShareFromVault(tokenClient, accessToken);
564
555
  console.log("[iframe][restoreFromServer] Envelope encryption method:", envelope.encryptionMethod);
565
556
  const { envelopeDecryptKeyshare: envelopeDecryptKeyshare2, envelopeDecryptKeyshareWithPassword: envelopeDecryptKeyshareWithPassword2 } = await Promise.resolve().then(() => (init_crypto_utils(), crypto_utils_exports));
566
557
  const backupData = password ? await envelopeDecryptKeyshareWithPassword2(envelope, password) : await envelopeDecryptKeyshare2(envelope, userId);
@@ -570,12 +561,11 @@ async function restoreFromServer(userId, tokenClient, password, accessToken) {
570
561
  console.log("[iframe][restoreFromServer] Decryption successful, returning backup data");
571
562
  return backupData;
572
563
  }
573
- var SHARE_VAULT_URL, TSS_URL;
564
+ var SHARE_VAULT_URL;
574
565
  var init_server_backup = __esm({
575
566
  "src/iframe/lib/backup/server-backup.ts"() {
576
567
  init_crypto_utils();
577
568
  SHARE_VAULT_URL = "https://api.embarkai.io/vault";
578
- TSS_URL = "https://api.embarkai.io/tss";
579
569
  }
580
570
  });
581
571
 
@@ -2075,6 +2065,39 @@ function getCloudProviders() {
2075
2065
  init_local_backup();
2076
2066
  init_server_backup();
2077
2067
 
2068
+ // src/lib/errors.ts
2069
+ var AccountAbstractionError = class _AccountAbstractionError extends Error {
2070
+ constructor(message, code) {
2071
+ super(message);
2072
+ this.code = code;
2073
+ this.name = "LumiaPassportError";
2074
+ if (Error.captureStackTrace) {
2075
+ Error.captureStackTrace(this, _AccountAbstractionError);
2076
+ }
2077
+ }
2078
+ };
2079
+ var _UserRejectedError = class _UserRejectedError extends AccountAbstractionError {
2080
+ constructor(message = "User rejected transaction") {
2081
+ super(message, _UserRejectedError.CODE);
2082
+ this.name = "UserRejectedError";
2083
+ }
2084
+ };
2085
+ _UserRejectedError.CODE = "USER_REJECTED";
2086
+ var UserRejectedError = _UserRejectedError;
2087
+ var _SessionExpiredError = class _SessionExpiredError extends AccountAbstractionError {
2088
+ constructor(message = "Session expired, please log in again") {
2089
+ super(message, _SessionExpiredError.CODE);
2090
+ this.name = "SessionExpiredError";
2091
+ }
2092
+ };
2093
+ _SessionExpiredError.CODE = "SESSION_EXPIRED";
2094
+ var SessionExpiredError = _SessionExpiredError;
2095
+ var ErrorCodes = {
2096
+ MPC_SIGNING_ERROR: "MPC_SIGNING_ERROR",
2097
+ USER_REJECTED: UserRejectedError.CODE,
2098
+ SESSION_EXPIRED: SessionExpiredError.CODE
2099
+ };
2100
+
2078
2101
  // src/iframe/lib/token-refresh-client.ts
2079
2102
  var TokenRefreshApiClient = class {
2080
2103
  constructor() {
@@ -2105,32 +2128,48 @@ var TokenRefreshApiClient = class {
2105
2128
  // Send cookies
2106
2129
  });
2107
2130
  if (response.status === 401 && accessToken) {
2108
- console.log("[iframe][TokenRefresh] Got 401, checking if TOKEN_EXPIRED...");
2131
+ console.log("[iframe][TokenRefresh] Got 401, inspecting error body...");
2132
+ let errorData = null;
2133
+ let parseFailed = false;
2109
2134
  try {
2110
- const errorData = await response.json();
2111
- if (errorData.error_code === "TOKEN_EXPIRED" || errorData.action === "REFRESH_TOKEN") {
2112
- console.log("[iframe][TokenRefresh] TOKEN_EXPIRED detected, requesting new token from parent...");
2113
- const newToken = await this.requestNewTokenFromParent();
2114
- if (newToken) {
2115
- console.log("[iframe][TokenRefresh] \u2705 Got new token, retrying request...");
2116
- headers["Authorization"] = `Bearer ${newToken}`;
2117
- const retryResponse = await fetch(url, {
2118
- method,
2119
- headers,
2120
- body: body ? JSON.stringify(body) : void 0,
2121
- credentials: "include"
2122
- });
2123
- if (!retryResponse.ok) {
2124
- const retryErrorText = await retryResponse.text();
2125
- throw new Error(`API call failed after token refresh (${retryResponse.status}): ${retryErrorText}`);
2126
- }
2127
- return await retryResponse.json();
2128
- } else {
2129
- throw new Error("Failed to refresh access token");
2135
+ errorData = await response.json();
2136
+ } catch (parseError) {
2137
+ console.error("[iframe][TokenRefresh] Failed to parse 401 response, will attempt refresh:", parseError);
2138
+ parseFailed = true;
2139
+ }
2140
+ if (errorData && (errorData.error_code === "SESSION_NOT_FOUND" || errorData.action === "REAUTHENTICATE")) {
2141
+ console.error("[iframe][TokenRefresh] \u274C Session expired, re-authentication required");
2142
+ throw new SessionExpiredError();
2143
+ }
2144
+ if (parseFailed || errorData && (errorData.error_code === "TOKEN_EXPIRED" || errorData.action === "REFRESH_TOKEN")) {
2145
+ console.log("[iframe][TokenRefresh] TOKEN_EXPIRED detected, requesting new token from parent...");
2146
+ const refresh = await this.requestNewTokenFromParent();
2147
+ if (!refresh.token) {
2148
+ if (refresh.sessionDead === false) {
2149
+ console.error("[iframe][TokenRefresh] Token refresh temporarily unavailable");
2150
+ throw new Error("Token refresh temporarily unavailable, please retry");
2130
2151
  }
2152
+ console.error("[iframe][TokenRefresh] \u274C Token refresh failed, re-authentication required");
2153
+ throw new SessionExpiredError();
2131
2154
  }
2132
- } catch (parseError) {
2133
- console.error("[iframe][TokenRefresh] Failed to parse 401 response:", parseError);
2155
+ const newToken = refresh.token;
2156
+ console.log("[iframe][TokenRefresh] \u2705 Got new token, retrying request...");
2157
+ headers["Authorization"] = `Bearer ${newToken}`;
2158
+ const retryResponse = await fetch(url, {
2159
+ method,
2160
+ headers,
2161
+ body: body ? JSON.stringify(body) : void 0,
2162
+ credentials: "include"
2163
+ });
2164
+ if (retryResponse.status === 401) {
2165
+ console.error("[iframe][TokenRefresh] \u274C Still 401 after token refresh, re-authentication required");
2166
+ throw new SessionExpiredError();
2167
+ }
2168
+ if (!retryResponse.ok) {
2169
+ const retryErrorText = await retryResponse.text();
2170
+ throw new Error(`API call failed after token refresh (${retryResponse.status}): ${retryErrorText}`);
2171
+ }
2172
+ return await retryResponse.json();
2134
2173
  }
2135
2174
  throw new Error(`API call failed (401): Authentication required`);
2136
2175
  }
@@ -2152,11 +2191,11 @@ var TokenRefreshApiClient = class {
2152
2191
  console.log("[iframe][TokenRefresh] Token refresh already in progress, waiting...");
2153
2192
  return this.pendingTokenRefresh;
2154
2193
  }
2155
- this.pendingTokenRefresh = new Promise((resolve, reject) => {
2194
+ this.pendingTokenRefresh = new Promise((resolve) => {
2156
2195
  const messageId = `token_refresh_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
2157
2196
  const timeout = setTimeout(() => {
2158
2197
  cleanup();
2159
- reject(new Error("Token refresh timeout"));
2198
+ resolve({ token: null, sessionDead: false });
2160
2199
  }, 3e4);
2161
2200
  const messageHandler = (event) => {
2162
2201
  const message = event.data;
@@ -2165,12 +2204,10 @@ var TokenRefreshApiClient = class {
2165
2204
  cleanup();
2166
2205
  if (message.accessToken) {
2167
2206
  console.log("[iframe][TokenRefresh] \u2705 Received new token from parent");
2168
- resolve(message.accessToken);
2169
- } else if (message.error) {
2170
- console.error("[iframe][TokenRefresh] \u274C Token refresh failed:", message.error);
2171
- reject(new Error(message.error));
2207
+ resolve({ token: message.accessToken });
2172
2208
  } else {
2173
- reject(new Error("Invalid token refresh response"));
2209
+ console.error("[iframe][TokenRefresh] \u274C Token refresh failed:", message.error);
2210
+ resolve({ token: null, sessionDead: message.sessionDead !== false });
2174
2211
  }
2175
2212
  }
2176
2213
  };
@@ -2193,16 +2230,10 @@ var TokenRefreshApiClient = class {
2193
2230
  console.log("[iframe][TokenRefresh] \u{1F4E4} Sent IFRAME_MSG_REQUEST_NEW_TOKEN to parent");
2194
2231
  } else {
2195
2232
  cleanup();
2196
- reject(new Error("No parent window available"));
2233
+ resolve({ token: null, sessionDead: false });
2197
2234
  }
2198
2235
  });
2199
- try {
2200
- return await this.pendingTokenRefresh;
2201
- } catch (error) {
2202
- this.pendingTokenRefresh = null;
2203
- console.error("[iframe][TokenRefresh] Token refresh failed:", error);
2204
- return null;
2205
- }
2236
+ return this.pendingTokenRefresh;
2206
2237
  }
2207
2238
  };
2208
2239
 
@@ -5405,30 +5436,6 @@ var SdkChannelManager = class {
5405
5436
  }
5406
5437
  };
5407
5438
 
5408
- // src/lib/errors.ts
5409
- var AccountAbstractionError = class _AccountAbstractionError extends Error {
5410
- constructor(message, code) {
5411
- super(message);
5412
- this.code = code;
5413
- this.name = "LumiaPassportError";
5414
- if (Error.captureStackTrace) {
5415
- Error.captureStackTrace(this, _AccountAbstractionError);
5416
- }
5417
- }
5418
- };
5419
- var _UserRejectedError = class _UserRejectedError extends AccountAbstractionError {
5420
- constructor(message = "User rejected transaction") {
5421
- super(message, _UserRejectedError.CODE);
5422
- this.name = "UserRejectedError";
5423
- }
5424
- };
5425
- _UserRejectedError.CODE = "USER_REJECTED";
5426
- var UserRejectedError = _UserRejectedError;
5427
- var ErrorCodes = {
5428
- MPC_SIGNING_ERROR: "MPC_SIGNING_ERROR",
5429
- USER_REJECTED: UserRejectedError.CODE
5430
- };
5431
-
5432
5439
  // src/iframe/lib/secure-messenger.ts
5433
5440
  var SecureMessenger = class {
5434
5441
  constructor() {
@@ -6391,7 +6398,7 @@ var SigningManager = class extends TokenRefreshApiClient {
6391
6398
  };
6392
6399
 
6393
6400
  // src/iframe/main.ts
6394
- var IFRAME_VERSION = "0.4.57";
6401
+ var IFRAME_VERSION = "0.4.59";
6395
6402
  var IframeWallet = class {
6396
6403
  constructor() {
6397
6404
  console.log("=".repeat(60));