@starfish-codes/hellgate 3.9.0 → 3.10.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.
Files changed (31) hide show
  1. package/dist/3ds/typings.d.ts +1 -0
  2. package/dist/__tests__/card-handler.spec.d.ts +1 -0
  3. package/dist/__tests__/test-utils.d.ts +11 -0
  4. package/dist/card/card-handler.d.ts +24 -8
  5. package/dist/card/coordinator/__tests__/card-handler-coordinator.spec.d.ts +1 -0
  6. package/dist/card/coordinator/card-handler-coordinator.d.ts +34 -0
  7. package/dist/card/coordinator/index.d.ts +2 -0
  8. package/dist/card/coordinator/typings.d.ts +45 -0
  9. package/dist/card/typings.d.ts +30 -0
  10. package/dist/card/ui/elements/base-element.d.ts +3 -3
  11. package/dist/card/ui/elements/utils.d.ts +1 -2
  12. package/dist/card/ui/iframe/elements/base-element.d.ts +4 -2
  13. package/dist/card/ui/iframe/elements/card-expiration-month.d.ts +1 -0
  14. package/dist/card/ui/iframe/elements/text-element.d.ts +1 -0
  15. package/dist/card/ui/iframe/index.d.ts +1 -0
  16. package/dist/card/ui/iframe/utils.d.ts +1 -0
  17. package/dist/card/ui/typings.d.ts +8 -5
  18. package/dist/card/ui/utils.d.ts +3 -1
  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 +464 -1145
  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 +7 -6
