UNPKG

@reatom/web

Version:
1 lines 17.5 kB
{"version":3,"file":"index.mjs","sources":["../../utils/build/index.mjs","../../effects/build/index.mjs","../src/event.ts","../src/online.ts"],"sourcesContent":["const noop=()=>{},sleep=(ms=0)=>new Promise(r=>setTimeout(r,ms)),isObject=thing=>\"object\"==typeof thing&&null!==thing,isRec=thing=>{if(!isObject(thing))return!1;const proto=Reflect.getPrototypeOf(thing);return!proto||!Reflect.getPrototypeOf(proto)},isShallowEqual=(a,b,is=Object.is)=>{if(Object.is(a,b))return!0;if(!isObject(a)||!isObject(b)||a.__proto__!==b.__proto__||a instanceof Error)return!1;if(Symbol.iterator in a){let equal=a instanceof Map?(a,b)=>is(a[0],b[0])&&is(a[1],b[1]):is,aIter=a[Symbol.iterator](),bIter=b[Symbol.iterator]();for(;;){let aNext=aIter.next(),bNext=bIter.next();if(aNext.done||bNext.done||!equal(aNext.value,bNext.value))return aNext.done&&bNext.done}}if(a instanceof Date)return a.getTime()===b.getTime();if(a instanceof RegExp)return String(a)===String(b);for(let k in a)if(k in b==0||!is(a[k],b[k]))return!1;return Object.keys(a).length===Object.keys(b).length},isDeepEqual=(a,b)=>{const visited=new WeakMap,is=(a,b)=>{if(isObject(a)){if(visited.has(a))return visited.get(a)===b;visited.set(a,b)}return isShallowEqual(a,b,is)};return isShallowEqual(a,b,is)},assign=Object.assign,merge=function(){return Object.assign({},...[].slice.call(arguments))},keys=Object.keys,entries=Object.entries,pick=(target,keys)=>{const result={};for(const key of keys)result[key]=target[key];return result},omit=(target,keys)=>{const result={};for(const key in target)keys.includes(key)||(result[key]=target[key]);return result},jsonClone=value=>JSON.parse(JSON.stringify(value));let _random=(min=0,max=Number.MAX_SAFE_INTEGER-1)=>Math.floor(Math.random()*(max-min+1))+min;const random=(min,max)=>_random(min,max),mockRandom=fn=>{const origin=_random;return _random=fn,()=>{_random=origin}},nonNullable=(value,message)=>{if(null==value)throw new TypeError(message||\"Value is null or undefined\");return value},{toString:toString}=Object.prototype,{toString:toStringArray}=[],visited=new WeakMap,toStringKey=(thing,immutable=!0)=>{var tag=typeof thing;if(\"symbol\"===tag)return`[reatom Symbol]${thing.description||\"symbol\"}`;if(\"function\"!==tag&&(\"object\"!==tag||null===thing||thing instanceof Date||thing instanceof RegExp))return`[reatom ${tag}]`+thing;if(visited.has(thing))return visited.get(thing);var result=`[reatom ${Reflect.getPrototypeOf(thing)?.constructor.name||toString.call(thing).slice(8,-1)}#${random()}]`;if(\"function\"===tag)return visited.set(thing,result+=thing.name),result;visited.set(thing,result);var proto=Reflect.getPrototypeOf(thing);if(proto&&Reflect.getPrototypeOf(proto)&&thing.toString!==toStringArray&&Symbol.iterator in thing==0)return result;var iterator=Symbol.iterator in thing?thing:Object.entries(thing).sort(([a],[b])=>a.localeCompare(b));for(let item of iterator)result+=toStringKey(item,immutable);return immutable?visited.set(thing,result):visited.delete(thing),result},toAbortError=reason=>{if(reason instanceof Error==0||\"AbortError\"!==reason.name){if(reason instanceof Error){var options={cause:reason};reason=reason.message}else reason=isObject(reason)?toString.call(reason):String(reason);\"undefined\"==typeof DOMException?(reason=new Error(reason,options)).name=\"AbortError\":reason=assign(new DOMException(reason,\"AbortError\"),options)}return reason},throwIfAborted=controller=>{if(controller?.signal.aborted)throw toAbortError(controller.signal.reason)},isAbort=thing=>thing instanceof Error&&\"AbortError\"===thing.name,throwAbort=(message,controller)=>{const error=toAbortError(message);throw controller?.abort(error),error},setTimeout=Object.assign(function(){const intervalId=globalThis.setTimeout(...[].slice.call(arguments));return\"number\"==typeof intervalId?intervalId:Object.assign(intervalId,{toJSON:()=>-1})},globalThis.setTimeout),MAX_SAFE_TIMEOUT=2**31-1;export{MAX_SAFE_TIMEOUT,assign,entries,isAbort,isDeepEqual,isObject,isRec,isShallowEqual,jsonClone,keys,merge,mockRandom,nonNullable,noop,omit,pick,random,setTimeout,sleep,throwAbort,throwIfAborted,toAbortError,toStringKey};\n//# sourceMappingURL=index.mjs.map\n","import{action,throwReatomError,atom,__count,isAtom}from\"@reatom/core\";import{isAbort,noop,merge,throwIfAborted,toAbortError}from\"@reatom/utils\";function _catch(body,recover){try{var result=body()}catch(e){return recover(e)}return result&&result.then?result.then(void 0,recover):result}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,getTopController=patch=>abortCauseContext.get(patch)??null,onCtxAbort=(ctx,cb)=>{const controller=getTopController(ctx.cause);if(controller){const handler=()=>cb(toAbortError(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()}},CHAINS=new WeakMap,__thenReatomed=(ctx,origin,onFulfill,onReject)=>{let chain=CHAINS.get(origin);if(!chain){const promise=origin.then(value=>(ctx.get((read,actualize)=>chain.then.forEach(cb=>cb(value,read,actualize))),value),error=>{throw ctx.get((read,actualize)=>chain.catch.forEach(cb=>cb(error,read,actualize))),isAbort(error)&&promise.catch(noop),error});CHAINS.set(origin,chain={promise:promise,then:[],catch:[]}),CHAINS.set(promise,chain)}return onFulfill&&chain.then.push(onFulfill),onReject&&chain.catch.push(onReject),chain.promise},disposable=ctx=>{const _ctx=Object.assign({},ctx);let isDisposed=!1;for(const key in ctx){const value=ctx[key];\"function\"==typeof value&&Object.assign(_ctx,{[key](){var a=[].slice.call(arguments);if(throwReatomError(isDisposed,\"access to disposed context branch\"),\"schedule\"===key){const[effect]=a;a[0]=function(){try{var promise=Promise.resolve(effect(...[].slice.call(arguments)))}catch(error){promise=Promise.reject(error)}return promise.finally(()=>{if(isDisposed)return new Promise(()=>{})})}}return value.apply(this,a)}})}return Object.assign(_ctx,{dispose(){isDisposed=!0}})},skip=Symbol(),take=(ctx,anAtom,mapper=((ctx,v)=>v))=>{const cleanups=[];return new Promise((res,rej)=>{cleanups.push(onCtxAbort(ctx,rej)??noop,ctx.subscribe(anAtom,function(state){try{if(!cleanups.length)return Promise.resolve();const _temp=_catch(function(){return anAtom.__reatom.isAction&&(state=state[0].payload),Promise.resolve(state).then(function(value){const result=mapper(ctx,value,skip);result!==skip&&res(result)})},function(error){rej(error)});return Promise.resolve(_temp&&_temp.then?_temp.then(function(){}):void 0)}catch(e){return Promise.reject(e)}}))}).finally(()=>cleanups.forEach(cb=>cb()))},takeNested=function(ctx,cb){return new Promise((resolve,reject)=>{const unabort=onCtxAbort(ctx,reject);let i=1;const{schedule:schedule}=ctx,check=()=>{0===i&&(unabort?.(),resolve()),0==--i&&Promise.resolve().then(check)},result=cb(Object.assign({},ctx,{schedule(cb,step){return schedule.call(this,ctx=>{const result=cb(ctx);return result instanceof Promise&&(++i,result.finally(check).catch(noop)),result},step)}}),...[].slice.call(arguments,2));return check(),result})},isCausedBy=(caused,by)=>{return proto=\"__reatom\"in by?by.__reatom:by,null!==(cause=\"subscribe\"in caused?caused.cause:caused).cause&&(cause.cause.proto===proto||isCausedBy(cause.cause,proto));var cause,proto},withAbortableSchedule=ctx=>{const{schedule:schedule}=ctx;return merge(ctx,{schedule(cb,step=1){const _this=this;if(step<1)return schedule.call(this,cb,step);let resolve,reject;const promise=new Promise((res,rej)=>{resolve=res,reject=rej}),unabort=onCtxAbort(this,error=>{promise.catch(noop),reject(error)});return schedule.call(this,function(_ctx){try{function _temp3(){unabort?.()}const _temp2=_catch(function(){const controller=getTopController(_this.cause);return throwIfAborted(controller),Promise.resolve(cb(_ctx)).then(function(value){throwIfAborted(controller),resolve(value)})},function(error){reject(error)});return Promise.resolve(_temp2&&_temp2.then?_temp2.then(_temp3):_temp3())}catch(e){return Promise.reject(e)}},step).catch(error=>{reject(error),unabort?.()}),promise}})},concurrentControllers=new WeakMap,concurrent=(fn,strategy=\"last-in-win\")=>{const abortControllerAtom=atom(null,`${__count(\"_concurrent\")}.abortControllerAtom`),target=action(function(ctx,topCtx){const prevController=ctx.get(abortControllerAtom),controller=new AbortController,abort=toAbortError(\"concurrent\");if(\"first-in-win\"===strategy){if(prevController){const rej=Promise.reject(abort);return rej.catch(noop),rej}abortControllerAtom(ctx,controller)}\"last-in-win\"===strategy&&(abortControllerAtom(ctx,controller),prevController&&ctx.schedule(()=>prevController.abort(abort)));const unabort=onCtxAbort(topCtx,error=>{res instanceof Promise&&res.catch(noop),controller.abort(error)});abortCauseContext.set(ctx.cause,controller);var res=fn(withAbortableSchedule({...ctx,spy:topCtx.spy}),...[].slice.call(arguments,2));return res instanceof Promise?(res=res.finally(()=>{\"first-in-win\"===strategy&&abortControllerAtom(ctx,null),unabort?.(),controller.signal.aborted&&res.catch(noop),throwIfAborted(controller)}),controller.signal.addEventListener(\"abort\",()=>{res.catch(noop)})):throwReatomError(\"first-in-win\"===strategy,'can\\'t apply \"first-in-win\" strategy for non-async function'),res},isAtom(fn)?`${fn.__reatom.name}._concurrent`:\"_concurrent\"),result=Object.assign(function(ctx){return target(ctx,ctx,...[].slice.call(arguments,1))},target,fn);return concurrentControllers.set(result,abortControllerAtom),result},withConcurrency=strategy=>target=>concurrent(target,strategy),_spawn=action(function(ctx,fn,controller){return abortCauseContext.set(ctx.cause,controller),fn(ctx,...[].slice.call(arguments,3))},\"_spawn\"),spawn=(ctx,fn,args=[],controller=new AbortController)=>_spawn(ctx,fn,controller,...args),reaction=(cb,name=__count(\"reaction\"))=>action(function(ctx){const reducer=concurrent(ctx=>cb(ctx,...[].slice.call(arguments,1))),reactionAtom=atom(reducer,__count(name)),abort=reason=>{const controllerAtom=concurrentControllers.get(reducer);controllerAtom&&ctx.get(controllerAtom)?.abort(toAbortError(reason))},un=ctx.subscribe(reactionAtom,noop),unabort=onCtxAbort(ctx,error=>{un(),abort(error)});return{...reactionAtom,unsubscribe:()=>{un(),unabort?.(),abort(\"unsubscribe\")}}});export{CauseContext,__thenReatomed,_spawn,abortCauseContext,concurrent,concurrentControllers,disposable,getTopController,isCausedBy,onCtxAbort,reaction,spawn,take,takeNested,withAbortableSchedule,withConcurrency};\n//# sourceMappingURL=index.mjs.map\n","import { Ctx, Fn, Unsubscribe } from '@reatom/core'\nimport { onCtxAbort } from '@reatom/effects'\n\nexport type EventOfTarget<\n Target extends EventTarget,\n Type extends string,\n> = Target extends Record<`on${Type}`, infer Cb>\n ? // @ts-expect-error `Cb extends Fn` broke the inference for some reason\n Parameters<Cb>[0] // correct type\n : Target extends Record<'onEvent', (type: Type, cb: infer Cb) => any>\n ? // @ts-expect-error `Cb extends Fn` broke the inference for some reason\n Parameters<Cb>[0] // general type\n : never\n\n// @ts-ignore\nexport const onEvent: {\n <\n Target extends EventTarget,\n Type extends Target extends Record<`on${infer Type}`, Fn> ? Type : string,\n >(\n ctx: Ctx,\n target: Target,\n type: Type,\n ): Promise<EventOfTarget<Target, Type>>\n <Event>(ctx: Ctx, target: EventTarget, type: string): Promise<Event>\n <\n Target extends EventTarget,\n Type extends Target extends Record<`on${infer Type}`, Fn> ? Type : string,\n >(\n ctx: Ctx,\n target: Target,\n type: Type,\n cb: (value: EventOfTarget<Target, Type>) => any,\n options?: AddEventListenerOptions\n ): Unsubscribe\n <Event>(\n ctx: Ctx,\n target: EventTarget,\n type: string,\n cb: (value: Event) => any,\n options?: AddEventListenerOptions\n ): Unsubscribe\n} = (ctx: Ctx, target: EventTarget, type: string, listener: Fn) => {\n let un\n if (!listener) {\n return new Promise((r) => (un = onEvent(ctx, target, type, r))).finally(un)\n }\n target.addEventListener(type, listener)\n un = () => target.removeEventListener(type, listener)\n onCtxAbort(ctx, un)\n return un\n}\n\n// export const withEvent: {\n// <\n// A extends AtomMut,\n// Type extends Target extends Record<`on${infer Type}`, Fn> ? Type : string,\n// Target extends EventTarget,\n// >(\n// type: Type,\n// target: Target,\n// map: (\n// ctx: Ctx,\n// event: EventOfTarget<Target, Type>,\n// state: AtomState<A>,\n// ) => AtomState<A>,\n// ): (anAtom: A) => A\n// } = (type, target, map) => (anAtom) => {\n// onConnect(anAtom, (ctx) =>\n// onEvent(ctx, target, type, (event) => {\n// // @ts-expect-error\n// anAtom(ctx, (state) => map(ctx, event, state))\n// }),\n// )\n// return anAtom\n// }\n\n// export const reatomEvent: {\n// <\n// Type extends Target extends Record<`on${infer Type}`, Fn> ? Type : string,\n// Target extends EventTarget = Window,\n// >(\n// type: Type,\n// target?: Target,\n// filter?: (event: EventOfTarget<Target, Type>) => boolean,\n// ): Action<[EventOfTarget<Target, Type>], EventOfTarget<Target, Type>>\n// } = (type, target, filter = () => true) => {\n// const event = action(`event.${type}`)\n// onConnect(event, (ctx) =>\n// onEvent(ctx, target ?? window, type, (e) => {\n// if (filter(e)) event(ctx, e)\n// }),\n// )\n// return event\n// }\n","import { atom, type Atom } from '@reatom/core'\nimport { onConnect } from '@reatom/hooks'\nimport { withAssign } from '@reatom/primitives'\nimport { onEvent } from './event'\n\ntype OnlineAtom = Atom<boolean> & {\n /** Time stamp of transition to online mode. */\n offlineAtAtom: Atom<number | undefined>\n /** Time stamp of transition to offline mode. */\n onlineAtAtom: Atom<number | undefined>\n}\n\n/**\n * @note https://issues.chromium.org/issues/338514113\n */\nexport const createOnlineAtom = (): OnlineAtom => {\n const onlineAtom = atom(navigator.onLine, 'onLine')\n .pipe(withAssign(() => ({\n offlineAtAtom: atom<number | undefined>(undefined, 'onLine.offlineAtAtom'),\n onlineAtAtom: atom<number | undefined>(undefined, 'onLine.onlineAtAtom'),\n })))\n\n onConnect(onlineAtom, (ctx) => {\n onlineAtom(ctx, navigator.onLine)\n onEvent(ctx, window, 'online', () => {\n onlineAtom(ctx, true)\n onlineAtom.onlineAtAtom(ctx, Date.now())\n })\n onEvent(ctx, window, 'offline', () => {\n onlineAtom(ctx, false)\n onlineAtom.offlineAtAtom(ctx, Date.now())\n })\n })\n\n return onlineAtom\n}\n"],"names":["assign","Object","toString","prototype","intervalId","globalThis","setTimeout","slice","call","arguments","toJSON","CauseContext","WeakMap","has","cause","super","this","get","abortCauseContext","action","ctx","fn","controller","set","onEvent","target","type","listener","un","addEventListener","removeEventListener","onCtxAbort","cb","handler","reason","Error","name","options","message","thing","String","DOMException","toAbortError","signal","cleanup","aborted","schedule","Promise","r","finally","createOnlineAtom","onlineAtom","atom","navigator","onLine","pipe","withAssign","offlineAtAtom","undefined","onlineAtAtom","onConnect","window","Date","now"],"mappings":"sHAoCa,MAsFAA,OAETC,OAAOD,QA0DLE,SAAEA,UAAaD,OAAOE,UAwF4BF,OAAOD,OAC7D,WACE,MAAMI,WAAaC,WAAWC,cAAW,GAAAC,MAAAC,KAAAC,YACzC,MAA6B,iBAAfL,WACVA,WACAH,OAAOD,OAAOI,WAAY,CACxBM,OAAMA,KACI,GAGlB,EACAL,WAAWC,YCvQA,MAAAK,qBAAwBC,QACnCC,GAAAA,CAAIC,OACF,OAAYC,MAACF,IAAIC,QAA2B,OAAhBA,MAAMA,OAAkBE,KAAKH,IAAIC,MAAMA,MACrE,CACAG,GAAAA,CAAIH,OACF,MAAQC,MAAMF,IAAIC,QAAUA,MAAMA,OAChCA,MAAQA,MAAMA,MAEhB,OAAaG,MAAAA,IAAIH,MACnB,EAGWI,MAAAA,kBAAoB,IAAIP,aA+TfQ,OAAO,SAACC,IAAKC,GAAQC,YAEzC,OADAJ,kBAAkBK,IAAIH,IAAIN,MAAOQ,YAC1BD,GAAGD,OAAK,GAAAb,MAAAC,KAAAC,UACjB,GAAA,EAAG,UCjVU,MAAAe,QA2BTA,CAACJ,IAAUK,OAAqBC,KAAcC,YAChD,IAAIC,GACJ,OAAKD,UAGLF,OAAOI,iBAAiBH,KAAMC,UAC9BC,GAAKA,IAAMH,OAAOK,oBAAoBJ,KAAMC,UDZpBI,EAACX,IAAUY,MACnC,MAAMV,WAJNJ,kBAAkBD,IAIkBG,IAAIN,QAJR,KAMhC,GAAIQ,WAAY,CACd,MAAMW,QAAUA,IAAMD,GDoMGE,UAC3B,GAAIA,kBAAkBC,OAAU,GAAyB,eAAhBD,OAAOE,KAAuB,CACrE,GAAIF,kBAAkBC,MAAO,CAC3B,IAAIE,QAAoC,CAAEvB,MAAOoB,QACjDA,OAASA,OAAOI,OAClB,MACEJ,OArMa,iBAHjBK,MAwMsBL,SArMiB,OAAVK,MAqMGrC,SAASM,KAAK0B,QAAUM,OAAON,QAGjC,oBAAjBO,cACTP,OAAS,IAAIC,MAAMD,OAAQG,UACpBD,KAAO,aAEdF,OAASlC,OAAO,IAAIyC,aAAaP,OAAQ,cAAeG,QAE5D,CAjNAE,UAmNA,OAAOL,QCrNoBQ,CAAapB,WAAWqB,OAAOT,SAClDU,QAAUA,IAAMtB,WAAWqB,OAAOb,oBAAoB,QAASG,SAGrE,IAAIX,WAAWqB,OAAOE,QAIpB,OAFAvB,WAAWqB,OAAOd,iBAAiB,QAASI,SAC5Cb,IAAI0B,SAAS,IAAMxB,WAAWqB,OAAOb,oBAAoB,QAASG,UAAW,GACtEW,QAJsBX,SAMjC,GCDAF,CAAWX,IAAKQ,IACTA,IALM,IAAAmB,QAASC,GAAOpB,GAAKJ,QAAQJ,IAAKK,OAAQC,KAAMsB,IAAKC,QAAQrB,GAKnEA,ECnCIsB,iBAAmBA,KAC9B,MAAMC,WAAaC,KAAKC,UAAUC,OAAQ,UACvCC,KAAKC,WAAW,KAAO,CACtBC,cAAeL,UAAyBM,EAAW,wBACnDC,aAAcP,UAAyBM,EAAW,2BAetD,OAZAE,UAAUT,WAAa/B,MACrB+B,WAAW/B,IAAKiC,UAAUC,QAC1B9B,QAAQJ,IAAKyC,OAAQ,SAAU,KAC7BV,WAAW/B,KAAK,GAChB+B,WAAWQ,aAAavC,IAAK0C,KAAKC,MAAK,GAEzCvC,QAAQJ,IAAKyC,OAAQ,UAAW,KAC9BV,WAAW/B,KAAK,GAChB+B,WAAWM,cAAcrC,IAAK0C,KAAKC,MACrC,EACF,GAEOZ"}