UNPKG

expo-ii-integration

Version:

Expo library to enable smartphone native applications to invoke Internet Identity through a web application

23 lines (22 loc) 10.9 kB
"use strict";var le=Object.defineProperty;var fe=(t,r,o)=>r in t?le(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o;var T=(t,r,o)=>fe(t,typeof r!="symbol"?r+"":r,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("react"),de=require("expo-linking"),ye=require("expo-router"),A=require("@dfinity/identity"),z=require("expo-storage-universal"),H=require("@dfinity/agent"),Y=require("expo-icp-frontend-helpers"),F=require("expo-icp-app-connect");function me(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const o in t)if(o!=="default"){const a=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(r,o,a.get?a:{enumerable:!0,get:()=>t[o]})}}return r.default=t,Object.freeze(r)}const pe=me(de);var W={exports:{}},I={};/** * @license React * react-jsx-runtime.production.js * * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var G;function ge(){if(G)return I;G=1;var t=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function o(a,i,c){var f=null;if(c!==void 0&&(f=""+c),i.key!==void 0&&(f=""+i.key),"key"in i){c={};for(var y in i)y!=="key"&&(c[y]=i[y])}else c=i;return i=c.ref,{$$typeof:t,type:a,key:f,ref:i!==void 0?i:null,props:c}}return I.Fragment=r,I.jsx=o,I.jsxs=o,I}var O={};/** * @license React * react-jsx-runtime.development.js * * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var X;function ve(){return X||(X=1,process.env.NODE_ENV!=="production"&&function(){function t(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===se?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case b:return"Fragment";case w:return"Profiler";case k:return"StrictMode";case ne:return"Suspense";case oe:return"SuspenseList";case ie:return"Activity"}if(typeof e=="object")switch(typeof e.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),e.$$typeof){case _:return"Portal";case re:return(e.displayName||"Context")+".Provider";case ee:return(e._context.displayName||"Context")+".Consumer";case te:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ae:return n=e.displayName||null,n!==null?n:t(e.type)||"Memo";case L:n=e._payload,e=e._init;try{return t(e(n))}catch{}}return null}function r(e){return""+e}function o(e){try{r(e);var n=!1}catch{n=!0}if(n){n=console;var s=n.error,u=typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object";return s.call(n,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",u),r(e)}}function a(e){if(e===b)return"<>";if(typeof e=="object"&&e!==null&&e.$$typeof===L)return"<...>";try{var n=t(e);return n?"<"+n+">":"<...>"}catch{return"<...>"}}function i(){var e=j.A;return e===null?null:e.getOwner()}function c(){return Error("react-stack-top-frame")}function f(e){if(V.call(e,"key")){var n=Object.getOwnPropertyDescriptor(e,"key").get;if(n&&n.isReactWarning)return!1}return e.key!==void 0}function y(e,n){function s(){q||(q=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",n))}s.isReactWarning=!0,Object.defineProperty(e,"key",{get:s,configurable:!0})}function E(){var e=t(this.type);return M[e]||(M[e]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),e=this.props.ref,e!==void 0?e:null}function p(e,n,s,u,g,d,C,D){return s=d.ref,e={$$typeof:h,type:e,key:n,props:d,_owner:g},(s!==void 0?s:null)!==null?Object.defineProperty(e,"ref",{enumerable:!1,get:E}):Object.defineProperty(e,"ref",{enumerable:!1,value:null}),e._store={},Object.defineProperty(e._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(e,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(e,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:C}),Object.defineProperty(e,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:D}),Object.freeze&&(Object.freeze(e.props),Object.freeze(e)),e}function P(e,n,s,u,g,d,C,D){var l=n.children;if(l!==void 0)if(u)if(ce(l)){for(u=0;u<l.length;u++)R(l[u]);Object.freeze&&Object.freeze(l)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else R(l);if(V.call(n,"key")){l=t(e);var S=Object.keys(n).filter(function(ue){return ue!=="key"});u=0<S.length?"{key: someKey, "+S.join(": ..., ")+": ...}":"{key: someKey}",K[l+u]||(S=0<S.length?"{"+S.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX: let props = %s; <%s {...props} /> React keys must be passed directly to JSX without using spread: let props = %s; <%s key={someKey} {...props} />`,u,l,S,l),K[l+u]=!0)}if(l=null,s!==void 0&&(o(s),l=""+s),f(n)&&(o(n.key),l=""+n.key),"key"in n){s={};for(var $ in n)$!=="key"&&(s[$]=n[$])}else s=n;return l&&y(s,typeof e=="function"?e.displayName||e.name||"Unknown":e),p(e,l,d,g,i(),s,C,D)}function R(e){typeof e=="object"&&e!==null&&e.$$typeof===h&&e._store&&(e._store.validated=1)}var m=v,h=Symbol.for("react.transitional.element"),_=Symbol.for("react.portal"),b=Symbol.for("react.fragment"),k=Symbol.for("react.strict_mode"),w=Symbol.for("react.profiler"),ee=Symbol.for("react.consumer"),re=Symbol.for("react.context"),te=Symbol.for("react.forward_ref"),ne=Symbol.for("react.suspense"),oe=Symbol.for("react.suspense_list"),ae=Symbol.for("react.memo"),L=Symbol.for("react.lazy"),ie=Symbol.for("react.activity"),se=Symbol.for("react.client.reference"),j=m.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,V=Object.prototype.hasOwnProperty,ce=Array.isArray,N=console.createTask?console.createTask:function(){return null};m={"react-stack-bottom-frame":function(e){return e()}};var q,M={},U=m["react-stack-bottom-frame"].bind(m,c)(),J=N(a(c)),K={};O.Fragment=b,O.jsx=function(e,n,s,u,g){var d=1e4>j.recentlyCreatedOwnerStacks++;return P(e,n,s,!1,u,g,d?Error("react-stack-top-frame"):U,d?N(a(e)):J)},O.jsxs=function(e,n,s,u,g){var d=1e4>j.recentlyCreatedOwnerStacks++;return P(e,n,s,!0,u,g,d?Error("react-stack-top-frame"):U,d?N(a(e)):J)}}()),O}process.env.NODE_ENV==="production"?W.exports=ge():W.exports=ve();var Ee=W.exports;const B=v.createContext(void 0),he=()=>{const t=v.useContext(B);if(t===void 0)throw new Error("useIIIntegrationContext must be used within an IIIntegrationProvider");return t},be=({children:t,value:r})=>Ee.jsx(B.Provider,{value:r,children:t}),we=async({appKeyStorage:t,delegationStorage:r,onSuccess:o,onError:a,onFinally:i})=>{try{const c=await t.find(),f=await r.find();c&&f&&o()}catch(c){a(c)}finally{i()}};class Z{constructor(r,o){T(this,"storage");T(this,"key");this.storage=r,this.key=o}async find(){const r=await this.storage.find(this.key);if(r)return A.Ed25519KeyIdentity.fromJSON(r)}async retrieve(){const r=await this.find();if(!r)throw new Error(`No value found for key ${this.key}`);return r}async save(r){return this.storage.save(this.key,JSON.stringify(r.toJSON()))}async remove(){return this.storage.remove(this.key)}}class Q{constructor(r,o){T(this,"storage");T(this,"key");this.storage=r,this.key=o}async find(){const r=await this.storage.find(this.key);if(r)return A.DelegationChain.fromJSON(r)}async retrieve(){const r=await this.find();if(!r)throw new Error(`No value found for key ${this.key}`);return r}async save(r){return this.storage.save(this.key,JSON.stringify(r.toJSON()))}async remove(){return this.storage.remove(this.key)}}const Re=async({appKeyStorage:t,delegationStorage:r})=>{const o=await t.find(),a=await r.find();if(o&&a)try{return await Y.buildIdentity({appKey:o,delegationChain:a})}catch(i){throw Y.isAuthenticationExpiredError(i)&&await r.remove(),i}else if(!o){const i=A.Ed25519KeyIdentity.generate();await t.save(i),await r.remove()}},Se=async({appKeyStorage:t,delegationStorage:r,onError:o})=>{try{const a=await Re({appKeyStorage:t,delegationStorage:r});return a||new H.AnonymousIdentity}catch(a){throw console.error("Get identity failed:",a),o(a),a}},_e=async({iiIntegrationUrl:t,deepLinkType:r,redirectPath:o,appKeyStorage:a,redirectPathStorage:i,sessionIdStorage:c,cryptoModule:f,openBrowserOptions:y={}})=>{const E=await A.Ed25519KeyIdentity.generate();await a.save(E);const p=H.toHex(E.getPublicKey().toDer());console.log("login redirectPath",o),await F.connectToApp({url:t,params:{pubkey:p,deepLinkType:r,pathname:"/"},redirectPath:o,redirectPathStorage:i,sessionIdStorage:c,cryptoModule:f,openBrowserOptions:y})},ke=async({delegationStorage:t,onFinally:r})=>{try{await t.remove()}finally{r()}},Te=async({delegation:t,delegationStorage:r,appKeyStorage:o})=>{const a=A.DelegationChain.fromJSON(t),i=await o.retrieve(),c=await Y.buildIdentity({appKey:i,delegationChain:a});return await r.save(a),c},x="expo-ii-integration",Ie=({iiIntegrationUrl:t,deepLinkType:r,secureStorage:o,regularStorage:a,cryptoModule:i})=>{const c=pe.useURL(),[f,y]=v.useState(!1),[E,p]=v.useState(!1),[P,R]=v.useState(void 0),m=new Z(o,`${x}.appKey`),h=new Q(a,`${x}.delegation`),_=new z.StringValueStorageWrapper(a,`${x}.redirectPath`),b=new z.StringValueStorageWrapper(a,`${x}.sessionId`);return v.useEffect(()=>{f||we({appKeyStorage:m,delegationStorage:h,onSuccess:()=>{p(!0)},onError:R,onFinally:()=>y(!0)})},[]),v.useEffect(()=>{E||!c||F.handleURL({url:new URL(c),sessionIdStorage:b,onSuccess:async({delegation:k})=>{await Te({delegation:k,delegationStorage:h,appKeyStorage:m}),console.log("Authenticated from delegation"),p(!0),await b.remove();const w=await _.find();w&&(console.log("Redirecting to",w),await _.remove(),ye.router.replace(w)),F.dismissBrowser()},onError:R})},[c]),{isAuthReady:f,isAuthenticated:E,getIdentity:()=>Se({appKeyStorage:m,delegationStorage:h,onError:()=>p(!1)}),login:({redirectPath:k,openBrowserOptions:w}={})=>_e({iiIntegrationUrl:t,deepLinkType:r,appKeyStorage:m,redirectPath:k,redirectPathStorage:_,sessionIdStorage:b,cryptoModule:i,openBrowserOptions:w}),logout:()=>ke({delegationStorage:h,onFinally:()=>p(!1)}),authError:P,clearAuthError:()=>R(void 0)}};exports.DelegationChainValueStorageWrapper=Q;exports.Ed25519KeyIdentityValueStorageWrapper=Z;exports.IIIntegrationProvider=be;exports.useIIIntegration=Ie;exports.useIIIntegrationContext=he;