@discoveryjs/discovery
Version:
Frontend framework for rapid data (JSON) analysis, shareable serverless reports and dashboards
2 lines (1 loc) • 12.6 kB
JavaScript
var g=class{listeners;constructor(){this.listeners=Object.create(null)}on(e,s){return this.listeners[e]={callback:s,next:this.listeners[e]||null},this}once(e,s){return this.on(e,function t(...r){s.apply(this,r),this.off(e,t)})}off(e,s){let t=this.listeners[e]||null,r=null;for(;t!==null;){if(t.callback===s){t.callback=null,r?r.next=t.next:this.listeners[e]=t.next;break}r=t,t=t.next}return this}emit(e,...s){let t=this.listeners[e]||null,r=!1;for(;t!==null;)typeof t.callback=="function"&&t.callback.apply(this,s),r=!0,t=t.next;return r}};var h=class{subscriber;value;constructor(e,s){this.subscriber=null,this.value=e,this.shouldUpdate=typeof s=="function"?s:this.shouldUpdate}get readonly(){let e=this;return{subscribe:this.subscribe.bind(this),subscribeSync:this.subscribeSync.bind(this),unsubscribe:this.unsubscribe.bind(this),get value(){return e.value}}}subscribe(e){return this.subscriber={callback:e,subscriber:this.subscriber},()=>this.unsubscribe(e)}subscribeSync(e){let s=this.subscribe(e);return e(this.value,s),s}unsubscribe(e){let s=this,t=this.subscriber;for(;t!==null;){if(t.callback===e){t.callback=null,s.subscriber=t.subscriber;break}s=t,t=t.subscriber}}shouldUpdate(e,s){return e!==s}set(e){return this.#e(e)!==!1}asyncSet(e){let s=this.#e(e);return s===!1?Promise.resolve(!1):Promise.all(s).then(()=>!0)}#e(e){if(!this.shouldUpdate(e,this.value))return!1;let s=[],t=this.subscriber;for(this.value=e;t!==null;){let{callback:r}=t;r!==null&&s.push(r(e,()=>this.unsubscribe(r))),t=t.subscriber}return s}};function m(){return[performance.timeOrigin.toString(16),(1e4*performance.now()).toString(16),Math.random().toString(16).slice(2)].join("-")}var oe=new TextDecoder;var L=typeof Object.hasOwn=="function"?Object.hasOwn:(n,e)=>Object.hasOwnProperty.call(n,e),U={8:"\\b",9:"\\t",10:"\\n",12:"\\f",13:"\\r",34:'\\"',92:"\\\\"},fe=Uint8Array.from({length:2048},(n,e)=>L(U,e)?2:e<32?6:e<128?1:2);var Pe=new Uint8Array([0,0,74,83,79,78,88,76]);var I=2;var O=16,j=32,H=64;var De=~O,Ne=I|j|H,Me=new Uint8Array(256).map((n,e)=>{for(let s=0;s<8;s++)n+=e>>s&1;return n});var A=new Uint32Array(16),Le=A.subarray(0,8),Ue=A.subarray(8,16);var Re=new TextEncoder;var Ie=Math.floor(Number.MAX_SAFE_INTEGER/2),B=new Uint8Array(33);for(let n=0;n<33;n++)B[32-n]=Math.ceil(n/7)||1;var v=new Map,Oe=Object.freeze({hasInlinedEntries:!1,columns:v}),je=Object.freeze({hasInlinedEntries:!0,columns:v});var He=F();function F(){return new Proxy(Object.create(null),{get(n,e){return Object.hasOwn(n,e)?Reflect.get(...arguments):n[e]=0}})}var Be=Object.hasOwnProperty;var Ke=1024*1024/4;function W(n){try{return new URL(n,location.origin).origin===location.origin}catch{return!1}}function $(n){return n.ok}function _(n){return n.headers.get("x-file-encoded-size")||n.headers.get("content-length")}function K(n){return n.headers.get("x-file-size")||(W(n.url)&&!n.headers.get("content-encoding")?n.headers.get("content-length"):void 0)}function J(n){return n.headers.get("x-file-created-at")||n.headers.get("last-modified")||void 0}function E(n,e){if(n instanceof Response){let s=e?.isResponseOk||$,t=e?.getContentSize||K,r=e?.getContentEncodedSize||_,a=e?.getContentCreatedAt||J;if(s(n))return{type:"url",name:n.url,size:Number(t(n))||null,encodedSize:Number(r(n)),createdAt:a(n)}}if(n instanceof File)return{type:"file",name:n.name,size:n.size,createdAt:n.lastModified};if(n instanceof Blob)return{size:n.size};if(ArrayBuffer.isView(n))return{size:n.byteLength};if(typeof n=="string")return{size:n.length}}function G(n){let e=n;return(typeof e=="string"||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e&&!(Symbol.iterator in e)&&!(Symbol.asyncIterator in e))&&(e=[e]),e&&Symbol.iterator in e?new Blob(e):n}function x(n){if(n instanceof ReadableStream)return n;if(n instanceof Response){if(n.body===null)throw new Error("Response has no body");return n.body}return n=G(n),n instanceof Blob?n.stream():new ReadableStream({start(){let e=n!==null&&typeof n=="object"&&Symbol.asyncIterator in n?n[Symbol.asyncIterator]:void 0;if(typeof e!="function")throw new Error("Bad value type (can't convert to a stream)");this.iterator=e()},async pull(e){let{value:s,done:t}=await this.iterator.next();t?(this.iterator=null,e.close()):e.enqueue(s)},cancel(){this.iterator=null}})}var{toString:st,hasOwnProperty:X}=Object.prototype;var Y=Object.hasOwn||((n,e)=>X.call(n,e));var T={inited:{value:0,duration:0,title:"Init"},request:{value:0,duration:.1,title:"Awaiting data"},receiving:{value:.1,duration:.8,title:"Receiving data"},decoding:{value:.9,duration:.015,title:"Decoding data"},received:{value:.915,duration:.01,title:"Await app ready"},prepare:{value:.925,duration:.055,title:"Processing data (prepare)"},initui:{value:.98,duration:.02,title:"Rendering UI"},done:{value:1,duration:0,title:"Done!"},error:{value:1,duration:0,title:"Error"}};function Z(n,e,s){let{value:t,title:r,duration:a}=T[n],o=0,i=null;if(e){let{done:l,elapsed:u,units:c,completed:d,total:f}=e;f?(o=l?1:d/f,i=c==="bytes"?Math.round(o*100)+"%":`${d}/${f}`):(o=l?1:.1+Math.min(.9,u/2e4),i=c==="bytes"?(d/(1024*1024)).toFixed(1)+"MB":String(d))}return{stageTitle:r,progressValue:t+o*a,progressText:i,stepText:s||"",title:i?`${r} (${i})${s?":":"..."}`:n!=="done"?`${r}${s?":":"..."}`:r}}function C(n,e){let s=globalThis.location,t=[],r=({newURL:a,oldURL:o})=>{let i=new URL(a).hash||"#",l=new URL(o).hash||"#";i!==t.shift()&&(e?.debug("locationSync onChange:",l,"->",i),t.length=0,n(i,l))};return addEventListener("hashchange",r),{set(a,o){let i=a||"#";(s.hash||"#")!==i&&(e?.debug("locationSync set:",i,o),t.push(a),o?s.replace(a):s.hash=a)},dispose(){removeEventListener("hashchange",r)}}}var b="[Discovery/embed-host]",P=()=>{},Q=(()=>{try{let n=new ReadableStream;return new MessageChannel().port1.postMessage(n,[n]),!0}catch{return!1}})(),p=class extends g{window;id;actions;dataLoadToken;constructor(e,s,t){super(),this.window=e,this.id=s,this.actions=t,this.dataLoadToken=null}sendMessage(e,s,t){let r={id:this.id,from:"discoveryjs-app",type:e,payload:s||null};this.window.postMessage(r,"*",t)}destroy(){this.destroy=P,this.emit("destroy"),this.dataLoadToken=null,this.window=null,this.sendMessage=P}},w=class n extends p{publicApi;static createPublicApi(e){return Object.freeze({on:e.on.bind(e),once:e.once.bind(e),off:e.off.bind(e),defineAction(s,t){e.actions.set(s,t),e.sendMessage("defineAction",s)},setPageHash(s,t=!1){e.sendMessage("setPageHash",{hash:s,replace:t})},setRouterPreventLocationUpdate(s=!0){e.sendMessage("setRouterPreventLocationUpdate",s)}})}constructor(e,s,t){super(e,s,t),this.publicApi=n.createPublicApi(this)}processMessage(e){switch(e.type){case"loadingState":{this.emit("loadingStateChanged",e.payload);break}}}},S=class n extends p{commandMap;dataLoadToken;pageHash;pageId;pageRef;pageParams;pageAnchor;locationSync;colorScheme;publicApi;static createPublicApi(e){let s={primary:y("primary",e.sendMessage.bind(e),e.commandMap),secondary:y("secondary",e.sendMessage.bind(e),e.commandMap),menu:y("menu",e.sendMessage.bind(e),e.commandMap)};return Object.freeze({pageHash:e.pageHash.readonly,pageId:e.pageId.readonly,pageRef:e.pageRef.readonly,pageAnchor:e.pageAnchor.readonly,pageParams:e.pageParams.readonly,colorScheme:e.colorScheme.readonly,on:e.on.bind(e),once:e.once.bind(e),off:e.off.bind(e),nav:Object.assign(s.secondary,s),notify(t,r){e.sendMessage("notification",{name:t,details:r})},defineAction(t,r){e.actions.set(t,r),e.sendMessage("defineAction",t)},setPageHash(t,r=!1){e.sendMessage("setPageHash",{hash:t,replace:r})},setPageHashState(t,r=!1){e.sendMessage("setPageHashState",{...t,replace:r})},setPageHashStateWithAnchor(t,r=!1){e.sendMessage("setPageHashStateWithAnchor",{...t,replace:r})},setPage(t,r,a,o=!1){e.sendMessage("setPage",{id:t,ref:r,params:a,replace:o})},setPageRef(t,r=!1){e.sendMessage("setPageRef",{ref:t,replace:r})},setPageParams(t,r=!1){e.sendMessage("setPageParams",{params:t,replace:r})},setPageAnchor(t,r=!1){e.sendMessage("setPageAnchor",{anchor:t,replace:r})},setColorSchemeState(t){e.sendMessage("setColorSchemeState",t)},setRouterPreventLocationUpdate(t=!0){e.sendMessage("setRouterPreventLocationUpdate",t)},setLocationSync(t=!0){t&&!e.locationSync?(e.locationSync=C(r=>e.publicApi.setPageHash(r)),e.on("pageHashChanged",e.locationSync.set)):!t&&e.locationSync&&(e.off("pageHashChanged",e.locationSync.set),e.locationSync.dispose(),e.locationSync=null)},unloadData(){e.sendMessage("unloadData",null)},async uploadData(t,r){let a=m();e.dataLoadToken=a;try{return await ee(e,t,r)}finally{e.dataLoadToken===a&&(e.dataLoadToken=null)}}})}constructor(e,s,t){super(e,s,t),this.commandMap=new Map,this.dataLoadToken=null,this.pageHash=new h("#"),this.pageId=new h(""),this.pageRef=new h(null),this.pageParams=new h({}),this.pageAnchor=new h(null),this.locationSync=null,this.colorScheme=new h({state:"unknown",value:"unknown"},(r,a)=>r.state!==a.state||r.value!==a.value),this.publicApi=n.createPublicApi(this)}async processMessage(e){switch(e.type){case"destroy":{this.destroy();break}case"action":{let{callId:s,name:t,args:r}=e.payload,a=this.actions.get(t);if(typeof a=="function")try{this.sendMessage("actionResult",{callId:s,value:await a(...r)})}catch(o){this.sendMessage("actionResult",{callId:s,error:o})}else console.warn(`${b} Action "${t}" was not found`);break}case"navMethod":{let s=this.commandMap.get(e.payload);typeof s=="function"?s():console.warn(`${b} Nav command "${e.payload}" was not found`);break}case"pageHashChanged":{let{replace:s,hash:t,id:r,ref:a,params:o,anchor:i}=e.payload||{},l=String(t).startsWith("#")?t:"#"+t;this.pageHash.set(l),this.pageId.set(r),this.pageRef.set(a),this.pageParams.set(o),this.pageAnchor.set(i),this.emit("pageHashChanged",l,s);break}case"colorSchemeChanged":{let s=e.payload;this.colorScheme.set(s),this.emit("colorSchemeChanged",s);break}case"unloadData":{this.emit("unloadData");break}case"data":{this.emit("data");break}case"loadingState":{this.emit("loadingStateChanged",e.payload);break}default:console.error(`${b} Unknown embed message type "${e.type}"`)}}destroy(){this.locationSync&&(this.locationSync.dispose(),this.locationSync=null),super.destroy()}};function St(n,e,s){let t=Object.assign(new Map,{id:""}),r=null,a,o=typeof e=="function"&&typeof s!="function"?{onPreinit:void 0,onConnect:e}:{onPreinit:e,onConnect:s};return addEventListener("message",l),()=>{removeEventListener("message",l),i()};function i(){r!==null&&(r.destroy(),typeof a=="function"&&a(),r=null,a=void 0)}async function l(u){let c=u.data||{};if(u.isTrusted&&(u.source===n.contentWindow||u.source===null)&&c.from==="discoveryjs-app"){if(c.type==="ready"){i(),t.id!==c.id&&(t.clear(),t.id=c.id);let{colorScheme:d,page:f}=c.payload;r=new S(n.contentWindow,c.id,t),r.pageHash.set(f.hash),r.pageId.set(f.id),r.pageRef.set(f.ref),r.pageParams.set(f.params),r.pageAnchor.set(f.anchor),r.colorScheme.set(d),r.once("destroy",i),a=o.onConnect(r.publicApi);return}if(c.type==="preinit"){i(),typeof o.onPreinit=="function"&&(t.id!==c.id&&(t.clear(),t.id=c.id),r=new w(n.contentWindow,c.id,t),r.once("destroy",i),a=o.onPreinit(r.publicApi));return}if(r?.id===c.id){r.processMessage(c);return}}}}async function ee(n,e,s=E){let t=n.dataLoadToken,r=()=>{if(n?.dataLoadToken!==t)throw new Error("Data upload aborted")};if(!t)throw new Error("No acceptToken specified");let a=typeof e=="function"?await e():await e;r();let o=typeof s=="function"?s(a)||{}:{},i=x(a);if(Q)n.sendMessage("dataStream",{stream:i,resource:o},[i]);else{let l=i.getReader();n.sendMessage("startChunkedDataUpload",{acceptToken:t,resource:o});try{for(;;){let{value:u,done:c}=await l.read();if(r(),n.sendMessage("dataChunk",{acceptToken:t,value:u,done:c},typeof u!="string"&&u?.buffer?[u.buffer]:void 0),c)break}}catch(u){throw n.sendMessage("cancelChunkedDataUpload",{acceptToken:t,error:u}),u}finally{l.releaseLock()}}}function y(n,e,s){function t(r){let a=[];return{commands:a,config:JSON.parse(JSON.stringify(r,(o,i)=>{if(typeof i=="function"){let l="nav-command-"+m();return a.push(l),s.set(l,i),l}return i}))}}return{insert(r,a,o){e("changeNavButtons",{section:n,action:"insert",name:o,position:a,...t(r)})},prepend(r){e("changeNavButtons",{section:n,action:"prepend",...t(r)})},append(r){e("changeNavButtons",{section:n,action:"append",...t(r)})},before(r,a){e("changeNavButtons",{section:n,action:"before",name:r,...t(a)})},after(r,a){e("changeNavButtons",{section:n,action:"after",name:r,...t(a)})},replace(r,a){e("changeNavButtons",{section:n,action:"replace",name:r,...t(a)})},remove(r){e("changeNavButtons",{section:n,action:"remove",name:r})}}}export{St as connectToEmbedApp,Z as decodeStageProgress,T as loadStages};