@astrato-io/sdk 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -202,6 +202,12 @@ hits; a fresh metadata load initializes them from the model again.
|
|
|
202
202
|
The asynchronous metadata call loads the engine snapshot. Field getters and connectivity checks then read that snapshot synchronously, as required by the visualization wrappers. Fields are identified by engine `fieldKey` values; the SDK does not parse field keys into view/name references.
|
|
203
203
|
Semantic dimensions, measures and calculations use the keys and related views supplied by the composite response. View names are retained only where existing visualization APIs still request view-level connectivity.
|
|
204
204
|
|
|
205
|
+
Projected visualization fields temporarily include `schema: 'legacy'` because visualization packages
|
|
206
|
+
still require a nonempty value. This compatibility placeholder is independent of the source database
|
|
207
|
+
schema and overrides any incoming field `schema`; it does not change canonical engine keys or source
|
|
208
|
+
metadata. Consumers should use field keys for identity. Removal of this requirement and placeholder is
|
|
209
|
+
tracked in [ASTA-15281](https://app.clickup.com/t/123y1w8p6zn).
|
|
210
|
+
|
|
205
211
|
## Using Visualizations With The SDK
|
|
206
212
|
|
|
207
213
|
Install both packages and import the visualization stylesheet once in the host application:
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Subject as mt,filter as Ne,BehaviorSubject as ce}from"rxjs";const Ge=(e,t)=>t?!(t.groupId&&e?.groupId!==t.groupId||t.instanceId&&e?.instanceId!==t.instanceId||t.sessionId&&e?.sessionId!==t.sessionId):!0,ht=(e,t)=>e.name===t,wt=()=>{const e=new mt,t=new Set,r=n=>(t.add(n),()=>{n.unsubscribe(),t.delete(n)});return{events$:e.asObservable(),emit:(n,a,i={})=>{e.next({name:n,payload:a,scope:i.scope,source:i.source,timestamp:i.timestamp??Date.now()})},on:(n,a,i)=>r(e.pipe(Ne(l=>ht(l,n)&&Ge(l.scope,i?.scope))).subscribe(a)),onAny:(n,a)=>r(e.pipe(Ne(i=>Ge(i.scope,a?.scope))).subscribe(i=>{n(i)})),clear:()=>{t.forEach(n=>{n.unsubscribe()}),t.clear()}}},vt={aggregations:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/data/aggrfunctions/${encodeURIComponent(t)}`,capabilities:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/data/capabilities/${encodeURIComponent(t)}`,datasource:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/schema/datasources/${encodeURIComponent(t)}`,queryInsights:e=>`api/message/tenants/${encodeURIComponent(e)}/data/queryinsights`,semanticLayerMetadata:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/schema/dataviews/${encodeURIComponent(t)}/composite`,query:e=>`api/message/tenants/${encodeURIComponent(e)}/data/execute/query`},bt={objectId:"x-metadata-object-id",role:"x-metadata-role-type",sheetId:"x-metadata-sheet-id",tenantId:"x-metadata-tenant-id",userId:"x-metadata-user-id",workbookState:"x-metadata-workbook-state",workbookVersionContainerId:"x-metadata-workbook-id"},Qe=e=>{const t={};return Object.entries(bt).forEach(([r,n])=>{const a=e[r];a&&(t[n]=a)}),t},At=(e,t)=>({...t,...e.context,tenantId:e.tenantId??e.context?.tenantId??t?.tenantId}),It=(e,t)=>typeof e=="function"?e(t):e,de=(e,t)=>e??t?.tenantId;class Et extends Error{constructor(){super("Astrato data service capacity interrupted the query. Retry it later."),this.code="service_capacity",this.name="AstratoDataCapacityError"}}const St=e=>{const t=e&&typeof e=="object"&&"response"in e?e.response:e;if(t&&typeof t=="object"&&"meta"in t){const r=t.meta;if(r&&typeof r=="object"&&"truncated"in r&&r.truncated===!0&&"truncationReason"in r&&r.truncationReason==="service_capacity")throw new Et}return e},Dt=e=>Array.isArray(e)?e:e&&typeof e=="object"&&"response"in e&&Array.isArray(e.response)?e.response:[],nt=e=>{if(e&&typeof e=="object"&&"response"in e){const t=e.response;return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}return e&&typeof e=="object"&&!Array.isArray(e)?e:{}},Lt=["cacheUsed","metaDataQuery","joinIssue","unionIssue","memoryIssue","pruningIssue"],Tt=["creditsBestCase","creditsWorstCase","creditsFairValue","rowsScanned"],Ct=e=>Lt.every(t=>typeof e[t]=="boolean")&&Tt.every(t=>typeof e[t]=="number"&&Number.isFinite(e[t])),Mt=e=>{const t=nt(e);if(!Ct(t))throw new Error("Astrato SDK query insights response is invalid.");return t},He=(e,t={})=>{const r={...vt,...t.endpoints};return{query:async n=>{const a=At(n,t.context);if(!a.tenantId)throw new Error("Astrato SDK data query requires tenantId in client options or query request.");const i=await e({body:n.query,headers:Qe(a),method:"POST",url:It(r.query,a.tenantId)});return St(i)},getQueryInsights:async n=>{const a=de(n.tenantId,t.context);if(!a)throw new Error("Astrato SDK query insights requires tenantId in client options or insights request.");const i=await e({body:{databaseID:n.semanticLayerId,queryID:n.queryID,...n.startTime===void 0?{}:{startTime:n.startTime}},headers:Qe({...t.context,tenantId:a}),method:"POST",url:r.queryInsights(a)});return Mt(i)},getSemanticLayerMetadata:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK semantic layer metadata requires tenantId in client options or request.");return e({method:"GET",url:r.semanticLayerMetadata(i,n)})},getDatasource:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK datasource metadata requires tenantId in client options or request.");return e({method:"GET",url:r.datasource(i,n)})},getAggregations:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK aggregation metadata requires tenantId in client options or request.");const l=await e({method:"GET",url:r.aggregations(i,n)});return Dt(l)},getCapabilities:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK capability metadata requires tenantId in client options or request.");const l=await e({method:"GET",url:r.capabilities(i,n)});return nt(l)}}},xt="default",H=e=>e??xt,We=()=>({applied:[],pending:[]}),ue=e=>({...e,field:{...e.field},kind:e.kind??"VALUE",values:[...e.values]}),we=e=>({applied:e.applied.map(ue),pending:e.pending.map(ue)}),Je=(e,t)=>t==="ALL"?!0:(e.kind??"VALUE")===t,Me=(e,t)=>({applied:e.applied.filter(r=>Je(r,t)).map(ue),pending:e.pending.filter(r=>Je(r,t)).map(ue)}),ae=e=>e.fieldKey,Kt=e=>e.kind??"VALUE",Ee=e=>`${Kt(e)}:${ae(e.field)}`,Xe=(e,t)=>{if("field"in t){const n=Ee(t);return e.filter(a=>Ee(a)!==n)}const r=ae(t);return e.filter(n=>ae(n.field)!==r)},Ie=(e,t)=>{const r=ue(t),n=Ee(r);let a=!1;const i=e.map(l=>Ee(l)!==n?l:(a=!0,r));return a?i:[...i,r]},Ze=e=>e.reduce(Ie,[]),kt=(e="auto")=>{const t=new Map,r=new Map,n=new Map,a=new Map,i=new Map,l=new ce([]),u=o=>{const c=H(o);let p=t.get(c);return p||(p=We(),t.set(c,p)),p},m=o=>{const c=H(o);let p=n.get(c);if(!p){const y=Me(u(c),"ALL");p={active:new ce(we(y)),applied:new ce(we(y)),pending:new ce(we(y))},n.set(c,p)}return p},f=(o,c)=>{const p=H(o),y=Me(u(p),"ALL"),w=m(p);w.active.next(y),(c==="applied"||c==="both")&&w.applied.next(y),(c==="pending"||c==="both")&&w.pending.next(y)},g=o=>r.get(H(o))??e,h=(o,c)=>{r.set(H(c),o)},I=(o,c)=>a.get(H(c))?.has(ae(o))??!1,E=o=>{const c=u(o);c.pending.length!==0&&(c.applied=c.pending.reduce(Ie,c.applied),c.pending=[],f(o,"both"))},b=o=>{const c=u(o);c.pending.length!==0&&(c.pending=[],f(o,"pending"))},P=o=>{t.set(H(o),We()),f(o,"both")},S=(o,c)=>`${H(o)}:${ae(c)}`,T=(o,c)=>{const p=H(c),y=S(p,o);let w=i.get(y);return w||(w=new ce(!1),i.set(y,w)),w},x=(o,c,p)=>{const y=H(p);let w=a.get(y);w||(w=new Set,a.set(y,w));const K=ae(o);c?w.add(K):w.delete(K),T(o,y).next(c)};return{singleSelectFields$:l.asObservable(),get selectionMode(){return g()},set selectionMode(o){h(o)},getSelectionMode:o=>g(o),setSelectionMode:(o,c)=>{h(o,c)},getSelection:o=>we(u(o)),getActiveSelection:(o="VALUE",c)=>Me(u(c),o),selectValues:(o,c,p)=>{const y=u(o);if(I(c.field,o))return;if((p?.state??(g(o)==="manual"?"pending":"applied"))==="pending"){y.pending=Ie(y.pending,c),f(o,"pending");return}y.applied=Ie(y.applied,c),f(o,"applied")},declineSelection:(o,c)=>{const p=u(o);p.pending=Xe(p.pending,c),f(o,"pending")},removeSelection:(o,c)=>{const p=u(o);p.applied=Xe(p.applied,c),f(o,"applied")},setNewSelectionState:(o,c)=>{t.set(H(o),{applied:Ze(c.applied),pending:Ze(c.pending)}),f(o,"both")},applyPendingSelections:o=>{if(o){E(o);return}Array.from(t.keys()).forEach(E)},clearPendingSelections:o=>{if(o){b(o);return}Array.from(t.keys()).forEach(b)},clearAllSelections:o=>{if(o){P(o);return}t.clear(),n.forEach((c,p)=>{f(p,"both")})},onActiveSelectionChange:o=>m(o).active.asObservable(),onActiveSelectionChangeApplied:o=>m(o).applied.asObservable(),onActiveSelectionChangePending:o=>m(o).pending.asObservable(),isFieldLocked:(o,c)=>I(o,c),isFieldLocked$:(o,c)=>T(o,c).asObservable(),setFieldLocked:x,toggleFieldLocked:(o,c)=>{x(o,!I(o,c),c)}}},Ft=(e=[])=>{const t=new Map;return e.forEach(r=>{t.set(r.id,r)}),{getVariables:r=>Promise.resolve(Array.from(t.values()).filter(n=>!r||n.contextId===r)),resolveValue:(r,n)=>{const a=Array.from(t.values()).find(i=>(i.id===r||i.name===r)&&(!n||i.contextId===n));return Promise.resolve(a?.value)}}},jt=()=>({saveProperties:async(e,t)=>{},saveLocalVSpec:async e=>{}}),zt=()=>({query:()=>Promise.reject(new Error("Astrato SDK data service is not configured. Provide a data service.")),getSemanticLayerMetadata:()=>Promise.reject(new Error("Astrato SDK semantic layer metadata service is not configured. Provide a data service.")),getAggregations:()=>Promise.reject(new Error("Astrato SDK aggregation metadata service is not configured. Provide a data service.")),getCapabilities:()=>Promise.reject(new Error("Astrato SDK capability metadata service is not configured. Provide a data service.")),getDatasource:()=>Promise.reject(new Error("Astrato SDK datasource metadata service is not configured. Provide a data service."))}),V=()=>new Error("Astrato SDK engine service is not configured. Provide an engine service."),Pt=()=>({get capabilities(){throw V()},get databaseInfo(){throw V()},get localeSettings(){throw V()},fields:{getFieldMetadata:()=>Promise.reject(V()),getDimensionsList:()=>{throw V()},getFields:()=>{throw V()},getGroupedDimensions:()=>{throw V()},getMeasuresList:()=>{throw V()},getValidFields:()=>{throw V()},getViewsFields:()=>{throw V()}},transformQuery:()=>{throw V()},getData:()=>Promise.reject(V()),getLastQueryMetadata:()=>{throw V()},getQueryInsights:()=>Promise.reject(V()),areFieldsConnected:()=>{throw V()},areViewsConnected:()=>{throw V()}}),$t=(e={})=>({data:e.data??zt(),engine:e.engine??Pt(),model:e.model??jt(),selections:e.selections??kt(),variables:e.variables??Ft()}),D=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),O=(e,t)=>{const r=e?.[t];return typeof r=="string"?r:void 0},ot=e=>D(e)&&typeof e.name=="string"&&typeof e.view=="string",Ot=(e,t)=>{const r=e[t];return Array.isArray(r)?r:void 0},ve=(e,t)=>{const r=e[t];if(r==null)return[];if(!Array.isArray(r)||!r.every(D))throw new Error(`Astrato SDK visualization engine expected composite metadata.${t} to be an object array.`);return r},xe=(e,t,r)=>{const n=O(e,t);if(!n)throw new Error(`Astrato SDK visualization engine expected ${r}.${t} to be a non-empty string.`);return n},Ye=e=>{if(!D(e))return;const t=e.fieldKey??e.key;return typeof t=="string"?t:void 0},Rt=(e,t)=>{const r=new Map(e.map(i=>[i,i])),n=i=>{const l=r.get(i);if(!l||l===i)return i;const u=n(l);return r.set(i,u),u},a=(i,l)=>{if(!r.has(i)||!r.has(l))return;const u=n(i),m=n(l);u!==m&&r.set(m,u)};return t.forEach(i=>{const l=O(i,"viewID1"),u=O(i,"viewID2");l&&u&&a(l,u)}),new Map(e.map(i=>[i,n(i)]))},et=e=>{if(!Array.isArray(e.views))throw"schemas"in e?new Error("Astrato SDK visualization engine requires the tenant-scoped data view composite endpoint; legacy schemas metadata is not supported."):new Error("Astrato SDK visualization engine expected composite metadata.views to be an object array.");const t=ve(e,"views"),r=ve(e,"joins"),n=ve(e,"items"),a=[],i=new Map,l=new Map,u=[];return t.forEach((m,f)=>{const g=xe(m,"id",`composite metadata.views[${f}]`),h=xe(m,"name",`composite metadata.views[${f}]`),I=l.get(h);if(I&&I!==g)throw new Error(`Astrato SDK visualization engine expected composite view name "${h}" to be unique.`);u.push(g),l.set(h,g),ve(m,"fields").forEach((E,b)=>{const P=xe(E,"key",`composite metadata.views[${f}].fields[${b}]`);if(i.has(P))throw new Error(`Astrato SDK visualization engine expected field key "${P}" to be unique.`);const S={field:E,view:m,viewId:g};a.push(S),i.set(P,S)})}),{componentByViewId:Rt(u,r),fieldEntries:a,fieldEntriesByKey:i,items:n,viewIdsByName:l}},Se=(e,t,r={throwOnUnknownFieldKey:!0})=>{if(ot(t)&&!Ye(t))throw new Error("Astrato SDK visualization engine requires fieldKey/key field identifiers. Legacy { view, name } field identifiers are not supported.");const n=Ye(t);if(!n)return;const a=e.fieldEntriesByKey.get(n);if(!a&&r.throwOnUnknownFieldKey!==!1)throw new Error(`Astrato SDK visualization engine could not find fieldKey "${n}".`);return a},ee=(e,t)=>e.componentByViewId.get(t),Vt=(e,t)=>{if(!t)return e.fieldEntries;const r=Se(e,t);if(!r)return[];const n=ee(e,r.viewId);return e.fieldEntries.filter(a=>ee(e,a.viewId)===n)},$e=(e,t)=>{const r=new Set;return t.forEach(n=>{const a=e.viewIdsByName.get(n),i=a?ee(e,a):void 0;i&&r.add(i)}),r},Ut=(e,t)=>{if(!t.length)return e.fieldEntries;const r=$e(e,t);return r.size?e.fieldEntries.filter(n=>{const a=ee(e,n.viewId);return a?r.has(a):!1}):[]},_t=(e,t,r)=>{const n=$e(e,t),a=$e(e,r);return Array.from(n).some(i=>a.has(i))},Bt=(e,t,r)=>{const n=Se(e,t),a=Se(e,r);return!n||!a?!1:ee(e,n.viewId)===ee(e,a.viewId)},De=(e,t,r)=>{const n=e.items.filter(l=>t.includes(String(l.type)));if(!r)return n;const a=Se(e,r);if(!a)return[];const i=ee(e,a.viewId);return n.filter(l=>(Ot(l,"views")??[]).some(m=>{if(typeof m!="string")return!1;const f=e.viewIdsByName.get(m);return f?ee(e,f)===i:!1}))},Oe="anytype",qt="boolean",Nt="geography",Gt="numeric",Qt="string",Ht=new Set(["date","time","timestamp","timestamp_tz"]),Wt=new Set(["decimal","float","int"]),Jt=e=>{const t=e?.toLowerCase();return t?Wt.has(t)?Gt:t==="string"||Ht.has(t)?Qt:t==="boolean"?qt:t==="geography"?Nt:Oe:Oe},Xt=(e,t)=>{const r=e.dataType?.toLowerCase();return!r||r===Oe?!0:r===Jt(t)},Zt=(e,t)=>{const r=O(e.view,"schemaSource"),n=O(e.field,"dataType");return{...e.field,aggregators:t.filter(a=>Xt(a,n)),...r?{schema:r}:{},view:O(e.view,"name")}},at=(e,t)=>e.map(r=>Zt(r,t)),Re=(e,t,r)=>at(Vt(e,r),t),Yt=(e,t,r)=>at(Ut(e,r),t),it=e=>e.flatMap(t=>{if(!D(t)||!D(t.dimension))return[];const r=t.dimension.group;if(!D(r)||!Array.isArray(r.fieldKeys)||r.fieldKeys.length===0)return[];const n=Array.from(new Set([O(t,"id"),O(t,"key")].filter(a=>!!a)));return n.length?[{identifiers:n,levelCount:r.fieldKeys.length}]:[]}),er=e=>Object.fromEntries(it(e).flatMap(({identifiers:t})=>t.map(r=>[r,0]))),tr=(e,t)=>{const r=Re(e,t),n=De(e,["dimension"]);return{dimensions:n,fields:r,groupedDimensions:er(n),measures:De(e,["measure","calculation"]),validFields:r,viewsFields:r}},rr=e=>typeof e.fieldKey=="string"||typeof e.key=="string",oe=e=>D(e)&&typeof e.semanticLayerId=="string"?e.semanticLayerId:void 0,nr=e=>{if(!D(e)||!D(e.query))return;const t=D(e.query.query)?e.query.query:e.query;return typeof t.databaseID=="string"?t.databaseID:void 0},Ke=e=>{if(!D(e))return;if(typeof e.tenantId=="string")return e.tenantId;const t=e.context;return D(t)&&typeof t.tenantId=="string"?t.tenantId:void 0},be=e=>{if(!D(e))return;if(typeof e.datasourceType=="string")return e.datasourceType;const t=e.context;return D(t)&&typeof t.datasourceType=="string"?t.datasourceType:void 0},or=e=>{if(!D(e))return;const t=e.context;return D(t)&&typeof t.objectId=="string"?t.objectId:void 0},ke=e=>!D(e)||rr(e)||ot(e)?e:e.selectedField,ar=e=>{if(Array.isArray(e))return e;if(!D(e))return[];const t=e.selectedFields;return Array.isArray(t)?t:[]},ir=e=>{if(Array.isArray(e))return e.filter(r=>typeof r=="string");if(!D(e))return[];const t=e.views;return Array.isArray(t)?t.filter(r=>typeof r=="string"):typeof e.view=="string"?[e.view]:[]},sr=e=>D(e)&&D(e.query),cr=e=>{if(sr(e.query))return e.query;if(!D(e.query))return{query:e.query};const t=e.query.databaseID??e.semanticLayerId;return{query:{...e.query,...t?{databaseID:t}:{}}}},dr=16,lr=300*1e3,M=e=>Array.isArray(e)?e.map(t=>M(t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,M(r)])):e,Fe=(e,t)=>e.scope.tenantId===t.tenantId&&e.scope.semanticLayerId===t.semanticLayerId&&(t.datasourceType===void 0||e.scope.datasourceType===t.datasourceType),ur=e=>O(e,"datasourceID"),je=(e,t)=>{const r=e?.[t];return typeof r=="number"&&Number.isFinite(r)?r:void 0},fr=(e,t,r)=>{const n=D(e)?e:void 0,a=n&&D(n.response)?n.response:n,i=O(a,"queryID");if(!i)return;const l=n&&D(n.telemetry)?n.telemetry:void 0,u=a&&D(a.meta)?a.meta:void 0,m=a&&Array.isArray(a.warnings)?a.warnings:void 0,f=je(l,"duration"),g=je(l,"start"),h=O(a,"statement"),I=O(a,"queryLink"),E=je(u,"rows"),b=oe(t);return{queryID:i,...f===void 0?{}:{duration:f},...g===void 0?{}:{startTime:g},...h===void 0?{}:{statement:h},...I===void 0?{}:{queryLink:I},...E===void 0?{}:{rows:E},...b===void 0?{}:{semanticLayerId:b},...r===void 0?{}:{vendor:r},...m===void 0?{}:{warnings:[...m]}}},gr=e=>({...e,...e.warnings?{warnings:[...e.warnings]}:{}}),Ae=()=>new Error("Astrato SDK visualization engine metadata is not loaded. Call engine.fields.getFieldMetadata({ semanticLayerId }) or provide a custom engine host service."),pr=(e,t)=>!t&&!e.context?e:{...e,context:{...t,...e.context,tenantId:e.tenantId??e.context?.tenantId??t?.tenantId}},yr=(e,t={})=>{let r,n,a,i,l=[],u={},m,f={},g=Promise.resolve(),h,I,E=0;const b=new Map,P=new Set,S=t.metadataCache?.maxEntries??dr,T=t.metadataCache?.ttlMs??lr;if(!Number.isSafeInteger(S)||S<=0)throw new Error("Astrato SDK visualization engine metadata cache maxEntries must be a positive integer.");if(!Number.isFinite(T)||T<=0)throw new Error("Astrato SDK visualization engine metadata cache ttlMs must be positive.");const x=new Map,o=new Map,c=()=>{if(!n)throw Ae();return n},p=()=>{if(!a)throw Ae();return a},y=async(s,d,A,v)=>{const C=be(d);if(C)return C;const j=ur(s);if(!j||!v.getDatasource)return;const F=await v.getDatasource(j,A),z=D(F)?O(F,"driverName"):void 0;if(!z)throw new Error(`Astrato SDK visualization engine expected datasource "${j}" metadata to include driverName.`);return z},w=(s,d)=>{if(!s)throw new Error(`Astrato SDK visualization engine requires datasource type to load ${d}. Provide datasourceType in the field metadata request or ensure composite metadata includes datasourceID and data.getDatasource is configured.`);return s},K=async(s,d,A)=>{if(!A.getSemanticLayerMetadata)throw new Error("Astrato SDK visualization engine requires data.getSemanticLayerMetadata(semanticLayerId).");const v=Ke(s),C=await A.getSemanticLayerMetadata(d,v);if(!D(C))throw new Error("Astrato SDK visualization engine expected composite semantic layer metadata to be an object.");const j=et(C),F=await y(C,s,v,A),[z,B]=await Promise.all([A.getAggregations?A.getAggregations(w(F,"aggregation metadata"),v):void 0,A.getCapabilities?A.getCapabilities(w(F,"capability metadata"),v):void 0]),Q=z?z.filter(D):[],W=D(B)?B:{};return{rawMetadata:M(C),aggregations:M(Q),capabilities:M(W),datasourceType:F,fieldMetadata:M(tr(j,Q))}},_=()=>{r=void 0,n=void 0,a=void 0,i=void 0,l=[],u={},m=void 0,f={},h=void 0},k=()=>{for(;Array.from(b.values()).filter(s=>s.snapshot).length>S;){const s=Array.from(b.values()).find(d=>d.snapshot);if(!s)return;b.delete(s.key)}},$=(s,d)=>({tenantId:Ke(s)??t.context?.tenantId,semanticLayerId:d,datasourceType:be(s)??t.context?.datasourceType}),G=(s,d)=>({...D(s)?s:{},semanticLayerId:d.semanticLayerId,...d.tenantId===void 0?{}:{tenantId:d.tenantId},...d.datasourceType===void 0?{}:{datasourceType:d.datasourceType}}),ie=(s,d)=>JSON.stringify([s,d.tenantId??"",d.semanticLayerId,d.datasourceType??""]),ye=(s,d)=>b.get(ie(s,d)),me=(s,d)=>{const A=M(d.rawMetadata),v=et(A),C=M(d.aggregations),j=M(d.fieldMetadata);return r=s.scope.semanticLayerId,n=A,a=v,i=j,l=C,u=M(d.capabilities),m=d.datasourceType,f=M(s.groupedDimensions),i.groupedDimensions={...f},h=s,M(i)},Z=s=>(I!==void 0&&I!==s&&(b.forEach(d=>{d.invalidated=!0}),b.clear(),_()),I=s,s),Ue=s=>{const d=oe(s);if(!d){E+=1,P.forEach(v=>{v.invalidated=!0}),b.forEach(v=>{v.invalidated=!0}),b.clear(),_();return}const A=$(s,d);P.forEach(v=>{v.scope&&Fe({scope:v.scope},A)&&(v.invalidated=!0)}),b.forEach(v=>{Fe(v,A)&&(v.invalidated=!0,b.delete(v.key))}),h&&Fe(h,A)&&(h.invalidated=!0,_())},gt=async(s,d)=>{const A=E,v=t.metadataLoadContext?await t.metadataLoadContext(Z):void 0,C=v?v.authority:t.metadataCacheAuthority?await t.metadataCacheAuthority():"default",j=()=>{if(d.invalidated||A!==E)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.")};if(j(),v&&!v.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed during metadata load; retry.");const F=Z(C),z=()=>{if(I!==F||v&&!v.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed during metadata load; retry.")},B=async()=>{const N=!v&&t.metadataCacheAuthority?await t.metadataCacheAuthority():F;j(),v||Z(N),z()};z();const Q=oe(s);if(!Q){if(i)return M(i);throw Ae()}const W=d.scope??$(s,Q),q=G(s,W);let U=ye(F,W);if(U?.snapshot&&U.expiresAt<=Date.now()&&(U.invalidated=!0,b.delete(U.key),U=void 0),!U){const N=ie(F,W),R={key:N,authority:F,generation:E,scope:W,groupedDimensions:{},expiresAt:0,invalidated:!1,promise:Promise.resolve(void 0)},Ce=g.then(async()=>{if(d.invalidated||R.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");z();const se=await K(q,Q,v?.data??e);if(await B(),d.invalidated||R.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");if(R.generation!==E)throw R.invalidated=!0,new Error("Astrato SDK visualization engine metadata was invalidated; retry.");return R.snapshot=se,R.expiresAt=Date.now()+T,R.groupedDimensions=M(se.fieldMetadata.groupedDimensions??{}),R.invalidated||(b.delete(N),b.set(N,R),k()),me(R,se)}).catch(se=>{throw b.get(N)===R&&b.delete(N),se});return R.promise=Ce,b.set(N,R),g=Ce.then(()=>{},()=>{}),Ce}const J=U;if(J.snapshot){const N=J.snapshot;b.delete(J.key),b.set(J.key,J);const R=g.then(async()=>{if(await B(),d.invalidated||J.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");if(J.generation!==E)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");return me(J,N)});return g=R.then(()=>{},()=>{}),R}return J.promise.then(N=>M(N))},_e=async s=>{const d=oe(s),A={scope:d?$(s,d):h?.scope,invalidated:!1};P.add(A);try{const v=await gt(s,A);if(A.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");return v}finally{P.delete(A)}},he=s=>{const d=oe(s);if(!i)throw Ae();if(d&&r!==d)throw new Error(`Astrato SDK visualization engine metadata is loaded for "${r}", not "${d}". Call engine.fields.getFieldMetadata({ semanticLayerId }) before reading field lists.`);if(h){const A=d?$(s,d):{tenantId:Ke(s)??t.context?.tenantId,semanticLayerId:h.scope.semanticLayerId,datasourceType:be(s)??t.context?.datasourceType},v=h.snapshot?.datasourceType??h.scope.datasourceType;if(A.tenantId!==void 0&&h.scope.tenantId!==A.tenantId)throw new Error(`Astrato SDK visualization engine metadata is loaded for tenant "${h.scope.tenantId}", not "${A.tenantId}". Call engine.fields.getFieldMetadata({ semanticLayerId, tenantId }) before reading field lists.`);if(A.datasourceType!==void 0&&v!==A.datasourceType)throw new Error(`Astrato SDK visualization engine metadata is loaded for datasource "${v}", not "${A.datasourceType}". Call engine.fields.getFieldMetadata({ semanticLayerId, datasourceType }) before reading field lists.`)}return i},re=(s,d)=>(he(s),d()),pt=s=>{const d=he(),A=it(d.dimensions??[]),v={...f};A.forEach(({identifiers:C,levelCount:j})=>{const F=C.map(q=>f[q]).find(q=>q!==void 0),z=C.flatMap(q=>{const U=s[q];if(U===void 0)return[];if(!Number.isInteger(U)||U<0||U>=j)throw new Error(`Astrato SDK visualization engine expected grouped dimension "${q}" level to be an integer between 0 and ${j-1}.`);return U===F?[]:[U]}),B=new Set(z);if(B.size>1)throw new Error(`Astrato SDK visualization engine received conflicting levels for grouped dimension identifiers ${C.map(q=>`"${q}"`).join(", ")}.`);const[Q]=B,W=Q??F??0;C.forEach(q=>{v[q]=W})}),f=v,i={...d,groupedDimensions:{...f}},h&&(h.groupedDimensions=M(f))},yt=s=>{if(!a||!D(s))return s;const d=O(s,"itemKey");if(!d)return s;const A=a.items.find(W=>O(W,"key")===d),v=A?.dimension;if(!A||!D(v)||!D(v.group))return s;const C=v.group.fieldKeys;if(!Array.isArray(C))return s;const j=O(A,"id"),F=(j?f[j]:void 0)??f[d]??0,z=C[F];if(typeof z!="string")return s;const B={...s,fieldKey:z},Q=O(a.fieldEntriesByKey.get(z)?.field,"name");return delete B.itemKey,Q&&(B.label=Q),B},Be=s=>D(s)?D(s.query)?{...s,query:Be(s.query)}:Array.isArray(s.dimensions)?{...s,dimensions:s.dimensions.map(yt)}:s:s,qe=s=>{if(i){he(s);const d=nr(s);d&&he({...s,semanticLayerId:d})}return cr({...s,query:Be(s.query)})};return{get capabilities(){return p(),M(u)},get databaseInfo(){const s=c();return M({...s,items:p().items})},get localeSettings(){const s=c().locale;return D(s)?M(s):{}},fields:{getFieldMetadata:_e,invalidateMetadata:Ue,refreshMetadata:async s=>{if(!oe(s))throw new Error("Astrato SDK metadata refresh requires semanticLayerId.");return Ue(s),_e(s)},getFields:s=>M(re(s,()=>Re(p(),l,ke(s)))),getDimensionsList:s=>M(re(s,()=>De(p(),["dimension"],ke(s)))),getGroupedDimensions:s=>M(re(s,()=>({...f}))),setGroupedDimensions:pt,getMeasuresList:s=>M(re(s,()=>De(p(),["measure","calculation"],ke(s)))),getValidFields:s=>M(re(s,()=>{const[d]=ar(s);return Re(p(),l,d)})),getViewsFields:s=>M(re(s,()=>Yt(p(),l,ir(s))))},transformQuery:qe,getData:async s=>{const d=pr(s,t.context),A=or(d),v=(o.get(A)??0)+1;o.set(A,v);const C=t.metadataLoadContext?await t.metadataLoadContext(Z):void 0;if(C){if(!C.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed before query execution; retry.");Z(C.authority)}const j=be(d)??m,F=await(C?.data??e).query({...d,query:qe(d)});if(C&&!C.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed during query execution; retry.");if(o.get(A)===v){const z=fr(F,d,j);z&&x.set(A,z)}return F},getLastQueryMetadata:s=>{const d=x.get(s);return d?gr(d):void 0},getQueryInsights:async s=>{if(!e.getQueryInsights)throw new Error("Astrato SDK visualization engine query insights service is not configured.");return e.getQueryInsights(s)},areFieldsConnected:(s,d)=>Bt(p(),s,d),areViewsConnected:(s,d=[])=>_t(p(),s,d)}},mr=()=>({debug:(e,t)=>{console.debug(e,t)},error:(e,t)=>{console.error(e,t)},info:(e,t)=>{console.info(e,t)},warn:(e,t)=>{console.warn(e,t)}});class hr extends Error{constructor(t,r={}){super(t),this.name="AstratoTransportError",this.responseBody=r.responseBody,this.status=r.status}}const wr=(e,t)=>e?new URL(t,e.endsWith("/")?e:`${e}/`).toString():t,vr=(e,t)=>{if(e!=null)return typeof e=="string"||typeof FormData<"u"&&e instanceof FormData||typeof URLSearchParams<"u"&&e instanceof URLSearchParams?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))},br=async e=>{const t=await e.text();if(!t)return;if((e.headers.get("content-type")??"").includes("application/json"))try{return JSON.parse(t)}catch(n){if(e.ok)throw n;return t}return t},Ar=(e={})=>({request:async t=>{const r=e.fetch??globalThis.fetch?.bind(globalThis);if(!r)throw new Error("Fetch is not available. Provide a custom Astrato transport.");const n=new Headers(e.defaultHeaders);new Headers(t.headers).forEach((l,u)=>{n.set(u,l)});const a=await r(wr(e.baseUrl,t.url),{body:vr(t.body,n),headers:n,method:t.method??"GET",signal:t.signal}),i=await br(a);if(!a.ok)throw new hr(`Astrato request failed with status ${a.status}`,{responseBody:i,status:a.status});return i}}),Ir=e=>{let t=!1;return e.forEach(()=>{t=!0}),t},Er=e=>{let t,r=0,n=0,a=0;const i={isCurrent:l=>l.authority===`sdk-auth-${r}`,resolve:async()=>{const l=++n,u=new Headers(e?.headers);if(e){const f=e.token??await e.getAccessToken?.();f&&!u.has("authorization")&&u.set("authorization",`Bearer ${f}`)}const m=JSON.stringify(Array.from(u.entries()));if(l<a&&m!==t)throw new Error("Astrato SDK authentication changed during credential resolution; retry.");return a=Math.max(a,l),m!==t&&(r+=1,t=m,i.onAuthorityChange?.(`sdk-auth-${r}`)),{headers:u,authority:`sdk-auth-${r}`}}};return i},tt=(e,t)=>({request:async r=>{const{headers:n}=await t.resolve(),a=new Headers(n);new Headers(r.headers).forEach((l,u)=>{a.set(u,l)});const i={...r};return Ir(a)&&(i.headers=a),e.request(i)}}),Sr=e=>{const t=e.logger??mr(),r=!e.events,n=e.events??wt(),a=e.transport??Ar({baseUrl:e.baseUrl}),i=Er(e.auth),l=tt(a,i),u=async(S,T=l)=>{n.emit("transport:request",{method:S.method??"GET",url:S.url},{scope:{sessionId:e.sessionId}});try{const x=await T.request(S);return n.emit("transport:response",{method:S.method??"GET",url:S.url},{scope:{sessionId:e.sessionId}}),x}catch(x){throw t.error("Astrato SDK request failed",{error:x,method:S.method??"GET",url:S.url}),n.emit("transport:error",{error:x,method:S.method??"GET",url:S.url},{scope:{sessionId:e.sessionId}}),x}},m={...e.context,tenantId:e.tenantId??e.context?.tenantId},f={context:m,endpoints:e.endpoints?.data},g=e.hostServices?.data??He(u,f),h=async()=>{const S=await i.resolve(),T=tt(a,{resolve:async()=>S});return{authority:S.authority,isCurrent:()=>i.isCurrent(S),data:e.hostServices?.data??He(x=>u(x,T),f)}};let I;const E=!e.hostServices?.engine&&!!e.visualizationEngine,b=e.hostServices?.engine??(e.visualizationEngine?yr(g,{context:m,metadataCache:e.metadataCache,metadataLoadContext:S=>(i.onAuthorityChange=S,I??(I=h().finally(()=>{I=void 0})),I)}):void 0),P=$t({...e.hostServices,data:g,...b?{engine:b}:{}});return t.debug("Astrato SDK client created",{baseUrl:e.baseUrl}),{baseUrl:e.baseUrl,events:n,hostServices:P,logger:t,services:P,request:S=>u(S),reportError:(S,T={})=>{t.error("Astrato SDK error",{...T,error:S}),n.emit("sdk:error",{context:T,error:S},{scope:{sessionId:e.sessionId}})},destroy:()=>{E&&(i.onAuthorityChange=void 0,b?.fields.invalidateMetadata?.()),r&&n.clear()}}},fe=1,rt=512e3,st=4e6,Ve=32,ct=3e4,ge="astrato-sdk-iframe";class Te extends Error{constructor(t,r){super(r),this.code=t,this.name="AstratoIframeBridgeError"}}const Y=e=>({kind:ge,version:fe,...e}),X=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),dt=e=>{try{const t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.origin===e}catch{return!1}},lt=e=>Number.isFinite(e)&&e>=1&&e<=12e4,pe=(e,t,r)=>{const n=new WeakSet,a=new TextEncoder;let i=0,l=0;const u=g=>{if(l+=g,l>t)throw L("limit")},m=(g,h)=>{if(++i>1e5||h>32)throw L("limit");if(g===void 0&&h>0){u(4);return}if(g===null||typeof g=="boolean"){u(1);return}if(typeof g=="string"){if(g.length>t)throw L("limit");u(a.encode(g).length+2);return}if(typeof g=="number"&&Number.isFinite(g)){u(1);return}if(typeof g!="object"||n.has(g))throw L(r);if(n.add(g),u(2),Array.isArray(g))for(const I of g)m(I,h+1);else{const I=Object.getPrototypeOf(g);if(I!==null&&Object.getPrototypeOf(I)!==null)throw L(r);for(const[E,b]of Object.entries(g))if(b!==void 0){if(E.length>t)throw L("limit");u(a.encode(E).length+3),m(b,h+1)}}n.delete(g)};m(e,0);const f=JSON.stringify(e);if(f===void 0)throw L(r);if(a.encode(f).length>t)throw L("limit");return JSON.parse(f)},ne=e=>new Te("invalid_request",e),Dr=["GET","POST","PATCH","PUT","DELETE"],Lr=new Set(["authorization","cookie","proxy-authorization","x-api-key"]),ut=e=>{if(!X(e))throw ne("Bridge request is invalid.");const t=e.method,r=e.url,n=e.headers;if(typeof t!="string"||!Dr.includes(t))throw ne("Bridge request method is invalid.");if(typeof r!="string"||!r||r.length>2048||r.startsWith("/")||/^[a-z][a-z\d+.-]*:/i.test(r)||/[\\#]/.test(r)||Array.from(r).some(l=>l.charCodeAt(0)<32)||/(?:^|\/)(?:\.|%2e){1,2}(?:\/|$)/i.test(r.split("?",1)[0]))throw ne("Bridge request URL must be a relative SDK path.");if(!X(n)||Object.keys(n).length>32)throw ne("Bridge request headers are invalid.");const a={};for(const[l,u]of Object.entries(n)){if(!/^[!#$%&'*+.^_`|~\dA-Za-z-]+$/.test(l)||Lr.has(l.toLowerCase())||typeof u!="string"||u.length>2048||/[\r\n]/.test(u))throw ne("Bridge request headers are invalid.");a[l.toLowerCase()]=u}const i={method:t,url:r,headers:a};"body"in e&&(i.body=pe(e.body,rt,"invalid_request"));try{pe(i,rt,"invalid_request")}catch(l){throw l instanceof Te?l:ne("Bridge request body must be JSON.")}return i},Tr=["datasourceType","workbookVersionContainerId","sheetId","objectId","role","userId","workbookState"],ft=e=>{if(!X(e)||!X(e.semanticLayer)||!Array.isArray(e.capabilities))throw L("protocol");const t=e.tenantId,r=e.semanticLayer,n=r.id,a=r.datasourceType,i=e.capabilities;if(typeof t!="string"||!t||t.length>256||typeof n!="string"||!n||n.length>256||a!==void 0&&(typeof a!="string"||a.length>128)||i.length>32||!i.every(m=>typeof m=="string"&&m.length<=128))throw L("protocol");const l={};if(e.requestContext!==void 0){if(!X(e.requestContext))throw L("protocol");for(const m of Tr){const f=e.requestContext[m];if(f!==void 0){if(typeof f!="string"||f.length>256)throw L("protocol");l[m]=f}}}const u={tenantId:t,semanticLayer:{id:n,...a===void 0?{}:{datasourceType:a}},capabilities:[...i],...Object.keys(l).length?{requestContext:l}:{}};return pe(u,16e3,"protocol"),Object.freeze(u.semanticLayer),Object.freeze(u.capabilities),u.requestContext&&Object.freeze(u.requestContext),Object.freeze(u)},Cr=e=>e==="aborted"||e==="closed"||e==="host_error"||e==="invalid_request"||e==="invalid_response"||e==="limit"||e==="protocol"||e==="timeout"?e:void 0,Mr=e=>{switch(e){case"host_error":return"Astrato host request failed.";case"protocol":return"Astrato iframe bridge protocol is incompatible.";case"invalid_response":return"Astrato iframe bridge response is invalid.";case"timeout":return"Astrato iframe bridge request timed out.";case"aborted":return"Astrato iframe bridge request was aborted.";case"closed":return"Astrato iframe bridge is closed.";case"limit":return"Astrato iframe bridge limit exceeded.";default:return"Astrato iframe bridge request is invalid."}},L=e=>new Te(e,Mr(e)),Le=(e,t)=>{try{e.postMessage(t)}catch{}},kr=e=>{const t=e.hostWindow??window,r=e.timeoutMs??ct,n=e.maxConcurrentRequests??16;if(e.childOrigin!=="null"&&!dt(e.childOrigin))throw new Error("Invalid child origin.");const a=ft(e.context);if(!lt(r))throw new Error("Invalid iframe bridge timeout.");if(!Number.isInteger(n)||n<1||n>Ve)throw new Error("Invalid iframe bridge concurrency limit.");let i=!1,l=!1,u=e.initialLoadComplete??!1,m;const f=new Map,g=new Set,h=[],I=o=>{for(const c of f.values())clearTimeout(c.timer),c.responded=!0,c.controller.abort(),g.add(c);for(const{controller:c,timer:p}of h)clearTimeout(p),c.abort();f.clear(),h.length=0,m&&(o&&Le(m,Y({type:"disconnect"})),m.onmessage=null,m.onmessageerror=null,m.close(),m=void 0)},E=(o,c)=>{m===o&&!i&&Le(o,Y(c))},b=()=>{for(;!i&&f.size+g.size<n&&h.length>0;){const o=h.shift();if(!o)break;if(m!==o.port){clearTimeout(o.timer),o.controller.abort();continue}f.set(o.id,o),Promise.resolve().then(()=>o.controller.signal.aborted?void 0:e.request(o.request,o.controller.signal)).then(c=>{if(!(f.get(o.id)!==o&&!g.has(o))){if(clearTimeout(o.timer),f.get(o.id)===o&&f.delete(o.id),g.delete(o),!o.responded)try{const p=c===void 0?void 0:pe(c,st,"invalid_response");E(o.port,{type:"response",id:o.id,ok:!0,value:p})}catch{E(o.port,{type:"response",id:o.id,ok:!1,error:"invalid_response"})}b()}},()=>{f.get(o.id)!==o&&!g.has(o)||(clearTimeout(o.timer),f.get(o.id)===o&&f.delete(o.id),g.delete(o),o.responded||E(o.port,{type:"response",id:o.id,ok:!1,error:"host_error"}),b())})}},P=(o,c)=>{if(i||m!==o)return;const p=c.data;if(!X(p)||p.kind!==ge)return;if(p.version!==fe){I(!0);return}if(p.type==="disconnect"){I(!1);return}if(typeof p.id!="string"||!/^[\w-]{1,128}$/.test(p.id))return;const y=p.id;if(p.type==="cancel"){const k=f.get(y);if(k)clearTimeout(k.timer),k.responded=!0,k.controller.abort();else{const $=h.findIndex(G=>G.id===y);if($!==-1){const[G]=h.splice($,1);clearTimeout(G.timer),G.controller.abort()}}return}if(p.type!=="request")return;if(f.has(y)||h.some(k=>k.id===y)){E(o,{type:"response",id:y,ok:!1,error:"protocol"});return}let w;try{w=ut(p.request)}catch(k){const $=k instanceof Te?k.code:"invalid_request";E(o,{type:"response",id:y,ok:!1,error:$});return}if(f.size+g.size+h.length>=Ve){E(o,{type:"response",id:y,ok:!1,error:"limit"});return}const K=new AbortController,_=setTimeout(()=>{const k=f.get(y);if(k?.controller===K)k.responded=!0;else{const $=h.findIndex(G=>G.id===y&&G.controller===K);if($===-1)return;h.splice($,1)}K.abort(),E(o,{type:"response",id:y,ok:!1,error:"timeout"}),b()},r);h.push({id:y,request:w,controller:K,timer:_,port:o,responded:!1}),b()},S=o=>{if(i||o.source!==e.iframe.contentWindow||o.origin!==e.childOrigin)return;const c=o.data;if(!X(c)||c.kind!==ge||c.type!=="ready"||typeof c.nonce!="string"||!/^[\w-]{16,128}$/.test(c.nonce))return;if(c.version!==fe){e.iframe.contentWindow?.postMessage(Y({type:"incompatible",nonce:c.nonce}),e.childOrigin==="null"?"*":e.childOrigin);return}I(!0);const p=e.channelFactory?.()??new MessageChannel;m=p.port1;const y=m;y.onmessage=w=>P(y,w),y.onmessageerror=()=>I(!0),y.start();try{e.iframe.contentWindow?.postMessage(Y({type:"connected",nonce:c.nonce,context:a}),e.childOrigin==="null"?"*":e.childOrigin,[p.port2]),l=!0}catch{I(!1),p.port2.close()}},T=()=>{i||(i=!0,t.removeEventListener("message",S),t.removeEventListener("pagehide",T),e.iframe.removeEventListener("load",x),I(!0))},x=()=>{u?l&&T():u=!0};return t.addEventListener("message",S),t.addEventListener("pagehide",T),e.iframe.addEventListener("load",x),{destroy:T}};let te,ze,le,Pe;const Fr=()=>te,jr=e=>{if(!dt(e.parentOrigin))return Promise.reject(new Error("Invalid trusted parent origin."));const t=e.guestWindow??window;if(t.parent===t)return Promise.reject(new Error("Astrato iframe bridge requires a parent frame."));const r=e.timeoutMs??ct;return lt(r)?te?ze===e.parentOrigin?Promise.resolve(te):Promise.reject(L("protocol")):le?Pe===e.parentOrigin?le:Promise.reject(L("protocol")):(Pe=e.parentOrigin,le=new Promise((n,a)=>{const i=Array.from(crypto.getRandomValues(new Uint8Array(16)),g=>g.toString(16).padStart(2,"0")).join("");let l=!1;const u=(g,h)=>{l||(l=!0,clearTimeout(f),t.removeEventListener("message",m),le=void 0,Pe=void 0,g?n(g):a(h??L("protocol")))},m=g=>{if(g.source!==t.parent||g.origin!==e.parentOrigin)return;const h=g.data;if(!X(h)||h.kind!==ge||h.nonce!==i)return;if(h.type==="incompatible"){u(void 0,L("protocol"));return}if(h.type!=="connected")return;if(h.version!==fe){u(void 0,L("protocol"));return}if(g.ports.length!==1||!g.ports[0]){u(void 0,L("protocol"));return}let I;try{I=ft(h.context)}catch{u(void 0,L("protocol"));return}const E=g.ports[0];let b=!1,P=0;const S=new Set,T=new Map,x=y=>{if(!b){b=!0,t.removeEventListener("pagehide",p),y&&Le(E,Y({type:"disconnect"})),E.onmessage=null,E.onmessageerror=null,E.close();for(const w of T.values())w.cleanup(),w.reject(L("closed"));T.clear();for(const w of S)w.destroy();S.clear(),te===c&&(te=void 0,ze=void 0)}},o={request:y=>{if(b)return Promise.reject(L("closed"));if(T.size>=Ve)return Promise.reject(L("limit"));if(y.signal?.aborted)return Promise.reject(L("aborted"));let w;try{const _={};new Headers(y.headers).forEach((k,$)=>{_[$]=k}),w=ut({method:y.method??"GET",url:y.url,headers:_,...y.body===void 0?{}:{body:y.body}})}catch(_){return Promise.reject(_)}const K=`${Date.now()}-${++P}`;return new Promise((_,k)=>{const $=me=>{const Z=T.get(K);Z&&(T.delete(K),Z.cleanup(),Le(E,Y({type:"cancel",id:K})),k(L(me)))},G=setTimeout(()=>$("timeout"),r),ie=()=>$("aborted"),ye=()=>{clearTimeout(G),y.signal?.removeEventListener("abort",ie)};y.signal?.addEventListener("abort",ie,{once:!0}),T.set(K,{resolve:_,reject:k,cleanup:ye});try{E.postMessage(Y({type:"request",id:K,request:w}))}catch{T.delete(K),ye(),k(L("closed"))}})}},c={context:I,createClient:()=>{if(b)throw L("closed");const y=Sr({baseUrl:"",tenantId:I.tenantId,context:{...I.requestContext,tenantId:I.tenantId,datasourceType:I.semanticLayer.datasourceType},transport:o,visualizationEngine:!0}),w=y.destroy;return y.destroy=()=>{S.delete(y),w()},S.add(y),y},destroy:()=>x(!0)},p=()=>x(!0);t.addEventListener("pagehide",p),E.onmessage=y=>{const w=y.data;if(!X(w)||w.kind!==ge){x(!1);return}if(w.version!==fe){x(!1);return}if(w.type==="disconnect"){x(!1);return}if(w.type!=="response"||typeof w.id!="string"){x(!1);return}const K=T.get(w.id);if(K)if(T.delete(w.id),K.cleanup(),w.ok===!0&&!("error"in w))try{K.resolve(w.value===void 0?void 0:pe(w.value,st,"invalid_response"))}catch{K.reject(L("invalid_response"))}else w.ok===!1&&!("value"in w)&&Cr(w.error)?K.reject(L(w.error)):K.reject(L("invalid_response"))},E.onmessageerror=()=>x(!1),E.start(),te?.destroy(),te=c,ze=e.parentOrigin,u(c)},f=setTimeout(()=>u(void 0,L("timeout")),r);t.addEventListener("message",m);try{t.parent.postMessage(Y({type:"ready",nonce:i}),e.parentOrigin)}catch{u(void 0,L("closed"))}}),le):Promise.reject(new Error("Invalid iframe bridge timeout."))};export{fe as ASTRATO_IFRAME_BRIDGE_PROTOCOL_VERSION,Te as AstratoIframeBridgeError,hr as AstratoTransportError,jr as connectAstratoIframeBridge,Sr as createAstratoClient,wt as createAstratoEventBus,kr as createAstratoIframeHostBridge,mr as createConsoleLogger,He as createDirectDataService,Ar as createFetchTransport,kt as createMemorySelectionService,Ft as createMemoryVariableService,yr as createVisualizationEngineService,Fr as getAstratoIframeBridge};
|
|
1
|
+
import{Subject as mt,filter as Ne,BehaviorSubject as ce}from"rxjs";const Ge=(e,t)=>t?!(t.groupId&&e?.groupId!==t.groupId||t.instanceId&&e?.instanceId!==t.instanceId||t.sessionId&&e?.sessionId!==t.sessionId):!0,ht=(e,t)=>e.name===t,wt=()=>{const e=new mt,t=new Set,r=n=>(t.add(n),()=>{n.unsubscribe(),t.delete(n)});return{events$:e.asObservable(),emit:(n,a,i={})=>{e.next({name:n,payload:a,scope:i.scope,source:i.source,timestamp:i.timestamp??Date.now()})},on:(n,a,i)=>r(e.pipe(Ne(l=>ht(l,n)&&Ge(l.scope,i?.scope))).subscribe(a)),onAny:(n,a)=>r(e.pipe(Ne(i=>Ge(i.scope,a?.scope))).subscribe(i=>{n(i)})),clear:()=>{t.forEach(n=>{n.unsubscribe()}),t.clear()}}},vt={aggregations:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/data/aggrfunctions/${encodeURIComponent(t)}`,capabilities:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/data/capabilities/${encodeURIComponent(t)}`,datasource:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/schema/datasources/${encodeURIComponent(t)}`,queryInsights:e=>`api/message/tenants/${encodeURIComponent(e)}/data/queryinsights`,semanticLayerMetadata:(e,t)=>`api/message/tenants/${encodeURIComponent(e)}/schema/dataviews/${encodeURIComponent(t)}/composite`,query:e=>`api/message/tenants/${encodeURIComponent(e)}/data/execute/query`},bt={objectId:"x-metadata-object-id",role:"x-metadata-role-type",sheetId:"x-metadata-sheet-id",tenantId:"x-metadata-tenant-id",userId:"x-metadata-user-id",workbookState:"x-metadata-workbook-state",workbookVersionContainerId:"x-metadata-workbook-id"},Qe=e=>{const t={};return Object.entries(bt).forEach(([r,n])=>{const a=e[r];a&&(t[n]=a)}),t},At=(e,t)=>({...t,...e.context,tenantId:e.tenantId??e.context?.tenantId??t?.tenantId}),It=(e,t)=>typeof e=="function"?e(t):e,de=(e,t)=>e??t?.tenantId;class Et extends Error{constructor(){super("Astrato data service capacity interrupted the query. Retry it later."),this.code="service_capacity",this.name="AstratoDataCapacityError"}}const St=e=>{const t=e&&typeof e=="object"&&"response"in e?e.response:e;if(t&&typeof t=="object"&&"meta"in t){const r=t.meta;if(r&&typeof r=="object"&&"truncated"in r&&r.truncated===!0&&"truncationReason"in r&&r.truncationReason==="service_capacity")throw new Et}return e},Dt=e=>Array.isArray(e)?e:e&&typeof e=="object"&&"response"in e&&Array.isArray(e.response)?e.response:[],nt=e=>{if(e&&typeof e=="object"&&"response"in e){const t=e.response;return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}return e&&typeof e=="object"&&!Array.isArray(e)?e:{}},Lt=["cacheUsed","metaDataQuery","joinIssue","unionIssue","memoryIssue","pruningIssue"],Tt=["creditsBestCase","creditsWorstCase","creditsFairValue","rowsScanned"],Ct=e=>Lt.every(t=>typeof e[t]=="boolean")&&Tt.every(t=>typeof e[t]=="number"&&Number.isFinite(e[t])),Mt=e=>{const t=nt(e);if(!Ct(t))throw new Error("Astrato SDK query insights response is invalid.");return t},He=(e,t={})=>{const r={...vt,...t.endpoints};return{query:async n=>{const a=At(n,t.context);if(!a.tenantId)throw new Error("Astrato SDK data query requires tenantId in client options or query request.");const i=await e({body:n.query,headers:Qe(a),method:"POST",url:It(r.query,a.tenantId)});return St(i)},getQueryInsights:async n=>{const a=de(n.tenantId,t.context);if(!a)throw new Error("Astrato SDK query insights requires tenantId in client options or insights request.");const i=await e({body:{databaseID:n.semanticLayerId,queryID:n.queryID,...n.startTime===void 0?{}:{startTime:n.startTime}},headers:Qe({...t.context,tenantId:a}),method:"POST",url:r.queryInsights(a)});return Mt(i)},getSemanticLayerMetadata:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK semantic layer metadata requires tenantId in client options or request.");return e({method:"GET",url:r.semanticLayerMetadata(i,n)})},getDatasource:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK datasource metadata requires tenantId in client options or request.");return e({method:"GET",url:r.datasource(i,n)})},getAggregations:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK aggregation metadata requires tenantId in client options or request.");const l=await e({method:"GET",url:r.aggregations(i,n)});return Dt(l)},getCapabilities:async(n,a)=>{const i=de(a,t.context);if(!i)throw new Error("Astrato SDK capability metadata requires tenantId in client options or request.");const l=await e({method:"GET",url:r.capabilities(i,n)});return nt(l)}}},xt="default",H=e=>e??xt,We=()=>({applied:[],pending:[]}),ue=e=>({...e,field:{...e.field},kind:e.kind??"VALUE",values:[...e.values]}),we=e=>({applied:e.applied.map(ue),pending:e.pending.map(ue)}),Je=(e,t)=>t==="ALL"?!0:(e.kind??"VALUE")===t,Me=(e,t)=>({applied:e.applied.filter(r=>Je(r,t)).map(ue),pending:e.pending.filter(r=>Je(r,t)).map(ue)}),ae=e=>e.fieldKey,Kt=e=>e.kind??"VALUE",Ee=e=>`${Kt(e)}:${ae(e.field)}`,Xe=(e,t)=>{if("field"in t){const n=Ee(t);return e.filter(a=>Ee(a)!==n)}const r=ae(t);return e.filter(n=>ae(n.field)!==r)},Ie=(e,t)=>{const r=ue(t),n=Ee(r);let a=!1;const i=e.map(l=>Ee(l)!==n?l:(a=!0,r));return a?i:[...i,r]},Ze=e=>e.reduce(Ie,[]),kt=(e="auto")=>{const t=new Map,r=new Map,n=new Map,a=new Map,i=new Map,l=new ce([]),u=o=>{const c=H(o);let p=t.get(c);return p||(p=We(),t.set(c,p)),p},m=o=>{const c=H(o);let p=n.get(c);if(!p){const y=Me(u(c),"ALL");p={active:new ce(we(y)),applied:new ce(we(y)),pending:new ce(we(y))},n.set(c,p)}return p},f=(o,c)=>{const p=H(o),y=Me(u(p),"ALL"),w=m(p);w.active.next(y),(c==="applied"||c==="both")&&w.applied.next(y),(c==="pending"||c==="both")&&w.pending.next(y)},g=o=>r.get(H(o))??e,h=(o,c)=>{r.set(H(c),o)},I=(o,c)=>a.get(H(c))?.has(ae(o))??!1,E=o=>{const c=u(o);c.pending.length!==0&&(c.applied=c.pending.reduce(Ie,c.applied),c.pending=[],f(o,"both"))},b=o=>{const c=u(o);c.pending.length!==0&&(c.pending=[],f(o,"pending"))},P=o=>{t.set(H(o),We()),f(o,"both")},S=(o,c)=>`${H(o)}:${ae(c)}`,T=(o,c)=>{const p=H(c),y=S(p,o);let w=i.get(y);return w||(w=new ce(!1),i.set(y,w)),w},x=(o,c,p)=>{const y=H(p);let w=a.get(y);w||(w=new Set,a.set(y,w));const K=ae(o);c?w.add(K):w.delete(K),T(o,y).next(c)};return{singleSelectFields$:l.asObservable(),get selectionMode(){return g()},set selectionMode(o){h(o)},getSelectionMode:o=>g(o),setSelectionMode:(o,c)=>{h(o,c)},getSelection:o=>we(u(o)),getActiveSelection:(o="VALUE",c)=>Me(u(c),o),selectValues:(o,c,p)=>{const y=u(o);if(I(c.field,o))return;if((p?.state??(g(o)==="manual"?"pending":"applied"))==="pending"){y.pending=Ie(y.pending,c),f(o,"pending");return}y.applied=Ie(y.applied,c),f(o,"applied")},declineSelection:(o,c)=>{const p=u(o);p.pending=Xe(p.pending,c),f(o,"pending")},removeSelection:(o,c)=>{const p=u(o);p.applied=Xe(p.applied,c),f(o,"applied")},setNewSelectionState:(o,c)=>{t.set(H(o),{applied:Ze(c.applied),pending:Ze(c.pending)}),f(o,"both")},applyPendingSelections:o=>{if(o){E(o);return}Array.from(t.keys()).forEach(E)},clearPendingSelections:o=>{if(o){b(o);return}Array.from(t.keys()).forEach(b)},clearAllSelections:o=>{if(o){P(o);return}t.clear(),n.forEach((c,p)=>{f(p,"both")})},onActiveSelectionChange:o=>m(o).active.asObservable(),onActiveSelectionChangeApplied:o=>m(o).applied.asObservable(),onActiveSelectionChangePending:o=>m(o).pending.asObservable(),isFieldLocked:(o,c)=>I(o,c),isFieldLocked$:(o,c)=>T(o,c).asObservable(),setFieldLocked:x,toggleFieldLocked:(o,c)=>{x(o,!I(o,c),c)}}},Ft=(e=[])=>{const t=new Map;return e.forEach(r=>{t.set(r.id,r)}),{getVariables:r=>Promise.resolve(Array.from(t.values()).filter(n=>!r||n.contextId===r)),resolveValue:(r,n)=>{const a=Array.from(t.values()).find(i=>(i.id===r||i.name===r)&&(!n||i.contextId===n));return Promise.resolve(a?.value)}}},jt=()=>({saveProperties:async(e,t)=>{},saveLocalVSpec:async e=>{}}),zt=()=>({query:()=>Promise.reject(new Error("Astrato SDK data service is not configured. Provide a data service.")),getSemanticLayerMetadata:()=>Promise.reject(new Error("Astrato SDK semantic layer metadata service is not configured. Provide a data service.")),getAggregations:()=>Promise.reject(new Error("Astrato SDK aggregation metadata service is not configured. Provide a data service.")),getCapabilities:()=>Promise.reject(new Error("Astrato SDK capability metadata service is not configured. Provide a data service.")),getDatasource:()=>Promise.reject(new Error("Astrato SDK datasource metadata service is not configured. Provide a data service."))}),R=()=>new Error("Astrato SDK engine service is not configured. Provide an engine service."),Pt=()=>({get capabilities(){throw R()},get databaseInfo(){throw R()},get localeSettings(){throw R()},fields:{getFieldMetadata:()=>Promise.reject(R()),getDimensionsList:()=>{throw R()},getFields:()=>{throw R()},getGroupedDimensions:()=>{throw R()},getMeasuresList:()=>{throw R()},getValidFields:()=>{throw R()},getViewsFields:()=>{throw R()}},transformQuery:()=>{throw R()},getData:()=>Promise.reject(R()),getLastQueryMetadata:()=>{throw R()},getQueryInsights:()=>Promise.reject(R()),areFieldsConnected:()=>{throw R()},areViewsConnected:()=>{throw R()}}),$t=(e={})=>({data:e.data??zt(),engine:e.engine??Pt(),model:e.model??jt(),selections:e.selections??kt(),variables:e.variables??Ft()}),D=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),V=(e,t)=>{const r=e?.[t];return typeof r=="string"?r:void 0},ot=e=>D(e)&&typeof e.name=="string"&&typeof e.view=="string",Ot=(e,t)=>{const r=e[t];return Array.isArray(r)?r:void 0},ve=(e,t)=>{const r=e[t];if(r==null)return[];if(!Array.isArray(r)||!r.every(D))throw new Error(`Astrato SDK visualization engine expected composite metadata.${t} to be an object array.`);return r},xe=(e,t,r)=>{const n=V(e,t);if(!n)throw new Error(`Astrato SDK visualization engine expected ${r}.${t} to be a non-empty string.`);return n},Ye=e=>{if(!D(e))return;const t=e.fieldKey??e.key;return typeof t=="string"?t:void 0},Rt=(e,t)=>{const r=new Map(e.map(i=>[i,i])),n=i=>{const l=r.get(i);if(!l||l===i)return i;const u=n(l);return r.set(i,u),u},a=(i,l)=>{if(!r.has(i)||!r.has(l))return;const u=n(i),m=n(l);u!==m&&r.set(m,u)};return t.forEach(i=>{const l=V(i,"viewID1"),u=V(i,"viewID2");l&&u&&a(l,u)}),new Map(e.map(i=>[i,n(i)]))},et=e=>{if(!Array.isArray(e.views))throw"schemas"in e?new Error("Astrato SDK visualization engine requires the tenant-scoped data view composite endpoint; legacy schemas metadata is not supported."):new Error("Astrato SDK visualization engine expected composite metadata.views to be an object array.");const t=ve(e,"views"),r=ve(e,"joins"),n=ve(e,"items"),a=[],i=new Map,l=new Map,u=[];return t.forEach((m,f)=>{const g=xe(m,"id",`composite metadata.views[${f}]`),h=xe(m,"name",`composite metadata.views[${f}]`),I=l.get(h);if(I&&I!==g)throw new Error(`Astrato SDK visualization engine expected composite view name "${h}" to be unique.`);u.push(g),l.set(h,g),ve(m,"fields").forEach((E,b)=>{const P=xe(E,"key",`composite metadata.views[${f}].fields[${b}]`);if(i.has(P))throw new Error(`Astrato SDK visualization engine expected field key "${P}" to be unique.`);const S={field:E,view:m,viewId:g};a.push(S),i.set(P,S)})}),{componentByViewId:Rt(u,r),fieldEntries:a,fieldEntriesByKey:i,items:n,viewIdsByName:l}},Se=(e,t,r={throwOnUnknownFieldKey:!0})=>{if(ot(t)&&!Ye(t))throw new Error("Astrato SDK visualization engine requires fieldKey/key field identifiers. Legacy { view, name } field identifiers are not supported.");const n=Ye(t);if(!n)return;const a=e.fieldEntriesByKey.get(n);if(!a&&r.throwOnUnknownFieldKey!==!1)throw new Error(`Astrato SDK visualization engine could not find fieldKey "${n}".`);return a},ee=(e,t)=>e.componentByViewId.get(t),Vt=(e,t)=>{if(!t)return e.fieldEntries;const r=Se(e,t);if(!r)return[];const n=ee(e,r.viewId);return e.fieldEntries.filter(a=>ee(e,a.viewId)===n)},$e=(e,t)=>{const r=new Set;return t.forEach(n=>{const a=e.viewIdsByName.get(n),i=a?ee(e,a):void 0;i&&r.add(i)}),r},Ut=(e,t)=>{if(!t.length)return e.fieldEntries;const r=$e(e,t);return r.size?e.fieldEntries.filter(n=>{const a=ee(e,n.viewId);return a?r.has(a):!1}):[]},_t=(e,t,r)=>{const n=$e(e,t),a=$e(e,r);return Array.from(n).some(i=>a.has(i))},Bt=(e,t,r)=>{const n=Se(e,t),a=Se(e,r);return!n||!a?!1:ee(e,n.viewId)===ee(e,a.viewId)},De=(e,t,r)=>{const n=e.items.filter(l=>t.includes(String(l.type)));if(!r)return n;const a=Se(e,r);if(!a)return[];const i=ee(e,a.viewId);return n.filter(l=>(Ot(l,"views")??[]).some(m=>{if(typeof m!="string")return!1;const f=e.viewIdsByName.get(m);return f?ee(e,f)===i:!1}))},Oe="anytype",qt="boolean",Nt="geography",Gt="numeric",Qt="string",Ht=new Set(["date","time","timestamp","timestamp_tz"]),Wt=new Set(["decimal","float","int"]),Jt=e=>{const t=e?.toLowerCase();return t?Wt.has(t)?Gt:t==="string"||Ht.has(t)?Qt:t==="boolean"?qt:t==="geography"?Nt:Oe:Oe},Xt=(e,t)=>{const r=e.dataType?.toLowerCase();return!r||r===Oe?!0:r===Jt(t)},Zt=(e,t)=>{const r=V(e.field,"dataType");return{...e.field,aggregators:t.filter(n=>Xt(n,r)),schema:"legacy",view:V(e.view,"name")}},at=(e,t)=>e.map(r=>Zt(r,t)),Re=(e,t,r)=>at(Vt(e,r),t),Yt=(e,t,r)=>at(Ut(e,r),t),it=e=>e.flatMap(t=>{if(!D(t)||!D(t.dimension))return[];const r=t.dimension.group;if(!D(r)||!Array.isArray(r.fieldKeys)||r.fieldKeys.length===0)return[];const n=Array.from(new Set([V(t,"id"),V(t,"key")].filter(a=>!!a)));return n.length?[{identifiers:n,levelCount:r.fieldKeys.length}]:[]}),er=e=>Object.fromEntries(it(e).flatMap(({identifiers:t})=>t.map(r=>[r,0]))),tr=(e,t)=>{const r=Re(e,t),n=De(e,["dimension"]);return{dimensions:n,fields:r,groupedDimensions:er(n),measures:De(e,["measure","calculation"]),validFields:r,viewsFields:r}},rr=e=>typeof e.fieldKey=="string"||typeof e.key=="string",oe=e=>D(e)&&typeof e.semanticLayerId=="string"?e.semanticLayerId:void 0,nr=e=>{if(!D(e)||!D(e.query))return;const t=D(e.query.query)?e.query.query:e.query;return typeof t.databaseID=="string"?t.databaseID:void 0},Ke=e=>{if(!D(e))return;if(typeof e.tenantId=="string")return e.tenantId;const t=e.context;return D(t)&&typeof t.tenantId=="string"?t.tenantId:void 0},be=e=>{if(!D(e))return;if(typeof e.datasourceType=="string")return e.datasourceType;const t=e.context;return D(t)&&typeof t.datasourceType=="string"?t.datasourceType:void 0},or=e=>{if(!D(e))return;const t=e.context;return D(t)&&typeof t.objectId=="string"?t.objectId:void 0},ke=e=>!D(e)||rr(e)||ot(e)?e:e.selectedField,ar=e=>{if(Array.isArray(e))return e;if(!D(e))return[];const t=e.selectedFields;return Array.isArray(t)?t:[]},ir=e=>{if(Array.isArray(e))return e.filter(r=>typeof r=="string");if(!D(e))return[];const t=e.views;return Array.isArray(t)?t.filter(r=>typeof r=="string"):typeof e.view=="string"?[e.view]:[]},sr=e=>D(e)&&D(e.query),cr=e=>{if(sr(e.query))return e.query;if(!D(e.query))return{query:e.query};const t=e.query.databaseID??e.semanticLayerId;return{query:{...e.query,...t?{databaseID:t}:{}}}},dr=16,lr=300*1e3,M=e=>Array.isArray(e)?e.map(t=>M(t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,r])=>[t,M(r)])):e,Fe=(e,t)=>e.scope.tenantId===t.tenantId&&e.scope.semanticLayerId===t.semanticLayerId&&(t.datasourceType===void 0||e.scope.datasourceType===t.datasourceType),ur=e=>V(e,"datasourceID"),je=(e,t)=>{const r=e?.[t];return typeof r=="number"&&Number.isFinite(r)?r:void 0},fr=(e,t,r)=>{const n=D(e)?e:void 0,a=n&&D(n.response)?n.response:n,i=V(a,"queryID");if(!i)return;const l=n&&D(n.telemetry)?n.telemetry:void 0,u=a&&D(a.meta)?a.meta:void 0,m=a&&Array.isArray(a.warnings)?a.warnings:void 0,f=je(l,"duration"),g=je(l,"start"),h=V(a,"statement"),I=V(a,"queryLink"),E=je(u,"rows"),b=oe(t);return{queryID:i,...f===void 0?{}:{duration:f},...g===void 0?{}:{startTime:g},...h===void 0?{}:{statement:h},...I===void 0?{}:{queryLink:I},...E===void 0?{}:{rows:E},...b===void 0?{}:{semanticLayerId:b},...r===void 0?{}:{vendor:r},...m===void 0?{}:{warnings:[...m]}}},gr=e=>({...e,...e.warnings?{warnings:[...e.warnings]}:{}}),Ae=()=>new Error("Astrato SDK visualization engine metadata is not loaded. Call engine.fields.getFieldMetadata({ semanticLayerId }) or provide a custom engine host service."),pr=(e,t)=>!t&&!e.context?e:{...e,context:{...t,...e.context,tenantId:e.tenantId??e.context?.tenantId??t?.tenantId}},yr=(e,t={})=>{let r,n,a,i,l=[],u={},m,f={},g=Promise.resolve(),h,I,E=0;const b=new Map,P=new Set,S=t.metadataCache?.maxEntries??dr,T=t.metadataCache?.ttlMs??lr;if(!Number.isSafeInteger(S)||S<=0)throw new Error("Astrato SDK visualization engine metadata cache maxEntries must be a positive integer.");if(!Number.isFinite(T)||T<=0)throw new Error("Astrato SDK visualization engine metadata cache ttlMs must be positive.");const x=new Map,o=new Map,c=()=>{if(!n)throw Ae();return n},p=()=>{if(!a)throw Ae();return a},y=async(s,d,A,v)=>{const C=be(d);if(C)return C;const j=ur(s);if(!j||!v.getDatasource)return;const F=await v.getDatasource(j,A),z=D(F)?V(F,"driverName"):void 0;if(!z)throw new Error(`Astrato SDK visualization engine expected datasource "${j}" metadata to include driverName.`);return z},w=(s,d)=>{if(!s)throw new Error(`Astrato SDK visualization engine requires datasource type to load ${d}. Provide datasourceType in the field metadata request or ensure composite metadata includes datasourceID and data.getDatasource is configured.`);return s},K=async(s,d,A)=>{if(!A.getSemanticLayerMetadata)throw new Error("Astrato SDK visualization engine requires data.getSemanticLayerMetadata(semanticLayerId).");const v=Ke(s),C=await A.getSemanticLayerMetadata(d,v);if(!D(C))throw new Error("Astrato SDK visualization engine expected composite semantic layer metadata to be an object.");const j=et(C),F=await y(C,s,v,A),[z,B]=await Promise.all([A.getAggregations?A.getAggregations(w(F,"aggregation metadata"),v):void 0,A.getCapabilities?A.getCapabilities(w(F,"capability metadata"),v):void 0]),Q=z?z.filter(D):[],W=D(B)?B:{};return{rawMetadata:M(C),aggregations:M(Q),capabilities:M(W),datasourceType:F,fieldMetadata:M(tr(j,Q))}},_=()=>{r=void 0,n=void 0,a=void 0,i=void 0,l=[],u={},m=void 0,f={},h=void 0},k=()=>{for(;Array.from(b.values()).filter(s=>s.snapshot).length>S;){const s=Array.from(b.values()).find(d=>d.snapshot);if(!s)return;b.delete(s.key)}},$=(s,d)=>({tenantId:Ke(s)??t.context?.tenantId,semanticLayerId:d,datasourceType:be(s)??t.context?.datasourceType}),G=(s,d)=>({...D(s)?s:{},semanticLayerId:d.semanticLayerId,...d.tenantId===void 0?{}:{tenantId:d.tenantId},...d.datasourceType===void 0?{}:{datasourceType:d.datasourceType}}),ie=(s,d)=>JSON.stringify([s,d.tenantId??"",d.semanticLayerId,d.datasourceType??""]),ye=(s,d)=>b.get(ie(s,d)),me=(s,d)=>{const A=M(d.rawMetadata),v=et(A),C=M(d.aggregations),j=M(d.fieldMetadata);return r=s.scope.semanticLayerId,n=A,a=v,i=j,l=C,u=M(d.capabilities),m=d.datasourceType,f=M(s.groupedDimensions),i.groupedDimensions={...f},h=s,M(i)},Z=s=>(I!==void 0&&I!==s&&(b.forEach(d=>{d.invalidated=!0}),b.clear(),_()),I=s,s),Ue=s=>{const d=oe(s);if(!d){E+=1,P.forEach(v=>{v.invalidated=!0}),b.forEach(v=>{v.invalidated=!0}),b.clear(),_();return}const A=$(s,d);P.forEach(v=>{v.scope&&Fe({scope:v.scope},A)&&(v.invalidated=!0)}),b.forEach(v=>{Fe(v,A)&&(v.invalidated=!0,b.delete(v.key))}),h&&Fe(h,A)&&(h.invalidated=!0,_())},gt=async(s,d)=>{const A=E,v=t.metadataLoadContext?await t.metadataLoadContext(Z):void 0,C=v?v.authority:t.metadataCacheAuthority?await t.metadataCacheAuthority():"default",j=()=>{if(d.invalidated||A!==E)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.")};if(j(),v&&!v.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed during metadata load; retry.");const F=Z(C),z=()=>{if(I!==F||v&&!v.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed during metadata load; retry.")},B=async()=>{const N=!v&&t.metadataCacheAuthority?await t.metadataCacheAuthority():F;j(),v||Z(N),z()};z();const Q=oe(s);if(!Q){if(i)return M(i);throw Ae()}const W=d.scope??$(s,Q),q=G(s,W);let U=ye(F,W);if(U?.snapshot&&U.expiresAt<=Date.now()&&(U.invalidated=!0,b.delete(U.key),U=void 0),!U){const N=ie(F,W),O={key:N,authority:F,generation:E,scope:W,groupedDimensions:{},expiresAt:0,invalidated:!1,promise:Promise.resolve(void 0)},Ce=g.then(async()=>{if(d.invalidated||O.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");z();const se=await K(q,Q,v?.data??e);if(await B(),d.invalidated||O.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");if(O.generation!==E)throw O.invalidated=!0,new Error("Astrato SDK visualization engine metadata was invalidated; retry.");return O.snapshot=se,O.expiresAt=Date.now()+T,O.groupedDimensions=M(se.fieldMetadata.groupedDimensions??{}),O.invalidated||(b.delete(N),b.set(N,O),k()),me(O,se)}).catch(se=>{throw b.get(N)===O&&b.delete(N),se});return O.promise=Ce,b.set(N,O),g=Ce.then(()=>{},()=>{}),Ce}const J=U;if(J.snapshot){const N=J.snapshot;b.delete(J.key),b.set(J.key,J);const O=g.then(async()=>{if(await B(),d.invalidated||J.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");if(J.generation!==E)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");return me(J,N)});return g=O.then(()=>{},()=>{}),O}return J.promise.then(N=>M(N))},_e=async s=>{const d=oe(s),A={scope:d?$(s,d):h?.scope,invalidated:!1};P.add(A);try{const v=await gt(s,A);if(A.invalidated)throw new Error("Astrato SDK visualization engine metadata was invalidated; retry.");return v}finally{P.delete(A)}},he=s=>{const d=oe(s);if(!i)throw Ae();if(d&&r!==d)throw new Error(`Astrato SDK visualization engine metadata is loaded for "${r}", not "${d}". Call engine.fields.getFieldMetadata({ semanticLayerId }) before reading field lists.`);if(h){const A=d?$(s,d):{tenantId:Ke(s)??t.context?.tenantId,semanticLayerId:h.scope.semanticLayerId,datasourceType:be(s)??t.context?.datasourceType},v=h.snapshot?.datasourceType??h.scope.datasourceType;if(A.tenantId!==void 0&&h.scope.tenantId!==A.tenantId)throw new Error(`Astrato SDK visualization engine metadata is loaded for tenant "${h.scope.tenantId}", not "${A.tenantId}". Call engine.fields.getFieldMetadata({ semanticLayerId, tenantId }) before reading field lists.`);if(A.datasourceType!==void 0&&v!==A.datasourceType)throw new Error(`Astrato SDK visualization engine metadata is loaded for datasource "${v}", not "${A.datasourceType}". Call engine.fields.getFieldMetadata({ semanticLayerId, datasourceType }) before reading field lists.`)}return i},re=(s,d)=>(he(s),d()),pt=s=>{const d=he(),A=it(d.dimensions??[]),v={...f};A.forEach(({identifiers:C,levelCount:j})=>{const F=C.map(q=>f[q]).find(q=>q!==void 0),z=C.flatMap(q=>{const U=s[q];if(U===void 0)return[];if(!Number.isInteger(U)||U<0||U>=j)throw new Error(`Astrato SDK visualization engine expected grouped dimension "${q}" level to be an integer between 0 and ${j-1}.`);return U===F?[]:[U]}),B=new Set(z);if(B.size>1)throw new Error(`Astrato SDK visualization engine received conflicting levels for grouped dimension identifiers ${C.map(q=>`"${q}"`).join(", ")}.`);const[Q]=B,W=Q??F??0;C.forEach(q=>{v[q]=W})}),f=v,i={...d,groupedDimensions:{...f}},h&&(h.groupedDimensions=M(f))},yt=s=>{if(!a||!D(s))return s;const d=V(s,"itemKey");if(!d)return s;const A=a.items.find(W=>V(W,"key")===d),v=A?.dimension;if(!A||!D(v)||!D(v.group))return s;const C=v.group.fieldKeys;if(!Array.isArray(C))return s;const j=V(A,"id"),F=(j?f[j]:void 0)??f[d]??0,z=C[F];if(typeof z!="string")return s;const B={...s,fieldKey:z},Q=V(a.fieldEntriesByKey.get(z)?.field,"name");return delete B.itemKey,Q&&(B.label=Q),B},Be=s=>D(s)?D(s.query)?{...s,query:Be(s.query)}:Array.isArray(s.dimensions)?{...s,dimensions:s.dimensions.map(yt)}:s:s,qe=s=>{if(i){he(s);const d=nr(s);d&&he({...s,semanticLayerId:d})}return cr({...s,query:Be(s.query)})};return{get capabilities(){return p(),M(u)},get databaseInfo(){const s=c();return M({...s,items:p().items})},get localeSettings(){const s=c().locale;return D(s)?M(s):{}},fields:{getFieldMetadata:_e,invalidateMetadata:Ue,refreshMetadata:async s=>{if(!oe(s))throw new Error("Astrato SDK metadata refresh requires semanticLayerId.");return Ue(s),_e(s)},getFields:s=>M(re(s,()=>Re(p(),l,ke(s)))),getDimensionsList:s=>M(re(s,()=>De(p(),["dimension"],ke(s)))),getGroupedDimensions:s=>M(re(s,()=>({...f}))),setGroupedDimensions:pt,getMeasuresList:s=>M(re(s,()=>De(p(),["measure","calculation"],ke(s)))),getValidFields:s=>M(re(s,()=>{const[d]=ar(s);return Re(p(),l,d)})),getViewsFields:s=>M(re(s,()=>Yt(p(),l,ir(s))))},transformQuery:qe,getData:async s=>{const d=pr(s,t.context),A=or(d),v=(o.get(A)??0)+1;o.set(A,v);const C=t.metadataLoadContext?await t.metadataLoadContext(Z):void 0;if(C){if(!C.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed before query execution; retry.");Z(C.authority)}const j=be(d)??m,F=await(C?.data??e).query({...d,query:qe(d)});if(C&&!C.isCurrent())throw new Error("Astrato SDK visualization engine authentication changed during query execution; retry.");if(o.get(A)===v){const z=fr(F,d,j);z&&x.set(A,z)}return F},getLastQueryMetadata:s=>{const d=x.get(s);return d?gr(d):void 0},getQueryInsights:async s=>{if(!e.getQueryInsights)throw new Error("Astrato SDK visualization engine query insights service is not configured.");return e.getQueryInsights(s)},areFieldsConnected:(s,d)=>Bt(p(),s,d),areViewsConnected:(s,d=[])=>_t(p(),s,d)}},mr=()=>({debug:(e,t)=>{console.debug(e,t)},error:(e,t)=>{console.error(e,t)},info:(e,t)=>{console.info(e,t)},warn:(e,t)=>{console.warn(e,t)}});class hr extends Error{constructor(t,r={}){super(t),this.name="AstratoTransportError",this.responseBody=r.responseBody,this.status=r.status}}const wr=(e,t)=>e?new URL(t,e.endsWith("/")?e:`${e}/`).toString():t,vr=(e,t)=>{if(e!=null)return typeof e=="string"||typeof FormData<"u"&&e instanceof FormData||typeof URLSearchParams<"u"&&e instanceof URLSearchParams?e:(t.has("content-type")||t.set("content-type","application/json"),JSON.stringify(e))},br=async e=>{const t=await e.text();if(!t)return;if((e.headers.get("content-type")??"").includes("application/json"))try{return JSON.parse(t)}catch(n){if(e.ok)throw n;return t}return t},Ar=(e={})=>({request:async t=>{const r=e.fetch??globalThis.fetch?.bind(globalThis);if(!r)throw new Error("Fetch is not available. Provide a custom Astrato transport.");const n=new Headers(e.defaultHeaders);new Headers(t.headers).forEach((l,u)=>{n.set(u,l)});const a=await r(wr(e.baseUrl,t.url),{body:vr(t.body,n),headers:n,method:t.method??"GET",signal:t.signal}),i=await br(a);if(!a.ok)throw new hr(`Astrato request failed with status ${a.status}`,{responseBody:i,status:a.status});return i}}),Ir=e=>{let t=!1;return e.forEach(()=>{t=!0}),t},Er=e=>{let t,r=0,n=0,a=0;const i={isCurrent:l=>l.authority===`sdk-auth-${r}`,resolve:async()=>{const l=++n,u=new Headers(e?.headers);if(e){const f=e.token??await e.getAccessToken?.();f&&!u.has("authorization")&&u.set("authorization",`Bearer ${f}`)}const m=JSON.stringify(Array.from(u.entries()));if(l<a&&m!==t)throw new Error("Astrato SDK authentication changed during credential resolution; retry.");return a=Math.max(a,l),m!==t&&(r+=1,t=m,i.onAuthorityChange?.(`sdk-auth-${r}`)),{headers:u,authority:`sdk-auth-${r}`}}};return i},tt=(e,t)=>({request:async r=>{const{headers:n}=await t.resolve(),a=new Headers(n);new Headers(r.headers).forEach((l,u)=>{a.set(u,l)});const i={...r};return Ir(a)&&(i.headers=a),e.request(i)}}),Sr=e=>{const t=e.logger??mr(),r=!e.events,n=e.events??wt(),a=e.transport??Ar({baseUrl:e.baseUrl}),i=Er(e.auth),l=tt(a,i),u=async(S,T=l)=>{n.emit("transport:request",{method:S.method??"GET",url:S.url},{scope:{sessionId:e.sessionId}});try{const x=await T.request(S);return n.emit("transport:response",{method:S.method??"GET",url:S.url},{scope:{sessionId:e.sessionId}}),x}catch(x){throw t.error("Astrato SDK request failed",{error:x,method:S.method??"GET",url:S.url}),n.emit("transport:error",{error:x,method:S.method??"GET",url:S.url},{scope:{sessionId:e.sessionId}}),x}},m={...e.context,tenantId:e.tenantId??e.context?.tenantId},f={context:m,endpoints:e.endpoints?.data},g=e.hostServices?.data??He(u,f),h=async()=>{const S=await i.resolve(),T=tt(a,{resolve:async()=>S});return{authority:S.authority,isCurrent:()=>i.isCurrent(S),data:e.hostServices?.data??He(x=>u(x,T),f)}};let I;const E=!e.hostServices?.engine&&!!e.visualizationEngine,b=e.hostServices?.engine??(e.visualizationEngine?yr(g,{context:m,metadataCache:e.metadataCache,metadataLoadContext:S=>(i.onAuthorityChange=S,I??(I=h().finally(()=>{I=void 0})),I)}):void 0),P=$t({...e.hostServices,data:g,...b?{engine:b}:{}});return t.debug("Astrato SDK client created",{baseUrl:e.baseUrl}),{baseUrl:e.baseUrl,events:n,hostServices:P,logger:t,services:P,request:S=>u(S),reportError:(S,T={})=>{t.error("Astrato SDK error",{...T,error:S}),n.emit("sdk:error",{context:T,error:S},{scope:{sessionId:e.sessionId}})},destroy:()=>{E&&(i.onAuthorityChange=void 0,b?.fields.invalidateMetadata?.()),r&&n.clear()}}},fe=1,rt=512e3,st=4e6,Ve=32,ct=3e4,ge="astrato-sdk-iframe";class Te extends Error{constructor(t,r){super(r),this.code=t,this.name="AstratoIframeBridgeError"}}const Y=e=>({kind:ge,version:fe,...e}),X=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),dt=e=>{try{const t=new URL(e);return(t.protocol==="https:"||t.protocol==="http:")&&t.origin===e}catch{return!1}},lt=e=>Number.isFinite(e)&&e>=1&&e<=12e4,pe=(e,t,r)=>{const n=new WeakSet,a=new TextEncoder;let i=0,l=0;const u=g=>{if(l+=g,l>t)throw L("limit")},m=(g,h)=>{if(++i>1e5||h>32)throw L("limit");if(g===void 0&&h>0){u(4);return}if(g===null||typeof g=="boolean"){u(1);return}if(typeof g=="string"){if(g.length>t)throw L("limit");u(a.encode(g).length+2);return}if(typeof g=="number"&&Number.isFinite(g)){u(1);return}if(typeof g!="object"||n.has(g))throw L(r);if(n.add(g),u(2),Array.isArray(g))for(const I of g)m(I,h+1);else{const I=Object.getPrototypeOf(g);if(I!==null&&Object.getPrototypeOf(I)!==null)throw L(r);for(const[E,b]of Object.entries(g))if(b!==void 0){if(E.length>t)throw L("limit");u(a.encode(E).length+3),m(b,h+1)}}n.delete(g)};m(e,0);const f=JSON.stringify(e);if(f===void 0)throw L(r);if(a.encode(f).length>t)throw L("limit");return JSON.parse(f)},ne=e=>new Te("invalid_request",e),Dr=["GET","POST","PATCH","PUT","DELETE"],Lr=new Set(["authorization","cookie","proxy-authorization","x-api-key"]),ut=e=>{if(!X(e))throw ne("Bridge request is invalid.");const t=e.method,r=e.url,n=e.headers;if(typeof t!="string"||!Dr.includes(t))throw ne("Bridge request method is invalid.");if(typeof r!="string"||!r||r.length>2048||r.startsWith("/")||/^[a-z][a-z\d+.-]*:/i.test(r)||/[\\#]/.test(r)||Array.from(r).some(l=>l.charCodeAt(0)<32)||/(?:^|\/)(?:\.|%2e){1,2}(?:\/|$)/i.test(r.split("?",1)[0]))throw ne("Bridge request URL must be a relative SDK path.");if(!X(n)||Object.keys(n).length>32)throw ne("Bridge request headers are invalid.");const a={};for(const[l,u]of Object.entries(n)){if(!/^[!#$%&'*+.^_`|~\dA-Za-z-]+$/.test(l)||Lr.has(l.toLowerCase())||typeof u!="string"||u.length>2048||/[\r\n]/.test(u))throw ne("Bridge request headers are invalid.");a[l.toLowerCase()]=u}const i={method:t,url:r,headers:a};"body"in e&&(i.body=pe(e.body,rt,"invalid_request"));try{pe(i,rt,"invalid_request")}catch(l){throw l instanceof Te?l:ne("Bridge request body must be JSON.")}return i},Tr=["datasourceType","workbookVersionContainerId","sheetId","objectId","role","userId","workbookState"],ft=e=>{if(!X(e)||!X(e.semanticLayer)||!Array.isArray(e.capabilities))throw L("protocol");const t=e.tenantId,r=e.semanticLayer,n=r.id,a=r.datasourceType,i=e.capabilities;if(typeof t!="string"||!t||t.length>256||typeof n!="string"||!n||n.length>256||a!==void 0&&(typeof a!="string"||a.length>128)||i.length>32||!i.every(m=>typeof m=="string"&&m.length<=128))throw L("protocol");const l={};if(e.requestContext!==void 0){if(!X(e.requestContext))throw L("protocol");for(const m of Tr){const f=e.requestContext[m];if(f!==void 0){if(typeof f!="string"||f.length>256)throw L("protocol");l[m]=f}}}const u={tenantId:t,semanticLayer:{id:n,...a===void 0?{}:{datasourceType:a}},capabilities:[...i],...Object.keys(l).length?{requestContext:l}:{}};return pe(u,16e3,"protocol"),Object.freeze(u.semanticLayer),Object.freeze(u.capabilities),u.requestContext&&Object.freeze(u.requestContext),Object.freeze(u)},Cr=e=>e==="aborted"||e==="closed"||e==="host_error"||e==="invalid_request"||e==="invalid_response"||e==="limit"||e==="protocol"||e==="timeout"?e:void 0,Mr=e=>{switch(e){case"host_error":return"Astrato host request failed.";case"protocol":return"Astrato iframe bridge protocol is incompatible.";case"invalid_response":return"Astrato iframe bridge response is invalid.";case"timeout":return"Astrato iframe bridge request timed out.";case"aborted":return"Astrato iframe bridge request was aborted.";case"closed":return"Astrato iframe bridge is closed.";case"limit":return"Astrato iframe bridge limit exceeded.";default:return"Astrato iframe bridge request is invalid."}},L=e=>new Te(e,Mr(e)),Le=(e,t)=>{try{e.postMessage(t)}catch{}},kr=e=>{const t=e.hostWindow??window,r=e.timeoutMs??ct,n=e.maxConcurrentRequests??16;if(e.childOrigin!=="null"&&!dt(e.childOrigin))throw new Error("Invalid child origin.");const a=ft(e.context);if(!lt(r))throw new Error("Invalid iframe bridge timeout.");if(!Number.isInteger(n)||n<1||n>Ve)throw new Error("Invalid iframe bridge concurrency limit.");let i=!1,l=!1,u=e.initialLoadComplete??!1,m;const f=new Map,g=new Set,h=[],I=o=>{for(const c of f.values())clearTimeout(c.timer),c.responded=!0,c.controller.abort(),g.add(c);for(const{controller:c,timer:p}of h)clearTimeout(p),c.abort();f.clear(),h.length=0,m&&(o&&Le(m,Y({type:"disconnect"})),m.onmessage=null,m.onmessageerror=null,m.close(),m=void 0)},E=(o,c)=>{m===o&&!i&&Le(o,Y(c))},b=()=>{for(;!i&&f.size+g.size<n&&h.length>0;){const o=h.shift();if(!o)break;if(m!==o.port){clearTimeout(o.timer),o.controller.abort();continue}f.set(o.id,o),Promise.resolve().then(()=>o.controller.signal.aborted?void 0:e.request(o.request,o.controller.signal)).then(c=>{if(!(f.get(o.id)!==o&&!g.has(o))){if(clearTimeout(o.timer),f.get(o.id)===o&&f.delete(o.id),g.delete(o),!o.responded)try{const p=c===void 0?void 0:pe(c,st,"invalid_response");E(o.port,{type:"response",id:o.id,ok:!0,value:p})}catch{E(o.port,{type:"response",id:o.id,ok:!1,error:"invalid_response"})}b()}},()=>{f.get(o.id)!==o&&!g.has(o)||(clearTimeout(o.timer),f.get(o.id)===o&&f.delete(o.id),g.delete(o),o.responded||E(o.port,{type:"response",id:o.id,ok:!1,error:"host_error"}),b())})}},P=(o,c)=>{if(i||m!==o)return;const p=c.data;if(!X(p)||p.kind!==ge)return;if(p.version!==fe){I(!0);return}if(p.type==="disconnect"){I(!1);return}if(typeof p.id!="string"||!/^[\w-]{1,128}$/.test(p.id))return;const y=p.id;if(p.type==="cancel"){const k=f.get(y);if(k)clearTimeout(k.timer),k.responded=!0,k.controller.abort();else{const $=h.findIndex(G=>G.id===y);if($!==-1){const[G]=h.splice($,1);clearTimeout(G.timer),G.controller.abort()}}return}if(p.type!=="request")return;if(f.has(y)||h.some(k=>k.id===y)){E(o,{type:"response",id:y,ok:!1,error:"protocol"});return}let w;try{w=ut(p.request)}catch(k){const $=k instanceof Te?k.code:"invalid_request";E(o,{type:"response",id:y,ok:!1,error:$});return}if(f.size+g.size+h.length>=Ve){E(o,{type:"response",id:y,ok:!1,error:"limit"});return}const K=new AbortController,_=setTimeout(()=>{const k=f.get(y);if(k?.controller===K)k.responded=!0;else{const $=h.findIndex(G=>G.id===y&&G.controller===K);if($===-1)return;h.splice($,1)}K.abort(),E(o,{type:"response",id:y,ok:!1,error:"timeout"}),b()},r);h.push({id:y,request:w,controller:K,timer:_,port:o,responded:!1}),b()},S=o=>{if(i||o.source!==e.iframe.contentWindow||o.origin!==e.childOrigin)return;const c=o.data;if(!X(c)||c.kind!==ge||c.type!=="ready"||typeof c.nonce!="string"||!/^[\w-]{16,128}$/.test(c.nonce))return;if(c.version!==fe){e.iframe.contentWindow?.postMessage(Y({type:"incompatible",nonce:c.nonce}),e.childOrigin==="null"?"*":e.childOrigin);return}I(!0);const p=e.channelFactory?.()??new MessageChannel;m=p.port1;const y=m;y.onmessage=w=>P(y,w),y.onmessageerror=()=>I(!0),y.start();try{e.iframe.contentWindow?.postMessage(Y({type:"connected",nonce:c.nonce,context:a}),e.childOrigin==="null"?"*":e.childOrigin,[p.port2]),l=!0}catch{I(!1),p.port2.close()}},T=()=>{i||(i=!0,t.removeEventListener("message",S),t.removeEventListener("pagehide",T),e.iframe.removeEventListener("load",x),I(!0))},x=()=>{u?l&&T():u=!0};return t.addEventListener("message",S),t.addEventListener("pagehide",T),e.iframe.addEventListener("load",x),{destroy:T}};let te,ze,le,Pe;const Fr=()=>te,jr=e=>{if(!dt(e.parentOrigin))return Promise.reject(new Error("Invalid trusted parent origin."));const t=e.guestWindow??window;if(t.parent===t)return Promise.reject(new Error("Astrato iframe bridge requires a parent frame."));const r=e.timeoutMs??ct;return lt(r)?te?ze===e.parentOrigin?Promise.resolve(te):Promise.reject(L("protocol")):le?Pe===e.parentOrigin?le:Promise.reject(L("protocol")):(Pe=e.parentOrigin,le=new Promise((n,a)=>{const i=Array.from(crypto.getRandomValues(new Uint8Array(16)),g=>g.toString(16).padStart(2,"0")).join("");let l=!1;const u=(g,h)=>{l||(l=!0,clearTimeout(f),t.removeEventListener("message",m),le=void 0,Pe=void 0,g?n(g):a(h??L("protocol")))},m=g=>{if(g.source!==t.parent||g.origin!==e.parentOrigin)return;const h=g.data;if(!X(h)||h.kind!==ge||h.nonce!==i)return;if(h.type==="incompatible"){u(void 0,L("protocol"));return}if(h.type!=="connected")return;if(h.version!==fe){u(void 0,L("protocol"));return}if(g.ports.length!==1||!g.ports[0]){u(void 0,L("protocol"));return}let I;try{I=ft(h.context)}catch{u(void 0,L("protocol"));return}const E=g.ports[0];let b=!1,P=0;const S=new Set,T=new Map,x=y=>{if(!b){b=!0,t.removeEventListener("pagehide",p),y&&Le(E,Y({type:"disconnect"})),E.onmessage=null,E.onmessageerror=null,E.close();for(const w of T.values())w.cleanup(),w.reject(L("closed"));T.clear();for(const w of S)w.destroy();S.clear(),te===c&&(te=void 0,ze=void 0)}},o={request:y=>{if(b)return Promise.reject(L("closed"));if(T.size>=Ve)return Promise.reject(L("limit"));if(y.signal?.aborted)return Promise.reject(L("aborted"));let w;try{const _={};new Headers(y.headers).forEach((k,$)=>{_[$]=k}),w=ut({method:y.method??"GET",url:y.url,headers:_,...y.body===void 0?{}:{body:y.body}})}catch(_){return Promise.reject(_)}const K=`${Date.now()}-${++P}`;return new Promise((_,k)=>{const $=me=>{const Z=T.get(K);Z&&(T.delete(K),Z.cleanup(),Le(E,Y({type:"cancel",id:K})),k(L(me)))},G=setTimeout(()=>$("timeout"),r),ie=()=>$("aborted"),ye=()=>{clearTimeout(G),y.signal?.removeEventListener("abort",ie)};y.signal?.addEventListener("abort",ie,{once:!0}),T.set(K,{resolve:_,reject:k,cleanup:ye});try{E.postMessage(Y({type:"request",id:K,request:w}))}catch{T.delete(K),ye(),k(L("closed"))}})}},c={context:I,createClient:()=>{if(b)throw L("closed");const y=Sr({baseUrl:"",tenantId:I.tenantId,context:{...I.requestContext,tenantId:I.tenantId,datasourceType:I.semanticLayer.datasourceType},transport:o,visualizationEngine:!0}),w=y.destroy;return y.destroy=()=>{S.delete(y),w()},S.add(y),y},destroy:()=>x(!0)},p=()=>x(!0);t.addEventListener("pagehide",p),E.onmessage=y=>{const w=y.data;if(!X(w)||w.kind!==ge){x(!1);return}if(w.version!==fe){x(!1);return}if(w.type==="disconnect"){x(!1);return}if(w.type!=="response"||typeof w.id!="string"){x(!1);return}const K=T.get(w.id);if(K)if(T.delete(w.id),K.cleanup(),w.ok===!0&&!("error"in w))try{K.resolve(w.value===void 0?void 0:pe(w.value,st,"invalid_response"))}catch{K.reject(L("invalid_response"))}else w.ok===!1&&!("value"in w)&&Cr(w.error)?K.reject(L(w.error)):K.reject(L("invalid_response"))},E.onmessageerror=()=>x(!1),E.start(),te?.destroy(),te=c,ze=e.parentOrigin,u(c)},f=setTimeout(()=>u(void 0,L("timeout")),r);t.addEventListener("message",m);try{t.parent.postMessage(Y({type:"ready",nonce:i}),e.parentOrigin)}catch{u(void 0,L("closed"))}}),le):Promise.reject(new Error("Invalid iframe bridge timeout."))};export{fe as ASTRATO_IFRAME_BRIDGE_PROTOCOL_VERSION,Te as AstratoIframeBridgeError,hr as AstratoTransportError,jr as connectAstratoIframeBridge,Sr as createAstratoClient,wt as createAstratoEventBus,kr as createAstratoIframeHostBridge,mr as createConsoleLogger,He as createDirectDataService,Ar as createFetchTransport,kt as createMemorySelectionService,Ft as createMemoryVariableService,yr as createVisualizationEngineService,Fr as getAstratoIframeBridge};
|