@flopay/js 1.9.6 → 1.9.8
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/README.md +12 -4
- package/dist/card-setup.cjs +1 -1
- package/dist/card-setup.mjs +1 -1
- package/dist/chunk-BIMDVWOB.mjs +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/chunk-NVMDGQAX.mjs +0 -1
package/README.md
CHANGED
|
@@ -216,11 +216,13 @@ in-progress reply — replay the same key. A payload-conflict (`409`) is surface
|
|
|
216
216
|
without retrying. The header is optional on the backend: older SDKs and direct
|
|
217
217
|
API clients that omit it keep the legacy, unkeyed path. The same automatic and
|
|
218
218
|
merchant-supplied behavior applies to inline session creation via
|
|
219
|
-
`PaymentAPI.createAndFetchSession` (used by `@flopay/react`).
|
|
220
|
-
uses the same 12-second total deadline and jitter policy, with one shared
|
|
219
|
+
`PaymentAPI.createAndFetchSession` (used by `@flopay/react`). A one-shot inline
|
|
220
|
+
create uses the same 12-second total deadline and jitter policy, with one shared
|
|
221
221
|
three-attempt budget across network failures and idempotency-in-progress
|
|
222
|
-
responses.
|
|
223
|
-
|
|
222
|
+
responses. A detached inline create applies `timeoutMs` afresh to its shell POST
|
|
223
|
+
and initial catalogue-claim PATCH; each phase has its own signal and retry
|
|
224
|
+
budget. Pass `timeoutMs` in the inline session params to choose a different
|
|
225
|
+
per-phase ceiling.
|
|
224
226
|
|
|
225
227
|
`@flopay/shared` also exports the primitives directly if you build your own
|
|
226
228
|
create flow: `generateIdempotencyKey()`, `resolveIdempotencyKey(supplied?)`,
|
|
@@ -246,6 +248,12 @@ SDK issues two:
|
|
|
246
248
|
while `buyerIdentified` remains `false`. Checkout metadata is never repeated
|
|
247
249
|
or edited by either the catalog or late-buyer claim.
|
|
248
250
|
|
|
251
|
+
For detached creation, `timeoutMs` is a fresh per-phase budget: the shell POST
|
|
252
|
+
gets the full value, and after it succeeds the initial claim PATCH gets the full
|
|
253
|
+
value again under a different `AbortSignal`. The default is 12 seconds for each
|
|
254
|
+
phase, so time spent creating a usable shell never starves its catalogue claim.
|
|
255
|
+
One-shot creation still has one total deadline.
|
|
256
|
+
|
|
249
257
|
`PaymentAPI.createDetachedSession(params)` exposes both phases. When the draft
|
|
250
258
|
already has an email, the combined catalog-and-buyer claim starts immediately.
|
|
251
259
|
When email is missing, a catalog-only claim still starts immediately; the
|
package/dist/card-setup.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var z=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var ve=Object.prototype.hasOwnProperty;var Te=(s,e)=>{for(var t in e)z(s,t,{get:e[t],enumerable:!0})},be=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ce(e))!ve.call(s,n)&&n!==t&&z(s,n,{get:()=>e[n],enumerable:!(r=fe(e,n))||r.enumerable});return s};var ke=s=>be(z({},"__esModule",{value:!0}),s);var et={};Te(et,{PaymentAPI:()=>F,PciVaultCardCapture:()=>U});module.exports=ke(et);var a=require("@flopay/shared");function W(s){return typeof s=="string"&&s.trim()?s:void 0}function J(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 R(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 _e(){return Object.assign(new Error("The operation was aborted."),{name:"AbortError"})}function I(s,e){let t=150*2**s,r=Math.round(t*(.75+Math.random()*.5));return new Promise((n,o)=>{let i,l=()=>e.removeEventListener("abort",u),u=()=>{i!==void 0&&clearTimeout(i),l(),o(_e())};if(e.aborted){u();return}i=setTimeout(()=>{l(),n()},r),e.addEventListener("abort",u,{once:!0})})}var Me="flopay_session_display:";var P=new Map;function D(s){return`${Me}${s}`}function B(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function j(s,e,t){if(!s)return;let r=t?.ttlMs??36e5,n={data:e,expiresAt:Date.now()+r},o=B();if(o)try{o.setItem(D(s),JSON.stringify(n));return}catch{}P.set(s,n)}function Q(s){if(!s)return null;let e=B();if(e)try{let r=e.getItem(D(s));if(r){let n=JSON.parse(r);if(n&&typeof n.expiresAt=="number"&&n.expiresAt>Date.now())return n.data;e.removeItem(D(s))}}catch{}let t=P.get(s);if(t){if(t.expiresAt>Date.now())return t.data;P.delete(s)}return null}function X(s){if(!s)return;P.delete(s);let e=B();if(e)try{e.removeItem(D(s))}catch{}}var T=require("@flopay/shared"),Se="/v1/sdk-telemetry/events",H=16,Ae=64,Re=1500,Z=1e3,Ee=64,we="00000000-0000-4000-8000-000000000000",Ie={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function S(){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 Pe(s){try{return new TextEncoder().encode(s).byteLength}catch{return s.length}}function De(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])}function b(){return globalThis.performance?.now()??0}var k=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(/\/+$/,"")}${Se}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=S(),this.merchantEnabled=e.enabled!==!1,this.clock=e.clock??b,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,T.buildTelemetryLogEvent)({...this.checkoutContext,...e,eventId:S(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=(0,T.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:we,sequence:0}),r=De(t),n=this.now();this.pruneReportedFailures(n);let o=this.reportedFailures.get(r);if(o!==void 0&&n>=o&&n-o<Z){this.log({name:"operation.deduplicated",stage:e.stage,provider:e.provider,paymentMethodCategory:e.paymentMethodCategory,attempt:e.attempt});return}this.rememberReportedFailure(r,n),this.enqueue((0,T.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:S(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue((0,T.buildTelemetryPerformanceEvent)({...this.checkoutContext,...e,eventId:S(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue((0,T.buildTelemetryTerminalEvent)({...this.checkoutContext,...e,eventId:S(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let t=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({stage:"total_journey",durationMs:Math.max(0,this.now()-t),durationMode:"total",provider:e.provider,paymentMethodCategory:e.paymentMethodCategory})}}now(){try{return this.clock()}catch{return b()}}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>=Z)&&this.reportedFailures.delete(t)}rememberReportedFailure(e,t){for(;this.reportedFailures.size>=Ee;){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>=Ae||this.eventCounts[e.class]>=Ie[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=(0,T.serializeTelemetryBatch)(e,{correlationId:this.correlationId,sdkPackage:this.sdkPackage,sdkVersion:this.sdkVersion,batchId:S()});if(Pe(t)>T.TELEMETRY_MAX_BATCH_BYTES)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 u=>{if(u.status!==202)return null;let c=null;try{c=await u.json()}catch{}return c?.status==="disabled"?"disabled":null}).catch(()=>null),i=new Promise(u=>{n=setTimeout(()=>{r?.abort(),u(null)},Re)});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)}},ee=Symbol.for("@flopay/js.telemetry.reporter-factory.v1"),te=globalThis;te[ee]===void 0&&Object.defineProperty(te,ee,{configurable:!0,enumerable:!1,writable:!1,value:s=>new k(s)});var re=1e3,xe=500,Oe=15e3,qe=3e3,Fe=1e4,Le=1e4;function Ue(s){return typeof s=="object"&&s!==null}function A(s,e){return W(s?.[e])}function se(s,e){return J(s?.[e])}function Ve(s,e){let t=s?.[e];return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ie(s){return new Promise(e=>setTimeout(e,s))}function Ne(s){return s instanceof Error&&s.name==="AbortError"}function O(){return new a.FloPayError("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=Ue(t?.error)?t.error:null,n=se(t,"message")??se(r,"message")??e,o=A(t,"code")??A(t,"gatewayErrorCode")??A(r,"code")??`http_${s.status}`;return new a.FloPayError(n,"api_error",{code:o,statusCode:s.status})}async function ze(s){let e=s.status===400?await s.clone().json().catch(()=>null):null;return(0,a.classifyPaymentRejection)(s.status,e)}function ne(s){return s===400||s===422}var q=2;async function K(s,e,t=q,r){let n;for(let o=0;;o++)try{return await fetch(s,e)}catch(i){if(e?.signal?.aborted||i instanceof Error&&i.name==="AbortError")throw i;if(n=i,o>=t)throw n;try{r?.(o+1)}catch{}await ie(150*2**o)}}var Be=Symbol.for("@flopay/js.session-create.telemetry.v1");function je(s){return s[Be]}function He(s){return"now"in s||"onFirstByte"in s||"onSessionCreateFailure"in s||"onRetry"in s}function ae(s){let e=(0,a.isCardHolderNamePlaceholder)(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 ce(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 Ke(s,e){let t={clientId:s.clientId,checkoutVersion:a.SDK_VERSION,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}),ce(t,s),t}function oe(s,e,t){return{currency:e,products:t.map(r=>(0,a.buildProductPayload)(r,e)),couponCodes:s.couponCodes??[],accountData:ae(s.account)}}function $e(s,e,t){return{currency:e,products:t.map(r=>(0,a.buildProductPayload)(r,e)),couponCodes:s.couponCodes??[]}}function Ge(s){let e={},t=(0,a.isCardHolderNamePlaceholder)(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 M=class M{constructor(e,t={}){this.baseUrl=e.replace(/\/+$/,"");let r=He(t);this.telemetryHooks=r?t:void 0,this.directTelemetry=r||t.telemetry===!1?void 0:new k({billingApiUrl:this.baseUrl,sdkVersion:a.SDK_VERSION})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,t,r,n,o="unknown"){let i=(0,a.classifyTelemetryFailure)(e,t);this.directTelemetry?.error({...i,stage:r,requestCategory:n,paymentMethodCategory:o})}reportAccountSnapshotFailure(e,t){let r=(0,a.classifyTelemetryFailure)(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()??b()}catch{return b()}}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();this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let o={[a.FLO_SDK_VERSION_HEADER]:a.SDK_VERSION};t&&(o["x-checkout-session-token"]=t);try{let i=await K(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:o},q,d=>{this.telemetryHooks?.onRetry?.("session_read",d),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:d})}),l=Math.max(0,this.telemetryTimestamp()-n);try{this.telemetryHooks?.onFirstByte?.(l)}catch{}let u=`${Math.floor(i.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:u}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:l,durationMode:"machine",requestCategory:"session_read",statusClass:u}),!i.ok)throw await _(i,"Failed to get checkout session");let c=await i.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:u}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"session_read",statusClass:u}),{...c,data:this.mergeCachedDisplayData(c.data)}}catch(i){throw r&&this.directTelemetry?.error({...(0,a.classifyTelemetryFailure)(i,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),i}}cacheSessionDisplayData(e,t,r){j(e,t,r)}clearSessionDisplayData(e){X(e)}async getVaultCapture(e,t){let r=`${this.baseUrl}\0${e}\0${t??""}`,n=M.activeVaultCaptureRequests.get(r);if(n)return n;let o=this.requestVaultCapture(e,t);M.activeVaultCaptureRequests.set(r,o);try{return await o}finally{M.activeVaultCaptureRequests.get(r)===o&&M.activeVaultCaptureRequests.delete(r)}}async requestVaultCapture(e,t){let r=new AbortController,n=setTimeout(()=>r.abort(),Le);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 l=await K(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:r.signal},q,c=>{this.telemetryHooks?.onRetry?.("vault_capture",c),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:c})});if(!l.ok)throw await _(l,"Failed to load the secure card form");let u=await l.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(u)}catch(l){let u=r.signal.aborted?new a.FloPayError("Timed out while loading the secure card form. Please try again.","api_error",{code:"vault_capture_timeout"}):l;throw this.reportDirectFailure(u,"VAULT_LOAD_FAILED","vault_request","vault_capture","card"),u}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 a.FloPayError("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:l,...u}=t,c;try{c=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(u)})}catch(d){if(Ne(d))throw this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),d;c=await this.reconcileProcessPayment(t.sessionId,{...r,nonce:i,paymentMethodCategory:n})}if(!c.ok&&c.status!==202){let d=await ze(c);return d?this.directTelemetry?.terminal({outcome:d,stage:"processing",requestCategory:"process_payment",statusClass:"4xx",paymentMethodCategory:n}):this.directTelemetry?.error({errorCode:"PAYMENT_PROCESSING_FAILED",stage:"processing",requestCategory:"process_payment",statusClass:(0,a.telemetryStatusClass)(c.status),failureCategory:c.status>=500?"server_error":void 0,paymentMethodCategory:n}),c}try{let d=await this.resolveProcessResponse(c,t.sessionId,{...r,nonce:i,paymentMethodCategory:n});return this.directTelemetry?.log({name:"payment.processing.completed",stage:"processing",requestCategory:"process_payment",statusClass:(0,a.telemetryStatusClass)(d.status),paymentMethodCategory:n}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"process_payment",statusClass:(0,a.telemetryStatusClass)(d.status),paymentMethodCategory:n}),d}catch(d){throw d instanceof a.FloPayError&&d.code==="checkout_processing_timeout"||this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),d}}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??Fe,l=new AbortController,u=()=>l.abort();n?.signal&&(n.signal.aborted?l.abort():n.signal.addEventListener("abort",u,{once:!0}));let c=setTimeout(()=>l.abort(),i);try{let d;try{d=await K(`${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:l.signal},q,y=>{this.telemetryHooks?.onRetry?.("account_snapshot",y),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:y})})}finally{clearTimeout(c),n?.signal?.removeEventListener("abort",u)}if(!d.ok)throw await _(d,"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(d){throw this.reportAccountSnapshotFailure(d,n?.telemetryMode??"blocking"),d}}async createSessionIntent(e,t,r,n){if(!t)throw new a.FloPayError("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.paymentMethodType,l=typeof i=="string"&&i.trim().toLowerCase()==="card",u=typeof i=="string"&&i.length>0&&!l&&(typeof o.paymentMethodId=="string"||o.paymentMethodId===null),c=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(o.intentKind==="payment"||o.intentKind==="setup"),d=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodId===null&&(o.paymentMethodType==="paypal"&&o.intentKind==="payment"||o.paymentMethodType===a.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&(o.intentKind==="payment"||o.intentKind==="setup"));if(!u||!c&&!d)throw new a.FloPayError("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let y=o.authorizationAttemptId;if(y!==void 0&&!(0,a.isUuidV4)(y))throw new a.FloPayError("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let m=(0,a.isUuidV4)(y)?y:(0,a.randomUuidV4)();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let v={"Content-Type":"application/json","x-checkout-session-token":t,[a.IDEMPOTENCY_KEY_HEADER]:n?.idempotencyKey||m},h=!1;try{let C=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:v,body:JSON.stringify({...r,authorizationAttemptId:m}),signal:n?.signal});if(!C.ok){h=!0;let N=await _(C,"Failed to create checkout intent"),ge=(0,a.classifyTelemetryFailure)(N,"PAYMENT_PROCESSING_FAILED");throw ne(N.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...ge,stage:"processing",requestCategory:"intent_create"}),N}let V=(await C.json()).data;if(!V||typeof V!="object")throw new a.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let p=V,Y=p.paymentMethodType,me=(p.paymentMethodCategory==="wallet"||p.paymentMethodCategory==="apm")&&typeof Y=="string"&&Y.trim().toLowerCase()!=="card"&&(typeof p.paymentMethodId=="string"||p.paymentMethodId===null)&&typeof p.providerObjectId=="string",pe=p.provider==="stripe"&&(p.intentKind==="payment"||p.intentKind==="setup")&&typeof p.clientSecret=="string",he=p.provider==="paypal"&&p.paymentMethodCategory==="wallet"&&p.paymentMethodId===null&&(p.paymentMethodType==="paypal"&&p.intentKind==="payment"&&(p.providerObjectType==="order"||p.providerObjectType==="subscription")||p.paymentMethodType===a.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&p.intentKind==="payment"&&p.providerObjectType==="order"||p.paymentMethodType===a.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&p.intentKind==="setup"&&p.providerObjectType==="setup_token")&&p.clientSecret===null,ye=p.provider===r.provider&&p.paymentMethodCategory===r.paymentMethodCategory&&p.paymentMethodType===r.paymentMethodType&&p.paymentMethodId===r.paymentMethodId&&p.intentKind===r.intentKind;if(!me||!pe&&!he||!ye)throw new a.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});return this.directTelemetry?.log({name:"payment.intent.completed",stage:"processing",requestCategory:"intent_create",statusClass:(0,a.telemetryStatusClass)(C.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:(0,a.telemetryStatusClass)(C.status)}),p}catch(C){throw h||this.reportDirectFailure(C,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),C}}async reportSessionIntentDecline(e,t,r,n){if(!t)throw new a.FloPayError("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.providerDeclineReason,l=o.paymentMethodType,u=o.providerIntentId,c=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 l=="string"&&l.length>0&&l.trim().toLowerCase()!=="card"&&c,y=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(u===void 0||typeof u=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(u)),m=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodType==="paypal"&&u===void 0;if(!d||!y&&!m)throw new a.FloPayError("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=m?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:o.paymentMethodCategory,paymentMethodType:o.paymentMethodType,providerDeclineReason:i,...typeof u=="string"?{providerIntentId:u}:{}},v=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:n?.signal});if(!v.ok)throw await _(v,"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 l=await fetch(`${this.baseUrl}/v1/payments?${i.toString()}`,{method:"GET",signal:t?.signal,keepalive:!0});if(!l.ok)throw new a.FloPayError("Failed to fetch payments","api_error",{statusCode:l.status});let u=await l.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"}),u}catch(l){throw this.reportDirectFailure(l,"RECOVERY_FAILED","recovery","other","saved"),l}}async createAndFetchSession(e){if((0,a.isDetachedSessionEligible)(e)){let o=e.account.email?.trim();if(o&&!(0,a.isValidEmail)(o))throw new a.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(),r=R(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,t,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,n){let o=e.products??(0,a.foldIntoProducts)(e.items,e.subscriptions);(0,a.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:o});let i=(0,a.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,o);if(!i)throw new a.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 l={clientId:e.clientId,checkoutVersion:a.SDK_VERSION,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:i,checkoutMode:e.checkoutMode??"full",products:o.map(m=>(0,a.buildProductPayload)(m,i)),accountData:ae(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(l.captureMethod=e.captureMethod),e.tokenizedData&&(l.tokenizedData=e.tokenizedData),ce(l,e);let c=await(await this.postCheckoutSessionCreate(l,e,t,r,n)).json();if(c.data&&"gateways"in c.data){this.autoCacheDisplayData(c.data.uuid,e);let m=this.mergeCachedDisplayData(c.data),g=this.normalizeRawSession(m);return c.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(c.vault)),{...g,autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}let d=c.data?.uuid;if(!d)throw new a.FloPayError("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(d,e),this.adoptDirectTelemetryCheckout(d),{...await this.getUnifiedCheckoutSession(d),autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}async postCheckoutSessionCreate(e,t,r,n,o){let i={"Content-Type":"application/json",[a.FLO_SDK_VERSION_HEADER]:a.SDK_VERSION},l=(0,a.resolveIdempotencyKey)(t.idempotencyKey);l&&(i[a.IDEMPOTENCY_KEY_HEADER]=l);let u,c=!1,d=je(t),y=m=>{try{this.telemetryHooks?.onRetry?.("session_create",m),this.directTelemetry?.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:m})}catch{}};for(let m=0;m<3;m++){o.attempt=m;try{d?.onAttempt?.(m)}catch{}try{u=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:i,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"||m>=2)throw h;let C=m+1;y(C),await I(m,n);continue}let g=(0,a.telemetryStatusClass)(u.status);if(o.statusClass=g,c||(c=!0,this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:g,attempt:m}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:Math.max(0,this.telemetryTimestamp()-r),durationMode:"machine",requestCategory:"session_create",statusClass:g,attempt:m})),u.status===204)throw new a.FloPayError("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(u.ok)break;let v=await _(u,"Failed to create checkout session");if(v.code===a.IDEMPOTENCY_IN_PROGRESS_CODE&&m<2){y(m+1),await I(m,n);continue}throw v}if(!u)throw new TypeError("Checkout-session creation exhausted its retry budget.");return u}async createDetachedSession(e){this.beginDirectTelemetryOperation();let t=this.telemetryTimestamp(),r=R(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??(0,a.foldIntoProducts)(e.items,e.subscriptions);try{(0,a.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:o})}catch(h){throw r.clear(),this.reportSessionCreateFailure(h,t,n),h}let i=(0,a.resolveSessionCurrency)(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 a.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{oe(e,i,o)}catch(h){throw r.clear(),this.reportSessionCreateFailure(h,t,n),h}let l,u;try{if(u=await(await this.postCheckoutSessionCreate(Ke(e,i),e,t,r.signal,n)).json(),!u.data||!("gateways"in u.data))throw new a.FloPayError("The billing API returned no session shell for a detached create. It must support `deferDataAttachment` (TeamFloPay/backend#1099).","api_error",{code:"InvalidCheckoutSessionResponse"});l=this.normalizeRawSession(this.mergeCachedDisplayData(u.data)),u.vault&&l.data.session&&(l.data.session.vault=this.toVaultBlock(u.vault))}catch(h){throw r.clear(),this.reportSessionCreateFailure(h,t,n),h}let c=l.data.session?.id??u.data.uuid??"",d=l.data.session?.clientSecret??u.data.nonce??"";if(!c||!d){r.clear();let h=new a.FloPayError("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(h,t,n),h}this.adoptDirectTelemetryCheckout(c),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 y=!e.account.email?.trim(),m=this.claimCheckoutSession(c,d,y?$e(e,i,o):oe(e,i,o),{params:e,startedAt:t,deadline:r,createAttempt:n.attempt}),g=y?void 0:m,v=(h={})=>{if(g)return g;let C={...e,account:{...e.account,...h,email:h.email?.trim()||e.account.email?.trim()}};return(0,a.isValidEmail)(C.account.email)?(g=m.then(()=>{let G=this.telemetryTimestamp();return this.claimCheckoutSession(c,d,Ge(C.account),{params:C,startedAt:G,deadline:R(e.timeoutMs??12e3),createAttempt:0})}),g.catch(()=>{}),g):Promise.reject(new a.FloPayError("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return m.catch(()=>{}),{shell:l,sessionId:c,nonce:d,claimed:m,claim:v}}async claimCheckoutSession(e,t,r,n){let o=n?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),l=n?.deadline??R(12e3),u=JSON.stringify(r),c="unknown",d=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let y;for(d=0;d<3;d++){try{y=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/claim`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t,[a.FLO_SDK_VERSION_HEADER]:a.SDK_VERSION},body:u,signal:l.signal})}catch(v){let h=l.signal.aborted||v instanceof Error&&v.name==="AbortError";if(c=h?"timeout":"network_error",h||d>=2)throw v;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 I(d,l.signal);continue}if(c=(0,a.telemetryStatusClass)(y.status),y.ok)break;throw await _(y,"Failed to attach checkout session data")}if(!y)throw new TypeError("Checkout-session claim exhausted its retry budget.");let m=await y.json();if(!m.data?.gateways)throw new a.FloPayError("The billing API returned no checkout session with gateways after claiming it.","api_error",{code:"InvalidCheckoutSessionResponse"});n?.params&&this.autoCacheDisplayData(m.data.uuid??e,n.params);let g=this.normalizeRawSession(this.mergeCachedDisplayData(m.data));return m.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(m.vault)),this.directTelemetry?.log({name:"session.claim.completed",stage:"session_claim",requestCategory:"session_claim",statusClass:c}),this.directTelemetry?.performance({stage:"session_claim",durationMs:Math.max(0,this.telemetryTimestamp()-i),durationMode:"machine",requestCategory:"session_claim",statusClass:c,attempt:d}),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:c}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"session_create",statusClass:c,attempt:n?.createAttempt??d}),g}catch(y){throw this.reportSessionCreateFailure(y,o,{attempt:d,statusClass:c},"session_claim"),y}finally{l.clear()}}reportSessionCreateFailure(e,t,r,n="session_create"){if(!(e instanceof a.FloPayError&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let o=(0,a.classifyTelemetryFailure)(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 a.FloPayError&&e.type==="validation_error"||e instanceof a.FloPayError&&ne(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 a.FloPayError&&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??Oe,o=Date.now()+n,i=this.clampRetryAfterMs(t?.initialDelayMs??re),l=0;try{for(;;){let u=o-Date.now();if(u<=0)throw O();if(i>0){try{l+=1,this.telemetryHooks?.onRetry?.("session_read",l),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved",attempt:l})}catch{}if(await ie(Math.min(i,u)),Date.now()>=o)throw O()}let c=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce),d=c.data.session?.status;if(d==="authorized"||d==="complete"||d==="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"}),c;if(Date.now()>=o)throw O();i=this.clampRetryAfterMs(Math.max(i*2,xe))}}catch(u){throw this.reportDirectFailure(u,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),u}}normalizeRawSession(e){let t=e.gateways??{},r=[],n={session:this.toCheckoutSession(e)},o=t.stripe;if(o?.publishableKey){r.push("stripe");let u=[e.stripeClientSecret,o.stripeClientSecret].find(c=>typeof c=="string"&&c.length>0);n.stripe={clientSecret:u??"",publishableKey:o.publishableKey??void 0,paypalPublishableKey:o.paypalPublishableKey??void 0,environment:o.environment,enabledPaymentMethods:Array.isArray(o.enabledPaymentMethods)?o.enabledPaymentMethods.filter(c=>typeof c=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(r.push("paypal"),n.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType}),{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((c,d)=>c+(d.overrideAmount??d.totalAmount??0),0),o=r?e.totalAmount:n,i=Math.round(o*100),l=e.currency??t[0]?.currency??"USD",u="payment";return e.checkoutMode==="setup"?u="setup":t.some(c=>c.type==="subscription")&&(u="subscription"),{id:e.uuid,clientSecret:e.nonce,mode:u,status:this.toCheckoutSessionStatus(e.status),amount:i,currency:l,captureMethod:e.captureMethod,paymentId:e.paymentId,authorizationExpiresAt:e.authorizationExpiresAt,failureOutcome:(0,a.normalizeCheckoutFailureOutcome)(e.outcome)??(0,a.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,buyerIdentified:e.buyerIdentified,providerPaymentMethodId:typeof e.providerPaymentMethodId=="string"?e.providerPaymentMethodId:null,products:t.map(c=>({...c,totalAmount:typeof c.totalAmount=="number"?c.totalAmount:void 0,overrideAmount:typeof c.overrideAmount=="number"?c.overrideAmount:null,currency:typeof c.currency=="string"?c.currency:void 0,metadata:c.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 a.FloPayError(r?"Authorization has expired.":"Checkout session has expired.","api_error",{code:r?"authorization_expired":"checkout_session_expired"})}throw O()}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:A(e,"sessionId")??r,retryAfterMs:this.clampRetryAfterMs(Ve(e,"retryAfterMs")??i??re),statusUrl:A(e,"statusUrl"),sessionUrl:A(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,qe))}autoCacheDisplayData(e,t){if(!e)return;let r=t.products??(0,a.foldIntoProducts)(t.items,t.subscriptions);if(r.length===0&&!t.currency)return;let n=t.products!==void 0,o=(0,a.resolveSessionCurrency)(t.currency,n?void 0:t.items,n?void 0:t.subscriptions,r);j(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=Q(e.uuid),r=new Map,n=i=>i?`code:${i}`:void 0;for(let i of t?.products??[]){let l=n(i.code);l&&r.set(l,i)}let o=(e.products??[]).map(i=>{let l=n(i.code),u=l?r.get(l):void 0;return{...i,name:i.name??u?.name??null,totalAmount:i.totalAmount??u?.totalAmount,overrideAmount:i.overrideAmount??u?.overrideAmount,currency:i.currency??u?.currency}});return{...e,currency:e.currency??t?.currency,products:o}}};M.activeVaultCaptureRequests=new Map;var F=M;var f=require("@flopay/shared");var $="flopay-vault",ue={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 Ye(s){return s.class==="lifecycle"?s.name:s.class==="technical_error"?s.code:s.class==="expected_outcome"?s.outcome:"sdk.performance"}function w(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:Ye(s),data:e})}catch{}}function L(s,e){return(0,f.buildTelemetryLogEvent)({eventId:"11111111-1111-4111-8111-111111111111",name:s,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}function le(s){return s?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime"}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function de(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 We(s,e,t,r="checkout"){let{type:n}=s;if(n==="complete"||n==="decline")return(0,f.buildTelemetryTerminalEvent)({eventId:"22222222-2222-4222-8222-222222222222",outcome:de(s,t,r),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(n==="error"){let l=le(e);return(0,f.buildTelemetryErrorEvent)({eventId:"33333333-3333-4333-8333-333333333333",...l,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[o,i]=ue[n];return L(o,i)}function Je(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===$&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function Qe(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 Xe(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===$&&e.type==="validation"&&Array.isArray(e.messages)}function Ze(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===$&&e.type==="resize"&&typeof e.height=="number"&&Number.isFinite(e.height)}var U=class{constructor(e={},t){this.provider="pcivault";this.container=null;this.messageHandler=null;this.actionOverlay=null;this.threeDsReturnHandler=null;this.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!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 k({billingApiUrl:(0,f.resolveBillingApiUrl)(),sdkVersion:f.SDK_VERSION}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new k({billingApiUrl:(0,f.resolveBillingApiUrl)(),sdkVersion:f.SDK_VERSION}));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?.()??b(),this.vaultReadyReported=!1,this.submissionStarted=!1,this.submissionStartedAt=null,typeof window>"u"||typeof document>"u")throw this.reportVaultLoadFailure(),new f.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 f.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.messageToken=t.messageToken??null,this.expectedOrigin=t.expectedOrigin??this.config.expectedOrigin??null,this.theme=t.theme;try{this.attachMessageListener(),this.injectWidget(e,t.html)}catch(n){throw this.reportVaultLoadFailure(),n}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),w(L("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",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(Ze(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;this.applyHeight(r.height);return}if(Xe(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;let u=r.messages.filter(c=>typeof c=="string"&&c.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:u||void 0});return}if(!Je(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=Qe(r.paymentMethod),l={...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?.()??b()),w(We(r,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(r),r.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder()),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,l)};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"})),r==="complete"||r==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:de(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(r==="error"){let i=le(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]=ue[r];t.log({name:n,stage:o,provider:"pcivault",paymentMethodCategory:"card"})}applyTheme(e){this.theme=e,this.postTheme()}postTheme(){if(this.theme===void 0||!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"theme",theme:this.theme},"*")}catch{}}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},"*")}catch{}}setCardFieldOrder(e,t){this.cardFieldOrder=e,this.cardAutoFocus=t,this.postCardFieldOrder()}postCardFieldOrder(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},"*")}catch{}}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);return}let t=document.createElement("div");t.setAttribute("data-flopay-action-required","1"),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.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 l=i.data;if(!l||typeof l!="object")return;let u=l;u.source==="flopay-vault-3ds-return"&&(w(L("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(),this.postActionCompleted(u.status))};window.addEventListener("message",o),this.threeDsReturnHandler=o,document.body.appendChild(t),this.actionOverlay=t,w(L("vault.three_ds.handoff","three_ds_handoff"))}postActionCompleted(e){if(!this.container)return;let r=this.container.querySelector("iframe")?.contentWindow;if(r)try{r.postMessage({source:"flopay-vault-host",type:"action_completed",status:typeof e=="string"?e:"unknown"},"*")}catch{}}abandonActionRequiredOverlay(){if(!this.actionOverlay)return;let e=(0,f.buildTelemetryTerminalEvent)({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"});w(e),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay(),this.postActionCompleted("abandoned")}hideActionRequiredOverlay(){this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),this.actionOverlay&&(this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null)}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`}};0&&(module.exports={PaymentAPI,PciVaultCardCapture});
|
|
1
|
+
"use strict";var B=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var ve=Object.prototype.hasOwnProperty;var Te=(s,e)=>{for(var t in e)B(s,t,{get:e[t],enumerable:!0})},be=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ce(e))!ve.call(s,n)&&n!==t&&B(s,n,{get:()=>e[n],enumerable:!(r=fe(e,n))||r.enumerable});return s};var ke=s=>be(B({},"__esModule",{value:!0}),s);var et={};Te(et,{PaymentAPI:()=>U,PciVaultCardCapture:()=>N});module.exports=ke(et);var a=require("@flopay/shared");function W(s){return typeof s=="string"&&s.trim()?s:void 0}function J(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 _e(){return Object.assign(new Error("The operation was aborted."),{name:"AbortError"})}function x(s,e){let t=150*2**s,r=Math.round(t*(.75+Math.random()*.5));return new Promise((n,o)=>{let i,l=()=>e.removeEventListener("abort",u),u=()=>{i!==void 0&&clearTimeout(i),l(),o(_e())};if(e.aborted){u();return}i=setTimeout(()=>{l(),n()},r),e.addEventListener("abort",u,{once:!0})})}var Me="flopay_session_display:";var O=new Map;function q(s){return`${Me}${s}`}function j(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function H(s,e,t){if(!s)return;let r=t?.ttlMs??36e5,n={data:e,expiresAt:Date.now()+r},o=j();if(o)try{o.setItem(q(s),JSON.stringify(n));return}catch{}O.set(s,n)}function Q(s){if(!s)return null;let e=j();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 X(s){if(!s)return;O.delete(s);let e=j();if(e)try{e.removeItem(q(s))}catch{}}var T=require("@flopay/shared"),Se="/v1/sdk-telemetry/events",K=16,Ae=64,Re=1500,Z=1e3,Ee=64,we="00000000-0000-4000-8000-000000000000",Ie={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 Pe(s){try{return new TextEncoder().encode(s).byteLength}catch{return s.length}}function De(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])}function b(){return globalThis.performance?.now()??0}var k=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(/\/+$/,"")}${Se}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=A(),this.merchantEnabled=e.enabled!==!1,this.clock=e.clock??b,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,T.buildTelemetryLogEvent)({...this.checkoutContext,...e,eventId:A(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=(0,T.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:we,sequence:0}),r=De(t),n=this.now();this.pruneReportedFailures(n);let o=this.reportedFailures.get(r);if(o!==void 0&&n>=o&&n-o<Z){this.log({name:"operation.deduplicated",stage:e.stage,provider:e.provider,paymentMethodCategory:e.paymentMethodCategory,attempt:e.attempt});return}this.rememberReportedFailure(r,n),this.enqueue((0,T.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:A(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue((0,T.buildTelemetryPerformanceEvent)({...this.checkoutContext,...e,eventId:A(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue((0,T.buildTelemetryTerminalEvent)({...this.checkoutContext,...e,eventId:A(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let t=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({stage:"total_journey",durationMs:Math.max(0,this.now()-t),durationMode:"total",provider:e.provider,paymentMethodCategory:e.paymentMethodCategory})}}now(){try{return this.clock()}catch{return b()}}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>=Z)&&this.reportedFailures.delete(t)}rememberReportedFailure(e,t){for(;this.reportedFailures.size>=Ee;){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>=Ae||this.eventCounts[e.class]>=Ie[e.class])){if(this.eventCounts[e.class]+=1,this.queue.push(e),this.queue.length>=K){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,K);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,K);this.sendBatch(e)}}async sendBatch(e){if(!this.browserTransportAvailable||this.ingestionDisabled)return;let t=(0,T.serializeTelemetryBatch)(e,{correlationId:this.correlationId,sdkPackage:this.sdkPackage,sdkVersion:this.sdkVersion,batchId:A()});if(Pe(t)>T.TELEMETRY_MAX_BATCH_BYTES)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 u=>{if(u.status!==202)return null;let c=null;try{c=await u.json()}catch{}return c?.status==="disabled"?"disabled":null}).catch(()=>null),i=new Promise(u=>{n=setTimeout(()=>{r?.abort(),u(null)},Re)});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)}},ee=Symbol.for("@flopay/js.telemetry.reporter-factory.v1"),te=globalThis;te[ee]===void 0&&Object.defineProperty(te,ee,{configurable:!0,enumerable:!1,writable:!1,value:s=>new k(s)});var re=1e3,xe=500,Oe=15e3,qe=3e3,Fe=1e4,Le=1e4;function Ue(s){return typeof s=="object"&&s!==null}function R(s,e){return W(s?.[e])}function se(s,e){return J(s?.[e])}function Ve(s,e){let t=s?.[e];return typeof t=="number"&&Number.isFinite(t)?t:void 0}function ie(s){return new Promise(e=>setTimeout(e,s))}function Ne(s){return s instanceof Error&&s.name==="AbortError"}function F(){return new a.FloPayError("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=Ue(t?.error)?t.error:null,n=se(t,"message")??se(r,"message")??e,o=R(t,"code")??R(t,"gatewayErrorCode")??R(r,"code")??`http_${s.status}`;return new a.FloPayError(n,"api_error",{code:o,statusCode:s.status})}async function ze(s){let e=s.status===400?await s.clone().json().catch(()=>null):null;return(0,a.classifyPaymentRejection)(s.status,e)}function ne(s){return s===400||s===422}var L=2;async function $(s,e,t=L,r){let n;for(let o=0;;o++)try{return await fetch(s,e)}catch(i){if(e?.signal?.aborted||i instanceof Error&&i.name==="AbortError")throw i;if(n=i,o>=t)throw n;try{r?.(o+1)}catch{}await ie(150*2**o)}}var Be=Symbol.for("@flopay/js.session-create.telemetry.v1");function je(s){return s[Be]}function He(s){return"now"in s||"onFirstByte"in s||"onSessionCreateFailure"in s||"onRetry"in s}function ae(s){let e=(0,a.isCardHolderNamePlaceholder)(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 ce(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 Ke(s,e){let t={clientId:s.clientId,checkoutVersion:a.SDK_VERSION,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}),ce(t,s),t}function oe(s,e,t){return{currency:e,products:t.map(r=>(0,a.buildProductPayload)(r,e)),couponCodes:s.couponCodes??[],accountData:ae(s.account)}}function $e(s,e,t){return{currency:e,products:t.map(r=>(0,a.buildProductPayload)(r,e)),couponCodes:s.couponCodes??[]}}function Ge(s){let e={},t=(0,a.isCardHolderNamePlaceholder)(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 M=class M{constructor(e,t={}){this.baseUrl=e.replace(/\/+$/,"");let r=He(t);this.telemetryHooks=r?t:void 0,this.directTelemetry=r||t.telemetry===!1?void 0:new k({billingApiUrl:this.baseUrl,sdkVersion:a.SDK_VERSION})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,t,r,n,o="unknown"){let i=(0,a.classifyTelemetryFailure)(e,t);this.directTelemetry?.error({...i,stage:r,requestCategory:n,paymentMethodCategory:o})}reportAccountSnapshotFailure(e,t){let r=(0,a.classifyTelemetryFailure)(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()??b()}catch{return b()}}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();this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let o={[a.FLO_SDK_VERSION_HEADER]:a.SDK_VERSION};t&&(o["x-checkout-session-token"]=t);try{let i=await $(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:o},L,d=>{this.telemetryHooks?.onRetry?.("session_read",d),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:d})}),l=Math.max(0,this.telemetryTimestamp()-n);try{this.telemetryHooks?.onFirstByte?.(l)}catch{}let u=`${Math.floor(i.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:u}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:l,durationMode:"machine",requestCategory:"session_read",statusClass:u}),!i.ok)throw await _(i,"Failed to get checkout session");let c=await i.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:u}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"session_read",statusClass:u}),{...c,data:this.mergeCachedDisplayData(c.data)}}catch(i){throw r&&this.directTelemetry?.error({...(0,a.classifyTelemetryFailure)(i,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),i}}cacheSessionDisplayData(e,t,r){H(e,t,r)}clearSessionDisplayData(e){X(e)}async getVaultCapture(e,t){let r=`${this.baseUrl}\0${e}\0${t??""}`,n=M.activeVaultCaptureRequests.get(r);if(n)return n;let o=this.requestVaultCapture(e,t);M.activeVaultCaptureRequests.set(r,o);try{return await o}finally{M.activeVaultCaptureRequests.get(r)===o&&M.activeVaultCaptureRequests.delete(r)}}async requestVaultCapture(e,t){let r=new AbortController,n=setTimeout(()=>r.abort(),Le);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 l=await $(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:r.signal},L,c=>{this.telemetryHooks?.onRetry?.("vault_capture",c),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:c})});if(!l.ok)throw await _(l,"Failed to load the secure card form");let u=await l.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(u)}catch(l){let u=r.signal.aborted?new a.FloPayError("Timed out while loading the secure card form. Please try again.","api_error",{code:"vault_capture_timeout"}):l;throw this.reportDirectFailure(u,"VAULT_LOAD_FAILED","vault_request","vault_capture","card"),u}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 a.FloPayError("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:l,...u}=t,c;try{c=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(u)})}catch(d){if(Ne(d))throw this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),d;c=await this.reconcileProcessPayment(t.sessionId,{...r,nonce:i,paymentMethodCategory:n})}if(!c.ok&&c.status!==202){let d=await ze(c);return d?this.directTelemetry?.terminal({outcome:d,stage:"processing",requestCategory:"process_payment",statusClass:"4xx",paymentMethodCategory:n}):this.directTelemetry?.error({errorCode:"PAYMENT_PROCESSING_FAILED",stage:"processing",requestCategory:"process_payment",statusClass:(0,a.telemetryStatusClass)(c.status),failureCategory:c.status>=500?"server_error":void 0,paymentMethodCategory:n}),c}try{let d=await this.resolveProcessResponse(c,t.sessionId,{...r,nonce:i,paymentMethodCategory:n});return this.directTelemetry?.log({name:"payment.processing.completed",stage:"processing",requestCategory:"process_payment",statusClass:(0,a.telemetryStatusClass)(d.status),paymentMethodCategory:n}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"process_payment",statusClass:(0,a.telemetryStatusClass)(d.status),paymentMethodCategory:n}),d}catch(d){throw d instanceof a.FloPayError&&d.code==="checkout_processing_timeout"||this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),d}}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??Fe,l=new AbortController,u=()=>l.abort();n?.signal&&(n.signal.aborted?l.abort():n.signal.addEventListener("abort",u,{once:!0}));let c=setTimeout(()=>l.abort(),i);try{let d;try{d=await $(`${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:l.signal},L,h=>{this.telemetryHooks?.onRetry?.("account_snapshot",h),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:h})})}finally{clearTimeout(c),n?.signal?.removeEventListener("abort",u)}if(!d.ok)throw await _(d,"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(d){throw this.reportAccountSnapshotFailure(d,n?.telemetryMode??"blocking"),d}}async createSessionIntent(e,t,r,n){if(!t)throw new a.FloPayError("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.paymentMethodType,l=typeof i=="string"&&i.trim().toLowerCase()==="card",u=typeof i=="string"&&i.length>0&&!l&&(typeof o.paymentMethodId=="string"||o.paymentMethodId===null),c=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(o.intentKind==="payment"||o.intentKind==="setup"),d=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodId===null&&(o.paymentMethodType==="paypal"&&o.intentKind==="payment"||o.paymentMethodType===a.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&(o.intentKind==="payment"||o.intentKind==="setup"));if(!u||!c&&!d)throw new a.FloPayError("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let h=o.authorizationAttemptId;if(h!==void 0&&!(0,a.isUuidV4)(h))throw new a.FloPayError("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let m=(0,a.isUuidV4)(h)?h:(0,a.randomUuidV4)();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let f={"Content-Type":"application/json","x-checkout-session-token":t,[a.IDEMPOTENCY_KEY_HEADER]:n?.idempotencyKey||m},v=!1;try{let y=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:f,body:JSON.stringify({...r,authorizationAttemptId:m}),signal:n?.signal});if(!y.ok){v=!0;let z=await _(y,"Failed to create checkout intent"),ge=(0,a.classifyTelemetryFailure)(z,"PAYMENT_PROCESSING_FAILED");throw ne(z.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...ge,stage:"processing",requestCategory:"intent_create"}),z}let E=(await y.json()).data;if(!E||typeof E!="object")throw new a.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let p=E,Y=p.paymentMethodType,me=(p.paymentMethodCategory==="wallet"||p.paymentMethodCategory==="apm")&&typeof Y=="string"&&Y.trim().toLowerCase()!=="card"&&(typeof p.paymentMethodId=="string"||p.paymentMethodId===null)&&typeof p.providerObjectId=="string",pe=p.provider==="stripe"&&(p.intentKind==="payment"||p.intentKind==="setup")&&typeof p.clientSecret=="string",he=p.provider==="paypal"&&p.paymentMethodCategory==="wallet"&&p.paymentMethodId===null&&(p.paymentMethodType==="paypal"&&p.intentKind==="payment"&&(p.providerObjectType==="order"||p.providerObjectType==="subscription")||p.paymentMethodType===a.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&p.intentKind==="payment"&&p.providerObjectType==="order"||p.paymentMethodType===a.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&p.intentKind==="setup"&&p.providerObjectType==="setup_token")&&p.clientSecret===null,ye=p.provider===r.provider&&p.paymentMethodCategory===r.paymentMethodCategory&&p.paymentMethodType===r.paymentMethodType&&p.paymentMethodId===r.paymentMethodId&&p.intentKind===r.intentKind;if(!me||!pe&&!he||!ye)throw new a.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});return this.directTelemetry?.log({name:"payment.intent.completed",stage:"processing",requestCategory:"intent_create",statusClass:(0,a.telemetryStatusClass)(y.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:(0,a.telemetryStatusClass)(y.status)}),p}catch(y){throw v||this.reportDirectFailure(y,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),y}}async reportSessionIntentDecline(e,t,r,n){if(!t)throw new a.FloPayError("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.providerDeclineReason,l=o.paymentMethodType,u=o.providerIntentId,c=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 l=="string"&&l.length>0&&l.trim().toLowerCase()!=="card"&&c,h=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(u===void 0||typeof u=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(u)),m=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodType==="paypal"&&u===void 0;if(!d||!h&&!m)throw new a.FloPayError("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=m?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:o.paymentMethodCategory,paymentMethodType:o.paymentMethodType,providerDeclineReason:i,...typeof u=="string"?{providerIntentId:u}:{}},f=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:n?.signal});if(!f.ok)throw await _(f,"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 l=await fetch(`${this.baseUrl}/v1/payments?${i.toString()}`,{method:"GET",signal:t?.signal,keepalive:!0});if(!l.ok)throw new a.FloPayError("Failed to fetch payments","api_error",{statusCode:l.status});let u=await l.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"}),u}catch(l){throw this.reportDirectFailure(l,"RECOVERY_FAILED","recovery","other","saved"),l}}async createAndFetchSession(e){if((0,a.isDetachedSessionEligible)(e)){let o=e.account.email?.trim();if(o&&!(0,a.isValidEmail)(o))throw new a.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(),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,t,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,n){let o=e.products??(0,a.foldIntoProducts)(e.items,e.subscriptions);(0,a.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:o});let i=(0,a.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,o);if(!i)throw new a.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 l={clientId:e.clientId,checkoutVersion:a.SDK_VERSION,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:i,checkoutMode:e.checkoutMode??"full",products:o.map(m=>(0,a.buildProductPayload)(m,i)),accountData:ae(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(l.captureMethod=e.captureMethod),e.tokenizedData&&(l.tokenizedData=e.tokenizedData),ce(l,e);let c=await(await this.postCheckoutSessionCreate(l,e,t,r,n)).json();if(c.data&&"gateways"in c.data){this.autoCacheDisplayData(c.data.uuid,e);let m=this.mergeCachedDisplayData(c.data),g=this.normalizeRawSession(m);return c.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(c.vault)),{...g,autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}let d=c.data?.uuid;if(!d)throw new a.FloPayError("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(d,e),this.adoptDirectTelemetryCheckout(d),{...await this.getUnifiedCheckoutSession(d),autoProcessingError:c.autoProcessingError,autoProcessingAttempted:c.autoProcessingAttempted,autoProcessingPending:c.autoProcessingPending}}async postCheckoutSessionCreate(e,t,r,n,o){let i={"Content-Type":"application/json",[a.FLO_SDK_VERSION_HEADER]:a.SDK_VERSION},l=(0,a.resolveIdempotencyKey)(t.idempotencyKey);l&&(i[a.IDEMPOTENCY_KEY_HEADER]=l);let u,c=!1,d=je(t),h=m=>{try{this.telemetryHooks?.onRetry?.("session_create",m),this.directTelemetry?.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:m})}catch{}};for(let m=0;m<3;m++){o.attempt=m;try{d?.onAttempt?.(m)}catch{}try{u=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:i,body:JSON.stringify(e),signal:n})}catch(v){if(o.statusClass=n.aborted||v instanceof Error&&v.name==="AbortError"?"timeout":"network_error",n.aborted||v instanceof Error&&v.name==="AbortError"||m>=2)throw v;let y=m+1;h(y),await x(m,n);continue}let g=(0,a.telemetryStatusClass)(u.status);if(o.statusClass=g,c||(c=!0,this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:g,attempt:m}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:Math.max(0,this.telemetryTimestamp()-r),durationMode:"machine",requestCategory:"session_create",statusClass:g,attempt:m})),u.status===204)throw new a.FloPayError("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(u.ok)break;let f=await _(u,"Failed to create checkout session");if(f.code===a.IDEMPOTENCY_IN_PROGRESS_CODE&&m<2){h(m+1),await x(m,n);continue}throw f}if(!u)throw new TypeError("Checkout-session creation exhausted its retry budget.");return u}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??(0,a.foldIntoProducts)(e.items,e.subscriptions);try{(0,a.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:o})}catch(y){throw r.clear(),this.reportSessionCreateFailure(y,t,n),y}let i=(0,a.resolveSessionCurrency)(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 a.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{oe(e,i,o)}catch(y){throw r.clear(),this.reportSessionCreateFailure(y,t,n),y}let l,u;try{if(u=await(await this.postCheckoutSessionCreate(Ke(e,i),e,t,r.signal,n)).json(),!u.data||!("gateways"in u.data))throw new a.FloPayError("The billing API returned no session shell for a detached create. It must support `deferDataAttachment` (TeamFloPay/backend#1099).","api_error",{code:"InvalidCheckoutSessionResponse"});l=this.normalizeRawSession(this.mergeCachedDisplayData(u.data)),u.vault&&l.data.session&&(l.data.session.vault=this.toVaultBlock(u.vault))}catch(y){throw r.clear(),this.reportSessionCreateFailure(y,t,n),y}let c=l.data.session?.id??u.data.uuid??"",d=l.data.session?.clientSecret??u.data.nonce??"";if(!c||!d){r.clear();let y=new a.FloPayError("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(y,t,n),y}r.clear(),this.adoptDirectTelemetryCheckout(c),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 h=!e.account.email?.trim(),m=S(e.timeoutMs??12e3),g=this.claimCheckoutSession(c,d,h?$e(e,i,o):oe(e,i,o),{params:e,startedAt:t,deadline:m,createAttempt:n.attempt}),f=h?void 0:g,v=(y={})=>{if(f)return f;let D={...e,account:{...e.account,...y,email:y.email?.trim()||e.account.email?.trim()}};return(0,a.isValidEmail)(D.account.email)?(f=g.then(()=>{let E=this.telemetryTimestamp();return this.claimCheckoutSession(c,d,Ge(D.account),{params:D,startedAt:E,deadline:S(e.timeoutMs??12e3),createAttempt:0})}),f.catch(()=>{}),f):Promise.reject(new a.FloPayError("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return g.catch(()=>{}),{shell:l,sessionId:c,nonce:d,claimed:g,claim:v}}async claimCheckoutSession(e,t,r,n){let o=n?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),l=n?.deadline??S(12e3),u=JSON.stringify(r),c="unknown",d=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let h;for(d=0;d<3;d++){try{h=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/claim`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t,[a.FLO_SDK_VERSION_HEADER]:a.SDK_VERSION},body:u,signal:l.signal})}catch(f){let v=l.signal.aborted||f instanceof Error&&f.name==="AbortError";if(c=v?"timeout":"network_error",v||d>=2)throw f;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 x(d,l.signal);continue}if(c=(0,a.telemetryStatusClass)(h.status),h.ok)break;throw await _(h,"Failed to attach checkout session data")}if(!h)throw new TypeError("Checkout-session claim exhausted its retry budget.");let m=await h.json();if(!m.data?.gateways)throw new a.FloPayError("The billing API returned no checkout session with gateways after claiming it.","api_error",{code:"InvalidCheckoutSessionResponse"});n?.params&&this.autoCacheDisplayData(m.data.uuid??e,n.params);let g=this.normalizeRawSession(this.mergeCachedDisplayData(m.data));return m.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(m.vault)),this.directTelemetry?.log({name:"session.claim.completed",stage:"session_claim",requestCategory:"session_claim",statusClass:c}),this.directTelemetry?.performance({stage:"session_claim",durationMs:Math.max(0,this.telemetryTimestamp()-i),durationMode:"machine",requestCategory:"session_claim",statusClass:c,attempt:d}),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:c}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"session_create",statusClass:c,attempt:n?.createAttempt??d}),g}catch(h){throw this.reportSessionCreateFailure(h,i,{attempt:d,statusClass:c},"session_claim"),h}finally{l.clear()}}reportSessionCreateFailure(e,t,r,n="session_create"){if(!(e instanceof a.FloPayError&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let o=(0,a.classifyTelemetryFailure)(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 a.FloPayError&&e.type==="validation_error"||e instanceof a.FloPayError&&ne(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 a.FloPayError&&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??Oe,o=Date.now()+n,i=this.clampRetryAfterMs(t?.initialDelayMs??re),l=0;try{for(;;){let u=o-Date.now();if(u<=0)throw F();if(i>0){try{l+=1,this.telemetryHooks?.onRetry?.("session_read",l),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved",attempt:l})}catch{}if(await ie(Math.min(i,u)),Date.now()>=o)throw F()}let c=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce),d=c.data.session?.status;if(d==="authorized"||d==="complete"||d==="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"}),c;if(Date.now()>=o)throw F();i=this.clampRetryAfterMs(Math.max(i*2,xe))}}catch(u){throw this.reportDirectFailure(u,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),u}}normalizeRawSession(e){let t=e.gateways??{},r=[],n={session:this.toCheckoutSession(e)},o=t.stripe;if(o?.publishableKey){r.push("stripe");let u=[e.stripeClientSecret,o.stripeClientSecret].find(c=>typeof c=="string"&&c.length>0);n.stripe={clientSecret:u??"",publishableKey:o.publishableKey??void 0,paypalPublishableKey:o.paypalPublishableKey??void 0,environment:o.environment,enabledPaymentMethods:Array.isArray(o.enabledPaymentMethods)?o.enabledPaymentMethods.filter(c=>typeof c=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(r.push("paypal"),n.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType}),{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((c,d)=>c+(d.overrideAmount??d.totalAmount??0),0),o=r?e.totalAmount:n,i=Math.round(o*100),l=e.currency??t[0]?.currency??"USD",u="payment";return e.checkoutMode==="setup"?u="setup":t.some(c=>c.type==="subscription")&&(u="subscription"),{id:e.uuid,clientSecret:e.nonce,mode:u,status:this.toCheckoutSessionStatus(e.status),amount:i,currency:l,captureMethod:e.captureMethod,paymentId:e.paymentId,authorizationExpiresAt:e.authorizationExpiresAt,failureOutcome:(0,a.normalizeCheckoutFailureOutcome)(e.outcome)??(0,a.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,buyerIdentified:e.buyerIdentified,providerPaymentMethodId:typeof e.providerPaymentMethodId=="string"?e.providerPaymentMethodId:null,products:t.map(c=>({...c,totalAmount:typeof c.totalAmount=="number"?c.totalAmount:void 0,overrideAmount:typeof c.overrideAmount=="number"?c.overrideAmount:null,currency:typeof c.currency=="string"?c.currency:void 0,metadata:c.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 a.FloPayError(r?"Authorization has expired.":"Checkout session has expired.","api_error",{code:r?"authorization_expired":"checkout_session_expired"})}throw F()}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:R(e,"sessionId")??r,retryAfterMs:this.clampRetryAfterMs(Ve(e,"retryAfterMs")??i??re),statusUrl:R(e,"statusUrl"),sessionUrl:R(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,qe))}autoCacheDisplayData(e,t){if(!e)return;let r=t.products??(0,a.foldIntoProducts)(t.items,t.subscriptions);if(r.length===0&&!t.currency)return;let n=t.products!==void 0,o=(0,a.resolveSessionCurrency)(t.currency,n?void 0:t.items,n?void 0:t.subscriptions,r);H(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=Q(e.uuid),r=new Map,n=i=>i?`code:${i}`:void 0;for(let i of t?.products??[]){let l=n(i.code);l&&r.set(l,i)}let o=(e.products??[]).map(i=>{let l=n(i.code),u=l?r.get(l):void 0;return{...i,name:i.name??u?.name??null,totalAmount:i.totalAmount??u?.totalAmount,overrideAmount:i.overrideAmount??u?.overrideAmount,currency:i.currency??u?.currency}});return{...e,currency:e.currency??t?.currency,products:o}}};M.activeVaultCaptureRequests=new Map;var U=M;var C=require("@flopay/shared");var G="flopay-vault",ue={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 Ye(s){return s.class==="lifecycle"?s.name:s.class==="technical_error"?s.code:s.class==="expected_outcome"?s.outcome:"sdk.performance"}function P(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:Ye(s),data:e})}catch{}}function V(s,e){return(0,C.buildTelemetryLogEvent)({eventId:"11111111-1111-4111-8111-111111111111",name:s,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}function le(s){return s?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime"}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function de(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 We(s,e,t,r="checkout"){let{type:n}=s;if(n==="complete"||n==="decline")return(0,C.buildTelemetryTerminalEvent)({eventId:"22222222-2222-4222-8222-222222222222",outcome:de(s,t,r),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(n==="error"){let l=le(e);return(0,C.buildTelemetryErrorEvent)({eventId:"33333333-3333-4333-8333-333333333333",...l,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[o,i]=ue[n];return V(o,i)}function Je(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===G&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function Qe(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 Xe(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===G&&e.type==="validation"&&Array.isArray(e.messages)}function Ze(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===G&&e.type==="resize"&&typeof e.height=="number"&&Number.isFinite(e.height)}var N=class{constructor(e={},t){this.provider="pcivault";this.container=null;this.messageHandler=null;this.actionOverlay=null;this.threeDsReturnHandler=null;this.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!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 k({billingApiUrl:(0,C.resolveBillingApiUrl)(),sdkVersion:C.SDK_VERSION}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new k({billingApiUrl:(0,C.resolveBillingApiUrl)(),sdkVersion:C.SDK_VERSION}));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?.()??b(),this.vaultReadyReported=!1,this.submissionStarted=!1,this.submissionStartedAt=null,typeof window>"u"||typeof document>"u")throw this.reportVaultLoadFailure(),new C.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 C.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.messageToken=t.messageToken??null,this.expectedOrigin=t.expectedOrigin??this.config.expectedOrigin??null,this.theme=t.theme;try{this.attachMessageListener(),this.injectWidget(e,t.html)}catch(n){throw this.reportVaultLoadFailure(),n}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),P(V("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",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(Ze(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;this.applyHeight(r.height);return}if(Xe(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;let u=r.messages.filter(c=>typeof c=="string"&&c.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:u||void 0});return}if(!Je(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=Qe(r.paymentMethod),l={...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?.()??b()),P(We(r,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(r),r.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder()),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,l)};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"})),r==="complete"||r==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:de(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(r==="error"){let i=le(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]=ue[r];t.log({name:n,stage:o,provider:"pcivault",paymentMethodCategory:"card"})}applyTheme(e){this.theme=e,this.postTheme()}postTheme(){if(this.theme===void 0||!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"theme",theme:this.theme},"*")}catch{}}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},"*")}catch{}}setCardFieldOrder(e,t){this.cardFieldOrder=e,this.cardAutoFocus=t,this.postCardFieldOrder()}postCardFieldOrder(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},"*")}catch{}}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);return}let t=document.createElement("div");t.setAttribute("data-flopay-action-required","1"),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.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 l=i.data;if(!l||typeof l!="object")return;let u=l;u.source==="flopay-vault-3ds-return"&&(P(V("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(),this.postActionCompleted(u.status))};window.addEventListener("message",o),this.threeDsReturnHandler=o,document.body.appendChild(t),this.actionOverlay=t,P(V("vault.three_ds.handoff","three_ds_handoff"))}postActionCompleted(e){if(!this.container)return;let r=this.container.querySelector("iframe")?.contentWindow;if(r)try{r.postMessage({source:"flopay-vault-host",type:"action_completed",status:typeof e=="string"?e:"unknown"},"*")}catch{}}abandonActionRequiredOverlay(){if(!this.actionOverlay)return;let e=(0,C.buildTelemetryTerminalEvent)({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"});P(e),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay(),this.postActionCompleted("abandoned")}hideActionRequiredOverlay(){this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),this.actionOverlay&&(this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null)}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`}};0&&(module.exports={PaymentAPI,PciVaultCardCapture});
|
package/dist/card-setup.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{k as r,m as a}from"./chunk-
|
|
1
|
+
import{k as r,m as a}from"./chunk-BIMDVWOB.mjs";export{r as PaymentAPI,a as PciVaultCardCapture};
|
|
@@ -0,0 +1 @@
|
|
|
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 P,FLO_SDK_VERSION_HEADER as H,FloPayError as p,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 M(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,u=()=>e.removeEventListener("abort",c),c=()=>{i!==void 0&&clearTimeout(i),u(),o(Oe())};if(e.aborted){c();return}i=setTimeout(()=>{u(),n()},r),e.addEventListener("abort",c,{once:!0})})}import{buildTelemetryErrorEvent as ne,buildTelemetryLogEvent as qe,buildTelemetryPerformanceEvent as Fe,buildTelemetryTerminalEvent as Le,serializeTelemetryBatch as Ue,TELEMETRY_MAX_BATCH_BYTES as Ve}from"@flopay/shared";var Ne="/v1/sdk-telemetry/events",j=16,ze=64,Be=1500,oe=1e3,je=64,He="00000000-0000-4000-8000-000000000000",Ke={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function S(){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])}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(/\/+$/,"")}${Ne}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=S(),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:S(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=ne({...this.checkoutContext,...e,eventId:He,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});return}this.rememberReportedFailure(r,n),this.enqueue(ne({...this.checkoutContext,...e,eventId:S(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue(Fe({...this.checkoutContext,...e,eventId:S(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue(Le({...this.checkoutContext,...e,eventId:S(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let t=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({stage:"total_journey",durationMs:Math.max(0,this.now()-t),durationMode:"total",provider:e.provider,paymentMethodCategory:e.paymentMethodCategory})}}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>=je;){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>=j){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,j);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,j);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:S()});if($e(t)>Ve)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 c=>{if(c.status!==202)return null;let a=null;try{a=await c.json()}catch{}return a?.status==="disabled"?"disabled":null}).catch(()=>null),i=new Promise(c=>{n=setTimeout(()=>{r?.abort(),c(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=1e3,Ze=500,et=15e3,tt=3e3,rt=1e4,st=1e4;function nt(s){return typeof s=="object"&&s!==null}function A(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 p("Checkout is still processing. Please try again shortly.","api_error",{code:"checkout_processing_timeout"})}async function k(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=A(t,"code")??A(t,"gatewayErrorCode")??A(r,"code")??`http_${s.status}`;return new p(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){let n;for(let o=0;;o++)try{return await fetch(s,e)}catch(i){if(e?.signal?.aborted||i instanceof Error&&i.name==="AbortError")throw i;if(n=i,o>=t)throw n;try{r?.(o+1)}catch{}await Ce(150*2**o)}}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 _=class _{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=P(e,t);this.directTelemetry?.error({...i,stage:r,requestCategory:n,paymentMethodCategory:o})}reportAccountSnapshotFailure(e,t){let r=P(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();this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let o={[H]:R};t&&(o["x-checkout-session-token"]=t);try{let i=await Y(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:o},U,l=>{this.telemetryHooks?.onRetry?.("session_read",l),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:l})}),u=Math.max(0,this.telemetryTimestamp()-n);try{this.telemetryHooks?.onFirstByte?.(u)}catch{}let c=`${Math.floor(i.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:u,durationMode:"machine",requestCategory:"session_read",statusClass:c}),!i.ok)throw await k(i,"Failed to get checkout session");let a=await i.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"session_read",statusClass:c}),{...a,data:this.mergeCachedDisplayData(a.data)}}catch(i){throw r&&this.directTelemetry?.error({...P(i,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),i}}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=_.activeVaultCaptureRequests.get(r);if(n)return n;let o=this.requestVaultCapture(e,t);_.activeVaultCaptureRequests.set(r,o);try{return await o}finally{_.activeVaultCaptureRequests.get(r)===o&&_.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 u=await Y(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:r.signal},U,a=>{this.telemetryHooks?.onRetry?.("vault_capture",a),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:a})});if(!u.ok)throw await k(u,"Failed to load the secure card form");let c=await u.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(c)}catch(u){let c=r.signal.aborted?new p("Timed out while loading the secure card form. Please try again.","api_error",{code:"vault_capture_timeout"}):u;throw this.reportDirectFailure(c,"VAULT_LOAD_FAILED","vault_request","vault_capture","card"),c}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 p("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:u,...c}=t,a;try{a=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(l){if(it(l))throw this.reportDirectFailure(l,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),l;a=await this.reconcileProcessPayment(t.sessionId,{...r,nonce:i,paymentMethodCategory:n})}if(!a.ok&&a.status!==202){let l=await at(a);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(a.status),failureCategory:a.status>=500?"server_error":void 0,paymentMethodCategory:n}),a}try{let l=await this.resolveProcessResponse(a,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 p&&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,u=new AbortController,c=()=>u.abort();n?.signal&&(n.signal.aborted?u.abort():n.signal.addEventListener("abort",c,{once:!0}));let a=setTimeout(()=>u.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:u.signal},U,h=>{this.telemetryHooks?.onRetry?.("account_snapshot",h),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:h})})}finally{clearTimeout(a),n?.signal?.removeEventListener("abort",c)}if(!l.ok)throw await k(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 p("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.paymentMethodType,u=typeof i=="string"&&i.trim().toLowerCase()==="card",c=typeof i=="string"&&i.length>0&&!u&&(typeof o.paymentMethodId=="string"||o.paymentMethodId===null),a=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(!c||!a&&!l)throw new p("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let h=o.authorizationAttemptId;if(h!==void 0&&!le(h))throw new p("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let d=le(h)?h:Qe();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let f={"Content-Type":"application/json","x-checkout-session-token":t,[ue]:n?.idempotencyKey||d},C=!1;try{let y=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:f,body:JSON.stringify({...r,authorizationAttemptId:d}),signal:n?.signal});if(!y.ok){C=!0;let N=await k(y,"Failed to create checkout intent"),De=P(N,"PAYMENT_PROCESSING_FAILED");throw ye(N.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...De,stage:"processing",requestCategory:"intent_create"}),N}let E=(await y.json()).data;if(!E||typeof E!="object")throw new p("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let m=E,Z=m.paymentMethodType,Ee=(m.paymentMethodCategory==="wallet"||m.paymentMethodCategory==="apm")&&typeof Z=="string"&&Z.trim().toLowerCase()!=="card"&&(typeof m.paymentMethodId=="string"||m.paymentMethodId===null)&&typeof m.providerObjectId=="string",we=m.provider==="stripe"&&(m.intentKind==="payment"||m.intentKind==="setup")&&typeof m.clientSecret=="string",Ie=m.provider==="paypal"&&m.paymentMethodCategory==="wallet"&&m.paymentMethodId===null&&(m.paymentMethodType==="paypal"&&m.intentKind==="payment"&&(m.providerObjectType==="order"||m.providerObjectType==="subscription")||m.paymentMethodType===$&&m.intentKind==="payment"&&m.providerObjectType==="order"||m.paymentMethodType===$&&m.intentKind==="setup"&&m.providerObjectType==="setup_token")&&m.clientSecret===null,Pe=m.provider===r.provider&&m.paymentMethodCategory===r.paymentMethodCategory&&m.paymentMethodType===r.paymentMethodType&&m.paymentMethodId===r.paymentMethodId&&m.intentKind===r.intentKind;if(!Ee||!we&&!Ie||!Pe)throw new p("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});return this.directTelemetry?.log({name:"payment.intent.completed",stage:"processing",requestCategory:"intent_create",statusClass:b(y.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:b(y.status)}),m}catch(y){throw C||this.reportDirectFailure(y,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),y}}async reportSessionIntentDecline(e,t,r,n){if(!t)throw new p("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.providerDeclineReason,u=o.paymentMethodType,c=o.providerIntentId,a=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 u=="string"&&u.length>0&&u.trim().toLowerCase()!=="card"&&a,h=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(c===void 0||typeof c=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(c)),d=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodType==="paypal"&&c===void 0;if(!l||!h&&!d)throw new p("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=d?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:o.paymentMethodCategory,paymentMethodType:o.paymentMethodType,providerDeclineReason:i,...typeof c=="string"?{providerIntentId:c}:{}},f=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:n?.signal});if(!f.ok)throw await k(f,"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 u=await fetch(`${this.baseUrl}/v1/payments?${i.toString()}`,{method:"GET",signal:t?.signal,keepalive:!0});if(!u.ok)throw new p("Failed to fetch payments","api_error",{statusCode:u.status});let c=await u.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"}),c}catch(u){throw this.reportDirectFailure(u,"RECOVERY_FAILED","recovery","other","saved"),u}}async createAndFetchSession(e){if(Je(e)){let o=e.account.email?.trim();if(o&&!de(o))throw new p("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=M(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,t,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,n){let o=e.products??K(e.items,e.subscriptions);ce({captureMethod:e.captureMethod,products:o});let i=G(e.currency,e.items,e.subscriptions,o);if(!i)throw new p("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 u={clientId:e.clientId,checkoutVersion:R,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:i,checkoutMode:e.checkoutMode??"full",products:o.map(d=>J(d,i)),accountData:ve(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(u.captureMethod=e.captureMethod),e.tokenizedData&&(u.tokenizedData=e.tokenizedData),Te(u,e);let a=await(await this.postCheckoutSessionCreate(u,e,t,r,n)).json();if(a.data&&"gateways"in a.data){this.autoCacheDisplayData(a.data.uuid,e);let d=this.mergeCachedDisplayData(a.data),g=this.normalizeRawSession(d);return a.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(a.vault)),{...g,autoProcessingError:a.autoProcessingError,autoProcessingAttempted:a.autoProcessingAttempted,autoProcessingPending:a.autoProcessingPending}}let l=a.data?.uuid;if(!l)throw new p("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(l,e),this.adoptDirectTelemetryCheckout(l),{...await this.getUnifiedCheckoutSession(l),autoProcessingError:a.autoProcessingError,autoProcessingAttempted:a.autoProcessingAttempted,autoProcessingPending:a.autoProcessingPending}}async postCheckoutSessionCreate(e,t,r,n,o){let i={"Content-Type":"application/json",[H]:R},u=Xe(t.idempotencyKey);u&&(i[ue]=u);let c,a=!1,l=ut(t),h=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++){o.attempt=d;try{l?.onAttempt?.(d)}catch{}try{c=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:i,body:JSON.stringify(e),signal:n})}catch(C){if(o.statusClass=n.aborted||C instanceof Error&&C.name==="AbortError"?"timeout":"network_error",n.aborted||C instanceof Error&&C.name==="AbortError"||d>=2)throw C;let y=d+1;h(y),await F(d,n);continue}let g=b(c.status);if(o.statusClass=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()-r),durationMode:"machine",requestCategory:"session_create",statusClass:g,attempt:d})),c.status===204)throw new p("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(c.ok)break;let f=await k(c,"Failed to create checkout session");if(f.code===We&&d<2){h(d+1),await F(d,n);continue}throw f}if(!c)throw new TypeError("Checkout-session creation exhausted its retry budget.");return c}async createDetachedSession(e){this.beginDirectTelemetryOperation();let t=this.telemetryTimestamp(),r=M(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(y){throw r.clear(),this.reportSessionCreateFailure(y,t,n),y}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 p("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(y){throw r.clear(),this.reportSessionCreateFailure(y,t,n),y}let u,c;try{if(c=await(await this.postCheckoutSessionCreate(dt(e,i),e,t,r.signal,n)).json(),!c.data||!("gateways"in c.data))throw new p("The billing API returned no session shell for a detached create. It must support `deferDataAttachment` (TeamFloPay/backend#1099).","api_error",{code:"InvalidCheckoutSessionResponse"});u=this.normalizeRawSession(this.mergeCachedDisplayData(c.data)),c.vault&&u.data.session&&(u.data.session.vault=this.toVaultBlock(c.vault))}catch(y){throw r.clear(),this.reportSessionCreateFailure(y,t,n),y}let a=u.data.session?.id??c.data.uuid??"",l=u.data.session?.clientSecret??c.data.nonce??"";if(!a||!l){r.clear();let y=new p("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(y,t,n),y}r.clear(),this.adoptDirectTelemetryCheckout(a),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 h=!e.account.email?.trim(),d=M(e.timeoutMs??12e3),g=this.claimCheckoutSession(a,l,h?mt(e,i,o):ge(e,i,o),{params:e,startedAt:t,deadline:d,createAttempt:n.attempt}),f=h?void 0:g,C=(y={})=>{if(f)return f;let x={...e,account:{...e.account,...y,email:y.email?.trim()||e.account.email?.trim()}};return de(x.account.email)?(f=g.then(()=>{let E=this.telemetryTimestamp();return this.claimCheckoutSession(a,l,pt(x.account),{params:x,startedAt:E,deadline:M(e.timeoutMs??12e3),createAttempt:0})}),f.catch(()=>{}),f):Promise.reject(new p("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return g.catch(()=>{}),{shell:u,sessionId:a,nonce:l,claimed:g,claim:C}}async claimCheckoutSession(e,t,r,n){let o=n?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),u=n?.deadline??M(12e3),c=JSON.stringify(r),a="unknown",l=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let h;for(l=0;l<3;l++){try{h=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/claim`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t,[H]:R},body:c,signal:u.signal})}catch(f){let C=u.signal.aborted||f instanceof Error&&f.name==="AbortError";if(a=C?"timeout":"network_error",C||l>=2)throw f;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,u.signal);continue}if(a=b(h.status),h.ok)break;throw await k(h,"Failed to attach checkout session data")}if(!h)throw new TypeError("Checkout-session claim exhausted its retry budget.");let d=await h.json();if(!d.data?.gateways)throw new p("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 g=this.normalizeRawSession(this.mergeCachedDisplayData(d.data));return d.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(d.vault)),this.directTelemetry?.log({name:"session.claim.completed",stage:"session_claim",requestCategory:"session_claim",statusClass:a}),this.directTelemetry?.performance({stage:"session_claim",durationMs:Math.max(0,this.telemetryTimestamp()-i),durationMode:"machine",requestCategory:"session_claim",statusClass:a,attempt:l}),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:a}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"session_create",statusClass:a,attempt:n?.createAttempt??l}),g}catch(h){throw this.reportSessionCreateFailure(h,i,{attempt:l,statusClass:a},"session_claim"),h}finally{u.clear()}}reportSessionCreateFailure(e,t,r,n="session_create"){if(!(e instanceof p&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let o=P(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 p&&e.type==="validation_error"||e instanceof p&&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 p&&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),u=0;try{for(;;){let c=o-Date.now();if(c<=0)throw L();if(i>0){try{u+=1,this.telemetryHooks?.onRetry?.("session_read",u),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved",attempt:u})}catch{}if(await Ce(Math.min(i,c)),Date.now()>=o)throw L()}let a=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce),l=a.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"}),a;if(Date.now()>=o)throw L();i=this.clampRetryAfterMs(Math.max(i*2,Ze))}}catch(c){throw this.reportDirectFailure(c,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),c}}normalizeRawSession(e){let t=e.gateways??{},r=[],n={session:this.toCheckoutSession(e)},o=t.stripe;if(o?.publishableKey){r.push("stripe");let c=[e.stripeClientSecret,o.stripeClientSecret].find(a=>typeof a=="string"&&a.length>0);n.stripe={clientSecret:c??"",publishableKey:o.publishableKey??void 0,paypalPublishableKey:o.paypalPublishableKey??void 0,environment:o.environment,enabledPaymentMethods:Array.isArray(o.enabledPaymentMethods)?o.enabledPaymentMethods.filter(a=>typeof a=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(r.push("paypal"),n.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType}),{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((a,l)=>a+(l.overrideAmount??l.totalAmount??0),0),o=r?e.totalAmount:n,i=Math.round(o*100),u=e.currency??t[0]?.currency??"USD",c="payment";return e.checkoutMode==="setup"?c="setup":t.some(a=>a.type==="subscription")&&(c="subscription"),{id:e.uuid,clientSecret:e.nonce,mode:c,status:this.toCheckoutSessionStatus(e.status),amount:i,currency:u,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(a=>({...a,totalAmount:typeof a.totalAmount=="number"?a.totalAmount:void 0,overrideAmount:typeof a.overrideAmount=="number"?a.overrideAmount:null,currency:typeof a.currency=="string"?a.currency:void 0,metadata:a.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 p(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:A(e,"sessionId")??r,retryAfterMs:this.clampRetryAfterMs(ot(e,"retryAfterMs")??i??pe),statusUrl:A(e,"statusUrl"),sessionUrl:A(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 u=n(i.code);u&&r.set(u,i)}let o=(e.products??[]).map(i=>{let u=n(i.code),c=u?r.get(u):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:o}}};_.activeVaultCaptureRequests=new Map;var W=_;function Dt(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 ke,SDK_VERSION as _e}from"@flopay/shared";var X="flopay-vault",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 gt(s){return s.class==="lifecycle"?s.name:s.class==="technical_error"?s.code:s.class==="expected_outcome"?s.outcome:"sdk.performance"}function D(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:gt(s),data:e})}catch{}}function V(s,e){return yt({eventId:"11111111-1111-4111-8111-111111111111",name:s,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}function Re(s){return s?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime"}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function Ae(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 ft(s,e,t,r="checkout"){let{type:n}=s;if(n==="complete"||n==="decline")return Me({eventId:"22222222-2222-4222-8222-222222222222",outcome:Ae(s,t,r),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(n==="error"){let u=Re(e);return ht({eventId:"33333333-3333-4333-8333-333333333333",...u,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[o,i]=Se[n];return V(o,i)}function Ct(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 vt(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 Tt(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===X&&e.type==="validation"&&Array.isArray(e.messages)}function bt(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.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!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:ke(),sdkVersion:_e}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new T({billingApiUrl:ke(),sdkVersion:_e}));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;try{this.attachMessageListener(),this.injectWidget(e,t.html)}catch(n){throw this.reportVaultLoadFailure(),n}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),D(V("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",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(bt(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;this.applyHeight(r.height);return}if(Tt(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;let c=r.messages.filter(a=>typeof a=="string"&&a.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:c||void 0});return}if(!Ct(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=vt(r.paymentMethod),u={...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()),D(ft(r,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(r),r.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder()),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,u)};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"})),r==="complete"||r==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:Ae(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(r==="error"){let i=Re(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(){if(this.theme===void 0||!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"theme",theme:this.theme},"*")}catch{}}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},"*")}catch{}}setCardFieldOrder(e,t){this.cardFieldOrder=e,this.cardAutoFocus=t,this.postCardFieldOrder()}postCardFieldOrder(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},"*")}catch{}}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);return}let t=document.createElement("div");t.setAttribute("data-flopay-action-required","1"),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.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 u=i.data;if(!u||typeof u!="object")return;let c=u;c.source==="flopay-vault-3ds-return"&&(D(V("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(),this.postActionCompleted(c.status))};window.addEventListener("message",o),this.threeDsReturnHandler=o,document.body.appendChild(t),this.actionOverlay=t,D(V("vault.three_ds.handoff","three_ds_handoff"))}postActionCompleted(e){if(!this.container)return;let r=this.container.querySelector("iframe")?.contentWindow;if(r)try{r.postMessage({source:"flopay-vault-host",type:"action_completed",status:typeof e=="string"?e:"unknown"},"*")}catch{}}abandonActionRequiredOverlay(){if(!this.actionOverlay)return;let e=Me({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"});D(e),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay(),this.postActionCompleted("abandoned")}hideActionRequiredOverlay(){this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),this.actionOverlay&&(this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null)}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 Ft(s,e){let t=Q;return new t(s,{reporter:e})}export{re as a,se as b,M 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,Dt as l,Q as m,Ft as n};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var he=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var ut=(r,e)=>{for(var t in e)he(r,t,{get:e[t],enumerable:!0})},lt=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of at(e))!ct.call(r,s)&&s!==t&&he(r,s,{get:()=>e[s],enumerable:!(o=it(e,s))||o.enumerable});return r};var dt=r=>lt(he({},"__esModule",{value:!0}),r);var Yt={};ut(Yt,{FloPay:()=>W,PaymentAPI:()=>Y,PciVaultCardCapture:()=>q,SESSION_CREATE_TELEMETRY:()=>Te,StripeAdapter:()=>j,cacheSessionDisplayData:()=>x,clearSessionDisplayData:()=>ne,createCheckoutSession:()=>Ie,createCheckoutSessionWithRetries:()=>Oe,dropThirdPartyOnlyError:()=>st.dropThirdPartyOnlyError,getSessionDisplayData:()=>se,loadFloPay:()=>ot,toStripeAppearance:()=>tt,toStripeAppearanceTheme:()=>ke});module.exports=dt(Yt);var st=require("@flopay/shared");var f=require("@flopay/shared");function K(r){return typeof r=="string"&&r.trim()?r:void 0}function $(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 I(r=12e3){let e=Number.isFinite(r)&&r>=0?r:12e3,t=new AbortController,o=setTimeout(()=>t.abort(),e);return{signal:t.signal,clear:()=>clearTimeout(o)}}function mt(){return Object.assign(new Error("The operation was aborted."),{name:"AbortError"})}function L(r,e){let t=150*2**r,o=Math.round(t*(.75+Math.random()*.5));return new Promise((s,n)=>{let i,a=()=>e.removeEventListener("abort",c),c=()=>{i!==void 0&&clearTimeout(i),a(),n(mt())};if(e.aborted){c();return}i=setTimeout(()=>{a(),s()},o),e.addEventListener("abort",c,{once:!0})})}var pt="flopay_session_display:";var re=new Map;function oe(r){return`${pt}${r}`}function ge(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function x(r,e,t){if(!r)return;let o=t?.ttlMs??36e5,s={data:e,expiresAt:Date.now()+o},n=ge();if(n)try{n.setItem(oe(r),JSON.stringify(s));return}catch{}re.set(r,s)}function se(r){if(!r)return null;let e=ge();if(e)try{let o=e.getItem(oe(r));if(o){let s=JSON.parse(o);if(s&&typeof s.expiresAt=="number"&&s.expiresAt>Date.now())return s.data;e.removeItem(oe(r))}}catch{}let t=re.get(r);if(t){if(t.expiresAt>Date.now())return t.data;re.delete(r)}return null}function ne(r){if(!r)return;re.delete(r);let e=ge();if(e)try{e.removeItem(oe(r))}catch{}}var k=require("@flopay/shared"),yt="/v1/sdk-telemetry/events",fe=16,ht=64,gt=1500,Me=1e3,ft=64,Ct="00000000-0000-4000-8000-000000000000",vt={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function V(){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 Tt(r){try{return new TextEncoder().encode(r).byteLength}catch{return r.length}}function bt(r){return JSON.stringify([r.code,r.failureCategory,r.stage,r.provider,r.attempt,r.statusClass,r.requestCategory,r.paymentMethodCategory,r.walletType,r.operationOutcome,r.checkoutMode,r.layout])}function S(){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(/\/+$/,"")}${yt}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=V(),this.merchantEnabled=e.enabled!==!1,this.clock=e.clock??S,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,k.buildTelemetryLogEvent)({...this.checkoutContext,...e,eventId:V(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=(0,k.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:Ct,sequence:0}),o=bt(t),s=this.now();this.pruneReportedFailures(s);let n=this.reportedFailures.get(o);if(n!==void 0&&s>=n&&s-n<Me){this.log({name:"operation.deduplicated",stage:e.stage,provider:e.provider,paymentMethodCategory:e.paymentMethodCategory,attempt:e.attempt});return}this.rememberReportedFailure(o,s),this.enqueue((0,k.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:V(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue((0,k.buildTelemetryPerformanceEvent)({...this.checkoutContext,...e,eventId:V(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue((0,k.buildTelemetryTerminalEvent)({...this.checkoutContext,...e,eventId:V(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let t=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({stage:"total_journey",durationMs:Math.max(0,this.now()-t),durationMode:"total",provider:e.provider,paymentMethodCategory:e.paymentMethodCategory})}}now(){try{return this.clock()}catch{return S()}}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,o]of this.reportedFailures)(e<o||e-o>=Me)&&this.reportedFailures.delete(t)}rememberReportedFailure(e,t){for(;this.reportedFailures.size>=ft;){let o=this.reportedFailures.keys().next();if(o.done)break;this.reportedFailures.delete(o.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>=ht||this.eventCounts[e.class]>=vt[e.class])){if(this.eventCounts[e.class]+=1,this.queue.push(e),this.queue.length>=fe){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,fe);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,fe);this.sendBatch(e)}}async sendBatch(e){if(!this.browserTransportAvailable||this.ingestionDisabled)return;let t=(0,k.serializeTelemetryBatch)(e,{correlationId:this.correlationId,sdkPackage:this.sdkPackage,sdkVersion:this.sdkVersion,batchId:V()});if(Tt(t)>k.TELEMETRY_MAX_BATCH_BYTES)return;let o=typeof AbortController>"u"?null:new AbortController,s=null;try{let n=fetch(this.endpoint,{method:"POST",headers:{"content-type":"text/plain;charset=UTF-8"},body:t,credentials:"omit",keepalive:!0,referrerPolicy:"no-referrer",signal:o?.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=>{s=setTimeout(()=>{o?.abort(),c(null)},gt)});await Promise.race([n,i])==="disabled"&&this.disableFromIngestion()}catch{}finally{s&&clearTimeout(s)}}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)}},Re=Symbol.for("@flopay/js.telemetry.reporter-factory.v1"),Ae=globalThis;Ae[Re]===void 0&&Object.defineProperty(Ae,Re,{configurable:!0,enumerable:!1,writable:!1,value:r=>new _(r)});var Ce=5,Ee=new WeakSet;function _t(r){(typeof r=="object"&&r!==null||typeof r=="function")&&Ee.add(r)}function kt(r){return(typeof r=="object"&&r!==null||typeof r=="function")&&Ee.has(r)}function St(r,e){let t=e?.error,o=K(e?.code)??K(t?.code)??`http_${r}`,s=$(e?.message)??$(t?.message)??wt(o,r);return new f.FloPayError(s,"api_error",{code:o,statusCode:r})}function wt(r,e){switch(r){case"CouponLimitExceeded":return`Too many coupon codes \u2014 a checkout session accepts at most ${Ce}.`;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 Pe(r,e,t){let{billingApiUrl:o,checkoutBaseUrl:s,items:n=[],subscriptions:i=[],products:a,account:c,successUrl:u,cancelUrl:d,checkoutMode:p="confirm",captureMethod:m,couponCodes:g=[],checkoutMetadata:C,tagsData:h,redirectParams:v={},setCookie:J=!0,clientId:H,currency:y,utmMetadata:U,idempotencyKey:me}=r,Q=(0,f.resolveIdempotencyKey)(me);if(g.length>Ce)throw new f.FloPayError(`Too many coupon codes \u2014 a checkout session accepts at most ${Ce}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let D=a??(0,f.foldIntoProducts)(n,i);(0,f.assertCaptureMethodEligible)({captureMethod:m,products:D});let E=(0,f.resolveSessionCurrency)(y,n,i,D);if(!E)throw new f.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:H,checkoutVersion:f.SDK_VERSION,successUrl:u,cancelUrl:d,currency:E,checkoutMode:p,products:D.map(P=>(0,f.buildProductPayload)(P,E)),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};m==="manual"&&(M.captureMethod=m),C!==void 0&&(M.checkoutMetadata=C),h&&(M.tagsData=h),U&&U.length>0&&(M.utmMetadata=U);let pe=`${o.replace(/\/+$/,"")}/v1/checkouts/sessions`,we={"Content-Type":"application/json"};Q&&(we[f.IDEMPOTENCY_KEY_HEADER]=Q);let N,X,nt={method:"POST",headers:we,body:JSON.stringify(M),signal:e},Z;try{Z=await fetch(pe,nt)}catch(P){throw _t(P),P}try{t?.(Z.status)}catch{}N=Z.status;try{X=await Z.json()}catch{}if(N>=400)throw St(N,X);if(N===201){let P=X?.data?.uuid,ye=X?.data?.nonce;if(!P)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!ye)throw new f.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"});(D.length>0||E)&&x(P,{currency:E,products:D.map(T=>({code:T.code??T.providerItemId??T.providerPlanId,type:T.type,name:T.name??T.itemName??T.providerItemName??T.subscriptionName??T.providerPlanName??null,totalAmount:T.totalAmount,overrideAmount:T.overrideAmount,currency:T.currency??E}))});let ee=new URL(`${s.replace(/\/+$/,"")}/secure`);ee.searchParams.set("id",P);for(let[T,te]of Object.entries(v))ee.searchParams.set(T,te);if(J&&typeof window<"u"&&typeof document<"u"){let T=JSON.stringify({origin_url:d}),te=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(T)}; domain=.${te}; path=/; max-age=3600; SameSite=Lax; Secure;`,document.cookie=`flopay_checkout_token=${encodeURIComponent(ye)}; domain=.${te}; path=/; max-age=3600; SameSite=Lax; Secure;`}return typeof window<"u"&&(window.location.href=ee.toString()),{status:201,redirectUrl:ee.toString(),nonce:ye}}return N===204?(typeof window<"u"&&(window.location.href=u),{status:204}):{status:N}}async function Ie(r){let e=xe(r),t=De(e),o=I(r.timeoutMs);try{let s=await Pe(r,o.signal,t);return Fe(e,s),s}catch(s){throw ie(e,s),s}finally{o.clear(),z(e.reporter)}}function De(r){let e=!1;return t=>{if(e)return;e=!0;let o=(0,f.telemetryStatusClass)(t);r.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:o,attempt:r.attempt}),r.reporter.performance({stage:"session_first_byte",durationMs:r.reporter.now()-r.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o,attempt:r.attempt})}}function xe(r){let e=new _({billingApiUrl:r.billingApiUrl,sdkVersion:f.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 Fe(r,e){let t=(0,f.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 ie(r,e){let{reporter:t}=r,o=(0,f.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(t.performance({stage:"session_create",durationMs:t.now()-r.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:r.attempt}),e instanceof f.FloPayError&&e.type==="validation_error"){t.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"});return}if(o.statusClass==="4xx"){t.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create",statusClass:"4xx"});return}t.error({...o,stage:"session_create",requestCategory:"session_create"})}function z(r){r.flush().catch(()=>{}).finally(()=>r.destroy())}async function Oe(r){let{maxRetries:e=2,...t}=r,o=xe(r),s=De(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"}),z(o.reporter),new Error(`Number of retries must be an integer between 0 and ${2}`);let n={...t,idempotencyKey:(0,f.resolveIdempotencyKey)(t.idempotencyKey)},i=I(t.timeoutMs),a;for(let c=0;c<=e;c++){o.attempt=c;try{let u=await Pe(n,i.signal,s);return Fe(o,u),i.clear(),z(o.reporter),u}catch(u){a=u;let d=u instanceof Error&&u.name==="AbortError",p=kt(u),m=u instanceof f.FloPayError&&u.code===f.IDEMPOTENCY_IN_PROGRESS_CODE;if((d||p||m)&&!i.signal.aborted&&c<e){o.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:c+1});try{await L(c,i.signal)}catch(g){throw ie(o,g),i.clear(),z(o.reporter),g}continue}throw ie(o,u),i.clear(),z(o.reporter),u}}throw ie(o,a),i.clear(),z(o.reporter),a??new Error("Unknown error during checkout session creation")}var w=require("@flopay/shared");var l=require("@flopay/shared");var qe=1e3,Mt=500,Rt=15e3,At=3e3,Et=1e4,Pt=1e4;function It(r){return typeof r=="object"&&r!==null}function B(r,e){return K(r?.[e])}function Ue(r,e){return $(r?.[e])}function Dt(r,e){let t=r?.[e];return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Ve(r){return new Promise(e=>setTimeout(e,r))}function xt(r){return r instanceof Error&&r.name==="AbortError"}function ce(){return new l.FloPayError("Checkout is still processing. Please try again shortly.","api_error",{code:"checkout_processing_timeout"})}async function F(r,e){let t=await r.json().catch(()=>null),o=It(t?.error)?t.error:null,s=Ue(t,"message")??Ue(o,"message")??e,n=B(t,"code")??B(t,"gatewayErrorCode")??B(o,"code")??`http_${r.status}`;return new l.FloPayError(s,"api_error",{code:n,statusCode:r.status})}async function Ft(r){let e=r.status===400?await r.clone().json().catch(()=>null):null;return(0,l.classifyPaymentRejection)(r.status,e)}function Ne(r){return r===400||r===422}var ue=2;async function ve(r,e,t=ue,o){let s;for(let n=0;;n++)try{return await fetch(r,e)}catch(i){if(e?.signal?.aborted||i instanceof Error&&i.name==="AbortError")throw i;if(s=i,n>=t)throw s;try{o?.(n+1)}catch{}await Ve(150*2**n)}}var Te=Symbol.for("@flopay/js.session-create.telemetry.v1");function Ot(r){return r[Te]}function qt(r){return"now"in r||"onFirstByte"in r||"onSessionCreateFailure"in r||"onRetry"in r}function ze(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 Be(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 Ut(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}),Be(t,r),t}function Le(r,e,t){return{currency:e,products:t.map(o=>(0,l.buildProductPayload)(o,e)),couponCodes:r.couponCodes??[],accountData:ze(r.account)}}function Nt(r,e,t){return{currency:e,products:t.map(o=>(0,l.buildProductPayload)(o,e)),couponCodes:r.couponCodes??[]}}function Lt(r){let e={},t=(0,l.isCardHolderNamePlaceholder)(r.firstName,r.lastName);for(let[o,s]of Object.entries(r)){if(t&&o.endsWith("Name")||typeof s!="string")continue;let n=s.trim();n&&(e[o]=n)}return{accountData:e}}var O=class O{constructor(e,t={}){this.baseUrl=e.replace(/\/+$/,"");let o=qt(t);this.telemetryHooks=o?t:void 0,this.directTelemetry=o||t.telemetry===!1?void 0:new _({billingApiUrl:this.baseUrl,sdkVersion:l.SDK_VERSION})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,t,o,s,n="unknown"){let i=(0,l.classifyTelemetryFailure)(e,t);this.directTelemetry?.error({...i,stage:o,requestCategory:s,paymentMethodCategory:n})}reportAccountSnapshotFailure(e,t){let o=(0,l.classifyTelemetryFailure)(e,"NETWORK_REQUEST_FAILED");if(t==="best_effort"&&o.errorCode==="REQUEST_TIMEOUT"){this.directTelemetry?.log({name:"operation.fallback",stage:"processing",requestCategory:"account_snapshot",statusClass:"timeout"});return}this.directTelemetry?.error({...o,stage:"processing",requestCategory:"account_snapshot",paymentMethodCategory:"unknown"})}telemetryTimestamp(){try{return this.telemetryHooks?.now?.()??this.directTelemetry?.now()??S()}catch{return S()}}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,o=!0){this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let n={[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION};t&&(n["x-checkout-session-token"]=t);try{let i=await ve(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:n},ue,d=>{this.telemetryHooks?.onRetry?.("session_read",d),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:d})}),a=Math.max(0,this.telemetryTimestamp()-s);try{this.telemetryHooks?.onFirstByte?.(a)}catch{}let c=`${Math.floor(i.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:a,durationMode:"machine",requestCategory:"session_read",statusClass:c}),!i.ok)throw await F(i,"Failed to get checkout session");let u=await i.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"session_read",statusClass:c}),{...u,data:this.mergeCachedDisplayData(u.data)}}catch(i){throw o&&this.directTelemetry?.error({...(0,l.classifyTelemetryFailure)(i,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),i}}cacheSessionDisplayData(e,t,o){x(e,t,o)}clearSessionDisplayData(e){ne(e)}async getVaultCapture(e,t){let o=`${this.baseUrl}\0${e}\0${t??""}`,s=O.activeVaultCaptureRequests.get(o);if(s)return s;let n=this.requestVaultCapture(e,t);O.activeVaultCaptureRequests.set(o,n);try{return await n}finally{O.activeVaultCaptureRequests.get(o)===n&&O.activeVaultCaptureRequests.delete(o)}}async requestVaultCapture(e,t){let o=new AbortController,s=setTimeout(()=>o.abort(),Pt);this.beginDirectTelemetryCheckout(e);let n=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 ve(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:o.signal},ue,u=>{this.telemetryHooks?.onRetry?.("vault_capture",u),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:u})});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()-n),durationMode:"machine",requestCategory:"vault_capture",paymentMethodCategory:"card",statusClass:"2xx"}),this.toVaultBlock(c)}catch(a){let c=o.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(s)}}async getUnifiedCheckoutSession(e,t){let o=await this.getCheckoutSession(e,t);return this.normalizeCheckoutSessionResponse(o)}async getUnifiedCheckoutSessionForRecovery(e,t){let o=await this.fetchCheckoutSession(e,t,!1);return this.normalizeCheckoutSessionResponse(o)}normalizeCheckoutSessionResponse(e){let t=this.normalizeRawSession(e.data),o=e.vault;return o&&t.data.session&&(t.data.session.vault=this.toVaultBlock(o)),t}async processPayment(e,t,o){this.beginDirectTelemetryCheckout(t.sessionId);let s=t.paymentMethodCategory??"unknown";if(!t.nonce)throw this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:s}),new l.FloPayError("processPayment requires `nonce` \u2014 pass the value returned from session creation.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let n=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.processing.started",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:s});let{nonce:i,paymentMethodCategory:a,...c}=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(c)})}catch(d){if(xt(d))throw this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",s),d;u=await this.reconcileProcessPayment(t.sessionId,{...o,nonce:i,paymentMethodCategory:s})}if(!u.ok&&u.status!==202){let d=await Ft(u);return d?this.directTelemetry?.terminal({outcome:d,stage:"processing",requestCategory:"process_payment",statusClass:"4xx",paymentMethodCategory:s}):this.directTelemetry?.error({errorCode:"PAYMENT_PROCESSING_FAILED",stage:"processing",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(u.status),failureCategory:u.status>=500?"server_error":void 0,paymentMethodCategory:s}),u}try{let d=await this.resolveProcessResponse(u,t.sessionId,{...o,nonce:i,paymentMethodCategory:s});return this.directTelemetry?.log({name:"payment.processing.completed",stage:"processing",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(d.status),paymentMethodCategory:s}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(d.status),paymentMethodCategory:s}),d}catch(d){throw d instanceof l.FloPayError&&d.code==="checkout_processing_timeout"||this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",s),d}}async patchAccountSnapshot(e,t,o,s){this.beginDirectTelemetryCheckout(e);let n=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.state_transition",stage:"processing",requestCategory:"account_snapshot"});let i=s?.timeoutMs??Et,a=new AbortController,c=()=>a.abort();s?.signal&&(s.signal.aborted?a.abort():s.signal.addEventListener("abort",c,{once:!0}));let u=setTimeout(()=>a.abort(),i);try{let d;try{d=await ve(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/account`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t},body:JSON.stringify(o),signal:a.signal},ue,p=>{this.telemetryHooks?.onRetry?.("account_snapshot",p),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:p})})}finally{clearTimeout(u),s?.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()-n),durationMode:"machine",requestCategory:"account_snapshot",statusClass:"2xx"})}catch(d){throw this.reportAccountSnapshotFailure(d,s?.telemetryMode??"blocking"),d}}async createSessionIntent(e,t,o,s){if(!t)throw new l.FloPayError("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let n=o,i=n.paymentMethodType,a=typeof i=="string"&&i.trim().toLowerCase()==="card",c=typeof i=="string"&&i.length>0&&!a&&(typeof n.paymentMethodId=="string"||n.paymentMethodId===null),u=n.provider==="stripe"&&(n.paymentMethodCategory==="wallet"||n.paymentMethodCategory==="apm")&&(n.intentKind==="payment"||n.intentKind==="setup"),d=n.provider==="paypal"&&n.paymentMethodCategory==="wallet"&&n.paymentMethodId===null&&(n.paymentMethodType==="paypal"&&n.intentKind==="payment"||n.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&(n.intentKind==="payment"||n.intentKind==="setup"));if(!c||!u&&!d)throw new l.FloPayError("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let p=n.authorizationAttemptId;if(p!==void 0&&!(0,l.isUuidV4)(p))throw new l.FloPayError("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let m=(0,l.isUuidV4)(p)?p:(0,l.randomUuidV4)();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let C={"Content-Type":"application/json","x-checkout-session-token":t,[l.IDEMPOTENCY_KEY_HEADER]:s?.idempotencyKey||m},h=!1;try{let v=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:C,body:JSON.stringify({...o,authorizationAttemptId:m}),signal:s?.signal});if(!v.ok){h=!0;let M=await F(v,"Failed to create checkout intent"),pe=(0,l.classifyTelemetryFailure)(M,"PAYMENT_PROCESSING_FAILED");throw Ne(M.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...pe,stage:"processing",requestCategory:"intent_create"}),M}let H=(await v.json()).data;if(!H||typeof H!="object")throw new l.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let y=H,U=y.paymentMethodType,me=(y.paymentMethodCategory==="wallet"||y.paymentMethodCategory==="apm")&&typeof U=="string"&&U.trim().toLowerCase()!=="card"&&(typeof y.paymentMethodId=="string"||y.paymentMethodId===null)&&typeof y.providerObjectId=="string",Q=y.provider==="stripe"&&(y.intentKind==="payment"||y.intentKind==="setup")&&typeof y.clientSecret=="string",D=y.provider==="paypal"&&y.paymentMethodCategory==="wallet"&&y.paymentMethodId===null&&(y.paymentMethodType==="paypal"&&y.intentKind==="payment"&&(y.providerObjectType==="order"||y.providerObjectType==="subscription")||y.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&y.intentKind==="payment"&&y.providerObjectType==="order"||y.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&y.intentKind==="setup"&&y.providerObjectType==="setup_token")&&y.clientSecret===null,E=y.provider===o.provider&&y.paymentMethodCategory===o.paymentMethodCategory&&y.paymentMethodType===o.paymentMethodType&&y.paymentMethodId===o.paymentMethodId&&y.intentKind===o.intentKind;if(!me||!Q&&!D||!E)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)(v.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:(0,l.telemetryStatusClass)(v.status)}),y}catch(v){throw h||this.reportDirectFailure(v,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),v}}async reportSessionIntentDecline(e,t,o,s){if(!t)throw new l.FloPayError("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let n=o,i=n.providerDeclineReason,a=n.paymentMethodType,c=n.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,p=n.provider==="stripe"&&(n.paymentMethodCategory==="wallet"||n.paymentMethodCategory==="apm")&&(c===void 0||typeof c=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(c)),m=n.provider==="paypal"&&n.paymentMethodCategory==="wallet"&&n.paymentMethodType==="paypal"&&c===void 0;if(!d||!p&&!m)throw new l.FloPayError("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=m?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:n.paymentMethodCategory,paymentMethodType:n.paymentMethodType,providerDeclineReason:i,...typeof c=="string"?{providerIntentId:c}:{}},C=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:s?.signal});if(!C.ok)throw await F(C,"Failed to report checkout decline")}async getPaymentsByEmail(e,t){this.beginDirectTelemetryOperation();let o=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"other",paymentMethodCategory:"saved"});let s=t?.page??1,n=t?.limit??1,i=new URLSearchParams({email:e,page:String(s),limit:String(n),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()-o),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 n=e.account.email?.trim();if(n&&!(0,l.isValidEmail)(n))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(),o=I(e.timeoutMs??12e3),s={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});try{let n=await this.createAndFetchSessionRequest(e,t,o.signal,s);return this.adoptDirectTelemetryCheckout(n.data.session?.id),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:s.statusClass}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:s.statusClass,attempt:s.attempt}),n}catch(n){throw this.reportSessionCreateFailure(n,t,s),n}finally{o.clear()}}async createAndFetchSessionRequest(e,t,o,s){let n=e.products??(0,l.foldIntoProducts)(e.items,e.subscriptions);(0,l.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:n});let i=(0,l.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,n);if(!i)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 a={clientId:e.clientId,checkoutVersion:l.SDK_VERSION,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:i,checkoutMode:e.checkoutMode??"full",products:n.map(m=>(0,l.buildProductPayload)(m,i)),accountData:ze(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(a.captureMethod=e.captureMethod),e.tokenizedData&&(a.tokenizedData=e.tokenizedData),Be(a,e);let u=await(await this.postCheckoutSessionCreate(a,e,t,o,s)).json();if(u.data&&"gateways"in u.data){this.autoCacheDisplayData(u.data.uuid,e);let m=this.mergeCachedDisplayData(u.data),g=this.normalizeRawSession(m);return u.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(u.vault)),{...g,autoProcessingError:u.autoProcessingError,autoProcessingAttempted:u.autoProcessingAttempted,autoProcessingPending:u.autoProcessingPending}}let d=u.data?.uuid;if(!d)throw new l.FloPayError("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(d,e),this.adoptDirectTelemetryCheckout(d),{...await this.getUnifiedCheckoutSession(d),autoProcessingError:u.autoProcessingError,autoProcessingAttempted:u.autoProcessingAttempted,autoProcessingPending:u.autoProcessingPending}}async postCheckoutSessionCreate(e,t,o,s,n){let i={"Content-Type":"application/json",[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION},a=(0,l.resolveIdempotencyKey)(t.idempotencyKey);a&&(i[l.IDEMPOTENCY_KEY_HEADER]=a);let c,u=!1,d=Ot(t),p=m=>{try{this.telemetryHooks?.onRetry?.("session_create",m),this.directTelemetry?.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:m})}catch{}};for(let m=0;m<3;m++){n.attempt=m;try{d?.onAttempt?.(m)}catch{}try{c=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:i,body:JSON.stringify(e),signal:s})}catch(h){if(n.statusClass=s.aborted||h instanceof Error&&h.name==="AbortError"?"timeout":"network_error",s.aborted||h instanceof Error&&h.name==="AbortError"||m>=2)throw h;let v=m+1;p(v),await L(m,s);continue}let g=(0,l.telemetryStatusClass)(c.status);if(n.statusClass=g,u||(u=!0,this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:g,attempt:m}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"session_create",statusClass:g,attempt:m})),c.status===204)throw new l.FloPayError("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(c.ok)break;let C=await F(c,"Failed to create checkout session");if(C.code===l.IDEMPOTENCY_IN_PROGRESS_CODE&&m<2){p(m+1),await L(m,s);continue}throw C}if(!c)throw new TypeError("Checkout-session creation exhausted its retry budget.");return c}async createDetachedSession(e){this.beginDirectTelemetryOperation();let t=this.telemetryTimestamp(),o=I(e.timeoutMs??12e3),s={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});let n=e.products??(0,l.foldIntoProducts)(e.items,e.subscriptions);try{(0,l.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:n})}catch(h){throw o.clear(),this.reportSessionCreateFailure(h,t,s),h}let i=(0,l.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,n);if(!i)throw o.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{Le(e,i,n)}catch(h){throw o.clear(),this.reportSessionCreateFailure(h,t,s),h}let a,c;try{if(c=await(await this.postCheckoutSessionCreate(Ut(e,i),e,t,o.signal,s)).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 o.clear(),this.reportSessionCreateFailure(h,t,s),h}let u=a.data.session?.id??c.data.uuid??"",d=a.data.session?.clientSecret??c.data.nonce??"";if(!u||!d){o.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,s),h}this.adoptDirectTelemetryCheckout(u),this.directTelemetry?.log({name:"session.shell.ready",stage:"session_shell",requestCategory:"session_create",statusClass:s.statusClass,paymentMethodCategory:"card"}),this.directTelemetry?.performance({stage:"session_shell",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:s.statusClass,attempt:s.attempt,paymentMethodCategory:"card"});let p=!e.account.email?.trim(),m=this.claimCheckoutSession(u,d,p?Nt(e,i,n):Le(e,i,n),{params:e,startedAt:t,deadline:o,createAttempt:s.attempt}),g=p?void 0:m,C=(h={})=>{if(g)return g;let v={...e,account:{...e.account,...h,email:h.email?.trim()||e.account.email?.trim()}};return(0,l.isValidEmail)(v.account.email)?(g=m.then(()=>{let J=this.telemetryTimestamp();return this.claimCheckoutSession(u,d,Lt(v.account),{params:v,startedAt:J,deadline:I(e.timeoutMs??12e3),createAttempt:0})}),g.catch(()=>{}),g):Promise.reject(new l.FloPayError("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return m.catch(()=>{}),{shell:a,sessionId:u,nonce:d,claimed:m,claim:C}}async claimCheckoutSession(e,t,o,s){let n=s?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),a=s?.deadline??I(12e3),c=JSON.stringify(o),u="unknown",d=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let p;for(d=0;d<3;d++){try{p=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(C){let h=a.signal.aborted||C instanceof Error&&C.name==="AbortError";if(u=h?"timeout":"network_error",h||d>=2)throw C;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 L(d,a.signal);continue}if(u=(0,l.telemetryStatusClass)(p.status),p.ok)break;throw await F(p,"Failed to attach checkout session data")}if(!p)throw new TypeError("Checkout-session claim exhausted its retry budget.");let m=await p.json();if(!m.data?.gateways)throw new l.FloPayError("The billing API returned no checkout session with gateways after claiming it.","api_error",{code:"InvalidCheckoutSessionResponse"});s?.params&&this.autoCacheDisplayData(m.data.uuid??e,s.params);let g=this.normalizeRawSession(this.mergeCachedDisplayData(m.data));return m.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(m.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()-n),durationMode:"machine",requestCategory:"session_create",statusClass:u,attempt:s?.createAttempt??d}),g}catch(p){throw this.reportSessionCreateFailure(p,n,{attempt:d,statusClass:u},"session_claim"),p}finally{a.clear()}}reportSessionCreateFailure(e,t,o,s="session_create"){if(!(e instanceof l.FloPayError&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let n=(0,l.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(this.directTelemetry?.performance({stage:s,durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:s==="session_claim"?"session_claim":"session_create",statusClass:n.statusClass,attempt:o.attempt}),e instanceof l.FloPayError&&e.type==="validation_error"||e instanceof l.FloPayError&&Ne(e.statusCode)){this.directTelemetry?.terminal({outcome:"validation_rejected",stage:s,requestCategory:s==="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({...n,stage:s,requestCategory:s==="session_claim"?"session_claim":"session_create"})}async waitForCheckoutSessionCompletion(e,t){this.beginDirectTelemetryCheckout(e);let o=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved"});let s=t?.timeoutMs??Rt,n=Date.now()+s,i=this.clampRetryAfterMs(t?.initialDelayMs??qe),a=0;try{for(;;){let c=n-Date.now();if(c<=0)throw ce();if(i>0){try{a+=1,this.telemetryHooks?.onRetry?.("session_read",a),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved",attempt:a})}catch{}if(await Ve(Math.min(i,c)),Date.now()>=n)throw ce()}let u=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce),d=u.data.session?.status;if(d==="authorized"||d==="complete"||d==="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()-o),durationMode:"machine",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved"}),u;if(Date.now()>=n)throw ce();i=this.clampRetryAfterMs(Math.max(i*2,Mt))}}catch(c){throw this.reportDirectFailure(c,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),c}}normalizeRawSession(e){let t=e.gateways??{},o=[],s={session:this.toCheckoutSession(e)},n=t.stripe;if(n?.publishableKey){o.push("stripe");let c=[e.stripeClientSecret,n.stripeClientSecret].find(u=>typeof u=="string"&&u.length>0);s.stripe={clientSecret:c??"",publishableKey:n.publishableKey??void 0,paypalPublishableKey:n.paypalPublishableKey??void 0,environment:n.environment,enabledPaymentMethods:Array.isArray(n.enabledPaymentMethods)?n.enabledPaymentMethods.filter(u=>typeof u=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(o.push("paypal"),s.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType}),{providers:o,mode:"tokenize",...e.checkoutMetadata===void 0?{}:{checkoutMetadata:e.checkoutMetadata},data:s,raw:{data:e}}}toCheckoutSession(e){let t=e.products??[],o=typeof e.totalAmount=="number"&&Number.isFinite(e.totalAmount),s=t.reduce((u,d)=>u+(d.overrideAmount??d.totalAmount??0),0),n=o?e.totalAmount:s,i=Math.round(n*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,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,o){if(e.status!==202)return e;let s=await e.json().catch(()=>null),n=this.toCheckoutProcessingPending(s,e,t),i=await this.waitForCheckoutSessionCompletion(n.sessionId,{initialDelayMs:n.retryAfterMs,timeoutMs:o?.pollTimeoutMs,nonce:o?.nonce,paymentMethodCategory:o?.paymentMethodCategory});return this.toProcessResponseFromSession(i,t)}async reconcileProcessPayment(e,t){let o=await this.waitForCheckoutSessionCompletion(e,{initialDelayMs:0,timeoutMs:t?.pollTimeoutMs,nonce:t?.nonce,paymentMethodCategory:t?.paymentMethodCategory});return this.toProcessResponseFromSession(o,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 o=e.data.session;return new Response(JSON.stringify({status:"authorized",paymentId:o.paymentId,sessionId:o.id||t,authorizationExpiresAt:o.authorizationExpiresAt}),{status:200,headers:{"Content-Type":"application/json"}})}if(e.data.session?.status==="expired"){let o=e.data.session.failureOutcome==="authorization_expired"||e.data.session.captureMethod==="manual";throw new l.FloPayError(o?"Authorization has expired.":"Checkout session has expired.","api_error",{code:o?"authorization_expired":"checkout_session_expired"})}throw ce()}toCheckoutProcessingPending(e,t,o){let s=t.headers.get("Retry-After"),n=s===null||s.trim()===""?void 0:Number(s),i=n!==void 0&&Number.isFinite(n)?n*1e3:void 0;return{type:"checkout_processing",sessionId:B(e,"sessionId")??o,retryAfterMs:this.clampRetryAfterMs(Dt(e,"retryAfterMs")??i??qe),statusUrl:B(e,"statusUrl"),sessionUrl:B(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,At))}autoCacheDisplayData(e,t){if(!e)return;let o=t.products??(0,l.foldIntoProducts)(t.items,t.subscriptions);if(o.length===0&&!t.currency)return;let s=t.products!==void 0,n=(0,l.resolveSessionCurrency)(t.currency,s?void 0:t.items,s?void 0:t.subscriptions,o);x(e,{currency:n??void 0,products:o.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??n??void 0}))})}mergeCachedDisplayData(e){let t=se(e.uuid),o=new Map,s=i=>i?`code:${i}`:void 0;for(let i of t?.products??[]){let a=s(i.code);a&&o.set(a,i)}let n=(e.products??[]).map(i=>{let a=s(i.code),c=a?o.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:n}}};O.activeVaultCaptureRequests=new Map;var Y=O;function je(r,e){let t=Y;return new t(r,e)}var b=require("@flopay/shared");var be="flopay-vault",He={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 Vt(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:Vt(r),data:e})}catch{}}function le(r,e){return(0,b.buildTelemetryLogEvent)({eventId:"11111111-1111-4111-8111-111111111111",name:r,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}function Ke(r){return r?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime"}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function $e(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 zt(r,e,t,o="checkout"){let{type:s}=r;if(s==="complete"||s==="decline")return(0,b.buildTelemetryTerminalEvent)({eventId:"22222222-2222-4222-8222-222222222222",outcome:$e(r,t,o),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(s==="error"){let a=Ke(e);return(0,b.buildTelemetryErrorEvent)({eventId:"33333333-3333-4333-8333-333333333333",...a,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[n,i]=He[s];return le(n,i)}function Bt(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===be&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function jt(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 Ht(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===be&&e.type==="validation"&&Array.isArray(e.messages)}function Kt(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===be&&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.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!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 _({billingApiUrl:(0,b.resolveBillingApiUrl)(),sdkVersion:b.SDK_VERSION}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new _({billingApiUrl:(0,b.resolveBillingApiUrl)(),sdkVersion:b.SDK_VERSION}));let o=this.telemetryReporter;if(this.config.operation==="card_setup"&&o&&this.setupTelemetryReporter!==o){this.setupTelemetryReporter=o;try{o.beginCheckout({checkoutMode:"setup"})}catch{}}if(this.mountStartedAt=this.telemetryReporter?.now?.()??S(),this.vaultReadyReported=!1,this.submissionStarted=!1,this.submissionStartedAt=null,typeof window>"u"||typeof document>"u")throw this.reportVaultLoadFailure(),new b.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 b.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.messageToken=t.messageToken??null,this.expectedOrigin=t.expectedOrigin??this.config.expectedOrigin??null,this.theme=t.theme;try{this.attachMessageListener(),this.injectWidget(e,t.html)}catch(s){throw this.reportVaultLoadFailure(),s}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),G(le("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",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 o=this.listeners.get(e);return o||(o=new Set,this.listeners.set(e,o)),o.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 o=Array.from(e.querySelectorAll("script"));for(let s of o){let n=document.createElement("script");for(let i of Array.from(s.attributes))n.setAttribute(i.name,i.value);n.text=s.text,s.replaceWith(n)}}attachMessageListener(){if(this.messageHandler)return;let e=t=>{if(this.expectedOrigin&&t.origin!==this.expectedOrigin)return;let o=t.data;if(Kt(o)){if(this.messageToken&&o.messageToken!==this.messageToken)return;this.applyHeight(o.height);return}if(Ht(o)){if(this.messageToken&&o.messageToken!==this.messageToken)return;let c=o.messages.filter(u=>typeof u=="string"&&u.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:c||void 0});return}if(!Bt(o)||this.messageToken&&o.messageToken!==this.messageToken)return;let s=this.config.sessionId,n=typeof o.sessionId=="string"?o.sessionId:void 0;if(s&&n&&n!==s||(o.type==="complete"||o.type==="decline")&&s&&n!==s)return;let i=jt(o.paymentMethod),a={...o.sessionId??this.config.sessionId?{sessionId:o.sessionId??this.config.sessionId}:{},...o.outcome?{outcome:o.outcome}:{},...o.paymentId?{paymentId:o.paymentId}:{},...o.authorizationExpiresAt?{authorizationExpiresAt:o.authorizationExpiresAt}:{},...o.failureOutcome?{failureOutcome:o.failureOutcome}:{},...o.intentId?{intentId:o.intentId}:{},...o.declineReason?{declineReason:o.declineReason}:{},...o.message?{message:o.message}:{},...i?{paymentMethod:i}:{}};o.type==="submitting"&&(this.submissionStarted=!0,this.submissionStartedAt=this.telemetryReporter?.now?.()??S()),G(zt(o,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(o),o.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder()),o.type==="action_required"&&o.nextActionRedirectUrl&&this.showActionRequiredOverlay(o.nextActionRedirectUrl),(o.type==="complete"||o.type==="decline"||o.type==="error"||o.type==="submitting")&&this.hideActionRequiredOverlay(),o.type!=="action_required"&&this.emit(o.type,a)};this.messageHandler=e,window.addEventListener("message",e)}reportOutcome(e){let t=this.telemetryReporter;if(!t)return;let{type:o}=e;if(o==="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"})),o==="complete"||o==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:$e(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(o==="error"){let i=Ke(this.submissionStarted);t.log({name:"vault.terminal",stage:i.stage,provider:"pcivault",paymentMethodCategory:"card"}),t.error({...i,provider:"pcivault",paymentMethodCategory:"card"});return}if(o==="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[s,n]=He[o];t.log({name:s,stage:n,provider:"pcivault",paymentMethodCategory:"card"})}applyTheme(e){this.theme=e,this.postTheme()}postTheme(){if(this.theme===void 0||!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"theme",theme:this.theme},"*")}catch{}}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},"*")}catch{}}setCardFieldOrder(e,t){this.cardFieldOrder=e,this.cardAutoFocus=t,this.postCardFieldOrder()}postCardFieldOrder(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},"*")}catch{}}emit(e,t){for(let o of this.listeners.get(e)??[])o(t)}showActionRequiredOverlay(e){if(typeof document>"u")return;if(this.actionOverlay){let i=this.actionOverlay.querySelector("iframe");i instanceof HTMLIFrameElement&&(i.src=e);return}let t=document.createElement("div");t.setAttribute("data-flopay-action-required","1"),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 o=document.createElement("iframe");o.setAttribute("title","Card authentication"),o.setAttribute("allow","payment"),o.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(";"),o.src=e,t.appendChild(o);let s=document.createElement("button");s.type="button",s.setAttribute("aria-label","Close card authentication"),s.textContent="\xD7",s.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(";"),s.addEventListener("click",()=>this.abandonActionRequiredOverlay()),t.appendChild(s),t.addEventListener("click",i=>{i.target===t&&this.abandonActionRequiredOverlay()});let n=i=>{if(i.source!==o.contentWindow)return;let a=i.data;if(!a||typeof a!="object")return;let c=a;c.source==="flopay-vault-3ds-return"&&(G(le("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(),this.postActionCompleted(c.status))};window.addEventListener("message",n),this.threeDsReturnHandler=n,document.body.appendChild(t),this.actionOverlay=t,G(le("vault.three_ds.handoff","three_ds_handoff"))}postActionCompleted(e){if(!this.container)return;let o=this.container.querySelector("iframe")?.contentWindow;if(o)try{o.postMessage({source:"flopay-vault-host",type:"action_completed",status:typeof e=="string"?e:"unknown"},"*")}catch{}}abandonActionRequiredOverlay(){if(!this.actionOverlay)return;let e=(0,b.buildTelemetryTerminalEvent)({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"});G(e),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay(),this.postActionCompleted("abandoned")}hideActionRequiredOverlay(){this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),this.actionOverlay&&(this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null)}applyHeight(e){let t=this.container?.querySelector("iframe");if(!t)return;let o=Math.max(0,Math.min(Math.ceil(e),2e3));t.style.height=`${o}px`}};function Ye(r,e){let t=q;return new t(r,{reporter:e})}var Ge=Symbol.for("@flopay/js.telemetry.bridge.v1");function We(r,e,t){let o=()=>e?.now()??t();Object.defineProperty(r,Ge,{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 Je(r){return r[Ge]}var W=class{now(){return this.telemetryReporter?.now?.()??S()}constructor(e,t,o){this.provider=e,this.config=t,this.telemetryReporter=o??new _({billingApiUrl:(0,w.resolveBillingApiUrl)(t.billingApiUrl),sdkVersion:w.SDK_VERSION,enabled:t.telemetry!==!1}),We(this,this.telemetryReporter,S)}cardCapture(e){return this.telemetryReporter?.log({name:"vault.capture.requested",stage:"vault_request",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?Ye({sessionId:e?.sessionId,captureMethod:e?.captureMethod},this.telemetryReporter):new q({sessionId:e?.sessionId,captureMethod:e?.captureMethod,telemetry:!1})}async retrieveSession(e,t){if(!e)throw new w.FloPayError("sessionId is required to retrieve a session.","validation_error",{param:"sessionId"});let o=await this.retrieveUnifiedSession(e,t);if(!o.data.session)throw new w.FloPayError("Session not found","api_error");return o.data.session}async retrieveUnifiedSession(e,t){if(!e)throw new w.FloPayError("sessionId is required.","validation_error",{param:"sessionId"});let o=(0,w.resolveBillingApiUrl)(t??this.config.billingApiUrl),s=this.now();this.telemetryReporter?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let n,i=je(o,{now:()=>this.telemetryReporter?.now()??S(),onFirstByte:a=>{n=a},onRetry:(a,c)=>{this.telemetryReporter?.log({name:"operation.retry",stage:a==="session_read"?"session_read":"processing",requestCategory:a,attempt:c})}});try{let a=await i.getUnifiedCheckoutSession(e);return n!==void 0&&(this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:"2xx"}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:n,durationMode:"machine",requestCategory:"session_read",statusClass:"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()-s,durationMode:"machine",requestCategory:"session_read",statusClass:"2xx"}),a}catch(a){let c=(0,w.classifyTelemetryFailure)(a,a instanceof w.FloPayError&&a.code==="checkout_processing_timeout"?"REQUEST_TIMEOUT":"NETWORK_REQUEST_FAILED");throw this.telemetryReporter?.error({...c,stage:"session_read",provider:"flo",paymentMethodCategory:"unknown"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-s,durationMode:"machine",requestCategory:"session_read",statusClass:c.statusClass}),a}}getRawProvider(){return this.provider.getRawProvider()}destroy(){this.telemetryReporter?.log({name:"checkout.unmount",stage:"unmount"}),this.telemetryReporter?.destroy(),this.provider.destroy()}};function Qe(r,e,t){let o=W;return new o(r,e,t)}var A=require("@flopay/shared");var _e=require("@flopay/shared"),Xe=require("@stripe/stripe-js"),Ze=new WeakSet;function et(r){return r instanceof _e.FloPayError&&Ze.has(r)}function ke(r){switch(r){case"night":return"night";case"flat":return"flat";default:return"stripe"}}function tt(r){return{...r,theme:ke(r.theme)}}var j=class{constructor(){this.name="stripe";this.stripe=null}async initialize(e){if(typeof window>"u")return;let t=await(0,Xe.loadStripe)(e.publishableKey,{locale:e.locale??"auto"});if(!t){let o=new _e.FloPayError("Failed to initialize Stripe. Check your publishable key.","authentication_error");throw Ze.add(o),o}this.stripe=t}getRawProvider(){return this.stripe}destroy(){this.stripe=null}};var rt=new Map;function Se(r){return Array.isArray(r)?r.map(Se):r&&typeof r=="object"?Object.fromEntries(Object.entries(r).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Se(t)])):r}function $t(r,e){return JSON.stringify([r,(0,A.resolveBillingApiUrl)(e?.billingApiUrl),e?.telemetry!==!1,e?.locale??"auto",e?.apiVersion??null,Se(e?.appearance??null)])}var de=new Map;async function ot(r,e){if(!r){let a=new _({billingApiUrl:(0,A.resolveBillingApiUrl)(e?.billingApiUrl),sdkVersion:A.SDK_VERSION,enabled:e?.telemetry!==!1});throw a.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),a.flush().catch(()=>{}).finally(()=>a.destroy()),new A.FloPayError("A publishable key is required to initialize FloPay.","validation_error",{param:"publishableKey"})}let t=$t(r,e),o=rt.get(t);if(o)return e?.telemetry!==!1&&Je(o)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),o;let s=de.get(t);if(s)return s;let n={...e,publishableKey:r},i=(async()=>{let a=new _({billingApiUrl:(0,A.resolveBillingApiUrl)(n.billingApiUrl),sdkVersion:A.SDK_VERSION,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 u=new j,d=a.now();try{await u.initialize(n)}catch(g){throw a.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:et(g)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),a.destroy(),g}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=Qe(u,n,a);return rt.set(t,m),m})();de.set(t,i);try{return await i}finally{de.get(t)===i&&de.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 he=Object.defineProperty;var it=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var ut=(r,e)=>{for(var t in e)he(r,t,{get:e[t],enumerable:!0})},lt=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of at(e))!ct.call(r,s)&&s!==t&&he(r,s,{get:()=>e[s],enumerable:!(o=it(e,s))||o.enumerable});return r};var dt=r=>lt(he({},"__esModule",{value:!0}),r);var Yt={};ut(Yt,{FloPay:()=>Q,PaymentAPI:()=>W,PciVaultCardCapture:()=>U,SESSION_CREATE_TELEMETRY:()=>Te,StripeAdapter:()=>K,cacheSessionDisplayData:()=>F,clearSessionDisplayData:()=>ie,createCheckoutSession:()=>Ie,createCheckoutSessionWithRetries:()=>Oe,dropThirdPartyOnlyError:()=>st.dropThirdPartyOnlyError,getSessionDisplayData:()=>ne,loadFloPay:()=>ot,toStripeAppearance:()=>tt,toStripeAppearanceTheme:()=>ke});module.exports=dt(Yt);var st=require("@flopay/shared");var h=require("@flopay/shared");function $(r){return typeof r=="string"&&r.trim()?r:void 0}function Y(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 R(r=12e3){let e=Number.isFinite(r)&&r>=0?r:12e3,t=new AbortController,o=setTimeout(()=>t.abort(),e);return{signal:t.signal,clear:()=>clearTimeout(o)}}function mt(){return Object.assign(new Error("The operation was aborted."),{name:"AbortError"})}function z(r,e){let t=150*2**r,o=Math.round(t*(.75+Math.random()*.5));return new Promise((s,n)=>{let i,a=()=>e.removeEventListener("abort",c),c=()=>{i!==void 0&&clearTimeout(i),a(),n(mt())};if(e.aborted){c();return}i=setTimeout(()=>{a(),s()},o),e.addEventListener("abort",c,{once:!0})})}var pt="flopay_session_display:";var oe=new Map;function se(r){return`${pt}${r}`}function ge(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function F(r,e,t){if(!r)return;let o=t?.ttlMs??36e5,s={data:e,expiresAt:Date.now()+o},n=ge();if(n)try{n.setItem(se(r),JSON.stringify(s));return}catch{}oe.set(r,s)}function ne(r){if(!r)return null;let e=ge();if(e)try{let o=e.getItem(se(r));if(o){let s=JSON.parse(o);if(s&&typeof s.expiresAt=="number"&&s.expiresAt>Date.now())return s.data;e.removeItem(se(r))}}catch{}let t=oe.get(r);if(t){if(t.expiresAt>Date.now())return t.data;oe.delete(r)}return null}function ie(r){if(!r)return;oe.delete(r);let e=ge();if(e)try{e.removeItem(se(r))}catch{}}var k=require("@flopay/shared"),yt="/v1/sdk-telemetry/events",fe=16,ht=64,gt=1500,we=1e3,ft=64,Ct="00000000-0000-4000-8000-000000000000",vt={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function B(){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 Tt(r){try{return new TextEncoder().encode(r).byteLength}catch{return r.length}}function bt(r){return JSON.stringify([r.code,r.failureCategory,r.stage,r.provider,r.attempt,r.statusClass,r.requestCategory,r.paymentMethodCategory,r.walletType,r.operationOutcome,r.checkoutMode,r.layout])}function S(){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(/\/+$/,"")}${yt}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=B(),this.merchantEnabled=e.enabled!==!1,this.clock=e.clock??S,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,k.buildTelemetryLogEvent)({...this.checkoutContext,...e,eventId:B(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=(0,k.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:Ct,sequence:0}),o=bt(t),s=this.now();this.pruneReportedFailures(s);let n=this.reportedFailures.get(o);if(n!==void 0&&s>=n&&s-n<we){this.log({name:"operation.deduplicated",stage:e.stage,provider:e.provider,paymentMethodCategory:e.paymentMethodCategory,attempt:e.attempt});return}this.rememberReportedFailure(o,s),this.enqueue((0,k.buildTelemetryErrorEvent)({...this.checkoutContext,...e,eventId:B(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue((0,k.buildTelemetryPerformanceEvent)({...this.checkoutContext,...e,eventId:B(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue((0,k.buildTelemetryTerminalEvent)({...this.checkoutContext,...e,eventId:B(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let t=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({stage:"total_journey",durationMs:Math.max(0,this.now()-t),durationMode:"total",provider:e.provider,paymentMethodCategory:e.paymentMethodCategory})}}now(){try{return this.clock()}catch{return S()}}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,o]of this.reportedFailures)(e<o||e-o>=we)&&this.reportedFailures.delete(t)}rememberReportedFailure(e,t){for(;this.reportedFailures.size>=ft;){let o=this.reportedFailures.keys().next();if(o.done)break;this.reportedFailures.delete(o.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>=ht||this.eventCounts[e.class]>=vt[e.class])){if(this.eventCounts[e.class]+=1,this.queue.push(e),this.queue.length>=fe){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,fe);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,fe);this.sendBatch(e)}}async sendBatch(e){if(!this.browserTransportAvailable||this.ingestionDisabled)return;let t=(0,k.serializeTelemetryBatch)(e,{correlationId:this.correlationId,sdkPackage:this.sdkPackage,sdkVersion:this.sdkVersion,batchId:B()});if(Tt(t)>k.TELEMETRY_MAX_BATCH_BYTES)return;let o=typeof AbortController>"u"?null:new AbortController,s=null;try{let n=fetch(this.endpoint,{method:"POST",headers:{"content-type":"text/plain;charset=UTF-8"},body:t,credentials:"omit",keepalive:!0,referrerPolicy:"no-referrer",signal:o?.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=>{s=setTimeout(()=>{o?.abort(),c(null)},gt)});await Promise.race([n,i])==="disabled"&&this.disableFromIngestion()}catch{}finally{s&&clearTimeout(s)}}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)}},Re=Symbol.for("@flopay/js.telemetry.reporter-factory.v1"),Ae=globalThis;Ae[Re]===void 0&&Object.defineProperty(Ae,Re,{configurable:!0,enumerable:!1,writable:!1,value:r=>new _(r)});var Ce=5,Ee=new WeakSet;function _t(r){(typeof r=="object"&&r!==null||typeof r=="function")&&Ee.add(r)}function kt(r){return(typeof r=="object"&&r!==null||typeof r=="function")&&Ee.has(r)}function St(r,e){let t=e?.error,o=$(e?.code)??$(t?.code)??`http_${r}`,s=Y(e?.message)??Y(t?.message)??Mt(o,r);return new h.FloPayError(s,"api_error",{code:o,statusCode:r})}function Mt(r,e){switch(r){case"CouponLimitExceeded":return`Too many coupon codes \u2014 a checkout session accepts at most ${Ce}.`;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 Pe(r,e,t){let{billingApiUrl:o,checkoutBaseUrl:s,items:n=[],subscriptions:i=[],products:a,account:c,successUrl:u,cancelUrl:d,checkoutMode:p="confirm",captureMethod:m,couponCodes:g=[],checkoutMetadata:C,tagsData:v,redirectParams:f={},setCookie:N=!0,clientId:D,currency:y,utmMetadata:L,idempotencyKey:me}=r,X=(0,h.resolveIdempotencyKey)(me);if(g.length>Ce)throw new h.FloPayError(`Too many coupon codes \u2014 a checkout session accepts at most ${Ce}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let x=a??(0,h.foldIntoProducts)(n,i);(0,h.assertCaptureMethodEligible)({captureMethod:m,products:x});let P=(0,h.resolveSessionCurrency)(y,n,i,x);if(!P)throw new h.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 w={clientId:D,checkoutVersion:h.SDK_VERSION,successUrl:u,cancelUrl:d,currency:P,checkoutMode:p,products:x.map(I=>(0,h.buildProductPayload)(I,P)),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};m==="manual"&&(w.captureMethod=m),C!==void 0&&(w.checkoutMetadata=C),v&&(w.tagsData=v),L&&L.length>0&&(w.utmMetadata=L);let pe=`${o.replace(/\/+$/,"")}/v1/checkouts/sessions`,Me={"Content-Type":"application/json"};X&&(Me[h.IDEMPOTENCY_KEY_HEADER]=X);let V,Z,nt={method:"POST",headers:Me,body:JSON.stringify(w),signal:e},ee;try{ee=await fetch(pe,nt)}catch(I){throw _t(I),I}try{t?.(ee.status)}catch{}V=ee.status;try{Z=await ee.json()}catch{}if(V>=400)throw St(V,Z);if(V===201){let I=Z?.data?.uuid,ye=Z?.data?.nonce;if(!I)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!ye)throw new h.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"});(x.length>0||P)&&F(I,{currency:P,products:x.map(T=>({code:T.code??T.providerItemId??T.providerPlanId,type:T.type,name:T.name??T.itemName??T.providerItemName??T.subscriptionName??T.providerPlanName??null,totalAmount:T.totalAmount,overrideAmount:T.overrideAmount,currency:T.currency??P}))});let te=new URL(`${s.replace(/\/+$/,"")}/secure`);te.searchParams.set("id",I);for(let[T,re]of Object.entries(f))te.searchParams.set(T,re);if(N&&typeof window<"u"&&typeof document<"u"){let T=JSON.stringify({origin_url:d}),re=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(T)}; domain=.${re}; path=/; max-age=3600; SameSite=Lax; Secure;`,document.cookie=`flopay_checkout_token=${encodeURIComponent(ye)}; domain=.${re}; path=/; max-age=3600; SameSite=Lax; Secure;`}return typeof window<"u"&&(window.location.href=te.toString()),{status:201,redirectUrl:te.toString(),nonce:ye}}return V===204?(typeof window<"u"&&(window.location.href=u),{status:204}):{status:V}}async function Ie(r){let e=xe(r),t=De(e),o=R(r.timeoutMs);try{let s=await Pe(r,o.signal,t);return Fe(e,s),s}catch(s){throw ae(e,s),s}finally{o.clear(),j(e.reporter)}}function De(r){let e=!1;return t=>{if(e)return;e=!0;let o=(0,h.telemetryStatusClass)(t);r.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:o,attempt:r.attempt}),r.reporter.performance({stage:"session_first_byte",durationMs:r.reporter.now()-r.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o,attempt:r.attempt})}}function xe(r){let e=new _({billingApiUrl:r.billingApiUrl,sdkVersion:h.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 Fe(r,e){let t=(0,h.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 ae(r,e){let{reporter:t}=r,o=(0,h.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(t.performance({stage:"session_create",durationMs:t.now()-r.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o.statusClass,attempt:r.attempt}),e instanceof h.FloPayError&&e.type==="validation_error"){t.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create"});return}if(o.statusClass==="4xx"){t.terminal({outcome:"validation_rejected",stage:"session_create",requestCategory:"session_create",statusClass:"4xx"});return}t.error({...o,stage:"session_create",requestCategory:"session_create"})}function j(r){r.flush().catch(()=>{}).finally(()=>r.destroy())}async function Oe(r){let{maxRetries:e=2,...t}=r,o=xe(r),s=De(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"}),j(o.reporter),new Error(`Number of retries must be an integer between 0 and ${2}`);let n={...t,idempotencyKey:(0,h.resolveIdempotencyKey)(t.idempotencyKey)},i=R(t.timeoutMs),a;for(let c=0;c<=e;c++){o.attempt=c;try{let u=await Pe(n,i.signal,s);return Fe(o,u),i.clear(),j(o.reporter),u}catch(u){a=u;let d=u instanceof Error&&u.name==="AbortError",p=kt(u),m=u instanceof h.FloPayError&&u.code===h.IDEMPOTENCY_IN_PROGRESS_CODE;if((d||p||m)&&!i.signal.aborted&&c<e){o.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:c+1});try{await z(c,i.signal)}catch(g){throw ae(o,g),i.clear(),j(o.reporter),g}continue}throw ae(o,u),i.clear(),j(o.reporter),u}}throw ae(o,a),i.clear(),j(o.reporter),a??new Error("Unknown error during checkout session creation")}var M=require("@flopay/shared");var l=require("@flopay/shared");var qe=1e3,wt=500,Rt=15e3,At=3e3,Et=1e4,Pt=1e4;function It(r){return typeof r=="object"&&r!==null}function H(r,e){return $(r?.[e])}function Ue(r,e){return Y(r?.[e])}function Dt(r,e){let t=r?.[e];return typeof t=="number"&&Number.isFinite(t)?t:void 0}function Ve(r){return new Promise(e=>setTimeout(e,r))}function xt(r){return r instanceof Error&&r.name==="AbortError"}function ce(){return new l.FloPayError("Checkout is still processing. Please try again shortly.","api_error",{code:"checkout_processing_timeout"})}async function O(r,e){let t=await r.json().catch(()=>null),o=It(t?.error)?t.error:null,s=Ue(t,"message")??Ue(o,"message")??e,n=H(t,"code")??H(t,"gatewayErrorCode")??H(o,"code")??`http_${r.status}`;return new l.FloPayError(s,"api_error",{code:n,statusCode:r.status})}async function Ft(r){let e=r.status===400?await r.clone().json().catch(()=>null):null;return(0,l.classifyPaymentRejection)(r.status,e)}function Ne(r){return r===400||r===422}var ue=2;async function ve(r,e,t=ue,o){let s;for(let n=0;;n++)try{return await fetch(r,e)}catch(i){if(e?.signal?.aborted||i instanceof Error&&i.name==="AbortError")throw i;if(s=i,n>=t)throw s;try{o?.(n+1)}catch{}await Ve(150*2**n)}}var Te=Symbol.for("@flopay/js.session-create.telemetry.v1");function Ot(r){return r[Te]}function qt(r){return"now"in r||"onFirstByte"in r||"onSessionCreateFailure"in r||"onRetry"in r}function ze(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 Be(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 Ut(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}),Be(t,r),t}function Le(r,e,t){return{currency:e,products:t.map(o=>(0,l.buildProductPayload)(o,e)),couponCodes:r.couponCodes??[],accountData:ze(r.account)}}function Nt(r,e,t){return{currency:e,products:t.map(o=>(0,l.buildProductPayload)(o,e)),couponCodes:r.couponCodes??[]}}function Lt(r){let e={},t=(0,l.isCardHolderNamePlaceholder)(r.firstName,r.lastName);for(let[o,s]of Object.entries(r)){if(t&&o.endsWith("Name")||typeof s!="string")continue;let n=s.trim();n&&(e[o]=n)}return{accountData:e}}var q=class q{constructor(e,t={}){this.baseUrl=e.replace(/\/+$/,"");let o=qt(t);this.telemetryHooks=o?t:void 0,this.directTelemetry=o||t.telemetry===!1?void 0:new _({billingApiUrl:this.baseUrl,sdkVersion:l.SDK_VERSION})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,t,o,s,n="unknown"){let i=(0,l.classifyTelemetryFailure)(e,t);this.directTelemetry?.error({...i,stage:o,requestCategory:s,paymentMethodCategory:n})}reportAccountSnapshotFailure(e,t){let o=(0,l.classifyTelemetryFailure)(e,"NETWORK_REQUEST_FAILED");if(t==="best_effort"&&o.errorCode==="REQUEST_TIMEOUT"){this.directTelemetry?.log({name:"operation.fallback",stage:"processing",requestCategory:"account_snapshot",statusClass:"timeout"});return}this.directTelemetry?.error({...o,stage:"processing",requestCategory:"account_snapshot",paymentMethodCategory:"unknown"})}telemetryTimestamp(){try{return this.telemetryHooks?.now?.()??this.directTelemetry?.now()??S()}catch{return S()}}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,o=!0){this.beginDirectTelemetryCheckout(e);let s=this.telemetryTimestamp();this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let n={[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION};t&&(n["x-checkout-session-token"]=t);try{let i=await ve(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:n},ue,d=>{this.telemetryHooks?.onRetry?.("session_read",d),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:d})}),a=Math.max(0,this.telemetryTimestamp()-s);try{this.telemetryHooks?.onFirstByte?.(a)}catch{}let c=`${Math.floor(i.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:a,durationMode:"machine",requestCategory:"session_read",statusClass:c}),!i.ok)throw await O(i,"Failed to get checkout session");let u=await i.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-s),durationMode:"machine",requestCategory:"session_read",statusClass:c}),{...u,data:this.mergeCachedDisplayData(u.data)}}catch(i){throw o&&this.directTelemetry?.error({...(0,l.classifyTelemetryFailure)(i,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),i}}cacheSessionDisplayData(e,t,o){F(e,t,o)}clearSessionDisplayData(e){ie(e)}async getVaultCapture(e,t){let o=`${this.baseUrl}\0${e}\0${t??""}`,s=q.activeVaultCaptureRequests.get(o);if(s)return s;let n=this.requestVaultCapture(e,t);q.activeVaultCaptureRequests.set(o,n);try{return await n}finally{q.activeVaultCaptureRequests.get(o)===n&&q.activeVaultCaptureRequests.delete(o)}}async requestVaultCapture(e,t){let o=new AbortController,s=setTimeout(()=>o.abort(),Pt);this.beginDirectTelemetryCheckout(e);let n=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 ve(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:o.signal},ue,u=>{this.telemetryHooks?.onRetry?.("vault_capture",u),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:u})});if(!a.ok)throw await O(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()-n),durationMode:"machine",requestCategory:"vault_capture",paymentMethodCategory:"card",statusClass:"2xx"}),this.toVaultBlock(c)}catch(a){let c=o.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(s)}}async getUnifiedCheckoutSession(e,t){let o=await this.getCheckoutSession(e,t);return this.normalizeCheckoutSessionResponse(o)}async getUnifiedCheckoutSessionForRecovery(e,t){let o=await this.fetchCheckoutSession(e,t,!1);return this.normalizeCheckoutSessionResponse(o)}normalizeCheckoutSessionResponse(e){let t=this.normalizeRawSession(e.data),o=e.vault;return o&&t.data.session&&(t.data.session.vault=this.toVaultBlock(o)),t}async processPayment(e,t,o){this.beginDirectTelemetryCheckout(t.sessionId);let s=t.paymentMethodCategory??"unknown";if(!t.nonce)throw this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:s}),new l.FloPayError("processPayment requires `nonce` \u2014 pass the value returned from session creation.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let n=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.processing.started",stage:"processing",requestCategory:"process_payment",paymentMethodCategory:s});let{nonce:i,paymentMethodCategory:a,...c}=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(c)})}catch(d){if(xt(d))throw this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",s),d;u=await this.reconcileProcessPayment(t.sessionId,{...o,nonce:i,paymentMethodCategory:s})}if(!u.ok&&u.status!==202){let d=await Ft(u);return d?this.directTelemetry?.terminal({outcome:d,stage:"processing",requestCategory:"process_payment",statusClass:"4xx",paymentMethodCategory:s}):this.directTelemetry?.error({errorCode:"PAYMENT_PROCESSING_FAILED",stage:"processing",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(u.status),failureCategory:u.status>=500?"server_error":void 0,paymentMethodCategory:s}),u}try{let d=await this.resolveProcessResponse(u,t.sessionId,{...o,nonce:i,paymentMethodCategory:s});return this.directTelemetry?.log({name:"payment.processing.completed",stage:"processing",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(d.status),paymentMethodCategory:s}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"process_payment",statusClass:(0,l.telemetryStatusClass)(d.status),paymentMethodCategory:s}),d}catch(d){throw d instanceof l.FloPayError&&d.code==="checkout_processing_timeout"||this.reportDirectFailure(d,"PAYMENT_PROCESSING_FAILED","processing","process_payment",s),d}}async patchAccountSnapshot(e,t,o,s){this.beginDirectTelemetryCheckout(e);let n=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.state_transition",stage:"processing",requestCategory:"account_snapshot"});let i=s?.timeoutMs??Et,a=new AbortController,c=()=>a.abort();s?.signal&&(s.signal.aborted?a.abort():s.signal.addEventListener("abort",c,{once:!0}));let u=setTimeout(()=>a.abort(),i);try{let d;try{d=await ve(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/account`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t},body:JSON.stringify(o),signal:a.signal},ue,p=>{this.telemetryHooks?.onRetry?.("account_snapshot",p),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:p})})}finally{clearTimeout(u),s?.signal?.removeEventListener("abort",c)}if(!d.ok)throw await O(d,"Failed to persist account snapshot");this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"account_snapshot",statusClass:"2xx"})}catch(d){throw this.reportAccountSnapshotFailure(d,s?.telemetryMode??"blocking"),d}}async createSessionIntent(e,t,o,s){if(!t)throw new l.FloPayError("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let n=o,i=n.paymentMethodType,a=typeof i=="string"&&i.trim().toLowerCase()==="card",c=typeof i=="string"&&i.length>0&&!a&&(typeof n.paymentMethodId=="string"||n.paymentMethodId===null),u=n.provider==="stripe"&&(n.paymentMethodCategory==="wallet"||n.paymentMethodCategory==="apm")&&(n.intentKind==="payment"||n.intentKind==="setup"),d=n.provider==="paypal"&&n.paymentMethodCategory==="wallet"&&n.paymentMethodId===null&&(n.paymentMethodType==="paypal"&&n.intentKind==="payment"||n.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&(n.intentKind==="payment"||n.intentKind==="setup"));if(!c||!u&&!d)throw new l.FloPayError("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let p=n.authorizationAttemptId;if(p!==void 0&&!(0,l.isUuidV4)(p))throw new l.FloPayError("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let m=(0,l.isUuidV4)(p)?p:(0,l.randomUuidV4)();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let C={"Content-Type":"application/json","x-checkout-session-token":t,[l.IDEMPOTENCY_KEY_HEADER]:s?.idempotencyKey||m},v=!1;try{let f=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:C,body:JSON.stringify({...o,authorizationAttemptId:m}),signal:s?.signal});if(!f.ok){v=!0;let w=await O(f,"Failed to create checkout intent"),pe=(0,l.classifyTelemetryFailure)(w,"PAYMENT_PROCESSING_FAILED");throw Ne(w.statusCode)?this.directTelemetry?.terminal({outcome:"validation_rejected",stage:"processing",requestCategory:"intent_create",statusClass:"4xx"}):this.directTelemetry?.error({...pe,stage:"processing",requestCategory:"intent_create"}),w}let D=(await f.json()).data;if(!D||typeof D!="object")throw new l.FloPayError("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let y=D,L=y.paymentMethodType,me=(y.paymentMethodCategory==="wallet"||y.paymentMethodCategory==="apm")&&typeof L=="string"&&L.trim().toLowerCase()!=="card"&&(typeof y.paymentMethodId=="string"||y.paymentMethodId===null)&&typeof y.providerObjectId=="string",X=y.provider==="stripe"&&(y.intentKind==="payment"||y.intentKind==="setup")&&typeof y.clientSecret=="string",x=y.provider==="paypal"&&y.paymentMethodCategory==="wallet"&&y.paymentMethodId===null&&(y.paymentMethodType==="paypal"&&y.intentKind==="payment"&&(y.providerObjectType==="order"||y.providerObjectType==="subscription")||y.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&y.intentKind==="payment"&&y.providerObjectType==="order"||y.paymentMethodType===l.PAYPAL_VAULTED_PAYMENT_METHOD_TYPE&&y.intentKind==="setup"&&y.providerObjectType==="setup_token")&&y.clientSecret===null,P=y.provider===o.provider&&y.paymentMethodCategory===o.paymentMethodCategory&&y.paymentMethodType===o.paymentMethodType&&y.paymentMethodId===o.paymentMethodId&&y.intentKind===o.intentKind;if(!me||!X&&!x||!P)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)(f.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:(0,l.telemetryStatusClass)(f.status)}),y}catch(f){throw v||this.reportDirectFailure(f,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),f}}async reportSessionIntentDecline(e,t,o,s){if(!t)throw new l.FloPayError("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let n=o,i=n.providerDeclineReason,a=n.paymentMethodType,c=n.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,p=n.provider==="stripe"&&(n.paymentMethodCategory==="wallet"||n.paymentMethodCategory==="apm")&&(c===void 0||typeof c=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(c)),m=n.provider==="paypal"&&n.paymentMethodCategory==="wallet"&&n.paymentMethodType==="paypal"&&c===void 0;if(!d||!p&&!m)throw new l.FloPayError("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=m?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:n.paymentMethodCategory,paymentMethodType:n.paymentMethodType,providerDeclineReason:i,...typeof c=="string"?{providerIntentId:c}:{}},C=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:s?.signal});if(!C.ok)throw await O(C,"Failed to report checkout decline")}async getPaymentsByEmail(e,t){this.beginDirectTelemetryOperation();let o=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"other",paymentMethodCategory:"saved"});let s=t?.page??1,n=t?.limit??1,i=new URLSearchParams({email:e,page:String(s),limit:String(n),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()-o),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 n=e.account.email?.trim();if(n&&!(0,l.isValidEmail)(n))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(),o=R(e.timeoutMs??12e3),s={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});try{let n=await this.createAndFetchSessionRequest(e,t,o.signal,s);return this.adoptDirectTelemetryCheckout(n.data.session?.id),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:s.statusClass}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:s.statusClass,attempt:s.attempt}),n}catch(n){throw this.reportSessionCreateFailure(n,t,s),n}finally{o.clear()}}async createAndFetchSessionRequest(e,t,o,s){let n=e.products??(0,l.foldIntoProducts)(e.items,e.subscriptions);(0,l.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:n});let i=(0,l.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,n);if(!i)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 a={clientId:e.clientId,checkoutVersion:l.SDK_VERSION,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:i,checkoutMode:e.checkoutMode??"full",products:n.map(m=>(0,l.buildProductPayload)(m,i)),accountData:ze(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(a.captureMethod=e.captureMethod),e.tokenizedData&&(a.tokenizedData=e.tokenizedData),Be(a,e);let u=await(await this.postCheckoutSessionCreate(a,e,t,o,s)).json();if(u.data&&"gateways"in u.data){this.autoCacheDisplayData(u.data.uuid,e);let m=this.mergeCachedDisplayData(u.data),g=this.normalizeRawSession(m);return u.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(u.vault)),{...g,autoProcessingError:u.autoProcessingError,autoProcessingAttempted:u.autoProcessingAttempted,autoProcessingPending:u.autoProcessingPending}}let d=u.data?.uuid;if(!d)throw new l.FloPayError("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(d,e),this.adoptDirectTelemetryCheckout(d),{...await this.getUnifiedCheckoutSession(d),autoProcessingError:u.autoProcessingError,autoProcessingAttempted:u.autoProcessingAttempted,autoProcessingPending:u.autoProcessingPending}}async postCheckoutSessionCreate(e,t,o,s,n){let i={"Content-Type":"application/json",[l.FLO_SDK_VERSION_HEADER]:l.SDK_VERSION},a=(0,l.resolveIdempotencyKey)(t.idempotencyKey);a&&(i[l.IDEMPOTENCY_KEY_HEADER]=a);let c,u=!1,d=Ot(t),p=m=>{try{this.telemetryHooks?.onRetry?.("session_create",m),this.directTelemetry?.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:m})}catch{}};for(let m=0;m<3;m++){n.attempt=m;try{d?.onAttempt?.(m)}catch{}try{c=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:i,body:JSON.stringify(e),signal:s})}catch(v){if(n.statusClass=s.aborted||v instanceof Error&&v.name==="AbortError"?"timeout":"network_error",s.aborted||v instanceof Error&&v.name==="AbortError"||m>=2)throw v;let f=m+1;p(f),await z(m,s);continue}let g=(0,l.telemetryStatusClass)(c.status);if(n.statusClass=g,u||(u=!0,this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:g,attempt:m}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"session_create",statusClass:g,attempt:m})),c.status===204)throw new l.FloPayError("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(c.ok)break;let C=await O(c,"Failed to create checkout session");if(C.code===l.IDEMPOTENCY_IN_PROGRESS_CODE&&m<2){p(m+1),await z(m,s);continue}throw C}if(!c)throw new TypeError("Checkout-session creation exhausted its retry budget.");return c}async createDetachedSession(e){this.beginDirectTelemetryOperation();let t=this.telemetryTimestamp(),o=R(e.timeoutMs??12e3),s={attempt:0,statusClass:"unknown"};this.directTelemetry?.log({name:"session.create.started",stage:"session_create",requestCategory:"session_create"});let n=e.products??(0,l.foldIntoProducts)(e.items,e.subscriptions);try{(0,l.assertCaptureMethodEligible)({captureMethod:e.captureMethod,products:n})}catch(f){throw o.clear(),this.reportSessionCreateFailure(f,t,s),f}let i=(0,l.resolveSessionCurrency)(e.currency,e.items,e.subscriptions,n);if(!i)throw o.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{Le(e,i,n)}catch(f){throw o.clear(),this.reportSessionCreateFailure(f,t,s),f}let a,c;try{if(c=await(await this.postCheckoutSessionCreate(Ut(e,i),e,t,o.signal,s)).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(f){throw o.clear(),this.reportSessionCreateFailure(f,t,s),f}let u=a.data.session?.id??c.data.uuid??"",d=a.data.session?.clientSecret??c.data.nonce??"";if(!u||!d){o.clear();let f=new l.FloPayError("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(f,t,s),f}o.clear(),this.adoptDirectTelemetryCheckout(u),this.directTelemetry?.log({name:"session.shell.ready",stage:"session_shell",requestCategory:"session_create",statusClass:s.statusClass,paymentMethodCategory:"card"}),this.directTelemetry?.performance({stage:"session_shell",durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:"session_create",statusClass:s.statusClass,attempt:s.attempt,paymentMethodCategory:"card"});let p=!e.account.email?.trim(),m=R(e.timeoutMs??12e3),g=this.claimCheckoutSession(u,d,p?Nt(e,i,n):Le(e,i,n),{params:e,startedAt:t,deadline:m,createAttempt:s.attempt}),C=p?void 0:g,v=(f={})=>{if(C)return C;let N={...e,account:{...e.account,...f,email:f.email?.trim()||e.account.email?.trim()}};return(0,l.isValidEmail)(N.account.email)?(C=g.then(()=>{let D=this.telemetryTimestamp();return this.claimCheckoutSession(u,d,Lt(N.account),{params:N,startedAt:D,deadline:R(e.timeoutMs??12e3),createAttempt:0})}),C.catch(()=>{}),C):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,o,s){let n=s?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),a=s?.deadline??R(12e3),c=JSON.stringify(o),u="unknown",d=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let p;for(d=0;d<3;d++){try{p=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(C){let v=a.signal.aborted||C instanceof Error&&C.name==="AbortError";if(u=v?"timeout":"network_error",v||d>=2)throw C;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 z(d,a.signal);continue}if(u=(0,l.telemetryStatusClass)(p.status),p.ok)break;throw await O(p,"Failed to attach checkout session data")}if(!p)throw new TypeError("Checkout-session claim exhausted its retry budget.");let m=await p.json();if(!m.data?.gateways)throw new l.FloPayError("The billing API returned no checkout session with gateways after claiming it.","api_error",{code:"InvalidCheckoutSessionResponse"});s?.params&&this.autoCacheDisplayData(m.data.uuid??e,s.params);let g=this.normalizeRawSession(this.mergeCachedDisplayData(m.data));return m.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(m.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()-n),durationMode:"machine",requestCategory:"session_create",statusClass:u,attempt:s?.createAttempt??d}),g}catch(p){throw this.reportSessionCreateFailure(p,i,{attempt:d,statusClass:u},"session_claim"),p}finally{a.clear()}}reportSessionCreateFailure(e,t,o,s="session_create"){if(!(e instanceof l.FloPayError&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let n=(0,l.classifyTelemetryFailure)(e,"CHECKOUT_SESSION_CREATE_FAILED");if(this.directTelemetry?.performance({stage:s,durationMs:Math.max(0,this.telemetryTimestamp()-t),durationMode:"machine",requestCategory:s==="session_claim"?"session_claim":"session_create",statusClass:n.statusClass,attempt:o.attempt}),e instanceof l.FloPayError&&e.type==="validation_error"||e instanceof l.FloPayError&&Ne(e.statusCode)){this.directTelemetry?.terminal({outcome:"validation_rejected",stage:s,requestCategory:s==="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({...n,stage:s,requestCategory:s==="session_claim"?"session_claim":"session_create"})}async waitForCheckoutSessionCompletion(e,t){this.beginDirectTelemetryCheckout(e);let o=this.telemetryTimestamp();this.directTelemetry?.log({name:"operation.recovery.started",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved"});let s=t?.timeoutMs??Rt,n=Date.now()+s,i=this.clampRetryAfterMs(t?.initialDelayMs??qe),a=0;try{for(;;){let c=n-Date.now();if(c<=0)throw ce();if(i>0){try{a+=1,this.telemetryHooks?.onRetry?.("session_read",a),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved",attempt:a})}catch{}if(await Ve(Math.min(i,c)),Date.now()>=n)throw ce()}let u=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce),d=u.data.session?.status;if(d==="authorized"||d==="complete"||d==="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()-o),durationMode:"machine",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved"}),u;if(Date.now()>=n)throw ce();i=this.clampRetryAfterMs(Math.max(i*2,wt))}}catch(c){throw this.reportDirectFailure(c,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),c}}normalizeRawSession(e){let t=e.gateways??{},o=[],s={session:this.toCheckoutSession(e)},n=t.stripe;if(n?.publishableKey){o.push("stripe");let c=[e.stripeClientSecret,n.stripeClientSecret].find(u=>typeof u=="string"&&u.length>0);s.stripe={clientSecret:c??"",publishableKey:n.publishableKey??void 0,paypalPublishableKey:n.paypalPublishableKey??void 0,environment:n.environment,enabledPaymentMethods:Array.isArray(n.enabledPaymentMethods)?n.enabledPaymentMethods.filter(u=>typeof u=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(o.push("paypal"),s.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType}),{providers:o,mode:"tokenize",...e.checkoutMetadata===void 0?{}:{checkoutMetadata:e.checkoutMetadata},data:s,raw:{data:e}}}toCheckoutSession(e){let t=e.products??[],o=typeof e.totalAmount=="number"&&Number.isFinite(e.totalAmount),s=t.reduce((u,d)=>u+(d.overrideAmount??d.totalAmount??0),0),n=o?e.totalAmount:s,i=Math.round(n*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,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,o){if(e.status!==202)return e;let s=await e.json().catch(()=>null),n=this.toCheckoutProcessingPending(s,e,t),i=await this.waitForCheckoutSessionCompletion(n.sessionId,{initialDelayMs:n.retryAfterMs,timeoutMs:o?.pollTimeoutMs,nonce:o?.nonce,paymentMethodCategory:o?.paymentMethodCategory});return this.toProcessResponseFromSession(i,t)}async reconcileProcessPayment(e,t){let o=await this.waitForCheckoutSessionCompletion(e,{initialDelayMs:0,timeoutMs:t?.pollTimeoutMs,nonce:t?.nonce,paymentMethodCategory:t?.paymentMethodCategory});return this.toProcessResponseFromSession(o,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 o=e.data.session;return new Response(JSON.stringify({status:"authorized",paymentId:o.paymentId,sessionId:o.id||t,authorizationExpiresAt:o.authorizationExpiresAt}),{status:200,headers:{"Content-Type":"application/json"}})}if(e.data.session?.status==="expired"){let o=e.data.session.failureOutcome==="authorization_expired"||e.data.session.captureMethod==="manual";throw new l.FloPayError(o?"Authorization has expired.":"Checkout session has expired.","api_error",{code:o?"authorization_expired":"checkout_session_expired"})}throw ce()}toCheckoutProcessingPending(e,t,o){let s=t.headers.get("Retry-After"),n=s===null||s.trim()===""?void 0:Number(s),i=n!==void 0&&Number.isFinite(n)?n*1e3:void 0;return{type:"checkout_processing",sessionId:H(e,"sessionId")??o,retryAfterMs:this.clampRetryAfterMs(Dt(e,"retryAfterMs")??i??qe),statusUrl:H(e,"statusUrl"),sessionUrl:H(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,At))}autoCacheDisplayData(e,t){if(!e)return;let o=t.products??(0,l.foldIntoProducts)(t.items,t.subscriptions);if(o.length===0&&!t.currency)return;let s=t.products!==void 0,n=(0,l.resolveSessionCurrency)(t.currency,s?void 0:t.items,s?void 0:t.subscriptions,o);F(e,{currency:n??void 0,products:o.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??n??void 0}))})}mergeCachedDisplayData(e){let t=ne(e.uuid),o=new Map,s=i=>i?`code:${i}`:void 0;for(let i of t?.products??[]){let a=s(i.code);a&&o.set(a,i)}let n=(e.products??[]).map(i=>{let a=s(i.code),c=a?o.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:n}}};q.activeVaultCaptureRequests=new Map;var W=q;function je(r,e){let t=W;return new t(r,e)}var b=require("@flopay/shared");var be="flopay-vault",He={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 Vt(r){return r.class==="lifecycle"?r.name:r.class==="technical_error"?r.code:r.class==="expected_outcome"?r.outcome:"sdk.performance"}function J(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:Vt(r),data:e})}catch{}}function le(r,e){return(0,b.buildTelemetryLogEvent)({eventId:"11111111-1111-4111-8111-111111111111",name:r,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}function Ke(r){return r?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime"}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function $e(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 zt(r,e,t,o="checkout"){let{type:s}=r;if(s==="complete"||s==="decline")return(0,b.buildTelemetryTerminalEvent)({eventId:"22222222-2222-4222-8222-222222222222",outcome:$e(r,t,o),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(s==="error"){let a=Ke(e);return(0,b.buildTelemetryErrorEvent)({eventId:"33333333-3333-4333-8333-333333333333",...a,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[n,i]=He[s];return le(n,i)}function Bt(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===be&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function jt(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 Ht(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===be&&e.type==="validation"&&Array.isArray(e.messages)}function Kt(r){if(typeof r!="object"||r===null)return!1;let e=r;return e.source===be&&e.type==="resize"&&typeof e.height=="number"&&Number.isFinite(e.height)}var U=class{constructor(e={},t){this.provider="pcivault";this.container=null;this.messageHandler=null;this.actionOverlay=null;this.threeDsReturnHandler=null;this.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!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 _({billingApiUrl:(0,b.resolveBillingApiUrl)(),sdkVersion:b.SDK_VERSION}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new _({billingApiUrl:(0,b.resolveBillingApiUrl)(),sdkVersion:b.SDK_VERSION}));let o=this.telemetryReporter;if(this.config.operation==="card_setup"&&o&&this.setupTelemetryReporter!==o){this.setupTelemetryReporter=o;try{o.beginCheckout({checkoutMode:"setup"})}catch{}}if(this.mountStartedAt=this.telemetryReporter?.now?.()??S(),this.vaultReadyReported=!1,this.submissionStarted=!1,this.submissionStartedAt=null,typeof window>"u"||typeof document>"u")throw this.reportVaultLoadFailure(),new b.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 b.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.messageToken=t.messageToken??null,this.expectedOrigin=t.expectedOrigin??this.config.expectedOrigin??null,this.theme=t.theme;try{this.attachMessageListener(),this.injectWidget(e,t.html)}catch(s){throw this.reportVaultLoadFailure(),s}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),J(le("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",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 o=this.listeners.get(e);return o||(o=new Set,this.listeners.set(e,o)),o.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 o=Array.from(e.querySelectorAll("script"));for(let s of o){let n=document.createElement("script");for(let i of Array.from(s.attributes))n.setAttribute(i.name,i.value);n.text=s.text,s.replaceWith(n)}}attachMessageListener(){if(this.messageHandler)return;let e=t=>{if(this.expectedOrigin&&t.origin!==this.expectedOrigin)return;let o=t.data;if(Kt(o)){if(this.messageToken&&o.messageToken!==this.messageToken)return;this.applyHeight(o.height);return}if(Ht(o)){if(this.messageToken&&o.messageToken!==this.messageToken)return;let c=o.messages.filter(u=>typeof u=="string"&&u.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:c||void 0});return}if(!Bt(o)||this.messageToken&&o.messageToken!==this.messageToken)return;let s=this.config.sessionId,n=typeof o.sessionId=="string"?o.sessionId:void 0;if(s&&n&&n!==s||(o.type==="complete"||o.type==="decline")&&s&&n!==s)return;let i=jt(o.paymentMethod),a={...o.sessionId??this.config.sessionId?{sessionId:o.sessionId??this.config.sessionId}:{},...o.outcome?{outcome:o.outcome}:{},...o.paymentId?{paymentId:o.paymentId}:{},...o.authorizationExpiresAt?{authorizationExpiresAt:o.authorizationExpiresAt}:{},...o.failureOutcome?{failureOutcome:o.failureOutcome}:{},...o.intentId?{intentId:o.intentId}:{},...o.declineReason?{declineReason:o.declineReason}:{},...o.message?{message:o.message}:{},...i?{paymentMethod:i}:{}};o.type==="submitting"&&(this.submissionStarted=!0,this.submissionStartedAt=this.telemetryReporter?.now?.()??S()),J(zt(o,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(o),o.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder()),o.type==="action_required"&&o.nextActionRedirectUrl&&this.showActionRequiredOverlay(o.nextActionRedirectUrl),(o.type==="complete"||o.type==="decline"||o.type==="error"||o.type==="submitting")&&this.hideActionRequiredOverlay(),o.type!=="action_required"&&this.emit(o.type,a)};this.messageHandler=e,window.addEventListener("message",e)}reportOutcome(e){let t=this.telemetryReporter;if(!t)return;let{type:o}=e;if(o==="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"})),o==="complete"||o==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:$e(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(o==="error"){let i=Ke(this.submissionStarted);t.log({name:"vault.terminal",stage:i.stage,provider:"pcivault",paymentMethodCategory:"card"}),t.error({...i,provider:"pcivault",paymentMethodCategory:"card"});return}if(o==="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[s,n]=He[o];t.log({name:s,stage:n,provider:"pcivault",paymentMethodCategory:"card"})}applyTheme(e){this.theme=e,this.postTheme()}postTheme(){if(this.theme===void 0||!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"theme",theme:this.theme},"*")}catch{}}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},"*")}catch{}}setCardFieldOrder(e,t){this.cardFieldOrder=e,this.cardAutoFocus=t,this.postCardFieldOrder()}postCardFieldOrder(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},"*")}catch{}}emit(e,t){for(let o of this.listeners.get(e)??[])o(t)}showActionRequiredOverlay(e){if(typeof document>"u")return;if(this.actionOverlay){let i=this.actionOverlay.querySelector("iframe");i instanceof HTMLIFrameElement&&(i.src=e);return}let t=document.createElement("div");t.setAttribute("data-flopay-action-required","1"),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 o=document.createElement("iframe");o.setAttribute("title","Card authentication"),o.setAttribute("allow","payment"),o.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(";"),o.src=e,t.appendChild(o);let s=document.createElement("button");s.type="button",s.setAttribute("aria-label","Close card authentication"),s.textContent="\xD7",s.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(";"),s.addEventListener("click",()=>this.abandonActionRequiredOverlay()),t.appendChild(s),t.addEventListener("click",i=>{i.target===t&&this.abandonActionRequiredOverlay()});let n=i=>{if(i.source!==o.contentWindow)return;let a=i.data;if(!a||typeof a!="object")return;let c=a;c.source==="flopay-vault-3ds-return"&&(J(le("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(),this.postActionCompleted(c.status))};window.addEventListener("message",n),this.threeDsReturnHandler=n,document.body.appendChild(t),this.actionOverlay=t,J(le("vault.three_ds.handoff","three_ds_handoff"))}postActionCompleted(e){if(!this.container)return;let o=this.container.querySelector("iframe")?.contentWindow;if(o)try{o.postMessage({source:"flopay-vault-host",type:"action_completed",status:typeof e=="string"?e:"unknown"},"*")}catch{}}abandonActionRequiredOverlay(){if(!this.actionOverlay)return;let e=(0,b.buildTelemetryTerminalEvent)({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"});J(e),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay(),this.postActionCompleted("abandoned")}hideActionRequiredOverlay(){this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),this.actionOverlay&&(this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null)}applyHeight(e){let t=this.container?.querySelector("iframe");if(!t)return;let o=Math.max(0,Math.min(Math.ceil(e),2e3));t.style.height=`${o}px`}};function Ye(r,e){let t=U;return new t(r,{reporter:e})}var Ge=Symbol.for("@flopay/js.telemetry.bridge.v1");function We(r,e,t){let o=()=>e?.now()??t();Object.defineProperty(r,Ge,{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 Je(r){return r[Ge]}var Q=class{now(){return this.telemetryReporter?.now?.()??S()}constructor(e,t,o){this.provider=e,this.config=t,this.telemetryReporter=o??new _({billingApiUrl:(0,M.resolveBillingApiUrl)(t.billingApiUrl),sdkVersion:M.SDK_VERSION,enabled:t.telemetry!==!1}),We(this,this.telemetryReporter,S)}cardCapture(e){return this.telemetryReporter?.log({name:"vault.capture.requested",stage:"vault_request",provider:"pcivault",paymentMethodCategory:"card"}),this.telemetryReporter?Ye({sessionId:e?.sessionId,captureMethod:e?.captureMethod},this.telemetryReporter):new U({sessionId:e?.sessionId,captureMethod:e?.captureMethod,telemetry:!1})}async retrieveSession(e,t){if(!e)throw new M.FloPayError("sessionId is required to retrieve a session.","validation_error",{param:"sessionId"});let o=await this.retrieveUnifiedSession(e,t);if(!o.data.session)throw new M.FloPayError("Session not found","api_error");return o.data.session}async retrieveUnifiedSession(e,t){if(!e)throw new M.FloPayError("sessionId is required.","validation_error",{param:"sessionId"});let o=(0,M.resolveBillingApiUrl)(t??this.config.billingApiUrl),s=this.now();this.telemetryReporter?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let n,i=je(o,{now:()=>this.telemetryReporter?.now()??S(),onFirstByte:a=>{n=a},onRetry:(a,c)=>{this.telemetryReporter?.log({name:"operation.retry",stage:a==="session_read"?"session_read":"processing",requestCategory:a,attempt:c})}});try{let a=await i.getUnifiedCheckoutSession(e);return n!==void 0&&(this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:"2xx"}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:n,durationMode:"machine",requestCategory:"session_read",statusClass:"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()-s,durationMode:"machine",requestCategory:"session_read",statusClass:"2xx"}),a}catch(a){let c=(0,M.classifyTelemetryFailure)(a,a instanceof M.FloPayError&&a.code==="checkout_processing_timeout"?"REQUEST_TIMEOUT":"NETWORK_REQUEST_FAILED");throw this.telemetryReporter?.error({...c,stage:"session_read",provider:"flo",paymentMethodCategory:"unknown"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-s,durationMode:"machine",requestCategory:"session_read",statusClass:c.statusClass}),a}}getRawProvider(){return this.provider.getRawProvider()}destroy(){this.telemetryReporter?.log({name:"checkout.unmount",stage:"unmount"}),this.telemetryReporter?.destroy(),this.provider.destroy()}};function Qe(r,e,t){let o=Q;return new o(r,e,t)}var E=require("@flopay/shared");var _e=require("@flopay/shared"),Xe=require("@stripe/stripe-js"),Ze=new WeakSet;function et(r){return r instanceof _e.FloPayError&&Ze.has(r)}function ke(r){switch(r){case"night":return"night";case"flat":return"flat";default:return"stripe"}}function tt(r){return{...r,theme:ke(r.theme)}}var K=class{constructor(){this.name="stripe";this.stripe=null}async initialize(e){if(typeof window>"u")return;let t=await(0,Xe.loadStripe)(e.publishableKey,{locale:e.locale??"auto"});if(!t){let o=new _e.FloPayError("Failed to initialize Stripe. Check your publishable key.","authentication_error");throw Ze.add(o),o}this.stripe=t}getRawProvider(){return this.stripe}destroy(){this.stripe=null}};var rt=new Map;function Se(r){return Array.isArray(r)?r.map(Se):r&&typeof r=="object"?Object.fromEntries(Object.entries(r).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Se(t)])):r}function $t(r,e){return JSON.stringify([r,(0,E.resolveBillingApiUrl)(e?.billingApiUrl),e?.telemetry!==!1,e?.locale??"auto",e?.apiVersion??null,Se(e?.appearance??null)])}var de=new Map;async function ot(r,e){if(!r){let a=new _({billingApiUrl:(0,E.resolveBillingApiUrl)(e?.billingApiUrl),sdkVersion:E.SDK_VERSION,enabled:e?.telemetry!==!1});throw a.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),a.flush().catch(()=>{}).finally(()=>a.destroy()),new E.FloPayError("A publishable key is required to initialize FloPay.","validation_error",{param:"publishableKey"})}let t=$t(r,e),o=rt.get(t);if(o)return e?.telemetry!==!1&&Je(o)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),o;let s=de.get(t);if(s)return s;let n={...e,publishableKey:r},i=(async()=>{let a=new _({billingApiUrl:(0,E.resolveBillingApiUrl)(n.billingApiUrl),sdkVersion:E.SDK_VERSION,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 u=new K,d=a.now();try{await u.initialize(n)}catch(g){throw a.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:et(g)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),a.destroy(),g}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=Qe(u,n,a);return rt.set(t,m),m})();de.set(t,i);try{return await i}finally{de.get(t)===i&&de.delete(t)}}0&&(module.exports={FloPay,PaymentAPI,PciVaultCardCapture,SESSION_CREATE_TELEMETRY,StripeAdapter,cacheSessionDisplayData,clearSessionDisplayData,createCheckoutSession,createCheckoutSessionWithRetries,dropThirdPartyOnlyError,getSessionDisplayData,loadFloPay,toStripeAppearance,toStripeAppearanceTheme});
|
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 _e,g as ve,h as A,i as y,j as ke,k as Re,l as H,m as j,n as J}from"./chunk-NVMDGQAX.mjs";import{dropThirdPartyOnlyError as ht}from"@flopay/shared";import{assertCaptureMethodEligible as Te,buildProductPayload as Ae,classifyTelemetryFailure as Ee,FloPayError as P,foldIntoProducts as Fe,IDEMPOTENCY_IN_PROGRESS_CODE as Ie,IDEMPOTENCY_KEY_HEADER as xe,resolveIdempotencyKey as Q,resolveSessionCurrency as Me,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 P(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:s,account:a,successUrl:c,cancelUrl:f,checkoutMode:g="confirm",captureMethod:u,couponCodes:p=[],checkoutMetadata:K,tagsData:$,redirectParams:ge={},setCookie:he=!0,clientId:Ce,currency:we,utmMetadata:M,idempotencyKey:Pe}=t,Y=Q(Pe);if(p.length>L)throw new P(`Too many coupon codes \u2014 a checkout session accepts at most ${L}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let b=s??Fe(n,l);Te({captureMethod:u,products:b});let h=Me(we,n,l,b);if(!h)throw new P("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 S={clientId:Ce,checkoutVersion:X,successUrl:c,cancelUrl:f,currency:h,checkoutMode:g,products:b.map(m=>Ae(m,h)),accountData:{userId:a.userId,firstName:a.firstName??null,lastName:a.lastName??null,email:a.email,country:a.country??null,gender:a.gender??null,city:a.city??null,state:a.state??null,zip:a.zip??null,addressLine1:a.addressLine1??null,addressLine2:a.addressLine2??null},couponCodes:p};u==="manual"&&(S.captureMethod=u),K!==void 0&&(S.checkoutMetadata=K),$&&(S.tagsData=$),M&&M.length>0&&(S.utmMetadata=M);let be=`${o.replace(/\/+$/,"")}/v1/checkouts/sessions`,W={"Content-Type":"application/json"};Y&&(W[xe]=Y);let C,v,Se={method:"POST",headers:W,body:JSON.stringify(S),signal:e},k;try{k=await fetch(be,Se)}catch(m){throw Oe(m),m}try{r?.(k.status)}catch{}C=k.status;try{v=await k.json()}catch{}if(C>=400)throw De(C,v);if(C===201){let m=v?.data?.uuid,O=v?.data?.nonce;if(!m)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!O)throw new P("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"});(b.length>0||h)&&q(m,{currency:h,products:b.map(d=>({code:d.code??d.providerItemId??d.providerPlanId,type:d.type,name:d.name??d.itemName??d.providerItemName??d.subscriptionName??d.providerPlanName??null,totalAmount:d.totalAmount,overrideAmount:d.overrideAmount,currency:d.currency??h}))});let R=new URL(`${i.replace(/\/+$/,"")}/secure`);R.searchParams.set("id",m);for(let[d,T]of Object.entries(ge))R.searchParams.set(d,T);if(he&&typeof window<"u"&&typeof document<"u"){let d=JSON.stringify({origin_url:f}),T=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(d)}; 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=c),{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 se(e,i),i}catch(i){throw E(e,i),i}finally{o.clear(),w(e.reporter)}}function re(t){let e=!1;return r=>{if(e)return;e=!0;let o=Z(r);t.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:o,attempt:t.attempt}),t.reporter.performance({stage:"session_first_byte",durationMs:t.reporter.now()-t.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o,attempt:t.attempt})}}function oe(t){let e=new y({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 P&&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 je(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),s;for(let a=0;a<=e;a++){o.attempt=a;try{let c=await te(n,l.signal,i);return se(o,c),l.clear(),w(o.reporter),c}catch(c){s=c;let f=c instanceof Error&&c.name==="AbortError",g=Ue(c),u=c instanceof P&&c.code===Ie;if((f||g||u)&&!l.signal.aborted&&a<e){o.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:a+1});try{await G(a,l.signal)}catch(p){throw E(o,p),l.clear(),w(o.reporter),p}continue}throw E(o,c),l.clear(),w(o.reporter),c}}throw E(o,s),l.clear(),w(o.reporter),s??new Error("Unknown error during checkout session creation")}import{classifyTelemetryFailure as Be,FloPayError as F,resolveBillingApiUrl as ce,SDK_VERSION as Le}from"@flopay/shared";var ne=Symbol.for("@flopay/js.telemetry.bridge.v1");function ae(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 ie(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 y({billingApiUrl:ce(r.billingApiUrl),sdkVersion:Le,enabled:r.telemetry!==!1}),ae(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 j({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=H(o,{now:()=>this.telemetryReporter?.now()??A(),onFirstByte:s=>{n=s},onRetry:(s,a)=>{this.telemetryReporter?.log({name:"operation.retry",stage:s==="session_read"?"session_read":"processing",requestCategory:s,attempt:a})}});try{let s=await l.getUnifiedCheckoutSession(e);return n!==void 0&&(this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:"2xx"}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:n,durationMode:"machine",requestCategory:"session_read",statusClass:"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 a=Be(s,s instanceof F&&s.code==="checkout_processing_timeout"?"REQUEST_TIMEOUT":"NETWORK_REQUEST_FAILED");throw this.telemetryReporter?.error({...a,stage:"session_read",provider:"flo",paymentMethodCategory:"unknown"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-i,durationMode:"machine",requestCategory:"session_read",statusClass:a.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 _=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 x=new Map;async function Ye(t,e){if(!t){let s=new y({billingApiUrl:z(e?.billingApiUrl),sdkVersion:ye,enabled:e?.telemetry!==!1});throw s.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),s.flush().catch(()=>{}).finally(()=>s.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&&ie(o)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),o;let i=x.get(r);if(i)return i;let n={...e,publishableKey:t},l=(async()=>{let s=new y({billingApiUrl:z(n.billingApiUrl),sdkVersion:ye,enabled:n.telemetry!==!1}),a=s.now();s.log({name:"sdk.initialize.started",stage:"sdk_initialize"}),s.log({name:"sdk.cache.miss",stage:"sdk_initialize"}),s.log({name:"provider.load.started",stage:"provider_load",provider:"stripe"});let c=new _,f=s.now();try{await c.initialize(n)}catch(p){throw s.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:pe(p)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),s.destroy(),p}let g=s.now();s.log({name:"provider.ready",stage:"provider_ready",provider:"stripe"}),s.log({name:"provider.availability.checked",stage:"provider_ready",provider:"stripe"}),s.log({name:"sdk.initialize.ready",stage:"sdk_initialize"}),s.performance({stage:"sdk_initialize",durationMs:g-a,durationMode:"machine",provider:"stripe"}),s.performance({stage:"provider_ready",durationMs:g-f,durationMode:"machine",provider:"stripe"});let u=le(c,n,s);return fe.set(r,u),u})();x.set(r,l);try{return await l}finally{x.get(r)===l&&x.delete(r)}}export{I as FloPay,Re as PaymentAPI,j as PciVaultCardCapture,ke as SESSION_CREATE_TELEMETRY,_ as StripeAdapter,q as cacheSessionDisplayData,ve as clearSessionDisplayData,qe as createCheckoutSession,je as createCheckoutSessionWithRetries,ht as dropThirdPartyOnlyError,_e 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 _e,g as ve,h as A,i as y,j as ke,k as Re,l as H,m as j,n as J}from"./chunk-BIMDVWOB.mjs";import{dropThirdPartyOnlyError as ht}from"@flopay/shared";import{assertCaptureMethodEligible as Te,buildProductPayload as Ae,classifyTelemetryFailure as Ee,FloPayError as P,foldIntoProducts as Fe,IDEMPOTENCY_IN_PROGRESS_CODE as Ie,IDEMPOTENCY_KEY_HEADER as xe,resolveIdempotencyKey as Q,resolveSessionCurrency as Me,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 P(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:s,account:a,successUrl:c,cancelUrl:f,checkoutMode:g="confirm",captureMethod:u,couponCodes:p=[],checkoutMetadata:K,tagsData:$,redirectParams:ge={},setCookie:he=!0,clientId:Ce,currency:we,utmMetadata:M,idempotencyKey:Pe}=t,Y=Q(Pe);if(p.length>L)throw new P(`Too many coupon codes \u2014 a checkout session accepts at most ${L}.`,"validation_error",{code:"CouponLimitExceeded",param:"couponCodes"});let b=s??Fe(n,l);Te({captureMethod:u,products:b});let h=Me(we,n,l,b);if(!h)throw new P("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 S={clientId:Ce,checkoutVersion:X,successUrl:c,cancelUrl:f,currency:h,checkoutMode:g,products:b.map(m=>Ae(m,h)),accountData:{userId:a.userId,firstName:a.firstName??null,lastName:a.lastName??null,email:a.email,country:a.country??null,gender:a.gender??null,city:a.city??null,state:a.state??null,zip:a.zip??null,addressLine1:a.addressLine1??null,addressLine2:a.addressLine2??null},couponCodes:p};u==="manual"&&(S.captureMethod=u),K!==void 0&&(S.checkoutMetadata=K),$&&(S.tagsData=$),M&&M.length>0&&(S.utmMetadata=M);let be=`${o.replace(/\/+$/,"")}/v1/checkouts/sessions`,W={"Content-Type":"application/json"};Y&&(W[xe]=Y);let C,v,Se={method:"POST",headers:W,body:JSON.stringify(S),signal:e},k;try{k=await fetch(be,Se)}catch(m){throw Oe(m),m}try{r?.(k.status)}catch{}C=k.status;try{v=await k.json()}catch{}if(C>=400)throw De(C,v);if(C===201){let m=v?.data?.uuid,O=v?.data?.nonce;if(!m)throw new Error("Checkout session created but no UUID was returned by the billing API");if(!O)throw new P("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"});(b.length>0||h)&&q(m,{currency:h,products:b.map(d=>({code:d.code??d.providerItemId??d.providerPlanId,type:d.type,name:d.name??d.itemName??d.providerItemName??d.subscriptionName??d.providerPlanName??null,totalAmount:d.totalAmount,overrideAmount:d.overrideAmount,currency:d.currency??h}))});let R=new URL(`${i.replace(/\/+$/,"")}/secure`);R.searchParams.set("id",m);for(let[d,T]of Object.entries(ge))R.searchParams.set(d,T);if(he&&typeof window<"u"&&typeof document<"u"){let d=JSON.stringify({origin_url:f}),T=window.location.hostname.split(".").slice(-2).join(".");document.cookie=`checkout_data=${encodeURIComponent(d)}; 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=c),{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 se(e,i),i}catch(i){throw E(e,i),i}finally{o.clear(),w(e.reporter)}}function re(t){let e=!1;return r=>{if(e)return;e=!0;let o=Z(r);t.reporter.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_create",statusClass:o,attempt:t.attempt}),t.reporter.performance({stage:"session_first_byte",durationMs:t.reporter.now()-t.startedAt,durationMode:"machine",requestCategory:"session_create",statusClass:o,attempt:t.attempt})}}function oe(t){let e=new y({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 P&&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 je(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),s;for(let a=0;a<=e;a++){o.attempt=a;try{let c=await te(n,l.signal,i);return se(o,c),l.clear(),w(o.reporter),c}catch(c){s=c;let f=c instanceof Error&&c.name==="AbortError",g=Ue(c),u=c instanceof P&&c.code===Ie;if((f||g||u)&&!l.signal.aborted&&a<e){o.reporter.log({name:"operation.retry",stage:"session_create",requestCategory:"session_create",attempt:a+1});try{await G(a,l.signal)}catch(p){throw E(o,p),l.clear(),w(o.reporter),p}continue}throw E(o,c),l.clear(),w(o.reporter),c}}throw E(o,s),l.clear(),w(o.reporter),s??new Error("Unknown error during checkout session creation")}import{classifyTelemetryFailure as Be,FloPayError as F,resolveBillingApiUrl as ce,SDK_VERSION as Le}from"@flopay/shared";var ne=Symbol.for("@flopay/js.telemetry.bridge.v1");function ae(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 ie(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 y({billingApiUrl:ce(r.billingApiUrl),sdkVersion:Le,enabled:r.telemetry!==!1}),ae(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 j({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=H(o,{now:()=>this.telemetryReporter?.now()??A(),onFirstByte:s=>{n=s},onRetry:(s,a)=>{this.telemetryReporter?.log({name:"operation.retry",stage:s==="session_read"?"session_read":"processing",requestCategory:s,attempt:a})}});try{let s=await l.getUnifiedCheckoutSession(e);return n!==void 0&&(this.telemetryReporter?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:"2xx"}),this.telemetryReporter?.performance({stage:"session_first_byte",durationMs:n,durationMode:"machine",requestCategory:"session_read",statusClass:"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 a=Be(s,s instanceof F&&s.code==="checkout_processing_timeout"?"REQUEST_TIMEOUT":"NETWORK_REQUEST_FAILED");throw this.telemetryReporter?.error({...a,stage:"session_read",provider:"flo",paymentMethodCategory:"unknown"}),this.telemetryReporter?.performance({stage:"session_complete",durationMs:this.now()-i,durationMode:"machine",requestCategory:"session_read",statusClass:a.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 _=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 x=new Map;async function Ye(t,e){if(!t){let s=new y({billingApiUrl:z(e?.billingApiUrl),sdkVersion:ye,enabled:e?.telemetry!==!1});throw s.error({errorCode:"CONFIGURATION_INVALID",stage:"sdk_initialize",paymentMethodCategory:"unknown"}),s.flush().catch(()=>{}).finally(()=>s.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&&ie(o)?.log({name:"sdk.cache.hit",stage:"sdk_initialize"}),o;let i=x.get(r);if(i)return i;let n={...e,publishableKey:t},l=(async()=>{let s=new y({billingApiUrl:z(n.billingApiUrl),sdkVersion:ye,enabled:n.telemetry!==!1}),a=s.now();s.log({name:"sdk.initialize.started",stage:"sdk_initialize"}),s.log({name:"sdk.cache.miss",stage:"sdk_initialize"}),s.log({name:"provider.load.started",stage:"provider_load",provider:"stripe"});let c=new _,f=s.now();try{await c.initialize(n)}catch(p){throw s.error({errorCode:"PROVIDER_LOAD_FAILED",failureCategory:pe(p)?"invalid_response":"provider_runtime",stage:"provider_load",provider:"stripe",requestCategory:"provider_sdk",paymentMethodCategory:"unknown"}),s.destroy(),p}let g=s.now();s.log({name:"provider.ready",stage:"provider_ready",provider:"stripe"}),s.log({name:"provider.availability.checked",stage:"provider_ready",provider:"stripe"}),s.log({name:"sdk.initialize.ready",stage:"sdk_initialize"}),s.performance({stage:"sdk_initialize",durationMs:g-a,durationMode:"machine",provider:"stripe"}),s.performance({stage:"provider_ready",durationMs:g-f,durationMode:"machine",provider:"stripe"});let u=le(c,n,s);return fe.set(r,u),u})();x.set(r,l);try{return await l}finally{x.get(r)===l&&x.delete(r)}}export{I as FloPay,Re as PaymentAPI,j as PciVaultCardCapture,ke as SESSION_CREATE_TELEMETRY,_ as StripeAdapter,q as cacheSessionDisplayData,ve as clearSessionDisplayData,qe as createCheckoutSession,je as createCheckoutSessionWithRetries,ht as dropThirdPartyOnlyError,_e 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.
|
|
3
|
+
"version": "1.9.8",
|
|
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.
|
|
35
|
+
"@flopay/shared": "1.9.8"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"jsdom": "^29.1.1",
|
package/dist/chunk-NVMDGQAX.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var xe="flopay_session_display:";var P=new Map;function D(s){return`${xe}${s}`}function N(){if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}}function z(s,e,t){if(!s)return;let r=t?.ttlMs??36e5,n={data:e,expiresAt:Date.now()+r},o=N();if(o)try{o.setItem(D(s),JSON.stringify(n));return}catch{}P.set(s,n)}function ee(s){if(!s)return null;let e=N();if(e)try{let r=e.getItem(D(s));if(r){let n=JSON.parse(r);if(n&&typeof n.expiresAt=="number"&&n.expiresAt>Date.now())return n.data;e.removeItem(D(s))}}catch{}let t=P.get(s);if(t){if(t.expiresAt>Date.now())return t.data;P.delete(s)}return null}function te(s){if(!s)return;P.delete(s);let e=N();if(e)try{e.removeItem(D(s))}catch{}}import{assertCaptureMethodEligible as ce,buildProductPayload as W,classifyPaymentRejection as Ye,classifyTelemetryFailure as w,FLO_SDK_VERSION_HEADER as j,FloPayError as h,foldIntoProducts as H,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 K,randomUuidV4 as Qe,resolveIdempotencyKey as Xe,resolveSessionCurrency as $,SDK_VERSION as S,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 A(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 x(s,e){let t=150*2**s,r=Math.round(t*(.75+Math.random()*.5));return new Promise((n,o)=>{let i,u=()=>e.removeEventListener("abort",c),c=()=>{i!==void 0&&clearTimeout(i),u(),o(Oe())};if(e.aborted){c();return}i=setTimeout(()=>{u(),n()},r),e.addEventListener("abort",c,{once:!0})})}import{buildTelemetryErrorEvent as ne,buildTelemetryLogEvent as qe,buildTelemetryPerformanceEvent as Fe,buildTelemetryTerminalEvent as Le,serializeTelemetryBatch as Ue,TELEMETRY_MAX_BATCH_BYTES as Ve}from"@flopay/shared";var Ne="/v1/sdk-telemetry/events",B=16,ze=64,Be=1500,oe=1e3,je=64,He="00000000-0000-4000-8000-000000000000",Ke={technical_error:8,lifecycle:32,expected_outcome:32,performance:24};function M(){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])}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(/\/+$/,"")}${Ne}`,this.sdkPackage=e.sdkPackage??"@flopay/js",this.sdkVersion=e.sdkVersion,this.correlationId=M(),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:M(),sequence:this.sequence++}))}error(e){if(this.notify({...e,class:"technical_error"}),!this.canCollect())return;let t=ne({...this.checkoutContext,...e,eventId:He,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});return}this.rememberReportedFailure(r,n),this.enqueue(ne({...this.checkoutContext,...e,eventId:M(),sequence:this.sequence++}))}performance(e){this.canCollect()&&this.enqueue(Fe({...this.checkoutContext,...e,eventId:M(),sequence:this.sequence++}))}terminal(e){if(this.canCollect()&&(this.enqueue(Le({...this.checkoutContext,...e,eventId:M(),sequence:this.sequence++})),e.outcome!=="action_required"&&this.checkoutStartedAt!==null)){let t=this.checkoutStartedAt;this.checkoutStartedAt=null,this.performance({stage:"total_journey",durationMs:Math.max(0,this.now()-t),durationMode:"total",provider:e.provider,paymentMethodCategory:e.paymentMethodCategory})}}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>=je;){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>=B){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,B);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,B);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:M()});if($e(t)>Ve)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 c=>{if(c.status!==202)return null;let a=null;try{a=await c.json()}catch{}return a?.status==="disabled"?"disabled":null}).catch(()=>null),i=new Promise(c=>{n=setTimeout(()=>{r?.abort(),c(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=1e3,Ze=500,et=15e3,tt=3e3,rt=1e4,st=1e4;function nt(s){return typeof s=="object"&&s!==null}function R(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 q(){return new h("Checkout is still processing. Please try again shortly.","api_error",{code:"checkout_processing_timeout"})}async function k(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=R(t,"code")??R(t,"gatewayErrorCode")??R(r,"code")??`http_${s.status}`;return new h(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 F=2;async function G(s,e,t=F,r){let n;for(let o=0;;o++)try{return await fetch(s,e)}catch(i){if(e?.signal?.aborted||i instanceof Error&&i.name==="AbortError")throw i;if(n=i,o>=t)throw n;try{r?.(o+1)}catch{}await Ce(150*2**o)}}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:S,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=>W(r,e)),couponCodes:s.couponCodes??[],accountData:ve(s.account)}}function mt(s,e,t){return{currency:e,products:t.map(r=>W(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 _=class _{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:S})}destroy(){this.directTelemetry?.destroy()}reportDirectFailure(e,t,r,n,o="unknown"){let i=w(e,t);this.directTelemetry?.error({...i,stage:r,requestCategory:n,paymentMethodCategory:o})}reportAccountSnapshotFailure(e,t){let r=w(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();this.directTelemetry?.log({name:"session.read.started",stage:"session_read",requestCategory:"session_read"});let o={[j]:S};t&&(o["x-checkout-session-token"]=t);try{let i=await G(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}`,{headers:o},F,l=>{this.telemetryHooks?.onRetry?.("session_read",l),this.directTelemetry?.log({name:"operation.retry",stage:"session_read",requestCategory:"session_read",attempt:l})}),u=Math.max(0,this.telemetryTimestamp()-n);try{this.telemetryHooks?.onFirstByte?.(u)}catch{}let c=`${Math.floor(i.status/100)}xx`;if(this.directTelemetry?.log({name:"session.request.first_byte",stage:"session_first_byte",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_first_byte",durationMs:u,durationMode:"machine",requestCategory:"session_read",statusClass:c}),!i.ok)throw await k(i,"Failed to get checkout session");let a=await i.json();return this.directTelemetry?.log({name:"session.request.completed",stage:"session_complete",requestCategory:"session_read",statusClass:c}),this.directTelemetry?.performance({stage:"session_complete",durationMs:Math.max(0,this.telemetryTimestamp()-n),durationMode:"machine",requestCategory:"session_read",statusClass:c}),{...a,data:this.mergeCachedDisplayData(a.data)}}catch(i){throw r&&this.directTelemetry?.error({...w(i,"NETWORK_REQUEST_FAILED"),stage:"session_read",requestCategory:"session_read"}),i}}cacheSessionDisplayData(e,t,r){z(e,t,r)}clearSessionDisplayData(e){te(e)}async getVaultCapture(e,t){let r=`${this.baseUrl}\0${e}\0${t??""}`,n=_.activeVaultCaptureRequests.get(r);if(n)return n;let o=this.requestVaultCapture(e,t);_.activeVaultCaptureRequests.set(r,o);try{return await o}finally{_.activeVaultCaptureRequests.get(r)===o&&_.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 u=await G(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/vault/capture`,{method:"POST",headers:i,signal:r.signal},F,a=>{this.telemetryHooks?.onRetry?.("vault_capture",a),this.directTelemetry?.log({name:"operation.retry",stage:"vault_request",requestCategory:"vault_capture",paymentMethodCategory:"card",attempt:a})});if(!u.ok)throw await k(u,"Failed to load the secure card form");let c=await u.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(c)}catch(u){let c=r.signal.aborted?new h("Timed out while loading the secure card form. Please try again.","api_error",{code:"vault_capture_timeout"}):u;throw this.reportDirectFailure(c,"VAULT_LOAD_FAILED","vault_request","vault_capture","card"),c}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 h("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:u,...c}=t,a;try{a=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(l){if(it(l))throw this.reportDirectFailure(l,"PAYMENT_PROCESSING_FAILED","processing","process_payment",n),l;a=await this.reconcileProcessPayment(t.sessionId,{...r,nonce:i,paymentMethodCategory:n})}if(!a.ok&&a.status!==202){let l=await at(a);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(a.status),failureCategory:a.status>=500?"server_error":void 0,paymentMethodCategory:n}),a}try{let l=await this.resolveProcessResponse(a,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 h&&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,u=new AbortController,c=()=>u.abort();n?.signal&&(n.signal.aborted?u.abort():n.signal.addEventListener("abort",c,{once:!0}));let a=setTimeout(()=>u.abort(),i);try{let l;try{l=await G(`${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:u.signal},F,y=>{this.telemetryHooks?.onRetry?.("account_snapshot",y),this.directTelemetry?.log({name:"operation.retry",stage:"processing",requestCategory:"account_snapshot",attempt:y})})}finally{clearTimeout(a),n?.signal?.removeEventListener("abort",c)}if(!l.ok)throw await k(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 h("createSessionIntent requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.paymentMethodType,u=typeof i=="string"&&i.trim().toLowerCase()==="card",c=typeof i=="string"&&i.length>0&&!u&&(typeof o.paymentMethodId=="string"||o.paymentMethodId===null),a=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===K&&(o.intentKind==="payment"||o.intentKind==="setup"));if(!c||!a&&!l)throw new h("Only wallet, APM, and PayPal session intents are supported.","validation_error",{code:"InvalidSessionIntentRequest"});let y=o.authorizationAttemptId;if(y!==void 0&&!le(y))throw new h("authorizationAttemptId must be a v4 UUID identifying one buyer authorization attempt.","validation_error",{code:"InvalidAuthorizationAttemptId",param:"authorizationAttemptId"});let d=le(y)?y:Qe();this.beginDirectTelemetryCheckout(e);let g=this.telemetryTimestamp();this.directTelemetry?.log({name:"payment.intent.started",stage:"processing",requestCategory:"intent_create"});let C={"Content-Type":"application/json","x-checkout-session-token":t,[ue]:n?.idempotencyKey||d},p=!1;try{let f=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/intents`,{method:"POST",headers:C,body:JSON.stringify({...r,authorizationAttemptId:d}),signal:n?.signal});if(!f.ok){p=!0;let V=await k(f,"Failed to create checkout intent"),De=w(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 U=(await f.json()).data;if(!U||typeof U!="object")throw new h("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});let m=U,Z=m.paymentMethodType,Ee=(m.paymentMethodCategory==="wallet"||m.paymentMethodCategory==="apm")&&typeof Z=="string"&&Z.trim().toLowerCase()!=="card"&&(typeof m.paymentMethodId=="string"||m.paymentMethodId===null)&&typeof m.providerObjectId=="string",we=m.provider==="stripe"&&(m.intentKind==="payment"||m.intentKind==="setup")&&typeof m.clientSecret=="string",Ie=m.provider==="paypal"&&m.paymentMethodCategory==="wallet"&&m.paymentMethodId===null&&(m.paymentMethodType==="paypal"&&m.intentKind==="payment"&&(m.providerObjectType==="order"||m.providerObjectType==="subscription")||m.paymentMethodType===K&&m.intentKind==="payment"&&m.providerObjectType==="order"||m.paymentMethodType===K&&m.intentKind==="setup"&&m.providerObjectType==="setup_token")&&m.clientSecret===null,Pe=m.provider===r.provider&&m.paymentMethodCategory===r.paymentMethodCategory&&m.paymentMethodType===r.paymentMethodType&&m.paymentMethodId===r.paymentMethodId&&m.intentKind===r.intentKind;if(!Ee||!we&&!Ie||!Pe)throw new h("Invalid checkout intent response.","api_error",{code:"InvalidSessionIntentResponse"});return this.directTelemetry?.log({name:"payment.intent.completed",stage:"processing",requestCategory:"intent_create",statusClass:b(f.status)}),this.directTelemetry?.performance({stage:"processing",durationMs:Math.max(0,this.telemetryTimestamp()-g),durationMode:"machine",requestCategory:"intent_create",statusClass:b(f.status)}),m}catch(f){throw p||this.reportDirectFailure(f,"PAYMENT_PROCESSING_FAILED","processing","intent_create"),f}}async reportSessionIntentDecline(e,t,r,n){if(!t)throw new h("reportSessionIntentDecline requires the checkout session nonce.","validation_error",{code:"MissingCheckoutSessionToken",param:"nonce"});let o=r,i=o.providerDeclineReason,u=o.paymentMethodType,c=o.providerIntentId,a=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 u=="string"&&u.length>0&&u.trim().toLowerCase()!=="card"&&a,y=o.provider==="stripe"&&(o.paymentMethodCategory==="wallet"||o.paymentMethodCategory==="apm")&&(c===void 0||typeof c=="string"&&/^pi_[a-z0-9_]{1,252}$/i.test(c)),d=o.provider==="paypal"&&o.paymentMethodCategory==="wallet"&&o.paymentMethodType==="paypal"&&c===void 0;if(!l||!y&&!d)throw new h("Invalid non-card decline classification.","validation_error",{code:"InvalidSessionIntentDeclineRequest"});let g=d?{provider:"paypal",paymentMethodCategory:"wallet",paymentMethodType:"paypal",providerDeclineReason:i}:{provider:"stripe",paymentMethodCategory:o.paymentMethodCategory,paymentMethodType:o.paymentMethodType,providerDeclineReason:i,...typeof c=="string"?{providerIntentId:c}:{}},C=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:n?.signal});if(!C.ok)throw await k(C,"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 u=await fetch(`${this.baseUrl}/v1/payments?${i.toString()}`,{method:"GET",signal:t?.signal,keepalive:!0});if(!u.ok)throw new h("Failed to fetch payments","api_error",{statusCode:u.status});let c=await u.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"}),c}catch(u){throw this.reportDirectFailure(u,"RECOVERY_FAILED","recovery","other","saved"),u}}async createAndFetchSession(e){if(Je(e)){let o=e.account.email?.trim();if(o&&!de(o))throw new h("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=A(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,t,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,n){let o=e.products??H(e.items,e.subscriptions);ce({captureMethod:e.captureMethod,products:o});let i=$(e.currency,e.items,e.subscriptions,o);if(!i)throw new h("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 u={clientId:e.clientId,checkoutVersion:S,successUrl:e.successUrl,cancelUrl:e.cancelUrl,currency:i,checkoutMode:e.checkoutMode??"full",products:o.map(d=>W(d,i)),accountData:ve(e.account),couponCodes:e.couponCodes??[]};e.captureMethod==="manual"&&(u.captureMethod=e.captureMethod),e.tokenizedData&&(u.tokenizedData=e.tokenizedData),Te(u,e);let a=await(await this.postCheckoutSessionCreate(u,e,t,r,n)).json();if(a.data&&"gateways"in a.data){this.autoCacheDisplayData(a.data.uuid,e);let d=this.mergeCachedDisplayData(a.data),g=this.normalizeRawSession(d);return a.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(a.vault)),{...g,autoProcessingError:a.autoProcessingError,autoProcessingAttempted:a.autoProcessingAttempted,autoProcessingPending:a.autoProcessingPending}}let l=a.data?.uuid;if(!l)throw new h("No session ID returned","api_error",{code:"InvalidCheckoutSessionResponse"});return this.autoCacheDisplayData(l,e),this.adoptDirectTelemetryCheckout(l),{...await this.getUnifiedCheckoutSession(l),autoProcessingError:a.autoProcessingError,autoProcessingAttempted:a.autoProcessingAttempted,autoProcessingPending:a.autoProcessingPending}}async postCheckoutSessionCreate(e,t,r,n,o){let i={"Content-Type":"application/json",[j]:S},u=Xe(t.idempotencyKey);u&&(i[ue]=u);let c,a=!1,l=ut(t),y=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++){o.attempt=d;try{l?.onAttempt?.(d)}catch{}try{c=await fetch(`${this.baseUrl}/v1/checkouts/sessions?expand=true`,{method:"POST",headers:i,body:JSON.stringify(e),signal:n})}catch(p){if(o.statusClass=n.aborted||p instanceof Error&&p.name==="AbortError"?"timeout":"network_error",n.aborted||p instanceof Error&&p.name==="AbortError"||d>=2)throw p;let f=d+1;y(f),await x(d,n);continue}let g=b(c.status);if(o.statusClass=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()-r),durationMode:"machine",requestCategory:"session_create",statusClass:g,attempt:d})),c.status===204)throw new h("Session auto-completed \u2014 payment method already on file","api_error",{code:"session_auto_completed"});if(c.ok)break;let C=await k(c,"Failed to create checkout session");if(C.code===We&&d<2){y(d+1),await x(d,n);continue}throw 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=A(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??H(e.items,e.subscriptions);try{ce({captureMethod:e.captureMethod,products:o})}catch(p){throw r.clear(),this.reportSessionCreateFailure(p,t,n),p}let i=$(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 h("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 u,c;try{if(c=await(await this.postCheckoutSessionCreate(dt(e,i),e,t,r.signal,n)).json(),!c.data||!("gateways"in c.data))throw new h("The billing API returned no session shell for a detached create. It must support `deferDataAttachment` (TeamFloPay/backend#1099).","api_error",{code:"InvalidCheckoutSessionResponse"});u=this.normalizeRawSession(this.mergeCachedDisplayData(c.data)),c.vault&&u.data.session&&(u.data.session.vault=this.toVaultBlock(c.vault))}catch(p){throw r.clear(),this.reportSessionCreateFailure(p,t,n),p}let a=u.data.session?.id??c.data.uuid??"",l=u.data.session?.clientSecret??c.data.nonce??"";if(!a||!l){r.clear();let p=new h("Checkout session shell was created without a session id or nonce.","api_error",{code:"InvalidCheckoutSessionResponse"});throw this.reportSessionCreateFailure(p,t,n),p}this.adoptDirectTelemetryCheckout(a),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 y=!e.account.email?.trim(),d=this.claimCheckoutSession(a,l,y?mt(e,i,o):ge(e,i,o),{params:e,startedAt:t,deadline:r,createAttempt:n.attempt}),g=y?void 0:d,C=(p={})=>{if(g)return g;let f={...e,account:{...e.account,...p,email:p.email?.trim()||e.account.email?.trim()}};return de(f.account.email)?(g=d.then(()=>{let X=this.telemetryTimestamp();return this.claimCheckoutSession(a,l,pt(f.account),{params:f,startedAt:X,deadline:A(e.timeoutMs??12e3),createAttempt:0})}),g.catch(()=>{}),g):Promise.reject(new h("A valid buyer email is required before claiming checkout.","validation_error",{code:"BuyerEmailCollectionRequired",param:"account.email"}))};return d.catch(()=>{}),{shell:u,sessionId:a,nonce:l,claimed:d,claim:C}}async claimCheckoutSession(e,t,r,n){let o=n?.startedAt??this.telemetryTimestamp(),i=this.telemetryTimestamp(),u=n?.deadline??A(12e3),c=JSON.stringify(r),a="unknown",l=0;this.directTelemetry?.log({name:"session.claim.started",stage:"session_claim",requestCategory:"session_claim"});try{let y;for(l=0;l<3;l++){try{y=await fetch(`${this.baseUrl}/v1/checkouts/sessions/${encodeURIComponent(e)}/claim`,{method:"PATCH",headers:{"Content-Type":"application/json","x-checkout-session-token":t,[j]:S},body:c,signal:u.signal})}catch(C){let p=u.signal.aborted||C instanceof Error&&C.name==="AbortError";if(a=p?"timeout":"network_error",p||l>=2)throw C;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 x(l,u.signal);continue}if(a=b(y.status),y.ok)break;throw await k(y,"Failed to attach checkout session data")}if(!y)throw new TypeError("Checkout-session claim exhausted its retry budget.");let d=await y.json();if(!d.data?.gateways)throw new h("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 g=this.normalizeRawSession(this.mergeCachedDisplayData(d.data));return d.vault&&g.data.session&&(g.data.session.vault=this.toVaultBlock(d.vault)),this.directTelemetry?.log({name:"session.claim.completed",stage:"session_claim",requestCategory:"session_claim",statusClass:a}),this.directTelemetry?.performance({stage:"session_claim",durationMs:Math.max(0,this.telemetryTimestamp()-i),durationMode:"machine",requestCategory:"session_claim",statusClass:a,attempt:l}),this.directTelemetry?.log({name:"session.request.completed",stage:"session_create",requestCategory:"session_create",statusClass:a}),this.directTelemetry?.performance({stage:"session_create",durationMs:Math.max(0,this.telemetryTimestamp()-o),durationMode:"machine",requestCategory:"session_create",statusClass:a,attempt:n?.createAttempt??l}),g}catch(y){throw this.reportSessionCreateFailure(y,o,{attempt:l,statusClass:a},"session_claim"),y}finally{u.clear()}}reportSessionCreateFailure(e,t,r,n="session_create"){if(!(e instanceof h&&e.code==="session_auto_completed"))try{this.telemetryHooks?.onSessionCreateFailure?.(e)}catch{}let o=w(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 h&&e.type==="validation_error"||e instanceof h&&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 h&&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),u=0;try{for(;;){let c=o-Date.now();if(c<=0)throw q();if(i>0){try{u+=1,this.telemetryHooks?.onRetry?.("session_read",u),this.directTelemetry?.log({name:"operation.retry",stage:"recovery",requestCategory:"session_read",paymentMethodCategory:t?.paymentMethodCategory??"saved",attempt:u})}catch{}if(await Ce(Math.min(i,c)),Date.now()>=o)throw q()}let a=await this.getUnifiedCheckoutSessionForRecovery(e,t?.nonce),l=a.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"}),a;if(Date.now()>=o)throw q();i=this.clampRetryAfterMs(Math.max(i*2,Ze))}}catch(c){throw this.reportDirectFailure(c,"RECOVERY_FAILED","recovery","session_read",t?.paymentMethodCategory??"saved"),c}}normalizeRawSession(e){let t=e.gateways??{},r=[],n={session:this.toCheckoutSession(e)},o=t.stripe;if(o?.publishableKey){r.push("stripe");let c=[e.stripeClientSecret,o.stripeClientSecret].find(a=>typeof a=="string"&&a.length>0);n.stripe={clientSecret:c??"",publishableKey:o.publishableKey??void 0,paypalPublishableKey:o.paypalPublishableKey??void 0,environment:o.environment,enabledPaymentMethods:Array.isArray(o.enabledPaymentMethods)?o.enabledPaymentMethods.filter(a=>typeof a=="string"):void 0}}let i=t.paypal;return i?.publishableKey&&(r.push("paypal"),n.paypal={publishableKey:i.publishableKey,environment:i.environment,providerObjectType:i.providerObjectType}),{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((a,l)=>a+(l.overrideAmount??l.totalAmount??0),0),o=r?e.totalAmount:n,i=Math.round(o*100),u=e.currency??t[0]?.currency??"USD",c="payment";return e.checkoutMode==="setup"?c="setup":t.some(a=>a.type==="subscription")&&(c="subscription"),{id:e.uuid,clientSecret:e.nonce,mode:c,status:this.toCheckoutSessionStatus(e.status),amount:i,currency:u,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(a=>({...a,totalAmount:typeof a.totalAmount=="number"?a.totalAmount:void 0,overrideAmount:typeof a.overrideAmount=="number"?a.overrideAmount:null,currency:typeof a.currency=="string"?a.currency:void 0,metadata:a.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 h(r?"Authorization has expired.":"Checkout session has expired.","api_error",{code:r?"authorization_expired":"checkout_session_expired"})}throw q()}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:R(e,"sessionId")??r,retryAfterMs:this.clampRetryAfterMs(ot(e,"retryAfterMs")??i??pe),statusUrl:R(e,"statusUrl"),sessionUrl:R(e,"sessionUrl")}}clampRetryAfterMs(e){return Math.max(0,Math.min(e,tt))}autoCacheDisplayData(e,t){if(!e)return;let r=t.products??H(t.items,t.subscriptions);if(r.length===0&&!t.currency)return;let n=t.products!==void 0,o=$(t.currency,n?void 0:t.items,n?void 0:t.subscriptions,r);z(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 u=n(i.code);u&&r.set(u,i)}let o=(e.products??[]).map(i=>{let u=n(i.code),c=u?r.get(u):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:o}}};_.activeVaultCaptureRequests=new Map;var Y=_;function Dt(s,e){let t=Y;return new t(s,e)}import{buildTelemetryErrorEvent as ht,buildTelemetryLogEvent as yt,buildTelemetryTerminalEvent as Me,FloPayError as be,resolveBillingApiUrl as ke,SDK_VERSION as _e}from"@flopay/shared";var Q="flopay-vault",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 gt(s){return s.class==="lifecycle"?s.name:s.class==="technical_error"?s.code:s.class==="expected_outcome"?s.outcome:"sdk.performance"}function I(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:gt(s),data:e})}catch{}}function L(s,e){return yt({eventId:"11111111-1111-4111-8111-111111111111",name:s,stage:e,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}function Re(s){return s?{errorCode:"VAULT_SUBMIT_FAILED",stage:"vault_submit",failureCategory:"provider_runtime"}:{errorCode:"VAULT_LOAD_FAILED",stage:"vault_mount",failureCategory:"provider_runtime"}}function Ae(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 ft(s,e,t,r="checkout"){let{type:n}=s;if(n==="complete"||n==="decline")return Me({eventId:"22222222-2222-4222-8222-222222222222",outcome:Ae(s,t,r),sequence:0,provider:"pcivault",paymentMethodCategory:"card"});if(n==="error"){let u=Re(e);return ht({eventId:"33333333-3333-4333-8333-333333333333",...u,sequence:0,provider:"pcivault",paymentMethodCategory:"card"})}let[o,i]=Se[n];return L(o,i)}function Ct(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===Q&&(e.type==="ready"||e.type==="submitting"||e.type==="blocked"||e.type==="complete"||e.type==="decline"||e.type==="error"||e.type==="action_required")}function vt(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 Tt(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===Q&&e.type==="validation"&&Array.isArray(e.messages)}function bt(s){if(typeof s!="object"||s===null)return!1;let e=s;return e.source===Q&&e.type==="resize"&&typeof e.height=="number"&&Number.isFinite(e.height)}var J=class{constructor(e={},t){this.provider="pcivault";this.container=null;this.messageHandler=null;this.actionOverlay=null;this.threeDsReturnHandler=null;this.messageToken=null;this.expectedOrigin=null;this.theme=void 0;this.submitGateBlocked=!1;this.cardFieldOrder=null;this.cardAutoFocus=!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:ke(),sdkVersion:_e}):void 0)}async mount(e,t){this.ownsTelemetryReporter&&!this.telemetryReporter&&(this.telemetryReporter=new T({billingApiUrl:ke(),sdkVersion:_e}));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;try{this.attachMessageListener(),this.injectWidget(e,t.html)}catch(n){throw this.reportVaultLoadFailure(),n}this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder(),I(L("vault.widget.mounted","vault_mount")),this.telemetryReporter?.log({name:"vault.widget.mounted",stage:"vault_mount",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(bt(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;this.applyHeight(r.height);return}if(Tt(r)){if(this.messageToken&&r.messageToken!==this.messageToken)return;let c=r.messages.filter(a=>typeof a=="string"&&a.trim()).join(" ");this.emit("validation",{sessionId:this.config.sessionId,message:c||void 0});return}if(!Ct(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=vt(r.paymentMethod),u={...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()),I(ft(r,this.submissionStarted,this.config.captureMethod,this.config.operation)),this.reportOutcome(r),r.type==="ready"&&(this.postTheme(),this.postSubmitGate(),this.postCardFieldOrder()),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,u)};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"})),r==="complete"||r==="decline"){t.log({name:"vault.terminal",stage:"completion",provider:"pcivault",paymentMethodCategory:"card"}),t.terminal({outcome:Ae(e,this.config.captureMethod,this.config.operation),provider:"pcivault",paymentMethodCategory:"card"});return}if(r==="error"){let i=Re(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(){if(this.theme===void 0||!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"theme",theme:this.theme},"*")}catch{}}setSubmitGate(e){this.submitGateBlocked=e,this.postSubmitGate()}postSubmitGate(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"gate",blocked:this.submitGateBlocked},"*")}catch{}}setCardFieldOrder(e,t){this.cardFieldOrder=e,this.cardAutoFocus=t,this.postCardFieldOrder()}postCardFieldOrder(){if(!this.container)return;let t=this.container.querySelector("iframe")?.contentWindow;if(t)try{t.postMessage({source:"flopay-vault-host",type:"fieldOrder",order:this.cardFieldOrder,autoFocus:this.cardAutoFocus},"*")}catch{}}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);return}let t=document.createElement("div");t.setAttribute("data-flopay-action-required","1"),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.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 u=i.data;if(!u||typeof u!="object")return;let c=u;c.source==="flopay-vault-3ds-return"&&(I(L("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(),this.postActionCompleted(c.status))};window.addEventListener("message",o),this.threeDsReturnHandler=o,document.body.appendChild(t),this.actionOverlay=t,I(L("vault.three_ds.handoff","three_ds_handoff"))}postActionCompleted(e){if(!this.container)return;let r=this.container.querySelector("iframe")?.contentWindow;if(r)try{r.postMessage({source:"flopay-vault-host",type:"action_completed",status:typeof e=="string"?e:"unknown"},"*")}catch{}}abandonActionRequiredOverlay(){if(!this.actionOverlay)return;let e=Me({eventId:"77777777-7777-4777-8777-777777777777",outcome:"customer_abandoned",stage:"three_ds_handoff",sequence:0,provider:"pcivault",paymentMethodCategory:"card"});I(e),this.telemetryReporter?.terminal({outcome:"customer_abandoned",stage:"three_ds_handoff",provider:"pcivault",paymentMethodCategory:"card"}),this.hideActionRequiredOverlay(),this.postActionCompleted("abandoned")}hideActionRequiredOverlay(){this.threeDsReturnHandler&&(window.removeEventListener("message",this.threeDsReturnHandler),this.threeDsReturnHandler=null),this.actionOverlay&&(this.actionOverlay.parentNode?.removeChild(this.actionOverlay),this.actionOverlay=null)}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 Ft(s,e){let t=J;return new t(s,{reporter:e})}export{re as a,se as b,A as c,x as d,z as e,ee as f,te as g,v as h,T as i,ct as j,Y as k,Dt as l,J as m,Ft as n};
|