@flopay/js 1.9.20 → 1.9.22

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.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { CreateSessionParams, CheckoutSessionResult, PaymentProviderAdapter, FloPayConfig, CaptureMethod, CardCaptureAdapter, CheckoutSession, NormalizedCheckoutSession, FloPayThemeVariables, FloPayAppearance } from '@flopay/shared';
2
2
  export { SentryEventLike, SentryStackFrameLike, dropThirdPartyOnlyError } from '@flopay/shared';
3
- export { C as CardCaptureOperation, P as PaymentAPI, a as PciVaultCardCapture, b as PciVaultCardCaptureConfig, S as SESSION_CREATE_TELEMETRY, c as SessionDisplayCacheData, d as SessionDisplayProduct, e as cacheSessionDisplayData, f as clearSessionDisplayData, g as getSessionDisplayData } from './card-setup-BqWr7ijS.cjs';
3
+ export { C as CardCaptureOperation, P as PaymentAPI, a as PciVaultCardCapture, b as PciVaultCardCaptureConfig, S as SESSION_CREATE_TELEMETRY, c as SessionDisplayCacheData, d as SessionDisplayProduct, e as cacheSessionDisplayData, f as clearSessionDisplayData, g as getSessionDisplayData } from './card-setup-Bo_lUHo9.cjs';
4
4
 
5
5
  declare function createCheckoutSession(options: CreateSessionParams): Promise<CheckoutSessionResult>;
