@connectifi/agent-web
Version:
A simple web implementation of a connectifi agent
2 lines • 22.1 kB
JavaScript
import{a as W,b as H,c as h,d as l,e as U,f as q}from"./chunk-XKZHR3EO.js";import{a as k}from"./chunk-KW4W5UDY.js";var p=class{constructor(e,t,n,i,r){this.ws=e;this.subManager=t;this.id=n;this.type=i;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,i=typeof e=="string"?e:"*";return await this.ws.request("addContextListener",{contextType:i,channel:this.id}),this.subManager.createContextListener(this.ws,i,this.id,n)}};var L=async s=>{var t;let e=await((t=window.fdc3)==null?void 0:t.getUserChannels());return e==null?void 0:e.some(n=>n.id===s)},$=s=>({source:s.source,version:s.version,intent:s.intent,getResult:async()=>s.result}),w=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 i=await this.ws.request("raiseIntent",{intent:e,target:n,context:t});return $(i)}async raiseIntentForContext(e,t){let n=await this.ws.request("raiseIntentForContext",{target:t,context:e});return $(n)}async addContextListener(e,t){let n=typeof e=="function"?e:t,i=typeof e=="string"?e:"*";return await this.ws.request("addContextListener",{contextType:i}),this.subManager.createContextListener(this.ws,i,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 p(this.ws,this.subManager,t.id,"user",t.displayMetadata))}async getOrCreateChannel(e){let t=await this.ws.request("getOrCreateChannel",{channelId:e});return new p(this.ws,this.subManager,t.id,t.type,t.displayMetadata)}async joinChannel(e){let t=this.ws.request("joinChannel",{channel:e});this.bridge&&await L(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 L(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 L(t.id)&&window.fdc3.leaveCurrentChannel()}await e}async getCurrentChannel(){let e=await this.ws.request("getCurrentChannel",{});return e?new p(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",{})}};function N(s){return s.status==="fulfilled"}function B(s,e){return`${s!=null?s:"*"}${e?`|${e}`:""}`}var v=class{constructor(e){this.handler=e;this.id=crypto.randomUUID()}},y=class{constructor(e=new Map,t=new Map){this.contextListeners=e;this.intentListeners=t;this.callContextListeners=(e,t,n)=>{let i=[];if(e===n||n===void 0){let a=this.contextListeners.get("*");a&&(i=i.concat(...a));let c=this.contextListeners.get(t.type);c&&(i=i.concat(...c))}let r=this.contextListeners.get(`*|${n}`);r&&(i=i.concat(...r));let o=this.contextListeners.get(`${t.type}|${n}`);o&&(i=i.concat(...o));for(let a of i)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(o=>Promise.resolve(o.handler.call(window,t||{type:"fdc3.nothing"}))))).filter(N).map(o=>o.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 i=0;i<n.length;i++)n[i].id===t&&n.splice(i,1);return!n.length}createContextListener(e,t,n,i){let r=new v(i),o=B(t,n);if(this.contextListeners.has(o)){let a=this.contextListeners.get(o);a==null||a.push(r)}else this.contextListeners.set(o,[r]);return{unsubscribe:()=>{this.dropContextListener(o,r.id)&&e.action("dropContextListener",{type:o})}}}dropIntentListener(e,t){let n=this.intentListeners.get(e)||[];for(let i=0;i<n.length;i++)n[i].id===t&&n.splice(i,1);return!n.length}createIntentListener(e,t,n){let i=new v(n);if(this.intentListeners.has(t)){let r=this.intentListeners.get(t);r==null||r.push(i)}else this.intentListeners.set(t,[i]);return{unsubscribe:()=>{this.dropIntentListener(t,i.id)&&e.action("dropIntentListener",{intent:t})}}}};function O(s,e,t,n){var i;(i=s.contentWindow)==null||i.postMessage(JSON.stringify(n),e,[t])}function C(s){s.sandbox.add("allow-storage-access-by-user-activation","allow-scripts","allow-same-origin","allow-popups")}function I(s,e,t){return`${s}/api/iframe/${e}/${t}`}async function de(s){let e=await fetch(s,{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 j(s,e,t){let n=I(e,t,"agent-iframe.bundle.js");await de(n);let i=new MessageChannel;i.port1.start();let r=h(i.port1,["handshake"]),o=()=>{O(s,e,i.port2,{topic:"handshake"})};return s.addEventListener("load",o),s.src=n,await r,i.port1}function G(s,e){return l(s,{topic:"tunnel",...e}),h(s,["identity-error","session-refresh","session-error","start-session"])}async function _(s,e){l(s,{topic:"connect",...e}),await h(s,["open"])}function A(s){l(s,{topic:"close"})}function z(s,e){l(s,{topic:"send",message:JSON.stringify(e)})}async function J(s){return l(s,{topic:"has-storage-access"}),(await h(s,["has-storage-access"],-1)).hasStorageAccess}var P=class{constructor(e){this.title=document.title;this.id=e}},x=class{constructor(e,t,n,i){this.port=e;this.logger=t;this.appUrl=n;this.appTitle=i;this.nextRefresh=0}createInstance(e){this.instance=new P(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 G(this.port,{instanceId:(t=this.instance)==null?void 0:t.id,instanceTitle:this.appTitle,instanceUrl:this.appUrl});return this.handleTunnelResponse(e),e}};function K(s){return s.topic==="error"}var b=class{constructor(){this.eventListeners=new Map}emit(e,t){let n=this.eventListeners.get(e);n==null||n.forEach(i=>i(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 R=class extends b{constructor(t,n,i=6e4,r=77){super();this.port=t;this.logger=n;this.maxReconnectInterval=i;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,i){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,i)},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:i,instanceId:r}){if(this.logger.debug(`socket closed: ${t}, reconnect? ${this.autoReconnect}`),this.autoReconnect){let o=this.scheduleReconnect(n,i,r);this.handleDisconnected(o)}else this.handleDisconnected()}handleWindowBeforeUnload(){this.autoReconnect=!1,A(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,i){return this.addListeners(),this.autoReconnect=!0,this.logger.debug(`connecting to service, namespace: ${t}, directory: ${n}, instance: ${i}`),_(this.port,{namespace:t,directory:n,instanceId:i})}disconnect(){this.autoReconnect=!1,this.clearReconnect(),A(this.port)}send(t){if(this.logger.debug("sending message to connectifi service",t),this.connected)z(this.port,t);else throw new Error("NoConnectionAvailable")}async request(t,n){let i=`${t}_${crypto.randomUUID()}`,r={topic:t,data:n,eventId:i};return this.send(r),new Promise((o,a)=>{let c=d=>{if(i===d.eventId){if(this.removePendingEventId(i),this.removeEventListener("message",c),K(d))return a(d.data.error);o(d.data)}};this.addPendingEventId(i),this.addEventListener("message",c)})}action(t,n){let i={topic:t,data:n};this.send(i)}isConnected(){return this.connected}addEventListener(t,n){super.addEventListener(t,n)}};var V=(s,e)=>{let t=(...n)=>{console.log(...n),e&&e(...n)};return{info(...n){s!=="silent"&&t(...n)},debug(...n){s==="debug"&&t(...n)},error(...n){t(...n)}}};var T=new Map;function le(s){if(s.data)try{let e=typeof s.data=="string"?JSON.parse(s.data):s.data;(T.get(e.topic)||new Set).forEach(n=>n())}catch{}}var X=!1;function pe(){X||(X=!0,window.addEventListener("message",le))}function he(s,e){pe();let t=T.get(s);t||(t=new Set,T.set(s,t)),t.add(e)}function ge(s,e){var t;(t=T.get(s))==null||t.delete(e)}function g(...s){return new Promise(e=>{let t=[];s.forEach(n=>{let i=()=>{t.forEach(r=>r()),e(n)};t.push(()=>ge(n,i)),he(n,i)})})}function Y(s,e,t,n){let i=`${s}/consent?${U}=${t}&${q}=${e}`;return n&&(i+=`&interopUrl=${n}`),i}async function ue(s,e,t){let n=window.open(Y(s,e,t));if(!n)return!1;let i=await g("login","consent-denied");return n.close(),i==="login"}async function fe(s,e,t){return window.location.href=Y(s,e,t,window.location.href),!1}async function Q(s,e,t,n="sameWindow"){return n==="newWindow"?ue(s,e,t):fe(s,e,t)}async function Z(){return await g("storage-access-granted","storage-access-denied")==="storage-access-granted"}function ee(s,e){let t=document.createElement("iframe");return C(t),t.src=I(s,e,"request-storage-access-iframe.bundle.js"),t.style.display="flex",t.style.border="none",t.width="50px",t.height="35px",t}function te(s){let[e,t]=s.split("@"),[n,i]=t.split(".");return{appName:e,namespace:n,directory:i}}function ne(s,e,t){return`${s}@${e}.${t}`}function E(s,e="interop",t){let n=`${s}/api/oauth?target=${e}`;return t&&(n+=`&interopUrl=${encodeURIComponent(t)}`),n}async function me(s){let e=window.location.href;window.location.href=E(s,"interop",e)}async function we(s){let e=window.open(E(s),"_blank");await g("login"),e==null||e.close()}function M(s,e="sameWindow"){return e==="newWindow"?we(s):me(s)}var ve="global",ye="_cfi_",se="invalid app identity",S=class{constructor(e,t,n,i,r,o,a){this.interopHost=e;this.appName=t;this.namespace=n;this.directoryName=i;this.port=r;this.version="3.0.50";this.currentChannel=ve;this.subManager=new y;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={...o},this.configInfo=a,this.logger=V((o==null?void 0:o.logLevel)||"info",o==null?void 0:o.logger),this.ws=new R(r,this.logger),this.tunnel=new x(r,this.logger,document.location.href,document.title),this.fdc3=new w(this.ws,this.subManager,this.config.bridgeGlobal||!1)}handleWebsocketConnect(){var e,t,n,i;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)),(i=(n=this.config).onConnected)==null||i.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,se)}handleTunnelTimeout(){var e,t;this.setWorkingState(!1),(t=(e=this.config).onSessionError)==null||t.call(e,W.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 J(this.port))return;let e=ee(this.interopHost,ne(this.appName,this.namespace,this.directoryName));await((n=(t=this.config).handleRequestStorageAccess)==null?void 0:n.call(t,{button:e,waitForStorageAccess:Z,requestConsent:Q.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,i){var o,a;let r={name:e,interopStrategy:i};n&&(r.icon=`${this.interopHost}/${n}`),(a=(o=this.config).onSessionStarted)==null||a.call(o,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,c,d,u;let{directory:t,icon:n,interopStrategy:i}=e;this.logger.debug("session requires authentication",e);let r={name:t,interopStrategy:i};n&&(r.icon=`${this.interopHost}/${n}`),this.setWorkingState(!1),(c=(a=this.config).onSessionAuthRequired)==null||c.call(a,r);let o=this.config.handleAuthenticate;o&&(this.logger.debug("requesting and waiting for authentication ",e),await o({...r,authenticate:M.bind(void 0,this.interopHost),getAuthenticationUrl:f=>E(this.interopHost,f)}),this.setWorkingState(!0),(u=(d=this.config).onSignedIn)==null||u.call(d),this.logger.debug("reloading tunnel due to authentication success",e),await this.touchTunnelAndHandleResponse())}handleIdentityError(){throw this.setWorkingState(!1),this.onAppIdentityError(),new Error(se)}async handleTunnelResponse(e){let t=e.topic==="start-session";this.pendingId=window.name.startsWith(ye)?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:o,interopStrategy:a,icon:c}=e;await this.handleStartSession(r,o,c,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 H(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)==null||n.call(t,e.channel))}handleLeaveChannelResponse(){var e,t;this.currentChannel="global",(t=(e=this.config).onChannelLeft)==null||t.call(e)}sendIntentResolutionMessage(e){this.setWorkingState(!1),this.config.handleIntentResolution?this.config.handleIntentResolution(e,this.resolveResolver.bind(this),this.closeResolver.bind(this)):this.logger.error("no resolver handler configured")}async handleRaiseIntentResolutionEvent(e){let{context:t,intent:n}=e;this.resolverPendingEventId=e.pendingEventId;let i={resolutionType:"intent-resolver",context:t,data:e};if(n&&window.fdc3&&this.shouldBridgeGlobal()){let r=await window.fdc3.findIntent(n.name,i.context);i.bridgeData={intent:n,apps:r.apps}}this.sendIntentResolutionMessage(i)}async handleRaiseIntentForContextResolutionEvent({pendingEventId:e,context:t,data:n}){this.resolverPendingEventId=e;let i={resolutionType:"context-resolver",context:t,data:n};if(window.fdc3&&this.shouldBridgeGlobal()){let r=await window.fdc3.findIntentsByContext(i.context);i.bridgeData=r}this.sendIntentResolutionMessage(i)}handleWebsocketEvent({topic:e,data:t}){let n=this.eventHandlerMap[e];n(t)}handleWebsocketResponse({topic:e,data:t}){let n=this.responseSpyHandlers[e];n&&n(t)}handleWebsocketMessage(e){return e.eventId?this.handleWebsocketResponse(e):this.handleWebsocketEvent(e)}handleWebsocketWorking(e){this.setWorkingState(e)}handleWebsocketDisconnect(e){var t,n;(n=(t=this.config).onDisconnected)==null||n.call(t,e)}authenticate(e){return M(this.interopHost,e)}closeResolver(){this.ws.action("completeIntent",{resultPendingId:this.resolverPendingEventId})}createPendingTitleCheck(){let e=this.tunnel.instance;e&&setTimeout(()=>{document.title!==e.title&&(this.logger.info(`updating instance title - old: ${e.title}, new: ${document.title}`),e.title=document.title,this.ws.action("updateInstance",{title:document.title,url:document.location.href}))},500)}resolveResolver({context:e,intent:t,selected:n,bridge:i,metadata:r}){if(i&&window.fdc3){this.logger.debug("opening with fdc3 global bridge",n),window.fdc3.raiseIntent(t,e,{appId:n.appId});return}this.ws.action("resolveIntent",{selected:{name:n.name,id:n.id,type:n.type},intent:t,context:e,pendingEventId:this.resolverPendingEventId,metadata:r})}shouldBridgeGlobal(){return this.config.bridgeGlobal||!1}};function ie(s){s.style.display="none"}async function Ce(){document.body||await new Promise(s=>window.addEventListener("DOMContentLoaded",()=>s()))}async function re(s){await Ce(),document.body.appendChild(s)}var oe=(i=>(i.OPEN="open",i.OPENAUTH="openauth",i.APP="app",i.STRICT="strict",i))(oe||{});var Bt=async(s,e,t)=>{if(!e||e.length===0||e.indexOf("@")<1)throw new Error("missing or malformed appId");if(!s||s.length===0)throw new Error("invalid interop host");let n=new URL(s);s=`${n.protocol}//${n.host}`;let i=Ie(t),r=document.createElement("div");await re(r);let o=document.createElement("iframe");C(o),ie(o),r.appendChild(o);let a=await j(o,s,e),{directory:c,namespace:d,appName:u}=te(e),f=t,m;if(!(t!=null&&t.headless)){let{wrapConfig:ae,ConnectifiFab:ce}=await import("./fab-XF4DWIIX.js");m=new ce(s,r,t==null?void 0:t.props),f=ae(m,t||{})}let D=new S(s,u,d,c,a,f,i);return m&&m.bind(D),D.start()},Ie=s=>{if(!s)return;let{logLevel:e,props:t}=s,n=Object.entries(s).reduce((i,[r,o])=>((r.startsWith("on")||r.startsWith("handle"))&&o!==void 0&&(i[r]=!0),i),{});return{bridgeGlobal:s.bridgeGlobal===!0,headless:s.headless===!0,logLevel:e,props:t,activeHandlers:n}};export{oe as InteropStrategies,k as ResolutionType,Bt as createAgent};
//# sourceMappingURL=main.bundle.js.map