@monerium/sdk 3.4.11 → 4.0.0

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/index.js CHANGED
@@ -1,15 +1,15 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var z=require('crypto-js/enc-base64url.js'),q=require('crypto-js/sha256.js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var z__default=/*#__PURE__*/_interopDefault(z);var q__default=/*#__PURE__*/_interopDefault(q);var x={environments:{production:{name:"production",api:"https://api.monerium.app",web:"https://monerium.app",wss:"wss://api.monerium.app"},sandbox:{name:"sandbox",api:"https://api.monerium.dev",web:"https://sandbox.monerium.dev",wss:"wss://api.monerium.dev"}}};var f={LINK_MESSAGE:"I hereby declare that I am the address owner.",STORAGE_CODE_VERIFIER:"monerium.sdk.code_verifier",STORAGE_ACCESS_TOKEN:"monerium.sdk.access_token",STORAGE_ACCESS_EXPIRY:"monerium.sdk.access_expiry"};var A=()=>{let t="",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r=e.length,n=0;for(;n<128;)t+=e.charAt(Math.floor(Math.random()*r)),n+=1;return t},j=t=>z__default.default.stringify(q__default.default(t)),S=()=>{let t=A(),e=j(t);return localStorage.setItem(f.STORAGE_CODE_VERIFIER,t||""),e},k=()=>{let t=window.location.href;if(!t||!t?.includes("?"))return;let[e,r]=t.split("?");r&&window.history.replaceState(null,"",e);},R=t=>t.code!=null,$=t=>t.refresh_token!=null,v=t=>t.client_secret!=null;var _=async(t,e,r,n)=>{let i=await fetch(`${t}`,{method:e,headers:n,body:r}),s,a=await i.text();try{if(s=JSON.parse(a),Object.keys(s).length===0&&s.constructor===Object)switch(i.status){case 201:case 202:return {status:i.status,statusText:i.statusText}}}catch{throw a}if(!i.ok)throw s;return s};var u=t=>{if(!t)return "";let e=Object.entries(t).filter(([r,n])=>n!==""&&n!==void 0&&n!==null).map(([r,n])=>`${encodeURIComponent(r)}=${encodeURIComponent(n)}`).join("&");return e?"?"+e:""};var N=t=>t?e=>{console.log("%c [MONERIUM:DEBUG]:","color:orange;",e);}:()=>{};var E=t=>Object.entries(t).filter(([r,n])=>n!=null).map(([r,n])=>`${r}-${n}`).join("-");var B=(i=>(i.eur="eur",i.usd="usd",i.gbp="gbp",i.isk="isk",i))(B||{}),K=(s=>(s.password="password",s.resource="resource",s.jwt="jwt",s.apiKey="apiKey",s.bearer="bearer",s))(K||{}),M=(r=>(r.corporate="corporate",r.personal="personal",r))(M||{}),F=(r=>(r.read="read",r.write="write",r))(F||{}),L=(s=>(s.created="created",s.pending="pending",s.approved="approved",s.rejected="rejected",s.blocked="blocked",s))(L||{}),Q=(i=>(i.absent="absent",i.submitted="submitted",i.pending="pending",i.confirmed="confirmed",i))(Q||{}),W=(n=>(n.approved="approved",n.rejected="rejected",n.unknown="unknown",n))(W||{}),V=(s=>(s.requested="requested",s.approved="approved",s.pending="pending",s.rejected="rejected",s.closed="closed",s))(V||{}),G=(i=>(i.iban="iban",i.scan="scan",i.chain="chain",i.account="account",i))(G||{}),J=(n=>(n.passport="passport",n.nationalIdentityCard="nationalIdentityCard",n.drivingLicense="drivingLicense",n))(J||{}),H=(r=>(r.redeem="redeem",r.issue="issue",r))(H||{}),X=(i=>(i.placed="placed",i.pending="pending",i.processed="processed",i.rejected="rejected",i))(X||{});var P=t=>{if(t.toString()==="Invalid Date")throw t;let e=n=>n<10?"0"+n:n,r=n=>{if(n===0)return "Z";let i=n>0?"-":"+";return n=Math.abs(n),i+e(Math.floor(n/60))+":"+e(n%60)};return t.getFullYear()+"-"+e(t.getMonth()+1)+"-"+e(t.getDate())+"T"+e(t.getHours())+":"+e(t.getMinutes())+":"+e(t.getSeconds())+r(t.getTimezoneOffset())},Z=t=>{switch(t){case "noble":case "noble-1":case "grand":case "grand-1":return true;default:return false}},Y=t=>{switch(t){case "ethereum":case "sepolia":case "basesepolia":case "base":case "polygon":case "amoy":case "gnosis":case "chiado":case "arbitrum":case "arbitrumsepolia":case "linea":case "lineasepolia":case "scroll":case "scrollsepolia":case "camino":case "columbus":return true;default:return false}},b=t=>{if(typeof t=="number")return O(t);if(Z(t))return t.split("-")[0];if(Y(t))return t;try{return O(parseInt(t))}catch{throw new Error(`Chain not supported: ${t}`)}},p=(t,e)=>b(T(e,t)),ee=(t,e,r,n)=>{let i=`${e?.toUpperCase()||"EUR"}`;return n?`Send ${i} ${t} to ${r} on ${b(n)} at ${P(new Date)}`:i==="EUR"?`Send ${i} ${t} to ${D(r)} at ${P(new Date)}`:`Send ${i} ${t} to ${r} at ${P(new Date)}`},te=({domain:t,address:e,appName:r,redirectUri:n,chainId:i,issuedAt:s=new Date().toISOString(),expiryAt:a=new Date(Date.now()+1e3*60*5).toISOString(),privacyPolicyUrl:o,termsOfServiceUrl:l})=>`${t} wants you to sign in with your Ethereum account:
1
+ 'use strict';var S=require('crypto-js/enc-base64url.js'),B=require('crypto-js/lib-typedarrays.js'),F=require('crypto-js/sha256.js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var S__default=/*#__PURE__*/_interopDefault(S);var B__default=/*#__PURE__*/_interopDefault(B);var F__default=/*#__PURE__*/_interopDefault(F);var c=class extends Error{code;status;errors;details;constructor(e){super(e.message),this.name="MoneriumApiError",this.code=e.code,this.status=e.status,this.errors=e.errors,this.details=e.details;}},u=class extends Error{type;cause;constructor(e,t,n){super(t),this.name="MoneriumSdkError",this.type=e,this.cause=n;}};var I=()=>{let r=new Uint8Array(32);return crypto.getRandomValues(r),S__default.default.stringify(B__default.default.create(r))},T=r=>S__default.default.stringify(F__default.default(r)),M=()=>{let r=I(),e=T(r);return {codeVerifier:r,codeChallenge:e}},R=r=>{if(typeof r!="string")return {};let e=r,t=e.includes("?")?e.split("?")[1]:e;if(!t)return {};let n={};for(let s of t.split("&")){let o=s.indexOf("=");if(o===-1)continue;let a=decodeURIComponent(s.slice(0,o)),p=decodeURIComponent(s.slice(o+1).replace(/\+/g," "));n[a]=p;}let i={};return n.code&&(i.code=n.code),n.state&&(i.state=n.state),n.error&&(i.error=n.error),n.error_description&&(i.errorDescription=n.error_description),i};var f=r=>{if(!r)return "";let e=Object.entries(r).filter(([,t])=>t!=null&&t!=="").flatMap(([t,n])=>Array.isArray(n)?n.map(i=>[t,String(i)]):[[t,String(n)]]);return new URLSearchParams(e).toString()},d=r=>{if(!r)return "";let e=f(r);return e?`?${e}`:""};var E={environments:{production:{name:"production",api:"https://api.monerium.app",web:"https://monerium.app"},sandbox:{name:"sandbox",api:"https://api.monerium.dev",web:"https://sandbox.monerium.dev"}}};function N(r="sandbox"){return E.environments[r]}var k=async({method:r,url:e,headers:t,body:n,signal:i})=>{let s;try{s=await fetch(e,{method:r,headers:t,body:n,signal:i});}catch(a){throw new u("network_error","Network request failed",a)}let o=await s.text();return {status:s.status,bodyText:o}};var x=[{production:{id:"ethereum",chainId:1},sandbox:{id:"sepolia",chainId:11155111}},{production:{id:"gnosis",chainId:100},sandbox:{id:"chiado",chainId:10200}},{production:{id:"polygon",chainId:137},sandbox:{id:"amoy",chainId:80002}},{production:{id:"arbitrum",chainId:42161},sandbox:{id:"arbitrumsepolia",chainId:421614}},{production:{id:"linea",chainId:59144},sandbox:{id:"lineasepolia",chainId:59141}},{production:{id:"scroll",chainId:534352},sandbox:{id:"scrollsepolia",chainId:534351}},{production:{id:"base",chainId:8453},sandbox:{id:"basesepolia",chainId:84532}},{production:{id:"camino",chainId:500},sandbox:{id:"columbus",chainId:501}}],w=new Map(x.flatMap(({production:r,sandbox:e})=>[[r.chainId,r.id],[e.chainId,e.id]])),U=new Set(x.flatMap(({production:r,sandbox:e})=>[r.id,e.id]));new Map(x.map(({production:r,sandbox:e})=>[r.id,e.id]));var v=(i=>(i.eur="eur",i.usd="usd",i.gbp="gbp",i.isk="isk",i))(v||{}),V=(t=>(t.corporate="corporate",t.personal="personal",t))(V||{});var C=r=>{if(r.toString()==="Invalid Date")throw r;let e=n=>n<10?"0"+n:n,t=n=>{if(n===0)return "Z";let i=n>0?"-":"+";return n=Math.abs(n),i+e(Math.floor(n/60))+":"+e(n%60)};return r.getFullYear()+"-"+e(r.getMonth()+1)+"-"+e(r.getDate())+"T"+e(r.getHours())+":"+e(r.getMinutes())+":"+e(r.getSeconds())+t(r.getTimezoneOffset())},$=r=>{switch(r){case "noble":case "noble-1":case "grand":case "grand-1":return true;default:return false}},K=r=>U.has(r),l=r=>{if(typeof r=="number")return A(r);if($(r))return r.split("-")[0];if(K(r))return r;try{return A(parseInt(r))}catch{throw new Error(`Chain not supported: ${r}`)}};var L=(r,e,t,n)=>{let i=`${e?.toUpperCase()||"EUR"}`;return n?`Send ${i} ${r} to ${t} on ${l(n)} at ${C(new Date)}`:i==="EUR"?`Send ${i} ${r} to ${D(t)} at ${C(new Date)}`:`Send ${i} ${r} to ${t} at ${C(new Date)}`},q=({domain:r,address:e,appName:t,redirectUri:n,chainId:i,issuedAt:s=new Date().toISOString(),expiryAt:o=new Date(Date.now()+1e3*60*5).toISOString(),privacyPolicyUrl:a,termsOfServiceUrl:p})=>`${r} wants you to sign in with your Ethereum account:
2
2
  ${e}
3
3
 
4
- Allow ${r} to access my data on Monerium
4
+ Allow ${t} to access my data on Monerium
5
5
 
6
6
  URI: ${n}
7
7
  Version: 1
8
8
  Chain ID: ${i}
9
- Nonce: ${A().slice(0,16)}
9
+ Nonce: ${I().replace(/[^a-zA-Z0-9]/g,"").slice(0,16)}
10
10
  Issued At: ${s}
11
- Expiration Time: ${a}
11
+ Expiration Time: ${o}
12
12
  Resources:
13
13
  - https://monerium.com/siwe
14
- - ${o}
15
- - ${l}`,C=t=>t&&Object.entries(t)?.length>0?Object.entries(t).filter(([e,r])=>r!==void 0).map(([e,r])=>`${encodeURIComponent(e)}=${encodeURIComponent(r)}`).join("&"):"",O=t=>{switch(t){case 1:return "ethereum";case 11155111:return "sepolia";case 100:return "gnosis";case 10200:return "chiado";case 137:return "polygon";case 80002:return "amoy";case 8453:return "base";case 84532:return "basesepolia";case 42161:return "arbitrum";case 421614:return "arbitrumsepolia";case 59144:return "linea";case 59141:return "lineasepolia";case 534352:return "scroll";case 534351:return "scrollsepolia";case 501:return "columbus";case 500:return "camino";default:throw new Error(`Chain not supported: ${t}`)}},D=t=>{if(typeof t!="string"||!t?.length)return t;let e=t.replace(/\s/g,"");return t?.length>11?`${e.substring(0,4)}...${e.substring(e.length-4)}`:t},re=t=>typeof t!="string"||!t?.length?t:t?.length>11?`${t.substring(0,7)}...${t.substring(t.length-5)}`:t;var T=(t,e)=>{if(e==="sandbox")switch(t){case "ethereum":return "sepolia";case "base":return "basesepolia";case "polygon":return "amoy";case "gnosis":return "chiado";case "arbitrum":return "arbitrumsepolia";case "linea":return "lineasepolia";case "scroll":return "scrollsepolia";case "camino":return "columbus";case "noble":return "noble";default:return t}return t},g=(t,e)=>{if(e?.chain){let{chain:r,...n}=e;return {...n,chain:b(T(r,t))}}return e};var {STORAGE_CODE_VERIFIER:w,STORAGE_ACCESS_TOKEN:h,STORAGE_ACCESS_EXPIRY:m}=f,d=typeof window>"u",I=class{#e;#s;bearerProfile;#i=new Map;isAuthorized=!!this.bearerProfile;#r=()=>{};#n;state;constructor(e){if(!e){this.#e=x.environments.sandbox;return}if(typeof e=="string")this.#e=x.environments[e];else if(this.#r=N(e.debug??false),this.#e=x.environments[e.environment||"sandbox"],!d&&!e?.clientSecret){let{clientId:r,redirectUri:n}=e;this.#n={clientId:r,redirectUri:n};}else if(d&&e?.clientSecret){this.#r("Client credentials detected");let{clientId:r,clientSecret:n}=e;this.#n={clientId:r,clientSecret:n};}}async authorize(e){let r=S(),n=e?.address?{address:e?.address,signature:e?.signature,chain:e?.chain?p(this.#e.name,e?.chain):void 0}:{},i=C({client_id:this.#n?.clientId,redirect_uri:this.#n?.redirectUri,code_challenge:r,code_challenge_method:"S256",response_type:"code",state:e?.state,skip_create_account:e?.skipCreateAccount,skip_kyc:e?.skipKyc,email:e?.email,...n}),s=`${this.#e.api}/auth?${i}`;this.#r(`Auth flow URL: ${s}`),window.location.assign(s);}async siwe(e){let r=S(),n=C({client_id:this.#n?.clientId,redirect_uri:this.#n?.redirectUri,message:e.message,signature:e.signature,code_challenge:r,code_challenge_method:"S256",authentication_method:"siwe",state:e?.state}),i=`${this.#e.api}/auth?${n}`;this.#r(`Auth flow SIWE URL: ${i}`),window.location.assign(i);}async getAccess(e){let r=this.#n?.clientId;if(this.#n?.clientSecret){if(d)return await this.#c(this.#n),!!this?.bearerProfile;console.error("\x1B[31m%s\x1B[0m","Use client credentials only on the server where the secret is secure!");}let i=this.#n?.redirectUri;if(!r)throw new Error("Missing ClientId");if(d)throw new Error("This only works client side");let s=new URLSearchParams(window.location.search).get("error")||void 0,a=new URLSearchParams(window.location.search).get("error_description")||void 0;if(s||a)throw new Error(a);let o=new URLSearchParams(window.location.search).get("code")||void 0,l=new URLSearchParams(window.location.search).get("state")||void 0,c=window.localStorage.getItem(h),y=window.localStorage.getItem(m);if(o)return this.#r("Using auth code from auth flow to authorize"),await this.#a(r,i,o,l),this.#r(this.bearerProfile?"Authorized":"Not authorized"),!!this.bearerProfile;if(e)return this.#r("Using refresh token to authorize"),await this.#d(r,e),this.#r(this.bearerProfile?"Authorized":"Not authorized"),!!this.bearerProfile;if(c&&y){let U=new Date;if(parseInt(y)<U.getTime())throw window.localStorage.removeItem(h),window.localStorage.removeItem(m),this.isAuthorized=false,this.bearerProfile=void 0,new Error("Access token has expired");this.#r("Access token should still be valid, checking if it is authorized...");try{return this.#s=`Bearer ${c}`,this.isAuthorized=!0,await this.getTokens(),this.#r("Authorized"),!0}catch{throw this.#r("Access token is invalid."),window.localStorage.removeItem(h),window.localStorage.removeItem(m),this.isAuthorized=false,this.bearerProfile=void 0,new Error("Access token is invalid.")}}return this.#r(this.bearerProfile?"Authorized":"Not authorized"),!!this.bearerProfile}async#o(e){let r;if(R(e))r={...e,grant_type:"authorization_code"};else if($(e))r={...e,grant_type:"refresh_token"};else if(v(e))r={...e,grant_type:"client_credentials"};else throw new Error("Authorization grant type could not be detected.");return await this.#t("post","auth/token",r,true).then(n=>{if(this.bearerProfile=n,this.isAuthorized=!!n,this.#s=`Bearer ${n?.access_token}`,!d){let s=new Date().getTime()+n?.expires_in*1e3;window.localStorage.setItem(h,n?.access_token||""),window.localStorage.setItem(m,s?.toString());}}).catch(n=>{throw d||(localStorage.removeItem(w),localStorage.removeItem(h),localStorage.removeItem(m),k()),new Error(n?.message)}),R(e)&&k(),this.bearerProfile}getAuthContext(){return this.#t("get","auth/context")}getProfile(e){return this.#t("get",`profiles/${e}`)}getProfiles(e){return this.#t("get",`profiles${u(e)}`)}getAddress(e){return this.#t("get",`addresses/${e}`)}getAddresses(e){e=g(this.#e.name,e);let r=e?C(e):void 0,n=r?`addresses?${r}`:"addresses";return this.#t("get",n)}getBalances(e,r,n){let i=Array.isArray(n)?n.map(a=>`currency=${a}`).join("&"):n?`currency=${n}`:"",s=p(this.#e.name,r);return this.#t("get",`balances/${s}/${e}${i?`?${i}`:""}`)}getIban(e){return this.#t("get",`ibans/${encodeURI(e)}`)}getIbans(e){let{profile:r,chain:n}=e||{},i=u({profile:r,chain:n?p(this.#e.name,n):""});return this.#t("get",`ibans${i}`)}getOrders(e){return this.#t("get",`orders${u(e)}`)}getOrder(e){return this.#t("get",`orders/${e}`)}getTokens(){return this.#t("get","tokens")}getSignatures(e){let r=e?g(this.#e.name,e):void 0;return this.#t("get",`signatures${u(r)}`)}linkAddress(e){return e=g(this.#e.name,e),this.#t("post","addresses",JSON.stringify(e))}placeOrder(e){let r={kind:"redeem",...g(this.#e.name,e),counterpart:{...e.counterpart,identifier:g(this.#e.name,e.counterpart.identifier)}};return this.#t("post","orders",JSON.stringify(r))}moveIban(e,{address:r,chain:n}){return this.#t("patch",`ibans/${e}`,JSON.stringify({address:r,chain:p(this.#e.name,n)}))}requestIban({address:e,chain:r,emailNotifications:n=true}){return this.#t("post","ibans",JSON.stringify({address:e,chain:p(this.#e.name,r),emailNotifications:n}))}submitProfileDetails(e,r){return this.#t("put",`profiles/${e}/details`,JSON.stringify(r))}uploadSupportingDocument(e){let r=new FormData;return r.append("file",e),_(`${this.#e.api}/files`,"post",r,{Authorization:this.#s||""})}async#t(e,r,n,i){let s={Authorization:this.#s||"",Accept:"application/vnd.monerium.api-v2+json","Content-Type":`application/${i?"x-www-form-urlencoded":"json"}`};return _(`${this.#e.api}/${r}`,e.toUpperCase(),i?C(n):n,s)}#a=async(e,r,n,i)=>{let s=localStorage.getItem(w)||"";if(!s)throw new Error("Code verifier not found");return this.#r("Use code verifier to authorize"),this.state=i,localStorage.removeItem(w),await this.#o({code:n,redirect_uri:r,client_id:e,code_verifier:s})};#c=async({clientId:e,clientSecret:r})=>await this.#o({client_id:e,client_secret:r});#d=async(e,r)=>await this.#o({refresh_token:r,client_id:e});subscribeOrderNotifications({filter:e,onMessage:r,onError:n}={}){if(!this.bearerProfile?.access_token)return;let{profile:i,state:s}=e||{},a=u({access_token:this.bearerProfile?.access_token,profile:i,state:s}),o,l=E({profile:i,state:s});if(this.#i?.has(l))o=this.#i.get(l);else {let c=`${this.#e.wss}/orders${a}`;o=new WebSocket(c),this.#i?.set(l,o);}return o.onopen=()=>{console.log("Connected to WebSocket server");},o.onmessage=c=>{let y=JSON.parse(c.data);r&&r(y);},o.onclose=()=>{console.log("WebSocket connection closed"),this.#i?.delete(a);},o.onerror=c=>{n&&n(c),console.error("WebSocket error:",c);},o}unsubscribeOrderNotifications(e){if(e){let r=E({profile:e?.profile,state:e?.state}),n=this.#i?.get(r);n&&(n.close(),this.#i?.delete(r));}else this.#i?.forEach(r=>{r?.close();}),this.#i?.clear(),this.#i=void 0;}async disconnect(){d||localStorage.removeItem(w),this.unsubscribeOrderNotifications(),this.#s=void 0,this.bearerProfile=void 0;}async revokeAccess(){d||(localStorage.removeItem(h),localStorage.removeItem(m)),this.disconnect();}getEnvironment=()=>this.#e};var De=I;exports.AccountState=V;exports.Currency=B;exports.IdDocumentKind=J;exports.KYCOutcome=W;exports.KYCState=Q;exports.Method=K;exports.MoneriumClient=I;exports.OrderKind=H;exports.OrderState=X;exports.PaymentStandard=G;exports.Permission=F;exports.ProfileState=L;exports.ProfileType=M;exports.constants=f;exports.default=De;exports.getChain=O;exports.parseChain=b;exports.placeOrderMessage=ee;exports.rfc3339=P;exports.shortenAddress=re;exports.shortenIban=D;exports.siweMessage=te;
14
+ - ${a}
15
+ - ${p}`,A=r=>{let e=w.get(r);if(!e)throw new Error(`Chain not supported: ${r}`);return e},D=r=>{if(typeof r!="string"||!r?.length)return r;let e=r.replace(/\s/g,"");return r?.length>11?`${e.substring(0,4)}...${e.substring(e.length-4)}`:r},z=r=>typeof r!="string"||!r?.length?r:r?.length>11?`${r.substring(0,7)}...${r.substring(r.length-5)}`:r;function g(r){return r?.chain!==void 0?{...r,chain:l(r.chain)}:r}var m=class{options;env;transport;constructor(e){this.options=e,this.env=N(e.environment),this.transport=e.transport??k;}async getToken(){return this.options.getAccessToken()}async request(e,t,n,i="application/json"){let s=t.startsWith("tokens")||t.startsWith("auth/token"),o=s?null:await this.getToken(),a={Accept:"application/vnd.monerium.api-v2+json","Content-Type":i};if(o)a.Authorization=`Bearer ${o}`;else if(!s)throw new u("authentication_required","No access token provided for authenticated endpoint");let{status:p,bodyText:P}=await this.transport({method:e.toUpperCase(),url:`${this.env.api}/${t}`,headers:a,body:n?i==="application/json"?JSON.stringify(n):n:void 0});if(!P)return {status:p};let b;try{b=JSON.parse(P);}catch{throw new c({code:p,status:"Parse Error",message:P})}if(p<200||p>=300)throw new c(b);return b}async requestFormData(e,t,n){let i=await this.getToken(),s={Accept:"application/vnd.monerium.api-v2+json"};i&&(s.Authorization=`Bearer ${i}`);let{status:o,bodyText:a}=await this.transport({method:e.toUpperCase(),url:`${this.env.api}/${t}`,headers:s,body:n});if(!a)return {status:o};let p;try{p=JSON.parse(a);}catch{throw new c({code:o,status:"Parse Error",message:a})}if(o<200||o>=300)throw new c(p);return p}async getAuthContext(){return this.request("GET","auth/context")}async getProfile(e){return this.request("GET",`profiles/${e}`)}async getProfiles(e){return this.request("GET",`profiles${d(e)}`)}async getAddress(e){return this.request("GET",`addresses/${e}`)}async getAddresses(e){let t=e?g(e):void 0;return this.request("GET",`addresses${d(t)}`)}async linkAddress(e){return this.request("POST","addresses",g(e))}async getBalances(e){let{address:t,chain:n,currencies:i}=e,s=l(n);return this.request("GET",`balances/${s}/${t}${d({currency:i})}`)}async getIban(e){return this.request("GET",`ibans/${encodeURIComponent(e)}`)}async getIbans(e){let t=e?g(e):void 0;return this.request("GET",`ibans${d(t)}`)}async requestIban(e){return this.request("POST","ibans",{address:e.address,chain:l(e.chain),emailNotifications:e.emailNotifications??true})}async moveIban(e){return this.request("PATCH",`ibans/${e.iban}`,{address:e.address,chain:l(e.chain)})}async getOrder(e){return this.request("GET",`orders/${e}`)}async getOrders(e){return this.request("GET",`orders${d(e)}`)}async placeOrder(e){let t={kind:"redeem",...g(e),...e.counterpart&&{counterpart:{...e.counterpart,identifier:g(e.counterpart.identifier)}}};return this.request("POST","orders",t)}async getTokens(){return this.request("GET","tokens")}async getSignatures(e){let t=e?g(e):void 0;return this.request("GET",`signatures${d(t)}`)}async uploadSupportingDocument(e,t){let n=e instanceof Blob?e:new Blob([e]),i=new FormData;return i.append("file",n,t??("name"in e?String(e.name):"document")),this.requestFormData("POST","files",i)}},h=class extends m{async clientCredentialsGrant(e,t){let n=f({grant_type:"client_credentials",client_id:e,client_secret:t});return this.request("POST","auth/token",n,"application/x-www-form-urlencoded")}async getSubscriptions(){return this.request("GET","webhooks")}async createSubscription(e){return this.request("POST","webhooks",e)}async updateSubscription(e){let{subscription:t,...n}=e;return this.request("PATCH",`webhooks/${t}`,n)}},y=class extends h{},O=class extends m{buildAuthorizationUrl(e){let t=d({client_id:e.clientId,redirect_uri:e.redirectUri,code_challenge:e.codeChallenge,code_challenge_method:"S256",response_type:"code",state:e.state,skip_kyc:e.skipKyc,email:e.email,auth_mode:e.authMode});return `${this.env.api}/auth${t}`}buildSiweAuthorizationUrl(e){let t=d({client_id:e.clientId,redirect_uri:e.redirectUri,message:e.message,signature:e.signature,code_challenge:e.codeChallenge,code_challenge_method:"S256",authentication_method:"siwe",state:e.state});return `${this.env.api}/auth${t}`}async authorizationCodeGrant(e){let t=f({grant_type:"authorization_code",client_id:e.clientId,redirect_uri:e.redirectUri,code:e.code,code_verifier:e.codeVerifier});return this.request("POST","auth/token",t,"application/x-www-form-urlencoded")}async refreshTokenGrant(e){let t=f({grant_type:"refresh_token",client_id:e.clientId,refresh_token:e.refreshToken});return this.request("POST","auth/token",t,"application/x-www-form-urlencoded")}parseAuthorizationResponse(e){return R(e)}},_=class extends h{async createProfile(e){return this.request("POST","profiles",e)}async shareProfileKYC(e){let{profile:t,...n}=e;return this.request("POST",`profiles/${t}/share`,n)}async updateProfileDetails(e){let{profile:t,...n}=e;return this.request("PATCH",`profiles/${t}/details`,n)}async updateProfileForm(e){let{profile:t,...n}=e;return this.request("PATCH",`profiles/${t}/form`,n)}async updateProfileVerifications(e){let{profile:t,...n}=e;return this.request("PATCH",`profiles/${t}/verifications`,n)}};var W={LINK_MESSAGE:"I hereby declare that I am the address owner."};exports.Currency=v;exports.MoneriumApiError=c;exports.MoneriumBaseClient=m;exports.MoneriumOAuthClient=O;exports.MoneriumPrivateClient=y;exports.MoneriumSdkError=u;exports.MoneriumServerClient=h;exports.MoneriumWhitelabelClient=_;exports.ProfileType=V;exports.calculatePKCECodeChallenge=T;exports.constants=W;exports.generatePKCE=M;exports.getChain=A;exports.parseAuthorizationResponse=R;exports.parseChain=l;exports.placeOrderMessage=L;exports.randomPKCECodeVerifier=I;exports.rfc3339=C;exports.shortenAddress=z;exports.shortenIban=D;exports.siweMessage=q;
package/dist/index.mjs CHANGED
@@ -1,15 +1,15 @@
1
- import z from'crypto-js/enc-base64url.js';import q from'crypto-js/sha256.js';var x={environments:{production:{name:"production",api:"https://api.monerium.app",web:"https://monerium.app",wss:"wss://api.monerium.app"},sandbox:{name:"sandbox",api:"https://api.monerium.dev",web:"https://sandbox.monerium.dev",wss:"wss://api.monerium.dev"}}};var f={LINK_MESSAGE:"I hereby declare that I am the address owner.",STORAGE_CODE_VERIFIER:"monerium.sdk.code_verifier",STORAGE_ACCESS_TOKEN:"monerium.sdk.access_token",STORAGE_ACCESS_EXPIRY:"monerium.sdk.access_expiry"};var A=()=>{let t="",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r=e.length,n=0;for(;n<128;)t+=e.charAt(Math.floor(Math.random()*r)),n+=1;return t},j=t=>z.stringify(q(t)),S=()=>{let t=A(),e=j(t);return localStorage.setItem(f.STORAGE_CODE_VERIFIER,t||""),e},k=()=>{let t=window.location.href;if(!t||!t?.includes("?"))return;let[e,r]=t.split("?");r&&window.history.replaceState(null,"",e);},R=t=>t.code!=null,$=t=>t.refresh_token!=null,v=t=>t.client_secret!=null;var _=async(t,e,r,n)=>{let i=await fetch(`${t}`,{method:e,headers:n,body:r}),s,a=await i.text();try{if(s=JSON.parse(a),Object.keys(s).length===0&&s.constructor===Object)switch(i.status){case 201:case 202:return {status:i.status,statusText:i.statusText}}}catch{throw a}if(!i.ok)throw s;return s};var u=t=>{if(!t)return "";let e=Object.entries(t).filter(([r,n])=>n!==""&&n!==void 0&&n!==null).map(([r,n])=>`${encodeURIComponent(r)}=${encodeURIComponent(n)}`).join("&");return e?"?"+e:""};var N=t=>t?e=>{console.log("%c [MONERIUM:DEBUG]:","color:orange;",e);}:()=>{};var E=t=>Object.entries(t).filter(([r,n])=>n!=null).map(([r,n])=>`${r}-${n}`).join("-");var B=(i=>(i.eur="eur",i.usd="usd",i.gbp="gbp",i.isk="isk",i))(B||{}),K=(s=>(s.password="password",s.resource="resource",s.jwt="jwt",s.apiKey="apiKey",s.bearer="bearer",s))(K||{}),M=(r=>(r.corporate="corporate",r.personal="personal",r))(M||{}),F=(r=>(r.read="read",r.write="write",r))(F||{}),L=(s=>(s.created="created",s.pending="pending",s.approved="approved",s.rejected="rejected",s.blocked="blocked",s))(L||{}),Q=(i=>(i.absent="absent",i.submitted="submitted",i.pending="pending",i.confirmed="confirmed",i))(Q||{}),W=(n=>(n.approved="approved",n.rejected="rejected",n.unknown="unknown",n))(W||{}),V=(s=>(s.requested="requested",s.approved="approved",s.pending="pending",s.rejected="rejected",s.closed="closed",s))(V||{}),G=(i=>(i.iban="iban",i.scan="scan",i.chain="chain",i.account="account",i))(G||{}),J=(n=>(n.passport="passport",n.nationalIdentityCard="nationalIdentityCard",n.drivingLicense="drivingLicense",n))(J||{}),H=(r=>(r.redeem="redeem",r.issue="issue",r))(H||{}),X=(i=>(i.placed="placed",i.pending="pending",i.processed="processed",i.rejected="rejected",i))(X||{});var P=t=>{if(t.toString()==="Invalid Date")throw t;let e=n=>n<10?"0"+n:n,r=n=>{if(n===0)return "Z";let i=n>0?"-":"+";return n=Math.abs(n),i+e(Math.floor(n/60))+":"+e(n%60)};return t.getFullYear()+"-"+e(t.getMonth()+1)+"-"+e(t.getDate())+"T"+e(t.getHours())+":"+e(t.getMinutes())+":"+e(t.getSeconds())+r(t.getTimezoneOffset())},Z=t=>{switch(t){case "noble":case "noble-1":case "grand":case "grand-1":return true;default:return false}},Y=t=>{switch(t){case "ethereum":case "sepolia":case "basesepolia":case "base":case "polygon":case "amoy":case "gnosis":case "chiado":case "arbitrum":case "arbitrumsepolia":case "linea":case "lineasepolia":case "scroll":case "scrollsepolia":case "camino":case "columbus":return true;default:return false}},b=t=>{if(typeof t=="number")return O(t);if(Z(t))return t.split("-")[0];if(Y(t))return t;try{return O(parseInt(t))}catch{throw new Error(`Chain not supported: ${t}`)}},p=(t,e)=>b(T(e,t)),ee=(t,e,r,n)=>{let i=`${e?.toUpperCase()||"EUR"}`;return n?`Send ${i} ${t} to ${r} on ${b(n)} at ${P(new Date)}`:i==="EUR"?`Send ${i} ${t} to ${D(r)} at ${P(new Date)}`:`Send ${i} ${t} to ${r} at ${P(new Date)}`},te=({domain:t,address:e,appName:r,redirectUri:n,chainId:i,issuedAt:s=new Date().toISOString(),expiryAt:a=new Date(Date.now()+1e3*60*5).toISOString(),privacyPolicyUrl:o,termsOfServiceUrl:l})=>`${t} wants you to sign in with your Ethereum account:
1
+ import S from'crypto-js/enc-base64url.js';import B from'crypto-js/lib-typedarrays.js';import F from'crypto-js/sha256.js';var c=class extends Error{code;status;errors;details;constructor(e){super(e.message),this.name="MoneriumApiError",this.code=e.code,this.status=e.status,this.errors=e.errors,this.details=e.details;}},u=class extends Error{type;cause;constructor(e,t,n){super(t),this.name="MoneriumSdkError",this.type=e,this.cause=n;}};var I=()=>{let r=new Uint8Array(32);return crypto.getRandomValues(r),S.stringify(B.create(r))},T=r=>S.stringify(F(r)),M=()=>{let r=I(),e=T(r);return {codeVerifier:r,codeChallenge:e}},R=r=>{if(typeof r!="string")return {};let e=r,t=e.includes("?")?e.split("?")[1]:e;if(!t)return {};let n={};for(let s of t.split("&")){let o=s.indexOf("=");if(o===-1)continue;let a=decodeURIComponent(s.slice(0,o)),p=decodeURIComponent(s.slice(o+1).replace(/\+/g," "));n[a]=p;}let i={};return n.code&&(i.code=n.code),n.state&&(i.state=n.state),n.error&&(i.error=n.error),n.error_description&&(i.errorDescription=n.error_description),i};var f=r=>{if(!r)return "";let e=Object.entries(r).filter(([,t])=>t!=null&&t!=="").flatMap(([t,n])=>Array.isArray(n)?n.map(i=>[t,String(i)]):[[t,String(n)]]);return new URLSearchParams(e).toString()},d=r=>{if(!r)return "";let e=f(r);return e?`?${e}`:""};var E={environments:{production:{name:"production",api:"https://api.monerium.app",web:"https://monerium.app"},sandbox:{name:"sandbox",api:"https://api.monerium.dev",web:"https://sandbox.monerium.dev"}}};function N(r="sandbox"){return E.environments[r]}var k=async({method:r,url:e,headers:t,body:n,signal:i})=>{let s;try{s=await fetch(e,{method:r,headers:t,body:n,signal:i});}catch(a){throw new u("network_error","Network request failed",a)}let o=await s.text();return {status:s.status,bodyText:o}};var x=[{production:{id:"ethereum",chainId:1},sandbox:{id:"sepolia",chainId:11155111}},{production:{id:"gnosis",chainId:100},sandbox:{id:"chiado",chainId:10200}},{production:{id:"polygon",chainId:137},sandbox:{id:"amoy",chainId:80002}},{production:{id:"arbitrum",chainId:42161},sandbox:{id:"arbitrumsepolia",chainId:421614}},{production:{id:"linea",chainId:59144},sandbox:{id:"lineasepolia",chainId:59141}},{production:{id:"scroll",chainId:534352},sandbox:{id:"scrollsepolia",chainId:534351}},{production:{id:"base",chainId:8453},sandbox:{id:"basesepolia",chainId:84532}},{production:{id:"camino",chainId:500},sandbox:{id:"columbus",chainId:501}}],w=new Map(x.flatMap(({production:r,sandbox:e})=>[[r.chainId,r.id],[e.chainId,e.id]])),U=new Set(x.flatMap(({production:r,sandbox:e})=>[r.id,e.id]));new Map(x.map(({production:r,sandbox:e})=>[r.id,e.id]));var v=(i=>(i.eur="eur",i.usd="usd",i.gbp="gbp",i.isk="isk",i))(v||{}),V=(t=>(t.corporate="corporate",t.personal="personal",t))(V||{});var C=r=>{if(r.toString()==="Invalid Date")throw r;let e=n=>n<10?"0"+n:n,t=n=>{if(n===0)return "Z";let i=n>0?"-":"+";return n=Math.abs(n),i+e(Math.floor(n/60))+":"+e(n%60)};return r.getFullYear()+"-"+e(r.getMonth()+1)+"-"+e(r.getDate())+"T"+e(r.getHours())+":"+e(r.getMinutes())+":"+e(r.getSeconds())+t(r.getTimezoneOffset())},$=r=>{switch(r){case "noble":case "noble-1":case "grand":case "grand-1":return true;default:return false}},K=r=>U.has(r),l=r=>{if(typeof r=="number")return A(r);if($(r))return r.split("-")[0];if(K(r))return r;try{return A(parseInt(r))}catch{throw new Error(`Chain not supported: ${r}`)}};var L=(r,e,t,n)=>{let i=`${e?.toUpperCase()||"EUR"}`;return n?`Send ${i} ${r} to ${t} on ${l(n)} at ${C(new Date)}`:i==="EUR"?`Send ${i} ${r} to ${D(t)} at ${C(new Date)}`:`Send ${i} ${r} to ${t} at ${C(new Date)}`},q=({domain:r,address:e,appName:t,redirectUri:n,chainId:i,issuedAt:s=new Date().toISOString(),expiryAt:o=new Date(Date.now()+1e3*60*5).toISOString(),privacyPolicyUrl:a,termsOfServiceUrl:p})=>`${r} wants you to sign in with your Ethereum account:
2
2
  ${e}
3
3
 
4
- Allow ${r} to access my data on Monerium
4
+ Allow ${t} to access my data on Monerium
5
5
 
6
6
  URI: ${n}
7
7
  Version: 1
8
8
  Chain ID: ${i}
9
- Nonce: ${A().slice(0,16)}
9
+ Nonce: ${I().replace(/[^a-zA-Z0-9]/g,"").slice(0,16)}
10
10
  Issued At: ${s}
11
- Expiration Time: ${a}
11
+ Expiration Time: ${o}
12
12
  Resources:
13
13
  - https://monerium.com/siwe
14
- - ${o}
15
- - ${l}`,C=t=>t&&Object.entries(t)?.length>0?Object.entries(t).filter(([e,r])=>r!==void 0).map(([e,r])=>`${encodeURIComponent(e)}=${encodeURIComponent(r)}`).join("&"):"",O=t=>{switch(t){case 1:return "ethereum";case 11155111:return "sepolia";case 100:return "gnosis";case 10200:return "chiado";case 137:return "polygon";case 80002:return "amoy";case 8453:return "base";case 84532:return "basesepolia";case 42161:return "arbitrum";case 421614:return "arbitrumsepolia";case 59144:return "linea";case 59141:return "lineasepolia";case 534352:return "scroll";case 534351:return "scrollsepolia";case 501:return "columbus";case 500:return "camino";default:throw new Error(`Chain not supported: ${t}`)}},D=t=>{if(typeof t!="string"||!t?.length)return t;let e=t.replace(/\s/g,"");return t?.length>11?`${e.substring(0,4)}...${e.substring(e.length-4)}`:t},re=t=>typeof t!="string"||!t?.length?t:t?.length>11?`${t.substring(0,7)}...${t.substring(t.length-5)}`:t;var T=(t,e)=>{if(e==="sandbox")switch(t){case "ethereum":return "sepolia";case "base":return "basesepolia";case "polygon":return "amoy";case "gnosis":return "chiado";case "arbitrum":return "arbitrumsepolia";case "linea":return "lineasepolia";case "scroll":return "scrollsepolia";case "camino":return "columbus";case "noble":return "noble";default:return t}return t},g=(t,e)=>{if(e?.chain){let{chain:r,...n}=e;return {...n,chain:b(T(r,t))}}return e};var {STORAGE_CODE_VERIFIER:w,STORAGE_ACCESS_TOKEN:h,STORAGE_ACCESS_EXPIRY:m}=f,d=typeof window>"u",I=class{#e;#s;bearerProfile;#i=new Map;isAuthorized=!!this.bearerProfile;#r=()=>{};#n;state;constructor(e){if(!e){this.#e=x.environments.sandbox;return}if(typeof e=="string")this.#e=x.environments[e];else if(this.#r=N(e.debug??false),this.#e=x.environments[e.environment||"sandbox"],!d&&!e?.clientSecret){let{clientId:r,redirectUri:n}=e;this.#n={clientId:r,redirectUri:n};}else if(d&&e?.clientSecret){this.#r("Client credentials detected");let{clientId:r,clientSecret:n}=e;this.#n={clientId:r,clientSecret:n};}}async authorize(e){let r=S(),n=e?.address?{address:e?.address,signature:e?.signature,chain:e?.chain?p(this.#e.name,e?.chain):void 0}:{},i=C({client_id:this.#n?.clientId,redirect_uri:this.#n?.redirectUri,code_challenge:r,code_challenge_method:"S256",response_type:"code",state:e?.state,skip_create_account:e?.skipCreateAccount,skip_kyc:e?.skipKyc,email:e?.email,...n}),s=`${this.#e.api}/auth?${i}`;this.#r(`Auth flow URL: ${s}`),window.location.assign(s);}async siwe(e){let r=S(),n=C({client_id:this.#n?.clientId,redirect_uri:this.#n?.redirectUri,message:e.message,signature:e.signature,code_challenge:r,code_challenge_method:"S256",authentication_method:"siwe",state:e?.state}),i=`${this.#e.api}/auth?${n}`;this.#r(`Auth flow SIWE URL: ${i}`),window.location.assign(i);}async getAccess(e){let r=this.#n?.clientId;if(this.#n?.clientSecret){if(d)return await this.#c(this.#n),!!this?.bearerProfile;console.error("\x1B[31m%s\x1B[0m","Use client credentials only on the server where the secret is secure!");}let i=this.#n?.redirectUri;if(!r)throw new Error("Missing ClientId");if(d)throw new Error("This only works client side");let s=new URLSearchParams(window.location.search).get("error")||void 0,a=new URLSearchParams(window.location.search).get("error_description")||void 0;if(s||a)throw new Error(a);let o=new URLSearchParams(window.location.search).get("code")||void 0,l=new URLSearchParams(window.location.search).get("state")||void 0,c=window.localStorage.getItem(h),y=window.localStorage.getItem(m);if(o)return this.#r("Using auth code from auth flow to authorize"),await this.#a(r,i,o,l),this.#r(this.bearerProfile?"Authorized":"Not authorized"),!!this.bearerProfile;if(e)return this.#r("Using refresh token to authorize"),await this.#d(r,e),this.#r(this.bearerProfile?"Authorized":"Not authorized"),!!this.bearerProfile;if(c&&y){let U=new Date;if(parseInt(y)<U.getTime())throw window.localStorage.removeItem(h),window.localStorage.removeItem(m),this.isAuthorized=false,this.bearerProfile=void 0,new Error("Access token has expired");this.#r("Access token should still be valid, checking if it is authorized...");try{return this.#s=`Bearer ${c}`,this.isAuthorized=!0,await this.getTokens(),this.#r("Authorized"),!0}catch{throw this.#r("Access token is invalid."),window.localStorage.removeItem(h),window.localStorage.removeItem(m),this.isAuthorized=false,this.bearerProfile=void 0,new Error("Access token is invalid.")}}return this.#r(this.bearerProfile?"Authorized":"Not authorized"),!!this.bearerProfile}async#o(e){let r;if(R(e))r={...e,grant_type:"authorization_code"};else if($(e))r={...e,grant_type:"refresh_token"};else if(v(e))r={...e,grant_type:"client_credentials"};else throw new Error("Authorization grant type could not be detected.");return await this.#t("post","auth/token",r,true).then(n=>{if(this.bearerProfile=n,this.isAuthorized=!!n,this.#s=`Bearer ${n?.access_token}`,!d){let s=new Date().getTime()+n?.expires_in*1e3;window.localStorage.setItem(h,n?.access_token||""),window.localStorage.setItem(m,s?.toString());}}).catch(n=>{throw d||(localStorage.removeItem(w),localStorage.removeItem(h),localStorage.removeItem(m),k()),new Error(n?.message)}),R(e)&&k(),this.bearerProfile}getAuthContext(){return this.#t("get","auth/context")}getProfile(e){return this.#t("get",`profiles/${e}`)}getProfiles(e){return this.#t("get",`profiles${u(e)}`)}getAddress(e){return this.#t("get",`addresses/${e}`)}getAddresses(e){e=g(this.#e.name,e);let r=e?C(e):void 0,n=r?`addresses?${r}`:"addresses";return this.#t("get",n)}getBalances(e,r,n){let i=Array.isArray(n)?n.map(a=>`currency=${a}`).join("&"):n?`currency=${n}`:"",s=p(this.#e.name,r);return this.#t("get",`balances/${s}/${e}${i?`?${i}`:""}`)}getIban(e){return this.#t("get",`ibans/${encodeURI(e)}`)}getIbans(e){let{profile:r,chain:n}=e||{},i=u({profile:r,chain:n?p(this.#e.name,n):""});return this.#t("get",`ibans${i}`)}getOrders(e){return this.#t("get",`orders${u(e)}`)}getOrder(e){return this.#t("get",`orders/${e}`)}getTokens(){return this.#t("get","tokens")}getSignatures(e){let r=e?g(this.#e.name,e):void 0;return this.#t("get",`signatures${u(r)}`)}linkAddress(e){return e=g(this.#e.name,e),this.#t("post","addresses",JSON.stringify(e))}placeOrder(e){let r={kind:"redeem",...g(this.#e.name,e),counterpart:{...e.counterpart,identifier:g(this.#e.name,e.counterpart.identifier)}};return this.#t("post","orders",JSON.stringify(r))}moveIban(e,{address:r,chain:n}){return this.#t("patch",`ibans/${e}`,JSON.stringify({address:r,chain:p(this.#e.name,n)}))}requestIban({address:e,chain:r,emailNotifications:n=true}){return this.#t("post","ibans",JSON.stringify({address:e,chain:p(this.#e.name,r),emailNotifications:n}))}submitProfileDetails(e,r){return this.#t("put",`profiles/${e}/details`,JSON.stringify(r))}uploadSupportingDocument(e){let r=new FormData;return r.append("file",e),_(`${this.#e.api}/files`,"post",r,{Authorization:this.#s||""})}async#t(e,r,n,i){let s={Authorization:this.#s||"",Accept:"application/vnd.monerium.api-v2+json","Content-Type":`application/${i?"x-www-form-urlencoded":"json"}`};return _(`${this.#e.api}/${r}`,e.toUpperCase(),i?C(n):n,s)}#a=async(e,r,n,i)=>{let s=localStorage.getItem(w)||"";if(!s)throw new Error("Code verifier not found");return this.#r("Use code verifier to authorize"),this.state=i,localStorage.removeItem(w),await this.#o({code:n,redirect_uri:r,client_id:e,code_verifier:s})};#c=async({clientId:e,clientSecret:r})=>await this.#o({client_id:e,client_secret:r});#d=async(e,r)=>await this.#o({refresh_token:r,client_id:e});subscribeOrderNotifications({filter:e,onMessage:r,onError:n}={}){if(!this.bearerProfile?.access_token)return;let{profile:i,state:s}=e||{},a=u({access_token:this.bearerProfile?.access_token,profile:i,state:s}),o,l=E({profile:i,state:s});if(this.#i?.has(l))o=this.#i.get(l);else {let c=`${this.#e.wss}/orders${a}`;o=new WebSocket(c),this.#i?.set(l,o);}return o.onopen=()=>{console.log("Connected to WebSocket server");},o.onmessage=c=>{let y=JSON.parse(c.data);r&&r(y);},o.onclose=()=>{console.log("WebSocket connection closed"),this.#i?.delete(a);},o.onerror=c=>{n&&n(c),console.error("WebSocket error:",c);},o}unsubscribeOrderNotifications(e){if(e){let r=E({profile:e?.profile,state:e?.state}),n=this.#i?.get(r);n&&(n.close(),this.#i?.delete(r));}else this.#i?.forEach(r=>{r?.close();}),this.#i?.clear(),this.#i=void 0;}async disconnect(){d||localStorage.removeItem(w),this.unsubscribeOrderNotifications(),this.#s=void 0,this.bearerProfile=void 0;}async revokeAccess(){d||(localStorage.removeItem(h),localStorage.removeItem(m)),this.disconnect();}getEnvironment=()=>this.#e};var De=I;export{V as AccountState,B as Currency,J as IdDocumentKind,W as KYCOutcome,Q as KYCState,K as Method,I as MoneriumClient,H as OrderKind,X as OrderState,G as PaymentStandard,F as Permission,L as ProfileState,M as ProfileType,f as constants,De as default,O as getChain,b as parseChain,ee as placeOrderMessage,P as rfc3339,re as shortenAddress,D as shortenIban,te as siweMessage};
14
+ - ${a}
15
+ - ${p}`,A=r=>{let e=w.get(r);if(!e)throw new Error(`Chain not supported: ${r}`);return e},D=r=>{if(typeof r!="string"||!r?.length)return r;let e=r.replace(/\s/g,"");return r?.length>11?`${e.substring(0,4)}...${e.substring(e.length-4)}`:r},z=r=>typeof r!="string"||!r?.length?r:r?.length>11?`${r.substring(0,7)}...${r.substring(r.length-5)}`:r;function g(r){return r?.chain!==void 0?{...r,chain:l(r.chain)}:r}var m=class{options;env;transport;constructor(e){this.options=e,this.env=N(e.environment),this.transport=e.transport??k;}async getToken(){return this.options.getAccessToken()}async request(e,t,n,i="application/json"){let s=t.startsWith("tokens")||t.startsWith("auth/token"),o=s?null:await this.getToken(),a={Accept:"application/vnd.monerium.api-v2+json","Content-Type":i};if(o)a.Authorization=`Bearer ${o}`;else if(!s)throw new u("authentication_required","No access token provided for authenticated endpoint");let{status:p,bodyText:P}=await this.transport({method:e.toUpperCase(),url:`${this.env.api}/${t}`,headers:a,body:n?i==="application/json"?JSON.stringify(n):n:void 0});if(!P)return {status:p};let b;try{b=JSON.parse(P);}catch{throw new c({code:p,status:"Parse Error",message:P})}if(p<200||p>=300)throw new c(b);return b}async requestFormData(e,t,n){let i=await this.getToken(),s={Accept:"application/vnd.monerium.api-v2+json"};i&&(s.Authorization=`Bearer ${i}`);let{status:o,bodyText:a}=await this.transport({method:e.toUpperCase(),url:`${this.env.api}/${t}`,headers:s,body:n});if(!a)return {status:o};let p;try{p=JSON.parse(a);}catch{throw new c({code:o,status:"Parse Error",message:a})}if(o<200||o>=300)throw new c(p);return p}async getAuthContext(){return this.request("GET","auth/context")}async getProfile(e){return this.request("GET",`profiles/${e}`)}async getProfiles(e){return this.request("GET",`profiles${d(e)}`)}async getAddress(e){return this.request("GET",`addresses/${e}`)}async getAddresses(e){let t=e?g(e):void 0;return this.request("GET",`addresses${d(t)}`)}async linkAddress(e){return this.request("POST","addresses",g(e))}async getBalances(e){let{address:t,chain:n,currencies:i}=e,s=l(n);return this.request("GET",`balances/${s}/${t}${d({currency:i})}`)}async getIban(e){return this.request("GET",`ibans/${encodeURIComponent(e)}`)}async getIbans(e){let t=e?g(e):void 0;return this.request("GET",`ibans${d(t)}`)}async requestIban(e){return this.request("POST","ibans",{address:e.address,chain:l(e.chain),emailNotifications:e.emailNotifications??true})}async moveIban(e){return this.request("PATCH",`ibans/${e.iban}`,{address:e.address,chain:l(e.chain)})}async getOrder(e){return this.request("GET",`orders/${e}`)}async getOrders(e){return this.request("GET",`orders${d(e)}`)}async placeOrder(e){let t={kind:"redeem",...g(e),...e.counterpart&&{counterpart:{...e.counterpart,identifier:g(e.counterpart.identifier)}}};return this.request("POST","orders",t)}async getTokens(){return this.request("GET","tokens")}async getSignatures(e){let t=e?g(e):void 0;return this.request("GET",`signatures${d(t)}`)}async uploadSupportingDocument(e,t){let n=e instanceof Blob?e:new Blob([e]),i=new FormData;return i.append("file",n,t??("name"in e?String(e.name):"document")),this.requestFormData("POST","files",i)}},h=class extends m{async clientCredentialsGrant(e,t){let n=f({grant_type:"client_credentials",client_id:e,client_secret:t});return this.request("POST","auth/token",n,"application/x-www-form-urlencoded")}async getSubscriptions(){return this.request("GET","webhooks")}async createSubscription(e){return this.request("POST","webhooks",e)}async updateSubscription(e){let{subscription:t,...n}=e;return this.request("PATCH",`webhooks/${t}`,n)}},y=class extends h{},O=class extends m{buildAuthorizationUrl(e){let t=d({client_id:e.clientId,redirect_uri:e.redirectUri,code_challenge:e.codeChallenge,code_challenge_method:"S256",response_type:"code",state:e.state,skip_kyc:e.skipKyc,email:e.email,auth_mode:e.authMode});return `${this.env.api}/auth${t}`}buildSiweAuthorizationUrl(e){let t=d({client_id:e.clientId,redirect_uri:e.redirectUri,message:e.message,signature:e.signature,code_challenge:e.codeChallenge,code_challenge_method:"S256",authentication_method:"siwe",state:e.state});return `${this.env.api}/auth${t}`}async authorizationCodeGrant(e){let t=f({grant_type:"authorization_code",client_id:e.clientId,redirect_uri:e.redirectUri,code:e.code,code_verifier:e.codeVerifier});return this.request("POST","auth/token",t,"application/x-www-form-urlencoded")}async refreshTokenGrant(e){let t=f({grant_type:"refresh_token",client_id:e.clientId,refresh_token:e.refreshToken});return this.request("POST","auth/token",t,"application/x-www-form-urlencoded")}parseAuthorizationResponse(e){return R(e)}},_=class extends h{async createProfile(e){return this.request("POST","profiles",e)}async shareProfileKYC(e){let{profile:t,...n}=e;return this.request("POST",`profiles/${t}/share`,n)}async updateProfileDetails(e){let{profile:t,...n}=e;return this.request("PATCH",`profiles/${t}/details`,n)}async updateProfileForm(e){let{profile:t,...n}=e;return this.request("PATCH",`profiles/${t}/form`,n)}async updateProfileVerifications(e){let{profile:t,...n}=e;return this.request("PATCH",`profiles/${t}/verifications`,n)}};var W={LINK_MESSAGE:"I hereby declare that I am the address owner."};export{v as Currency,c as MoneriumApiError,m as MoneriumBaseClient,O as MoneriumOAuthClient,y as MoneriumPrivateClient,u as MoneriumSdkError,h as MoneriumServerClient,_ as MoneriumWhitelabelClient,V as ProfileType,T as calculatePKCECodeChallenge,W as constants,M as generatePKCE,A as getChain,R as parseAuthorizationResponse,l as parseChain,L as placeOrderMessage,I as randomPKCECodeVerifier,C as rfc3339,z as shortenAddress,D as shortenIban,q as siweMessage};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@monerium/sdk",
3
- "version": "3.4.11",
4
- "description": "Essential tools to interact with the Monerium API, an electronic money issuer.",
3
+ "version": "4.0.0",
4
+ "description": "Essential tools to interact with the Monerium API, an electronic money issuer. Node.js and server-side runtimes first.",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/monerium/js-monorepo.git",
@@ -32,7 +32,6 @@
32
32
  "devDependencies": {
33
33
  "@types/crypto-js": "^4.2.2",
34
34
  "jest-fetch-mock": "^3.0.3",
35
- "jest-localstorage-mock": "^2.4.26",
36
35
  "timezone-mock": "^1.3.6"
37
36
  },
38
37
  "engines": {
@@ -40,7 +39,7 @@
40
39
  },
41
40
  "scripts": {
42
41
  "dev": "tsup --watch",
43
- "build": "tsup",
42
+ "build": "tsc --noEmit && tsup",
44
43
  "typedoc": "typedoc",
45
44
  "type-map": "tsc --emitDeclarationOnly --declaration",
46
45
  "lint": "eslint . --fix",