@tinkerlandai/indiana-sdk 0.8.5 → 0.9.2

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 (64) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +20 -41
  3. package/README.zh-CN.md +17 -17
  4. package/dist/{ai-usage-DUlre7JC.d.ts → ai-usage-DMNKvCiq.d.ts} +3 -3
  5. package/dist/{api-XDc4pRlN.d.ts → api--Zf0gxfj.d.ts} +128 -124
  6. package/dist/chunk-3PZ4Y6UD.js +17 -0
  7. package/dist/chunk-5O667MKA.js +1 -0
  8. package/dist/chunk-65TBYVCS.js +1 -0
  9. package/dist/chunk-67A7I6MB.js +1 -0
  10. package/dist/chunk-7DXL3LHT.js +1 -0
  11. package/dist/chunk-CCQHYQ4P.js +1 -0
  12. package/dist/chunk-CPLLMISZ.js +1 -0
  13. package/dist/chunk-G23YNWWI.js +1 -0
  14. package/dist/chunk-G56XGVMS.js +1 -0
  15. package/dist/chunk-L7LKE3MG.js +173 -0
  16. package/dist/chunk-NH2PTTNK.js +2 -0
  17. package/dist/chunk-PK5HYUHD.js +1 -0
  18. package/dist/chunk-SEW4YVR7.js +1 -0
  19. package/dist/chunk-UYSOTMY3.js +1 -0
  20. package/dist/{chunk-WWUUVURR.js → chunk-WSVH6IQA.js} +1 -1
  21. package/dist/chunk-YZSQDZXW.js +4 -0
  22. package/dist/{configuration-sync-Ce3dShy7.d.ts → configuration-sync-E98CqVwh.d.ts} +6 -5
  23. package/dist/content-3LOJVYQO.js +1 -0
  24. package/dist/{errors-C8lRYZ0n.d.ts → errors-0TSUIbUi.d.ts} +12 -1
  25. package/dist/{funnel-local-client-CUGavICI.d.ts → funnel-local-client-BjPwXlQb.d.ts} +550 -260
  26. package/dist/funnel-runtime-host-NYHKQT6T.js +1 -0
  27. package/dist/index.d.ts +689 -223
  28. package/dist/index.js +1 -1
  29. package/dist/native-shell.js +1 -1
  30. package/dist/openrouter.d.ts +3 -3
  31. package/dist/openrouter.js +1 -1
  32. package/dist/page.d.ts +6 -6
  33. package/dist/page.js +1 -1
  34. package/dist/paywall-ISCYOGPZ.js +1 -0
  35. package/dist/popup.d.ts +1 -1
  36. package/dist/popup.js +1 -1
  37. package/dist/react-native.d.ts +122 -99
  38. package/dist/react-native.js +1 -1
  39. package/dist/screen-renderer-A6VYE2QL.js +1 -0
  40. package/dist/server.d.ts +58 -58
  41. package/dist/server.js +1 -1
  42. package/dist/visual.d.ts +36 -1
  43. package/dist/visual.js +1 -2
  44. package/package.json +1 -1
  45. package/dist/chunk-3KQHKRZJ.js +0 -1
  46. package/dist/chunk-6A5WWFNS.js +0 -10
  47. package/dist/chunk-A3XRIG53.js +0 -1
  48. package/dist/chunk-BUDTHBFF.js +0 -173
  49. package/dist/chunk-FGIGKO7A.js +0 -1
  50. package/dist/chunk-GRLMT5PR.js +0 -1
  51. package/dist/chunk-HEBQUICQ.js +0 -4
  52. package/dist/chunk-KQCTDXVD.js +0 -17
  53. package/dist/chunk-LMR2TM3X.js +0 -1
  54. package/dist/chunk-OBYJWIRB.js +0 -1
  55. package/dist/chunk-RRII2DMC.js +0 -1
  56. package/dist/chunk-SOQO2RDZ.js +0 -1
  57. package/dist/chunk-SUXAWRR6.js +0 -1
  58. package/dist/chunk-VVV3JNS3.js +0 -1
  59. package/dist/content-DDMDNRCV.js +0 -1
  60. package/dist/funnel-runtime-host-QK6WDRPS.js +0 -1
  61. package/dist/paywall-4QT3JYD4.js +0 -1
  62. package/dist/screen-renderer-DLXDQQKK.js +0 -1
  63. package/dist/src-EG7RWDDY.js +0 -1
  64. package/dist/{screen-BpAejkn0.d.ts → screen-BITZ11jn.d.ts} +18 -18
