@tinkerlandai/longplay-sdk 0.10.11 → 0.10.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{a as un,b as Ie}from"./chunk-7RDYCTR4.js";import"./chunk-MOWYD2TV.js";import{a as nn,c as sn,d as cn}from"./chunk-GDFBOM3V.js";import{a as an}from"./chunk-PYIHBK7E.js";import{b as en,g as tn,l as be,m as rn,n as on,p as dn}from"./chunk-JGFAFQKK.js";import"./chunk-VSMITXQD.js";import{b as $e}from"./chunk-CDG7GM4C.js";import{a as B}from"./chunk-OZZMZH7X.js";import{a as he,c as ae}from"./chunk-J6KIN4RH.js";import"./chunk-SLUA7ABW.js";import{c as pe,d as ye}from"./chunk-QHJAF5T2.js";import{a as Z}from"./chunk-DSPLGTQI.js";import"./chunk-4C5XH3T3.js";import{Aa as Ge,B as Ee,Ba as fe,C as qe,Ca as me,D as Ue,Da as Ke,K as We,L as Ye,M as Qe,da as Ve,m as Ne,p as we,q as Pe,r as Te,s as Oe,t as De,u as Fe,v as xe,w as ke,x as Be,xa as je,y as He,z as Le}from"./chunk-7DUOIHRD.js";import"./chunk-VSJOHWDL.js";import{z as ge}from"zod";var f=class extends Error{constructor(p,D=0,E=!1,b="fix_request"){super(p);this.code=p;this.status=D;this.retryable=E;this.recovery=b;this.name="MerchantBridgeError"}code;status;retryable;recovery};async function ln(n,T){if(!n.headers.get("content-type")?.split(";",1)[0].trim().match(/^application\/(?:json|[a-z0-9.+-]+\+json)$/i))throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");let p=n.body?.getReader();if(!p)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");let D=()=>{p.cancel().catch(()=>{})};T.addEventListener("abort",D,{once:!0});let E=0,b="",r=new TextDecoder("utf-8",{fatal:!0});try{for(T.throwIfAborted();;){let a=await p.read();if(T.throwIfAborted(),a.done)break;if(E+=a.value.byteLength,E>262144)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");b+=r.decode(a.value,{stream:!0})}return b+=r.decode(),JSON.parse(b)}catch(a){throw T.throwIfAborted(),a instanceof f?a:new f("MERCHANT_BRIDGE_INVALID_RESPONSE")}finally{T.removeEventListener("abort",D),await p.cancel().catch(()=>{}),p.releaseLock()}}function fn(n){let T=De.parse(n.origin),p=Fe.parse(n.manifest),D={projectId:n.scope.projectId,environmentId:n.scope.environmentId,environment:n.scope.environment};for(let l of["projectId","environmentId","environment"])if(p[l]!==n.scope[l])throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");let E=n.customerId===void 0?null:ge.uuid().parse(n.customerId),b=0,r=null,a=null,y=new AbortController,m=n.fetch??globalThis.fetch;async function q(l,c,h,F,U){if(!p.capabilities.includes(l))throw new f("MERCHANT_BRIDGE_CAPABILITY_UNSUPPORTED",501);let H=Oe[l];if(["merchant_catalog_reader","merchant_refund_authority","indiana_server_key"].includes(H.authority))throw new f("MERCHANT_BRIDGE_FORBIDDEN",403);let R=b,u=AbortSignal.any([y.signal,AbortSignal.timeout(Math.min(3e4,Math.max(1e3,n.timeoutMs??1e4))),...n.signal?[n.signal]:[],...F?[F]:[]]);u.throwIfAborted();let g=new Headers(await n.headers?.());if(u.throwIfAborted(),R!==b)throw new DOMException("Merchant identity changed","AbortError");if(/\bgg_(?:sk|ct|rt)_/.test(g.get("authorization")??"")||g.has("X-Indiana-Bridge-Signature")||g.has("X-Indiana-Bridge-Key-Id"))throw new f("MERCHANT_BRIDGE_FORBIDDEN",403);g.set(Te,String(we)),g.set("Accept","application/json");let i=crypto.randomUUID();g.set("X-Request-Id",i),g.set("Content-Type","application/json");let L=await m(T+Pe,{method:"POST",credentials:"include",redirect:"error",cache:"no-store",headers:g,signal:u,body:JSON.stringify({bridgeVersion:we,requestId:i,command:H.command,scope:D,data:U??(h===void 0?{}:{operationId:h})})}),M=await ln(L,u);if(u.throwIfAborted(),R!==b)throw new DOMException("Merchant identity changed","AbortError");if(!L.ok){let s=Ue.safeParse(M);throw!s.success||s.data.scope.projectId!==n.scope.projectId||s.data.scope.environment!==n.scope.environment||s.data.scope.environmentId!==n.scope.environmentId||s.data.requestId!==i||s.data.command!==H.command?new f("MERCHANT_BRIDGE_INVALID_RESPONSE",L.status):new f(s.data.error.code,L.status,s.data.error.retryable,s.data.error.recovery)}let S=xe(ge.unknown()).safeParse(M);if(!S.success||S.data.scope.projectId!==n.scope.projectId||S.data.scope.environment!==n.scope.environment||S.data.scope.environmentId!==n.scope.environmentId||S.data.requestId!==i||S.data.command!==H.command)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE",L.status);let $=c.safeParse(S.data.data);if(!$.success)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE",L.status);return $.data}function A(){if(!E)throw new f("MERCHANT_BRIDGE_UNAUTHENTICATED",401);return E}async function z(l,c,h,F){let U=A(),H=Le.parse({operationId:h,customerId:U}),R=await q(l,c,H.operationId,F,H);if(R.customerId!==U||R.operationId!==H.operationId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return R}return{async readPresentation(l){let c=await q("presentation",Be,void 0,l);if(a!==null&&a!==c.nativeUserId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(c.presentation&&E!==null&&c.presentation.customerId!==E)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return a=c.nativeUserId,r=c.presentation,c},async createSession(l){let c=await q("session",ke,void 0,l);if(a!==null&&a!==c.nativeUserId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(E!==null&&E!==c.session.customerId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(r&&r.customerId!==c.session.customerId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return E=c.session.customerId,a=c.nativeUserId,c.session},async reportPresentation(l,c){let h=A(),F=He.parse(l);if(!r||r.customerId!==h||r.decisionId!==F.decisionId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return q("presentation_events",ge.strictObject({queued:ge.literal(!0)}),void 0,c,F)},async readCustomerCommerce(l){let c=A(),h=await q("customer_commerce",qe,void 0,l);if(h.customerId!==c)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return h},async executePurchase(l,c){let h=await z("purchases",Ee,l,c);if(h.type!=="purchase")throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");return h},readOperation:(l,c)=>z("operation_status",Ne,l,c),async executeSubscriptionChange(l,c){let h=await z("subscription_changes",Ee,l,c);if(h.type!=="subscription_change")throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");return h},reset(){b++,y.abort(),y=new AbortController,E=null,r=null,a=null}}}import{z as se}from"zod";var Je=se.strictObject({command:me,target:Ge,runId:se.uuid().optional(),expiresAt:se.iso.datetime({offset:!0}).optional()}).refine(n=>n.command.release===n.target.release),ze=se.strictObject({schemaVersion:se.literal(1),entries:se.array(Je).max(4e3)});function Xe(n){let T=!1,p=()=>{T||n.unavailable(),T=!0};function D(){return n.storage===!1?void 0:n.storage??globalThis.sessionStorage}function E(r){let a=D()?.getItem(r);if(!a)return[];if(a.length>1048576)throw Error("Entry recovery is too large");return ze.parse(JSON.parse(a)).entries}function b(r,a){let y=D();if(!y)return;if(!a.length)return y.removeItem(r);let m=JSON.stringify(ze.parse({schemaVersion:1,entries:a}));if(m.length>1048576)throw Error("Entry recovery is too large");y.setItem(r,m)}return{load(){try{let r=n.binding();if(!r||n.storage===!1)return;let a="indiana.funnel.entries.v1."+JSON.stringify(r);return{key:a,entries:E(a)}}catch{p();return}},retain(r,a){if(r)try{let y=Je.parse(a);b(r,[...E(r).filter(m=>m.command.funnelId!==y.command.funnelId),y])}catch{p()}},forget(r,a){if(r)try{b(r,E(r).filter(y=>y.command.requestId!==a))}catch{p()}}}}var ve=n=>["running","waiting"].includes(n.status)&&!n.pendingRequest&&(n.stopped||!n.screen&&!n.paywall&&n.instruction?.type==="wait"&&n.instruction.kind!=="operation");function mn(n){let T=pe(n.baseUrl),p=n.scope,D=$e(n),E=n.fetch??globalThis.fetch.bind(globalThis),b,r=!1,a=!1,y=0,m=0,q="",A=0,z=0,l=0,c,h=!1,F,U=!0,H,R,u,g,i,L=-1,M,S=e=>{M===e&&(M=void 0,K())},$=new Set,s=(e,o)=>Z(n.onStatus,e,o),j=new Set,W=Xe({storage:n.recoveryStorage,binding:()=>{let e=n.session.snapshot()?.customerId;return e?[T,p.projectId,p.environment,n.environmentId,n.appManifestRelease,e]:void 0},unavailable:()=>s("recovery_unavailable")}),J=e=>W.forget(e.storageKey,e.command.requestId);function re(e,o){o&&(e.runId=o.id,e.expiresAt=o.runExpiresAt),W.retain(e.storageKey,{command:e.command,target:e.target,...e.runId&&{runId:e.runId},...e.expiresAt&&{expiresAt:e.expiresAt}})}function Y(){let e=i;i=void 0,e?.host.destroy(),e?.slot.remove(),e?.client.reset(),K()}let t=()=>M!==void 0||i!==void 0&&!i.background;function w(e,o){if(i?.client!==e)return;re(i.recovery,o);let d=ve(o);i.slot.hidden=d,d!==i.background&&(i.background=d,d?s("run_background",i.entryId):L=m,K())}function N(e,o,d){let v=e.client.view;if(!o||e.background||!v?.screen||v.paywall||v.pendingRequest||v.stopped||v.status!=="waiting")return;let _=Ve.parse({operation:"close",requestId:crypto.randomUUID(),nodeId:v.nodeId,visit:v.visit,revision:v.revision,customerToken:o});D.requestWithCredential("funnels",_,e.runToken,{keepalive:d}).then(()=>J(e.recovery)).catch(()=>{})}let x=()=>{i&&N(i,n.session.peek(),!0)},G=()=>Date.now()<z&&performance.now()<l;function oe(e){if(e.target.release!==n.appManifestRelease||!G())return!1;try{return ae(e.target.render,document,location.pathname,()=>{})}catch{return s("incompatible",e.id),!1}}function ne(e){if(r||e.epoch!==A||e.visit!==m||document.visibilityState==="hidden")return!1;try{return ae(e.target.render,document,location.pathname,()=>{})}catch{return!1}}async function ce(e){if(t()){s("in_progress",e.id);return}if(!n.session.peek()){s("identity_required",e.id);return}let o=W.load(),d=o?.entries.find(_=>_.command.funnelId===e.funnelId&&(!_.expiresAt||Date.parse(_.expiresAt)>Date.now()));if(d){if(!X(d)){s("recovery_pending",e.id);return}let _={...d,storageKey:o.key,epoch:A,visit:m};j.add(_.command.requestId),M=_,await Q(_);return}let v={command:me.parse({operation:"entry_start",entryId:e.id,funnelId:e.funnelId,versionId:e.versionId,release:n.appManifestRelease,requestId:crypto.randomUUID(),locale:document.documentElement.lang||"en"}),epoch:A,visit:m,target:e.target,storageKey:o?.key};j.add(v.command.requestId),M=v,await Q(v)}async function Q(e){if(e.dispatching)return;e.dispatching=!0;let o,d=!1,v=!1;async function _(C){if(e.epoch!==A)return;let O=C.view;if(!(e.storageKey&&O&&(ve(O)||O.paywall||O.pendingRequest))&&O&&["running","waiting"].includes(O.status))try{await C.submit({operation:"close",requestId:crypto.randomUUID(),nodeId:O.nodeId,visit:O.visit,revision:O.revision}),J(e)}catch(I){if(!(I instanceof B&&I.code==="FORBIDDEN"))throw I}}try{re(e),s("starting",e.command.entryId);let C=await D.request("funnels",e.command),O=Ke.safeParse(C);if(O.success){if(O.data.scope.projectId!==p.projectId||O.data.scope.environment!==p.environment)throw new B("SCOPE_MISMATCH","Entry scope changed");e.epoch===A&&s(O.data.reason,e.command.entryId),J(e),S(e);return}let I=je.parse(C);if(!I.runToken||I.scope.projectId!==p.projectId||I.scope.environment!==p.environment||I.run.source.type!=="funnel"||I.run.source.id!==e.command.funnelId||I.run.source.versionId!==e.command.versionId||e.runId!==void 0&&I.run.id!==e.runId)throw new B("INVALID_RESPONSE","Invalid entry Run");if(e.epoch!==A){S(e),s("identity_changed",e.command.entryId);return}re(e,I.run);let P=be({...n,runToken:I.runToken,funnelId:e.command.funnelId});o=P,v=!0,await P.get(),v=!1;let V=P.view;if(!V||V.id!==I.run.id||V.source.type!=="funnel"||V.source.id!==e.command.funnelId||V.source.versionId!==e.command.versionId)throw new B("INVALID_RESPONSE","Entry Run version changed");if(!["running","waiting"].includes(V.status)){J(e),S(e),s("run_ended",e.command.entryId);return}if(!ne(e)){await _(P),s("left_screen",e.command.entryId),S(e);return}let ue=!1,ie=!1;if(i&&!i.background){await _(P),s("in_progress",e.command.entryId),S(e);return}i&&Y();let ee=document.createElement("div");ee.hidden=ve(V),n.container.append(ee);let Me=await Ie(ee,{...n.host,client:P,appManifestRelease:n.appManifestRelease,onState(k){w(P,k),Z(n.host?.onState,k)},onDismiss(k){ue=!0,ee.remove(),k&&!["running","waiting"].includes(k.status)&&J(e),i?.client===P&&(i=void 0,P.reset(),K(),k&&k.status!=="completed"&&s("run_ended",e.command.entryId)),Z(n.host?.onDismiss,k)},onComplete(k){ie=!0,J(e),i?.client===P&&Y(),Z(n.host?.onComplete,k)},onError(k){Z(n.host?.onError,k),i?.client===P&&k instanceof B&&k.code==="FORBIDDEN"&&(J(e),Y(),s("run_ended",e.command.entryId))}}).catch(k=>{throw ee.remove(),k});if(!ne(e)||ue||ie){Me.destroy(),ee.remove(),ne(e)||await _(P),S(e);return}let le=ve(P.view??V);ee.hidden=le,i={host:Me,client:P,slot:ee,entryId:e.command.entryId,background:le,runToken:I.runToken,owner:n.session.peek(),recovery:e},le||(L=e.visit),d=!0,S(e),s("started",e.command.entryId),le&&s("run_background",e.command.entryId)}catch(C){C instanceof B&&(!o||v&&C.code==="FORBIDDEN")&&C.status!==void 0&&C.status>=400&&C.status<500&&!C.retryable&&(J(e),S(e)),e.epoch===A&&!r&&(s("start_failed",e.command.entryId),Z(n.host?.onError,C))}finally{d||o?.reset(),e.dispatching=!1}}function X(e){if(e.command.release!==n.appManifestRelease||e.target.release!==n.appManifestRelease)return!1;try{return ae(e.target.render,document,location.pathname,()=>{})}catch{return!1}}function de(){if(t())return!1;let e=W.load();for(let o of e?.entries??[]){if(o.expiresAt&&Date.parse(o.expiresAt)<=Date.now()){W.forget(e.key,o.command.requestId);continue}if(o.command.requestId===i?.recovery.command.requestId||j.has(o.command.requestId)||!X(o))continue;j.add(o.command.requestId);let d={...o,storageKey:e.key,epoch:A,visit:m};return M=d,Q(d),!0}return!1}function te(){if(h=!1,r||!a||document.visibilityState==="hidden")return;Re();let e=i!==void 0&&!i.background;if(e&&(L=m),!de()){if(!G()){U=!0;return}U=!1;for(let o of b?.entries??[]){let d=`${o.funnelId}:${o.id}`;if(!(o.event!=="screen_enter"||$.has(d)||!oe(o))){if(!n.session.peek()){s("identity_required",o.id);continue}if(L===m){$.add(d),e&&s("in_progress",o.id);continue}if(M){s("in_progress",o.id);return}$.add(d),ce(o);break}}}}let K=()=>{!h&&!r&&(h=!0,queueMicrotask(te))};function Re(){let e=location.origin+location.pathname;return e===q?!1:(q=e,m++,U=!0,$.clear(),j.clear(),!0)}function Ze(){Re()&&K()}function Se(e){if(!e.isTrusted||e.button!==0||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||document.visibilityState==="hidden")return;let o=e.target;if(!(o instanceof Element)||o.closest("[data-indiana-funnel]"))return;let d=o.closest("button,a,input");if(!(!d||d.matches(":disabled,[aria-disabled='true']")||d.closest("[hidden],[inert],[aria-hidden='true']")))for(let v of b?.entries??[]){let _=v.target.button;if(!(v.event!=="button_click"||!_||!oe(v))){try{let C=he(document);if(!d.matches(_.selector)||C(_.selector,d)!==1)continue}catch{s("incompatible",v.id);continue}ce(v);break}}}async function _e(){if(r)return;if(F)return F;let e=++y,o=new AbortController;H=o;let d,v=new Promise((O,I)=>{d=()=>I(new B("TIMEOUT","Funnel entry configuration read cancelled or timed out")),o.signal.addEventListener("abort",d,{once:!0})}),_=setTimeout(()=>o.abort(),n.timeoutMs??5e3),C=(async()=>{let O=async()=>{let ie=await E(`${T}/api/v1/funnel-entries/${n.environmentId}?iam=${n.appManifestRelease}`,{credentials:"omit",cache:"no-store",redirect:"error",signal:o.signal});if(!ie.ok)throw new B("SERVICE_UNAVAILABLE","Funnel entries unavailable",ie.status);return fe.parse(await ie.json())},I=await Promise.race([O(),v]),P=Date.parse(I.validatedAt),V=Date.parse(I.validUntil);if(I.scope.projectId!==p.projectId||I.scope.environment!==p.environment||I.scope.environmentId!==n.environmentId||I.release!==n.appManifestRelease||V<=Date.now()||P>Date.now()+5e3||V-P>6e4||V<=P)throw new B("INVALID_RESPONSE","Entry configuration scope or deadline changed");if(r||e!==y)return;let ue=b===void 0;b=I,z=V,l=performance.now()+Math.min(V-Date.now(),6e4),(ue||U)&&K()})();F=C;try{await C}finally{clearTimeout(_),o.signal.removeEventListener("abort",d),F===C&&(F=void 0)}}async function Ce(){try{await _e()}catch{r||s("configuration_unavailable")}r||(c=setTimeout(()=>{Ce()},15e3))}let Ae=()=>K();return{async start(){a||r||(a=!0,q=location.origin+location.pathname,R=ye(Ze),u=n.session.subscribeIdentity(()=>{A++,U=!0,M=void 0,$.clear(),L=-1,j.clear(),i&&N(i,i.owner,!1),Y(),K()}),g=new MutationObserver(K),g.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","inert","aria-hidden","data-indiana-id","id","style","data-testid","data-test","data-qa"]}),document.addEventListener("click",Se,!0),document.addEventListener("visibilitychange",Ae),addEventListener("pagehide",x),await Ce())},refresh:_e,async retry(){M&&!r&&M.epoch===A&&await Q(M)},destroy(){r=!0,y++,clearTimeout(c),H?.abort(),g?.disconnect(),R?.(),u?.(),document.removeEventListener("click",Se,!0),document.removeEventListener("visibilitychange",Ae),removeEventListener("pagehide",x),x(),Y(),b=void 0}}}function pn(n){let T=pe(n.baseUrl),p=n.fetch??globalThis.fetch.bind(globalThis),D,E=0,b=0,r=!1,a=!1,y=0,m=0,q=-1,A=!1,z="",l,c,h,F,U,H=new Set,R,u,g,i=(t,w)=>Z(n.onStatus,t,w),L=()=>Date.now()<E&&performance.now()<b;function M(t){try{return L()&&t.target.release===n.appManifestRelease&&ae(t.target.render,document,location.pathname,()=>{})}catch{return i("incompatible",t.id),!1}}function S(){let t=g;g=void 0,t?.host.destroy(),t?.slot.remove()}async function $(t){if(t.dispatching)return;t.dispatching=!0;let w=y;try{let N=await t.process.open({operation:"entry_start",funnelId:t.entry.funnelId,versionId:t.entry.versionId,entryId:t.entry.id,release:n.appManifestRelease,locale:n.locale??"en"});if(r||w!==y||u!==t)return;let x=document.createElement("div");n.container.append(x),q=m;let G=await Ie(x,{...n.host,client:N.controller,appManifestRelease:n.appManifestRelease,onDismiss(oe){g?.process===t.process&&(g=void 0,x.remove()),Z(n.host?.onDismiss,oe)}});if(r||w!==y||u!==t){G.destroy(),x.remove();return}g={entry:t.entry,process:t.process,host:G,slot:x},u=void 0,i("run_presented",t.entry.id)}catch(N){if(r||w!==y||u!==t)return;N instanceof B&&"result"in N?(u=void 0,t.process.destroy(),i("suppressed",t.entry.id),j()):i("entry_unavailable",t.entry.id)}finally{t.dispatching=!1}}function s(t){if(r||u||g||R||q===m||!M(t))return;let w=`${m}:${t.id}`;if(H.has(w))return;H.add(w);let N={entry:t,process:n.createProcess(t),visit:m};u=N,$(N)}function j(){A||r||(A=!0,queueMicrotask(()=>{if(A=!1,!(r||document.visibilityState==="hidden"||!L()||u||g||R||q===m)){for(let t of D?.entries??[])if(t.event==="screen_enter"&&M(t)){s(t);break}}}))}function W(t){if(!t.isTrusted||t.defaultPrevented||!(t.target instanceof Element)||u||g||R||q===m)return;let w=he(document,()=>{});for(let N of D?.entries??[]){let x=N.target.button;if(N.event!=="button_click"||!x||!M(N))continue;let G=t.target.closest(x.selector);if(!(!G||G.tagName.toLowerCase()!==x.tag||w(x.selector)!==1||G.matches(":disabled")||G.closest('[inert],[hidden],[aria-hidden="true"]'))){s(N);break}}}let J=()=>{let t=location.origin+location.pathname;t!==z&&(z=t,m++,H.clear(),j())};async function re(){if(r)return;if(h)return h;let t=y,w=new AbortController;c=w;let N,x=new Promise((ce,Q)=>{N=Q}),G=()=>N(new B("TIMEOUT","Funnel entry read cancelled"));w.signal.addEventListener("abort",G,{once:!0});let oe=setTimeout(()=>w.abort(),n.timeoutMs??5e3),ne=(async()=>{let ce=encodeURIComponent(JSON.stringify(["funnel-process/1"])),Q=async()=>{let K=await p(`${T}/api/v1/funnel-entries/${n.environmentId}?iam=${n.appManifestRelease}&executionContracts=${ce}`,{credentials:"omit",cache:"no-store",redirect:"error",signal:w.signal});if(!K.ok)throw new B("SERVICE_UNAVAILABLE","Funnel entries unavailable",K.status);return fe.parse(await K.json())},X=await Promise.race([Q(),x]),de=Date.parse(X.validatedAt),te=Date.parse(X.validUntil);if(X.scope.projectId!==n.scope.projectId||X.scope.environment!==n.scope.environment||X.scope.environmentId!==n.environmentId||X.release!==n.appManifestRelease||te<=Date.now()||de>Date.now()+5e3||te<=de||te-de>6e4)throw new B("INVALID_RESPONSE","Entry scope or deadline changed");r||t!==y||(D=X,E=te,b=performance.now()+Math.min(te-Date.now(),6e4),j())})();h=ne;try{await ne}finally{clearTimeout(oe),w.signal.removeEventListener("abort",G),h===ne&&(h=void 0)}}async function Y(){try{await re()}catch{r||i("configuration_unavailable")}r||(l=setTimeout(()=>{Y()},15e3))}return{async start(){a||r||(a=!0,z=location.origin+location.pathname,F=ye(J),U=new MutationObserver(j),U.observe(document.documentElement,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["hidden","inert","aria-hidden","data-indiana-id","id","style","data-testid","data-test","data-qa"]}),document.addEventListener("click",W,!0),document.addEventListener("visibilitychange",j),await Y())},refresh:re,async retry(){u&&!r&&await $(u)},async syncIdentity(){let t=g??u??R;if(t)try{let w=await t.process.syncIdentity();return R===t&&(u={entry:t.entry,process:t.process,visit:m},R=void 0,await $(u)),w}catch(w){throw t.process.view||(R={entry:t.entry,process:t.process,visit:m},u=void 0,S()),w}},async detach(){y++,c?.abort();let t=g??u??R;t&&(R={entry:t.entry,process:t.process,visit:m}),u=void 0,S(),t&&await t.process.detach()},destroy(){r=!0,y++,clearTimeout(l),c?.abort(),U?.disconnect(),F?.(),document.removeEventListener("click",W,!0),document.removeEventListener("visibilitychange",j);let t=g??u??R;u=void 0,R=void 0,S(),t?.process.destroy(),D=void 0}}}async function qn(...n){return(await import("./paywall-PJEMTVSZ.js")).showPaywall(...n)}async function Un(...n){return(await import("./funnel-runtime-host-K2SXD2R2.js")).showFunnelRun(...n)}async function Vn(...n){return(await import("./content-YQ7IJ47M.js")).mountContent(...n)}async function jn(...n){return(await import("./content-YQ7IJ47M.js")).prepareContent(...n)}export{B as LongplayError,f as MerchantBridgeError,tn as createBrowserFunnelCommandStorage,on as createConfigurationSync,en as createFeatureClient,sn as createFunnelClient,un as createFunnelPageExperiments,cn as createFunnelProcess,be as createFunnelRunController,mn as createIamFunnelEntries,pn as createIamFunnelProcessEntries,dn as createLocalFunnelClient,nn as createLongplay,fn as createMerchantBridge,rn as createPaywallSession,an as evaluateFunnelNode,Ye as formatCouponDiscount,We as formatCouponMoney,Qe as formatCouponTerms,Vn as mountContent,jn as prepareContent,Un as showFunnelRun,qn as showPaywall};
1
+ import{a as un,b as Ie}from"./chunk-3JDJD4NY.js";import"./chunk-MOWYD2TV.js";import{a as nn,c as sn,d as cn}from"./chunk-ADSQZ7T3.js";import{a as an}from"./chunk-YT7TSF3I.js";import{b as en,g as tn,l as be,m as rn,n as on,p as dn}from"./chunk-VQBQAKJD.js";import"./chunk-VSMITXQD.js";import{b as $e}from"./chunk-OBZSDWLC.js";import{a as B}from"./chunk-OZZMZH7X.js";import{a as he,c as ae}from"./chunk-J6KIN4RH.js";import"./chunk-SLUA7ABW.js";import{c as pe,d as ye}from"./chunk-RGWFBLW4.js";import{a as Z}from"./chunk-DSPLGTQI.js";import"./chunk-RK6UEQF2.js";import{Aa as Ge,B as Ee,Ba as fe,C as qe,Ca as me,D as Ue,Da as Ke,K as We,L as Ye,M as Qe,da as Ve,m as Ne,p as we,q as Pe,r as Te,s as Oe,t as De,u as Fe,v as xe,w as ke,x as Be,xa as je,y as He,z as Le}from"./chunk-KQ4MS4LR.js";import"./chunk-VSJOHWDL.js";import{z as ge}from"zod";var f=class extends Error{constructor(p,D=0,E=!1,b="fix_request"){super(p);this.code=p;this.status=D;this.retryable=E;this.recovery=b;this.name="MerchantBridgeError"}code;status;retryable;recovery};async function ln(n,T){if(!n.headers.get("content-type")?.split(";",1)[0].trim().match(/^application\/(?:json|[a-z0-9.+-]+\+json)$/i))throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");let p=n.body?.getReader();if(!p)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");let D=()=>{p.cancel().catch(()=>{})};T.addEventListener("abort",D,{once:!0});let E=0,b="",r=new TextDecoder("utf-8",{fatal:!0});try{for(T.throwIfAborted();;){let a=await p.read();if(T.throwIfAborted(),a.done)break;if(E+=a.value.byteLength,E>262144)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");b+=r.decode(a.value,{stream:!0})}return b+=r.decode(),JSON.parse(b)}catch(a){throw T.throwIfAborted(),a instanceof f?a:new f("MERCHANT_BRIDGE_INVALID_RESPONSE")}finally{T.removeEventListener("abort",D),await p.cancel().catch(()=>{}),p.releaseLock()}}function fn(n){let T=De.parse(n.origin),p=Fe.parse(n.manifest),D={projectId:n.scope.projectId,environmentId:n.scope.environmentId,environment:n.scope.environment};for(let l of["projectId","environmentId","environment"])if(p[l]!==n.scope[l])throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");let E=n.customerId===void 0?null:ge.uuid().parse(n.customerId),b=0,r=null,a=null,y=new AbortController,m=n.fetch??globalThis.fetch;async function q(l,c,h,F,U){if(!p.capabilities.includes(l))throw new f("MERCHANT_BRIDGE_CAPABILITY_UNSUPPORTED",501);let H=Oe[l];if(["merchant_catalog_reader","merchant_refund_authority","indiana_server_key"].includes(H.authority))throw new f("MERCHANT_BRIDGE_FORBIDDEN",403);let R=b,u=AbortSignal.any([y.signal,AbortSignal.timeout(Math.min(3e4,Math.max(1e3,n.timeoutMs??1e4))),...n.signal?[n.signal]:[],...F?[F]:[]]);u.throwIfAborted();let g=new Headers(await n.headers?.());if(u.throwIfAborted(),R!==b)throw new DOMException("Merchant identity changed","AbortError");if(/\bgg_(?:sk|ct|rt)_/.test(g.get("authorization")??"")||g.has("X-Indiana-Bridge-Signature")||g.has("X-Indiana-Bridge-Key-Id"))throw new f("MERCHANT_BRIDGE_FORBIDDEN",403);g.set(Te,String(we)),g.set("Accept","application/json");let i=crypto.randomUUID();g.set("X-Request-Id",i),g.set("Content-Type","application/json");let L=await m(T+Pe,{method:"POST",credentials:"include",redirect:"error",cache:"no-store",headers:g,signal:u,body:JSON.stringify({bridgeVersion:we,requestId:i,command:H.command,scope:D,data:U??(h===void 0?{}:{operationId:h})})}),M=await ln(L,u);if(u.throwIfAborted(),R!==b)throw new DOMException("Merchant identity changed","AbortError");if(!L.ok){let s=Ue.safeParse(M);throw!s.success||s.data.scope.projectId!==n.scope.projectId||s.data.scope.environment!==n.scope.environment||s.data.scope.environmentId!==n.scope.environmentId||s.data.requestId!==i||s.data.command!==H.command?new f("MERCHANT_BRIDGE_INVALID_RESPONSE",L.status):new f(s.data.error.code,L.status,s.data.error.retryable,s.data.error.recovery)}let S=xe(ge.unknown()).safeParse(M);if(!S.success||S.data.scope.projectId!==n.scope.projectId||S.data.scope.environment!==n.scope.environment||S.data.scope.environmentId!==n.scope.environmentId||S.data.requestId!==i||S.data.command!==H.command)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE",L.status);let $=c.safeParse(S.data.data);if(!$.success)throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE",L.status);return $.data}function A(){if(!E)throw new f("MERCHANT_BRIDGE_UNAUTHENTICATED",401);return E}async function z(l,c,h,F){let U=A(),H=Le.parse({operationId:h,customerId:U}),R=await q(l,c,H.operationId,F,H);if(R.customerId!==U||R.operationId!==H.operationId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return R}return{async readPresentation(l){let c=await q("presentation",Be,void 0,l);if(a!==null&&a!==c.nativeUserId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(c.presentation&&E!==null&&c.presentation.customerId!==E)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return a=c.nativeUserId,r=c.presentation,c},async createSession(l){let c=await q("session",ke,void 0,l);if(a!==null&&a!==c.nativeUserId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(E!==null&&E!==c.session.customerId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(r&&r.customerId!==c.session.customerId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return E=c.session.customerId,a=c.nativeUserId,c.session},async reportPresentation(l,c){let h=A(),F=He.parse(l);if(!r||r.customerId!==h||r.decisionId!==F.decisionId)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return q("presentation_events",ge.strictObject({queued:ge.literal(!0)}),void 0,c,F)},async readCustomerCommerce(l){let c=A(),h=await q("customer_commerce",qe,void 0,l);if(h.customerId!==c)throw new f("MERCHANT_BRIDGE_SCOPE_MISMATCH");return h},async executePurchase(l,c){let h=await z("purchases",Ee,l,c);if(h.type!=="purchase")throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");return h},readOperation:(l,c)=>z("operation_status",Ne,l,c),async executeSubscriptionChange(l,c){let h=await z("subscription_changes",Ee,l,c);if(h.type!=="subscription_change")throw new f("MERCHANT_BRIDGE_INVALID_RESPONSE");return h},reset(){b++,y.abort(),y=new AbortController,E=null,r=null,a=null}}}import{z as se}from"zod";var Je=se.strictObject({command:me,target:Ge,runId:se.uuid().optional(),expiresAt:se.iso.datetime({offset:!0}).optional()}).refine(n=>n.command.release===n.target.release),ze=se.strictObject({schemaVersion:se.literal(1),entries:se.array(Je).max(4e3)});function Xe(n){let T=!1,p=()=>{T||n.unavailable(),T=!0};function D(){return n.storage===!1?void 0:n.storage??globalThis.sessionStorage}function E(r){let a=D()?.getItem(r);if(!a)return[];if(a.length>1048576)throw Error("Entry recovery is too large");return ze.parse(JSON.parse(a)).entries}function b(r,a){let y=D();if(!y)return;if(!a.length)return y.removeItem(r);let m=JSON.stringify(ze.parse({schemaVersion:1,entries:a}));if(m.length>1048576)throw Error("Entry recovery is too large");y.setItem(r,m)}return{load(){try{let r=n.binding();if(!r||n.storage===!1)return;let a="indiana.funnel.entries.v1."+JSON.stringify(r);return{key:a,entries:E(a)}}catch{p();return}},retain(r,a){if(r)try{let y=Je.parse(a);b(r,[...E(r).filter(m=>m.command.funnelId!==y.command.funnelId),y])}catch{p()}},forget(r,a){if(r)try{b(r,E(r).filter(y=>y.command.requestId!==a))}catch{p()}}}}var ve=n=>["running","waiting"].includes(n.status)&&!n.pendingRequest&&(n.stopped||!n.screen&&!n.paywall&&n.instruction?.type==="wait"&&n.instruction.kind!=="operation");function mn(n){let T=pe(n.baseUrl),p=n.scope,D=$e(n),E=n.fetch??globalThis.fetch.bind(globalThis),b,r=!1,a=!1,y=0,m=0,q="",A=0,z=0,l=0,c,h=!1,F,U=!0,H,R,u,g,i,L=-1,M,S=e=>{M===e&&(M=void 0,K())},$=new Set,s=(e,o)=>Z(n.onStatus,e,o),j=new Set,W=Xe({storage:n.recoveryStorage,binding:()=>{let e=n.session.snapshot()?.customerId;return e?[T,p.projectId,p.environment,n.environmentId,n.appManifestRelease,e]:void 0},unavailable:()=>s("recovery_unavailable")}),J=e=>W.forget(e.storageKey,e.command.requestId);function re(e,o){o&&(e.runId=o.id,e.expiresAt=o.runExpiresAt),W.retain(e.storageKey,{command:e.command,target:e.target,...e.runId&&{runId:e.runId},...e.expiresAt&&{expiresAt:e.expiresAt}})}function Y(){let e=i;i=void 0,e?.host.destroy(),e?.slot.remove(),e?.client.reset(),K()}let t=()=>M!==void 0||i!==void 0&&!i.background;function w(e,o){if(i?.client!==e)return;re(i.recovery,o);let d=ve(o);i.slot.hidden=d,d!==i.background&&(i.background=d,d?s("run_background",i.entryId):L=m,K())}function N(e,o,d){let v=e.client.view;if(!o||e.background||!v?.screen||v.paywall||v.pendingRequest||v.stopped||v.status!=="waiting")return;let _=Ve.parse({operation:"close",requestId:crypto.randomUUID(),nodeId:v.nodeId,visit:v.visit,revision:v.revision,customerToken:o});D.requestWithCredential("funnels",_,e.runToken,{keepalive:d}).then(()=>J(e.recovery)).catch(()=>{})}let x=()=>{i&&N(i,n.session.peek(),!0)},G=()=>Date.now()<z&&performance.now()<l;function oe(e){if(e.target.release!==n.appManifestRelease||!G())return!1;try{return ae(e.target.render,document,location.pathname,()=>{})}catch{return s("incompatible",e.id),!1}}function ne(e){if(r||e.epoch!==A||e.visit!==m||document.visibilityState==="hidden")return!1;try{return ae(e.target.render,document,location.pathname,()=>{})}catch{return!1}}async function ce(e){if(t()){s("in_progress",e.id);return}if(!n.session.peek()){s("identity_required",e.id);return}let o=W.load(),d=o?.entries.find(_=>_.command.funnelId===e.funnelId&&(!_.expiresAt||Date.parse(_.expiresAt)>Date.now()));if(d){if(!X(d)){s("recovery_pending",e.id);return}let _={...d,storageKey:o.key,epoch:A,visit:m};j.add(_.command.requestId),M=_,await Q(_);return}let v={command:me.parse({operation:"entry_start",entryId:e.id,funnelId:e.funnelId,versionId:e.versionId,release:n.appManifestRelease,requestId:crypto.randomUUID(),locale:document.documentElement.lang||"en"}),epoch:A,visit:m,target:e.target,storageKey:o?.key};j.add(v.command.requestId),M=v,await Q(v)}async function Q(e){if(e.dispatching)return;e.dispatching=!0;let o,d=!1,v=!1;async function _(C){if(e.epoch!==A)return;let O=C.view;if(!(e.storageKey&&O&&(ve(O)||O.paywall||O.pendingRequest))&&O&&["running","waiting"].includes(O.status))try{await C.submit({operation:"close",requestId:crypto.randomUUID(),nodeId:O.nodeId,visit:O.visit,revision:O.revision}),J(e)}catch(I){if(!(I instanceof B&&I.code==="FORBIDDEN"))throw I}}try{re(e),s("starting",e.command.entryId);let C=await D.request("funnels",e.command),O=Ke.safeParse(C);if(O.success){if(O.data.scope.projectId!==p.projectId||O.data.scope.environment!==p.environment)throw new B("SCOPE_MISMATCH","Entry scope changed");e.epoch===A&&s(O.data.reason,e.command.entryId),J(e),S(e);return}let I=je.parse(C);if(!I.runToken||I.scope.projectId!==p.projectId||I.scope.environment!==p.environment||I.run.source.type!=="funnel"||I.run.source.id!==e.command.funnelId||I.run.source.versionId!==e.command.versionId||e.runId!==void 0&&I.run.id!==e.runId)throw new B("INVALID_RESPONSE","Invalid entry Run");if(e.epoch!==A){S(e),s("identity_changed",e.command.entryId);return}re(e,I.run);let P=be({...n,runToken:I.runToken,funnelId:e.command.funnelId});o=P,v=!0,await P.get(),v=!1;let V=P.view;if(!V||V.id!==I.run.id||V.source.type!=="funnel"||V.source.id!==e.command.funnelId||V.source.versionId!==e.command.versionId)throw new B("INVALID_RESPONSE","Entry Run version changed");if(!["running","waiting"].includes(V.status)){J(e),S(e),s("run_ended",e.command.entryId);return}if(!ne(e)){await _(P),s("left_screen",e.command.entryId),S(e);return}let ue=!1,ie=!1;if(i&&!i.background){await _(P),s("in_progress",e.command.entryId),S(e);return}i&&Y();let ee=document.createElement("div");ee.hidden=ve(V),n.container.append(ee);let Me=await Ie(ee,{...n.host,client:P,appManifestRelease:n.appManifestRelease,onState(k){w(P,k),Z(n.host?.onState,k)},onDismiss(k){ue=!0,ee.remove(),k&&!["running","waiting"].includes(k.status)&&J(e),i?.client===P&&(i=void 0,P.reset(),K(),k&&k.status!=="completed"&&s("run_ended",e.command.entryId)),Z(n.host?.onDismiss,k)},onComplete(k){ie=!0,J(e),i?.client===P&&Y(),Z(n.host?.onComplete,k)},onError(k){Z(n.host?.onError,k),i?.client===P&&k instanceof B&&k.code==="FORBIDDEN"&&(J(e),Y(),s("run_ended",e.command.entryId))}}).catch(k=>{throw ee.remove(),k});if(!ne(e)||ue||ie){Me.destroy(),ee.remove(),ne(e)||await _(P),S(e);return}let le=ve(P.view??V);ee.hidden=le,i={host:Me,client:P,slot:ee,entryId:e.command.entryId,background:le,runToken:I.runToken,owner:n.session.peek(),recovery:e},le||(L=e.visit),d=!0,S(e),s("started",e.command.entryId),le&&s("run_background",e.command.entryId)}catch(C){C instanceof B&&(!o||v&&C.code==="FORBIDDEN")&&C.status!==void 0&&C.status>=400&&C.status<500&&!C.retryable&&(J(e),S(e)),e.epoch===A&&!r&&(s("start_failed",e.command.entryId),Z(n.host?.onError,C))}finally{d||o?.reset(),e.dispatching=!1}}function X(e){if(e.command.release!==n.appManifestRelease||e.target.release!==n.appManifestRelease)return!1;try{return ae(e.target.render,document,location.pathname,()=>{})}catch{return!1}}function de(){if(t())return!1;let e=W.load();for(let o of e?.entries??[]){if(o.expiresAt&&Date.parse(o.expiresAt)<=Date.now()){W.forget(e.key,o.command.requestId);continue}if(o.command.requestId===i?.recovery.command.requestId||j.has(o.command.requestId)||!X(o))continue;j.add(o.command.requestId);let d={...o,storageKey:e.key,epoch:A,visit:m};return M=d,Q(d),!0}return!1}function te(){if(h=!1,r||!a||document.visibilityState==="hidden")return;Re();let e=i!==void 0&&!i.background;if(e&&(L=m),!de()){if(!G()){U=!0;return}U=!1;for(let o of b?.entries??[]){let d=`${o.funnelId}:${o.id}`;if(!(o.event!=="screen_enter"||$.has(d)||!oe(o))){if(!n.session.peek()){s("identity_required",o.id);continue}if(L===m){$.add(d),e&&s("in_progress",o.id);continue}if(M){s("in_progress",o.id);return}$.add(d),ce(o);break}}}}let K=()=>{!h&&!r&&(h=!0,queueMicrotask(te))};function Re(){let e=location.origin+location.pathname;return e===q?!1:(q=e,m++,U=!0,$.clear(),j.clear(),!0)}function Ze(){Re()&&K()}function Se(e){if(!e.isTrusted||e.button!==0||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||document.visibilityState==="hidden")return;let o=e.target;if(!(o instanceof Element)||o.closest("[data-indiana-funnel]"))return;let d=o.closest("button,a,input");if(!(!d||d.matches(":disabled,[aria-disabled='true']")||d.closest("[hidden],[inert],[aria-hidden='true']")))for(let v of b?.entries??[]){let _=v.target.button;if(!(v.event!=="button_click"||!_||!oe(v))){try{let C=he(document);if(!d.matches(_.selector)||C(_.selector,d)!==1)continue}catch{s("incompatible",v.id);continue}ce(v);break}}}async function _e(){if(r)return;if(F)return F;let e=++y,o=new AbortController;H=o;let d,v=new Promise((O,I)=>{d=()=>I(new B("TIMEOUT","Funnel entry configuration read cancelled or timed out")),o.signal.addEventListener("abort",d,{once:!0})}),_=setTimeout(()=>o.abort(),n.timeoutMs??5e3),C=(async()=>{let O=async()=>{let ie=await E(`${T}/api/v1/funnel-entries/${n.environmentId}?iam=${n.appManifestRelease}`,{credentials:"omit",cache:"no-store",redirect:"error",signal:o.signal});if(!ie.ok)throw new B("SERVICE_UNAVAILABLE","Funnel entries unavailable",ie.status);return fe.parse(await ie.json())},I=await Promise.race([O(),v]),P=Date.parse(I.validatedAt),V=Date.parse(I.validUntil);if(I.scope.projectId!==p.projectId||I.scope.environment!==p.environment||I.scope.environmentId!==n.environmentId||I.release!==n.appManifestRelease||V<=Date.now()||P>Date.now()+5e3||V-P>6e4||V<=P)throw new B("INVALID_RESPONSE","Entry configuration scope or deadline changed");if(r||e!==y)return;let ue=b===void 0;b=I,z=V,l=performance.now()+Math.min(V-Date.now(),6e4),(ue||U)&&K()})();F=C;try{await C}finally{clearTimeout(_),o.signal.removeEventListener("abort",d),F===C&&(F=void 0)}}async function Ce(){try{await _e()}catch{r||s("configuration_unavailable")}r||(c=setTimeout(()=>{Ce()},15e3))}let Ae=()=>K();return{async start(){a||r||(a=!0,q=location.origin+location.pathname,R=ye(Ze),u=n.session.subscribeIdentity(()=>{A++,U=!0,M=void 0,$.clear(),L=-1,j.clear(),i&&N(i,i.owner,!1),Y(),K()}),g=new MutationObserver(K),g.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","inert","aria-hidden","data-indiana-id","id","style","data-testid","data-test","data-qa"]}),document.addEventListener("click",Se,!0),document.addEventListener("visibilitychange",Ae),addEventListener("pagehide",x),await Ce())},refresh:_e,async retry(){M&&!r&&M.epoch===A&&await Q(M)},destroy(){r=!0,y++,clearTimeout(c),H?.abort(),g?.disconnect(),R?.(),u?.(),document.removeEventListener("click",Se,!0),document.removeEventListener("visibilitychange",Ae),removeEventListener("pagehide",x),x(),Y(),b=void 0}}}function pn(n){let T=pe(n.baseUrl),p=n.fetch??globalThis.fetch.bind(globalThis),D,E=0,b=0,r=!1,a=!1,y=0,m=0,q=-1,A=!1,z="",l,c,h,F,U,H=new Set,R,u,g,i=(t,w)=>Z(n.onStatus,t,w),L=()=>Date.now()<E&&performance.now()<b;function M(t){try{return L()&&t.target.release===n.appManifestRelease&&ae(t.target.render,document,location.pathname,()=>{})}catch{return i("incompatible",t.id),!1}}function S(){let t=g;g=void 0,t?.host.destroy(),t?.slot.remove()}async function $(t){if(t.dispatching)return;t.dispatching=!0;let w=y;try{let N=await t.process.open({operation:"entry_start",funnelId:t.entry.funnelId,versionId:t.entry.versionId,entryId:t.entry.id,release:n.appManifestRelease,locale:n.locale??"en"});if(r||w!==y||u!==t)return;let x=document.createElement("div");n.container.append(x),q=m;let G=await Ie(x,{...n.host,client:N.controller,appManifestRelease:n.appManifestRelease,onDismiss(oe){g?.process===t.process&&(g=void 0,x.remove()),Z(n.host?.onDismiss,oe)}});if(r||w!==y||u!==t){G.destroy(),x.remove();return}g={entry:t.entry,process:t.process,host:G,slot:x},u=void 0,i("run_presented",t.entry.id)}catch(N){if(r||w!==y||u!==t)return;N instanceof B&&"result"in N?(u=void 0,t.process.destroy(),i("suppressed",t.entry.id),j()):i("entry_unavailable",t.entry.id)}finally{t.dispatching=!1}}function s(t){if(r||u||g||R||q===m||!M(t))return;let w=`${m}:${t.id}`;if(H.has(w))return;H.add(w);let N={entry:t,process:n.createProcess(t),visit:m};u=N,$(N)}function j(){A||r||(A=!0,queueMicrotask(()=>{if(A=!1,!(r||document.visibilityState==="hidden"||!L()||u||g||R||q===m)){for(let t of D?.entries??[])if(t.event==="screen_enter"&&M(t)){s(t);break}}}))}function W(t){if(!t.isTrusted||t.defaultPrevented||!(t.target instanceof Element)||u||g||R||q===m)return;let w=he(document,()=>{});for(let N of D?.entries??[]){let x=N.target.button;if(N.event!=="button_click"||!x||!M(N))continue;let G=t.target.closest(x.selector);if(!(!G||G.tagName.toLowerCase()!==x.tag||w(x.selector)!==1||G.matches(":disabled")||G.closest('[inert],[hidden],[aria-hidden="true"]'))){s(N);break}}}let J=()=>{let t=location.origin+location.pathname;t!==z&&(z=t,m++,H.clear(),j())};async function re(){if(r)return;if(h)return h;let t=y,w=new AbortController;c=w;let N,x=new Promise((ce,Q)=>{N=Q}),G=()=>N(new B("TIMEOUT","Funnel entry read cancelled"));w.signal.addEventListener("abort",G,{once:!0});let oe=setTimeout(()=>w.abort(),n.timeoutMs??5e3),ne=(async()=>{let ce=encodeURIComponent(JSON.stringify(["funnel-process/1"])),Q=async()=>{let K=await p(`${T}/api/v1/funnel-entries/${n.environmentId}?iam=${n.appManifestRelease}&executionContracts=${ce}`,{credentials:"omit",cache:"no-store",redirect:"error",signal:w.signal});if(!K.ok)throw new B("SERVICE_UNAVAILABLE","Funnel entries unavailable",K.status);return fe.parse(await K.json())},X=await Promise.race([Q(),x]),de=Date.parse(X.validatedAt),te=Date.parse(X.validUntil);if(X.scope.projectId!==n.scope.projectId||X.scope.environment!==n.scope.environment||X.scope.environmentId!==n.environmentId||X.release!==n.appManifestRelease||te<=Date.now()||de>Date.now()+5e3||te<=de||te-de>6e4)throw new B("INVALID_RESPONSE","Entry scope or deadline changed");r||t!==y||(D=X,E=te,b=performance.now()+Math.min(te-Date.now(),6e4),j())})();h=ne;try{await ne}finally{clearTimeout(oe),w.signal.removeEventListener("abort",G),h===ne&&(h=void 0)}}async function Y(){try{await re()}catch{r||i("configuration_unavailable")}r||(l=setTimeout(()=>{Y()},15e3))}return{async start(){a||r||(a=!0,z=location.origin+location.pathname,F=ye(J),U=new MutationObserver(j),U.observe(document.documentElement,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["hidden","inert","aria-hidden","data-indiana-id","id","style","data-testid","data-test","data-qa"]}),document.addEventListener("click",W,!0),document.addEventListener("visibilitychange",j),await Y())},refresh:re,async retry(){u&&!r&&await $(u)},async syncIdentity(){let t=g??u??R;if(t)try{let w=await t.process.syncIdentity();return R===t&&(u={entry:t.entry,process:t.process,visit:m},R=void 0,await $(u)),w}catch(w){throw t.process.view||(R={entry:t.entry,process:t.process,visit:m},u=void 0,S()),w}},async detach(){y++,c?.abort();let t=g??u??R;t&&(R={entry:t.entry,process:t.process,visit:m}),u=void 0,S(),t&&await t.process.detach()},destroy(){r=!0,y++,clearTimeout(l),c?.abort(),U?.disconnect(),F?.(),document.removeEventListener("click",W,!0),document.removeEventListener("visibilitychange",j);let t=g??u??R;u=void 0,R=void 0,S(),t?.process.destroy(),D=void 0}}}async function qn(...n){return(await import("./paywall-KSTKKKEA.js")).showPaywall(...n)}async function Un(...n){return(await import("./funnel-runtime-host-X5AMUCP2.js")).showFunnelRun(...n)}async function Vn(...n){return(await import("./content-6JUK2IAJ.js")).mountContent(...n)}async function jn(...n){return(await import("./content-6JUK2IAJ.js")).prepareContent(...n)}export{B as LongplayError,f as MerchantBridgeError,tn as createBrowserFunnelCommandStorage,on as createConfigurationSync,en as createFeatureClient,sn as createFunnelClient,un as createFunnelPageExperiments,cn as createFunnelProcess,be as createFunnelRunController,mn as createIamFunnelEntries,pn as createIamFunnelProcessEntries,dn as createLocalFunnelClient,nn as createLongplay,fn as createMerchantBridge,rn as createPaywallSession,an as evaluateFunnelNode,Ye as formatCouponDiscount,We as formatCouponMoney,Qe as formatCouponTerms,Vn as mountContent,jn as prepareContent,Un as showFunnelRun,qn as showPaywall};