@tinkerlandai/longplay-sdk 0.10.5 → 0.10.6

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +3 -1
  3. package/README.zh-CN.md +6 -4
  4. package/dist/chunk-5JJZSH23.js +179 -0
  5. package/dist/chunk-65WKEU2L.js +1 -0
  6. package/dist/{chunk-5BWSWP6H.js → chunk-ACF2FBUB.js} +1 -1
  7. package/dist/{chunk-MSOVR5KN.js → chunk-AWZFL4HE.js} +1 -1
  8. package/dist/{chunk-ZEEDAM4H.js → chunk-F4YCLQGU.js} +1 -1
  9. package/dist/{chunk-5FAUO337.js → chunk-FRGIXMNP.js} +1 -1
  10. package/dist/{chunk-ABL2UMTI.js → chunk-FXVZRIJ3.js} +1 -1
  11. package/dist/{chunk-O3FHA25D.js → chunk-G56XGVMS.js} +1 -1
  12. package/dist/{chunk-ZIUBXO6M.js → chunk-HV4THS52.js} +1 -1
  13. package/dist/{chunk-OHYC6K3A.js → chunk-JSHLBGDY.js} +1 -1
  14. package/dist/chunk-MOWYD2TV.js +1 -0
  15. package/dist/{chunk-KMCA4Y2Q.js → chunk-RE6BIFLN.js} +1 -1
  16. package/dist/{chunk-BEBSMWPR.js → chunk-SBPTOOYB.js} +1 -1
  17. package/dist/chunk-VUWXU4FP.js +1 -0
  18. package/dist/{chunk-EK6IPAY5.js → chunk-WCVK4OMS.js} +1 -1
  19. package/dist/content-ZQNYKPZT.js +1 -0
  20. package/dist/{funnel-local-client-CVokI0rx.d.ts → funnel-local-client-B4Z3dvNf.d.ts} +1 -1
  21. package/dist/{funnel-resource-client-Cv5OjfAn.d.ts → funnel-resource-client-BhbXsB2q.d.ts} +1 -1
  22. package/dist/funnel-runtime-host-DDBGBB5L.js +1 -0
  23. package/dist/index.d.ts +5 -5
  24. package/dist/index.js +1 -1
  25. package/dist/native-shell.js +1 -1
  26. package/dist/openrouter.js +1 -1
  27. package/dist/page.js +1 -1
  28. package/dist/paywall-XQG2D3PA.js +1 -0
  29. package/dist/popup.d.ts +2 -1
  30. package/dist/popup.js +1 -1
  31. package/dist/react-native.d.ts +5 -5
  32. package/dist/react-native.js +1 -1
  33. package/dist/screen-renderer-NLB3FAQJ.js +1 -0
  34. package/dist/server.d.ts +3 -3
  35. package/dist/server.js +1 -1
  36. package/dist/visual-dom-DQLPBZ2Z.js +1 -0
  37. package/dist/visual.js +1 -1
  38. package/package.json +9 -10
  39. package/dist/chunk-FSTRGSM5.js +0 -1
  40. package/dist/chunk-QOUOTUVB.js +0 -1
  41. package/dist/chunk-ZDT32X4G.js +0 -173
  42. package/dist/content-QPJOW6OT.js +0 -1
  43. package/dist/funnel-runtime-host-EHYY7OIZ.js +0 -1
  44. package/dist/paywall-EYRLWKC5.js +0 -1
  45. package/dist/screen-renderer-KOKMHO6R.js +0 -1
  46. package/dist/visual-dom-YGLIHSKU.js +0 -1
  47. /package/dist/{chunk-XVT5BKJW.js → chunk-7DXL3LHT.js} +0 -0
  48. /package/dist/{chunk-MPE7OZTE.js → chunk-CLXORAOK.js} +0 -0
  49. /package/dist/{chunk-BI4R5Q7Z.js → chunk-XSVQHPQT.js} +0 -0
@@ -2,7 +2,7 @@ import * as zod from 'zod';
2
2
  import { z } from 'zod';
3
3
  import { S as StackNode } from './screen-D81zCpfi.js';
4
4
  import { I as InvoiceModeParams } from './api-5gAz4-Sb.js';
5
- import { g as FunnelRuntimeResponse, F as FunnelRunView, h as FunnelMutation, l as FunnelPurchaseRecovery, d as FunnelSegmentPrediction, e as PaywallDelivery, x as PaywallResolution, f as FunnelDataQueries, I as IndianaOptions, j as FeatureClientOptions } from './funnel-local-client-CVokI0rx.js';
5
+ import { g as FunnelRuntimeResponse, F as FunnelRunView, h as FunnelMutation, l as FunnelPurchaseRecovery, d as FunnelSegmentPrediction, e as PaywallDelivery, x as PaywallResolution, f as FunnelDataQueries, I as IndianaOptions, j as FeatureClientOptions } from './funnel-local-client-B4Z3dvNf.js';
6
6
  import { a as ConfigurationSync } from './configuration-sync-CywDxRkX.js';
7
7
 
8
8
  /** The store supplies the intent hint. Only verified provider facts prove ownership. */
