ii-integration-helpers
Version:
A TypeScript library that provides helper functions for implementing the Proxy Web App component of Internet Identity (II) integration for mobile applications.
2 lines (1 loc) • 3.04 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const _=require("@dfinity/agent"),p=require("@dfinity/identity"),y=require("expo-icp-frontend-helpers"),g=require("expo-icp-app-connect-helpers"),h=require("@dfinity/auth-client"),m=e=>p.Ed25519PublicKey.fromDer(_.fromHex(e)),E=e=>JSON.stringify(e.toJSON()),S=({middleDelegationIdentity:e,appPublicKey:t,expiration:n})=>p.DelegationChain.create(e,t,n,{previous:e.getDelegation()}),R=({localIPAddress:e,dfxNetwork:t,internetIdentityCanisterId:n,frontendCanisterId:o,expoScheme:r})=>{const{pubkey:i,deepLinkType:s,sessionId:c,pathname:l}=g.parseDeepLinkConnectionParams(window.location.search,"pubkey"),a=m(i),d=g.buildInternetIdentityURL({localIPAddress:e,dfxNetwork:t,targetCanisterId:n}),O=y.buildDeepLink({deepLinkType:s,localIPAddress:e,dfxNetwork:t,frontendCanisterId:o,expoScheme:r,pathname:l});return{appPublicKey:a,internetIdentityURL:d,deepLink:O,sessionId:c}},b=({delegationChain:e,sessionId:t})=>{const n=E(e),o=new URLSearchParams;return y.updateParams(o,{delegation:n,sessionId:t}),o.toString()},I={LOGIN_PROCESS:"Failed to complete login process"},D="ii-login-button",P="back-to-app-button",w=(e,t)=>`Internet Identity ${e}: ${t instanceof Error?t.message:String(t)}`,C=({deepLink:e,delegationChain:t,sessionId:n,iiLoginButton:o,backToAppButton:r})=>{const i=b({delegationChain:t,sessionId:n});o.style.display="none",r.style.display="block",r.addEventListener("click",()=>{r.textContent="Processing...",r.style.opacity="0.7",r.style.cursor="wait",window.open(`${e.toString()}#${i}`,"_self")})},f=()=>{const e=document.getElementById(D),t=document.getElementById(P);if(!e||!t)throw new Error("Required buttons not found");return{iiLoginButton:e,backToAppButton:t}},L=async({internetIdentityURL:e})=>{const t=await p.ECDSAKeyIdentity.generate(),n=await h.AuthClient.create({identity:t});return async()=>new Promise((o,r)=>{n.login({identityProvider:e.toString(),onSuccess:()=>{const i=n.getIdentity();o(i)},onError:i=>{r(new Error(i||"Unknown error"))}})})},u=e=>{const t=document.querySelector("#error");if(!t){console.error("Error element not found");return}t.textContent=e,t.style.display=e?"block":"none"},A=async({iiLoginButton:e,backToAppButton:t,deepLink:n,sessionId:o,appPublicKey:r,internetIdentityURL:i,ttlMs:s})=>{const c=await L({internetIdentityURL:i});e.addEventListener("click",async l=>{l.preventDefault(),u("");try{const a=await c(),d=await S({middleDelegationIdentity:a,appPublicKey:r,expiration:new Date(Date.now()+s)});C({deepLink:n,sessionId:o,delegationChain:d,iiLoginButton:e,backToAppButton:t})}catch(a){u(w(I.LOGIN_PROCESS,a))}})};exports.BACK_TO_APP_BUTTON_ID=P;exports.ERROR_MESSAGES=I;exports.LOGIN_BUTTON_ID=D;exports.buildAppPublicKey=m;exports.buildDelegationString=E;exports.buildMiddleToAppDelegationChain=S;exports.buildParams=R;exports.buildURIFragment=b;exports.formatError=w;exports.handleAppDelegation=C;exports.prepareButtons=f;exports.prepareLogin=L;exports.renderError=u;exports.setupLoginButtonHandler=A;