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