@alwatr/signal 2.0.3 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.0.5](https://github.com/Alwatr/signal/compare/@alwatr/signal@2.0.4...@alwatr/signal@2.0.5) (2023-12-19)
7
+
8
+ **Note:** Version bump only for package @alwatr/signal
9
+
10
+ ## [2.0.4](https://github.com/Alwatr/signal/compare/@alwatr/signal@2.0.2...@alwatr/signal@2.0.4) (2023-12-19)
11
+
12
+ **Note:** Version bump only for package @alwatr/signal
13
+
6
14
  ## [2.0.3](https://github.com/Alwatr/signal/compare/@alwatr/signal@2.0.2...@alwatr/signal@2.0.3) (2023-11-09)
7
15
 
8
16
  **Note:** Version bump only for package @alwatr/signal
@@ -1 +1 @@
1
- {"version":3,"file":"multithread-context.js","sourceRoot":"","sources":["src/multithread-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAQjD;;GAEG;AACH,MAAM,OAAO,8BAAuC,SAAQ,mBAA2B;IAKrF,MAAM,CAAC,YAAY,CAAC,SAAiB,IAAyB;QAC5D,8BAA8B,CAAC,OAAO,GAAG,MAAM,CAAC;QAChD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAAmB;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAmC,CAAC;QAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,wBAAwB;YAAE,OAAO;QACtD,8BAA8B,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,8BAA8B,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAC,KAAK,EAAE,wCAAwC,EAAC,CAAC,CAAC;SAC1F;QACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAY,EAAE,OAAgB;QAChD,8BAA8B,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,cAAc,EAAE,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;QACxF,IAAI,8BAA8B,CAAC,OAAO,KAAK,SAAS,EAAE;YACxD,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAC,KAAK,EAAE,kDAAkD,EAAC,CAAC,CAAC;SACpG;QACD,8BAA8B,CAAC,OAAO,CAAC,WAAW,CAAC;YACjD,IAAI,EAAE,wBAAwB;YAC9B,IAAI;YACJ,OAAO;SACuB,CAAC,CAAC;IACpC,CAAC;IAED,YAAY,MAA6C;QACvD,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,8BAA8B,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;YACtE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACvC;QAED,8BAA8B,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAA+C,CAAC;IACzG,CAAC;IAED;;OAEG;IACM,QAAQ,CAAC,KAAa;QAC7B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,8BAA8B,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;;AAhDgB,sCAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAE5C,wCAAS,GAAwE,EAAE,CAAC","sourcesContent":["import {createLogger} from '@alwatr/logger';\n\nimport {AlwatrContextSignal} from './context.js';\n\ninterface AlwatrContextChangedMessage {\n type: 'alwatr_context_changed';\n name: string;\n payload: unknown;\n}\n\n/**\n * Alwatr multithread context signal.\n */\nexport class AlwatrMultithreadContextSignal<TValue> extends AlwatrContextSignal<TValue> {\n protected static _logger = createLogger(`alwatr/mt-context`);\n protected static _worker?: Worker;\n protected static _registry: Record<string, AlwatrMultithreadContextSignal<unknown> | undefined> = {};\n\n static setupChannel(worker: Worker = self as unknown as Worker): void {\n AlwatrMultithreadContextSignal._worker = worker;\n worker.addEventListener('message', AlwatrMultithreadContextSignal._onMessage);\n }\n\n static _onMessage(event: MessageEvent): void {\n const message = event.data as AlwatrContextChangedMessage;\n if (message.type !== 'alwatr_context_changed') return;\n AlwatrMultithreadContextSignal._logger.logMethodArgs?.('_onMessage', {message});\n const context = AlwatrMultithreadContextSignal._registry[message.name];\n if (context === undefined) {\n throw new Error('context_not_define', {cause: 'context not define in this thread yet!'});\n }\n context._notify(message.payload);\n }\n\n static _postMessage(name: string, payload: unknown): void {\n AlwatrMultithreadContextSignal._logger.logMethodArgs?.('_postMessage', {name, payload});\n if (AlwatrMultithreadContextSignal._worker === undefined) {\n throw new Error('worker_not_defined', {cause: 'setupChannel must be called before any setValue.'});\n }\n AlwatrMultithreadContextSignal._worker.postMessage({\n type: 'alwatr_context_changed',\n name,\n payload,\n } as AlwatrContextChangedMessage);\n }\n\n constructor(config: {name: string; loggerPrefix?: string}) {\n super(config);\n\n if (AlwatrMultithreadContextSignal._registry[this._name] !== undefined) {\n throw new Error('context_name_exist');\n }\n\n AlwatrMultithreadContextSignal._registry[this._name] = this as AlwatrMultithreadContextSignal<unknown>;\n }\n\n /**\n * Set context value and notify all subscribers.\n */\n override setValue(value: TValue): void {\n super.setValue(value);\n AlwatrMultithreadContextSignal._postMessage(this._name, value);\n }\n}\n"]}
1
+ {"version":3,"file":"multithread-context.js","sourceRoot":"","sources":["src/multithread-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAC,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAQjD;;GAEG;AACH,MAAM,OAAO,8BAAuC,SAAQ,mBAA2B;IAKrF,MAAM,CAAC,YAAY,CAAC,SAAiB,IAAyB;QAC5D,8BAA8B,CAAC,OAAO,GAAG,MAAM,CAAC;QAChD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAAmB;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAmC,CAAC;QAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,wBAAwB;YAAE,OAAO;QACtD,8BAA8B,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,8BAA8B,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAC,KAAK,EAAE,wCAAwC,EAAC,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAY,EAAE,OAAgB;QAChD,8BAA8B,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,cAAc,EAAE,EAAC,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;QACxF,IAAI,8BAA8B,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAC,KAAK,EAAE,kDAAkD,EAAC,CAAC,CAAC;QACrG,CAAC;QACD,8BAA8B,CAAC,OAAO,CAAC,WAAW,CAAC;YACjD,IAAI,EAAE,wBAAwB;YAC9B,IAAI;YACJ,OAAO;SACuB,CAAC,CAAC;IACpC,CAAC;IAED,YAAY,MAA6C;QACvD,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,8BAA8B,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,8BAA8B,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAA+C,CAAC;IACzG,CAAC;IAED;;OAEG;IACM,QAAQ,CAAC,KAAa;QAC7B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,8BAA8B,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;;AAhDgB,sCAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAE5C,wCAAS,GAAwE,EAAE,CAAC","sourcesContent":["import {createLogger} from '@alwatr/logger';\n\nimport {AlwatrContextSignal} from './context.js';\n\ninterface AlwatrContextChangedMessage {\n type: 'alwatr_context_changed';\n name: string;\n payload: unknown;\n}\n\n/**\n * Alwatr multithread context signal.\n */\nexport class AlwatrMultithreadContextSignal<TValue> extends AlwatrContextSignal<TValue> {\n protected static _logger = createLogger(`alwatr/mt-context`);\n protected static _worker?: Worker;\n protected static _registry: Record<string, AlwatrMultithreadContextSignal<unknown> | undefined> = {};\n\n static setupChannel(worker: Worker = self as unknown as Worker): void {\n AlwatrMultithreadContextSignal._worker = worker;\n worker.addEventListener('message', AlwatrMultithreadContextSignal._onMessage);\n }\n\n static _onMessage(event: MessageEvent): void {\n const message = event.data as AlwatrContextChangedMessage;\n if (message.type !== 'alwatr_context_changed') return;\n AlwatrMultithreadContextSignal._logger.logMethodArgs?.('_onMessage', {message});\n const context = AlwatrMultithreadContextSignal._registry[message.name];\n if (context === undefined) {\n throw new Error('context_not_define', {cause: 'context not define in this thread yet!'});\n }\n context._notify(message.payload);\n }\n\n static _postMessage(name: string, payload: unknown): void {\n AlwatrMultithreadContextSignal._logger.logMethodArgs?.('_postMessage', {name, payload});\n if (AlwatrMultithreadContextSignal._worker === undefined) {\n throw new Error('worker_not_defined', {cause: 'setupChannel must be called before any setValue.'});\n }\n AlwatrMultithreadContextSignal._worker.postMessage({\n type: 'alwatr_context_changed',\n name,\n payload,\n } as AlwatrContextChangedMessage);\n }\n\n constructor(config: {name: string; loggerPrefix?: string}) {\n super(config);\n\n if (AlwatrMultithreadContextSignal._registry[this._name] !== undefined) {\n throw new Error('context_name_exist');\n }\n\n AlwatrMultithreadContextSignal._registry[this._name] = this as AlwatrMultithreadContextSignal<unknown>;\n }\n\n /**\n * Set context value and notify all subscribers.\n */\n override setValue(value: TValue): void {\n super.setValue(value);\n AlwatrMultithreadContextSignal._postMessage(this._name, value);\n }\n}\n"]}
package/observable.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"observable.js","sourceRoot":"","sources":["src/observable.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, definePackage} from '@alwatr/logger';\n\nimport type {SubscribeOptions, ListenerCallback, Observer, SubscribeResult, AlwatrObservableInterface} from './type.js';\n\ndefinePackage('signal', '2.x');\n\n/**\n * Alwatr base signal.\n */\nexport abstract class AlwatrObservable<T> implements AlwatrObservableInterface<T> {\n protected _name;\n protected _logger;\n protected _$data?: T;\n protected _$observers: Observer<this, T>[] = [];\n\n constructor(config: {name: string; loggerPrefix?: string}) {\n config.loggerPrefix ??= 'signal';\n this._name = config.name;\n this._logger = createLogger(`{${config.loggerPrefix}: ${this._name}}`);\n this._logger.logMethod?.('constructor');\n }\n\n /**\n * Get data.\n *\n * Return undefined if signal not notify before or expired.\n */\n protected _getData(): T | undefined {\n this._logger.logMethodFull?.('_getData', {}, this._$data);\n return this._$data;\n }\n\n /**\n * Execute all observers and remember data.\n */\n protected _notify(data: T): void {\n this._logger.logMethodArgs?.('_notify', data);\n this._$data = data;\n setTimeout(() => this._$dispatch(data), 0);\n }\n\n /**\n * Execute all observers callback.\n */\n protected _$dispatch(data: T): void {\n const removeList: Observer<this, T>[] = [];\n\n for (const listener of this._$observers) {\n if (listener.options.disabled) continue;\n if (listener.options.once) removeList.push(listener);\n\n try {\n const ret = listener.callback.call(this, data);\n if (ret instanceof Promise) {\n ret.catch((err) => this._logger.error('_$dispatch', 'call_listener_failed', err));\n }\n }\n catch (err) {\n this._logger.error('_$dispatch', 'call_listener_failed', err);\n }\n }\n\n for (const listener of removeList) {\n this.unsubscribe(listener.callback);\n }\n }\n\n /**\n * Subscribe to context changes.\n */\n subscribe(listenerCallback: ListenerCallback<this, T>, options: SubscribeOptions = {}): SubscribeResult {\n this._logger.logMethodArgs?.('subscribe', {options});\n\n const _listenerObject: Observer<this, T> = {\n callback: listenerCallback,\n options,\n };\n\n let callbackExecuted = false;\n const data = this._$data;\n if (data !== undefined && options.receivePrevious === true && options.disabled !== true) {\n // Run callback for old dispatch signal\n callbackExecuted = true;\n setTimeout(() => {\n try {\n const ret = listenerCallback.call(this, data);\n if (ret instanceof Promise) {\n ret.catch((err) => this._logger.error('subscribe.receivePrevious', 'call_signal_callback_failed', err));\n }\n }\n catch (err) {\n this._logger.error('subscribe.receivePrevious', 'call_signal_callback_failed', err);\n }\n }, 0);\n }\n\n // If once then must remove listener after first callback called! then why push it to listenerList?!\n if (options.once !== true || callbackExecuted === true) {\n if (options.priority === true) {\n this._$observers.unshift(_listenerObject);\n }\n else {\n this._$observers.push(_listenerObject);\n }\n }\n\n return {\n unsubscribe: this.unsubscribe.bind(this, listenerCallback),\n };\n }\n\n /**\n * Unsubscribe from context.\n */\n unsubscribe(listenerCallback: ListenerCallback<this, T>): void {\n this._logger.logMethod?.('unsubscribe');\n const listenerIndex = this._$observers.findIndex((listener) => listener.callback === listenerCallback);\n if (listenerIndex !== -1) {\n void this._$observers.splice(listenerIndex, 1);\n }\n }\n\n /**\n * Clear current data without notify subscribers.\n *\n * `receivePrevious` in new subscribers not work until new a notify changes the data.\n */\n protected _clear(): void {\n this._logger.logMethod?.('_clear');\n this._$data = undefined;\n }\n\n /**\n * Get the data of next notify.\n */\n protected _untilNewNotify(): Promise<T> {\n this._logger.logMethod?.('_untilNewNotify');\n return new Promise((resolve) => {\n this.subscribe(resolve, {\n once: true,\n priority: true,\n receivePrevious: false,\n });\n });\n }\n}\n"]}
1
+ {"version":3,"file":"observable.js","sourceRoot":"","sources":["src/observable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAI3D,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAE/B;;GAEG;AACH,MAAM,OAAgB,gBAAgB;IAMpC,YAAY,MAA6C;QAF/C,gBAAW,GAAwB,EAAE,CAAC;QAG9C,MAAM,CAAC,YAAY,KAAnB,MAAM,CAAC,YAAY,GAAK,QAAQ,EAAC;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACO,QAAQ;QAChB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACO,OAAO,CAAC,IAAO;QACvB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACO,UAAU,CAAC,IAAO;QAC1B,MAAM,UAAU,GAAwB,EAAE,CAAC;QAE3C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ;gBAAE,SAAS;YACxC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI;gBAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAErD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC/C,IAAI,GAAG,YAAY,OAAO,EAAE,CAAC;oBAC3B,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;YACD,OAAO,GAAG,EAAE,CAAC;gBACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,gBAA2C,EAAE,UAA4B,EAAE;QACnF,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QAErD,MAAM,eAAe,GAAsB;YACzC,QAAQ,EAAE,gBAAgB;YAC1B,OAAO;SACR,CAAC;QAEF,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,eAAe,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACxF,uCAAuC;YACvC,gBAAgB,GAAG,IAAI,CAAC;YACxB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC9C,IAAI,GAAG,YAAY,OAAO,EAAE,CAAC;wBAC3B,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC1G,CAAC;gBACH,CAAC;gBACD,OAAO,GAAG,EAAE,CAAC;oBACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC;QAED,oGAAoG;QACpG,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC9B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC5C,CAAC;iBACI,CAAC;gBACJ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;SAC3D,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,gBAA2C;QACrD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC;QACvG,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,MAAM;QACd,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED;;OAEG;IACO,eAAe;QACvB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,iBAAiB,CAAC,CAAC;QAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;gBACtB,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import {createLogger, definePackage} from '@alwatr/logger';\n\nimport type {SubscribeOptions, ListenerCallback, Observer, SubscribeResult, AlwatrObservableInterface} from './type.js';\n\ndefinePackage('signal', '2.x');\n\n/**\n * Alwatr base signal.\n */\nexport abstract class AlwatrObservable<T> implements AlwatrObservableInterface<T> {\n protected _name;\n protected _logger;\n protected _$data?: T;\n protected _$observers: Observer<this, T>[] = [];\n\n constructor(config: {name: string; loggerPrefix?: string}) {\n config.loggerPrefix ??= 'signal';\n this._name = config.name;\n this._logger = createLogger(`{${config.loggerPrefix}: ${this._name}}`);\n this._logger.logMethod?.('constructor');\n }\n\n /**\n * Get data.\n *\n * Return undefined if signal not notify before or expired.\n */\n protected _getData(): T | undefined {\n this._logger.logMethodFull?.('_getData', {}, this._$data);\n return this._$data;\n }\n\n /**\n * Execute all observers and remember data.\n */\n protected _notify(data: T): void {\n this._logger.logMethodArgs?.('_notify', data);\n this._$data = data;\n setTimeout(() => this._$dispatch(data), 0);\n }\n\n /**\n * Execute all observers callback.\n */\n protected _$dispatch(data: T): void {\n const removeList: Observer<this, T>[] = [];\n\n for (const listener of this._$observers) {\n if (listener.options.disabled) continue;\n if (listener.options.once) removeList.push(listener);\n\n try {\n const ret = listener.callback.call(this, data);\n if (ret instanceof Promise) {\n ret.catch((err) => this._logger.error('_$dispatch', 'call_listener_failed', err));\n }\n }\n catch (err) {\n this._logger.error('_$dispatch', 'call_listener_failed', err);\n }\n }\n\n for (const listener of removeList) {\n this.unsubscribe(listener.callback);\n }\n }\n\n /**\n * Subscribe to context changes.\n */\n subscribe(listenerCallback: ListenerCallback<this, T>, options: SubscribeOptions = {}): SubscribeResult {\n this._logger.logMethodArgs?.('subscribe', {options});\n\n const _listenerObject: Observer<this, T> = {\n callback: listenerCallback,\n options,\n };\n\n let callbackExecuted = false;\n const data = this._$data;\n if (data !== undefined && options.receivePrevious === true && options.disabled !== true) {\n // Run callback for old dispatch signal\n callbackExecuted = true;\n setTimeout(() => {\n try {\n const ret = listenerCallback.call(this, data);\n if (ret instanceof Promise) {\n ret.catch((err) => this._logger.error('subscribe.receivePrevious', 'call_signal_callback_failed', err));\n }\n }\n catch (err) {\n this._logger.error('subscribe.receivePrevious', 'call_signal_callback_failed', err);\n }\n }, 0);\n }\n\n // If once then must remove listener after first callback called! then why push it to listenerList?!\n if (options.once !== true || callbackExecuted === true) {\n if (options.priority === true) {\n this._$observers.unshift(_listenerObject);\n }\n else {\n this._$observers.push(_listenerObject);\n }\n }\n\n return {\n unsubscribe: this.unsubscribe.bind(this, listenerCallback),\n };\n }\n\n /**\n * Unsubscribe from context.\n */\n unsubscribe(listenerCallback: ListenerCallback<this, T>): void {\n this._logger.logMethod?.('unsubscribe');\n const listenerIndex = this._$observers.findIndex((listener) => listener.callback === listenerCallback);\n if (listenerIndex !== -1) {\n void this._$observers.splice(listenerIndex, 1);\n }\n }\n\n /**\n * Clear current data without notify subscribers.\n *\n * `receivePrevious` in new subscribers not work until new a notify changes the data.\n */\n protected _clear(): void {\n this._logger.logMethod?.('_clear');\n this._$data = undefined;\n }\n\n /**\n * Get the data of next notify.\n */\n protected _untilNewNotify(): Promise<T> {\n this._logger.logMethod?.('_untilNewNotify');\n return new Promise((resolve) => {\n this.subscribe(resolve, {\n once: true,\n priority: true,\n receivePrevious: false,\n });\n });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alwatr/signal",
3
- "version": "2.0.3",
3
+ "version": "2.0.5",
4
4
  "description": "Elegant powerful event system for handle global signals and states written in tiny TypeScript module.",
5
5
  "keywords": [
6
6
  "signal",
@@ -29,13 +29,13 @@
29
29
  "url": "https://github.com/Alwatr/signal/issues"
30
30
  },
31
31
  "dependencies": {
32
- "@alwatr/logger": "^2.1.3",
33
- "@alwatr/type": "^1.1.5",
34
- "@alwatr/util": "^1.2.10",
32
+ "@alwatr/logger": "^2.4.1",
33
+ "@alwatr/type": "^1.2.4",
34
+ "@alwatr/util": "^1.4.1",
35
35
  "tslib": "^2.6.2"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/node": "^20.9.0"
38
+ "@types/node": "^20.10.5"
39
39
  },
40
- "gitHead": "863c678c0921b312f0155c212326945804e5d701"
40
+ "gitHead": "bb15a99985f6643ab3435db3cec31ba39cc9c616"
41
41
  }