@connectifi/agent-web
Version:
A simple web implementation of a connectifi agent
1 lines • 53.6 kB
JavaScript
"use strict";var Ie=Object.defineProperty;var Jt=Object.getOwnPropertyDescriptor;var _t=Object.getOwnPropertyNames;var Kt=Object.prototype.hasOwnProperty;var l=(i,e)=>()=>(i&&(e=i(i=0)),e);var We=(i,e)=>{for(var t in e)Ie(i,t,{get:e[t],enumerable:!0})},Yt=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of _t(e))!Kt.call(i,o)&&o!==t&&Ie(i,o,{get:()=>e[o],enumerable:!(n=Jt(e,o))||n.enumerable});return i};var Xt=i=>Yt(Ie({},"__esModule",{value:!0}),i);var I,R=l(()=>{"use strict";I=(t=>(t.Intent="intent-resolver",t.Context="context-resolver",t))(I||{})});var ct,at=l(()=>{ct='@keyframes throbber{0%{opacity:0}50%{opacity:.5}to{opacity:0}}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:translateZ(0)}}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}@keyframes zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}*{color:var(--text-color);font-family:Arial,Helvetica,sans-serif;line-height:1rem}img{height:1.2rem;width:1.2rem}button{align-items:center;background:transparent;border:none;border-radius:50%;display:flex;filter:var(--drop-shadow-sm);height:1.8rem;justify-content:center;margin:.2rem;padding:0;transition:var(--ease);width:1.8rem}button:hover{transform:scale(1.1)}button img{height:.7rem;width:.7rem}button:hover{transform:var(--grow)}.container{--text-color:#111;--shadow:#27272ac2;--drop-shadow:drop-shadow(5px 5px 10px var(--shadow));--drop-shadow-sm:drop-shadow(3px 3px 5px var(--shadow));--box-shadow:rgba(50,50,93,.2) 0px 13px 27px -5px,rgba(0,0,0,.25) 0px 8px 16px -8px;--border:1px solid var(--secondary-variant);--ease:all 0.2s ease-in-out;--grow:scale(1.1);--grow-sm:scale(1.04);--radius:0.25rem;--background:#fff;--primary:#000;--primary-variant:#27272a;--secondary:#aaa;--secondary-variant:#d0d4db;font-size:.8rem}.fab{align-items:center;display:flex;flex-direction:column;position:fixed;z-index:99999}.fab.bl,.fab.bl .picker,.fab.br,.fab.br .picker{flex-direction:column-reverse}.fab.br .inner,.fab.mr .inner,.fab.tr .inner{align-items:end}.fabHeader,.inner{display:flex;flex-direction:column;height:3.5rem;justify-content:center;width:3.5rem}.fabHeader{align-items:center;background-color:var(--secondary);border-radius:50%;filter:var(--drop-shadow);margin:0;padding:0;transition:background-color .25s linear,var(--ease)}.fabHeader:hover{transform:var(--grow-sm)}.fab.tl{left:1rem;top:2rem}.fab.ml{left:1rem;top:calc(50vh - 1.8rem)}.fab.bl{bottom:2rem;left:1rem}.fab.tr{right:1rem;top:2rem}.fab.mr{right:1rem;top:calc(50vh - 1.8rem)}.fab.br{bottom:1.75rem;right:1rem}.fabHeader img{border-radius:50%;height:3rem;width:3rem}.fabHeader .mask{background-color:#fff;border-radius:50%;height:100%;opacity:0;position:absolute;transition:transform 2s ease-in-out;width:100%}.fabHeader .indicator{background-color:gray;border:1px solid #fff;border-radius:50%;bottom:0;height:.8rem;position:absolute;right:0;width:.8rem}.fabHeader.connected .indicator{background-color:#90ee90}.fabHeader.busy .mask{animation:throbber 2s infinite}.fabHeader.connected{background-color:var(--primary)}.toast{align-items:center;background-color:var(--background);border:var(--border);border-radius:var(--radius);box-shadow:var(--box-shadow);display:flex;flex-flow:row;flex-wrap:nowrap;justify-content:left;margin-left:70px;margin-right:70px;max-width:25rem;min-width:12rem;opacity:.9;padding:.4rem;position:fixed;visibility:hidden}.toast.show{animation-duration:.3s;animation-name:fadeInUp;visibility:visible}.toast.hide{animation-duration:.26s;animation-name:fadeOutDown}.toast>img{height:1.5rem;margin-right:.4rem;width:1.5rem}.toast>button>img{height:1.2rem;width:1.2rem}.toast .title{font-weight:600}.toast .message{font-size:.7rem;margin-right:.5rem;overflow:hidden;text-overflow:ellipsis}.picker{align-items:center;color:var(--text-color);display:none;flex-direction:column;justify-content:center;padding:.2rem 0}.picker.show{display:flex}.picker button>img{filter:invert(1)}.picker.show button{animation-duration:.4s;animation-name:zoomIn;opacity:1;visibility:visible}.picker button{animation-duration:.5s;animation-name:zoomOut;opacity:0;visibility:hidden}.toolbar{align-items:center;display:flex;flex-flow:row}.toolbar>button{background-color:var(--primary-variant)}.toolbar .title{margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:calc(100vw - 3rem)}.channels{display:none;flex-wrap:wrap;justify-content:center}.channels.show{display:flex}.resolver{background-color:var(--background);border:var(--border);border-radius:.6rem .6rem 0 0;box-shadow:var(--box-shadow);display:none;height:24rem;left:50%;margin-left:-15rem;margin-top:-12rem;opacity:0;position:fixed;top:50%;width:30rem;z-index:99999}.resolver.open{display:block;opacity:1;transition-duration:.3s;transition-property:opacity}.resolver .header{align-items:center;background-color:var(--primary-variant);border-top-left-radius:.6rem;border-top-right-radius:.6rem;display:flex;flex-direction:row;font-size:1rem;padding:.6rem 0 .3rem;width:100%}.resolver .header *{color:#fff}.resolver .header .logo img{height:1.5rem;margin:2px .5em 0;width:1.5rem}.resolver .header .title{flex-grow:1;overflow:hidden;white-space:wrap}.resolver .header .title:after{background:linear-gradient(90deg,transparent,transparent 85%,var(--primary-variant) 90%);border-top-right-radius:.6em;content:"";display:block;height:2em;left:0;pointer-events:none;position:absolute;top:0;width:100%}.resolver .header .title span{display:inline-block;margin:0 0 4px}.resolver .header .dismissContainer{align-items:start;display:flex}.resolver .header .dismiss{margin:0 .5em;z-index:1}.resolver .header .dismiss>div{background-color:transparent;border-radius:50%;cursor:pointer;height:1.2em;text-align:center;width:1.2em}.resolver .header .dismiss>div>span{position:relative;top:2px}.resolver .header .dismiss div:hover{background-color:#555}.resolver .list{height:20.5rem;overflow:scroll}.resolver .list .item{align-items:center;cursor:pointer;display:flex;flex-direction:row;flex-wrap:nowrap;height:2rem;overflow:hidden;padding:.3rem .3rem .3rem .6rem}.resolver .list .item:hover{background-color:#e7e7e7}.resolver .list .group{border-bottom:.5px solid #bbb;border-top:.5px solid #bbb;padding:.25rem .75rem}.resolver .list .item .icon-container{display:flex;flex-direction:row;flex-wrap:nowrap}.resolver .list .item img{background-repeat:no-repeat;background-size:contain;margin-right:.4rem}.resolver .list .item .title{flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resolver .list .item .info{display:flex;flex-direction:row;flex-wrap:nowrap;padding-right:.4rem}.resolver .list .item .info>div{background-repeat:no-repeat;background-size:contain;height:1.2rem;margin-left:.4rem;padding:.3em;text-align:center;width:1.2rem}.resolver .list .item .info .agent>div{margin-top:.1em}.resolver .list .item .info .more{background-color:#d3d3d3;height:1.2rem;padding-top:.5em;width:1.2rem}.resolver .list .item .info .more>span{border-color:#aaa;border-style:dashed;border-width:0 2px}.resolver .list .intentRow{background-color:#ddd;border-top:1px solid #bbb;padding-bottom:.6rem;padding-top:.6rem}.resolver .list .intentTitle{font-size:1rem;padding:0 .5em}.resolverBackground{background-color:#111;display:none;height:100%;left:0;opacity:.2;position:absolute;top:0;width:100%;z-index:9999}.resolverBackground.open{display:block}@media (max-width:600px){.resolver{margin-left:calc(-50vw - -1rem);width:calc(100vw - 2rem)}}@media (max-height:480px){.resolver{height:calc(100vh - 2rem);margin-top:calc(-50vh - -1rem)}.resolver .list{height:calc(100vh - 4.7rem)}}'});var j,lt=l(()=>{"use strict";j=class{constructor(e){this.images=e}updateImageSource(e){this.images.forEach(t=>{t.src=e})}}});function V(i){i.title=""}var L,c,u,G,h=l(()=>{"use strict";L=class{constructor(e){this.element=document.createElement(e)}},c=class extends L{constructor(){super("div")}},u=class extends L{constructor(){super("button")}},G=class extends L{constructor(){super("img")}}});var J,dt=l(()=>{"use strict";h();J=class extends u{constructor(t){super();this.containerElement=document.createElement("span");this.element.title="reconnect now";let n=`${t}/connect.png`,o=document.createElement("img");o.src=n,this.element.appendChild(o)}}});var _,pt=l(()=>{"use strict";_=class{constructor(e,t){this.picker=e;this.logo=t}update(e){this.picker.updateInteropStrategy(e.interopStrategy),e.icon&&this.logo.updateImageSource(e.icon)}}});var K,ht=l(()=>{"use strict";h();K=class extends u{constructor(){super();this.icon=document.createElement("img");this.element.appendChild(this.icon)}updateOwner(t,n,o){if(n!=="strict"&&n!=="openauth"){this.element.style.display="none";return}if(this.element.style.display="",!o){this.element.setAttribute("title","please sign in"),this.icon.src=`${t}/signin.svg`;return}this.element.setAttribute("title",`sign out of ${o}`),this.icon.src=`${t}/signout.svg`}}});var Y,mt=l(()=>{"use strict";h();ht();Y=class extends c{constructor(){super(),this.element.classList.add("toolbar"),this.button=new K,this.element.appendChild(this.button.element)}}});function Se(i){let e=new Image;return e.src=i,e}function C(i){return`${i}/warning.svg`}function X(i){return`${i}/error.svg`}function gt(i){return`${i}/check.svg`}function k(i){return`${i}/unlock.svg`}function ut(i){return`${i}/connectifi-logo-white.png`}function ft(i){return`${i}/channel.svg`}function g(i){return Ae.has(i)||Ae.set(i,Se(i)),Ae.get(i)}var Ae,y=l(()=>{"use strict";Ae=new Map});function vt(i,e=0){if(!i)return!1;let t=i.getBoundingClientRect();return t.y+t.height-e<0||t.y>window.innerHeight-e}var Z,wt=l(()=>{"use strict";h();y();Z=class extends c{constructor(t,n){super();this.channelSrc=t;this.onChannelPicked=n;this.element.classList.add("channels"),this.addEventListeners()}addEventListeners(){window.addEventListener("resize",this.handleResize.bind(this))}handleResize(){let n=this.element.children.item(0),o=this.element.children.length;if(!n)return;let r=n.getBoundingClientRect().height,s=getComputedStyle(n),a=parseFloat(s.marginTop)+parseFloat(s.marginBottom),p=r+a;for(let d=1;d<o+1;d++){let m=p*d+"px";if(this.element.style.width=m,!vt(this.element.firstChild,45)&&!vt(this.element.lastChild,45))return}}async pickChannel(t,n){n==null||n.stopPropagation(),this.onChannelPicked(t)}renderChannel(t){var p,d;let n=`channel-item-${t.id}`;if(this.element.querySelector(`#${n}`)||t.id==="global")return;let r=document.createElement("button"),s=((p=t.displayMetadata)==null?void 0:p.name)||t.id,a=((d=t.displayMetadata)==null?void 0:d.color)||"black";r.id=n,r.title=s+" Channel",r.style.backgroundColor=a,r.addEventListener("click",m=>{this.pickChannel(t.id,m)}),r.appendChild(Se(this.channelSrc)),this.element.appendChild(r)}renderChannels(t){t.forEach(n=>this.renderChannel(n)),this.handleResize()}}});var Q,Ct=l(()=>{"use strict";mt();wt();h();Q=class extends c{constructor(t,n,o){super();this.onChannelPicked=o;this.animationDelay=-1;this.isShowing=!1;this.canShow=!1;this.element.classList.add("picker",n),this.toolbar=new Y,this.element.appendChild(this.toolbar.element),this.channels=new Z(t,this.handleChannelPicked.bind(this)),this.element.appendChild(this.channels.element),this.stopRootClickPropagation()}handleChannelPicked(t){this.onChannelPicked(t),this.hide()}stopRootClickPropagation(){this.element.addEventListener("click",t=>{t.stopPropagation()})}hide(){this.canShow&&(this.isShowing=!1,this.element.classList.remove("show"),this.animationDelay=window.setTimeout(()=>{this.channels.element.classList.remove("show")},500))}show(){this.canShow&&(window.clearTimeout(this.animationDelay),this.isShowing=!0,this.channels.element.classList.add("show"),this.element.classList.add("show"))}toggle(){if(this.isShowing)return this.hide();this.show()}updateInteropStrategy(t){t&&this.element.classList.add(t)}}});var ee,yt=l(()=>{"use strict";h();ee=class extends G{constructor(e){super(),this.element.alt="connectifi",this.element.classList.add("logo"),this.element.classList.add("loaded"),this.element.classList.add("connected"),this.element.src=e}}});var te,bt=l(()=>{"use strict";h();yt();te=class extends c{constructor(t){super();this.indicator=document.createElement("div");this.mask=document.createElement("div");this.element.classList.add("fabHeader"),this.mask.classList.add("mask"),this.element.appendChild(this.mask),this.indicator.classList.add("indicator"),this.element.appendChild(this.indicator),this.logo=new ee(t),this.element.appendChild(this.logo.element)}connected(t){this.element.classList.add("connected"),this.element.title=`Connected to directory '${t}'.`}disconnected(){V(this.element),this.element.classList.remove("connected")}loading(){V(this.element),this.element.classList.add("busy")}loaded(){V(this.element),this.element.classList.remove("busy")}setBackgroundColor(t){this.element.style.backgroundColor=t}}});var ne,xt=l(()=>{"use strict";h();ne=class extends c{constructor(){super(),this.element.classList.add("dismissContainer");let e=document.createElement("div");e.classList.add("dismiss");let t=document.createElement("span");t.innerHTML="×";let n=document.createElement("div");n.appendChild(t),e.appendChild(n),this.element.appendChild(e)}}});var ie,It=l(()=>{"use strict";h();ie=class extends c{constructor(t){super();this.icon=document.createElement("img");this.element.classList.add("logo"),this.icon.src=t,this.element.appendChild(this.icon)}}});var f,oe=l(()=>{"use strict";h();f=class extends c{constructor(){super(),this.element.classList.add("title")}updateDirectoryName(e){this.element.textContent=e,this.element.title=`Connected to directory: '${e}'`}}});var re,Rt=l(()=>{"use strict";oe();re=class extends f{constructor(){super();this.containerElement=document.createElement("span");this.containerElement.innerHTML="×",this.element.appendChild(this.containerElement)}}});var se,Tt=l(()=>{"use strict";h();xt();It();Rt();se=class extends c{constructor(t){super();this.dismiss=new ne;this.title=new re;this.element.classList.add("header"),this.logo=new ie(t),this.element.appendChild(this.logo.element),this.element.appendChild(this.title.element),this.element.appendChild(this.dismiss.element)}}});var hn,ae,Et=l(()=>{"use strict";h();hn=(i,e)=>{if(e){let t=typeof e=="string"?e:e.src;return t.toLowerCase().startsWith("http")?t:`${i}/${t}`}return""},ae=class extends c{constructor(e,t,n,o){if(super(),this.element.classList.add("icon-container"),t)return;let r=`${e}/${n?"lock":"warning"}.svg`,s=document.createElement("div");s.setAttribute("style",`background-image: url('${r}');`),s.classList.add("icon","mask"),this.element.appendChild(s);let a=document.createElement("img");o&&o.length>0&&(a.src=hn(e,o[0])),this.element.appendChild(a)}}});var A,Lt=l(()=>{"use strict";h();A=class extends c{constructor(t,n,o){super();this.containerElement=document.createElement("div");let r=n&&n.toLocaleLowerCase();this.element.setAttribute("class",`agent ${r}`),o?this.element.setAttribute("title",`${n} (${o})`):this.element.title=n,this.element.setAttribute("style",`background-image: url('${t}/${r}.svg')`),this.element.appendChild(this.containerElement)}}});var ce,kt=l(()=>{"use strict";h();Lt();ce=class extends c{constructor(e,t,n,o,r,s){if(super(),this.element.classList.add("info"),this.element.setAttribute("title",`proximity: ${t}`),n!=="directory"){if(t>1){let a=new A(e,o,r);this.element.appendChild(a.element)}if(t>0){let a=new A(e,s);this.element.appendChild(a.element)}}}}});var le,At=l(()=>{"use strict";oe();le=class extends f{constructor(e){super(),this.updateAppTitle(e)}updateAppTitle(e){this.element.textContent=e,this.element.setAttribute("title",`${e}`)}}});var mn,de,St=l(()=>{"use strict";h();Et();kt();At();mn=i=>{let e=i.title||i.name,t=i.instanceTitle;return t?e&&!t.startsWith(e)?`${e} - ${t}`:t:e||"unknown"},de=class extends c{constructor(e,t,n){super(),this.element.classList.add("item"),this.iconContainer=new ae(e,n,t.isSecure,t.icons),this.element.appendChild(this.iconContainer.element);let o=mn(t);this.title=new le(o),this.element.appendChild(this.title.element),this.info=new ce(e,t.proximity,t.type,t.os,t.device,t.browser),this.element.appendChild(this.info.element)}}});var gn,pe,Dt=l(()=>{"use strict";h();gn=i=>i==="directory"?"Open New":"Send To",pe=class extends c{constructor(e,t){super(),this.element.classList.add("group"),e?this.element.textContent="Local Container":this.element.textContent=gn(t)}}});var he,Mt=l(()=>{"use strict";h();he=class extends c{constructor(t){super();this.titleElement=document.createElement("div");this.element.classList.add("intentRow"),this.titleElement.className="intentTitle",this.titleElement.textContent=t,this.element.appendChild(this.titleElement)}}});var un,fn,me,Pt=l(()=>{"use strict";St();Dt();Mt();h();un=(i,e)=>i.type!=="window"?0:i.proximity===e.proximity?e.lastUpdate-i.lastUpdate:i.proximity-e.proximity,fn=(i,e)=>i.type===e.type?un(i,e):i.type==="directory"?1:-1,me=class extends c{constructor(){super(),this.element.classList.add("list")}clear(){this.element.innerHTML=""}renderIntentRow({intent:{displayName:e,name:t}={displayName:"",name:""}}){let n=new he(e||t);this.element.appendChild(n.element)}renderAppRows(e,t,n,o=!1){let{apps:r}=t;r.sort(fn);let s="";r.forEach(a=>{if(a.type!==s){let d=new pe(o,a.type);this.element.appendChild(d.element),s=a.type}let p=new de(e,a,o);this.element.appendChild(p.element),p.element.addEventListener("click",d=>{d.stopPropagation(),n(a,t,o)})})}}});var ge,Ht=l(()=>{"use strict";h();Tt();Pt();ge=class extends c{constructor(t){super();this.list=new me;this.isOpen=!1;this.element.classList.add("resolver"),this.header=new se(t),this.element.appendChild(this.header.element),this.element.appendChild(this.list.element),this.stopClickPropagation()}stopClickPropagation(){this.element.addEventListener("click",t=>{t.stopPropagation()})}open(){this.element.classList.add("open"),this.isOpen=!0}close(){this.element.classList.remove("open"),this.isOpen=!1}}});var ue,Wt=l(()=>{"use strict";h();ue=class extends c{constructor(){super(),this.element.classList.add("resolverBackground")}open(){this.element.classList.add("open")}close(){this.element.classList.remove("open")}}});var fe,Ut=l(()=>{"use strict";h();fe=class extends c{constructor(){super(),this.element.classList.add("message")}clear(){this.element.innerHTML=""}setMessage(e){this.element.innerText=e}}});var ve,$t=l(()=>{"use strict";h();oe();Ut();ve=class extends c{constructor(){super();this.title=new f;this.message=new fe;this.animationDurationMs=250;this.element.classList.add("toast");let t=document.createElement("div");t.appendChild(this.title.element),t.appendChild(this.message.element),this.element.appendChild(t)}clearAction(){this.action&&(this.element.removeChild(this.action),this.action=void 0)}setAction(t){t&&(this.action=t,this.element.appendChild(t))}clearImage(){this.image&&(this.element.removeChild(this.image),this.image=void 0)}setImage(t){this.image=t,this.element.insertBefore(t,this.element.firstChild)}clear(){clearTimeout(this.durationTimer),this.element.classList.remove("success","show","hide","error"),this.message.clear(),this.clearAction(),this.clearImage()}async hide(){return this.hidePromise===void 0&&(this.hidePromise=new Promise(t=>{this.element.classList.add("hide"),this.animationTimer=window.setTimeout(()=>{this.element.classList.remove("hide","show"),this.hidePromise=void 0,t()},this.animationDurationMs)})),this.hidePromise}setDuration(t){this.durationTimer=window.setTimeout(()=>this.hide(),t)}async show({title:t,message:n,actionElement:o,duration:r=3e3,image:s}){this.element.classList.contains("show")&&await this.hide(),this.clear(),this.title.element.innerText=t,this.message.setMessage(n),this.setAction(o),this.setImage(s),this.element.classList.add("show"),r>0&&this.setDuration(r)}update(t){this.message.setMessage(t)}}});var we,qt=l(()=>{"use strict";Ct();bt();Ht();Wt();$t();h();we=class extends c{constructor(t,n,o,r){super();this.resolverBackground=new ue;this.element.classList.add("container");let s=document.createElement("div");s.classList.add("inner"),this.header=new te(t),s.appendChild(this.header.element),this.toast=new ve,s.appendChild(this.toast.element);let a=document.createElement("div");a.classList.add("fab",o),a.appendChild(s),this.picker=new Q(n,o,r),a.appendChild(this.picker.element),this.element.appendChild(a),this.resolver=new ge(t),this.element.appendChild(this.resolver.element),this.element.appendChild(this.resolverBackground.element)}}});var b,De=l(()=>{"use strict";h();b=class extends u{constructor(e){super(),this.element.title="sign in";let t=`${e}/signin.svg`,n=document.createElement("img");n.src=t,this.element.appendChild(n)}}});var Ce,Ot=l(()=>{"use strict";De();Ce=class{constructor(e,t="sameWindow"){this.interopHost=e;this.style=t;this.window=null}createButton(){let e=new b(this.interopHost),t=n=>{n.stopPropagation(),this.open()};return e.element.addEventListener("click",t),e}close(){var e;(e=this.window)==null||e.close()}open(){if(this.style==="newWindow"){this.window=window.open(`${this.interopHost}/api/logout?target=interop`,"_blank");return}let e=window.location.href;window.location.href=`${this.interopHost}/api/logout?target=interop&interopUrl=${encodeURIComponent(e)}`}}});var ye,Bt=l(()=>{"use strict";y();De();ye=class{constructor(e,t,n,o){this.interopHost=e;this.toast=t;this.directoryView=n;this.redirectStyle=o}async authenticate(e){let{name:t,authenticate:n}=e,o=new b(this.interopHost);return this.toast.show({title:"Sign In",message:`Please sign in to '${t}'.`,actionElement:o.element,duration:-1,image:g(k(this.interopHost))}),this.directoryView.update(e),new Promise(r=>o.element.addEventListener("click",async s=>{s.preventDefault(),await n(this.redirectStyle),r()}))}}});var x,Me=l(()=>{"use strict";h();x=class extends u{constructor(e){super(),this.element.title="Open";let t=`${e}/signin.svg`,n=document.createElement("img");n.src=t,this.element.appendChild(n)}}});var be,Ft=l(()=>{"use strict";Me();y();be=class{constructor(e,t,n="sameWindow"){this.interopUrl=e;this.toast=t;this.consentRedirectStyle=n}createConsentButton(){return new x(this.interopUrl)}async requestConsentInToast(e){let t=this.createConsentButton();return await this.toast.show({title:"Accept Cookie Policy",message:"Please accept Connectifi's cookie policy.",image:g(k(this.interopUrl)),actionElement:t.element,duration:-1}),new Promise(n=>{t.element.addEventListener("click",async o=>{o.preventDefault(),await e("newWindow"),n()})})}async requestStorageAccess(e){let{button:t,waitForStorageAccess:n,requestConsent:o}=e,r=new URL(this.interopUrl).host;if(await this.toast.show({title:"Grant Connectifi Access",message:`Please grant ${r} interop access.`,image:g(k(this.interopUrl)),actionElement:t,duration:-1}),await n())return this.toast.hide();if(this.consentRedirectStyle==="sameWindow"){await o("sameWindow");return}await this.requestConsentInToast(o)}}});var xe,Nt=l(()=>{"use strict";Me();y();xe=class{constructor(e,t){this.toast=e;this.interopHost=t}createButton(e){let t=new x(this.interopHost);return t.element.addEventListener("click",()=>{window.open(e)}),t.element}open(e){!e.url||window.open(e.url)||this.toast.show({title:"Open Application",message:"Press here if application did not open",image:g(C(this.interopHost)),actionElement:this.createButton(e.url),duration:5e3})}}});var zt={};We(zt,{ConnectifiFab:()=>Pe,wrapConfig:()=>wn});var vn,wn,Pe,jt=l(()=>{"use strict";R();at();lt();dt();pt();qt();Ot();Bt();Ft();y();Nt();vn=27,wn=(i,e)=>{e.handleFABClicked&&(i.handleClick=e.handleFABClicked);let t={handleAuthenticate:i.handleAuthenticate.bind(i),handleRequestStorageAccess:i.handleRequestStorageAccess.bind(i),handleIntentResolution:i.handleIntentResolution.bind(i),handleOpen:i.handleOpen.bind(i),...e};return t.onFDC3Ready=n=>{var o;i.onFDC3Ready(n),(o=e.onFDC3Ready)==null||o.call(e,n)},t.onSessionStarted=(n,o)=>{var r;i.onSessionStarted(n,o),(r=e.onSessionStarted)==null||r.call(e,n,o)},t.onSessionError=n=>{var o;i.onSessionError(n),(o=e.onSessionError)==null||o.call(e,n)},t.onSignedOut=()=>{var n;i.onSignedOut(),(n=e.onSignedOut)==null||n.call(e)},t.onChannelJoined=n=>{var o;i.onChannelJoined(n),(o=e.onChannelJoined)==null||o.call(e,n)},t.onChannelLeft=()=>{var n;i.onChannelLeft(),(n=e.onChannelLeft)==null||n.call(e)},t.onConnected=n=>{var o;i.onConnected(n),(o=e.onConnected)==null||o.call(e,n)},t.onDisconnected=n=>{var o;i.onDisconnected(n),(o=e.onDisconnected)==null||o.call(e,n)},t.onWorkingChanged=n=>{var o;i.onWorkingChanged(n),(o=e.onWorkingChanged)==null||o.call(e,n)},t.onSessionAuthRequired=n=>{var o;i.onSessionAuthRequired(n),(o=e.onSessionAuthRequired)==null||o.call(e,n)},t},Pe=class{constructor(e,t,n={}){this.interopHost=e;this.root=t;this.connected=!1;this.channel="global";this.channels=[];this.directory=null;this.onChannelJoined=e=>{this.channel=e,this.updateChannelColor()};this.onChannelLeft=()=>{this.channel="global",this.updateChannelColor()};this.onWorkingChanged=e=>{e?this.startLoading():this.stopLoading()};let o=n.position||"br";["tl","ml","bl","tr","mr","br"].includes(o)===!1&&(o="br"),this.logout=new Ce(e,n.loginStyle);let s=n.logoSrc||ut(e);this.container=new we(s,ft(e),o,this.handleChannelPicked.bind(this)),this.logoView=new j([this.container.header.logo.element,this.container.resolver.header.logo.icon]),this.directoryView=new _(this.container.picker,this.logoView),this.authenticator=new ye(e,this.container.toast,this.directoryView,n.loginStyle),this.storageAccess=new be(e,this.container.toast,n.loginStyle),this.opener=new xe(this.container.toast,e),this.createRoot()}bind(e){this.agent=e}preloadImages(){[X,C].forEach(e=>g(e(this.interopHost)))}handleChannelPicked(e){var t,n;e===this.channel?(t=this.fdc3)==null||t.leaveCurrentChannel():(n=this.fdc3)==null||n.joinUserChannel(e)}createRoot(){let e=this.root.attachShadow({mode:"open",slotAssignment:"named"}),t=document.createElement("style");t.innerHTML=ct,e.appendChild(t);let n=document.createElement("div");n.appendChild(this.container.element),e.appendChild(n),this.preloadImages(),this.container.header.element.addEventListener("click",r=>{r.stopPropagation(),this.handleClick?this.handleClick(r):this.container.picker.toggle()}),document.addEventListener("click",r=>{var s;r.stopPropagation(),this.container.picker.hide(),this.container.resolver.isOpen&&((s=this.closeResolverCallback)==null||s.call(this),this.hideResolver())}),document.addEventListener("keydown",r=>{var s;this.container.resolver.isOpen&&r.code==="Escape"&&((s=this.closeResolverCallback)==null||s.call(this),this.hideResolver())}),this.container.resolver.header.dismiss.element.addEventListener("click",()=>{var r;(r=this.closeResolverCallback)==null||r.call(this),this.hideResolver()});let o=this.container.picker;o.toolbar.button.element.addEventListener("click",r=>{var s;if(r.stopPropagation(),o.hide(),!this.hasOwner())return(s=this.agent)==null?void 0:s.authenticate();this.logout.open()}),this.startLoading()}onSignedOut(){this.owner="",this.logout.close()}onSessionStarted(e,t){this.directory=e,this.directoryView.update(e),t&&(this.owner=t,this.container.picker.toolbar.button.updateOwner(this.interopHost,this.directory.interopStrategy,this.owner))}onSessionError(e){this.container.toast.show({title:"Error",message:e,image:g(X(this.interopHost))})}onFDC3Ready(e){this.fdc3=e,e.getUserChannels().then(t=>{this.channels=t,this.container.picker.channels.renderChannels(t),this.container.picker.canShow=!0})}handleOpen(e){this.opener.open(e)}handleAuthenticate(e){return this.authenticator.authenticate(e)}handleRequestStorageAccess(e){return this.storageAccess.requestStorageAccess(e)}onSessionAuthRequired(e){this.directoryView.update(e),this.container.picker.toolbar.button.updateOwner(this.interopHost,e.interopStrategy,void 0)}onConnected(e){var n;let t=(n=this.directory)==null?void 0:n.name;e===!0?this.container.toast.show({title:"Connected",message:`Connected to directory '${t}'`,image:g(gt(this.interopHost))}):this.container.toast.hide(),this.container.header.connected(t),clearInterval(this.reconnectCountdownTimer),this.stopLoading()}createReconnectButton(e){let t=new J(e);return t.element.addEventListener("click",()=>{var n;(n=this.agent)==null||n.connect()}),t}onDisconnected(e){var t;if(this.container.header.disconnected(),clearInterval(this.reconnectCountdownTimer),e!==void 0&&e>0){let n=Math.floor(e/1e3),o=`Reconnecting in ${n}s`;n>vn?this.container.toast.show({title:"Reconnecting",message:o,actionElement:this.createReconnectButton(this.interopHost).element,duration:-1,image:g(C(this.interopHost))}):this.container.toast.show({title:"Reconnecting",message:o,duration:-1,image:g(C(this.interopHost))});let r=n;this.reconnectCountdownTimer=setInterval(()=>{r=r>0?r-1:0,this.container.toast.update(`Reconnecting in ${r}s`)},1e3)}else this.container.toast.show({title:"Disconnected",message:`Disconnected from directory ${(t=this.directory)==null?void 0:t.name}`,actionElement:this.createReconnectButton(this.interopHost).element,duration:-1,image:g(X(this.interopHost))}),this.stopLoading()}startLoading(){this.container.header.loading()}stopLoading(){this.container.header.loaded()}updateChannelColor(){var t;let e=this.channels.find(n=>n.id===this.channel);this.container.header.setBackgroundColor(((t=e==null?void 0:e.displayMetadata)==null?void 0:t.color)||"black")}hasOwner(){return!!this.owner}handleIntentResolution(e,t,n){this.resolveCallback=t,this.closeResolverCallback=n,this.container.resolver.open(),this.container.resolverBackground.open();let o=(p,d,m)=>{this.resolveCallback&&(this.hideResolver(),this.resolveCallback({selected:p,intent:d.intent.name,context:e.context,bridge:m}))},r=this.container.resolver.header.title.containerElement,s=this.getContextDisplayName(e.context);if(e.resolutionType==="intent-resolver"){let m=`${(Array.isArray(e.data)?e.data[0]:e.data).intent.name} for ${s}`;r.innerHTML=m,r.setAttribute("title",m)}else e.resolutionType==="context-resolver"&&(r.innerHTML=s);let a=this.container.resolver.list;if(a.clear(),e.resolutionType==="intent-resolver"){let p=Array.isArray(e.data)?e.data[0]:e.data;if(a.renderAppRows(this.interopHost,p,o),e.bridgeData){let d=Array.isArray(e.bridgeData)?e.bridgeData[0]:e.bridgeData;a.renderAppRows(this.interopHost,d,o,!0)}}else e.resolutionType==="context-resolver"&&((Array.isArray(e.data)?e.data:[e.data]).forEach(d=>{a.renderIntentRow(d),a.renderAppRows(this.interopHost,d,o)}),e.bridgeData&&e.bridgeData.forEach(m=>{a.renderIntentRow(m),a.renderAppRows(this.interopHost,m,o,!0)}))}hideResolver(){this.container.resolver.close(),this.container.resolverBackground.close()}getContextDisplayName(e){var n;let t=e.name||e.type||"";return e.type==="fdc3.instrument"&&(t=`${(n=e.id)==null?void 0:n.ticker} - ${e.name}`),t}}});var bn={};We(bn,{InteropStrategies:()=>ke,ResolutionType:()=>I,createAgent:()=>Cn});module.exports=Xt(bn);var v=class{constructor(e,t,n,o,r){this.ws=e;this.subManager=t;this.id=n;this.type=o;this.displayMetadata=r}async broadcast(e){return this.ws.request("broadcast",{context:e,channel:this.id})}async getCurrentContext(e){return(await this.ws.request("getCurrentContext",{channel:this.id,contextType:e})).context}async addContextListener(e,t){let n=typeof e=="function"?e:t,o=typeof e=="string"?e:"*";return await this.ws.request("addContextListener",{contextType:o,channel:this.id}),this.subManager.createContextListener(this.ws,o,this.id,n)}};var Re=async i=>{var t;let e=await((t=window.fdc3)==null?void 0:t.getUserChannels());return e==null?void 0:e.some(n=>n.id===i)},Ue=i=>({source:i.source,version:i.version,intent:i.intent,getResult:async()=>i.result}),M=class{constructor(e,t,n){this.ws=e;this.subManager=t;this.bridge=n}open(e,t){return this.ws.request("open",{target:e,context:t})}async broadcast(e){var n;let t=this.ws.request("broadcast",{context:e});this.bridge&&await((n=window.fdc3)==null?void 0:n.broadcast(e)),await t}async raiseIntent(e,t,n){let o=await this.ws.request("raiseIntent",{intent:e,target:n,context:t});return Ue(o)}async raiseIntentForContext(e,t){let n=await this.ws.request("raiseIntentForContext",{target:t,context:e});return Ue(n)}async addContextListener(e,t){let n=typeof e=="function"?e:t,o=typeof e=="string"?e:"*";return await this.ws.request("addContextListener",{contextType:o}),this.subManager.createContextListener(this.ws,o,void 0,n)}async addIntentListener(e,t){return await this.ws.request("addIntentListener",{intent:e}),this.subManager.createIntentListener(this.ws,e,t)}async findIntent(e,t){return this.ws.request("findIntent",{intent:e,context:t})}findIntentsByContext(e){return this.ws.request("findIntentsByContext",{context:e})}async getSystemChannels(){return this.getUserChannels()}async getUserChannels(){return(await this.ws.request("getUserChannels",{})).map(t=>new v(this.ws,this.subManager,t.id,"user",t.displayMetadata))}async getOrCreateChannel(e){let t=await this.ws.request("getOrCreateChannel",{channelId:e});return new v(this.ws,this.subManager,t.id,t.type,t.displayMetadata)}async joinChannel(e){let t=this.ws.request("joinChannel",{channel:e});this.bridge&&await Re(e)&&(window.fdc3.joinUserChannel?window.fdc3.joinUserChannel(e):window.fdc3.joinChannel&&window.fdc3.joinChannel(e)),await t}async joinUserChannel(e){let t=this.ws.request("joinChannel",{channel:e});this.bridge&&await Re(e)&&(window.fdc3.joinUserChannel?window.fdc3.joinUserChannel(e):window.fdc3.joinChannel&&window.fdc3.joinChannel(e)),await t}async leaveCurrentChannel(){let e=this.ws.request("leaveCurrentChannel",{});if(this.bridge){let t=await this.getCurrentChannel();t&&await Re(t.id)&&window.fdc3.leaveCurrentChannel()}await e}async getCurrentChannel(){let e=await this.ws.request("getCurrentChannel",{});return e?new v(this.ws,this.subManager,e.id,e.type,e.displayMetadata):null}getInfo(){return this.ws.request("getInfo",{})}findInstances(e){return this.ws.request("findInstances",e)}getAppMetadata(e){return this.ws.request("getAppMetadata",e)}createPrivateChannel(){return this.ws.request("createPrivateChannel",{})}};R();function $e(i){return i.status==="fulfilled"}function qe(i,e){return`${i!=null?i:"*"}${e?`|${e}`:""}`}var P=class{constructor(e){this.handler=e;this.id=crypto.randomUUID()}},H=class{constructor(e=new Map,t=new Map){this.contextListeners=e;this.intentListeners=t;this.callContextListeners=(e,t,n)=>{let o=[];if(e===n||n===void 0){let a=this.contextListeners.get("*");a&&(o=o.concat(...a));let p=this.contextListeners.get(t.type);p&&(o=o.concat(...p))}let r=this.contextListeners.get(`*|${n}`);r&&(o=o.concat(...r));let s=this.contextListeners.get(`${t.type}|${n}`);s&&(o=o.concat(...s));for(let a of o)a.handler.call(window,t)}}async callIntentListener(e,t){let n=this.intentListeners.get(e);if(!n)return;let r=(await Promise.allSettled(n.map(s=>Promise.resolve(s.handler.call(window,t||{type:"fdc3.nothing"}))))).filter($e).map(s=>s.value).filter(Boolean);if(r.length!==0)return r.length===1?r[0]:{type:"connectifi.intentResults",results:r}}dropContextListener(e,t){let n=this.contextListeners.get(e)||[];for(let o=0;o<n.length;o++)n[o].id===t&&n.splice(o,1);return!n.length}createContextListener(e,t,n,o){let r=new P(o),s=qe(t,n);if(this.contextListeners.has(s)){let a=this.contextListeners.get(s);a==null||a.push(r)}else this.contextListeners.set(s,[r]);return{unsubscribe:()=>{this.dropContextListener(s,r.id)&&e.action("dropContextListener",{type:s})}}}dropIntentListener(e,t){let n=this.intentListeners.get(e)||[];for(let o=0;o<n.length;o++)n[o].id===t&&n.splice(o,1);return!n.length}createIntentListener(e,t,n){let o=new P(n);if(this.intentListeners.has(t)){let r=this.intentListeners.get(t);r==null||r.push(o)}else this.intentListeners.set(t,[o]);return{unsubscribe:()=>{this.dropIntentListener(t,o.id)&&e.action("dropIntentListener",{intent:t})}}}};function Oe(i,e,t,n){var o;(o=i.contentWindow)==null||o.postMessage(JSON.stringify(n),e,[t])}function W(i){i.sandbox.add("allow-storage-access-by-user-activation","allow-scripts","allow-same-origin","allow-popups")}function U(i,e,t){return`${i}/api/iframe/${e}/${t}`}var $=new Error("timed out waiting for iframe message");function Be(i){return $===i}function T(i,e,t=15e3){let n=new Set(e);return new Promise((o,r)=>{let s=t>0?window.setTimeout(()=>{i.removeEventListener("message",a),r($)},t):void 0,a=p=>{try{let d=JSON.parse(p.data);if(!n.has(d.topic))return;o(d),clearTimeout(s),i.removeEventListener("message",a)}catch{}};i.addEventListener("message",a)})}function w(i,e){e&&i.postMessage(JSON.stringify(e))}async function Zt(i){let e=await fetch(i,{method:"GET",headers:{Accept:"application/json"}});if(e.status!==200){let t=await e.json();throw new Error(`failed to embed iframe: ${t==null?void 0:t.reason}`)}}async function Ne(i,e,t){let n=U(e,t,"agent-iframe.bundle.js");await Zt(n);let o=new MessageChannel;o.port1.start();let r=T(o.port1,["handshake"]),s=()=>{Oe(i,e,o.port2,{topic:"handshake"})};return i.addEventListener("load",s),i.src=n,await r,o.port1}function ze(i,e){return w(i,{topic:"tunnel",...e}),T(i,["identity-error","session-refresh","session-error","start-session"])}async function je(i,e){w(i,{topic:"connect",...e}),await T(i,["open"])}function Te(i){w(i,{topic:"close"})}function Ge(i,e){w(i,{topic:"send",message:JSON.stringify(e)})}async function Ve(i){return w(i,{topic:"has-storage-access"}),(await T(i,["has-storage-access"],-1)).hasStorageAccess}var Ee=class{constructor(e){this.title=document.title;this.id=e}},q=class{constructor(e,t,n,o){this.port=e;this.logger=t;this.appUrl=n;this.appTitle=o;this.nextRefresh=0}createInstance(e){this.instance=new Ee(e)}clearRefreshSession(){clearInterval(this.refreshSessionTimer)}scheduleRefreshSession(e){e&&(this.logger.debug(`schedule session refresh in ${e}ms`,{refreshInMs:e}),this.nextRefresh=new Date().getTime()+e,this.refreshSessionTimer=window.setInterval(()=>{new Date().getTime()>this.nextRefresh&&(this.logger.debug("calling tunnel to refresh session"),this.clearRefreshSession(),this.touch())},5e3))}handleTunnelResponse(e){let t=e.topic==="start-session",n=e.topic==="session-refresh";t&&this.createInstance(e.instanceId),(t||n)&&this.scheduleRefreshSession(e.refreshInMs)}async resetInstance(){this.instance&&(this.instance.id="")}async touch(){var t;let e=await ze(this.port,{instanceId:(t=this.instance)==null?void 0:t.id,instanceTitle:this.appTitle,instanceUrl:this.appUrl});return this.handleTunnelResponse(e),e}};function Je(i){return i.topic==="error"}R();var O=class{constructor(){this.eventListeners=new Map}emit(e,t){let n=this.eventListeners.get(e);n==null||n.forEach(o=>o(t))}addEventListener(e,t){let n=this.eventListeners.get(e);n||(n=new Set,this.eventListeners.set(e,n)),n.add(t)}removeEventListener(e,t){var n;(n=this.eventListeners.get(e))==null||n.delete(t)}};var B=class extends O{constructor(t,n,o=6e4,r=77){super();this.port=t;this.logger=n;this.maxReconnectInterval=o;this.maxReconnectAttempts=r;this.hasAddedListeners=!1;this.connected=!1;this.neverBeenConnected=!0;this.connectAttempts=1;this.autoReconnect=!0;this.pendingEventIds=new Set}clearReconnect(){this.connectAttempts=1,clearTimeout(this.reconnectTimer)}calcReconnectInterval(){let t=(Math.pow(2,this.connectAttempts)-1)*1e3;t>this.maxReconnectInterval&&(t=this.maxReconnectInterval);let n=Math.random()*t*.1*(Math.random()>=.5?1:-1);return t+n}scheduleReconnect(t,n,o){let r=this.calcReconnectInterval();return this.logger.debug(`scheduleReconnect in ${r}ms`),this.reconnectTimer=window.setTimeout(()=>{if(this.connectAttempts++,this.connectAttempts>this.maxReconnectAttempts){this.clearReconnect(),this.logger.error("connection permanent failure, manual reconnection required"),this.handleDisconnected();return}this.connect(t,n,o)},r),r}handleOpen(){this.logger.debug("connected to connectifi service"),this.clearReconnect(),this.connected=!0,this.emit("connect",this.neverBeenConnected),this.neverBeenConnected=!1}handleError(){this.logger.error("connectifi service error")}handleMessage(t){let n=JSON.parse(t.data);switch(this.logger.debug("message received from connectifi service",n),n.topic){case"message":return this.emit("message",JSON.parse(n.data));case"close":return this.handleClose(n);case"error":return this.handleError();case"open":return this.handleOpen()}}handleDisconnected(t){this.connected=!1,this.emit("disconnect",t)}handleClose({code:t,namespace:n,directory:o,instanceId:r}){if(this.logger.debug(`socket closed: ${t}, reconnect? ${this.autoReconnect}`),this.autoReconnect){let s=this.scheduleReconnect(n,o,r);this.handleDisconnected(s)}else this.handleDisconnected()}handleWindowBeforeUnload(){this.autoReconnect=!1,Te(this.port)}addPendingEventId(t){this.pendingEventIds.add(t),this.emit("working",!0)}removePendingEventId(t){this.pendingEventIds.delete(t),this.pendingEventIds.size||this.emit("working",!1)}addListeners(){this.hasAddedListeners||(this.hasAddedListeners=!0,this.port.addEventListener("message",this.handleMessage.bind(this)),window.addEventListener("beforeUnload",this.handleWindowBeforeUnload.bind(this)))}async connect(t,n,o){return this.addListeners(),this.autoReconnect=!0,this.logger.debug(`connecting to service, namespace: ${t}, directory: ${n}, instance: ${o}`),je(this.port,{namespace:t,directory:n,instanceId:o})}disconnect(){this.autoReconnect=!1,this.clearReconnect(),Te(this.port)}send(t){if(this.logger.debug("sending message to connectifi service",t),this.connected)Ge(this.port,t);else throw new Error("NoConnectionAvailable")}async request(t,n){let o=`${t}_${crypto.randomUUID()}`,r={topic:t,data:n,eventId:o};return this.send(r),new Promise((s,a)=>{let p=d=>{if(o===d.eventId){if(this.removePendingEventId(o),this.removeEventListener("message",p),Je(d))return a(d.data.error);s(d.data)}};this.addPendingEventId(o),this.addEventListener("message",p)})}action(t,n){let o={topic:t,data:n};this.send(o)}isConnected(){return this.connected}addEventListener(t,n){super.addEventListener(t,n)}};var _e=(i,e)=>{let t=(...n)=>{console.log(...n),e&&e(...n)};return{info(...n){i!=="silent"&&t(...n)},debug(...n){i==="debug"&&t(...n)},error(...n){t(...n)}}};var Ke="subDirectory",Ye="directory";var F=new Map;function Qt(i){if(i.data)try{let e=typeof i.data=="string"?JSON.parse(i.data):i.data;(F.get(e.topic)||new Set).forEach(n=>n())}catch{}}var Xe=!1;function en(){Xe||(Xe=!0,window.addEventListener("message",Qt))}function tn(i,e){en();let t=F.get(i);t||(t=new Set,F.set(i,t)),t.add(e)}function nn(i,e){var t;(t=F.get(i))==null||t.delete(e)}function E(...i){return new Promise(e=>{let t=[];i.forEach(n=>{let o=()=>{t.forEach(r=>r()),e(n)};t.push(()=>nn(n,o)),tn(n,o)})})}function Ze(i,e,t,n){let o=`${i}/consent?${Ke}=${t}&${Ye}=${e}`;return n&&(o+=`&interopUrl=${n}`),o}async function on(i,e,t){let n=window.open(Ze(i,e,t));if(!n)return!1;let o=await E("login","consent-denied");return n.close(),o==="login"}async function rn(i,e,t){return window.location.href=Ze(i,e,t,window.location.href),!1}async function Qe(i,e,t,n="sameWindow"){return n==="newWindow"?on(i,e,t):rn(i,e,t)}async function et(){return await E("storage-access-granted","storage-access-denied")==="storage-access-granted"}function tt(i,e){let t=document.createElement("iframe");return W(t),t.src=U(i,e,"request-storage-access-iframe.bundle.js"),t.style.display="flex",t.style.border="none",t.width="50px",t.height="35px",t}function nt(i){let[e,t]=i.split("@"),[n,o]=t.split(".");return{appName:e,namespace:n,directory:o}}function it(i,e,t){return`${i}@${e}.${t}`}function N(i,e="interop",t){let n=`${i}/api/oauth?target=${e}`;return t&&(n+=`&interopUrl=${encodeURIComponent(t)}`),n}async function sn(i){let e=window.location.href;window.location.href=N(i,"interop",e)}async function an(i){let e=window.open(N(i),"_blank");await E("login"),e==null||e.close()}function Le(i,e="sameWindow"){return e==="newWindow"?an(i):sn(i)}var cn="global",ln="_cfi_",ot="invalid app identity",z=class{constructor(e,t,n,o,r,s,a){this.interopHost=e;this.appName=t;this.namespace=n;this.directoryName=o;this.port=r;this.version="3.0.50";this.currentChannel=cn;this.subManager=new H;this.hasNeverBeenConnected=!0;this.eventHandlerMap={"context-resolver":e=>this.handleRaiseIntentForContextResolutionEvent(e),"intent-resolver":e=>this.handleRaiseIntentResolutionEvent(e),intentEvent:e=>this.handleIntentEvent(e),contextEvent:e=>this.handleContextEvent(e),openEvent:e=>this.handleOpenEvent(e),errorEvent:e=>this.logger.error("Received Error from server: ",e.error)};this.responseSpyHandlers={joinChannel:e=>this.handleJoinChannelResponse(e),leaveCurrentChannel:()=>this.handleLeaveChannelResponse()};this.config={...s},this.configInfo=a,this.logger=_e((s==null?void 0:s.logLevel)||"info",s==null?void 0:s.logger),this.ws=new B(r,this.logger),this.tunnel=new q(r,this.logger,document.location.href,document.title),this.fdc3=new M(this.ws,this.subManager,this.config.bridgeGlobal||!1)}handleWebsocketConnect(){var e,t,n,o;this.hasNeverBeenConnected&&(this.ws.action("updateInstance",{pendingId:this.pendingId,version:this.version,config:this.configInfo}),window.name="",(t=(e=this.config).onFDC3Ready)==null||t.call(e,this.fdc3)),(o=(n=this.config).onConnected)==null||o.call(n,this.hasNeverBeenConnected),this.hasNeverBeenConnected=!1}setWorkingState(e){var t;(t=this.config.onWorkingChanged)==null||t.call(this,e)}onAppIdentityError(){var e,t;this.setWorkingState(!1),(t=(e=this.config).onSessionError)==null||t.call(e,ot)}handleTunnelTimeout(){var e,t;this.setWorkingState(!1),(t=(e=this.config).onSessionError)==null||t.call(e,$.message)}mustTunnelInstanceId(){var t;let e=(t=this.tunnel.instance)==null?void 0:t.id;if(!e)throw new Error("Tunnel instance ID is undefined.");return e}async ensureStorageAccess(){var t,n;if(await Ve(this.port))return;let e=tt(this.interopHost,it(this.appName,this.namespace,this.directoryName));await((n=(t=this.config).handleRequestStorageAccess)==null?void 0:n.call(t,{button:e,waitForStorageAccess:et,requestConsent:Qe.bind(void 0,this.interopHost,this.namespace,this.directoryName)})),await this.ensureStorageAccess()}async connect(){return this.ws.connect(this.namespace,this.directoryName,this.mustTunnelInstanceId())}async handleWindowOnline(){this.logger.debug("browser online, connecting"),await this.connect()}handleWindowOffline(){this.logger.debug("browser offline, canceling reconnects, waiting for online event"),this.ws.disconnect()}handleLogoutComplete(){var e,t;return this.setWorkingState(!1),(t=(e=this.config).onSignedOut)==null||t.call(e),this.touchTunnelAndHandleResponse(!0)}async handleStartSession(e,t,n,o){var s,a;let r={name:e,interopStrategy:o};n&&(r.icon=`${this.interopHost}/${n}`),(a=(s=this.config).onSessionStarted)==null||a.call(s,r,t),await this.connect(),this.setWorkingState(!1)}async handleLogin(e){let{data:t}=e;if(typeof t=="string")try{let{topic:n}=JSON.parse(t);n==="logout"&&this.handleLogoutComplete()}catch{}}async handleSessionError(e){var a,p,d,m;let{directory:t,icon:n,interopStrategy:o}=e;this.logger.debug("session requires authentication",e);let r={name:t,interopStrategy:o};n&&(r.icon=`${this.interopHost}/${n}`),this.setWorkingState(!1),(p=(a=this.config).onSessionAuthRequired)==null||p.call(a,r);let s=this.config.handleAuthenticate;s&&(this.logger.debug("requesting and waiting for authentication ",e),await s({...r,authenticate:Le.bind(void 0,this.interopHost),getAuthenticationUrl:S=>N(this.interopHost,S)}),this.setWorkingState(!0),(m=(d=this.config).onSignedIn)==null||m.call(d),this.logger.debug("reloading tunnel due to authentication success",e),await this.touchTunnelAndHandleResponse())}handleIdentityError(){throw this.setWorkingState(!1),this.onAppIdentityError(),new Error(ot)}async handleTunnelResponse(e){let t=e.topic==="start-session";this.pendingId=window.name.startsWith(ln)?window.name.substring(5):t?e.pendingId:void 0;let n=e.topic==="session-error";if((t||n)&&(this.directoryName!==e.directory||this.namespace!=e.namespace)){let r=`received response from tunnel with mismatching directory: expected ${this.directoryName}, got ${e.directory}`;throw this.logger.error(r,e),new Error(r)}if(t){let{directory:r,owner:s,interopStrategy:a,icon:p}=e;await this.handleStartSession(r,s,p,a)}else e.topic==="identity-error"?this.handleIdentityError():n&&await this.handleSessionError(e)}async touchTunnelAndHandleResponse(e=!1){await this.ensureStorageAccess(),e&&this.tunnel.resetInstance();let t=await this.tunnel.touch().catch(n=>{throw Be(n)?this.handleTunnelTimeout():this.logger.error("failed to touch tunnel",n),n});return this.handleTunnelResponse(t)}async start(){return window.addEventListener("message",this.handleLogin.bind(this)),window.addEventListener("online",this.handleWindowOnline.bind(this)),window.addEventListener("offline",this.handleWindowOffline.bind(this)),this.ws.addEventListener("working",this.handleWebsocketWorking.bind(this)),this.ws.addEventListener("connect",this.handleWebsocketConnect.bind(this)),this.ws.addEventListener("disconnect",this.handleWebsocketDisconnect.bind(this)),this.ws.addEventListener("message",this.handleWebsocketMessage.bind(this)),await this.touchTunnelAndHandleResponse(),this.fdc3}handleContextEvent(e){this.createPendingTitleCheck(),this.subManager.callContextListeners(this.currentChannel,e.context,e.channel),window.fdc3&&this.shouldBridgeGlobal()&&window.fdc3.broadcast(e.context)}async handleIntentEvent(e){this.createPendingTitleCheck();let t=await this.subManager.callIntentListener(e.intent||"",e.context);this.ws.action("completeIntent",{intent:e.intent,resultPendingId:e.resultPendingId,result:t})}handleOpenEvent(e){if(this.config.handleOpen)return this.config.handleOpen.call(this,{name:e.name,appId:e.pendingId,url:e.url});if(e.url)return window.open(e.url)}handleJoinChannelResponse(e){var t,n;e.channel&&(this.currentChannel=e.channel,(n=(t=this.config).onChannelJoined)==nul