XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFESystem.Browser;

internal static class BrowserDomAbort
{
    internal const string Source = "\n" + """
          class DOMException extends Error {constructor(message='',name='Error'){super(String(message));this.name=String(name);this.code=this.name==='AbortError'?20:this.name==='TimeoutError'?23:0;}}
          window.DOMException=DOMException;
          const abortToken={},abortStates=new WeakMap();
          class AbortSignal extends EventTarget {
            constructor(token){super();if(token!==abortToken)throw new TypeError('Illegal constructor');abortStates.set(this,{aborted:false,reason:undefined});this.onabort=null;}
            get aborted(){return abortStates.get(this).aborted;}get reason(){return abortStates.get(this).reason;}
            throwIfAborted(){if(this.aborted)throw this.reason;}
            static abort(reason){const controller=new AbortController();controller.abort(reason);return controller.signal;}
            static timeout(milliseconds){if(!Number.isInteger(milliseconds)||milliseconds<0||milliseconds>2147483647)throw new RangeError('Invalid abort timeout');const controller=new AbortController();setTimeout(()=>controller.abort(new DOMException('The operation timed out','TimeoutError')),milliseconds);return controller.signal;}
            static any(signals){const values=Array.from(signals);if(values.length>128)throw new RangeError('Too many abort signals');for(const signal of values)if(!(signal instanceof AbortSignal))throw new TypeError('Expected AbortSignal');
              const controller=new AbortController(),cleanups=[];for(const signal of values){if(signal.aborted){controller.abort(signal.reason);break;}const callback=()=>controller.abort(signal.reason);signal.addEventListener('abort',callback,{once:true});cleanups.push(()=>signal.removeEventListener('abort',callback));}
              const cleanup=()=>{for(const callback of cleanups)callback();};if(controller.signal.aborted)cleanup();else controller.signal.addEventListener('abort',cleanup,{once:true});return controller.signal;}
          }
          class AbortController {
            constructor(){Object.defineProperty(this,'signal',{value:new AbortSignal(abortToken),enumerable:true});}
            abort(reason){const state=abortStates.get(this.signal);if(state.aborted)return;state.aborted=true;state.reason=reason===undefined?new DOMException('The operation was aborted','AbortError'):reason;this.signal.dispatchEvent(new Event('abort'));}
          }
          Object.assign(window,{AbortSignal,AbortController});
        """ + "\n";
}