@privy-io/expo
Version:
Expo client for the Privy Auth API
2 lines (1 loc) • 39.5 kB
JavaScript
import{a as A,b as O,d as p}from"./chunk-OWCFWPAL.js";import{useEffect as _t}from"react";import{create as Et}from"zustand";var We=Et(()=>({status:"disconnected"})),xe=()=>We.getState().onNeedsRecovery,Ar=e=>{_t(()=>{We.setState({onNeedsRecovery:e==null?void 0:e.onNeedsRecovery})},[e==null?void 0:e.onNeedsRecovery])};import{applicationId as ut}from"expo-application";import*as te from"expo-linking";import*as x from"expo-secure-store";import*as ce from"expo-web-browser";import{useCallback as pt,useContext as fr,useEffect as hr}from"react";import{Platform as yt}from"react-native";import{PrivyClientError as H}from"@privy-io/js-sdk-core";import se,{useState as R,useMemo as lr,createContext as ur,useCallback as we,useRef as Z,useEffect as st,useContext as pr}from"react";import{AppState as dt,View as yr}from"react-native";import{PrivyClientError as ct}from"@privy-io/js-sdk-core";import At from"react-fast-compare";import{create as Ct}from"zustand";var ue=Ct(()=>{}),Ie=e=>ue.setState(t=>At(t,e)?t:e),oe=ue.getState;import Pt from"react";import{useCallback as Ot,useEffect as Wt,useRef as xt}from"react";import{AppState as It}from"react-native";import Ut from"react-native-webview";import*as W from"expo-secure-store";function Ue(e){return typeof e!="object"||e===null||!("event"in e&&typeof e.event=="string")||!("id"in e&&typeof e.id=="string")||!("data"in e&&typeof e.data=="object")||e.data===null?!1:e.event.startsWith("app:secure-storage:")}function Le(e){return p(this,null,function*(){switch(e.event){case"app:secure-storage:get":{let{key:t}=e.data,r=yield W.getItemAsync(ge(t),{keychainAccessible:W.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY}).catch(o=>(console.warn("Failed to get the value from secure store",o),null));return{event:e.event,id:e.id,data:{value:r}}}case"app:secure-storage:remove":{let{key:t}=e.data,r=yield W.deleteItemAsync(ge(t),{keychainAccessible:W.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY}).then(()=>!0).catch(o=>(console.warn("Failed to remove the value from secure store",o),!1));return{event:e.event,id:e.id,data:{success:r}}}case"app:secure-storage:set":{let{key:t,value:r}=e.data,o=yield W.setItemAsync(ge(t),r,{keychainAccessible:W.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY}).then(()=>!0).catch(n=>(console.warn("Failed to write the value to secure store",n),!1));return{event:e.event,id:e.id,data:{success:o}}}}})}var ge=e=>e.replaceAll(":","-");import kt from"react-fast-compare";import{createStore as Rt,useStore as Se}from"zustand";var N=Rt()(()=>({user:null,proxyStatus:"loading"}));function Te(){return N.getState().user}var Ur=N.subscribe.bind(N);function _e(e){N.setState(({user:t})=>kt(t,e)?{}:{user:e})}var Ee=e=>N.setState({proxyStatus:e});function j(){return Se(N,e=>e.user)}function Fe(){return Se(N,e=>!!e.user)}function D(){return Se(N,e=>e.proxyStatus!=="loading")}var Lt={shouldUseAppBackedStorage:!0},Me=({client:e,isClientReady:t})=>{let r=xt(null);Wt(()=>It.addEventListener("change",d=>p(void 0,null,function*(){d==="active"&&((yield e.embeddedWallet.ping(500))||(Ee("reloading"),e.embeddedWallet.reload()))})).remove,[e]);let o=Ot(n=>p(void 0,null,function*(){var c;let{data:d}=n.nativeEvent,i=JSON.parse(d);if(Ue(i)){let s=yield Le(i);(c=r.current)==null||c.postMessage(JSON.stringify(s));return}e.embeddedWallet.onMessage(i)}),[e]);return t?Pt.createElement(Ut,{style:{flex:1},ref:n=>{n&&(e.setMessagePoster(n),r.current=n)},cacheEnabled:!1,cacheMode:"LOAD_NO_CACHE",injectedJavaScriptObject:Lt,source:{uri:e.embeddedWallet.getURL()},webviewDebuggingEnabled:e.logger.level==="DEBUG",onLoad:()=>Ee("loaded"),onError:console.error,onMessage:o}):null};import{useCallback as Ae,useEffect as Ke,useMemo as Ce}from"react";import{errorIndicatesRecoveryIsNeeded as Ft,getAllUserEmbeddedSolanaWallets as Mt,getEntropyDetailsFromUser as Ve,PrivyClientError as ae}from"@privy-io/js-sdk-core";import{getAllUserEmbeddedSolanaWallets as pe,getEntropyDetailsFromAccount as Ne,getUserEmbeddedEthereumWallet as Tt,PrivyClientError as Y}from"@privy-io/js-sdk-core";function je(d){return p(this,arguments,function*({client:e,setSolanaWallet:t,createSolanaWalletCallbacks:r,setSolanaRecoveryFlowState:o,opts:n}){var i,c,s;t({status:"creating"});try{let{user:a}=yield e.user.get(),l=pe(a),v=l[0],f=(i=Tt(a))!=null?i:void 0;if(n!=null&&n.recoveryMethod&&n.recoveryMethod!=="privy")throw new Y({code:"embedded_wallet_creation_error",error:"Unsupported recovery method for solana wallet."});if(!(n!=null&&n.createAdditional)&&v)throw new Y({code:"embedded_wallet_creation_error",error:"Solana wallet already exists for this user. Set `createAdditional` to `true` to create another wallet"});let g,w;if(v){let u=f!=null?f:v,{entropyId:b,entropyIdVerifier:y}=Ne(u),m=Math.max(...l.map(E=>E.wallet_index),0)+1,_=yield e.embeddedWallet.add({chainType:"solana",entropyId:b,entropyIdVerifier:y,hdWalletIndex:m}),S=pe(_.user).find(E=>E.wallet_index===m);if(!S)throw new Y({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});g=yield e.embeddedWallet.getSolanaProvider(S,b,y),w=_.user}else{let u=yield e.embeddedWallet.createSolana({ethereumAccount:f}),b=pe(u.user).find(S=>S.wallet_index===0);if(!b)throw new Y({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});let y=f!=null?f:b,{entropyId:m,entropyIdVerifier:_}=Ne(y);g=yield e.embeddedWallet.getSolanaProvider(b,m,_),w=u.user}let h=pe(w)[0];if(!h)throw new Y({code:"embedded_wallet_creation_error",error:"Unknown error creating solana wallet"});return(s=(c=r.current)==null?void 0:c.onSuccess)==null||s.call(c,g),t({status:"connected",publicKey:h.public_key}),o({status:"initial"}),g}catch(a){let l=a instanceof Error?a.message:"Error creating embedded wallet";throw t({status:"error",error:l}),o({status:"initial"}),new Y({code:"embedded_wallet_creation_error",error:l})}})}import{PrivyClientError as z}from"@privy-io/js-sdk-core";function ye(l){return p(this,arguments,function*({client:e,account:t,setWallet:r,recoverWalletCallbacks:o,recoveryMethod:n,setRecoveryFlowState:d,password:i,recoveryKey:c,recoveryToken:s,recoverySecretOverride:a}){var v,f,g,w;if(!t)throw new z({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});switch(n){case"user-passcode":if(!i)throw new z({code:"embedded_wallet_recovery_error",error:"password is required for user-passcode recovery method"});break;case"google-drive":if(!s)throw new z({code:"embedded_wallet_recovery_error",error:"Recovery token is required for google-drive recovery method"});break;case"icloud":if(!a)throw new z({code:"embedded_wallet_recovery_error",error:"Record name is required for icloud recovery method"});break;case"recovery-encryption-key":if(!c)throw new z({code:"embedded_wallet_recovery_error",error:"recoveryKey is required for recovery-encryption-key recovery method"});break}r({status:"connecting",account:t});try{let h=yield e.embeddedWallet.getProvider(t,i,s,a,c);return r({status:"connected",provider:h,account:t}),d({status:"initial"}),(f=(v=o.current)==null?void 0:v.onSuccess)==null||f.call(v,h),h}catch(h){r({status:"needs-recovery",account:t}),d({status:"initial"});let u=new z({code:"embedded_wallet_recovery_error",error:h instanceof Error?h.message:"Error recovering embedded wallet"});throw(w=(g=o.current)==null?void 0:g.onError)==null||w.call(g,u),u}})}function De(c){return p(this,arguments,function*({client:e,account:t,entropyId:r,entropyIdVerifier:o,setSolanaWallet:n,recoverSolanaWalletCallbacks:d,setSolanaRecoveryFlowState:i}){var s,a,l,v;n({status:"connecting"});try{let f=yield e.embeddedWallet.getSolanaProvider(t,r,o);return n({status:"connected",publicKey:f._publicKey}),i({status:"initial"}),(a=(s=d.current)==null?void 0:s.onSuccess)==null||a.call(s,f),f}catch(f){n({status:"needs-recovery"}),i({status:"initial"});let g=new z({code:"embedded_wallet_recovery_error",error:f instanceof Error?f.message:"Error recovering embedded wallet"});throw(v=(l=d.current)==null?void 0:l.onError)==null||v.call(l,g),g}})}var qe=({client:e,solanaWallet:t,setSolanaWallet:r,setSolanaRecoveryFlowState:o,createSolanaWalletCallbacks:n,recoverSolanaWalletCallbacks:d})=>{let i=j(),c=Ce(()=>Mt(i),[i]),s=D(),a=Ce(()=>c.length===0?null:Ve(i),[i,c]),l=Ce(()=>{let w=c.map(y=>{let m=Ve(i,y);return m?{account:y,entropy:m}:null});if(w.some(y=>y===null))return[];let h=void 0,u=void 0,b=void 0;return w.filter(y=>y!==null).map(({account:y,entropy:{entropyId:m,entropyIdVerifier:_}})=>({address:y.address,publicKey:y.address,walletIndex:y.wallet_index,getProvider:()=>e.embeddedWallet.getSolanaProvider(y,m,_,h,u,b,S=>p(void 0,null,function*(){var E;yield(E=xe())==null?void 0:E(S)}))}))},[c,i,e]),v=Ae(w=>p(void 0,null,function*(){return yield je({client:e,setSolanaWallet:r,createSolanaWalletCallbacks:n,setSolanaRecoveryFlowState:o,opts:w})}),[e,n]),f=Ae(()=>p(void 0,null,function*(){if(!a)throw new ae({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});let{entropyId:w,entropyIdVerifier:h}=a;return De({client:e,account:c[0],entropyId:w,entropyIdVerifier:h,setSolanaWallet:r,recoverSolanaWalletCallbacks:d,setSolanaRecoveryFlowState:o})}),[e,a,c,d,o,r]),g=Ae(()=>p(void 0,null,function*(){if(!a)throw r({status:"not-created"}),new ae({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});r(w=>w.status==="connected"?{status:"reconnecting"}:{status:"connecting"});try{let{entropyId:w,entropyIdVerifier:h}=a,u=yield e.embeddedWallet.getSolanaProvider(c[0],w,h);return r({status:"connected",publicKey:c[0].public_key}),u}catch(w){throw Ft(w)?(r({status:"needs-recovery"}),new ae({code:"embedded_wallet_needs_recovery",error:"Embedded wallet not loaded on device"})):w instanceof Error?(r({status:"error",error:w.message}),new ae({code:"unknown_embedded_wallet_error",error:w.message})):(r({status:"error",error:"Error loading embedded wallet"}),new ae({code:"unknown_embedded_wallet_error",error:"Error loading embedded wallet"}))}}),[c,e,a,r]);return Ke(()=>{if(!i&&t.status!=="disconnected")return r({status:"disconnected"});s&&g().catch(()=>{})},[s,i]),Ke(()=>{t.status==="error"&&t.error.includes("User must be logged in")&&g()},[t.status]),{create:v,recover:f,getProvider:g,wallets:l}};import{useCallback as ie,useEffect as Ye,useMemo as Bt}from"react";import{getUserEmbeddedEthereumWallet as Gt,getUserEmbeddedSolanaWallet as Xe,isUnifiedWallet as Yt,throwIfInvalidRecoveryUpgradePath as Xt}from"@privy-io/js-sdk-core";import{errorIndicatesRecoveryIsNeeded as Qt,PrivyClientError as C}from"@privy-io/js-sdk-core";import{getUserEmbeddedEthereumWallet as Nt}from"@privy-io/js-sdk-core";import{PrivyClientError as X}from"@privy-io/js-sdk-core";function me(v){return p(this,arguments,function*({client:e,setWallet:t,createWalletCallbacks:r,recoveryMethod:o,setRecoveryFlowState:n,password:d,recoveryKey:i,recoveryToken:c,recoverySecretOverride:s,iCloudRecordNameOverride:a,solanaAccount:l}){var g,w;switch(o){case"user-passcode":if(!d)throw new X({code:"embedded_wallet_recovery_error",error:"password is required for user-passcode recovery method"});break;case"recovery-encryption-key":if(!i)throw new X({code:"embedded_wallet_recovery_error",error:"key is required for recovery-encryption-key recovery method"});break;case"google-drive":if(!c)throw new X({code:"embedded_wallet_recovery_error",error:"Recovery token is required for google-drive recovery method"});break;case"icloud":if(!s||!a)throw new X({code:"embedded_wallet_recovery_error",error:"iCloud recovery failed due to inability to store credentials"});break}t({status:"creating",account:null});let f=o==="icloud"?"icloud-native":o;try{let{user:h}=yield e.embeddedWallet.create({password:d,recoveryMethod:f,recoveryKey:i,recoveryToken:c,recoverySecretOverride:s,iCloudRecordNameOverride:a,solanaAccount:l}),u=Nt(h);if(!u)throw new X({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});let b=yield e.embeddedWallet.getProvider(u);return(w=(g=r.current)==null?void 0:g.onSuccess)==null||w.call(g,b),t({status:"connected",provider:b,account:u}),n({status:"initial"}),b}catch(h){let u=h instanceof Error?h.message:"Error creating embedded wallet";throw t({status:"error",error:u,account:null}),n({status:"initial"}),new X({code:"embedded_wallet_creation_error",error:u})}})}import{Platform as ze}from"react-native";import{PrivyClientError as U}from"@privy-io/js-sdk-core";function Je(){return p(this,null,function*(){try{return yield import("@privy-io/expo-native-extensions")}catch(e){throw new Error("@privy-io/expo-native-extensions not found. Ensure that you're explicitly including as a dependency, and running an Expo development build")}})}function ke(o){return p(this,arguments,function*({user:e,appId:t,client:r}){var c;if(ze.OS==="android")throw new U({code:"embedded_wallet_recovery_error",error:"iCloud recovery is not supported on Android"});let n=yield Je(),d=yield r.recovery.icloudAuth.getICloudConfiguration("expo-ios");if(!(d==null?void 0:d.container_identifier))throw new U({code:"embedded_wallet_recovery_error",error:"An iCloud Container ID must be specified in the Privy Dashboard."});try{let{recoverySecret:s,iCloudRecordName:a}=yield n.writeRecoverySecretToICloud({containerId:d.container_identifier,appId:t,userId:e.id});return{recoverySecret:s,iCloudRecordName:a}}catch(s){if(s instanceof Error){let a=(c=s.message.split("Caused by: ")[1])!=null?c:"Error writing to iCloud";throw new U({code:"embedded_wallet_recovery_error",error:a})}throw new U({code:"embedded_wallet_recovery_error",error:"Error writing to iCloud"})}})}function He(o){return p(this,arguments,function*({walletAddress:e,client:t,chainType:r}){var a;if(ze.OS==="android")throw new U({code:"embedded_wallet_recovery_error",error:"iCloud recovery is not supported on Android"});let n=yield Je(),i=(yield t.recovery.getRecoveryKeyMaterial(e,r)).icloud_record_name;if(!i)throw new U({code:"embedded_wallet_recovery_error",error:"iCloud recovery not properly backed up."});let c=yield t.recovery.icloudAuth.getICloudConfiguration("expo-ios"),s=c==null?void 0:c.container_identifier;if(!s)throw new U({code:"embedded_wallet_recovery_error",error:"An iCloud Container ID must be specified in the Privy Dashboard."});try{let{recoverySecret:l}=yield n.readRecoverySecretFromICloud({containerId:s,recordName:i});return{recoverySecret:l}}catch(l){if(l instanceof Error){let v=(a=l.message.split("Caused by: ")[1])!=null?a:"Error writing to iCloud";throw new U({code:"embedded_wallet_recovery_error",error:v})}throw new U({code:"embedded_wallet_recovery_error",error:"Error writing to iCloud"})}})}import*as J from"expo-linking";import*as Be from"expo-web-browser";import{Platform as Ge}from"react-native";import{PrivyClientError as Q}from"@privy-io/js-sdk-core";import yo from"react-fast-compare";import{PrivyApiError as jt,PrivyClientError as Dt}from"@privy-io/js-sdk-core";function K(e){return e instanceof Error||e instanceof jt||e instanceof Dt?e:typeof e=="string"?new Error(e):new Error("Unknown error")}var ho=e=>new Promise(t=>setTimeout(t,e));import{useEffect as Kt,useRef as Vt}from"react";import{AppState as Re}from"react-native";function _o(){let e=Vt(Re.currentState);Kt(()=>Re.addEventListener("change",o=>{e.current=o}).remove,[]);function t(){return Re.currentState}return{appState:e,getCurrentAppState:t}}function ne(n){return p(this,arguments,function*({provider:e,redirectUri:t,client:r,onError:o}){try{let d;switch(e){case"google-drive":{let{url:a}=yield r.recovery.auth.generateURL(J.createURL(t||"/"));d=a;break}default:throw new Q({error:"OAuth invalid provider",code:"embedded_wallet_recovery_error"})}let i=yield Be.openAuthSessionAsync(d);if(Ge.OS==="android")return;if(i.type!=="success")throw new Q({error:"Recovery OAuth session failed",code:"embedded_wallet_recovery_error"});let{queryParams:c}=J.parse(i.url),s;switch(e){case"google-drive":{let{privy_oauth_state:a,privy_oauth_code:l}=c;if(!l||!a)throw new Q({error:"Recovery OAuth invalid credentials",code:"embedded_wallet_recovery_error"});s=yield ve({oAuthCode:l,oAuthState:a,client:r});break}default:throw new Q({error:"Recovery OAuth invalid provider",code:"embedded_wallet_recovery_error"})}return s}catch(d){throw o==null||o(K(d)),d}})}function ve(o){return p(this,arguments,function*({oAuthCode:e,oAuthState:t,client:r}){let{access_token:n}=yield r.recovery.auth.authorize(e,t);if(!n)throw new Q({error:"OAuth invalid credentials",code:"login_with_oauth_returned_with_invalid_credentials"});return n})}var qt=2*60*1e3;function zt(e){let t;return new Promise((r,o)=>{t=J.addEventListener("url",d=>p(this,[d],function*({url:n}){if(!n)return;let{queryParams:i}=J.parse(n),{privy_oauth_state:c,privy_oauth_code:s}=i!=null?i:{};if(typeof s!="string"||typeof c!="string")return;let a=yield ve({client:e,oAuthCode:s,oAuthState:c});r(a)})),setTimeout(()=>{o(new Q({code:"embedded_wallet_set_recovery_error",error:"Failed to complete Google Drive recovery flow"}))},qt)}).finally(()=>{t==null||t.remove()})}function Uo(e){return p(this,null,function*(){let t;Ge.OS==="android"&&(t=zt(e));let r=yield ne({provider:"google-drive",client:e});return r!=null?r:yield t})}import{getUserEmbeddedWallet as Jt,PrivyClientError as Ht}from"@privy-io/js-sdk-core";function fe(d){return p(this,arguments,function*({client:e,recoveryInput:t,setWalletRecoveryCallbacks:r,setRecoveryFlowState:o,setWallet:n}){var i,c,s,a;try{let{provider:l,user:v}=yield e.embeddedWallet.setRecovery(t),f=l,g=Jt(v);return n({status:"connected",provider:f,account:g}),(c=(i=r.current)==null?void 0:i.onSuccess)==null||c.call(i,f),o({status:"initial"}),f}catch(l){let v=new Ht({code:"embedded_wallet_set_recovery_error",error:l instanceof Error?l.message:"Error setting password on embedded wallet"});throw(a=(s=r.current)==null?void 0:s.onError)==null||a.call(s,v),o({status:"initial"}),v}})}function Qe(e){return e===void 0?{recoveryMethod:"privy"}:typeof e=="string"?{recoveryMethod:"user-passcode",password:e}:e.recoveryMethod==="user-passcode"?{recoveryMethod:"user-passcode",password:e.password}:e.recoveryMethod==="recovery-encryption-key"?{recoveryMethod:"recovery-encryption-key",recoveryKey:e.recoveryKey}:{recoveryMethod:e.recoveryMethod}}var $e=({client:e,appId:t,wallet:r,setWallet:o,setRecoveryFlowState:n,createWalletCallbacks:d,recoverWalletCallbacks:i,setWalletRecoveryCallbacks:c})=>{let s=j(),a=Bt(()=>Gt(s),[s]),l=D(),v=ie(u=>p(void 0,null,function*(){var I,B;if(a)throw new C({error:"This user already has an embedded wallet",code:"embedded_wallet_already_exists"});let{user:b}=yield e.user.get(),{password:y,recoveryMethod:m,recoveryKey:_}=Qe(u),S,E,L;if(m==="google-drive"&&(S=yield ne({provider:m,client:e,onError:(I=d.current)==null?void 0:I.onError}),n({status:"creating-wallet"}),!S))return null;if(m==="icloud"){if(!b)throw new C({code:"embedded_wallet_recovery_error",error:"User must be loaded before creating a wallet with iCloud."});let{recoverySecret:V,iCloudRecordName:q}=yield ke({user:b,appId:t,client:e});E=V,L=q}return yield me({client:e,setWallet:o,createWalletCallbacks:d,recoveryMethod:m,recoveryKey:_,setRecoveryFlowState:n,password:y,recoverySecretOverride:E,iCloudRecordNameOverride:L,solanaAccount:(B=Xe(b))!=null?B:void 0})}),[e,a,s]),f=ie(u=>p(void 0,null,function*(){var m;if(r.status!=="connected")throw new C({code:"attempted_to_set_password_before_connected",error:"Embedded wallet must be connected before setting password"});if(!a)throw new C({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});if(Xe(s))throw new C({code:"embedded_wallet_set_recovery_error",error:"Cannot set user-controlled recovery for a user with an embedded Solana wallet."});if(Yt(a))throw new C({code:"unsupported_wallet_type",error:"Embedded wallet recovery is only supported for on-device execution and this app uses TEE execution. Learn more https://docs.privy.io/recipes/tee-wallet-migration-guide"});Xt({currentRecoveryMethod:a.recovery_method,upgradeToRecoveryMethod:u.recoveryMethod});let b,y;switch(u.recoveryMethod){case"privy":y=O(A({},u),{wallet:a});break;case"user-passcode":y=O(A({},u),{wallet:a,password:u.password});break;case"google-drive":if(b=yield ne({provider:u.recoveryMethod,client:e,onError:(m=c.current)==null?void 0:m.onError}),n({status:"upgrading-recovery"}),!b)return null;y={recoveryMethod:"google-drive",wallet:a,recoveryAccessToken:b};break;case"icloud":if(!s)throw new C({code:"embedded_wallet_recovery_error",error:"User must be loaded before backing up to iCloud."});let{recoverySecret:_,iCloudRecordName:S}=yield ke({user:s,appId:t,client:e});y={recoveryMethod:"icloud-native",recoverySecretOverride:_,iCloudRecordNameOverride:S,wallet:a};break;default:throw new C({code:"embedded_wallet_recovery_error",error:"Unrecognized recovery method"})}return fe({client:e,recoveryInput:y,setWalletRecoveryCallbacks:c,setRecoveryFlowState:n,setWallet:o})}),[e,a,r.status,s]),g=ie(u=>p(void 0,null,function*(){return f({recoveryMethod:"user-passcode",password:u})}),[e,a,r.status]),w=ie(u=>p(void 0,null,function*(){var E;if(!a)throw new C({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});let{password:b,recoveryMethod:y,recoveryKey:m}=Qe(u),_,S;if(y==="google-drive"&&(_=yield ne({provider:y,client:e,onError:(E=i.current)==null?void 0:E.onError}),n({status:"recovering"}),!_))return null;if(y==="icloud"){if(!s)throw new C({code:"embedded_wallet_recovery_error",error:"User must be loaded before recovering via iCloud."});let{recoverySecret:L}=yield He({client:e,walletAddress:a.address});S=L}return ye({client:e,account:a,setWallet:o,recoverWalletCallbacks:i,recoveryMethod:y,setRecoveryFlowState:n,recoveryKey:m,password:b,recoveryToken:_,recoverySecretOverride:S})}),[e,a]),h=ie(()=>p(void 0,null,function*(){if(!a)throw o({status:"not-created",account:null}),new C({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});o(u=>u.status==="connected"?{status:"reconnecting",account:a}:{status:"connecting",account:a});try{let u=yield e.embeddedWallet.getProvider(a);return o({status:"connected",provider:u,account:a}),u}catch(u){throw Qt(u)?(o({status:"needs-recovery",account:a}),new C({code:"embedded_wallet_needs_recovery",error:"Embedded wallet not loaded on device"})):u instanceof Error?(o({status:"error",error:u.message,account:a}),new C({code:"unknown_embedded_wallet_error",error:u.message})):(o({status:"error",error:"Error loading embedded wallet",account:a}),new C({code:"unknown_embedded_wallet_error",error:"Error loading embedded wallet"}))}}),[e,a]);return Ye(()=>{if(!s&&r.status!=="disconnected")return o({status:"disconnected",account:null});l&&h().catch(()=>{})},[l,s,a]),Ye(()=>{r.status==="error"&&r.error.includes("User must be logged in")&&h()},[r.status]),{create:v,recover:w,setPassword:g,setRecovery:f,getProvider:h}};import{useEffect as $t,useState as Zt}from"react";import{PrivyClientError as Ze}from"@privy-io/js-sdk-core";var et=({client:e,isReady:t})=>{let r=j(),o=ue(i=>i==null?void 0:i.customAuth),[n,d]=Zt({status:"initial"});return $t(()=>{(()=>p(void 0,null,function*(){if(!(o!=null&&o.enabled)){d({status:"not-enabled"});return}d({status:"loading"});let{getCustomAccessToken:c,isLoading:s}=o;if(!(!t||s))try{let a=yield c();if(!a&&r){yield e.auth.logout(),d({status:"done"});return}if(!a){d({status:"done"});return}if(r){d({status:"done"});return}let l=oe();if(!(yield e.auth.customProvider.syncWithToken(a,{embedded:l==null?void 0:l.embedded}))){yield e.auth.logout(),d({status:"error",error:new Ze({error:"Failed to sync with custom auth provider",code:"third_party_auth_error"})});return}d({status:"done"})}catch(a){if(console.log("Error syncing with custom auth provider",a),d({status:"error",error:a}),r)throw yield e.auth.logout(),new Ze({error:"Third-party auth failed",code:"third_party_auth_error"})}}))()},[e,r,t,o==null?void 0:o.enabled,o==null?void 0:o.getCustomAccessToken,o==null?void 0:o.isLoading]),{customAuthState:n,customAuthStateIsSettled:n.status!=="loading"&&n.status!=="initial"}};import*as $ from"expo-linking";import{useCallback as er,useEffect as tr,useMemo as rr}from"react";import{Platform as or}from"react-native";import{getUserEmbeddedSolanaWallet as ar,getUserEmbeddedWallet as nr}from"@privy-io/js-sdk-core";var tt=({client:e,createWalletCallbacks:t,recoverWalletCallbacks:r,setWalletRecoveryCallbacks:o,recoveryFlowState:n,oAuthState:d,setRecoveryFlowState:i,setWallet:c,appStateVisible:s})=>{let a=$.useURL(),l=j(),v=rr(()=>nr(l),[l]),f=D(),g=er(w=>{var u,b,y,m;let h=K(w);n.status==="creating-wallet"?(b=(u=t.current).onError)==null||b.call(u,K(h)):(m=(y=r.current).onError)==null||m.call(y,K(h)),i({status:"initial"})},[n]);return tr(()=>{function w(){return p(this,null,function*(){var y;if(!a&&n.status!=="initial"&&s&&g(new Error("Recovery OAuth session failed")),!a||n.status==="initial"||d.status!=="initial"||!s||!f)return;let{queryParams:h}=$.parse(a),{privy_oauth_state:u,privy_oauth_code:b}=h;if(!(!b||!u)){yield $.openURL(a.split("?")[0]);try{let m=yield ve({oAuthCode:b,oAuthState:u,client:e});if(n.status==="creating-wallet"){let _=(y=ar(l))!=null?y:void 0;yield me({client:e,setWallet:c,createWalletCallbacks:t,recoveryMethod:"google-drive",setRecoveryFlowState:i,recoveryToken:m,solanaAccount:_})}else if(n.status==="upgrading-recovery"){if(!v)throw new Error("Embedded wallet not found");yield fe({client:e,recoveryInput:{recoveryMethod:"google-drive",wallet:v,recoveryAccessToken:m},setWalletRecoveryCallbacks:o,setRecoveryFlowState:i,setWallet:c})}else yield ye({client:e,account:v,setWallet:c,recoverWalletCallbacks:r,recoveryMethod:"google-drive",setRecoveryFlowState:i,recoveryToken:m})}catch(m){g(m)}}})}or.OS==="android"&&w()},[a,n.status,s,f])};import{useEffect as ir}from"react";var rt=({client:e,isUserInitialized:t,setIsUserInitialized:r,setError:o})=>{ir(()=>{t||(()=>p(void 0,null,function*(){try{yield e.initialize()}catch(d){o(d instanceof Error?d:new Error(String(d)))}try{yield e.user.get()}catch(d){}finally{r(!0)}}))()},[e,t,o,r])};import{digest as dr}from"expo-crypto";import cr from"@privy-io/js-sdk-core";var ot={name:"@privy-io/expo",version:"0.55.0",description:"Expo client for the Privy Auth API",keywords:["authentication","authorization","identity","privacy","privy","user data","react-native","expo","web3"],homepage:"https://docs.privy.io",bugs:{url:"https://privy.io/slack"},license:"Apache-2.0",author:"privy.io",exports:{".":{require:"./dist/index.js",import:"./dist/esm/index.js",types:"./dist/index.d.ts"},"./passkey":{require:"./dist/passkey.js",import:"./dist/esm/passkey.js",types:"./dist/passkey.d.ts"},"./smart-wallets":{require:"./dist/smart-wallets.js",import:"./dist/esm/smart-wallets.js",types:"./dist/smart-wallets.d.ts"},"./extended-chains":{require:"./dist/extended-chains.js",import:"./dist/esm/extended-chains.js",types:"./dist/extended-chains.d.ts"},"./ui":{require:"./dist/ui.js",import:"./dist/esm/ui.js",types:"./dist/ui.d.ts"},"./connectors":{require:"./dist/connectors.js",import:"./dist/esm/connectors.js",types:"./dist/connectors.d.ts"}},main:"./dist/esm/index.js",source:"./src/index.ts",types:"./dist/index.d.ts",files:["dist/**/*","LICENSE","README.md"],scripts:{build:"tsup --clean --minify","check-types":"tsc --noEmit",clean:"rm -rf dist .turbo",dev:"tsup --watch",format:'eslint "src/**/*.{ts,tsx,js,jsx}" --fix',"generate-types":"tsup --dts-only",lint:'eslint "src/**/*.{ts,tsx,js,jsx}"',test:"jest"},browserslist:["defaults","node >= 18","not op_mini all"],dependencies:{"@privy-io/js-sdk-core":"0.52.0","@scure/base":"^1.2.4",tweetnacl:"^1.0.3","react-fast-compare":"^3.2.2",zustand:"^5.0.4"},devDependencies:{"@privy-io/eslint-config-custom":"*","@privy-io/tsconfig":"*","@simplewebauthn/types":"9.0.1","@solana/web3.js":"^1.98.0","@svgr/core":"^8.1.0","@svgr/plugin-jsx":"^8.1.0","@svgr/plugin-svgo":"^8.1.0","@testing-library/react-native":"^13.1.0","@tsconfig/node16-strictest-esm":"^1.0.3","@types/jest":"^29.1.2",buffer:"^5.4.3","eslint-plugin-react-hooks":"^5.0.0-canary-7118f5dd7-20230705",expo:"52.0.37","expo-apple-authentication":"7.1.3","expo-application":"6.0.2","expo-clipboard":"7.0.1","expo-crypto":"14.0.2",jest:"^29.7.0","jest-expo":"52.0.5","lucide-react-native":"^0.474.0",react:"^18.3.1","react-native":"0.77.1","react-test-renderer":"^18.3.1",tsup:"^6.2.3",typescript:"~5.5.3"},peerDependencies:{"@expo-google-fonts/inter":"*","@privy-io/expo-native-extensions":"0.0.5","expo-apple-authentication":"*","expo-application":"*","expo-clipboard":"*","expo-crypto":"*","expo-font":"*","expo-linking":"*","expo-secure-store":"*","expo-web-browser":"*",permissionless:"^0.2.47",react:"*","react-native":"*","react-native-passkeys":"^0.3.0","react-native-qrcode-styled":"*","react-native-safe-area-context":"*","react-native-svg":"*","react-native-webview":"*",viem:"^2.30.6"},peerDependenciesMeta:{"@expo-google-fonts/inter":{optional:!0},"expo-font":{optional:!0},permissionless:{optional:!0},viem:{optional:!0},"react-native-svg":{optional:!0},"expo-clipboard":{optional:!0},"react-native-qrcode-styled":{optional:!0},"react-native-safe-area-context":{optional:!0}},publishConfig:{access:"public"}};var it=({appId:e,clientId:t,storage:r=he,supportedChains:o,baseUrl:n,logLevel:d})=>new cr({appId:e,clientId:t,supportedChains:o,storage:nt(r),sdkVersion:`expo:${ot.version}`,nativeAppIdentifier:at(),crypto:{digest:dr},baseUrl:n,logLevel:d});var be=ur(null),ee;function Ta(e){return ee?ee.getAccessToken():e!=null&&e.strict?Promise.reject(new ct({code:"attempted_to_read_storage_before_client_initialized",error:"Called `getAccessToken` before client initialized"})):(console.warn("Called `getAccessToken` before client initialized"),Promise.resolve(null))}var Fa=e=>{mr();let[t,r]=R(dt.currentState==="active");st(()=>{let M=dt.addEventListener("change",St=>{r(St==="active")});return()=>{M.remove()}},[]),st(()=>Ie(e.config),[e.config]);let[o,n]=R(!1),[d,i]=R(null),[c,s]=R(!1),[a,l]=R({status:"disconnected",account:null}),[v,f]=R({status:"disconnected"}),[g,w]=R({status:"initial"}),[h,u]=R({status:"initial"}),[b,y]=R({status:"initial"}),[m,_]=R({status:"initial"}),[S,E]=R({status:"initial"}),[L,I]=R({status:"initial"}),[B,V]=R({status:"initial"}),q=Z({}),T=Z({}),F=Z({}),P=Z({}),G=Z({}),re=Z({}),le=we(M=>{if(M){_e(M),i(null);return}_e(null),w({status:"initial"}),u({status:"initial"}),l({status:"disconnected",account:null})},[]),k=lr(()=>{let M=e.storage||he;return e.client?ee=e.client:ee=it({appId:e.appId,clientId:e.clientId,supportedChains:e.supportedChains,storage:M,baseUrl:e.baseUrl,logLevel:e.logLevel}),ee.setCallbacks({setUser:le,setIsReady:s}),ee},[e.client,e.storage,e.appId,e.clientId,e.baseUrl,e.supportedChains,e.logLevel,le]),mt=we(()=>(le(null),k.auth.logout()),[le,k]),vt=we(()=>p(void 0,null,function*(){try{return yield k.getAccessToken()}catch(M){return console.debug(M),null}}),[k]),ft=we(()=>k.getIdentityToken(),[k]);rt({client:k,isUserInitialized:o,setIsUserInitialized:n,setError:i});let ht=$e({client:k,appId:e.appId,createWalletCallbacks:T,recoverWalletCallbacks:F,setWalletRecoveryCallbacks:P,setRecoveryFlowState:y,wallet:a,setWallet:l}),wt=qe({client:k,createSolanaWalletCallbacks:G,recoverSolanaWalletCallbacks:re,setSolanaRecoveryFlowState:_,solanaWallet:v,setSolanaWallet:f});tt({client:k,createWalletCallbacks:T,recoverWalletCallbacks:F,setWalletRecoveryCallbacks:P,recoveryFlowState:b,oAuthState:h,setRecoveryFlowState:y,setWallet:l,appStateVisible:t});let{customAuthStateIsSettled:bt}=et({client:k,isReady:o}),gt=D();return se.createElement(se.Fragment,null,se.createElement(be.Provider,{value:{client:k,isReady:gt&&o&&bt,error:d,logout:mt,getAccessToken:vt,getIdentityToken:ft,wallet:A(A({},a),ht),solanaWallet:A(A({},v),wt),oAuthState:h,oAuthCallbacks:q,recoveryFlowState:b,setRecoveryFlowState:y,solanaRecoveryFlowState:m,setSolanaRecoveryFlowState:_,createWalletCallbacks:T,recoverWalletCallbacks:F,setWalletRecoveryCallbacks:P,createSolanaWalletCallbacks:G,recoverSolanaWalletCallbacks:re,setOAuthState:u,siweState:S,setSiweState:E,otpState:g,setOtpState:w,passkeyState:L,setPasskeyState:I,farcasterState:B,setFarcasterState:V}},e.children),se.createElement(yr,{style:{width:0,height:0,overflow:"hidden"}},se.createElement(Me,{client:k,isClientReady:c})))},mr=()=>{if(pr(be))throw new ct({code:"configuration_error",error:"Found multiple instances of PrivyProvider, ensure there is only one mounted in your application tree."})};import*as de from"expo-apple-authentication";import{PrivyClientError as vr}from"@privy-io/js-sdk-core";function lt(e){return p(this,null,function*(){try{return yield de.signInAsync({state:e.state,requestedScopes:[de.AppleAuthenticationScope.EMAIL,de.AppleAuthenticationScope.FULL_NAME]})}catch(t){throw t instanceof Error&&"code"in t&&t.code==="ERR_REQUEST_CANCELED"?new vr({error:"Apple login was cancelled",code:e.isLogin?"login_with_oauth_was_cancelled_by_user":"link_with_oauth_was_cancelled_by_user"}):t}})}var Pe=(e={})=>{let{oAuthState:t,setOAuthState:r,oAuthCallbacks:o,client:n}=fr(be),d=Fe(),i=e.action?e.action==="login":!d;hr(()=>{o.current={onSuccess:e.onSuccess,onError:e.onError}},[e.onSuccess,e.onError]);let c=pt(a=>{var v;let l=K(a);return r({status:"error",error:l}),(v=e==null?void 0:e.onError)==null||v.call(e,l),l},[e==null?void 0:e.onError]);return{start:pt(function(w){return p(this,arguments,function*({provider:l,redirectUri:v,isLegacyAppleIosBehaviorEnabled:f=!1,disableSignup:g}){var u,b,y;r({status:"loading"});let h=Te();try{if(h&&e.action==="login")throw new H({code:"attempted_login_with_oauth_while_already_logged_in",error:"Already logged in, if trying to link an OAuth account use `useLinkWithOAuth`"});if(!h&&e.action==="link")throw new H({code:"attempted_link_oauth_before_logged_in",error:"Must be logged in to link an OAuth account, use `useLoginWithOAuth`"});let m=te.createURL(v||"/"),{url:_}=yield n.auth.oauth.generateURL(l,m),S,E;if(yt.OS==="ios"&&l==="apple"&&!f){let F=(u=new URL(_).searchParams.get("state"))!=null?u:"",P=yield lt({state:F,isLogin:i});if(!P.authorizationCode||!P.state)throw new H({error:"OAuth invalid credentials",code:i?"login_with_oauth_returned_with_invalid_credentials":"link_with_oauth_returned_with_invalid_credentials"});if(i){let G=oe(),re=yield n.auth.oauth.loginWithCode(P.authorizationCode,P.state,l,"raw",g?"no-signup":"login-or-sign-up",{embedded:G==null?void 0:G.embedded});S=re.user,E=re.is_new_user}else({user:S}=yield n.auth.oauth.linkWithCode(P.authorizationCode,P.state,l,"raw"));return(b=e==null?void 0:e.onSuccess)==null||b.call(e,S,E),r({status:"done"}),S!=null?S:void 0}let L=yt.OS==="android"?_.replace("x.com","twitter.com"):_,I=yield ce.openAuthSessionAsync(L,m);if(I.type!=="success")throw[ce.WebBrowserResultType.CANCEL,ce.WebBrowserResultType.DISMISS].includes(I.type)?new H({error:"OAuth was cancelled",code:i?"login_with_oauth_was_cancelled_by_user":"link_with_oauth_was_cancelled_by_user"}):new H({error:"OAuth session failed",code:i?"failed_to_complete_login_with_oauth":"failed_to_complete_link_with_oauth"});let{queryParams:B}=te.parse(I.url),{privy_oauth_state:V,privy_oauth_code:q}=B;if(!q||!V)throw new H({error:"OAuth invalid credentials",code:i?"login_with_oauth_returned_with_invalid_credentials":"link_with_oauth_returned_with_invalid_credentials"});if(i){let T=oe(),F=yield n.auth.oauth.loginWithCode(q,V,l,void 0,g?"no-signup":"login-or-sign-up",{embedded:T==null?void 0:T.embedded});S=F.user,E=F.is_new_user}else({user:S}=yield n.auth.oauth.linkWithCode(q,V,l));return(y=e==null?void 0:e.onSuccess)==null||y.call(e,S,E),yield te.openURL(I.url.split("?")[0]),r({status:"done"}),S!=null?S:void 0}catch(m){throw c(m),m}})},[n,r,c]),state:t}};function Qa(e){let{state:t,start:r}=Pe(O(A({},e),{action:"login"}));return{state:t,login:r}}function $a(e){let{state:t,start:r}=Pe(O(A({},e),{action:"link"}));return{state:t,link:r}}function Za(e){return Pe(e)}var at=()=>{if(typeof ut!="string")throw new H({error:"Cannot determine native application ID. Please make sure `expo-application` is installed as a dependency and that `ios.bundleId` or `android.package` is set.",code:"invalid_native_app_id"});return ut};function nt(e){return{get(t){return e.get(t.replaceAll(":","-"))},put(t,r){return e.put(t.replaceAll(":","-"),r)},del(t){return e.del(t.replaceAll(":","-"))},getKeys:()=>p(this,null,function*(){return[]})}}var he={get(e){return x.getItemAsync(e,{keychainAccessible:x.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY})},put(e,t){return x.setItemAsync(e,t,{keychainAccessible:x.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY})},del(e){return x.deleteItemAsync(e,{keychainAccessible:x.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY})},getKeys:()=>p(void 0,null,function*(){return[]})};import{PrivyClientError as wr}from"@privy-io/js-sdk-core";var br=e=>p(void 0,null,function*(){var o;let r=yield(yield import("react-native-passkeys")).create({rp:e.rp,user:e.user,challenge:e.challenge,pubKeyCredParams:e.pubKeyCredParams,excludeCredentials:e.excludeCredentials,authenticatorSelection:e.authenticatorSelection,timeout:12e4});if(!r)throw new wr({code:"failed_to_create_passkey",error:"Could not create passkey"});return O(A({},r),{type:(o=r.type)!=null?o:"public-key",clientExtensionResults:{}})});import{PrivyClientError as gr}from"@privy-io/js-sdk-core";var Sr=e=>p(void 0,null,function*(){var o;let r=yield(yield import("react-native-passkeys")).get({rpId:e.rpId,challenge:e.challenge,allowCredentials:e.allowCredentials,timeout:12e4});if(!r)throw new gr({code:"no_passkey_found_for_challenge",error:"Could not find a matching passkey to login with"});return O(A({},r),{type:(o=r.type)!=null?o:"public-key",clientExtensionResults:{}})});function mn(e){var t;return{id:e.id,client_extension_results:{app_id:e.clientExtensionResults.appid,cred_props:e.clientExtensionResults.credProps,hmac_create_secret:e.clientExtensionResults.hmacCreateSecret},raw_id:e.rawId,type:e.type,authenticator_attachment:(t=e.authenticatorAttachment)!=null?t:"platform",response:{authenticator_data:e.response.authenticatorData,client_data_json:e.response.clientDataJSON,signature:e.response.signature,user_handle:e.response.userHandle}}}function vn(e){var t,r,o,n;return{challenge:e.challenge,rpId:e.rp_id,extensions:{appid:(t=e.extensions)==null?void 0:t.app_id,credProps:(r=e.extensions)==null?void 0:r.cred_props,hmacCreateSecret:(o=e.extensions)==null?void 0:o.hmac_create_secret},timeout:e.timeout,allowCredentials:(n=e.allow_credentials)==null?void 0:n.map(({id:d,type:i,transports:c})=>({id:d,type:i,transports:c})),userVerification:e.user_verification}}function fn(e){var t,r,o,n,d,i,c,s;return{rp:e.rp,user:{id:e.user.id,name:e.user.name,displayName:e.user.display_name},challenge:e.challenge,pubKeyCredParams:e.pub_key_cred_params,extensions:{hmacCreateSecret:(t=e.extensions)==null?void 0:t.hmac_create_secret,credProps:(o=(r=e.extensions)==null?void 0:r.cred_props)==null?void 0:o.rk,appid:(n=e.extensions)==null?void 0:n.app_id},attestation:e.attestation,excludeCredentials:e.exclude_credentials,authenticatorSelection:{authenticatorAttachment:(d=e.authenticator_selection)==null?void 0:d.authenticator_attachment,residentKey:(i=e.authenticator_selection)==null?void 0:i.resident_key,userVerification:(c=e.authenticator_selection)==null?void 0:c.user_verification,requireResidentKey:(s=e.authenticator_selection)==null?void 0:s.require_resident_key}}}export{oe as a,Te as b,Ur as c,j as d,Fe as e,xe as f,Ar as g,ke as h,He as i,K as j,ho as k,_o as l,Uo as m,Qa as n,$a as o,Za as p,he as q,it as r,be as s,Ta as t,Fa as u,br as v,Sr as w,mn as x,vn as y,fn as z};