@starfish-codes/hellgate 3.8.1 → 3.9.1

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.
Files changed (31) hide show
  1. package/dist/3ds/typings.d.ts +1 -0
  2. package/dist/__tests__/test-utils.d.ts +11 -0
  3. package/dist/card/card-handler.d.ts +30 -8
  4. package/dist/card/coordinator/card-handler-coordinator.d.ts +34 -0
  5. package/dist/card/coordinator/index.d.ts +2 -0
  6. package/dist/card/coordinator/typings.d.ts +36 -0
  7. package/dist/card/typings.d.ts +14 -3
  8. package/dist/card/ui/elements/base-element.d.ts +3 -3
  9. package/dist/card/ui/elements/card-expiration-month.d.ts +9 -0
  10. package/dist/card/ui/elements/card-expiration-year.d.ts +9 -0
  11. package/dist/card/ui/elements/utils.d.ts +5 -2
  12. package/dist/card/ui/iframe/elements/base-element.d.ts +3 -2
  13. package/dist/card/ui/iframe/elements/card-expiration-month.d.ts +10 -0
  14. package/dist/card/ui/iframe/elements/card-expiration-year.d.ts +9 -0
  15. package/dist/card/ui/iframe/elements/text-element.d.ts +1 -0
  16. package/dist/card/ui/iframe/index.d.ts +1 -0
  17. package/dist/card/ui/iframe/utils.d.ts +1 -0
  18. package/dist/card/ui/typings.d.ts +10 -6
  19. package/dist/coordinator/coordinator.d.ts +38 -0
  20. package/dist/coordinator/iframe/constants.d.ts +1 -0
  21. package/dist/coordinator/iframe/iframe-coordinator.d.ts +33 -0
  22. package/dist/coordinator/iframe/iframe.d.ts +1 -0
  23. package/dist/coordinator/iframe/index.d.ts +2 -0
  24. package/dist/coordinator/index.d.ts +3 -0
  25. package/dist/coordinator/typings.d.ts +39 -0
  26. package/dist/hellgate-sdk.mjs +515 -1132
  27. package/dist/hellgate-sdk.umd.js +1 -1
  28. package/dist/hellgate.d.ts +5 -2
  29. package/dist/session/session.d.ts +1 -1
  30. package/dist/utils.d.ts +1 -0
  31. package/package.json +6 -5
