openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
1 lines • 4.68 kB
JavaScript
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Kt as t,Mt as n,Ui as r,Wi as i,Wt as a,jt as o}from"./ui-CmSP4d14.js";var s,c,l,u;function d(){return(d=e((()=>{t(),r(),n(),s=1e4,c=a,l=class extends Error{},u=class{constructor(e){this.options=e,this.active=!0,this.proxyReady=!1,this.readyTimer=null,this.retryTimer=null,this.slowTimer=null,this.retryDelayMs=1e3,this.documentLoaded=!1,this.renderId=null,this.pendingDocument=null,this.activeLoad=null,queueMicrotask(()=>this.start())}get frame(){return this.options.frame}get ready(){return this.proxyReady}get loaded(){return this.documentLoaded}update(e){let t=this.options.frame!==e.frame||this.options.sandboxUrl!==e.sandboxUrl,n=this.options.documentKey!==e.documentKey;this.options=e,(t||n)&&this.reset(),t&&(this.proxyReady=!1),this.start()}setActive(e){if(e!==this.active){if(this.active=e,!e){this.clearReadyTimeout(),this.clearRetry(),this.cancelLoad();return}this.start()}}reset(){this.clearRetry(),this.cancelLoad(),this.clearReadyTimeout(),this.renderId=null,this.documentLoaded=!1,this.pendingDocument=null}dispose(){this.active=!1,this.reset(),this.proxyReady=!1}handleMessage(e){if(e.source===this.frame.contentWindow&&e.origin===this.options.sandboxOrigin){if(e.data?.method===`ui/notifications/sandbox-resource-loaded`){this.renderId&&e.data?.params?.renderId===this.renderId&&(this.clearReadyTimeout(),this.renderId=null,this.options.onRendered?.());return}e.data?.method===`ui/notifications/sandbox-proxy-ready`&&e.data?.params?.sandboxUrl===this.options.sandboxUrl&&(this.proxyReady=!0,this.clearRetry(),this.clearReadyTimeout(),this.start())}}handleFrameError(){this.active&&!this.proxyReady&&this.frame.isConnected&&(this.clearReadyTimeout(),this.retrySandboxFrame())}start(){this.active&&this.frame.isConnected&&this.retryTimer===null&&(this.scheduleReadyTimeout(),this.deliverDocument(),this.loadDocument())}clearReadyTimeout(){for(let e of[`slowTimer`,`readyTimer`])this[e]!==null&&(window.clearTimeout(this[e]),this[e]=null)}scheduleReadyTimeout(){(!this.proxyReady||this.renderId&&this.options.onRendered)&&this.readyTimer===null&&(this.slowTimer=window.setTimeout(()=>{this.slowTimer=null,this.active&&this.frame.isConnected&&this.options.onPending?.()},s),this.readyTimer=window.setTimeout(()=>{this.readyTimer=null,this.active&&!this.proxyReady&&this.frame.isConnected?this.retrySandboxFrame():this.active&&this.renderId&&this.frame.isConnected&&this.options.onError(new l(`Widget content did not finish loading. Reload the dashboard to try again.`))},c))}retrySandboxFrame(){this.proxyReady=!1,this.reset(),this.options.onReadyTimeout(),this.scheduleRetry(()=>{this.frame.src=this.options.sandboxUrl,this.start()})}clearRetry(){this.retryTimer!==null&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}scheduleRetry(e){this.active&&this.frame.isConnected&&this.retryTimer===null&&(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.active&&this.frame.isConnected&&e()},this.retryDelayMs),this.retryDelayMs=Math.min(this.retryDelayMs*2,3e4))}cancelLoad(){let e=this.activeLoad;this.activeLoad=null,e&&(window.clearTimeout(e.timeout),window.clearTimeout(e.notice),e.controller.abort())}async loadDocument(){let{loadDocument:e}=this.options;if(this.loaded||this.pendingDocument!==null||this.activeLoad!==null||!this.frame.contentWindow)return;let t=new AbortController,n={controller:t,notice:window.setTimeout(()=>{this.activeLoad===n&&this.options.onPending?.()},s),timeout:window.setTimeout(()=>t.abort(new DOMException(`The operation timed out.`,`TimeoutError`)),c)};this.activeLoad=n;try{let r=await i(()=>e(t.signal),t.signal,({reason:e})=>e instanceof Error?e:new DOMException(`Aborted`,`AbortError`));if(!this.active||this.activeLoad!==n||!this.frame.isConnected)return;this.pendingDocument=r,this.deliverDocument()}catch(e){if(this.activeLoad===n&&this.active&&this.frame.isConnected){let n=t.signal.aborted?t.signal.reason:e;this.options.onError(n),this.options.retryDocument?.(n)&&this.scheduleRetry(()=>this.start())}}finally{window.clearTimeout(n.timeout),window.clearTimeout(n.notice),this.activeLoad===n&&(this.activeLoad=null)}}deliverDocument(){let e=this.pendingDocument;this.active&&this.proxyReady&&e!==null&&this.frame.isConnected&&(this.renderId=o(),this.scheduleReadyTimeout(),this.frame.contentWindow?.postMessage({jsonrpc:`2.0`,method:`ui/notifications/sandbox-resource-ready`,params:{html:e,renderId:this.renderId,...this.options.allowScripts===!1?{allowScripts:!1}:{}}},this.options.sandboxOrigin),this.pendingDocument=null,this.documentLoaded=!0,this.retryDelayMs=1e3,this.options.onLoaded())}}})))()}export{d as a,u as i,c as n,l as r,s as t};