@formant/data-sdk 1.5.4 → 1.7.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.
@@ -1,3 +1,3 @@
1
- "use strict";var ve=Object.defineProperty;var Te=(a,e,t)=>e in a?ve(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var s=(a,e,t)=>(Te(a,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("date-fns"),S=require("@formant/realtime-sdk"),Ce=require("eventemitter3"),Se=require("pako"),Ee=require("base64-js");function ke(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const u=ke(P),Re="https://api.formant.io";function Oe(a,e){try{if(e.get("formant_stage"))return"https://api-stage.formant.io";if(e.get("formant_dev"))return"https://api-dev.formant.io";if(e.get("formant_local"))return"https://api.formant.local";if(e.get("formant_url")){const t=e.get("formant_url");if(t!==null)try{return new URL(t).origin}catch{console.warn(`Ignoring malformed \`formant_url\` url parameter: ${t}`)}}}catch{}return typeof a<"u"&&"FORMANT_API_URL"in a&&typeof a.FORMANT_API_URL=="string"?a.FORMANT_API_URL:Re}const h=Oe(typeof window<"u"?window:globalThis,new URLSearchParams(typeof window<"u"&&window.location?window.location.search:void 0));class be{constructor({apiUrl:e,refreshAuthToken:t,addAccessTokenRefreshListener:n}){s(this,"_refreshToken");s(this,"_isShareToken",!1);s(this,"_currentOrganization");s(this,"_currentUser");s(this,"_defaultDeviceId");s(this,"_token");s(this,"_waitingForAuth",new Set);s(this,"_refreshTimer");s(this,"_apiUrl");s(this,"_refreshAuthToken");s(this,"_addAccessTokenRefreshListener");this._apiUrl=e,this._refreshAuthToken=t,this._addAccessTokenRefreshListener=n}get token(){return this._token}get currentUser(){return this._currentUser}get currentOrganization(){return this._currentOrganization}get defaultDeviceId(){return this._defaultDeviceId}get refreshToken(){return this._refreshToken}get isShareToken(){return this._isShareToken}async login(e,t){try{const n=await fetch(`${this._apiUrl}/v1/admin/auth/login`,{method:"POST",body:JSON.stringify({email:e,password:t}),headers:{"Content-Type":"application/json"}}),i=await n.json();if(n.status!==200)throw new Error(i.message);return await this.loginWithToken(i.authentication.accessToken,i.authentication.refreshToken),i.authentication}catch(n){return console.error("login() failed",{err:n}),this._waitingForAuth.forEach(i=>i(!1)),this._waitingForAuth.clear(),Promise.reject(n)}}async loginWithToken(e,t){var i;const n=JSON.parse(atob(e.split(".")[1]));try{let o;if(this._isShareToken=n["formant:claims"]&&n["formant:claims"].type=="share",n["formant:claims"]&&(this._currentOrganization=n["formant:claims"].organizationId),n["custom:organization_id"]&&(this._currentOrganization=n["custom:organization_id"]),this._isShareToken||(o=n.sub),n["formant:claims"]&&n["formant:claims"].userId&&(o=n["formant:claims"].userId),o&&((i=this._currentUser)==null?void 0:i.id)!==o){const c=await fetch(`${this._apiUrl}/v1/admin/users/${o}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e}}),d=await c.json();if(c.status!==200)throw new Error(d.message);this._currentUser=d}this._token=e,this._waitingForAuth.forEach(c=>c(!0))}catch(o){console.error("loginWithToken() failed",{err:o}),this._waitingForAuth.forEach(c=>c(!1))}finally{this._waitingForAuth.clear()}t&&(this._refreshToken=t,setInterval(async()=>{if(this._refreshToken){const c=await(await fetch(`${this._apiUrl}/v1/admin/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:this._refreshToken})})).json();this._token=c.authentication.accessToken}},1e3*60*60))}isAuthenticated(){return this._token!==void 0}getCurrentUser(){return this._currentUser}async waitTilAuthenticated(){return this.token!==void 0?!0:new Promise(e=>{this._waitingForAuth.add(e)})}async listenForRefresh(){const t=()=>{this._refreshTimer=void 0,this._refreshAuthToken()};this._addAccessTokenRefreshListener(n=>{this._refreshTimer&&clearTimeout(this._refreshTimer),this._refreshTimer=setTimeout(t,36e5),this.loginWithToken(n)}),this._refreshTimer=setTimeout(t,36e5)}async forgotPassword(e){await fetch(`${this._apiUrl}/v1/admin/auth/forgot-password`,{method:"POST",body:JSON.stringify({email:e}),headers:{"Content-Type":"application/json"}})}async confirmForgotPassword(e){return(await fetch(`${this._apiUrl}/v1/admin/auth/confirm-forgot-password`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}})).ok}async respondToNewPasswordRequiredChallenge(e){return await(await fetch(`${this._apiUrl}/v1/admin/auth/respond-to-new-password-required-challenge`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}})).json()}async loginWithGoogle(e){return await(await fetch(`${this._apiUrl}/v1/admin/auth/login-google`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}})).json()}async refresh(e){const n=await(await fetch(`${this._apiUrl}/v1/admin/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})})).json();await this.loginWithToken(n.authentication.accessToken,e)}}function R(){return typeof window<"u"&&window.location?new URLSearchParams(window.location.search).get("module"):null}function T(a){if(!(window&&window.parent))throw new Error("cannot send message to non-existent parent");window.parent.postMessage(a,"*")}function V(){const a=R();if(!a)throw new Error("No module context");T({type:"refresh_auth_token",module:a})}function F(a){function e(t){const n=t.data;n.type==="auth_token"&&a(n.token)}return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}}const r=new be({apiUrl:h,refreshAuthToken:V,addAccessTokenRefreshListener:F});async function De(a){return(await(await fetch(`${h}/v1/admin/module-configurations/${a}`,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).configuration}function Ae(){T({type:"hide_analytics_date_picker"})}function Pe(a){T({type:"go_to_device",deviceId:a})}function je(a){T({type:"go_to_time",time:a.getTime()})}function Ne(){const a=R();if(!a)throw new Error("No module context");T({type:"request_module_data",module:a})}function Le(a,e){const t=R();if(!t)throw new Error("No module context");T({type:"send_channel_data",source:t,channel:a,data:e})}function Ie(a,e){const t=R();if(!t)throw new Error("No module context");T({type:"set_module_data_time_range",module:t,before:a,after:e||0})}function _e(a){const e=R();if(!e)throw new Error("No module context");T({type:"setup_module_menus",module:e,menus:a})}function $e(a){T({type:"show_message",message:a})}function Me(a,e){const t=n=>{const i=n.data;i.type==="channel_data"&&i.channel===a&&e({source:i.source,data:i.data})};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)}function ze(a){const e=t=>{const n=t.data;n.type==="module_menu_item_clicked"&&a(n.menu)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}function Be(a){const e=t=>{const n=t.data;n.type==="module_configuration"&&a(n)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}function qe(a){const e=R();e&&T({type:"request_module_data",module:e});const t=n=>{const i=n.data;i.type==="module_data"&&a({streams:i.streams,time:i.time,queryRange:i.queryRange})};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)}function xe(a){T({type:"request_devices"});const e=t=>{const n=t.data;n.type==="overview_devices"&&a(n.data)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}const Ue=1,W=1e3,G=60*W,H=60*G,L=24*H,Je=7*L,Ve=30*L,Fe=365*L,I={millisecond:Ue,second:W,minute:G,hour:H,day:L,week:Je,month:Ve,year:Fe};function We(a,e){return a.filter(t=>e.includes(t.type))}function Ge(a,e,t){const n=e.getTime(),i=t.getTime();return a.map(o=>({...o,points:o.points.filter(([c])=>c>=n&&c<i)})).filter(({points:o})=>o.length>0)}class U{constructor({capacity:e,timeout:t}={}){s(this,"entries",new Map);s(this,"metadata",new Map);s(this,"capacity");s(this,"timeout");this.capacity=e||1e4,this.timeout=t||I.minute}get(e,t){const n=this.keyToCacheKey(e),i=this.entries.get(n),o=this.metadata.get(n);return(i===void 0||o&&(o==null?void 0:o.expiration.getTime())<Date.now())&&!(o!=null&&o.generating)&&t&&this.generate(e,t()),i===void 0&&o&&o.lastValue!==void 0?o.lastValue:i}set(e,t){const n=this.keyToCacheKey(e);this.metadata.set(n,{generating:!1,expiration:new Date(Date.now()+this.timeout),lastValue:t}),this.entries.set(n,t),this.metadata.size>this.capacity&&this.deleteOldestEntry()}clear(){this.entries.clear(),[...this.metadata.values()].forEach(e=>e.generating=!1)}clearKey(e){this.metadata.delete(e),this.entries.delete(e)}keyToCacheKey(e){return JSON.stringify(e)}deleteOldestEntry(){if(this.metadata.size<1)return;const[e]=[...this.metadata.entries()].reduce(([t,n],[i,o])=>o.expiration.getTime()<n.expiration.getTime()?[i,o]:[t,n]);this.clearKey(e)}generate(e,t){const n=this.keyToCacheKey(e),i=this.metadata.get(n)||{};this.metadata.set(n,{...i,generating:!0,expiration:new Date(Date.now()+this.timeout)}),setTimeout(()=>{t.then(o=>{const c=this.metadata.get(n);!(c!=null&&c.generating)||this.set(e,o)})},0)}}async function _(a){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/queries`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}class He{constructor(){s(this,"queryStoreCache",new U({capacity:1e4,timeout:20*I.second}));s(this,"liveQueryStoreCache",new U({capacity:1e4,timeout:200*I.millisecond}))}moduleQuery(e,t,n,i,o,c=!1){const d={...e,names:[...t],types:[...n]},p=this.query(d,i,o,c);return p===void 0||p==="too much data"?p:We(p,n)}query(e,t,n,i=!1){const o={...e,start:P.startOfMinute(t).toISOString(),end:i?n.toISOString():P.addMinutes(P.roundToNearestMinutes(n),1).toISOString(),latestOnly:i},c=n>P.addSeconds(new Date,-20);let d;return c?d=this.liveQueryCache(o):d=this.queryCache(o),!d||d==="too much data"||i?d:Ge(d,t,n)}queryCache(e){return this.queryStoreCache.get(e,async()=>{try{return await _(e)}catch(t){throw t}})}liveQueryCache(e){return this.liveQueryStoreCache.get(e,async()=>{try{return await _(e)}catch(t){throw t}})}}const Ke=new He;function Qe(a,e,t){const n=i=>{const o=i.data;if(o.type==="module_data"){const{start:c,end:d}=o.queryRange;t(Ke.moduleQuery({},a,e,new Date(c),new Date(d),!1))}};return window.addEventListener("message",n),()=>window.removeEventListener("message",n)}async function Xe(a,e,t){return new Promise(n=>{T({type:"request_date",minTime:e,maxTime:t,time:a});const i=o=>{const c=o.data;c.type==="date_response"&&(window.removeEventListener("message",i),n(c.data))};window.addEventListener("message",i)})}async function Ye(a,e){return new Promise(t=>{const n=Math.random().toString();T({type:"prompt",promptId:n,schema:a,okText:e==null?void 0:e.okText,cancelText:e==null?void 0:e.cancelText});const i=o=>{const c=o.data;c.type==="prompt_response"&&c.promptId===n&&t(c.data),window.removeEventListener("message",i)};window.addEventListener("message",i)})}const x=class{static isModule(){return R()!==null}static async getCurrentModuleConfiguration(){let e=new URLSearchParams("");typeof window<"u"&&window.location&&(e=new URLSearchParams(window.location.search));const t=e.get("configuration");if(!(t===null||t.trim()===""))return De(t.trim())}static get isOnline(){return x._isOnline}static listenForConnectionEvents(){const e=t=>{const{data:n}=t;n.type==="formant_online"&&(this._isOnline=n.online)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}static checkConnection(e=1e3){return new Promise((t,n)=>{const i=setTimeout(()=>n(new Error("deadline expired: took too long")),e),o=c=>{window.removeEventListener("message",o),clearTimeout(i);const{data:d}=c;d.type==="formant_online"&&(this._isOnline=d.online,t(d.online))};window.addEventListener("message",o),T({type:"formant_online"})})}static waitForConnection(e=5e3){let t=!1;const n=new Promise((c,d)=>{setTimeout(()=>{t=!0,d(new Error("deadline expired: took too long"))},e)}),i=c=>new Promise(d=>setTimeout(d,c)),o=async()=>{for(await i(50);!t&&!(this.isOnline||await this.checkConnection);)await i(500)};return Promise.race([n,o()])}};let y=x;s(y,"getCurrentModuleContext",R),s(y,"disableAnalyticsBottomBar",Ae),s(y,"goToDevice",Pe),s(y,"goToTime",je),s(y,"refreshAuthToken",V),s(y,"requestModuleData",Ne),s(y,"sendChannelData",Le),s(y,"setModuleDateTimeRange",Ie),s(y,"setupModuleMenus",_e),s(y,"showMessage",$e),s(y,"addAccessTokenRefreshListener",F),s(y,"addChannelDataListener",Me),s(y,"addMenuListener",ze),s(y,"addModuleConfigurationListener",Be),s(y,"addModuleDataListener",qe),s(y,"addOverviewDeviceListener",xe),s(y,"addStreamListener",Qe),s(y,"getDate",Xe),s(y,"prompt",Ye),s(y,"_isOnline",null);function f(a,e){if(a!==void 0)return a;throw new Error(e||"Value is undefined")}const g={UNKNOWN:0,TELEOP:1,PORT_FORWARD:2,OBSERVE:3},Ze={...g,Unknown:g.UNKNOWN,Teleop:g.TELEOP,PortForward:g.PORT_FORWARD,Observe:g.OBSERVE,unknown:g.UNKNOWN,teleop:g.TELEOP,portForward:g.PORT_FORWARD,observe:g.OBSERVE},O=Symbol("RtcClientPool.instance");var en;class j{constructor(e){s(this,en,null);s(this,"createClient");s(this,"ttlMs");s(this,"proxyHandler");s(this,"proxyReceivers",new Map);s(this,"teardownTimeout",null);s(this,"dispatch",(e,t)=>{this.proxyReceivers.forEach(n=>n==null?void 0:n(e,t))});const{createClient:t,ttlMs:n=0}=e;this.createClient=t,this.ttlMs=Math.max(n,0),this.proxyHandler={get:(i,o,c)=>{switch(o){case"shutdown":return()=>this.releaseInstance(c);default:return Reflect.get(i,o,c)}}}}get isActive(){return this[O]!==null}get size(){return this.proxyReceivers.size}get(e){const t=new Proxy(this.allocate(),this.proxyHandler);return this.proxyReceivers.set(t,e??null),t}allocate(){if(this[O])return this.teardownTimeout&&(clearTimeout(this.teardownTimeout),this.teardownTimeout=null),this[O];const e=this.createClient(this.dispatch);return this[O]=e,e}async teardown(){const e=this[O];if(!e){console.warn("singleton has already been shutdown!");return}try{await e.shutdown()}finally{this[O]=null}}async releaseInstance(e){return this.proxyReceivers.delete(e)?this.proxyReceivers.size!==0?!1:(!this.teardownTimeout&&Number.isFinite(this.ttlMs)&&(this.ttlMs===0?await this.teardown():this.teardownTimeout=setTimeout(()=>{this.teardown().catch(t=>console.error("teardown failed",{err:t})).finally(()=>this.teardownTimeout=null)},this.ttlMs)),!0):(console.warn("this instance has already been released!"),!1)}}en=O;const N=async()=>f(r.token,"Realtime when user isn't authorized"),b={[g.UNKNOWN]:new j({ttlMs:2500,createClient:a=>new S.RtcClient({signalingClient:new S.SignalingPromiseClient(h),getToken:N,sessionType:g.UNKNOWN,receive:a})}),[g.TELEOP]:new j({ttlMs:2500,createClient:a=>new S.RtcClient({signalingClient:new S.SignalingPromiseClient(h),getToken:N,sessionType:g.TELEOP,receive:a})}),[g.PORT_FORWARD]:new j({ttlMs:2500,createClient:a=>new S.RtcClient({signalingClient:new S.SignalingPromiseClient(h),getToken:N,sessionType:g.PORT_FORWARD,receive:a})}),[g.OBSERVE]:new j({ttlMs:2500,createClient:a=>new S.RtcClient({signalingClient:new S.SignalingPromiseClient(h),getToken:N,sessionType:g.OBSERVE,receive:a})})},et={...b,unknown:b[g.UNKNOWN],teleop:b[g.TELEOP],portForward:b[g.PORT_FORWARD],observe:b[g.OBSERVE]},$=b[g.TELEOP],tt=a=>{const{sessionType:e}=a;return e?et[e]:$};class K{constructor(e){s(this,"token");this.captureSession=e}async ingestJSON(e){if(!this.token){const n=await(await fetch(`${h}/v1/admin/capture-sessions/${this.captureSession.code}/authenticate`,{method:"POST"})).json();this.token=n.token}await fetch(`${h}/v1/ingest`,{method:"POST",body:JSON.stringify({deviceId:this.captureSession.deviceId,name:this.captureSession.streamName,type:"json",points:[[Date.now(),JSON.stringify(e)]]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+this.token}})}}function D(a){return new Promise(e=>setTimeout(e,a))}const nt=a=>a!==void 0&&a.capabilities!==void 0&&a.capabilitySet!==void 0;class Q{constructor(e){s(this,"ready",!1);s(this,"listeners",[]);s(this,"openListeners",[]);s(this,"closeListeners",[]);s(this,"errorListeners",[]);s(this,"binaryListeners",[]);s(this,"error");s(this,"decoder",new TextDecoder);this.dataChannel=e,this.dataChannel.binaryType="arraybuffer",this.dataChannel.onopen=()=>{this.setReady()},this.dataChannel.onclose=()=>{this.ready=!1,this.closeListeners.forEach(t=>t())},this.dataChannel.onerror=t=>{console.error(t),this.error="An error occurred in DataChannel",this.errorListeners.forEach(n=>n(t))},this.dataChannel.onmessage=t=>{this.listeners.forEach(n=>{const i=new Uint8Array(t.data),o=this.decoder.decode(i);n(o)}),this.binaryListeners.forEach(n=>{n(new Uint8Array(t.data))})}}setReady(){this.ready=!0,this.openListeners.forEach(e=>e())}addOpenListener(e){this.openListeners.push(e)}removeOpenListener(e){this.openListeners=this.openListeners.filter(t=>t!==e)}addCloseListener(e){this.closeListeners.push(e)}removeCloseListener(e){this.closeListeners=this.closeListeners.filter(t=>t!==e)}addErrorListener(e){this.errorListeners.push(e)}removeErrorListener(e){this.errorListeners=this.errorListeners.filter(t=>t!==e)}async waitTilReady(){return this.ready?!0:new Promise((t,n)=>{let i=setInterval(()=>{this.dataChannel.readyState==="open"&&this.setReady(),this.ready&&(clearInterval(i),t(!0)),this.error&&n(this.error)},10)})}send(e){if(!this.ready)throw new Error("Connection has been closed");this.dataChannel.send(e)}sendBinary(e){if(!this.ready)throw new Error("Connection has been closed");this.dataChannel.send(e)}addListener(e){this.listeners.push(e)}removeListener(e){const t=this.listeners.indexOf(e);if(t===-1)throw new Error("Could not find data channel listener to remove");if(this.error)throw new Error(this.error);this.listeners.splice(t,1)}addBinaryListener(e){this.binaryListeners.push(e)}removeBinaryListener(e){const t=this.binaryListeners.indexOf(e);if(t===-1)throw new Error("Could not find data channel listener to remove");if(this.error)throw new Error(this.error);this.binaryListeners.splice(t,1)}}class X{constructor(e,t){s(this,"currentListeners",[]);s(this,"onRealtimeMessage",(e,t)=>{t.payload.jointState&&this.currentListeners.forEach(n=>{t.payload.jointState&&n(t.payload.jointState)})});this.device=e,this.config=t}async synchronize(){this.device.addRealtimeListener(this.onRealtimeMessage),this.device.startListeningToRealtimeDataStream(this.config.currentJointStateStream)}async desynchronize(){this.device.removeRealtimeListener(this.onRealtimeMessage),this.device.stopListeningToRealtimeDataStream(this.config.currentJointStateStream)}async addCurrentJointStateListener(e){this.currentListeners.push(e)}}class Y{constructor(e,t,n){s(this,"channel");s(this,"requestIdToResponseMap",new Map);this.device=e,this.channel_name=t,this.timeout=n}addOpenListener(e){f(this.channel,"channel not initalized").addOpenListener(e)}removeOpenListener(e){f(this.channel,"channel not initalized").removeOpenListener(e)}addCloseListener(e){f(this.channel,"channel not initalized").addCloseListener(e)}removeCloseListener(e){f(this.channel,"channel not initalized").removeCloseListener(e)}addErrorListener(e){f(this.channel,"channel not initalized").addErrorListener(e)}removeErrorListener(e){f(this.channel,"channel not initalized").removeErrorListener(e)}}class Z extends Y{constructor(){super(...arguments);s(this,"RESPONSE_SUCCESS_BYTE",0);s(this,"decoder",new TextDecoder)}generateBinaryId(){const t=new Uint8Array(16);for(let n=0;n<t.length;n++)t[n]=Math.floor(Math.random()*256);return t}async initialize(){this.channel=await this.device.createCustomDataChannel(this.channel_name),this.channel.addBinaryListener(t=>{const i=t.slice(0,16).toString();if(i.length===0)throw new Error("Invalid response");const o=t.slice(16);if(o.length===0)throw new Error("Invalid response");this.requestIdToResponseMap.has(i)&&this.requestIdToResponseMap.set(i,o)})}async request(t){if(this.channel||await this.initialize(),!this.channel)throw new Error("Failed to create channel");const{channel:n,requestIdToResponseMap:i,timeout:o}=this;await n.waitTilReady();const c=this.generateBinaryId(),d=c.toString();i.set(d,!0),n.sendBinary(new Uint8Array([...c,...t]));const p=new Date().getTime();for(;new Date().getTime()<p+o;)if(await D(50),i.has(d)){const m=i.get(d);if(m!==!0){i.delete(d);const w=m[0]===this.RESPONSE_SUCCESS_BYTE,v=m.slice(1);if(w)return v;throw console.error({name:"AdapterError",message:this.decoder.decode(v)}),new Error("Binary request datachannel adapter error")}}throw i.delete(d),console.error({name:"TimeoutError",message:`Request timed out after ${o/1e3} seconds`}),new Error("Binary request data channel request timed out")}}class ee extends Y{generateTextId(){return Math.random().toString(36).substring(2)+"-"+Math.random().toString(36).substring(2)}async initialize(){this.channel=await this.device.createCustomDataChannel(this.channel_name),this.channel.addListener(e=>{const t=JSON.parse(e),{id:n,data:i,error:o}=t;if(!n)throw new Error("Invalid response");if(!i&&!o)throw new Error("Invalid response");this.requestIdToResponseMap.has(n)&&this.requestIdToResponseMap.set(n,t)})}async request(e){if(this.channel||await this.initialize(),!this.channel)throw new Error("Failed to create channel");const{channel:t,requestIdToResponseMap:n,timeout:i}=this;await t.waitTilReady();const o=this.generateTextId();n.set(o,!0),t.send(JSON.stringify({id:o,data:e}));const c=new Date().getTime();for(;new Date().getTime()<c+i;)if(await D(50),n.has(o)){const d=n.get(o);if(d!==!0){n.delete(o);const{data:p,error:m}=d;if(p)return p;if(m)throw console.error({name:"AdapterError",message:m}),new Error("Text request datachannel adapter error")}}throw n.delete(o),console.error({name:"TimeoutError",message:`Request timed out after ${i/1e3} seconds`}),new Error("Text request datachannel request timed out")}}class te extends Ce.EventEmitter{constructor(){super(...arguments);s(this,"rtcClient");s(this,"remoteDevicePeerId",null);s(this,"realtimeListeners",[]);s(this,"connectionMonitorInterval");s(this,"handleMessage",(t,n)=>{this.realtimeListeners.forEach(i=>i(t,n))})}stopConnectionMonitoring(){clearInterval(this.connectionMonitorInterval),this.connectionMonitorInterval=void 0}assertNotCancelled(t){if(t)throw new Error("Cancelled by deadline")}getRealtimeStatus(){if(this.rtcClient&&this.remoteDevicePeerId)return this.rtcClient.getConnectionStatus(this.remoteDevicePeerId);throw new Error("Realtime connection hasn't been started")}getRealtimePing(){if(this.rtcClient&&this.remoteDevicePeerId)return this.rtcClient.getPing(this.remoteDevicePeerId);throw new Error("Realtime connection hasn't been started")}addRealtimeListener(t){this.realtimeListeners.push(t)}removeRealtimeListener(t){const n=this.realtimeListeners.indexOf(t);if(n===-1)throw new Error("Could not find realtime listener to remove");this.realtimeListeners.splice(n,1)}async getRealtimeManipulators(){const t=await this.getConfiguration(),n=[];for(const i of t.teleop.rosStreams??[])i.topicType=="sensor_msgs/JointState"&&n.push(new X(this,{currentJointStateStream:{name:i.topicName},plannedJointStateStream:i.plannedTopic?{name:i.plannedTopic}:void 0,planValidStream:i.planValidTopic?{name:i.planValidTopic}:void 0,endEffectorStream:i.endEffectorTopic?{name:i.endEffectorTopic}:void 0,endEffectorLinkName:i.endEffectorLinkName,baseReferenceFrame:i.baseReferenceFrame,localFrame:i.localFrame}));return n}async getRealtimeVideoStreams(){var i,o,c;const t=await this.getConfiguration(),n=[];for(const d of((i=t.teleop)==null?void 0:i.hardwareStreams)??[])d.rtcStreamType==="h264-video-frame"&&n.push({name:d.name});for(const d of((o=t.teleop)==null?void 0:o.rosStreams)??[])d.topicType=="formant/H264VideoFrame"&&n.push({name:d.topicName}),(d.topicType==="sensor_msgs/Image"||d.topicType==="sensor_msgs/CompressedImage")&&d.encodeVideo&&n.push({name:d.topicName});for(const d of((c=t.teleop)==null?void 0:c.customStreams)??[])d.rtcStreamType==="h264-video-frame"&&n.push({name:d.name});return n}createCustomRequestDataChannel(t,n=3e3){return new ee(this,t,n)}createCustomBinaryRequestDataChannel(t,n=3e3){return new Z(this,t,n)}async startListeningToRealtimeVideo(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!0,pipeline:"rtc"})}async stopListeningToRealtimeVideo(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!1,pipeline:"rtc"})}async startListeningToRealtimeDataStream(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!0,pipeline:"rtc"})}async stopListeningToRealtimeDataStream(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!1,pipeline:"rtc"})}async enableRealtimeTelemetryPriorityIngestion(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t,enablePriorityUpload:!0,pipeline:"telemetry"})}async disableRealtimeTelemetryPriorityIngestion(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t,enablePriorityUpload:!1,pipeline:"telemetry"})}async changeStreamAudioType(t,n){const i=f(this.rtcClient,"Realtime connection has not been started"),o=await this.getRemotePeer();i.controlRemoteStream(f(o).id,{streamName:t,setAudioFormat:n})}async createCustomDataChannel(t,n){const i=f(this.rtcClient,"Realtime connection has not been started"),o=await this.getRemotePeer(),c=await new Promise(d=>{i.createCustomDataChannel(f(o).id,t,{ordered:!0,...n},!1,(p,m)=>{const w=new Q(m);d(w)})});return await c.waitTilReady(),c}async sendRealtimeMessage(t,n={channelLabel:"stream.reliable"}){const i=f(this.rtcClient,"Realtime connection has not been started"),o=await this.getRemotePeer();i.send(f(o).id,t,n)}async getRealtimeAudioStreams(){var i,o,c;const t=await this.getConfiguration(),n=[];for(const d of((i=t.teleop)==null?void 0:i.hardwareStreams)??[])d.rtcStreamType==="audio-chunk"&&n.push({name:d.name});for(const d of((o=t.teleop)==null?void 0:o.rosStreams)??[])d.topicType=="audio_common_msgs/AudioData"&&n.push({name:d.topicName});for(const d of((c=t.teleop)==null?void 0:c.customStreams)??[])d.rtcStreamType==="audio-chunk"&&n.push({name:d.name});return n}}const at=new TextEncoder;new TextDecoder;function it(a){const e=JSON.stringify(a),t=at.encode(e),n=Se.deflate(t);return Ee.fromByteArray(n)}async function ne(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/views`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function ae(a,e){if(!r.token)throw new Error("Not authenticated");const n=(await ne()).filter(d=>d.name===e);if(n.length===0)return console.warn("View does not exist or it is misspell"),null;const i=await fetch(`${h}/v1/admin/shares`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}}),o=h.replace("api","app"),{code:c}=await i.json();return`${o}/shares/${c}#${it({viewId:n[0].id})}`}const rt=["day","week","month","year","hour","minute","quarter"],ot=["interval","start","end","sub","get"];function ie(a){return a.count<2?0:a.sumOfSquares/(a.count-1)}function re(a){return Math.sqrt(ie(a))}function oe(a){return a.max}function se(a){return a.min}function ce(a){return a.count===0?-1:a.sum/a.count}function de(a){return a.sum}function he(a){return a.count}const st={min:se,max:oe,"standard deviation":re,average:ce,sum:de,count:he},M={day:{interval:u.eachDayOfInterval,start:u.startOfDay,end:u.endOfDay,sub:u.subDays,get:u.getDay},week:{interval:u.eachWeekOfInterval,start:u.startOfWeek,end:u.endOfWeek,sub:u.subWeeks,get:u.getWeek},month:{interval:u.eachMonthOfInterval,start:u.startOfMonth,end:u.endOfMonth,sub:u.subMonths,get:u.getMonth},year:{interval:u.eachYearOfInterval,start:u.startOfYear,end:u.endOfYear,sub:u.subYears,get:u.getYear},hour:{interval:u.eachHourOfInterval,start:u.startOfHour,end:u.endOfHour,sub:u.subHours,get:u.getHours},minute:{interval:u.eachMinuteOfInterval,start:u.startOfMinute,end:u.endOfMinute,sub:u.subMinutes,get:u.getMinutes},quarter:{interval:u.eachQuarterOfInterval,start:u.startOfQuarter,end:u.endOfQuarter,sub:u.subQuarters,get:u.getQuarter}},le=(a,e)=>a.split("/")[0]+"/"+a.split("/")[1]+"–"+e.split("/")[0]+"/"+e.split("/")[1];async function z(a){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/events/query`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function ue(a,e,t,n,i){const o=M[e];return await Promise.all(Array(t).fill(0).map(async(c,d)=>{const p=new Date(n),m=o.sub(o.start(p),t-d-1),w=o.sub(o.end(p),t-d-1),v=le(m.toLocaleDateString(),w.toLocaleDateString()),C=await z({...i,eventTypes:a,start:new Date(m).toISOString(),end:new Date(w).toISOString()});return{date:v,events:C}}))}async function B(a,e){return(await z({...a,eventTypes:["annotation"]})).filter(o=>!!o.tags&&Object.keys(o.tags).includes(e)).reduce((o,c)=>{const d=c.tags[e];return d in o?(o[d]+=1,o):(o[d]=1,o)},{})}async function me(a,e,t){const{end:n,start:i}=a,c=M[t].interval({start:new Date(i),end:new Date(n)}),d=c.map((m,w)=>{const v=new Date(m).toISOString(),C=w===c.length-1?new Date(Date.now()).toISOString():new Date(c[w+1]);return B({...a,start:v,end:C},e)}),p=await Promise.all(d);return c.map((m,w)=>({date:new Date(m).toISOString(),annotations:p[w]}))}async function fe(a,e,t,n,i){let o=a;Array.isArray(a)||(o=[a]);let c=e;return Array.isArray(e)||(c=[e]),(await(await fetch(`${h}/v1/queries/queries`,{method:"POST",body:JSON.stringify({deviceIds:o,end:n.toISOString(),names:c,start:t.toISOString(),tags:i}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function we(){if(!r.token)throw new Error("Not authenticated");const a=$.get();try{return await a.getSessions()}finally{await a.shutdown()}}async function pe(){if(!r.token)throw new Error("Not authenticated");const a=$.get();try{return await a.getPeers()}finally{await a.shutdown()}}async function ct(a){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/devices`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function dt(a,e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/devices/${a}`,{method:"PATCH",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function ht(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/device-details/query`,{method:"POST",body:JSON.stringify({enabled:!0,type:"default"}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function lt(a){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/devices/query`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}class E extends te{constructor(e,t,n,i){super(),this.id=e,this.name=t,this.organizationId=n,this.tags=i}async getLatestTelemetry(){return(await(await fetch(`${h}/v1/queries/stream-current-value`,{method:"POST",body:JSON.stringify({deviceIds:[this.id]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async getConfiguration(){let e=await fetch(`${h}/v1/admin/devices/${this.id}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}});const t=await e.json();if(!t.state.reportedConfiguration)throw new Error("Device has no configuration, has it ever been turned on?");const n=t.state.reportedConfiguration.version;return e=await fetch(`${h}/v1/admin/devices/${this.id}/configurations/${n}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}}),(await e.json()).document}async getFileUrl(e){return(await(await fetch(`${h}/v1/admin/files/query`,{method:"POST",body:JSON.stringify({fileIds:[e]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).fileUrls}async startRealtimeConnection(e={}){if(console.debug(`${new Date().toISOString()} :: Connection start requested`),this.rtcClient&&this.connectionMonitorInterval!==void 0)throw new Error(`Already created realtime connection to device ${this.id}`);this.rtcClient&&console.warn("overwriting existing rtcClient due to missing connectionMonitorInterval");const{sessionType:t,deadlineMs:n=1e4,maxConnectRetries:i=3}=typeof e=="number"?{sessionType:e}:e,c=tt({sessionType:t}).get(this.handleMessage);let d=!1;const p=new Promise((w,v)=>setTimeout(()=>{d=!0,v(new Error("Connection timed out: the connection could not be finalized in time, possibly due to network issues or misconfigured settings."))},n)),m=async()=>{if("isReady"in c)for(;!c.isReady();)this.assertNotCancelled(d),await D(100);const w=await this.getRemoteDevicePeerId(c);this.assertNotCancelled(d);let v;for(let A=0;A<i&&(v=await c.connect(w),!v);A++)D(100),this.assertNotCancelled(d);if(!v)throw new Error(`Session could not be created: exhausted ${i} retries`);let C=0;for(;!d&&c.getConnectionStatus(w)!=="connected";)await D(100),C+=1;return this.assertNotCancelled(d),console.debug(`${new Date().toISOString()} :: Connection completed after ${C} retries`),w};return Promise.race([m(),p]).then(w=>{this.remoteDevicePeerId=w,this.initConnectionMonitoring(),this.rtcClient=c,this.emit("connect")}).catch(w=>{throw console.debug(`${new Date().toISOString()} :: Connection failed: %o`,w),this.remoteDevicePeerId=null,c.shutdown().catch(v=>{console.error("rtcClient cannot shutdown: %o",v)}),this.emit("connection_failed",w),w})}async getRemoteDevicePeerId(e){const n=(await e.getPeers()).find(i=>i.deviceId===this.id);if(!nt(n))throw new Error("Cannot find peer, is the robot offline?");return n.id}initConnectionMonitoring(){this.connectionMonitorInterval=setInterval(async()=>{let e=!1;if(this.rtcClient){const n=this.rtcClient.getConnections().find(i=>i.getRemotePeerId()===this.remoteDevicePeerId&&i.isActive());(n===void 0||!n.isReady())&&(console.debug(`${new Date().toISOString()} :: data channel closed`),e=!0)}(!this.rtcClient||!this.remoteDevicePeerId||await this.rtcClient.getConnectionStatsInfo(this.remoteDevicePeerId)===void 0||e)&&(this.emit("disconnect"),this.stopRealtimeConnection().catch(t=>{console.error(t)}))},1e3)}async getRemotePeer(){const t=(await f(this.rtcClient,"Realtime connection has not been started").getPeers()).find(n=>n.deviceId===this.id);return f(t,"Could not find remote peer for device "+this.id)}async stopRealtimeConnection(){let e=!1;if(this.rtcClient){this.stopConnectionMonitoring(),this.remoteDevicePeerId?(await this.rtcClient.disconnect(this.remoteDevicePeerId),this.remoteDevicePeerId=null):e=!0;try{await this.rtcClient.shutdown()}finally{this.rtcClient=void 0}}if(e)throw new Error(`Realtime connection hasn't been started for ${this.id}`)}async isInRealtimeSession(){const e=await pe(),t=await we(),n=e.find(i=>i.deviceId===this.id);return n?t[n.id].length>0:!1}async getAvailableCommands(){return(await(await fetch(`${h}/v1/admin/command-templates/`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items.map(n=>({name:n.name,id:n.id,command:n.command,description:n.description,parameterEnabled:n.parameterEnabled,parameterValue:n.parameterValue,parameterMeta:n.parameterMeta,enabled:n.enabled,tags:n.tags}))}async sendCommand(e,t,n,i){var w;const c=(await this.getAvailableCommands()).find(v=>v.name===e);if(!c)throw new Error(`Could not find command with name "${e}"`);let d="";t===void 0?c.parameterEnabled&&c.parameterValue&&(d=c.parameterValue):d=t;let p={value:d,scrubberTime:(n||new Date).toISOString(),meta:{...c.parameterMeta,...i}};return await fetch(`${h}/v1/admin/commands`,{method:"POST",body:JSON.stringify({commandTemplateId:c.id,organizationId:this.organizationId,deviceId:this.id,command:c.command,parameter:p,userId:(w=r.currentUser)==null?void 0:w.id}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})}async getCommand(e){return await fetch(`${h}/v1/admin/commands/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})}async createCaptureStream(e){const n=await(await fetch(`${h}/v1/admin/capture-sessions`,{method:"POST",body:JSON.stringify({deviceId:this.id,streamName:e,tags:{}}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json();return new K(n)}async getTelemetry(e,t,n,i){return await fe(this.id,e,t,n,i)}async getTelemetryStreams(){var d,p;const e=await this.getConfiguration(),t=await fetch(`${h}/v1/queries/metadata/stream-names`,{method:"POST",body:JSON.stringify({deviceIds:[this.id]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}}),n=[],i=[];return(p=(d=e.telemetry)==null?void 0:d.streams)==null||p.forEach(m=>{m.disabled!==!0&&n.push(m.name),m.onDemand===!0&&i.push(m.name)}),console.log(i),(await t.json()).items.filter(m=>!n.includes(m)).map(m=>({name:m,onDemand:i.includes(m)}))}async createInterventionRequest(e,t,n,i){return await(await fetch(`${h}/v1/admin/intervention-requests`,{method:"POST",body:JSON.stringify({message:e,interventionType:t,time:new Date().toISOString(),deviceId:this.id,tags:i,data:n}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async addInterventionResponse(e,t,n){return await(await fetch(`${h}/v1/admin/intervention-responses`,{method:"POST",body:JSON.stringify({interventionId:e,interventionType:t,data:n}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async getAnnotationCount(e,t){return await B({...e,deviceIds:[this.id]},t)}async getAnnotationCountByIntervals(e,t,n){return await me({...e,deviceIds:[this.id]},t,n)}async eventsCounter(e,t,n,i,o){return await ue(e,t,n,i,{...o,deviceIds:[this.id]})}async createShareLink(e,t){return e.scope.deviceIds=[this.id],await ae(e,t)}}s(E,"createDevice",ct),s(E,"patchDevice",dt),s(E,"getDevicesData",ht),s(E,"queryDevicesData",lt);class ye extends te{constructor(t){super();s(this,"id");s(this,"telemetryStreamActive",!1);s(this,"streamTelemetry",{});this.peerUrl=t}async getLatestTelemetry(){this.telemetryStreamActive||this.subscribeToTelemetry();const t=this.streamTelemetry;return Object.entries(t).map(([i,o])=>({deviceId:this.id,streamName:i,streamType:"json",currentValue:o,currentValueTime:o.timestamp,tags:{}}))}subscribeToTelemetry(){this.telemetryStreamActive=!0;let t=0;const n=new XMLHttpRequest;n.responseType="text",n.addEventListener("error",i=>{this.handleXHRError("error")}),n.addEventListener("abort",i=>{this.handleXHRError("abort")}),n.addEventListener("timeout",i=>{this.handleXHRError("timeout")}),n.addEventListener("readystatechange",i=>{n.readyState===XMLHttpRequest.DONE&&this.handleXHRError("closed")}),n.addEventListener("progress",i=>{const o=i.loaded,c=o-t;t=o,n.responseText.substr(-c).split(`
2
- `).forEach(m=>{var w;if(m.length>0){const v=JSON.parse(m);if((w=v.result)!=null&&w.datapoint){const C=v.result.datapoint,A=C.stream;delete C.stream,this.streamTelemetry[A]=C}}})}),n.open("POST",`${this.peerUrl}/v1/telemetry`),n.send()}handleXHRError(t){console.warn(`Telemetry stream ended: ${t}`),this.telemetryStreamActive=!1}async getDeviceId(){return(await(await fetch(`${this.peerUrl}/v1/config`)).json()).configuration.id}async getConfiguration(){return(await(await fetch(`${this.peerUrl}/v1/config`)).json()).configuration.document}async startRealtimeConnection(t){if(console.debug(`${new Date().toISOString()} :: Connection start requested`),this.rtcClient&&this.connectionMonitorInterval!==void 0)throw new Error(`Already created realtime connection to device ${this.id}`);this.rtcClient&&console.warn("overwriting existing rtcClient due to missing connectionMonitorInterval");const n=new S.RtcClient({lanOnlyMode:!0,receive:this.handleMessage,sessionType:t});for(await n.connectLan(this.peerUrl);n.getConnectionStatus(this.peerUrl)!=="connected";)await D(100);this.rtcClient=n,this.initConnectionMonitoring()}initConnectionMonitoring(){this.connectionMonitorInterval=setInterval(async()=>{let t=!1;this.rtcClient&&this.rtcClient.getConnectionStatus(this.peerUrl)!=="connected"&&(console.debug(`${new Date().toISOString()} :: data channel closed`),t=!0),(!this.rtcClient||t)&&(this.emit("disconnect"),this.stopRealtimeConnection().catch(n=>{console.error(n)}))},1e3)}async getRemotePeer(){return{id:this.peerUrl,organizationId:"",deviceId:this.id,capabilities:[],capabilitySet:{}}}async stopRealtimeConnection(){let t=!1;if(this.rtcClient){this.stopConnectionMonitoring(),this.id?(await this.rtcClient.disconnect(this.id),this.remoteDevicePeerId=null):t=!0;try{await this.rtcClient.shutdown()}finally{this.rtcClient=void 0}}if(t)throw new Error(`Realtime connection hasn't been started for ${this.id}`)}async sendCommand(t,n,i,o){const c={value:n,scrubberTime:(i||new Date).toISOString(),meta:o};return await fetch(`${this.peerUrl}/v1/enqueue-command`,{method:"POST",body:JSON.stringify({command:t,parameter:c}),headers:{"Content-Type":"application/json"}})}}async function ut(a,e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/devices/${a}`,{method:"PATCH",body:JSON.stringify({fleetId:e}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function mt(a){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/queries`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).aggregates}async function ft(a){if(!r.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/fleets/${a}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})}async function wt(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/analytics/streams`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function pt(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/analytics-modules`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function yt(a){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/queries/analytics/rows`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function ge(a){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/devices/query`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items.map(n=>new E(n.id,n.name,n.organizationId,n.tags))}async function gt(){if(!r.token)throw new Error("Not authenticated");let a=new URLSearchParams("");typeof window<"u"&&window.location&&(a=new URLSearchParams(window.location.search));const e=a.get("group");if(e===null||e.trim()==="")return;const t=await fetch(`${h}/v1/admin/groups/`+e,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}}),{tagKey:n,tagValue:i}=await t.json();return await ge({tags:{[n]:[i]},enabled:!0,type:"default"})}async function vt(a){if(!r.token)throw new Error("Not authenticated");const t=await(await fetch(`${h}/v1/admin/devices/${a}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json(),n=t.name;return new E(a,n,t.organizationId,t.tags)}async function q(){if(!r.token)throw new Error("Not authenticated");const e=await(await fetch(`${h}/v1/admin/device-details/query`,{method:"POST",body:JSON.stringify({enabled:!0,type:"default"}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json();return e.items,e.items.map(t=>new E(t.id,t.name,t.organizationId,t.tags))}async function Tt(a){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/events/query/id=${a}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function Ct(a){const t=await(await fetch(`${h}/v1/admin/files/query`,{method:"POST",body:JSON.stringify({fileIds:[a]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json();if(t.fileUrls.length===0)throw new Error("File not found");return t.fileUrls[0]}async function St(a){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/fleets/${a}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function Et(a){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/fleets/${a}/devices`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function kt(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/intervention-requests`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function Rt(...a){const e=a.flat().filter(i=>!!i);return e.length===0?[]:(await(await fetch(`${h}/v1/queries/stream-current-value`,{method:"POST",body:JSON.stringify({deviceIds:e}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function Ot(){if(!r.token)throw new Error("Not authenticated");const t=(await(await fetch(`${h}/v1/queries/online-devices`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items;return(await q()).filter(i=>t.includes(i.id))}async function bt(){if(!r.token)throw new Error("Not authenticated");const t=(await(await fetch(`${h}/v1/signaling/peers`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items.map(i=>i.deviceId);return(await q()).filter(i=>t.includes(i.id))}async function Dt(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/streams`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items.filter(t=>t.enabled)}async function At(a){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/queries/analytics/task-report-rows`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function Pt(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/analytics/task-reports`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function jt(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/fleets`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}async function Nt(a,e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/fleets/${a}`,{method:"PATCH",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function Lt(a){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/streams/${a.id}`,{method:"PATCH",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function It(a){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/views/${a.id}`,{method:"PATCH",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}async function _t(a){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/queries/analytics`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}const k=class{static async setDefaultDevice(e){k.defaultDeviceId=e}static async getCurrentDevice(){if(!r.token)throw new Error("Not authenticated");if(!k.defaultDeviceId)throw new Error("No known default device");const n=(await(await fetch(`${h}/v1/admin/device-details/query`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items.find(c=>c.id===k.defaultDeviceId),i=n.name,o=new E(k.defaultDeviceId,i,f(r.currentOrganization),n.tags);return k.knownContext.push(new WeakRef(o)),o}static async getPeerDevice(e){const t=new ye(e);return t.id=await t.getDeviceId(),t}static async getDevice(e){const t=await vt(e);return k.knownContext.push(new WeakRef(t)),t}};let l=k;s(l,"defaultDeviceId"),s(l,"knownContext",[]),s(l,"listFleets",jt),s(l,"getFleet",St),s(l,"patchFleet",Nt),s(l,"deleteFleet",ft),s(l,"addDeviceToFleet",ut),s(l,"getFleetDevices",Et),s(l,"aggregateTelemetry",mt),s(l,"createShareLink",ae),s(l,"eventsCounter",ue),s(l,"getAnalyticStreams",wt),s(l,"getAnalyticsModules",pt),s(l,"getAnalyticsRows",yt),s(l,"getAnnotationCount",B),s(l,"getAnnotationCountByIntervals",me),s(l,"getCurrentGroup",gt),s(l,"getDevices",q),s(l,"getEvent",Tt),s(l,"getFileUrl",Ct),s(l,"getInterventions",kt),s(l,"getLatestTelemetry",Rt),s(l,"getOnlineDevices",Ot),s(l,"getPeers",pe),s(l,"getRealtimeDevices",bt),s(l,"getRealtimeSessions",we),s(l,"getStreams",Dt),s(l,"getTaskReportRows",At),s(l,"getTaskReportTables",Pt),s(l,"getTelemetry",fe),s(l,"getViews",ne),s(l,"patchStream",Lt),s(l,"patchView",It),s(l,"queryAnalytics",_t),s(l,"queryDevices",ge),s(l,"queryEvents",z),s(l,"queryTelemetry",_);class $t{static async set(e,t,n){try{const i=await fetch(h+"/v1/admin/key-value",{method:"POST",body:JSON.stringify({organizationId:f(r.currentUser).organizationId,key:e,value:t,tags:n}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}}),o=await i.json();if(i.status!==200)throw new Error(o.message)}catch(i){throw i}}static async get(e){try{const t=await fetch(h+`/v1/admin/key-value/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}}),n=await t.json();if(t.status!==200)throw new Error(n.message);return n.value}catch(t){throw t}}static async list(){try{const e=await fetch(h+"/v1/admin/key-value",{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}}),t=await e.json();if(e.status!==200)throw new Error(t.message);return t.items}catch(e){throw e}}static async delete(e){try{if(!(await fetch(h+`/v1/admin/key-value/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).ok)throw new Error("Unable to handle request");return}catch(t){throw t}}}function Mt(a){return Uint8Array.from(atob(a),e=>e.charCodeAt(0))}function J(){const{userAgent:a}=navigator;return a?a.includes("Firefox/")?"Firefox":a.includes("Edg/")?"Edge":a.includes("Chrome/")?"Chrome":a.includes("Safari/")?"Safari":a.includes("MSIE/")||a.includes("Trident/")?"IE":"Other":"Other"}const zt="audio-chunk";class Bt{constructor(e,t){s(this,"muted",!1);s(this,"hasReceivedData",!1);s(this,"audioContext");s(this,"chunks",[]);s(this,"isPlaying",!1);s(this,"startTime",0);s(this,"lastChunkOffset",0);s(this,"bufferSize",3);s(this,"receive",async e=>{var c;const t=(c=e.payload.audioChunk)==null?void 0:c.chunk_data;if(!t)return;this.hasReceivedData||(this.hasReceivedData=!0);const{audioContext:n,muted:i}=this;if(!n||e.header.stream.streamType!==zt||i!==!1)return;const o=Mt(t);try{await n.decodeAudioData(o.buffer,this.scheduleChunk)}catch(d){console.warn("Error decoding audio buffer, changing audioWireFormat on agent",{error:d}),this.changeAudioWireFormat("wav")}});s(this,"scheduleChunk",e=>{const{audioContext:t}=this;if(!t)return;(this.chunks.length>this.bufferSize||this.isPlaying===!1)&&(this.chunks.forEach(i=>{i.stop()}),this.isPlaying=!1,this.chunks=[]);const n=this.createChunk(e);n&&n.buffer&&(this.isPlaying===!1&&(this.startTime=t.currentTime,this.lastChunkOffset=0,this.isPlaying=!0),n.start(this.startTime+this.lastChunkOffset,0,e.duration),this.lastChunkOffset+=n.buffer.duration,this.chunks.push(n))});this.device=e,this.stream=t,this.device.startListeningToRealtimeDataStream(t),this.device.addRealtimeListener((i,o)=>{this.receive(o)}),J()==="Safari"||J()==="IE"?this.changeAudioWireFormat("wav"):this.changeAudioWireFormat("opus");const n=window.AudioContext||window.webkitAudioContext;this.audioContext=new n}async play(){var e,t;((e=this.audioContext)==null?void 0:e.state)==="suspended"&&await((t=this.audioContext)==null?void 0:t.resume()),this.muted=!1}async pause(){await this.audioContext.suspend(),this.muted=!0}destroy(){this.device.stopListeningToRealtimeDataStream(this.stream)}createChunk(e){const{audioContext:t}=this;if(!t)return;const n=t.createBufferSource();return n.buffer=e,n.connect(t.destination),n.loop=!1,n.onended=i=>{this.chunks.splice(this.chunks.indexOf(n),1),this.chunks.length===0&&(this.isPlaying=!1)},n}changeAudioWireFormat(e){const{stream:t}=this;(async()=>await this.device.changeStreamAudioType(t.name,e))()}}class qt{static async listAccounts(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/accounts`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}static async createAccounts(e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async getAccount(e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async patchAccount(e,t){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async deleteAccount(e){if(!r.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/accounts/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})}static async getAccountTree(e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts/${e}/tree`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}}class xt{static async listRoles(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/roles`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}static async createRole(e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/roles`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async getRole(e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/roles/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async patchRole(e,t){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/roles/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async deleteRole(e){if(!r.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/roles/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})}}class Ut{static async listUsers(){if(!r.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/users`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()).items}static async createUser(e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/users`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async getUser(e){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/users/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async patchUser(e,t){if(!r.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/users/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})).json()}static async deleteUser(e){if(!r.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/users/${e}`,{method:"PATCH",body:JSON.stringify({enabled:!1,roleId:null,teamId:null}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+r.token}})}}const Jt=["viewer","operator","administrator"],Vt="viewer",Ft="operator",Wt="administrator",Gt=["year","month","week","day","hour","minute"],Ht=["tag","sheet","user"],Kt=["triggered-event","intervention-request","teleop-session-record","port-forwarding-session-record","command-request","command-response","command-delivery","custom","comment","system","annotation"],Qt=["unknown","operational","offline","error"],Xt=["selection","labeling","teleop"],Yt=["info","warning","error","critical"],Zt=["video/mp4"];try{const a=typeof window<"u"&&window.location?new URLSearchParams(window.location.search):new URLSearchParams(""),e=a.get("device");e&&l.setDefaultDevice(e);const t=a.get("auth");t&&r.loginWithToken(t),a.get("module")&&r.listenForRefresh(),typeof window<"u"&&y.listenForConnectionEvents()}catch{}exports.Account=qt;exports.App=y;exports.AudioPlayer=Bt;exports.Authentication=r;exports.BinaryRequestDataChannel=Z;exports.CaptureStream=K;exports.DataChannel=Q;exports.Device=E;exports.Fleet=l;exports.KeyValue=$t;exports.Manipulator=X;exports.PeerDevice=ye;exports.Role=xt;exports.SessionType=Ze;exports.TextRequestDataChannel=ee;exports.User=Ut;exports.accessLevels=Jt;exports.administrator=Wt;exports.aggregateByDateFunctions=M;exports.aggregateFunctionMap=st;exports.aggregateFunctions=ot;exports.aggregateLevels=Gt;exports.annotationTypes=Ht;exports.eventTypes=Kt;exports.formatTimeFrameText=le;exports.getAverage=ce;exports.getCount=he;exports.getMax=oe;exports.getMin=se;exports.getStandardDeviation=re;exports.getSum=de;exports.getVariance=ie;exports.healthStatuses=Qt;exports.interventionTypes=Xt;exports.operator=Ft;exports.severities=Yt;exports.vailableAggregationIntervals=rt;exports.videoMimeTypes=Zt;exports.viewer=Vt;
1
+ "use strict";var Te=Object.defineProperty;var Ce=(a,e,t)=>e in a?Te(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var s=(a,e,t)=>(Ce(a,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const F=require("base-64"),P=require("date-fns"),E=require("@formant/realtime-sdk"),Se=require("eventemitter3"),Ee=require("pako"),ke=require("base64-js");function Oe(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const u=Oe(P),Re="https://api.formant.io";function be(a,e){try{if(e.get("formant_stage"))return"https://api-stage.formant.io";if(e.get("formant_dev"))return"https://api-dev.formant.io";if(e.get("formant_local"))return"https://api.formant.local";if(e.get("formant_url")){const t=e.get("formant_url");if(t!==null)try{return new URL(t).origin}catch{console.warn(`Ignoring malformed \`formant_url\` url parameter: ${t}`)}}}catch{}return typeof a<"u"&&"FORMANT_API_URL"in a&&typeof a.FORMANT_API_URL=="string"?a.FORMANT_API_URL:Re}const h=be(typeof window<"u"?window:globalThis,new URLSearchParams(typeof window<"u"&&window.location?window.location.search:void 0));class De{constructor({apiUrl:e,refreshAuthToken:t,addAccessTokenRefreshListener:n}){s(this,"_refreshToken");s(this,"_isShareToken",!1);s(this,"_currentOrganization");s(this,"_currentUser");s(this,"_defaultDeviceId");s(this,"_token");s(this,"_waitingForAuth",new Set);s(this,"_refreshTimer");s(this,"_apiUrl");s(this,"_refreshAuthToken");s(this,"_addAccessTokenRefreshListener");this._apiUrl=e,this._refreshAuthToken=t,this._addAccessTokenRefreshListener=n}get token(){return this._token}get currentUser(){return this._currentUser}get currentOrganization(){return this._currentOrganization}get defaultDeviceId(){return this._defaultDeviceId}get refreshToken(){return this._refreshToken}get isShareToken(){return this._isShareToken}async login(e,t){try{const n=await fetch(`${this._apiUrl}/v1/admin/auth/login`,{method:"POST",body:JSON.stringify({email:e,password:t}),headers:{"Content-Type":"application/json"}}),i=await n.json();if(n.status!==200)throw new Error(i.message);return await this.loginWithToken(i.authentication.accessToken,i.authentication.refreshToken),i.authentication}catch(n){return console.error("login() failed",{err:n}),this._waitingForAuth.forEach(i=>i(!1)),this._waitingForAuth.clear(),Promise.reject(n)}}async loginWithToken(e,t){var i;const n=JSON.parse(F.decode(e.split(".")[1]));try{let r;if(this._isShareToken=n["formant:claims"]&&n["formant:claims"].type=="share",n["formant:claims"]&&(this._currentOrganization=n["formant:claims"].organizationId),n["custom:organization_id"]&&(this._currentOrganization=n["custom:organization_id"]),this._isShareToken||(r=n.sub),n["formant:claims"]&&n["formant:claims"].userId&&(r=n["formant:claims"].userId),r&&((i=this._currentUser)==null?void 0:i.id)!==r){const c=await fetch(`${this._apiUrl}/v1/admin/users/${r}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e}}),d=await c.json();if(c.status!==200)throw new Error(d.message);this._currentUser=d}this._token=e,this._waitingForAuth.forEach(c=>c(!0))}catch(r){console.error("loginWithToken() failed",{err:r}),this._waitingForAuth.forEach(c=>c(!1))}finally{this._waitingForAuth.clear()}t&&(this._refreshToken=t,setInterval(async()=>{if(this._refreshToken){const c=await(await fetch(`${this._apiUrl}/v1/admin/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:this._refreshToken})})).json();this._token=c.authentication.accessToken}},1e3*60*60))}isAuthenticated(){return this._token!==void 0}getCurrentUser(){return this._currentUser}async waitTilAuthenticated(){return this.token!==void 0?!0:new Promise(e=>{this._waitingForAuth.add(e)})}async listenForRefresh(){const t=()=>{this._refreshTimer=void 0,this._refreshAuthToken()};this._addAccessTokenRefreshListener(n=>{this._refreshTimer&&clearTimeout(this._refreshTimer),this._refreshTimer=setTimeout(t,36e5),this.loginWithToken(n)}),this._refreshTimer=setTimeout(t,36e5)}async forgotPassword(e){await fetch(`${this._apiUrl}/v1/admin/auth/forgot-password`,{method:"POST",body:JSON.stringify({email:e}),headers:{"Content-Type":"application/json"}})}async confirmForgotPassword(e){return(await fetch(`${this._apiUrl}/v1/admin/auth/confirm-forgot-password`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}})).ok}async respondToNewPasswordRequiredChallenge(e){return await(await fetch(`${this._apiUrl}/v1/admin/auth/respond-to-new-password-required-challenge`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}})).json()}async loginWithGoogle(e){return await(await fetch(`${this._apiUrl}/v1/admin/auth/login-google`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}})).json()}async refresh(e){const n=await(await fetch(`${this._apiUrl}/v1/admin/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e})})).json();await this.loginWithToken(n.authentication.accessToken,e)}}function O(){return typeof window<"u"&&window.location?new URLSearchParams(window.location.search).get("module"):null}function T(a){if(!(window&&window.parent))throw new Error("cannot send message to non-existent parent");window.parent.postMessage(a,"*")}function V(){const a=O();if(!a)throw new Error("No module context");T({type:"refresh_auth_token",module:a})}function W(a){function e(t){const n=t.data;n.type==="auth_token"&&a(n.token)}return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}}const o=new De({apiUrl:h,refreshAuthToken:V,addAccessTokenRefreshListener:W});async function Ae(a){return(await(await fetch(`${h}/v1/admin/module-configurations/${a}`,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).configuration}function Pe(){T({type:"hide_analytics_date_picker"})}function je(a){T({type:"go_to_device",deviceId:a})}function Ne(a){T({type:"go_to_time",time:a.getTime()})}function Le(){const a=O();if(!a)throw new Error("No module context");T({type:"request_module_data",module:a})}function Ie(a,e){const t=O();if(!t)throw new Error("No module context");T({type:"send_channel_data",source:t,channel:a,data:e})}function _e(a,e){const t=O();if(!t)throw new Error("No module context");T({type:"set_module_data_time_range",module:t,before:a,after:e||0})}function $e(a){const e=O();if(!e)throw new Error("No module context");T({type:"setup_module_menus",module:e,menus:a})}function Me(a){T({type:"show_message",message:a})}function ze(a,e){const t=n=>{const i=n.data;i.type==="channel_data"&&i.channel===a&&e({source:i.source,data:i.data})};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)}function Be(a){const e=t=>{const n=t.data;n.type==="module_menu_item_clicked"&&a(n.menu)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}function qe(a){const e=t=>{const n=t.data;n.type==="module_configuration"&&a(n)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}function xe(a){const e=O();e&&T({type:"request_module_data",module:e});const t=n=>{const i=n.data;i.type==="module_data"&&a({streams:i.streams,time:i.time,queryRange:i.queryRange})};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)}function Ue(a){T({type:"request_devices"});const e=t=>{const n=t.data;n.type==="overview_devices"&&a(n.data)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}const Je=1,G=1e3,H=60*G,K=60*H,L=24*K,Fe=7*L,Ve=30*L,We=365*L,I={millisecond:Je,second:G,minute:H,hour:K,day:L,week:Fe,month:Ve,year:We};function Ge(a,e){return a.filter(t=>e.includes(t.type))}function He(a,e,t){const n=e.getTime(),i=t.getTime();return a.map(r=>({...r,points:r.points.filter(([c])=>c>=n&&c<i)})).filter(({points:r})=>r.length>0)}class U{constructor({capacity:e,timeout:t}={}){s(this,"entries",new Map);s(this,"metadata",new Map);s(this,"capacity");s(this,"timeout");this.capacity=e||1e4,this.timeout=t||I.minute}get(e,t){const n=this.keyToCacheKey(e),i=this.entries.get(n),r=this.metadata.get(n);return(i===void 0||r&&(r==null?void 0:r.expiration.getTime())<Date.now())&&!(r!=null&&r.generating)&&t&&this.generate(e,t()),i===void 0&&r&&r.lastValue!==void 0?r.lastValue:i}set(e,t){const n=this.keyToCacheKey(e);this.metadata.set(n,{generating:!1,expiration:new Date(Date.now()+this.timeout),lastValue:t}),this.entries.set(n,t),this.metadata.size>this.capacity&&this.deleteOldestEntry()}clear(){this.entries.clear(),[...this.metadata.values()].forEach(e=>e.generating=!1)}clearKey(e){this.metadata.delete(e),this.entries.delete(e)}keyToCacheKey(e){return JSON.stringify(e)}deleteOldestEntry(){if(this.metadata.size<1)return;const[e]=[...this.metadata.entries()].reduce(([t,n],[i,r])=>r.expiration.getTime()<n.expiration.getTime()?[i,r]:[t,n]);this.clearKey(e)}generate(e,t){const n=this.keyToCacheKey(e),i=this.metadata.get(n)||{};this.metadata.set(n,{...i,generating:!0,expiration:new Date(Date.now()+this.timeout)}),setTimeout(()=>{t.then(r=>{const c=this.metadata.get(n);!(c!=null&&c.generating)||this.set(e,r)})},0)}}async function _(a){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/queries`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}class Ke{constructor(){s(this,"queryStoreCache",new U({capacity:1e4,timeout:20*I.second}));s(this,"liveQueryStoreCache",new U({capacity:1e4,timeout:200*I.millisecond}))}moduleQuery(e,t,n,i,r,c=!1){const d={...e,names:[...t],types:[...n]},p=this.query(d,i,r,c);return p===void 0||p==="too much data"?p:Ge(p,n)}query(e,t,n,i=!1){const r={...e,start:P.startOfMinute(t).toISOString(),end:i?n.toISOString():P.addMinutes(P.roundToNearestMinutes(n),1).toISOString(),latestOnly:i},c=n>P.addSeconds(new Date,-20);let d;return c?d=this.liveQueryCache(r):d=this.queryCache(r),!d||d==="too much data"||i?d:He(d,t,n)}queryCache(e){return this.queryStoreCache.get(e,async()=>{try{return await _(e)}catch(t){throw t}})}liveQueryCache(e){return this.liveQueryStoreCache.get(e,async()=>{try{return await _(e)}catch(t){throw t}})}}const Qe=new Ke;function Xe(a,e,t){const n=i=>{const r=i.data;if(r.type==="module_data"){const{start:c,end:d}=r.queryRange;t(Qe.moduleQuery({},a,e,new Date(c),new Date(d),!1))}};return window.addEventListener("message",n),()=>window.removeEventListener("message",n)}async function Ye(a,e,t){return new Promise(n=>{T({type:"request_date",minTime:e,maxTime:t,time:a});const i=r=>{const c=r.data;c.type==="date_response"&&(window.removeEventListener("message",i),n(c.data))};window.addEventListener("message",i)})}async function Ze(a,e){return new Promise(t=>{const n=Math.random().toString();T({type:"prompt",promptId:n,schema:a,okText:e==null?void 0:e.okText,cancelText:e==null?void 0:e.cancelText});const i=r=>{const c=r.data;c.type==="prompt_response"&&c.promptId===n&&t(c.data),window.removeEventListener("message",i)};window.addEventListener("message",i)})}const x=class{static isModule(){return O()!==null}static async getCurrentModuleConfiguration(){let e=new URLSearchParams("");typeof window<"u"&&window.location&&(e=new URLSearchParams(window.location.search));const t=e.get("configuration");if(!(t===null||t.trim()===""))return Ae(t.trim())}static get isOnline(){return x._isOnline}static listenForConnectionEvents(){const e=t=>{const{data:n}=t;n.type==="formant_online"&&(this._isOnline=n.online)};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)}static checkConnection(e=1e3){return new Promise((t,n)=>{const i=setTimeout(()=>n(new Error("deadline expired: took too long")),e),r=c=>{window.removeEventListener("message",r),clearTimeout(i);const{data:d}=c;d.type==="formant_online"&&(this._isOnline=d.online,t(d.online))};window.addEventListener("message",r),T({type:"formant_online"})})}static waitForConnection(e=5e3){let t=!1;const n=new Promise((c,d)=>{setTimeout(()=>{t=!0,d(new Error("deadline expired: took too long"))},e)}),i=c=>new Promise(d=>setTimeout(d,c)),r=async()=>{for(await i(50);!t&&!(this.isOnline||await this.checkConnection);)await i(500)};return Promise.race([n,r()])}};let y=x;s(y,"getCurrentModuleContext",O),s(y,"disableAnalyticsBottomBar",Pe),s(y,"goToDevice",je),s(y,"goToTime",Ne),s(y,"refreshAuthToken",V),s(y,"requestModuleData",Le),s(y,"sendChannelData",Ie),s(y,"setModuleDateTimeRange",_e),s(y,"setupModuleMenus",$e),s(y,"showMessage",Me),s(y,"addAccessTokenRefreshListener",W),s(y,"addChannelDataListener",ze),s(y,"addMenuListener",Be),s(y,"addModuleConfigurationListener",qe),s(y,"addModuleDataListener",xe),s(y,"addOverviewDeviceListener",Ue),s(y,"addStreamListener",Xe),s(y,"getDate",Ye),s(y,"prompt",Ze),s(y,"_isOnline",null);function f(a,e){if(a!==void 0)return a;throw new Error(e||"Value is undefined")}const g={UNKNOWN:0,TELEOP:1,PORT_FORWARD:2,OBSERVE:3},et={...g,Unknown:g.UNKNOWN,Teleop:g.TELEOP,PortForward:g.PORT_FORWARD,Observe:g.OBSERVE,unknown:g.UNKNOWN,teleop:g.TELEOP,portForward:g.PORT_FORWARD,observe:g.OBSERVE},R=Symbol("RtcClientPool.instance");var on;class j{constructor(e){s(this,on,null);s(this,"createClient");s(this,"ttlMs");s(this,"proxyHandler");s(this,"proxyReceivers",new Map);s(this,"teardownTimeout",null);s(this,"dispatch",(e,t)=>{this.proxyReceivers.forEach(n=>n==null?void 0:n(e,t))});const{createClient:t,ttlMs:n=0}=e;this.createClient=t,this.ttlMs=Math.max(n,0),this.proxyHandler={get:(i,r,c)=>{switch(r){case"shutdown":return()=>this.releaseInstance(c);default:return Reflect.get(i,r,c)}}}}get isActive(){return this[R]!==null}get size(){return this.proxyReceivers.size}get(e){const t=new Proxy(this.allocate(),this.proxyHandler);return this.proxyReceivers.set(t,e??null),t}allocate(){if(this[R])return this.teardownTimeout&&(clearTimeout(this.teardownTimeout),this.teardownTimeout=null),this[R];const e=this.createClient(this.dispatch);return this[R]=e,e}async teardown(){const e=this[R];if(!e){console.warn("singleton has already been shutdown!");return}try{await e.shutdown()}finally{this[R]=null}}async releaseInstance(e){return this.proxyReceivers.delete(e)?this.proxyReceivers.size!==0?!1:(!this.teardownTimeout&&Number.isFinite(this.ttlMs)&&(this.ttlMs===0?await this.teardown():this.teardownTimeout=setTimeout(()=>{this.teardown().catch(t=>console.error("teardown failed",{err:t})).finally(()=>this.teardownTimeout=null)},this.ttlMs)),!0):(console.warn("this instance has already been released!"),!1)}}on=R;const N=async()=>f(o.token,"Realtime when user isn't authorized"),b={[g.UNKNOWN]:new j({ttlMs:2500,createClient:a=>new E.RtcClient({signalingClient:new E.SignalingPromiseClient(h),getToken:N,sessionType:g.UNKNOWN,receive:a})}),[g.TELEOP]:new j({ttlMs:2500,createClient:a=>new E.RtcClient({signalingClient:new E.SignalingPromiseClient(h),getToken:N,sessionType:g.TELEOP,receive:a})}),[g.PORT_FORWARD]:new j({ttlMs:2500,createClient:a=>new E.RtcClient({signalingClient:new E.SignalingPromiseClient(h),getToken:N,sessionType:g.PORT_FORWARD,receive:a})}),[g.OBSERVE]:new j({ttlMs:2500,createClient:a=>new E.RtcClient({signalingClient:new E.SignalingPromiseClient(h),getToken:N,sessionType:g.OBSERVE,receive:a})})},tt={...b,unknown:b[g.UNKNOWN],teleop:b[g.TELEOP],portForward:b[g.PORT_FORWARD],observe:b[g.OBSERVE]},$=b[g.TELEOP],nt=a=>{const{sessionType:e}=a;return e?tt[e]:$};class Q{constructor(e){s(this,"token");this.captureSession=e}async ingestJSON(e){if(!this.token){const n=await(await fetch(`${h}/v1/admin/capture-sessions/${this.captureSession.code}/authenticate`,{method:"POST"})).json();this.token=n.token}await fetch(`${h}/v1/ingest`,{method:"POST",body:JSON.stringify({deviceId:this.captureSession.deviceId,name:this.captureSession.streamName,type:"json",points:[[Date.now(),JSON.stringify(e)]]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+this.token}})}}function D(a){return new Promise(e=>setTimeout(e,a))}const at=a=>a!==void 0&&a.capabilities!==void 0&&a.capabilitySet!==void 0;class X{constructor(e){s(this,"ready",!1);s(this,"listeners",[]);s(this,"openListeners",[]);s(this,"closeListeners",[]);s(this,"errorListeners",[]);s(this,"binaryListeners",[]);s(this,"error");s(this,"decoder",new TextDecoder);this.dataChannel=e,this.dataChannel.binaryType="arraybuffer",this.dataChannel.onopen=()=>{this.setReady()},this.dataChannel.onclose=()=>{this.ready=!1,this.closeListeners.forEach(t=>t())},this.dataChannel.onerror=t=>{console.error(t),this.error="An error occurred in DataChannel",this.errorListeners.forEach(n=>n(t))},this.dataChannel.onmessage=t=>{this.listeners.forEach(n=>{const i=new Uint8Array(t.data),r=this.decoder.decode(i);n(r)}),this.binaryListeners.forEach(n=>{n(new Uint8Array(t.data))})}}setReady(){this.ready=!0,this.openListeners.forEach(e=>e())}addOpenListener(e){this.openListeners.push(e)}removeOpenListener(e){this.openListeners=this.openListeners.filter(t=>t!==e)}addCloseListener(e){this.closeListeners.push(e)}removeCloseListener(e){this.closeListeners=this.closeListeners.filter(t=>t!==e)}addErrorListener(e){this.errorListeners.push(e)}removeErrorListener(e){this.errorListeners=this.errorListeners.filter(t=>t!==e)}async waitTilReady(){return this.ready?!0:new Promise((t,n)=>{let i=setInterval(()=>{this.dataChannel.readyState==="open"&&this.setReady(),this.ready&&(clearInterval(i),t(!0)),this.error&&n(this.error)},10)})}send(e){if(!this.ready)throw new Error("Connection has been closed");this.dataChannel.send(e)}sendBinary(e){if(!this.ready)throw new Error("Connection has been closed");this.dataChannel.send(e)}addListener(e){this.listeners.push(e)}removeListener(e){const t=this.listeners.indexOf(e);if(t===-1)throw new Error("Could not find data channel listener to remove");if(this.error)throw new Error(this.error);this.listeners.splice(t,1)}addBinaryListener(e){this.binaryListeners.push(e)}removeBinaryListener(e){const t=this.binaryListeners.indexOf(e);if(t===-1)throw new Error("Could not find data channel listener to remove");if(this.error)throw new Error(this.error);this.binaryListeners.splice(t,1)}}class Y{constructor(e,t){s(this,"currentListeners",[]);s(this,"onRealtimeMessage",(e,t)=>{t.payload.jointState&&this.currentListeners.forEach(n=>{t.payload.jointState&&n(t.payload.jointState)})});this.device=e,this.config=t}async synchronize(){this.device.addRealtimeListener(this.onRealtimeMessage),this.device.startListeningToRealtimeDataStream(this.config.currentJointStateStream)}async desynchronize(){this.device.removeRealtimeListener(this.onRealtimeMessage),this.device.stopListeningToRealtimeDataStream(this.config.currentJointStateStream)}async addCurrentJointStateListener(e){this.currentListeners.push(e)}}class Z{constructor(e,t,n){s(this,"channel");s(this,"requestIdToResponseMap",new Map);this.device=e,this.channel_name=t,this.timeout=n}addOpenListener(e){f(this.channel,"channel not initalized").addOpenListener(e)}removeOpenListener(e){f(this.channel,"channel not initalized").removeOpenListener(e)}addCloseListener(e){f(this.channel,"channel not initalized").addCloseListener(e)}removeCloseListener(e){f(this.channel,"channel not initalized").removeCloseListener(e)}addErrorListener(e){f(this.channel,"channel not initalized").addErrorListener(e)}removeErrorListener(e){f(this.channel,"channel not initalized").removeErrorListener(e)}}class ee extends Z{constructor(){super(...arguments);s(this,"RESPONSE_SUCCESS_BYTE",0);s(this,"decoder",new TextDecoder)}generateBinaryId(){const t=new Uint8Array(16);for(let n=0;n<t.length;n++)t[n]=Math.floor(Math.random()*256);return t}async initialize(){this.channel=await this.device.createCustomDataChannel(this.channel_name),this.channel.addBinaryListener(t=>{const i=t.slice(0,16).toString();if(i.length===0)throw new Error("Invalid response");const r=t.slice(16);if(r.length===0)throw new Error("Invalid response");this.requestIdToResponseMap.has(i)&&this.requestIdToResponseMap.set(i,r)})}async request(t){if(this.channel||await this.initialize(),!this.channel)throw new Error("Failed to create channel");const{channel:n,requestIdToResponseMap:i,timeout:r}=this;await n.waitTilReady();const c=this.generateBinaryId(),d=c.toString();i.set(d,!0),n.sendBinary(new Uint8Array([...c,...t]));const p=new Date().getTime();for(;new Date().getTime()<p+r;)if(await D(50),i.has(d)){const m=i.get(d);if(m!==!0){i.delete(d);const w=m[0]===this.RESPONSE_SUCCESS_BYTE,v=m.slice(1);if(w)return v;throw console.error({name:"AdapterError",message:this.decoder.decode(v)}),new Error("Binary request datachannel adapter error")}}throw i.delete(d),console.error({name:"TimeoutError",message:`Request timed out after ${r/1e3} seconds`}),new Error("Binary request data channel request timed out")}}class te extends Z{generateTextId(){return Math.random().toString(36).substring(2)+"-"+Math.random().toString(36).substring(2)}async initialize(){this.channel=await this.device.createCustomDataChannel(this.channel_name),this.channel.addListener(e=>{const t=JSON.parse(e),{id:n,data:i,error:r}=t;if(!n)throw new Error("Invalid response");if(!i&&!r)throw new Error("Invalid response");this.requestIdToResponseMap.has(n)&&this.requestIdToResponseMap.set(n,t)})}async request(e){if(this.channel||await this.initialize(),!this.channel)throw new Error("Failed to create channel");const{channel:t,requestIdToResponseMap:n,timeout:i}=this;await t.waitTilReady();const r=this.generateTextId();n.set(r,!0),t.send(JSON.stringify({id:r,data:e}));const c=new Date().getTime();for(;new Date().getTime()<c+i;)if(await D(50),n.has(r)){const d=n.get(r);if(d!==!0){n.delete(r);const{data:p,error:m}=d;if(p)return p;if(m)throw console.error({name:"AdapterError",message:m}),new Error("Text request datachannel adapter error")}}throw n.delete(r),console.error({name:"TimeoutError",message:`Request timed out after ${i/1e3} seconds`}),new Error("Text request datachannel request timed out")}}class ne extends Se.EventEmitter{constructor(){super(...arguments);s(this,"rtcClient");s(this,"remoteDevicePeerId",null);s(this,"realtimeListeners",[]);s(this,"connectionMonitorInterval");s(this,"handleMessage",(t,n)=>{this.realtimeListeners.forEach(i=>i(t,n))})}stopConnectionMonitoring(){clearInterval(this.connectionMonitorInterval),this.connectionMonitorInterval=void 0}assertNotCancelled(t){if(t)throw new Error("Cancelled by deadline")}getRealtimeStatus(){if(this.rtcClient&&this.remoteDevicePeerId)return this.rtcClient.getConnectionStatus(this.remoteDevicePeerId);throw new Error("Realtime connection hasn't been started")}getRealtimePing(){if(this.rtcClient&&this.remoteDevicePeerId)return this.rtcClient.getPing(this.remoteDevicePeerId);throw new Error("Realtime connection hasn't been started")}addRealtimeListener(t){this.realtimeListeners.push(t)}removeRealtimeListener(t){const n=this.realtimeListeners.indexOf(t);if(n===-1)throw new Error("Could not find realtime listener to remove");this.realtimeListeners.splice(n,1)}async getRealtimeManipulators(){const t=await this.getConfiguration(),n=[];for(const i of t.teleop.rosStreams??[])i.topicType=="sensor_msgs/JointState"&&n.push(new Y(this,{currentJointStateStream:{name:i.topicName},plannedJointStateStream:i.plannedTopic?{name:i.plannedTopic}:void 0,planValidStream:i.planValidTopic?{name:i.planValidTopic}:void 0,endEffectorStream:i.endEffectorTopic?{name:i.endEffectorTopic}:void 0,endEffectorLinkName:i.endEffectorLinkName,baseReferenceFrame:i.baseReferenceFrame,localFrame:i.localFrame}));return n}async getRealtimeVideoStreams(){var i,r,c;const t=await this.getConfiguration(),n=[];for(const d of((i=t.teleop)==null?void 0:i.hardwareStreams)??[])d.rtcStreamType==="h264-video-frame"&&n.push({name:d.name});for(const d of((r=t.teleop)==null?void 0:r.rosStreams)??[])d.topicType=="formant/H264VideoFrame"&&n.push({name:d.topicName}),(d.topicType==="sensor_msgs/Image"||d.topicType==="sensor_msgs/CompressedImage")&&d.encodeVideo&&n.push({name:d.topicName});for(const d of((c=t.teleop)==null?void 0:c.customStreams)??[])d.rtcStreamType==="h264-video-frame"&&n.push({name:d.name});return n}createCustomRequestDataChannel(t,n=3e3){return new te(this,t,n)}createCustomBinaryRequestDataChannel(t,n=3e3){return new ee(this,t,n)}async startListeningToRealtimeVideo(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!0,pipeline:"rtc"})}async stopListeningToRealtimeVideo(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!1,pipeline:"rtc"})}async startListeningToRealtimeDataStream(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!0,pipeline:"rtc"})}async stopListeningToRealtimeDataStream(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t.name,enable:!1,pipeline:"rtc"})}async enableRealtimeTelemetryPriorityIngestion(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t,enablePriorityUpload:!0,pipeline:"telemetry"})}async disableRealtimeTelemetryPriorityIngestion(t){const n=f(this.rtcClient,"Realtime connection has not been started"),i=await this.getRemotePeer();n.controlRemoteStream(f(i).id,{streamName:t,enablePriorityUpload:!1,pipeline:"telemetry"})}async changeStreamAudioType(t,n){const i=f(this.rtcClient,"Realtime connection has not been started"),r=await this.getRemotePeer();i.controlRemoteStream(f(r).id,{streamName:t,setAudioFormat:n})}async createCustomDataChannel(t,n){const i=f(this.rtcClient,"Realtime connection has not been started"),r=await this.getRemotePeer(),c=await new Promise(d=>{i.createCustomDataChannel(f(r).id,t,{ordered:!0,...n},!1,(p,m)=>{const w=new X(m);d(w)})});return await c.waitTilReady(),c}async sendRealtimeMessage(t,n={channelLabel:"stream.reliable"}){const i=f(this.rtcClient,"Realtime connection has not been started"),r=await this.getRemotePeer();i.send(f(r).id,t,n)}async getRealtimeAudioStreams(){var i,r,c;const t=await this.getConfiguration(),n=[];for(const d of((i=t.teleop)==null?void 0:i.hardwareStreams)??[])d.rtcStreamType==="audio-chunk"&&n.push({name:d.name});for(const d of((r=t.teleop)==null?void 0:r.rosStreams)??[])d.topicType=="audio_common_msgs/AudioData"&&n.push({name:d.topicName});for(const d of((c=t.teleop)==null?void 0:c.customStreams)??[])d.rtcStreamType==="audio-chunk"&&n.push({name:d.name});return n}}const it=new TextEncoder;new TextDecoder;function ot(a){const e=JSON.stringify(a),t=it.encode(e),n=Ee.deflate(t);return ke.fromByteArray(n)}async function ae(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/views`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function ie(a,e){if(!o.token)throw new Error("Not authenticated");const n=(await ae()).filter(d=>d.name===e);if(n.length===0)return console.warn("View does not exist or it is misspell"),null;const i=await fetch(`${h}/v1/admin/shares`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}}),r=h.replace("api","app"),{code:c}=await i.json();return`${r}/shares/${c}#${ot({viewId:n[0].id})}`}const rt=["day","week","month","year","hour","minute","quarter"],st=["interval","start","end","sub","get"];function oe(a){return a.count<2?0:a.sumOfSquares/(a.count-1)}function re(a){return Math.sqrt(oe(a))}function se(a){return a.max}function ce(a){return a.min}function de(a){return a.count===0?-1:a.sum/a.count}function he(a){return a.sum}function le(a){return a.count}const ct={min:ce,max:se,"standard deviation":re,average:de,sum:he,count:le},M={day:{interval:u.eachDayOfInterval,start:u.startOfDay,end:u.endOfDay,sub:u.subDays,get:u.getDay},week:{interval:u.eachWeekOfInterval,start:u.startOfWeek,end:u.endOfWeek,sub:u.subWeeks,get:u.getWeek},month:{interval:u.eachMonthOfInterval,start:u.startOfMonth,end:u.endOfMonth,sub:u.subMonths,get:u.getMonth},year:{interval:u.eachYearOfInterval,start:u.startOfYear,end:u.endOfYear,sub:u.subYears,get:u.getYear},hour:{interval:u.eachHourOfInterval,start:u.startOfHour,end:u.endOfHour,sub:u.subHours,get:u.getHours},minute:{interval:u.eachMinuteOfInterval,start:u.startOfMinute,end:u.endOfMinute,sub:u.subMinutes,get:u.getMinutes},quarter:{interval:u.eachQuarterOfInterval,start:u.startOfQuarter,end:u.endOfQuarter,sub:u.subQuarters,get:u.getQuarter}},ue=(a,e)=>a.split("/")[0]+"/"+a.split("/")[1]+"–"+e.split("/")[0]+"/"+e.split("/")[1];async function z(a){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/events/query`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function me(a,e,t,n,i){const r=M[e];return await Promise.all(Array(t).fill(0).map(async(c,d)=>{const p=new Date(n),m=r.sub(r.start(p),t-d-1),w=r.sub(r.end(p),t-d-1),v=ue(m.toLocaleDateString(),w.toLocaleDateString()),C=await z({...i,eventTypes:a,start:new Date(m).toISOString(),end:new Date(w).toISOString()});return{date:v,events:C}}))}async function B(a,e){return(await z({...a,eventTypes:["annotation"]})).filter(r=>!!r.tags&&Object.keys(r.tags).includes(e)).reduce((r,c)=>{const d=c.tags[e];return d in r?(r[d]+=1,r):(r[d]=1,r)},{})}async function fe(a,e,t){const{end:n,start:i}=a,c=M[t].interval({start:new Date(i),end:new Date(n)}),d=c.map((m,w)=>{const v=new Date(m).toISOString(),C=w===c.length-1?new Date(Date.now()).toISOString():new Date(c[w+1]);return B({...a,start:v,end:C},e)}),p=await Promise.all(d);return c.map((m,w)=>({date:new Date(m).toISOString(),annotations:p[w]}))}async function we(a,e,t,n,i){let r=a;Array.isArray(a)||(r=[a]);let c=e;return Array.isArray(e)||(c=[e]),(await(await fetch(`${h}/v1/queries/queries`,{method:"POST",body:JSON.stringify({deviceIds:r,end:n.toISOString(),names:c,start:t.toISOString(),tags:i}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function pe(){if(!o.token)throw new Error("Not authenticated");const a=$.get();try{return await a.getSessions()}finally{await a.shutdown()}}async function ye(){if(!o.token)throw new Error("Not authenticated");const a=$.get();try{return await a.getPeers()}finally{await a.shutdown()}}async function dt(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/devices`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function ht(a,e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/devices/${a}`,{method:"PATCH",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function lt(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/device-details/query`,{method:"POST",body:JSON.stringify({enabled:!0,type:"default"}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function ut(a){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/devices/query`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function mt(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/devices/${a}/disable`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}class S extends ne{constructor(e,t,n,i){super(),this.id=e,this.name=t,this.organizationId=n,this.tags=i}async getLatestTelemetry(){return(await(await fetch(`${h}/v1/queries/stream-current-value`,{method:"POST",body:JSON.stringify({deviceIds:[this.id]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async getConfiguration(){let e=await fetch(`${h}/v1/admin/devices/${this.id}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}});const t=await e.json();if(!t.state.reportedConfiguration)throw new Error("Device has no configuration, has it ever been turned on?");const n=t.state.reportedConfiguration.version;return e=await fetch(`${h}/v1/admin/devices/${this.id}/configurations/${n}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}}),(await e.json()).document}async getFileUrl(e){return(await(await fetch(`${h}/v1/admin/files/query`,{method:"POST",body:JSON.stringify({fileIds:[e]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).fileUrls}async startRealtimeConnection(e={}){if(console.debug(`${new Date().toISOString()} :: Connection start requested`),this.rtcClient&&this.connectionMonitorInterval!==void 0)throw new Error(`Already created realtime connection to device ${this.id}`);this.rtcClient&&console.warn("overwriting existing rtcClient due to missing connectionMonitorInterval");const{sessionType:t,deadlineMs:n=1e4,maxConnectRetries:i=3}=typeof e=="number"?{sessionType:e}:e,c=nt({sessionType:t}).get(this.handleMessage);let d=!1;const p=new Promise((w,v)=>setTimeout(()=>{d=!0,v(new Error("Connection timed out: the connection could not be finalized in time, possibly due to network issues or misconfigured settings."))},n)),m=async()=>{if("isReady"in c)for(;!c.isReady();)this.assertNotCancelled(d),await D(100);const w=await this.getRemoteDevicePeerId(c);this.assertNotCancelled(d);let v;for(let A=0;A<i&&(v=await c.connect(w),!v);A++)D(100),this.assertNotCancelled(d);if(!v)throw new Error(`Session could not be created: exhausted ${i} retries`);let C=0;for(;!d&&c.getConnectionStatus(w)!=="connected";)await D(100),C+=1;return this.assertNotCancelled(d),console.debug(`${new Date().toISOString()} :: Connection completed after ${C} retries`),w};return Promise.race([m(),p]).then(w=>{this.remoteDevicePeerId=w,this.initConnectionMonitoring(),this.rtcClient=c,this.emit("connect")}).catch(w=>{throw console.debug(`${new Date().toISOString()} :: Connection failed: %o`,w),this.remoteDevicePeerId=null,c.shutdown().catch(v=>{console.error("rtcClient cannot shutdown: %o",v)}),this.emit("connection_failed",w),w})}async getRemoteDevicePeerId(e){const n=(await e.getPeers()).find(i=>i.deviceId===this.id);if(!at(n))throw new Error("Cannot find peer, is the robot offline?");return n.id}initConnectionMonitoring(){this.connectionMonitorInterval=setInterval(async()=>{let e=!1;if(this.rtcClient){const n=this.rtcClient.getConnections().find(i=>i.getRemotePeerId()===this.remoteDevicePeerId&&i.isActive());(n===void 0||!n.isReady())&&(console.debug(`${new Date().toISOString()} :: data channel closed`),e=!0)}(!this.rtcClient||!this.remoteDevicePeerId||await this.rtcClient.getConnectionStatsInfo(this.remoteDevicePeerId)===void 0||e)&&(this.emit("disconnect"),this.stopRealtimeConnection().catch(t=>{console.error(t)}))},1e3)}async getRemotePeer(){const t=(await f(this.rtcClient,"Realtime connection has not been started").getPeers()).find(n=>n.deviceId===this.id);return f(t,"Could not find remote peer for device "+this.id)}async stopRealtimeConnection(){let e=!1;if(this.rtcClient){this.stopConnectionMonitoring(),this.remoteDevicePeerId?(await this.rtcClient.disconnect(this.remoteDevicePeerId),this.remoteDevicePeerId=null):e=!0;try{await this.rtcClient.shutdown()}finally{this.rtcClient=void 0}}if(e)throw new Error(`Realtime connection hasn't been started for ${this.id}`)}async isInRealtimeSession(){const e=await ye(),t=await pe(),n=e.find(i=>i.deviceId===this.id);return n?t[n.id].length>0:!1}async getAvailableCommands(){return(await(await fetch(`${h}/v1/admin/command-templates/`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items.map(n=>({name:n.name,id:n.id,command:n.command,description:n.description,parameterEnabled:n.parameterEnabled,parameterValue:n.parameterValue,parameterMeta:n.parameterMeta,enabled:n.enabled,tags:n.tags}))}async sendCommand(e,t,n,i){var w;const c=(await this.getAvailableCommands()).find(v=>v.name===e);if(!c)throw new Error(`Could not find command with name "${e}"`);let d="";t===void 0?c.parameterEnabled&&c.parameterValue&&(d=c.parameterValue):d=t;let p={value:d,scrubberTime:(n||new Date).toISOString(),meta:{...c.parameterMeta,...i}};return await fetch(`${h}/v1/admin/commands`,{method:"POST",body:JSON.stringify({commandTemplateId:c.id,organizationId:this.organizationId,deviceId:this.id,command:c.command,parameter:p,userId:(w=o.currentUser)==null?void 0:w.id}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})}async getCommand(e){return await fetch(`${h}/v1/admin/commands/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})}async createCaptureStream(e){const n=await(await fetch(`${h}/v1/admin/capture-sessions`,{method:"POST",body:JSON.stringify({deviceId:this.id,streamName:e,tags:{}}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json();return new Q(n)}async getTelemetry(e,t,n,i){return await we(this.id,e,t,n,i)}async getTelemetryStreams(){var d,p;const e=await this.getConfiguration(),t=await fetch(`${h}/v1/queries/metadata/stream-names`,{method:"POST",body:JSON.stringify({deviceIds:[this.id]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}}),n=[],i=[];return(p=(d=e.telemetry)==null?void 0:d.streams)==null||p.forEach(m=>{m.disabled!==!0&&n.push(m.name),m.onDemand===!0&&i.push(m.name)}),console.log(i),(await t.json()).items.filter(m=>!n.includes(m)).map(m=>({name:m,onDemand:i.includes(m)}))}async createInterventionRequest(e,t,n,i){return await(await fetch(`${h}/v1/admin/intervention-requests`,{method:"POST",body:JSON.stringify({message:e,interventionType:t,time:new Date().toISOString(),deviceId:this.id,tags:i,data:n}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async addInterventionResponse(e,t,n){return await(await fetch(`${h}/v1/admin/intervention-responses`,{method:"POST",body:JSON.stringify({interventionId:e,interventionType:t,data:n}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async getAnnotationCount(e,t){return await B({...e,deviceIds:[this.id]},t)}async getAnnotationCountByIntervals(e,t,n){return await fe({...e,deviceIds:[this.id]},t,n)}async eventsCounter(e,t,n,i,r){return await me(e,t,n,i,{...r,deviceIds:[this.id]})}async createShareLink(e,t){return e.scope.deviceIds=[this.id],await ie(e,t)}}s(S,"createDevice",dt),s(S,"patchDevice",ht),s(S,"getDevicesData",lt),s(S,"queryDevicesData",ut),s(S,"disableDevice",mt);class ge extends ne{constructor(t){super();s(this,"id");s(this,"telemetryStreamActive",!1);s(this,"streamTelemetry",{});this.peerUrl=t}async getLatestTelemetry(){this.telemetryStreamActive||this.subscribeToTelemetry();const t=this.streamTelemetry;return Object.entries(t).map(([i,r])=>({deviceId:this.id,streamName:i,streamType:"json",currentValue:r,currentValueTime:r.timestamp,tags:{}}))}subscribeToTelemetry(){this.telemetryStreamActive=!0;let t=0;const n=new XMLHttpRequest;n.responseType="text",n.addEventListener("error",i=>{this.handleXHRError("error")}),n.addEventListener("abort",i=>{this.handleXHRError("abort")}),n.addEventListener("timeout",i=>{this.handleXHRError("timeout")}),n.addEventListener("readystatechange",i=>{n.readyState===XMLHttpRequest.DONE&&this.handleXHRError("closed")}),n.addEventListener("progress",i=>{const r=i.loaded,c=r-t;t=r,n.responseText.substr(-c).split(`
2
+ `).forEach(m=>{var w;if(m.length>0){const v=JSON.parse(m);if((w=v.result)!=null&&w.datapoint){const C=v.result.datapoint,A=C.stream;delete C.stream,this.streamTelemetry[A]=C}}})}),n.open("POST",`${this.peerUrl}/v1/telemetry`),n.send()}handleXHRError(t){console.warn(`Telemetry stream ended: ${t}`),this.telemetryStreamActive=!1}async getDeviceId(){return(await(await fetch(`${this.peerUrl}/v1/config`)).json()).configuration.id}async getConfiguration(){return(await(await fetch(`${this.peerUrl}/v1/config`)).json()).configuration.document}async startRealtimeConnection(t){if(console.debug(`${new Date().toISOString()} :: Connection start requested`),this.rtcClient&&this.connectionMonitorInterval!==void 0)throw new Error(`Already created realtime connection to device ${this.id}`);this.rtcClient&&console.warn("overwriting existing rtcClient due to missing connectionMonitorInterval");const n=new E.RtcClient({lanOnlyMode:!0,receive:this.handleMessage,sessionType:t});for(await n.connectLan(this.peerUrl);n.getConnectionStatus(this.peerUrl)!=="connected";)await D(100);this.rtcClient=n,this.initConnectionMonitoring()}initConnectionMonitoring(){this.connectionMonitorInterval=setInterval(async()=>{let t=!1;this.rtcClient&&this.rtcClient.getConnectionStatus(this.peerUrl)!=="connected"&&(console.debug(`${new Date().toISOString()} :: data channel closed`),t=!0),(!this.rtcClient||t)&&(this.emit("disconnect"),this.stopRealtimeConnection().catch(n=>{console.error(n)}))},1e3)}async getRemotePeer(){return{id:this.peerUrl,organizationId:"",deviceId:this.id,capabilities:[],capabilitySet:{}}}async stopRealtimeConnection(){let t=!1;if(this.rtcClient){this.stopConnectionMonitoring(),this.id?(await this.rtcClient.disconnect(this.id),this.remoteDevicePeerId=null):t=!0;try{await this.rtcClient.shutdown()}finally{this.rtcClient=void 0}}if(t)throw new Error(`Realtime connection hasn't been started for ${this.id}`)}async sendCommand(t,n,i,r){const c={value:n,scrubberTime:(i||new Date).toISOString(),meta:r};return await fetch(`${this.peerUrl}/v1/enqueue-command`,{method:"POST",body:JSON.stringify({command:t,parameter:c}),headers:{"Content-Type":"application/json"}})}}async function ft(a,e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/devices/${a}`,{method:"PATCH",body:JSON.stringify({fleetId:e}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function wt(a){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/queries`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).aggregates}async function pt(a){if(!o.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/fleets/${a}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})}async function yt(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/analytics/streams`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function gt(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/analytics-modules`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function vt(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/queries/analytics/rows`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function ve(a){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/devices/query`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items.map(n=>new S(n.id,n.name,n.organizationId,n.tags))}async function Tt(){if(!o.token)throw new Error("Not authenticated");let a=new URLSearchParams("");typeof window<"u"&&window.location&&(a=new URLSearchParams(window.location.search));const e=a.get("group");if(e===null||e.trim()==="")return;const t=await fetch(`${h}/v1/admin/groups/`+e,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}}),{tagKey:n,tagValue:i}=await t.json();return await ve({tags:{[n]:[i]},enabled:!0,type:"default"})}async function Ct(a){if(!o.token)throw new Error("Not authenticated");const t=await(await fetch(`${h}/v1/admin/devices/${a}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json(),n=t.name;return new S(a,n,t.organizationId,t.tags)}async function q(){if(!o.token)throw new Error("Not authenticated");const e=await(await fetch(`${h}/v1/admin/device-details/query`,{method:"POST",body:JSON.stringify({enabled:!0,type:"default"}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json();return e.items,e.items.map(t=>new S(t.id,t.name,t.organizationId,t.tags))}async function St(a){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/events/query/id=${a}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function Et(a){const t=await(await fetch(`${h}/v1/admin/files/query`,{method:"POST",body:JSON.stringify({fileIds:[a]}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json();if(t.fileUrls.length===0)throw new Error("File not found");return t.fileUrls[0]}async function kt(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/fleets/${a}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function Ot(a){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/fleets/${a}/devices`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function Rt(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/intervention-requests`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function bt(...a){const e=a.flat().filter(i=>!!i);return e.length===0?[]:(await(await fetch(`${h}/v1/queries/stream-current-value`,{method:"POST",body:JSON.stringify({deviceIds:e}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function Dt(){if(!o.token)throw new Error("Not authenticated");const t=(await(await fetch(`${h}/v1/queries/online-devices`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items;return(await q()).filter(i=>t.includes(i.id))}async function At(){if(!o.token)throw new Error("Not authenticated");const t=(await(await fetch(`${h}/v1/signaling/peers`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items.map(i=>i.deviceId);return(await q()).filter(i=>t.includes(i.id))}async function Pt(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/streams`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items.filter(t=>t.enabled)}async function jt(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/queries/analytics/task-report-rows`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function Nt(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/queries/analytics/task-reports`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function Lt(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/fleets`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}async function It(a,e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/fleets/${a}`,{method:"PATCH",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function _t(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/streams/${a.id}`,{method:"PATCH",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function $t(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/views/${a.id}`,{method:"PATCH",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function Mt(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/queries/analytics`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}async function zt(a){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/fleets`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}const k=class{static async setDefaultDevice(e){k.defaultDeviceId=e}static async getCurrentDevice(){if(!o.token)throw new Error("Not authenticated");if(!k.defaultDeviceId)throw new Error("No known default device");const n=(await(await fetch(`${h}/v1/admin/device-details/query`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items.find(c=>c.id===k.defaultDeviceId),i=n.name,r=new S(k.defaultDeviceId,i,f(o.currentOrganization),n.tags);return k.knownContext.push(new WeakRef(r)),r}static async getPeerDevice(e){const t=new ge(e);return t.id=await t.getDeviceId(),t}static async getDevice(e){const t=await Ct(e);return k.knownContext.push(new WeakRef(t)),t}};let l=k;s(l,"defaultDeviceId"),s(l,"knownContext",[]),s(l,"createFleet",zt),s(l,"listFleets",Lt),s(l,"getFleet",kt),s(l,"patchFleet",It),s(l,"deleteFleet",pt),s(l,"addDeviceToFleet",ft),s(l,"getFleetDevices",Ot),s(l,"aggregateTelemetry",wt),s(l,"createShareLink",ie),s(l,"eventsCounter",me),s(l,"getAnalyticStreams",yt),s(l,"getAnalyticsModules",gt),s(l,"getAnalyticsRows",vt),s(l,"getAnnotationCount",B),s(l,"getAnnotationCountByIntervals",fe),s(l,"getCurrentGroup",Tt),s(l,"getDevices",q),s(l,"getEvent",St),s(l,"getFileUrl",Et),s(l,"getInterventions",Rt),s(l,"getLatestTelemetry",bt),s(l,"getOnlineDevices",Dt),s(l,"getPeers",ye),s(l,"getRealtimeDevices",At),s(l,"getRealtimeSessions",pe),s(l,"getStreams",Pt),s(l,"getTaskReportRows",jt),s(l,"getTaskReportTables",Nt),s(l,"getTelemetry",we),s(l,"getViews",ae),s(l,"patchStream",_t),s(l,"patchView",$t),s(l,"queryAnalytics",Mt),s(l,"queryDevices",ve),s(l,"queryEvents",z),s(l,"queryTelemetry",_);class Bt{static async set(e,t,n){try{const i=await fetch(h+"/v1/admin/key-value",{method:"POST",body:JSON.stringify({organizationId:f(o.currentUser).organizationId,key:e,value:t,tags:n}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}}),r=await i.json();if(i.status!==200)throw new Error(r.message)}catch(i){throw i}}static async get(e){try{const t=await fetch(h+`/v1/admin/key-value/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}}),n=await t.json();if(t.status!==200)throw new Error(n.message);return n.value}catch(t){throw t}}static async list(){try{const e=await fetch(h+"/v1/admin/key-value",{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}}),t=await e.json();if(e.status!==200)throw new Error(t.message);return t.items}catch(e){throw e}}static async delete(e){try{if(!(await fetch(h+`/v1/admin/key-value/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).ok)throw new Error("Unable to handle request");return}catch(t){throw t}}}function qt(a){return Uint8Array.from(F.decode(a),e=>e.charCodeAt(0))}function J(){const{userAgent:a}=navigator;return a?a.includes("Firefox/")?"Firefox":a.includes("Edg/")?"Edge":a.includes("Chrome/")?"Chrome":a.includes("Safari/")?"Safari":a.includes("MSIE/")||a.includes("Trident/")?"IE":"Other":"Other"}const xt="audio-chunk";class Ut{constructor(e,t){s(this,"muted",!1);s(this,"hasReceivedData",!1);s(this,"audioContext");s(this,"chunks",[]);s(this,"isPlaying",!1);s(this,"startTime",0);s(this,"lastChunkOffset",0);s(this,"bufferSize",3);s(this,"receive",async e=>{var c;const t=(c=e.payload.audioChunk)==null?void 0:c.chunk_data;if(!t)return;this.hasReceivedData||(this.hasReceivedData=!0);const{audioContext:n,muted:i}=this;if(!n||e.header.stream.streamType!==xt||i!==!1)return;const r=qt(t);try{await n.decodeAudioData(r.buffer,this.scheduleChunk)}catch(d){console.warn("Error decoding audio buffer, changing audioWireFormat on agent",{error:d}),this.changeAudioWireFormat("wav")}});s(this,"scheduleChunk",e=>{const{audioContext:t}=this;if(!t)return;(this.chunks.length>this.bufferSize||this.isPlaying===!1)&&(this.chunks.forEach(i=>{i.stop()}),this.isPlaying=!1,this.chunks=[]);const n=this.createChunk(e);n&&n.buffer&&(this.isPlaying===!1&&(this.startTime=t.currentTime,this.lastChunkOffset=0,this.isPlaying=!0),n.start(this.startTime+this.lastChunkOffset,0,e.duration),this.lastChunkOffset+=n.buffer.duration,this.chunks.push(n))});this.device=e,this.stream=t,this.device.startListeningToRealtimeDataStream(t),this.device.addRealtimeListener((i,r)=>{this.receive(r)}),J()==="Safari"||J()==="IE"?this.changeAudioWireFormat("wav"):this.changeAudioWireFormat("opus");const n=window.AudioContext||window.webkitAudioContext;this.audioContext=new n}async play(){var e,t;((e=this.audioContext)==null?void 0:e.state)==="suspended"&&await((t=this.audioContext)==null?void 0:t.resume()),this.muted=!1}async pause(){await this.audioContext.suspend(),this.muted=!0}destroy(){this.device.stopListeningToRealtimeDataStream(this.stream)}createChunk(e){const{audioContext:t}=this;if(!t)return;const n=t.createBufferSource();return n.buffer=e,n.connect(t.destination),n.loop=!1,n.onended=i=>{this.chunks.splice(this.chunks.indexOf(n),1),this.chunks.length===0&&(this.isPlaying=!1)},n}changeAudioWireFormat(e){const{stream:t}=this;(async()=>await this.device.changeStreamAudioType(t.name,e))()}}class Jt{static async listAccounts(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/accounts`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}static async createAccounts(e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async getAccount(e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async patchAccount(e,t){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async deleteAccount(e){if(!o.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/accounts/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})}static async getAccountTree(e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/accounts/${e}/tree`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}}class Ft{static async listRoles(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/roles`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}static async createRole(e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/roles`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async getRole(e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/roles/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async patchRole(e,t){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/roles/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async deleteRole(e){if(!o.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/roles/${e}`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})}}class Vt{static async listUsers(){if(!o.token)throw new Error("Not authenticated");return(await(await fetch(`${h}/v1/admin/users`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()).items}static async createUser(e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/users`,{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async getUser(e){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/users/${e}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async patchUser(e,t){if(!o.token)throw new Error("Not authenticated");return await(await fetch(`${h}/v1/admin/users/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})).json()}static async deleteUser(e){if(!o.token)throw new Error("Not authenticated");await fetch(`${h}/v1/admin/users/${e}`,{method:"PATCH",body:JSON.stringify({enabled:!1,roleId:null,teamId:null}),headers:{"Content-Type":"application/json",Authorization:"Bearer "+o.token}})}}const Wt=["viewer","operator","administrator"],Gt="viewer",Ht="operator",Kt="administrator",Qt=["year","month","week","day","hour","minute"],Xt=["tag","sheet","user"],Yt=["triggered-event","intervention-request","teleop-session-record","port-forwarding-session-record","command-request","command-response","command-delivery","custom","comment","system","annotation"],Zt=["unknown","operational","offline","error"],en=["selection","labeling","teleop"],tn=["info","warning","error","critical"],nn=["video/mp4"],an=a=>new Promise(e=>setTimeout(e,a*1e3));try{const a=typeof window<"u"&&window.location?new URLSearchParams(window.location.search):new URLSearchParams(""),e=a.get("device");e&&l.setDefaultDevice(e);const t=a.get("auth");t&&o.loginWithToken(t),a.get("module")&&o.listenForRefresh(),typeof window<"u"&&y.listenForConnectionEvents()}catch{}exports.Account=Jt;exports.App=y;exports.AudioPlayer=Ut;exports.Authentication=o;exports.BinaryRequestDataChannel=ee;exports.CaptureStream=Q;exports.DataChannel=X;exports.Device=S;exports.Fleet=l;exports.KeyValue=Bt;exports.Manipulator=Y;exports.PeerDevice=ge;exports.Role=Ft;exports.SessionType=et;exports.TextRequestDataChannel=te;exports.User=Vt;exports.accessLevels=Wt;exports.administrator=Kt;exports.aggregateByDateFunctions=M;exports.aggregateFunctionMap=ct;exports.aggregateFunctions=st;exports.aggregateLevels=Qt;exports.annotationTypes=Xt;exports.eventTypes=Yt;exports.formatTimeFrameText=ue;exports.getAverage=de;exports.getCount=le;exports.getMax=se;exports.getMin=ce;exports.getStandardDeviation=re;exports.getSum=he;exports.getVariance=oe;exports.healthStatuses=Zt;exports.interventionTypes=en;exports.operator=Ht;exports.severities=tn;exports.timeout=an;exports.vailableAggregationIntervals=rt;exports.videoMimeTypes=nn;exports.viewer=Gt;
3
3
  //# sourceMappingURL=data-sdk.cjs.js.map