@@ -1 +1 @@
1
- (function(p,K){typeof exports=="object"&&typeof module<"u"?K(exports):typeof define=="function"&&define.amd?define(["exports"],K):(p=typeof globalThis<"u"?globalThis:p||self,K(p.HellgateSDK={}))})(this,function(p){"use strict";function K(t){return Array.isArray(t)?t.filter(Boolean):Object.fromEntries(Object.entries(t).map(([e,r])=>[e,typeof r=="object"&&r&&!Array.isArray(r)?K(r):r]).filter(([e,r])=>typeof r=="object"&&r&&!Array.isArray(r)?!!Object.keys(r).length:r!=null&&r!=null))}function C(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]=C(a,s))}return r}function W(t){if(!t.ok)throw t;return t.json()}const Re=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=h=>{h.source!==a.contentWindow||h.data.event!=="AuthResultReady"||u(h.data)};window.addEventListener("message",d),this.disposers.push(()=>window.removeEventListener("message",d))}),c=new Promise(u=>{const d=this.startAuthResultPolling(r,h=>{h.event==="AuthResultReady"&&(d(),u({requestor_trans_id:h.threeDSRequestorTransID,event:h.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(()=>{}),Re),()=>window.clearTimeout(this.resultPollingTimer)}}function N(){return document.body}const f=crypto,S=t=>t instanceof CryptoKey,Ie=async(t,e)=>{const r=`SHA-${t.slice(-3)}`;return new Uint8Array(await f.subtle.digest(r,e))},H=new TextEncoder,ae=new TextDecoder,I=2**32;function j(...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 Ue(t,e){return j(H.encode(t),new Uint8Array([0]),e)}function L(t,e,r){if(e<0||e>=I)throw new RangeError(`value must be >= 0 and <= ${I-1}. Received ${e}`);t.set([e>>>24,e>>>16,e>>>8,e&255],r)}function $e(t){const e=Math.floor(t/I),r=t%I,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 j(F(t.length),t)}async function We(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 Ie("sha256",s),a*32)}return i.slice(0,e>>3)}const Ne=t=>{let e=t;typeof e=="string"&&(e=H.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(""))},w=t=>Ne(t).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_"),Le=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 Le(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 m extends oe{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class P extends oe{constructor(){super(...arguments),this.code="ERR_JWE_INVALID"}static get code(){return"ERR_JWE_INVALID"}}const V=f.getRandomValues.bind(f);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 m(`Unsupported JWE Algorithm: ${t}`)}}const Fe=t=>V(new Uint8Array(ce(t)>>3)),Be=(t,e)=>{if(e.length<<3!==ce(t))throw new P("Invalid Initialization Vector length")},le=(t,e)=>{const r=t.byteLength<<3;if(r!==e)throw new P(`Invalid Content Encryption Key length. Expected ${e} bits, got ${r} bits`)};function v(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 Ve(t){return parseInt(t.name.slice(4),10)}function ze(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 T(t,e,...r){switch(e){case"A128GCM":case"A192GCM":case"A256GCM":{if(!U(t.algorithm,"AES-GCM"))throw v("AES-GCM");const n=parseInt(e.slice(1,4),10);if(t.algorithm.length!==n)throw v(n,"algorithm.length");break}case"A128KW":case"A192KW":case"A256KW":{if(!U(t.algorithm,"AES-KW"))throw v("AES-KW");const n=parseInt(e.slice(1,4),10);if(t.algorithm.length!==n)throw v(n,"algorithm.length");break}case"ECDH":{switch(t.algorithm.name){case"ECDH":case"X25519":case"X448":break;default:throw v("ECDH, X25519, or X448")}break}case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":if(!U(t.algorithm,"PBKDF2"))throw v("PBKDF2");break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":{if(!U(t.algorithm,"RSA-OAEP"))throw v("RSA-OAEP");const n=parseInt(e.slice(9),10)||1;if(Ve(t.algorithm.hash)!==n)throw v(`SHA-${n}`,"algorithm.hash");break}default:throw new TypeError("CryptoKey does not support this operation")}ze(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 _=(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=>S(t)?!0:(t==null?void 0:t[Symbol.toStringTag])==="KeyObject",g=["CryptoKey"],Je=(...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 Ge(t){return typeof t=="object"&&t!==null}function Ye(t){if(!Ge(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 ke(t,e){if(t.algorithm.length!==parseInt(e.slice(1,4),10))throw new TypeError(`Invalid key size for alg: ${e}`)}function qe(t,e,r){if(S(t))return T(t,e,r),t;if(t instanceof Uint8Array)return f.subtle.importKey("raw",t,"AES-KW",!0,[r]);throw new TypeError(_(t,...g,"Uint8Array"))}const z=async(t,e,r)=>{const n=await qe(e,t,"wrapKey");ke(n,t);const i=await f.subtle.importKey("raw",r,...fe);return new Uint8Array(await f.subtle.wrapKey("raw",i,n,"AES-KW"))};async function Xe(t,e,r,n,i=new Uint8Array(0),a=new Uint8Array(0)){if(!S(t))throw new TypeError(_(t,...g));if(T(t,"ECDH"),!S(e))throw new TypeError(_(e,...g));T(e,"ECDH","deriveBits");const s=j(B(H.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 f.subtle.deriveBits({name:t.algorithm.name,public:t},e,o));return We(c,n,s)}async function Ze(t){if(!S(t))throw new TypeError(_(t,...g));return f.subtle.generateKey(t.algorithm,!0,["deriveBits"])}function Qe(t){if(!S(t))throw new TypeError(_(t,...g));return["P-256","P-384","P-521"].includes(t.algorithm.namedCurve)||t.algorithm.name==="X25519"||t.algorithm.name==="X448"}function et(t){if(!(t instanceof Uint8Array)||t.length<8)throw new P("PBES2 Salt Input must be 8 or more octets")}function tt(t,e){if(t instanceof Uint8Array)return f.subtle.importKey("raw",t,"PBKDF2",!1,["deriveBits"]);if(S(t))return T(t,e,"deriveBits","deriveKey"),t;throw new TypeError(_(t,...g,"Uint8Array"))}async function rt(t,e,r,n){et(t);const i=Ue(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 tt(n,e);if(c.usages.includes("deriveBits"))return new Uint8Array(await f.subtle.deriveBits(s,c,a));if(c.usages.includes("deriveKey"))return f.subtle.deriveKey(s,c,o,!1,["wrapKey","unwrapKey"]);throw new TypeError('PBKDF2 key "usages" must include "deriveBits" or "deriveKey"')}const nt=async(t,e,r,n=2048,i=V(new Uint8Array(16)))=>{const a=await rt(i,t,n,e);return{encryptedKey:await z(t.slice(-6),a,r),p2c:n,p2s:w(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 m(`alg ${t} is not supported either by JOSE or your javascript runtime`)}}const it=(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`)}},at=async(t,e,r)=>{if(!S(e))throw new TypeError(_(e,...g));if(T(e,t,"encrypt","wrapKey"),it(t,e),e.usages.includes("encrypt"))return new Uint8Array(await f.subtle.encrypt(pe(t),e,r));if(e.usages.includes("wrapKey")){const n=await f.subtle.importKey("raw",r,...fe);return new Uint8Array(await f.subtle.wrapKey("raw",n,e,pe(t)))}throw new TypeError('RSA-OAEP key "usages" must include "encrypt" or "wrapKey" for this operation')};function st(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 m('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 m('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 m('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break}default:throw new m('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}=st(t),n=[e,t.ext??!1,t.key_ops??r],i={...t};return delete i.alg,delete i.use,f.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},Y={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 Ee(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 m(`Unsupported JWE Algorithm: ${t}`)}}const R=t=>V(new Uint8Array(Ee(t)>>3));async function ot(t,e){if(!Ye(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 m('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return me({...t,alg:e});default:throw new m('Unsupported "kty" (Key Type) Parameter value')}}const k=t=>t==null?void 0:t[Symbol.toStringTag],ct=(t,e)=>{if(!(e instanceof Uint8Array)){if(!he(e))throw new TypeError(de(t,e,...g,"Uint8Array"));if(e.type!=="secret")throw new TypeError(`${k(e)} instances for symmetric algorithms must be of type "secret"`)}},lt=(t,e,r)=>{if(!he(e))throw new TypeError(de(t,e,...g));if(e.type==="secret")throw new TypeError(`${k(e)} instances for asymmetric algorithms must not be of type "secret"`);if(e.algorithm,e.algorithm&&r==="encrypt"&&e.type==="private")throw new TypeError(`${k(e)} instances for asymmetric algorithm encryption must be of type "public"`)},ut=(t,e,r)=>{t.startsWith("HS")||t==="dir"||t.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(t)?ct(t,e):lt(t,e,r)};async function dt(t,e,r,n,i){if(!(r instanceof Uint8Array))throw new TypeError(_(r,"Uint8Array"));const a=parseInt(t.slice(1,4),10),s=await f.subtle.importKey("raw",r.subarray(a>>3),"AES-CBC",!1,["encrypt"]),o=await f.subtle.importKey("raw",r.subarray(0,a>>3),{hash:`SHA-${a<<1}`,name:"HMAC"},!1,["sign"]),c=new Uint8Array(await f.subtle.encrypt({iv:n,name:"AES-CBC"},s,e)),u=j(i,n,c,$e(i.length<<3)),d=new Uint8Array((await f.subtle.sign("HMAC",o,u)).slice(0,a>>3));return{ciphertext:c,tag:d,iv:n}}async function ht(t,e,r,n,i){let a;r instanceof Uint8Array?a=await f.subtle.importKey("raw",r,"AES-GCM",!1,["encrypt"]):(T(r,t,"encrypt"),a=r);const s=new Uint8Array(await f.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 ge=async(t,e,r,n,i)=>{if(!S(r)&&!(r instanceof Uint8Array))throw new TypeError(_(r,...g,"Uint8Array"));switch(n?Be(t,n):n=Fe(t),t){case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":return r instanceof Uint8Array&&le(r,parseInt(t.slice(-3),10)),dt(t,e,r,n,i);case"A128GCM":case"A192GCM":case"A256GCM":return r instanceof Uint8Array&&le(r,parseInt(t.slice(1,4),10)),ht(t,e,r,n,i);default:throw new m("Unsupported JWE Content Encryption Algorithm")}};async function ft(t,e,r,n){const i=t.slice(0,7),a=await ge(i,r,e,n,new Uint8Array(0));return{encryptedKey:a.ciphertext,iv:w(a.iv),tag:w(a.tag)}}function pt(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 m(`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 mt=async t=>{if(t instanceof Uint8Array)return{kty:"oct",k:w(t)};if(!S(t))throw new TypeError(_(t,...g,"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 f.subtle.exportKey("jwk",t);return a};async function bt(t){return mt(t)}async function yt(t,e,r,n,i={}){var c;let a,s,o;switch(ut(t,r,"encrypt"),r=await((c=Y.normalizePublicKey)==null?void 0:c.call(Y,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 m("ECDH with the provided key is not allowed or not supported by your javascript runtime");const{apu:u,apv:d}=i;let{epk:h}=i;h||(h=(await Ze(r)).privateKey);const{x:b,y:A,crv:l,kty:y}=await bt(h),je=await Xe(r,h,t==="ECDH-ES"?e:t,t==="ECDH-ES"?Ee(e):parseInt(t.slice(-5,-2),10),u,d);if(s={epk:{x:b,crv:l,kty:y}},y==="EC"&&(s.epk.y=A),u&&(s.apu=w(u)),d&&(s.apv=w(d)),t==="ECDH-ES"){o=je;break}o=n||R(e);const Tt=t.slice(-6);a=await z(Tt,je,o);break}case"RSA1_5":case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":{o=n||R(e),a=await at(t,r,o);break}case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":{o=n||R(e);const{p2c:u,p2s:d}=i;({encryptedKey:a,...s}=await nt(t,r,o,u,d));break}case"A128KW":case"A192KW":case"A256KW":{o=n||R(e),a=await z(t,r,o);break}case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":{o=n||R(e);const{iv:u}=i;({encryptedKey:a,...s}=await ft(t,r,o,u));break}default:throw new m('Invalid or unsupported "alg" (JWE Algorithm) header value')}return{cek:o,encryptedKey:a,parameters:s}}const wt=Symbol();class Et{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 P("either setProtectedHeader, setUnprotectedHeader, or sharedUnprotectedHeader must be called before #encrypt()");if(!Je(this._protectedHeader,this._unprotectedHeader,this._sharedUnprotectedHeader))throw new P("JWE Protected, JWE Shared Unprotected and JWE Per-Recipient Header Parameter names must be disjoint");const n={...this._protectedHeader,...this._unprotectedHeader,...this._sharedUnprotectedHeader};if(pt(P,new Map,r==null?void 0:r.crit,this._protectedHeader,n),n.zip!==void 0)throw new m('JWE "zip" (Compression Algorithm) Header Parameter is not supported.');const{alg:i,enc:a}=n;if(typeof i!="string"||!i)throw new P('JWE "alg" (Algorithm) Header Parameter missing or invalid');if(typeof a!="string"||!a)throw new P('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 y;({cek:o,encryptedKey:s,parameters:y}=await yt(i,a,e,this._cek,this._keyManagementParameters)),y&&(r&&wt in r?this._unprotectedHeader?this._unprotectedHeader={...this._unprotectedHeader,...y}:this.setUnprotectedHeader(y):this._protectedHeader?this._protectedHeader={...this._protectedHeader,...y}:this.setProtectedHeader(y))}let c,u,d;this._protectedHeader?u=H.encode(w(JSON.stringify(this._protectedHeader))):u=H.encode(""),this._aad?(d=w(this._aad),c=j(u,H.encode("."),H.encode(d))):c=u;const{ciphertext:h,tag:b,iv:A}=await ge(a,this._plaintext,o,this._iv,c),l={ciphertext:w(h)};return A&&(l.iv=w(A)),b&&(l.tag=w(b)),s&&(l.encrypted_key=w(s)),d&&(l.aad=d),this._protectedHeader&&(l.protected=ae.decode(u)),this._sharedUnprotectedHeader&&(l.unprotected=this._sharedUnprotectedHeader),this._unprotectedHeader&&(l.header=this._unprotectedHeader),l}}class gt{constructor(e){this._flattened=new Et(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 q={base:{":disabled":{backgroundColor:"transparent"}}},At="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 Se=t=>t!=null,St="v3.9.0";class x{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&&Se(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=_t(St),!this.IFRAME_BASE_URL)throw new Error("IFRAME_BASE_URL not found");r&&X.set(this,{key:r})}mount(e){const r=typeof e=="string"?document.querySelector(e):e;if(!r)throw new Error(`${At}: ${e}`);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=X.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=X.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 _t(t){return`https://${window.HG_IFRAME_HOST??"sdk.hellgate.io"}/web/${t}/iframe/`}const X=new Map;class Ct extends x{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:_e}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:Ce})}}function _e(t){return t?Number(t):null}function Ce(t){return t?t<10?`0${t}`:String(t):null}class Pt extends x{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:Pe}),Object.defineProperty(this,"putValue",{enumerable:!0,configurable:!0,writable:!0,value:ve})}}function Pe(t){if(!t)return null;const e=Number(t);return e>10?+`20${e}`:null}function ve(t){return t?t>=100?String(t).slice(-2):String(t):null}function Z(t){const[e=null,r=null]=(t??"").split("/").map(n=>n.trim());return{month:_e(e),year:Pe(r)}}function Q(t){if(!t)return null;const{month:e,year:r}=t;return[Ce(e),ve(r)].filter(Se).join(" / ")}class Oe extends x{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 He(t){return t}class xe extends x{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:He})}}class Ke extends x{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 Te extends x{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 x{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 O(t,e,r){switch(t){case"card":return new Ke(e,r);case"cardNumber":return new xe(e,r);case"cardExpirationDate":return new Oe(e,r);case"cardExpirationMonth":return new Ct(e,r);case"cardExpirationYear":return new Pt(e,r);case"cardVerificationCode":return new Te(e,r);case"text":return new te(e,r);default:ASSERT_EXHAUSTIVE(t)}}function De(){return Date.now().toString(36)+Math.random().toString(36).slice(2)}function Me(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=D.get(this);if(!n)throw new Error("Secure key not found");const i=C({disabled:!1,autocomplete:"on",style:{...q}},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:Me(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=O("card",i,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=D.get(this);if(!n)throw new Error("Secure key not found");const i={disabled:!1,autocomplete:"on",style:{...q}},a=O("text",{...C(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}}}),D.set(this,De()),this.cvcOnlyEnabled=this.session.isNextAction("refresh_security_code")}createFormFields(e={}){var u,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 r=D.get(this);if(!r)throw new Error("Secure key not found");const n={disabled:this.cvcOnlyEnabled,autocomplete:"on",style:{...q}},{cardNumber:i={},securityCode:a={},...s}=e,o=O("cardNumber",{...C(n,{...s,...i,cvcOnly:this.cvcOnlyEnabled,value:this.session.isNextAction("refresh_security_code")&&((u=this.session.state)!=null&&u.data)?Me(this.session.state.data):null})},r),c=O("cardVerificationCode",{...C({...n,disabled:!1,autofocus:this.cvcOnlyEnabled},{...s,...a})},r);if(o.on("change",h=>{const b=h.cardBrand;c.update({cardType:b})}),this.cardElements={cardNumber:{element:o,state:this.createFieldDefaultState()},cardVerificationCode:{element:c,state:this.createFieldDefaultState()}},this.addElementStateListener("cardNumber"),this.addElementStateListener("cardVerificationCode"),e.expiryDateElement==="separate"){const{expiryMonth:h={},expiryYear:b={}}=e,A=O("cardExpirationMonth",{...C(n,{...s,...h})},r),l=O("cardExpirationYear",{...C(n,{...s,...b})},r);return l.on("change",()=>{const y=E(this,l);A.update({expiryYear:y?String(E(this,l)):void 0})}),this.cardElements.cardExpirationMonth={element:A,state:this.createFieldDefaultState()},this.cardElements.cardExpirationYear={element:l,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationMonth"),this.addElementStateListener("cardExpirationYear"),{cardNumber:o,expiryMonth:A,expiryYear:l,securityCode:c}}else{const{expiryDate:h={}}=e,b=O("cardExpirationDate",{...C(n,{...s,...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})},r);return this.cardElements.cardExpirationDate={element:b,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationDate"),{cardNumber:o,expiryDate:b,securityCode:c}}}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 c,u,d,h,b,A;const{card:e,cardNumber:r,cardExpirationDate:n,cardExpirationMonth:i,cardExpirationYear:a,cardVerificationCode:s}=this.cardElements;let o;if(e){const l=E(this,e.element);o={number:(l==null?void 0:l.number)??null,expiration_month:((c=l==null?void 0:l.expiry_date)==null?void 0:c.month)??null,expiration_year:((u=l==null?void 0:l.expiry_date)==null?void 0:u.year)??null,cvc:(l==null?void 0:l.cvc)??null}}if(r&&s&&(n&&(o={number:((d=E(this,r.element))==null?void 0:d.replaceAll(" ",""))??null,expiration_month:((h=E(this,n.element))==null?void 0:h.month)??null,expiration_year:((b=E(this,n.element))==null?void 0:b.year)??null,cvc:E(this,s.element)}),i&&a)){const l=E(this,i.element),y=E(this,a.element);o={number:((A=E(this,r.element))==null?void 0:A.replaceAll(" ",""))??null,expiration_month:l?Number(l):null,expiration_year:y?Number(y):null,cvc:E(this,s.element)}}return o}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 K({cardholder_name:M(this,e),billing_address:{line1:M(this,r.line1),line2:M(this,r.line2),line3:M(this,r.line3),city:M(this,r.city),postal_code:M(this,r.postal_code)}})}async encryptCardData(e,r){const n=await ot(r,"RSA-OAEP"),i=JSON.stringify(e),a=new TextEncoder().encode(i);return{enc_payload:await new gt(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 D=new Map;function E(t,e){const r=D.get(t);return r?e.secureValue(r):null}function M(t,e){const r=D.get(t);return e instanceof te&&r?E(t,e)??void 0:e}class vt{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 Ot=2e3;class Ht{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 xt(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`)))}),Ot);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 xt(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 Kt={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={...Kt,...r},i=new vt(n.base_url,n.abortCtrl),a=new Ht(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})}}p.CardElement=Ke,p.CardExpirationDateElement=Oe,p.CardNumberElement=xe,p.CardVerificationCodeElement=Te,p.Hellgate=ne,p.Hellgate3DSHandler=ie,p.HellgateCardHandler=$,p.TextElement=te,p.createElement=O,p.extractCardNumberValue=ee,p.extractExpiryDateValue=Z,p.putCardNumberValue=He,p.putExpiryDateValue=Q,p.uid=De,Object.defineProperty(p,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 Y=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(()=>{}),Y),()=>window.clearTimeout(this.resultPollingTimer)}}function w(){return document.body}const _={base:{":disabled":{backgroundColor:"transparent"}}},q="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,K="v3.10.0";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(K),!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(`${q}: ${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 G 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 G(e);case"cardExpirationYear":return new W(e);case"cardVerificationCode":return new R(e);case"text":return new $(e);default:ASSERT_EXHAUSTIVE(i)}}const X={visa:"visa",mastercard:"mastercard",americanexpress:"american-express",discover:"discover",dinersclub:"diners-club",jcb:"jcb",unionpay:"unionpay"};function J(i){return i.map(e=>X[e]).filter(Boolean)}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 y{static async init(e,t){return new y(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}}n.schemes=V(this.getSessionSchemes(),n.schemes);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,schemes:V(this.getSessionSchemes(),r.schemes??a.schemes),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,z=f("cardExpirationMonth",{...b(t,{...a,...h})}),B=f("cardExpirationYear",{...b(t,{...a,...u})});return this.cardElements.cardExpirationMonth={element:z,state:this.createFieldDefaultState()},this.cardElements.cardExpirationYear={element:B,state:this.createFieldDefaultState()},this.addElementStateListener("cardExpirationMonth"),this.addElementStateListener("cardExpirationYear"),{cardNumber:s,expiryMonth:z,expiryYear:B,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={},ephemeral:r,expiration_date:n}){const a=p({cardholder_name:g(e),billing_address:{line1:g(t.line1),line2:g(t.line2),line3:g(t.line3),city:g(t.city),postal_code:g(t.postal_code)}});return typeof r=="boolean"&&(a.ephemeral=r),typeof n=="string"&&(a.expiration_date=n),a}getSessionSchemes(){var t,r;if(!this.session.isNextAction("tokenize_card"))return;const e=(t=this.session.state)==null?void 0:t.data;if((r=e==null?void 0:e.allowed_schemes)!=null&&r.length)return J(e.allowed_schemes)}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 g(i){if(typeof i=="string")return i;if(i!=null&&i.key)return{key:i.key}}function V(i,e){return i===void 0?e:i.length===0?[]:e!=null&&e.length?e.filter(t=>i.includes(t)):i}const Q="v3.10.0";class Z{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(Q),!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 ee{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 te=2e3;class re{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 ie(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`)))}),te);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 ie(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 ae={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={...ae,...t},n=new ee(r.base_url,r.abortCtrl),a=new re(e,n),s=new Z;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 y.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=y,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.9.0",
3
+ "version": "3.10.0",
4
4
  "license": "Apache-2.0",
5
5
  "author": {
6
6
  "name": "Starfish GmbH & Co. KG",
@@ -56,12 +56,12 @@
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.18.1",
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",
64
- "postcss": "^8.5.3",
63
+ "playwright": "^1.55.1",
64
+ "postcss": "^8.5.10",
65
65
  "postcss-nesting": "^13.0.1",
66
66
  "prettier": "^3.2.5",
67
67
  "react": "^18.2.0",
@@ -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.4.1",
76
+ "vite": "^6.4.2",
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
+ }