UNPKG

@reatom/web

Version:
3 lines (2 loc) 2.4 kB
import{action,atom}from"@reatom/core";import{onConnect}from"@reatom/hooks";import{withAssign}from"@reatom/primitives";const assign=Object.assign,{toString}=Object.prototype;Object.assign(function(){const intervalId=globalThis.setTimeout(...[].slice.call(arguments));return"number"==typeof intervalId?intervalId:Object.assign(intervalId,{toJSON:()=>-1})},globalThis.setTimeout);class CauseContext extends WeakMap{has(cause){return super.has(cause)||null!==cause.cause&&this.has(cause.cause)}get(cause){for(;!super.has(cause)&&cause.cause;)cause=cause.cause;return super.get(cause)}}const abortCauseContext=new CauseContext;action(function(ctx,fn,controller){return abortCauseContext.set(ctx.cause,controller),fn(ctx,...[].slice.call(arguments,3))},"_spawn");const onEvent=(ctx,target,type,listener)=>{let un;return listener?(target.addEventListener(type,listener),un=()=>target.removeEventListener(type,listener),((ctx,cb)=>{const controller=null!=(_abortCauseContext$ge=abortCauseContext.get(ctx.cause))?_abortCauseContext$ge:null;var _abortCauseContext$ge;if(controller){const handler=()=>cb((reason=>{if(reason instanceof Error==0||"AbortError"!==reason.name){if(reason instanceof Error){var options={cause:reason};reason=reason.message}else reason="object"==typeof(thing=reason)&&null!==thing?toString.call(reason):String(reason);"undefined"==typeof DOMException?(reason=new Error(reason,options)).name="AbortError":reason=assign(new DOMException(reason,"AbortError"),options)}var thing;return reason})(controller.signal.reason)),cleanup=()=>controller.signal.removeEventListener("abort",handler);if(!controller.signal.aborted)return controller.signal.addEventListener("abort",handler),ctx.schedule(()=>controller.signal.removeEventListener("abort",handler),-1),cleanup;handler()}})(ctx,un),un):new Promise(r=>un=onEvent(ctx,target,type,r)).finally(un)},createOnlineAtom=()=>{const onlineAtom=atom(navigator.onLine,"onLine").pipe(withAssign(()=>({offlineAtAtom:atom(void 0,"onLine.offlineAtAtom"),onlineAtAtom:atom(void 0,"onLine.onlineAtAtom")})));return onConnect(onlineAtom,ctx=>{onlineAtom(ctx,navigator.onLine),onEvent(ctx,window,"online",()=>{onlineAtom(ctx,!0),onlineAtom.onlineAtAtom(ctx,Date.now())}),onEvent(ctx,window,"offline",()=>{onlineAtom(ctx,!1),onlineAtom.offlineAtAtom(ctx,Date.now())})}),onlineAtom};export{createOnlineAtom,onEvent}; //# sourceMappingURL=index.modern.mjs.map