@@ -0,0 +1 @@
1
+ import{b as a}from"./chunk-VUWXU4FP.js";import"./chunk-MOWYD2TV.js";import"./chunk-SBPTOOYB.js";import"./chunk-WCVK4OMS.js";import"./chunk-ACF2FBUB.js";import"./chunk-EARSGITJ.js";import"./chunk-FXVZRIJ3.js";import"./chunk-DSPLGTQI.js";import"./chunk-G56XGVMS.js";import"./chunk-AWZFL4HE.js";import"./chunk-7DXL3LHT.js";import"./chunk-XSVQHPQT.js";export{a as showFunnelRun};
package/dist/index.d.ts CHANGED
@@ -3,10 +3,10 @@ import { z } from 'zod';
3
3
  import { S as ScreenAnswers, s as screenInputBindingsSchema, a as SurfaceData, C as CustomerDataIntent } from './customer-page-km5f1PJZ.js';
4
4
  import { J as JsonValue, F as FeatureResult } from './growth-rules-B4YYy64R.js';
5
5
  import { S as StackNode, a as ScreenSelection } from './screen-D81zCpfi.js';
6
- import { P as PaywallSession, S as SubscriptionOperation, F as FunnelRunView, I as IndianaOptions, C as CustomerSession, R as RemoteFeatureResult, a as PushAddressObservation, b as FunnelCommandStorage, c as FunnelStartInput, d as FunnelSegmentPrediction, e as PaywallDelivery, f as FunnelDataQueries, g as FunnelRuntimeResponse, h as FunnelMutation } from './funnel-local-client-CVokI0rx.js';
7
- export { i as FeatureClient, j as FeatureClientOptions, k as FunnelPendingEntry, l as FunnelPurchaseRecovery, m as IndianaError, L as LocalFunnelClient, n as LocalFunnelClientOptions, m as LongplayError, o as PaywallPurchaseInput, p as PaywallStartInput, q as PushHost, r as PushJournal, s as SessionCredentials, t as createFeatureClient, u as createLocalFunnelClient, v as createPaywallSession } from './funnel-local-client-CVokI0rx.js';
8
- import { F as FunnelRunController, a as FunnelResourceSource, I as IndianaFeatureOptions, N as NativeRestoreCommand } from './funnel-resource-client-Cv5OjfAn.js';
9
- export { b as FunnelControllerResponse, c as createFunnelRunController } from './funnel-resource-client-Cv5OjfAn.js';
6
+ import { P as PaywallSession, S as SubscriptionOperation, F as FunnelRunView, I as IndianaOptions, C as CustomerSession, R as RemoteFeatureResult, a as PushAddressObservation, b as FunnelCommandStorage, c as FunnelStartInput, d as FunnelSegmentPrediction, e as PaywallDelivery, f as FunnelDataQueries, g as FunnelRuntimeResponse, h as FunnelMutation } from './funnel-local-client-B4Z3dvNf.js';
7
+ export { i as FeatureClient, j as FeatureClientOptions, k as FunnelPendingEntry, l as FunnelPurchaseRecovery, L as LocalFunnelClient, m as LocalFunnelClientOptions, n as LongplayError, o as PaywallPurchaseInput, p as PaywallStartInput, q as PushHost, r as PushJournal, s as SessionCredentials, t as createFeatureClient, u as createLocalFunnelClient, v as createPaywallSession } from './funnel-local-client-B4Z3dvNf.js';
8
+ import { F as FunnelRunController, a as FunnelResourceSource, I as IndianaFeatureOptions, N as NativeRestoreCommand } from './funnel-resource-client-BhbXsB2q.js';
9
+ export { b as FunnelControllerResponse, c as createFunnelRunController } from './funnel-resource-client-BhbXsB2q.js';
10
10
  import { C as CouponInput, O as Offer } from './coupon-fA1QujHt.js';
11
11
  export { a as OfferUnavailableReason } from './coupon-fA1QujHt.js';
12
12
  import { M as MerchantBridgeManifest } from './funnel-node-evaluation-P5B4fPfJ.js';
@@ -23542,4 +23542,4 @@ declare function prepareContent(...args: Parameters<typeof prepareContent$1>): P
23542
23542
  updateCapabilities: (data: SurfaceData) => void | undefined;
23543
23543
  }>;
23544
23544
 
