UNPKG

@osaedasia/oresume

Version:

A user-friendly library for generating complete Single Page Applications (SPAs)

2 lines (1 loc) 1.64 kB
import{isAnObserverService as e}from"../../domain/definitions/interfaces/observer/IObserverService.js";import{Store as t}from"../Store.js";import{NativeHelper as r}from"../helpers/NativeHelper.js";class s{_storage;_observers;_propertyObservables;_currentState;constructor(e,r){if(this._observers=new Set,this._propertyObservables=new Map,r){const s=t.fromKey(r);this._storage=s||new t(r,e),this._currentState=this._createObservableProxy(this._storage.getData())}else this._currentState=this._createObservableProxy(e)}get state(){return this._currentState}set state(e){this._currentState!==e&&(this._currentState=this._createObservableProxy(e),this._notify(e),this._storage?.save(e))}subscribe(e){return this._observers.has(e)||this._observers.add(e),()=>{this._unsubscribe(e)}}listen(e,t){return e.subscribe(t)}_notify(e){for(const t of this._observers)t(e)}_unsubscribe(e){this._observers.has(e)&&this._observers.delete(e)}_createObservableProxy(t){if(null===t||"object"!=typeof t)return t;const o=this;return new Proxy(t,{get(t,i){const n=Reflect.get(t,i);if(r.isNativeObject(n)||e(n))return n;if(t.__observables?.includes(i)??!1){const e=o._propertyObservables.get(i);if(e)return e;const t=new s(n);return t.listen(o,(e=>{if(null!==e&&"object"==typeof e){const r=t.state,s=e[String(i)]??void 0;r!==s&&(t.state=s)}})),o._propertyObservables.set(i,t),t}return n},set(e,t,r){if(Reflect.get(e,t)===r)return!0;if(!Reflect.set(e,t,r))return!1;if(e.__observables?.includes(t)??!1){const e=o._propertyObservables.get(t);e&&(e.state=r)}else o._notify(o._currentState);return o._storage?.save(o._currentState),!0}})}}export{s as Observable};