UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

2 lines (1 loc) 9.32 kB
import{Observable as W,Subject as E}from"rxjs";var A=class{constructor(e){this.options=e;this.storage=e.storage,this.middlewareAPI={getState:()=>this.storage.getState(),dispatch:async t=>(this.actions$.next(t),t.payload),storage:this.storage,actions$:this.actions,actions:this.dispatch,watchers:this.watchers,findActionByType:t=>this.findActionByType(t),findWatcherByType:t=>this.findWatcherByType(t)},e.middlewares&&e.middlewares.length>0&&this.use(...e.middlewares)}actions$=new E;actions=this.actions$.asObservable();dispatch={};watchers={};storage;middlewareFunctions=[];middlewareAPI;use(...e){for(let t=0;t<e.length;t++)try{let s=e[t](this.middlewareAPI);this.middlewareFunctions.push(s)}catch{}return this}getActions(){return this.dispatch}getTypedDispatch(){return this.dispatch}getTypedWatchers(){return this.watchers}findActionByType(e){return Object.values(this.dispatch).find(t=>t.actionType.split(`[${this.storage.name}]`)[1]===e)}findWatcherByType(e){return Object.values(this.watchers).find(t=>t.actionType===e)}createAction(e,t){let s=`[${this.storage.name}]${e.type}`,r=null,i=null,a=async c=>{let o=[c];if(t?.memoize&&r&&i&&t.memoize(o,r,i))return i;let l={type:s,meta:e.meta},u;if(this.middlewareFunctions.length>0){let f=async p=>t?.worker?this.executeInWorker(t.worker,s,o,e.action):Promise.resolve(e.action(c));for(let p=this.middlewareFunctions.length-1;p>=0;p--){let T=this.middlewareFunctions[p],b=f;f=async v=>T(async x=>b(x))(v)}u=await f(l)}else t?.worker?u=await this.executeInWorker(t.worker,s,o,e.action):u=await e.action(c);return l.payload=u,r=[...o],i=u,this.actions$.next(l),u};return a.e="dispatch",Object.defineProperty(a,"actionType",{value:s,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(a,"meta",{value:e.meta,writable:!1,enumerable:!0}),a}createWatcher(e){let t=`[${this.storage.name}]${e.type}`,s=new E,r,i=async()=>{let o=await this.storage.getState();return e.selector(o)},a=this.storage.subscribe(e.selector,o=>{if(!e.shouldTrigger||e.shouldTrigger(r,o)){let l={type:t,payload:o,meta:e.meta};this.actions$.next(l),s.next(l),r=o}}),c=()=>{let o=s.asObservable();return e.notifyAfterSubscribe?new W(l=>{let u=!1;i().then(p=>{if(!e.shouldTrigger||e.shouldTrigger(void 0,p)){let T={type:t,payload:p,meta:{...e.meta,isInitial:!0}};l.next(T),r=p,u=!0}}).catch(p=>{l.error(p)});let f=o.subscribe({next:p=>{u&&p.payload===r||l.next(p)},error:p=>l.error(p),complete:()=>l.complete()});return()=>{f.unsubscribe()}}):o};return c.e="watchers",Object.defineProperty(c,"actionType",{value:t,writable:!1,enumerable:!0}),e.meta&&Object.defineProperty(c,"meta",{value:e.meta,writable:!1,enumerable:!0}),Object.defineProperty(c,"unsubscribe",{value:a,writable:!1,enumerable:!0}),c}async executeInWorker(e,t,s,r){return new Promise((i,a)=>{let c=`${t}_${Date.now()}_${Math.random()}`,o=l=>{l.data.requestId===c&&(e.removeEventListener("message",o),l.data.error?a(new Error(l.data.error)):i(l.data.result))};e.addEventListener("message",o),e.postMessage({type:t,args:s,requestId:c}),setTimeout(()=>{e.removeEventListener("message",o),a(new Error(`Worker execution timeout for action: ${t}`))},3e4)})}};function Y(n,e){let t=new A(n),s=e(n.storage,{createAction:(r,i)=>t.createAction(r,i),createWatcher:r=>t.createWatcher(r)});for(let[r,i]of Object.entries(s))if(typeof i=="function"){let a=i.e;t[a][r]=i}return t}function R(n,e=1){if(e<=0)throw new Error("Size must be greater than 0");if(!n||!n.length)return[];let t=[],s=n.length,r=0;for(;r<s;)t.push(n.slice(r,r+e)),r+=e;return t}var h=globalThis.console,d={log:(...n)=>h.log(...n),warn:(...n)=>h.warn(...n),error:(...n)=>h.error(...n),group:(...n)=>h.group(...n),groupEnd:()=>h.groupEnd(),groupCollapsed:(...n)=>h.groupCollapsed(...n)};function P(n,e){let t={};return[...new Set([...Object.keys(n),...Object.keys(e)])].forEach(r=>{if(r in n&&r in e)if(typeof n[r]=="object"&&n[r]!==null&&typeof e[r]=="object"&&e[r]!==null&&!Array.isArray(n[r])&&!Array.isArray(e[r])){let i=P(n[r],e[r]);Object.keys(i).length>0&&(t[r]=i)}else JSON.stringify(n[r])!==JSON.stringify(e[r])&&(t[r]={PREV:n[r],NEXT:e[r]});else r in n?t[r]={PREV:n[r],NEXT:void 0}:t[r]={PREV:void 0,NEXT:e[r]}}),t}var pe=(n={})=>{let e={action:"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435",prevState:"\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",nextState:"\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435",duration:"\u0414\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C",error:"\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438",diff:"\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F",changesCount:"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439",showFullState:"\u041F\u043E\u043B\u043D\u043E\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435"},t={collapsed:!1,duration:!0,diff:!1,showFullState:!0,translations:e,colors:{title:"#3498db",prevState:"#9E9E9E",fullState:"#008a15",action:"#03A9F4",nextState:"#4CAF50",error:"#F20404",diff:"#9C27B0"}},s={...t,...n,translations:{...e,...n.translations||{}},colors:{...t.colors,...n.colors||{}}},{collapsed:r,duration:i,colors:a,translations:c}=s;return o=>l=>async u=>{let f=Date.now(),p=await o.getState();try{let T=await l(u),b=await o.getState(),S=Date.now()-f,x=`${u.type}`;if((r?d.groupCollapsed:d.group)(`%c ${x}`,`color: ${a.title}; font-weight: bold`),d.log(`%c ${c.action}:`,`color: ${a.action}; font-weight: bold`,u),s.diff){let w=P(p,b),$=Object.keys(w).length;d.log(`%c ${c.diff} (${c.changesCount}: ${$}):`,`color: ${a.diff}; font-weight: bold`,w)}return s.showFullState&&(d.groupCollapsed(`%c ${c.showFullState}`,`color: ${a.fullState}; font-weight: bold`),d.log(`%c ${c.prevState}:`,`color: ${a.prevState}; font-weight: bold`,p),d.log(`%c ${c.nextState}:`,`color: ${a.nextState}; font-weight: bold`,b),d.groupEnd()),i&&d.log(`%c ${c.duration}: %c ${S}ms`,"font-weight: bold","color: #4CAF50"),d.groupEnd(),T}catch(T){throw d.error(`%c ${c.error}:`,`color: ${a.error}; font-weight: bold`,u.type,T),T}}};import{combineLatest as L,merge as V,Observable as N,of as y,pipe as U,Subject as z}from"rxjs";import{catchError as _,filter as g,map as m,share as J,switchMap as X,take as G}from"rxjs/operators";import{of as D}from"rxjs";import{concatAll as k,delay as M,mergeMap as j,toArray as I}from"rxjs/operators";var F=(n,e,t,s=0)=>{let r=R(e,t).map(i=>D(i).pipe(M(s),j(n)));return D(...r).pipe(k(),I())};import{forkJoin as q,timer as B}from"rxjs";import{mergeMap as K}from"rxjs/operators";var O=(n,e,t,s=0)=>q(R(e,t).map((r,i)=>B(i*s).pipe(K(()=>n(r)))));function je(n){let{actionType:e}=n;return e?t=>t.pipe(g(s=>s!==void 0&&s.type===e)):g(()=>!1)}function Ie(n){let e=n.map(t=>t.actionType).filter(Boolean);return e.length===0?g(()=>!1):t=>t.pipe(g(s=>s!==void 0&&e.includes(s.type)))}function qe(n){return e=>{let t=n.map(r=>r.actionType).filter(Boolean);if(t.length===0)return y([]);let s=t.map((r,i)=>e.pipe(g(a=>a.type===r),G(1),m(a=>({index:i,action:a}))));return L(s).pipe(m(r=>(r.sort((i,a)=>i.index-a.index),r.map(i=>i.action))))}}function Be(n,...e){return n.pipe(m(t=>e.map(s=>s(t))))}function Ke(n,e){return n.pipe(m(t=>{let s={};for(let[r,i]of Object.entries(e))s[r]=i(t);return s}))}function Le({validator:n,apiCall:e}){return U(X(t=>{let s=()=>e(t,{chunkRequest:O,chunkRequestConsistent:F});if(!n)return s();let r=n(t),{conditions:i,skipAction:a}=r;return i.every(Boolean)?s():Array.isArray(a)?y(...a?.filter(Boolean).map(o=>typeof o=="function"?o():o)):y(typeof a=="function"?a():a)}))}var C=class{constructor(e,t={},s,r={},i={}){this.storage=e;this.externalStates=t;this.dispatchers=s;this.services=r;this.config=i;this.subscribeToDispatchers(),this.state$=new N(a=>{this.storage.getState().then(o=>a.next(o));let c=this.storage.subscribeToAll(()=>{this.storage.getState().then(o=>a.next(o))});return()=>c()}).pipe(J())}effects=[];subscriptions=[];running=!1;action$=new z;state$;subscribeToDispatchers(){for(let[e,t]of Object.entries(this.dispatchers)){let s=t.actions.subscribe(r=>{this.action$.next(r)});this.subscriptions.push(s)}}add(e){return this.effects.push(e),this.running&&this.subscribeToEffect(e),this}addEffects(e){return e.forEach(t=>this.add(t)),this}async start(){return this.running?this:(await this.storage.waitForReady(),this.effects.forEach(e=>this.subscribeToEffect(e)),this.running=!0,this)}stop(){return this.subscriptions.forEach(e=>e.unsubscribe()),this.subscriptions=[],this.running=!1,this}subscribeToEffect(e){try{let s=e(this.action$.asObservable(),this.state$,this.externalStates,this.dispatchers,this.services,this.config).pipe(_(r=>y(null))).subscribe(r=>{if(r!=null&&typeof r=="function")try{r()}catch{}});this.subscriptions.push(s)}catch{}}};function Ve(n){return n}function Ne(n){return n}function Ue(...n){return(e,t,s,r,i,a)=>{let c=n.map(o=>{try{return o(e,t,s,r,i,a)}catch{return y(null)}});return V(...c)}}export{A as Dispatcher,C as EffectsModule,Ue as combineEffects,Y as createDispatcher,Ne as createEffect,Ve as createEffectBase,pe as loggerDispatcherMiddleware,je as ofType,Ie as ofTypes,qe as ofTypesWaitAll,Be as selectorMap,Ke as selectorObject,Le as validateMap};