@alwatr/signal 0.25.0 → 0.26.1

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,21 @@
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
+ ## [0.26.1](https://github.com/AliMD/alwatr/compare/v0.26.0...v0.26.1) (2022-12-25)
7
+
8
+ **Note:** Version bump only for package @alwatr/signal
9
+
10
+ # [0.26.0](https://github.com/AliMD/alwatr/compare/v0.25.0...v0.26.0) (2022-12-22)
11
+
12
+ ### Bug Fixes
13
+
14
+ - set correct path ([d01ce6f](https://github.com/AliMD/alwatr/commit/d01ce6ffa749a5e3e0e11e35b4ed61d75d61fec9))
15
+ - tsconfig ([e96dcd3](https://github.com/AliMD/alwatr/commit/e96dcd30774a9f06f7d051e0504192cbbe019e35))
16
+
17
+ ### Features
18
+
19
+ - improve error debugging ([1fba504](https://github.com/AliMD/alwatr/commit/1fba50400a1e8ececc10bbe8ea11cc8dcea2289c))
20
+
6
21
  # [0.25.0](https://github.com/AliMD/alwatr/compare/v0.24.1...v0.25.0) (2022-12-07)
7
22
 
8
23
  **Note:** Version bump only for package @alwatr/signal
package/core.js CHANGED
@@ -48,13 +48,13 @@ function __callListeners(signal) {
48
48
  try {
49
49
  const ret = listener.callback(signal.value);
50
50
  if (ret instanceof Promise) {
51
- ret.catch((err) => logger.error('_callListeners', 'call_listener_failed', err.stack || err, {
51
+ ret.catch((err) => logger.error('_callListeners', 'call_listener_failed', err, {
52
52
  signalName: signal.name,
53
53
  }));
54
54
  }
55
55
  }
56
56
  catch (err) {
57
- logger.error('_callListeners', 'call_listener_failed', err.stack || err, {
57
+ logger.error('_callListeners', 'call_listener_failed', err, {
58
58
  signalName: signal.name,
59
59
  });
60
60
  }
@@ -99,7 +99,7 @@ export function _addSignalListener(signal, listenerCallback, options = {}) {
99
99
  listenerCallback(signal.value);
100
100
  }
101
101
  catch (err) {
102
- logger.error('_addSignalListener', 'call_signal_callback_failed', err.stack || err, {
102
+ logger.error('_addSignalListener', 'call_signal_callback_failed', err, {
103
103
  signalName: signal.name,
104
104
  });
105
105
  }
package/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, alwatrRegisteredList} from '@alwatr/logger';\n\nimport type {\n DispatchOptions,\n ListenerCallback,\n ListenerObject,\n ListenerOptions,\n SignalObject,\n SignalProvider,\n SignalProviderOptions,\n SignalStack,\n} from './type.js';\n\nexport const logger = createLogger('alwatr/signal');\n\nalwatrRegisteredList.push({\n name: '@alwatr/signal',\n version: '{{ALWATR_VERSION}}',\n});\n\n/**\n * Listener `id`\n */\nlet _lastListenerId = 0;\n\n/**\n * Signal stack database.\n */\nconst _signalStack: SignalStack = {};\n\n/**\n * Get signal object by name, If not available, it will create a new signal with default options.\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change');\n * signal.disabled = true;\n * ```\n */\nexport function _getSignalObject<SignalName extends keyof AlwatrSignals>(\n signalName: SignalName,\n): SignalObject<SignalName> {\n if (!_signalStack[signalName]) {\n _signalStack[signalName] = {\n name: signalName,\n disabled: false,\n debounced: false,\n listenerList: [],\n };\n }\n return _signalStack[signalName] as unknown as SignalObject<SignalName>;\n}\n\nfunction __callListeners<SignalName extends keyof AlwatrSignals>(signal: SignalObject<SignalName>): void {\n logger.logMethodArgs('_callListeners', {signalName: signal.name, signalValue: signal.value});\n if (signal.value === undefined) {\n // null is a valid value for signal.\n logger.accident('_callListeners', 'no_signal_value', 'signal must have a value', {\n signalName: signal.name,\n });\n return;\n }\n\n for (const listener of signal.listenerList) {\n if (listener.disabled) continue;\n try {\n const ret = listener.callback(signal.value);\n if (ret instanceof Promise) {\n ret.catch((err) =>\n logger.error('_callListeners', 'call_listener_failed', (err as Error).stack || err, {\n signalName: signal.name,\n }),\n );\n }\n }\n catch (err) {\n logger.error('_callListeners', 'call_listener_failed', (err as Error).stack || err, {\n signalName: signal.name,\n });\n }\n }\n\n signal.listenerList\n .filter((listener) => !listener.disabled && listener.once)\n .forEach((listener) => _removeSignalListener(signal, listener.id));\n}\n\n/**\n * Adds a new listener to the signal.\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change')\n * const listener = _addSignalListener(signal, (content) => console.log(content));\n * ```\n */\nexport function _addSignalListener<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n listenerCallback: ListenerCallback<SignalName>,\n options: ListenerOptions = {},\n): ListenerObject<SignalName> {\n options.once ??= false;\n options.disabled ??= false;\n options.receivePrevious ??= true;\n options.priority ??= false;\n\n logger.logMethodArgs('_addSignalListener', {signalName: signal.name, options});\n\n const listener: ListenerObject<SignalName> = {\n id: ++_lastListenerId,\n once: options.once,\n disabled: options.disabled,\n callback: listenerCallback,\n };\n\n let callbackCalled = false;\n\n // Run callback for old dispatch signal\n if (signal.value !== undefined) {\n // null is a valid value for signal.\n if (options.receivePrevious === 'Immediate') {\n logger.incident('_addSignalListener', 'call_signal_callback', 'run callback with previous signal value', {\n signalName: signal.name,\n mode: 'Immediate',\n });\n try {\n listenerCallback(signal.value);\n }\n catch (err) {\n logger.error('_addSignalListener', 'call_signal_callback_failed', (err as Error).stack || err, {\n signalName: signal.name,\n });\n }\n callbackCalled = true;\n }\n else if (options.receivePrevious === true) {\n requestAnimationFrame(() => {\n if (signal.value !== undefined) {\n // null is a valid value for signal.\n logger.incident('_addSignalListener', 'call_signal_callback', 'run callback with previous signal value', {\n signalName: signal.name,\n mode: 'Delay',\n });\n listenerCallback(signal.value);\n }\n });\n callbackCalled = true; // must be outside of requestAnimationFrame.\n }\n }\n\n // if once then must remove listener after fist callback called! then why push it to listenerList?!\n if (!(options.once === true && callbackCalled === true)) {\n if (options.priority === true) {\n signal.listenerList.unshift(listener);\n }\n else {\n signal.listenerList.push(listener);\n }\n }\n\n return listener;\n}\n\n/**\n * Removes a listener from the signal.\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change')\n * const listener = _addSignalListener(signal, ...);\n * _removeSignalListener(signal, listener);\n * ```\n */\nexport function _removeSignalListener<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n listenerId: number,\n): void {\n logger.logMethodArgs('_removeSignalListener', {signalName: signal.name, listenerId});\n const listenerIndex = signal.listenerList.findIndex((_listener) => _listener.id === listenerId);\n if (listenerIndex !== -1) {\n signal.listenerList.splice(listenerIndex, 1);\n }\n}\n\n/**\n * Dispatch (send) signal to all listeners.\n *\n * @example\n * const signal = _getSignalObject('content-change')\n * _dispatchSignal(signal, content);\n */\nexport function _dispatchSignal<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n value: AlwatrSignals[SignalName],\n options: DispatchOptions = {},\n): void {\n options.debounce ??= true;\n\n logger.logMethodArgs('dispatchSignal', {signalName: signal.name, value, options});\n\n // set value before check signal.debounced for act like throttle (call listeners with last dispatch value).\n signal.value = value;\n\n if (signal.disabled) return; // signal is disabled.\n if (options.debounce === true && signal.debounced === true) return; // last dispatch in progress.\n\n if (options.debounce !== true) {\n // call listeners immediately.\n __callListeners(signal);\n return;\n }\n // else: call listeners in next frame.\n signal.debounced = true;\n requestAnimationFrame(() => {\n __callListeners(signal);\n signal.debounced = false;\n });\n}\n\n/**\n * Defines the provider of the signal that will be called when the signal requested (addRequestSignalListener).\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change');\n * const requestSignal = _getSignalObject('request-content-change');\n * _setSignalProvider(signal, requestSignal, async (requestParam) => {\n * const content = await fetchNewContent(requestParam);\n * if (content != null) {\n * return content; // dispatchSignal('content-change', content);\n * }\n * else {\n * dispatchSignal('content-not-found');\n * }\n * }\n * ```\n */\nexport function _setSignalProvider<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n requestSignal: SignalObject<SignalName>,\n signalProvider: SignalProvider<SignalName>,\n options: SignalProviderOptions = {},\n): ListenerObject<SignalName> {\n options.debounce ??= true;\n options.receivePrevious ??= true;\n\n logger.logMethodArgs('_setSignalProvider', {signal: signal.name, requestSignal: requestSignal.name, options});\n\n if (requestSignal.listenerList.length > 0) {\n logger.accident(\n '_setSignalProvider',\n 'another_signal_provider_exist',\n 'Another provider exist! It will be removed to fix the problem',\n {\n signalName: signal.name,\n },\n );\n requestSignal.listenerList = [];\n }\n\n const _callback = async (requestParam: AlwatrRequestSignals[SignalName]): Promise<void> => {\n const signalValue = await signalProvider(requestParam);\n if (signalValue !== undefined) {\n // null is a valid value for signal.\n _dispatchSignal(signal, signalValue, {debounce: options.debounce});\n }\n };\n\n return _addSignalListener(requestSignal, _callback as unknown as ListenerCallback<SignalName>, {\n receivePrevious: options.receivePrevious,\n });\n}\n"]}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, alwatrRegisteredList} from '@alwatr/logger';\n\nimport type {\n DispatchOptions,\n ListenerCallback,\n ListenerObject,\n ListenerOptions,\n SignalObject,\n SignalProvider,\n SignalProviderOptions,\n SignalStack,\n} from './type.js';\n\nexport const logger = createLogger('alwatr/signal');\n\nalwatrRegisteredList.push({\n name: '@alwatr/signal',\n version: '{{ALWATR_VERSION}}',\n});\n\n/**\n * Listener `id`\n */\nlet _lastListenerId = 0;\n\n/**\n * Signal stack database.\n */\nconst _signalStack: SignalStack = {};\n\n/**\n * Get signal object by name, If not available, it will create a new signal with default options.\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change');\n * signal.disabled = true;\n * ```\n */\nexport function _getSignalObject<SignalName extends keyof AlwatrSignals>(\n signalName: SignalName,\n): SignalObject<SignalName> {\n if (!_signalStack[signalName]) {\n _signalStack[signalName] = {\n name: signalName,\n disabled: false,\n debounced: false,\n listenerList: [],\n };\n }\n return _signalStack[signalName] as unknown as SignalObject<SignalName>;\n}\n\nfunction __callListeners<SignalName extends keyof AlwatrSignals>(signal: SignalObject<SignalName>): void {\n logger.logMethodArgs('_callListeners', {signalName: signal.name, signalValue: signal.value});\n if (signal.value === undefined) {\n // null is a valid value for signal.\n logger.accident('_callListeners', 'no_signal_value', 'signal must have a value', {\n signalName: signal.name,\n });\n return;\n }\n\n for (const listener of signal.listenerList) {\n if (listener.disabled) continue;\n try {\n const ret = listener.callback(signal.value);\n if (ret instanceof Promise) {\n ret.catch((err) =>\n logger.error('_callListeners', 'call_listener_failed', err, {\n signalName: signal.name,\n }),\n );\n }\n }\n catch (err) {\n logger.error('_callListeners', 'call_listener_failed', err, {\n signalName: signal.name,\n });\n }\n }\n\n signal.listenerList\n .filter((listener) => !listener.disabled && listener.once)\n .forEach((listener) => _removeSignalListener(signal, listener.id));\n}\n\n/**\n * Adds a new listener to the signal.\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change')\n * const listener = _addSignalListener(signal, (content) => console.log(content));\n * ```\n */\nexport function _addSignalListener<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n listenerCallback: ListenerCallback<SignalName>,\n options: ListenerOptions = {},\n): ListenerObject<SignalName> {\n options.once ??= false;\n options.disabled ??= false;\n options.receivePrevious ??= true;\n options.priority ??= false;\n\n logger.logMethodArgs('_addSignalListener', {signalName: signal.name, options});\n\n const listener: ListenerObject<SignalName> = {\n id: ++_lastListenerId,\n once: options.once,\n disabled: options.disabled,\n callback: listenerCallback,\n };\n\n let callbackCalled = false;\n\n // Run callback for old dispatch signal\n if (signal.value !== undefined) {\n // null is a valid value for signal.\n if (options.receivePrevious === 'Immediate') {\n logger.incident('_addSignalListener', 'call_signal_callback', 'run callback with previous signal value', {\n signalName: signal.name,\n mode: 'Immediate',\n });\n try {\n listenerCallback(signal.value);\n }\n catch (err) {\n logger.error('_addSignalListener', 'call_signal_callback_failed', err, {\n signalName: signal.name,\n });\n }\n callbackCalled = true;\n }\n else if (options.receivePrevious === true) {\n requestAnimationFrame(() => {\n if (signal.value !== undefined) {\n // null is a valid value for signal.\n logger.incident('_addSignalListener', 'call_signal_callback', 'run callback with previous signal value', {\n signalName: signal.name,\n mode: 'Delay',\n });\n listenerCallback(signal.value);\n }\n });\n callbackCalled = true; // must be outside of requestAnimationFrame.\n }\n }\n\n // if once then must remove listener after fist callback called! then why push it to listenerList?!\n if (!(options.once === true && callbackCalled === true)) {\n if (options.priority === true) {\n signal.listenerList.unshift(listener);\n }\n else {\n signal.listenerList.push(listener);\n }\n }\n\n return listener;\n}\n\n/**\n * Removes a listener from the signal.\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change')\n * const listener = _addSignalListener(signal, ...);\n * _removeSignalListener(signal, listener);\n * ```\n */\nexport function _removeSignalListener<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n listenerId: number,\n): void {\n logger.logMethodArgs('_removeSignalListener', {signalName: signal.name, listenerId});\n const listenerIndex = signal.listenerList.findIndex((_listener) => _listener.id === listenerId);\n if (listenerIndex !== -1) {\n signal.listenerList.splice(listenerIndex, 1);\n }\n}\n\n/**\n * Dispatch (send) signal to all listeners.\n *\n * @example\n * const signal = _getSignalObject('content-change')\n * _dispatchSignal(signal, content);\n */\nexport function _dispatchSignal<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n value: AlwatrSignals[SignalName],\n options: DispatchOptions = {},\n): void {\n options.debounce ??= true;\n\n logger.logMethodArgs('dispatchSignal', {signalName: signal.name, value, options});\n\n // set value before check signal.debounced for act like throttle (call listeners with last dispatch value).\n signal.value = value;\n\n if (signal.disabled) return; // signal is disabled.\n if (options.debounce === true && signal.debounced === true) return; // last dispatch in progress.\n\n if (options.debounce !== true) {\n // call listeners immediately.\n __callListeners(signal);\n return;\n }\n // else: call listeners in next frame.\n signal.debounced = true;\n requestAnimationFrame(() => {\n __callListeners(signal);\n signal.debounced = false;\n });\n}\n\n/**\n * Defines the provider of the signal that will be called when the signal requested (addRequestSignalListener).\n *\n * Example:\n *\n * ```ts\n * const signal = _getSignalObject('content-change');\n * const requestSignal = _getSignalObject('request-content-change');\n * _setSignalProvider(signal, requestSignal, async (requestParam) => {\n * const content = await fetchNewContent(requestParam);\n * if (content != null) {\n * return content; // dispatchSignal('content-change', content);\n * }\n * else {\n * dispatchSignal('content-not-found');\n * }\n * }\n * ```\n */\nexport function _setSignalProvider<SignalName extends keyof AlwatrSignals>(\n signal: SignalObject<SignalName>,\n requestSignal: SignalObject<SignalName>,\n signalProvider: SignalProvider<SignalName>,\n options: SignalProviderOptions = {},\n): ListenerObject<SignalName> {\n options.debounce ??= true;\n options.receivePrevious ??= true;\n\n logger.logMethodArgs('_setSignalProvider', {signal: signal.name, requestSignal: requestSignal.name, options});\n\n if (requestSignal.listenerList.length > 0) {\n logger.accident(\n '_setSignalProvider',\n 'another_signal_provider_exist',\n 'Another provider exist! It will be removed to fix the problem',\n {\n signalName: signal.name,\n },\n );\n requestSignal.listenerList = [];\n }\n\n const _callback = async (requestParam: AlwatrRequestSignals[SignalName]): Promise<void> => {\n const signalValue = await signalProvider(requestParam);\n if (signalValue !== undefined) {\n // null is a valid value for signal.\n _dispatchSignal(signal, signalValue, {debounce: options.debounce});\n }\n };\n\n return _addSignalListener(requestSignal, _callback as unknown as ListenerCallback<SignalName>, {\n receivePrevious: options.receivePrevious,\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alwatr/signal",
3
- "version": "0.25.0",
3
+ "version": "0.26.1",
4
4
  "description": "Elegant powerful event system for handle global signals and states written in tiny TypeScript module.",
5
5
  "keywords": [
6
6
  "signal",
@@ -25,15 +25,15 @@
25
25
  "repository": {
26
26
  "type": "git",
27
27
  "url": "https://github.com/AliMD/alwatr",
28
- "directory": "packages/core/signal"
28
+ "directory": "core/signal"
29
29
  },
30
- "homepage": "https://github.com/AliMD/alwatr/tree/main/packages/core/signal#readme",
30
+ "homepage": "https://github.com/AliMD/alwatr/tree/main/core/signal#readme",
31
31
  "bugs": {
32
32
  "url": "https://github.com/AliMD/alwatr/issues"
33
33
  },
34
34
  "dependencies": {
35
- "@alwatr/logger": "^0.25.0",
35
+ "@alwatr/logger": "^0.26.1",
36
36
  "tslib": "~2.4.1"
37
37
  },
38
- "gitHead": "03cf3c146f075309527bcf1e762a589696d0ce1d"
38
+ "gitHead": "73d4fc82563cd616ccb9b5b4ab7eb94870a4c51b"
39
39
  }
package/signal.d.ts CHANGED
@@ -3,9 +3,9 @@ import type { ListenerOptions, DispatchOptions, ListenerCallback, SignalProvider
3
3
  * Signal API interface as a remote controller.
4
4
  */
5
5
  export declare class SignalInterface<SignalName extends keyof AlwatrSignals> {
6
- protected _signal: any;
7
- protected _requestSignal: any;
8
- protected _logger: any;
6
+ protected _signal: SignalObject<SignalName>;
7
+ protected _requestSignal: SignalObject<SignalName>;
8
+ protected _logger: import("@alwatr/logger").AlwatrLogger;
9
9
  constructor(signalName: SignalName);
10
10
  /**
11
11
  * Get signal name.
@@ -159,7 +159,7 @@ export declare class SignalInterface<SignalName extends keyof AlwatrSignals> {
159
159
  export declare class ListenerInterface<SignalName extends keyof AlwatrSignals> {
160
160
  protected _signal: SignalObject<SignalName>;
161
161
  protected _listener: ListenerObject<SignalName>;
162
- protected _logger: any;
162
+ protected _logger: import("@alwatr/logger").AlwatrLogger;
163
163
  constructor(_signal: SignalObject<SignalName>, _listener: ListenerObject<SignalName>);
164
164
  /**
165
165
  * Disable the listener, not called anymore.
package/signal.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["src/signal.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,YAAY,EACb,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,qBAAa,eAAe,CAAC,UAAU,SAAS,MAAM,aAAa;IACjE,SAAS,CAAC,OAAO,MAAC;IAClB,SAAS,CAAC,cAAc,MAAC;IACzB,SAAS,CAAC,OAAO,MAAC;gBAEN,UAAU,EAAE,UAAU;IAMlC;;;;;;;;OAQG;IACH,IAAI,IAAI,IAAI,UAAU,CAErB;IAED;;;;;;;;;;;;OAYG;IACH,IAAI,KAAK,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,CAEjD;IAED;;;;;;;;;;;OAWG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAG7B;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,IAAI,IAAI;IAKd;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CACP,cAAc,EAAE,cAAc,CAAC,UAAU,CAAC,EAC1C,OAAO,CAAC,EAAE,qBAAqB,GAChC,iBAAiB,CAAC,UAAU,CAAC;IAMhC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,YAAY,EAAE,oBAAoB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAU3F;;;;;;;;;;OAUG;IACH,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAWxD;;;;;;;;;;;;OAYG;IACH,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAUpD;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAKjF;;;;;;;;;OASG;IACH,WAAW,CACP,gBAAgB,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAC9C,OAAO,CAAC,EAAE,eAAe,GAC1B,iBAAiB,CAAC,UAAU,CAAC;CAKjC;AAED;;GAEG;AACH,qBAAa,iBAAiB,CAAC,UAAU,SAAS,MAAM,aAAa;IAEvD,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC;IAAE,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC;IADxG,SAAS,CAAC,OAAO,MAAC;gBACI,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,EAAY,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC;IAIxG;;;;;;;;;;OAUG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAG7B;IAED;;;;;;;;;;;OAWG;IACH,MAAM,IAAI,IAAI;CAIf"}
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["src/signal.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,YAAY,EACb,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,qBAAa,eAAe,CAAC,UAAU,SAAS,MAAM,aAAa;IACjE,SAAS,CAAC,OAAO,2BAAC;IAClB,SAAS,CAAC,cAAc,2BAAC;IACzB,SAAS,CAAC,OAAO,wCAAC;gBAEN,UAAU,EAAE,UAAU;IAMlC;;;;;;;;OAQG;IACH,IAAI,IAAI,IAAI,UAAU,CAErB;IAED;;;;;;;;;;;;OAYG;IACH,IAAI,KAAK,IAAI,aAAa,CAAC,UAAU,CAAC,GAAG,SAAS,CAEjD;IAED;;;;;;;;;;;OAWG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAG7B;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,IAAI,IAAI;IAKd;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CACP,cAAc,EAAE,cAAc,CAAC,UAAU,CAAC,EAC1C,OAAO,CAAC,EAAE,qBAAqB,GAChC,iBAAiB,CAAC,UAAU,CAAC;IAMhC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,YAAY,EAAE,oBAAoB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAU3F;;;;;;;;;;OAUG;IACH,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAWxD;;;;;;;;;;;;OAYG;IACH,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAUpD;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAKjF;;;;;;;;;OASG;IACH,WAAW,CACP,gBAAgB,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAC9C,OAAO,CAAC,EAAE,eAAe,GAC1B,iBAAiB,CAAC,UAAU,CAAC;CAKjC;AAED;;GAEG;AACH,qBAAa,iBAAiB,CAAC,UAAU,SAAS,MAAM,aAAa;IAEvD,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC;IAAE,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC;IADxG,SAAS,CAAC,OAAO,wCAAC;gBACI,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,EAAY,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC;IAIxG;;;;;;;;;;OAUG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAG7B;IAED;;;;;;;;;;;OAWG;IACH,MAAM,IAAI,IAAI;CAIf"}
package/signal.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"signal.js","sourceRoot":"","sources":["src/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAYnB;;GAEG;AACH,MAAM,OAAO,eAAe;IAK1B,YAAY,UAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,UAAU,UAAU,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,WAAW,UAAU,EAA2B,CAAC,CAAC;IAC3F,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,IAAI,UAAU;QACZ,OAAO,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;IACjC,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,CAAC,QAAiB;QAC5B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM;QACJ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CACP,cAA0C,EAC1C,OAA+B;QAEjC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAChG,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,YAA8C;QACpD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,EAAC,YAAY,EAAC,CAAC,CAAC;QACtD,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACzD,eAAe,CACX,IAAI,CAAC,cAAc,EACrB,YAAoD,CACrD,CAAC;QACF,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED;;;;;;;;;;OAUG;IACH,kBAAkB;QAChB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;gBACxB,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,cAAc;QACZ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE;YACpC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC5C;aACI;YACH,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAClC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAsC,EAAE,OAAyB;QACxE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,EAAC,WAAW,EAAE,OAAO,EAAC,CAAC,CAAC;QAC/D,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CACP,gBAA8C,EAC9C,OAAyB;QAE3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,EAAE,EAAC,OAAO,EAAC,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAE5B,YAAsB,OAAiC,EAAY,SAAqC;QAAlF,YAAO,GAAP,OAAO,CAA0B;QAAY,cAAS,GAAT,SAAS,CAA4B;QACtG,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;IACjC,CAAC;IACD,IAAI,QAAQ,CAAC,QAAiB;QAC5B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM;QACJ,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;CACF","sourcesContent":["import {createLogger} from '@alwatr/logger';\n\nimport {\n _getSignalObject,\n _removeSignalListener,\n _setSignalProvider,\n _dispatchSignal,\n _addSignalListener,\n} from './core.js';\n\nimport type {\n ListenerOptions,\n DispatchOptions,\n ListenerCallback,\n SignalProvider,\n SignalProviderOptions,\n ListenerObject,\n SignalObject,\n} from './type.js';\n\n/**\n * Signal API interface as a remote controller.\n */\nexport class SignalInterface<SignalName extends keyof AlwatrSignals> {\n protected _signal;\n protected _requestSignal;\n protected _logger;\n\n constructor(signalName: SignalName) {\n this._logger = createLogger(`signal<${signalName}>`);\n this._signal = _getSignalObject(signalName);\n this._requestSignal = _getSignalObject(`request-${signalName}` as unknown as SignalName);\n }\n\n /**\n * Get signal name.\n *\n * Example:\n *\n * ```ts\n * console.log(contentChangeSignal.name);\n * ```\n */\n get name(): SignalName {\n return this._signal.name;\n }\n\n /**\n * Get last dispatched signal value or undefined.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * if (contentChangeSignal.dispatched) {\n * const content = contentChangeSignal.value!;\n * ...\n * }\n * ```\n */\n get value(): AlwatrSignals[SignalName] | undefined {\n return this._signal.value;\n }\n\n /**\n * Check signal dispatched before or not!\n *\n * Example\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * if(contentChangeSignal.dispatched) {\n * // contentChangeSignal.value exist.\n * }\n * ```\n */\n get dispatched(): boolean {\n return 'value' in this._signal;\n }\n\n /**\n * Disable signal, all dispatch's ignored (just value updated) and no more listeners will be called.\n *\n * Example:\n *\n * ```ts\n * contentChangeSignal.disabled = true;\n * ```\n */\n get disabled(): boolean {\n return this._signal.disabled;\n }\n set disabled(disabled: boolean) {\n this._logger.logProperty('disabled', disabled);\n this._signal.disabled = disabled;\n }\n\n /**\n * Expire the signal by clear last dispatched value.\n *\n * dispatched and receivePrevious etc not work until new signal.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * contentChangeSignal.dispatched; // true\n * contentChangeSignal.expire();\n * contentChangeSignal.value; // undefined\n * contentChangeSignal.dispatched; // false\n * ```\n */\n expire(): void {\n this._logger.logMethod('expire');\n delete this._signal.value;\n }\n\n /**\n * Defines the provider of the signal that will be called when the signal requested (addRequestSignalListener).\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * contentChangeSignal.setProvider(async (requestParam) => {\n * const content = await fetchNewContent(requestParam);\n * if (content != null) {\n * return content; // Dispatch signal 'content-change' with content.\n * }\n * else {\n * // dispatch new signal: 'content-not-found'\n * }\n * });\n * ```\n */\n setProvider(\n signalProvider: SignalProvider<SignalName>,\n options?: SignalProviderOptions,\n ): ListenerInterface<SignalName> {\n this._logger.logMethodArgs('setProvider', {options});\n const listener = _setSignalProvider(this._signal, this._requestSignal, signalProvider, options);\n return new ListenerInterface(this._requestSignal, listener);\n }\n\n /**\n * Dispatch request signal and wait for answer (wait for new signal dispatched).\n *\n * Resolved with signal value when new signal received (getNextSignalValue).\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * // dispatch request signal and wait for answer (wait for NEW signal).\n * const newContent = await contentChangeSignal.request({foo: 'bar'});\n * ```\n */\n request(requestParam: AlwatrRequestSignals[SignalName]): Promise<AlwatrSignals[SignalName]> {\n this._logger.logMethodArgs('request', {requestParam});\n const nextSignalValuePromise = this.getNextSignalValue();\n _dispatchSignal(\n this._requestSignal,\n requestParam as unknown as AlwatrSignals[SignalName], // mastmalize to avoid type error\n );\n return nextSignalValuePromise;\n }\n\n /**\n * Resolved with signal value when new signal received.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * // Wait for NEW signal received.\n * const newContent = await contentChangeSignal.getNextSignalValue();\n * ```\n */\n getNextSignalValue(): Promise<AlwatrSignals[SignalName]> {\n this._logger.logMethod('getNextSignalValue');\n return new Promise((resolve) => {\n this.addListener(resolve, {\n once: true,\n priority: true,\n receivePrevious: false,\n });\n });\n }\n\n /**\n * Resolved with signal value when signal is ready.\n *\n * Get signal value from last dispatched signal (if any) or wait for new signal received.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * // get signal value from last dispatched signal (if any) or wait new signal received.\n * const content = await contentChangeSignal.getSignalValue();\n * ```\n */\n getSignalValue(): Promise<AlwatrSignals[SignalName]> {\n this._logger.logMethod('getSignalValue');\n if (this._signal.value !== undefined) {\n return Promise.resolve(this._signal.value);\n }\n else {\n return this.getNextSignalValue();\n }\n }\n\n /**\n * Dispatch signal to all listeners.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * contentChangeSignal.dispatch(content);\n * ```\n */\n dispatch(signalValue: AlwatrSignals[SignalName], options?: DispatchOptions): void {\n this._logger.logMethodArgs('dispatch', {signalValue, options});\n _dispatchSignal(this._signal, signalValue, options);\n }\n\n /**\n * Adds a new listener to the signal.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * const listener = contentChangeSignal.addListener((content) => console.log(content));\n * ```\n */\n addListener(\n listenerCallback: ListenerCallback<SignalName>,\n options?: ListenerOptions,\n ): ListenerInterface<SignalName> {\n this._logger.logMethodArgs('addListener', {options});\n const listener = _addSignalListener(this._signal, listenerCallback, options);\n return new ListenerInterface(this._signal, listener);\n }\n}\n\n/**\n * Signal Listener API interface as a remote controller.\n */\nexport class ListenerInterface<SignalName extends keyof AlwatrSignals> {\n protected _logger;\n constructor(protected _signal: SignalObject<SignalName>, protected _listener: ListenerObject<SignalName>) {\n this._logger = createLogger('Listener of ' + _signal.name);\n }\n\n /**\n * Disable the listener, not called anymore.\n *\n * Example:\n *\n * ```ts\n * const listener = contentChangeSignal.addListener((content) => console.log(content));\n * ...\n * listener.disabled = true;\n * ```\n */\n get disabled(): boolean {\n return this._listener.disabled;\n }\n set disabled(disabled: boolean) {\n this._logger.logProperty('disabled', disabled);\n this._listener.disabled = disabled;\n }\n\n /**\n * Removes a listener from the signal.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * const listener = contentChangeSignal.addListener((content) => console.log(content));\n * ...\n * listener.remove();\n * ```\n */\n remove(): void {\n this._logger.logMethod('remove');\n _removeSignalListener(this._signal, this._listener.id);\n }\n}\n"]}
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["src/signal.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger} from '@alwatr/logger';\n\nimport {\n _getSignalObject,\n _removeSignalListener,\n _setSignalProvider,\n _dispatchSignal,\n _addSignalListener,\n} from './core.js';\n\nimport type {\n ListenerOptions,\n DispatchOptions,\n ListenerCallback,\n SignalProvider,\n SignalProviderOptions,\n ListenerObject,\n SignalObject,\n} from './type.js';\n\n/**\n * Signal API interface as a remote controller.\n */\nexport class SignalInterface<SignalName extends keyof AlwatrSignals> {\n protected _signal;\n protected _requestSignal;\n protected _logger;\n\n constructor(signalName: SignalName) {\n this._logger = createLogger(`signal<${signalName}>`);\n this._signal = _getSignalObject(signalName);\n this._requestSignal = _getSignalObject(`request-${signalName}` as unknown as SignalName);\n }\n\n /**\n * Get signal name.\n *\n * Example:\n *\n * ```ts\n * console.log(contentChangeSignal.name);\n * ```\n */\n get name(): SignalName {\n return this._signal.name;\n }\n\n /**\n * Get last dispatched signal value or undefined.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * if (contentChangeSignal.dispatched) {\n * const content = contentChangeSignal.value!;\n * ...\n * }\n * ```\n */\n get value(): AlwatrSignals[SignalName] | undefined {\n return this._signal.value;\n }\n\n /**\n * Check signal dispatched before or not!\n *\n * Example\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * if(contentChangeSignal.dispatched) {\n * // contentChangeSignal.value exist.\n * }\n * ```\n */\n get dispatched(): boolean {\n return 'value' in this._signal;\n }\n\n /**\n * Disable signal, all dispatch's ignored (just value updated) and no more listeners will be called.\n *\n * Example:\n *\n * ```ts\n * contentChangeSignal.disabled = true;\n * ```\n */\n get disabled(): boolean {\n return this._signal.disabled;\n }\n set disabled(disabled: boolean) {\n this._logger.logProperty('disabled', disabled);\n this._signal.disabled = disabled;\n }\n\n /**\n * Expire the signal by clear last dispatched value.\n *\n * dispatched and receivePrevious etc not work until new signal.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * contentChangeSignal.dispatched; // true\n * contentChangeSignal.expire();\n * contentChangeSignal.value; // undefined\n * contentChangeSignal.dispatched; // false\n * ```\n */\n expire(): void {\n this._logger.logMethod('expire');\n delete this._signal.value;\n }\n\n /**\n * Defines the provider of the signal that will be called when the signal requested (addRequestSignalListener).\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * contentChangeSignal.setProvider(async (requestParam) => {\n * const content = await fetchNewContent(requestParam);\n * if (content != null) {\n * return content; // Dispatch signal 'content-change' with content.\n * }\n * else {\n * // dispatch new signal: 'content-not-found'\n * }\n * });\n * ```\n */\n setProvider(\n signalProvider: SignalProvider<SignalName>,\n options?: SignalProviderOptions,\n ): ListenerInterface<SignalName> {\n this._logger.logMethodArgs('setProvider', {options});\n const listener = _setSignalProvider(this._signal, this._requestSignal, signalProvider, options);\n return new ListenerInterface(this._requestSignal, listener);\n }\n\n /**\n * Dispatch request signal and wait for answer (wait for new signal dispatched).\n *\n * Resolved with signal value when new signal received (getNextSignalValue).\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * // dispatch request signal and wait for answer (wait for NEW signal).\n * const newContent = await contentChangeSignal.request({foo: 'bar'});\n * ```\n */\n request(requestParam: AlwatrRequestSignals[SignalName]): Promise<AlwatrSignals[SignalName]> {\n this._logger.logMethodArgs('request', {requestParam});\n const nextSignalValuePromise = this.getNextSignalValue();\n _dispatchSignal(\n this._requestSignal,\n requestParam as unknown as AlwatrSignals[SignalName], // mastmalize to avoid type error\n );\n return nextSignalValuePromise;\n }\n\n /**\n * Resolved with signal value when new signal received.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * // Wait for NEW signal received.\n * const newContent = await contentChangeSignal.getNextSignalValue();\n * ```\n */\n getNextSignalValue(): Promise<AlwatrSignals[SignalName]> {\n this._logger.logMethod('getNextSignalValue');\n return new Promise((resolve) => {\n this.addListener(resolve, {\n once: true,\n priority: true,\n receivePrevious: false,\n });\n });\n }\n\n /**\n * Resolved with signal value when signal is ready.\n *\n * Get signal value from last dispatched signal (if any) or wait for new signal received.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * // get signal value from last dispatched signal (if any) or wait new signal received.\n * const content = await contentChangeSignal.getSignalValue();\n * ```\n */\n getSignalValue(): Promise<AlwatrSignals[SignalName]> {\n this._logger.logMethod('getSignalValue');\n if (this._signal.value !== undefined) {\n return Promise.resolve(this._signal.value);\n }\n else {\n return this.getNextSignalValue();\n }\n }\n\n /**\n * Dispatch signal to all listeners.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * contentChangeSignal.dispatch(content);\n * ```\n */\n dispatch(signalValue: AlwatrSignals[SignalName], options?: DispatchOptions): void {\n this._logger.logMethodArgs('dispatch', {signalValue, options});\n _dispatchSignal(this._signal, signalValue, options);\n }\n\n /**\n * Adds a new listener to the signal.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * const listener = contentChangeSignal.addListener((content) => console.log(content));\n * ```\n */\n addListener(\n listenerCallback: ListenerCallback<SignalName>,\n options?: ListenerOptions,\n ): ListenerInterface<SignalName> {\n this._logger.logMethodArgs('addListener', {options});\n const listener = _addSignalListener(this._signal, listenerCallback, options);\n return new ListenerInterface(this._signal, listener);\n }\n}\n\n/**\n * Signal Listener API interface as a remote controller.\n */\nexport class ListenerInterface<SignalName extends keyof AlwatrSignals> {\n protected _logger;\n constructor(protected _signal: SignalObject<SignalName>, protected _listener: ListenerObject<SignalName>) {\n this._logger = createLogger('Listener of ' + _signal.name);\n }\n\n /**\n * Disable the listener, not called anymore.\n *\n * Example:\n *\n * ```ts\n * const listener = contentChangeSignal.addListener((content) => console.log(content));\n * ...\n * listener.disabled = true;\n * ```\n */\n get disabled(): boolean {\n return this._listener.disabled;\n }\n set disabled(disabled: boolean) {\n this._logger.logProperty('disabled', disabled);\n this._listener.disabled = disabled;\n }\n\n /**\n * Removes a listener from the signal.\n *\n * Example:\n *\n * ```ts\n * const contentChangeSignal = new SignalInterface('content-change');\n * const listener = contentChangeSignal.addListener((content) => console.log(content));\n * ...\n * listener.remove();\n * ```\n */\n remove(): void {\n this._logger.logMethod('remove');\n _removeSignalListener(this._signal, this._listener.id);\n }\n}\n"]}