@flopay/js 1.11.5 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var ve=Object.defineProperty;var pt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var ht=Object.prototype.hasOwnProperty;var gt=(r,e)=>{for(var t in e)ve(r,t,{get:e[t],enumerable:!0})},ft=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of yt(e))!ht.call(r,o)&&o!==t&&ve(r,o,{get:()=>e[o],enumerable:!(n=pt(e,o))||n.enumerable});return r};var Ct=r=>ft(ve({},"__esModule",{value:!0}),r);var dr={};gt(dr,{FloPay:()=>ee,PaymentAPI:()=>X,PciVaultCardCapture:()=>z,SESSION_CREATE_TELEMETRY:()=>ke,StripeAdapter:()=>Y,cacheSessionDisplayData:()=>L,clearSessionDisplayData:()=>ue,createCheckoutSession:()=>Ue,createCheckoutSessionWithRetries:()=>Ve,dropThirdPartyOnlyError:()=>dt.dropThirdPartyOnlyError,getSessionDisplayData:()=>ce,loadFloPay:()=>lt,toStripeAppearance:()=>ct,toStripeAppearanceTheme:()=>Ee});module.exports=Ct(dr);var dt=require("@flopay/shared");var C=require("@flopay/shared");function W(r){return typeof r=="string"&&r.trim()?r:void 0}function J(r){if(typeof r=="string")return r.trim()?r:void 0;if(Array.isArray(r))return r.filter(t=>typeof t=="string"&&t.trim().length>0).join("; ")||void 0}function P(r=12e3){let e=Number.isFinite(r)&&r>=0?r:12e3,t=new AbortController,n=setTimeout(()=>t.abort(),e);return{signal:t.signal,clear:()=>clearTimeout(n)}}function vt(){return Object.assign(new Error("The operation was aborted."),{name:"AbortError"})}function H(r,e){let t=150*2**r,n=Math.round(t*(.75+Math.random()*.5));return new Promise((o,s)=>{let i,a=()=>e.removeEventListener("abort",c),c=()=>{i!==void 0&&clearTimeout(i),a(),s(vt())};if(e.aborted){c();return}i=setTimeout(()=>{a(),o()},n),e.addEventListener("abort",c,{once:!0})})}var Tt="flopay_session_display:";var ie=new Map;function ae(r){return`${Tt}${r}`}function Te(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function L(r,e,t){if(!r)return;let n=t?.ttlMs??36e5,o={data:e,expiresAt:Date.now()+n},s=Te();if(s)try{s.setItem(ae(r),JSON.stringify(o));return}catch{}ie.set(r,o)}function ce(r){if(!r)return null;let e=Te();if(e)try{let n=e.getItem(ae(r));if(n){let o=JSON.parse(n);if(o&&typeof o.expiresAt=="number"&&o.expiresAt>Date.now())return o.data;e.removeItem(ae(r))}}catch{}let t=ie.get(r);if(t){if(t.expiresAt>Date.now())return t.data;ie.delete(r)}return null}function ue(r){if(!r)return;ie.delete(r);let e=Te();if(e)try{e.removeItem(ae(r))}catch{}}var _=require("@flopay/shared"),bt="/v1/sdk-telemetry/events",be=16,St=64,_t=1500,Ie=1e3,Rt=64,kt="00000000-0000-4000-8000-000000000000",At={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function K(){try{return globalThis.crypto.randomUUID()}catch{let r=new Uint8Array(16);try{globalThis.crypto.getRandomValues(r)}catch{for(let t=0;t<r.length;t+=1)r[t]=Math.floor(Math.random()*256)}r[6]=(r[6]??0)&15|64,r[8]=(r[8]??0)&63|128;let e=[...r].map(t=>t.toString(16).padStart(2,"0")).join("");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}}function wt(r){try{return new TextEncoder().encode(r).byteLength}catch{return r.length}}function Et(r){return JSON.stringify([r.code,r.failureCategory,r.reason,r.stage,r.provider,r.attempt,r.statusClass,r.requestCategory,r.paymentMethodCategory,r.walletType,r.operationOutcome,r.checkoutMode,r.layout,r.inAppBrowser,r.appFamily,r.popupCapability,r.presentationMode,r.terminalReason])}function R(){return globalThis.performance?.now()??0}var S=class{constructor(e){this.ingestionDisabled=!1;this.queue=[];this.sequence=0;this.flushTimer=null;this.flushInFlight=null;this.reportedFailures=new Map;this.checkoutContext={};this.checkoutStartedAt=null;this.destroyed=!1;this.observers=new Set;this.pageExitHandler=()=>{this.drainQueue()};this.visibilityHandler=()=>{document.visibilityState==="hidden"&&this.flush()};this.eventCounts={technical_error:0,lifecycle:0,expected_outcome:0,performance:0};this.endpoint=`${e.billingApiUrl.replace(/\/+$/,"")}${bt}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=K(),this.merchantEnabled=e.enabled!==!1,this.clock=e.clock??R,this.browserTransportAvailable=typeof window<"u"&&typeof document<"u",this.browserTransportAvailable&&(window.addEventListener("pagehide",this.pageExitHandler),document.addEventListener("visibilitychange",this.visibilityHandler))}log(e){this.notify({...e,class:"lifecycle"}),this.canCollect()&&this.enqueue((0,_.buildTelemetryLogEvent)({...this.checkoutContext,...e,eventId:K(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=(0,_.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:kt,sequence:0}),n=Et(t),o=this.now();this.pruneReportedFailures(o);let s=this.reportedFailures.get(n);if(s!==void 0&&o>=s&&o-s<Ie){this.log({name:"operation.deduplicated",stage:e.stage,provider:e.provider,paymentMethodCategory:e.paymentMethodCategory,attempt:e.attempt,inAppBrowser:e.inAppBrowser,appFamily:e.appFamily,popupCapability:e.popupCapability,presentationMode:e.presentationMode,terminalReason:e.terminalReason});return}this.rememberReportedFailure(n,o),this.enqueue((0,_.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:K(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue((0,_.buildTelemetryPerformanceEvent)({...this.checkoutContext,...e,eventId:K(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue((0,_.buildTelemetryTerminalEvent)({...this.checkoutContext,...e,eventId:K(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let t=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({...e,stage:"total_journey",durationMs:Math.max(0,this.now()-t),durationMode:"total"})}}now(){try{return this.clock()}catch{return R()}}subscribe(e){return this.destroyed?()=>{}:(this.observers.add(e),()=>this.observers.delete(e))}notify(e){if(!this.destroyed)for(let t of this.observers)try{t(e)}catch{}}pruneReportedFailures(e){for(let[t,n]of this.reportedFailures)(e<n||e-n>=Ie)&&this.reportedFailures.delete(t)}rememberReportedFailure(e,t){for(;this.reportedFailures.size>=Rt;){let n=this.reportedFailures.keys().next();if(n.done)break;this.reportedFailures.delete(n.value)}this.reportedFailures.set(e,t)}setCheckoutContext(e){this.checkoutContext={checkoutMode:e.checkoutMode,layout:e.layout}}beginCheckout(e={}){return this.canCollect()?(this.drainQueue(),this.setCheckoutContext(e),this.sequence=0,this.reportedFailures.clear(),this.eventCounts={technical_error:0,lifecycle:0,expected_outcome:0,performance:0},this.checkoutStartedAt=this.now(),this.checkoutStartedAt):0}enqueue(e){if(this.canCollect()&&!(this.queue.length>=St||this.eventCounts[e.class]>=At[e.class])){if(this.eventCounts[e.class]+=1,this.queue.push(e),this.queue.length>=be){this.flush();return}this.scheduleFlush()}}canCollect(){return this.browserTransportAvailable&&this.merchantEnabled&&!this.ingestionDisabled&&!this.destroyed}async flush(){if(this.flushInFlight!==null)return this.flushInFlight;if(!this.browserTransportAvailable||this.destroyed||this.ingestionDisabled||this.queue.length===0)return;this.clearFlushTimer();let e=this.queue.splice(0,be);return this.flushInFlight=this.sendBatch(e).finally(()=>{this.flushInFlight=null,this.queue.length>0&&this.scheduleFlush()}),this.flushInFlight}destroy(){this.destroyed||(this.drainQueue(),this.destroyed=!0,this.clearFlushTimer(),this.browserTransportAvailable&&(window.removeEventListener("pagehide",this.pageExitHandler),document.removeEventListener("visibilitychange",this.visibilityHandler)),this.queue.splice(0),this.reportedFailures.clear(),this.observers.clear())}disable(){this.merchantEnabled=!1,this.queue.splice(0),this.reportedFailures.clear(),this.clearFlushTimer()}drainQueue(){if(!(!this.browserTransportAvailable||this.destroyed||this.ingestionDisabled||this.queue.length===0))for(this.clearFlushTimer();this.queue.length>0;){let e=this.queue.splice(0,be);this.sendBatch(e)}}async sendBatch(e){if(!this.browserTransportAvailable||this.ingestionDisabled)return;let t=(0,_.serializeTelemetryBatch)(e,{correlationId:this.correlationId,sdkPackage:this.sdkPackage,sdkVersion:this.sdkVersion,batchId:K()});if(wt(t)>_.TELEMETRY_MAX_BATCH_BYTES)return;let n=typeof AbortController>"u"?null:new AbortController,o=null;try{let s=fetch(this.endpoint,{method:"POST",headers:{"content-type":"text/plain;charset=UTF-8"},body:t,credentials:"omit",keepalive:!0,referrerPolicy:"no-referrer",signal:n?.signal}).then(async c=>{if(c.status!==202)return null;let u=null;try{u=await c.json()}catch{}return u?.status==="disabled"?"disabled":null}).catch(()=>null),i=new Promise(c=>{o=setTimeout(()=>{n?.abort(),c(null)},_t)});await Promise.race([s,i])==="disabled"&&this.disableFromIngestion()}catch{}finally{o&&clearTimeout(o)}}disableFromIngestion(){this.ingestionDisabled=!0,this.queue.splice(0),this.reportedFailures.clear(),this.clearFlushTimer()}scheduleFlush(){this.flushTimer||this.destroyed||this.ingestionDisabled||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},0))}clearFlushTimer(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null)}},De=Symbol.for("@flopay/js.telemetry.reporter-factory.v1"),xe=globalThis;xe[De]===void 0&&Object.defineProperty(xe,De,{configurable:!0,enumerable:!1,writable:!1,value:r=>new S(r)});var Se=5,Oe=new WeakSet;function Mt(r){(typeof r=="object"&&r!==null||typeof r=="function")&&Oe.add(r)}function Pt(r){return(typeof r=="object"&&r!==null||typeof r=="function")&&Oe.has(r)}function It(r,e){let t=e?.error,n=W(e?.code)??W(t?.code)??`http_${r}`,o=J(e?.message)??J(t?.message)??Dt(n,r);return new C.FloPayError(o,"api_error",{code:n,statusCode:r})}function Dt(r,e){switch(r){case"CouponLimitExceeded":return`Too many coupon codes \u2014 a checkout session accepts at most ${Se}.`;case"CouponCurrencyUnsupported":return"One of the applied coupons has no price configured for the cart currency.";default:return`Failed to create checkout session (HTTP ${e}).`}}async function Fe(r,e,t){let{billingApiUrl:n,checkoutBaseUrl:o,items:s=[],subscriptions:i=[],products:a,account:c,successUrl:u,cancelUrl:d,checkoutMode:m="confirm",captureMethod:p,couponCodes:g=[],checkoutMetadata:y,tagsData:v,redirectParams:h={},setCookie:E=!0,clientId:A,currency:f,utmMetadata:B,idempotencyKey:ge}=r,te=(0,C.resolveIdempotencyKey)(ge);if(g.length>Se)throw new C.FloPayError(`Too many coupon codes \u2014 a checkout session accepts at most ${Se}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let q=a??(0,C.foldIntoProducts)(s,i);(0,C.assertCaptureMethodEligible)({captureMethod:p,products:q});let x=(0,C.resolveSessionCurrency)(f,s,i,q);if(!x)throw new C.FloPayError("currency is required: pass `currency` on the session, or include a `currency` on the first item/subscription/product.","validation_error",{code:"CurrencyRequired",param:"currency"});let M={clientId:A,checkoutVersion:C.SDK_VERSION,successUrl:u,cancelUrl:d,currency:x,checkoutMode:m,products:q.map(O=>(0,C.buildProductPayload)(O,x)),accountData:{userId:c.userId,firstName:c.firstName??null,lastName:c.lastName??null,email:c.email,country:c.country??null,gender:c.gender??null,city:c.city??null,state:c.state??null,zip:c.zip??null,addressLine1:c.addressLine1??null,addressLine2:c.addressLine2??null},couponCodes:g};p==="manual"&&(M.captureMethod=p),y!==void 0&&(M.checkoutMetadata=y),v&&(M.tagsData=v),B&&B.length>0&&(M.utmMetadata=B);let fe=`${n.replace(/\/+$/,"")}/v1/checkouts/sessions`,Pe={"Content-Type":"application/json"};te&&(Pe[C.IDEMPOTENCY_KEY_HEADER]=te);let j,re,mt={method:"POST",headers:Pe,body:JSON.stringify(M),signal:e},ne;try{t?.startAttempt(),ne=await fetch(fe,mt)}catch(O){throw Mt(O),O}try{t?.record(ne.status)}catch{}j=ne.status;try{re=await ne.json()}catch{}if(j>=400)throw It(j,re);if(j===201){let O=re?.data?.uuid,Ce=re?.data?.nonce;if(!O)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!Ce)throw new C.FloPayError("Checkout session created but no `nonce` was returned by the billing API. Upgrade the billing service to TeamFloPay/backend#640 or later.","api_error",{code:"MissingCheckoutSessionToken"});(q.length>0||x)&&L(O,{currency:x,products:q.map(b=>({code:b.code??b.providerItemId??b.providerPlanId,type:b.type,name:b.name??b.itemName??b.providerItemName??b.subscriptionName??b.providerPlanName??null,totalAmount:b.totalAmount,overrideAmount:b.overrideAmount,currency:b.currency??x}))});let oe=new URL(`${o.replace(/\/+$/,"")}/secure`);oe.searchParams.set("id",O);for(let[b,se]of Object.entries(h))oe.searchParams.set(b,se);if(E&&typeof window<"u"&&typeof document<"u"){let b=JSON.stringify({origin_url:d}),se=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(b)}; domain=.${se}; path=/; max-age=3600; SameSite=Lax; Secure;`,document.cookie=`flopay_checkout_token=${encodeURIComponent(Ce)}; domain=.${se}; path=/; max-age=3600; SameSite=Lax; Secure;`}return typeof window<"u"&&(window.location.href=oe.toString()),{status:201,redirectUrl:oe.toString(),nonce:Ce}}return j===204?(typeof window<"u"&&(window.location.href=u),{status:204}):{status:j}}async function Ue(r){let e=Le(r),t=qe(e),n=P(r.timeoutMs);try{let o=await Fe(r,n.signal,t);return t.commit(),Ne(e,o),o}catch(o){throw t.commit(),le(e,o),o}finally{n.clear(),$(e.reporter)}}function qe(r){let e=!1,t=r.startedAt,n;return{startAttempt(){t=r.reporter.now()},record(o){n={status:o,durationMs:Math.max(0,r.reporter.now()-t),attempt:r.attempt}},commit(){if(e||!n)return;e=!0;let o=(0,C.telemetryStatusClass)(n.status);r.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:o,attempt:n.attempt}),r.reporter.performance({stage:"session_first_byte",durationMs:n.durationMs,durationMode:"machine",requestCategory:"session_create",statusClass:o,attempt:n.attempt})}}}function Le(r){let e=new S({billingApiUrl:r.billingApiUrl,sdkVersion:C.SDK_VERSION,enabled:r.telemetry!==!1}),t=e.now();return e.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"}),{reporter:e,startedAt:t,attempt:0}}function Ne(r,e){let t=(0,C.telemetryStatusClass)(e.status);r.reporter.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:t}),r.reporter.performance({stage:"session_create",durationMs:r.reporter.now()-r.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:t,attempt:r.attempt})}function le(r,e){let{reporter:t}=r,n=(0,C.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(t.performance({stage:"session_create",durationMs:t.now()-r.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:n.statusClass,attempt:r.attempt}),e instanceof C.FloPayError&&e.type==="validation_error"){t.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"});return}if(n.statusClass==="4xx"){t.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create",statusClass:"4xx"});return}t.error({...n,stage:"session_create",requestCategory:"session_create"})}function $(r){r.flush().catch(()=>{}).finally(()=>r.destroy())}async function Ve(r){let{maxRetries:e=2,...t}=r,n=Le(r),o=qe(n);if(!Number.isFinite(e)||!Number.isInteger(e)||e<0||e>=3)throw n.reporter.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"}),$(n.reporter),new Error(`Number of retries must be an integer between 0 and ${2}`);let s={...t,idempotencyKey:(0,C.resolveIdempotencyKey)(t.idempotencyKey)},i=P(t.timeoutMs),a;for(let c=0;c<=e;c++){n.attempt=c;try{let u=await Fe(s,i.signal,o);return o.commit(),Ne(n,u),i.clear(),$(n.reporter),u}catch(u){a=u;let d=u instanceof Error&&u.name==="AbortError",m=Pt(u),p=u instanceof C.FloPayError&&u.code===C.IDEMPOTENCY_IN_PROGRESS_CODE;if((d||m||p)&&!i.signal.aborted&&c<e){n.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:c+1});try{await H(c,i.signal)}catch(g){throw o.commit(),le(n,g),i.clear(),$(n.reporter),g}continue}throw o.commit(),le(n,u),i.clear(),$(n.reporter),u}}throw o.commit(),le(n,a),i.clear(),$(n.reporter),a??new Error("Unknown error during checkout session creation")}var k=require("@flopay/shared");var l=require("@flopay/shared");function xt(r){return r==="on_session"||r==="off_session"}function Ot(r){if(!r||typeof r!="object")return!1;let e=r;return typeof e.paymentMethodType=="string"&&typeof e.reason=="string"}var Ft="x-flopay-process-result-source",Ut="status";function ze(r){return r?.result==="DECLINE"||r?.result==="ERROR"}var qt=50,N=new Map;function Lt(r,e){return N.get(r)?.has(e)===!0}function Nt(r,e){let t=N.get(r)??new Set;if(t.add(e),N.delete(r),N.set(r,t),N.size>qt){let n=N.keys().next().value;n!==void 0&&N.delete(n)}}function Vt(r){let e=r?.threeDSecureActionResultTokenId;if(typeof e=="string"&&e.length>0)return e;if(r?.gateway==="paypal"&&r.type!=="paypal_setup_token"&&typeof r.id=="string"&&r.id.length>0)return r.id}var Be=0,je=500,de=15e3,He=15e3,zt=3e3,Bt=1e4,jt=1e4;function ye(r){return typeof r=="object"&&r!==null}function U(r,e){return W(r?.[e])}function Ke(r,e){return J(r?.[e])}function Ht(r,e){let t=r?.[e];return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Re(r,e){return e?new Promise((t,n)=>{let o=()=>{clearTimeout(s),n(e.reason??Object.assign(new Error("The operation was aborted."),{name:"AbortError"}))},s=setTimeout(()=>{e.removeEventListener("abort",o),t()},r);e.aborted?o():e.addEventListener("abort",o,{once:!0})}):new Promise(t=>setTimeout(t,r))}function _e(r){return r instanceof Error&&r.name==="AbortError"}function w(){return new l.FloPayError(l.CHECKOUT_PROCESSING_TIMEOUT_MESSAGE,"api_error",{code:"checkout_processing_timeout"})}async function F(r,e){let t=await r.json().catch(()=>null),n=ye(t?.error)?t.error:null,o=Ke(t,"message")??Ke(n,"message")??e,s=U(t,"code")??U(t,"gatewayErrorCode")??U(n,"code")??`http_${r.status}`;return new l.FloPayError(o,"api_error",{code:s,statusCode:r.status})}async function Kt(r){if(r.status!==403)return!1;let e=await r.clone().json().catch(()=>null),t=ye(e?.error)?e.error:null;return(U(e,"code")??U(t,"code"))==="verification_required"}function $t(r){if(!(!ye(r)||typeof r.required!="boolean"))return{required:r.required,provider:"turnstile"}}async function Gt(r){let e=r.status===400?await r.clone().json().catch(()=>null):null;return(0,l.classifyPaymentRejection)(r.status,e)}function $e(r){return r===400||r===422}var pe=2;async function me(r,e,t=pe,n,o){let s;for(let i=0;;i++)try{return o?.(i),await fetch(r,e)}catch(a){if(e?.signal?.aborted||a instanceof Error&&a.name==="AbortError")throw a;if(s=a,i>=t)throw s;try{n?.(i+1)}catch{}await Re(150*2**i,e?.signal??void 0)}}var ke=Symbol.for("@flopay/js.session-create.telemetry.v1");function Yt(r){return r[ke]}function Wt(r){return"now"in r||"onFirstByte"in r||"onSessionCreateFailure"in r||"onRetry"in r}function Ye(r){let e=(0,l.isCardHolderNamePlaceholder)(r.firstName,r.lastName);return{userId:r.userId,firstName:e?null:r.firstName??null,lastName:e?null:r.lastName??null,email:r.email,country:r.country??null,gender:r.gender??null,city:r.city??null,state:r.state??null,zip:r.zip??null,addressLine1:r.addressLine1??null,addressLine2:r.addressLine2??null}}function We(r,e){e.checkoutMetadata!==void 0&&(r.checkoutMetadata=e.checkoutMetadata),e.tagsData&&(r.tagsData=e.tagsData),e.utmMetadata&&e.utmMetadata.length>0&&(r.utmMetadata=e.utmMetadata),e.avsCheck!==void 0&&(r.avsCheck=e.avsCheck),e.checkoutType&&(r.checkoutType=e.checkoutType),e.checkoutLayout&&(r.checkoutLayout=e.checkoutLayout),e.avsConfig&&(r.avsConfig=e.avsConfig)}function Jt(r,e){let t={clientId:r.clientId,checkoutVersion:l.SDK_VERSION,successUrl:r.successUrl,cancelUrl:r.cancelUrl,currency:e,checkoutMode:"full",deferDataAttachment:!0};return r.captureMethod==="manual"&&(t.captureMethod=r.captureMethod),r.account.country&&(t.accountData={country:r.account.country}),We(t,r),t}function Ge(r,e,t){return{currency:e,products:t.map(n=>(0,l.buildProductPayload)(n,e)),couponCodes:r.couponCodes??[],accountData:Ye(r.account)}}function Qt(r,e,t){return{currency:e,products:t.map(n=>(0,l.buildProductPayload)(n,e)),couponCodes:r.couponCodes??[]}}function Xt(r){let e={},t=(0,l.isCardHolderNamePlaceholder)(r.firstName,r.lastName);for(let[n,o]of Object.entries(r)){if(t&&n.endsWith("Name")||typeof o!="string")continue;let s=o.trim();s&&(e[n]=s)}return{accountData:e}}var V=class V{constructor(e,t={}){this.baseUrl=e.replace(/\/+$/,"");let n=Wt(t);this.telemetryHooks=n?t:void 0,this.directTelemetry=n||t.telemetry===!1?void 0:new S({billingApiUrl:this.baseUrl,sdkVersion:l.SDK_VERSION})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,t,n,o,s="unknown"){let i=(0,l.classifyTelemetryFailure)(e,t);this.directTelemetry?.error({...i,stage:n,requestCategory:o,paymentMethodCategory:s})}reportAccountSnapshotFailure(e,t){let n=(0,l.classifyTelemetryFailure)(e,"NETWORK_REQUEST_FAILED");if(t==="best_effort"&&n.errorCode==="REQUEST_TIMEOUT"){this.directTelemetry?.log({name:"operation.fallback",stage:"processing",requestCategory:"account_snapshot",statusClass:"timeout"});return}this.directTelemetry?.error({...n,stage:"processing",requestCategory:"account_snapshot",paymentMethodCategory:"unknown"})}telemetryTimestamp(){try{return this.telemetryHooks?.now?.()??this.directTelemetry?.now()??R()}catch{return R()}}beginDirectTelemetryCheckout(e){!this.directTelemetry||this.directTelemetryCheckoutId===e||(this.directTelemetryCheckoutId=e,this.directTelemetry.beginCheckout())}beginDirectTelemetryOperation(){this.directTelemetry&&(this.directTelemetryCheckoutId=void 0,this.directTelemetry.beginCheckout())}adoptDirectTelemetryCheckout(e){e&&(this.directTelemetryCheckoutId=e)}async getCheckoutSession(e,t){return this.fetchCheckoutSession(e,t)}async fetchCheckoutSession(e,t,n=!0,o){this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp(),i=s,a=0;this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let c={[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION};t&&(c["x-checkout-session-token"]=t);try{let u=await me(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:c,signal:o},pe,g=>{this.telemetryHooks?.onRetry?.("session_read",g),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:g})},g=>{a=g,i=this.telemetryTimestamp()}),d=Math.max(0,this.telemetryTimestamp()-i);try{this.telemetryHooks?.onFirstByte?.(d,a)}catch{}let m=`${Math.floor(u.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:m,attempt:a}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:d,durationMode:"machine",requestCategory:"session_read",statusClass:m,attempt:a}),!u.ok)throw await F(u,"Failed to get checkout session");let p=await u.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:m}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"session_read",statusClass:m}),{...p,data:this.mergeCachedDisplayData(p.data)}}catch(u){throw n&&this.directTelemetry?.error({...(0,l.classifyTelemetryFailure)(u,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),u}}cacheSessionDisplayData(e,t,n){L(e,t,n)}clearSessionDisplayData(e){ue(e)}async getVaultCapture(e,t){let n=`${this.baseUrl}\0${e}\0${t??""}`,o=V.activeVaultCaptureRequests.get(n);if(o!==void 0)return o;let s=this.requestVaultCapture(e,t);V.activeVaultCaptureRequests.set(n,s);try{return await s}finally{V.activeVaultCaptureRequests.get(n)===s&&V.activeVaultCaptureRequests.delete(n)}}async requestVaultCapture(e,t){let n=new AbortController,o=setTimeout(()=>n.abort(),jt);this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"vault.capture.requested",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card"});let i={"Content-Type":"application/json"};t&&(i["x-checkout-session-token"]=t);try{let a=await me(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:n.signal},pe,u=>{this.telemetryHooks?.onRetry?.("vault_capture",u),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:u})});if(await Kt(a))return this.directTelemetry?.performance({stage:"vault_request",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"vault_capture",paymentMethodCategory:"card",statusClass:"4xx"}),{verification:{required:!0,provider:"turnstile"}};if(!a.ok)throw await F(a,"Failed to load the secure card form");let c=await a.json();return this.directTelemetry?.performance({stage:"vault_request",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"vault_capture",paymentMethodCategory:"card",statusClass:"2xx"}),this.toVaultBlock(c)}catch(a){let c=n.signal.aborted?new l.FloPayError("Timed out while loading the secure card form. Please try again.","api_error",{code:"vault_capture_timeout"}):a;throw this.reportDirectFailure(c,"VAULT_LOAD_FAILED","vault_request","vault_capture","card"),c}finally{clearTimeout(o)}}async getUnifiedCheckoutSession(e,t){let n=await this.getCheckoutSession(e,t);return this.normalizeCheckoutSessionResponse(n)}async getUnifiedCheckoutSessionForRecovery(e,t,n){let o=await this.fetchCheckoutSession(e,t,!1,n);return this.normalizeCheckoutSessionResponse(o)}normalizeCheckoutSessionResponse(e){let t=this.normalizeRawSession(e.data),n=e.vault;return n&&t.data.session&&(t.data.session.vault=this.toVaultBlock(n)),t}async processPayment(e,t,n){this.beginDirectTelemetryCheckout(t.sessionId);let o=t.paymentMethodCategory??"unknown";if(!t.nonce)throw this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:o}),new l.FloPayError("processPayment requires `nonce` \u2014 pass the value returned from session creation.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.processing.started",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:o});let{nonce:i,paymentMethodCategory:a,...c}=t,u=Vt(t.tokenizedData),d;try{d=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(t.sessionId)}/process`,{method:"POST",headers:{"Content-Type":"application/json","x-checkout-session-token":i},body:JSON.stringify(c)})}catch(m){if(_e(m))throw this.reportDirectFailure(m,"PAYMENT_PROCESSING_FAILED","processing","process_payment",o),m;d=await this.reconcileProcessPayment(t.sessionId,{...n,nonce:i,paymentMethodCategory:o,submittedIntentId:u})}if(!d.ok&&d.status!==202){let m=await Gt(d);return m?this.directTelemetry?.terminal({outcome:m,stage:"processing",requestCategory:"process_payment",statusClass:"4xx",paymentMethodCategory:o}):this.directTelemetry?.error({errorCode:"PAYMENT_PROCESSING_FAILED",stage:"processing",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(d.status),failureCategory:d.status>=500?"server_error":void 0,paymentMethodCategory:o}),d}try{let m=await this.resolveProcessResponse(d,t.sessionId,{...n,nonce:i,paymentMethodCategory:o,submittedIntentId:u});return this.directTelemetry?.log({name:"payment.processing.completed",stage:"processing",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(m.status),paymentMethodCategory:o}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(m.status),paymentMethodCategory:o}),m}catch(m){throw m instanceof l.FloPayError&&m.code==="checkout_processing_timeout"||this.reportDirectFailure(m,"PAYMENT_PROCESSING_FAILED","processing","process_payment",o),m}}async patchAccountSnapshot(e,t,n,o){this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.state_transition",stage:"processing",requestCategory:"account_snapshot"});let i=o?.timeoutMs??Bt,a=new AbortController,c=()=>a.abort();o?.signal&&(o.signal.aborted?a.abort():o.signal.addEventListener("abort",c,{once:!0}));let u=setTimeout(()=>a.abort(),i);try{let d;try{d=await me(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/account`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t},body:JSON.stringify(n),signal:a.signal},pe,m=>{this.telemetryHooks?.onRetry?.("account_snapshot",m),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:m})})}finally{clearTimeout(u),o?.signal?.removeEventListener("abort",c)}if(!d.ok)throw await F(d,"Failed to persist account snapshot");this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"account_snapshot",statusClass:"2xx"})}catch(d){throw this.reportAccountSnapshotFailure(d,o?.telemetryMode??"blocking"),d}}async createSessionIntent(e,t,n,o){if(!t)throw new l.FloPayError("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let s=n,i=s.paymentMethodType,a=typeof i=="string"&&i.trim().toLowerCase()==="card",c=typeof i=="string"&&i.length>0&&!a&&(typeof s.paymentMethodId=="string"||s.paymentMethodId===null),u=s.provider==="stripe"&&(s.paymentMethodCategory==="wallet"||s.paymentMethodCategory==="apm")&&(s.intentKind==="payment"||s.intentKind==="setup"),d=s.provider==="paypal"&&s.paymentMethodCategory==="wallet"&&s.paymentMethodId===null&&(s.paymentMethodType==="paypal"&&s.intentKind==="payment"||s.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&(s.intentKind==="payment"||s.intentKind==="setup"));if(!c||!u&&!d)throw new l.FloPayError("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let m=s.authorizationAttemptId;if(m!==void 0&&!(0,l.isUuidV4)(m))throw new l.FloPayError("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let p=(0,l.isUuidV4)(m)?m:(0,l.randomUuidV4)();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let y={"Content-Type":"application/json","x-checkout-session-token":t,[l.IDEMPOTENCY_KEY_HEADER]:o?.idempotencyKey||p},v=!1;try{let h=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:y,body:JSON.stringify({...n,authorizationAttemptId:p}),signal:o?.signal});if(!h.ok){v=!0;let M=await F(h,"Failed to create checkout intent"),fe=(0,l.classifyTelemetryFailure)(M,"PAYMENT_PROCESSING_FAILED");throw $e(M.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...fe,stage:"processing",requestCategory:"intent_create"}),M}let A=(await h.json()).data;if(!A||typeof A!="object")throw new l.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let f=A,B=f.paymentMethodType,ge=(f.paymentMethodCategory==="wallet"||f.paymentMethodCategory==="apm")&&typeof B=="string"&&B.trim().toLowerCase()!=="card"&&(typeof f.paymentMethodId=="string"||f.paymentMethodId===null)&&typeof f.providerObjectId=="string",te=f.provider==="stripe"&&(f.intentKind==="payment"||f.intentKind==="setup")&&typeof f.clientSecret=="string",q=f.provider==="paypal"&&f.paymentMethodCategory==="wallet"&&f.paymentMethodId===null&&(f.paymentMethodType==="paypal"&&f.intentKind==="payment"&&(f.providerObjectType==="order"||f.providerObjectType==="subscription")||f.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&f.intentKind==="payment"&&f.providerObjectType==="order"||f.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&f.intentKind==="setup"&&f.providerObjectType==="setup_token")&&f.clientSecret===null,x=f.provider===n.provider&&f.paymentMethodCategory===n.paymentMethodCategory&&f.paymentMethodType===n.paymentMethodType&&f.paymentMethodId===n.paymentMethodId&&f.intentKind===n.intentKind;if(!ge||!te&&!q||!x)throw new l.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});return this.directTelemetry?.log({name:"payment.intent.completed",stage:"processing",requestCategory:"intent_create",statusClass:(0,l.telemetryStatusClass)(h.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:(0,l.telemetryStatusClass)(h.status)}),f}catch(h){throw v||this.reportDirectFailure(h,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),h}}async reportSessionIntentDecline(e,t,n,o){if(!t)throw new l.FloPayError("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let s=n,i=s.providerDeclineReason,a=s.paymentMethodType,c=s.providerIntentId,u=typeof i=="string"&&/^[a-z0-9][a-z0-9_.:-]{0,63}$/i.test(i)&&!/^(?:pm|pi|seti|tok|src|cus|sess|sk|pk)_/i.test(i),d=typeof a=="string"&&a.length>0&&a.trim().toLowerCase()!=="card"&&u,m=s.provider==="stripe"&&(s.paymentMethodCategory==="wallet"||s.paymentMethodCategory==="apm")&&(c===void 0||typeof c=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(c)),p=s.provider==="paypal"&&s.paymentMethodCategory==="wallet"&&s.paymentMethodType==="paypal"&&c===void 0;if(!d||!m&&!p)throw new l.FloPayError("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=p?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:s.paymentMethodCategory,paymentMethodType:s.paymentMethodType,providerDeclineReason:i,...typeof c=="string"?{providerIntentId:c}:{}},y=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents/decline`,{method:"POST",headers:{"Content-Type":"application/json","x-checkout-session-token":t},body:JSON.stringify(g),signal:o?.signal});if(!y.ok)throw await F(y,"Failed to report checkout decline")}async getPaymentsByEmail(e,t){this.beginDirectTelemetryOperation();let n=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"other",paymentMethodCategory:"saved"});let o=t?.page??1,s=t?.limit??1,i=new URLSearchParams({email:e,page:String(o),limit:String(s),sortField:"createdAt",sortDirection:"DESC"});try{let a=await fetch(`${this.baseUrl}/v1/payments?${i.toString()}`,{method:"GET",signal:t?.signal,keepalive:!0});if(!a.ok)throw new l.FloPayError("Failed to fetch payments","api_error",{statusCode:a.status});let c=await a.json();return this.directTelemetry?.log({name:"operation.recovery.completed",stage:"recovery",requestCategory:"other",paymentMethodCategory:"saved",statusClass:"2xx"}),this.directTelemetry?.performance({stage:"recovery",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"other",paymentMethodCategory:"saved",statusClass:"2xx"}),c}catch(a){throw this.reportDirectFailure(a,"RECOVERY_FAILED","recovery","other","saved"),a}}async createAndFetchSession(e){if((0,l.isDetachedSessionEligible)(e)){let s=e.account.email?.trim();if(s&&!(0,l.isValidEmail)(s))throw new l.FloPayError("Buyer email must be valid when supplied.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"});return(await this.createDetachedSession(e)).claimed}this.beginDirectTelemetryOperation();let t=this.telemetryTimestamp(),n=P(e.timeoutMs??12e3),o={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});try{let s=await this.createAndFetchSessionRequest(e,n.signal,o);return this.adoptDirectTelemetryCheckout(s.data.session?.id),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:o.statusClass}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:o.attempt}),s}catch(s){throw this.reportSessionCreateFailure(s,t,o),s}finally{n.clear()}}async createAndFetchSessionRequest(e,t,n){let o=e.products??(0,l.foldIntoProducts)(e.items,e.subscriptions);(0,l.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:o});let s=(0,l.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,o);if(!s)throw new l.FloPayError("currency is required: pass `currency` on the session, or include a `currency` on the first item/subscription/product.","validation_error",{code:"CurrencyRequired",param:"currency"});let i={clientId:e.clientId,checkoutVersion:l.SDK_VERSION,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:s,checkoutMode:e.checkoutMode??"full",products:o.map(m=>(0,l.buildProductPayload)(m,s)),accountData:Ye(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(i.captureMethod=e.captureMethod),e.tokenizedData&&(i.tokenizedData=e.tokenizedData),We(i,e);let c=await(await this.postCheckoutSessionCreate(i,e,t,n)).json();if(c.data&&"gateways"in c.data){this.autoCacheDisplayData(c.data.uuid,e);let m=this.mergeCachedDisplayData(c.data),p=this.normalizeRawSession(m);return c.vault&&p.data.session&&(p.data.session.vault=this.toVaultBlock(c.vault)),{...p,autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}let u=c.data?.uuid;if(!u)throw new l.FloPayError("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(u,e),this.adoptDirectTelemetryCheckout(u),{...await this.getUnifiedCheckoutSession(u),autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}async postCheckoutSessionCreate(e,t,n,o){let s={"Content-Type":"application/json",[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION},i=(0,l.resolveIdempotencyKey)(t.idempotencyKey);i&&(s[l.IDEMPOTENCY_KEY_HEADER]=i),t.checkoutMode==="auto"&&(s[l.FLO_SDK_CAPABILITIES_HEADER]=l.ASYNC_AUTO_CHECKOUT_CAPABILITY);let a,c=!1,u=Yt(t),d=(p,g,y)=>{c||(c=!0,this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:y,attempt:p}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"session_create",statusClass:y,attempt:p}))},m=p=>{try{this.telemetryHooks?.onRetry?.("session_create",p),this.directTelemetry?.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:p})}catch{}};for(let p=0;p<3;p++){o.attempt=p;let g=this.telemetryTimestamp();try{u?.onAttempt?.(p)}catch{}try{a=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:s,body:JSON.stringify(e),signal:n})}catch(h){if(o.statusClass=n.aborted||h instanceof Error&&h.name==="AbortError"?"timeout":"network_error",n.aborted||h instanceof Error&&h.name==="AbortError"||p>=2)throw h;let E=p+1;m(E),await H(p,n);continue}let y=(0,l.telemetryStatusClass)(a.status);if(o.statusClass=y,a.status===204)throw d(p,g,y),new l.FloPayError("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(a.ok){d(p,g,y);break}let v=await F(a,"Failed to create checkout session");if(v.code===l.IDEMPOTENCY_IN_PROGRESS_CODE&&p<2){m(p+1),await H(p,n);continue}throw d(p,g,y),v}if(!a)throw new TypeError("Checkout-session creation exhausted its retry budget.");return a}async createDetachedSession(e){this.beginDirectTelemetryOperation();let t=this.telemetryTimestamp(),n=P(e.timeoutMs??12e3),o={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});let s=e.products??(0,l.foldIntoProducts)(e.items,e.subscriptions);try{(0,l.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:s})}catch(h){throw n.clear(),this.reportSessionCreateFailure(h,t,o),h}let i=(0,l.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,s);if(!i)throw n.clear(),this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"}),new l.FloPayError("currency is required: pass `currency` on the session, or include a `currency` on the first item/subscription/product.","validation_error",{code:"CurrencyRequired",param:"currency"});try{Ge(e,i,s)}catch(h){throw n.clear(),this.reportSessionCreateFailure(h,t,o),h}let a,c;try{if(c=await(await this.postCheckoutSessionCreate(Jt(e,i),e,n.signal,o)).json(),!c.data||!("gateways"in c.data))throw new l.FloPayError("The billing API returned no session shell for a detached create. It must support `deferDataAttachment` (TeamFloPay/backend#1099).","api_error",{code:"InvalidCheckoutSessionResponse"});a=this.normalizeRawSession(this.mergeCachedDisplayData(c.data)),c.vault&&a.data.session&&(a.data.session.vault=this.toVaultBlock(c.vault))}catch(h){throw n.clear(),this.reportSessionCreateFailure(h,t,o),h}let u=a.data.session?.id??c.data.uuid??"",d=a.data.session?.clientSecret??c.data.nonce??"";if(!u||!d){n.clear();let h=new l.FloPayError("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(h,t,o),h}n.clear(),this.adoptDirectTelemetryCheckout(u),this.directTelemetry?.log({name:"session.shell.ready",stage:"session_shell",requestCategory:"session_create",statusClass:o.statusClass,paymentMethodCategory:"card"}),this.directTelemetry?.performance({stage:"session_shell",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:o.attempt,paymentMethodCategory:"card"});let m=!e.account.email?.trim(),p=P(e.timeoutMs??12e3),g=this.claimCheckoutSession(u,d,m?Qt(e,i,s):Ge(e,i,s),{params:e,startedAt:t,deadline:p,createAttempt:o.attempt}),y=m?void 0:g,v=(h={})=>{if(y!==void 0)return y;let E={...e,account:{...e.account,...h,email:h.email?.trim()||e.account.email?.trim()}};return(0,l.isValidEmail)(E.account.email)?(y=g.then(()=>{let A=this.telemetryTimestamp();return this.claimCheckoutSession(u,d,Xt(E.account),{params:E,startedAt:A,deadline:P(e.timeoutMs??12e3),createAttempt:0})}),y.catch(()=>{}),y):Promise.reject(new l.FloPayError("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return g.catch(()=>{}),{shell:a,sessionId:u,nonce:d,claimed:g,claim:v}}async claimCheckoutSession(e,t,n,o){let s=o?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),a=o?.deadline??P(12e3),c=JSON.stringify(n),u="unknown",d=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let m;for(d=0;d<3;d++){try{m=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/claim`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t,[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION},body:c,signal:a.signal})}catch(y){let v=a.signal.aborted||y instanceof Error&&y.name==="AbortError";if(u=v?"timeout":"network_error",v||d>=2)throw y;try{this.telemetryHooks?.onRetry?.("session_claim",d+1),this.directTelemetry?.log({name:"operation.retry",stage:"session_claim",requestCategory:"session_claim",attempt:d+1})}catch{}await H(d,a.signal);continue}if(u=(0,l.telemetryStatusClass)(m.status),m.ok)break;throw await F(m,"Failed to attach checkout session data")}if(!m)throw new TypeError("Checkout-session claim exhausted its retry budget.");let p=await m.json();if(!p.data?.gateways)throw new l.FloPayError("The billing API returned no checkout session with gateways after claiming it.","api_error",{code:"InvalidCheckoutSessionResponse"});o?.params&&this.autoCacheDisplayData(p.data.uuid??e,o.params);let g=this.normalizeRawSession(this.mergeCachedDisplayData(p.data));return p.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(p.vault)),this.directTelemetry?.log({name:"session.claim.completed",stage:"session_claim",requestCategory:"session_claim",statusClass:u}),this.directTelemetry?.performance({stage:"session_claim",durationMs:Math.max(0,this.telemetryTimestamp()-i),durationMode:"machine",requestCategory:"session_claim",statusClass:u,attempt:d}),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:u}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"session_create",statusClass:u,attempt:o?.createAttempt??d}),g}catch(m){throw this.reportSessionCreateFailure(m,i,{attempt:d,statusClass:u},"session_claim"),m}finally{a.clear()}}reportSessionCreateFailure(e,t,n,o="session_create"){if(!(e instanceof l.FloPayError&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let s=(0,l.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(this.directTelemetry?.performance({stage:o,durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:o==="session_claim"?"session_claim":"session_create",statusClass:s.statusClass,attempt:n.attempt}),e instanceof l.FloPayError&&e.type==="validation_error"||e instanceof l.FloPayError&&$e(e.statusCode)){this.directTelemetry?.terminal({outcome:"validation_rejected",stage:o,requestCategory:o==="session_claim"?"session_claim":"session_create",...e.type==="validation_error"?{}:{statusClass:"4xx"}});return}e instanceof l.FloPayError&&e.code==="session_auto_completed"||this.directTelemetry?.error({...s,stage:o,requestCategory:o==="session_claim"?"session_claim":"session_create"})}reportThreeDsAbandoned(e){this.beginDirectTelemetryCheckout(e),this.directTelemetry?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",paymentMethodCategory:"saved"})}async waitForCheckoutSessionCompletion(e,t){this.beginDirectTelemetryCheckout(e);let n=this.telemetryTimestamp(),o=t?.paymentMethodCategory??"saved";this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:o});let s=t?.timeoutMs??de,i=Date.now()+s,a=new AbortController,c=!1,u,d=setTimeout(()=>{u=setTimeout(()=>{c=!0,a.abort()},He)},s),m=()=>a.abort(t?.signal?.reason);t?.signal?.aborted?m():t?.signal?.addEventListener("abort",m,{once:!0});let p=this.clampRetryAfterMs(t?.initialDelayMs??Be),g=0;try{if(t?.statusUrl){let y=await this.waitForCheckoutStatus(e,{initialDelayMs:p,timeoutMs:s,nonce:t.nonce,statusUrl:t.statusUrl,pollAfterAction:t.continueAfterActionRequired,signal:a.signal});if(y){let v=await this.resolveCheckoutSessionStatus(e,y,t.nonce,a.signal,()=>c);return this.reportRecoveryCompleted(n,o),v}}for(;;){let y=i-Date.now();if(y<=0)throw w();if(p>0){try{g+=1,this.telemetryHooks?.onRetry?.("session_read",g),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:o,attempt:g})}catch{}if(await Re(Math.min(p,y),a.signal),Date.now()>=i)throw w()}let v=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce,a.signal),h=v.data.session?.status;if(h==="authorized"||h==="complete"||h==="expired")return this.reportRecoveryCompleted(n,o),v;if(Date.now()>=i)throw w();p=this.clampRetryAfterMs(Math.max(p*2,je))}}catch(y){let v=c&&_e(y)?w():y;throw this.reportDirectFailure(v,"RECOVERY_FAILED","recovery","session_read",o),v}finally{clearTimeout(d),clearTimeout(u),t?.signal?.removeEventListener("abort",m)}}reportRecoveryCompleted(e,t){let n={stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t};this.directTelemetry?.log({name:"operation.recovery.completed",...n}),this.directTelemetry?.performance({...n,durationMs:Math.max(0,this.telemetryTimestamp()-e),durationMode:"machine"})}async resolveCheckoutSessionStatus(e,t,n,o,s){let i=t.latestTransactionAttempt;if(this.rememberReportedFailure(e,t),i?.result==="DECLINE"){let u=i.code===l.STORED_PAYMENT_METHOD_UNSUPPORTED_CODE;throw new l.FloPayError(u?l.STORED_PAYMENT_METHOD_UNSUPPORTED_MESSAGE:"Payment was declined. Please choose another payment method.","api_error",{code:i.code??i.declineReason??"authorization_declined",statusCode:400})}if(i?.result==="ERROR"||t.status==="voided")throw new l.FloPayError("Payment could not be completed. Please try again.","api_error",{code:i?.code??"payment_processing_error",statusCode:500});let a;try{a=await this.getUnifiedCheckoutSessionForRecovery(e,n,o)}catch(u){if(!s?.()||!_e(u))throw u;a={providers:[],mode:"tokenize",data:{},raw:t}}let c=a.data.session;return c&&i?.result==="SUCCESS"?{...a,data:{...a.data,session:{...c,status:"complete"}}}:c&&i?.result==="AUTHORIZED"?{...a,data:{...a.data,session:{...c,status:"authorized",paymentId:t.paymentId??void 0,authorizationExpiresAt:t.authorizationExpiresAt??void 0}}}:c&&t.status==="completed"?{...a,data:{...a.data,session:{...c,status:"complete"}}}:c&&t.status==="authorized"?{...a,data:{...a.data,session:{...c,status:"authorized",paymentId:t.paymentId??void 0,authorizationExpiresAt:t.authorizationExpiresAt??void 0}}}:c&&t.status==="expired"?{...a,data:{...a.data,session:{...c,status:"expired"}}}:i?.result!=="ACTION_REQUIRED"?a:i.gateway==="paypal"&&i.providerIntentId?{...a,autoProcessingError:{type:"paypal_direct_required",message:"PayPal authorization required",orderId:i.providerIntentId,checkoutMethod:"paypal"}}:i.nextActionRedirectUrl?{...a,autoProcessingError:{type:"3ds_required",message:"Additional authentication is required.",nextActionRedirectUrl:i.nextActionRedirectUrl}}:a}async waitForCheckoutStatus(e,t){let n=t.timeoutMs??de,o=Date.now()+n,s=this.clampRetryAfterMs(t.initialDelayMs);for(;;){let i=o-Date.now();if(i<=0||s>0&&(await Re(Math.min(s,i),t.signal),Date.now()>=o))throw w();let a=o-Date.now();if(a<=0)throw w();let c=new AbortController,u,d=t.signal?new Promise((A,f)=>{u=f}):null,m=()=>{c.abort(t.signal?.reason),u?.(t.signal?.reason??Object.assign(new Error("The operation was aborted."),{name:"AbortError"}))};t.signal?.aborted?m():t.signal?.addEventListener("abort",m,{once:!0});let p,g=t.signal?null:new Promise((A,f)=>{p=setTimeout(()=>{f(w()),c.abort()},a+He)}),y;try{let A=this.fetchCheckoutStatus(e,t.nonce,t.statusUrl,c.signal);y=await Promise.race([A,g,d].filter(f=>f!==null))}finally{p!==void 0&&clearTimeout(p),t.signal?.removeEventListener("abort",m)}if(!y)return null;let v=ze(y.latestTransactionAttempt)&&!this.isOwnFailedAttempt(e,y,t.submittedIntentId);if(y.status==="completed"||y.status==="authorized"||y.status==="expired"||y.status==="voided")return v?{...y,latestTransactionAttempt:null}:y;let h=y.latestTransactionAttempt?.result,E=t.pollAfterAction===!0&&h==="ACTION_REQUIRED";if(!v&&h!==void 0&&h!=="PENDING"&&!E)return y;s=this.clampRetryAfterMs(Math.max(s*2,je))}}isOwnFailedAttempt(e,t,n){let o=t.latestTransactionAttempt?.providerIntentId??null;return n!==void 0?o===n:o===null?!0:!Lt(t.uuid||e,o)}rememberReportedFailure(e,t){let n=t.latestTransactionAttempt;!ze(n)||!n.providerIntentId||Nt(t.uuid||e,n.providerIntentId)}async fetchCheckoutStatus(e,t,n,o){let s=`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/status`,i=s;if(n)try{let d=new URL(n,`${this.baseUrl}/`),m=new URL(s);d.origin===m.origin&&(i=d.toString())}catch{}let a={[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION};t&&(a["x-checkout-session-token"]=t);let c=await me(i,{headers:a,signal:o});if(c.status===404||c.status===405)return null;if(!c.ok)throw await F(c,"Failed to get checkout session status");let u=await c.json();return ye(u.data)&&"latestTransactionAttempt"in u.data?u.data:null}normalizeRawSession(e){let t=e.gateways??{},n=[],o={session:this.toCheckoutSession(e)},s=t.stripe;if(s?.publishableKey){n.push("stripe");let c=[e.stripeClientSecret,s.stripeClientSecret].find(u=>typeof u=="string"&&u.length>0);o.stripe={clientSecret:c??"",publishableKey:s.publishableKey??void 0,paypalPublishableKey:s.paypalPublishableKey??void 0,environment:s.environment,enabledPaymentMethods:Array.isArray(s.enabledPaymentMethods)?s.enabledPaymentMethods.filter(u=>typeof u=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(n.push("paypal"),o.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType,approvalPresentation:i.approvalPresentation}),{providers:n,mode:"tokenize",...e.checkoutMetadata===void 0?{}:{checkoutMetadata:e.checkoutMetadata},data:o,raw:{data:e}}}toCheckoutSession(e){let t=e.products??[],n=typeof e.totalAmount=="number"&&Number.isFinite(e.totalAmount),o=t.reduce((u,d)=>u+(d.overrideAmount??d.totalAmount??0),0),s=n?e.totalAmount:o,i=Math.round(s*100),a=e.currency??t[0]?.currency??"USD",c="payment";return e.checkoutMode==="setup"?c="setup":t.some(u=>u.type==="subscription")&&(c="subscription"),{id:e.uuid,clientSecret:e.nonce,mode:c,status:this.toCheckoutSessionStatus(e.status),amount:i,currency:a,captureMethod:e.captureMethod,paymentId:e.paymentId,authorizationExpiresAt:e.authorizationExpiresAt,failureOutcome:(0,l.normalizeCheckoutFailureOutcome)(e.outcome)??(0,l.normalizeCheckoutFailureOutcome)(e.failureReason)??(e.status==="expired"&&e.captureMethod==="manual"?"authorization_expired":void 0),customer:{id:e.accountData.userId??void 0,email:e.accountData.email??void 0,firstName:e.accountData.firstName??void 0,lastName:e.accountData.lastName??void 0,country:e.accountData.country??void 0,city:e.accountData.city??void 0,state:e.accountData.state??void 0,zip:e.accountData.zip??void 0,gender:e.accountData.gender??void 0,line1:e.accountData.addressLine1??void 0,line2:e.accountData.addressLine2??void 0},...e.checkoutMetadata===void 0?{}:{checkoutMetadata:e.checkoutMetadata},metadata:{},checkoutMode:e.checkoutMode,...Array.isArray(e.advertisedPaymentMethods)?{advertisedPaymentMethods:e.advertisedPaymentMethods}:{},...xt(e.futureUse)?{futureUse:e.futureUse}:{},...Array.isArray(e.futureUseUnsupported)?{futureUseUnsupported:e.futureUseUnsupported.filter(Ot)}:{},buyerIdentified:e.buyerIdentified,providerPaymentMethodId:typeof e.providerPaymentMethodId=="string"?e.providerPaymentMethodId:null,products:t.map(u=>({...u,totalAmount:typeof u.totalAmount=="number"?u.totalAmount:void 0,overrideAmount:typeof u.overrideAmount=="number"?u.overrideAmount:null,currency:typeof u.currency=="string"?u.currency:void 0,metadata:u.metadata??null})),successUrl:e.successUrl,cancelUrl:e.cancelUrl,coupons:e.coupons,subtotalAmount:e.subtotalAmount,discountAmount:e.discountAmount,totalAmount:e.totalAmount,createdAt:e.createdAt,gateways:e.gateways,accountData:e.accountData,tagsData:e.tagsData}}toVaultBlock(e){let t=$t(e.verification);return{html:typeof e.html=="string"?e.html:void 0,url:typeof e.url=="string"?e.url:void 0,messageToken:typeof e.messageToken=="string"?e.messageToken:void 0,expectedOrigin:typeof e.expectedOrigin=="string"?e.expectedOrigin:void 0,...t?{verification:t}:{}}}toCheckoutSessionStatus(e){return e==="completed"?"complete":e==="authorized"?"authorized":e==="expired"?"expired":"open"}async resolveProcessResponse(e,t,n){if(e.status!==202)return e;let o=await e.json().catch(()=>null),s=this.toCheckoutProcessingPending(o,e,t),i=n?.pollTimeoutMs??de,a=Date.now()+i;if(s.statusUrl){let u=await this.waitForCheckoutStatus(s.sessionId,{initialDelayMs:s.retryAfterMs,timeoutMs:i,nonce:n?.nonce,statusUrl:s.statusUrl,submittedIntentId:n?.submittedIntentId});if(u)return this.toProcessResponseFromStatus(u,t,n?.nonce)}let c=await this.waitForCheckoutSessionCompletion(s.sessionId,{initialDelayMs:s.retryAfterMs,timeoutMs:a-Date.now(),nonce:n?.nonce,paymentMethodCategory:n?.paymentMethodCategory});return this.toProcessResponseFromSession(c,t)}async toProcessResponseFromStatus(e,t,n){let o=e.latestTransactionAttempt?.result,s={[Ft]:Ut},i={"Content-Type":"application/json",...s};if(e.status==="completed"||o==="SUCCESS")return new Response(null,{status:204,statusText:"No Content",headers:s});if(e.status==="authorized"||o==="AUTHORIZED")return new Response(JSON.stringify({status:"authorized",paymentId:e.paymentId??void 0,sessionId:e.uuid||t,authorizationExpiresAt:e.authorizationExpiresAt??void 0}),{status:200,headers:i});if(e.status==="expired"){let a=await this.resolveCheckoutSessionStatus(t,e,n);return this.toProcessResponseFromSession(a,t)}if(this.rememberReportedFailure(t,e),o==="DECLINE"){let a=e.latestTransactionAttempt,c=a?.code===l.STORED_PAYMENT_METHOD_UNSUPPORTED_CODE,u=a?.declineReason??void 0;return new Response(JSON.stringify({type:u??"authorization_declined",message:c?l.STORED_PAYMENT_METHOD_UNSUPPORTED_MESSAGE:"Payment was declined. Please choose another payment method.",code:a?.code??u??"authorization_declined",...u?{declineCode:u}:{}}),{status:400,headers:i})}if(o==="ACTION_REQUIRED"&&e.latestTransactionAttempt?.gateway==="paypal"&&e.latestTransactionAttempt.providerIntentId)return new Response(JSON.stringify({type:"paypal_direct_required",message:"PayPal authorization required",orderId:e.latestTransactionAttempt.providerIntentId}),{status:400,headers:i});if(o==="ACTION_REQUIRED"&&e.latestTransactionAttempt?.nextActionRedirectUrl)return new Response(JSON.stringify({type:"3ds_required",message:"Additional authentication is required.",nextActionRedirectUrl:e.latestTransactionAttempt.nextActionRedirectUrl}),{status:400,headers:i});if(o==="ERROR"||e.status==="voided")return new Response(JSON.stringify({type:"unknown",code:e.latestTransactionAttempt?.code??"payment_processing_error",message:"Payment could not be completed. Please try again."}),{status:500,headers:i});throw w()}async reconcileProcessPayment(e,t){let n=t?.pollTimeoutMs??de,o=Date.now()+n,s=null;try{s=await this.waitForCheckoutStatus(e,{initialDelayMs:0,timeoutMs:n,nonce:t?.nonce,submittedIntentId:t?.submittedIntentId})}catch(c){if(this.reportDirectFailure(c,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),c instanceof l.FloPayError&&c.code==="checkout_processing_timeout")throw c}if(s)return this.toProcessResponseFromStatus(s,e,t?.nonce);let i=o-Date.now();if(i<=0)throw w();let a=await this.waitForCheckoutSessionCompletion(e,{initialDelayMs:0,timeoutMs:i,nonce:t?.nonce,paymentMethodCategory:t?.paymentMethodCategory});return this.toProcessResponseFromSession(a,e)}toProcessResponseFromSession(e,t){if(e.data.session?.status==="complete")return new Response(null,{status:204,statusText:"No Content"});if(e.data.session?.status==="authorized"){let n=e.data.session;return new Response(JSON.stringify({status:"authorized",paymentId:n.paymentId,sessionId:n.id||t,authorizationExpiresAt:n.authorizationExpiresAt}),{status:200,headers:{"Content-Type":"application/json"}})}if(e.data.session?.status==="expired"){let n=e.data.session.failureOutcome==="authorization_expired"||e.data.session.captureMethod==="manual";throw new l.FloPayError(n?"Authorization has expired.":"Checkout session has expired.","api_error",{code:n?"authorization_expired":"checkout_session_expired"})}throw w()}toCheckoutProcessingPending(e,t,n){let o=t.headers.get("Retry-After"),s=o===null||o.trim()===""?void 0:Number(o),i=s!==void 0&&Number.isFinite(s)?s*1e3:void 0;return{type:"checkout_processing",sessionId:U(e,"sessionId")??n,retryAfterMs:this.clampRetryAfterMs(Ht(e,"retryAfterMs")??i??Be),statusUrl:U(e,"statusUrl"),sessionUrl:U(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,zt))}autoCacheDisplayData(e,t){if(!e)return;let n=t.products??(0,l.foldIntoProducts)(t.items,t.subscriptions);if(n.length===0&&!t.currency)return;let o=t.products!==void 0,s=(0,l.resolveSessionCurrency)(t.currency,o?void 0:t.items,o?void 0:t.subscriptions,n);L(e,{currency:s??void 0,products:n.map(i=>({code:i.code??i.providerItemId??i.providerPlanId,type:i.type,name:i.name??i.itemName??i.providerItemName??i.subscriptionName??i.providerPlanName??null,totalAmount:i.totalAmount,overrideAmount:i.overrideAmount,currency:i.currency??s??void 0}))})}mergeCachedDisplayData(e){let t=ce(e.uuid),n=new Map,o=i=>i?`code:${i}`:void 0;for(let i of t?.products??[]){let a=o(i.code);a&&n.set(a,i)}let s=(e.products??[]).map(i=>{let a=o(i.code),c=a?n.get(a):void 0;return{...i,name:i.name??c?.name??null,totalAmount:i.totalAmount??c?.totalAmount,overrideAmount:i.overrideAmount??c?.overrideAmount,currency:i.currency??c?.currency}});return{...e,currency:e.currency??t?.currency,products:s}}};V.activeVaultCaptureRequests=new Map;var X=V;function Je(r,e){let t=X;return new t(r,e)}var T=require("@flopay/shared");var Ae="flopay-vault",Zt=3e4,er=T.THREE_DS_CHALLENGE_WINDOW_MS+Zt,tr="Card authentication timed out.",Qe={ready:["vault.widget.ready","vault_ready"],submitting:["vault.submission.started","vault_submit"],blocked:["operation.state_transition","vault_submit"],action_required:["vault.action.required","three_ds_handoff"]};function rr(r){return r.class==="lifecycle"?r.name:r.class==="technical_error"?r.code:r.class==="expected_outcome"?r.outcome:"sdk.performance"}function G(r){let e={class:r.class,stage:r.stage};"code"in r&&(e.code=r.code),"provider"in r&&r.provider&&(e.provider=r.provider),"paymentMethodCategory"in r&&r.paymentMethodCategory&&(e.paymentMethodCategory=r.paymentMethodCategory),"outcome"in r&&(e.outcome=r.outcome),"durationMs"in r&&r.durationMs!==void 0&&(e.durationMs=r.durationMs),"durationMode"in r&&r.durationMode&&(e.durationMode=r.durationMode);try{globalThis.Sentry?.addBreadcrumb?.({category:"flopay.telemetry",level:r.class==="technical_error"?"error":"info",message:rr(r),data:e})}catch{}}function Z(r,e){return(0,T.buildTelemetryLogEvent)({eventId:"11111111-1111-4111-8111-111111111111",name:r,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}var nr=new Set(["authorization_declined","authentication_required","authorization_expired","capture_failed"]);function or(r){return typeof r=="string"&&nr.has(r)?r:"unknown"}function Xe(r,e){return r?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime",reason:or(e.failureOutcome)}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function Ze(r,e,t="checkout"){return t==="card_setup"?r.type==="decline"?"card_setup_declined":"card_setup_succeeded":r.type==="decline"?"payment_declined":r.outcome==="authorized"||e==="manual"?"payment_authorized":"payment_succeeded"}function sr(r,e,t,n="checkout"){let{type:o}=r;if(o==="complete"||o==="decline")return(0,T.buildTelemetryTerminalEvent)({eventId:"22222222-2222-4222-8222-222222222222",outcome:Ze(r,t,n),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(o==="error"){let a=Xe(e,r);return(0,T.buildTelemetryErrorEvent)({eventId:"33333333-3333-4333-8333-333333333333",...a,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[s,i]=Qe[o];return Z(s,i)}function ir(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===Ae&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function ar(r){if(typeof r!="object"||r===null)return;let e=r,t=e.status;if(!(typeof e.id!="string"||e.id.trim()===""||typeof e.brand!="string"||e.brand.trim()===""||typeof e.lastFour!="string"||!/^\d{4}$/.test(e.lastFour)||typeof e.expiryMonth!="number"||!Number.isInteger(e.expiryMonth)||e.expiryMonth<1||e.expiryMonth>12||typeof e.expiryYear!="number"||!Number.isInteger(e.expiryYear)||e.expiryYear<1970||e.expiryYear>9999||t!=="pending"&&t!=="active"&&t!=="deleted"))return{id:e.id,brand:e.brand,lastFour:e.lastFour,expiryMonth:e.expiryMonth,expiryYear:e.expiryYear,status:t}}function cr(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===Ae&&e.type==="validation"&&Array.isArray(e.messages)}function ur(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===Ae&&e.type==="resize"&&typeof e.height=="number"&&Number.isFinite(e.height)}var z=class{constructor(e={},t){this.provider="pcivault";this.container=null;this.messageHandler=null;this.actionOverlay=null;this.threeDsReturnHandler=null;this.actionOverlayPreviousFocus=null;this.actionOverlayTimer=null;this.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!0;this.submitLabel=void 0;this.mountStartedAt=0;this.vaultReadyReported=!1;this.verificationRequired=!1;this.submissionStarted=!1;this.submissionStartedAt=null;this.listeners=new Map;this.config=e,this.ownsTelemetryReporter=!t&&e.telemetry!==!1,this.telemetryReporter=t?.reporter??(this.ownsTelemetryReporter?new S({billingApiUrl:(0,T.resolveBillingApiUrl)(e.billingApiUrl),sdkVersion:T.SDK_VERSION}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new S({billingApiUrl:(0,T.resolveBillingApiUrl)(this.config.billingApiUrl),sdkVersion:T.SDK_VERSION}));let n=this.telemetryReporter;if(this.config.operation==="card_setup"&&n&&this.setupTelemetryReporter!==n){this.setupTelemetryReporter=n;try{n.beginCheckout({checkoutMode:"setup"})}catch{}}if(this.mountStartedAt=this.telemetryReporter?.now?.()??R(),this.vaultReadyReported=!1,this.submissionStarted=!1,this.submissionStartedAt=null,typeof window>"u"||typeof document>"u")throw this.reportVaultLoadFailure(),new T.FloPayError("The vault card form is only available in the browser.","api_error",{code:"card_capture_no_window"});if(!t?.html?.trim())throw this.reportVaultLoadFailure(),new T.FloPayError("No vault capture widget HTML was provided to mount the secure card form.","api_error",{code:"card_capture_no_widget_html"});this.container=e,this.verificationRequired=t.verificationRequired===!0,this.messageToken=t.messageToken??null,this.expectedOrigin=t.expectedOrigin??this.config.expectedOrigin??null,this.theme=t.theme,t.submitLabel!==void 0&&(this.submitLabel=t.submitLabel);try{this.attachMessageListener(),this.injectWidget(e,t.html)}catch(o){throw this.reportVaultLoadFailure(),o}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),this.postSubmitLabel(),G(Z("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?.performance?.({stage:"vault_mount",durationMs:Math.max(0,(this.telemetryReporter.now?.()??R())-this.mountStartedAt),durationMode:"machine",provider:"pcivault",paymentMethodCategory:"card"}),this.emit("ready",{sessionId:this.config.sessionId})}reportVaultLoadFailure(){this.telemetryReporter?.error({errorCode:"VAULT_LOAD_FAILED",failureCategory:"provider_runtime",stage:"vault_mount",provider:"pcivault",paymentMethodCategory:"card"})}on(e,t){let n=this.listeners.get(e);return n||(n=new Set,this.listeners.set(e,n)),n.add(t),()=>{this.listeners.get(e)?.delete(t)}}unmount(){this.hideActionRequiredOverlay(),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null),this.container&&(this.container.replaceChildren(),this.container=null),this.messageToken=null,this.expectedOrigin=null,this.ownsTelemetryReporter&&(this.telemetryReporter?.destroy(),this.telemetryReporter=void 0)}injectWidget(e,t){e.innerHTML=t;let n=Array.from(e.querySelectorAll("script"));for(let o of n){let s=document.createElement("script");for(let i of Array.from(o.attributes))s.setAttribute(i.name,i.value);s.text=o.text,o.replaceWith(s)}}attachMessageListener(){if(this.messageHandler)return;let e=t=>{if(this.expectedOrigin&&t.origin!==this.expectedOrigin)return;let n=t.data;if(ur(n)){if(this.messageToken&&n.messageToken!==this.messageToken)return;this.applyHeight(n.height);return}if(cr(n)){if(this.messageToken&&n.messageToken!==this.messageToken)return;let c=n.messages.filter(u=>typeof u=="string"&&u.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:c||void 0});return}if(!ir(n)||this.messageToken&&n.messageToken!==this.messageToken)return;let o=this.config.sessionId,s=typeof n.sessionId=="string"?n.sessionId:void 0;if(o&&s&&s!==o||(n.type==="complete"||n.type==="decline")&&o&&s!==o)return;let i=ar(n.paymentMethod),a={...n.sessionId??this.config.sessionId?{sessionId:n.sessionId??this.config.sessionId}:{},...n.outcome?{outcome:n.outcome}:{},...n.paymentId?{paymentId:n.paymentId}:{},...n.authorizationExpiresAt?{authorizationExpiresAt:n.authorizationExpiresAt}:{},...n.failureOutcome?{failureOutcome:n.failureOutcome}:{},...n.intentId?{intentId:n.intentId}:{},...n.declineReason?{declineReason:n.declineReason}:{},...n.message?{message:n.message}:{},...i?{paymentMethod:i}:{}};n.type==="submitting"&&(this.submissionStarted=!0,this.submissionStartedAt=this.telemetryReporter?.now?.()??R()),this.isVerificationStateError(n)?(G(Z("operation.state_transition","vault_mount")),this.telemetryReporter?.log({name:"operation.state_transition",stage:"vault_mount",provider:"pcivault",paymentMethodCategory:"card"})):(G(sr(n,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(n)),n.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),this.postSubmitLabel()),n.type==="action_required"&&n.nextActionRedirectUrl&&this.showActionRequiredOverlay(n.nextActionRedirectUrl),(n.type==="complete"||n.type==="decline"||n.type==="error"||n.type==="submitting")&&this.hideActionRequiredOverlay(),n.type!=="action_required"&&this.emit(n.type,a)};this.messageHandler=e,window.addEventListener("message",e)}isVerificationStateError(e){return e.type==="error"&&this.verificationRequired&&!this.submissionStarted}reportOutcome(e){let t=this.telemetryReporter;if(!t)return;let{type:n}=e;if(n==="ready"&&!this.vaultReadyReported&&(this.vaultReadyReported=!0,t.performance({stage:"vault_ready",durationMs:Math.max(0,t.now()-this.mountStartedAt),durationMode:"machine",provider:"pcivault",paymentMethodCategory:"card",requestCategory:"provider_sdk"})),n==="complete"||n==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:Ze(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(n==="error"){let i=Xe(this.submissionStarted,e);t.log({name:"vault.terminal",stage:i.stage,provider:"pcivault",paymentMethodCategory:"card"}),t.error({...i,provider:"pcivault",paymentMethodCategory:"card"});return}if(n==="action_required"){t.log({name:"vault.action.required",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),t.log({name:"vault.three_ds.handoff",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"});let i=this.submissionStartedAt;this.submissionStartedAt=null,i!==null&&t.performance({stage:"three_ds_handoff",durationMs:Math.max(0,t.now()-i),durationMode:"machine",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:"action_required",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"});return}let[o,s]=Qe[n];t.log({name:o,stage:s,provider:"pcivault",paymentMethodCategory:"card"})}applyTheme(e){this.theme=e,this.postTheme()}postTheme(){this.theme!==void 0&&this.postToHostedWindow({source:"flopay-vault-host",type:"theme",theme:this.theme},this.directiveTargetOrigin())}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){this.postToHostedWindow({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},this.directiveTargetOrigin())}setCardFieldOrder(e,t){this.cardFieldOrder=e,this.cardAutoFocus=t,this.postCardFieldOrder()}postCardFieldOrder(){this.postToHostedWindow({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},this.directiveTargetOrigin())}setSubmitLabel(e){this.submitLabel=e,this.postSubmitLabel()}postSubmitLabel(){let e=this.submitLabel,t=this.config.sessionId,{messageToken:n,expectedOrigin:o}=this;e===void 0||!t||!n||!o||this.postToHostedWindow({source:"flopay-vault-host",type:"submitLabel",sessionId:t,messageToken:n,label:e},o)}hostedWindow(){return this.container?.querySelector("iframe")?.contentWindow??null}postToHostedWindow(e,t){let n=this.hostedWindow();if(n)try{n.postMessage(e,t)}catch{}}directiveTargetOrigin(){return this.expectedOrigin??"*"}emit(e,t){for(let n of this.listeners.get(e)??[])n(t)}showActionRequiredOverlay(e){if(typeof document>"u")return;if(this.actionOverlay){let i=this.actionOverlay.querySelector("iframe");i instanceof HTMLIFrameElement&&i.src!==e&&(i.src=e),this.armActionRequiredTimeout();return}this.actionOverlayPreviousFocus=document.activeElement instanceof HTMLElement?document.activeElement:null;let t=document.createElement("div");t.setAttribute("data-flopay-action-required","1"),t.setAttribute("role","dialog"),t.setAttribute("aria-modal","true"),t.setAttribute("aria-label","Card authentication"),t.style.cssText=["position:fixed","inset:0","z-index:2147483647","background:rgba(15,23,42,0.6)","display:flex","align-items:center","justify-content:center","padding:16px"].join(";");let n=document.createElement("iframe");n.setAttribute("title","Card authentication"),n.setAttribute("allow","payment"),n.tabIndex=0,n.style.cssText=["width:min(100%,460px)","height:min(100%,640px)","border:0","border-radius:12px","background:#fff","box-shadow:0 12px 30px rgba(0,0,0,0.35)"].join(";"),n.src=e,t.appendChild(n);let o=document.createElement("button");o.type="button",o.setAttribute("aria-label","Close card authentication"),o.textContent="\xD7",o.style.cssText=["position:fixed","top:20px","right:20px","width:40px","height:40px","border:0","border-radius:9999px","background:#fff","color:#0f172a","font-size:28px","line-height:40px","cursor:pointer","box-shadow:0 4px 14px rgba(0,0,0,0.25)"].join(";"),o.addEventListener("click",()=>this.abandonActionRequiredOverlay()),t.appendChild(o),t.addEventListener("click",i=>{i.target===t&&this.abandonActionRequiredOverlay()});let s=i=>{if(i.source!==n.contentWindow)return;let a=i.data;!a||typeof a!="object"||a.source!=="flopay-vault-3ds-return"||(G(Z("vault.three_ds.returned","three_ds_return")),this.telemetryReporter?.log({name:"vault.three_ds.returned",stage:"three_ds_return",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay())};window.addEventListener("message",s),this.threeDsReturnHandler=s,document.body.appendChild(t),this.actionOverlay=t,n.focus(),this.armActionRequiredTimeout(),G(Z("vault.three_ds.handoff","three_ds_handoff"))}armActionRequiredTimeout(){this.actionOverlayTimer&&clearTimeout(this.actionOverlayTimer),this.actionOverlayTimer=setTimeout(()=>{this.actionOverlayTimer=null,this.actionOverlay&&this.timeOutActionRequiredOverlay()},er)}reportChallengeAbandoned(){G((0,T.buildTelemetryTerminalEvent)({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"})),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"})}timeOutActionRequiredOverlay(){this.reportChallengeAbandoned(),this.hideActionRequiredOverlay(),this.emit("error",{...this.config.sessionId?{sessionId:this.config.sessionId}:{},message:tr})}abandonActionRequiredOverlay(){this.actionOverlay&&(this.reportChallengeAbandoned(),this.hideActionRequiredOverlay(),this.emit("challenge_dismissed",{...this.config.sessionId?{sessionId:this.config.sessionId}:{}}))}hideActionRequiredOverlay(){if(this.actionOverlayTimer&&(clearTimeout(this.actionOverlayTimer),this.actionOverlayTimer=null),this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),!this.actionOverlay)return;this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null;let e=this.actionOverlayPreviousFocus;this.actionOverlayPreviousFocus=null,e?.isConnected&&e.focus()}applyHeight(e){let t=this.container?.querySelector("iframe");if(!t)return;let n=Math.max(0,Math.min(Math.ceil(e),2e3));t.style.height=`${n}px`}};function et(r,e){let t=z;return new t(r,{reporter:e})}var tt=Symbol.for("@flopay/js.telemetry.bridge.v1");function rt(r,e,t){let n=()=>e?.now()??t();Object.defineProperty(r,tt,{configurable:!1,enumerable:!1,writable:!1,value:{error:s=>e?.error(s),log:s=>e?.log(s),performance:s=>e?.performance(s),terminal:s=>e?.terminal(s),now:n,elapsed:s=>Math.max(0,n()-s),setCheckoutContext:s=>e?.setCheckoutContext(s),beginCheckout:(s={})=>e?.beginCheckout(s)??n(),disable:()=>e?.disable(),subscribe:s=>e?.subscribe(s)??(()=>{}),flush:()=>e?.flush()??Promise.resolve()}})}function nt(r){return r[tt]}var ee=class{now(){return this.telemetryReporter?.now?.()??R()}constructor(e,t,n){this.provider=e,this.config=t,this.telemetryReporter=n??new S({billingApiUrl:(0,k.resolveBillingApiUrl)(t.billingApiUrl),sdkVersion:k.SDK_VERSION,enabled:t.telemetry!==!1}),rt(this,this.telemetryReporter,R)}cardCapture(e){return this.telemetryReporter?.log({name:"vault.capture.requested",stage:"vault_request",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?et({sessionId:e?.sessionId,captureMethod:e?.captureMethod},this.telemetryReporter):new z({sessionId:e?.sessionId,captureMethod:e?.captureMethod,telemetry:!1})}async retrieveSession(e,t){if(!e)throw new k.FloPayError("sessionId is required to retrieve a session.","validation_error",{param:"sessionId"});let n=await this.retrieveUnifiedSession(e,t);if(!n.data.session)throw new k.FloPayError("Session not found","api_error");return n.data.session}async retrieveUnifiedSession(e,t){if(!e)throw new k.FloPayError("sessionId is required.","validation_error",{param:"sessionId"});let n=(0,k.resolveBillingApiUrl)(t??this.config.billingApiUrl),o=this.now();this.telemetryReporter?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let s,i,a=u=>{if(s===void 0)return;let d=s,m=i;s=void 0,i=void 0,this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:u,attempt:m}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:d,durationMode:"machine",requestCategory:"session_read",statusClass:u,attempt:m})},c=Je(n,{now:()=>this.telemetryReporter?.now()??R(),onFirstByte:(u,d)=>{s=u,i=d},onRetry:(u,d)=>{this.telemetryReporter?.log({name:"operation.retry",stage:u==="session_read"?"session_read":"processing",requestCategory:u,attempt:d})}});try{let u=await c.getUnifiedCheckoutSession(e);return a("2xx"),this.telemetryReporter?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:"2xx"}),this.telemetryReporter?.log({name:"checkout.data.ready",stage:"checkout_data_ready"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-o,durationMode:"machine",requestCategory:"session_read",statusClass:"2xx"}),u}catch(u){let d=(0,k.classifyTelemetryFailure)(u,u instanceof k.FloPayError&&u.code==="checkout_processing_timeout"?"REQUEST_TIMEOUT":"NETWORK_REQUEST_FAILED");throw a(d.statusClass),this.telemetryReporter?.error({...d,stage:"session_read",provider:"flo",paymentMethodCategory:"unknown"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-o,durationMode:"machine",requestCategory:"session_read",statusClass:d.statusClass}),u}}getRawProvider(){return this.provider.getRawProvider()}destroy(){this.telemetryReporter?.log({name:"checkout.unmount",stage:"unmount"}),this.telemetryReporter?.destroy(),this.provider.destroy()}};function ot(r,e,t){let n=ee;return new n(r,e,t)}var D=require("@flopay/shared");var we=require("@flopay/shared"),st=require("@stripe/stripe-js"),it=new WeakSet;function at(r){return r instanceof we.FloPayError&&it.has(r)}function Ee(r){switch(r){case"night":return"night";case"flat":return"flat";default:return"stripe"}}function ct(r){return{...r,theme:Ee(r.theme)}}var Y=class{constructor(){this.name="stripe";this.stripe=null}async initialize(e){if(typeof window>"u")return;let t=await(0,st.loadStripe)(e.publishableKey,{locale:e.locale??"auto"});if(!t){let n=new we.FloPayError("Failed to initialize Stripe. Check your publishable key.","authentication_error");throw it.add(n),n}this.stripe=t}getRawProvider(){return this.stripe}destroy(){this.stripe=null}};var ut=new Map;function Me(r){return Array.isArray(r)?r.map(Me):r&&typeof r=="object"?Object.fromEntries(Object.entries(r).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Me(t)])):r}function lr(r,e){return JSON.stringify([r,(0,D.resolveBillingApiUrl)(e?.billingApiUrl),e?.telemetry!==!1,e?.locale??"auto",e?.apiVersion??null,Me(e?.appearance??null)])}var he=new Map;async function lt(r,e){if(!r){let a=new S({billingApiUrl:(0,D.resolveBillingApiUrl)(e?.billingApiUrl),sdkVersion:D.SDK_VERSION,enabled:e?.telemetry!==!1});throw a.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),a.flush().catch(()=>{}).finally(()=>a.destroy()),new D.FloPayError("A publishable key is required to initialize FloPay.","validation_error",{param:"publishableKey"})}let t=lr(r,e),n=ut.get(t);if(n)return e?.telemetry!==!1&&nt(n)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),n;let o=he.get(t);if(o)return o;let s={...e,publishableKey:r},i=(async()=>{let a=new S({billingApiUrl:(0,D.resolveBillingApiUrl)(s.billingApiUrl),sdkVersion:D.SDK_VERSION,enabled:s.telemetry!==!1}),c=a.now();a.log({name:"sdk.initialize.started",stage:"sdk_initialize"}),a.log({name:"sdk.cache.miss",stage:"sdk_initialize"}),a.log({name:"provider.load.started",stage:"provider_load",provider:"stripe"});let u=new Y,d=a.now();try{await u.initialize(s)}catch(g){throw a.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:at(g)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),a.destroy(),g}let m=a.now();a.log({name:"provider.ready",stage:"provider_ready",provider:"stripe"}),a.log({name:"provider.availability.checked",stage:"provider_ready",provider:"stripe"}),a.log({name:"sdk.initialize.ready",stage:"sdk_initialize"}),a.performance({stage:"sdk_initialize",durationMs:m-c,durationMode:"machine",provider:"stripe"}),a.performance({stage:"provider_ready",durationMs:m-d,durationMode:"machine",provider:"stripe"});let p=ot(u,s,a);return ut.set(t,p),p})();he.set(t,i);try{return await i}finally{he.get(t)===i&&he.delete(t)}}0&&(module.exports={FloPay,PaymentAPI,PciVaultCardCapture,SESSION_CREATE_TELEMETRY,StripeAdapter,cacheSessionDisplayData,clearSessionDisplayData,createCheckoutSession,createCheckoutSessionWithRetries,dropThirdPartyOnlyError,getSessionDisplayData,loadFloPay,toStripeAppearance,toStripeAppearanceTheme});
1
+ "use strict";var Se=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var vt=Object.getOwnPropertyNames;var Tt=Object.prototype.hasOwnProperty;var bt=(t,e)=>{for(var r in e)Se(t,r,{get:e[r],enumerable:!0})},St=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of vt(e))!Tt.call(t,o)&&o!==r&&Se(t,o,{get:()=>e[o],enumerable:!(n=Ct(e,o))||n.enumerable});return t};var _t=t=>St(Se({},"__esModule",{value:!0}),t);var wr={};bt(wr,{FloPay:()=>oe,PaymentAPI:()=>re,PciVaultCardCapture:()=>H,SESSION_CREATE_TELEMETRY:()=>Ee,StripeAdapter:()=>Q,cacheSessionDisplayData:()=>z,clearSessionDisplayData:()=>pe,completeSavedCardNextAction:()=>ht,createCheckoutSession:()=>Ne,createCheckoutSessionWithRetries:()=>je,createSavedCardActionAbortedError:()=>se,dropThirdPartyOnlyError:()=>gt.dropThirdPartyOnlyError,getSessionDisplayData:()=>me,loadFloPay:()=>mt,runSavedCardChallenge:()=>xe,toStripeAppearance:()=>X.toStripeAppearance,toStripeAppearanceTheme:()=>X.toStripeAppearanceTheme});module.exports=_t(wr);var gt=require("@flopay/shared");var C=require("@flopay/shared");function Z(t){return typeof t=="string"&&t.trim()?t:void 0}function ee(t){if(typeof t=="string")return t.trim()?t:void 0;if(Array.isArray(t))return t.filter(r=>typeof r=="string"&&r.trim().length>0).join("; ")||void 0}function O(t=12e3){let e=Number.isFinite(t)&&t>=0?t:12e3,r=new AbortController,n=setTimeout(()=>r.abort(),e);return{signal:r.signal,clear:()=>clearTimeout(n)}}function wt(){return Object.assign(new Error("The operation was aborted."),{name:"AbortError"})}function G(t,e){let r=150*2**t,n=Math.round(r*(.75+Math.random()*.5));return new Promise((o,s)=>{let i,a=()=>e.removeEventListener("abort",c),c=()=>{i!==void 0&&clearTimeout(i),a(),s(wt())};if(e.aborted){c();return}i=setTimeout(()=>{a(),o()},n),e.addEventListener("abort",c,{once:!0})})}var Rt="flopay_session_display:";var ue=new Map;function de(t){return`${Rt}${t}`}function _e(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function z(t,e,r){if(!t)return;let n=r?.ttlMs??36e5,o={data:e,expiresAt:Date.now()+n},s=_e();if(s)try{s.setItem(de(t),JSON.stringify(o));return}catch{}ue.set(t,o)}function me(t){if(!t)return null;let e=_e();if(e)try{let n=e.getItem(de(t));if(n){let o=JSON.parse(n);if(o&&typeof o.expiresAt=="number"&&o.expiresAt>Date.now())return o.data;e.removeItem(de(t))}}catch{}let r=ue.get(t);if(r){if(r.expiresAt>Date.now())return r.data;ue.delete(t)}return null}function pe(t){if(!t)return;ue.delete(t);let e=_e();if(e)try{e.removeItem(de(t))}catch{}}var R=require("@flopay/shared"),At="/v1/sdk-telemetry/events",we=16,kt=64,Et=1500,Oe=1e3,Mt=64,It="00000000-0000-4000-8000-000000000000",Pt={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function Y(){try{return globalThis.crypto.randomUUID()}catch{let t=new Uint8Array(16);try{globalThis.crypto.getRandomValues(t)}catch{for(let r=0;r<t.length;r+=1)t[r]=Math.floor(Math.random()*256)}t[6]=(t[6]??0)&15|64,t[8]=(t[8]??0)&63|128;let e=[...t].map(r=>r.toString(16).padStart(2,"0")).join("");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20)}`}}function xt(t){try{return new TextEncoder().encode(t).byteLength}catch{return t.length}}function Dt(t){return JSON.stringify([t.code,t.failureCategory,t.reason,t.stage,t.provider,t.attempt,t.statusClass,t.requestCategory,t.paymentMethodCategory,t.walletType,t.operationOutcome,t.checkoutMode,t.layout,t.inAppBrowser,t.appFamily,t.popupCapability,t.presentationMode,t.terminalReason])}function A(){return globalThis.performance?.now()??0}var _=class{constructor(e){this.ingestionDisabled=!1;this.queue=[];this.sequence=0;this.flushTimer=null;this.flushInFlight=null;this.reportedFailures=new Map;this.checkoutContext={};this.checkoutStartedAt=null;this.destroyed=!1;this.observers=new Set;this.pageExitHandler=()=>{this.drainQueue()};this.visibilityHandler=()=>{document.visibilityState==="hidden"&&this.flush()};this.eventCounts={technical_error:0,lifecycle:0,expected_outcome:0,performance:0};this.endpoint=`${e.billingApiUrl.replace(/\/+$/,"")}${At}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=Y(),this.merchantEnabled=e.enabled!==!1,this.clock=e.clock??A,this.browserTransportAvailable=typeof window<"u"&&typeof document<"u",this.browserTransportAvailable&&(window.addEventListener("pagehide",this.pageExitHandler),document.addEventListener("visibilitychange",this.visibilityHandler))}log(e){this.notify({...e,class:"lifecycle"}),this.canCollect()&&this.enqueue((0,R.buildTelemetryLogEvent)({...this.checkoutContext,...e,eventId:Y(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let r=(0,R.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:It,sequence:0}),n=Dt(r),o=this.now();this.pruneReportedFailures(o);let s=this.reportedFailures.get(n);if(s!==void 0&&o>=s&&o-s<Oe){this.log({name:"operation.deduplicated",stage:e.stage,provider:e.provider,paymentMethodCategory:e.paymentMethodCategory,attempt:e.attempt,inAppBrowser:e.inAppBrowser,appFamily:e.appFamily,popupCapability:e.popupCapability,presentationMode:e.presentationMode,terminalReason:e.terminalReason});return}this.rememberReportedFailure(n,o),this.enqueue((0,R.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:Y(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue((0,R.buildTelemetryPerformanceEvent)({...this.checkoutContext,...e,eventId:Y(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue((0,R.buildTelemetryTerminalEvent)({...this.checkoutContext,...e,eventId:Y(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let r=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({...e,stage:"total_journey",durationMs:Math.max(0,this.now()-r),durationMode:"total"})}}now(){try{return this.clock()}catch{return A()}}subscribe(e){return this.destroyed?()=>{}:(this.observers.add(e),()=>this.observers.delete(e))}notify(e){if(!this.destroyed)for(let r of this.observers)try{r(e)}catch{}}pruneReportedFailures(e){for(let[r,n]of this.reportedFailures)(e<n||e-n>=Oe)&&this.reportedFailures.delete(r)}rememberReportedFailure(e,r){for(;this.reportedFailures.size>=Mt;){let n=this.reportedFailures.keys().next();if(n.done)break;this.reportedFailures.delete(n.value)}this.reportedFailures.set(e,r)}setCheckoutContext(e){this.checkoutContext={checkoutMode:e.checkoutMode,layout:e.layout}}beginCheckout(e={}){return this.canCollect()?(this.drainQueue(),this.setCheckoutContext(e),this.sequence=0,this.reportedFailures.clear(),this.eventCounts={technical_error:0,lifecycle:0,expected_outcome:0,performance:0},this.checkoutStartedAt=this.now(),this.checkoutStartedAt):0}enqueue(e){if(this.canCollect()&&!(this.queue.length>=kt||this.eventCounts[e.class]>=Pt[e.class])){if(this.eventCounts[e.class]+=1,this.queue.push(e),this.queue.length>=we){this.flush();return}this.scheduleFlush()}}canCollect(){return this.browserTransportAvailable&&this.merchantEnabled&&!this.ingestionDisabled&&!this.destroyed}async flush(){if(this.flushInFlight!==null)return this.flushInFlight;if(!this.browserTransportAvailable||this.destroyed||this.ingestionDisabled||this.queue.length===0)return;this.clearFlushTimer();let e=this.queue.splice(0,we);return this.flushInFlight=this.sendBatch(e).finally(()=>{this.flushInFlight=null,this.queue.length>0&&this.scheduleFlush()}),this.flushInFlight}destroy(){this.destroyed||(this.drainQueue(),this.destroyed=!0,this.clearFlushTimer(),this.browserTransportAvailable&&(window.removeEventListener("pagehide",this.pageExitHandler),document.removeEventListener("visibilitychange",this.visibilityHandler)),this.queue.splice(0),this.reportedFailures.clear(),this.observers.clear())}disable(){this.merchantEnabled=!1,this.queue.splice(0),this.reportedFailures.clear(),this.clearFlushTimer()}drainQueue(){if(!(!this.browserTransportAvailable||this.destroyed||this.ingestionDisabled||this.queue.length===0))for(this.clearFlushTimer();this.queue.length>0;){let e=this.queue.splice(0,we);this.sendBatch(e)}}async sendBatch(e){if(!this.browserTransportAvailable||this.ingestionDisabled)return;let r=(0,R.serializeTelemetryBatch)(e,{correlationId:this.correlationId,sdkPackage:this.sdkPackage,sdkVersion:this.sdkVersion,batchId:Y()});if(xt(r)>R.TELEMETRY_MAX_BATCH_BYTES)return;let n=typeof AbortController>"u"?null:new AbortController,o=null;try{let s=fetch(this.endpoint,{method:"POST",headers:{"content-type":"text/plain;charset=UTF-8"},body:r,credentials:"omit",keepalive:!0,referrerPolicy:"no-referrer",signal:n?.signal}).then(async c=>{if(c.status!==202)return null;let l=null;try{l=await c.json()}catch{}return l?.status==="disabled"?"disabled":null}).catch(()=>null),i=new Promise(c=>{o=setTimeout(()=>{n?.abort(),c(null)},Et)});await Promise.race([s,i])==="disabled"&&this.disableFromIngestion()}catch{}finally{o&&clearTimeout(o)}}disableFromIngestion(){this.ingestionDisabled=!0,this.queue.splice(0),this.reportedFailures.clear(),this.clearFlushTimer()}scheduleFlush(){this.flushTimer||this.destroyed||this.ingestionDisabled||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush()},0))}clearFlushTimer(){this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null)}},Fe=Symbol.for("@flopay/js.telemetry.reporter-factory.v1"),Ue=globalThis;Ue[Fe]===void 0&&Object.defineProperty(Ue,Fe,{configurable:!0,enumerable:!1,writable:!1,value:t=>new _(t)});var Re=5,qe=new WeakSet;function Ot(t){(typeof t=="object"&&t!==null||typeof t=="function")&&qe.add(t)}function Ft(t){return(typeof t=="object"&&t!==null||typeof t=="function")&&qe.has(t)}function Ut(t,e){let r=e?.error,n=Z(e?.code)??Z(r?.code)??`http_${t}`,o=ee(e?.message)??ee(r?.message)??qt(n,t);return new C.FloPayError(o,"api_error",{code:n,statusCode:t})}function qt(t,e){switch(t){case"CouponLimitExceeded":return`Too many coupon codes \u2014 a checkout session accepts at most ${Re}.`;case"CouponCurrencyUnsupported":return"One of the applied coupons has no price configured for the cart currency.";default:return`Failed to create checkout session (HTTP ${e}).`}}async function Le(t,e,r){let{billingApiUrl:n,checkoutBaseUrl:o,items:s=[],subscriptions:i=[],products:a,account:c,successUrl:l,cancelUrl:d,checkoutMode:m="confirm",captureMethod:p,couponCodes:g=[],checkoutMetadata:y,tagsData:v,redirectParams:h={},setCookie:S=!0,clientId:w,currency:f,utmMetadata:P,idempotencyKey:K}=t,E=(0,C.resolveIdempotencyKey)(K);if(g.length>Re)throw new C.FloPayError(`Too many coupon codes \u2014 a checkout session accepts at most ${Re}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let M=a??(0,C.foldIntoProducts)(s,i);(0,C.assertCaptureMethodEligible)({captureMethod:p,products:M});let x=(0,C.resolveSessionCurrency)(f,s,i,M);if(!x)throw new C.FloPayError("currency is required: pass `currency` on the session, or include a `currency` on the first item/subscription/product.","validation_error",{code:"CurrencyRequired",param:"currency"});let D={clientId:w,checkoutVersion:C.SDK_VERSION,successUrl:l,cancelUrl:d,currency:x,checkoutMode:m,products:M.map(q=>(0,C.buildProductPayload)(q,x)),accountData:{userId:c.userId,firstName:c.firstName??null,lastName:c.lastName??null,email:c.email,country:c.country??null,gender:c.gender??null,city:c.city??null,state:c.state??null,zip:c.zip??null,addressLine1:c.addressLine1??null,addressLine2:c.addressLine2??null},couponCodes:g};p==="manual"&&(D.captureMethod=p),y!==void 0&&(D.checkoutMetadata=y),v&&(D.tagsData=v),P&&P.length>0&&(D.utmMetadata=P);let Te=`${n.replace(/\/+$/,"")}/v1/checkouts/sessions`,De={"Content-Type":"application/json"};E&&(De[C.IDEMPOTENCY_KEY_HEADER]=E);let $,ie,ft={method:"POST",headers:De,body:JSON.stringify(D),signal:e},ae;try{r?.startAttempt(),ae=await fetch(Te,ft)}catch(q){throw Ot(q),q}try{r?.record(ae.status)}catch{}$=ae.status;try{ie=await ae.json()}catch{}if($>=400)throw Ut($,ie);if($===201){let q=ie?.data?.uuid,be=ie?.data?.nonce;if(!q)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!be)throw new C.FloPayError("Checkout session created but no `nonce` was returned by the billing API. Upgrade the billing service to TeamFloPay/backend#640 or later.","api_error",{code:"MissingCheckoutSessionToken"});(M.length>0||x)&&z(q,{currency:x,products:M.map(b=>({code:b.code??b.providerItemId??b.providerPlanId,type:b.type,name:b.name??b.itemName??b.providerItemName??b.subscriptionName??b.providerPlanName??null,totalAmount:b.totalAmount,overrideAmount:b.overrideAmount,currency:b.currency??x}))});let ce=new URL(`${o.replace(/\/+$/,"")}/secure`);ce.searchParams.set("id",q);for(let[b,le]of Object.entries(h))ce.searchParams.set(b,le);if(S&&typeof window<"u"&&typeof document<"u"){let b=JSON.stringify({origin_url:d}),le=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(b)}; domain=.${le}; path=/; max-age=3600; SameSite=Lax; Secure;`,document.cookie=`flopay_checkout_token=${encodeURIComponent(be)}; domain=.${le}; path=/; max-age=3600; SameSite=Lax; Secure;`}return typeof window<"u"&&(window.location.href=ce.toString()),{status:201,redirectUrl:ce.toString(),nonce:be}}return $===204?(typeof window<"u"&&(window.location.href=l),{status:204}):{status:$}}async function Ne(t){let e=ze(t),r=Ve(e),n=O(t.timeoutMs);try{let o=await Le(t,n.signal,r);return r.commit(),Be(e,o),o}catch(o){throw r.commit(),ye(e,o),o}finally{n.clear(),W(e.reporter)}}function Ve(t){let e=!1,r=t.startedAt,n;return{startAttempt(){r=t.reporter.now()},record(o){n={status:o,durationMs:Math.max(0,t.reporter.now()-r),attempt:t.attempt}},commit(){if(e||!n)return;e=!0;let o=(0,C.telemetryStatusClass)(n.status);t.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:o,attempt:n.attempt}),t.reporter.performance({stage:"session_first_byte",durationMs:n.durationMs,durationMode:"machine",requestCategory:"session_create",statusClass:o,attempt:n.attempt})}}}function ze(t){let e=new _({billingApiUrl:t.billingApiUrl,sdkVersion:C.SDK_VERSION,enabled:t.telemetry!==!1}),r=e.now();return e.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"}),{reporter:e,startedAt:r,attempt:0}}function Be(t,e){let r=(0,C.telemetryStatusClass)(e.status);t.reporter.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:r}),t.reporter.performance({stage:"session_create",durationMs:t.reporter.now()-t.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:r,attempt:t.attempt})}function ye(t,e){let{reporter:r}=t,n=(0,C.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(r.performance({stage:"session_create",durationMs:r.now()-t.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:n.statusClass,attempt:t.attempt}),e instanceof C.FloPayError&&e.type==="validation_error"){r.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"});return}if(n.statusClass==="4xx"){r.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create",statusClass:"4xx"});return}r.error({...n,stage:"session_create",requestCategory:"session_create"})}function W(t){t.flush().catch(()=>{}).finally(()=>t.destroy())}async function je(t){let{maxRetries:e=2,...r}=t,n=ze(t),o=Ve(n);if(!Number.isFinite(e)||!Number.isInteger(e)||e<0||e>=3)throw n.reporter.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"}),W(n.reporter),new Error(`Number of retries must be an integer between 0 and ${2}`);let s={...r,idempotencyKey:(0,C.resolveIdempotencyKey)(r.idempotencyKey)},i=O(r.timeoutMs),a;for(let c=0;c<=e;c++){n.attempt=c;try{let l=await Le(s,i.signal,o);return o.commit(),Be(n,l),i.clear(),W(n.reporter),l}catch(l){a=l;let d=l instanceof Error&&l.name==="AbortError",m=Ft(l),p=l instanceof C.FloPayError&&l.code===C.IDEMPOTENCY_IN_PROGRESS_CODE;if((d||m||p)&&!i.signal.aborted&&c<e){n.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:c+1});try{await G(c,i.signal)}catch(g){throw o.commit(),ye(n,g),i.clear(),W(n.reporter),g}continue}throw o.commit(),ye(n,l),i.clear(),W(n.reporter),l}}throw o.commit(),ye(n,a),i.clear(),W(n.reporter),a??new Error("Unknown error during checkout session creation")}var k=require("@flopay/shared");var u=require("@flopay/shared");function Lt(t){return t==="on_session"||t==="off_session"}function Nt(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.paymentMethodType=="string"&&typeof e.reason=="string"}var Vt="x-flopay-process-result-source",zt="status";function He(t){return t?.result==="DECLINE"||t?.result==="ERROR"}var Bt=50,B=new Map;function jt(t,e){return B.get(t)?.has(e)===!0}function Ht(t,e){let r=B.get(t)??new Set;if(r.add(e),B.delete(t),B.set(t,r),B.size>Bt){let n=B.keys().next().value;n!==void 0&&B.delete(n)}}function Kt(t){let e=t?.threeDSecureActionResultTokenId;if(typeof e=="string"&&e.length>0)return e;if(t?.gateway==="paypal"&&t.type!=="paypal_setup_token"&&typeof t.id=="string"&&t.id.length>0)return t.id}var Ke=0,$e=500,he=15e3,Ge=15e3,$t=3e3,Gt=1e4,Yt=1e4;function Ce(t){return typeof t=="object"&&t!==null}function N(t,e){return Z(t?.[e])}function Ye(t,e){return ee(t?.[e])}function Wt(t,e){let r=t?.[e];return typeof r=="number"&&Number.isFinite(r)?r:void 0}function ke(t,e){return e?new Promise((r,n)=>{let o=()=>{clearTimeout(s),n(e.reason??Object.assign(new Error("The operation was aborted."),{name:"AbortError"}))},s=setTimeout(()=>{e.removeEventListener("abort",o),r()},t);e.aborted?o():e.addEventListener("abort",o,{once:!0})}):new Promise(r=>setTimeout(r,t))}function Ae(t){return t instanceof Error&&t.name==="AbortError"}function I(){return new u.FloPayError(u.CHECKOUT_PROCESSING_TIMEOUT_MESSAGE,"api_error",{code:"checkout_processing_timeout"})}async function L(t,e){let r=await t.json().catch(()=>null),n=Ce(r?.error)?r.error:null,o=Ye(r,"message")??Ye(n,"message")??e,s=N(r,"code")??N(r,"gatewayErrorCode")??N(n,"code")??`http_${t.status}`;return new u.FloPayError(o,"api_error",{code:s,statusCode:t.status})}async function Jt(t){if(t.status!==403)return!1;let e=await t.clone().json().catch(()=>null),r=Ce(e?.error)?e.error:null;return(N(e,"code")??N(r,"code"))==="verification_required"}function Qt(t){if(!(!Ce(t)||typeof t.required!="boolean"))return{required:t.required,provider:"turnstile"}}async function Xt(t){let e=t.status===400?await t.clone().json().catch(()=>null):null;return(0,u.classifyPaymentRejection)(t.status,e)}function We(t){return t===400||t===422}var fe=2;async function ge(t,e,r=fe,n,o){let s;for(let i=0;;i++)try{return o?.(i),await fetch(t,e)}catch(a){if(e?.signal?.aborted||a instanceof Error&&a.name==="AbortError")throw a;if(s=a,i>=r)throw s;try{n?.(i+1)}catch{}await ke(150*2**i,e?.signal??void 0)}}var Ee=Symbol.for("@flopay/js.session-create.telemetry.v1");function Zt(t){return t[Ee]}function er(t){return"now"in t||"onFirstByte"in t||"onSessionCreateFailure"in t||"onRetry"in t}function Qe(t){let e=(0,u.isCardHolderNamePlaceholder)(t.firstName,t.lastName);return{userId:t.userId,firstName:e?null:t.firstName??null,lastName:e?null:t.lastName??null,email:t.email,country:t.country??null,gender:t.gender??null,city:t.city??null,state:t.state??null,zip:t.zip??null,addressLine1:t.addressLine1??null,addressLine2:t.addressLine2??null}}function Xe(t,e){e.checkoutMetadata!==void 0&&(t.checkoutMetadata=e.checkoutMetadata),e.tagsData&&(t.tagsData=e.tagsData),e.utmMetadata&&e.utmMetadata.length>0&&(t.utmMetadata=e.utmMetadata),e.avsCheck!==void 0&&(t.avsCheck=e.avsCheck),e.checkoutType&&(t.checkoutType=e.checkoutType),e.checkoutLayout&&(t.checkoutLayout=e.checkoutLayout),e.avsConfig&&(t.avsConfig=e.avsConfig)}function tr(t,e){let r={clientId:t.clientId,checkoutVersion:u.SDK_VERSION,successUrl:t.successUrl,cancelUrl:t.cancelUrl,currency:e,checkoutMode:"full",deferDataAttachment:!0};return t.captureMethod==="manual"&&(r.captureMethod=t.captureMethod),t.account.country&&(r.accountData={country:t.account.country}),Xe(r,t),r}function Je(t,e,r){return{currency:e,products:r.map(n=>(0,u.buildProductPayload)(n,e)),couponCodes:t.couponCodes??[],accountData:Qe(t.account)}}function rr(t,e,r){return{currency:e,products:r.map(n=>(0,u.buildProductPayload)(n,e)),couponCodes:t.couponCodes??[]}}function nr(t){let e={},r=(0,u.isCardHolderNamePlaceholder)(t.firstName,t.lastName);for(let[n,o]of Object.entries(t)){if(r&&n.endsWith("Name")||typeof o!="string")continue;let s=o.trim();s&&(e[n]=s)}return{accountData:e}}var j=class j{constructor(e,r={}){this.baseUrl=e.replace(/\/+$/,"");let n=er(r);this.telemetryHooks=n?r:void 0,this.directTelemetry=n||r.telemetry===!1?void 0:new _({billingApiUrl:this.baseUrl,sdkVersion:u.SDK_VERSION})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,r,n,o,s="unknown"){let i=(0,u.classifyTelemetryFailure)(e,r);this.directTelemetry?.error({...i,stage:n,requestCategory:o,paymentMethodCategory:s})}reportAccountSnapshotFailure(e,r){let n=(0,u.classifyTelemetryFailure)(e,"NETWORK_REQUEST_FAILED");if(r==="best_effort"&&n.errorCode==="REQUEST_TIMEOUT"){this.directTelemetry?.log({name:"operation.fallback",stage:"processing",requestCategory:"account_snapshot",statusClass:"timeout"});return}this.directTelemetry?.error({...n,stage:"processing",requestCategory:"account_snapshot",paymentMethodCategory:"unknown"})}telemetryTimestamp(){try{return this.telemetryHooks?.now?.()??this.directTelemetry?.now()??A()}catch{return A()}}beginDirectTelemetryCheckout(e){!this.directTelemetry||this.directTelemetryCheckoutId===e||(this.directTelemetryCheckoutId=e,this.directTelemetry.beginCheckout())}beginDirectTelemetryOperation(){this.directTelemetry&&(this.directTelemetryCheckoutId=void 0,this.directTelemetry.beginCheckout())}adoptDirectTelemetryCheckout(e){e&&(this.directTelemetryCheckoutId=e)}async getCheckoutSession(e,r){return this.fetchCheckoutSession(e,r)}async fetchCheckoutSession(e,r,n=!0,o){this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp(),i=s,a=0;this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let c={[u.FLO_SDK_VERSION_HEADER]:u.SDK_VERSION};r&&(c["x-checkout-session-token"]=r);try{let l=await ge(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:c,signal:o},fe,g=>{this.telemetryHooks?.onRetry?.("session_read",g),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:g})},g=>{a=g,i=this.telemetryTimestamp()}),d=Math.max(0,this.telemetryTimestamp()-i);try{this.telemetryHooks?.onFirstByte?.(d,a)}catch{}let m=`${Math.floor(l.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:m,attempt:a}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:d,durationMode:"machine",requestCategory:"session_read",statusClass:m,attempt:a}),!l.ok)throw await L(l,"Failed to get checkout session");let p=await l.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:m}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"session_read",statusClass:m}),{...p,data:this.mergeCachedDisplayData(p.data)}}catch(l){throw n&&this.directTelemetry?.error({...(0,u.classifyTelemetryFailure)(l,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),l}}cacheSessionDisplayData(e,r,n){z(e,r,n)}clearSessionDisplayData(e){pe(e)}async getVaultCapture(e,r){let n=`${this.baseUrl}\0${e}\0${r??""}`,o=j.activeVaultCaptureRequests.get(n);if(o!==void 0)return o;let s=this.requestVaultCapture(e,r);j.activeVaultCaptureRequests.set(n,s);try{return await s}finally{j.activeVaultCaptureRequests.get(n)===s&&j.activeVaultCaptureRequests.delete(n)}}async requestVaultCapture(e,r){let n=new AbortController,o=setTimeout(()=>n.abort(),Yt);this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"vault.capture.requested",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card"});let i={"Content-Type":"application/json"};r&&(i["x-checkout-session-token"]=r);try{let a=await ge(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:n.signal},fe,l=>{this.telemetryHooks?.onRetry?.("vault_capture",l),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:l})});if(await Jt(a))return this.directTelemetry?.performance({stage:"vault_request",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"vault_capture",paymentMethodCategory:"card",statusClass:"4xx"}),{verification:{required:!0,provider:"turnstile"}};if(!a.ok)throw await L(a,"Failed to load the secure card form");let c=await a.json();return this.directTelemetry?.performance({stage:"vault_request",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"vault_capture",paymentMethodCategory:"card",statusClass:"2xx"}),this.toVaultBlock(c)}catch(a){let c=n.signal.aborted?new u.FloPayError("Timed out while loading the secure card form. Please try again.","api_error",{code:"vault_capture_timeout"}):a;throw this.reportDirectFailure(c,"VAULT_LOAD_FAILED","vault_request","vault_capture","card"),c}finally{clearTimeout(o)}}async getUnifiedCheckoutSession(e,r){let n=await this.getCheckoutSession(e,r);return this.normalizeCheckoutSessionResponse(n)}async getUnifiedCheckoutSessionForRecovery(e,r,n){let o=await this.fetchCheckoutSession(e,r,!1,n);return this.normalizeCheckoutSessionResponse(o)}normalizeCheckoutSessionResponse(e){let r=this.normalizeRawSession(e.data),n=e.vault;return n&&r.data.session&&(r.data.session.vault=this.toVaultBlock(n)),r}async processPayment(e,r,n){this.beginDirectTelemetryCheckout(r.sessionId);let o=r.paymentMethodCategory??"unknown";if(!r.nonce)throw this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:o}),new u.FloPayError("processPayment requires `nonce` \u2014 pass the value returned from session creation.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.processing.started",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:o});let{nonce:i,paymentMethodCategory:a,...c}=r,l=Kt(r.tokenizedData),d;try{d=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(r.sessionId)}/process`,{method:"POST",headers:{"Content-Type":"application/json","x-checkout-session-token":i},body:JSON.stringify(c)})}catch(m){if(Ae(m))throw this.reportDirectFailure(m,"PAYMENT_PROCESSING_FAILED","processing","process_payment",o),m;d=await this.reconcileProcessPayment(r.sessionId,{...n,nonce:i,paymentMethodCategory:o,submittedIntentId:l})}if(!d.ok&&d.status!==202){let m=await Xt(d);return m?this.directTelemetry?.terminal({outcome:m,stage:"processing",requestCategory:"process_payment",statusClass:"4xx",paymentMethodCategory:o}):this.directTelemetry?.error({errorCode:"PAYMENT_PROCESSING_FAILED",stage:"processing",requestCategory:"process_payment",statusClass:(0,u.telemetryStatusClass)(d.status),failureCategory:d.status>=500?"server_error":void 0,paymentMethodCategory:o}),d}try{let m=await this.resolveProcessResponse(d,r.sessionId,{...n,nonce:i,paymentMethodCategory:o,submittedIntentId:l});return this.directTelemetry?.log({name:"payment.processing.completed",stage:"processing",requestCategory:"process_payment",statusClass:(0,u.telemetryStatusClass)(m.status),paymentMethodCategory:o}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"process_payment",statusClass:(0,u.telemetryStatusClass)(m.status),paymentMethodCategory:o}),m}catch(m){throw m instanceof u.FloPayError&&m.code==="checkout_processing_timeout"||this.reportDirectFailure(m,"PAYMENT_PROCESSING_FAILED","processing","process_payment",o),m}}async patchAccountSnapshot(e,r,n,o){this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.state_transition",stage:"processing",requestCategory:"account_snapshot"});let i=o?.timeoutMs??Gt,a=new AbortController,c=()=>a.abort();o?.signal&&(o.signal.aborted?a.abort():o.signal.addEventListener("abort",c,{once:!0}));let l=setTimeout(()=>a.abort(),i);try{let d;try{d=await ge(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/account`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":r},body:JSON.stringify(n),signal:a.signal},fe,m=>{this.telemetryHooks?.onRetry?.("account_snapshot",m),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:m})})}finally{clearTimeout(l),o?.signal?.removeEventListener("abort",c)}if(!d.ok)throw await L(d,"Failed to persist account snapshot");this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"account_snapshot",statusClass:"2xx"})}catch(d){throw this.reportAccountSnapshotFailure(d,o?.telemetryMode??"blocking"),d}}async createSessionIntent(e,r,n,o){if(!r)throw new u.FloPayError("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let s=n,i=s.paymentMethodType,a=typeof i=="string"&&i.trim().toLowerCase()==="card",c=typeof i=="string"&&i.length>0&&!a&&(typeof s.paymentMethodId=="string"||s.paymentMethodId===null),l=s.provider==="stripe"&&(s.paymentMethodCategory==="wallet"||s.paymentMethodCategory==="apm")&&(s.intentKind==="payment"||s.intentKind==="setup"),d=s.provider==="paypal"&&s.paymentMethodCategory==="wallet"&&s.paymentMethodId===null&&(s.paymentMethodType==="paypal"&&s.intentKind==="payment"||s.paymentMethodType===u.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&(s.intentKind==="payment"||s.intentKind==="setup"));if(!c||!l&&!d)throw new u.FloPayError("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let m=s.authorizationAttemptId;if(m!==void 0&&!(0,u.isUuidV4)(m))throw new u.FloPayError("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let p=(0,u.isUuidV4)(m)?m:(0,u.randomUuidV4)();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let y={"Content-Type":"application/json","x-checkout-session-token":r,[u.IDEMPOTENCY_KEY_HEADER]:o?.idempotencyKey||p},v=!1;try{let h=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:y,body:JSON.stringify({...n,authorizationAttemptId:p}),signal:o?.signal});if(!h.ok){v=!0;let D=await L(h,"Failed to create checkout intent"),Te=(0,u.classifyTelemetryFailure)(D,"PAYMENT_PROCESSING_FAILED");throw We(D.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...Te,stage:"processing",requestCategory:"intent_create"}),D}let w=(await h.json()).data;if(!w||typeof w!="object")throw new u.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let f=w,P=f.paymentMethodType,K=(f.paymentMethodCategory==="wallet"||f.paymentMethodCategory==="apm")&&typeof P=="string"&&P.trim().toLowerCase()!=="card"&&(typeof f.paymentMethodId=="string"||f.paymentMethodId===null)&&typeof f.providerObjectId=="string",E=f.provider==="stripe"&&(f.intentKind==="payment"||f.intentKind==="setup")&&typeof f.clientSecret=="string",M=f.provider==="paypal"&&f.paymentMethodCategory==="wallet"&&f.paymentMethodId===null&&(f.paymentMethodType==="paypal"&&f.intentKind==="payment"&&(f.providerObjectType==="order"||f.providerObjectType==="subscription")||f.paymentMethodType===u.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&f.intentKind==="payment"&&f.providerObjectType==="order"||f.paymentMethodType===u.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&f.intentKind==="setup"&&f.providerObjectType==="setup_token")&&f.clientSecret===null,x=f.provider===n.provider&&f.paymentMethodCategory===n.paymentMethodCategory&&f.paymentMethodType===n.paymentMethodType&&f.paymentMethodId===n.paymentMethodId&&f.intentKind===n.intentKind;if(!K||!E&&!M||!x)throw new u.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});return this.directTelemetry?.log({name:"payment.intent.completed",stage:"processing",requestCategory:"intent_create",statusClass:(0,u.telemetryStatusClass)(h.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:(0,u.telemetryStatusClass)(h.status)}),f}catch(h){throw v||this.reportDirectFailure(h,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),h}}async reportSessionIntentDecline(e,r,n,o){if(!r)throw new u.FloPayError("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let s=n,i=s.providerDeclineReason,a=s.paymentMethodType,c=s.providerIntentId,l=typeof i=="string"&&/^[a-z0-9][a-z0-9_.:-]{0,63}$/i.test(i)&&!/^(?:pm|pi|seti|tok|src|cus|sess|sk|pk)_/i.test(i),d=typeof a=="string"&&a.length>0&&a.trim().toLowerCase()!=="card"&&l,m=s.provider==="stripe"&&(s.paymentMethodCategory==="wallet"||s.paymentMethodCategory==="apm")&&(c===void 0||typeof c=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(c)),p=s.provider==="paypal"&&s.paymentMethodCategory==="wallet"&&s.paymentMethodType==="paypal"&&c===void 0;if(!d||!m&&!p)throw new u.FloPayError("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=p?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:s.paymentMethodCategory,paymentMethodType:s.paymentMethodType,providerDeclineReason:i,...typeof c=="string"?{providerIntentId:c}:{}},y=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents/decline`,{method:"POST",headers:{"Content-Type":"application/json","x-checkout-session-token":r},body:JSON.stringify(g),signal:o?.signal});if(!y.ok)throw await L(y,"Failed to report checkout decline")}async getPaymentsByEmail(e,r){this.beginDirectTelemetryOperation();let n=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"other",paymentMethodCategory:"saved"});let o=r?.page??1,s=r?.limit??1,i=new URLSearchParams({email:e,page:String(o),limit:String(s),sortField:"createdAt",sortDirection:"DESC"});try{let a=await fetch(`${this.baseUrl}/v1/payments?${i.toString()}`,{method:"GET",signal:r?.signal,keepalive:!0});if(!a.ok)throw new u.FloPayError("Failed to fetch payments","api_error",{statusCode:a.status});let c=await a.json();return this.directTelemetry?.log({name:"operation.recovery.completed",stage:"recovery",requestCategory:"other",paymentMethodCategory:"saved",statusClass:"2xx"}),this.directTelemetry?.performance({stage:"recovery",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"other",paymentMethodCategory:"saved",statusClass:"2xx"}),c}catch(a){throw this.reportDirectFailure(a,"RECOVERY_FAILED","recovery","other","saved"),a}}async createAndFetchSession(e){if((0,u.isDetachedSessionEligible)(e)){let s=e.account.email?.trim();if(s&&!(0,u.isValidEmail)(s))throw new u.FloPayError("Buyer email must be valid when supplied.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"});return(await this.createDetachedSession(e)).claimed}this.beginDirectTelemetryOperation();let r=this.telemetryTimestamp(),n=O(e.timeoutMs??12e3),o={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});try{let s=await this.createAndFetchSessionRequest(e,n.signal,o);return this.adoptDirectTelemetryCheckout(s.data.session?.id),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:o.statusClass}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-r),durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:o.attempt}),s}catch(s){throw this.reportSessionCreateFailure(s,r,o),s}finally{n.clear()}}async createAndFetchSessionRequest(e,r,n){let o=e.products??(0,u.foldIntoProducts)(e.items,e.subscriptions);(0,u.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:o});let s=(0,u.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,o);if(!s)throw new u.FloPayError("currency is required: pass `currency` on the session, or include a `currency` on the first item/subscription/product.","validation_error",{code:"CurrencyRequired",param:"currency"});let i={clientId:e.clientId,checkoutVersion:u.SDK_VERSION,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:s,checkoutMode:e.checkoutMode??"full",products:o.map(m=>(0,u.buildProductPayload)(m,s)),accountData:Qe(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(i.captureMethod=e.captureMethod),e.tokenizedData&&(i.tokenizedData=e.tokenizedData),Xe(i,e);let c=await(await this.postCheckoutSessionCreate(i,e,r,n)).json();if(c.data&&"gateways"in c.data){this.autoCacheDisplayData(c.data.uuid,e);let m=this.mergeCachedDisplayData(c.data),p=this.normalizeRawSession(m);return c.vault&&p.data.session&&(p.data.session.vault=this.toVaultBlock(c.vault)),{...p,autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}let l=c.data?.uuid;if(!l)throw new u.FloPayError("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(l,e),this.adoptDirectTelemetryCheckout(l),{...await this.getUnifiedCheckoutSession(l),autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}async postCheckoutSessionCreate(e,r,n,o){let s={"Content-Type":"application/json",[u.FLO_SDK_VERSION_HEADER]:u.SDK_VERSION},i=(0,u.resolveIdempotencyKey)(r.idempotencyKey);i&&(s[u.IDEMPOTENCY_KEY_HEADER]=i),r.checkoutMode==="auto"&&(s[u.FLO_SDK_CAPABILITIES_HEADER]=u.ASYNC_AUTO_CHECKOUT_CAPABILITY);let a,c=!1,l=Zt(r),d=(p,g,y)=>{c||(c=!0,this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:y,attempt:p}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"session_create",statusClass:y,attempt:p}))},m=p=>{try{this.telemetryHooks?.onRetry?.("session_create",p),this.directTelemetry?.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:p})}catch{}};for(let p=0;p<3;p++){o.attempt=p;let g=this.telemetryTimestamp();try{l?.onAttempt?.(p)}catch{}try{a=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:s,body:JSON.stringify(e),signal:n})}catch(h){if(o.statusClass=n.aborted||h instanceof Error&&h.name==="AbortError"?"timeout":"network_error",n.aborted||h instanceof Error&&h.name==="AbortError"||p>=2)throw h;let S=p+1;m(S),await G(p,n);continue}let y=(0,u.telemetryStatusClass)(a.status);if(o.statusClass=y,a.status===204)throw d(p,g,y),new u.FloPayError("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(a.ok){d(p,g,y);break}let v=await L(a,"Failed to create checkout session");if(v.code===u.IDEMPOTENCY_IN_PROGRESS_CODE&&p<2){m(p+1),await G(p,n);continue}throw d(p,g,y),v}if(!a)throw new TypeError("Checkout-session creation exhausted its retry budget.");return a}async createDetachedSession(e){this.beginDirectTelemetryOperation();let r=this.telemetryTimestamp(),n=O(e.timeoutMs??12e3),o={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});let s=e.products??(0,u.foldIntoProducts)(e.items,e.subscriptions);try{(0,u.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:s})}catch(h){throw n.clear(),this.reportSessionCreateFailure(h,r,o),h}let i=(0,u.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,s);if(!i)throw n.clear(),this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"}),new u.FloPayError("currency is required: pass `currency` on the session, or include a `currency` on the first item/subscription/product.","validation_error",{code:"CurrencyRequired",param:"currency"});try{Je(e,i,s)}catch(h){throw n.clear(),this.reportSessionCreateFailure(h,r,o),h}let a,c;try{if(c=await(await this.postCheckoutSessionCreate(tr(e,i),e,n.signal,o)).json(),!c.data||!("gateways"in c.data))throw new u.FloPayError("The billing API returned no session shell for a detached create. It must support `deferDataAttachment` (TeamFloPay/backend#1099).","api_error",{code:"InvalidCheckoutSessionResponse"});a=this.normalizeRawSession(this.mergeCachedDisplayData(c.data)),c.vault&&a.data.session&&(a.data.session.vault=this.toVaultBlock(c.vault))}catch(h){throw n.clear(),this.reportSessionCreateFailure(h,r,o),h}let l=a.data.session?.id??c.data.uuid??"",d=a.data.session?.clientSecret??c.data.nonce??"";if(!l||!d){n.clear();let h=new u.FloPayError("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(h,r,o),h}n.clear(),this.adoptDirectTelemetryCheckout(l),this.directTelemetry?.log({name:"session.shell.ready",stage:"session_shell",requestCategory:"session_create",statusClass:o.statusClass,paymentMethodCategory:"card"}),this.directTelemetry?.performance({stage:"session_shell",durationMs:Math.max(0,this.telemetryTimestamp()-r),durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:o.attempt,paymentMethodCategory:"card"});let m=!e.account.email?.trim(),p=O(e.timeoutMs??12e3),g=this.claimCheckoutSession(l,d,m?rr(e,i,s):Je(e,i,s),{params:e,startedAt:r,deadline:p,createAttempt:o.attempt}),y=m?void 0:g,v=(h={})=>{if(y!==void 0)return y;let S={...e,account:{...e.account,...h,email:h.email?.trim()||e.account.email?.trim()}};return(0,u.isValidEmail)(S.account.email)?(y=g.then(()=>{let w=this.telemetryTimestamp();return this.claimCheckoutSession(l,d,nr(S.account),{params:S,startedAt:w,deadline:O(e.timeoutMs??12e3),createAttempt:0})}),y.catch(()=>{}),y):Promise.reject(new u.FloPayError("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return g.catch(()=>{}),{shell:a,sessionId:l,nonce:d,claimed:g,claim:v}}async claimCheckoutSession(e,r,n,o){let s=o?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),a=o?.deadline??O(12e3),c=JSON.stringify(n),l="unknown",d=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let m;for(d=0;d<3;d++){try{m=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/claim`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":r,[u.FLO_SDK_VERSION_HEADER]:u.SDK_VERSION},body:c,signal:a.signal})}catch(y){let v=a.signal.aborted||y instanceof Error&&y.name==="AbortError";if(l=v?"timeout":"network_error",v||d>=2)throw y;try{this.telemetryHooks?.onRetry?.("session_claim",d+1),this.directTelemetry?.log({name:"operation.retry",stage:"session_claim",requestCategory:"session_claim",attempt:d+1})}catch{}await G(d,a.signal);continue}if(l=(0,u.telemetryStatusClass)(m.status),m.ok)break;throw await L(m,"Failed to attach checkout session data")}if(!m)throw new TypeError("Checkout-session claim exhausted its retry budget.");let p=await m.json();if(!p.data?.gateways)throw new u.FloPayError("The billing API returned no checkout session with gateways after claiming it.","api_error",{code:"InvalidCheckoutSessionResponse"});o?.params&&this.autoCacheDisplayData(p.data.uuid??e,o.params);let g=this.normalizeRawSession(this.mergeCachedDisplayData(p.data));return p.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(p.vault)),this.directTelemetry?.log({name:"session.claim.completed",stage:"session_claim",requestCategory:"session_claim",statusClass:l}),this.directTelemetry?.performance({stage:"session_claim",durationMs:Math.max(0,this.telemetryTimestamp()-i),durationMode:"machine",requestCategory:"session_claim",statusClass:l,attempt:d}),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:l}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"session_create",statusClass:l,attempt:o?.createAttempt??d}),g}catch(m){throw this.reportSessionCreateFailure(m,i,{attempt:d,statusClass:l},"session_claim"),m}finally{a.clear()}}reportSessionCreateFailure(e,r,n,o="session_create"){if(!(e instanceof u.FloPayError&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let s=(0,u.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(this.directTelemetry?.performance({stage:o,durationMs:Math.max(0,this.telemetryTimestamp()-r),durationMode:"machine",requestCategory:o==="session_claim"?"session_claim":"session_create",statusClass:s.statusClass,attempt:n.attempt}),e instanceof u.FloPayError&&e.type==="validation_error"||e instanceof u.FloPayError&&We(e.statusCode)){this.directTelemetry?.terminal({outcome:"validation_rejected",stage:o,requestCategory:o==="session_claim"?"session_claim":"session_create",...e.type==="validation_error"?{}:{statusClass:"4xx"}});return}e instanceof u.FloPayError&&e.code==="session_auto_completed"||this.directTelemetry?.error({...s,stage:o,requestCategory:o==="session_claim"?"session_claim":"session_create"})}reportThreeDsAbandoned(e){this.beginDirectTelemetryCheckout(e),this.directTelemetry?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",paymentMethodCategory:"saved"})}async waitForCheckoutSessionCompletion(e,r){this.beginDirectTelemetryCheckout(e);let n=this.telemetryTimestamp(),o=r?.paymentMethodCategory??"saved";this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:o});let s=r?.timeoutMs??he,i=Date.now()+s,a=new AbortController,c=!1,l,d=setTimeout(()=>{l=setTimeout(()=>{c=!0,a.abort()},Ge)},s),m=()=>a.abort(r?.signal?.reason);r?.signal?.aborted?m():r?.signal?.addEventListener("abort",m,{once:!0});let p=this.clampRetryAfterMs(r?.initialDelayMs??Ke),g=0;try{if(r?.statusUrl){let y=await this.waitForCheckoutStatus(e,{initialDelayMs:p,timeoutMs:s,nonce:r.nonce,statusUrl:r.statusUrl,pollAfterAction:r.continueAfterActionRequired,signal:a.signal});if(y){let v=await this.resolveCheckoutSessionStatus(e,y,r.nonce,a.signal,()=>c);return this.reportRecoveryCompleted(n,o),v}}for(;;){let y=i-Date.now();if(y<=0)throw I();if(p>0){try{g+=1,this.telemetryHooks?.onRetry?.("session_read",g),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:o,attempt:g})}catch{}if(await ke(Math.min(p,y),a.signal),Date.now()>=i)throw I()}let v=await this.getUnifiedCheckoutSessionForRecovery(e,r?.nonce,a.signal),h=v.data.session?.status;if(h==="authorized"||h==="complete"||h==="expired")return this.reportRecoveryCompleted(n,o),v;if(Date.now()>=i)throw I();p=this.clampRetryAfterMs(Math.max(p*2,$e))}}catch(y){let v=c&&Ae(y)?I():y;throw this.reportDirectFailure(v,"RECOVERY_FAILED","recovery","session_read",o),v}finally{clearTimeout(d),clearTimeout(l),r?.signal?.removeEventListener("abort",m)}}reportRecoveryCompleted(e,r){let n={stage:"recovery",requestCategory:"session_read",paymentMethodCategory:r};this.directTelemetry?.log({name:"operation.recovery.completed",...n}),this.directTelemetry?.performance({...n,durationMs:Math.max(0,this.telemetryTimestamp()-e),durationMode:"machine"})}async resolveCheckoutSessionStatus(e,r,n,o,s){let i=r.latestTransactionAttempt;if(this.rememberReportedFailure(e,r),i?.result==="DECLINE"){let l=i.code===u.STORED_PAYMENT_METHOD_UNSUPPORTED_CODE;throw new u.FloPayError(l?u.STORED_PAYMENT_METHOD_UNSUPPORTED_MESSAGE:"Payment was declined. Please choose another payment method.","api_error",{code:i.code??i.declineReason??"authorization_declined",statusCode:400})}if(i?.result==="ERROR"||r.status==="voided")throw new u.FloPayError("Payment could not be completed. Please try again.","api_error",{code:i?.code??"payment_processing_error",statusCode:500});let a;try{a=await this.getUnifiedCheckoutSessionForRecovery(e,n,o)}catch(l){if(!s?.()||!Ae(l))throw l;a={providers:[],mode:"tokenize",data:{},raw:r}}let c=a.data.session;return c&&i?.result==="SUCCESS"?{...a,data:{...a.data,session:{...c,status:"complete"}}}:c&&i?.result==="AUTHORIZED"?{...a,data:{...a.data,session:{...c,status:"authorized",paymentId:r.paymentId??void 0,authorizationExpiresAt:r.authorizationExpiresAt??void 0}}}:c&&r.status==="completed"?{...a,data:{...a.data,session:{...c,status:"complete"}}}:c&&r.status==="authorized"?{...a,data:{...a.data,session:{...c,status:"authorized",paymentId:r.paymentId??void 0,authorizationExpiresAt:r.authorizationExpiresAt??void 0}}}:c&&r.status==="expired"?{...a,data:{...a.data,session:{...c,status:"expired"}}}:i?.result!=="ACTION_REQUIRED"?a:i.gateway==="paypal"&&i.providerIntentId?{...a,autoProcessingError:{type:"paypal_direct_required",message:"PayPal authorization required",orderId:i.providerIntentId,checkoutMethod:"paypal"}}:i.nextActionRedirectUrl?{...a,autoProcessingError:{type:"3ds_required",message:"Additional authentication is required.",nextActionRedirectUrl:i.nextActionRedirectUrl}}:a}async waitForCheckoutStatus(e,r){let n=r.timeoutMs??he,o=Date.now()+n,s=this.clampRetryAfterMs(r.initialDelayMs);for(;;){let i=o-Date.now();if(i<=0||s>0&&(await ke(Math.min(s,i),r.signal),Date.now()>=o))throw I();let a=o-Date.now();if(a<=0)throw I();let c=new AbortController,l,d=r.signal?new Promise((w,f)=>{l=f}):null,m=()=>{c.abort(r.signal?.reason),l?.(r.signal?.reason??Object.assign(new Error("The operation was aborted."),{name:"AbortError"}))};r.signal?.aborted?m():r.signal?.addEventListener("abort",m,{once:!0});let p,g=r.signal?null:new Promise((w,f)=>{p=setTimeout(()=>{f(I()),c.abort()},a+Ge)}),y;try{let w=this.fetchCheckoutStatus(e,r.nonce,r.statusUrl,c.signal);y=await Promise.race([w,g,d].filter(f=>f!==null))}finally{p!==void 0&&clearTimeout(p),r.signal?.removeEventListener("abort",m)}if(!y)return null;let v=He(y.latestTransactionAttempt)&&!this.isOwnFailedAttempt(e,y,r.submittedIntentId);if(y.status==="completed"||y.status==="authorized"||y.status==="expired"||y.status==="voided")return v?{...y,latestTransactionAttempt:null}:y;let h=y.latestTransactionAttempt?.result,S=r.pollAfterAction===!0&&h==="ACTION_REQUIRED";if(!v&&h!==void 0&&h!=="PENDING"&&!S)return y;s=this.clampRetryAfterMs(Math.max(s*2,$e))}}isOwnFailedAttempt(e,r,n){let o=r.latestTransactionAttempt?.providerIntentId??null;return n!==void 0?o===n:o===null?!0:!jt(r.uuid||e,o)}rememberReportedFailure(e,r){let n=r.latestTransactionAttempt;!He(n)||!n.providerIntentId||Ht(r.uuid||e,n.providerIntentId)}async fetchCheckoutStatus(e,r,n,o){let s=`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/status`,i=s;if(n)try{let d=new URL(n,`${this.baseUrl}/`),m=new URL(s);d.origin===m.origin&&(i=d.toString())}catch{}let a={[u.FLO_SDK_VERSION_HEADER]:u.SDK_VERSION};r&&(a["x-checkout-session-token"]=r);let c=await ge(i,{headers:a,signal:o});if(c.status===404||c.status===405)return null;if(!c.ok)throw await L(c,"Failed to get checkout session status");let l=await c.json();return Ce(l.data)&&"latestTransactionAttempt"in l.data?l.data:null}normalizeRawSession(e){let r=e.gateways??{},n=[],o={session:this.toCheckoutSession(e)},s=r.stripe;if(s?.publishableKey){n.push("stripe");let c=[e.stripeClientSecret,s.stripeClientSecret].find(l=>typeof l=="string"&&l.length>0);o.stripe={clientSecret:c??"",publishableKey:s.publishableKey??void 0,paypalPublishableKey:s.paypalPublishableKey??void 0,environment:s.environment,enabledPaymentMethods:Array.isArray(s.enabledPaymentMethods)?s.enabledPaymentMethods.filter(l=>typeof l=="string"):void 0}}let i=r.paypal;return i?.publishableKey&&(n.push("paypal"),o.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType,approvalPresentation:i.approvalPresentation}),{providers:n,mode:"tokenize",...e.checkoutMetadata===void 0?{}:{checkoutMetadata:e.checkoutMetadata},data:o,raw:{data:e}}}toCheckoutSession(e){let r=e.products??[],n=typeof e.totalAmount=="number"&&Number.isFinite(e.totalAmount),o=r.reduce((l,d)=>l+(d.overrideAmount??d.totalAmount??0),0),s=n?e.totalAmount:o,i=Math.round(s*100),a=e.currency??r[0]?.currency??"USD",c="payment";return e.checkoutMode==="setup"?c="setup":r.some(l=>l.type==="subscription")&&(c="subscription"),{id:e.uuid,clientSecret:e.nonce,mode:c,status:this.toCheckoutSessionStatus(e.status),amount:i,currency:a,captureMethod:e.captureMethod,paymentId:e.paymentId,authorizationExpiresAt:e.authorizationExpiresAt,failureOutcome:(0,u.normalizeCheckoutFailureOutcome)(e.outcome)??(0,u.normalizeCheckoutFailureOutcome)(e.failureReason)??(e.status==="expired"&&e.captureMethod==="manual"?"authorization_expired":void 0),customer:{id:e.accountData.userId??void 0,email:e.accountData.email??void 0,firstName:e.accountData.firstName??void 0,lastName:e.accountData.lastName??void 0,country:e.accountData.country??void 0,city:e.accountData.city??void 0,state:e.accountData.state??void 0,zip:e.accountData.zip??void 0,gender:e.accountData.gender??void 0,line1:e.accountData.addressLine1??void 0,line2:e.accountData.addressLine2??void 0},...e.checkoutMetadata===void 0?{}:{checkoutMetadata:e.checkoutMetadata},metadata:{},checkoutMode:e.checkoutMode,...Array.isArray(e.advertisedPaymentMethods)?{advertisedPaymentMethods:e.advertisedPaymentMethods}:{},...Lt(e.futureUse)?{futureUse:e.futureUse}:{},...Array.isArray(e.futureUseUnsupported)?{futureUseUnsupported:e.futureUseUnsupported.filter(Nt)}:{},buyerIdentified:e.buyerIdentified,providerPaymentMethodId:typeof e.providerPaymentMethodId=="string"?e.providerPaymentMethodId:null,products:r.map(l=>({...l,totalAmount:typeof l.totalAmount=="number"?l.totalAmount:void 0,overrideAmount:typeof l.overrideAmount=="number"?l.overrideAmount:null,currency:typeof l.currency=="string"?l.currency:void 0,metadata:l.metadata??null})),successUrl:e.successUrl,cancelUrl:e.cancelUrl,coupons:e.coupons,subtotalAmount:e.subtotalAmount,discountAmount:e.discountAmount,totalAmount:e.totalAmount,createdAt:e.createdAt,gateways:e.gateways,accountData:e.accountData,tagsData:e.tagsData}}toVaultBlock(e){let r=Qt(e.verification);return{html:typeof e.html=="string"?e.html:void 0,url:typeof e.url=="string"?e.url:void 0,messageToken:typeof e.messageToken=="string"?e.messageToken:void 0,expectedOrigin:typeof e.expectedOrigin=="string"?e.expectedOrigin:void 0,...r?{verification:r}:{}}}toCheckoutSessionStatus(e){return e==="completed"?"complete":e==="authorized"?"authorized":e==="expired"?"expired":"open"}async resolveProcessResponse(e,r,n){if(e.status!==202)return e;let o=await e.json().catch(()=>null),s=this.toCheckoutProcessingPending(o,e,r),i=n?.pollTimeoutMs??he,a=Date.now()+i;if(s.statusUrl){let l=await this.waitForCheckoutStatus(s.sessionId,{initialDelayMs:s.retryAfterMs,timeoutMs:i,nonce:n?.nonce,statusUrl:s.statusUrl,submittedIntentId:n?.submittedIntentId});if(l)return this.toProcessResponseFromStatus(l,r,n?.nonce)}let c=await this.waitForCheckoutSessionCompletion(s.sessionId,{initialDelayMs:s.retryAfterMs,timeoutMs:a-Date.now(),nonce:n?.nonce,paymentMethodCategory:n?.paymentMethodCategory});return this.toProcessResponseFromSession(c,r)}async toProcessResponseFromStatus(e,r,n){let o=e.latestTransactionAttempt?.result,s={[Vt]:zt},i={"Content-Type":"application/json",...s};if(e.status==="completed"||o==="SUCCESS")return new Response(null,{status:204,statusText:"No Content",headers:s});if(e.status==="authorized"||o==="AUTHORIZED")return new Response(JSON.stringify({status:"authorized",paymentId:e.paymentId??void 0,sessionId:e.uuid||r,authorizationExpiresAt:e.authorizationExpiresAt??void 0}),{status:200,headers:i});if(e.status==="expired"){let a=await this.resolveCheckoutSessionStatus(r,e,n);return this.toProcessResponseFromSession(a,r)}if(this.rememberReportedFailure(r,e),o==="DECLINE"){let a=e.latestTransactionAttempt,c=a?.code===u.STORED_PAYMENT_METHOD_UNSUPPORTED_CODE,l=a?.declineReason??void 0;return new Response(JSON.stringify({type:l??"authorization_declined",message:c?u.STORED_PAYMENT_METHOD_UNSUPPORTED_MESSAGE:"Payment was declined. Please choose another payment method.",code:a?.code??l??"authorization_declined",...l?{declineCode:l}:{}}),{status:400,headers:i})}if(o==="ACTION_REQUIRED"&&e.latestTransactionAttempt?.gateway==="paypal"&&e.latestTransactionAttempt.providerIntentId)return new Response(JSON.stringify({type:"paypal_direct_required",message:"PayPal authorization required",orderId:e.latestTransactionAttempt.providerIntentId}),{status:400,headers:i});if(o==="ACTION_REQUIRED"&&e.latestTransactionAttempt?.nextActionRedirectUrl)return new Response(JSON.stringify({type:"3ds_required",message:"Additional authentication is required.",nextActionRedirectUrl:e.latestTransactionAttempt.nextActionRedirectUrl}),{status:400,headers:i});if(o==="ERROR"||e.status==="voided")return new Response(JSON.stringify({type:"unknown",code:e.latestTransactionAttempt?.code??"payment_processing_error",message:"Payment could not be completed. Please try again."}),{status:500,headers:i});throw I()}async reconcileProcessPayment(e,r){let n=r?.pollTimeoutMs??he,o=Date.now()+n,s=null;try{s=await this.waitForCheckoutStatus(e,{initialDelayMs:0,timeoutMs:n,nonce:r?.nonce,submittedIntentId:r?.submittedIntentId})}catch(c){if(this.reportDirectFailure(c,"RECOVERY_FAILED","recovery","session_read",r?.paymentMethodCategory??"saved"),c instanceof u.FloPayError&&c.code==="checkout_processing_timeout")throw c}if(s)return this.toProcessResponseFromStatus(s,e,r?.nonce);let i=o-Date.now();if(i<=0)throw I();let a=await this.waitForCheckoutSessionCompletion(e,{initialDelayMs:0,timeoutMs:i,nonce:r?.nonce,paymentMethodCategory:r?.paymentMethodCategory});return this.toProcessResponseFromSession(a,e)}toProcessResponseFromSession(e,r){if(e.data.session?.status==="complete")return new Response(null,{status:204,statusText:"No Content"});if(e.data.session?.status==="authorized"){let n=e.data.session;return new Response(JSON.stringify({status:"authorized",paymentId:n.paymentId,sessionId:n.id||r,authorizationExpiresAt:n.authorizationExpiresAt}),{status:200,headers:{"Content-Type":"application/json"}})}if(e.data.session?.status==="expired"){let n=e.data.session.failureOutcome==="authorization_expired"||e.data.session.captureMethod==="manual";throw new u.FloPayError(n?"Authorization has expired.":"Checkout session has expired.","api_error",{code:n?"authorization_expired":"checkout_session_expired"})}throw I()}toCheckoutProcessingPending(e,r,n){let o=r.headers.get("Retry-After"),s=o===null||o.trim()===""?void 0:Number(o),i=s!==void 0&&Number.isFinite(s)?s*1e3:void 0;return{type:"checkout_processing",sessionId:N(e,"sessionId")??n,retryAfterMs:this.clampRetryAfterMs(Wt(e,"retryAfterMs")??i??Ke),statusUrl:N(e,"statusUrl"),sessionUrl:N(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,$t))}autoCacheDisplayData(e,r){if(!e)return;let n=r.products??(0,u.foldIntoProducts)(r.items,r.subscriptions);if(n.length===0&&!r.currency)return;let o=r.products!==void 0,s=(0,u.resolveSessionCurrency)(r.currency,o?void 0:r.items,o?void 0:r.subscriptions,n);z(e,{currency:s??void 0,products:n.map(i=>({code:i.code??i.providerItemId??i.providerPlanId,type:i.type,name:i.name??i.itemName??i.providerItemName??i.subscriptionName??i.providerPlanName??null,totalAmount:i.totalAmount,overrideAmount:i.overrideAmount,currency:i.currency??s??void 0}))})}mergeCachedDisplayData(e){let r=me(e.uuid),n=new Map,o=i=>i?`code:${i}`:void 0;for(let i of r?.products??[]){let a=o(i.code);a&&n.set(a,i)}let s=(e.products??[]).map(i=>{let a=o(i.code),c=a?n.get(a):void 0;return{...i,name:i.name??c?.name??null,totalAmount:i.totalAmount??c?.totalAmount,overrideAmount:i.overrideAmount??c?.overrideAmount,currency:i.currency??c?.currency}});return{...e,currency:e.currency??r?.currency,products:s}}};j.activeVaultCaptureRequests=new Map;var re=j;function Ze(t,e){let r=re;return new r(t,e)}var T=require("@flopay/shared");var Me="flopay-vault",or=3e4,sr=T.THREE_DS_CHALLENGE_WINDOW_MS+or,ir="Card authentication timed out.",et={ready:["vault.widget.ready","vault_ready"],submitting:["vault.submission.started","vault_submit"],blocked:["operation.state_transition","vault_submit"],action_required:["vault.action.required","three_ds_handoff"]};function ar(t){return t.class==="lifecycle"?t.name:t.class==="technical_error"?t.code:t.class==="expected_outcome"?t.outcome:"sdk.performance"}function J(t){let e={class:t.class,stage:t.stage};"code"in t&&(e.code=t.code),"provider"in t&&t.provider&&(e.provider=t.provider),"paymentMethodCategory"in t&&t.paymentMethodCategory&&(e.paymentMethodCategory=t.paymentMethodCategory),"outcome"in t&&(e.outcome=t.outcome),"durationMs"in t&&t.durationMs!==void 0&&(e.durationMs=t.durationMs),"durationMode"in t&&t.durationMode&&(e.durationMode=t.durationMode);try{globalThis.Sentry?.addBreadcrumb?.({category:"flopay.telemetry",level:t.class==="technical_error"?"error":"info",message:ar(t),data:e})}catch{}}function ne(t,e){return(0,T.buildTelemetryLogEvent)({eventId:"11111111-1111-4111-8111-111111111111",name:t,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}var cr=new Set(["authorization_declined","authentication_required","authorization_expired","capture_failed"]);function lr(t){return typeof t=="string"&&cr.has(t)?t:"unknown"}var ur=new Set(["verification_failed","verification_expired"]);function dr(t){return t==null?!0:typeof t=="string"&&ur.has(t)}function tt(t,e){return t?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime",reason:lr(e.failureOutcome)}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function rt(t,e,r="checkout"){return r==="card_setup"?t.type==="decline"?"card_setup_declined":"card_setup_succeeded":t.type==="decline"?"payment_declined":t.outcome==="authorized"||e==="manual"?"payment_authorized":"payment_succeeded"}function mr(t,e,r,n="checkout"){let{type:o}=t;if(o==="complete"||o==="decline")return(0,T.buildTelemetryTerminalEvent)({eventId:"22222222-2222-4222-8222-222222222222",outcome:rt(t,r,n),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(o==="error"){let a=tt(e,t);return(0,T.buildTelemetryErrorEvent)({eventId:"33333333-3333-4333-8333-333333333333",...a,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[s,i]=et[o];return ne(s,i)}function pr(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.source===Me&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function yr(t){if(typeof t!="object"||t===null)return;let e=t,r=e.status;if(!(typeof e.id!="string"||e.id.trim()===""||typeof e.brand!="string"||e.brand.trim()===""||typeof e.lastFour!="string"||!/^\d{4}$/.test(e.lastFour)||typeof e.expiryMonth!="number"||!Number.isInteger(e.expiryMonth)||e.expiryMonth<1||e.expiryMonth>12||typeof e.expiryYear!="number"||!Number.isInteger(e.expiryYear)||e.expiryYear<1970||e.expiryYear>9999||r!=="pending"&&r!=="active"&&r!=="deleted"))return{id:e.id,brand:e.brand,lastFour:e.lastFour,expiryMonth:e.expiryMonth,expiryYear:e.expiryYear,status:r}}function hr(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.source===Me&&e.type==="validation"&&Array.isArray(e.messages)}function gr(t){if(typeof t!="object"||t===null)return!1;let e=t;return e.source===Me&&e.type==="resize"&&typeof e.height=="number"&&Number.isFinite(e.height)}var H=class{constructor(e={},r){this.provider="pcivault";this.container=null;this.messageHandler=null;this.actionOverlay=null;this.threeDsReturnHandler=null;this.actionOverlayPreviousFocus=null;this.actionOverlayTimer=null;this.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!0;this.submitLabel=void 0;this.mountStartedAt=0;this.vaultReadyReported=!1;this.verificationRequired=!1;this.submissionStarted=!1;this.submissionStartedAt=null;this.listeners=new Map;this.config=e,this.ownsTelemetryReporter=!r&&e.telemetry!==!1,this.telemetryReporter=r?.reporter??(this.ownsTelemetryReporter?new _({billingApiUrl:(0,T.resolveBillingApiUrl)(e.billingApiUrl),sdkVersion:T.SDK_VERSION}):void 0)}async mount(e,r){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new _({billingApiUrl:(0,T.resolveBillingApiUrl)(this.config.billingApiUrl),sdkVersion:T.SDK_VERSION}));let n=this.telemetryReporter;if(this.config.operation==="card_setup"&&n&&this.setupTelemetryReporter!==n){this.setupTelemetryReporter=n;try{n.beginCheckout({checkoutMode:"setup"})}catch{}}if(this.mountStartedAt=this.telemetryReporter?.now?.()??A(),this.vaultReadyReported=!1,this.submissionStarted=!1,this.submissionStartedAt=null,typeof window>"u"||typeof document>"u")throw this.reportVaultLoadFailure(),new T.FloPayError("The vault card form is only available in the browser.","api_error",{code:"card_capture_no_window"});if(!r?.html?.trim())throw this.reportVaultLoadFailure(),new T.FloPayError("No vault capture widget HTML was provided to mount the secure card form.","api_error",{code:"card_capture_no_widget_html"});this.container=e,this.verificationRequired=r.verificationRequired===!0,this.messageToken=r.messageToken??null,this.expectedOrigin=r.expectedOrigin??this.config.expectedOrigin??null,this.theme=r.theme,r.submitLabel!==void 0&&(this.submitLabel=r.submitLabel);try{this.attachMessageListener(),this.injectWidget(e,r.html)}catch(o){throw this.reportVaultLoadFailure(),o}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),this.postSubmitLabel(),J(ne("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?.performance?.({stage:"vault_mount",durationMs:Math.max(0,(this.telemetryReporter.now?.()??A())-this.mountStartedAt),durationMode:"machine",provider:"pcivault",paymentMethodCategory:"card"}),this.emit("ready",{sessionId:this.config.sessionId})}reportVaultLoadFailure(){this.telemetryReporter?.error({errorCode:"VAULT_LOAD_FAILED",failureCategory:"provider_runtime",stage:"vault_mount",provider:"pcivault",paymentMethodCategory:"card"})}on(e,r){let n=this.listeners.get(e);return n||(n=new Set,this.listeners.set(e,n)),n.add(r),()=>{this.listeners.get(e)?.delete(r)}}unmount(){this.hideActionRequiredOverlay(),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null),this.container&&(this.container.replaceChildren(),this.container=null),this.messageToken=null,this.expectedOrigin=null,this.ownsTelemetryReporter&&(this.telemetryReporter?.destroy(),this.telemetryReporter=void 0)}injectWidget(e,r){e.innerHTML=r;let n=Array.from(e.querySelectorAll("script"));for(let o of n){let s=document.createElement("script");for(let i of Array.from(o.attributes))s.setAttribute(i.name,i.value);s.text=o.text,o.replaceWith(s)}}attachMessageListener(){if(this.messageHandler)return;let e=r=>{if(this.expectedOrigin&&r.origin!==this.expectedOrigin)return;let n=r.data;if(gr(n)){if(this.messageToken&&n.messageToken!==this.messageToken)return;this.applyHeight(n.height);return}if(hr(n)){if(this.messageToken&&n.messageToken!==this.messageToken)return;let c=n.messages.filter(l=>typeof l=="string"&&l.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:c||void 0});return}if(!pr(n)||this.messageToken&&n.messageToken!==this.messageToken)return;let o=this.config.sessionId,s=typeof n.sessionId=="string"?n.sessionId:void 0;if(o&&s&&s!==o||(n.type==="complete"||n.type==="decline")&&o&&s!==o)return;let i=yr(n.paymentMethod),a={...n.sessionId??this.config.sessionId?{sessionId:n.sessionId??this.config.sessionId}:{},...n.outcome?{outcome:n.outcome}:{},...n.paymentId?{paymentId:n.paymentId}:{},...n.authorizationExpiresAt?{authorizationExpiresAt:n.authorizationExpiresAt}:{},...n.failureOutcome?{failureOutcome:n.failureOutcome}:{},...n.intentId?{intentId:n.intentId}:{},...n.declineReason?{declineReason:n.declineReason}:{},...n.message?{message:n.message}:{},...i?{paymentMethod:i}:{}};n.type==="submitting"&&(this.submissionStarted=!0,this.submissionStartedAt=this.telemetryReporter?.now?.()??A()),this.isVerificationStateError(n)?(J(ne("operation.state_transition","vault_mount")),this.telemetryReporter?.log({name:"operation.state_transition",stage:"vault_mount",provider:"pcivault",paymentMethodCategory:"card"})):(J(mr(n,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(n)),n.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),this.postSubmitLabel()),n.type==="action_required"&&n.nextActionRedirectUrl&&this.showActionRequiredOverlay(n.nextActionRedirectUrl),(n.type==="complete"||n.type==="decline"||n.type==="error"||n.type==="submitting")&&this.hideActionRequiredOverlay(),n.type!=="action_required"&&this.emit(n.type,a)};this.messageHandler=e,window.addEventListener("message",e)}isVerificationStateError(e){return e.type==="error"&&this.verificationRequired&&!this.submissionStarted&&dr(e.failureOutcome)}reportOutcome(e){let r=this.telemetryReporter;if(!r)return;let{type:n}=e;if(n==="ready"&&!this.vaultReadyReported&&(this.vaultReadyReported=!0,r.performance({stage:"vault_ready",durationMs:Math.max(0,r.now()-this.mountStartedAt),durationMode:"machine",provider:"pcivault",paymentMethodCategory:"card",requestCategory:"provider_sdk"})),n==="complete"||n==="decline"){r.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),r.terminal({outcome:rt(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(n==="error"){let i=tt(this.submissionStarted,e);r.log({name:"vault.terminal",stage:i.stage,provider:"pcivault",paymentMethodCategory:"card"}),r.error({...i,provider:"pcivault",paymentMethodCategory:"card"});return}if(n==="action_required"){r.log({name:"vault.action.required",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),r.log({name:"vault.three_ds.handoff",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"});let i=this.submissionStartedAt;this.submissionStartedAt=null,i!==null&&r.performance({stage:"three_ds_handoff",durationMs:Math.max(0,r.now()-i),durationMode:"machine",provider:"pcivault",paymentMethodCategory:"card"}),r.terminal({outcome:"action_required",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"});return}let[o,s]=et[n];r.log({name:o,stage:s,provider:"pcivault",paymentMethodCategory:"card"})}applyTheme(e){this.theme=e,this.postTheme()}postTheme(){this.theme!==void 0&&this.postToHostedWindow({source:"flopay-vault-host",type:"theme",theme:this.theme},this.directiveTargetOrigin())}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){this.postToHostedWindow({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},this.directiveTargetOrigin())}setCardFieldOrder(e,r){this.cardFieldOrder=e,this.cardAutoFocus=r,this.postCardFieldOrder()}postCardFieldOrder(){this.postToHostedWindow({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},this.directiveTargetOrigin())}setSubmitLabel(e){this.submitLabel=e,this.postSubmitLabel()}postSubmitLabel(){let e=this.submitLabel,r=this.config.sessionId,{messageToken:n,expectedOrigin:o}=this;e===void 0||!r||!n||!o||this.postToHostedWindow({source:"flopay-vault-host",type:"submitLabel",sessionId:r,messageToken:n,label:e},o)}hostedWindow(){return this.container?.querySelector("iframe")?.contentWindow??null}postToHostedWindow(e,r){let n=this.hostedWindow();if(n)try{n.postMessage(e,r)}catch{}}directiveTargetOrigin(){return this.expectedOrigin??"*"}emit(e,r){for(let n of this.listeners.get(e)??[])n(r)}showActionRequiredOverlay(e){if(typeof document>"u")return;if(this.actionOverlay){let i=this.actionOverlay.querySelector("iframe");i instanceof HTMLIFrameElement&&i.src!==e&&(i.src=e),this.armActionRequiredTimeout();return}this.actionOverlayPreviousFocus=document.activeElement instanceof HTMLElement?document.activeElement:null;let r=document.createElement("div");r.setAttribute("data-flopay-action-required","1"),r.setAttribute("role","dialog"),r.setAttribute("aria-modal","true"),r.setAttribute("aria-label","Card authentication"),r.style.cssText=["position:fixed","inset:0","z-index:2147483647","background:rgba(15,23,42,0.6)","display:flex","align-items:center","justify-content:center","padding:16px"].join(";");let n=document.createElement("iframe");n.setAttribute("title","Card authentication"),n.setAttribute("allow","payment"),n.tabIndex=0,n.style.cssText=["width:min(100%,460px)","height:min(100%,640px)","border:0","border-radius:12px","background:#fff","box-shadow:0 12px 30px rgba(0,0,0,0.35)"].join(";"),n.src=e,r.appendChild(n);let o=document.createElement("button");o.type="button",o.setAttribute("aria-label","Close card authentication"),o.textContent="\xD7",o.style.cssText=["position:fixed","top:20px","right:20px","width:40px","height:40px","border:0","border-radius:9999px","background:#fff","color:#0f172a","font-size:28px","line-height:40px","cursor:pointer","box-shadow:0 4px 14px rgba(0,0,0,0.25)"].join(";"),o.addEventListener("click",()=>this.abandonActionRequiredOverlay()),r.appendChild(o),r.addEventListener("click",i=>{i.target===r&&this.abandonActionRequiredOverlay()});let s=i=>{if(i.source!==n.contentWindow)return;let a=i.data;!a||typeof a!="object"||a.source!=="flopay-vault-3ds-return"||(J(ne("vault.three_ds.returned","three_ds_return")),this.telemetryReporter?.log({name:"vault.three_ds.returned",stage:"three_ds_return",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay())};window.addEventListener("message",s),this.threeDsReturnHandler=s,document.body.appendChild(r),this.actionOverlay=r,n.focus(),this.armActionRequiredTimeout(),J(ne("vault.three_ds.handoff","three_ds_handoff"))}armActionRequiredTimeout(){this.actionOverlayTimer&&clearTimeout(this.actionOverlayTimer),this.actionOverlayTimer=setTimeout(()=>{this.actionOverlayTimer=null,this.actionOverlay&&this.timeOutActionRequiredOverlay()},sr)}reportChallengeAbandoned(){J((0,T.buildTelemetryTerminalEvent)({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"})),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"})}timeOutActionRequiredOverlay(){this.reportChallengeAbandoned(),this.hideActionRequiredOverlay(),this.emit("error",{...this.config.sessionId?{sessionId:this.config.sessionId}:{},message:ir})}abandonActionRequiredOverlay(){this.actionOverlay&&(this.reportChallengeAbandoned(),this.hideActionRequiredOverlay(),this.emit("challenge_dismissed",{...this.config.sessionId?{sessionId:this.config.sessionId}:{}}))}hideActionRequiredOverlay(){if(this.actionOverlayTimer&&(clearTimeout(this.actionOverlayTimer),this.actionOverlayTimer=null),this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),!this.actionOverlay)return;this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null;let e=this.actionOverlayPreviousFocus;this.actionOverlayPreviousFocus=null,e?.isConnected&&e.focus()}applyHeight(e){let r=this.container?.querySelector("iframe");if(!r)return;let n=Math.max(0,Math.min(Math.ceil(e),2e3));r.style.height=`${n}px`}};function nt(t,e){let r=H;return new r(t,{reporter:e})}var ot=Symbol.for("@flopay/js.telemetry.bridge.v1");function st(t,e,r){let n=()=>e?.now()??r();Object.defineProperty(t,ot,{configurable:!1,enumerable:!1,writable:!1,value:{error:s=>e?.error(s),log:s=>e?.log(s),performance:s=>e?.performance(s),terminal:s=>e?.terminal(s),now:n,elapsed:s=>Math.max(0,n()-s),setCheckoutContext:s=>e?.setCheckoutContext(s),beginCheckout:(s={})=>e?.beginCheckout(s)??n(),disable:()=>e?.disable(),subscribe:s=>e?.subscribe(s)??(()=>{}),flush:()=>e?.flush()??Promise.resolve()}})}function it(t){return t[ot]}var oe=class{now(){return this.telemetryReporter?.now?.()??A()}constructor(e,r,n){this.provider=e,this.config=r,this.telemetryReporter=n??new _({billingApiUrl:(0,k.resolveBillingApiUrl)(r.billingApiUrl),sdkVersion:k.SDK_VERSION,enabled:r.telemetry!==!1}),st(this,this.telemetryReporter,A)}cardCapture(e){return this.telemetryReporter?.log({name:"vault.capture.requested",stage:"vault_request",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?nt({sessionId:e?.sessionId,captureMethod:e?.captureMethod},this.telemetryReporter):new H({sessionId:e?.sessionId,captureMethod:e?.captureMethod,telemetry:!1})}async retrieveSession(e,r){if(!e)throw new k.FloPayError("sessionId is required to retrieve a session.","validation_error",{param:"sessionId"});let n=await this.retrieveUnifiedSession(e,r);if(!n.data.session)throw new k.FloPayError("Session not found","api_error");return n.data.session}async retrieveUnifiedSession(e,r){if(!e)throw new k.FloPayError("sessionId is required.","validation_error",{param:"sessionId"});let n=(0,k.resolveBillingApiUrl)(r??this.config.billingApiUrl),o=this.now();this.telemetryReporter?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let s,i,a=l=>{if(s===void 0)return;let d=s,m=i;s=void 0,i=void 0,this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:l,attempt:m}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:d,durationMode:"machine",requestCategory:"session_read",statusClass:l,attempt:m})},c=Ze(n,{now:()=>this.telemetryReporter?.now()??A(),onFirstByte:(l,d)=>{s=l,i=d},onRetry:(l,d)=>{this.telemetryReporter?.log({name:"operation.retry",stage:l==="session_read"?"session_read":"processing",requestCategory:l,attempt:d})}});try{let l=await c.getUnifiedCheckoutSession(e);return a("2xx"),this.telemetryReporter?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:"2xx"}),this.telemetryReporter?.log({name:"checkout.data.ready",stage:"checkout_data_ready"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-o,durationMode:"machine",requestCategory:"session_read",statusClass:"2xx"}),l}catch(l){let d=(0,k.classifyTelemetryFailure)(l,l instanceof k.FloPayError&&l.code==="checkout_processing_timeout"?"REQUEST_TIMEOUT":"NETWORK_REQUEST_FAILED");throw a(d.statusClass),this.telemetryReporter?.error({...d,stage:"session_read",provider:"flo",paymentMethodCategory:"unknown"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-o,durationMode:"machine",requestCategory:"session_read",statusClass:d.statusClass}),l}}getRawProvider(){return this.provider.getRawProvider()}destroy(){this.telemetryReporter?.log({name:"checkout.unmount",stage:"unmount"}),this.telemetryReporter?.destroy(),this.provider.destroy()}};function at(t,e,r){let n=oe;return new n(t,e,r)}var U=require("@flopay/shared");var Ie=require("@flopay/shared"),ct=require("@stripe/stripe-js"),X=require("@flopay/shared"),lt=new WeakSet;function ut(t){return t instanceof Ie.FloPayError&&lt.has(t)}var Q=class{constructor(){this.name="stripe";this.stripe=null}async initialize(e){if(typeof window>"u")return;let r=await(0,ct.loadStripe)(e.publishableKey,{locale:e.locale??"auto"});if(!r){let n=new Ie.FloPayError("Failed to initialize Stripe. Check your publishable key.","authentication_error");throw lt.add(n),n}this.stripe=r}getRawProvider(){return this.stripe}destroy(){this.stripe=null}};var dt=new Map;function Pe(t){return Array.isArray(t)?t.map(Pe):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0).sort(([e],[r])=>e.localeCompare(r)).map(([e,r])=>[e,Pe(r)])):t}function fr(t,e){return JSON.stringify([t,(0,U.resolveBillingApiUrl)(e?.billingApiUrl),e?.telemetry!==!1,e?.locale??"auto",e?.apiVersion??null,Pe(e?.appearance??null)])}var ve=new Map;async function mt(t,e){if(!t){let a=new _({billingApiUrl:(0,U.resolveBillingApiUrl)(e?.billingApiUrl),sdkVersion:U.SDK_VERSION,enabled:e?.telemetry!==!1});throw a.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),a.flush().catch(()=>{}).finally(()=>a.destroy()),new U.FloPayError("A publishable key is required to initialize FloPay.","validation_error",{param:"publishableKey"})}let r=fr(t,e),n=dt.get(r);if(n)return e?.telemetry!==!1&&it(n)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),n;let o=ve.get(r);if(o)return o;let s={...e,publishableKey:t},i=(async()=>{let a=new _({billingApiUrl:(0,U.resolveBillingApiUrl)(s.billingApiUrl),sdkVersion:U.SDK_VERSION,enabled:s.telemetry!==!1}),c=a.now();a.log({name:"sdk.initialize.started",stage:"sdk_initialize"}),a.log({name:"sdk.cache.miss",stage:"sdk_initialize"}),a.log({name:"provider.load.started",stage:"provider_load",provider:"stripe"});let l=new Q,d=a.now();try{await l.initialize(s)}catch(g){throw a.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:ut(g)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),a.destroy(),g}let m=a.now();a.log({name:"provider.ready",stage:"provider_ready",provider:"stripe"}),a.log({name:"provider.availability.checked",stage:"provider_ready",provider:"stripe"}),a.log({name:"sdk.initialize.ready",stage:"sdk_initialize"}),a.performance({stage:"sdk_initialize",durationMs:m-c,durationMode:"machine",provider:"stripe"}),a.performance({stage:"provider_ready",durationMs:m-d,durationMode:"machine",provider:"stripe"});let p=at(l,s,a);return dt.set(r,p),p})();ve.set(r,i);try{return await i}finally{ve.get(r)===i&&ve.delete(r)}}var V=require("@flopay/shared"),Cr=1e3,vr=1e3,Tr=15e3;function se(t){return new V.FloPayError("Card authentication was cancelled.","api_error",{code:"three_ds_aborted",cause:t})}function pt(){return new V.FloPayError("Card authentication timed out.","api_error",{code:"three_ds_timeout"})}function yt(t){return t.replace(/\/+$/,"")}function br(t){return t.status==="succeeded"||t.status==="authorized"||t.status==="declined"}function Sr(t){if(!t||typeof t!="object")return{status:"unknown"};let e=typeof t.status=="string"?t.status:"unknown",r=typeof t.providerIntentId=="string"?t.providerIntentId:null;switch(e){case"succeeded":case"authorized":case"pending":case"timeout":return{status:e,providerIntentId:r};case"declined":return{status:"declined",providerIntentId:r,declineReason:typeof t.declineReason=="string"?t.declineReason:null,gatewayDeclineReason:typeof t.gatewayDeclineReason=="string"?t.gatewayDeclineReason:null};case"requires_action":return{status:"requires_action",providerIntentId:r,nextActionRedirectUrl:typeof t.nextActionRedirectUrl=="string"?t.nextActionRedirectUrl:null};case"no_attempt":return{status:"no_attempt"};default:return{status:"unknown"}}}async function xe(t){if(typeof document>"u"||typeof window>"u")throw new V.FloPayError("3DS challenge requires a browser environment.","api_error",{code:"three_ds_no_window"});if(t.signal?.aborted)throw se();let e=`${yt(t.billingApiUrl)}/v1/checkouts/sessions/${encodeURIComponent(t.sessionId)}/3ds/complete`,r=async()=>{let l=new AbortController,d=()=>l.abort();t.signal?.aborted?l.abort():t.signal?.addEventListener("abort",d);let m=window.setTimeout(()=>l.abort(),Tr);try{let p=await fetch(e,{method:"POST",headers:{"x-checkout-session-token":t.nonce,"content-type":"application/json"},body:"{}",signal:l.signal});if(!p.ok)return{status:"unknown"};let g=await p.json().catch(()=>null);return Sr(g)}catch{return{status:"unknown"}}finally{window.clearTimeout(m),t.signal?.removeEventListener("abort",d)}},n,o=()=>t.pollCompletionEndpoint!==!1?r():(n??(n=r()),n),s=document.activeElement instanceof HTMLElement?document.activeElement:null,i=document.createElement("div");i.setAttribute("data-flopay-auto-3ds-overlay","1"),i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true"),i.setAttribute("aria-label","Card authentication"),i.style.cssText=["position:fixed","inset:0","z-index:2147483647","background:rgba(15,23,42,0.6)","display:flex","align-items:center","justify-content:center","padding:16px"].join(";");let a=document.createElement("iframe");a.setAttribute("title","Card authentication"),a.setAttribute("allow","payment"),a.tabIndex=0,a.style.cssText=["width:min(100%,460px)","height:min(100%,640px)","border:0","border-radius:12px","background:#fff","box-shadow:0 12px 30px rgba(0,0,0,0.35)"].join(";");let c=null;try{c=new URL(t.billingApiUrl,window.location.href).origin}catch{c=null}try{let l=await new Promise((d,m)=>{let p=!1,g=0,y=0,v=0,h=!1,S=()=>{window.clearTimeout(g),window.clearInterval(y),window.clearTimeout(v),window.removeEventListener("message",K),a.removeEventListener("load",f),t.signal?.removeEventListener("abort",P)},w=async()=>{if(!(p||h)){h=!0;try{let E=await o();if(p||!br(E))return;p=!0,S(),d(E)}finally{h=!1}}},f=()=>{t.pollCompletionEndpoint!==!1&&(window.clearTimeout(v),v=window.setTimeout(()=>{w()},250))},P=()=>{p||(p=!0,S(),m(se()))},K=E=>{if(E.source!==a.contentWindow||c&&E.origin!==c)return;let M=E.data;!M||typeof M!="object"||M.source!=="flopay-vault-3ds-return"||p||(p=!0,S(),d(null))};g=window.setTimeout(()=>{p||(p=!0,S(),m(pt()))},V.THREE_DS_CHALLENGE_WINDOW_MS),t.pollCompletionEndpoint!==!1&&(y=window.setInterval(()=>{w()},vr)),a.addEventListener("load",f),window.addEventListener("message",K),t.signal?.addEventListener("abort",P),a.src=t.nextActionRedirectUrl,i.appendChild(a),document.body.appendChild(i),a.focus(),t.signal?.aborted&&P()});return l||await o()}finally{i.parentNode?.removeChild(i),s?.isConnected&&s.focus()}}function _r(t){return new V.FloPayError("Card was declined.","api_error",{code:t.declineReason??"authorization_declined",...t.gatewayDeclineReason?{declineCode:t.gatewayDeclineReason}:{}})}async function ht(t,e){let r=`${yt(t.billingApiUrl)}/v1/checkouts/sessions/${encodeURIComponent(t.sessionId)}/status`,n=new AbortController,o=new AbortController,s=()=>{n.abort(t.signal?.reason),o.abort(t.signal?.reason)};t.signal?.aborted?s():t.signal?.addEventListener("abort",s,{once:!0});let i=xe({billingApiUrl:t.billingApiUrl,sessionId:t.sessionId,nonce:t.nonce,nextActionRedirectUrl:t.nextActionRedirectUrl,signal:n.signal,pollCompletionEndpoint:!1}),a=e.waitForCheckoutSessionCompletion(t.sessionId,{initialDelayMs:Cr,nonce:t.nonce,statusUrl:r,continueAfterActionRequired:!0,timeoutMs:V.THREE_DS_CHALLENGE_WINDOW_MS+15e3,signal:o.signal});a.catch(()=>{}),i.catch(()=>{});try{let c=await Promise.race([i,a]);if("data"in c)return c;if(c.status==="declined")throw(t.createDeclineError??_r)(c);if(c.status==="timeout")throw pt();return await a}catch(c){throw t.signal?.aborted||c instanceof Error&&c.name==="AbortError"?se(c):c}finally{t.signal?.removeEventListener("abort",s),n.abort(),o.abort()}}0&&(module.exports={FloPay,PaymentAPI,PciVaultCardCapture,SESSION_CREATE_TELEMETRY,StripeAdapter,cacheSessionDisplayData,clearSessionDisplayData,completeSavedCardNextAction,createCheckoutSession,createCheckoutSessionWithRetries,createSavedCardActionAbortedError,dropThirdPartyOnlyError,getSessionDisplayData,loadFloPay,runSavedCardChallenge,toStripeAppearance,toStripeAppearanceTheme});