package/dist/visual.js CHANGED
@@ -1,2 +1 @@
1
- import{a as he,b as be,c as ve,d as ye,e as we,f as Ee,g as Me,i as Ae}from"./chunk-HEBQUICQ.js";import"./chunk-DSPLGTQI.js";import"./chunk-OBYJWIRB.js";import"./chunk-WWUUVURR.js";import"./chunk-RRII2DMC.js";import{h as me,k as ge,m as G}from"./chunk-KQCTDXVD.js";function H(e,t=()=>{}){let r=new WeakMap,n=0,i=l=>{let a=r.get(l);if(a!==void 0)return a;let o=[],u=l,c=!0;for(;u;){let m=r.get(u);if(m!==void 0){c=m;break}if(++n>8192||o.length>=256)throw Error("IAM render ancestry budget exceeded");if(o.push(u),t(),u.hasAttribute("hidden")||/(?:^|;)\s*display\s*:\s*none\s*(?:!\s*important\s*)?(?:;|$)/i.test(u.getAttribute("style")??"")){c=!1;break}u=u.parentElement}for(let m of o)r.set(m,c);return c};return l=>{let a=0,o=e.querySelectorAll(l);for(let u=0;u<o.length;u++){let c=o[u];if(!c)throw Error("IAM render selection changed");i(c)&&a++,t()}return a}}var Je=e=>!!e&&typeof e=="object"&&!Array.isArray(e);function F(e){if(!Je(e)||Object.keys(e).some(l=>!["schemaVersion","renderKey","routeTemplate","selectors","present","absent"].includes(l))||e.schemaVersion!==1||typeof e.renderKey!="string"||!e.renderKey||e.renderKey.length>256||typeof e.routeTemplate!="string"||!e.routeTemplate.startsWith("/")||e.routeTemplate.length>2048||!Array.isArray(e.selectors)||e.selectors.length>512||e.selectors.some(l=>typeof l!="string"||l.length>512||!/^[a-z][a-z0-9-]*\[(?:id|data-testid|data-test|data-qa|data-indiana-id)="(?:[^"\\\x00-\x1f\x7f]|\\["\\])*"\]$/.test(l))||!Array.isArray(e.present)||!Array.isArray(e.absent))throw new Error("Invalid IAM render guard");if(e.present.length===0)throw Error("IAM render needs positive source evidence");let t=e.selectors,r=e.present,n=e.absent,i=[...r,...n];if(new Set(t).size!==t.length||i.length!==t.length||new Set(i).size!==i.length||i.some(l=>typeof l!="number"||!Number.isInteger(l)||l<0||l>=t.length))throw new Error("Invalid IAM render signature");return{schemaVersion:1,renderKey:e.renderKey,routeTemplate:e.routeTemplate,selectors:e.selectors,present:e.present,absent:e.absent}}function Ge(e,t){let r=e.split("/").filter(Boolean),n="";for(let i of r)/^\[\[\.\.\.[^\[\]]+\]\]$/.test(i)?n+="(?:/[^/]+)*":/^\[\.\.\.[^\[\]]+\]$/.test(i)?n+="(?:/[^/]+)+":/^\[[^\[\]]+\]$/.test(i)?n+="/[^/]+":n+="/"+i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp("^"+(n?n+"/?":"/")+"$").test(t)&&!/[\[\]]/.test(t)}function Ve(e,t,r,n,i=H(t,n)){if(!Ge(e.routeTemplate,r))return!1;let l=new Set(e.present),a=!0;for(let o=0;o<e.selectors.length;o++){let u=i(e.selectors[o]);if(l.has(o)&&u>1)throw new Error("IAM render anchor is ambiguous");(l.has(o)?u!==1:u!==0)&&(a=!1),n()}return a}var z=class extends Error{constructor(){super("IAM page check exceeded its work budget")}},te=new WeakMap,re=new WeakSet;function ne(e){re.add(e)}function Ue(e){let t=new Set,r=new Set,n,i=0,l=!1,a=0,o,u=()=>{t.size||i||(n?.disconnect(),o!==void 0&&cancelAnimationFrame(o),e.removeEventListener("visibilitychange",d),te.delete(e))};function c(g){if(e.hidden)return;let M=performance.now(),w=new Map,v=new Map,y=()=>{if(performance.now()-M>8)throw new z},L=s=>{y();let p=w.get(s);return p||(p=e.querySelectorAll(s),w.set(s,p)),y(),p},A=H({querySelectorAll:L},y),I=s=>{let p=s.filter(R=>!w.has(R));if(!p.length)return;let f=new Map;for(let R of p){let S=/^([a-z][a-z0-9-]*)\[(id|data-testid|data-test|data-qa|data-indiana-id)="((?:[^"\\\x00-\x1f\x7f]|\\["\\])*)"\]$/.exec(R);if(!S)throw Error("Invalid IAM render selector");let[,x,B,b]=S,k=b.replace(/\\(["\\])/g,"$1"),T=f.get(x);T||f.set(x,T=new Map);let j=T.get(B);j||T.set(B,j=new Map);let E=j.get(k);E||j.set(k,E=[]),w.set(R,E)}y();let h=e.querySelectorAll(p.join(","));if(y(),h.length>8192)throw Error("IAM render selection budget exceeded");for(let R of h){let S=f.get(R.localName.toLowerCase());if(S)for(let[x,B]of S){let b=R.getAttribute(x);b!==null&&B.get(b)?.push(R)}y()}},V={query:L,checkpoint:y,matches(s,p){let f=v.get(p);if(!f){try{let h=!1;f={match:Ve(s,e,location.pathname,y,R=>(h||(I(s.selectors),h=!0),A(R)))}}catch(h){f={error:h}}v.set(p,f)}if("error"in f)throw f.error;return f.match}},q=[],O=[],D=[];for(let s of g)if(t.has(s))try{q.push({job:s,commit:s.prepare(V)})}catch(p){if(p instanceof z)throw p;O.push({job:s,error:p})}y();for(let{job:s,error:p}of O)t.has(s)&&s.fail(p);for(let{job:s,commit:p}of q)if(t.has(s))try{y(),p(f=>D.push(f))}catch(f){if(f instanceof z)throw f;s.fail(f)}for(let s of D)s()}function m(g){if(!(o!==void 0||e.hidden))try{c(g),a=0}catch(M){if(!(M instanceof z))throw M;for(let w of[...t])w.suspend();if(a++>=2){for(let w of[...t])w.fail(M);return}o=requestAnimationFrame(()=>{o=void 0,m([...t])})}}function d(){l||!t.size||e.hidden||(l=!0,queueMicrotask(()=>{l=!1,m([...t])}))}return{begin(){i++},end(){--i===0&&(r.clear(),m([...t])),u()},add(g){return n||(n=new MutationObserver(M=>{let w=v=>re.has(v)||!!(v.parentNode&&re.has(v.parentNode));M.some(v=>!w(v.target)&&!(v.type==="childList"&&[...v.addedNodes,...v.removedNodes].length>0&&[...v.addedNodes,...v.removedNodes].every(w)))&&d()}),n.observe(e.documentElement,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["style","hidden","data-indiana-id","data-indiana-release","data-testid","id","name"]}),e.addEventListener("visibilitychange",d)),t.add(g),i?r.add(g):m([g]),()=>{t.delete(g),r.delete(g),u()}}}}function Se(){let e=te.get(document);return e||(e=Ue(document),te.set(document,e)),e}function ke(e){return Se().add(e)}function Ie(e){let t=Se();t.begin();try{e()}finally{t.end()}}async function $e(e,t,r){let n=new URL(e,t.baseURI),i=t.defaultView?.location.origin,l=/^\/\.well-known\/indiana\/releases\/([a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12})\.json$/.exec(n.pathname)?.[1];if(!l||n.origin!==i||n.search||n.hash||n.username||n.password)throw Error("Invalid IAM release URL");let a=AbortSignal.any([r,AbortSignal.timeout(2e3)]),o=await fetch(n,{credentials:"omit",redirect:"error",cache:"force-cache",signal:a}),u=o.headers.get("content-length");if(!o.ok||!/^application\/json(?:;|$)/i.test(o.headers.get("content-type")??"")||u!==null&&(!/^\d+$/.test(u)||Number(u)>512))throw o.body?.cancel().catch(()=>{}),Error("IAM release is unavailable");let c=o.body?.getReader();if(!c)throw Error("IAM release is unavailable");let m=[],d=0,g=()=>{},M=new Promise((I,V)=>{g=()=>V(Error("IAM release timeout")),a.addEventListener("abort",g,{once:!0}),a.aborted&&g()}),w=!1;try{for(;;){let I=await Promise.race([c.read(),M]);if(I.done){w=!0;break}if(d+=I.value.length,d>512)throw Error("IAM release budget");m.push(I.value)}}finally{a.removeEventListener("abort",g),w||c.cancel().catch(()=>{}),c.releaseLock()}let v=new Uint8Array(d),y=0;for(let I of m)v.set(I,y),y+=I.length;let L=new TextDecoder("utf-8",{fatal:!0}).decode(v),A=JSON.parse(L);if(L.trim()!==JSON.stringify(A))throw Error("Noncanonical IAM release descriptor");if(!A||typeof A!="object"||Array.isArray(A)||Object.keys(A).sort().join(",")!=="format,manifestDigest,releaseId,schemaVersion"||Reflect.get(A,"format")!=="indiana-app-manifest-release"||Reflect.get(A,"schemaVersion")!==2||Reflect.get(A,"releaseId")!==l||!/^[a-f0-9]{64}$/.test(String(Reflect.get(A,"manifestDigest"))))throw Error("Invalid IAM release descriptor");return Reflect.get(A,"manifestDigest")}var ie=new WeakMap;function Re(e,t=document){if(!/^[a-f0-9]{64}$/.test(e))throw new Error("Invalid IAM manifest digest");let r="data-indiana-release",n=t.documentElement,i=()=>new Set((n.getAttribute(r)??"").split(/\s+/).filter(Boolean)),l=ie.get(t);if(!l){let m=new Map,d=new MutationObserver(()=>{let g=i(),M=!1;for(let[w,v]of m)v.count&&!g.has(w)&&(g.add(w),M=!0);M&&n.setAttribute(r,[...g].join(" "))});d.observe(n,{attributes:!0,attributeFilter:[r]}),l={releases:m,observer:d},ie.set(t,l)}let{releases:a,observer:o}=l,u=a.get(e);if(!u){let m=i();u={count:0,owned:!m.has(e)},a.set(e,u),m.add(e),n.setAttribute(r,[...m].join(" "))}u.count++;let c=!1;return{attributes:{indianaAppManifestRelease:e},destroy(){if(!c&&(c=!0,u.count--,!u.count&&(a.delete(e),a.size||(o.disconnect(),ie.delete(t)),u.owned))){let m=i();m.delete(e),m.size?n.setAttribute(r,[...m].join(" ")):n.removeAttribute(r)}}}}var He=/^[a-zA-Z:_][a-zA-Z0-9:_.-]*$/,ae={revert:function(){}},Z=new Map,le=new Set;function Fe(e){return e==="html"?{childList:!0,subtree:!0,attributes:!0,characterData:!0}:{childList:!1,subtree:!1,attributes:!0,attributeFilter:[e]}}function _(e){var t=Z.get(e);return t||(t={element:e,attributes:{}},Z.set(e,t)),t}function Q(e,t,r,n,i){var l=r(e),a={isDirty:!1,originalValue:l,virtualValue:l,mutations:[],el:e,_positionTimeout:null,observer:new MutationObserver(function(){if(!ft&&!(t==="position"&&a._positionTimeout)){t==="position"&&(a._positionTimeout=setTimeout(function(){a._positionTimeout=null},1e3));var o=r(e);t==="position"&&o.parentNode===a.virtualValue.parentNode&&o.insertBeforeNode===a.virtualValue.insertBeforeNode||o!==a.virtualValue&&(a.originalValue=o,i(a))}}),mutationRunner:i,setValue:n,getCurrentValue:r};return t==="position"&&e.parentNode?a.observer.observe(e.parentNode,{childList:!0,subtree:!0,attributes:!1,characterData:!1}):a.observer.observe(e,Fe(t)),a}function X(e,t){var r=t.getCurrentValue(t.el);t.virtualValue=e,e&&typeof e!="string"?(!r||e.parentNode!==r.parentNode||e.insertBeforeNode!==r.insertBeforeNode)&&(t.isDirty=!0,xe()):e!==r&&(t.isDirty=!0,xe())}function We(e){var t=e.originalValue;e.mutations.forEach(function(r){return t=r.mutate(t)}),X(at(t),e)}function Ke(e){var t=new Set(e.originalValue.split(/\s+/).filter(Boolean));e.mutations.forEach(function(r){return r.mutate(t)}),X(Array.from(t).filter(Boolean).join(" "),e)}function Ye(e){var t=e.originalValue;e.mutations.forEach(function(r){return t=r.mutate(t)}),X(t,e)}function Ze(e){var t=e.parentSelector,r=e.insertBeforeSelector,n=document.querySelector(t);if(!n)return null;var i=r?document.querySelector(r):null;return r&&!i?null:{parentNode:n,insertBeforeNode:i}}function _e(e){var t=e.originalValue;e.mutations.forEach(function(r){var n=r.mutate(),i=Ze(n);t=i||t}),X(t,e)}var Qe=function(t){return t.innerHTML},Xe=function(t,r){return t.innerHTML=r};function Ne(e){var t=_(e);return t.html||(t.html=Q(e,"html",Qe,Xe,We)),t.html}var et=function(t){return{parentNode:t.parentElement,insertBeforeNode:t.nextElementSibling}},tt=function(t,r){r.insertBeforeNode&&!r.parentNode.contains(r.insertBeforeNode)||r.parentNode.insertBefore(t,r.insertBeforeNode)};function Le(e){var t=_(e);return t.position||(t.position=Q(e,"position",et,tt,_e)),t.position}var rt=function(t,r){return r?t.className=r:t.removeAttribute("class")},nt=function(t){return t.className};function Oe(e){var t=_(e);return t.classes||(t.classes=Q(e,"class",nt,rt,Ke)),t.classes}var it=function(t){return function(r){var n;return(n=r.getAttribute(t))!=null?n:null}},ot=function(t){return function(r,n){return n!==null?r.setAttribute(t,n):r.removeAttribute(t)}};function De(e,t){var r=_(e);return r.attributes[t]||(r.attributes[t]=Q(e,t,it(t),ot(t),Ye)),r.attributes[t]}function st(e,t){var r=Z.get(e);if(r)if(t==="html"){var n,i;(n=r.html)==null||(i=n.observer)==null||i.disconnect(),delete r.html}else if(t==="class"){var l,a;(l=r.classes)==null||(a=l.observer)==null||a.disconnect(),delete r.classes}else if(t==="position"){var o,u;(o=r.position)==null||(u=o.observer)==null||u.disconnect(),delete r.position}else{var c,m,d;(c=r.attributes)==null||(m=c[t])==null||(d=m.observer)==null||d.disconnect(),delete r.attributes[t]}}var W;function at(e){return W||(W=document.createElement("div")),W.innerHTML=e,W.innerHTML}function K(e,t,r){if(r.isDirty){r.isDirty=!1;var n=r.virtualValue;r.mutations.length||st(e,t),r.setValue(e,n)}}function lt(e,t){e.html&&K(t,"html",e.html),e.classes&&K(t,"class",e.classes),e.position&&K(t,"position",e.position),Object.keys(e.attributes).forEach(function(r){K(t,r,e.attributes[r])})}function xe(){Z.forEach(lt)}function ut(e,t){var r=null;e.kind==="html"?r=Ne(t):e.kind==="class"?r=Oe(t):e.kind==="attribute"?r=De(t,e.attribute):e.kind==="position"&&(r=Le(t)),r&&(r.mutations.push(e),r.mutationRunner(r))}function ct(e,t){var r=null;if(e.kind==="html"?r=Ne(t):e.kind==="class"?r=Oe(t):e.kind==="attribute"?r=De(t,e.attribute):e.kind==="position"&&(r=Le(t)),!!r){var n=r.mutations.indexOf(e);n!==-1&&r.mutations.splice(n,1),r.mutationRunner(r)}}function qe(e){if(!(e.kind==="position"&&e.elements.size===1)){var t=new Set(e.elements),r=document.querySelectorAll(e.selector);r.forEach(function(n){t.has(n)||(e.elements.add(n),ut(e,n))})}}function dt(e){e.elements.forEach(function(t){return ct(e,t)}),e.elements.clear(),le.delete(e)}function Te(){le.forEach(qe)}var ft=!1;var oe;function pt(){typeof document>"u"||(oe||(oe=new MutationObserver(function(){Te()})),Te(),oe.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!1,characterData:!1}))}pt();function ee(e){return typeof document>"u"?ae:(le.add(e),qe(e),{revert:function(){dt(e)}})}function se(e,t){return ee({kind:"html",elements:new Set,mutate:t,selector:e})}function Be(e,t){return ee({kind:"position",elements:new Set,mutate:t,selector:e})}function U(e,t){return ee({kind:"class",elements:new Set,mutate:t,selector:e})}function Y(e,t,r){return He.test(t)?t==="class"||t==="className"?U(e,function(n){var i=r(Array.from(n).join(" "));n.clear(),i&&i.split(/\s+/g).filter(Boolean).forEach(function(l){return n.add(l)})}):ee({kind:"attribute",attribute:t,elements:new Set,mutate:r,selector:e}):ae}function mt(e){var t=e.selector,r=e.action,n=e.value,i=e.attribute,l=e.parentSelector,a=e.insertBeforeSelector;if(i==="html"){if(r==="append")return se(t,function(o){return o+(n??"")});if(r==="set")return se(t,function(){return n??""})}else if(i==="class"){if(r==="append")return U(t,function(o){n&&o.add(n)});if(r==="remove")return U(t,function(o){n&&o.delete(n)});if(r==="set")return U(t,function(o){o.clear(),n&&o.add(n)})}else if(i==="position"){if(r==="set"&&l)return Be(t,function(){return{insertBeforeSelector:a,parentSelector:l}})}else{if(r==="append")return Y(t,i,function(o){return o!==null?o+(n??""):n??""});if(r==="set")return Y(t,i,function(){return n??""});if(r==="remove")return Y(t,i,function(){return null})}return ae}var gt={html:se,classes:U,attribute:Y,position:Be,declarative:mt},ue=gt;import ht from"dompurify";var ce,je;function bt(e){return(!ce||je!==window)&&(ce=ht(window),je=window),ce.sanitize(e,{USE_PROFILES:{html:!0},FORBID_TAGS:["form","input","textarea","select","button","style"]})}function Pe(e){let t={...e};if(!["html","class","style","position","href","src","alt","title","id","role","hidden"].includes(t.attribute)&&!/^(aria|data)-[a-z0-9_-]+$/.test(t.attribute))throw new Error("Unsupported visual attribute");document.querySelector(t.selector);for(let r of document.querySelectorAll(t.selector))if(["SCRIPT","IFRAME","OBJECT","EMBED","HTML","HEAD"].includes(r.tagName)||r.tagName==="BODY"&&t.attribute==="html")throw new Error("Protected visual target");if(t.attribute==="html"&&(t.value=bt(t.value??"")),["href","src"].includes(t.attribute)&&t.action!=="remove"){let r=new URL(t.value??"",location.href);if(!["https:","http:","mailto:","tel:"].includes(r.protocol)||t.attribute==="src"&&!["https:","http:"].includes(r.protocol))throw new Error("Unsafe visual URL")}return t.parentSelector&&document.querySelector(t.parentSelector),t.insertBeforeSelector&&document.querySelector(t.insertBeforeSelector),t}function Ce(e,t={}){if(e.renderGuard&&!t.requireUniqueTargets)throw new Error("IAM render guard requires the source release fence");if(t.requireUniqueTargets)return vt(e,t);let r=e.domMutations.map(Pe),n=[],i=!1,l=!1,a,o=()=>{if(!i){i=!0,a?.disconnect();for(let c of n.reverse())c()}},u=()=>{i||l||(!r.length||e.css||t.allowJs&&e.js||r.some(c=>document.querySelector(c.selector)))&&(l=!0,t.onApplied?.())};try{if(e.css){let d=document.createElement("style");t.nonce&&(d.nonce=t.nonce),d.textContent=e.css,document.head.append(d),n.push(()=>d.remove())}for(let d of r){let g=ue.declarative(d);n.push(()=>g.revert())}if(t.allowJs&&e.js){let d=document.createElement("script");t.nonce&&(d.nonce=t.nonce),d.textContent=e.js,document.head.append(d),n.push(()=>d.remove())}let c=performance.now(),m=new WeakMap;a=new MutationObserver(d=>{if(!i){performance.now()-c>1e3&&(c=performance.now(),m=new WeakMap);for(let g of d){let M=(m.get(g.target)??0)+1;if(m.set(g.target,M),M>40){o(),t.onError?.(new Error("Visual changes conflict with repeated page rendering"));return}}u()}}),a.observe(document.documentElement,{subtree:!0,childList:!0,attributes:!0,characterData:!0}),u()}catch(c){throw o(),c}return{revert:o,get applied(){return l}}}function vt(e,t){let r=t?.boundVariations??[e],n=new Set,i=new Set,l=[],a=new Map,o=r.flatMap(s=>s.renderGuard?[F(s.renderGuard)]:[]),u=o[0];if(o.some(s=>JSON.stringify(s)!==JSON.stringify(u)))throw new Error("IAM variations use different render states");if(e.js||r.some(s=>s.js))throw Error("IAM scripts cannot execute");if(r.length>20||r.reduce((s,p)=>s+p.css.length,0)>262144)throw Error("IAM target budget");let c=(s,p)=>{for(let h of s.domMutations){if(h.action!=="set"||h.attribute!=="html")throw Error("Unsupported IAM mutation");n.add(h.selector),i.add(h.selector)}if(!s.css)return;let f=document.createElement("style");ne(f),f.media="not all",t?.nonce&&(f.nonce=t.nonce),f.textContent=s.css;try{if(document.head.append(f),!f.sheet)throw Error("IAM CSS is blocked");for(let h of f.sheet.cssRules){if(!("selectorText"in h)||typeof h.selectorText!="string")throw Error("Unsupported IAM style rule");n.add(h.selectorText),p&&l.push({selector:h.selectorText,css:h.cssText})}}finally{f.remove()}};for(let s of r)c(s,!1);if(c(e,!0),n.size>200)throw Error("IAM target budget");let m=e.domMutations.map(Pe),d=!1,g=!1,M=!1,w=!1,v="",y=0,L=(s,p)=>{let f=`${s}:${p}`;if(!(!t?.onTargetStatus||f===v||y>=32)){v=f,y++;try{t.onTargetStatus({status:s,total:n.size,matched:p})}catch{}}},A={},I=u?JSON.stringify(u):"",V,q="",O=()=>{if(!d){d=!0,A.unsubscribe?.();for(let s of a.values())s.revert();a.clear(),V?.remove(),V=void 0,g=!1}},D=()=>{for(let s of a.values())s.revert();a.clear(),V?.remove(),V=void 0,q="",g=!1};return A.unsubscribe=ke({suspend:D,fail(s){O(),t?.onError?.(s)},prepare(s){if(u&&!s.matches(u,I))return f=>{d||(D(),w=!1,f(()=>{d||L("inactive",null)}))};let p=new Map;for(let f of n){let h=s.query(f);if(h.length>1)throw Error("IAM target is ambiguous in this rendered state");if(h.length){if(i.has(f)&&h[0].children.length)throw Error("IAM text target is no longer a leaf");p.set(f,h[0])}s.checkpoint()}return f=>{if(d)return;for(let[S,x]of a)p.get(S)!==x.element&&(x.revert(),a.delete(S));for(let S of new Set(m.map(x=>x.selector))){let x=p.get(S);if(!x||a.has(S))continue;let B=m.filter(b=>b.selector===S).map(b=>ue.declarative(b));a.set(S,{element:x,revert:()=>B.forEach(b=>b.revert())})}let h=l.filter(S=>p.has(S.selector)).map(S=>S.css).join(`
2
- `);h!==q&&(q=h,h?(V||(V=document.createElement("style"),ne(V),t?.nonce&&(V.nonce=t.nonce),document.head.append(V)),V.textContent=h):(V?.remove(),V=void 0)),g=n.size===0||p.size>0;let R=p.size===n.size?"matched":p.size>0?"partial":w?"missing":"waiting";p.size&&(w=!0),f(()=>{d||L(R,p.size)}),g&&!M&&f(()=>{!d&&g&&!M&&(M=!0,t?.onApplied?.())})}}}),d&&A.unsubscribe(),{revert:O,get applied(){return g}}}var $=e=>!!e&&typeof e=="object"&&!Array.isArray(e),J=(e,t)=>typeof e=="string"&&e.length<=t,yt=e=>typeof e=="string"&&(["html","class","style","position","href","src","alt","title","id","role","hidden"].includes(e)||/^(aria|data)-[a-z0-9_-]+$/.test(e));function wt(e){if(!$(e)||!J(e.css??"",1e5)||!J(e.js??"",1e5)||!Array.isArray(e.domMutations??[])||Array.isArray(e.domMutations)&&e.domMutations.length>200)throw new Error("Invalid visual variation");let t=e.domMutations??[];for(let r of t)if(!$(r)||!J(r.selector,2048)||!r.selector||!yt(r.attribute)||!["set","append","remove"].includes(String(r.action))||r.value!==void 0&&!J(r.value,5e4)||r.parentSelector!==void 0&&!J(r.parentSelector,2048)||r.insertBeforeSelector!==void 0&&!J(r.insertBeforeSelector,2048))throw new Error("Invalid visual mutation");return{css:e.css??"",js:e.js??"",domMutations:t,...e.renderGuard===void 0?{}:{renderGuard:F(e.renderGuard)}}}function ze(e){if(!$(e)||typeof e.environmentId!="string"||typeof e.trackExposures!="boolean"||!/^[-a-f0-9]{36}$/i.test(e.environmentId)||typeof e.generation!="string"||!/^[a-f0-9]{64}$/.test(e.generation)||!Array.isArray(e.experiments)||e.experiments.length>100||!$(e.savedGroups))throw new Error("Invalid visual experiment payload");let t=e.experiments.map(r=>{if(!$(r)||!["key","changeId"].every(n=>typeof r[n]=="string"&&r[n])||!/^[a-f0-9]{64}$/.test(String(r.changeId))||["namespace","status","groups","url"].some(n=>Object.hasOwn(r,n))||r.hashVersion!==void 0&&r.hashVersion!==2||!Array.isArray(r.variations)||r.variations.length<2||r.variations.length>20||r.urlPatterns!==void 0&&!Array.isArray(r.urlPatterns))throw new Error("Invalid visual experiment");return{...r,variations:r.variations.map(wt)}});return{...e,experiments:t}}function Ht(e){let t=ve(e.baseUrl);if(e.appManifestRelease!==void 0&&!/^[a-f0-9]{64}$/.test(e.appManifestRelease))throw new Error("Invalid IAM manifest digest");if(!/^[0-9a-f-]{36}$/i.test(e.environmentId))throw new Error("Invalid App environment ID");let r=e.fetch??globalThis.fetch.bind(globalThis),n=Me(r),i=`${t}/api/v1/visual-experiments/${e.environmentId}`,l=e.appManifestRelease?`${i}?iam=${e.appManifestRelease}`:i,a=he(e.deviceIdCookie??"indiana_did"),o=be(),u=null,c=!1,m=!1,d="",g={...e.attributes??{}},M,w,v=0,y=new Map,L=new Map,A=new Set,I=[],V,q,O;function D(){clearTimeout(q),O?.remove(),O=void 0}function s(b=!1){clearTimeout(V),V=void 0;let k=I.splice(0,20);return k.length?Ee(r,`${i}/events`,JSON.stringify({events:k}),b).catch(T=>e.log?.("Visual exposure not sent",{error:T})):Promise.resolve()}function p(b,k){let T=G(b,k);A.has(T)||e.trackExposures===!1||u?.trackExposures===!1||c||(A.add(T),I.push({eventUuid:crypto.randomUUID(),timestamp:new Date().toISOString(),deviceId:a,...o?{sessionId:o}:{},url:location.href,pageTitle:document.title.slice(0,512),experimentKey:b.key,variationKey:k.key}),I.length>=20?s():V??=setTimeout(()=>{s()},1e3))}function f(b){if(!u||c)return;let k=new Set,T={onExperimentViewed:(E,P)=>{k.add(G(E,P))},url:location.href,attributes:{...Ae(a,location),...g,indianaAppManifestRelease:e.appManifestRelease??null},savedGroups:me(u.savedGroups),log:e.log},j=new Set;for(let E of u.experiments){let P=E;try{let N=ge(P,T);if(L.set(E.changeId,N),!N.inExperiment)continue;j.add(E.changeId);let de=JSON.stringify([N.key,N.value]),fe=y.get(E.changeId);if(fe?.signature===de){k.has(G(P,N))&&b.push(()=>{fe.applied()&&p(P,N)});continue}y.get(E.changeId)?.revert(),y.delete(E.changeId);let pe=Ce(N.value,{requireUniqueTargets:!!e.appManifestRelease&&Array.isArray(E.condition?.$and)&&E.condition.$and.some(C=>C!==null&&typeof C=="object"&&!Array.isArray(C)&&C.indianaAppManifestRelease===e.appManifestRelease),boundVariations:E.variations,allowJs:e.disableJsInjection===!1,nonce:e.nonce,onApplied:()=>{k.has(G(P,N))&&p(P,N)},onError:C=>e.log?.("Visual experiment stopped",{experiment:E.key,changeId:E.changeId,variation:N.key,error:String(C)}),onTargetStatus:e.log?C=>e.log?.("Visual target status changed",{experiment:E.key,changeId:E.changeId,variation:N.key,...C}):void 0});y.set(E.changeId,{signature:de,revert:pe.revert,applied:()=>pe.applied})}catch(N){e.log?.("Skipping visual experiment",{experiment:E.key,error:String(N)})}}for(let[E,P]of y)j.has(E)||(P.revert(),y.delete(E));D()}let h=()=>{let b=[];Ie(()=>f(b));for(let k of b)k()};async function R(){let b=++v,k;try{k=await n.read(l,we)}catch(j){if(c||b!==v)return!1;throw j}let T=ze(k);if(T.environmentId.toLowerCase()!==e.environmentId.toLowerCase())throw new Error("Visual payload scope changed");return c||b!==v?!1:(u=T,!0)}let S=()=>{d!==location.href&&(d=location.href,h())},x=()=>{s(!0)},B=()=>{M||c||(M=ye(S),addEventListener("pagehide",x),d=location.href)};return{async start(){if(!(m||c)){m=!0,e.appManifestRelease&&(w=Re(e.appManifestRelease)),e.antiFlicker&&(O=document.createElement("style"),e.nonce&&(O.nonce=e.nonce),O.textContent="body { visibility: hidden !important }",document.head.append(O),q=setTimeout(D,Math.min(3e3,Math.max(0,e.antiFlickerTimeout??1e3))));try{if(!await R()||c)return;B(),h()}finally{D()}}},async refresh(){c||await R()&&(m&&B(),h())},setAttributes(b){g={...b},h()},flush:()=>s(),getResults(){return new Map(L)},get generation(){return u?.generation??null},destroy(){c=!0,v++,n.destroy(),M?.(),w?.destroy(),removeEventListener("pagehide",x),D();for(let b of y.values())b.revert();y.clear(),s(!0),u=null,L.clear(),A.clear(),g={}}}}export{Ht as createVisualExperiments,$e as loadAppManifestRelease};
1
+ import{a as ee,c as ne,d as te,e as ve,f as ie,g as le,h as ce}from"./chunk-NH2PTTNK.js";import{a as N,b as de,c as J,e as ue}from"./chunk-YZSQDZXW.js";import{a as re,b as ae,c as se,d as oe}from"./chunk-65TBYVCS.js";import"./chunk-DSPLGTQI.js";import"./chunk-G56XGVMS.js";import"./chunk-WSVH6IQA.js";import"./chunk-7DXL3LHT.js";import{e as X,g as Z,i as M}from"./chunk-3PZ4Y6UD.js";import{z as s}from"zod";var _="indiana-visual-diagnostics-v1",be=s.strictObject({environmentId:s.string().uuid(),release:s.string().regex(/^[a-f0-9]{64}$/).nullable(),generation:s.string().regex(/^[a-f0-9]{64}$/).nullable(),publishedGeneration:s.string().regex(/^[a-f0-9]{64}$/).nullable(),checkedAt:s.string().datetime(),origin:s.string().url(),pathname:s.string().max(2048),urlMatches:s.boolean(),stopped:s.boolean(),rows:s.array(s.strictObject({changeId:s.string().regex(/^[a-f0-9]{64}$/),experimentKey:s.string().max(256),variationKey:s.string().max(256),inExperiment:s.boolean(),fingerprint:s.string().regex(/^[a-f0-9]{64}$/),status:s.enum(["inactive","waiting","partial","applied","mismatch","no_changes","unavailable","error"]),total:s.number().int().min(0).max(600),applied:s.number().int().min(0).max(600)})).max(100)});function pe(e){let c=n=>Array.isArray(n)?"["+n.map(c).join(",")+"]":n&&typeof n=="object"?"{"+Object.entries(n).filter(([,d])=>d!==void 0).sort(([d],[f])=>d.localeCompare(f)).map(([d,f])=>JSON.stringify(d)+":"+c(f)).join(",")+"}":JSON.stringify(n);return c({css:e.css,js:e.js,domMutations:e.domMutations,...e.renderGuard?{renderGuard:e.renderGuard}:{}})}function fe(e){let c=new URL(e.baseUrl).origin,n=e.origins??(c==="https://api.tinker.cash"?["https://tinker.cash"]:c==="https://api.dev.tinker.cash"?["https://dev.tinker.cash"]:[]),d=new Set(n.filter(r=>{try{let t=new URL(r);return t.origin===r&&(t.protocol==="https:"||t.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(t.hostname))}catch{return!1}})),f=!1,y=!1,b=0,T=async r=>{if(f||y||!r.source||!d.has(r.origin)||!r.data||typeof r.data!="object")return;let t=r.data;if(!(t.channel!==_||t.type!=="inspect"||t.environmentId!==e.environmentId||typeof t.nonce!="string"||!/^[a-f0-9-]{36}$/i.test(t.nonce)||typeof t.changeId!="string"||!/^[a-f0-9]{64}$/.test(t.changeId)||typeof t.url!="string"||t.url.length>2048||Date.now()-b<250)){try{if(new URL(t.url).origin!==location.origin)return}catch{return}y=!0,b=Date.now();try{let v=await e.inspect(t.changeId,t.url);!f&&v.rows.some(k=>k.changeId===t.changeId)&&r.source.postMessage({channel:_,type:"result",nonce:t.nonce,snapshot:v},r.origin)}finally{y=!1}}},V=r=>{T(r).catch(()=>{})};return window.addEventListener("message",V),()=>{f=!0,window.removeEventListener("message",V)}}var R=e=>!!e&&typeof e=="object"&&!Array.isArray(e),x=(e,c)=>typeof e=="string"&&e.length<=c,we=e=>typeof e=="string"&&(["html","class","style","position","href","src","alt","title","id","role","hidden"].includes(e)||/^(aria|data)-[a-z0-9_-]+$/.test(e));function Ie(e){if(!R(e)||!x(e.css??"",1e5)||!x(e.js??"",1e5)||!Array.isArray(e.domMutations??[])||Array.isArray(e.domMutations)&&e.domMutations.length>200)throw new Error("Invalid visual variation");let c=e.domMutations??[];for(let n of c)if(!R(n)||!x(n.selector,2048)||!n.selector||!we(n.attribute)||!["set","append","remove"].includes(String(n.action))||n.value!==void 0&&!x(n.value,5e4)||n.parentSelector!==void 0&&!x(n.parentSelector,2048)||n.insertBeforeSelector!==void 0&&!x(n.insertBeforeSelector,2048))throw new Error("Invalid visual mutation");return{css:e.css??"",js:e.js??"",domMutations:c,...e.renderGuard===void 0?{}:{renderGuard:ee(e.renderGuard)}}}function K(e){if(!R(e)||typeof e.environmentId!="string"||typeof e.trackExposures!="boolean"||!/^[-a-f0-9]{36}$/i.test(e.environmentId)||typeof e.generation!="string"||!/^[a-f0-9]{64}$/.test(e.generation)||!Array.isArray(e.experiments)||e.experiments.length>100||!R(e.savedGroups))throw new Error("Invalid visual experiment payload");let c=e.experiments.map(n=>{if(!R(n)||!["key","changeId"].every(d=>typeof n[d]=="string"&&n[d])||!/^[a-f0-9]{64}$/.test(String(n.changeId))||["namespace","status","groups","url"].some(d=>Object.hasOwn(n,d))||n.hashVersion!==void 0&&n.hashVersion!==2||!Array.isArray(n.variations)||n.variations.length<2||n.variations.length>20||n.urlPatterns!==void 0&&!Array.isArray(n.urlPatterns))throw new Error("Invalid visual experiment");return{...n,variations:n.variations.map(Ie)}});return{...e,experiments:c}}function Ce(e){let c=se(e.baseUrl);if(e.appManifestRelease!==void 0&&!/^[a-f0-9]{64}$/.test(e.appManifestRelease))throw new Error("Invalid IAM manifest digest");if(!/^[0-9a-f-]{36}$/i.test(e.environmentId))throw new Error("Invalid App environment ID");let n=e.fetch??globalThis.fetch.bind(globalThis),d=J(n),f=J(n),y=`${c}/api/v1/visual-experiments/${e.environmentId}`,b=e.appManifestRelease?`${y}?iam=${e.appManifestRelease}`:y,T=re(e.deviceIdCookie??"indiana_did"),V=ae(),r=null,t=!1,v=!1,k="",U={...e.attributes??{}},G,q,D=0,m=new Map,O=new Map,L=new Set,P=[],C,F,I;function $(){clearTimeout(F),I?.remove(),I=void 0}function E(o=!1){clearTimeout(C),C=void 0;let l=P.splice(0,20);return l.length?de(n,`${y}/events`,JSON.stringify({events:l}),o).catch(u=>e.log?.("Visual exposure not sent",{error:u})):Promise.resolve()}function B(o,l){let u=M(o,l);L.has(u)||e.trackExposures===!1||r?.trackExposures===!1||t||(L.add(u),P.push({eventUuid:crypto.randomUUID(),timestamp:new Date().toISOString(),deviceId:T,...V?{sessionId:V}:{},url:location.href,pageTitle:document.title.slice(0,512),experimentKey:o.key,variationKey:l.key}),P.length>=20?E():C??=setTimeout(()=>{E()},1e3))}function ge(o){if(!r||t)return;let l=new Set,u={onExperimentViewed:(i,p)=>{l.add(M(i,p))},url:location.href,attributes:{...ue(T,location),...U,indianaAppManifestRelease:e.appManifestRelease??null},savedGroups:X(r.savedGroups),log:e.log},h=new Set;for(let i of r.experiments){if(le(`${e.environmentId}:${i.key}`))continue;let p=i;try{let a=Z(p,u);if(O.set(i.changeId,a),!a.inExperiment)continue;h.add(i.changeId);let w=JSON.stringify([a.key,a.value]),j=m.get(i.changeId);if(j?.signature===w){l.has(M(p,a))&&o.push(()=>{j.applied()&&B(p,a)});continue}m.get(i.changeId)?.revert(),m.delete(i.changeId);let S=te(a.value,{requireUniqueTargets:!!e.appManifestRelease&&Array.isArray(i.condition?.$and)&&i.condition.$and.some(g=>g!==null&&typeof g=="object"&&!Array.isArray(g)&&g.indianaAppManifestRelease===e.appManifestRelease),boundVariations:i.variations,allowJs:e.disableJsInjection===!1,nonce:e.nonce,onApplied:()=>{l.has(M(p,a))&&B(p,a)},onError:g=>e.log?.("Visual experiment stopped",{experiment:i.key,changeId:i.changeId,variation:a.key,error:String(g)}),onTargetStatus:e.log?g=>e.log?.("Visual target status changed",{experiment:i.key,changeId:i.changeId,variation:a.key,...g}):void 0});m.set(i.changeId,{signature:w,revert:S.revert,applied:()=>S.applied,inspect:()=>S.inspect()})}catch(a){e.log?.("Skipping visual experiment",{experiment:i.key,error:String(a)})}}for(let[i,p]of m)h.has(i)||(p.revert(),m.delete(i));$()}let A=()=>{let o=[];ne(()=>ge(o));for(let l of o)l()};async function H(){let o=++D,l;try{l=await d.read(b,N)}catch(h){if(t||o!==D)return!1;throw h}let u=K(l);if(u.environmentId.toLowerCase()!==e.environmentId.toLowerCase())throw new Error("Visual payload scope changed");return t||o!==D?!1:(r=u,!0)}let me=()=>{k!==location.href&&(k=location.href,A())},z=()=>{E(!0)},W=()=>{G||t||(G=oe(me),addEventListener("pagehide",z),k=location.href)};async function Y(o,l){let u=location.href,h=r,i=[],p=null;if(!t)try{let a=K(await f.read(b,N));a.environmentId===e.environmentId&&(p=a.generation)}catch{}for(let a of h?.experiments??[]){if(o&&a.changeId!==o)continue;let w=O.get(a.changeId);if(!w)continue;let j=new TextEncoder().encode(pe(w.value)),S=[...new Uint8Array(await crypto.subtle.digest("SHA-256",j))].map(ye=>ye.toString(16).padStart(2,"0")).join(""),g=m.get(a.changeId)?.inspect()??{status:"inactive",total:0,applied:0};i.push({changeId:a.changeId,experimentKey:a.key,variationKey:w.key,inExperiment:w.inExperiment,fingerprint:S,...g})}return{environmentId:e.environmentId,release:e.appManifestRelease??null,generation:h?.generation??null,publishedGeneration:p,checkedAt:new Date().toISOString(),origin:location.origin,pathname:location.pathname,urlMatches:location.href===u&&(!l||l===u)&&h===r,stopped:t,rows:i}}let Q,he=ce(()=>{v&&!t&&A()});return{async start(){if(!(v||t)){v=!0,e.appManifestRelease&&(q=ie(e.appManifestRelease)),e.antiFlicker&&(I=document.createElement("style"),e.nonce&&(I.nonce=e.nonce),I.textContent="body { visibility: hidden !important }",document.head.append(I),F=setTimeout($,Math.min(3e3,Math.max(0,e.antiFlickerTimeout??1e3))));try{if(!await H()||t)return;W(),A()}finally{$(),t||(Q=fe({environmentId:e.environmentId,baseUrl:c,origins:e.diagnosticsOrigins,inspect:Y}))}}},async refresh(){t||await H()&&(v&&W(),A())},setAttributes(o){U={...o},A()},flush:()=>E(),getDiagnostics:Y,getResults(){return new Map(O)},get generation(){return r?.generation??null},destroy(){t=!0,he(),Q?.(),D++,d.destroy(),f.destroy(),G?.(),q?.destroy(),removeEventListener("pagehide",z),$();for(let o of m.values())o.revert();m.clear(),E(!0),r=null,O.clear(),L.clear(),U={}}}}export{Ce as createVisualExperiments,ve as loadAppManifestRelease};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tinkerlandai/indiana-sdk",
3
- "version": "0.8.5",
3
+ "version": "0.9.2",
4
4
  "description": "Framework-independent Indiana SDK for customer identity, entitlements, credits, offers and growth surfaces.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- import{o as E,p as L,s as R}from"./chunk-6A5WWFNS.js";import{a as e}from"./chunk-SOQO2RDZ.js";import{a as P,j as C,m as D,p as j}from"./chunk-LMR2TM3X.js";import{b}from"./chunk-OBYJWIRB.js";import{a as U,b as M}from"./chunk-WWUUVURR.js";var H=Symbol("IndianaNoContent");function Q(u,q,k=URL){let l=u.configuration?.scope,A=u.scope??(l&&{projectId:l.projectId,environment:l.environment}),s=A?b.parse(A):void 0;if(s&&l&&(s.projectId!==l.projectId||s.environment!==l.environment))throw new e("SCOPE_MISMATCH","Configuration belongs to another App/environment");let i=new k(u.baseUrl??M);if(i.username||i.password||i.search||i.hash)throw new e("INVALID_URL","baseUrl must not contain credentials, query, or fragment");if(i.protocol!=="https:"&&!(i.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(i.hostname)))throw new e("INVALID_URL","Use HTTPS, or HTTP on localhost during development");let V=u.fetch??globalThis.fetch.bind(globalThis),p=u.timeoutMs??1e4;if(!Number.isFinite(p)||p<1||p>12e4)throw new e("INVALID_TIMEOUT","timeoutMs must be between 1 and 120000");let m=null,f=0,h=null,w=new Set;function O(){f+=1,m=null,h=null;for(let a of w)a.abort();w.clear()}async function K(a,x={},T="POST",v={}){let d=v.installationDetach===!0;if(d&&(a!=="push/installations/detach"||T!=="POST"))throw new e("INVALID_REQUEST","Installation authority only detaches this installation");if(!m&&!d)throw new e("NOT_IDENTIFIED","Call identify with a server-issued customer token first");let y=f,o=new AbortController;d||w.add(o);let g=()=>!d&&y!==f?new e("IDENTITY_CHANGED","Customer identity changed while the request was in flight"):new e("TIMEOUT","Indiana request timed out"),S,F=new Promise((n,r)=>{S=()=>r(g()),o.signal.addEventListener("abort",S,{once:!0})}),X=setTimeout(()=>o.abort(),p),$=async()=>{let n=await V(`${i.href.replace(/\/$/,"")}/api/v1/${a}`,{method:T,headers:{"Content-Type":"application/json",...d?{}:{Authorization:`Bearer ${m}`},[E]:R.current,[L]:U.version,...s?{"X-Indiana-Project":s.projectId,"X-Indiana-Environment":s.environment}:{}},body:T==="POST"?JSON.stringify(x):void 0,signal:o.signal,credentials:"omit",cache:"no-store",redirect:"error",...v.keepalive?{keepalive:!0}:{}});if(o.signal.aborted)throw g();let r;try{r=n.status===204?H:await n.json()}catch{throw o.signal.aborted?g():new e(n.ok?"INVALID_RESPONSE":"HTTP_ERROR","The gateway returned an unreadable response",n.status,n.headers.get("X-Request-Id")??void 0)}if(o.signal.aborted)throw g();if(!d&&y!==f)throw new e("IDENTITY_CHANGED","Customer identity changed while the request was in flight");if(!n.ok){let t=D.safeParse(r),c=t.success&&(!P.safeParse(t.data.error.code).success||C(t.data.error.code,n.status)),N=c?t.data.error.code:"HTTP_ERROR",_=j(N,n.status,{retryAfter:n.headers.get("Retry-After"),recovery:c?t.data.error.recovery:void 0,reason:c?t.data.error.reason:void 0});throw new e(N,c?t.data.error.message:"Indiana request failed",n.status,n.headers.get("X-Request-Id")??(t.success?t.data.requestId:void 0),{..._,...t.success&&t.data.error.retryable===!1?{retryable:!1}:{},..._.retryAfterSeconds===void 0&&t.success&&t.data.error.retryAfterSeconds!==void 0?{retryAfterSeconds:t.data.error.retryAfterSeconds}:{}})}if(n.headers.get(E)!==R.current)throw new e("PROTOCOL_MISMATCH","Response protocol does not match this SDK");if(s&&r!==H){let t=r&&typeof r=="object"&&"scope"in r?r:r&&typeof r=="object"&&"configuration"in r?r.configuration:null;if(!t||typeof t!="object"||!("scope"in t))throw new e("INVALID_RESPONSE","Response is missing its App/environment scope");let c=b.safeParse(t.scope);if(!c.success||c.data.projectId!==s.projectId||c.data.environment!==s.environment)throw new e("SCOPE_MISMATCH","Response scope does not match this SDK instance")}let I=n.headers.get("X-Indiana-Telemetry-Subject");if(I){if(!/^[a-f0-9]{64}$/.test(I))throw new e("INVALID_RESPONSE","Invalid telemetry identity");h!==I&&(h=I,q?.(h))}return r};try{return await Promise.race([$(),F])}catch(n){throw!d&&y!==f?new e("IDENTITY_CHANGED","Customer identity changed while the request was in flight"):n instanceof e?n:new e(o.signal.aborted?"TIMEOUT":"NETWORK_ERROR",o.signal.aborted?"Indiana request timed out":"Unable to read the Indiana response")}finally{clearTimeout(X),o.signal.removeEventListener("abort",S),w.delete(o)}}return{subjectKey:()=>h,identify(a){if(!a.trim()||/\s/.test(a)||a.length>4096)throw new e("INVALID_TOKEN","A nonempty server-issued token is required");O(),m=a},reset:O,request:K}}export{Q as a};