@cedros/login-react 0.0.1
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/LICENSE +21 -0
- package/README.md +1183 -0
- package/dist/EmailRegisterForm-D_uCEdX9.cjs +1 -0
- package/dist/EmailRegisterForm-D_uCEdX9.cjs.map +1 -0
- package/dist/EmailRegisterForm-m3rX3A6X.js +2923 -0
- package/dist/EmailRegisterForm-m3rX3A6X.js.map +1 -0
- package/dist/ErrorMessage-Bm1j5mBT.js +2042 -0
- package/dist/ErrorMessage-Bm1j5mBT.js.map +1 -0
- package/dist/ErrorMessage-CntMyn93.cjs +1 -0
- package/dist/ErrorMessage-CntMyn93.cjs.map +1 -0
- package/dist/GoogleLoginButton-CJNJ-THo.cjs +1 -0
- package/dist/GoogleLoginButton-CJNJ-THo.cjs.map +1 -0
- package/dist/GoogleLoginButton-CvDoOc-0.js +227 -0
- package/dist/GoogleLoginButton-CvDoOc-0.js.map +1 -0
- package/dist/SolanaLoginButton-BlSgPW50.cjs +1 -0
- package/dist/SolanaLoginButton-BlSgPW50.cjs.map +1 -0
- package/dist/SolanaLoginButton-h32xN2PQ.js +261 -0
- package/dist/SolanaLoginButton-h32xN2PQ.js.map +1 -0
- package/dist/assets/argon2Worker-Bi5TuQvD.js +1 -0
- package/dist/assets/argon2Worker-Bi5TuQvD.js.map +1 -0
- package/dist/components/LoginButton.d.ts +23 -0
- package/dist/components/LoginForm.d.ts +9 -0
- package/dist/components/LoginModal.d.ts +9 -0
- package/dist/components/admin/AdminUserDetail.d.ts +21 -0
- package/dist/components/admin/AdminUserList.d.ts +25 -0
- package/dist/components/admin/CedrosAdminDashboard.d.ts +48 -0
- package/dist/components/admin/SystemSettings.d.ts +19 -0
- package/dist/components/apple/AppleLoginButton.d.ts +29 -0
- package/dist/components/deposit/CreditBalance.d.ts +19 -0
- package/dist/components/deposit/DepositFlow.d.ts +118 -0
- package/dist/components/deposit/FeeConfigDisplay.d.ts +15 -0
- package/dist/components/deposit/History.d.ts +21 -0
- package/dist/components/deposit/TieredAmountSlider.d.ts +19 -0
- package/dist/components/deposit/TokenSelector.d.ts +23 -0
- package/dist/components/deposit/admin/AdminDepositList.d.ts +21 -0
- package/dist/components/deposit/admin/AdminDepositStats.d.ts +15 -0
- package/dist/components/deposit/admin/AdminPrivacyPeriodDeposits.d.ts +19 -0
- package/dist/components/deposit/admin/AdminWithdrawalHistory.d.ts +19 -0
- package/dist/components/deposit/admin/AdminWithdrawalQueue.d.ts +23 -0
- package/dist/components/deposit/admin/PrivacySystemStatus.d.ts +15 -0
- package/dist/components/deposit/admin/index.d.ts +17 -0
- package/dist/components/deposit/index.d.ts +12 -0
- package/dist/components/deposit/tierUtils.d.ts +8 -0
- package/dist/components/deposit/tokens.d.ts +19 -0
- package/dist/components/email/EmailLoginForm.d.ts +11 -0
- package/dist/components/email/EmailRegisterForm.d.ts +14 -0
- package/dist/components/email/ForgotPasswordForm.d.ts +17 -0
- package/dist/components/email/PasswordInput.d.ts +14 -0
- package/dist/components/email/ResetPasswordForm.d.ts +22 -0
- package/dist/components/google/GoogleLoginButton.d.ts +12 -0
- package/dist/components/invites/InviteForm.d.ts +38 -0
- package/dist/components/invites/InviteList.d.ts +40 -0
- package/dist/components/members/MemberList.d.ts +47 -0
- package/dist/components/org/CreateOrgForm.d.ts +7 -0
- package/dist/components/org/OrgAvatar.d.ts +7 -0
- package/dist/components/org/OrgListView.d.ts +9 -0
- package/dist/components/org/OrgSelector.d.ts +51 -0
- package/dist/components/org/OrgSwitcher.d.ts +47 -0
- package/dist/components/org/icons.d.ts +8 -0
- package/dist/components/sessions/SessionList.d.ts +33 -0
- package/dist/components/shared/ErrorBoundary.d.ts +38 -0
- package/dist/components/shared/ErrorMessage.d.ts +14 -0
- package/dist/components/shared/LoadingSpinner.d.ts +16 -0
- package/dist/components/solana/SolanaLoginButton.d.ts +49 -0
- package/dist/components/templates/FullPageLayout.d.ts +40 -0
- package/dist/components/templates/SplitPageLayout.d.ts +44 -0
- package/dist/components/templates/index.d.ts +4 -0
- package/dist/components/totp/OtpInput.d.ts +32 -0
- package/dist/components/totp/QrCode.d.ts +21 -0
- package/dist/components/totp/TotpSettings.d.ts +38 -0
- package/dist/components/totp/TotpSetup.d.ts +23 -0
- package/dist/components/totp/TotpVerify.d.ts +25 -0
- package/dist/components/totp/index.d.ts +10 -0
- package/dist/components/wallet/CapabilityWarning.d.ts +11 -0
- package/dist/components/wallet/PasskeyPrompt.d.ts +34 -0
- package/dist/components/wallet/RecoveryPhraseDisplay.d.ts +18 -0
- package/dist/components/wallet/RecoveryPhraseInput.d.ts +21 -0
- package/dist/components/wallet/WalletAddressRow.d.ts +10 -0
- package/dist/components/wallet/WalletEnrollment.d.ts +15 -0
- package/dist/components/wallet/WalletManager.d.ts +9 -0
- package/dist/components/wallet/WalletRecovery.d.ts +19 -0
- package/dist/components/wallet/WalletStatus.d.ts +28 -0
- package/dist/components/wallet/WalletUnlock.d.ts +23 -0
- package/dist/components/wallet/index.d.ts +23 -0
- package/dist/components/webauthn/PasskeyLoginButton.d.ts +8 -0
- package/dist/context/CedrosLoginContext.d.ts +24 -0
- package/dist/context/CedrosLoginProvider.d.ts +17 -0
- package/dist/context/EmbeddedWalletExposure.d.ts +19 -0
- package/dist/context/useCedrosLogin.d.ts +12 -0
- package/dist/crypto/aesGcm.d.ts +89 -0
- package/dist/crypto/argon2.d.ts +65 -0
- package/dist/crypto/argon2Worker.d.ts +1 -0
- package/dist/crypto/argon2WorkerClient.d.ts +28 -0
- package/dist/crypto/bip39.d.ts +106 -0
- package/dist/crypto/capabilities.d.ts +35 -0
- package/dist/crypto/entropy.d.ts +56 -0
- package/dist/crypto/hkdf.d.ts +38 -0
- package/dist/crypto/index.d.ts +30 -0
- package/dist/crypto/secureWipe.d.ts +90 -0
- package/dist/crypto/shamir.d.ts +52 -0
- package/dist/crypto/solanaKeypair.d.ts +63 -0
- package/dist/crypto/types.d.ts +134 -0
- package/dist/crypto/webauthnPrf.d.ts +118 -0
- package/dist/email-only.cjs +1 -0
- package/dist/email-only.cjs.map +1 -0
- package/dist/email-only.d.ts +16 -0
- package/dist/email-only.js +15 -0
- package/dist/email-only.js.map +1 -0
- package/dist/google-only.cjs +1 -0
- package/dist/google-only.cjs.map +1 -0
- package/dist/google-only.d.ts +13 -0
- package/dist/google-only.js +11 -0
- package/dist/google-only.js.map +1 -0
- package/dist/hooks/useAdminDeposits.d.ts +10 -0
- package/dist/hooks/useAdminUsers.d.ts +28 -0
- package/dist/hooks/useAppleAuth.d.ts +52 -0
- package/dist/hooks/useAuth.d.ts +34 -0
- package/dist/hooks/useAuthSession.d.ts +19 -0
- package/dist/hooks/useAuthorize.d.ts +62 -0
- package/dist/hooks/useCredits.d.ts +11 -0
- package/dist/hooks/useDeposit.d.ts +16 -0
- package/dist/hooks/useEmailAuth.d.ts +60 -0
- package/dist/hooks/useGoogleAuth.d.ts +67 -0
- package/dist/hooks/useInstantLink.d.ts +42 -0
- package/dist/hooks/useInvites.d.ts +57 -0
- package/dist/hooks/useMembers.d.ts +52 -0
- package/dist/hooks/useOrgs.d.ts +49 -0
- package/dist/hooks/usePasswordReset.d.ts +32 -0
- package/dist/hooks/usePendingRecovery.d.ts +34 -0
- package/dist/hooks/useRateLimiter.d.ts +58 -0
- package/dist/hooks/useSessions.d.ts +45 -0
- package/dist/hooks/useSolanaAuth.d.ts +30 -0
- package/dist/hooks/useSystemSettings.d.ts +47 -0
- package/dist/hooks/useThemeManager.d.ts +11 -0
- package/dist/hooks/useTotp.d.ts +52 -0
- package/dist/hooks/useTotpVerify.d.ts +38 -0
- package/dist/hooks/useTransactionSigning.d.ts +45 -0
- package/dist/hooks/useWallet.d.ts +10 -0
- package/dist/hooks/useWalletDiscovery.d.ts +24 -0
- package/dist/hooks/useWalletEnrollment.d.ts +9 -0
- package/dist/hooks/useWalletMaterial.d.ts +10 -0
- package/dist/hooks/useWalletRecovery.d.ts +9 -0
- package/dist/hooks/useWalletSigning.d.ts +31 -0
- package/dist/hooks/useWebAuthn.d.ts +25 -0
- package/dist/i18n/I18nProvider.d.ts +16 -0
- package/dist/i18n/context.d.ts +6 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/translations.d.ts +66 -0
- package/dist/i18n/useI18n.d.ts +9 -0
- package/dist/index.cjs +2061 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +126 -0
- package/dist/index.js +14910 -0
- package/dist/index.js.map +1 -0
- package/dist/login-react.css +1 -0
- package/dist/solana-only.cjs +1 -0
- package/dist/solana-only.cjs.map +1 -0
- package/dist/solana-only.d.ts +13 -0
- package/dist/solana-only.js +11 -0
- package/dist/solana-only.js.map +1 -0
- package/dist/style.cjs +1 -0
- package/dist/style.cjs.map +1 -0
- package/dist/style.js +1 -0
- package/dist/style.js.map +1 -0
- package/dist/types/adminUser.d.ts +112 -0
- package/dist/types/auth.d.ts +122 -0
- package/dist/types/config.d.ts +266 -0
- package/dist/types/deposit.d.ts +488 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/invite.d.ts +71 -0
- package/dist/types/member.d.ts +45 -0
- package/dist/types/org.d.ts +101 -0
- package/dist/types/session.d.ts +28 -0
- package/dist/types/systemSettings.d.ts +81 -0
- package/dist/types/totp.d.ts +52 -0
- package/dist/types/wallet.d.ts +309 -0
- package/dist/utils/adminUserApi.d.ts +51 -0
- package/dist/utils/apiClient.d.ts +78 -0
- package/dist/utils/cryptoShim.d.ts +17 -0
- package/dist/utils/csrf.d.ts +1 -0
- package/dist/utils/deviceDetection.d.ts +17 -0
- package/dist/utils/embeddedWallet.d.ts +75 -0
- package/dist/utils/inviteApi.d.ts +31 -0
- package/dist/utils/memberApi.d.ts +23 -0
- package/dist/utils/orgApi.d.ts +36 -0
- package/dist/utils/sanitization.d.ts +66 -0
- package/dist/utils/sessionApi.d.ts +16 -0
- package/dist/utils/silentWalletEnroll.d.ts +41 -0
- package/dist/utils/systemSettingsApi.d.ts +18 -0
- package/dist/utils/tabSync.d.ts +46 -0
- package/dist/utils/tokenManager.d.ts +107 -0
- package/dist/utils/unlockCredential.d.ts +5 -0
- package/dist/utils/validation.d.ts +48 -0
- package/dist/utils/walletDetection.d.ts +23 -0
- package/dist/utils/webauthnJson.d.ts +21 -0
- package/dist/validation-BeXIfuHB.cjs +1 -0
- package/dist/validation-BeXIfuHB.cjs.map +1 -0
- package/dist/validation-BebL7hMF.js +56 -0
- package/dist/validation-BebL7hMF.js.map +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { jsxs as w, Fragment as $, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useState as y, useMemo as O, useCallback as I, useRef as Y, useEffect as U } from "react";
|
|
3
|
+
import { u as G, A as J, h as _, L as Q } from "./ErrorMessage-Bm1j5mBT.js";
|
|
4
|
+
import { a as j } from "./validation-BebL7hMF.js";
|
|
5
|
+
function X() {
|
|
6
|
+
const { config: t, _internal: a } = G(), [d, f] = y(!1), [N, r] = y(null), h = O(
|
|
7
|
+
() => new J({
|
|
8
|
+
baseUrl: t.serverUrl,
|
|
9
|
+
timeoutMs: t.requestTimeout,
|
|
10
|
+
retryAttempts: t.retryAttempts
|
|
11
|
+
}),
|
|
12
|
+
[t.serverUrl, t.requestTimeout, t.retryAttempts]
|
|
13
|
+
), n = I(
|
|
14
|
+
async (u) => {
|
|
15
|
+
if (!j(u)) {
|
|
16
|
+
const l = {
|
|
17
|
+
code: "INVALID_PUBLIC_KEY",
|
|
18
|
+
message: "Invalid Solana public key format"
|
|
19
|
+
};
|
|
20
|
+
throw r(l), l;
|
|
21
|
+
}
|
|
22
|
+
f(!0), r(null);
|
|
23
|
+
try {
|
|
24
|
+
return await h.post(
|
|
25
|
+
"/solana/challenge",
|
|
26
|
+
{ publicKey: u },
|
|
27
|
+
{ credentials: "omit" }
|
|
28
|
+
);
|
|
29
|
+
} catch (l) {
|
|
30
|
+
const c = _(l, "Failed to get challenge");
|
|
31
|
+
throw r(c), c;
|
|
32
|
+
} finally {
|
|
33
|
+
f(!1);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
[h]
|
|
37
|
+
), S = I(
|
|
38
|
+
async (u, l, c) => {
|
|
39
|
+
if (!j(u)) {
|
|
40
|
+
const o = {
|
|
41
|
+
code: "INVALID_PUBLIC_KEY",
|
|
42
|
+
message: "Invalid Solana public key format"
|
|
43
|
+
};
|
|
44
|
+
throw r(o), o;
|
|
45
|
+
}
|
|
46
|
+
f(!0), r(null);
|
|
47
|
+
try {
|
|
48
|
+
const o = await h.post("/solana", {
|
|
49
|
+
publicKey: u,
|
|
50
|
+
signature: l,
|
|
51
|
+
message: c
|
|
52
|
+
});
|
|
53
|
+
return t.callbacks?.onLoginSuccess?.(o.user, "solana"), a?.handleLoginSuccess(o.user, o.tokens), o;
|
|
54
|
+
} catch (o) {
|
|
55
|
+
const i = _(o, "Solana sign-in failed");
|
|
56
|
+
throw r(i), i;
|
|
57
|
+
} finally {
|
|
58
|
+
f(!1);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
[h, t.callbacks, a]
|
|
62
|
+
), L = I(() => r(null), []);
|
|
63
|
+
return {
|
|
64
|
+
requestChallenge: n,
|
|
65
|
+
signIn: S,
|
|
66
|
+
isLoading: d,
|
|
67
|
+
error: N,
|
|
68
|
+
clearError: L
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const Z = [
|
|
72
|
+
"phantom",
|
|
73
|
+
"solflare",
|
|
74
|
+
"backpack",
|
|
75
|
+
"glow",
|
|
76
|
+
"slope",
|
|
77
|
+
"sollet",
|
|
78
|
+
"coin98",
|
|
79
|
+
"clover",
|
|
80
|
+
"mathWallet",
|
|
81
|
+
"ledger",
|
|
82
|
+
"torus",
|
|
83
|
+
"walletconnect"
|
|
84
|
+
];
|
|
85
|
+
function z(t) {
|
|
86
|
+
if (!t || typeof t != "object") return !1;
|
|
87
|
+
const a = t;
|
|
88
|
+
return typeof a.connect == "function" || typeof a.signMessage == "function" || typeof a.signTransaction == "function" || "isConnected" in a;
|
|
89
|
+
}
|
|
90
|
+
function x() {
|
|
91
|
+
if (typeof window > "u")
|
|
92
|
+
return !1;
|
|
93
|
+
const t = window;
|
|
94
|
+
for (const a of Z) {
|
|
95
|
+
const d = t[a];
|
|
96
|
+
if (d && typeof d == "object" && "solana" in d && z(d.solana))
|
|
97
|
+
return !0;
|
|
98
|
+
}
|
|
99
|
+
return !!z(t.solana);
|
|
100
|
+
}
|
|
101
|
+
function oe({
|
|
102
|
+
onSuccess: t,
|
|
103
|
+
onError: a,
|
|
104
|
+
className: d = "",
|
|
105
|
+
variant: f = "default",
|
|
106
|
+
size: N = "md",
|
|
107
|
+
disabled: r = !1,
|
|
108
|
+
hideIfNoWallet: h = !0,
|
|
109
|
+
walletContext: n
|
|
110
|
+
}) {
|
|
111
|
+
const { requestChallenge: S, signIn: L, isLoading: u } = X(), [l, c] = y(!1), [o, i] = y(!1), [P, k] = y(!1), v = Y(!1), [q] = y(() => x()), g = n?.connected ?? !1, E = n?.connecting ?? !1, m = n?.publicKey, p = n?.signMessage, W = n?.wallet, b = (n?.wallets ?? []).filter(
|
|
112
|
+
(e) => e.adapter.readyState === "Installed" || e.adapter.readyState === "Loadable"
|
|
113
|
+
), H = n ? b.length > 0 : q, A = I(async () => {
|
|
114
|
+
if (!v.current) {
|
|
115
|
+
if (!m || !p) {
|
|
116
|
+
a?.(new Error("Wallet not ready"));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
v.current = !0;
|
|
120
|
+
try {
|
|
121
|
+
const e = m.toBase58(), C = await S(e), F = new TextEncoder().encode(C.message), M = await p(F);
|
|
122
|
+
if (!(M instanceof Uint8Array) || M.length === 0)
|
|
123
|
+
throw new Error("Wallet returned invalid signature");
|
|
124
|
+
let T;
|
|
125
|
+
try {
|
|
126
|
+
T = btoa(String.fromCharCode(...M));
|
|
127
|
+
} catch {
|
|
128
|
+
throw new Error("Failed to encode signature");
|
|
129
|
+
}
|
|
130
|
+
await L(e, T, C.message), t?.();
|
|
131
|
+
} catch (e) {
|
|
132
|
+
const C = e instanceof Error ? e : new Error(String(e));
|
|
133
|
+
a?.(C);
|
|
134
|
+
} finally {
|
|
135
|
+
v.current = !1, i(!1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}, [m, p, S, L, t, a]);
|
|
139
|
+
if (U(() => {
|
|
140
|
+
P && W && !g && !E && n?.connect && (k(!1), n.connect().catch((e) => {
|
|
141
|
+
a?.(e instanceof Error ? e : new Error(String(e))), i(!1);
|
|
142
|
+
}));
|
|
143
|
+
}, [P, W, g, E, n, a]), U(() => {
|
|
144
|
+
o && g && m && p && !v.current && A().catch(() => {
|
|
145
|
+
});
|
|
146
|
+
}, [o, g, m, p, A]), h && !H)
|
|
147
|
+
return null;
|
|
148
|
+
const K = async () => {
|
|
149
|
+
r || u || E || (g && m && p ? (i(!0), await A()) : W ? (i(!0), k(!0)) : b.length === 1 ? (n?.select(b[0].adapter.name), i(!0), k(!0)) : b.length > 1 ? c(!0) : a?.(
|
|
150
|
+
new Error("No Solana wallet found. Please install Phantom or another Solana wallet.")
|
|
151
|
+
));
|
|
152
|
+
}, R = (e) => {
|
|
153
|
+
c(!1), n?.select(e), i(!0), k(!0);
|
|
154
|
+
}, V = {
|
|
155
|
+
sm: "cedros-button-sm",
|
|
156
|
+
md: "cedros-button-md",
|
|
157
|
+
lg: "cedros-button-lg"
|
|
158
|
+
}, D = {
|
|
159
|
+
default: "cedros-button-solana",
|
|
160
|
+
outline: "cedros-button-solana-outline"
|
|
161
|
+
}, B = u || E || o && !g;
|
|
162
|
+
return /* @__PURE__ */ w($, { children: [
|
|
163
|
+
/* @__PURE__ */ w(
|
|
164
|
+
"button",
|
|
165
|
+
{
|
|
166
|
+
type: "button",
|
|
167
|
+
className: `cedros-button ${D[f]} ${V[N]} ${d}`,
|
|
168
|
+
onClick: K,
|
|
169
|
+
disabled: r || B,
|
|
170
|
+
"aria-label": "Continue with Solana",
|
|
171
|
+
children: [
|
|
172
|
+
B ? /* @__PURE__ */ s(Q, { size: "sm" }) : /* @__PURE__ */ w(
|
|
173
|
+
"svg",
|
|
174
|
+
{
|
|
175
|
+
className: "cedros-button-icon",
|
|
176
|
+
width: "18",
|
|
177
|
+
height: "18",
|
|
178
|
+
viewBox: "0 0 128 128",
|
|
179
|
+
fill: "currentColor",
|
|
180
|
+
"aria-hidden": "true",
|
|
181
|
+
children: [
|
|
182
|
+
/* @__PURE__ */ s("path", { d: "M25.38 96.04a4.35 4.35 0 0 1 3.07-1.27h91.68c1.93 0 2.9 2.34 1.54 3.7l-17.71 17.72a4.35 4.35 0 0 1-3.07 1.27H9.21c-1.93 0-2.9-2.34-1.54-3.7l17.71-17.72z" }),
|
|
183
|
+
/* @__PURE__ */ s("path", { d: "M25.38 11.81a4.47 4.47 0 0 1 3.07-1.27h91.68c1.93 0 2.9 2.34 1.54 3.7L103.96 31.96a4.35 4.35 0 0 1-3.07 1.27H9.21c-1.93 0-2.9-2.34-1.54-3.7L25.38 11.81z" }),
|
|
184
|
+
/* @__PURE__ */ s("path", { d: "M102.62 53.76a4.35 4.35 0 0 0-3.07-1.27H7.87c-1.93 0-2.9 2.34-1.54 3.7l17.71 17.72a4.35 4.35 0 0 0 3.07 1.27h91.68c1.93 0 2.9-2.34 1.54-3.7L102.62 53.76z" })
|
|
185
|
+
]
|
|
186
|
+
}
|
|
187
|
+
),
|
|
188
|
+
/* @__PURE__ */ s("span", { children: "Continue with Solana" })
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
),
|
|
192
|
+
l && /* @__PURE__ */ s(
|
|
193
|
+
"div",
|
|
194
|
+
{
|
|
195
|
+
className: "cedros-modal-backdrop",
|
|
196
|
+
onClick: () => c(!1),
|
|
197
|
+
role: "presentation",
|
|
198
|
+
children: /* @__PURE__ */ w(
|
|
199
|
+
"div",
|
|
200
|
+
{
|
|
201
|
+
className: "cedros-modal cedros-wallet-selector",
|
|
202
|
+
role: "dialog",
|
|
203
|
+
"aria-modal": "true",
|
|
204
|
+
"aria-labelledby": "wallet-selector-title",
|
|
205
|
+
onClick: (e) => e.stopPropagation(),
|
|
206
|
+
children: [
|
|
207
|
+
/* @__PURE__ */ w("div", { className: "cedros-modal-header", children: [
|
|
208
|
+
/* @__PURE__ */ s("h2", { id: "wallet-selector-title", className: "cedros-modal-title", children: "Select Wallet" }),
|
|
209
|
+
/* @__PURE__ */ s(
|
|
210
|
+
"button",
|
|
211
|
+
{
|
|
212
|
+
type: "button",
|
|
213
|
+
className: "cedros-modal-close",
|
|
214
|
+
onClick: () => c(!1),
|
|
215
|
+
"aria-label": "Close",
|
|
216
|
+
children: /* @__PURE__ */ s("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ s(
|
|
217
|
+
"path",
|
|
218
|
+
{
|
|
219
|
+
d: "M18 6L6 18M6 6l12 12",
|
|
220
|
+
stroke: "currentColor",
|
|
221
|
+
strokeWidth: "2",
|
|
222
|
+
strokeLinecap: "round"
|
|
223
|
+
}
|
|
224
|
+
) })
|
|
225
|
+
}
|
|
226
|
+
)
|
|
227
|
+
] }),
|
|
228
|
+
/* @__PURE__ */ s("div", { className: "cedros-modal-content", children: /* @__PURE__ */ s("div", { className: "cedros-wallet-list", children: b.map((e) => /* @__PURE__ */ w(
|
|
229
|
+
"button",
|
|
230
|
+
{
|
|
231
|
+
type: "button",
|
|
232
|
+
className: "cedros-wallet-option",
|
|
233
|
+
onClick: () => R(e.adapter.name),
|
|
234
|
+
children: [
|
|
235
|
+
/* @__PURE__ */ s(
|
|
236
|
+
"img",
|
|
237
|
+
{
|
|
238
|
+
src: e.adapter.icon,
|
|
239
|
+
alt: "",
|
|
240
|
+
width: "32",
|
|
241
|
+
height: "32",
|
|
242
|
+
className: "cedros-wallet-icon"
|
|
243
|
+
}
|
|
244
|
+
),
|
|
245
|
+
/* @__PURE__ */ s("span", { children: e.adapter.name })
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
e.adapter.name
|
|
249
|
+
)) }) })
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
)
|
|
253
|
+
}
|
|
254
|
+
)
|
|
255
|
+
] });
|
|
256
|
+
}
|
|
257
|
+
export {
|
|
258
|
+
oe as S,
|
|
259
|
+
x as d,
|
|
260
|
+
X as u
|
|
261
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolanaLoginButton-h32xN2PQ.js","sources":["../src/hooks/useSolanaAuth.ts","../src/utils/walletDetection.ts","../src/components/solana/SolanaLoginButton.tsx"],"sourcesContent":["import { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLogin } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport { validateSolanaPublicKey } from '../utils/validation';\nimport type { AuthResponse, AuthError, ChallengeResponse } from '../types';\n\nexport interface UseSolanaAuthReturn {\n requestChallenge: (publicKey: string) => Promise<ChallengeResponse>;\n signIn: (publicKey: string, signature: string, message: string) => Promise<AuthResponse>;\n isLoading: boolean;\n error: AuthError | null;\n clearError: () => void;\n}\n\n/**\n * Hook for Solana wallet authentication.\n *\n * @example\n * ```tsx\n * function SolanaLogin() {\n * const { requestChallenge, signIn, isLoading } = useSolanaAuth();\n * const { publicKey, signMessage } = useWallet();\n *\n * const handleLogin = async () => {\n * const challenge = await requestChallenge(publicKey.toBase58());\n * const signature = await signMessage(new TextEncoder().encode(challenge.message));\n * const result = await signIn(\n * publicKey.toBase58(),\n * Buffer.from(signature).toString('base64'),\n * challenge.message\n * );\n * };\n * }\n * ```\n */\nexport function useSolanaAuth(): UseSolanaAuthReturn {\n const { config, _internal } = useCedrosLogin();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<AuthError | null>(null);\n\n const apiClient = useMemo(\n () =>\n new ApiClient({\n baseUrl: config.serverUrl,\n timeoutMs: config.requestTimeout,\n retryAttempts: config.retryAttempts,\n }),\n [config.serverUrl, config.requestTimeout, config.retryAttempts]\n );\n\n const requestChallenge = useCallback(\n async (publicKey: string): Promise<ChallengeResponse> => {\n // Validate public key format before making API call\n if (!validateSolanaPublicKey(publicKey)) {\n const authError: AuthError = {\n code: 'INVALID_PUBLIC_KEY',\n message: 'Invalid Solana public key format',\n };\n setError(authError);\n throw authError;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<ChallengeResponse>(\n '/solana/challenge',\n { publicKey },\n { credentials: 'omit' }\n );\n return data;\n } catch (err) {\n const authError = handleApiError(err, 'Failed to get challenge');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const signIn = useCallback(\n async (publicKey: string, signature: string, message: string): Promise<AuthResponse> => {\n // Validate public key format before making API call\n if (!validateSolanaPublicKey(publicKey)) {\n const authError: AuthError = {\n code: 'INVALID_PUBLIC_KEY',\n message: 'Invalid Solana public key format',\n };\n setError(authError);\n throw authError;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.post<AuthResponse>('/solana', {\n publicKey,\n signature,\n message,\n });\n config.callbacks?.onLoginSuccess?.(data.user, 'solana');\n _internal?.handleLoginSuccess(data.user, data.tokens);\n return data;\n } catch (err) {\n const authError = handleApiError(err, 'Solana sign-in failed');\n setError(authError);\n throw authError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient, config.callbacks, _internal]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n requestChallenge,\n signIn,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Wallet detection utilities for Solana browser wallets\n */\n\n/**\n * Type for window with potential Solana wallet extensions\n */\ninterface WindowWithWallets extends Window {\n phantom?: { solana?: unknown };\n solflare?: { solana?: unknown };\n backpack?: { solana?: unknown };\n glow?: { solana?: unknown };\n slope?: { solana?: unknown };\n sollet?: { solana?: unknown };\n coin98?: { solana?: unknown };\n clover?: { solana?: unknown };\n mathWallet?: { solana?: unknown };\n ledger?: { solana?: unknown };\n torus?: { solana?: unknown };\n walletconnect?: { solana?: unknown };\n solana?: unknown;\n}\n\n/**\n * Known Solana wallet provider names to check for on the window object\n */\ntype WalletProviderName = Exclude<keyof WindowWithWallets, keyof Window>;\n\nconst WALLET_PROVIDERS: WalletProviderName[] = [\n 'phantom',\n 'solflare',\n 'backpack',\n 'glow',\n 'slope',\n 'sollet',\n 'coin98',\n 'clover',\n 'mathWallet',\n 'ledger',\n 'torus',\n 'walletconnect',\n];\n\n/**\n * UI-9 FIX: Validates that a wallet provider object has expected Solana wallet methods.\n * Prevents spoofed wallet objects from being accepted.\n */\nfunction isValidSolanaProvider(provider: unknown): boolean {\n if (!provider || typeof provider !== 'object') return false;\n const wallet = provider as Record<string, unknown>;\n // Check for at least one expected wallet method/property\n // Real wallets have connect, signMessage, signTransaction, etc.\n return (\n typeof wallet.connect === 'function' ||\n typeof wallet.signMessage === 'function' ||\n typeof wallet.signTransaction === 'function' ||\n 'isConnected' in wallet\n );\n}\n\n/**\n * Detects if any Solana wallet extensions are installed in the browser.\n * Checks for common wallet adapters like Phantom, Solflare, Backpack, etc.\n *\n * @returns true if at least one Solana wallet is detected\n *\n * @example\n * ```tsx\n * if (detectSolanaWallets()) {\n * // Show Solana login button\n * }\n * ```\n */\nexport function detectSolanaWallets(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const win = window as WindowWithWallets;\n\n // Check window object for wallet injections\n // UI-9: Validate wallet has expected methods to reject spoofed providers\n for (const provider of WALLET_PROVIDERS) {\n const walletObj = win[provider];\n if (\n walletObj &&\n typeof walletObj === 'object' &&\n 'solana' in walletObj &&\n isValidSolanaProvider(walletObj.solana)\n ) {\n return true;\n }\n }\n\n // Check for generic Solana provider (e.g., from some mobile wallet browsers)\n // UI-9: Also validate generic provider\n if (isValidSolanaProvider(win.solana)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Returns list of detected Solana wallet names (for debugging/display)\n *\n * @returns Array of detected wallet provider names\n */\nexport function getDetectedWalletNames(): string[] {\n if (typeof window === 'undefined') {\n return [];\n }\n\n const win = window as WindowWithWallets;\n const detected: string[] = [];\n\n // UI-9: Use validation to reject spoofed providers\n for (const provider of WALLET_PROVIDERS) {\n const walletObj = win[provider];\n if (\n walletObj &&\n typeof walletObj === 'object' &&\n 'solana' in walletObj &&\n isValidSolanaProvider(walletObj.solana)\n ) {\n detected.push(provider);\n }\n }\n\n if (isValidSolanaProvider(win.solana) && detected.length === 0) {\n detected.push('solana');\n }\n\n return detected;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useSolanaAuth } from '../../hooks/useSolanaAuth';\nimport { LoadingSpinner } from '../shared/LoadingSpinner';\nimport { detectSolanaWallets } from '../../utils/walletDetection';\n\nexport interface SolanaLoginButtonProps {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n className?: string;\n variant?: 'default' | 'outline';\n size?: 'sm' | 'md' | 'lg';\n disabled?: boolean;\n /**\n * Hide the button if no Solana wallets are detected.\n * When true (default), button renders nothing if no wallets are installed.\n * When false, button always renders (useful for showing \"install wallet\" prompts).\n * @default true\n */\n hideIfNoWallet?: boolean;\n /**\n * Solana wallet adapter context. Pass this from @solana/wallet-adapter-react's useWallet().\n * The button will handle connection and signing automatically for a one-click experience.\n */\n walletContext?: {\n publicKey: { toBase58: () => string } | null;\n signMessage: ((message: Uint8Array) => Promise<Uint8Array>) | null;\n connected: boolean;\n connecting: boolean;\n connect: () => Promise<void>;\n wallet: { adapter: { name: string } } | null;\n select: (walletName: string) => void;\n wallets: Array<{\n adapter: {\n name: string;\n icon: string;\n readyState: string;\n };\n }>;\n };\n}\n\n/**\n * Solana wallet login button with one-click authentication.\n *\n * Handles wallet connection and message signing automatically.\n * If wallet is already connected, signs immediately.\n * If not connected, connects first then auto-signs.\n */\nexport function SolanaLoginButton({\n onSuccess,\n onError,\n className = '',\n variant = 'default',\n size = 'md',\n disabled = false,\n hideIfNoWallet = true,\n walletContext,\n}: SolanaLoginButtonProps) {\n const { requestChallenge, signIn, isLoading: isAuthLoading } = useSolanaAuth();\n const [showWalletSelector, setShowWalletSelector] = useState(false);\n const [pendingLogin, setPendingLogin] = useState(false);\n const [triggerConnect, setTriggerConnect] = useState(false);\n const isProcessingRef = useRef(false);\n\n // Detect wallets from browser (used when walletContext not provided)\n // Use lazy initializer to avoid re-detecting on every render\n const [browserHasWallets] = useState(() => detectSolanaWallets());\n\n const connected = walletContext?.connected ?? false;\n const connecting = walletContext?.connecting ?? false;\n const publicKey = walletContext?.publicKey;\n const signMessage = walletContext?.signMessage;\n const wallet = walletContext?.wallet;\n const wallets = walletContext?.wallets ?? [];\n\n // Get installed/ready wallets from wallet adapter context\n const installedWallets = wallets.filter(\n (w) => w.adapter.readyState === 'Installed' || w.adapter.readyState === 'Loadable'\n );\n\n // Determine if any wallets are available\n // If walletContext is provided, use its wallet list; otherwise use browser detection\n const hasWallets = walletContext ? installedWallets.length > 0 : browserHasWallets;\n\n // Execute the actual sign-in flow\n const executeSignIn = useCallback(async () => {\n if (isProcessingRef.current) return;\n if (!publicKey || !signMessage) {\n onError?.(new Error('Wallet not ready'));\n return;\n }\n\n isProcessingRef.current = true;\n try {\n const pubKeyString = publicKey.toBase58();\n\n // Request challenge from server\n const challenge = await requestChallenge(pubKeyString);\n\n // Sign the message with wallet\n const messageBytes = new TextEncoder().encode(challenge.message);\n const signatureBytes = await signMessage(messageBytes);\n\n // Validate signature\n if (!(signatureBytes instanceof Uint8Array) || signatureBytes.length === 0) {\n throw new Error('Wallet returned invalid signature');\n }\n\n // Encode signature\n let signature: string;\n try {\n signature = btoa(String.fromCharCode(...signatureBytes));\n } catch {\n throw new Error('Failed to encode signature');\n }\n\n // Authenticate with server\n await signIn(pubKeyString, signature, challenge.message);\n\n onSuccess?.();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n isProcessingRef.current = false;\n setPendingLogin(false);\n }\n }, [publicKey, signMessage, requestChallenge, signIn, onSuccess, onError]);\n\n // Auto-connect when wallet is selected and triggerConnect is set\n useEffect(() => {\n if (triggerConnect && wallet && !connected && !connecting && walletContext?.connect) {\n setTriggerConnect(false);\n walletContext.connect().catch((err) => {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n setPendingLogin(false);\n });\n }\n }, [triggerConnect, wallet, connected, connecting, walletContext, onError]);\n\n // Auto-execute sign-in when connected with pending login\n // COMP-04: Catch unhandled rejections from executeSignIn (defensive - errors already\n // handled internally, but .catch() prevents unhandledrejection events)\n useEffect(() => {\n if (pendingLogin && connected && publicKey && signMessage && !isProcessingRef.current) {\n executeSignIn().catch(() => {\n /* Errors already passed to onError callback inside executeSignIn */\n });\n }\n }, [pendingLogin, connected, publicKey, signMessage, executeSignIn]);\n\n // Hide button if no wallets detected and hideIfNoWallet is true\n // Note: This must come after all hooks to satisfy React rules of hooks\n if (hideIfNoWallet && !hasWallets) {\n return null;\n }\n\n const handleClick = async () => {\n if (disabled || isAuthLoading || connecting) return;\n\n if (connected && publicKey && signMessage) {\n // Already connected - sign immediately\n setPendingLogin(true);\n await executeSignIn();\n } else if (wallet) {\n // Wallet selected but not connected - connect and queue login\n setPendingLogin(true);\n setTriggerConnect(true);\n } else if (installedWallets.length === 1) {\n // Only one wallet installed - auto-select it\n walletContext?.select(installedWallets[0].adapter.name);\n setPendingLogin(true);\n setTriggerConnect(true);\n } else if (installedWallets.length > 1) {\n // Multiple wallets - show selector\n setShowWalletSelector(true);\n } else {\n // No wallets - show error\n onError?.(\n new Error('No Solana wallet found. Please install Phantom or another Solana wallet.')\n );\n }\n };\n\n const handleSelectWallet = (walletName: string) => {\n setShowWalletSelector(false);\n walletContext?.select(walletName);\n setPendingLogin(true);\n setTriggerConnect(true);\n };\n\n const sizeClasses = {\n sm: 'cedros-button-sm',\n md: 'cedros-button-md',\n lg: 'cedros-button-lg',\n };\n\n const variantClasses = {\n default: 'cedros-button-solana',\n outline: 'cedros-button-solana-outline',\n };\n\n const isLoading = isAuthLoading || connecting || (pendingLogin && !connected);\n\n return (\n <>\n <button\n type=\"button\"\n className={`cedros-button ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}\n onClick={handleClick}\n disabled={disabled || isLoading}\n aria-label=\"Continue with Solana\"\n >\n {isLoading ? (\n <LoadingSpinner size=\"sm\" />\n ) : (\n <svg\n className=\"cedros-button-icon\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 128 128\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M25.38 96.04a4.35 4.35 0 0 1 3.07-1.27h91.68c1.93 0 2.9 2.34 1.54 3.7l-17.71 17.72a4.35 4.35 0 0 1-3.07 1.27H9.21c-1.93 0-2.9-2.34-1.54-3.7l17.71-17.72z\" />\n <path d=\"M25.38 11.81a4.47 4.47 0 0 1 3.07-1.27h91.68c1.93 0 2.9 2.34 1.54 3.7L103.96 31.96a4.35 4.35 0 0 1-3.07 1.27H9.21c-1.93 0-2.9-2.34-1.54-3.7L25.38 11.81z\" />\n <path d=\"M102.62 53.76a4.35 4.35 0 0 0-3.07-1.27H7.87c-1.93 0-2.9 2.34-1.54 3.7l17.71 17.72a4.35 4.35 0 0 0 3.07 1.27h91.68c1.93 0 2.9-2.34 1.54-3.7L102.62 53.76z\" />\n </svg>\n )}\n <span>Continue with Solana</span>\n </button>\n\n {/* Wallet Selector Modal */}\n {showWalletSelector && (\n <div\n className=\"cedros-modal-backdrop\"\n onClick={() => setShowWalletSelector(false)}\n role=\"presentation\"\n >\n <div\n className=\"cedros-modal cedros-wallet-selector\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"wallet-selector-title\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"cedros-modal-header\">\n <h2 id=\"wallet-selector-title\" className=\"cedros-modal-title\">\n Select Wallet\n </h2>\n <button\n type=\"button\"\n className=\"cedros-modal-close\"\n onClick={() => setShowWalletSelector(false)}\n aria-label=\"Close\"\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n <div className=\"cedros-modal-content\">\n <div className=\"cedros-wallet-list\">\n {installedWallets.map((w) => (\n <button\n key={w.adapter.name}\n type=\"button\"\n className=\"cedros-wallet-option\"\n onClick={() => handleSelectWallet(w.adapter.name)}\n >\n <img\n src={w.adapter.icon}\n alt=\"\"\n width=\"32\"\n height=\"32\"\n className=\"cedros-wallet-icon\"\n />\n <span>{w.adapter.name}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n"],"names":["useSolanaAuth","config","_internal","useCedrosLogin","isLoading","setIsLoading","useState","error","setError","apiClient","useMemo","ApiClient","requestChallenge","useCallback","publicKey","validateSolanaPublicKey","authError","err","handleApiError","signIn","signature","message","data","clearError","WALLET_PROVIDERS","isValidSolanaProvider","provider","wallet","detectSolanaWallets","win","walletObj","SolanaLoginButton","onSuccess","onError","className","variant","size","disabled","hideIfNoWallet","walletContext","isAuthLoading","showWalletSelector","setShowWalletSelector","pendingLogin","setPendingLogin","triggerConnect","setTriggerConnect","isProcessingRef","useRef","browserHasWallets","connected","connecting","signMessage","installedWallets","w","hasWallets","executeSignIn","pubKeyString","challenge","messageBytes","signatureBytes","useEffect","handleClick","handleSelectWallet","walletName","sizeClasses","variantClasses","jsxs","Fragment","jsx","LoadingSpinner"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(){"use strict";function G(A,i,I,C){function Q(g){return g instanceof I?g:new I(function(B){B(g)})}return new(I||(I=Promise))(function(g,B){function w(f){try{o(C.next(f))}catch(F){B(F)}}function n(f){try{o(C.throw(f))}catch(F){B(F)}}function o(f){f.done?g(f.value):Q(f.value).then(w,n)}o((C=C.apply(A,[])).next())})}typeof SuppressedError=="function"&&SuppressedError;class h{constructor(){this.mutex=Promise.resolve()}lock(){let i=()=>{};return this.mutex=this.mutex.then(()=>new Promise(i)),new Promise(I=>{i=I})}dispatch(i){return G(this,void 0,void 0,function*(){const I=yield this.lock();try{return yield Promise.resolve(i())}finally{I()}})}}var Y;function z(){return typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global}const d=z(),N=(Y=d.Buffer)!==null&&Y!==void 0?Y:null,$=d.TextEncoder?new d.TextEncoder:null;function v(A,i){return(A&15)+(A>>6|A>>3&8)<<4|(i&15)+(i>>6|i>>3&8)}function R(A,i){const I=i.length>>1;for(let C=0;C<I;C++){const Q=C<<1;A[C]=v(i.charCodeAt(Q),i.charCodeAt(Q+1))}}function _(A,i){if(A.length!==i.length*2)return!1;for(let I=0;I<i.length;I++){const C=I<<1;if(i[I]!==v(A.charCodeAt(C),A.charCodeAt(C+1)))return!1}return!0}const T=87,L=48;function O(A,i,I){let C=0;for(let Q=0;Q<I;Q++){let g=i[Q]>>>4;A[C++]=g>9?g+T:g+L,g=i[Q]&15,A[C++]=g>9?g+T:g+L}return String.fromCharCode.apply(null,A)}const s=N!==null?A=>{if(typeof A=="string"){const i=N.from(A,"utf8");return new Uint8Array(i.buffer,i.byteOffset,i.length)}if(N.isBuffer(A))return new Uint8Array(A.buffer,A.byteOffset,A.length);if(ArrayBuffer.isView(A))return new Uint8Array(A.buffer,A.byteOffset,A.byteLength);throw new Error("Invalid data type!")}:A=>{if(typeof A=="string")return $.encode(A);if(ArrayBuffer.isView(A))return new Uint8Array(A.buffer,A.byteOffset,A.byteLength);throw new Error("Invalid data type!")},D="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=new Uint8Array(256);for(let A=0;A<D.length;A++)l[D.charCodeAt(A)]=A;function Z(A,i=!0){const I=A.length,C=I%3,Q=[],g=I-C;for(let B=0;B<g;B+=3){const w=(A[B]<<16&16711680)+(A[B+1]<<8&65280)+(A[B+2]&255),n=D.charAt(w>>18&63)+D.charAt(w>>12&63)+D.charAt(w>>6&63)+D.charAt(w&63);Q.push(n)}if(C===1){const B=A[I-1],w=D.charAt(B>>2),n=D.charAt(B<<4&63);Q.push(`${w}${n}`),i&&Q.push("==")}else if(C===2){const B=(A[I-2]<<8)+A[I-1],w=D.charAt(B>>10),n=D.charAt(B>>4&63),o=D.charAt(B<<2&63);Q.push(`${w}${n}${o}`),i&&Q.push("=")}return Q.join("")}function AA(A){let i=Math.floor(A.length*.75);const I=A.length;return A[I-1]==="="&&(i-=1,A[I-2]==="="&&(i-=1)),i}function IA(A){const i=AA(A),I=A.length,C=new Uint8Array(i);let Q=0;for(let g=0;g<I;g+=4){const B=l[A.charCodeAt(g)],w=l[A.charCodeAt(g+1)],n=l[A.charCodeAt(g+2)],o=l[A.charCodeAt(g+3)];C[Q]=B<<2|w>>4,Q+=1,C[Q]=(w&15)<<4|n>>2,Q+=1,C[Q]=(n&3)<<6|o&63,Q+=1}return C}const H=16*1024,u=4,iA=new h,M=new Map;function W(A,i){return G(this,void 0,void 0,function*(){let I=null,C=null,Q=!1;if(typeof WebAssembly>"u")throw new Error("WebAssembly is not supported in this environment!");const g=(e,t=0)=>{C.set(e,t)},B=()=>C,w=()=>I.exports,n=e=>{I.exports.Hash_SetMemorySize(e);const t=I.exports.Hash_GetBuffer(),E=I.exports.memory.buffer;C=new Uint8Array(E,t,e)},o=()=>new DataView(I.exports.memory.buffer).getUint32(I.exports.STATE_SIZE,!0),f=iA.dispatch(()=>G(this,void 0,void 0,function*(){if(!M.has(A.name)){const t=IA(A.data),E=WebAssembly.compile(t);M.set(A.name,E)}const e=yield M.get(A.name);I=yield WebAssembly.instantiate(e,{})})),F=()=>G(this,void 0,void 0,function*(){I||(yield f);const e=I.exports.Hash_GetBuffer(),t=I.exports.memory.buffer;C=new Uint8Array(t,e,H)}),r=(e=null)=>{Q=!0,I.exports.Hash_Init(e)},J=e=>{let t=0;for(;t<e.length;){const E=e.subarray(t,t+H);t+=E.length,C.set(E),I.exports.Hash_Update(E.length)}},k=e=>{if(!Q)throw new Error("update() called before init()");const t=s(e);J(t)},X=new Uint8Array(i*2),V=(e,t=null)=>{if(!Q)throw new Error("digest() called before init()");return Q=!1,I.exports.Hash_Final(t),e==="binary"?C.slice(0,i):O(X,C,i)},S=()=>{if(!Q)throw new Error("save() can only be called after init() and before digest()");const e=I.exports.Hash_GetState(),t=o(),E=I.exports.memory.buffer,p=new Uint8Array(E,e,t),K=new Uint8Array(u+t);return R(K,A.hash),K.set(p,u),K},x=e=>{if(!(e instanceof Uint8Array))throw new Error("load() expects an Uint8Array generated by save()");const t=I.exports.Hash_GetState(),E=o(),p=u+E,K=I.exports.memory.buffer;if(e.length!==p)throw new Error(`Bad state length (expected ${p} bytes, got ${e.length})`);if(!_(A.hash,e.subarray(0,u)))throw new Error("This state was written by an incompatible hash implementation");const pA=e.subarray(u);new Uint8Array(K,t,E).set(pA),Q=!0},y=e=>typeof e=="string"?e.length<H/4:e.byteLength<H;let a=y;switch(A.name){case"argon2":case"scrypt":a=()=>!0;break;case"blake2b":case"blake2s":a=(e,t)=>t<=512&&y(e);break;case"blake3":a=(e,t)=>t===0&&y(e);break;case"xxhash64":case"xxhash3":case"xxhash128":case"crc64":a=()=>!1;break}const U=(e,t=null,E=null)=>{if(!a(e,t))return r(t),k(e),V("hex",E);const p=s(e);return C.set(p),I.exports.Hash_Calculate(p.length,t,E),O(X,C,i)};return yield F(),{getMemory:B,writeMemory:g,getExports:w,setMemorySize:n,init:r,update:k,digest:V,save:S,load:x,calculate:U,hashLength:i}})}new h;var CA="argon2",gA="AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkD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",QA="e4cdc523",eA={name:CA,data:gA,hash:QA},BA="blake2b",tA="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",wA="c6f286e6",hA={name:BA,data:tA,hash:wA};new h;function j(A){return!Number.isInteger(A)||A<8||A>512||A%8!==0?new Error("Invalid variant! Valid values: 8, 16, ..., 512"):null}function nA(A,i){return A|i<<16}function P(A=512,i=null){if(j(A))return Promise.reject(j(A));let I=null,C=A;if(i!==null){if(I=s(i),I.length>64)return Promise.reject(new Error("Max key length is 64 bytes"));C=nA(A,I.length)}const Q=A/8;return W(hA,Q).then(g=>{C>512&&g.writeMemory(I),g.init(C);const B={init:C>512?()=>(g.writeMemory(I),g.init(C),B):()=>(g.init(C),B),update:w=>(g.update(w),B),digest:w=>g.digest(w),save:()=>g.save(),load:w=>(g.load(w),B),blockSize:128,digestSize:Q};return B})}function oA(A,i,I){const C=[`m=${i.memorySize}`,`t=${i.iterations}`,`p=${i.parallelism}`].join(",");return`$argon2${i.hashType}$v=19$${C}$${Z(A,!1)}$${Z(I,!1)}`}const q=new DataView(new ArrayBuffer(4));function c(A){return q.setInt32(0,A,!0),new Uint8Array(q.buffer)}function b(A,i,I){return G(this,void 0,void 0,function*(){if(I<=64){const n=yield P(I*8);return n.update(c(I)),n.update(i),n.digest("binary")}const C=Math.ceil(I/32)-2,Q=new Uint8Array(I);A.init(),A.update(c(I)),A.update(i);let g=A.digest("binary");Q.set(g.subarray(0,32),0);for(let n=1;n<C;n++)A.init(),A.update(g),g=A.digest("binary"),Q.set(g.subarray(0,32),n*32);const B=I-32*C;let w;return B===64?(w=A,w.init()):w=yield P(B*8),w.update(g),g=w.digest("binary"),Q.set(g.subarray(0,B),C*32),Q})}function rA(A){switch(A){case"d":return 0;case"i":return 1;default:return 2}}function EA(A){return G(this,void 0,void 0,function*(){var i;const{parallelism:I,iterations:C,hashLength:Q}=A,g=s(A.password),B=s(A.salt),w=19,n=rA(A.hashType),{memorySize:o}=A,f=s((i=A.secret)!==null&&i!==void 0?i:""),[F,r]=yield Promise.all([W(eA,1024),P(512)]);F.setMemorySize(o*1024+1024);const J=new Uint8Array(24),k=new DataView(J.buffer);k.setInt32(0,I,!0),k.setInt32(4,Q,!0),k.setInt32(8,o,!0),k.setInt32(12,C,!0),k.setInt32(16,w,!0),k.setInt32(20,n,!0),F.writeMemory(J,o*1024),r.init(),r.update(J),r.update(c(g.length)),r.update(g),r.update(c(B.length)),r.update(B),r.update(c(f.length)),r.update(f),r.update(c(0));const V=Math.floor(o/(I*4))*4,S=new Uint8Array(72),x=r.digest("binary");S.set(x);for(let U=0;U<I;U++){S.set(c(0),64),S.set(c(U),68);let e=U*V,t=yield b(r,S,1024);F.writeMemory(t,e*1024),e+=1,S.set(c(1),64),t=yield b(r,S,1024),F.writeMemory(t,e*1024)}const y=new Uint8Array(1024);R(y,F.calculate(new Uint8Array([]),o));const a=yield b(r,y,Q);if(A.outputType==="hex"){const U=new Uint8Array(Q*2);return O(U,a,Q)}return A.outputType==="encoded"?oA(B,A,a):a})}const fA=A=>{var i;if(!A||typeof A!="object")throw new Error("Invalid options parameter. It requires an object.");if(!A.password)throw new Error("Password must be specified");if(A.password=s(A.password),A.password.length<1)throw new Error("Password must be specified");if(!A.salt)throw new Error("Salt must be specified");if(A.salt=s(A.salt),A.salt.length<8)throw new Error("Salt should be at least 8 bytes long");if(A.secret=s((i=A.secret)!==null&&i!==void 0?i:""),!Number.isInteger(A.iterations)||A.iterations<1)throw new Error("Iterations should be a positive number");if(!Number.isInteger(A.parallelism)||A.parallelism<1)throw new Error("Parallelism should be a positive number");if(!Number.isInteger(A.hashLength)||A.hashLength<4)throw new Error("Hash length should be at least 4 bytes.");if(!Number.isInteger(A.memorySize))throw new Error("Memory size should be specified.");if(A.memorySize<8*A.parallelism)throw new Error("Memory size should be at least 8 * parallelism.");if(A.outputType===void 0&&(A.outputType="hex"),!["hex","binary","encoded"].includes(A.outputType))throw new Error(`Insupported output type ${A.outputType}. Valid values: ['hex', 'binary', 'encoded']`)};function DA(A){return G(this,void 0,void 0,function*(){return fA(A),EA(Object.assign(Object.assign({},A),{hashType:"id"}))})}new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h,new h;const FA={mCost:19456,tCost:2,pCost:1};function sA(A){return A.length===32}function cA(A){return A.length>=16}function kA(A){if(!sA(A))throw new Error(`Invalid key length: expected 32, got ${A.length}`);return A}function aA(A){if(!cA(A))throw new Error(`Invalid salt length: expected >=16, got ${A.length}`);return A}const SA=32;async function UA(A,i,I=FA){GA(I);try{const C=await DA({password:A,salt:i,iterations:I.tCost,memorySize:I.mCost,parallelism:I.pCost,hashLength:SA,outputType:"binary"});return kA(C)}catch{throw new Error("Key derivation failed")}}function GA(A){if(A.mCost<16384)throw new Error("KDF memory cost too low (minimum 16 MiB)");if(A.mCost>1048576)throw new Error("KDF memory cost too high (maximum 1 GiB)");if(A.tCost<1)throw new Error("KDF time cost must be at least 1");if(A.tCost>10)throw new Error("KDF time cost too high (maximum 10)");if(A.pCost<1)throw new Error("KDF parallelism must be at least 1");if(A.pCost>4)throw new Error("KDF parallelism too high (maximum 4)")}const m=self;m.onmessage=async A=>{const{id:i,password:I,salt:C,params:Q}=A.data;try{const g=await UA(I,aA(C),Q),B={id:i,key:g};m.postMessage(B)}catch(g){const B={id:i,error:g instanceof Error?g.message:"Argon2 worker failed"};m.postMessage(B)}}})();
|