23545
- export { type ContentActionIntent, type ContentHostOptions, CustomerSession, FunnelCommandStorage, type FunnelHostOptions, FunnelResourceSource, FunnelRunController, FunnelRuntimeResponse, FunnelSegmentPrediction, type IamFunnelEntriesOptions, IndianaFeatureOptions, IndianaOptions, IndianaFeatureOptions as LongplayFeatureOptions, IndianaOptions as LongplayOptions, MerchantBridgeError, type MerchantBridgeOptions, Offer, type PaywallHostOptions, type PaywallPurchaseIntent, PaywallSession, createBrowserFunnelCommandStorage, createFunnelClient, createFunnelPageExperiments, createIamFunnelEntries, createIndiana, createIndiana as createLongplay, createMerchantBridge, formatCouponDiscount, formatCouponMoney, formatCouponTerms, mountContent, prepareContent, showFunnelRun, showPaywall };
23545
+ export { type ContentActionIntent, type ContentHostOptions, CustomerSession, FunnelCommandStorage, type FunnelHostOptions, FunnelResourceSource, FunnelRunController, FunnelRuntimeResponse, FunnelSegmentPrediction, type IamFunnelEntriesOptions, IndianaFeatureOptions as LongplayFeatureOptions, IndianaOptions as LongplayOptions, MerchantBridgeError, type MerchantBridgeOptions, Offer, type PaywallHostOptions, type PaywallPurchaseIntent, PaywallSession, createBrowserFunnelCommandStorage, createFunnelClient, createFunnelPageExperiments, createIamFunnelEntries, createIndiana as createLongplay, createMerchantBridge, formatCouponDiscount, formatCouponMoney, formatCouponTerms, mountContent, prepareContent, showFunnelRun, showPaywall };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{a as Ge,b as Ae}from"./chunk-QOUOTUVB.js";import{a as Se,c as Le}from"./chunk-5FAUO337.js";import{a as He}from"./chunk-FSTRGSM5.js";import{b as Pe,g as xe,l as X,m as Be,n as Fe,p as ke}from"./chunk-ZIUBXO6M.js";import"./chunk-BEBSMWPR.js";import{F as Te,G as Oe,H as De,Ka as Ee,La as we,Ma as ve,Qa as Re,i as ae,k as K,l as ie,m as se,n as ce,o as de,p as ue,q as le,qa as ge,r as me,s as fe,t as pe,u as he,w as J,x as Ie,y as ye}from"./chunk-EK6IPAY5.js";import{qa as A}from"./chunk-5BWSWP6H.js";import{a as Ce,c as Z}from"./chunk-MPE7OZTE.js";import"./chunk-EARSGITJ.js";import{c as _e,d as be}from"./chunk-ABL2UMTI.js";import{a as j}from"./chunk-DSPLGTQI.js";import"./chunk-O3FHA25D.js";import"./chunk-MSOVR5KN.js";import"./chunk-XVT5BKJW.js";import"./chunk-BI4R5Q7Z.js";import{z as $}from"zod";var r=class extends Error{constructor(m,L=0,I=!1,h="fix_request"){super(m);this.code=m;this.status=L;this.retryable=I;this.recovery=h;this.name="MerchantBridgeError"}code;status;retryable;recovery};async function Ue(n,S){if(!n.headers.get("content-type")?.split(";",1)[0].trim().match(/^application\/(?:json|[a-z0-9.+-]+\+json)$/i))throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");let m=n.body?.getReader();if(!m)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");let L=()=>{m.cancel().catch(()=>{})};S.addEventListener("abort",L,{once:!0});let I=0,h="",a=new TextDecoder("utf-8",{fatal:!0});try{for(S.throwIfAborted();;){let c=await m.read();if(S.throwIfAborted(),c.done)break;if(I+=c.value.byteLength,I>262144)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");h+=a.decode(c.value,{stream:!0})}return h+=a.decode(),JSON.parse(h)}catch(c){throw S.throwIfAborted(),c instanceof r?c:new r("MERCHANT_BRIDGE_INVALID_RESPONSE")}finally{S.removeEventListener("abort",L),await m.cancel().catch(()=>{}),m.releaseLock()}}function je(n){let S=de.parse(n.origin),m=ue.parse(n.manifest),L={projectId:n.scope.projectId,environmentId:n.scope.environmentId,environment:n.scope.environment};for(let o of["projectId","environmentId","environment"])if(m[o]!==n.scope[o])throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");let I=n.customerId===void 0?null:$.uuid().parse(n.customerId),h=0,a=null,c=null,k=new AbortController,V=n.fetch??globalThis.fetch;async function T(o,t,s,E,M){if(!m.capabilities.includes(o))throw new r("MERCHANT_BRIDGE_CAPABILITY_UNSUPPORTED",501);let _=ce[o];if(["merchant_catalog_reader","merchant_refund_authority","indiana_server_key"].includes(_.authority))throw new r("MERCHANT_BRIDGE_FORBIDDEN",403);let O=h,B=AbortSignal.any([k.signal,AbortSignal.timeout(Math.min(3e4,Math.max(1e3,n.timeoutMs??1e4))),...n.signal?[n.signal]:[],...E?[E]:[]]);B.throwIfAborted();let v=new Headers(await n.headers?.());if(B.throwIfAborted(),O!==h)throw new DOMException("Merchant identity changed","AbortError");if(/\bgg_(?:sk|ct|rt)_/.test(v.get("authorization")??"")||v.has("X-Indiana-Bridge-Signature")||v.has("X-Indiana-Bridge-Key-Id"))throw new r("MERCHANT_BRIDGE_FORBIDDEN",403);v.set(se,String(K)),v.set("Accept","application/json");let y=crypto.randomUUID();v.set("X-Request-Id",y),v.set("Content-Type","application/json");let f=await V(S+ie,{method:"POST",credentials:"include",redirect:"error",cache:"no-store",headers:v,signal:B,body:JSON.stringify({bridgeVersion:K,requestId:y,command:_.command,scope:L,data:M??(s===void 0?{}:{operationId:s})})}),D=await Ue(f,B);if(B.throwIfAborted(),O!==h)throw new DOMException("Merchant identity changed","AbortError");if(!f.ok){let g=ye.safeParse(D);throw!g.success||g.data.scope.projectId!==n.scope.projectId||g.data.scope.environment!==n.scope.environment||g.data.scope.environmentId!==n.scope.environmentId||g.data.requestId!==y||g.data.command!==_.command?new r("MERCHANT_BRIDGE_INVALID_RESPONSE",f.status):new r(g.data.error.code,f.status,g.data.error.retryable,g.data.error.recovery)}let R=le($.unknown()).safeParse(D);if(!R.success||R.data.scope.projectId!==n.scope.projectId||R.data.scope.environment!==n.scope.environment||R.data.scope.environmentId!==n.scope.environmentId||R.data.requestId!==y||R.data.command!==_.command)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE",f.status);let d=t.safeParse(R.data.data);if(!d.success)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE",f.status);return d.data}function w(){if(!I)throw new r("MERCHANT_BRIDGE_UNAUTHENTICATED",401);return I}async function G(o,t,s,E){let M=w(),_=he.parse({operationId:s,customerId:M}),O=await T(o,t,_.operationId,E,_);if(O.customerId!==M||O.operationId!==_.operationId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return O}return{async readPresentation(o){let t=await T("presentation",fe,void 0,o);if(c!==null&&c!==t.nativeUserId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(t.presentation&&I!==null&&t.presentation.customerId!==I)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return c=t.nativeUserId,a=t.presentation,t},async createSession(o){let t=await T("session",me,void 0,o);if(c!==null&&c!==t.nativeUserId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(I!==null&&I!==t.session.customerId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(a&&a.customerId!==t.session.customerId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return I=t.session.customerId,c=t.nativeUserId,t.session},async reportPresentation(o,t){let s=w(),E=pe.parse(o);if(!a||a.customerId!==s||a.decisionId!==E.decisionId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return T("presentation_events",$.strictObject({queued:$.literal(!0)}),void 0,t,E)},async readCustomerCommerce(o){let t=w(),s=await T("customer_commerce",Ie,void 0,o);if(s.customerId!==t)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return s},async executePurchase(o,t){let s=await G("purchases",J,o,t);if(s.type!=="purchase")throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");return s},readOperation:(o,t)=>G("operation_status",ae,o,t),async executeSubscriptionChange(o,t){let s=await G("subscription_changes",J,o,t);if(s.type!=="subscription_change")throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");return s},reset(){h++,k.abort(),k=new AbortController,I=null,a=null,c=null}}}function Ve(n){let S=_e(n.baseUrl),m=n.scope,L=Re(n),I=n.fetch??globalThis.fetch.bind(globalThis),h,a=!1,c=!1,k=0,V=0,T="",w=0,G=0,o=0,t,s=!1,E,M=!0,_,O,B,v,y,f,D=e=>{f===e&&(f=void 0,F())},R=new Set,d=(e,u)=>j(n.onStatus,e,u);function g(){let e=y;y=void 0,e?.host.destroy(),e?.client.reset(),F()}let Y=()=>Date.now()<G&&performance.now()<o;function Q(e){if(e.target.release!==n.appManifestRelease||!Y())return!1;try{return Z(e.target.render,document,location.pathname,()=>{})}catch{return d("incompatible",e.id),!1}}function z(e){if(a||e.epoch!==w||e.visit!==V||document.visibilityState==="hidden")return!1;try{return Z(e.target.render,document,location.pathname,()=>{})}catch{return!1}}async function W(e){if(f||y){d("in_progress",e.id);return}if(!n.session.peek()){d("identity_required",e.id);return}let u={command:we.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:w,visit:V,target:e.target};f=u,await ee(u)}async function ee(e){if(e.dispatching)return;e.dispatching=!0;let u,b=!1;async function N(l){if(e.epoch!==w)return;let p=l.view;p&&["running","waiting"].includes(p.status)&&await l.submit({operation:"close",requestId:crypto.randomUUID(),nodeId:p.nodeId,visit:p.visit,revision:p.revision})}try{d("starting",e.command.entryId);let l=await L.request("funnels",e.command),p=ve.safeParse(l);if(p.success){if(p.data.scope.projectId!==m.projectId||p.data.scope.environment!==m.environment)throw new A("SCOPE_MISMATCH","Entry scope changed");e.epoch===w&&d(p.data.reason,e.command.entryId),D(e);return}let C=ge.parse(l);if(!C.runToken||C.scope.projectId!==m.projectId||C.scope.environment!==m.environment||C.run.source.type!=="funnel"||C.run.source.id!==e.command.funnelId||C.run.source.versionId!==e.command.versionId)throw new A("INVALID_RESPONSE","Invalid entry Run");if(e.epoch!==w){D(e),d("identity_changed",e.command.entryId);return}let i=X({...n,runToken:C.runToken,funnelId:e.command.funnelId});u=i,await i.get();let P=i.view;if(!P||P.id!==C.run.id||P.source.type!=="funnel"||P.source.id!==e.command.funnelId||P.source.versionId!==e.command.versionId)throw new A("INVALID_RESPONSE","Entry Run version changed");if(!z(e)){await N(i),d("left_screen",e.command.entryId),D(e);return}let H=!1,q=!1,U=await Ae(n.container,{...n.host,client:i,appManifestRelease:n.appManifestRelease,onDismiss(x){H=!0,y?.client===i&&(y=void 0,i.reset(),F(),x&&x.status!=="completed"&&d("run_ended",e.command.entryId)),j(n.host?.onDismiss,x)},onComplete(x){q=!0,y?.client===i&&g(),j(n.host?.onComplete,x)},onError(x){j(n.host?.onError,x),y?.client===i&&x instanceof A&&x.code==="FORBIDDEN"&&(g(),d("run_ended",e.command.entryId))}});if(!z(e)||H||q){U.destroy(),z(e)||await N(i),D(e);return}y={host:U,client:i},b=!0,D(e),d("started",e.command.entryId)}catch(l){!u&&l instanceof A&&l.status!==void 0&&l.status>=400&&l.status<500&&!l.retryable&&D(e),e.epoch===w&&!a&&(d("start_failed",e.command.entryId),j(n.host?.onError,l))}finally{b||u?.reset(),e.dispatching=!1}}function Me(){if(s=!1,!(a||!c||document.visibilityState==="hidden")){if(!Y()){M=!0;return}M=!1;for(let e of h?.entries??[])if(!(e.event!=="screen_enter"||R.has(`${e.funnelId}:${e.id}`)||!Q(e))){if(!n.session.peek()){d("identity_required",e.id);continue}if(f||y){d("in_progress",e.id);return}R.add(`${e.funnelId}:${e.id}`),W(e);break}}}let F=()=>{!s&&!a&&(s=!0,queueMicrotask(Me))};function Ne(){let e=location.origin+location.pathname;e!==T&&(T=e,V++,M=!0,R.clear(),F())}function ne(e){if(!e.isTrusted||e.button!==0||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||document.visibilityState==="hidden")return;let u=e.target;if(!(u instanceof Element)||u.closest("[data-indiana-funnel]"))return;let b=u.closest("button,a,input");if(!(!b||b.matches(":disabled,[aria-disabled='true']")||b.closest("[hidden],[inert],[aria-hidden='true']")))for(let N of h?.entries??[]){let l=N.target.button;if(!(N.event!=="button_click"||!l||!Q(N))){try{let p=Ce(document);if(!b.matches(l.selector)||p(l.selector)!==1)continue}catch{d("incompatible",N.id);continue}W(N);break}}}async function te(){if(a)return;if(E)return E;let e=++k,u=new AbortController;_=u;let b,N=new Promise((C,i)=>{b=()=>i(new A("TIMEOUT","Funnel entry configuration read cancelled or timed out")),u.signal.addEventListener("abort",b,{once:!0})}),l=setTimeout(()=>u.abort(),n.timeoutMs??5e3),p=(async()=>{let C=async()=>{let U=await I(`${S}/api/v1/funnel-entries/${n.environmentId}?iam=${n.appManifestRelease}`,{credentials:"omit",cache:"no-store",redirect:"error",signal:u.signal});if(!U.ok)throw new A("SERVICE_UNAVAILABLE","Funnel entries unavailable",U.status);return Ee.parse(await U.json())},i=await Promise.race([C(),N]),P=Date.parse(i.validatedAt),H=Date.parse(i.validUntil);if(i.scope.projectId!==m.projectId||i.scope.environment!==m.environment||i.scope.environmentId!==n.environmentId||i.release!==n.appManifestRelease||H<=Date.now()||P>Date.now()+5e3||H-P>6e4||H<=P)throw new A("INVALID_RESPONSE","Entry configuration scope or deadline changed");if(a||e!==k)return;let q=h===void 0;h=i,G=H,o=performance.now()+Math.min(H-Date.now(),6e4),(q||M)&&F()})();E=p;try{await p}finally{clearTimeout(l),u.signal.removeEventListener("abort",b),E===p&&(E=void 0)}}async function re(){try{await te()}catch{a||d("configuration_unavailable")}a||(t=setTimeout(()=>{re()},15e3))}let oe=()=>F();return{async start(){c||a||(c=!0,T=location.origin+location.pathname,O=be(Ne),B=n.session.subscribeIdentity(()=>{w++,M=!0,f=void 0,R.clear(),g(),F()}),v=new MutationObserver(F),v.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",ne,!0),document.addEventListener("visibilitychange",oe),await re())},refresh:te,async retry(){f&&!a&&f.epoch===w&&await ee(f)},destroy(){a=!0,k++,clearTimeout(t),_?.abort(),v?.disconnect(),O?.(),B?.(),document.removeEventListener("click",ne,!0),document.removeEventListener("visibilitychange",oe),g(),h=void 0}}}async function rn(...n){return(await import("./paywall-EYRLWKC5.js")).showPaywall(...n)}async function on(...n){return(await import("./funnel-runtime-host-EHYY7OIZ.js")).showFunnelRun(...n)}async function an(...n){return(await import("./content-QPJOW6OT.js")).mountContent(...n)}async function sn(...n){return(await import("./content-QPJOW6OT.js")).prepareContent(...n)}export{A as IndianaError,A as LongplayError,r as MerchantBridgeError,xe as createBrowserFunnelCommandStorage,Fe as createConfigurationSync,Pe as createFeatureClient,Le as createFunnelClient,Ge as createFunnelPageExperiments,X as createFunnelRunController,Ve as createIamFunnelEntries,Se as createIndiana,ke as createLocalFunnelClient,Se as createLongplay,je as createMerchantBridge,Be as createPaywallSession,He as evaluateFunnelNode,Oe as formatCouponDiscount,Te as formatCouponMoney,De as formatCouponTerms,an as mountContent,sn as prepareContent,on as showFunnelRun,rn as showPaywall};
1
+ import{a as Ge,b as Ce}from"./chunk-VUWXU4FP.js";import"./chunk-MOWYD2TV.js";import{a as Pe,c as Le}from"./chunk-FRGIXMNP.js";import{a as He}from"./chunk-65WKEU2L.js";import{b as De,g as xe,l as X,m as Be,n as Fe,p as ke}from"./chunk-HV4THS52.js";import"./chunk-SBPTOOYB.js";import{F as Ne,G as Te,H as Oe,Ka as Ee,La as we,Ma as ve,Qa as Re,i as ae,k as K,l as ie,m as se,n as ce,o as de,p as ue,q as le,qa as ge,r as me,s as fe,t as pe,u as he,w as J,x as Ie,y as ye}from"./chunk-WCVK4OMS.js";import{qa as N}from"./chunk-ACF2FBUB.js";import{a as be,c as Z}from"./chunk-CLXORAOK.js";import"./chunk-EARSGITJ.js";import{c as Se,d as _e}from"./chunk-FXVZRIJ3.js";import{a as j}from"./chunk-DSPLGTQI.js";import"./chunk-G56XGVMS.js";import"./chunk-AWZFL4HE.js";import"./chunk-7DXL3LHT.js";import"./chunk-XSVQHPQT.js";import{z as $}from"zod";var r=class extends Error{constructor(m,L=0,I=!1,h="fix_request"){super(m);this.code=m;this.status=L;this.retryable=I;this.recovery=h;this.name="MerchantBridgeError"}code;status;retryable;recovery};async function Ue(n,S){if(!n.headers.get("content-type")?.split(";",1)[0].trim().match(/^application\/(?:json|[a-z0-9.+-]+\+json)$/i))throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");let m=n.body?.getReader();if(!m)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");let L=()=>{m.cancel().catch(()=>{})};S.addEventListener("abort",L,{once:!0});let I=0,h="",a=new TextDecoder("utf-8",{fatal:!0});try{for(S.throwIfAborted();;){let c=await m.read();if(S.throwIfAborted(),c.done)break;if(I+=c.value.byteLength,I>262144)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");h+=a.decode(c.value,{stream:!0})}return h+=a.decode(),JSON.parse(h)}catch(c){throw S.throwIfAborted(),c instanceof r?c:new r("MERCHANT_BRIDGE_INVALID_RESPONSE")}finally{S.removeEventListener("abort",L),await m.cancel().catch(()=>{}),m.releaseLock()}}function je(n){let S=de.parse(n.origin),m=ue.parse(n.manifest),L={projectId:n.scope.projectId,environmentId:n.scope.environmentId,environment:n.scope.environment};for(let o of["projectId","environmentId","environment"])if(m[o]!==n.scope[o])throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");let I=n.customerId===void 0?null:$.uuid().parse(n.customerId),h=0,a=null,c=null,k=new AbortController,V=n.fetch??globalThis.fetch;async function T(o,t,s,E,A){if(!m.capabilities.includes(o))throw new r("MERCHANT_BRIDGE_CAPABILITY_UNSUPPORTED",501);let _=ce[o];if(["merchant_catalog_reader","merchant_refund_authority","indiana_server_key"].includes(_.authority))throw new r("MERCHANT_BRIDGE_FORBIDDEN",403);let O=h,B=AbortSignal.any([k.signal,AbortSignal.timeout(Math.min(3e4,Math.max(1e3,n.timeoutMs??1e4))),...n.signal?[n.signal]:[],...E?[E]:[]]);B.throwIfAborted();let v=new Headers(await n.headers?.());if(B.throwIfAborted(),O!==h)throw new DOMException("Merchant identity changed","AbortError");if(/\bgg_(?:sk|ct|rt)_/.test(v.get("authorization")??"")||v.has("X-Indiana-Bridge-Signature")||v.has("X-Indiana-Bridge-Key-Id"))throw new r("MERCHANT_BRIDGE_FORBIDDEN",403);v.set(se,String(K)),v.set("Accept","application/json");let y=crypto.randomUUID();v.set("X-Request-Id",y),v.set("Content-Type","application/json");let f=await V(S+ie,{method:"POST",credentials:"include",redirect:"error",cache:"no-store",headers:v,signal:B,body:JSON.stringify({bridgeVersion:K,requestId:y,command:_.command,scope:L,data:A??(s===void 0?{}:{operationId:s})})}),D=await Ue(f,B);if(B.throwIfAborted(),O!==h)throw new DOMException("Merchant identity changed","AbortError");if(!f.ok){let g=ye.safeParse(D);throw!g.success||g.data.scope.projectId!==n.scope.projectId||g.data.scope.environment!==n.scope.environment||g.data.scope.environmentId!==n.scope.environmentId||g.data.requestId!==y||g.data.command!==_.command?new r("MERCHANT_BRIDGE_INVALID_RESPONSE",f.status):new r(g.data.error.code,f.status,g.data.error.retryable,g.data.error.recovery)}let R=le($.unknown()).safeParse(D);if(!R.success||R.data.scope.projectId!==n.scope.projectId||R.data.scope.environment!==n.scope.environment||R.data.scope.environmentId!==n.scope.environmentId||R.data.requestId!==y||R.data.command!==_.command)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE",f.status);let d=t.safeParse(R.data.data);if(!d.success)throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE",f.status);return d.data}function w(){if(!I)throw new r("MERCHANT_BRIDGE_UNAUTHENTICATED",401);return I}async function G(o,t,s,E){let A=w(),_=he.parse({operationId:s,customerId:A}),O=await T(o,t,_.operationId,E,_);if(O.customerId!==A||O.operationId!==_.operationId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return O}return{async readPresentation(o){let t=await T("presentation",fe,void 0,o);if(c!==null&&c!==t.nativeUserId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(t.presentation&&I!==null&&t.presentation.customerId!==I)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return c=t.nativeUserId,a=t.presentation,t},async createSession(o){let t=await T("session",me,void 0,o);if(c!==null&&c!==t.nativeUserId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(I!==null&&I!==t.session.customerId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");if(a&&a.customerId!==t.session.customerId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return I=t.session.customerId,c=t.nativeUserId,t.session},async reportPresentation(o,t){let s=w(),E=pe.parse(o);if(!a||a.customerId!==s||a.decisionId!==E.decisionId)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return T("presentation_events",$.strictObject({queued:$.literal(!0)}),void 0,t,E)},async readCustomerCommerce(o){let t=w(),s=await T("customer_commerce",Ie,void 0,o);if(s.customerId!==t)throw new r("MERCHANT_BRIDGE_SCOPE_MISMATCH");return s},async executePurchase(o,t){let s=await G("purchases",J,o,t);if(s.type!=="purchase")throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");return s},readOperation:(o,t)=>G("operation_status",ae,o,t),async executeSubscriptionChange(o,t){let s=await G("subscription_changes",J,o,t);if(s.type!=="subscription_change")throw new r("MERCHANT_BRIDGE_INVALID_RESPONSE");return s},reset(){h++,k.abort(),k=new AbortController,I=null,a=null,c=null}}}function Ve(n){let S=Se(n.baseUrl),m=n.scope,L=Re(n),I=n.fetch??globalThis.fetch.bind(globalThis),h,a=!1,c=!1,k=0,V=0,T="",w=0,G=0,o=0,t,s=!1,E,A=!0,_,O,B,v,y,f,D=e=>{f===e&&(f=void 0,F())},R=new Set,d=(e,u)=>j(n.onStatus,e,u);function g(){let e=y;y=void 0,e?.host.destroy(),e?.client.reset(),F()}let Y=()=>Date.now()<G&&performance.now()<o;function Q(e){if(e.target.release!==n.appManifestRelease||!Y())return!1;try{return Z(e.target.render,document,location.pathname,()=>{})}catch{return d("incompatible",e.id),!1}}function z(e){if(a||e.epoch!==w||e.visit!==V||document.visibilityState==="hidden")return!1;try{return Z(e.target.render,document,location.pathname,()=>{})}catch{return!1}}async function W(e){if(f||y){d("in_progress",e.id);return}if(!n.session.peek()){d("identity_required",e.id);return}let u={command:we.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:w,visit:V,target:e.target};f=u,await ee(u)}async function ee(e){if(e.dispatching)return;e.dispatching=!0;let u,b=!1;async function M(l){if(e.epoch!==w)return;let p=l.view;p&&["running","waiting"].includes(p.status)&&await l.submit({operation:"close",requestId:crypto.randomUUID(),nodeId:p.nodeId,visit:p.visit,revision:p.revision})}try{d("starting",e.command.entryId);let l=await L.request("funnels",e.command),p=ve.safeParse(l);if(p.success){if(p.data.scope.projectId!==m.projectId||p.data.scope.environment!==m.environment)throw new N("SCOPE_MISMATCH","Entry scope changed");e.epoch===w&&d(p.data.reason,e.command.entryId),D(e);return}let C=ge.parse(l);if(!C.runToken||C.scope.projectId!==m.projectId||C.scope.environment!==m.environment||C.run.source.type!=="funnel"||C.run.source.id!==e.command.funnelId||C.run.source.versionId!==e.command.versionId)throw new N("INVALID_RESPONSE","Invalid entry Run");if(e.epoch!==w){D(e),d("identity_changed",e.command.entryId);return}let i=X({...n,runToken:C.runToken,funnelId:e.command.funnelId});u=i,await i.get();let P=i.view;if(!P||P.id!==C.run.id||P.source.type!=="funnel"||P.source.id!==e.command.funnelId||P.source.versionId!==e.command.versionId)throw new N("INVALID_RESPONSE","Entry Run version changed");if(!z(e)){await M(i),d("left_screen",e.command.entryId),D(e);return}let H=!1,q=!1,U=await Ce(n.container,{...n.host,client:i,appManifestRelease:n.appManifestRelease,onDismiss(x){H=!0,y?.client===i&&(y=void 0,i.reset(),F(),x&&x.status!=="completed"&&d("run_ended",e.command.entryId)),j(n.host?.onDismiss,x)},onComplete(x){q=!0,y?.client===i&&g(),j(n.host?.onComplete,x)},onError(x){j(n.host?.onError,x),y?.client===i&&x instanceof N&&x.code==="FORBIDDEN"&&(g(),d("run_ended",e.command.entryId))}});if(!z(e)||H||q){U.destroy(),z(e)||await M(i),D(e);return}y={host:U,client:i},b=!0,D(e),d("started",e.command.entryId)}catch(l){!u&&l instanceof N&&l.status!==void 0&&l.status>=400&&l.status<500&&!l.retryable&&D(e),e.epoch===w&&!a&&(d("start_failed",e.command.entryId),j(n.host?.onError,l))}finally{b||u?.reset(),e.dispatching=!1}}function Ae(){if(s=!1,!(a||!c||document.visibilityState==="hidden")){if(!Y()){A=!0;return}A=!1;for(let e of h?.entries??[])if(!(e.event!=="screen_enter"||R.has(`${e.funnelId}:${e.id}`)||!Q(e))){if(!n.session.peek()){d("identity_required",e.id);continue}if(f||y){d("in_progress",e.id);return}R.add(`${e.funnelId}:${e.id}`),W(e);break}}}let F=()=>{!s&&!a&&(s=!0,queueMicrotask(Ae))};function Me(){let e=location.origin+location.pathname;e!==T&&(T=e,V++,A=!0,R.clear(),F())}function ne(e){if(!e.isTrusted||e.button!==0||e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||document.visibilityState==="hidden")return;let u=e.target;if(!(u instanceof Element)||u.closest("[data-indiana-funnel]"))return;let b=u.closest("button,a,input");if(!(!b||b.matches(":disabled,[aria-disabled='true']")||b.closest("[hidden],[inert],[aria-hidden='true']")))for(let M of h?.entries??[]){let l=M.target.button;if(!(M.event!=="button_click"||!l||!Q(M))){try{let p=be(document);if(!b.matches(l.selector)||p(l.selector)!==1)continue}catch{d("incompatible",M.id);continue}W(M);break}}}async function te(){if(a)return;if(E)return E;let e=++k,u=new AbortController;_=u;let b,M=new Promise((C,i)=>{b=()=>i(new N("TIMEOUT","Funnel entry configuration read cancelled or timed out")),u.signal.addEventListener("abort",b,{once:!0})}),l=setTimeout(()=>u.abort(),n.timeoutMs??5e3),p=(async()=>{let C=async()=>{let U=await I(`${S}/api/v1/funnel-entries/${n.environmentId}?iam=${n.appManifestRelease}`,{credentials:"omit",cache:"no-store",redirect:"error",signal:u.signal});if(!U.ok)throw new N("SERVICE_UNAVAILABLE","Funnel entries unavailable",U.status);return Ee.parse(await U.json())},i=await Promise.race([C(),M]),P=Date.parse(i.validatedAt),H=Date.parse(i.validUntil);if(i.scope.projectId!==m.projectId||i.scope.environment!==m.environment||i.scope.environmentId!==n.environmentId||i.release!==n.appManifestRelease||H<=Date.now()||P>Date.now()+5e3||H-P>6e4||H<=P)throw new N("INVALID_RESPONSE","Entry configuration scope or deadline changed");if(a||e!==k)return;let q=h===void 0;h=i,G=H,o=performance.now()+Math.min(H-Date.now(),6e4),(q||A)&&F()})();E=p;try{await p}finally{clearTimeout(l),u.signal.removeEventListener("abort",b),E===p&&(E=void 0)}}async function re(){try{await te()}catch{a||d("configuration_unavailable")}a||(t=setTimeout(()=>{re()},15e3))}let oe=()=>F();return{async start(){c||a||(c=!0,T=location.origin+location.pathname,O=_e(Me),B=n.session.subscribeIdentity(()=>{w++,A=!0,f=void 0,R.clear(),g(),F()}),v=new MutationObserver(F),v.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",ne,!0),document.addEventListener("visibilitychange",oe),await re())},refresh:te,async retry(){f&&!a&&f.epoch===w&&await ee(f)},destroy(){a=!0,k++,clearTimeout(t),_?.abort(),v?.disconnect(),O?.(),B?.(),document.removeEventListener("click",ne,!0),document.removeEventListener("visibilitychange",oe),g(),h=void 0}}}async function rn(...n){return(await import("./paywall-XQG2D3PA.js")).showPaywall(...n)}async function on(...n){return(await import("./funnel-runtime-host-DDBGBB5L.js")).showFunnelRun(...n)}async function an(...n){return(await import("./content-ZQNYKPZT.js")).mountContent(...n)}async function sn(...n){return(await import("./content-ZQNYKPZT.js")).prepareContent(...n)}export{N as LongplayError,r as MerchantBridgeError,xe as createBrowserFunnelCommandStorage,Fe as createConfigurationSync,De as createFeatureClient,Le as createFunnelClient,Ge as createFunnelPageExperiments,X as createFunnelRunController,Ve as createIamFunnelEntries,ke as createLocalFunnelClient,Pe as createLongplay,je as createMerchantBridge,Be as createPaywallSession,He as evaluateFunnelNode,Te as formatCouponDiscount,Ne as formatCouponMoney,Oe as formatCouponTerms,an as mountContent,sn as prepareContent,on as showFunnelRun,rn as showPaywall};