@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.
- package/dist/iframe/index.html +1 -1
- package/dist/iframe/main.js +96 -89
- package/dist/index.cjs +1261 -1113
- package/dist/index.d.cts +23 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.js +915 -770
- package/package.json +2 -2
package/dist/iframe/index.html
CHANGED
|
@@ -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.
|
|
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>
|
package/dist/iframe/main.js
CHANGED
|
@@ -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
|
|
485
|
-
"
|
|
486
|
-
|
|
487
|
-
|
|
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
|
-
|
|
502
|
-
|
|
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
|
|
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,
|
|
2131
|
+
console.log("[iframe][TokenRefresh] Got 401, inspecting error body...");
|
|
2132
|
+
let errorData = null;
|
|
2133
|
+
let parseFailed = false;
|
|
2109
2134
|
try {
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
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
|
-
|
|
2133
|
-
console.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2233
|
+
resolve({ token: null, sessionDead: false });
|
|
2197
2234
|
}
|
|
2198
2235
|
});
|
|
2199
|
-
|
|
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.
|
|
6401
|
+
var IFRAME_VERSION = "0.4.59";
|
|
6395
6402
|
var IframeWallet = class {
|
|
6396
6403
|
constructor() {
|
|
6397
6404
|
console.log("=".repeat(60));
|