UNPKG

@frak-labs/core-sdk

Version:

Core SDK of the Frak wallet, low level library to interact directly with the frak ecosystem.

2 lines 10.6 kB
let e=require("@frak-labs/frame-connector");const t=`frak-client-id`;function n(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function r(){if(typeof window>`u`||!window.localStorage)return console.warn(`[Frak SDK] No Window / localStorage available to save the clientId`),n();let e=localStorage.getItem(t);return e||(e=n(),localStorage.setItem(t,e)),e}var i=class extends Map{maxSize;constructor(e){super(),this.maxSize=e}get(e){let t=super.get(e);return super.has(e)&&(super.delete(e),super.set(e,t)),t}set(e,t){if(super.has(e)&&super.delete(e),super.set(e,t),this.maxSize&&this.size>this.maxSize){let e=super.keys().next().value;e!==void 0&&super.delete(e)}return this}};let a;function o(){return a||={promiseCache:new i(1024),responseCache:new i(1024),failureCache:new i(1024)},a}async function s(e,{cacheKey:t,cacheTime:n=3e4}){let{promiseCache:r,responseCache:i,failureCache:a}=o();if(n>0){let e=i.get(t);if(e&&Date.now()-e.created<n)return e.data}let s=a.get(t);if(s&&Date.now()-s<1e3)throw Error(`Cache: ${t} recently failed, backing off`);let c=r.get(t);c||(c=e(),r.set(t,c));try{let e=await c;return i.set(t,{data:e,created:Date.now()}),a.delete(t),e}catch(e){throw a.set(t,Date.now()),e}finally{r.delete(t)}}function c(){a&&(a.promiseCache.clear(),a.responseCache.clear(),a.failureCache.clear())}const l=`https://backend.frak.id`;function u(e){return e.includes(`localhost:3000`)||e.includes(`localhost:3010`)}function d(e){return u(e)?`https://localhost:3030`:e.includes(`wallet-dev.frak.id`)||e.includes(`wallet.gcp-dev.frak.id`)?`https://backend.gcp-dev.frak.id`:l}function f(e){if(e)return d(e);if(typeof window<`u`){let e=window.FrakSetup?.client?.config?.walletUrl;if(e)return d(e)}return l}const p=`__frakSdkConfig`,m=`frak-config-cache`,h=`frak-merchant-id`,g={key:m},_=typeof window<`u`;function v(){return{isResolved:!1,merchantId:``}}let y=null;function b(){if(!_)return null;try{let e=localStorage.getItem(g.key);if(!e)return null;let t=JSON.parse(e);return t.config?.isResolved?(y=t,t):null}catch{return null}}function x(){return(y??b())?.config}function ee(){let e=y??b();return e?Date.now()-e.timestamp<3e4:!1}function S(e){if(!(!_||!e.isResolved))try{let t={config:e,timestamp:Date.now()};localStorage.setItem(g.key,JSON.stringify(t)),y=t}catch{}}function C(){if(_){y=null;try{localStorage.removeItem(g.key)}catch{}}}function w(){_&&(window[p]||(window[p]=x()??v()))}function T(){return _?(w(),window[p]??v()):v()}function E(e){_&&window.dispatchEvent(new CustomEvent(`frak:config`,{detail:e}))}function te(e){return e??(_?window.location.hostname:``)}async function ne(e,t,n){try{let r=f(t),i=n?`&lang=${encodeURIComponent(n)}`:``,a=await fetch(`${r}/user/merchant/resolve?domain=${encodeURIComponent(e)}${i}`);if(!a.ok){console.warn(`[Frak SDK] Merchant lookup failed for domain ${e}: ${a.status}`);return}let o=await a.json();if(_)try{sessionStorage.setItem(h,o.merchantId)}catch{}return o}catch(e){console.warn(`[Frak SDK] Failed to fetch merchant config:`,e);return}}const D={getConfig:T,get isResolved(){return T().isResolved},get isCacheFresh(){return ee()},setCacheScope(e,t){let n=`${e}:${t??``}`;g.key=`${m}:${n}`,y=null},setConfig(e){if(_&&(window[p]=e),S(e),E(e),_&&e.merchantId)try{sessionStorage.setItem(h,e.merchantId)}catch{}},reset(){let e=x()??v();_&&(window[p]=e),E(e)},clearCache(){if(C(),c(),_)try{sessionStorage.removeItem(h)}catch{}},resolve(e,t,n){let r=te(e);return r?s(async()=>{let e=await ne(r,t,n);if(!e)throw Error(`Config resolution returned empty`);return e},{cacheKey:`sdkConfig:${r}:${n??``}`,cacheTime:1/0}).catch(()=>void 0):Promise.resolve(void 0)},getMerchantId(){let e=T();if(e.isResolved&&e.merchantId)return e.merchantId;if(_)try{return sessionStorage.getItem(h)??void 0}catch{}},async resolveMerchantId(e,t){return D.getMerchantId()||(await D.resolve(e,t))?.merchantId}};function O(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join(``)).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function k(e){let t=e.length%4;return Uint8Array.from(atob(e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(e.length+(t===0?0:4-t),`=`)),e=>e.charCodeAt(0))}function A(t){return O((0,e.jsonEncode)(t))}function j(e,t,n,r,i,a){let o=A(re({redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,merchantId:n,metadata:{name:r,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink},clientId:i})),s=new URL(e);return s.pathname=`/sso`,s.searchParams.set(`p`,o),s.toString()}function re(e){return{r:e.redirectUrl,cId:e.clientId,d:e.directExit,l:e.lang,m:e.merchantId,md:{n:e.metadata?.name,css:e.metadata?.css,l:e.metadata?.logoUrl,h:e.metadata?.homepageLink}}}const M=`menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800`,N=`frak-sso`;async function P(e,t){let{metadata:n,customizations:i,walletUrl:a}=e.config,o={...t,directExit:t.directExit??!t.redirectUrl};if(o.openInSameWindow??!!o.redirectUrl)return await e.request({method:`frak_openSso`,params:[o,n.name,i?.css]});let s=o.ssoPopupUrl??j(a??`https://wallet.frak.id`,o,await D.resolveMerchantId()??``,n.name,r(),i?.css),c=window.open(s,N,M);if(!c)throw Error(`Popup was blocked. Please allow popups for this site.`);return c.focus(),await e.request({method:`frak_openSso`,params:[o,n.name,i?.css]})??{}}function F(e,t,n){if(!e){console.debug(`[Frak] No client provided, skipping event tracking`);return}try{e.openPanel?.track(t,n)}catch(e){console.debug(`[Frak] Failed to track event:`,t,e)}}function I(e,t){let n=e.get(t);if(n!==null)return n;let r=t.toLowerCase();for(let[t,n]of e)if(t.toLowerCase()===r)return n;return null}function L(e,t){let n=t.toLowerCase(),r=[...e.keys()].filter(e=>e.toLowerCase()===n);for(let t of r)e.delete(t)}const R=/^0x[a-fA-F0-9]{40}$/;function z(e){return typeof e==`string`&&R.test(e)}function ie(e,t){return e.toLowerCase()===t.toLowerCase()}function B(e){let t=new Uint8Array(20);for(let n=0;n<20;n++){let r=Number.parseInt(e.substring(2+n*2,4+n*2),16);if(Number.isNaN(r))throw Error(`Invalid address: ${e}`);t[n]=r}return t}const V=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`));function H(e){let t=`0x`;for(let n=0;n<20;n++)t+=V[e[n]];return t}function U(e){return`r`in e&&!(`v`in e)}function W(e){return`v`in e&&e.v===2}const G=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function K(e){return typeof e==`string`&&G.test(e)}function q(e){let t=e.replace(/-/g,``),n=new Uint8Array(16);for(let e=0;e<16;e++)n[e]=Number.parseInt(t.substring(e*2,e*2+2),16);return n}function J(e){let t=``;for(let n=0;n<16;n++)t+=e[n].toString(16).padStart(2,`0`);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20,32)}`}function ae(e){if(!K(e.m)||!Number.isInteger(e.t)||e.t<0||e.t>4294967295)return null;let t=typeof e.c==`string`&&e.c.length>0,n=typeof e.w==`string`&&z(e.w);if(!t&&!n||t&&!K(e.c))return null;let r=new Uint8Array(21+(t?16:0)+(n?20:0)),i=new DataView(r.buffer,r.byteOffset,r.byteLength),a=0;return r[a++]=2|(t?16:0)|(n?32:0),r.set(q(e.m),a),a+=16,i.setUint32(a,e.t,!1),a+=4,t&&(r.set(q(e.c),a),a+=16),n&&(r.set(B(e.w),a),a+=20),r}function oe(e){if(e.length<21)return null;let t=e[0];if((t&15)!=2||t&192)return null;let n=(t&16)!=0,r=(t&32)!=0;if(!n&&!r)return null;let i=21+(n?16:0)+(r?20:0);if(e.length!==i)return null;let a=1,o=J(e.subarray(a,a+16));a+=16;let s=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(a,!1);a+=4;let c={v:2,m:o,t:s};if(n&&(c.c=J(e.subarray(a,a+16)),a+=16),r){let t=H(e.subarray(a,a+20));if(!z(t))return null;c.w=t,a+=20}return c}const Y=`fCtx`;function X(e){if(e)try{if(W(e)){let t=ae(e);return t?O(t):void 0}return O(B(e.r))}catch(t){console.error(`Error compressing Frak context`,{e:t,context:e})}}function Z(e){if(!(!e||e.length===0))try{let t=k(e);if(t.length!==20)return oe(t)||void 0;let n=H(t);if(z(n))return{r:n}}catch(t){console.error(`Error decompressing Frak context`,{e:t,context:e})}}function se({url:e}){if(!e)return null;let t=I(new URL(e).searchParams,Y);return t?Z(t):null}function ce(e){return{utm_source:e.utmSource??`frak`,utm_medium:e.utmMedium??void 0,utm_campaign:e.utmCampaign??void 0,utm_content:e.utmContent,utm_term:e.utmTerm,via:e.via??void 0,ref:e.ref??void 0}}function le(e,t){let n=ce(t??{});for(let[t,r]of Object.entries(n))r===void 0||r===``||e.searchParams.has(t)||e.searchParams.set(t,r)}function Q({url:e,context:t,attribution:n}){if(!e)return null;let r=X(t);if(!r)return null;let i=new URL(e);return L(i.searchParams,Y),i.searchParams.set(Y,r),le(i,n),i.toString()}function $(e){let t=new URL(e);return L(t.searchParams,Y),t.toString()}function ue({url:e,context:t}){if(!window.location?.href||typeof window>`u`){console.error(`No window found, can't update context`);return}let n=e??window.location.href,r;r=t===null?$(n):Q({url:n,context:t}),r&&window.history.replaceState(null,``,r.toString())}const de={compress:X,decompress:Z,parse:se,update:Q,remove:$,replaceUrl:ue};Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return r}}); //# sourceMappingURL=frakContext-BGx4IVAK.cjs.map