@imtbl/auth 2.10.7-alpha.4 → 2.10.7-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +13 -13
- package/dist/node/index.cjs +25 -26
- package/dist/node/index.js +17 -17
- package/dist/types/Auth.d.ts +5 -12
- package/dist/types/authManager.d.ts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/types.d.ts +10 -17
- package/dist/types/utils/metrics.d.ts +2 -0
- package/package.json +4 -4
- package/src/Auth.ts +89 -77
- package/src/authManager.ts +7 -21
- package/src/index.ts +1 -2
- package/src/types.ts +7 -17
- package/src/utils/metrics.ts +29 -0
package/dist/browser/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { UserManager, User, ErrorTimeout, ErrorResponse, InMemoryWebStorage, WebStorageStateStore } from 'oidc-client-ts';
|
|
2
2
|
import Or, { isAxiosError } from 'axios';
|
|
3
3
|
import Re from 'jwt-decode';
|
|
4
|
-
import { getDetail, Detail, track, identify } from '@imtbl/metrics';
|
|
4
|
+
import { getDetail, Detail, track, trackFlow, trackError, identify } from '@imtbl/metrics';
|
|
5
5
|
import gr from 'localforage';
|
|
6
6
|
|
|
7
|
-
var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Be=Object.getPrototypeOf,Ke=Object.prototype.hasOwnProperty;var $=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ze=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports);var We=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ge(e))!Ke.call(r,i)&&i!==t&&se(r,i,{get:()=>e[i],enumerable:!(n=Ve(e,i))||n.enumerable});return r};var $e=(r,e,t)=>(t=r!=null?Fe(Be(r)):{},We(se(t,"default",{value:r,enumerable:!0}),r));function q(r){throw new Error("Node.js process "+r+" is not supported by JSPM core outside of Node.js")}function Ye(){!P||!T||(P=!1,T.length?C=T.concat(C):S=-1,C.length&&ae());}function ae(){if(!P){var r=setTimeout(Ye,0);P=!0;for(var e=C.length;e;){for(T=C,C=[];++S<e;)T&&T[S].run();S=-1,e=C.length;}T=null,P=!1,clearTimeout(r);}}function je(r){var e=new Array(arguments.length-1);if(arguments.length>1)for(var t=1;t<arguments.length;t++)e[t-1]=arguments[t];C.push(new le(r,e)),C.length===1&&!P&&setTimeout(ae,0);}function le(r,e){this.fun=r,this.array=e;}function h(){}function ut(r){q("_linkedBinding");}function gt(r){q("dlopen");}function ht(){return []}function vt(){return []}function Pt(r,e){if(!r)throw new Error(e||"assertion error")}function At(){return !1}function Yt(){return O.now()/1e3}function z(r){var e=Math.floor((Date.now()-O.now())*.001),t=O.now()*.001,n=Math.floor(t)+e,i=Math.floor(t%1*1e9);return r&&(n=n-r[0],i=i-r[1],i<0&&(n--,i+=j)),[n,i]}function R(){return p}function or(r){return []}var C,P,T,S,ze,qe,Xe,Qe,Je,et,tt,rt,nt,it,ot,st,at,lt,dt,ct,pt,mt,ft,Et,_t,X,Ct,yt,Ot,Rt,Lt,Tt,bt,wt,It,xt,kt,Mt,Ut,Nt,Dt,St,Ht,Ft,Vt,Gt,Bt,Kt,Zt,Wt,$t,O,Y,j,jt,zt,qt,Xt,Qt,Jt,er,tr,rr,nr,ir,p,de=$(()=>{l();a();C=[],P=!1,S=-1;le.prototype.run=function(){this.fun.apply(null,this.array);};ze="browser",qe="x64",Xe="browser",Qe={PATH:"/usr/bin",LANG:navigator.language+".UTF-8",PWD:"/",HOME:"/home",TMP:"/tmp"},Je=["/usr/bin/node"],et=[],tt="v16.8.0",rt={},nt=function(r,e){console.warn((e?e+": ":"")+r);},it=function(r){q("binding");},ot=function(r){return 0},st=function(){return "/"},at=function(r){},lt={name:"node",sourceUrl:"",headersUrl:"",libUrl:""};dt=h,ct=[];pt={},mt=!1,ft={};Et=h,_t=h,X=function(){return {}},Ct=X,yt=X,Ot=h,Rt=h,Lt=h,Tt={};bt={inspector:!1,debug:!1,uv:!1,ipv6:!1,tls_alpn:!1,tls_sni:!1,tls_ocsp:!1,tls:!1,cached_builtins:!0},wt=h,It=h;xt=h,kt=h,Mt=h,Ut=h,Nt=h,Dt=void 0,St=void 0,Ht=void 0,Ft=h,Vt=2,Gt=1,Bt="/bin/usr/node",Kt=9229,Zt="node",Wt=[],$t=h,O={now:typeof performance<"u"?performance.now.bind(performance):void 0,timing:typeof performance<"u"?performance.timing:void 0};O.now===void 0&&(Y=Date.now(),O.timing&&O.timing.navigationStart&&(Y=O.timing.navigationStart),O.now=()=>Date.now()-Y);j=1e9;z.bigint=function(r){var e=z(r);return typeof BigInt>"u"?e[0]*j+e[1]:BigInt(e[0]*j)+BigInt(e[1])};jt=10,zt={},qt=0;Xt=R,Qt=R,Jt=R,er=R,tr=R,rr=h,nr=R,ir=R;p={version:tt,versions:rt,arch:qe,platform:Xe,release:lt,_rawDebug:dt,moduleLoadList:ct,binding:it,_linkedBinding:ut,_events:zt,_eventsCount:qt,_maxListeners:jt,on:R,addListener:Xt,once:Qt,off:Jt,removeListener:er,removeAllListeners:tr,emit:rr,prependListener:nr,prependOnceListener:ir,listeners:or,domain:pt,_exiting:mt,config:ft,dlopen:gt,uptime:Yt,_getActiveRequests:ht,_getActiveHandles:vt,reallyExit:Et,_kill:_t,cpuUsage:X,resourceUsage:Ct,memoryUsage:yt,kill:Ot,exit:Rt,openStdin:Lt,allowedNodeEnvironmentFlags:Tt,assert:Pt,features:bt,_fatalExceptions:wt,setUncaughtExceptionCaptureCallback:It,hasUncaughtExceptionCaptureCallback:At,emitWarning:nt,nextTick:je,_tickCallback:xt,_debugProcess:kt,_debugEnd:Mt,_startProfilerIdleNotifier:Ut,_stopProfilerIdleNotifier:Nt,stdout:Dt,stdin:Ht,stderr:St,abort:Ft,umask:ot,chdir:at,cwd:st,env:Qe,title:ze,argv:Je,execArgv:et,pid:Vt,ppid:Gt,execPath:Bt,debugPort:Kt,hrtime:z,argv0:Zt,_preload_modules:Wt,setSourceMapsEnabled:$t};});var a=$(()=>{de();});var l=$(()=>{});var Se=Ze((Ti,ne)=>{l();a();var I=typeof Reflect=="object"?Reflect:null,be=I&&typeof I.apply=="function"?I.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)},K;I&&typeof I.ownKeys=="function"?K=I.ownKeys:Object.getOwnPropertySymbols?K=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:K=function(e){return Object.getOwnPropertyNames(e)};function Vr(r){console&&console.warn&&console.warn(r);}var Ie=Number.isNaN||function(e){return e!==e};function c(){c.init.call(this);}ne.exports=c;ne.exports.once=Zr;c.EventEmitter=c;c.prototype._events=void 0;c.prototype._eventsCount=0;c.prototype._maxListeners=void 0;var we=10;function Z(r){if(typeof r!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r)}Object.defineProperty(c,"defaultMaxListeners",{enumerable:!0,get:function(){return we},set:function(r){if(typeof r!="number"||r<0||Ie(r))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+r+".");we=r;}});c.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0;};c.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||Ie(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function Ae(r){return r._maxListeners===void 0?c.defaultMaxListeners:r._maxListeners}c.prototype.getMaxListeners=function(){return Ae(this)};c.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var i=e==="error",o=this._events;if(o!==void 0)i=i&&o.error===void 0;else if(!i)return !1;if(i){var s;if(t.length>0&&(s=t[0]),s instanceof Error)throw s;var d=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw d.context=s,d}var f=o[e];if(f===void 0)return !1;if(typeof f=="function")be(f,this,t);else for(var _=f.length,u=Ne(f,_),n=0;n<_;++n)be(u[n],this,t);return !0};function xe(r,e,t,n){var i,o,s;if(Z(t),o=r._events,o===void 0?(o=r._events=Object.create(null),r._eventsCount=0):(o.newListener!==void 0&&(r.emit("newListener",e,t.listener?t.listener:t),o=r._events),s=o[e]),s===void 0)s=o[e]=t,++r._eventsCount;else if(typeof s=="function"?s=o[e]=n?[t,s]:[s,t]:n?s.unshift(t):s.push(t),i=Ae(r),i>0&&s.length>i&&!s.warned){s.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=r,d.type=e,d.count=s.length,Vr(d);}return r}c.prototype.addListener=function(e,t){return xe(this,e,t,!1)};c.prototype.on=c.prototype.addListener;c.prototype.prependListener=function(e,t){return xe(this,e,t,!0)};function Gr(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function ke(r,e,t){var n={fired:!1,wrapFn:void 0,target:r,type:e,listener:t},i=Gr.bind(n);return i.listener=t,n.wrapFn=i,i}c.prototype.once=function(e,t){return Z(t),this.on(e,ke(this,e,t)),this};c.prototype.prependOnceListener=function(e,t){return Z(t),this.prependListener(e,ke(this,e,t)),this};c.prototype.removeListener=function(e,t){var n,i,o,s,d;if(Z(t),i=this._events,i===void 0)return this;if(n=i[e],n===void 0)return this;if(n===t||n.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete i[e],i.removeListener&&this.emit("removeListener",e,n.listener||t));else if(typeof n!="function"){for(o=-1,s=n.length-1;s>=0;s--)if(n[s]===t||n[s].listener===t){d=n[s].listener,o=s;break}if(o<0)return this;o===0?n.shift():Br(n,o),n.length===1&&(i[e]=n[0]),i.removeListener!==void 0&&this.emit("removeListener",e,d||t);}return this};c.prototype.off=c.prototype.removeListener;c.prototype.removeAllListeners=function(e){var t,n,i;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[e]),this;if(arguments.length===0){var o=Object.keys(n),s;for(i=0;i<o.length;++i)s=o[i],s!=="removeListener"&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(t=n[e],typeof t=="function")this.removeListener(e,t);else if(t!==void 0)for(i=t.length-1;i>=0;i--)this.removeListener(e,t[i]);return this};function Me(r,e,t){var n=r._events;if(n===void 0)return [];var i=n[e];return i===void 0?[]:typeof i=="function"?t?[i.listener||i]:[i]:t?Kr(i):Ne(i,i.length)}c.prototype.listeners=function(e){return Me(this,e,!0)};c.prototype.rawListeners=function(e){return Me(this,e,!1)};c.listenerCount=function(r,e){return typeof r.listenerCount=="function"?r.listenerCount(e):Ue.call(r,e)};c.prototype.listenerCount=Ue;function Ue(r){var e=this._events;if(e!==void 0){var t=e[r];if(typeof t=="function")return 1;if(t!==void 0)return t.length}return 0}c.prototype.eventNames=function(){return this._eventsCount>0?K(this._events):[]};function Ne(r,e){for(var t=new Array(e),n=0;n<e;++n)t[n]=r[n];return t}function Br(r,e){for(;e+1<r.length;e++)r[e]=r[e+1];r.pop();}function Kr(r){for(var e=new Array(r.length),t=0;t<e.length;++t)e[t]=r[t].listener||r[t];return e}function Zr(r,e){return new Promise(function(t,n){function i(s){r.removeListener(e,o),n(s);}function o(){typeof r.removeListener=="function"&&r.removeListener("error",i),t([].slice.call(arguments));}De(r,e,o,{once:!0}),e!=="error"&&Wr(r,i,{once:!0});})}function Wr(r,e,t){typeof r.on=="function"&&De(r,"error",e,t);}function De(r,e,t,n){if(typeof r.on=="function")n.once?r.once(e,t):r.on(e,t);else if(typeof r.addEventListener=="function")r.addEventListener(e,function i(o){n.once&&r.removeEventListener(e,i),t(o);});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof r)}});l();a();l();a();l();a();l();a();var ce="pkce_state",ue="pkce_verifier",ar=3600,x=class{isTokenValid(e){try{let n=Re(e).exp??0,i=Date.now()/1e3+ar;return n>i}catch{return !1}}savePKCEData(e){localStorage.setItem(ce,e.state),localStorage.setItem(ue,e.verifier);}getPKCEData(){let e=localStorage.getItem(ce),t=localStorage.getItem(ue);return e&&t?{state:e,verifier:t}:null}};l();a();var lr=(...r)=>{if(typeof p>"u")return;p?.env?.JEST_WORKER_ID===void 0&&console.warn(...r);},k={warn:lr};l();a();function pe(r){try{let e=Re(r),t=Math.floor(Date.now()/1e3);return e.exp?e.exp<=t+30:!0}catch{return !0}}function me(r){let{id_token:e,access_token:t}=r;return !t||!e?!0:pe(t)||pe(e)}l();a();var H=(m=>(m.AUTHENTICATION_ERROR="AUTHENTICATION_ERROR",m.INVALID_CONFIGURATION="INVALID_CONFIGURATION",m.WALLET_CONNECTION_ERROR="WALLET_CONNECTION_ERROR",m.NOT_LOGGED_IN_ERROR="NOT_LOGGED_IN_ERROR",m.SILENT_LOGIN_ERROR="SILENT_LOGIN_ERROR",m.REFRESH_TOKEN_ERROR="REFRESH_TOKEN_ERROR",m.USER_REGISTRATION_ERROR="USER_REGISTRATION_ERROR",m.USER_NOT_REGISTERED_ERROR="USER_NOT_REGISTERED_ERROR",m.LOGOUT_ERROR="LOGOUT_ERROR",m.TRANSFER_ERROR="TRANSFER_ERROR",m.CREATE_ORDER_ERROR="CREATE_ORDER_ERROR",m.CANCEL_ORDER_ERROR="CANCEL_ORDER_ERROR",m.EXCHANGE_TRANSFER_ERROR="EXCHANGE_TRANSFER_ERROR",m.CREATE_TRADE_ERROR="CREATE_TRADE_ERROR",m.OPERATION_NOT_SUPPORTED_ERROR="OPERATION_NOT_SUPPORTED_ERROR",m.LINK_WALLET_ALREADY_LINKED_ERROR="LINK_WALLET_ALREADY_LINKED_ERROR",m.LINK_WALLET_MAX_WALLETS_LINKED_ERROR="LINK_WALLET_MAX_WALLETS_LINKED_ERROR",m.LINK_WALLET_VALIDATION_ERROR="LINK_WALLET_VALIDATION_ERROR",m.LINK_WALLET_DUPLICATE_NONCE_ERROR="LINK_WALLET_DUPLICATE_NONCE_ERROR",m.LINK_WALLET_GENERIC_ERROR="LINK_WALLET_GENERIC_ERROR",m.SERVICE_UNAVAILABLE_ERROR="SERVICE_UNAVAILABLE_ERROR",m))(H||{});function ur(r){return "code"in r&&"message"in r}var v=class extends Error{type;constructor(e,t){super(e),this.type=t;}},L=async(r,e)=>{try{return await r()}catch(t){let n;throw t instanceof v&&t.type==="SERVICE_UNAVAILABLE_ERROR"?new v(t.message,t.type):(isAxiosError(t)&&t.response?.data&&ur(t.response.data)?n=t.response.data.message:n=t.message,new v(n,e))}};l();a();var fe=(t=>(t.IMX="imx",t.ZKEVM="zkEvm",t))(fe||{}),Q=r=>!!r.zkEvm,J=r=>!!r.imx,ge=(t=>(t.OptedIn="opted_in",t.Unsubscribed="unsubscribed",t))(ge||{}),ee=(t=>(t.LOGGED_OUT="loggedOut",t.LOGGED_IN="loggedIn",t))(ee||{});l();a();l();a();var b="passport-overlay",M="passport-overlay-contents",F=`${b}-close`,V=`${b}-try-again`,he=`
|
|
7
|
+
var He=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Be=Object.getPrototypeOf,Ke=Object.prototype.hasOwnProperty;var Y=(r,e)=>()=>(r&&(e=r(r=0)),e);var Ze=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports);var We=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ge(e))!Ke.call(r,i)&&i!==t&&se(r,i,{get:()=>e[i],enumerable:!(n=Ve(e,i))||n.enumerable});return r};var $e=(r,e,t)=>(t=r!=null?He(Be(r)):{},We(se(t,"default",{value:r,enumerable:!0}),r));function q(r){throw new Error("Node.js process "+r+" is not supported by JSPM core outside of Node.js")}function Ye(){!b||!P||(b=!1,P.length?y=P.concat(y):F=-1,y.length&&ae());}function ae(){if(!b){var r=setTimeout(Ye,0);b=!0;for(var e=y.length;e;){for(P=y,y=[];++F<e;)P&&P[F].run();F=-1,e=y.length;}P=null,b=!1,clearTimeout(r);}}function je(r){var e=new Array(arguments.length-1);if(arguments.length>1)for(var t=1;t<arguments.length;t++)e[t-1]=arguments[t];y.push(new le(r,e)),y.length===1&&!b&&setTimeout(ae,0);}function le(r,e){this.fun=r,this.array=e;}function h(){}function ut(r){q("_linkedBinding");}function gt(r){q("dlopen");}function ht(){return []}function vt(){return []}function Pt(r,e){if(!r)throw new Error(e||"assertion error")}function At(){return !1}function Yt(){return R.now()/1e3}function Q(r){var e=Math.floor((Date.now()-R.now())*.001),t=R.now()*.001,n=Math.floor(t)+e,i=Math.floor(t%1*1e9);return r&&(n=n-r[0],i=i-r[1],i<0&&(n--,i+=z)),[n,i]}function L(){return u}function or(r){return []}var y,b,P,F,ze,Qe,qe,Je,Xe,et,tt,rt,nt,it,ot,st,at,lt,dt,ct,pt,ft,mt,Et,_t,J,Ct,yt,Ot,Rt,Lt,Tt,wt,bt,It,kt,Mt,xt,Ut,Nt,Dt,St,Ft,Ht,Vt,Gt,Bt,Kt,Zt,Wt,$t,R,j,z,jt,zt,Qt,qt,Jt,Xt,er,tr,rr,nr,ir,u,de=Y(()=>{l();a();y=[],b=!1,F=-1;le.prototype.run=function(){this.fun.apply(null,this.array);};ze="browser",Qe="x64",qe="browser",Je={PATH:"/usr/bin",LANG:navigator.language+".UTF-8",PWD:"/",HOME:"/home",TMP:"/tmp"},Xe=["/usr/bin/node"],et=[],tt="v16.8.0",rt={},nt=function(r,e){console.warn((e?e+": ":"")+r);},it=function(r){q("binding");},ot=function(r){return 0},st=function(){return "/"},at=function(r){},lt={name:"node",sourceUrl:"",headersUrl:"",libUrl:""};dt=h,ct=[];pt={},ft=!1,mt={};Et=h,_t=h,J=function(){return {}},Ct=J,yt=J,Ot=h,Rt=h,Lt=h,Tt={};wt={inspector:!1,debug:!1,uv:!1,ipv6:!1,tls_alpn:!1,tls_sni:!1,tls_ocsp:!1,tls:!1,cached_builtins:!0},bt=h,It=h;kt=h,Mt=h,xt=h,Ut=h,Nt=h,Dt=void 0,St=void 0,Ft=void 0,Ht=h,Vt=2,Gt=1,Bt="/bin/usr/node",Kt=9229,Zt="node",Wt=[],$t=h,R={now:typeof performance<"u"?performance.now.bind(performance):void 0,timing:typeof performance<"u"?performance.timing:void 0};R.now===void 0&&(j=Date.now(),R.timing&&R.timing.navigationStart&&(j=R.timing.navigationStart),R.now=()=>Date.now()-j);z=1e9;Q.bigint=function(r){var e=Q(r);return typeof BigInt>"u"?e[0]*z+e[1]:BigInt(e[0]*z)+BigInt(e[1])};jt=10,zt={},Qt=0;qt=L,Jt=L,Xt=L,er=L,tr=L,rr=h,nr=L,ir=L;u={version:tt,versions:rt,arch:Qe,platform:qe,release:lt,_rawDebug:dt,moduleLoadList:ct,binding:it,_linkedBinding:ut,_events:zt,_eventsCount:Qt,_maxListeners:jt,on:L,addListener:qt,once:Jt,off:Xt,removeListener:er,removeAllListeners:tr,emit:rr,prependListener:nr,prependOnceListener:ir,listeners:or,domain:pt,_exiting:ft,config:mt,dlopen:gt,uptime:Yt,_getActiveRequests:ht,_getActiveHandles:vt,reallyExit:Et,_kill:_t,cpuUsage:J,resourceUsage:Ct,memoryUsage:yt,kill:Ot,exit:Rt,openStdin:Lt,allowedNodeEnvironmentFlags:Tt,assert:Pt,features:wt,_fatalExceptions:bt,setUncaughtExceptionCaptureCallback:It,hasUncaughtExceptionCaptureCallback:At,emitWarning:nt,nextTick:je,_tickCallback:kt,_debugProcess:Mt,_debugEnd:xt,_startProfilerIdleNotifier:Ut,_stopProfilerIdleNotifier:Nt,stdout:Dt,stdin:Ft,stderr:St,abort:Ht,umask:ot,chdir:at,cwd:st,env:Je,title:ze,argv:Xe,execArgv:et,pid:Vt,ppid:Gt,execPath:Bt,debugPort:Kt,hrtime:Q,argv0:Zt,_preload_modules:Wt,setSourceMapsEnabled:$t};});var a=Y(()=>{de();});var l=Y(()=>{});var Se=Ze((wi,ne)=>{l();a();var k=typeof Reflect=="object"?Reflect:null,we=k&&typeof k.apply=="function"?k.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)},Z;k&&typeof k.ownKeys=="function"?Z=k.ownKeys:Object.getOwnPropertySymbols?Z=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Z=function(e){return Object.getOwnPropertyNames(e)};function Vr(r){console&&console.warn&&console.warn(r);}var Ie=Number.isNaN||function(e){return e!==e};function c(){c.init.call(this);}ne.exports=c;ne.exports.once=Zr;c.EventEmitter=c;c.prototype._events=void 0;c.prototype._eventsCount=0;c.prototype._maxListeners=void 0;var be=10;function W(r){if(typeof r!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r)}Object.defineProperty(c,"defaultMaxListeners",{enumerable:!0,get:function(){return be},set:function(r){if(typeof r!="number"||r<0||Ie(r))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+r+".");be=r;}});c.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0;};c.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||Ie(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function Ae(r){return r._maxListeners===void 0?c.defaultMaxListeners:r._maxListeners}c.prototype.getMaxListeners=function(){return Ae(this)};c.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var i=e==="error",o=this._events;if(o!==void 0)i=i&&o.error===void 0;else if(!i)return !1;if(i){var s;if(t.length>0&&(s=t[0]),s instanceof Error)throw s;var d=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw d.context=s,d}var g=o[e];if(g===void 0)return !1;if(typeof g=="function")we(g,this,t);else for(var C=g.length,p=Ne(g,C),n=0;n<C;++n)we(p[n],this,t);return !0};function ke(r,e,t,n){var i,o,s;if(W(t),o=r._events,o===void 0?(o=r._events=Object.create(null),r._eventsCount=0):(o.newListener!==void 0&&(r.emit("newListener",e,t.listener?t.listener:t),o=r._events),s=o[e]),s===void 0)s=o[e]=t,++r._eventsCount;else if(typeof s=="function"?s=o[e]=n?[t,s]:[s,t]:n?s.unshift(t):s.push(t),i=Ae(r),i>0&&s.length>i&&!s.warned){s.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=r,d.type=e,d.count=s.length,Vr(d);}return r}c.prototype.addListener=function(e,t){return ke(this,e,t,!1)};c.prototype.on=c.prototype.addListener;c.prototype.prependListener=function(e,t){return ke(this,e,t,!0)};function Gr(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Me(r,e,t){var n={fired:!1,wrapFn:void 0,target:r,type:e,listener:t},i=Gr.bind(n);return i.listener=t,n.wrapFn=i,i}c.prototype.once=function(e,t){return W(t),this.on(e,Me(this,e,t)),this};c.prototype.prependOnceListener=function(e,t){return W(t),this.prependListener(e,Me(this,e,t)),this};c.prototype.removeListener=function(e,t){var n,i,o,s,d;if(W(t),i=this._events,i===void 0)return this;if(n=i[e],n===void 0)return this;if(n===t||n.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete i[e],i.removeListener&&this.emit("removeListener",e,n.listener||t));else if(typeof n!="function"){for(o=-1,s=n.length-1;s>=0;s--)if(n[s]===t||n[s].listener===t){d=n[s].listener,o=s;break}if(o<0)return this;o===0?n.shift():Br(n,o),n.length===1&&(i[e]=n[0]),i.removeListener!==void 0&&this.emit("removeListener",e,d||t);}return this};c.prototype.off=c.prototype.removeListener;c.prototype.removeAllListeners=function(e){var t,n,i;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[e]),this;if(arguments.length===0){var o=Object.keys(n),s;for(i=0;i<o.length;++i)s=o[i],s!=="removeListener"&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(t=n[e],typeof t=="function")this.removeListener(e,t);else if(t!==void 0)for(i=t.length-1;i>=0;i--)this.removeListener(e,t[i]);return this};function xe(r,e,t){var n=r._events;if(n===void 0)return [];var i=n[e];return i===void 0?[]:typeof i=="function"?t?[i.listener||i]:[i]:t?Kr(i):Ne(i,i.length)}c.prototype.listeners=function(e){return xe(this,e,!0)};c.prototype.rawListeners=function(e){return xe(this,e,!1)};c.listenerCount=function(r,e){return typeof r.listenerCount=="function"?r.listenerCount(e):Ue.call(r,e)};c.prototype.listenerCount=Ue;function Ue(r){var e=this._events;if(e!==void 0){var t=e[r];if(typeof t=="function")return 1;if(t!==void 0)return t.length}return 0}c.prototype.eventNames=function(){return this._eventsCount>0?Z(this._events):[]};function Ne(r,e){for(var t=new Array(e),n=0;n<e;++n)t[n]=r[n];return t}function Br(r,e){for(;e+1<r.length;e++)r[e]=r[e+1];r.pop();}function Kr(r){for(var e=new Array(r.length),t=0;t<e.length;++t)e[t]=r[t].listener||r[t];return e}function Zr(r,e){return new Promise(function(t,n){function i(s){r.removeListener(e,o),n(s);}function o(){typeof r.removeListener=="function"&&r.removeListener("error",i),t([].slice.call(arguments));}De(r,e,o,{once:!0}),e!=="error"&&Wr(r,i,{once:!0});})}function Wr(r,e,t){typeof r.on=="function"&&De(r,"error",e,t);}function De(r,e,t,n){if(typeof r.on=="function")n.once?r.once(e,t):r.on(e,t);else if(typeof r.addEventListener=="function")r.addEventListener(e,function i(o){n.once&&r.removeEventListener(e,i),t(o);});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof r)}});l();a();l();a();l();a();l();a();var ce="pkce_state",ue="pkce_verifier",ar=3600,x=class{isTokenValid(e){try{let n=Re(e).exp??0,i=Date.now()/1e3+ar;return n>i}catch{return !1}}savePKCEData(e){localStorage.setItem(ce,e.state),localStorage.setItem(ue,e.verifier);}getPKCEData(){let e=localStorage.getItem(ce),t=localStorage.getItem(ue);return e&&t?{state:e,verifier:t}:null}};l();a();var lr=(...r)=>{if(typeof u>"u")return;u?.env?.JEST_WORKER_ID===void 0&&console.warn(...r);},w={warn:lr};l();a();function pe(r){try{let e=Re(r),t=Math.floor(Date.now()/1e3);return e.exp?e.exp<=t+30:!0}catch{return !0}}function fe(r){let{id_token:e,access_token:t}=r;return !t||!e?!0:pe(t)||pe(e)}l();a();var H=(f=>(f.AUTHENTICATION_ERROR="AUTHENTICATION_ERROR",f.INVALID_CONFIGURATION="INVALID_CONFIGURATION",f.WALLET_CONNECTION_ERROR="WALLET_CONNECTION_ERROR",f.NOT_LOGGED_IN_ERROR="NOT_LOGGED_IN_ERROR",f.SILENT_LOGIN_ERROR="SILENT_LOGIN_ERROR",f.REFRESH_TOKEN_ERROR="REFRESH_TOKEN_ERROR",f.USER_REGISTRATION_ERROR="USER_REGISTRATION_ERROR",f.USER_NOT_REGISTERED_ERROR="USER_NOT_REGISTERED_ERROR",f.LOGOUT_ERROR="LOGOUT_ERROR",f.TRANSFER_ERROR="TRANSFER_ERROR",f.CREATE_ORDER_ERROR="CREATE_ORDER_ERROR",f.CANCEL_ORDER_ERROR="CANCEL_ORDER_ERROR",f.EXCHANGE_TRANSFER_ERROR="EXCHANGE_TRANSFER_ERROR",f.CREATE_TRADE_ERROR="CREATE_TRADE_ERROR",f.OPERATION_NOT_SUPPORTED_ERROR="OPERATION_NOT_SUPPORTED_ERROR",f.LINK_WALLET_ALREADY_LINKED_ERROR="LINK_WALLET_ALREADY_LINKED_ERROR",f.LINK_WALLET_MAX_WALLETS_LINKED_ERROR="LINK_WALLET_MAX_WALLETS_LINKED_ERROR",f.LINK_WALLET_VALIDATION_ERROR="LINK_WALLET_VALIDATION_ERROR",f.LINK_WALLET_DUPLICATE_NONCE_ERROR="LINK_WALLET_DUPLICATE_NONCE_ERROR",f.LINK_WALLET_GENERIC_ERROR="LINK_WALLET_GENERIC_ERROR",f.SERVICE_UNAVAILABLE_ERROR="SERVICE_UNAVAILABLE_ERROR",f))(H||{});function ur(r){return "code"in r&&"message"in r}var E=class extends Error{type;constructor(e,t){super(e),this.type=t;}},T=async(r,e)=>{try{return await r()}catch(t){let n;throw t instanceof E&&t.type==="SERVICE_UNAVAILABLE_ERROR"?new E(t.message,t.type):(isAxiosError(t)&&t.response?.data&&ur(t.response.data)?n=t.response.data.message:n=t.message,new E(n,e))}};l();a();var me=(e=>(e.ZKEVM="zkEvm",e))(me||{}),X=r=>!!r.zkEvm,ge=(t=>(t.OptedIn="opted_in",t.Unsubscribed="unsubscribed",t))(ge||{}),ee=(t=>(t.LOGGED_OUT="loggedOut",t.LOGGED_IN="loggedIn",t))(ee||{});l();a();l();a();var I="passport-overlay",U="passport-overlay-contents",V=`${I}-close`,G=`${I}-try-again`,he=`
|
|
8
8
|
<svg
|
|
9
9
|
viewBox="0 0 20 20"
|
|
10
10
|
fill="none"
|
|
@@ -215,7 +215,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
215
215
|
</svg>
|
|
216
216
|
`;l();a();var pr=()=>`
|
|
217
217
|
<button
|
|
218
|
-
id="${
|
|
218
|
+
id="${V}"
|
|
219
219
|
style="
|
|
220
220
|
background: #f3f3f326 !important;
|
|
221
221
|
border: none !important;
|
|
@@ -235,7 +235,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
235
235
|
</button>
|
|
236
236
|
`,Ee=()=>`
|
|
237
237
|
<button
|
|
238
|
-
id="${
|
|
238
|
+
id="${G}"
|
|
239
239
|
style="
|
|
240
240
|
margin-top: 27px !important;
|
|
241
241
|
color: #f3f3f3 !important;
|
|
@@ -250,7 +250,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
250
250
|
>
|
|
251
251
|
Try again
|
|
252
252
|
</button>
|
|
253
|
-
`,
|
|
253
|
+
`,fr=()=>`
|
|
254
254
|
${te}
|
|
255
255
|
<div
|
|
256
256
|
style="
|
|
@@ -275,7 +275,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
275
275
|
browser settings.
|
|
276
276
|
</p>
|
|
277
277
|
${Ee()}
|
|
278
|
-
`,
|
|
278
|
+
`,mr=()=>`
|
|
279
279
|
${te}
|
|
280
280
|
<p style="
|
|
281
281
|
color: #b6b6b6 !important;
|
|
@@ -288,7 +288,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
288
288
|
${Ee()}
|
|
289
289
|
`,_e=r=>`
|
|
290
290
|
<div
|
|
291
|
-
id="${
|
|
291
|
+
id="${I}"
|
|
292
292
|
style="
|
|
293
293
|
position: fixed !important;
|
|
294
294
|
top: 0 !important;
|
|
@@ -313,7 +313,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
313
313
|
>
|
|
314
314
|
${pr()}
|
|
315
315
|
<div
|
|
316
|
-
id="${
|
|
316
|
+
id="${U}"
|
|
317
317
|
style="
|
|
318
318
|
display: flex !important;
|
|
319
319
|
flex-direction: column !important;
|
|
@@ -326,7 +326,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
326
326
|
</div>
|
|
327
327
|
`,Ce=()=>`
|
|
328
328
|
<div
|
|
329
|
-
id="${
|
|
329
|
+
id="${I}"
|
|
330
330
|
style="
|
|
331
331
|
position: fixed;
|
|
332
332
|
top: 0;
|
|
@@ -344,7 +344,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
344
344
|
"
|
|
345
345
|
>
|
|
346
346
|
<div
|
|
347
|
-
id="${
|
|
347
|
+
id="${U}"
|
|
348
348
|
style="
|
|
349
349
|
display: flex;
|
|
350
350
|
flex-direction: column;
|
|
@@ -353,7 +353,7 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
353
353
|
"
|
|
354
354
|
/>
|
|
355
355
|
</div>
|
|
356
|
-
`;function G({id:r,href:e,rel:t,crossOrigin:n}){let i=`${b}-${r}`;if(!document.getElementById(i)){let o=document.createElement("link");o.id=i,o.href=e,t&&(o.rel=t),n&&(o.crossOrigin=n),document.head.appendChild(o);}}var ye=()=>_e(mr()),Oe=()=>_e(fr());var U=class{disableGenericPopupOverlay;disableBlockedPopupOverlay;overlay;isBlockedOverlay;tryAgainListener;onCloseListener;constructor(e,t=!1){this.disableBlockedPopupOverlay=e.disableBlockedPopupOverlay||!1,this.disableGenericPopupOverlay=e.disableGenericPopupOverlay||!1,this.isBlockedOverlay=t;}append(e,t){this.shouldAppendOverlay()&&(this.appendOverlay(),this.updateTryAgainButton(e),this.updateCloseButton(t));}update(e){this.updateTryAgainButton(e);}remove(){this.overlay&&this.overlay.remove();}shouldAppendOverlay(){return !(this.disableGenericPopupOverlay&&this.disableBlockedPopupOverlay||this.disableGenericPopupOverlay&&!this.isBlockedOverlay||this.disableBlockedPopupOverlay&&this.isBlockedOverlay)}appendOverlay(){if(!this.overlay){G({id:"link-googleapis",href:"https://fonts.googleapis.com"}),G({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),G({id:"link-roboto",href:"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap",rel:"stylesheet"});let t=document.createElement("div");t.innerHTML=this.isBlockedOverlay?ye():Oe(),document.body.insertAdjacentElement("beforeend",t),this.overlay=t;}}updateTryAgainButton(e){let t=document.getElementById(V);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(F);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};l();a();var B=class{storage;constructor(e,t){this.storage=gr.createInstance({name:e,driver:t});}get length(){return this.storage.length()}clear(){return this.storage.clear()}getItem(e){return this.storage.getItem(e)}key(e){return this.storage.key(e)}async removeItem(e){await this.storage.removeItem(e);}async setItem(e,t){await this.storage.setItem(e,t);}};var Pr=500,br={headers:{"Content-Type":"application/x-www-form-urlencoded"}},wr="/v2/logout",Ir="/im-logged-out",Ar="/authorize",xr=r=>r?Ir:wr,kr=r=>{let{authenticationDomain:e,oidcConfiguration:t}=r,n;r.crossSdkBridgeEnabled?n=new B("ImmutableSDKPassport",gr.INDEXEDDB):typeof window<"u"?n=window.localStorage:n=new InMemoryWebStorage;let i=new WebStorageStateStore({store:n}),o=new URL(xr(r.crossSdkBridgeEnabled),e.replace(/^(?:https?:\/\/)?(.*)/,"https://$1"));return o.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&o.searchParams.set("returnTo",t.logoutRedirectUri),{authority:e,redirect_uri:t.redirectUri,popup_redirect_uri:t.popupRedirectUri||t.redirectUri,client_id:t.clientId,metadata:{authorization_endpoint:`${e}/authorize`,token_endpoint:`${e}/oauth/token`,userinfo_endpoint:`${e}/userinfo`,end_session_endpoint:o.toString(),revocation_endpoint:`${e}/oauth/revoke`},automaticSilentRenew:!1,scope:t.scope,userStore:i,revokeTokenTypes:["refresh_token"],extraQueryParams:{...t.audience?{audience:t.audience}:{}}}};function re(r){return btoa(String.fromCharCode(...new Uint8Array(r))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Mr(r){let t=new TextEncoder().encode(r);return await window.crypto.subtle.digest("SHA-256",t)}var w=class r{userManager;deviceCredentialsManager;config;embeddedLoginPrompt;logoutMode;refreshingPromise=null;constructor(e,t){this.config=e,this.userManager=new UserManager(kr(e)),this.deviceCredentialsManager=new x,this.embeddedLoginPrompt=t,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=Re(e.id_token)?.passport);let n={expired:e.expired,idToken:e.id_token,accessToken:e.access_token,refreshToken:e.refresh_token,profile:{sub:e.profile.sub,email:e.profile.email,nickname:e.profile.nickname}};return t?.imx_eth_address&&(n.imx={ethAddress:t.imx_eth_address,starkAddress:t.imx_stark_address,userAdminAddress:t.imx_user_admin_address}),t?.zkevm_eth_address&&(n.zkEvm={ethAddress:t?.zkevm_eth_address,userAdminAddress:t?.zkevm_user_admin_address}),n};static mapDeviceTokenResponseToOidcUser=e=>{let t=Re(e.id_token);return new User({id_token:e.id_token,access_token:e.access_token,refresh_token:e.refresh_token,token_type:e.token_type,profile:{sub:t.sub,iss:t.iss,aud:t.aud,exp:t.exp,iat:t.iat,email:t.email,nickname:t.nickname,passport:t.passport}})};buildExtraQueryParams(e,t){let n={...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:""};if(e){if(e.directLoginMethod==="email"){let i=e.email;i&&(n.direct=e.directLoginMethod,n.email=i);}else n.direct=e.directLoginMethod;e.marketingConsentStatus&&(n.marketingConsent=e.marketingConsentStatus);}return t&&(n.im_passport_trace_id=t),n}async loginWithRedirect(e){return await this.userManager.clearStaleState(),L(async()=>{let t=this.buildExtraQueryParams(e);await this.userManager.signinRedirect({extraQueryParams:t});},"AUTHENTICATION_ERROR")}async login(e){return L(async()=>{let t,n;if(e)t=e;else if(!this.config.popupOverlayOptions?.disableHeadlessLoginPromptOverlay){let{imPassportTraceId:s,...d}=await this.embeddedLoginPrompt.displayEmbeddedLoginPrompt();t=d,n=s;}let i=window.crypto.randomUUID(),o=async()=>{let s=this.buildExtraQueryParams(t,n),d=this.userManager.signinPopup({extraQueryParams:s,popupWindowFeatures:{width:410,height:450},popupWindowTarget:i}),f=window.open("",i);if(f){let _=new Promise((u,y)=>{let oe=setInterval(()=>{f.closed&&(clearInterval(oe),y(new Error("Popup closed by user")));},Pr);d.finally(()=>{clearInterval(oe),f.close();});});return Promise.race([d,_])}return d};return new Promise((s,d)=>{o().then(f=>{s(r.mapOidcUserToDomainModel(f));}).catch(f=>{if(!(f instanceof Error)||f.message!=="Attempted to navigate on a disposed window"){d(f);return}let _=!1,u=new U(this.config.popupOverlayOptions||{},!0);u.append(async()=>{try{if(_)window.open("",i);else {_=!0;let y=await o();u.remove(),s(r.mapOidcUserToDomainModel(y));}}catch(y){u.remove(),d(y);}},()=>{u.remove(),d(new Error("Popup closed by user"));});});})},"AUTHENTICATION_ERROR")}async getUserOrLogin(){let e=null;try{e=await this.getUser();}catch(t){k.warn("Failed to retrieve a cached user session",t);}return e||this.login()}static shouldUseSigninPopupCallback(){try{let n=`oidc.${new URLSearchParams(window.location.search).get("state")}`,i=localStorage.getItem(n);return JSON.parse(i||"{}")?.request_type==="si:p"}catch{return !1}}async loginCallback(){return L(async()=>{if(r.shouldUseSigninPopupCallback()){await this.userManager.signinPopupCallback(void 0,!0);return}let e=await this.userManager.signinCallback();if(e)return r.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async getPKCEAuthorizationUrl(e,t){let n=re(window.crypto.getRandomValues(new Uint8Array(32))),i=re(await Mr(n)),o=re(window.crypto.getRandomValues(new Uint8Array(32))),{redirectUri:s,scope:d,audience:f,clientId:_}=this.config.oidcConfiguration;this.deviceCredentialsManager.savePKCEData({state:o,verifier:n});let u=new URL(Ar,this.config.authenticationDomain);if(u.searchParams.set("response_type","code"),u.searchParams.set("code_challenge",i),u.searchParams.set("code_challenge_method","S256"),u.searchParams.set("client_id",_),u.searchParams.set("redirect_uri",s),u.searchParams.set("state",o),d&&u.searchParams.set("scope",d),f&&u.searchParams.set("audience",f),e){if(e.directLoginMethod==="email"){let y=e.email;y&&(u.searchParams.set("direct",e.directLoginMethod),u.searchParams.set("email",y));}else u.searchParams.set("direct",e.directLoginMethod);e.marketingConsentStatus&&u.searchParams.set("marketingConsent",e.marketingConsentStatus);}return t&&u.searchParams.set("im_passport_trace_id",t),u.toString()}async loginWithPKCEFlowCallback(e,t){return L(async()=>{let n=this.deviceCredentialsManager.getPKCEData();if(!n)throw new Error("No code verifier or state for PKCE");if(t!==n.state)throw new Error("Provided state does not match stored state");let i=await this.getPKCEToken(e,n.verifier),o=r.mapDeviceTokenResponseToOidcUser(i),s=r.mapOidcUserToDomainModel(o);return await this.userManager.storeUser(o),s},"AUTHENTICATION_ERROR")}async getPKCEToken(e,t){return (await Or.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"authorization_code",code_verifier:t,code:e,redirect_uri:this.config.oidcConfiguration.redirectUri},br)).data}async storeTokens(e){return L(async()=>{let t=r.mapDeviceTokenResponseToOidcUser(e),n=r.mapOidcUserToDomainModel(t);return await this.userManager.storeUser(t),n},"AUTHENTICATION_ERROR")}async logout(){return L(async()=>{await this.userManager.revokeTokens(["refresh_token"]),this.logoutMode==="silent"?await this.userManager.signoutSilent():await this.userManager.signoutRedirect();},"LOGOUT_ERROR")}async logoutSilentCallback(e){return this.userManager.signoutSilentCallback(e)}async removeUser(){return this.userManager.removeUser()}async getLogoutUrl(){let e=this.userManager.settings?.metadata?.end_session_endpoint;return e||(k.warn("Failed to get logout URL"),null)}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{k.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(k.warn("Failed to refresh user token",e),null))}async refreshTokenAndUpdatePromise(){return this.refreshingPromise?this.refreshingPromise:(this.refreshingPromise=new Promise(async(e,t)=>{try{let n=await this.userManager.signinSilent();if(n){e(r.mapOidcUserToDomainModel(n));return}e(null);}catch(n){let i="AUTHENTICATION_ERROR",o="Failed to refresh token",s=!0;if(n instanceof ErrorTimeout?(i="SILENT_LOGIN_ERROR",o=`${o}: ${n.message}`,s=!1):n instanceof ErrorResponse?(i="NOT_LOGGED_IN_ERROR",o=`${o}: ${n.message||n.error_description}`):n instanceof Error?o=`${o}: ${n.message}`:typeof n=="string"&&(o=`${o}: ${n}`),s)try{await this.userManager.removeUser();}catch(d){d instanceof Error&&(o=`${o}: Failed to remove user: ${d.message}`);}t(new v(o,i));}finally{this.refreshingPromise=null;}}),this.refreshingPromise)}async getUser(e=t=>!0){if(this.refreshingPromise){let n=await this.refreshingPromise;return n&&e(n)?n:null}let t=await this.userManager.getUser();if(!t)return null;if(!me(t)){let n=r.mapOidcUserToDomainModel(t);if(n&&e(n))return n}if(t.refresh_token){let n=await this.refreshTokenAndUpdatePromise();if(n&&e(n))return n}return null}async getUserZkEvm(){let e=await this.getUser(Q);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(J);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};l();a();var Ur=(r,e,t)=>{let n=e.map(i=>!r[i]&&i).filter(i=>i).join(", ");if(n!==""){let i=`${n} cannot be null`;throw new v(i,"INVALID_CONFIGURATION")}},N=class{authenticationDomain;passportDomain;oidcConfiguration;crossSdkBridgeEnabled;popupOverlayOptions;constructor({authenticationDomain:e,passportDomain:t,crossSdkBridgeEnabled:n,popupOverlayOptions:i,...o}){Ur(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.crossSdkBridgeEnabled=n||!1,this.popupOverlayOptions=i,this.authenticationDomain=e||"https://auth.immutable.com",this.passportDomain=t||"https://passport.immutable.com";}};l();a();l();a();var Le="im_passport_embedded_login_prompt";l();a();var E=class{static overlay;static onCloseListener;static closeButton;static remove(){this.onCloseListener&&this.closeButton?.removeEventListener?.("click",this.onCloseListener),this.overlay?.remove(),this.closeButton=void 0,this.onCloseListener=void 0,this.overlay=void 0;}static appendOverlay(e,t){if(!this.overlay){let n=document.createElement("div");n.innerHTML=Ce(),document.body.insertAdjacentElement("beforeend",n);let i=document.querySelector(`#${M}`);i&&i.appendChild(e),n.addEventListener("click",t),this.overlay=n;}}};var Sr=660,Hr=440,Fr="16px",Te="passport-embedded-login-keyframes",Pe="passport-embedded-login-iframe",D=class r{config;constructor(e){this.config=e;}getHref=()=>`${this.config.authenticationDomain}/im-embedded-login-prompt?client_id=${this.config.oidcConfiguration.clientId}&rid=${getDetail(Detail.RUNTIME_ID)}`;static appendIFrameStylesIfNeeded=()=>{if(document.getElementById(Te))return;let e=document.createElement("style");e.id=Te,e.textContent=`
|
|
356
|
+
`;function B({id:r,href:e,rel:t,crossOrigin:n}){let i=`${I}-${r}`;if(!document.getElementById(i)){let o=document.createElement("link");o.id=i,o.href=e,t&&(o.rel=t),n&&(o.crossOrigin=n),document.head.appendChild(o);}}var ye=()=>_e(fr()),Oe=()=>_e(mr());var N=class{disableGenericPopupOverlay;disableBlockedPopupOverlay;overlay;isBlockedOverlay;tryAgainListener;onCloseListener;constructor(e,t=!1){this.disableBlockedPopupOverlay=e.disableBlockedPopupOverlay||!1,this.disableGenericPopupOverlay=e.disableGenericPopupOverlay||!1,this.isBlockedOverlay=t;}append(e,t){this.shouldAppendOverlay()&&(this.appendOverlay(),this.updateTryAgainButton(e),this.updateCloseButton(t));}update(e){this.updateTryAgainButton(e);}remove(){this.overlay&&this.overlay.remove();}shouldAppendOverlay(){return !(this.disableGenericPopupOverlay&&this.disableBlockedPopupOverlay||this.disableGenericPopupOverlay&&!this.isBlockedOverlay||this.disableBlockedPopupOverlay&&this.isBlockedOverlay)}appendOverlay(){if(!this.overlay){B({id:"link-googleapis",href:"https://fonts.googleapis.com"}),B({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),B({id:"link-roboto",href:"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap",rel:"stylesheet"});let t=document.createElement("div");t.innerHTML=this.isBlockedOverlay?ye():Oe(),document.body.insertAdjacentElement("beforeend",t),this.overlay=t;}}updateTryAgainButton(e){let t=document.getElementById(G);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(V);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};l();a();var K=class{storage;constructor(e,t){this.storage=gr.createInstance({name:e,driver:t});}get length(){return this.storage.length()}clear(){return this.storage.clear()}getItem(e){return this.storage.getItem(e)}key(e){return this.storage.key(e)}async removeItem(e){await this.storage.removeItem(e);}async setItem(e,t){await this.storage.setItem(e,t);}};var Pr=500,wr={headers:{"Content-Type":"application/x-www-form-urlencoded"}},br="/v2/logout",Ir="/im-logged-out",Ar="/authorize",kr=r=>r?Ir:br,Mr=r=>{let{authenticationDomain:e,oidcConfiguration:t}=r,n;r.crossSdkBridgeEnabled?n=new K("ImmutableSDKPassport",gr.INDEXEDDB):typeof window<"u"?n=window.localStorage:n=new InMemoryWebStorage;let i=new WebStorageStateStore({store:n}),o=new URL(kr(r.crossSdkBridgeEnabled),e.replace(/^(?:https?:\/\/)?(.*)/,"https://$1"));return o.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&o.searchParams.set("returnTo",t.logoutRedirectUri),{authority:e,redirect_uri:t.redirectUri,popup_redirect_uri:t.popupRedirectUri||t.redirectUri,client_id:t.clientId,metadata:{authorization_endpoint:`${e}/authorize`,token_endpoint:`${e}/oauth/token`,userinfo_endpoint:`${e}/userinfo`,end_session_endpoint:o.toString(),revocation_endpoint:`${e}/oauth/revoke`},automaticSilentRenew:!1,scope:t.scope,userStore:i,revokeTokenTypes:["refresh_token"],extraQueryParams:{...t.audience?{audience:t.audience}:{}}}};function re(r){return btoa(String.fromCharCode(...new Uint8Array(r))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function xr(r){let t=new TextEncoder().encode(r);return await window.crypto.subtle.digest("SHA-256",t)}var A=class r{userManager;deviceCredentialsManager;config;embeddedLoginPrompt;logoutMode;refreshingPromise=null;constructor(e,t){this.config=e,this.userManager=new UserManager(Mr(e)),this.deviceCredentialsManager=new x,this.embeddedLoginPrompt=t,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=Re(e.id_token)?.passport);let n={expired:e.expired,idToken:e.id_token,accessToken:e.access_token,refreshToken:e.refresh_token,profile:{sub:e.profile.sub,email:e.profile.email,nickname:e.profile.nickname}};return t?.zkevm_eth_address&&t?.zkevm_user_admin_address&&(n.zkEvm={ethAddress:t.zkevm_eth_address,userAdminAddress:t.zkevm_user_admin_address}),n};static mapDeviceTokenResponseToOidcUser=e=>{let t=Re(e.id_token);return new User({id_token:e.id_token,access_token:e.access_token,refresh_token:e.refresh_token,token_type:e.token_type,profile:{sub:t.sub,iss:t.iss,aud:t.aud,exp:t.exp,iat:t.iat,email:t.email,nickname:t.nickname,passport:t.passport}})};buildExtraQueryParams(e,t){let n={...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:""};if(e){if(e.directLoginMethod==="email"){let i=e.email;i&&(n.direct=e.directLoginMethod,n.email=i);}else n.direct=e.directLoginMethod;e.marketingConsentStatus&&(n.marketingConsent=e.marketingConsentStatus);}return t&&(n.im_passport_trace_id=t),n}async getClientId(){return this.config.oidcConfiguration.clientId}async loginWithRedirect(e){return await this.userManager.clearStaleState(),T(async()=>{let t=this.buildExtraQueryParams(e);await this.userManager.signinRedirect({extraQueryParams:t});},"AUTHENTICATION_ERROR")}async login(e){return T(async()=>{let t,n;if(e)t=e;else if(!this.config.popupOverlayOptions?.disableHeadlessLoginPromptOverlay){let{imPassportTraceId:s,...d}=await this.embeddedLoginPrompt.displayEmbeddedLoginPrompt();t=d,n=s;}let i=window.crypto.randomUUID(),o=async()=>{let s=this.buildExtraQueryParams(t,n),d=this.userManager.signinPopup({extraQueryParams:s,popupWindowFeatures:{width:410,height:450},popupWindowTarget:i}),g=window.open("",i);if(g){let C=new Promise((p,O)=>{let oe=setInterval(()=>{g.closed&&(clearInterval(oe),O(new Error("Popup closed by user")));},Pr);d.finally(()=>{clearInterval(oe),g.close();});});return Promise.race([d,C])}return d};return new Promise((s,d)=>{o().then(g=>{s(r.mapOidcUserToDomainModel(g));}).catch(g=>{if(!(g instanceof Error)||g.message!=="Attempted to navigate on a disposed window"){d(g);return}let C=!1,p=new N(this.config.popupOverlayOptions||{},!0);p.append(async()=>{try{if(C)window.open("",i);else {C=!0;let O=await o();p.remove(),s(r.mapOidcUserToDomainModel(O));}}catch(O){p.remove(),d(O);}},()=>{p.remove(),d(new Error("Popup closed by user"));});});})},"AUTHENTICATION_ERROR")}async getUserOrLogin(){let e=null;try{e=await this.getUser();}catch(t){w.warn("Failed to retrieve a cached user session",t);}return e||this.login()}static shouldUseSigninPopupCallback(){try{let n=`oidc.${new URLSearchParams(window.location.search).get("state")}`,i=localStorage.getItem(n);return JSON.parse(i||"{}")?.request_type==="si:p"}catch{return !1}}async loginCallback(){return T(async()=>{if(r.shouldUseSigninPopupCallback()){await this.userManager.signinPopupCallback(void 0,!0);return}let e=await this.userManager.signinCallback();if(e)return r.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async getPKCEAuthorizationUrl(e,t){let n=re(window.crypto.getRandomValues(new Uint8Array(32))),i=re(await xr(n)),o=re(window.crypto.getRandomValues(new Uint8Array(32))),{redirectUri:s,scope:d,audience:g,clientId:C}=this.config.oidcConfiguration;this.deviceCredentialsManager.savePKCEData({state:o,verifier:n});let p=new URL(Ar,this.config.authenticationDomain);if(p.searchParams.set("response_type","code"),p.searchParams.set("code_challenge",i),p.searchParams.set("code_challenge_method","S256"),p.searchParams.set("client_id",C),p.searchParams.set("redirect_uri",s),p.searchParams.set("state",o),d&&p.searchParams.set("scope",d),g&&p.searchParams.set("audience",g),e){if(e.directLoginMethod==="email"){let O=e.email;O&&(p.searchParams.set("direct",e.directLoginMethod),p.searchParams.set("email",O));}else p.searchParams.set("direct",e.directLoginMethod);e.marketingConsentStatus&&p.searchParams.set("marketingConsent",e.marketingConsentStatus);}return t&&p.searchParams.set("im_passport_trace_id",t),p.toString()}async loginWithPKCEFlowCallback(e,t){return T(async()=>{let n=this.deviceCredentialsManager.getPKCEData();if(!n)throw new Error("No code verifier or state for PKCE");if(t!==n.state)throw new Error("Provided state does not match stored state");let i=await this.getPKCEToken(e,n.verifier),o=r.mapDeviceTokenResponseToOidcUser(i),s=r.mapOidcUserToDomainModel(o);return await this.userManager.storeUser(o),s},"AUTHENTICATION_ERROR")}async getPKCEToken(e,t){return (await Or.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"authorization_code",code_verifier:t,code:e,redirect_uri:this.config.oidcConfiguration.redirectUri},wr)).data}async storeTokens(e){return T(async()=>{let t=r.mapDeviceTokenResponseToOidcUser(e),n=r.mapOidcUserToDomainModel(t);return await this.userManager.storeUser(t),n},"AUTHENTICATION_ERROR")}async logout(){return T(async()=>{await this.userManager.revokeTokens(["refresh_token"]),this.logoutMode==="silent"?await this.userManager.signoutSilent():await this.userManager.signoutRedirect();},"LOGOUT_ERROR")}async logoutSilentCallback(e){return this.userManager.signoutSilentCallback(e)}async removeUser(){return this.userManager.removeUser()}async getLogoutUrl(){let e=this.userManager.settings?.metadata?.end_session_endpoint;return e||(w.warn("Failed to get logout URL"),null)}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{w.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(w.warn("Failed to refresh user token",e),null))}async refreshTokenAndUpdatePromise(){return this.refreshingPromise?this.refreshingPromise:(this.refreshingPromise=new Promise(async(e,t)=>{try{let n=await this.userManager.signinSilent();if(n){e(r.mapOidcUserToDomainModel(n));return}e(null);}catch(n){let i="AUTHENTICATION_ERROR",o="Failed to refresh token",s=!0;if(n instanceof ErrorTimeout?(i="SILENT_LOGIN_ERROR",o=`${o}: ${n.message}`,s=!1):n instanceof ErrorResponse?(i="NOT_LOGGED_IN_ERROR",o=`${o}: ${n.message||n.error_description}`):n instanceof Error?o=`${o}: ${n.message}`:typeof n=="string"&&(o=`${o}: ${n}`),s)try{await this.userManager.removeUser();}catch(d){d instanceof Error&&(o=`${o}: Failed to remove user: ${d.message}`);}t(new E(o,i));}finally{this.refreshingPromise=null;}}),this.refreshingPromise)}async getUser(e=t=>!0){if(this.refreshingPromise){let n=await this.refreshingPromise;return n&&e(n)?n:null}let t=await this.userManager.getUser();if(!t)return null;if(!fe(t)){let n=r.mapOidcUserToDomainModel(t);if(n&&e(n))return n}if(t.refresh_token){let n=await this.refreshTokenAndUpdatePromise();if(n&&e(n))return n}return null}async getUserZkEvm(){let e=await this.getUser(X);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}};l();a();var Ur=(r,e,t)=>{let n=e.map(i=>!r[i]&&i).filter(i=>i).join(", ");if(n!==""){let i=`${n} cannot be null`;throw new E(i,"INVALID_CONFIGURATION")}},D=class{authenticationDomain;passportDomain;oidcConfiguration;crossSdkBridgeEnabled;popupOverlayOptions;constructor({authenticationDomain:e,passportDomain:t,crossSdkBridgeEnabled:n,popupOverlayOptions:i,...o}){Ur(o,["clientId","redirectUri"]),this.oidcConfiguration=o,this.crossSdkBridgeEnabled=n||!1,this.popupOverlayOptions=i,this.authenticationDomain=e||"https://auth.immutable.com",this.passportDomain=t||"https://passport.immutable.com";}};l();a();l();a();var Le="im_passport_embedded_login_prompt";l();a();var _=class{static overlay;static onCloseListener;static closeButton;static remove(){this.onCloseListener&&this.closeButton?.removeEventListener?.("click",this.onCloseListener),this.overlay?.remove(),this.closeButton=void 0,this.onCloseListener=void 0,this.overlay=void 0;}static appendOverlay(e,t){if(!this.overlay){let n=document.createElement("div");n.innerHTML=Ce(),document.body.insertAdjacentElement("beforeend",n);let i=document.querySelector(`#${U}`);i&&i.appendChild(e),n.addEventListener("click",t),this.overlay=n;}}};var Sr=660,Fr=440,Hr="16px",Te="passport-embedded-login-keyframes",Pe="passport-embedded-login-iframe",S=class r{config;constructor(e){this.config=e;}getHref=()=>`${this.config.authenticationDomain}/im-embedded-login-prompt?client_id=${this.config.oidcConfiguration.clientId}&rid=${getDetail(Detail.RUNTIME_ID)}`;static appendIFrameStylesIfNeeded=()=>{if(document.getElementById(Te))return;let e=document.createElement("style");e.id=Te,e.textContent=`
|
|
357
357
|
@keyframes passportEmbeddedLoginPromptPopBounceIn {
|
|
358
358
|
0% {
|
|
359
359
|
opacity: 0.5;
|
|
@@ -386,6 +386,6 @@ var Fe=Object.create;var se=Object.defineProperty;var Ve=Object.getOwnPropertyDe
|
|
|
386
386
|
opacity: 1;
|
|
387
387
|
}
|
|
388
388
|
}
|
|
389
|
-
`,document.head.appendChild(e);};getEmbeddedLoginIFrame=()=>{let e=document.createElement("iframe");return e.id=Pe,e.src=this.getHref(),e.style.height="100vh",e.style.width="100vw",e.style.maxHeight=`${Sr}px`,e.style.maxWidth=`${
|
|
389
|
+
`,document.head.appendChild(e);};getEmbeddedLoginIFrame=()=>{let e=document.createElement("iframe");return e.id=Pe,e.src=this.getHref(),e.style.height="100vh",e.style.width="100vw",e.style.maxHeight=`${Sr}px`,e.style.maxWidth=`${Fr}px`,e.style.borderRadius=Hr,e.style.opacity="0",e.style.transform="scale(0.6)",e.style.animation="passportEmbeddedLoginPromptPopBounceIn 1s ease forwards",r.appendIFrameStylesIfNeeded(),e};displayEmbeddedLoginPrompt(){return new Promise((e,t)=>{let n=this.getEmbeddedLoginIFrame(),i=({data:o,origin:s})=>{if(!(s!==this.config.authenticationDomain||o.eventType!==Le))switch(o.messageType){case"login_method_selected":{let d=o.payload;window.removeEventListener("message",i),_.remove(),e(d);break}case"login_prompt_error":{window.removeEventListener("message",i),_.remove(),t(new Error("Error during embedded login prompt",{cause:o.payload}));break}case"login_prompt_closed":{window.removeEventListener("message",i),_.remove(),t(new Error("Popup closed by user"));break}default:window.removeEventListener("message",i),_.remove(),t(new Error(`Unsupported message type: ${o.messageType}`));break}};window.addEventListener("message",i),_.appendOverlay(n,()=>{window.removeEventListener("message",i),_.remove(),t(new Error("Popup closed by user"));});})}};l();a();var Fe=$e(Se()),M=class{emitter=new Fe.EventEmitter;emit(e,...t){this.emitter.emit(e,...t);}on(e,t){this.emitter.on(e,t);}removeListener(e,t){this.emitter.removeListener(e,t);}};l();a();var v=async(r,e,t=!0,n=!0)=>{let i=trackFlow("passport",e,t);try{return await r(i)}catch(o){throw o instanceof Error?trackError("passport",e,o,{flowId:i.details.flowId}):i.addEvent("errored"),o}finally{n&&i.addEvent("End");}};var ie=class{authManager;config;eventEmitter;constructor(e){this.config=new D(e);let t=new S(this.config);this.authManager=new A(this.config,t),this.eventEmitter=new M,track("passport","initialise");}async login(e){return v(async()=>{let{useCachedSession:t=!1,useSilentLogin:n}=e||{},i=null;try{i=await this.authManager.getUser();}catch(o){if(o instanceof Error&&!o.message.includes("Unknown or invalid refresh token")&&trackError("passport","login",o),t)throw o;w.warn("Failed to retrieve a cached user session",o);}if(!i&&n)i=await this.authManager.forceUserRefresh();else if(!i&&!t){if(e?.useRedirectFlow)return await this.authManager.loginWithRedirect(e?.directLoginOptions),null;i=await this.authManager.login(e?.directLoginOptions);}return i&&(this.eventEmitter.emit("loggedIn",i),identify({passportId:i.profile.sub})),i},"login")}async loginWithRedirect(e){await this.authManager.loginWithRedirect(e);}async loginCallback(){return v(async()=>{let e=await this.authManager.loginCallback();if(!e)throw new Error("Login callback failed - no user returned");return this.eventEmitter.emit("loggedIn",e),identify({passportId:e.profile.sub}),e},"loginCallback")}async logout(){await v(async()=>{await this.authManager.logout(),this.eventEmitter.emit("loggedOut");},"logout");}async getUser(){return v(async()=>this.authManager.getUser(),"getUserInfo",!1)}async getIdToken(){return v(async()=>(await this.authManager.getUser())?.idToken,"getIdToken",!1)}async getAccessToken(){return v(async()=>(await this.authManager.getUser())?.accessToken,"getAccessToken",!1,!1)}async isLoggedIn(){return await this.getUser()!==null}async forceUserRefresh(){return this.authManager.forceUserRefresh()}async loginWithPKCEFlow(e,t){return v(async()=>this.authManager.getPKCEAuthorizationUrl(e,t),"loginWithPKCEFlow")}async loginWithPKCEFlowCallback(e,t){return v(async()=>{let n=await this.authManager.loginWithPKCEFlowCallback(e,t);return this.eventEmitter.emit("loggedIn",n),identify({passportId:n.profile.sub}),n},"loginWithPKCEFlowCallback")}async storeTokens(e){return v(async()=>{let t=await this.authManager.storeTokens(e);return this.eventEmitter.emit("loggedIn",t),identify({passportId:t.profile.sub}),t},"storeTokens")}async getLogoutUrl(){return v(async()=>(await this.authManager.removeUser(),this.eventEmitter.emit("loggedOut"),await this.authManager.getLogoutUrl()||void 0),"getLogoutUrl")}async logoutSilentCallback(e){return v(()=>this.authManager.logoutSilentCallback(e),"logoutSilentCallback")}getAuthManager(){return this.authManager}getConfig(){return this.config}};
|
|
390
390
|
|
|
391
|
-
export { ie as Auth,
|
|
391
|
+
export { ie as Auth, D as AuthConfiguration, ee as AuthEvents, A as AuthManager, ge as MarketingConsentStatus, E as PassportError, H as PassportErrorType, me as RollupType, M as TypedEventEmitter, X as isUserZkEvm, T as withPassportError };
|
package/dist/node/index.cjs
CHANGED
|
@@ -4,16 +4,16 @@ var oidcClientTs = require('oidc-client-ts');
|
|
|
4
4
|
var Ee = require('axios');
|
|
5
5
|
var q = require('jwt-decode');
|
|
6
6
|
var metrics = require('@imtbl/metrics');
|
|
7
|
-
var
|
|
7
|
+
var ce = require('localforage');
|
|
8
8
|
var events = require('events');
|
|
9
9
|
|
|
10
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
|
|
12
12
|
var Ee__default = /*#__PURE__*/_interopDefault(Ee);
|
|
13
13
|
var q__default = /*#__PURE__*/_interopDefault(q);
|
|
14
|
-
var
|
|
14
|
+
var ce__default = /*#__PURE__*/_interopDefault(ce);
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var F="pkce_state",H="pkce_verifier",re=3600,O=class{isTokenValid(e){try{let r=q__default.default(e).exp??0,o=Date.now()/1e3+re;return r>o}catch{return !1}}savePKCEData(e){localStorage.setItem(F,e.state),localStorage.setItem(H,e.verifier);}getPKCEData(){let e=localStorage.getItem(F),t=localStorage.getItem(H);return e&&t?{state:e,verifier:t}:null}};var oe=(...i)=>{if(typeof process>"u")return;process?.env?.JEST_WORKER_ID===void 0&&console.warn(...i);},h={warn:oe};function V(i){try{let e=q__default.default(i),t=Math.floor(Date.now()/1e3);return e.exp?e.exp<=t+30:!0}catch{return !0}}function G(i){let{id_token:e,access_token:t}=i;return !t||!e?!0:V(t)||V(e)}var P=(s=>(s.AUTHENTICATION_ERROR="AUTHENTICATION_ERROR",s.INVALID_CONFIGURATION="INVALID_CONFIGURATION",s.WALLET_CONNECTION_ERROR="WALLET_CONNECTION_ERROR",s.NOT_LOGGED_IN_ERROR="NOT_LOGGED_IN_ERROR",s.SILENT_LOGIN_ERROR="SILENT_LOGIN_ERROR",s.REFRESH_TOKEN_ERROR="REFRESH_TOKEN_ERROR",s.USER_REGISTRATION_ERROR="USER_REGISTRATION_ERROR",s.USER_NOT_REGISTERED_ERROR="USER_NOT_REGISTERED_ERROR",s.LOGOUT_ERROR="LOGOUT_ERROR",s.TRANSFER_ERROR="TRANSFER_ERROR",s.CREATE_ORDER_ERROR="CREATE_ORDER_ERROR",s.CANCEL_ORDER_ERROR="CANCEL_ORDER_ERROR",s.EXCHANGE_TRANSFER_ERROR="EXCHANGE_TRANSFER_ERROR",s.CREATE_TRADE_ERROR="CREATE_TRADE_ERROR",s.OPERATION_NOT_SUPPORTED_ERROR="OPERATION_NOT_SUPPORTED_ERROR",s.LINK_WALLET_ALREADY_LINKED_ERROR="LINK_WALLET_ALREADY_LINKED_ERROR",s.LINK_WALLET_MAX_WALLETS_LINKED_ERROR="LINK_WALLET_MAX_WALLETS_LINKED_ERROR",s.LINK_WALLET_VALIDATION_ERROR="LINK_WALLET_VALIDATION_ERROR",s.LINK_WALLET_DUPLICATE_NONCE_ERROR="LINK_WALLET_DUPLICATE_NONCE_ERROR",s.LINK_WALLET_GENERIC_ERROR="LINK_WALLET_GENERIC_ERROR",s.SERVICE_UNAVAILABLE_ERROR="SERVICE_UNAVAILABLE_ERROR",s))(P||{});function se(i){return "code"in i&&"message"in i}var u=class extends Error{type;constructor(e,t){super(e),this.type=t;}},f=async(i,e)=>{try{return await i()}catch(t){let r;throw t instanceof u&&t.type==="SERVICE_UNAVAILABLE_ERROR"?new u(t.message,t.type):(Ee.isAxiosError(t)&&t.response?.data&&se(t.response.data)?r=t.response.data.message:r=t.message,new u(r,e))}};var B=(e=>(e.ZKEVM="zkEvm",e))(B||{}),M=i=>!!i.zkEvm,K=(t=>(t.OptedIn="opted_in",t.Unsubscribed="unsubscribed",t))(K||{}),U=(t=>(t.LOGGED_OUT="loggedOut",t.LOGGED_IN="loggedIn",t))(U||{});var C="passport-overlay",y="passport-overlay-contents",I=`${C}-close`,A=`${C}-try-again`,Z=`
|
|
17
17
|
<svg
|
|
18
18
|
viewBox="0 0 20 20"
|
|
19
19
|
fill="none"
|
|
@@ -224,7 +224,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
224
224
|
</svg>
|
|
225
225
|
`;var ae=()=>`
|
|
226
226
|
<button
|
|
227
|
-
id="${
|
|
227
|
+
id="${I}"
|
|
228
228
|
style="
|
|
229
229
|
background: #f3f3f326 !important;
|
|
230
230
|
border: none !important;
|
|
@@ -240,11 +240,11 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
240
240
|
justify-content: center !important;
|
|
241
241
|
"
|
|
242
242
|
>
|
|
243
|
-
${
|
|
243
|
+
${Z}
|
|
244
244
|
</button>
|
|
245
245
|
`,W=()=>`
|
|
246
246
|
<button
|
|
247
|
-
id="${
|
|
247
|
+
id="${A}"
|
|
248
248
|
style="
|
|
249
249
|
margin-top: 27px !important;
|
|
250
250
|
color: #f3f3f3 !important;
|
|
@@ -259,7 +259,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
259
259
|
>
|
|
260
260
|
Try again
|
|
261
261
|
</button>
|
|
262
|
-
`,
|
|
262
|
+
`,le=()=>`
|
|
263
263
|
${x}
|
|
264
264
|
<div
|
|
265
265
|
style="
|
|
@@ -284,7 +284,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
284
284
|
browser settings.
|
|
285
285
|
</p>
|
|
286
286
|
${W()}
|
|
287
|
-
`,
|
|
287
|
+
`,de=()=>`
|
|
288
288
|
${x}
|
|
289
289
|
<p style="
|
|
290
290
|
color: #b6b6b6 !important;
|
|
@@ -295,9 +295,9 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
295
295
|
Secure pop-up not showing?<br />We'll help you re-launch
|
|
296
296
|
</p>
|
|
297
297
|
${W()}
|
|
298
|
-
`,Y=
|
|
298
|
+
`,Y=i=>`
|
|
299
299
|
<div
|
|
300
|
-
id="${
|
|
300
|
+
id="${C}"
|
|
301
301
|
style="
|
|
302
302
|
position: fixed !important;
|
|
303
303
|
top: 0 !important;
|
|
@@ -322,7 +322,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
322
322
|
>
|
|
323
323
|
${ae()}
|
|
324
324
|
<div
|
|
325
|
-
id="${
|
|
325
|
+
id="${y}"
|
|
326
326
|
style="
|
|
327
327
|
display: flex !important;
|
|
328
328
|
flex-direction: column !important;
|
|
@@ -330,12 +330,12 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
330
330
|
max-width: 400px !important;
|
|
331
331
|
"
|
|
332
332
|
>
|
|
333
|
-
${
|
|
333
|
+
${i??""}
|
|
334
334
|
</div>
|
|
335
335
|
</div>
|
|
336
336
|
`,z=()=>`
|
|
337
337
|
<div
|
|
338
|
-
id="${
|
|
338
|
+
id="${C}"
|
|
339
339
|
style="
|
|
340
340
|
position: fixed;
|
|
341
341
|
top: 0;
|
|
@@ -353,7 +353,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
353
353
|
"
|
|
354
354
|
>
|
|
355
355
|
<div
|
|
356
|
-
id="${
|
|
356
|
+
id="${y}"
|
|
357
357
|
style="
|
|
358
358
|
display: flex;
|
|
359
359
|
flex-direction: column;
|
|
@@ -362,7 +362,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
362
362
|
"
|
|
363
363
|
/>
|
|
364
364
|
</div>
|
|
365
|
-
`;function A({id:o,href:e,rel:t,crossOrigin:r}){let i=`${h}-${o}`;if(!document.getElementById(i)){let n=document.createElement("link");n.id=i,n.href=e,t&&(n.rel=t),r&&(n.crossOrigin=r),document.head.appendChild(n);}}var X=()=>Y(de()),j=()=>Y(le());var y=class{disableGenericPopupOverlay;disableBlockedPopupOverlay;overlay;isBlockedOverlay;tryAgainListener;onCloseListener;constructor(e,t=!1){this.disableBlockedPopupOverlay=e.disableBlockedPopupOverlay||!1,this.disableGenericPopupOverlay=e.disableGenericPopupOverlay||!1,this.isBlockedOverlay=t;}append(e,t){this.shouldAppendOverlay()&&(this.appendOverlay(),this.updateTryAgainButton(e),this.updateCloseButton(t));}update(e){this.updateTryAgainButton(e);}remove(){this.overlay&&this.overlay.remove();}shouldAppendOverlay(){return !(this.disableGenericPopupOverlay&&this.disableBlockedPopupOverlay||this.disableGenericPopupOverlay&&!this.isBlockedOverlay||this.disableBlockedPopupOverlay&&this.isBlockedOverlay)}appendOverlay(){if(!this.overlay){A({id:"link-googleapis",href:"https://fonts.googleapis.com"}),A({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),A({id:"link-roboto",href:"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap",rel:"stylesheet"});let t=document.createElement("div");t.innerHTML=this.isBlockedOverlay?X():j(),document.body.insertAdjacentElement("beforeend",t),this.overlay=t;}}updateTryAgainButton(e){let t=document.getElementById(I);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(P);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var b=class{storage;constructor(e,t){this.storage=pe__default.default.createInstance({name:e,driver:t});}get length(){return this.storage.length()}clear(){return this.storage.clear()}getItem(e){return this.storage.getItem(e)}key(e){return this.storage.key(e)}async removeItem(e){await this.storage.removeItem(e);}async setItem(e,t){await this.storage.setItem(e,t);}};var Oe=500,ye={headers:{"Content-Type":"application/x-www-form-urlencoded"}},ve="/v2/logout",Te="/im-logged-out",Le="/authorize",Pe=o=>o?Te:ve,Ie=o=>{let{authenticationDomain:e,oidcConfiguration:t}=o,r;o.crossSdkBridgeEnabled?r=new b("ImmutableSDKPassport",pe__default.default.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new oidcClientTs.InMemoryWebStorage;let i=new oidcClientTs.WebStorageStateStore({store:r}),n=new URL(Pe(o.crossSdkBridgeEnabled),e.replace(/^(?:https?:\/\/)?(.*)/,"https://$1"));return n.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&n.searchParams.set("returnTo",t.logoutRedirectUri),{authority:e,redirect_uri:t.redirectUri,popup_redirect_uri:t.popupRedirectUri||t.redirectUri,client_id:t.clientId,metadata:{authorization_endpoint:`${e}/authorize`,token_endpoint:`${e}/oauth/token`,userinfo_endpoint:`${e}/userinfo`,end_session_endpoint:n.toString(),revocation_endpoint:`${e}/oauth/revoke`},automaticSilentRenew:!1,scope:t.scope,userStore:i,revokeTokenTypes:["refresh_token"],extraQueryParams:{...t.audience?{audience:t.audience}:{}}}};function D(o){return btoa(String.fromCharCode(...new Uint8Array(o))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Ae(o){let t=new TextEncoder().encode(o);return await window.crypto.subtle.digest("SHA-256",t)}var E=class o{userManager;deviceCredentialsManager;config;embeddedLoginPrompt;logoutMode;refreshingPromise=null;constructor(e,t){this.config=e,this.userManager=new oidcClientTs.UserManager(Ie(e)),this.deviceCredentialsManager=new C,this.embeddedLoginPrompt=t,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=q__default.default(e.id_token)?.passport);let r={expired:e.expired,idToken:e.id_token,accessToken:e.access_token,refreshToken:e.refresh_token,profile:{sub:e.profile.sub,email:e.profile.email,nickname:e.profile.nickname}};return t?.imx_eth_address&&(r.imx={ethAddress:t.imx_eth_address,starkAddress:t.imx_stark_address,userAdminAddress:t.imx_user_admin_address}),t?.zkevm_eth_address&&(r.zkEvm={ethAddress:t?.zkevm_eth_address,userAdminAddress:t?.zkevm_user_admin_address}),r};static mapDeviceTokenResponseToOidcUser=e=>{let t=q__default.default(e.id_token);return new oidcClientTs.User({id_token:e.id_token,access_token:e.access_token,refresh_token:e.refresh_token,token_type:e.token_type,profile:{sub:t.sub,iss:t.iss,aud:t.aud,exp:t.exp,iat:t.iat,email:t.email,nickname:t.nickname,passport:t.passport}})};buildExtraQueryParams(e,t){let r={...this.userManager.settings?.extraQueryParams??{},rid:metrics.getDetail(metrics.Detail.RUNTIME_ID)||"",third_party_a_id:""};if(e){if(e.directLoginMethod==="email"){let i=e.email;i&&(r.direct=e.directLoginMethod,r.email=i);}else r.direct=e.directLoginMethod;e.marketingConsentStatus&&(r.marketingConsent=e.marketingConsentStatus);}return t&&(r.im_passport_trace_id=t),r}async loginWithRedirect(e){return await this.userManager.clearStaleState(),g(async()=>{let t=this.buildExtraQueryParams(e);await this.userManager.signinRedirect({extraQueryParams:t});},"AUTHENTICATION_ERROR")}async login(e){return g(async()=>{let t,r;if(e)t=e;else if(!this.config.popupOverlayOptions?.disableHeadlessLoginPromptOverlay){let{imPassportTraceId:l,...d}=await this.embeddedLoginPrompt.displayEmbeddedLoginPrompt();t=d,r=l;}let i=window.crypto.randomUUID(),n=async()=>{let l=this.buildExtraQueryParams(t,r),d=this.userManager.signinPopup({extraQueryParams:l,popupWindowFeatures:{width:410,height:450},popupWindowTarget:i}),p=window.open("",i);if(p){let f=new Promise((a,u)=>{let S=setInterval(()=>{p.closed&&(clearInterval(S),u(new Error("Popup closed by user")));},Oe);d.finally(()=>{clearInterval(S),p.close();});});return Promise.race([d,f])}return d};return new Promise((l,d)=>{n().then(p=>{l(o.mapOidcUserToDomainModel(p));}).catch(p=>{if(!(p instanceof Error)||p.message!=="Attempted to navigate on a disposed window"){d(p);return}let f=!1,a=new y(this.config.popupOverlayOptions||{},!0);a.append(async()=>{try{if(f)window.open("",i);else {f=!0;let u=await n();a.remove(),l(o.mapOidcUserToDomainModel(u));}}catch(u){a.remove(),d(u);}},()=>{a.remove(),d(new Error("Popup closed by user"));});});})},"AUTHENTICATION_ERROR")}async getUserOrLogin(){let e=null;try{e=await this.getUser();}catch(t){R.warn("Failed to retrieve a cached user session",t);}return e||this.login()}static shouldUseSigninPopupCallback(){try{let r=`oidc.${new URLSearchParams(window.location.search).get("state")}`,i=localStorage.getItem(r);return JSON.parse(i||"{}")?.request_type==="si:p"}catch{return !1}}async loginCallback(){return g(async()=>{if(o.shouldUseSigninPopupCallback()){await this.userManager.signinPopupCallback(void 0,!0);return}let e=await this.userManager.signinCallback();if(e)return o.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async getPKCEAuthorizationUrl(e,t){let r=D(window.crypto.getRandomValues(new Uint8Array(32))),i=D(await Ae(r)),n=D(window.crypto.getRandomValues(new Uint8Array(32))),{redirectUri:l,scope:d,audience:p,clientId:f}=this.config.oidcConfiguration;this.deviceCredentialsManager.savePKCEData({state:n,verifier:r});let a=new URL(Le,this.config.authenticationDomain);if(a.searchParams.set("response_type","code"),a.searchParams.set("code_challenge",i),a.searchParams.set("code_challenge_method","S256"),a.searchParams.set("client_id",f),a.searchParams.set("redirect_uri",l),a.searchParams.set("state",n),d&&a.searchParams.set("scope",d),p&&a.searchParams.set("audience",p),e){if(e.directLoginMethod==="email"){let u=e.email;u&&(a.searchParams.set("direct",e.directLoginMethod),a.searchParams.set("email",u));}else a.searchParams.set("direct",e.directLoginMethod);e.marketingConsentStatus&&a.searchParams.set("marketingConsent",e.marketingConsentStatus);}return t&&a.searchParams.set("im_passport_trace_id",t),a.toString()}async loginWithPKCEFlowCallback(e,t){return g(async()=>{let r=this.deviceCredentialsManager.getPKCEData();if(!r)throw new Error("No code verifier or state for PKCE");if(t!==r.state)throw new Error("Provided state does not match stored state");let i=await this.getPKCEToken(e,r.verifier),n=o.mapDeviceTokenResponseToOidcUser(i),l=o.mapOidcUserToDomainModel(n);return await this.userManager.storeUser(n),l},"AUTHENTICATION_ERROR")}async getPKCEToken(e,t){return (await Ee__default.default.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"authorization_code",code_verifier:t,code:e,redirect_uri:this.config.oidcConfiguration.redirectUri},ye)).data}async storeTokens(e){return g(async()=>{let t=o.mapDeviceTokenResponseToOidcUser(e),r=o.mapOidcUserToDomainModel(t);return await this.userManager.storeUser(t),r},"AUTHENTICATION_ERROR")}async logout(){return g(async()=>{await this.userManager.revokeTokens(["refresh_token"]),this.logoutMode==="silent"?await this.userManager.signoutSilent():await this.userManager.signoutRedirect();},"LOGOUT_ERROR")}async logoutSilentCallback(e){return this.userManager.signoutSilentCallback(e)}async removeUser(){return this.userManager.removeUser()}async getLogoutUrl(){let e=this.userManager.settings?.metadata?.end_session_endpoint;return e||(R.warn("Failed to get logout URL"),null)}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{R.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(R.warn("Failed to refresh user token",e),null))}async refreshTokenAndUpdatePromise(){return this.refreshingPromise?this.refreshingPromise:(this.refreshingPromise=new Promise(async(e,t)=>{try{let r=await this.userManager.signinSilent();if(r){e(o.mapOidcUserToDomainModel(r));return}e(null);}catch(r){let i="AUTHENTICATION_ERROR",n="Failed to refresh token",l=!0;if(r instanceof oidcClientTs.ErrorTimeout?(i="SILENT_LOGIN_ERROR",n=`${n}: ${r.message}`,l=!1):r instanceof oidcClientTs.ErrorResponse?(i="NOT_LOGGED_IN_ERROR",n=`${n}: ${r.message||r.error_description}`):r instanceof Error?n=`${n}: ${r.message}`:typeof r=="string"&&(n=`${n}: ${r}`),l)try{await this.userManager.removeUser();}catch(d){d instanceof Error&&(n=`${n}: Failed to remove user: ${d.message}`);}t(new c(n,i));}finally{this.refreshingPromise=null;}}),this.refreshingPromise)}async getUser(e=t=>!0){if(this.refreshingPromise){let r=await this.refreshingPromise;return r&&e(r)?r:null}let t=await this.userManager.getUser();if(!t)return null;if(!G(t)){let r=o.mapOidcUserToDomainModel(t);if(r&&e(r))return r}if(t.refresh_token){let r=await this.refreshTokenAndUpdatePromise();if(r&&e(r))return r}return null}async getUserZkEvm(){let e=await this.getUser(w);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(U);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};var be=(o,e,t)=>{let r=e.map(i=>!o[i]&&i).filter(i=>i).join(", ");if(r!==""){let i=`${r} cannot be null`;throw new c(i,"INVALID_CONFIGURATION")}},v=class{authenticationDomain;passportDomain;oidcConfiguration;crossSdkBridgeEnabled;popupOverlayOptions;constructor({authenticationDomain:e,passportDomain:t,crossSdkBridgeEnabled:r,popupOverlayOptions:i,...n}){be(n,["clientId","redirectUri"]),this.oidcConfiguration=n,this.crossSdkBridgeEnabled=r||!1,this.popupOverlayOptions=i,this.authenticationDomain=e||"https://auth.immutable.com",this.passportDomain=t||"https://passport.immutable.com";}};var Q="im_passport_embedded_login_prompt";var m=class{static overlay;static onCloseListener;static closeButton;static remove(){this.onCloseListener&&this.closeButton?.removeEventListener?.("click",this.onCloseListener),this.overlay?.remove(),this.closeButton=void 0,this.onCloseListener=void 0,this.overlay=void 0;}static appendOverlay(e,t){if(!this.overlay){let r=document.createElement("div");r.innerHTML=z(),document.body.insertAdjacentElement("beforeend",r);let i=document.querySelector(`#${O}`);i&&i.appendChild(e),r.addEventListener("click",t),this.overlay=r;}}};var Ue=660,Me=440,xe="16px",J="passport-embedded-login-keyframes",ee="passport-embedded-login-iframe",T=class o{config;constructor(e){this.config=e;}getHref=()=>`${this.config.authenticationDomain}/im-embedded-login-prompt?client_id=${this.config.oidcConfiguration.clientId}&rid=${metrics.getDetail(metrics.Detail.RUNTIME_ID)}`;static appendIFrameStylesIfNeeded=()=>{if(document.getElementById(J))return;let e=document.createElement("style");e.id=J,e.textContent=`
|
|
365
|
+
`;function w({id:i,href:e,rel:t,crossOrigin:r}){let o=`${C}-${i}`;if(!document.getElementById(o)){let n=document.createElement("link");n.id=o,n.href=e,t&&(n.rel=t),r&&(n.crossOrigin=r),document.head.appendChild(n);}}var j=()=>Y(le()),Q=()=>Y(de());var v=class{disableGenericPopupOverlay;disableBlockedPopupOverlay;overlay;isBlockedOverlay;tryAgainListener;onCloseListener;constructor(e,t=!1){this.disableBlockedPopupOverlay=e.disableBlockedPopupOverlay||!1,this.disableGenericPopupOverlay=e.disableGenericPopupOverlay||!1,this.isBlockedOverlay=t;}append(e,t){this.shouldAppendOverlay()&&(this.appendOverlay(),this.updateTryAgainButton(e),this.updateCloseButton(t));}update(e){this.updateTryAgainButton(e);}remove(){this.overlay&&this.overlay.remove();}shouldAppendOverlay(){return !(this.disableGenericPopupOverlay&&this.disableBlockedPopupOverlay||this.disableGenericPopupOverlay&&!this.isBlockedOverlay||this.disableBlockedPopupOverlay&&this.isBlockedOverlay)}appendOverlay(){if(!this.overlay){w({id:"link-googleapis",href:"https://fonts.googleapis.com"}),w({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),w({id:"link-roboto",href:"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap",rel:"stylesheet"});let t=document.createElement("div");t.innerHTML=this.isBlockedOverlay?j():Q(),document.body.insertAdjacentElement("beforeend",t),this.overlay=t;}}updateTryAgainButton(e){let t=document.getElementById(A);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(I);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var k=class{storage;constructor(e,t){this.storage=ce__default.default.createInstance({name:e,driver:t});}get length(){return this.storage.length()}clear(){return this.storage.clear()}getItem(e){return this.storage.getItem(e)}key(e){return this.storage.key(e)}async removeItem(e){await this.storage.removeItem(e);}async setItem(e,t){await this.storage.setItem(e,t);}};var Oe=500,ye={headers:{"Content-Type":"application/x-www-form-urlencoded"}},ve="/v2/logout",Te="/im-logged-out",Le="/authorize",Pe=i=>i?Te:ve,Ie=i=>{let{authenticationDomain:e,oidcConfiguration:t}=i,r;i.crossSdkBridgeEnabled?r=new k("ImmutableSDKPassport",ce__default.default.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new oidcClientTs.InMemoryWebStorage;let o=new oidcClientTs.WebStorageStateStore({store:r}),n=new URL(Pe(i.crossSdkBridgeEnabled),e.replace(/^(?:https?:\/\/)?(.*)/,"https://$1"));return n.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&n.searchParams.set("returnTo",t.logoutRedirectUri),{authority:e,redirect_uri:t.redirectUri,popup_redirect_uri:t.popupRedirectUri||t.redirectUri,client_id:t.clientId,metadata:{authorization_endpoint:`${e}/authorize`,token_endpoint:`${e}/oauth/token`,userinfo_endpoint:`${e}/userinfo`,end_session_endpoint:n.toString(),revocation_endpoint:`${e}/oauth/revoke`},automaticSilentRenew:!1,scope:t.scope,userStore:o,revokeTokenTypes:["refresh_token"],extraQueryParams:{...t.audience?{audience:t.audience}:{}}}};function D(i){return btoa(String.fromCharCode(...new Uint8Array(i))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Ae(i){let t=new TextEncoder().encode(i);return await window.crypto.subtle.digest("SHA-256",t)}var _=class i{userManager;deviceCredentialsManager;config;embeddedLoginPrompt;logoutMode;refreshingPromise=null;constructor(e,t){this.config=e,this.userManager=new oidcClientTs.UserManager(Ie(e)),this.deviceCredentialsManager=new O,this.embeddedLoginPrompt=t,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=q__default.default(e.id_token)?.passport);let r={expired:e.expired,idToken:e.id_token,accessToken:e.access_token,refreshToken:e.refresh_token,profile:{sub:e.profile.sub,email:e.profile.email,nickname:e.profile.nickname}};return t?.zkevm_eth_address&&t?.zkevm_user_admin_address&&(r.zkEvm={ethAddress:t.zkevm_eth_address,userAdminAddress:t.zkevm_user_admin_address}),r};static mapDeviceTokenResponseToOidcUser=e=>{let t=q__default.default(e.id_token);return new oidcClientTs.User({id_token:e.id_token,access_token:e.access_token,refresh_token:e.refresh_token,token_type:e.token_type,profile:{sub:t.sub,iss:t.iss,aud:t.aud,exp:t.exp,iat:t.iat,email:t.email,nickname:t.nickname,passport:t.passport}})};buildExtraQueryParams(e,t){let r={...this.userManager.settings?.extraQueryParams??{},rid:metrics.getDetail(metrics.Detail.RUNTIME_ID)||"",third_party_a_id:""};if(e){if(e.directLoginMethod==="email"){let o=e.email;o&&(r.direct=e.directLoginMethod,r.email=o);}else r.direct=e.directLoginMethod;e.marketingConsentStatus&&(r.marketingConsent=e.marketingConsentStatus);}return t&&(r.im_passport_trace_id=t),r}async getClientId(){return this.config.oidcConfiguration.clientId}async loginWithRedirect(e){return await this.userManager.clearStaleState(),f(async()=>{let t=this.buildExtraQueryParams(e);await this.userManager.signinRedirect({extraQueryParams:t});},"AUTHENTICATION_ERROR")}async login(e){return f(async()=>{let t,r;if(e)t=e;else if(!this.config.popupOverlayOptions?.disableHeadlessLoginPromptOverlay){let{imPassportTraceId:d,...l}=await this.embeddedLoginPrompt.displayEmbeddedLoginPrompt();t=l,r=d;}let o=window.crypto.randomUUID(),n=async()=>{let d=this.buildExtraQueryParams(t,r),l=this.userManager.signinPopup({extraQueryParams:d,popupWindowFeatures:{width:410,height:450},popupWindowTarget:o}),c=window.open("",o);if(c){let E=new Promise((a,g)=>{let S=setInterval(()=>{c.closed&&(clearInterval(S),g(new Error("Popup closed by user")));},Oe);l.finally(()=>{clearInterval(S),c.close();});});return Promise.race([l,E])}return l};return new Promise((d,l)=>{n().then(c=>{d(i.mapOidcUserToDomainModel(c));}).catch(c=>{if(!(c instanceof Error)||c.message!=="Attempted to navigate on a disposed window"){l(c);return}let E=!1,a=new v(this.config.popupOverlayOptions||{},!0);a.append(async()=>{try{if(E)window.open("",o);else {E=!0;let g=await n();a.remove(),d(i.mapOidcUserToDomainModel(g));}}catch(g){a.remove(),l(g);}},()=>{a.remove(),l(new Error("Popup closed by user"));});});})},"AUTHENTICATION_ERROR")}async getUserOrLogin(){let e=null;try{e=await this.getUser();}catch(t){h.warn("Failed to retrieve a cached user session",t);}return e||this.login()}static shouldUseSigninPopupCallback(){try{let r=`oidc.${new URLSearchParams(window.location.search).get("state")}`,o=localStorage.getItem(r);return JSON.parse(o||"{}")?.request_type==="si:p"}catch{return !1}}async loginCallback(){return f(async()=>{if(i.shouldUseSigninPopupCallback()){await this.userManager.signinPopupCallback(void 0,!0);return}let e=await this.userManager.signinCallback();if(e)return i.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async getPKCEAuthorizationUrl(e,t){let r=D(window.crypto.getRandomValues(new Uint8Array(32))),o=D(await Ae(r)),n=D(window.crypto.getRandomValues(new Uint8Array(32))),{redirectUri:d,scope:l,audience:c,clientId:E}=this.config.oidcConfiguration;this.deviceCredentialsManager.savePKCEData({state:n,verifier:r});let a=new URL(Le,this.config.authenticationDomain);if(a.searchParams.set("response_type","code"),a.searchParams.set("code_challenge",o),a.searchParams.set("code_challenge_method","S256"),a.searchParams.set("client_id",E),a.searchParams.set("redirect_uri",d),a.searchParams.set("state",n),l&&a.searchParams.set("scope",l),c&&a.searchParams.set("audience",c),e){if(e.directLoginMethod==="email"){let g=e.email;g&&(a.searchParams.set("direct",e.directLoginMethod),a.searchParams.set("email",g));}else a.searchParams.set("direct",e.directLoginMethod);e.marketingConsentStatus&&a.searchParams.set("marketingConsent",e.marketingConsentStatus);}return t&&a.searchParams.set("im_passport_trace_id",t),a.toString()}async loginWithPKCEFlowCallback(e,t){return f(async()=>{let r=this.deviceCredentialsManager.getPKCEData();if(!r)throw new Error("No code verifier or state for PKCE");if(t!==r.state)throw new Error("Provided state does not match stored state");let o=await this.getPKCEToken(e,r.verifier),n=i.mapDeviceTokenResponseToOidcUser(o),d=i.mapOidcUserToDomainModel(n);return await this.userManager.storeUser(n),d},"AUTHENTICATION_ERROR")}async getPKCEToken(e,t){return (await Ee__default.default.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"authorization_code",code_verifier:t,code:e,redirect_uri:this.config.oidcConfiguration.redirectUri},ye)).data}async storeTokens(e){return f(async()=>{let t=i.mapDeviceTokenResponseToOidcUser(e),r=i.mapOidcUserToDomainModel(t);return await this.userManager.storeUser(t),r},"AUTHENTICATION_ERROR")}async logout(){return f(async()=>{await this.userManager.revokeTokens(["refresh_token"]),this.logoutMode==="silent"?await this.userManager.signoutSilent():await this.userManager.signoutRedirect();},"LOGOUT_ERROR")}async logoutSilentCallback(e){return this.userManager.signoutSilentCallback(e)}async removeUser(){return this.userManager.removeUser()}async getLogoutUrl(){let e=this.userManager.settings?.metadata?.end_session_endpoint;return e||(h.warn("Failed to get logout URL"),null)}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{h.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(h.warn("Failed to refresh user token",e),null))}async refreshTokenAndUpdatePromise(){return this.refreshingPromise?this.refreshingPromise:(this.refreshingPromise=new Promise(async(e,t)=>{try{let r=await this.userManager.signinSilent();if(r){e(i.mapOidcUserToDomainModel(r));return}e(null);}catch(r){let o="AUTHENTICATION_ERROR",n="Failed to refresh token",d=!0;if(r instanceof oidcClientTs.ErrorTimeout?(o="SILENT_LOGIN_ERROR",n=`${n}: ${r.message}`,d=!1):r instanceof oidcClientTs.ErrorResponse?(o="NOT_LOGGED_IN_ERROR",n=`${n}: ${r.message||r.error_description}`):r instanceof Error?n=`${n}: ${r.message}`:typeof r=="string"&&(n=`${n}: ${r}`),d)try{await this.userManager.removeUser();}catch(l){l instanceof Error&&(n=`${n}: Failed to remove user: ${l.message}`);}t(new u(n,o));}finally{this.refreshingPromise=null;}}),this.refreshingPromise)}async getUser(e=t=>!0){if(this.refreshingPromise){let r=await this.refreshingPromise;return r&&e(r)?r:null}let t=await this.userManager.getUser();if(!t)return null;if(!G(t)){let r=i.mapOidcUserToDomainModel(t);if(r&&e(r))return r}if(t.refresh_token){let r=await this.refreshTokenAndUpdatePromise();if(r&&e(r))return r}return null}async getUserZkEvm(){let e=await this.getUser(M);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}};var we=(i,e,t)=>{let r=e.map(o=>!i[o]&&o).filter(o=>o).join(", ");if(r!==""){let o=`${r} cannot be null`;throw new u(o,"INVALID_CONFIGURATION")}},T=class{authenticationDomain;passportDomain;oidcConfiguration;crossSdkBridgeEnabled;popupOverlayOptions;constructor({authenticationDomain:e,passportDomain:t,crossSdkBridgeEnabled:r,popupOverlayOptions:o,...n}){we(n,["clientId","redirectUri"]),this.oidcConfiguration=n,this.crossSdkBridgeEnabled=r||!1,this.popupOverlayOptions=o,this.authenticationDomain=e||"https://auth.immutable.com",this.passportDomain=t||"https://passport.immutable.com";}};var X="im_passport_embedded_login_prompt";var m=class{static overlay;static onCloseListener;static closeButton;static remove(){this.onCloseListener&&this.closeButton?.removeEventListener?.("click",this.onCloseListener),this.overlay?.remove(),this.closeButton=void 0,this.onCloseListener=void 0,this.overlay=void 0;}static appendOverlay(e,t){if(!this.overlay){let r=document.createElement("div");r.innerHTML=z(),document.body.insertAdjacentElement("beforeend",r);let o=document.querySelector(`#${y}`);o&&o.appendChild(e),r.addEventListener("click",t),this.overlay=r;}}};var Me=660,Ue=440,xe="16px",J="passport-embedded-login-keyframes",ee="passport-embedded-login-iframe",L=class i{config;constructor(e){this.config=e;}getHref=()=>`${this.config.authenticationDomain}/im-embedded-login-prompt?client_id=${this.config.oidcConfiguration.clientId}&rid=${metrics.getDetail(metrics.Detail.RUNTIME_ID)}`;static appendIFrameStylesIfNeeded=()=>{if(document.getElementById(J))return;let e=document.createElement("style");e.id=J,e.textContent=`
|
|
366
366
|
@keyframes passportEmbeddedLoginPromptPopBounceIn {
|
|
367
367
|
0% {
|
|
368
368
|
opacity: 0.5;
|
|
@@ -395,17 +395,16 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
395
395
|
opacity: 1;
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
|
-
`,document.head.appendChild(e);};getEmbeddedLoginIFrame=()=>{let e=document.createElement("iframe");return e.id=ee,e.src=this.getHref(),e.style.height="100vh",e.style.width="100vw",e.style.maxHeight=`${
|
|
398
|
+
`,document.head.appendChild(e);};getEmbeddedLoginIFrame=()=>{let e=document.createElement("iframe");return e.id=ee,e.src=this.getHref(),e.style.height="100vh",e.style.width="100vw",e.style.maxHeight=`${Me}px`,e.style.maxWidth=`${Ue}px`,e.style.borderRadius=xe,e.style.opacity="0",e.style.transform="scale(0.6)",e.style.animation="passportEmbeddedLoginPromptPopBounceIn 1s ease forwards",i.appendIFrameStylesIfNeeded(),e};displayEmbeddedLoginPrompt(){return new Promise((e,t)=>{let r=this.getEmbeddedLoginIFrame(),o=({data:n,origin:d})=>{if(!(d!==this.config.authenticationDomain||n.eventType!==X))switch(n.messageType){case"login_method_selected":{let l=n.payload;window.removeEventListener("message",o),m.remove(),e(l);break}case"login_prompt_error":{window.removeEventListener("message",o),m.remove(),t(new Error("Error during embedded login prompt",{cause:n.payload}));break}case"login_prompt_closed":{window.removeEventListener("message",o),m.remove(),t(new Error("Popup closed by user"));break}default:window.removeEventListener("message",o),m.remove(),t(new Error(`Unsupported message type: ${n.messageType}`));break}};window.addEventListener("message",o),m.appendOverlay(r,()=>{window.removeEventListener("message",o),m.remove(),t(new Error("Popup closed by user"));});})}};var R=class{emitter=new events.EventEmitter;emit(e,...t){this.emitter.emit(e,...t);}on(e,t){this.emitter.on(e,t);}removeListener(e,t){this.emitter.removeListener(e,t);}};var p=async(i,e,t=!0,r=!0)=>{let o=metrics.trackFlow("passport",e,t);try{return await i(o)}catch(n){throw n instanceof Error?metrics.trackError("passport",e,n,{flowId:o.details.flowId}):o.addEvent("errored"),n}finally{r&&o.addEvent("End");}};var N=class{authManager;config;eventEmitter;constructor(e){this.config=new T(e);let t=new L(this.config);this.authManager=new _(this.config,t),this.eventEmitter=new R,metrics.track("passport","initialise");}async login(e){return p(async()=>{let{useCachedSession:t=!1,useSilentLogin:r}=e||{},o=null;try{o=await this.authManager.getUser();}catch(n){if(n instanceof Error&&!n.message.includes("Unknown or invalid refresh token")&&metrics.trackError("passport","login",n),t)throw n;h.warn("Failed to retrieve a cached user session",n);}if(!o&&r)o=await this.authManager.forceUserRefresh();else if(!o&&!t){if(e?.useRedirectFlow)return await this.authManager.loginWithRedirect(e?.directLoginOptions),null;o=await this.authManager.login(e?.directLoginOptions);}return o&&(this.eventEmitter.emit("loggedIn",o),metrics.identify({passportId:o.profile.sub})),o},"login")}async loginWithRedirect(e){await this.authManager.loginWithRedirect(e);}async loginCallback(){return p(async()=>{let e=await this.authManager.loginCallback();if(!e)throw new Error("Login callback failed - no user returned");return this.eventEmitter.emit("loggedIn",e),metrics.identify({passportId:e.profile.sub}),e},"loginCallback")}async logout(){await p(async()=>{await this.authManager.logout(),this.eventEmitter.emit("loggedOut");},"logout");}async getUser(){return p(async()=>this.authManager.getUser(),"getUserInfo",!1)}async getIdToken(){return p(async()=>(await this.authManager.getUser())?.idToken,"getIdToken",!1)}async getAccessToken(){return p(async()=>(await this.authManager.getUser())?.accessToken,"getAccessToken",!1,!1)}async isLoggedIn(){return await this.getUser()!==null}async forceUserRefresh(){return this.authManager.forceUserRefresh()}async loginWithPKCEFlow(e,t){return p(async()=>this.authManager.getPKCEAuthorizationUrl(e,t),"loginWithPKCEFlow")}async loginWithPKCEFlowCallback(e,t){return p(async()=>{let r=await this.authManager.loginWithPKCEFlowCallback(e,t);return this.eventEmitter.emit("loggedIn",r),metrics.identify({passportId:r.profile.sub}),r},"loginWithPKCEFlowCallback")}async storeTokens(e){return p(async()=>{let t=await this.authManager.storeTokens(e);return this.eventEmitter.emit("loggedIn",t),metrics.identify({passportId:t.profile.sub}),t},"storeTokens")}async getLogoutUrl(){return p(async()=>(await this.authManager.removeUser(),this.eventEmitter.emit("loggedOut"),await this.authManager.getLogoutUrl()||void 0),"getLogoutUrl")}async logoutSilentCallback(e){return p(()=>this.authManager.logoutSilentCallback(e),"logoutSilentCallback")}getAuthManager(){return this.authManager}getConfig(){return this.config}};
|
|
399
399
|
|
|
400
400
|
exports.Auth = N;
|
|
401
|
-
exports.AuthConfiguration =
|
|
402
|
-
exports.AuthEvents =
|
|
403
|
-
exports.AuthManager =
|
|
404
|
-
exports.MarketingConsentStatus =
|
|
405
|
-
exports.PassportError =
|
|
406
|
-
exports.PassportErrorType =
|
|
401
|
+
exports.AuthConfiguration = T;
|
|
402
|
+
exports.AuthEvents = U;
|
|
403
|
+
exports.AuthManager = _;
|
|
404
|
+
exports.MarketingConsentStatus = K;
|
|
405
|
+
exports.PassportError = u;
|
|
406
|
+
exports.PassportErrorType = P;
|
|
407
407
|
exports.RollupType = B;
|
|
408
|
-
exports.TypedEventEmitter =
|
|
409
|
-
exports.
|
|
410
|
-
exports.
|
|
411
|
-
exports.withPassportError = g;
|
|
408
|
+
exports.TypedEventEmitter = R;
|
|
409
|
+
exports.isUserZkEvm = M;
|
|
410
|
+
exports.withPassportError = f;
|
package/dist/node/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { UserManager, User, ErrorTimeout, ErrorResponse, InMemoryWebStorage, WebStorageStateStore } from 'oidc-client-ts';
|
|
2
2
|
import Ee, { isAxiosError } from 'axios';
|
|
3
3
|
import q from 'jwt-decode';
|
|
4
|
-
import { getDetail, Detail, track, identify } from '@imtbl/metrics';
|
|
5
|
-
import
|
|
4
|
+
import { getDetail, Detail, track, trackFlow, trackError, identify } from '@imtbl/metrics';
|
|
5
|
+
import ce from 'localforage';
|
|
6
6
|
import { EventEmitter } from 'events';
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var F="pkce_state",H="pkce_verifier",re=3600,O=class{isTokenValid(e){try{let r=q(e).exp??0,o=Date.now()/1e3+re;return r>o}catch{return !1}}savePKCEData(e){localStorage.setItem(F,e.state),localStorage.setItem(H,e.verifier);}getPKCEData(){let e=localStorage.getItem(F),t=localStorage.getItem(H);return e&&t?{state:e,verifier:t}:null}};var oe=(...i)=>{if(typeof process>"u")return;process?.env?.JEST_WORKER_ID===void 0&&console.warn(...i);},h={warn:oe};function V(i){try{let e=q(i),t=Math.floor(Date.now()/1e3);return e.exp?e.exp<=t+30:!0}catch{return !0}}function G(i){let{id_token:e,access_token:t}=i;return !t||!e?!0:V(t)||V(e)}var P=(s=>(s.AUTHENTICATION_ERROR="AUTHENTICATION_ERROR",s.INVALID_CONFIGURATION="INVALID_CONFIGURATION",s.WALLET_CONNECTION_ERROR="WALLET_CONNECTION_ERROR",s.NOT_LOGGED_IN_ERROR="NOT_LOGGED_IN_ERROR",s.SILENT_LOGIN_ERROR="SILENT_LOGIN_ERROR",s.REFRESH_TOKEN_ERROR="REFRESH_TOKEN_ERROR",s.USER_REGISTRATION_ERROR="USER_REGISTRATION_ERROR",s.USER_NOT_REGISTERED_ERROR="USER_NOT_REGISTERED_ERROR",s.LOGOUT_ERROR="LOGOUT_ERROR",s.TRANSFER_ERROR="TRANSFER_ERROR",s.CREATE_ORDER_ERROR="CREATE_ORDER_ERROR",s.CANCEL_ORDER_ERROR="CANCEL_ORDER_ERROR",s.EXCHANGE_TRANSFER_ERROR="EXCHANGE_TRANSFER_ERROR",s.CREATE_TRADE_ERROR="CREATE_TRADE_ERROR",s.OPERATION_NOT_SUPPORTED_ERROR="OPERATION_NOT_SUPPORTED_ERROR",s.LINK_WALLET_ALREADY_LINKED_ERROR="LINK_WALLET_ALREADY_LINKED_ERROR",s.LINK_WALLET_MAX_WALLETS_LINKED_ERROR="LINK_WALLET_MAX_WALLETS_LINKED_ERROR",s.LINK_WALLET_VALIDATION_ERROR="LINK_WALLET_VALIDATION_ERROR",s.LINK_WALLET_DUPLICATE_NONCE_ERROR="LINK_WALLET_DUPLICATE_NONCE_ERROR",s.LINK_WALLET_GENERIC_ERROR="LINK_WALLET_GENERIC_ERROR",s.SERVICE_UNAVAILABLE_ERROR="SERVICE_UNAVAILABLE_ERROR",s))(P||{});function se(i){return "code"in i&&"message"in i}var u=class extends Error{type;constructor(e,t){super(e),this.type=t;}},f=async(i,e)=>{try{return await i()}catch(t){let r;throw t instanceof u&&t.type==="SERVICE_UNAVAILABLE_ERROR"?new u(t.message,t.type):(isAxiosError(t)&&t.response?.data&&se(t.response.data)?r=t.response.data.message:r=t.message,new u(r,e))}};var B=(e=>(e.ZKEVM="zkEvm",e))(B||{}),M=i=>!!i.zkEvm,K=(t=>(t.OptedIn="opted_in",t.Unsubscribed="unsubscribed",t))(K||{}),U=(t=>(t.LOGGED_OUT="loggedOut",t.LOGGED_IN="loggedIn",t))(U||{});var C="passport-overlay",y="passport-overlay-contents",I=`${C}-close`,A=`${C}-try-again`,Z=`
|
|
9
9
|
<svg
|
|
10
10
|
viewBox="0 0 20 20"
|
|
11
11
|
fill="none"
|
|
@@ -216,7 +216,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
216
216
|
</svg>
|
|
217
217
|
`;var ae=()=>`
|
|
218
218
|
<button
|
|
219
|
-
id="${
|
|
219
|
+
id="${I}"
|
|
220
220
|
style="
|
|
221
221
|
background: #f3f3f326 !important;
|
|
222
222
|
border: none !important;
|
|
@@ -232,11 +232,11 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
232
232
|
justify-content: center !important;
|
|
233
233
|
"
|
|
234
234
|
>
|
|
235
|
-
${
|
|
235
|
+
${Z}
|
|
236
236
|
</button>
|
|
237
237
|
`,W=()=>`
|
|
238
238
|
<button
|
|
239
|
-
id="${
|
|
239
|
+
id="${A}"
|
|
240
240
|
style="
|
|
241
241
|
margin-top: 27px !important;
|
|
242
242
|
color: #f3f3f3 !important;
|
|
@@ -251,7 +251,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
251
251
|
>
|
|
252
252
|
Try again
|
|
253
253
|
</button>
|
|
254
|
-
`,
|
|
254
|
+
`,le=()=>`
|
|
255
255
|
${x}
|
|
256
256
|
<div
|
|
257
257
|
style="
|
|
@@ -276,7 +276,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
276
276
|
browser settings.
|
|
277
277
|
</p>
|
|
278
278
|
${W()}
|
|
279
|
-
`,
|
|
279
|
+
`,de=()=>`
|
|
280
280
|
${x}
|
|
281
281
|
<p style="
|
|
282
282
|
color: #b6b6b6 !important;
|
|
@@ -287,9 +287,9 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
287
287
|
Secure pop-up not showing?<br />We'll help you re-launch
|
|
288
288
|
</p>
|
|
289
289
|
${W()}
|
|
290
|
-
`,Y=
|
|
290
|
+
`,Y=i=>`
|
|
291
291
|
<div
|
|
292
|
-
id="${
|
|
292
|
+
id="${C}"
|
|
293
293
|
style="
|
|
294
294
|
position: fixed !important;
|
|
295
295
|
top: 0 !important;
|
|
@@ -314,7 +314,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
314
314
|
>
|
|
315
315
|
${ae()}
|
|
316
316
|
<div
|
|
317
|
-
id="${
|
|
317
|
+
id="${y}"
|
|
318
318
|
style="
|
|
319
319
|
display: flex !important;
|
|
320
320
|
flex-direction: column !important;
|
|
@@ -322,12 +322,12 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
322
322
|
max-width: 400px !important;
|
|
323
323
|
"
|
|
324
324
|
>
|
|
325
|
-
${
|
|
325
|
+
${i??""}
|
|
326
326
|
</div>
|
|
327
327
|
</div>
|
|
328
328
|
`,z=()=>`
|
|
329
329
|
<div
|
|
330
|
-
id="${
|
|
330
|
+
id="${C}"
|
|
331
331
|
style="
|
|
332
332
|
position: fixed;
|
|
333
333
|
top: 0;
|
|
@@ -345,7 +345,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
345
345
|
"
|
|
346
346
|
>
|
|
347
347
|
<div
|
|
348
|
-
id="${
|
|
348
|
+
id="${y}"
|
|
349
349
|
style="
|
|
350
350
|
display: flex;
|
|
351
351
|
flex-direction: column;
|
|
@@ -354,7 +354,7 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
354
354
|
"
|
|
355
355
|
/>
|
|
356
356
|
</div>
|
|
357
|
-
`;function A({id:o,href:e,rel:t,crossOrigin:r}){let i=`${h}-${o}`;if(!document.getElementById(i)){let n=document.createElement("link");n.id=i,n.href=e,t&&(n.rel=t),r&&(n.crossOrigin=r),document.head.appendChild(n);}}var X=()=>Y(de()),j=()=>Y(le());var y=class{disableGenericPopupOverlay;disableBlockedPopupOverlay;overlay;isBlockedOverlay;tryAgainListener;onCloseListener;constructor(e,t=!1){this.disableBlockedPopupOverlay=e.disableBlockedPopupOverlay||!1,this.disableGenericPopupOverlay=e.disableGenericPopupOverlay||!1,this.isBlockedOverlay=t;}append(e,t){this.shouldAppendOverlay()&&(this.appendOverlay(),this.updateTryAgainButton(e),this.updateCloseButton(t));}update(e){this.updateTryAgainButton(e);}remove(){this.overlay&&this.overlay.remove();}shouldAppendOverlay(){return !(this.disableGenericPopupOverlay&&this.disableBlockedPopupOverlay||this.disableGenericPopupOverlay&&!this.isBlockedOverlay||this.disableBlockedPopupOverlay&&this.isBlockedOverlay)}appendOverlay(){if(!this.overlay){A({id:"link-googleapis",href:"https://fonts.googleapis.com"}),A({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),A({id:"link-roboto",href:"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap",rel:"stylesheet"});let t=document.createElement("div");t.innerHTML=this.isBlockedOverlay?X():j(),document.body.insertAdjacentElement("beforeend",t),this.overlay=t;}}updateTryAgainButton(e){let t=document.getElementById(I);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(P);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var b=class{storage;constructor(e,t){this.storage=pe.createInstance({name:e,driver:t});}get length(){return this.storage.length()}clear(){return this.storage.clear()}getItem(e){return this.storage.getItem(e)}key(e){return this.storage.key(e)}async removeItem(e){await this.storage.removeItem(e);}async setItem(e,t){await this.storage.setItem(e,t);}};var Oe=500,ye={headers:{"Content-Type":"application/x-www-form-urlencoded"}},ve="/v2/logout",Te="/im-logged-out",Le="/authorize",Pe=o=>o?Te:ve,Ie=o=>{let{authenticationDomain:e,oidcConfiguration:t}=o,r;o.crossSdkBridgeEnabled?r=new b("ImmutableSDKPassport",pe.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new InMemoryWebStorage;let i=new WebStorageStateStore({store:r}),n=new URL(Pe(o.crossSdkBridgeEnabled),e.replace(/^(?:https?:\/\/)?(.*)/,"https://$1"));return n.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&n.searchParams.set("returnTo",t.logoutRedirectUri),{authority:e,redirect_uri:t.redirectUri,popup_redirect_uri:t.popupRedirectUri||t.redirectUri,client_id:t.clientId,metadata:{authorization_endpoint:`${e}/authorize`,token_endpoint:`${e}/oauth/token`,userinfo_endpoint:`${e}/userinfo`,end_session_endpoint:n.toString(),revocation_endpoint:`${e}/oauth/revoke`},automaticSilentRenew:!1,scope:t.scope,userStore:i,revokeTokenTypes:["refresh_token"],extraQueryParams:{...t.audience?{audience:t.audience}:{}}}};function D(o){return btoa(String.fromCharCode(...new Uint8Array(o))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Ae(o){let t=new TextEncoder().encode(o);return await window.crypto.subtle.digest("SHA-256",t)}var E=class o{userManager;deviceCredentialsManager;config;embeddedLoginPrompt;logoutMode;refreshingPromise=null;constructor(e,t){this.config=e,this.userManager=new UserManager(Ie(e)),this.deviceCredentialsManager=new C,this.embeddedLoginPrompt=t,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=q(e.id_token)?.passport);let r={expired:e.expired,idToken:e.id_token,accessToken:e.access_token,refreshToken:e.refresh_token,profile:{sub:e.profile.sub,email:e.profile.email,nickname:e.profile.nickname}};return t?.imx_eth_address&&(r.imx={ethAddress:t.imx_eth_address,starkAddress:t.imx_stark_address,userAdminAddress:t.imx_user_admin_address}),t?.zkevm_eth_address&&(r.zkEvm={ethAddress:t?.zkevm_eth_address,userAdminAddress:t?.zkevm_user_admin_address}),r};static mapDeviceTokenResponseToOidcUser=e=>{let t=q(e.id_token);return new User({id_token:e.id_token,access_token:e.access_token,refresh_token:e.refresh_token,token_type:e.token_type,profile:{sub:t.sub,iss:t.iss,aud:t.aud,exp:t.exp,iat:t.iat,email:t.email,nickname:t.nickname,passport:t.passport}})};buildExtraQueryParams(e,t){let r={...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:""};if(e){if(e.directLoginMethod==="email"){let i=e.email;i&&(r.direct=e.directLoginMethod,r.email=i);}else r.direct=e.directLoginMethod;e.marketingConsentStatus&&(r.marketingConsent=e.marketingConsentStatus);}return t&&(r.im_passport_trace_id=t),r}async loginWithRedirect(e){return await this.userManager.clearStaleState(),g(async()=>{let t=this.buildExtraQueryParams(e);await this.userManager.signinRedirect({extraQueryParams:t});},"AUTHENTICATION_ERROR")}async login(e){return g(async()=>{let t,r;if(e)t=e;else if(!this.config.popupOverlayOptions?.disableHeadlessLoginPromptOverlay){let{imPassportTraceId:l,...d}=await this.embeddedLoginPrompt.displayEmbeddedLoginPrompt();t=d,r=l;}let i=window.crypto.randomUUID(),n=async()=>{let l=this.buildExtraQueryParams(t,r),d=this.userManager.signinPopup({extraQueryParams:l,popupWindowFeatures:{width:410,height:450},popupWindowTarget:i}),p=window.open("",i);if(p){let f=new Promise((a,u)=>{let S=setInterval(()=>{p.closed&&(clearInterval(S),u(new Error("Popup closed by user")));},Oe);d.finally(()=>{clearInterval(S),p.close();});});return Promise.race([d,f])}return d};return new Promise((l,d)=>{n().then(p=>{l(o.mapOidcUserToDomainModel(p));}).catch(p=>{if(!(p instanceof Error)||p.message!=="Attempted to navigate on a disposed window"){d(p);return}let f=!1,a=new y(this.config.popupOverlayOptions||{},!0);a.append(async()=>{try{if(f)window.open("",i);else {f=!0;let u=await n();a.remove(),l(o.mapOidcUserToDomainModel(u));}}catch(u){a.remove(),d(u);}},()=>{a.remove(),d(new Error("Popup closed by user"));});});})},"AUTHENTICATION_ERROR")}async getUserOrLogin(){let e=null;try{e=await this.getUser();}catch(t){R.warn("Failed to retrieve a cached user session",t);}return e||this.login()}static shouldUseSigninPopupCallback(){try{let r=`oidc.${new URLSearchParams(window.location.search).get("state")}`,i=localStorage.getItem(r);return JSON.parse(i||"{}")?.request_type==="si:p"}catch{return !1}}async loginCallback(){return g(async()=>{if(o.shouldUseSigninPopupCallback()){await this.userManager.signinPopupCallback(void 0,!0);return}let e=await this.userManager.signinCallback();if(e)return o.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async getPKCEAuthorizationUrl(e,t){let r=D(window.crypto.getRandomValues(new Uint8Array(32))),i=D(await Ae(r)),n=D(window.crypto.getRandomValues(new Uint8Array(32))),{redirectUri:l,scope:d,audience:p,clientId:f}=this.config.oidcConfiguration;this.deviceCredentialsManager.savePKCEData({state:n,verifier:r});let a=new URL(Le,this.config.authenticationDomain);if(a.searchParams.set("response_type","code"),a.searchParams.set("code_challenge",i),a.searchParams.set("code_challenge_method","S256"),a.searchParams.set("client_id",f),a.searchParams.set("redirect_uri",l),a.searchParams.set("state",n),d&&a.searchParams.set("scope",d),p&&a.searchParams.set("audience",p),e){if(e.directLoginMethod==="email"){let u=e.email;u&&(a.searchParams.set("direct",e.directLoginMethod),a.searchParams.set("email",u));}else a.searchParams.set("direct",e.directLoginMethod);e.marketingConsentStatus&&a.searchParams.set("marketingConsent",e.marketingConsentStatus);}return t&&a.searchParams.set("im_passport_trace_id",t),a.toString()}async loginWithPKCEFlowCallback(e,t){return g(async()=>{let r=this.deviceCredentialsManager.getPKCEData();if(!r)throw new Error("No code verifier or state for PKCE");if(t!==r.state)throw new Error("Provided state does not match stored state");let i=await this.getPKCEToken(e,r.verifier),n=o.mapDeviceTokenResponseToOidcUser(i),l=o.mapOidcUserToDomainModel(n);return await this.userManager.storeUser(n),l},"AUTHENTICATION_ERROR")}async getPKCEToken(e,t){return (await Ee.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"authorization_code",code_verifier:t,code:e,redirect_uri:this.config.oidcConfiguration.redirectUri},ye)).data}async storeTokens(e){return g(async()=>{let t=o.mapDeviceTokenResponseToOidcUser(e),r=o.mapOidcUserToDomainModel(t);return await this.userManager.storeUser(t),r},"AUTHENTICATION_ERROR")}async logout(){return g(async()=>{await this.userManager.revokeTokens(["refresh_token"]),this.logoutMode==="silent"?await this.userManager.signoutSilent():await this.userManager.signoutRedirect();},"LOGOUT_ERROR")}async logoutSilentCallback(e){return this.userManager.signoutSilentCallback(e)}async removeUser(){return this.userManager.removeUser()}async getLogoutUrl(){let e=this.userManager.settings?.metadata?.end_session_endpoint;return e||(R.warn("Failed to get logout URL"),null)}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{R.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(R.warn("Failed to refresh user token",e),null))}async refreshTokenAndUpdatePromise(){return this.refreshingPromise?this.refreshingPromise:(this.refreshingPromise=new Promise(async(e,t)=>{try{let r=await this.userManager.signinSilent();if(r){e(o.mapOidcUserToDomainModel(r));return}e(null);}catch(r){let i="AUTHENTICATION_ERROR",n="Failed to refresh token",l=!0;if(r instanceof ErrorTimeout?(i="SILENT_LOGIN_ERROR",n=`${n}: ${r.message}`,l=!1):r instanceof ErrorResponse?(i="NOT_LOGGED_IN_ERROR",n=`${n}: ${r.message||r.error_description}`):r instanceof Error?n=`${n}: ${r.message}`:typeof r=="string"&&(n=`${n}: ${r}`),l)try{await this.userManager.removeUser();}catch(d){d instanceof Error&&(n=`${n}: Failed to remove user: ${d.message}`);}t(new c(n,i));}finally{this.refreshingPromise=null;}}),this.refreshingPromise)}async getUser(e=t=>!0){if(this.refreshingPromise){let r=await this.refreshingPromise;return r&&e(r)?r:null}let t=await this.userManager.getUser();if(!t)return null;if(!G(t)){let r=o.mapOidcUserToDomainModel(t);if(r&&e(r))return r}if(t.refresh_token){let r=await this.refreshTokenAndUpdatePromise();if(r&&e(r))return r}return null}async getUserZkEvm(){let e=await this.getUser(w);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}async getUserImx(){let e=await this.getUser(U);if(!e)throw new Error("Failed to obtain a User with the required IMX attributes");return e}};var be=(o,e,t)=>{let r=e.map(i=>!o[i]&&i).filter(i=>i).join(", ");if(r!==""){let i=`${r} cannot be null`;throw new c(i,"INVALID_CONFIGURATION")}},v=class{authenticationDomain;passportDomain;oidcConfiguration;crossSdkBridgeEnabled;popupOverlayOptions;constructor({authenticationDomain:e,passportDomain:t,crossSdkBridgeEnabled:r,popupOverlayOptions:i,...n}){be(n,["clientId","redirectUri"]),this.oidcConfiguration=n,this.crossSdkBridgeEnabled=r||!1,this.popupOverlayOptions=i,this.authenticationDomain=e||"https://auth.immutable.com",this.passportDomain=t||"https://passport.immutable.com";}};var Q="im_passport_embedded_login_prompt";var m=class{static overlay;static onCloseListener;static closeButton;static remove(){this.onCloseListener&&this.closeButton?.removeEventListener?.("click",this.onCloseListener),this.overlay?.remove(),this.closeButton=void 0,this.onCloseListener=void 0,this.overlay=void 0;}static appendOverlay(e,t){if(!this.overlay){let r=document.createElement("div");r.innerHTML=z(),document.body.insertAdjacentElement("beforeend",r);let i=document.querySelector(`#${O}`);i&&i.appendChild(e),r.addEventListener("click",t),this.overlay=r;}}};var Ue=660,Me=440,xe="16px",J="passport-embedded-login-keyframes",ee="passport-embedded-login-iframe",T=class o{config;constructor(e){this.config=e;}getHref=()=>`${this.config.authenticationDomain}/im-embedded-login-prompt?client_id=${this.config.oidcConfiguration.clientId}&rid=${getDetail(Detail.RUNTIME_ID)}`;static appendIFrameStylesIfNeeded=()=>{if(document.getElementById(J))return;let e=document.createElement("style");e.id=J,e.textContent=`
|
|
357
|
+
`;function w({id:i,href:e,rel:t,crossOrigin:r}){let o=`${C}-${i}`;if(!document.getElementById(o)){let n=document.createElement("link");n.id=o,n.href=e,t&&(n.rel=t),r&&(n.crossOrigin=r),document.head.appendChild(n);}}var j=()=>Y(le()),Q=()=>Y(de());var v=class{disableGenericPopupOverlay;disableBlockedPopupOverlay;overlay;isBlockedOverlay;tryAgainListener;onCloseListener;constructor(e,t=!1){this.disableBlockedPopupOverlay=e.disableBlockedPopupOverlay||!1,this.disableGenericPopupOverlay=e.disableGenericPopupOverlay||!1,this.isBlockedOverlay=t;}append(e,t){this.shouldAppendOverlay()&&(this.appendOverlay(),this.updateTryAgainButton(e),this.updateCloseButton(t));}update(e){this.updateTryAgainButton(e);}remove(){this.overlay&&this.overlay.remove();}shouldAppendOverlay(){return !(this.disableGenericPopupOverlay&&this.disableBlockedPopupOverlay||this.disableGenericPopupOverlay&&!this.isBlockedOverlay||this.disableBlockedPopupOverlay&&this.isBlockedOverlay)}appendOverlay(){if(!this.overlay){w({id:"link-googleapis",href:"https://fonts.googleapis.com"}),w({id:"link-gstatic",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),w({id:"link-roboto",href:"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap",rel:"stylesheet"});let t=document.createElement("div");t.innerHTML=this.isBlockedOverlay?j():Q(),document.body.insertAdjacentElement("beforeend",t),this.overlay=t;}}updateTryAgainButton(e){let t=document.getElementById(A);t&&(this.tryAgainListener&&t.removeEventListener("click",this.tryAgainListener),this.tryAgainListener=e,t.addEventListener("click",e));}updateCloseButton(e){let t=document.getElementById(I);t&&(this.onCloseListener&&t.removeEventListener("click",this.onCloseListener),this.onCloseListener=e,t.addEventListener("click",e));}};var k=class{storage;constructor(e,t){this.storage=ce.createInstance({name:e,driver:t});}get length(){return this.storage.length()}clear(){return this.storage.clear()}getItem(e){return this.storage.getItem(e)}key(e){return this.storage.key(e)}async removeItem(e){await this.storage.removeItem(e);}async setItem(e,t){await this.storage.setItem(e,t);}};var Oe=500,ye={headers:{"Content-Type":"application/x-www-form-urlencoded"}},ve="/v2/logout",Te="/im-logged-out",Le="/authorize",Pe=i=>i?Te:ve,Ie=i=>{let{authenticationDomain:e,oidcConfiguration:t}=i,r;i.crossSdkBridgeEnabled?r=new k("ImmutableSDKPassport",ce.INDEXEDDB):typeof window<"u"?r=window.localStorage:r=new InMemoryWebStorage;let o=new WebStorageStateStore({store:r}),n=new URL(Pe(i.crossSdkBridgeEnabled),e.replace(/^(?:https?:\/\/)?(.*)/,"https://$1"));return n.searchParams.set("client_id",t.clientId),t.logoutRedirectUri&&n.searchParams.set("returnTo",t.logoutRedirectUri),{authority:e,redirect_uri:t.redirectUri,popup_redirect_uri:t.popupRedirectUri||t.redirectUri,client_id:t.clientId,metadata:{authorization_endpoint:`${e}/authorize`,token_endpoint:`${e}/oauth/token`,userinfo_endpoint:`${e}/userinfo`,end_session_endpoint:n.toString(),revocation_endpoint:`${e}/oauth/revoke`},automaticSilentRenew:!1,scope:t.scope,userStore:o,revokeTokenTypes:["refresh_token"],extraQueryParams:{...t.audience?{audience:t.audience}:{}}}};function D(i){return btoa(String.fromCharCode(...new Uint8Array(i))).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}async function Ae(i){let t=new TextEncoder().encode(i);return await window.crypto.subtle.digest("SHA-256",t)}var _=class i{userManager;deviceCredentialsManager;config;embeddedLoginPrompt;logoutMode;refreshingPromise=null;constructor(e,t){this.config=e,this.userManager=new UserManager(Ie(e)),this.deviceCredentialsManager=new O,this.embeddedLoginPrompt=t,this.logoutMode=e.oidcConfiguration.logoutMode||"redirect";}static mapOidcUserToDomainModel=e=>{let t;e.id_token&&(t=q(e.id_token)?.passport);let r={expired:e.expired,idToken:e.id_token,accessToken:e.access_token,refreshToken:e.refresh_token,profile:{sub:e.profile.sub,email:e.profile.email,nickname:e.profile.nickname}};return t?.zkevm_eth_address&&t?.zkevm_user_admin_address&&(r.zkEvm={ethAddress:t.zkevm_eth_address,userAdminAddress:t.zkevm_user_admin_address}),r};static mapDeviceTokenResponseToOidcUser=e=>{let t=q(e.id_token);return new User({id_token:e.id_token,access_token:e.access_token,refresh_token:e.refresh_token,token_type:e.token_type,profile:{sub:t.sub,iss:t.iss,aud:t.aud,exp:t.exp,iat:t.iat,email:t.email,nickname:t.nickname,passport:t.passport}})};buildExtraQueryParams(e,t){let r={...this.userManager.settings?.extraQueryParams??{},rid:getDetail(Detail.RUNTIME_ID)||"",third_party_a_id:""};if(e){if(e.directLoginMethod==="email"){let o=e.email;o&&(r.direct=e.directLoginMethod,r.email=o);}else r.direct=e.directLoginMethod;e.marketingConsentStatus&&(r.marketingConsent=e.marketingConsentStatus);}return t&&(r.im_passport_trace_id=t),r}async getClientId(){return this.config.oidcConfiguration.clientId}async loginWithRedirect(e){return await this.userManager.clearStaleState(),f(async()=>{let t=this.buildExtraQueryParams(e);await this.userManager.signinRedirect({extraQueryParams:t});},"AUTHENTICATION_ERROR")}async login(e){return f(async()=>{let t,r;if(e)t=e;else if(!this.config.popupOverlayOptions?.disableHeadlessLoginPromptOverlay){let{imPassportTraceId:d,...l}=await this.embeddedLoginPrompt.displayEmbeddedLoginPrompt();t=l,r=d;}let o=window.crypto.randomUUID(),n=async()=>{let d=this.buildExtraQueryParams(t,r),l=this.userManager.signinPopup({extraQueryParams:d,popupWindowFeatures:{width:410,height:450},popupWindowTarget:o}),c=window.open("",o);if(c){let E=new Promise((a,g)=>{let S=setInterval(()=>{c.closed&&(clearInterval(S),g(new Error("Popup closed by user")));},Oe);l.finally(()=>{clearInterval(S),c.close();});});return Promise.race([l,E])}return l};return new Promise((d,l)=>{n().then(c=>{d(i.mapOidcUserToDomainModel(c));}).catch(c=>{if(!(c instanceof Error)||c.message!=="Attempted to navigate on a disposed window"){l(c);return}let E=!1,a=new v(this.config.popupOverlayOptions||{},!0);a.append(async()=>{try{if(E)window.open("",o);else {E=!0;let g=await n();a.remove(),d(i.mapOidcUserToDomainModel(g));}}catch(g){a.remove(),l(g);}},()=>{a.remove(),l(new Error("Popup closed by user"));});});})},"AUTHENTICATION_ERROR")}async getUserOrLogin(){let e=null;try{e=await this.getUser();}catch(t){h.warn("Failed to retrieve a cached user session",t);}return e||this.login()}static shouldUseSigninPopupCallback(){try{let r=`oidc.${new URLSearchParams(window.location.search).get("state")}`,o=localStorage.getItem(r);return JSON.parse(o||"{}")?.request_type==="si:p"}catch{return !1}}async loginCallback(){return f(async()=>{if(i.shouldUseSigninPopupCallback()){await this.userManager.signinPopupCallback(void 0,!0);return}let e=await this.userManager.signinCallback();if(e)return i.mapOidcUserToDomainModel(e)},"AUTHENTICATION_ERROR")}async getPKCEAuthorizationUrl(e,t){let r=D(window.crypto.getRandomValues(new Uint8Array(32))),o=D(await Ae(r)),n=D(window.crypto.getRandomValues(new Uint8Array(32))),{redirectUri:d,scope:l,audience:c,clientId:E}=this.config.oidcConfiguration;this.deviceCredentialsManager.savePKCEData({state:n,verifier:r});let a=new URL(Le,this.config.authenticationDomain);if(a.searchParams.set("response_type","code"),a.searchParams.set("code_challenge",o),a.searchParams.set("code_challenge_method","S256"),a.searchParams.set("client_id",E),a.searchParams.set("redirect_uri",d),a.searchParams.set("state",n),l&&a.searchParams.set("scope",l),c&&a.searchParams.set("audience",c),e){if(e.directLoginMethod==="email"){let g=e.email;g&&(a.searchParams.set("direct",e.directLoginMethod),a.searchParams.set("email",g));}else a.searchParams.set("direct",e.directLoginMethod);e.marketingConsentStatus&&a.searchParams.set("marketingConsent",e.marketingConsentStatus);}return t&&a.searchParams.set("im_passport_trace_id",t),a.toString()}async loginWithPKCEFlowCallback(e,t){return f(async()=>{let r=this.deviceCredentialsManager.getPKCEData();if(!r)throw new Error("No code verifier or state for PKCE");if(t!==r.state)throw new Error("Provided state does not match stored state");let o=await this.getPKCEToken(e,r.verifier),n=i.mapDeviceTokenResponseToOidcUser(o),d=i.mapOidcUserToDomainModel(n);return await this.userManager.storeUser(n),d},"AUTHENTICATION_ERROR")}async getPKCEToken(e,t){return (await Ee.post(`${this.config.authenticationDomain}/oauth/token`,{client_id:this.config.oidcConfiguration.clientId,grant_type:"authorization_code",code_verifier:t,code:e,redirect_uri:this.config.oidcConfiguration.redirectUri},ye)).data}async storeTokens(e){return f(async()=>{let t=i.mapDeviceTokenResponseToOidcUser(e),r=i.mapOidcUserToDomainModel(t);return await this.userManager.storeUser(t),r},"AUTHENTICATION_ERROR")}async logout(){return f(async()=>{await this.userManager.revokeTokens(["refresh_token"]),this.logoutMode==="silent"?await this.userManager.signoutSilent():await this.userManager.signoutRedirect();},"LOGOUT_ERROR")}async logoutSilentCallback(e){return this.userManager.signoutSilentCallback(e)}async removeUser(){return this.userManager.removeUser()}async getLogoutUrl(){let e=this.userManager.settings?.metadata?.end_session_endpoint;return e||(h.warn("Failed to get logout URL"),null)}forceUserRefreshInBackground(){this.refreshTokenAndUpdatePromise().catch(e=>{h.warn("Failed to refresh user token",e);});}async forceUserRefresh(){return this.refreshTokenAndUpdatePromise().catch(e=>(h.warn("Failed to refresh user token",e),null))}async refreshTokenAndUpdatePromise(){return this.refreshingPromise?this.refreshingPromise:(this.refreshingPromise=new Promise(async(e,t)=>{try{let r=await this.userManager.signinSilent();if(r){e(i.mapOidcUserToDomainModel(r));return}e(null);}catch(r){let o="AUTHENTICATION_ERROR",n="Failed to refresh token",d=!0;if(r instanceof ErrorTimeout?(o="SILENT_LOGIN_ERROR",n=`${n}: ${r.message}`,d=!1):r instanceof ErrorResponse?(o="NOT_LOGGED_IN_ERROR",n=`${n}: ${r.message||r.error_description}`):r instanceof Error?n=`${n}: ${r.message}`:typeof r=="string"&&(n=`${n}: ${r}`),d)try{await this.userManager.removeUser();}catch(l){l instanceof Error&&(n=`${n}: Failed to remove user: ${l.message}`);}t(new u(n,o));}finally{this.refreshingPromise=null;}}),this.refreshingPromise)}async getUser(e=t=>!0){if(this.refreshingPromise){let r=await this.refreshingPromise;return r&&e(r)?r:null}let t=await this.userManager.getUser();if(!t)return null;if(!G(t)){let r=i.mapOidcUserToDomainModel(t);if(r&&e(r))return r}if(t.refresh_token){let r=await this.refreshTokenAndUpdatePromise();if(r&&e(r))return r}return null}async getUserZkEvm(){let e=await this.getUser(M);if(!e)throw new Error("Failed to obtain a User with the required ZkEvm attributes");return e}};var we=(i,e,t)=>{let r=e.map(o=>!i[o]&&o).filter(o=>o).join(", ");if(r!==""){let o=`${r} cannot be null`;throw new u(o,"INVALID_CONFIGURATION")}},T=class{authenticationDomain;passportDomain;oidcConfiguration;crossSdkBridgeEnabled;popupOverlayOptions;constructor({authenticationDomain:e,passportDomain:t,crossSdkBridgeEnabled:r,popupOverlayOptions:o,...n}){we(n,["clientId","redirectUri"]),this.oidcConfiguration=n,this.crossSdkBridgeEnabled=r||!1,this.popupOverlayOptions=o,this.authenticationDomain=e||"https://auth.immutable.com",this.passportDomain=t||"https://passport.immutable.com";}};var X="im_passport_embedded_login_prompt";var m=class{static overlay;static onCloseListener;static closeButton;static remove(){this.onCloseListener&&this.closeButton?.removeEventListener?.("click",this.onCloseListener),this.overlay?.remove(),this.closeButton=void 0,this.onCloseListener=void 0,this.overlay=void 0;}static appendOverlay(e,t){if(!this.overlay){let r=document.createElement("div");r.innerHTML=z(),document.body.insertAdjacentElement("beforeend",r);let o=document.querySelector(`#${y}`);o&&o.appendChild(e),r.addEventListener("click",t),this.overlay=r;}}};var Me=660,Ue=440,xe="16px",J="passport-embedded-login-keyframes",ee="passport-embedded-login-iframe",L=class i{config;constructor(e){this.config=e;}getHref=()=>`${this.config.authenticationDomain}/im-embedded-login-prompt?client_id=${this.config.oidcConfiguration.clientId}&rid=${getDetail(Detail.RUNTIME_ID)}`;static appendIFrameStylesIfNeeded=()=>{if(document.getElementById(J))return;let e=document.createElement("style");e.id=J,e.textContent=`
|
|
358
358
|
@keyframes passportEmbeddedLoginPromptPopBounceIn {
|
|
359
359
|
0% {
|
|
360
360
|
opacity: 0.5;
|
|
@@ -387,6 +387,6 @@ var H="pkce_state",F="pkce_verifier",re=3600,C=class{isTokenValid(e){try{let r=q
|
|
|
387
387
|
opacity: 1;
|
|
388
388
|
}
|
|
389
389
|
}
|
|
390
|
-
`,document.head.appendChild(e);};getEmbeddedLoginIFrame=()=>{let e=document.createElement("iframe");return e.id=ee,e.src=this.getHref(),e.style.height="100vh",e.style.width="100vw",e.style.maxHeight=`${
|
|
390
|
+
`,document.head.appendChild(e);};getEmbeddedLoginIFrame=()=>{let e=document.createElement("iframe");return e.id=ee,e.src=this.getHref(),e.style.height="100vh",e.style.width="100vw",e.style.maxHeight=`${Me}px`,e.style.maxWidth=`${Ue}px`,e.style.borderRadius=xe,e.style.opacity="0",e.style.transform="scale(0.6)",e.style.animation="passportEmbeddedLoginPromptPopBounceIn 1s ease forwards",i.appendIFrameStylesIfNeeded(),e};displayEmbeddedLoginPrompt(){return new Promise((e,t)=>{let r=this.getEmbeddedLoginIFrame(),o=({data:n,origin:d})=>{if(!(d!==this.config.authenticationDomain||n.eventType!==X))switch(n.messageType){case"login_method_selected":{let l=n.payload;window.removeEventListener("message",o),m.remove(),e(l);break}case"login_prompt_error":{window.removeEventListener("message",o),m.remove(),t(new Error("Error during embedded login prompt",{cause:n.payload}));break}case"login_prompt_closed":{window.removeEventListener("message",o),m.remove(),t(new Error("Popup closed by user"));break}default:window.removeEventListener("message",o),m.remove(),t(new Error(`Unsupported message type: ${n.messageType}`));break}};window.addEventListener("message",o),m.appendOverlay(r,()=>{window.removeEventListener("message",o),m.remove(),t(new Error("Popup closed by user"));});})}};var R=class{emitter=new EventEmitter;emit(e,...t){this.emitter.emit(e,...t);}on(e,t){this.emitter.on(e,t);}removeListener(e,t){this.emitter.removeListener(e,t);}};var p=async(i,e,t=!0,r=!0)=>{let o=trackFlow("passport",e,t);try{return await i(o)}catch(n){throw n instanceof Error?trackError("passport",e,n,{flowId:o.details.flowId}):o.addEvent("errored"),n}finally{r&&o.addEvent("End");}};var N=class{authManager;config;eventEmitter;constructor(e){this.config=new T(e);let t=new L(this.config);this.authManager=new _(this.config,t),this.eventEmitter=new R,track("passport","initialise");}async login(e){return p(async()=>{let{useCachedSession:t=!1,useSilentLogin:r}=e||{},o=null;try{o=await this.authManager.getUser();}catch(n){if(n instanceof Error&&!n.message.includes("Unknown or invalid refresh token")&&trackError("passport","login",n),t)throw n;h.warn("Failed to retrieve a cached user session",n);}if(!o&&r)o=await this.authManager.forceUserRefresh();else if(!o&&!t){if(e?.useRedirectFlow)return await this.authManager.loginWithRedirect(e?.directLoginOptions),null;o=await this.authManager.login(e?.directLoginOptions);}return o&&(this.eventEmitter.emit("loggedIn",o),identify({passportId:o.profile.sub})),o},"login")}async loginWithRedirect(e){await this.authManager.loginWithRedirect(e);}async loginCallback(){return p(async()=>{let e=await this.authManager.loginCallback();if(!e)throw new Error("Login callback failed - no user returned");return this.eventEmitter.emit("loggedIn",e),identify({passportId:e.profile.sub}),e},"loginCallback")}async logout(){await p(async()=>{await this.authManager.logout(),this.eventEmitter.emit("loggedOut");},"logout");}async getUser(){return p(async()=>this.authManager.getUser(),"getUserInfo",!1)}async getIdToken(){return p(async()=>(await this.authManager.getUser())?.idToken,"getIdToken",!1)}async getAccessToken(){return p(async()=>(await this.authManager.getUser())?.accessToken,"getAccessToken",!1,!1)}async isLoggedIn(){return await this.getUser()!==null}async forceUserRefresh(){return this.authManager.forceUserRefresh()}async loginWithPKCEFlow(e,t){return p(async()=>this.authManager.getPKCEAuthorizationUrl(e,t),"loginWithPKCEFlow")}async loginWithPKCEFlowCallback(e,t){return p(async()=>{let r=await this.authManager.loginWithPKCEFlowCallback(e,t);return this.eventEmitter.emit("loggedIn",r),identify({passportId:r.profile.sub}),r},"loginWithPKCEFlowCallback")}async storeTokens(e){return p(async()=>{let t=await this.authManager.storeTokens(e);return this.eventEmitter.emit("loggedIn",t),identify({passportId:t.profile.sub}),t},"storeTokens")}async getLogoutUrl(){return p(async()=>(await this.authManager.removeUser(),this.eventEmitter.emit("loggedOut"),await this.authManager.getLogoutUrl()||void 0),"getLogoutUrl")}async logoutSilentCallback(e){return p(()=>this.authManager.logoutSilentCallback(e),"logoutSilentCallback")}getAuthManager(){return this.authManager}getConfig(){return this.config}};
|
|
391
391
|
|
|
392
|
-
export { N as Auth,
|
|
392
|
+
export { N as Auth, T as AuthConfiguration, U as AuthEvents, _ as AuthManager, K as MarketingConsentStatus, u as PassportError, P as PassportErrorType, B as RollupType, R as TypedEventEmitter, M as isUserZkEvm, f as withPassportError };
|
package/dist/types/Auth.d.ts
CHANGED
|
@@ -34,12 +34,12 @@ export declare class Auth {
|
|
|
34
34
|
*/
|
|
35
35
|
constructor(config: AuthModuleConfiguration);
|
|
36
36
|
/**
|
|
37
|
-
* Login with
|
|
38
|
-
*
|
|
39
|
-
* @param
|
|
40
|
-
* @returns Promise that resolves with the
|
|
37
|
+
* Login the user with extended options
|
|
38
|
+
* Supports cached sessions, silent login, redirect flow, and direct login
|
|
39
|
+
* @param options - Extended login options
|
|
40
|
+
* @returns Promise that resolves with the user or null
|
|
41
41
|
*/
|
|
42
|
-
login(
|
|
42
|
+
login(options?: LoginOptions): Promise<User | null>;
|
|
43
43
|
/**
|
|
44
44
|
* Login with redirect
|
|
45
45
|
* Redirects the page for authentication
|
|
@@ -47,13 +47,6 @@ export declare class Auth {
|
|
|
47
47
|
* @returns Promise that resolves when redirect is initiated
|
|
48
48
|
*/
|
|
49
49
|
loginWithRedirect(directLoginOptions?: DirectLoginOptions): Promise<void>;
|
|
50
|
-
/**
|
|
51
|
-
* Enhanced login method with extended options
|
|
52
|
-
* Supports cached sessions, silent login, and redirect flow
|
|
53
|
-
* @param options - Extended login options
|
|
54
|
-
* @returns Promise that resolves with the user or null
|
|
55
|
-
*/
|
|
56
|
-
loginWithOptions(options?: LoginOptions): Promise<User | null>;
|
|
57
50
|
/**
|
|
58
51
|
* Login callback handler
|
|
59
52
|
* Call this in your redirect URI page
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DirectLoginOptions, User, DeviceTokenResponse, UserZkEvm
|
|
1
|
+
import { DirectLoginOptions, User, DeviceTokenResponse, UserZkEvm } from './types';
|
|
2
2
|
import { IAuthConfiguration } from './config';
|
|
3
3
|
import EmbeddedLoginPrompt from './login/embeddedLoginPrompt';
|
|
4
4
|
export default class AuthManager {
|
|
@@ -15,6 +15,7 @@ export default class AuthManager {
|
|
|
15
15
|
private static mapOidcUserToDomainModel;
|
|
16
16
|
private static mapDeviceTokenResponseToOidcUser;
|
|
17
17
|
private buildExtraQueryParams;
|
|
18
|
+
getClientId(): Promise<string>;
|
|
18
19
|
loginWithRedirect(directLoginOptions?: DirectLoginOptions): Promise<void>;
|
|
19
20
|
/**
|
|
20
21
|
* login
|
|
@@ -57,5 +58,4 @@ export default class AuthManager {
|
|
|
57
58
|
*/
|
|
58
59
|
getUser<T extends User>(typeAssertion?: (user: User) => user is T): Promise<T | null>;
|
|
59
60
|
getUserZkEvm(): Promise<UserZkEvm>;
|
|
60
|
-
getUserImx(): Promise<UserImx>;
|
|
61
61
|
}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { Auth } from './Auth';
|
|
2
2
|
export { default as AuthManager } from './authManager';
|
|
3
3
|
export { AuthConfiguration, type IAuthConfiguration } from './config';
|
|
4
|
-
export type { User, UserProfile,
|
|
5
|
-
export { isUserZkEvm,
|
|
4
|
+
export type { User, UserProfile, UserZkEvm, DirectLoginMethod, DirectLoginOptions, LoginOptions, DeviceTokenResponse, OidcConfiguration, AuthModuleConfiguration, PopupOverlayOptions, PassportMetadata, IdTokenPayload, PKCEData, AuthEventMap, } from './types';
|
|
5
|
+
export { isUserZkEvm, RollupType, MarketingConsentStatus, AuthEvents, } from './types';
|
|
6
6
|
export { default as TypedEventEmitter } from './utils/typedEventEmitter';
|
|
7
7
|
export { PassportError, PassportErrorType, withPassportError } from './errors';
|
package/dist/types/types.d.ts
CHANGED
|
@@ -10,7 +10,6 @@ export type UserProfile = {
|
|
|
10
10
|
sub: string;
|
|
11
11
|
};
|
|
12
12
|
export declare enum RollupType {
|
|
13
|
-
IMX = "imx",
|
|
14
13
|
ZKEVM = "zkEvm"
|
|
15
14
|
}
|
|
16
15
|
export type User = {
|
|
@@ -19,22 +18,14 @@ export type User = {
|
|
|
19
18
|
refreshToken?: string;
|
|
20
19
|
profile: UserProfile;
|
|
21
20
|
expired?: boolean;
|
|
22
|
-
[RollupType.IMX]?: {
|
|
23
|
-
ethAddress: string;
|
|
24
|
-
starkAddress: string;
|
|
25
|
-
userAdminAddress: string;
|
|
26
|
-
};
|
|
27
21
|
[RollupType.ZKEVM]?: {
|
|
28
22
|
ethAddress: string;
|
|
29
23
|
userAdminAddress: string;
|
|
30
24
|
};
|
|
31
25
|
};
|
|
32
26
|
export type PassportMetadata = {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
imx_user_admin_address: string;
|
|
36
|
-
zkevm_eth_address: string;
|
|
37
|
-
zkevm_user_admin_address: string;
|
|
27
|
+
zkevm_eth_address?: string;
|
|
28
|
+
zkevm_user_admin_address?: string;
|
|
38
29
|
};
|
|
39
30
|
export interface OidcConfiguration {
|
|
40
31
|
clientId: string;
|
|
@@ -72,10 +63,8 @@ export interface AuthModuleConfiguration extends OidcConfiguration {
|
|
|
72
63
|
type WithRequired<T, K extends keyof T> = T & {
|
|
73
64
|
[P in K]-?: T[P];
|
|
74
65
|
};
|
|
75
|
-
export type UserImx = WithRequired<User, RollupType.IMX>;
|
|
76
66
|
export type UserZkEvm = WithRequired<User, RollupType.ZKEVM>;
|
|
77
67
|
export declare const isUserZkEvm: (user: User) => user is UserZkEvm;
|
|
78
|
-
export declare const isUserImx: (user: User) => user is UserImx;
|
|
79
68
|
export type DeviceTokenResponse = {
|
|
80
69
|
access_token: string;
|
|
81
70
|
refresh_token?: string;
|
|
@@ -105,10 +94,14 @@ export declare enum MarketingConsentStatus {
|
|
|
105
94
|
Unsubscribed = "unsubscribed"
|
|
106
95
|
}
|
|
107
96
|
export type DirectLoginOptions = {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
email
|
|
111
|
-
|
|
97
|
+
marketingConsentStatus: MarketingConsentStatus;
|
|
98
|
+
} & ({
|
|
99
|
+
directLoginMethod: 'email';
|
|
100
|
+
email: string;
|
|
101
|
+
} | {
|
|
102
|
+
directLoginMethod: Exclude<DirectLoginMethod, 'email'>;
|
|
103
|
+
email?: never;
|
|
104
|
+
});
|
|
112
105
|
/**
|
|
113
106
|
* Extended login options with caching and silent login support
|
|
114
107
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imtbl/auth",
|
|
3
|
-
"version": "2.10.7-alpha.
|
|
3
|
+
"version": "2.10.7-alpha.5",
|
|
4
4
|
"description": "Authentication SDK for Immutable",
|
|
5
5
|
"author": "Immutable",
|
|
6
6
|
"bugs": "https://github.com/immutable/ts-immutable-sdk/issues",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@imtbl/config": "2.10.7-alpha.
|
|
29
|
-
"@imtbl/metrics": "2.10.7-alpha.
|
|
28
|
+
"@imtbl/config": "2.10.7-alpha.5",
|
|
29
|
+
"@imtbl/metrics": "2.10.7-alpha.5",
|
|
30
30
|
"axios": "^1.6.5",
|
|
31
31
|
"jwt-decode": "^3.1.2",
|
|
32
32
|
"localforage": "^1.10.0",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"uuid": "^9.0.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@imtbl/toolkit": "2.10.7-alpha.
|
|
37
|
+
"@imtbl/toolkit": "2.10.7-alpha.5",
|
|
38
38
|
"@types/node": "^18.14.2",
|
|
39
39
|
"tsup": "^8.3.0",
|
|
40
40
|
"typescript": "^5.6.2"
|
package/src/Auth.ts
CHANGED
|
@@ -5,7 +5,9 @@ import {
|
|
|
5
5
|
} from './types';
|
|
6
6
|
import EmbeddedLoginPrompt from './login/embeddedLoginPrompt';
|
|
7
7
|
import TypedEventEmitter from './utils/typedEventEmitter';
|
|
8
|
-
import {
|
|
8
|
+
import { withMetricsAsync } from './utils/metrics';
|
|
9
|
+
import { identify, track, trackError } from '@imtbl/metrics';
|
|
10
|
+
import logger from './utils/logger';
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
13
|
* Public-facing Auth class for authentication
|
|
@@ -49,13 +51,48 @@ export class Auth {
|
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
/**
|
|
52
|
-
* Login with
|
|
53
|
-
*
|
|
54
|
-
* @param
|
|
55
|
-
* @returns Promise that resolves with the
|
|
54
|
+
* Login the user with extended options
|
|
55
|
+
* Supports cached sessions, silent login, redirect flow, and direct login
|
|
56
|
+
* @param options - Extended login options
|
|
57
|
+
* @returns Promise that resolves with the user or null
|
|
56
58
|
*/
|
|
57
|
-
async login(
|
|
58
|
-
return
|
|
59
|
+
async login(options?: LoginOptions): Promise<User | null> {
|
|
60
|
+
return withMetricsAsync(async () => {
|
|
61
|
+
const { useCachedSession = false, useSilentLogin } = options || {};
|
|
62
|
+
let user: User | null = null;
|
|
63
|
+
|
|
64
|
+
// Try to get cached user
|
|
65
|
+
try {
|
|
66
|
+
user = await this.authManager.getUser();
|
|
67
|
+
} catch (error: any) {
|
|
68
|
+
if (error instanceof Error && !error.message.includes('Unknown or invalid refresh token')) {
|
|
69
|
+
trackError('passport', 'login', error);
|
|
70
|
+
}
|
|
71
|
+
if (useCachedSession) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
logger.warn('Failed to retrieve a cached user session', error);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// If no cached user, try silent login or regular login
|
|
78
|
+
if (!user && useSilentLogin) {
|
|
79
|
+
user = await this.authManager.forceUserRefresh();
|
|
80
|
+
} else if (!user && !useCachedSession) {
|
|
81
|
+
if (options?.useRedirectFlow) {
|
|
82
|
+
await this.authManager.loginWithRedirect(options?.directLoginOptions);
|
|
83
|
+
return null; // Redirect doesn't return user immediately
|
|
84
|
+
}
|
|
85
|
+
user = await this.authManager.login(options?.directLoginOptions);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Emit LOGGED_IN event and identify user if logged in
|
|
89
|
+
if (user) {
|
|
90
|
+
this.eventEmitter.emit(AuthEvents.LOGGED_IN, user);
|
|
91
|
+
identify({ passportId: user.profile.sub });
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return user;
|
|
95
|
+
}, 'login');
|
|
59
96
|
}
|
|
60
97
|
|
|
61
98
|
/**
|
|
@@ -68,61 +105,21 @@ export class Auth {
|
|
|
68
105
|
await this.authManager.loginWithRedirect(directLoginOptions);
|
|
69
106
|
}
|
|
70
107
|
|
|
71
|
-
/**
|
|
72
|
-
* Enhanced login method with extended options
|
|
73
|
-
* Supports cached sessions, silent login, and redirect flow
|
|
74
|
-
* @param options - Extended login options
|
|
75
|
-
* @returns Promise that resolves with the user or null
|
|
76
|
-
*/
|
|
77
|
-
async loginWithOptions(options?: LoginOptions): Promise<User | null> {
|
|
78
|
-
const { useCachedSession = false, useSilentLogin } = options || {};
|
|
79
|
-
let user: User | null = null;
|
|
80
|
-
|
|
81
|
-
// Try to get cached user
|
|
82
|
-
try {
|
|
83
|
-
user = await this.authManager.getUser();
|
|
84
|
-
} catch (error: any) {
|
|
85
|
-
if (useCachedSession) {
|
|
86
|
-
throw error;
|
|
87
|
-
}
|
|
88
|
-
// Silently ignore errors if not requiring cached session
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// If no cached user, try silent login or regular login
|
|
92
|
-
if (!user && useSilentLogin) {
|
|
93
|
-
user = await this.authManager.forceUserRefresh();
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (!user && !useCachedSession) {
|
|
97
|
-
if (options?.useRedirectFlow) {
|
|
98
|
-
await this.authManager.loginWithRedirect(options?.directLoginOptions);
|
|
99
|
-
return null; // Redirect doesn't return user immediately
|
|
100
|
-
}
|
|
101
|
-
user = await this.authManager.login(options?.directLoginOptions);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Emit LOGGED_IN event and identify user if logged in
|
|
105
|
-
if (user) {
|
|
106
|
-
this.eventEmitter.emit(AuthEvents.LOGGED_IN, user);
|
|
107
|
-
identify({ passportId: user.profile.sub });
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return user;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
108
|
/**
|
|
114
109
|
* Login callback handler
|
|
115
110
|
* Call this in your redirect URI page
|
|
116
111
|
* @returns Promise that resolves with the authenticated user
|
|
117
112
|
*/
|
|
118
113
|
async loginCallback(): Promise<User> {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
114
|
+
return withMetricsAsync(async () => {
|
|
115
|
+
const user = await this.authManager.loginCallback();
|
|
116
|
+
if (!user) {
|
|
117
|
+
throw new Error('Login callback failed - no user returned');
|
|
118
|
+
}
|
|
119
|
+
this.eventEmitter.emit(AuthEvents.LOGGED_IN, user);
|
|
120
|
+
identify({ passportId: user.profile.sub });
|
|
121
|
+
return user;
|
|
122
|
+
}, 'loginCallback');
|
|
126
123
|
}
|
|
127
124
|
|
|
128
125
|
/**
|
|
@@ -130,8 +127,10 @@ export class Auth {
|
|
|
130
127
|
* @returns Promise that resolves when logout is complete
|
|
131
128
|
*/
|
|
132
129
|
async logout(): Promise<void> {
|
|
133
|
-
await
|
|
134
|
-
|
|
130
|
+
await withMetricsAsync(async () => {
|
|
131
|
+
await this.authManager.logout();
|
|
132
|
+
this.eventEmitter.emit(AuthEvents.LOGGED_OUT);
|
|
133
|
+
}, 'logout');
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
/**
|
|
@@ -139,7 +138,7 @@ export class Auth {
|
|
|
139
138
|
* @returns Promise that resolves with the user or null if not authenticated
|
|
140
139
|
*/
|
|
141
140
|
async getUser(): Promise<User | null> {
|
|
142
|
-
return this.authManager.getUser();
|
|
141
|
+
return withMetricsAsync(async () => this.authManager.getUser(), 'getUserInfo', false);
|
|
143
142
|
}
|
|
144
143
|
|
|
145
144
|
/**
|
|
@@ -147,8 +146,10 @@ export class Auth {
|
|
|
147
146
|
* @returns Promise that resolves with the ID token or undefined
|
|
148
147
|
*/
|
|
149
148
|
async getIdToken(): Promise<string | undefined> {
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
return withMetricsAsync(async () => {
|
|
150
|
+
const user = await this.authManager.getUser();
|
|
151
|
+
return user?.idToken;
|
|
152
|
+
}, 'getIdToken', false);
|
|
152
153
|
}
|
|
153
154
|
|
|
154
155
|
/**
|
|
@@ -156,8 +157,10 @@ export class Auth {
|
|
|
156
157
|
* @returns Promise that resolves with the access token or undefined
|
|
157
158
|
*/
|
|
158
159
|
async getAccessToken(): Promise<string | undefined> {
|
|
159
|
-
|
|
160
|
-
|
|
160
|
+
return withMetricsAsync(async () => {
|
|
161
|
+
const user = await this.authManager.getUser();
|
|
162
|
+
return user?.accessToken;
|
|
163
|
+
}, 'getAccessToken', false, false);
|
|
161
164
|
}
|
|
162
165
|
|
|
163
166
|
/**
|
|
@@ -184,7 +187,10 @@ export class Auth {
|
|
|
184
187
|
* @returns Promise that resolves with the authorization URL
|
|
185
188
|
*/
|
|
186
189
|
async loginWithPKCEFlow(directLoginOptions?: DirectLoginOptions, imPassportTraceId?: string): Promise<string> {
|
|
187
|
-
return
|
|
190
|
+
return withMetricsAsync(
|
|
191
|
+
async () => this.authManager.getPKCEAuthorizationUrl(directLoginOptions, imPassportTraceId),
|
|
192
|
+
'loginWithPKCEFlow',
|
|
193
|
+
);
|
|
188
194
|
}
|
|
189
195
|
|
|
190
196
|
/**
|
|
@@ -194,10 +200,12 @@ export class Auth {
|
|
|
194
200
|
* @returns Promise that resolves with the authenticated user
|
|
195
201
|
*/
|
|
196
202
|
async loginWithPKCEFlowCallback(authorizationCode: string, state: string): Promise<User> {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
203
|
+
return withMetricsAsync(async () => {
|
|
204
|
+
const user = await this.authManager.loginWithPKCEFlowCallback(authorizationCode, state);
|
|
205
|
+
this.eventEmitter.emit(AuthEvents.LOGGED_IN, user);
|
|
206
|
+
identify({ passportId: user.profile.sub });
|
|
207
|
+
return user;
|
|
208
|
+
}, 'loginWithPKCEFlowCallback');
|
|
201
209
|
}
|
|
202
210
|
|
|
203
211
|
/**
|
|
@@ -206,10 +214,12 @@ export class Auth {
|
|
|
206
214
|
* @returns Promise that resolves with the authenticated user
|
|
207
215
|
*/
|
|
208
216
|
async storeTokens(tokenResponse: DeviceTokenResponse): Promise<User> {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
217
|
+
return withMetricsAsync(async () => {
|
|
218
|
+
const user = await this.authManager.storeTokens(tokenResponse);
|
|
219
|
+
this.eventEmitter.emit(AuthEvents.LOGGED_IN, user);
|
|
220
|
+
identify({ passportId: user.profile.sub });
|
|
221
|
+
return user;
|
|
222
|
+
}, 'storeTokens');
|
|
213
223
|
}
|
|
214
224
|
|
|
215
225
|
/**
|
|
@@ -217,10 +227,12 @@ export class Auth {
|
|
|
217
227
|
* @returns Promise that resolves with the logout URL or undefined if not available
|
|
218
228
|
*/
|
|
219
229
|
async getLogoutUrl(): Promise<string | undefined> {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
230
|
+
return withMetricsAsync(async () => {
|
|
231
|
+
await this.authManager.removeUser();
|
|
232
|
+
this.eventEmitter.emit(AuthEvents.LOGGED_OUT);
|
|
233
|
+
const url = await this.authManager.getLogoutUrl();
|
|
234
|
+
return url || undefined;
|
|
235
|
+
}, 'getLogoutUrl');
|
|
224
236
|
}
|
|
225
237
|
|
|
226
238
|
/**
|
|
@@ -229,7 +241,7 @@ export class Auth {
|
|
|
229
241
|
* @returns Promise that resolves when callback is handled
|
|
230
242
|
*/
|
|
231
243
|
async logoutSilentCallback(url: string): Promise<void> {
|
|
232
|
-
return this.authManager.logoutSilentCallback(url);
|
|
244
|
+
return withMetricsAsync(() => this.authManager.logoutSilentCallback(url), 'logoutSilentCallback');
|
|
233
245
|
}
|
|
234
246
|
|
|
235
247
|
/**
|
package/src/authManager.ts
CHANGED
|
@@ -24,8 +24,6 @@ import {
|
|
|
24
24
|
OidcConfiguration,
|
|
25
25
|
UserZkEvm,
|
|
26
26
|
isUserZkEvm,
|
|
27
|
-
UserImx,
|
|
28
|
-
isUserImx,
|
|
29
27
|
} from './types';
|
|
30
28
|
import { IAuthConfiguration } from './config';
|
|
31
29
|
import LoginPopupOverlay from './overlay/loginPopupOverlay';
|
|
@@ -148,17 +146,10 @@ export default class AuthManager {
|
|
|
148
146
|
nickname: oidcUser.profile.nickname,
|
|
149
147
|
},
|
|
150
148
|
};
|
|
151
|
-
if (passport?.
|
|
152
|
-
user.imx = {
|
|
153
|
-
ethAddress: passport.imx_eth_address,
|
|
154
|
-
starkAddress: passport.imx_stark_address,
|
|
155
|
-
userAdminAddress: passport.imx_user_admin_address,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
if (passport?.zkevm_eth_address) {
|
|
149
|
+
if (passport?.zkevm_eth_address && passport?.zkevm_user_admin_address) {
|
|
159
150
|
user.zkEvm = {
|
|
160
|
-
ethAddress: passport
|
|
161
|
-
userAdminAddress: passport
|
|
151
|
+
ethAddress: passport.zkevm_eth_address,
|
|
152
|
+
userAdminAddress: passport.zkevm_user_admin_address,
|
|
162
153
|
};
|
|
163
154
|
}
|
|
164
155
|
return user;
|
|
@@ -220,6 +211,10 @@ export default class AuthManager {
|
|
|
220
211
|
return params;
|
|
221
212
|
}
|
|
222
213
|
|
|
214
|
+
public async getClientId(): Promise<string> {
|
|
215
|
+
return this.config.oidcConfiguration.clientId;
|
|
216
|
+
}
|
|
217
|
+
|
|
223
218
|
public async loginWithRedirect(directLoginOptions?: DirectLoginOptions): Promise<void> {
|
|
224
219
|
await this.userManager.clearStaleState();
|
|
225
220
|
return withPassportError<void>(async () => {
|
|
@@ -645,13 +640,4 @@ export default class AuthManager {
|
|
|
645
640
|
|
|
646
641
|
return user;
|
|
647
642
|
}
|
|
648
|
-
|
|
649
|
-
public async getUserImx(): Promise<UserImx> {
|
|
650
|
-
const user = await this.getUser(isUserImx);
|
|
651
|
-
if (!user) {
|
|
652
|
-
throw new Error('Failed to obtain a User with the required IMX attributes');
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
return user;
|
|
656
|
-
}
|
|
657
643
|
}
|
package/src/index.ts
CHANGED
|
@@ -11,7 +11,6 @@ export { AuthConfiguration, type IAuthConfiguration } from './config';
|
|
|
11
11
|
export type {
|
|
12
12
|
User,
|
|
13
13
|
UserProfile,
|
|
14
|
-
UserImx,
|
|
15
14
|
UserZkEvm,
|
|
16
15
|
DirectLoginMethod,
|
|
17
16
|
DirectLoginOptions,
|
|
@@ -26,7 +25,7 @@ export type {
|
|
|
26
25
|
AuthEventMap,
|
|
27
26
|
} from './types';
|
|
28
27
|
export {
|
|
29
|
-
isUserZkEvm,
|
|
28
|
+
isUserZkEvm, RollupType, MarketingConsentStatus, AuthEvents,
|
|
30
29
|
} from './types';
|
|
31
30
|
|
|
32
31
|
// Export TypedEventEmitter
|
package/src/types.ts
CHANGED
|
@@ -12,7 +12,6 @@ export type UserProfile = {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
export enum RollupType {
|
|
15
|
-
IMX = 'imx',
|
|
16
15
|
ZKEVM = 'zkEvm',
|
|
17
16
|
}
|
|
18
17
|
|
|
@@ -22,11 +21,6 @@ export type User = {
|
|
|
22
21
|
refreshToken?: string;
|
|
23
22
|
profile: UserProfile;
|
|
24
23
|
expired?: boolean;
|
|
25
|
-
[RollupType.IMX]?: {
|
|
26
|
-
ethAddress: string;
|
|
27
|
-
starkAddress: string;
|
|
28
|
-
userAdminAddress: string;
|
|
29
|
-
};
|
|
30
24
|
[RollupType.ZKEVM]?: {
|
|
31
25
|
ethAddress: string;
|
|
32
26
|
userAdminAddress: string;
|
|
@@ -34,11 +28,8 @@ export type User = {
|
|
|
34
28
|
};
|
|
35
29
|
|
|
36
30
|
export type PassportMetadata = {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
imx_user_admin_address: string;
|
|
40
|
-
zkevm_eth_address: string;
|
|
41
|
-
zkevm_user_admin_address: string;
|
|
31
|
+
zkevm_eth_address?: string;
|
|
32
|
+
zkevm_user_admin_address?: string;
|
|
42
33
|
};
|
|
43
34
|
|
|
44
35
|
export interface OidcConfiguration {
|
|
@@ -82,11 +73,9 @@ export interface AuthModuleConfiguration extends OidcConfiguration {
|
|
|
82
73
|
|
|
83
74
|
type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };
|
|
84
75
|
|
|
85
|
-
export type UserImx = WithRequired<User, RollupType.IMX>;
|
|
86
76
|
export type UserZkEvm = WithRequired<User, RollupType.ZKEVM>;
|
|
87
77
|
|
|
88
78
|
export const isUserZkEvm = (user: User): user is UserZkEvm => !!user[RollupType.ZKEVM];
|
|
89
|
-
export const isUserImx = (user: User): user is UserImx => !!user[RollupType.IMX];
|
|
90
79
|
|
|
91
80
|
export type DeviceTokenResponse = {
|
|
92
81
|
access_token: string;
|
|
@@ -122,10 +111,11 @@ export enum MarketingConsentStatus {
|
|
|
122
111
|
}
|
|
123
112
|
|
|
124
113
|
export type DirectLoginOptions = {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
email
|
|
128
|
-
}
|
|
114
|
+
marketingConsentStatus: MarketingConsentStatus;
|
|
115
|
+
} & (
|
|
116
|
+
| { directLoginMethod: 'email'; email: string }
|
|
117
|
+
| { directLoginMethod: Exclude<DirectLoginMethod, 'email'>; email?: never }
|
|
118
|
+
);
|
|
129
119
|
|
|
130
120
|
/**
|
|
131
121
|
* Extended login options with caching and silent login support
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Flow, trackError, trackFlow } from '@imtbl/metrics';
|
|
2
|
+
|
|
3
|
+
export const withMetricsAsync = async <T>(
|
|
4
|
+
fn: (flow: Flow) => Promise<T>,
|
|
5
|
+
flowName: string,
|
|
6
|
+
trackStartEvent: boolean = true,
|
|
7
|
+
trackEndEvent: boolean = true,
|
|
8
|
+
): Promise<T> => {
|
|
9
|
+
const flow: Flow = trackFlow(
|
|
10
|
+
'passport',
|
|
11
|
+
flowName,
|
|
12
|
+
trackStartEvent,
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
return await fn(flow);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
if (error instanceof Error) {
|
|
19
|
+
trackError('passport', flowName, error, { flowId: flow.details.flowId });
|
|
20
|
+
} else {
|
|
21
|
+
flow.addEvent('errored');
|
|
22
|
+
}
|
|
23
|
+
throw error;
|
|
24
|
+
} finally {
|
|
25
|
+
if (trackEndEvent) {
|
|
26
|
+
flow.addEvent('End');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|