@@ -1 +1 @@
1
- (function(f,v){typeof exports=="object"&&typeof module<"u"?v(exports):typeof define=="function"&&define.amd?define(["exports"],v):(f=typeof globalThis<"u"?globalThis:f||self,v(f.HellgateSDK={}))})(this,function(f){"use strict";function v(t){return Array.isArray(t)?t.filter(Boolean):Object.fromEntries(Object.entries(t).map(([e,r])=>[e,typeof r=="object"&&r&&!Array.isArray(r)?v(r):r]).filter(([e,r])=>typeof r=="object"&&r&&!Array.isArray(r)?!!Object.keys(r).length:r!=null&&r!=null))}function O(t,e){const r={...t,...e},n=Object.keys(r);for(const i of n){const a=t[i],s=e[i];typeof a=="object"&&!Array.isArray(a)&&a&&typeof s=="object"&&!Array.isArray(s)&&s&&(r[i]=O(a,s))}return r}function W(t){if(!t.ok)throw t;return t.json()}const Te=2e3;class ie{constructor(e,r){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"iframeId",{enumerable:!0,configurable:!0,writable:!0,value:String(Math.floor(1e5+Math.random()*9e5))}),Object.defineProperty(this,"resultPollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transactionId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"decoupledAuthHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"disposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"check3dsIframeDisposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"domContainer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"labelText",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onStartHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onFinishHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onDecoupledAuth",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.decoupledAuthHandlers.push(n)}}),Object.defineProperty(this,"onStartChallenge",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.onStartHandler=n}}),Object.defineProperty(this,"onChallengeFinished",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.onFinishHandler=n}}),Object.defineProperty(this,"sessionStateHandle",{enumerable:!0,configurable:!0,writable:!0,value:n=>{var i,a;switch(n.next_action){case"3ds_check":{this.initCheck3DSIframes(n.data.threeds_server_callback_url,n.data.mon_url);break}case"3ds_challenge":{(i=this.onStartHandler)==null||i.call(this),this.disposeCheck3DSIframe(),this.startChallenge(n.data.challenge_url,n.data.result_mon_url);break}case"3ds_challenge_decoupled":{this.startDecoupledAuth(n.data.cardholder_info,n.data.result_mon_url,n.data.transaction_id);break}case null:{this.dispose(),(a=this.onFinishHandler)==null||a.call(this);break}}}}),this.domContainer=r.domContainer??N(),this.disposers.push(this.session.onStateChange(this.sessionStateHandle)),this.labelText=r.labelText}dispose(){this.disposers.forEach(e=>e()),this.check3dsIframeDisposers.forEach(e=>e())}initCheck3DSIframes(e,r){const n=N();n.insertAdjacentHTML("beforeend",`<iframe id="check_3ds_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${e}"></iframe>`);const i=n.querySelector(`#check_3ds_${this.iframeId}`);if(i){const a=s=>{s.source===i.contentWindow&&this.session.completeAction({action:"3ds_check",result:s.data})};window.addEventListener("message",a),this.check3dsIframeDisposers.push(()=>window.removeEventListener("message",a),()=>i.remove())}if(r){n.insertAdjacentHTML("beforeend",`<iframe id="mon_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${r}"></iframe>`);const a=n.querySelector(`#mon_${this.iframeId}`);a&&this.disposers.push(()=>a.remove())}}disposeCheck3DSIframe(){this.check3dsIframeDisposers.forEach(e=>e()),this.check3dsIframeDisposers=[]}startChallenge(e,r){const n=N(),i=`<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer===n?'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ':'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText?'<span id="tds_label_text" style="font-size: large;">'+this.labelText+"</span>":""}<div>`;this.domContainer.insertAdjacentHTML("beforeend",this.domContainer===n?`<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${i}</div>`:i);const a=this.domContainer.querySelector(`#cha_${this.iframeId}`),s=this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);if(!a)throw new Error("3DS Challenge Iframe initialization failed");this.disposers.push(()=>{a.remove(),s==null||s.remove()});const o=new Promise(u=>{const d=l=>{l.source!==a.contentWindow||l.data.event!=="AuthResultReady"||u(l.data)};window.addEventListener("message",d),this.disposers.push(()=>window.removeEventListener("message",d))}),c=new Promise(u=>{const d=this.startAuthResultPolling(r,l=>{l.event==="AuthResultReady"&&(d(),u({requestor_trans_id:l.threeDSRequestorTransID,event:l.event}))})});Promise.any([o,c]).then(u=>{this.session.completeAction({action:"3ds_challenge",result:u})})}startDecoupledAuth(e,r,n){this.transactionId||(this.transactionId=n),this.decoupledAuthHandlers.forEach(a=>a(e));const i=this.startAuthResultPolling(r,a=>{a.event==="AuthResultReady"&&(this.session.completeAction({action:"3ds_challenge_decoupled",result:{...a,event:a.event}}),i())})}startAuthResultPolling(e,r){return window.clearTimeout(this.resultPollingTimer),this.resultPollingTimer=window.setTimeout(()=>fetch(e).then(n=>W(n)).then(n=>{this.startAuthResultPolling(e,r),r(n)}).catch(()=>{}),Te),()=>window.clearTimeout(this.resultPollingTimer)}}function N(){return document.body}const h=crypto,g=t=>t instanceof CryptoKey,De=async(t,e)=>{const r=`SHA-${t.slice(-3)}`;return new Uint8Array(await h.subtle.digest(r,e))},S=new TextEncoder,ae=new TextDecoder,M=2**32;function R(...t){const e=t.reduce((i,{length:a})=>i+a,0),r=new Uint8Array(e);let n=0;for(const i of t)r.set(i,n),n+=i.length;return r}function Re(t,e){return R(S.encode(t),new Uint8Array([0]),e)}function L(t,e,r){if(e<0||e>=M)throw new RangeError(`value must be >= 0 and <= ${M-1}. Received ${e}`);t.set([e>>>24,e>>>16,e>>>8,e&255],r)}function je(t){const e=Math.floor(t/M),r=t%M,n=new Uint8Array(8);return L(n,e,0),L(n,r,4),n}function F(t){const e=new Uint8Array(4);return L(e,t),e}function B(t){return R(F(t.length),t)}async function Ie(t,e,r){const n=Math.ceil((e>>3)/32),i=new Uint8Array(n*32);for(let a=0;a<n;a++){const s=new Uint8Array(4+t.length+r.length);s.set(F(a+1)),s.set(t,4),s.set(r,4+t.length),i.set(await De("sha256",s),a*32)}return i.slice(0,e>>3)}const Me=t=>{let e=t;typeof e=="string"&&(e=S.encode(e));const r=32768,n=[];for(let i=0;i<e.length;i+=r)n.push(String.fromCharCode.apply(null,e.subarray(i,i+r)));return btoa(n.join(""))},m=t=>Me(t).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_"),Ue=t=>{const e=atob(t),r=new Uint8Array(e.length);for(let n=0;n<e.length;n++)r[n]=e.charCodeAt(n);return r},se=t=>{let e=t;e instanceof Uint8Array&&(e=ae.decode(e)),e=e.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return Ue(e)}catch{throw new TypeError("The input to be decoded is not correctly encoded.")}};class oe extends Error{static get code(){return"ERR_JOSE_GENERIC"}constructor(e){var r;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,(r=Error.captureStackTrace)==null||r.call(Error,this,this.constructor)}}class p extends oe{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class A extends oe{constructor(){super(...arguments),this.code="ERR_JWE_INVALID"}static get code(){return"ERR_JWE_INVALID"}}const V=h.getRandomValues.bind(h);function ce(t){switch(t){case"A128GCM":case"A128GCMKW":case"A192GCM":case"A192GCMKW":case"A256GCM":case"A256GCMKW":return 96;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":return 128;default:throw new p(`Unsupported JWE Algorithm: ${t}`)}}const $e=t=>V(new Uint8Array(ce(t)>>3)),We=(t,e)=>{if(e.length<<3!==ce(t))throw new A("Invalid Initialization Vector length")},le=(t,e)=>{const r=t.byteLength<<3;if(r!==e)throw new A(`Invalid Content Encryption Key length. Expected ${e} bits, got ${r} bits`)};function _(t,e="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${e} must be ${t}`)}function U(t,e){return t.name===e}function Ne(t){return parseInt(t.name.slice(4),10)}function Le(t,e){if(e.length&&!e.some(r=>t.usages.includes(r))){let r="CryptoKey does not support this operation, its usages must include ";if(e.length>2){const n=e.pop();r+=`one of ${e.join(", ")}, or ${n}.`}else e.length===2?r+=`one of ${e[0]} or ${e[1]}.`:r+=`${e[0]}.`;throw new TypeError(r)}}function H(t,e,...r){switch(e){case"A128GCM":case"A192GCM":case"A256GCM":{if(!U(t.algorithm,"AES-GCM"))throw _("AES-GCM");const n=parseInt(e.slice(1,4),10);if(t.algorithm.length!==n)throw _(n,"algorithm.length");break}case"A128KW":case"A192KW":case"A256KW":{if(!U(t.algorithm,"AES-KW"))throw _("AES-KW");const n=parseInt(e.slice(1,4),10);if(t.algorithm.length!==n)throw _(n,"algorithm.length");break}case"ECDH":{switch(t.algorithm.name){case"ECDH":case"X25519":case"X448":break;default:throw _("ECDH, X25519, or X448")}break}case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":if(!U(t.algorithm,"PBKDF2"))throw _("PBKDF2");break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":{if(!U(t.algorithm,"RSA-OAEP"))throw _("RSA-OAEP");const n=parseInt(e.slice(9),10)||1;if(Ne(t.algorithm.hash)!==n)throw _(`SHA-${n}`,"algorithm.hash");break}default:throw new TypeError("CryptoKey does not support this operation")}Le(t,r)}function ue(t,e,...r){var n;if(r.length>2){const i=r.pop();t+=`one of type ${r.join(", ")}, or ${i}.`}else r.length===2?t+=`one of type ${r[0]} or ${r[1]}.`:t+=`of type ${r[0]}.`;return e==null?t+=` Received ${e}`:typeof e=="function"&&e.name?t+=` Received function ${e.name}`:typeof e=="object"&&e!=null&&(n=e.constructor)!=null&&n.name&&(t+=` Received an instance of ${e.constructor.name}`),t}const E=(t,...e)=>ue("Key must be ",t,...e);function de(t,e,...r){return ue(`Key for the ${t} algorithm must be `,e,...r)}const he=t=>g(t)?!0:(t==null?void 0:t[Symbol.toStringTag])==="KeyObject",y=["CryptoKey"],Fe=(...t)=>{const e=t.filter(Boolean);if(e.length===0||e.length===1)return!0;let r;for(const n of e){const i=Object.keys(n);if(!r||r.size===0){r=new Set(i);continue}for(const a of i){if(r.has(a))return!1;r.add(a)}}return!0};function Be(t){return typeof t=="object"&&t!==null}function Ve(t){if(!Be(t)||Object.prototype.toString.call(t)!=="[object Object]")return!1;if(Object.getPrototypeOf(t)===null)return!0;let e=t;for(;Object.getPrototypeOf(e)!==null;)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e}const fe=[{hash:"SHA-256",name:"HMAC"},!0,["sign"]];function ze(t,e){if(t.algorithm.length!==parseInt(e.slice(1,4),10))throw new TypeError(`Invalid key size for alg: ${e}`)}function Je(t,e,r){if(g(t))return H(t,e,r),t;if(t instanceof Uint8Array)return h.subtle.importKey("raw",t,"AES-KW",!0,[r]);throw new TypeError(E(t,...y,"Uint8Array"))}const z=async(t,e,r)=>{const n=await Je(e,t,"wrapKey");ze(n,t);const i=await h.subtle.importKey("raw",r,...fe);return new Uint8Array(await h.subtle.wrapKey("raw",i,n,"AES-KW"))};async function Ge(t,e,r,n,i=new Uint8Array(0),a=new Uint8Array(0)){if(!g(t))throw new TypeError(E(t,...y));if(H(t,"ECDH"),!g(e))throw new TypeError(E(e,...y));H(e,"ECDH","deriveBits");const s=R(B(S.encode(r)),B(i),B(a),F(n));let o;t.algorithm.name==="X25519"?o=256:t.algorithm.name==="X448"?o=448:o=Math.ceil(parseInt(t.algorithm.namedCurve.substr(-3),10)/8)<<3;const c=new Uint8Array(await h.subtle.deriveBits({name:t.algorithm.name,public:t},e,o));return Ie(c,n,s)}async function ke(t){if(!g(t))throw new TypeError(E(t,...y));return h.subtle.generateKey(t.algorithm,!0,["deriveBits"])}function qe(t){if(!g(t))throw new TypeError(E(t,...y));return["P-256","P-384","P-521"].includes(t.algorithm.namedCurve)||t.algorithm.name==="X25519"||t.algorithm.name==="X448"}function Xe(t){if(!(t instanceof Uint8Array)||t.length<8)throw new A("PBES2 Salt Input must be 8 or more octets")}function Ye(t,e){if(t instanceof Uint8Array)return h.subtle.importKey("raw",t,"PBKDF2",!1,["deriveBits"]);if(g(t))return H(t,e,"deriveBits","deriveKey"),t;throw new TypeError(E(t,...y,"Uint8Array"))}async function Ze(t,e,r,n){Xe(t);const i=Re(e,t),a=parseInt(e.slice(13,16),10),s={hash:`SHA-${e.slice(8,11)}`,iterations:r,name:"PBKDF2",salt:i},o={length:a,name:"AES-KW"},c=await Ye(n,e);if(c.usages.includes("deriveBits"))return new Uint8Array(await h.subtle.deriveBits(s,c,a));if(c.usages.includes("deriveKey"))return h.subtle.deriveKey(s,c,o,!1,["wrapKey","unwrapKey"]);throw new TypeError('PBKDF2 key "usages" must include "deriveBits" or "deriveKey"')}const Qe=async(t,e,r,n=2048,i=V(new Uint8Array(16)))=>{const a=await Ze(i,t,n,e);return{encryptedKey:await z(t.slice(-6),a,r),p2c:n,p2s:m(i)}};function pe(t){switch(t){case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":return"RSA-OAEP";default:throw new p(`alg ${t} is not supported either by JOSE or your javascript runtime`)}}const et=(t,e)=>{if(t.startsWith("RS")||t.startsWith("PS")){const{modulusLength:r}=e.algorithm;if(typeof r!="number"||r<2048)throw new TypeError(`${t} requires key modulusLength to be 2048 bits or larger`)}},tt=async(t,e,r)=>{if(!g(e))throw new TypeError(E(e,...y));if(H(e,t,"encrypt","wrapKey"),et(t,e),e.usages.includes("encrypt"))return new Uint8Array(await h.subtle.encrypt(pe(t),e,r));if(e.usages.includes("wrapKey")){const n=await h.subtle.importKey("raw",r,...fe);return new Uint8Array(await h.subtle.wrapKey("raw",n,e,pe(t)))}throw new TypeError('RSA-OAEP key "usages" must include "encrypt" or "wrapKey" for this operation')};function rt(t){let e,r;switch(t.kty){case"RSA":{switch(t.alg){case"PS256":case"PS384":case"PS512":e={name:"RSA-PSS",hash:`SHA-${t.alg.slice(-3)}`},r=t.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":e={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${t.alg.slice(-3)}`},r=t.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":e={name:"RSA-OAEP",hash:`SHA-${parseInt(t.alg.slice(-3),10)||1}`},r=t.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new p('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break}case"EC":{switch(t.alg){case"ES256":e={name:"ECDSA",namedCurve:"P-256"},r=t.d?["sign"]:["verify"];break;case"ES384":e={name:"ECDSA",namedCurve:"P-384"},r=t.d?["sign"]:["verify"];break;case"ES512":e={name:"ECDSA",namedCurve:"P-521"},r=t.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":e={name:"ECDH",namedCurve:t.crv},r=t.d?["deriveBits"]:[];break;default:throw new p('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break}case"OKP":{switch(t.alg){case"EdDSA":e={name:t.crv},r=t.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":e={name:t.crv},r=t.d?["deriveBits"]:[];break;default:throw new p('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break}default:throw new p('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:e,keyUsages:r}}const me=async t=>{if(!t.alg)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');const{algorithm:e,keyUsages:r}=rt(t),n=[e,t.ext??!1,t.key_ops??r],i={...t};return delete i.alg,delete i.use,h.subtle.importKey("jwk",i,...n)},be=t=>se(t);let J,G;const ye=t=>(t==null?void 0:t[Symbol.toStringTag])==="KeyObject",we=async(t,e,r,n)=>{let i=t.get(e);if(i!=null&&i[n])return i[n];const a=await me({...r,alg:n});return i?i[n]=a:t.set(e,{[n]:a}),a},k={normalizePublicKey:(t,e)=>{if(ye(t)){let r=t.export({format:"jwk"});return delete r.d,delete r.dp,delete r.dq,delete r.p,delete r.q,delete r.qi,r.k?be(r.k):(G||(G=new WeakMap),we(G,t,r,e))}return t},normalizePrivateKey:(t,e)=>{if(ye(t)){let r=t.export({format:"jwk"});return r.k?be(r.k):(J||(J=new WeakMap),we(J,t,r,e))}return t}};function ge(t){switch(t){case"A128GCM":return 128;case"A192GCM":return 192;case"A256GCM":case"A128CBC-HS256":return 256;case"A192CBC-HS384":return 384;case"A256CBC-HS512":return 512;default:throw new p(`Unsupported JWE Algorithm: ${t}`)}}const j=t=>V(new Uint8Array(ge(t)>>3));async function nt(t,e){if(!Ve(t))throw new TypeError("JWK must be an object");switch(t.kty){case"oct":if(typeof t.k!="string"||!t.k)throw new TypeError('missing "k" (Key Value) Parameter value');return se(t.k);case"RSA":if(t.oth!==void 0)throw new p('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return me({...t,alg:e});default:throw new p('Unsupported "kty" (Key Type) Parameter value')}}const q=t=>t==null?void 0:t[Symbol.toStringTag],it=(t,e)=>{if(!(e instanceof Uint8Array)){if(!he(e))throw new TypeError(de(t,e,...y,"Uint8Array"));if(e.type!=="secret")throw new TypeError(`${q(e)} instances for symmetric algorithms must be of type "secret"`)}},at=(t,e,r)=>{if(!he(e))throw new TypeError(de(t,e,...y));if(e.type==="secret")throw new TypeError(`${q(e)} instances for asymmetric algorithms must not be of type "secret"`);if(e.algorithm,e.algorithm&&r==="encrypt"&&e.type==="private")throw new TypeError(`${q(e)} instances for asymmetric algorithm encryption must be of type "public"`)},st=(t,e,r)=>{t.startsWith("HS")||t==="dir"||t.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(t)?it(t,e):at(t,e,r)};async function ot(t,e,r,n,i){if(!(r instanceof Uint8Array))throw new TypeError(E(r,"Uint8Array"));const a=parseInt(t.slice(1,4),10),s=await h.subtle.importKey("raw",r.subarray(a>>3),"AES-CBC",!1,["encrypt"]),o=await h.subtle.importKey("raw",r.subarray(0,a>>3),{hash:`SHA-${a<<1}`,name:"HMAC"},!1,["sign"]),c=new Uint8Array(await h.subtle.encrypt({iv:n,name:"AES-CBC"},s,e)),u=R(i,n,c,je(i.length<<3)),d=new Uint8Array((await h.subtle.sign("HMAC",o,u)).slice(0,a>>3));return{ciphertext:c,tag:d,iv:n}}async function ct(t,e,r,n,i){let a;r instanceof Uint8Array?a=await h.subtle.importKey("raw",r,"AES-GCM",!1,["encrypt"]):(H(r,t,"encrypt"),a=r);const s=new Uint8Array(await h.subtle.encrypt({additionalData:i,iv:n,name:"AES-GCM",tagLength:128},a,e)),o=s.slice(-16);return{ciphertext:s.slice(0,-16),tag:o,iv:n}}const Ee=async(t,e,r,n,i)=>{if(!g(r)&&!(r instanceof Uint8Array))throw new TypeError(E(r,...y,"Uint8Array"));switch(n?We(t,n):n=$e(t),t){case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":return r instanceof Uint8Array&&le(r,parseInt(t.slice(-3),10)),ot(t,e,r,n,i);case"A128GCM":case"A192GCM":case"A256GCM":return r instanceof Uint8Array&&le(r,parseInt(t.slice(1,4),10)),ct(t,e,r,n,i);default:throw new p("Unsupported JWE Content Encryption Algorithm")}};async function lt(t,e,r,n){const i=t.slice(0,7),a=await Ee(i,r,e,n,new Uint8Array(0));return{encryptedKey:a.ciphertext,iv:m(a.iv),tag:m(a.tag)}}function ut(t,e,r,n,i){if(i.crit!==void 0&&(n==null?void 0:n.crit)===void 0)throw new t('"crit" (Critical) Header Parameter MUST be integrity protected');if(!n||n.crit===void 0)return new Set;if(!Array.isArray(n.crit)||n.crit.length===0||n.crit.some(s=>typeof s!="string"||s.length===0))throw new t('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let a;r!==void 0?a=new Map([...Object.entries(r),...e.entries()]):a=e;for(const s of n.crit){if(!a.has(s))throw new p(`Extension Header Parameter "${s}" is not recognized`);if(i[s]===void 0)throw new t(`Extension Header Parameter "${s}" is missing`);if(a.get(s)&&n[s]===void 0)throw new t(`Extension Header Parameter "${s}" MUST be integrity protected`)}return new Set(n.crit)}const dt=async t=>{if(t instanceof Uint8Array)return{kty:"oct",k:m(t)};if(!g(t))throw new TypeError(E(t,...y,"Uint8Array"));if(!t.extractable)throw new TypeError("non-extractable CryptoKey cannot be exported as a JWK");const{ext:e,key_ops:r,alg:n,use:i,...a}=await h.subtle.exportKey("jwk",t);return a};async function ht(t){return dt(t)}async function ft(t,e,r,n,i={}){var c;let a,s,o;switch(st(t,r,"encrypt"),r=await((c=k.normalizePublicKey)==null?void 0:c.call(k,r,t))||r,t){case"dir":{o=r;break}case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":{if(!qe(r))throw new p("ECDH with the provided key is not allowed or not supported by your javascript runtime");const{apu:u,apv:d}=i;let{epk:l}=i;l||(l=(await ke(r)).privateKey);const{x:C,y:P,crv:b,kty:w}=await ht(l),xe=await Ge(r,l,t==="ECDH-ES"?e:t,t==="ECDH-ES"?ge(e):parseInt(t.slice(-5,-2),10),u,d);if(s={epk:{x:C,crv:b,kty:w}},w==="EC"&&(s.epk.y=P),u&&(s.apu=m(u)),d&&(s.apv=m(d)),t==="ECDH-ES"){o=xe;break}o=n||j(e);const Pt=t.slice(-6);a=await z(Pt,xe,o);break}case"RSA1_5":case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":{o=n||j(e),a=await tt(t,r,o);break}case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":{o=n||j(e);const{p2c:u,p2s:d}=i;({encryptedKey:a,...s}=await Qe(t,r,o,u,d));break}case"A128KW":case"A192KW":case"A256KW":{o=n||j(e),a=await z(t,r,o);break}case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":{o=n||j(e);const{iv:u}=i;({encryptedKey:a,...s}=await lt(t,r,o,u));break}default:throw new p('Invalid or unsupported "alg" (JWE Algorithm) header value')}return{cek:o,encryptedKey:a,parameters:s}}const pt=Symbol();class mt{constructor(e){if(!(e instanceof Uint8Array))throw new TypeError("plaintext must be an instance of Uint8Array");this._plaintext=e}setKeyManagementParameters(e){if(this._keyManagementParameters)throw new TypeError("setKeyManagementParameters can only be called once");return this._keyManagementParameters=e,this}setProtectedHeader(e){if(this._protectedHeader)throw new TypeError("setProtectedHeader can only be called once");return this._protectedHeader=e,this}setSharedUnprotectedHeader(e){if(this._sharedUnprotectedHeader)throw new TypeError("setSharedUnprotectedHeader can only be called once");return this._sharedUnprotectedHeader=e,this}setUnprotectedHeader(e){if(this._unprotectedHeader)throw new TypeError("setUnprotectedHeader can only be called once");return this._unprotectedHeader=e,this}setAdditionalAuthenticatedData(e){return this._aad=e,this}setContentEncryptionKey(e){if(this._cek)throw new TypeError("setContentEncryptionKey can only be called once");return this._cek=e,this}setInitializationVector(e){if(this._iv)throw new TypeError("setInitializationVector can only be called once");return this._iv=e,this}async encrypt(e,r){if(!this._protectedHeader&&!this._unprotectedHeader&&!this._sharedUnprotectedHeader)throw new A("either setProtectedHeader, setUnprotectedHeader, or sharedUnprotectedHeader must be called before #encrypt()");if(!Fe(this._protectedHeader,this._unprotectedHeader,this._sharedUnprotectedHeader))throw new A("JWE Protected, JWE Shared Unprotected and JWE Per-Recipient Header Parameter names must be disjoint");const n={...this._protectedHeader,...this._unprotectedHeader,...this._sharedUnprotectedHeader};if(ut(A,new Map,r==null?void 0:r.crit,this._protectedHeader,n),n.zip!==void 0)throw new p('JWE "zip" (Compression Algorithm) Header Parameter is not supported.');const{alg:i,enc:a}=n;if(typeof i!="string"||!i)throw new A('JWE "alg" (Algorithm) Header Parameter missing or invalid');if(typeof a!="string"||!a)throw new A('JWE "enc" (Encryption Algorithm) Header Parameter missing or invalid');let s;if(this._cek&&(i==="dir"||i==="ECDH-ES"))throw new TypeError(`setContentEncryptionKey cannot be called with JWE "alg" (Algorithm) Header ${i}`);let o;{let w;({cek:o,encryptedKey:s,parameters:w}=await ft(i,a,e,this._cek,this._keyManagementParameters)),w&&(r&&pt in r?this._unprotectedHeader?this._unprotectedHeader={...this._unprotectedHeader,...w}:this.setUnprotectedHeader(w):this._protectedHeader?this._protectedHeader={...this._protectedHeader,...w}:this.setProtectedHeader(w))}let c,u,d;this._protectedHeader?u=S.encode(m(JSON.stringify(this._protectedHeader))):u=S.encode(""),this._aad?(d=m(this._aad),c=R(u,S.encode("."),S.encode(d))):c=u;const{ciphertext:l,tag:C,iv:P}=await Ee(a,this._plaintext,o,this._iv,c),b={ciphertext:m(l)};return P&&(b.iv=m(P)),C&&(b.tag=m(C)),s&&(b.encrypted_key=m(s)),d&&(b.aad=d),this._protectedHeader&&(b.protected=ae.decode(u)),this._sharedUnprotectedHeader&&(b.unprotected=this._sharedUnprotectedHeader),this._unprotectedHeader&&(b.header=this._unprotectedHeader),b}}class bt{constructor(e){this._flattened=new mt(e)}setContentEncryptionKey(e){return this._flattened.setContentEncryptionKey(e),this}setInitializationVector(e){return this._flattened.setInitializationVector(e),this}setProtectedHeader(e){return this._flattened.setProtectedHeader(e),this}setKeyManagementParameters(e){return this._flattened.setKeyManagementParameters(e),this}async encrypt(e,r){const n=await this._flattened.encrypt(e,r);return[n.protected,n.encrypted_key,n.iv,n.ciphertext,n.tag].join(".")}}const X={base:{":disabled":{backgroundColor:"transparent"}}},yt="DOM Element was not found";var Ae;(function(t){t.NOT_COMPLETE="NOT_COMPLETE",t.SCHEME_NOT_SUPPORTED="SCHEME_NOT_SUPPORTED",t.LUHN_CHECK_FAILED="LUHN_CHECK_FAILED",t.INVALID_EXPIRY_DATE="INVALID_EXPIRY_DATE"})(Ae||(Ae={}));const _e=t=>t!=null,wt="v3.8.1";class I{constructor(e,r){if(Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"IFRAME_BASE_URL",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"subscriptions",{enumerable:!0,configurable:!0,writable:!0,value:{ready:[],blur:[],focus:[],keydown:[],change:[]}}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:async({...n})=>{this.iframe&&_e(n.height)&&(this.iframe.height=n.height),this.iframePostMessage({type:"update",data:{...n,value:n.value?this.putValue(n.value)??void 0:void 0}})}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"clear"})}}),Object.defineProperty(this,"focus",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"focus"})}}),Object.defineProperty(this,"blur",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"blur"})}}),Object.defineProperty(this,"unmount",{enumerable:!0,configurable:!0,writable:!0,value:()=>{var n;(n=this.iframe)==null||n.remove(),this.iframe=null}}),this.IFRAME_BASE_URL=gt(wt),!this.IFRAME_BASE_URL)throw new Error("IFRAME_BASE_URL not found");r&&Y.set(this,{key:r})}mount(e){const r=typeof e=="string"?document.querySelector(e):e;if(!r)throw new Error(yt);r.innerHTML=`<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`,this.iframe=r.querySelector("iframe");const n=i=>{var a;if(!(i.source!==((a=this.iframe)==null?void 0:a.contentWindow)||i.data.element!==this.type))if(i.data.type==="change"){const s=this.extractValue(i.data.data.value),o={...i.data.data};delete o.value;const c=Y.get(this);c&&(c.value=s),this.emitEvent({...i.data,data:o})}else this.emitEvent(i.data)};return window.addEventListener("message",n),new Promise(i=>{this.on("ready",()=>{this.update(this.options),i()})})}on(e,r){return this.subscriptions[e].push(r),{unsubscribe:()=>this.subscriptions[e].splice(this.subscriptions[e].indexOf(r),1)}}secureValue(e){const r=Y.get(this);return(r==null?void 0:r.key)!==e?null:(r==null?void 0:r.value)??null}emitEvent(e){var r;(r=this.subscriptions[e.type])==null||r.forEach(n=>n(e.data))}iframePostMessage(e){var r,n;(n=(r=this.iframe)==null?void 0:r.contentWindow)==null||n.postMessage(e,this.IFRAME_BASE_URL)}}function gt(t){return`https://${window.HG_IFRAME_HOST??"sdk.hellgate.io"}/web/${t}/iframe/`}const Y=new Map;function Z(t){const[e=null,r=null]=(t??"").split("/").map(n=>Number(n.trim()));return{month:e,year:r&&r>10?+`20${r}`:null}}function Q(t){if(!t)return null;const{month:e,year:r}=t;return[e&&e<10?`0${e}`:e,r&&r>=100?String(r).slice(-2):r].filter(_e).join(" / ")}class Se extends I{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationDate"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:Z}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:Q})}}function ee(t){return(t==null?void 0:t.replaceAll(" ",""))??null}function Ce(t){return t}class Pe extends I{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardNumber"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:ee}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:Ce})}}class ve extends I{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"card"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{number:e.cardNumber?ee(e.cardNumber):null,expiry_date:e.cardExpirationDate?Z(e.cardExpirationDate):null,cvc:e.cardVerificationCode??null}:null}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{cardNumber:e.number?e.number:null,cardExpirationDate:e.expiry_date?Q(e.expiry_date):null,cardVerificationCode:e.cvc??null}:null})}}class Oe extends I{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardVerificationCode"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}class te extends I{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"text"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}function K(t,e,r){switch(t){case"card":return new ve(e,r);case"cardNumber":return new Pe(e,r);case"cardExpirationDate":return new Se(e,r);case"cardVerificationCode":return new Oe(e,r);case"text":return new te(e,r);default:ASSERT_EXHAUSTIVE(t)}}function He(){return Date.now().toString(36)+Math.random().toString(36).slice(2)}function Ke(t){return[t.issuer_identification_number,"".padEnd(t.account_number_length-t.issuer_identification_number.length-t.account_number_last_four.length,"*"),t.account_number_last_four].join(" ")}class ${static async init(e){return new $(e)}constructor(e){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:this.createFieldDefaultState()}),Object.defineProperty(this,"cardElements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"textElements",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"cvcOnlyEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createForm",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{var s;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const n=x.get(this);if(!n)throw new Error("Secure key not found");const i=O({disabled:!1,autocomplete:"on",style:{...X}},r);if(this.session.isNextAction("refresh_security_code")&&((s=this.session.state)!=null&&s.data)){const o=this.session.state.data;i.cvcOnly=!0,i.value={number:Ke(o),expiry_date:{month:(o==null?void 0:o.expiry_month)??null,year:(o==null?void 0:o.expiry_year)??null},cvc:null}}const a=K("card",i,n);return this.cardElements.card={element:a,state:this.createFieldDefaultState()},this.addElementStateListener("card"),a}}),Object.defineProperty(this,"createFormFields",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{var C,P;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const n=x.get(this);if(!n)throw new Error("Secure key not found");const i={disabled:this.cvcOnlyEnabled,autocomplete:"on",style:{...X}},{cardNumber:a={},expiryDate:s={},securityCode:o={},...c}=r,u=K("cardNumber",{...O(i,{...c,...a,cvcOnly:this.cvcOnlyEnabled,value:this.session.isNextAction("refresh_security_code")&&((C=this.session.state)!=null&&C.data)?Ke(this.session.state.data):null})},n),d=K("cardExpirationDate",{...O(i,{...c,...s,value:this.session.isNextAction("refresh_security_code")&&((P=this.session.state)!=null&&P.data)?{month:this.session.state.data.expiry_month,year:this.session.state.data.expiry_year}:null})},n),l=K("cardVerificationCode",{...O({...i,disabled:!1,autofocus:this.cvcOnlyEnabled},{...c,...o})},n);return u.on("change",b=>{const w=b.cardBrand;l.update({cardType:w})}),this.cardElements={cardNumber:{element:u,state:this.createFieldDefaultState()},cardExpirationDate:{element:d,state:this.createFieldDefaultState()},cardVerificationCode:{element:l,state:this.createFieldDefaultState()}},this.addElementStateListener("cardNumber"),this.addElementStateListener("cardExpirationDate"),this.addElementStateListener("cardVerificationCode"),{cardNumber:u,expiryDate:d,securityCode:l}}}),Object.defineProperty(this,"createTextField",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{const n=x.get(this);if(!n)throw new Error("Secure key not found");const i={disabled:!1,autocomplete:"on",style:{...X}},a=K("text",{...O(i,{...r})},n);return this.textElements.push(a),a}}),Object.defineProperty(this,"tokenize",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{var o,c;if(((o=this.session.state)==null?void 0:o.next_action)!=="tokenize_card")throw new Error(`The session's next_action='${(c=this.session.state)==null?void 0:c.next_action}'. tokenize() is available only if next_action='tokenize_card'`);const n=this.getFormValue(),i=this.extractAdditionalData(r);if(!n)throw new Error("Form elements must be initialized before tokenization");const a=this.getCardDataValidationError();if(a)throw a;if(!n.number||!n.expiration_month||!n.expiration_year||!n.cvc)throw new Error("Card data is not complete");const s=this.session.state.data;return this.encryptCardData({account_number:n.number,expiry_month:n.expiration_month,expiry_year:n.expiration_year,security_code:n.cvc,additional_data:i},s.jwk)}}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.stateChangeHandlers.push(r),r(this.state)}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.clear()),this.textElements.forEach(r=>r==null?void 0:r.clear())}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.unmount()),this.textElements.forEach(r=>r==null?void 0:r.unmount()),this.cardElements={},this.textElements=[]}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.reset()}}),Object.defineProperty(this,"process",{enumerable:!0,configurable:!0,writable:!0,value:async(r={})=>{if(!this.hasFormElements())throw new Error("Card form must be initialized and completed before processing");if(this.session.isNextAction("refresh_security_code"))return this.refreshSecurityCode();this.disableFormElements(!0);try{const n=await this.tokenize(r);if(!n)throw new Error("Tokenization failed");return await this.session.completeAction({action:"tokenize_card",result:n})}catch(n){throw this.disableFormElements(!1),n}}}),x.set(this,He()),this.cvcOnlyEnabled=this.session.isNextAction("refresh_security_code")}async refreshSecurityCode(){const e=this.getFormValue();if(!(e!=null&&e.cvc))throw new Error("cvc field was not filled");if(!this.session.isNextAction("refresh_security_code")||!this.session.state)throw new Error("refreshSecurityCode() is available only if next_action=refresh_security_code");this.disableFormElements(!0);const r=await this.encryptCardData({security_code:e.cvc},this.session.state.data.jwk);return this.session.completeAction({action:"refresh_security_code",result:{...r}}).catch(n=>{if(this.disableFormElements(!1),n instanceof Error)throw n;return{status:"failure",data:n}})}getFormValue(){var s,o,c,u,d;const{card:e,cardNumber:r,cardExpirationDate:n,cardVerificationCode:i}=this.cardElements;let a;if(e){const l=T(this,e.element);a={number:(l==null?void 0:l.number)??null,expiration_month:((s=l==null?void 0:l.expiry_date)==null?void 0:s.month)??null,expiration_year:((o=l==null?void 0:l.expiry_date)==null?void 0:o.year)??null,cvc:(l==null?void 0:l.cvc)??null}}return r&&n&&i&&(a={number:((c=T(this,r.element))==null?void 0:c.replaceAll(" ",""))??null,expiration_month:((u=T(this,n.element))==null?void 0:u.month)??null,expiration_year:((d=T(this,n.element))==null?void 0:d.year)??null,cvc:T(this,i.element)}),a}hasFormElements(){return!!Object.keys(this.cardElements).length}disableFormElements(e){Object.values(this.cardElements).forEach(({element:r})=>{r.update({disabled:e})})}extractAdditionalData({cardholder_name:e,billing_address:r={}}){return v({cardholder_name:D(this,e),billing_address:{line1:D(this,r.line1),line2:D(this,r.line2),line3:D(this,r.line3),city:D(this,r.city),postal_code:D(this,r.postal_code)}})}async encryptCardData(e,r){const n=await nt(r,"RSA-OAEP"),i=JSON.stringify(e),a=new TextEncoder().encode(i);return{enc_payload:await new bt(a).setProtectedHeader({alg:"RSA-OAEP",enc:"A256GCM"}).encrypt(n)}}addElementStateListener(e){const r=this.cardElements[e];r&&r.element.on("change",n=>{r.state=n,this.updateFormState()})}updateFormState(){const e=this.cvcOnlyEnabled&&this.cardElements.cardVerificationCode?[this.cardElements.cardVerificationCode]:Object.values(this.cardElements);e.length?this.state=e.reduce((r,{state:n})=>(r.valid=!!r.valid&&!!n.valid,r.complete=!!r.complete&&!!n.complete,r.empty=!!r.empty&&!!n.empty,r.error=r.error||n.error,r.errorCode=r.errorCode||n.errorCode,r),{valid:!0,complete:!0,empty:!0}):this.state=this.createFieldDefaultState(),this.stateChangeHandlers.forEach(r=>r(this.state))}createFieldDefaultState(){return{empty:!0,complete:!1,valid:!1}}getCardDataValidationError(){if(!this.state.complete)return new Error(this.state.error??"Card data is not complete");if(!this.state.valid)return new Error(`Card data is not valid. ${this.state.error}`)}}const x=new Map;function T(t,e){const r=x.get(t);return r?e.secureValue(r):null}function D(t,e){const r=x.get(t);return e instanceof te&&r?T(t,e)??void 0:e}class Et{constructor(e="https://api.hellgate.io",r=new AbortController){Object.defineProperty(this,"abortCtrl",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"baseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.baseUrl=e.endsWith("/")?e.substring(0,e.length-1):e}getSession(e){return fetch(`${this.baseUrl}/sessions/${e}`,{signal:this.abortCtrl.signal}).then(r=>W(r))}completeAction(e,r){return fetch(`${this.baseUrl}/sessions/${e}/complete-action`,{method:"POST",headers:{"Content-Type":"application/json"},mode:"cors",body:JSON.stringify(r),signal:this.abortCtrl.signal}).then(n=>W(n))}cancelAll(){this.abortCtrl.abort()}}const At=2e3;class _t{constructor(e,r){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"onCloseHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"pollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async()=>new Promise((n,i)=>{const a=this.onStateChange(s=>{s.next_action!=="wait"&&(n(s),a())});this.updateSessionState().catch(s=>{s instanceof Response&&s.status===404&&i(new Error(`Session ${this.id} doesn't exist or has expired`)),i(s)})})}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:n=>(this.stateChangeHandlers.push(n),this.state&&n(this.state),()=>this.stateChangeHandlers=this.stateChangeHandlers.filter(i=>i!==n))}),Object.defineProperty(this,"onClose",{enumerable:!0,configurable:!0,writable:!0,value:n=>{var i;return((i=this.state)==null?void 0:i.next_action)===null?(n(re(this.state)),()=>{}):(this.onCloseHandlers.push(n),()=>this.onCloseHandlers=this.onCloseHandlers.filter(a=>a!==n))}}),Object.defineProperty(this,"completeAction",{enumerable:!0,configurable:!0,writable:!0,value:async n=>{const i=this.state;return new Promise((a,s)=>{const o=this.onStateChange(c=>{c.next_action!==(i==null?void 0:i.next_action)&&c.next_action===null&&(a(re(c)),o())});this.api.completeAction(this.id,n).then(c=>this.newStateHandle(c,s)).catch(async c=>s(await St(c)))})}}),Object.defineProperty(this,"completeSession",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.onCloseHandlers.forEach(i=>i(n)),this.stop()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.stop(),this.api.cancelAll()}})}isNextAction(e){var r;return((r=this.state)==null?void 0:r.next_action)===e}stop(){window.clearTimeout(this.pollingTimer),this.stateChangeHandlers=[],this.onCloseHandlers=[]}async updateSessionState(e){const r=await this.api.getSession(this.id);this.newStateHandle(r,e)}newStateHandle(e,r){var n;switch(!e.next_action&&e.status&&(e.next_action=null),e.next_action){case"wait":{window.clearTimeout(this.pollingTimer),this.pollingTimer=window.setTimeout(()=>this.updateSessionState(r).catch(i=>{i instanceof Response&&i.status===404&&(r==null||r(new Error(`Session ${this.id} has expired`)))}),At);break}}e.next_action!==((n=this.state)==null?void 0:n.next_action)&&this.stateChangeHandlers.forEach(i=>i(e)),e.next_action===null&&this.completeSession(re(e)),this.state=e}}async function St(t){return!t.ok&&t.status>=400&&t.status<=500?t.json():t}function re(t){const e={...t};return delete e.next_action,e}const Ct={base_url:"https://api.hellgate.io"};class ne{constructor(e,r){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"paymentFlowHandlers",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.session.dispose(),Object.values(this.paymentFlowHandlers).forEach(n=>n==null?void 0:n.dispose())}}),Object.defineProperty(this,"onSessionComplete",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.session.onClose(n)}})}use(e){return this.paymentFlowHandlers[e]}static async init(e,r={}){const{session:n,cardHandler:i,handler3DS:a}=await this.initHandlers(e,r);return new ne(n,{CARD:i,"3DS":a})}static async initHandlers(e,r){const n={...Ct,...r},i=new Et(n.base_url,n.abortCtrl),a=new _t(e,i);await a.init();const s=a.isNextAction("tokenize_card")||a.isNextAction("refresh_security_code")?await this.createCardHandler(a):void 0,o=this.create3DSHandler(a,r);return{session:a,cardHandler:s,handler3DS:o}}static createCardHandler(e){return $.init(e)}static create3DSHandler(e,r){return new ie(e,{domContainer:r.challenge_3ds_container,labelText:r.challenge_3ds_label_text})}}f.CardElement=ve,f.CardExpirationDateElement=Se,f.CardNumberElement=Pe,f.CardVerificationCodeElement=Oe,f.Hellgate=ne,f.Hellgate3DSHandler=ie,f.HellgateCardHandler=$,f.TextElement=te,f.createElement=K,f.extractCardNumberValue=ee,f.extractExpiryDateValue=Z,f.putCardNumberValue=Ce,f.putExpiryDateValue=Q,f.uid=He,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});globalThis.HellgateSDK&&(globalThis.Hellgate=globalThis.HellgateSDK.Hellgate,delete globalThis.HellgateSDK);
1
+ (function(c,p){typeof exports=="object"&&typeof module<"u"?p(exports):typeof define=="function"&&define.amd?define(["exports"],p):(c=typeof globalThis<"u"?globalThis:c||self,p(c.HellgateSDK={}))})(this,function(c){"use strict";function p(i){return Array.isArray(i)?i.filter(Boolean):Object.fromEntries(Object.entries(i).map(([e,t])=>[e,typeof t=="object"&&t&&!Array.isArray(t)?p(t):t]).filter(([e,t])=>typeof t=="object"&&t&&!Array.isArray(t)?!!Object.keys(t).length:t!=null&&t!=null))}function b(i,e){const t={...i,...e},r=Object.keys(t);for(const n of r){const a=i[n],s=e[n];typeof a=="object"&&!Array.isArray(a)&&a&&typeof s=="object"&&!Array.isArray(s)&&s&&(t[n]=b(a,s))}return t}function E(i){if(!i.ok)throw i;return i.json()}function S(i){return`https://${window.HG_IFRAME_HOST??"sdk.hellgate.io"}/web/${i}/iframe/`}const B=2e3;class j{constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"iframeId",{enumerable:!0,configurable:!0,writable:!0,value:String(Math.floor(1e5+Math.random()*9e5))}),Object.defineProperty(this,"resultPollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transactionId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"decoupledAuthHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"disposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"check3dsIframeDisposers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"domContainer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"labelText",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onStartHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onFinishHandler",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onDecoupledAuth",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.decoupledAuthHandlers.push(r)}}),Object.defineProperty(this,"onStartChallenge",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onStartHandler=r}}),Object.defineProperty(this,"onChallengeFinished",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onFinishHandler=r}}),Object.defineProperty(this,"sessionStateHandle",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n,a;switch(r.next_action){case"3ds_check":{this.initCheck3DSIframes(r.data.threeds_server_callback_url,r.data.mon_url);break}case"3ds_challenge":{(n=this.onStartHandler)==null||n.call(this),this.disposeCheck3DSIframe(),this.startChallenge(r.data.challenge_url,r.data.result_mon_url);break}case"3ds_challenge_decoupled":{this.startDecoupledAuth(r.data.cardholder_info,r.data.result_mon_url,r.data.transaction_id);break}case null:{this.dispose(),(a=this.onFinishHandler)==null||a.call(this);break}}}}),this.domContainer=t.domContainer??w(),this.disposers.push(this.session.onStateChange(this.sessionStateHandle)),this.labelText=t.labelText}dispose(){this.disposers.forEach(e=>e()),this.check3dsIframeDisposers.forEach(e=>e())}initCheck3DSIframes(e,t){const r=w();r.insertAdjacentHTML("beforeend",`<iframe id="check_3ds_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${e}"></iframe>`);const n=r.querySelector(`#check_3ds_${this.iframeId}`);if(n){const a=s=>{s.source===n.contentWindow&&this.session.completeAction({action:"3ds_check",result:s.data})};window.addEventListener("message",a),this.check3dsIframeDisposers.push(()=>window.removeEventListener("message",a),()=>n.remove())}if(t){r.insertAdjacentHTML("beforeend",`<iframe id="mon_${this.iframeId}" width="0" height="0" style="border:0;visibility: hidden;" src="${t}"></iframe>`);const a=r.querySelector(`#mon_${this.iframeId}`);a&&this.disposers.push(()=>a.remove())}}disposeCheck3DSIframe(){this.check3dsIframeDisposers.forEach(e=>e()),this.check3dsIframeDisposers=[]}startChallenge(e,t){const r=w(),n=`<div style="display: flex; flex-direction: column; gap: 10px; align-items: center; ${this.domContainer===r?'border:0; max-width: 800px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width:100% " ':'border:0;" width="100%" height="100%"'}><iframe id="cha_${this.iframeId}" src="${e}" width="100%" height="500"></iframe>${this.labelText?'<span id="tds_label_text" style="font-size: large;">'+this.labelText+"</span>":""}<div>`;this.domContainer.insertAdjacentHTML("beforeend",this.domContainer===r?`<div id="cha_${this.iframeId}_wrap" style="background: #fff; position: fixed; left: 0; top: 0; width: 100%; height: 100%; z-index: 10000;">${n}</div>`:n);const a=this.domContainer.querySelector(`#cha_${this.iframeId}`),s=this.domContainer.querySelector(`#cha_${this.iframeId}_wrap`);if(!a)throw new Error("3DS Challenge Iframe initialization failed");this.disposers.push(()=>{a.remove(),s==null||s.remove()});const o=new Promise(d=>{const h=u=>{u.source!==a.contentWindow||u.data.event!=="AuthResultReady"||d({...u.data,requestor_trans_id:u.data.requestor_trans_id??u.data.requestorTransId,requestorTransId:void 0,param:u.data.param||void 0})};window.addEventListener("message",h),this.disposers.push(()=>window.removeEventListener("message",h))}),l=new Promise(d=>{const h=this.startAuthResultPolling(t,u=>{u.event==="AuthResultReady"&&(h(),d({requestor_trans_id:u.threeDSRequestorTransID,event:u.event}))})});Promise.any([o,l]).then(d=>{this.session.completeAction({action:"3ds_challenge",result:d})})}startDecoupledAuth(e,t,r){this.transactionId||(this.transactionId=r),this.decoupledAuthHandlers.forEach(a=>a(e));const n=this.startAuthResultPolling(t,a=>{a.event==="AuthResultReady"&&(this.session.completeAction({action:"3ds_challenge_decoupled",result:{...a,event:a.event}}),n())})}startAuthResultPolling(e,t){return window.clearTimeout(this.resultPollingTimer),this.resultPollingTimer=window.setTimeout(()=>fetch(e).then(r=>E(r)).then(r=>{this.startAuthResultPolling(e,t),t(r)}).catch(()=>{}),B),()=>window.clearTimeout(this.resultPollingTimer)}}function w(){return document.body}const _={base:{":disabled":{backgroundColor:"transparent"}}},Y="DOM Element was not found";var A;(function(i){i.NOT_COMPLETE="NOT_COMPLETE",i.SCHEME_NOT_SUPPORTED="SCHEME_NOT_SUPPORTED",i.LUHN_CHECK_FAILED="LUHN_CHECK_FAILED",i.INVALID_EXPIRY_DATE="INVALID_EXPIRY_DATE"})(A||(A={}));const H=i=>i!=null,q="v3.9.1";class m{constructor(e){if(Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"IFRAME_BASE_URL",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"subscriptions",{enumerable:!0,configurable:!0,writable:!0,value:{ready:[],blur:[],focus:[],keydown:[],change:[]}}),Object.defineProperty(this,"key",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:async({...t})=>{this.iframe&&H(t.height)&&(this.iframe.height=t.height),this.iframePostMessage({type:"update",data:{...t,value:t.value?this.putValue(t.value)??void 0:void 0}})}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"clear"})}}),Object.defineProperty(this,"focus",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"focus"})}}),Object.defineProperty(this,"blur",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.iframePostMessage({type:"blur"})}}),Object.defineProperty(this,"unmount",{enumerable:!0,configurable:!0,writable:!0,value:()=>{var t;(t=this.iframe)==null||t.remove(),this.iframe=null}}),this.IFRAME_BASE_URL=S(q),!this.IFRAME_BASE_URL)throw new Error("IFRAME_BASE_URL not found")}mount(e){const t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`${Y}: ${e}`);t.innerHTML=`<iframe width="100%" height="29" src="${this.IFRAME_BASE_URL}?field=${this.type}&origin=${location.origin}"></iframe>`,this.iframe=t.querySelector("iframe");const r=n=>{var a;n.source!==((a=this.iframe)==null?void 0:a.contentWindow)||n.data.element!==this.type||this.emitEvent(n.data)};return window.addEventListener("message",r),new Promise(n=>{this.on("ready",a=>{this.key=a.key,this.update(this.options),n()})})}on(e,t){return this.subscriptions[e].push(t),{unsubscribe:()=>this.subscriptions[e].splice(this.subscriptions[e].indexOf(t),1)}}emitEvent(e){var t;(t=this.subscriptions[e.type])==null||t.forEach(r=>r(e.data))}iframePostMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.IFRAME_BASE_URL)}}class K extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationMonth"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:D}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:T})}}function D(i){return i?Number(i):null}function T(i){return i?i<10?`0${i}`:String(i):null}class W extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationYear"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:M}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:I})}}function M(i){if(!i)return null;const e=Number(i);return e>10?+`20${e}`:null}function I(i){return i?i>=100?String(i).slice(-2):String(i):null}function v(i){const[e=null,t=null]=(i??"").split("/").map(r=>r.trim());return{month:D(e),year:M(t)}}function O(i){if(!i)return null;const{month:e,year:t}=i;return[T(e),I(t)].filter(H).join(" / ")}class L extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardExpirationDate"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:v}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:O})}}function P(i){return(i==null?void 0:i.replaceAll(" ",""))??null}function N(i){return i}class F extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardNumber"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:P}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:N})}}class k extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"card"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{number:e.cardNumber?P(e.cardNumber):null,expiry_date:e.cardExpirationDate?v(e.cardExpirationDate):null,cvc:e.cardVerificationCode??null}:null}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e?{cardNumber:e.number?e.number:null,cardExpirationDate:e.expiry_date?O(e.expiry_date):null,cardVerificationCode:e.cvc??null}:null})}}class R extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"cardVerificationCode"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}class $ extends m{constructor(){super(...arguments),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:"text"}),Object.defineProperty(this,"extractValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>e})}}function f(i,e){switch(i){case"card":return new k(e);case"cardNumber":return new F(e);case"cardExpirationDate":return new L(e);case"cardExpirationMonth":return new K(e);case"cardExpirationYear":return new W(e);case"cardVerificationCode":return new R(e);case"text":return new $(e);default:ASSERT_EXHAUSTIVE(i)}}function U(i){return[i.issuer_identification_number,"".padEnd(i.account_number_length-i.issuer_identification_number.length-i.account_number_last_four.length,"*"),i.account_number_last_four].join(" ")}class g{static async init(e,t){return new g(e,t)}constructor(e,t){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:this.createFieldDefaultState()}),Object.defineProperty(this,"cardElements",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"textElements",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"cvcOnlyEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createForm",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{var s;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const n=b({disabled:!1,autocomplete:"on",style:{..._}},r);if(this.session.isNextAction("refresh_security_code")&&((s=this.session.state)!=null&&s.data)){const o=this.session.state.data;n.cvcOnly=!0,n.value={number:U(o),expiry_date:{month:(o==null?void 0:o.expiry_month)??null,year:(o==null?void 0:o.expiry_year)??null},cvc:null}}const a=f("card",n);return this.cardElements.card={element:a,state:this.createFieldDefaultState()},this.addElementStateListener("card"),a}}),Object.defineProperty(this,"createTextField",{enumerable:!0,configurable:!0,writable:!0,value:(r={})=>{const n={disabled:!1,autocomplete:"on",style:{..._}},a=f("text",{...b(n,{...r})});return this.textElements.push(a),a}}),Object.defineProperty(this,"tokenize",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{var a,s;if(((a=this.session.state)==null?void 0:a.next_action)!=="tokenize_card")throw new Error(`The session's next_action='${(s=this.session.state)==null?void 0:s.next_action}'. tokenize() is available only if next_action='tokenize_card'`);const n=this.getCardDataValidationError();if(n)throw n;return this.coordinator.postMessage({type:"card:tokenize",additionalData:this.serializeAdditionalData(r)}),new Promise(o=>{this.coordinator.onMessage("card:tokenize:response",l=>{o(l.success?l.result:null)})})}}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.stateChangeHandlers.push(r),r(this.state)}}),Object.defineProperty(this,"clear",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.clear()),this.textElements.forEach(r=>r==null?void 0:r.clear())}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{Object.values(this.cardElements).forEach(r=>r==null?void 0:r.element.unmount()),this.textElements.forEach(r=>r==null?void 0:r.unmount()),this.cardElements={},this.textElements=[],this.state=this.createFieldDefaultState()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.reset()}}),Object.defineProperty(this,"process",{enumerable:!0,configurable:!0,writable:!0,value:async(r={})=>{if(!this.hasFormElements())throw new Error("Card form must be initialized and completed before processing");const n=this.getCardDataValidationError();if(n)throw n;if(this.session.isNextAction("refresh_security_code"))return this.refreshSecurityCode();this.disableFormElements(!0);try{return this.coordinator.postMessage({type:"card:process",additionalData:this.serializeAdditionalData(r)}),new Promise((a,s)=>{this.coordinator.onMessage("card:process:response",o=>{o.result&&o.success?a(o.result):s(new Error(o.error))})})}catch(a){throw this.disableFormElements(!1),a}}}),this.cvcOnlyEnabled=this.session.isNextAction("refresh_security_code")}createFormFields(e={}){var l,d;if(this.hasFormElements())throw new Error("Form elements can't be initialized twice. You can call `reset()` method or create new Hellgate client.");const t={disabled:this.cvcOnlyEnabled,autocomplete:"on",style:{..._}},{cardNumber:r={},securityCode:n={},...a}=e,s=f("cardNumber",{...b(t,{...a,...r,cvcOnly:this.cvcOnlyEnabled,value:this.session.isNextAction("refresh_security_code")&&((l=this.session.state)!=null&&l.data)?U(this.session.state.data):null})}),o=f("cardVerificationCode",{...b({...t,disabled:!1,autofocus:this.cvcOnlyEnabled},{...a,...n})});if(s.on("change",h=>{const u=h.cardBrand;o.update({cardType:u})}),this.cardElements={cardNumber:{element:s,state:this.createFieldDefaultState()},cardVerificationCode:{element:o,state:this.createFieldDefaultState()}},this.addElementStateListener("cardNumber"),this.addElementStateListener("cardVerificationCode"),e.expiryDateElement==="separate"){const{expiryMonth:h={},expiryYear:u={}}=e,V=f("cardExpirationMonth",{...b(t,{...a,...h})}),z=f("cardExpirationYear",{...b(t,{...a,...u})});return this.cardElements.cardExpirationMonth={element:V,state:this.createFieldDefaultState()},this.cardElements.cardExpirationYear={element:z,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationMonth"),this.addElementStateListener("cardExpirationYear"),{cardNumber:s,expiryMonth:V,expiryYear:z,securityCode:o}}else{const{expiryDate:h={}}=e,u=f("cardExpirationDate",{...b(t,{...a,...h,value:this.session.isNextAction("refresh_security_code")&&((d=this.session.state)!=null&&d.data)?{month:this.session.state.data.expiry_month,year:this.session.state.data.expiry_year}:null})});return this.cardElements.cardExpirationDate={element:u,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationDate"),{cardNumber:s,expiryDate:u,securityCode:o}}}async refreshSecurityCode(){return this.coordinator.postMessage({type:"card:refresh_security_code"}),new Promise((e,t)=>{this.coordinator.onMessage("card:refresh_security_code:response",r=>{r.result?e(r.result):t(new Error(r.error))})})}hasFormElements(){return!!Object.keys(this.cardElements).length}disableFormElements(e){Object.values(this.cardElements).forEach(({element:t})=>{t.update({disabled:e})})}addElementStateListener(e){const t=this.cardElements[e];t&&t.element.on("change",r=>{t.state=r,this.updateFormState()})}updateFormState(){const e=this.cvcOnlyEnabled&&this.cardElements.cardVerificationCode?[this.cardElements.cardVerificationCode]:Object.values(this.cardElements);e.length?this.state=e.reduce((t,{state:r})=>(t.valid=!!t.valid&&!!r.valid,t.complete=!!t.complete&&!!r.complete,t.empty=!!t.empty&&!!r.empty,t.error=t.error||r.error,t.errorCode=t.errorCode||r.errorCode,t),{valid:!0,complete:!0,empty:!0}):this.state=this.createFieldDefaultState(),this.stateChangeHandlers.forEach(t=>t(this.state))}createFieldDefaultState(){return{empty:!0,complete:!1,valid:!1}}serializeAdditionalData({cardholder_name:e,billing_address:t={}}){return p({cardholder_name:y(e),billing_address:{line1:y(t.line1),line2:y(t.line2),line3:y(t.line3),city:y(t.city),postal_code:y(t.postal_code)}})}getCardDataValidationError(){if(!this.state.complete)return new Error(this.state.error??"Card data is not complete");if(!this.state.valid)return new Error(`Card data is not valid. ${this.state.error}`)}}function y(i){if(typeof i=="string")return i;if(i!=null&&i.key)return{key:i.key}}const G="v3.9.1";class X{constructor(){if(Object.defineProperty(this,"iframe",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"iframeBaseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"messageHandler",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async(e,t,r)=>(window.fetchMocker={a:1},new Promise((n,a)=>{r==null||r.signal.addEventListener("abort",()=>{const l=new Error("Coordinator init aborted");l.name="AbortError",a(l),this.dispose()});const s=document.createElement("div");s.setAttribute("style","position:absolute;width:0;height:0;overflow:hidden;"),s.setAttribute("data-hg-coordinator",""),document.body.appendChild(s);const o=`${this.iframeBaseUrl}?type=coordinator&sessionId=${e}&apiBaseUrl=${t}&origin=${encodeURIComponent(location.origin)}`;if(s.innerHTML=`<iframe src="${o}" width="0" height="0" style="border:none;" tabindex="-1" aria-hidden="true"></iframe>`,this.iframe=s.querySelector("iframe"),!this.iframe){a(new Error("Failed to create coordinator iframe"));return}this.messageHandler=l=>{var d,h,u;if(l.source===((d=this.iframe)==null?void 0:d.contentWindow)){if(((h=l.data)==null?void 0:h.type)==="coordinator:ready"){n();return}if(((u=l.data)==null?void 0:u.type)==="coordinator:error"){a(l.data.error);return}}},window.addEventListener("message",this.messageHandler),this.iframe.addEventListener("error",()=>{a(new Error("Coordinator iframe failed to load"))})}))}),this.iframeBaseUrl=S(G),!this.iframeBaseUrl)throw new Error("IFRAME_BASE_URL not found")}postMessage(e){var t,r;(r=(t=this.iframe)==null?void 0:t.contentWindow)==null||r.postMessage(e,this.iframeBaseUrl)}onMessage(e,t){window.addEventListener("message",r=>{var n,a;r.source===((n=this.iframe)==null?void 0:n.contentWindow)&&((a=r.data)==null?void 0:a.type)===e&&t(r.data)})}dispose(){var t;this.postMessage({type:"coordinator:dispose"}),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null);const e=(t=this.iframe)==null?void 0:t.parentElement;this.iframe=null,e==null||e.remove()}}class J{constructor(e="https://api.hellgate.io",t=new AbortController){Object.defineProperty(this,"abortCtrl",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"baseUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.baseUrl=e.endsWith("/")?e.substring(0,e.length-1):e}getSession(e){return fetch(`${this.baseUrl}/sessions/${e}`,{signal:this.abortCtrl.signal}).then(t=>E(t))}completeAction(e,t){return fetch(`${this.baseUrl}/sessions/${e}/complete-action`,{method:"POST",headers:{"Content-Type":"application/json"},mode:"cors",body:JSON.stringify(t),signal:this.abortCtrl.signal}).then(r=>E(r))}cancelAll(){this.abortCtrl.abort()}}const Q=2e3;class Z{constructor(e,t){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"stateChangeHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"onCloseHandlers",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"pollingTimer",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"init",{enumerable:!0,configurable:!0,writable:!0,value:async()=>new Promise((r,n)=>{const a=this.onStateChange(s=>{s.next_action!=="wait"&&(r(s),a())});this.updateSessionState().catch(s=>{s instanceof Response&&s.status===404&&n(new Error(`Session ${this.id} doesn't exist or has expired`)),n(s)})})}),Object.defineProperty(this,"onStateChange",{enumerable:!0,configurable:!0,writable:!0,value:r=>(this.stateChangeHandlers.push(r),this.state&&r(this.state),()=>this.stateChangeHandlers=this.stateChangeHandlers.filter(n=>n!==r))}),Object.defineProperty(this,"onClose",{enumerable:!0,configurable:!0,writable:!0,value:r=>{var n;return((n=this.state)==null?void 0:n.next_action)===null?(r(x(this.state)),()=>{}):(this.onCloseHandlers.push(r),()=>this.onCloseHandlers=this.onCloseHandlers.filter(a=>a!==r))}}),Object.defineProperty(this,"completeAction",{enumerable:!0,configurable:!0,writable:!0,value:async r=>{const n=this.state;return new Promise((a,s)=>{const o=this.onStateChange(l=>{l.next_action!==(n==null?void 0:n.next_action)&&l.next_action===null&&(a(x(l)),o())});this.api.completeAction(this.id,r).then(l=>this.newStateHandle(l,s)).catch(async l=>s(await ee(l)))})}}),Object.defineProperty(this,"completeSession",{enumerable:!0,configurable:!0,writable:!0,value:r=>{this.onCloseHandlers.forEach(n=>n(r)),this.stop()}}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.stop(),this.api.cancelAll()}})}isNextAction(e){var t;return((t=this.state)==null?void 0:t.next_action)===e}stop(){window.clearTimeout(this.pollingTimer),this.stateChangeHandlers=[],this.onCloseHandlers=[]}async updateSessionState(e){const t=await this.api.getSession(this.id);this.newStateHandle(t,e)}newStateHandle(e,t){var r;switch(!e.next_action&&e.status&&(e.next_action=null),e.next_action){case"wait":{window.clearTimeout(this.pollingTimer),this.pollingTimer=window.setTimeout(()=>this.updateSessionState(t).catch(n=>{n instanceof Response&&n.status===404&&(t==null||t(new Error(`Session ${this.id} has expired`)))}),Q);break}}e.next_action!==((r=this.state)==null?void 0:r.next_action)&&this.stateChangeHandlers.forEach(n=>n(e)),e.next_action===null&&this.completeSession(x(e)),this.state=e}}async function ee(i){return!i.ok&&i.status>=400&&i.status<=500?i.json():i}function x(i){const e={...i};return delete e.next_action,e}const te={base_url:"https://api.hellgate.io"};class C{constructor(e,t,r){Object.defineProperty(this,"session",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"coordinator",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"paymentFlowHandlers",{enumerable:!0,configurable:!0,writable:!0,value:r}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.session.dispose(),this.coordinator.dispose(),Object.values(this.paymentFlowHandlers).forEach(n=>n==null?void 0:n.dispose())}}),Object.defineProperty(this,"onSessionComplete",{enumerable:!0,configurable:!0,writable:!0,value:n=>{this.session.onClose(n)}})}use(e){return this.paymentFlowHandlers[e]}static async init(e,t={}){const{session:r,coordinator:n,cardHandler:a,handler3DS:s}=await this.initHandlers(e,t);return new C(r,n,{CARD:a,"3DS":s})}static async initHandlers(e,t){const r={...te,...t},n=new J(r.base_url,r.abortCtrl),a=new Z(e,n),s=new X;s.onMessage("coordinator:session_state_change",d=>{d.state.next_action!=="wait"&&a.newStateHandle(d.state)}),await s.init(e,r.base_url,r.abortCtrl);const o=a.isNextAction("tokenize_card")||a.isNextAction("refresh_security_code")?await this.createCardHandler(a,s):void 0,l=this.create3DSHandler(a,t);return{session:a,coordinator:s,cardHandler:o,handler3DS:l}}static createCardHandler(e,t){return g.init(e,t)}static create3DSHandler(e,t){return new j(e,{domContainer:t.challenge_3ds_container,labelText:t.challenge_3ds_label_text})}}c.CardElement=k,c.CardExpirationDateElement=L,c.CardNumberElement=F,c.CardVerificationCodeElement=R,c.Hellgate=C,c.Hellgate3DSHandler=j,c.HellgateCardHandler=g,c.TextElement=$,c.createElement=f,c.extractCardNumberValue=P,c.extractExpiryDateValue=v,c.putCardNumberValue=N,c.putExpiryDateValue=O,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});globalThis.HellgateSDK&&(globalThis.Hellgate=globalThis.HellgateSDK.Hellgate,delete globalThis.HellgateSDK);
@@ -1,5 +1,6 @@
1
1
  import { Hellgate3DSHandler } from './3ds';
2
2
  import { CardHandlerSessionInitState, HellgateCardHandler } from './card';
3
+ import { Coordinator } from './coordinator/coordinator';
3
4
  import { HellgateSession, SessionOnCloseHandler } from './session';
4
5
  interface IDisposable {
5
6
  dispose: () => void;
@@ -16,18 +17,20 @@ type HellgateOptions = {
16
17
  };
17
18
  export declare class Hellgate<TCardHandler extends IDisposable = HellgateCardHandler, T3DSHandler extends Hellgate3DSHandler = Hellgate3DSHandler> {
18
19
  protected session: HellgateSession;
20
+ protected coordinator: Coordinator;
19
21
  protected paymentFlowHandlers: PaymentFlowHandlers<TCardHandler, T3DSHandler>;
20
- constructor(session: HellgateSession, paymentFlowHandlers: PaymentFlowHandlers<TCardHandler, T3DSHandler>);
22
+ constructor(session: HellgateSession, coordinator: Coordinator, paymentFlowHandlers: PaymentFlowHandlers<TCardHandler, T3DSHandler>);
21
23
  use<T extends keyof PaymentFlowHandlers>(paymentFlow: T): PaymentFlowHandlers<TCardHandler, T3DSHandler>[T];
22
24
  dispose: () => void;
23
25
  onSessionComplete: (fn: SessionOnCloseHandler) => void;
24
26
  static init(sessionId: string, options?: Partial<HellgateOptions>): Promise<Hellgate<HellgateCardHandler, Hellgate3DSHandler>>;
25
27
  protected static initHandlers(sessionId: string, options: Partial<HellgateOptions>): Promise<{
26
28
  session: HellgateSession<import("./session").SessionStateDTO>;
29
+ coordinator: Coordinator;
27
30
  cardHandler: HellgateCardHandler | undefined;
28
31
  handler3DS: Hellgate3DSHandler;
29
32
  }>;
30
- protected static createCardHandler(session: HellgateSession<CardHandlerSessionInitState>): Promise<HellgateCardHandler>;
33
+ protected static createCardHandler(session: HellgateSession<CardHandlerSessionInitState>, coordinator: Coordinator): Promise<HellgateCardHandler>;
31
34
  protected static create3DSHandler(session: HellgateSession, options: Pick<HellgateOptions, 'challenge_3ds_container' | 'challenge_3ds_label_text'>): Hellgate3DSHandler;
32
35
  }
33
36
  export {};
@@ -21,6 +21,6 @@ export declare class HellgateSession<State extends SessionStateDTO = SessionStat
21
21
  dispose: () => void;
22
22
  private stop;
23
23
  private updateSessionState;
24
- private newStateHandle;
24
+ newStateHandle(newState: SessionStateDTO, rejectContext?: (reason?: unknown) => void): void;
25
25
  }
26
26
  export {};
package/dist/utils.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export declare function removeEmpty<T extends object>(obj: T): T;
2
2
  export declare function deepMerge<T1 extends Record<string, unknown> | object, T2 extends Record<string, unknown> | object>(target: T1, source: T2): T1 & T2;
3
3
  export declare function httpResponseHandler<T>(r: Response): Promise<T>;
4
+ export declare function getIframePublicUrl(version: string): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starfish-codes/hellgate",
3
- "version": "3.8.1",
3
+ "version": "3.9.1",
4
4
  "license": "Apache-2.0",
5
5
  "author": {
6
6
  "name": "Starfish GmbH & Co. KG",
@@ -56,11 +56,11 @@
56
56
  "husky": "^9.0.11",
57
57
  "ky": "^1.2.2",
58
58
  "lint-staged": "^15.2.2",
59
- "lodash": "^4.17.21",
59
+ "lodash": "^4.17.23",
60
60
  "mobx": "^6.12.0",
61
61
  "mobx-react": "^9.1.0",
62
62
  "mobx-react-viewmodel": "^0.2.0",
63
- "playwright": "^1.49.1",
63
+ "playwright": "^1.55.1",
64
64
  "postcss": "^8.5.3",
65
65
  "postcss-nesting": "^13.0.1",
66
66
  "prettier": "^3.2.5",
@@ -73,8 +73,9 @@
73
73
  "tailwindcss": "^3.4.1",
74
74
  "tailwindcss-animate": "^1.0.7",
75
75
  "typescript": "^5.4.2",
76
- "vite": "^6.3.5",
76
+ "vite": "^6.4.1",
77
77
  "vite-plugin-checker": "^0.9.3",
78
+ "vite-plugin-sri3": "^1.3.0",
78
79
  "vite-plugin-svg-icons-ng": "^1.4.0",
79
80
  "vite-plugin-top-level-await": "^1.5.0",
80
81
  "vitest": "^3.1.3",
@@ -108,4 +109,4 @@
108
109
  "path": "./node_modules/cz-conventional-changelog"
109
110
  }
110
111
  }
111
- }
112
+ }