6
6
  /**
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { CreateSessionParams, CheckoutSessionResult, PaymentProviderAdapter, FloPayConfig, CaptureMethod, CardCaptureAdapter, CheckoutSession, NormalizedCheckoutSession, FloPayThemeVariables, FloPayAppearance } from '@flopay/shared';
2
2
  export { SentryEventLike, SentryStackFrameLike, dropThirdPartyOnlyError } from '@flopay/shared';
3
- export { C as CardCaptureOperation, P as PaymentAPI, a as PciVaultCardCapture, b as PciVaultCardCaptureConfig, S as SESSION_CREATE_TELEMETRY, c as SessionDisplayCacheData, d as SessionDisplayProduct, e as cacheSessionDisplayData, f as clearSessionDisplayData, g as getSessionDisplayData } from './card-setup-BqWr7ijS.js';
3
+ export { C as CardCaptureOperation, P as PaymentAPI, a as PciVaultCardCapture, b as PciVaultCardCaptureConfig, S as SESSION_CREATE_TELEMETRY, c as SessionDisplayCacheData, d as SessionDisplayProduct, e as cacheSessionDisplayData, f as clearSessionDisplayData, g as getSessionDisplayData } from './card-setup-Bo_lUHo9.js';
4
4
 
5
5
  declare function createCheckoutSession(options: CreateSessionParams): Promise<CheckoutSessionResult>;
6
6
  /**
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as U,b as D,c as N,d as G,e as q,f as ve,g as _e,h as A,i as g,j as ke,k as Re,l as H,m as B,n as J}from"./chunk-ML2R6URI.mjs";import{dropThirdPartyOnlyError as ht}from"@flopay/shared";import{assertCaptureMethodEligible as Te,buildProductPayload as Ae,classifyTelemetryFailure as Ee,FloPayError as b,foldIntoProducts as Fe,IDEMPOTENCY_IN_PROGRESS_CODE as Ie,IDEMPOTENCY_KEY_HEADER as Me,resolveIdempotencyKey as Q,resolveSessionCurrency as xe,SDK_VERSION as X,telemetryStatusClass as Z}from"@flopay/shared";var L=5,ee=new WeakSet;function Oe(t){(typeof t=="object"&&t!==null||typeof t=="function")&&ee.add(t)}function Ue(t){return(typeof t=="object"&&t!==null||typeof t=="function")&&ee.has(t)}function De(t,e){let r=e?.error,o=U(e?.code)??U(r?.code)??`http_${t}`,i=D(e?.message)??D(r?.message)??Ne(o,t);return new b(i,"api_error",{code:o,statusCode:t})}function Ne(t,e){switch(t){case"CouponLimitExceeded":return`Too many coupon codes \u2014 a checkout session accepts at most ${L}.`;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 te(t,e,r){let{billingApiUrl:o,checkoutBaseUrl:i,items:n=[],subscriptions:l=[],products:a,account:c,successUrl:s,cancelUrl:d,checkoutMode:p="confirm",captureMethod:m,couponCodes:y=[],checkoutMetadata:K,tagsData:$,redirectParams:ge={},setCookie:he=!0,clientId:Ce,currency:we,utmMetadata:x,idempotencyKey:be}=t,Y=Q(be);if(y.length>L)throw new b(`Too many coupon codes \u2014 a checkout session accepts at most ${L}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let S=a??Fe(n,l);Te({captureMethod:m,products:S});let h=xe(we,n,l,S);if(!h)throw new b("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 P={clientId:Ce,checkoutVersion:X,successUrl:s,cancelUrl:d,currency:h,checkoutMode:p,products:S.map(f=>Ae(f,h)),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:y};m==="manual"&&(P.captureMethod=m),K!==void 0&&(P.checkoutMetadata=K),$&&(P.tagsData=$),x&&x.length>0&&(P.utmMetadata=x);let Se=`${o.replace(/\/+$/,"")}/v1/checkouts/sessions`,W={"Content-Type":"application/json"};Y&&(W[Me]=Y);let C,_,Pe={method:"POST",headers:W,body:JSON.stringify(P),signal:e},k;try{r?.startAttempt(),k=await fetch(Se,Pe)}catch(f){throw Oe(f),f}try{r?.record(k.status)}catch{}C=k.status;try{_=await k.json()}catch{}if(C>=400)throw De(C,_);if(C===201){let f=_?.data?.uuid,O=_?.data?.nonce;if(!f)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!O)throw new b("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"});(S.length>0||h)&&q(f,{currency:h,products:S.map(u=>({code:u.code??u.providerItemId??u.providerPlanId,type:u.type,name:u.name??u.itemName??u.providerItemName??u.subscriptionName??u.providerPlanName??null,totalAmount:u.totalAmount,overrideAmount:u.overrideAmount,currency:u.currency??h}))});let R=new URL(`${i.replace(/\/+$/,"")}/secure`);R.searchParams.set("id",f);for(let[u,T]of Object.entries(ge))R.searchParams.set(u,T);if(he&&typeof window<"u"&&typeof document<"u"){let u=JSON.stringify({origin_url:d}),T=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(u)}; domain=.${T}; path=/; max-age=3600; SameSite=Lax; Secure;`,document.cookie=`flopay_checkout_token=${encodeURIComponent(O)}; domain=.${T}; path=/; max-age=3600; SameSite=Lax; Secure;`}return typeof window<"u"&&(window.location.href=R.toString()),{status:201,redirectUrl:R.toString(),nonce:O}}return C===204?(typeof window<"u"&&(window.location.href=s),{status:204}):{status:C}}async function qe(t){let e=oe(t),r=re(e),o=N(t.timeoutMs);try{let i=await te(t,o.signal,r);return r.commit(),se(e,i),i}catch(i){throw r.commit(),E(e,i),i}finally{o.clear(),w(e.reporter)}}function re(t){let e=!1,r=t.startedAt,o;return{startAttempt(){r=t.reporter.now()},record(i){o={status:i,durationMs:Math.max(0,t.reporter.now()-r),attempt:t.attempt}},commit(){if(e||!o)return;e=!0;let i=Z(o.status);t.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:i,attempt:o.attempt}),t.reporter.performance({stage:"session_first_byte",durationMs:o.durationMs,durationMode:"machine",requestCategory:"session_create",statusClass:i,attempt:o.attempt})}}}function oe(t){let e=new g({billingApiUrl:t.billingApiUrl,sdkVersion:X,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 se(t,e){let r=Z(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 E(t,e){let{reporter:r}=t,o=Ee(e,"CHECKOUT_SESSION_CREATE_FAILED");if(r.performance({stage:"session_create",durationMs:r.now()-t.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:t.attempt}),e instanceof b&&e.type==="validation_error"){r.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"});return}if(o.statusClass==="4xx"){r.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create",statusClass:"4xx"});return}r.error({...o,stage:"session_create",requestCategory:"session_create"})}function w(t){t.flush().catch(()=>{}).finally(()=>t.destroy())}async function Be(t){let{maxRetries:e=2,...r}=t,o=oe(t),i=re(o);if(!Number.isFinite(e)||!Number.isInteger(e)||e<0||e>=3)throw o.reporter.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"}),w(o.reporter),new Error(`Number of retries must be an integer between 0 and ${2}`);let n={...r,idempotencyKey:Q(r.idempotencyKey)},l=N(r.timeoutMs),a;for(let c=0;c<=e;c++){o.attempt=c;try{let s=await te(n,l.signal,i);return i.commit(),se(o,s),l.clear(),w(o.reporter),s}catch(s){a=s;let d=s instanceof Error&&s.name==="AbortError",p=Ue(s),m=s instanceof b&&s.code===Ie;if((d||p||m)&&!l.signal.aborted&&c<e){o.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:c+1});try{await G(c,l.signal)}catch(y){throw i.commit(),E(o,y),l.clear(),w(o.reporter),y}continue}throw i.commit(),E(o,s),l.clear(),w(o.reporter),s}}throw i.commit(),E(o,a),l.clear(),w(o.reporter),a??new Error("Unknown error during checkout session creation")}import{classifyTelemetryFailure as je,FloPayError as F,resolveBillingApiUrl as ce,SDK_VERSION as Le}from"@flopay/shared";var ne=Symbol.for("@flopay/js.telemetry.bridge.v1");function ie(t,e,r){let o=()=>e?.now()??r();Object.defineProperty(t,ne,{configurable:!1,enumerable:!1,writable:!1,value:{error:n=>e?.error(n),log:n=>e?.log(n),performance:n=>e?.performance(n),terminal:n=>e?.terminal(n),now:o,elapsed:n=>Math.max(0,o()-n),setCheckoutContext:n=>e?.setCheckoutContext(n),beginCheckout:(n={})=>e?.beginCheckout(n)??o(),disable:()=>e?.disable(),subscribe:n=>e?.subscribe(n)??(()=>{}),flush:()=>e?.flush()??Promise.resolve()}})}function ae(t){return t[ne]}var I=class{now(){return this.telemetryReporter?.now?.()??A()}constructor(e,r,o){this.provider=e,this.config=r,this.telemetryReporter=o??new g({billingApiUrl:ce(r.billingApiUrl),sdkVersion:Le,enabled:r.telemetry!==!1}),ie(this,this.telemetryReporter,A)}cardCapture(e){return this.telemetryReporter?.log({name:"vault.capture.requested",stage:"vault_request",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?J({sessionId:e?.sessionId,captureMethod:e?.captureMethod},this.telemetryReporter):new B({sessionId:e?.sessionId,captureMethod:e?.captureMethod,telemetry:!1})}async retrieveSession(e,r){if(!e)throw new F("sessionId is required to retrieve a session.","validation_error",{param:"sessionId"});let o=await this.retrieveUnifiedSession(e,r);if(!o.data.session)throw new F("Session not found","api_error");return o.data.session}async retrieveUnifiedSession(e,r){if(!e)throw new F("sessionId is required.","validation_error",{param:"sessionId"});let o=ce(r??this.config.billingApiUrl),i=this.now();this.telemetryReporter?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let n,l,a=s=>{if(n===void 0)return;let d=n,p=l;n=void 0,l=void 0,this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:s,attempt:p}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:d,durationMode:"machine",requestCategory:"session_read",statusClass:s,attempt:p})},c=H(o,{now:()=>this.telemetryReporter?.now()??A(),onFirstByte:(s,d)=>{n=s,l=d},onRetry:(s,d)=>{this.telemetryReporter?.log({name:"operation.retry",stage:s==="session_read"?"session_read":"processing",requestCategory:s,attempt:d})}});try{let s=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()-i,durationMode:"machine",requestCategory:"session_read",statusClass:"2xx"}),s}catch(s){let d=je(s,s instanceof F&&s.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()-i,durationMode:"machine",requestCategory:"session_read",statusClass:d.statusClass}),s}}getRawProvider(){return this.provider.getRawProvider()}destroy(){this.telemetryReporter?.log({name:"checkout.unmount",stage:"unmount"}),this.telemetryReporter?.destroy(),this.provider.destroy()}};function le(t,e,r){let o=I;return new o(t,e,r)}import{FloPayError as Ke,resolveBillingApiUrl as z,SDK_VERSION as ye}from"@flopay/shared";import{FloPayError as de}from"@flopay/shared";import{loadStripe as ze}from"@stripe/stripe-js";var ue=new WeakSet;function pe(t){return t instanceof de&&ue.has(t)}function me(t){switch(t){case"night":return"night";case"flat":return"flat";default:return"stripe"}}function Ve(t){return{...t,theme:me(t.theme)}}var v=class{constructor(){this.name="stripe";this.stripe=null}async initialize(e){if(typeof window>"u")return;let r=await ze(e.publishableKey,{locale:e.locale??"auto"});if(!r){let o=new de("Failed to initialize Stripe. Check your publishable key.","authentication_error");throw ue.add(o),o}this.stripe=r}getRawProvider(){return this.stripe}destroy(){this.stripe=null}};var fe=new Map;function V(t){return Array.isArray(t)?t.map(V):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0).sort(([e],[r])=>e.localeCompare(r)).map(([e,r])=>[e,V(r)])):t}function $e(t,e){return JSON.stringify([t,z(e?.billingApiUrl),e?.telemetry!==!1,e?.locale??"auto",e?.apiVersion??null,V(e?.appearance??null)])}var M=new Map;async function Ye(t,e){if(!t){let a=new g({billingApiUrl:z(e?.billingApiUrl),sdkVersion:ye,enabled:e?.telemetry!==!1});throw a.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),a.flush().catch(()=>{}).finally(()=>a.destroy()),new Ke("A publishable key is required to initialize FloPay.","validation_error",{param:"publishableKey"})}let r=$e(t,e),o=fe.get(r);if(o)return e?.telemetry!==!1&&ae(o)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),o;let i=M.get(r);if(i)return i;let n={...e,publishableKey:t},l=(async()=>{let a=new g({billingApiUrl:z(n.billingApiUrl),sdkVersion:ye,enabled:n.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 s=new v,d=a.now();try{await s.initialize(n)}catch(y){throw a.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:pe(y)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),a.destroy(),y}let p=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:p-c,durationMode:"machine",provider:"stripe"}),a.performance({stage:"provider_ready",durationMs:p-d,durationMode:"machine",provider:"stripe"});let m=le(s,n,a);return fe.set(r,m),m})();M.set(r,l);try{return await l}finally{M.get(r)===l&&M.delete(r)}}export{I as FloPay,Re as PaymentAPI,B as PciVaultCardCapture,ke as SESSION_CREATE_TELEMETRY,v as StripeAdapter,q as cacheSessionDisplayData,_e as clearSessionDisplayData,qe as createCheckoutSession,Be as createCheckoutSessionWithRetries,ht as dropThirdPartyOnlyError,ve as getSessionDisplayData,Ye as loadFloPay,Ve as toStripeAppearance,me as toStripeAppearanceTheme};
1
+ import{a as U,b as D,c as N,d as G,e as q,f as ve,g as _e,h as A,i as g,j as ke,k as Re,l as H,m as B,n as J}from"./chunk-BXDCVA3N.mjs";import{dropThirdPartyOnlyError as ht}from"@flopay/shared";import{assertCaptureMethodEligible as Te,buildProductPayload as Ae,classifyTelemetryFailure as Ee,FloPayError as b,foldIntoProducts as Fe,IDEMPOTENCY_IN_PROGRESS_CODE as Ie,IDEMPOTENCY_KEY_HEADER as Me,resolveIdempotencyKey as Q,resolveSessionCurrency as xe,SDK_VERSION as X,telemetryStatusClass as Z}from"@flopay/shared";var L=5,ee=new WeakSet;function Oe(t){(typeof t=="object"&&t!==null||typeof t=="function")&&ee.add(t)}function Ue(t){return(typeof t=="object"&&t!==null||typeof t=="function")&&ee.has(t)}function De(t,e){let r=e?.error,o=U(e?.code)??U(r?.code)??`http_${t}`,i=D(e?.message)??D(r?.message)??Ne(o,t);return new b(i,"api_error",{code:o,statusCode:t})}function Ne(t,e){switch(t){case"CouponLimitExceeded":return`Too many coupon codes \u2014 a checkout session accepts at most ${L}.`;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 te(t,e,r){let{billingApiUrl:o,checkoutBaseUrl:i,items:n=[],subscriptions:l=[],products:a,account:c,successUrl:s,cancelUrl:d,checkoutMode:p="confirm",captureMethod:m,couponCodes:y=[],checkoutMetadata:K,tagsData:$,redirectParams:ge={},setCookie:he=!0,clientId:Ce,currency:we,utmMetadata:x,idempotencyKey:be}=t,Y=Q(be);if(y.length>L)throw new b(`Too many coupon codes \u2014 a checkout session accepts at most ${L}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let S=a??Fe(n,l);Te({captureMethod:m,products:S});let h=xe(we,n,l,S);if(!h)throw new b("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 P={clientId:Ce,checkoutVersion:X,successUrl:s,cancelUrl:d,currency:h,checkoutMode:p,products:S.map(f=>Ae(f,h)),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:y};m==="manual"&&(P.captureMethod=m),K!==void 0&&(P.checkoutMetadata=K),$&&(P.tagsData=$),x&&x.length>0&&(P.utmMetadata=x);let Se=`${o.replace(/\/+$/,"")}/v1/checkouts/sessions`,W={"Content-Type":"application/json"};Y&&(W[Me]=Y);let C,_,Pe={method:"POST",headers:W,body:JSON.stringify(P),signal:e},k;try{r?.startAttempt(),k=await fetch(Se,Pe)}catch(f){throw Oe(f),f}try{r?.record(k.status)}catch{}C=k.status;try{_=await k.json()}catch{}if(C>=400)throw De(C,_);if(C===201){let f=_?.data?.uuid,O=_?.data?.nonce;if(!f)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!O)throw new b("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"});(S.length>0||h)&&q(f,{currency:h,products:S.map(u=>({code:u.code??u.providerItemId??u.providerPlanId,type:u.type,name:u.name??u.itemName??u.providerItemName??u.subscriptionName??u.providerPlanName??null,totalAmount:u.totalAmount,overrideAmount:u.overrideAmount,currency:u.currency??h}))});let R=new URL(`${i.replace(/\/+$/,"")}/secure`);R.searchParams.set("id",f);for(let[u,T]of Object.entries(ge))R.searchParams.set(u,T);if(he&&typeof window<"u"&&typeof document<"u"){let u=JSON.stringify({origin_url:d}),T=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(u)}; domain=.${T}; path=/; max-age=3600; SameSite=Lax; Secure;`,document.cookie=`flopay_checkout_token=${encodeURIComponent(O)}; domain=.${T}; path=/; max-age=3600; SameSite=Lax; Secure;`}return typeof window<"u"&&(window.location.href=R.toString()),{status:201,redirectUrl:R.toString(),nonce:O}}return C===204?(typeof window<"u"&&(window.location.href=s),{status:204}):{status:C}}async function qe(t){let e=oe(t),r=re(e),o=N(t.timeoutMs);try{let i=await te(t,o.signal,r);return r.commit(),se(e,i),i}catch(i){throw r.commit(),E(e,i),i}finally{o.clear(),w(e.reporter)}}function re(t){let e=!1,r=t.startedAt,o;return{startAttempt(){r=t.reporter.now()},record(i){o={status:i,durationMs:Math.max(0,t.reporter.now()-r),attempt:t.attempt}},commit(){if(e||!o)return;e=!0;let i=Z(o.status);t.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:i,attempt:o.attempt}),t.reporter.performance({stage:"session_first_byte",durationMs:o.durationMs,durationMode:"machine",requestCategory:"session_create",statusClass:i,attempt:o.attempt})}}}function oe(t){let e=new g({billingApiUrl:t.billingApiUrl,sdkVersion:X,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 se(t,e){let r=Z(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 E(t,e){let{reporter:r}=t,o=Ee(e,"CHECKOUT_SESSION_CREATE_FAILED");if(r.performance({stage:"session_create",durationMs:r.now()-t.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:t.attempt}),e instanceof b&&e.type==="validation_error"){r.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"});return}if(o.statusClass==="4xx"){r.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create",statusClass:"4xx"});return}r.error({...o,stage:"session_create",requestCategory:"session_create"})}function w(t){t.flush().catch(()=>{}).finally(()=>t.destroy())}async function Be(t){let{maxRetries:e=2,...r}=t,o=oe(t),i=re(o);if(!Number.isFinite(e)||!Number.isInteger(e)||e<0||e>=3)throw o.reporter.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"}),w(o.reporter),new Error(`Number of retries must be an integer between 0 and ${2}`);let n={...r,idempotencyKey:Q(r.idempotencyKey)},l=N(r.timeoutMs),a;for(let c=0;c<=e;c++){o.attempt=c;try{let s=await te(n,l.signal,i);return i.commit(),se(o,s),l.clear(),w(o.reporter),s}catch(s){a=s;let d=s instanceof Error&&s.name==="AbortError",p=Ue(s),m=s instanceof b&&s.code===Ie;if((d||p||m)&&!l.signal.aborted&&c<e){o.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:c+1});try{await G(c,l.signal)}catch(y){throw i.commit(),E(o,y),l.clear(),w(o.reporter),y}continue}throw i.commit(),E(o,s),l.clear(),w(o.reporter),s}}throw i.commit(),E(o,a),l.clear(),w(o.reporter),a??new Error("Unknown error during checkout session creation")}import{classifyTelemetryFailure as je,FloPayError as F,resolveBillingApiUrl as ce,SDK_VERSION as Le}from"@flopay/shared";var ne=Symbol.for("@flopay/js.telemetry.bridge.v1");function ie(t,e,r){let o=()=>e?.now()??r();Object.defineProperty(t,ne,{configurable:!1,enumerable:!1,writable:!1,value:{error:n=>e?.error(n),log:n=>e?.log(n),performance:n=>e?.performance(n),terminal:n=>e?.terminal(n),now:o,elapsed:n=>Math.max(0,o()-n),setCheckoutContext:n=>e?.setCheckoutContext(n),beginCheckout:(n={})=>e?.beginCheckout(n)??o(),disable:()=>e?.disable(),subscribe:n=>e?.subscribe(n)??(()=>{}),flush:()=>e?.flush()??Promise.resolve()}})}function ae(t){return t[ne]}var I=class{now(){return this.telemetryReporter?.now?.()??A()}constructor(e,r,o){this.provider=e,this.config=r,this.telemetryReporter=o??new g({billingApiUrl:ce(r.billingApiUrl),sdkVersion:Le,enabled:r.telemetry!==!1}),ie(this,this.telemetryReporter,A)}cardCapture(e){return this.telemetryReporter?.log({name:"vault.capture.requested",stage:"vault_request",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?J({sessionId:e?.sessionId,captureMethod:e?.captureMethod},this.telemetryReporter):new B({sessionId:e?.sessionId,captureMethod:e?.captureMethod,telemetry:!1})}async retrieveSession(e,r){if(!e)throw new F("sessionId is required to retrieve a session.","validation_error",{param:"sessionId"});let o=await this.retrieveUnifiedSession(e,r);if(!o.data.session)throw new F("Session not found","api_error");return o.data.session}async retrieveUnifiedSession(e,r){if(!e)throw new F("sessionId is required.","validation_error",{param:"sessionId"});let o=ce(r??this.config.billingApiUrl),i=this.now();this.telemetryReporter?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let n,l,a=s=>{if(n===void 0)return;let d=n,p=l;n=void 0,l=void 0,this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:s,attempt:p}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:d,durationMode:"machine",requestCategory:"session_read",statusClass:s,attempt:p})},c=H(o,{now:()=>this.telemetryReporter?.now()??A(),onFirstByte:(s,d)=>{n=s,l=d},onRetry:(s,d)=>{this.telemetryReporter?.log({name:"operation.retry",stage:s==="session_read"?"session_read":"processing",requestCategory:s,attempt:d})}});try{let s=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()-i,durationMode:"machine",requestCategory:"session_read",statusClass:"2xx"}),s}catch(s){let d=je(s,s instanceof F&&s.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()-i,durationMode:"machine",requestCategory:"session_read",statusClass:d.statusClass}),s}}getRawProvider(){return this.provider.getRawProvider()}destroy(){this.telemetryReporter?.log({name:"checkout.unmount",stage:"unmount"}),this.telemetryReporter?.destroy(),this.provider.destroy()}};function le(t,e,r){let o=I;return new o(t,e,r)}import{FloPayError as Ke,resolveBillingApiUrl as z,SDK_VERSION as ye}from"@flopay/shared";import{FloPayError as de}from"@flopay/shared";import{loadStripe as ze}from"@stripe/stripe-js";var ue=new WeakSet;function pe(t){return t instanceof de&&ue.has(t)}function me(t){switch(t){case"night":return"night";case"flat":return"flat";default:return"stripe"}}function Ve(t){return{...t,theme:me(t.theme)}}var v=class{constructor(){this.name="stripe";this.stripe=null}async initialize(e){if(typeof window>"u")return;let r=await ze(e.publishableKey,{locale:e.locale??"auto"});if(!r){let o=new de("Failed to initialize Stripe. Check your publishable key.","authentication_error");throw ue.add(o),o}this.stripe=r}getRawProvider(){return this.stripe}destroy(){this.stripe=null}};var fe=new Map;function V(t){return Array.isArray(t)?t.map(V):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0).sort(([e],[r])=>e.localeCompare(r)).map(([e,r])=>[e,V(r)])):t}function $e(t,e){return JSON.stringify([t,z(e?.billingApiUrl),e?.telemetry!==!1,e?.locale??"auto",e?.apiVersion??null,V(e?.appearance??null)])}var M=new Map;async function Ye(t,e){if(!t){let a=new g({billingApiUrl:z(e?.billingApiUrl),sdkVersion:ye,enabled:e?.telemetry!==!1});throw a.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),a.flush().catch(()=>{}).finally(()=>a.destroy()),new Ke("A publishable key is required to initialize FloPay.","validation_error",{param:"publishableKey"})}let r=$e(t,e),o=fe.get(r);if(o)return e?.telemetry!==!1&&ae(o)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),o;let i=M.get(r);if(i)return i;let n={...e,publishableKey:t},l=(async()=>{let a=new g({billingApiUrl:z(n.billingApiUrl),sdkVersion:ye,enabled:n.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 s=new v,d=a.now();try{await s.initialize(n)}catch(y){throw a.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:pe(y)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),a.destroy(),y}let p=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:p-c,durationMode:"machine",provider:"stripe"}),a.performance({stage:"provider_ready",durationMs:p-d,durationMode:"machine",provider:"stripe"});let m=le(s,n,a);return fe.set(r,m),m})();M.set(r,l);try{return await l}finally{M.get(r)===l&&M.delete(r)}}export{I as FloPay,Re as PaymentAPI,B as PciVaultCardCapture,ke as SESSION_CREATE_TELEMETRY,v as StripeAdapter,q as cacheSessionDisplayData,_e as clearSessionDisplayData,qe as createCheckoutSession,Be as createCheckoutSessionWithRetries,ht as dropThirdPartyOnlyError,ve as getSessionDisplayData,Ye as loadFloPay,Ve as toStripeAppearance,me as toStripeAppearanceTheme};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flopay/js",
3
- "version": "1.9.20",
3
+ "version": "1.9.22",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "publishConfig": {
@@ -32,7 +32,7 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "@stripe/stripe-js": "^9.8.0",
35
- "@flopay/shared": "1.9.20"
35
+ "@flopay/shared": "1.9.22"
36
36
  },
37
37
  "devDependencies": {
38
38
  "jsdom": "^29.1.1",
@@ -1 +0,0 @@
1
- var xe="flopay_session_display:";var O=new Map;function q(s){return`${xe}${s}`}function z(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function B(s,e,t){if(!s)return;let r=t?.ttlMs??36e5,n={data:e,expiresAt:Date.now()+r},o=z();if(o)try{o.setItem(q(s),JSON.stringify(n));return}catch{}O.set(s,n)}function ee(s){if(!s)return null;let e=z();if(e)try{let r=e.getItem(q(s));if(r){let n=JSON.parse(r);if(n&&typeof n.expiresAt=="number"&&n.expiresAt>Date.now())return n.data;e.removeItem(q(s))}}catch{}let t=O.get(s);if(t){if(t.expiresAt>Date.now())return t.data;O.delete(s)}return null}function te(s){if(!s)return;O.delete(s);let e=z();if(e)try{e.removeItem(q(s))}catch{}}import{assertCaptureMethodEligible as ce,buildProductPayload as J,classifyPaymentRejection as Ye,classifyTelemetryFailure as D,FLO_SDK_VERSION_HEADER as j,FloPayError as y,foldIntoProducts as K,IDEMPOTENCY_IN_PROGRESS_CODE as We,IDEMPOTENCY_KEY_HEADER as ue,isCardHolderNamePlaceholder as fe,isDetachedSessionEligible as Je,isUuidV4 as le,isValidEmail as de,normalizeCheckoutFailureOutcome as me,PAYPAL_VAULTED_PAYMENT_METHOD_TYPE as $,randomUuidV4 as Qe,resolveIdempotencyKey as Xe,resolveSessionCurrency as G,SDK_VERSION as R,telemetryStatusClass as b}from"@flopay/shared";function re(s){return typeof s=="string"&&s.trim()?s:void 0}function se(s){if(typeof s=="string")return s.trim()?s:void 0;if(Array.isArray(s))return s.filter(t=>typeof t=="string"&&t.trim().length>0).join("; ")||void 0}function S(s=12e3){let e=Number.isFinite(s)&&s>=0?s:12e3,t=new AbortController,r=setTimeout(()=>t.abort(),e);return{signal:t.signal,clear:()=>clearTimeout(r)}}function Oe(){return Object.assign(new Error("The operation was aborted."),{name:"AbortError"})}function F(s,e){let t=150*2**s,r=Math.round(t*(.75+Math.random()*.5));return new Promise((n,o)=>{let i,c=()=>e.removeEventListener("abort",a),a=()=>{i!==void 0&&clearTimeout(i),c(),o(Oe())};if(e.aborted){a();return}i=setTimeout(()=>{c(),n()},r),e.addEventListener("abort",a,{once:!0})})}import{buildTelemetryErrorEvent as ne,buildTelemetryLogEvent as qe,buildTelemetryPerformanceEvent as Fe,buildTelemetryTerminalEvent as Le,serializeTelemetryBatch as Ue,TELEMETRY_MAX_BATCH_BYTES as Ne}from"@flopay/shared";var Ve="/v1/sdk-telemetry/events",H=16,ze=64,Be=1500,oe=1e3,He=64,je="00000000-0000-4000-8000-000000000000",Ke={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function A(){try{return globalThis.crypto.randomUUID()}catch{let s=new Uint8Array(16);try{globalThis.crypto.getRandomValues(s)}catch{for(let t=0;t<s.length;t+=1)s[t]=Math.floor(Math.random()*256)}s[6]=(s[6]??0)&15|64,s[8]=(s[8]??0)&63|128;let e=[...s].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 $e(s){try{return new TextEncoder().encode(s).byteLength}catch{return s.length}}function Ge(s){return JSON.stringify([s.code,s.failureCategory,s.stage,s.provider,s.attempt,s.statusClass,s.requestCategory,s.paymentMethodCategory,s.walletType,s.operationOutcome,s.checkoutMode,s.layout,s.inAppBrowser,s.appFamily,s.popupCapability,s.presentationMode,s.terminalReason])}function v(){return globalThis.performance?.now()??0}var T=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(/\/+$/,"")}${Ve}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=A(),this.merchantEnabled=e.enabled!==!1,this.clock=e.clock??v,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(qe({...this.checkoutContext,...e,eventId:A(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=ne({...this.checkoutContext,...e,eventId:je,sequence:0}),r=Ge(t),n=this.now();this.pruneReportedFailures(n);let o=this.reportedFailures.get(r);if(o!==void 0&&n>=o&&n-o<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(r,n),this.enqueue(ne({...this.checkoutContext,...e,eventId:A(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue(Fe({...this.checkoutContext,...e,eventId:A(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue(Le({...this.checkoutContext,...e,eventId:A(),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 v()}}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,r]of this.reportedFailures)(e<r||e-r>=oe)&&this.reportedFailures.delete(t)}rememberReportedFailure(e,t){for(;this.reportedFailures.size>=He;){let r=this.reportedFailures.keys().next();if(r.done)break;this.reportedFailures.delete(r.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>=ze||this.eventCounts[e.class]>=Ke[e.class])){if(this.eventCounts[e.class]+=1,this.queue.push(e),this.queue.length>=H){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,H);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,H);this.sendBatch(e)}}async sendBatch(e){if(!this.browserTransportAvailable||this.ingestionDisabled)return;let t=Ue(e,{correlationId:this.correlationId,sdkPackage:this.sdkPackage,sdkVersion:this.sdkVersion,batchId:A()});if($e(t)>Ne)return;let r=typeof AbortController>"u"?null:new AbortController,n=null;try{let o=fetch(this.endpoint,{method:"POST",headers:{"content-type":"text/plain;charset=UTF-8"},body:t,credentials:"omit",keepalive:!0,referrerPolicy:"no-referrer",signal:r?.signal}).then(async a=>{if(a.status!==202)return null;let u=null;try{u=await a.json()}catch{}return u?.status==="disabled"?"disabled":null}).catch(()=>null),i=new Promise(a=>{n=setTimeout(()=>{r?.abort(),a(null)},Be)});await Promise.race([o,i])==="disabled"&&this.disableFromIngestion()}catch{}finally{n&&clearTimeout(n)}}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)}},ie=Symbol.for("@flopay/js.telemetry.reporter-factory.v1"),ae=globalThis;ae[ie]===void 0&&Object.defineProperty(ae,ie,{configurable:!0,enumerable:!1,writable:!1,value:s=>new T(s)});var pe=0,Ze=500,et=15e3,tt=3e3,rt=1e4,st=1e4;function nt(s){return typeof s=="object"&&s!==null}function E(s,e){return re(s?.[e])}function he(s,e){return se(s?.[e])}function ot(s,e){let t=s?.[e];return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Ce(s){return new Promise(e=>setTimeout(e,s))}function it(s){return s instanceof Error&&s.name==="AbortError"}function L(){return new y("Checkout is still processing. Please try again shortly.","api_error",{code:"checkout_processing_timeout"})}async function _(s,e){let t=await s.json().catch(()=>null),r=nt(t?.error)?t.error:null,n=he(t,"message")??he(r,"message")??e,o=E(t,"code")??E(t,"gatewayErrorCode")??E(r,"code")??`http_${s.status}`;return new y(n,"api_error",{code:o,statusCode:s.status})}async function at(s){let e=s.status===400?await s.clone().json().catch(()=>null):null;return Ye(s.status,e)}function ye(s){return s===400||s===422}var U=2;async function Y(s,e,t=U,r,n){let o;for(let i=0;;i++)try{return n?.(i),await fetch(s,e)}catch(c){if(e?.signal?.aborted||c instanceof Error&&c.name==="AbortError")throw c;if(o=c,i>=t)throw o;try{r?.(i+1)}catch{}await Ce(150*2**i)}}var ct=Symbol.for("@flopay/js.session-create.telemetry.v1");function ut(s){return s[ct]}function lt(s){return"now"in s||"onFirstByte"in s||"onSessionCreateFailure"in s||"onRetry"in s}function ve(s){let e=fe(s.firstName,s.lastName);return{userId:s.userId,firstName:e?null:s.firstName??null,lastName:e?null:s.lastName??null,email:s.email,country:s.country??null,gender:s.gender??null,city:s.city??null,state:s.state??null,zip:s.zip??null,addressLine1:s.addressLine1??null,addressLine2:s.addressLine2??null}}function Te(s,e){e.checkoutMetadata!==void 0&&(s.checkoutMetadata=e.checkoutMetadata),e.tagsData&&(s.tagsData=e.tagsData),e.utmMetadata&&e.utmMetadata.length>0&&(s.utmMetadata=e.utmMetadata),e.avsCheck!==void 0&&(s.avsCheck=e.avsCheck),e.checkoutType&&(s.checkoutType=e.checkoutType),e.checkoutLayout&&(s.checkoutLayout=e.checkoutLayout),e.avsConfig&&(s.avsConfig=e.avsConfig)}function dt(s,e){let t={clientId:s.clientId,checkoutVersion:R,successUrl:s.successUrl,cancelUrl:s.cancelUrl,currency:e,checkoutMode:"full",deferDataAttachment:!0};return s.captureMethod==="manual"&&(t.captureMethod=s.captureMethod),s.account.country&&(t.accountData={country:s.account.country}),Te(t,s),t}function ge(s,e,t){return{currency:e,products:t.map(r=>J(r,e)),couponCodes:s.couponCodes??[],accountData:ve(s.account)}}function mt(s,e,t){return{currency:e,products:t.map(r=>J(r,e)),couponCodes:s.couponCodes??[]}}function pt(s){let e={},t=fe(s.firstName,s.lastName);for(let[r,n]of Object.entries(s)){if(t&&r.endsWith("Name")||typeof n!="string")continue;let o=n.trim();o&&(e[r]=o)}return{accountData:e}}var k=class k{constructor(e,t={}){this.baseUrl=e.replace(/\/+$/,"");let r=lt(t);this.telemetryHooks=r?t:void 0,this.directTelemetry=r||t.telemetry===!1?void 0:new T({billingApiUrl:this.baseUrl,sdkVersion:R})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,t,r,n,o="unknown"){let i=D(e,t);this.directTelemetry?.error({...i,stage:r,requestCategory:n,paymentMethodCategory:o})}reportAccountSnapshotFailure(e,t){let r=D(e,"NETWORK_REQUEST_FAILED");if(t==="best_effort"&&r.errorCode==="REQUEST_TIMEOUT"){this.directTelemetry?.log({name:"operation.fallback",stage:"processing",requestCategory:"account_snapshot",statusClass:"timeout"});return}this.directTelemetry?.error({...r,stage:"processing",requestCategory:"account_snapshot",paymentMethodCategory:"unknown"})}telemetryTimestamp(){try{return this.telemetryHooks?.now?.()??this.directTelemetry?.now()??v()}catch{return v()}}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,r=!0){this.beginDirectTelemetryCheckout(e);let n=this.telemetryTimestamp(),o=n,i=0;this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let c={[j]:R};t&&(c["x-checkout-session-token"]=t);try{let a=await Y(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:c},U,d=>{this.telemetryHooks?.onRetry?.("session_read",d),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:d})},d=>{i=d,o=this.telemetryTimestamp()}),u=Math.max(0,this.telemetryTimestamp()-o);try{this.telemetryHooks?.onFirstByte?.(u,i)}catch{}let l=`${Math.floor(a.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:l,attempt:i}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:u,durationMode:"machine",requestCategory:"session_read",statusClass:l,attempt:i}),!a.ok)throw await _(a,"Failed to get checkout session");let m=await a.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:l}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"session_read",statusClass:l}),{...m,data:this.mergeCachedDisplayData(m.data)}}catch(a){throw r&&this.directTelemetry?.error({...D(a,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),a}}cacheSessionDisplayData(e,t,r){B(e,t,r)}clearSessionDisplayData(e){te(e)}async getVaultCapture(e,t){let r=`${this.baseUrl}\0${e}\0${t??""}`,n=k.activeVaultCaptureRequests.get(r);if(n)return n;let o=this.requestVaultCapture(e,t);k.activeVaultCaptureRequests.set(r,o);try{return await o}finally{k.activeVaultCaptureRequests.get(r)===o&&k.activeVaultCaptureRequests.delete(r)}}async requestVaultCapture(e,t){let r=new AbortController,n=setTimeout(()=>r.abort(),st);this.beginDirectTelemetryCheckout(e);let o=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 c=await Y(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:r.signal},U,u=>{this.telemetryHooks?.onRetry?.("vault_capture",u),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:u})});if(!c.ok)throw await _(c,"Failed to load the secure card form");let a=await c.json();return this.directTelemetry?.performance({stage:"vault_request",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"vault_capture",paymentMethodCategory:"card",statusClass:"2xx"}),this.toVaultBlock(a)}catch(c){let a=r.signal.aborted?new y("Timed out while loading the secure card form. Please try again.","api_error",{code:"vault_capture_timeout"}):c;throw this.reportDirectFailure(a,"VAULT_LOAD_FAILED","vault_request","vault_capture","card"),a}finally{clearTimeout(n)}}async getUnifiedCheckoutSession(e,t){let r=await this.getCheckoutSession(e,t);return this.normalizeCheckoutSessionResponse(r)}async getUnifiedCheckoutSessionForRecovery(e,t){let r=await this.fetchCheckoutSession(e,t,!1);return this.normalizeCheckoutSessionResponse(r)}normalizeCheckoutSessionResponse(e){let t=this.normalizeRawSession(e.data),r=e.vault;return r&&t.data.session&&(t.data.session.vault=this.toVaultBlock(r)),t}async processPayment(e,t,r){this.beginDirectTelemetryCheckout(t.sessionId);let n=t.paymentMethodCategory??"unknown";if(!t.nonce)throw this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:n}),new y("processPayment requires `nonce` \u2014 pass the value returned from session creation.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.processing.started",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:n});let{nonce:i,paymentMethodCategory:c,...a}=t,u;try{u=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(a)})}catch(l){if(it(l))throw this.reportDirectFailure(l,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),l;u=await this.reconcileProcessPayment(t.sessionId,{...r,nonce:i,paymentMethodCategory:n})}if(!u.ok&&u.status!==202){let l=await at(u);return l?this.directTelemetry?.terminal({outcome:l,stage:"processing",requestCategory:"process_payment",statusClass:"4xx",paymentMethodCategory:n}):this.directTelemetry?.error({errorCode:"PAYMENT_PROCESSING_FAILED",stage:"processing",requestCategory:"process_payment",statusClass:b(u.status),failureCategory:u.status>=500?"server_error":void 0,paymentMethodCategory:n}),u}try{let l=await this.resolveProcessResponse(u,t.sessionId,{...r,nonce:i,paymentMethodCategory:n});return this.directTelemetry?.log({name:"payment.processing.completed",stage:"processing",requestCategory:"process_payment",statusClass:b(l.status),paymentMethodCategory:n}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"process_payment",statusClass:b(l.status),paymentMethodCategory:n}),l}catch(l){throw l instanceof y&&l.code==="checkout_processing_timeout"||this.reportDirectFailure(l,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),l}}async patchAccountSnapshot(e,t,r,n){this.beginDirectTelemetryCheckout(e);let o=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.state_transition",stage:"processing",requestCategory:"account_snapshot"});let i=n?.timeoutMs??rt,c=new AbortController,a=()=>c.abort();n?.signal&&(n.signal.aborted?c.abort():n.signal.addEventListener("abort",a,{once:!0}));let u=setTimeout(()=>c.abort(),i);try{let l;try{l=await Y(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/account`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t},body:JSON.stringify(r),signal:c.signal},U,m=>{this.telemetryHooks?.onRetry?.("account_snapshot",m),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:m})})}finally{clearTimeout(u),n?.signal?.removeEventListener("abort",a)}if(!l.ok)throw await _(l,"Failed to persist account snapshot");this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"account_snapshot",statusClass:"2xx"})}catch(l){throw this.reportAccountSnapshotFailure(l,n?.telemetryMode??"blocking"),l}}async createSessionIntent(e,t,r,n){if(!t)throw new y("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.paymentMethodType,c=typeof i=="string"&&i.trim().toLowerCase()==="card",a=typeof i=="string"&&i.length>0&&!c&&(typeof o.paymentMethodId=="string"||o.paymentMethodId===null),u=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(o.intentKind==="payment"||o.intentKind==="setup"),l=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodId===null&&(o.paymentMethodType==="paypal"&&o.intentKind==="payment"||o.paymentMethodType===$&&(o.intentKind==="payment"||o.intentKind==="setup"));if(!a||!u&&!l)throw new y("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let m=o.authorizationAttemptId;if(m!==void 0&&!le(m))throw new y("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let d=le(m)?m:Qe();this.beginDirectTelemetryCheckout(e);let f=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let g={"Content-Type":"application/json","x-checkout-session-token":t,[ue]:n?.idempotencyKey||d},C=!1;try{let p=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:g,body:JSON.stringify({...r,authorizationAttemptId:d}),signal:n?.signal});if(!p.ok){C=!0;let V=await _(p,"Failed to create checkout intent"),De=D(V,"PAYMENT_PROCESSING_FAILED");throw ye(V.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...De,stage:"processing",requestCategory:"intent_create"}),V}let w=(await p.json()).data;if(!w||typeof w!="object")throw new y("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let h=w,Z=h.paymentMethodType,Ee=(h.paymentMethodCategory==="wallet"||h.paymentMethodCategory==="apm")&&typeof Z=="string"&&Z.trim().toLowerCase()!=="card"&&(typeof h.paymentMethodId=="string"||h.paymentMethodId===null)&&typeof h.providerObjectId=="string",we=h.provider==="stripe"&&(h.intentKind==="payment"||h.intentKind==="setup")&&typeof h.clientSecret=="string",Ie=h.provider==="paypal"&&h.paymentMethodCategory==="wallet"&&h.paymentMethodId===null&&(h.paymentMethodType==="paypal"&&h.intentKind==="payment"&&(h.providerObjectType==="order"||h.providerObjectType==="subscription")||h.paymentMethodType===$&&h.intentKind==="payment"&&h.providerObjectType==="order"||h.paymentMethodType===$&&h.intentKind==="setup"&&h.providerObjectType==="setup_token")&&h.clientSecret===null,Pe=h.provider===r.provider&&h.paymentMethodCategory===r.paymentMethodCategory&&h.paymentMethodType===r.paymentMethodType&&h.paymentMethodId===r.paymentMethodId&&h.intentKind===r.intentKind;if(!Ee||!we&&!Ie||!Pe)throw new y("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});return this.directTelemetry?.log({name:"payment.intent.completed",stage:"processing",requestCategory:"intent_create",statusClass:b(p.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-f),durationMode:"machine",requestCategory:"intent_create",statusClass:b(p.status)}),h}catch(p){throw C||this.reportDirectFailure(p,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),p}}async reportSessionIntentDecline(e,t,r,n){if(!t)throw new y("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.providerDeclineReason,c=o.paymentMethodType,a=o.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),l=typeof c=="string"&&c.length>0&&c.trim().toLowerCase()!=="card"&&u,m=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(a===void 0||typeof a=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(a)),d=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodType==="paypal"&&a===void 0;if(!l||!m&&!d)throw new y("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let f=d?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:o.paymentMethodCategory,paymentMethodType:o.paymentMethodType,providerDeclineReason:i,...typeof a=="string"?{providerIntentId:a}:{}},g=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(f),signal:n?.signal});if(!g.ok)throw await _(g,"Failed to report checkout decline")}async getPaymentsByEmail(e,t){this.beginDirectTelemetryOperation();let r=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"other",paymentMethodCategory:"saved"});let n=t?.page??1,o=t?.limit??1,i=new URLSearchParams({email:e,page:String(n),limit:String(o),sortField:"createdAt",sortDirection:"DESC"});try{let c=await fetch(`${this.baseUrl}/v1/payments?${i.toString()}`,{method:"GET",signal:t?.signal,keepalive:!0});if(!c.ok)throw new y("Failed to fetch payments","api_error",{statusCode:c.status});let a=await c.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()-r),durationMode:"machine",requestCategory:"other",paymentMethodCategory:"saved",statusClass:"2xx"}),a}catch(c){throw this.reportDirectFailure(c,"RECOVERY_FAILED","recovery","other","saved"),c}}async createAndFetchSession(e){if(Je(e)){let o=e.account.email?.trim();if(o&&!de(o))throw new y("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(),r=S(e.timeoutMs??12e3),n={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});try{let o=await this.createAndFetchSessionRequest(e,r.signal,n);return this.adoptDirectTelemetryCheckout(o.data.session?.id),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:n.statusClass}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:n.statusClass,attempt:n.attempt}),o}catch(o){throw this.reportSessionCreateFailure(o,t,n),o}finally{r.clear()}}async createAndFetchSessionRequest(e,t,r){let n=e.products??K(e.items,e.subscriptions);ce({captureMethod:e.captureMethod,products:n});let o=G(e.currency,e.items,e.subscriptions,n);if(!o)throw new y("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:R,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:o,checkoutMode:e.checkoutMode??"full",products:n.map(m=>J(m,o)),accountData:ve(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(i.captureMethod=e.captureMethod),e.tokenizedData&&(i.tokenizedData=e.tokenizedData),Te(i,e);let a=await(await this.postCheckoutSessionCreate(i,e,t,r)).json();if(a.data&&"gateways"in a.data){this.autoCacheDisplayData(a.data.uuid,e);let m=this.mergeCachedDisplayData(a.data),d=this.normalizeRawSession(m);return a.vault&&d.data.session&&(d.data.session.vault=this.toVaultBlock(a.vault)),{...d,autoProcessingError:a.autoProcessingError,autoProcessingAttempted:a.autoProcessingAttempted,autoProcessingPending:a.autoProcessingPending}}let u=a.data?.uuid;if(!u)throw new y("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(u,e),this.adoptDirectTelemetryCheckout(u),{...await this.getUnifiedCheckoutSession(u),autoProcessingError:a.autoProcessingError,autoProcessingAttempted:a.autoProcessingAttempted,autoProcessingPending:a.autoProcessingPending}}async postCheckoutSessionCreate(e,t,r,n){let o={"Content-Type":"application/json",[j]:R},i=Xe(t.idempotencyKey);i&&(o[ue]=i);let c,a=!1,u=ut(t),l=(d,f,g)=>{a||(a=!0,this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:g,attempt:d}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:Math.max(0,this.telemetryTimestamp()-f),durationMode:"machine",requestCategory:"session_create",statusClass:g,attempt:d}))},m=d=>{try{this.telemetryHooks?.onRetry?.("session_create",d),this.directTelemetry?.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:d})}catch{}};for(let d=0;d<3;d++){n.attempt=d;let f=this.telemetryTimestamp();try{u?.onAttempt?.(d)}catch{}try{c=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:o,body:JSON.stringify(e),signal:r})}catch(p){if(n.statusClass=r.aborted||p instanceof Error&&p.name==="AbortError"?"timeout":"network_error",r.aborted||p instanceof Error&&p.name==="AbortError"||d>=2)throw p;let M=d+1;m(M),await F(d,r);continue}let g=b(c.status);if(n.statusClass=g,c.status===204)throw l(d,f,g),new y("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(c.ok){l(d,f,g);break}let C=await _(c,"Failed to create checkout session");if(C.code===We&&d<2){m(d+1),await F(d,r);continue}throw l(d,f,g),C}if(!c)throw new TypeError("Checkout-session creation exhausted its retry budget.");return c}async createDetachedSession(e){this.beginDirectTelemetryOperation();let t=this.telemetryTimestamp(),r=S(e.timeoutMs??12e3),n={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});let o=e.products??K(e.items,e.subscriptions);try{ce({captureMethod:e.captureMethod,products:o})}catch(p){throw r.clear(),this.reportSessionCreateFailure(p,t,n),p}let i=G(e.currency,e.items,e.subscriptions,o);if(!i)throw r.clear(),this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"}),new y("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,o)}catch(p){throw r.clear(),this.reportSessionCreateFailure(p,t,n),p}let c,a;try{if(a=await(await this.postCheckoutSessionCreate(dt(e,i),e,r.signal,n)).json(),!a.data||!("gateways"in a.data))throw new y("The billing API returned no session shell for a detached create. It must support `deferDataAttachment` (TeamFloPay/backend#1099).","api_error",{code:"InvalidCheckoutSessionResponse"});c=this.normalizeRawSession(this.mergeCachedDisplayData(a.data)),a.vault&&c.data.session&&(c.data.session.vault=this.toVaultBlock(a.vault))}catch(p){throw r.clear(),this.reportSessionCreateFailure(p,t,n),p}let u=c.data.session?.id??a.data.uuid??"",l=c.data.session?.clientSecret??a.data.nonce??"";if(!u||!l){r.clear();let p=new y("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(p,t,n),p}r.clear(),this.adoptDirectTelemetryCheckout(u),this.directTelemetry?.log({name:"session.shell.ready",stage:"session_shell",requestCategory:"session_create",statusClass:n.statusClass,paymentMethodCategory:"card"}),this.directTelemetry?.performance({stage:"session_shell",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:n.statusClass,attempt:n.attempt,paymentMethodCategory:"card"});let m=!e.account.email?.trim(),d=S(e.timeoutMs??12e3),f=this.claimCheckoutSession(u,l,m?mt(e,i,o):ge(e,i,o),{params:e,startedAt:t,deadline:d,createAttempt:n.attempt}),g=m?void 0:f,C=(p={})=>{if(g)return g;let M={...e,account:{...e.account,...p,email:p.email?.trim()||e.account.email?.trim()}};return de(M.account.email)?(g=f.then(()=>{let w=this.telemetryTimestamp();return this.claimCheckoutSession(u,l,pt(M.account),{params:M,startedAt:w,deadline:S(e.timeoutMs??12e3),createAttempt:0})}),g.catch(()=>{}),g):Promise.reject(new y("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return f.catch(()=>{}),{shell:c,sessionId:u,nonce:l,claimed:f,claim:C}}async claimCheckoutSession(e,t,r,n){let o=n?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),c=n?.deadline??S(12e3),a=JSON.stringify(r),u="unknown",l=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let m;for(l=0;l<3;l++){try{m=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/claim`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t,[j]:R},body:a,signal:c.signal})}catch(g){let C=c.signal.aborted||g instanceof Error&&g.name==="AbortError";if(u=C?"timeout":"network_error",C||l>=2)throw g;try{this.telemetryHooks?.onRetry?.("session_claim",l+1),this.directTelemetry?.log({name:"operation.retry",stage:"session_claim",requestCategory:"session_claim",attempt:l+1})}catch{}await F(l,c.signal);continue}if(u=b(m.status),m.ok)break;throw await _(m,"Failed to attach checkout session data")}if(!m)throw new TypeError("Checkout-session claim exhausted its retry budget.");let d=await m.json();if(!d.data?.gateways)throw new y("The billing API returned no checkout session with gateways after claiming it.","api_error",{code:"InvalidCheckoutSessionResponse"});n?.params&&this.autoCacheDisplayData(d.data.uuid??e,n.params);let f=this.normalizeRawSession(this.mergeCachedDisplayData(d.data));return d.vault&&f.data.session&&(f.data.session.vault=this.toVaultBlock(d.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:l}),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()-o),durationMode:"machine",requestCategory:"session_create",statusClass:u,attempt:n?.createAttempt??l}),f}catch(m){throw this.reportSessionCreateFailure(m,i,{attempt:l,statusClass:u},"session_claim"),m}finally{c.clear()}}reportSessionCreateFailure(e,t,r,n="session_create"){if(!(e instanceof y&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let o=D(e,"CHECKOUT_SESSION_CREATE_FAILED");if(this.directTelemetry?.performance({stage:n,durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:n==="session_claim"?"session_claim":"session_create",statusClass:o.statusClass,attempt:r.attempt}),e instanceof y&&e.type==="validation_error"||e instanceof y&&ye(e.statusCode)){this.directTelemetry?.terminal({outcome:"validation_rejected",stage:n,requestCategory:n==="session_claim"?"session_claim":"session_create",...e.type==="validation_error"?{}:{statusClass:"4xx"}});return}e instanceof y&&e.code==="session_auto_completed"||this.directTelemetry?.error({...o,stage:n,requestCategory:n==="session_claim"?"session_claim":"session_create"})}async waitForCheckoutSessionCompletion(e,t){this.beginDirectTelemetryCheckout(e);let r=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved"});let n=t?.timeoutMs??et,o=Date.now()+n,i=this.clampRetryAfterMs(t?.initialDelayMs??pe),c=0;try{for(;;){let a=o-Date.now();if(a<=0)throw L();if(i>0){try{c+=1,this.telemetryHooks?.onRetry?.("session_read",c),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved",attempt:c})}catch{}if(await Ce(Math.min(i,a)),Date.now()>=o)throw L()}let u=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce),l=u.data.session?.status;if(l==="authorized"||l==="complete"||l==="expired")return this.directTelemetry?.log({name:"operation.recovery.completed",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved"}),this.directTelemetry?.performance({stage:"recovery",durationMs:Math.max(0,this.telemetryTimestamp()-r),durationMode:"machine",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved"}),u;if(Date.now()>=o)throw L();i=this.clampRetryAfterMs(Math.max(i*2,Ze))}}catch(a){throw this.reportDirectFailure(a,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),a}}normalizeRawSession(e){let t=e.gateways??{},r=[],n={session:this.toCheckoutSession(e)},o=t.stripe;if(o?.publishableKey){r.push("stripe");let a=[e.stripeClientSecret,o.stripeClientSecret].find(u=>typeof u=="string"&&u.length>0);n.stripe={clientSecret:a??"",publishableKey:o.publishableKey??void 0,paypalPublishableKey:o.paypalPublishableKey??void 0,environment:o.environment,enabledPaymentMethods:Array.isArray(o.enabledPaymentMethods)?o.enabledPaymentMethods.filter(u=>typeof u=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(r.push("paypal"),n.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType,approvalPresentation:i.approvalPresentation}),{providers:r,mode:"tokenize",...e.checkoutMetadata===void 0?{}:{checkoutMetadata:e.checkoutMetadata},data:n,raw:{data:e}}}toCheckoutSession(e){let t=e.products??[],r=typeof e.totalAmount=="number"&&Number.isFinite(e.totalAmount),n=t.reduce((u,l)=>u+(l.overrideAmount??l.totalAmount??0),0),o=r?e.totalAmount:n,i=Math.round(o*100),c=e.currency??t[0]?.currency??"USD",a="payment";return e.checkoutMode==="setup"?a="setup":t.some(u=>u.type==="subscription")&&(a="subscription"),{id:e.uuid,clientSecret:e.nonce,mode:a,status:this.toCheckoutSessionStatus(e.status),amount:i,currency:c,captureMethod:e.captureMethod,paymentId:e.paymentId,authorizationExpiresAt:e.authorizationExpiresAt,failureOutcome:me(e.outcome)??me(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,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){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}}toCheckoutSessionStatus(e){return e==="completed"?"complete":e==="authorized"?"authorized":e==="expired"?"expired":"open"}async resolveProcessResponse(e,t,r){if(e.status!==202)return e;let n=await e.json().catch(()=>null),o=this.toCheckoutProcessingPending(n,e,t),i=await this.waitForCheckoutSessionCompletion(o.sessionId,{initialDelayMs:o.retryAfterMs,timeoutMs:r?.pollTimeoutMs,nonce:r?.nonce,paymentMethodCategory:r?.paymentMethodCategory});return this.toProcessResponseFromSession(i,t)}async reconcileProcessPayment(e,t){let r=await this.waitForCheckoutSessionCompletion(e,{initialDelayMs:0,timeoutMs:t?.pollTimeoutMs,nonce:t?.nonce,paymentMethodCategory:t?.paymentMethodCategory});return this.toProcessResponseFromSession(r,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 r=e.data.session;return new Response(JSON.stringify({status:"authorized",paymentId:r.paymentId,sessionId:r.id||t,authorizationExpiresAt:r.authorizationExpiresAt}),{status:200,headers:{"Content-Type":"application/json"}})}if(e.data.session?.status==="expired"){let r=e.data.session.failureOutcome==="authorization_expired"||e.data.session.captureMethod==="manual";throw new y(r?"Authorization has expired.":"Checkout session has expired.","api_error",{code:r?"authorization_expired":"checkout_session_expired"})}throw L()}toCheckoutProcessingPending(e,t,r){let n=t.headers.get("Retry-After"),o=n===null||n.trim()===""?void 0:Number(n),i=o!==void 0&&Number.isFinite(o)?o*1e3:void 0;return{type:"checkout_processing",sessionId:E(e,"sessionId")??r,retryAfterMs:this.clampRetryAfterMs(ot(e,"retryAfterMs")??i??pe),statusUrl:E(e,"statusUrl"),sessionUrl:E(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,tt))}autoCacheDisplayData(e,t){if(!e)return;let r=t.products??K(t.items,t.subscriptions);if(r.length===0&&!t.currency)return;let n=t.products!==void 0,o=G(t.currency,n?void 0:t.items,n?void 0:t.subscriptions,r);B(e,{currency:o??void 0,products:r.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??o??void 0}))})}mergeCachedDisplayData(e){let t=ee(e.uuid),r=new Map,n=i=>i?`code:${i}`:void 0;for(let i of t?.products??[]){let c=n(i.code);c&&r.set(c,i)}let o=(e.products??[]).map(i=>{let c=n(i.code),a=c?r.get(c):void 0;return{...i,name:i.name??a?.name??null,totalAmount:i.totalAmount??a?.totalAmount,overrideAmount:i.overrideAmount??a?.overrideAmount,currency:i.currency??a?.currency}});return{...e,currency:e.currency??t?.currency,products:o}}};k.activeVaultCaptureRequests=new Map;var W=k;function Ft(s,e){let t=W;return new t(s,e)}import{buildTelemetryErrorEvent as ht,buildTelemetryLogEvent as yt,buildTelemetryTerminalEvent as Me,FloPayError as be,resolveBillingApiUrl as _e,SDK_VERSION as ke}from"@flopay/shared";var X="flopay-vault",gt=3e5,ft=3e4,Ct=gt+ft,vt="Card authentication timed out.",Se={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 Tt(s){return s.class==="lifecycle"?s.name:s.class==="technical_error"?s.code:s.class==="expected_outcome"?s.outcome:"sdk.performance"}function x(s){let e={class:s.class,stage:s.stage};"code"in s&&(e.code=s.code),"provider"in s&&s.provider&&(e.provider=s.provider),"paymentMethodCategory"in s&&s.paymentMethodCategory&&(e.paymentMethodCategory=s.paymentMethodCategory),"outcome"in s&&(e.outcome=s.outcome),"durationMs"in s&&s.durationMs!==void 0&&(e.durationMs=s.durationMs),"durationMode"in s&&s.durationMode&&(e.durationMode=s.durationMode);try{globalThis.Sentry?.addBreadcrumb?.({category:"flopay.telemetry",level:s.class==="technical_error"?"error":"info",message:Tt(s),data:e})}catch{}}function N(s,e){return yt({eventId:"11111111-1111-4111-8111-111111111111",name:s,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}function Ae(s){return s?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime"}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function Re(s,e,t="checkout"){return t==="card_setup"?s.type==="decline"?"card_setup_declined":"card_setup_succeeded":s.type==="decline"?"payment_declined":s.outcome==="authorized"||e==="manual"?"payment_authorized":"payment_succeeded"}function bt(s,e,t,r="checkout"){let{type:n}=s;if(n==="complete"||n==="decline")return Me({eventId:"22222222-2222-4222-8222-222222222222",outcome:Re(s,t,r),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(n==="error"){let c=Ae(e);return ht({eventId:"33333333-3333-4333-8333-333333333333",...c,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[o,i]=Se[n];return N(o,i)}function _t(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===X&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function kt(s){if(typeof s!="object"||s===null)return;let e=s,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 Mt(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===X&&e.type==="validation"&&Array.isArray(e.messages)}function St(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===X&&e.type==="resize"&&typeof e.height=="number"&&Number.isFinite(e.height)}var Q=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.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 T({billingApiUrl:_e(e.billingApiUrl),sdkVersion:ke}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new T({billingApiUrl:_e(this.config.billingApiUrl),sdkVersion:ke}));let r=this.telemetryReporter;if(this.config.operation==="card_setup"&&r&&this.setupTelemetryReporter!==r){this.setupTelemetryReporter=r;try{r.beginCheckout({checkoutMode:"setup"})}catch{}}if(this.mountStartedAt=this.telemetryReporter?.now?.()??v(),this.vaultReadyReported=!1,this.submissionStarted=!1,this.submissionStartedAt=null,typeof window>"u"||typeof document>"u")throw this.reportVaultLoadFailure(),new be("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 be("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.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(n){throw this.reportVaultLoadFailure(),n}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),this.postSubmitLabel(),x(N("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?.()??v())-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 r=this.listeners.get(e);return r||(r=new Set,this.listeners.set(e,r)),r.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 r=Array.from(e.querySelectorAll("script"));for(let n of r){let o=document.createElement("script");for(let i of Array.from(n.attributes))o.setAttribute(i.name,i.value);o.text=n.text,n.replaceWith(o)}}attachMessageListener(){if(this.messageHandler)return;let e=t=>{if(this.expectedOrigin&&t.origin!==this.expectedOrigin)return;let r=t.data;if(St(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;this.applyHeight(r.height);return}if(Mt(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;let a=r.messages.filter(u=>typeof u=="string"&&u.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:a||void 0});return}if(!_t(r)||this.messageToken&&r.messageToken!==this.messageToken)return;let n=this.config.sessionId,o=typeof r.sessionId=="string"?r.sessionId:void 0;if(n&&o&&o!==n||(r.type==="complete"||r.type==="decline")&&n&&o!==n)return;let i=kt(r.paymentMethod),c={...r.sessionId??this.config.sessionId?{sessionId:r.sessionId??this.config.sessionId}:{},...r.outcome?{outcome:r.outcome}:{},...r.paymentId?{paymentId:r.paymentId}:{},...r.authorizationExpiresAt?{authorizationExpiresAt:r.authorizationExpiresAt}:{},...r.failureOutcome?{failureOutcome:r.failureOutcome}:{},...r.intentId?{intentId:r.intentId}:{},...r.declineReason?{declineReason:r.declineReason}:{},...r.message?{message:r.message}:{},...i?{paymentMethod:i}:{}};r.type==="submitting"&&(this.submissionStarted=!0,this.submissionStartedAt=this.telemetryReporter?.now?.()??v()),x(bt(r,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(r),r.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),this.postSubmitLabel()),r.type==="action_required"&&r.nextActionRedirectUrl&&this.showActionRequiredOverlay(r.nextActionRedirectUrl),(r.type==="complete"||r.type==="decline"||r.type==="error"||r.type==="submitting")&&this.hideActionRequiredOverlay(),r.type!=="action_required"&&this.emit(r.type,c)};this.messageHandler=e,window.addEventListener("message",e)}reportOutcome(e){let t=this.telemetryReporter;if(!t)return;let{type:r}=e;if(r==="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"})),r==="complete"||r==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:Re(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(r==="error"){let i=Ae(this.submissionStarted);t.log({name:"vault.terminal",stage:i.stage,provider:"pcivault",paymentMethodCategory:"card"}),t.error({...i,provider:"pcivault",paymentMethodCategory:"card"});return}if(r==="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[n,o]=Se[r];t.log({name:n,stage:o,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:r,expectedOrigin:n}=this;e===void 0||!t||!r||!n||this.postToHostedWindow({source:"flopay-vault-host",type:"submitLabel",sessionId:t,messageToken:r,label:e},n)}hostedWindow(){return this.container?.querySelector("iframe")?.contentWindow??null}postToHostedWindow(e,t){let r=this.hostedWindow();if(r)try{r.postMessage(e,t)}catch{}}directiveTargetOrigin(){return this.expectedOrigin??"*"}emit(e,t){for(let r of this.listeners.get(e)??[])r(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 r=document.createElement("iframe");r.setAttribute("title","Card authentication"),r.setAttribute("allow","payment"),r.tabIndex=0,r.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(";"),r.src=e,t.appendChild(r);let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Close card authentication"),n.textContent="\xD7",n.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(";"),n.addEventListener("click",()=>this.abandonActionRequiredOverlay()),t.appendChild(n),t.addEventListener("click",i=>{i.target===t&&this.abandonActionRequiredOverlay()});let o=i=>{if(i.source!==r.contentWindow)return;let c=i.data;!c||typeof c!="object"||c.source!=="flopay-vault-3ds-return"||(x(N("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",o),this.threeDsReturnHandler=o,document.body.appendChild(t),this.actionOverlay=t,r.focus(),this.armActionRequiredTimeout(),x(N("vault.three_ds.handoff","three_ds_handoff"))}armActionRequiredTimeout(){this.actionOverlayTimer&&clearTimeout(this.actionOverlayTimer),this.actionOverlayTimer=setTimeout(()=>{this.actionOverlayTimer=null,this.actionOverlay&&this.timeOutActionRequiredOverlay()},Ct)}reportChallengeAbandoned(){x(Me({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:vt})}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 r=Math.max(0,Math.min(Math.ceil(e),2e3));t.style.height=`${r}px`}};function Vt(s,e){let t=Q;return new t(s,{reporter:e})}export{re as a,se as b,S as c,F as d,B as e,ee as f,te as g,v as h,T as i,ct as j,W as k,Ft as l,Q as m,Vt as n};