@alwatr/signal 0.29.0 → 0.31.0
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 +27 -0
- package/command-handler.d.ts +1 -1
- package/context-provider.d.ts +23 -3
- package/context-provider.d.ts.map +1 -1
- package/context-provider.js +21 -1
- package/context-provider.js.map +1 -1
- package/core.d.ts +3 -3
- package/core.d.ts.map +1 -1
- package/core.js +48 -37
- package/core.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/index.js.map +1 -1
- package/package.json +5 -3
- package/requestable-context-consumer.d.ts +17 -6
- package/requestable-context-consumer.d.ts.map +1 -1
- package/requestable-context-consumer.js +15 -4
- package/requestable-context-consumer.js.map +1 -1
- package/requestable-context-provider.d.ts +18 -5
- package/requestable-context-provider.d.ts.map +1 -1
- package/requestable-context-provider.js +12 -1
- package/requestable-context-provider.js.map +1 -1
- package/type.d.ts +28 -11
- package/type.d.ts.map +1 -1
- package/type.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,33 @@
|
|
|
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.31.0](https://github.com/AliMD/alwatr/compare/v0.30.0...v0.31.0) (2023-05-08)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- new logger api ([9d83a7d](https://github.com/AliMD/alwatr/commit/9d83a7dc5c103bc3bb4282dacfd85fa998915300))
|
|
11
|
+
- **signal:** dont receivePrevious when listener is disabled ([68ae207](https://github.com/AliMD/alwatr/commit/68ae207ce9ecf104922b24910d8dfcedb13acde7))
|
|
12
|
+
- **signal:** requestableContextProvider.getValue ([0a7111d](https://github.com/AliMD/alwatr/commit/0a7111da7b8eb004566922dc9b35edfc02a55147))
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- **signal:** new RequestableContext with state ([b8a8e55](https://github.com/AliMD/alwatr/commit/b8a8e550d3952863d85ba9d9d87513a668a9430d))
|
|
17
|
+
|
|
18
|
+
# [0.30.0](https://github.com/AliMD/alwatr/compare/v0.29.0...v0.30.0) (2023-03-06)
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
- **signal:** NextCycle with own detail ([01f3c79](https://github.com/AliMD/alwatr/commit/01f3c79500927f6384a33abcc9b0cb2355794b3e))
|
|
23
|
+
- **signal:** nodejs compatibility ([69d8a60](https://github.com/AliMD/alwatr/commit/69d8a60ad64d44ee7c3ced002e702f13408a5a50))
|
|
24
|
+
- **signal:** requestableContextConsumer bind issue ([66467f6](https://github.com/AliMD/alwatr/commit/66467f6e5681d84d7f2e0b353206d4bb579b26f2))
|
|
25
|
+
- **signal:** requestContext dispatch issue ([e937ebd](https://github.com/AliMD/alwatr/commit/e937ebd3a90fc6a9946f5c35ef4f6f40b6ab4b00))
|
|
26
|
+
|
|
27
|
+
### Features
|
|
28
|
+
|
|
29
|
+
- **signal:** add untilChange for contextProvider ([cb44916](https://github.com/AliMD/alwatr/commit/cb4491698fd5ddfbe055032fc2cb50691de31194))
|
|
30
|
+
- **signal:** defineCommand return ListenerSpec ([21fecac](https://github.com/AliMD/alwatr/commit/21fecacb6aa9423da9e3c177a4bbc59952d94e35))
|
|
31
|
+
- **signal:** dispatch NextCycle option ([b30eb31](https://github.com/AliMD/alwatr/commit/b30eb316d92f594034fc40d195c4033e38e4d2e2))
|
|
32
|
+
|
|
6
33
|
# [0.29.0](https://github.com/AliMD/alwatr/compare/v0.28.0...v0.29.0) (2023-02-10)
|
|
7
34
|
|
|
8
35
|
### Bug Fixes
|
package/command-handler.d.ts
CHANGED
|
@@ -20,6 +20,6 @@ export declare const commandHandler: {
|
|
|
20
20
|
*/
|
|
21
21
|
readonly define: <TArgument extends import("@alwatr/type").StringifyableRecord, TReturn extends import("@alwatr/type").Stringifyable>(signalId: string, signalProvider: import("./type.js").ProviderFunction<TArgument & {
|
|
22
22
|
_callbackSignalId?: string | undefined;
|
|
23
|
-
}, TReturn>, options?: Partial<Pick<import("./type.js").ProviderOptions, "debounce">>) =>
|
|
23
|
+
}, TReturn>, options?: Partial<Pick<import("./type.js").ProviderOptions, "debounce">>) => import("./type.js").ListenerSpec;
|
|
24
24
|
};
|
|
25
25
|
//# sourceMappingURL=command-handler.d.ts.map
|
package/context-provider.d.ts
CHANGED
|
@@ -42,6 +42,16 @@ export declare const contextProvider: {
|
|
|
42
42
|
* ```
|
|
43
43
|
*/
|
|
44
44
|
readonly expire: (signalId: string) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Waits until the context value changes.
|
|
47
|
+
*
|
|
48
|
+
* Example:
|
|
49
|
+
*
|
|
50
|
+
* ```ts
|
|
51
|
+
* const newProductList = await contextProvider.untilChange<ProductListType>('product-list');
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
readonly untilChange: <T_2 extends Stringifyable>(signalId: string) => Promise<T_2>;
|
|
45
55
|
/**
|
|
46
56
|
* Bind this interface to special context.
|
|
47
57
|
*
|
|
@@ -51,7 +61,7 @@ export declare const contextProvider: {
|
|
|
51
61
|
* const productListProvider = contextProvider.bind<ProductListType>('product-list');
|
|
52
62
|
* ```
|
|
53
63
|
*/
|
|
54
|
-
readonly bind: <
|
|
64
|
+
readonly bind: <T_3 extends Stringifyable>(contextId: string) => {
|
|
55
65
|
/**
|
|
56
66
|
* Context signal Id.
|
|
57
67
|
*/
|
|
@@ -70,7 +80,7 @@ export declare const contextProvider: {
|
|
|
70
80
|
* }
|
|
71
81
|
* ```
|
|
72
82
|
*/
|
|
73
|
-
readonly getValue: () =>
|
|
83
|
+
readonly getValue: () => T_3 | undefined;
|
|
74
84
|
/**
|
|
75
85
|
* Set context value and send signal to all consumers.
|
|
76
86
|
*
|
|
@@ -82,7 +92,7 @@ export declare const contextProvider: {
|
|
|
82
92
|
* productListProvider.setValue(newProductList);
|
|
83
93
|
* ```
|
|
84
94
|
*/
|
|
85
|
-
readonly setValue: (detail:
|
|
95
|
+
readonly setValue: (detail: T_3, options?: Partial<import("./type.js").DispatchOptions> | undefined) => void;
|
|
86
96
|
/**
|
|
87
97
|
* Clear current context value without send signal to all consumers.
|
|
88
98
|
*
|
|
@@ -95,6 +105,16 @@ export declare const contextProvider: {
|
|
|
95
105
|
* ```
|
|
96
106
|
*/
|
|
97
107
|
readonly expire: () => void;
|
|
108
|
+
/**
|
|
109
|
+
* Waits until the context value changes.
|
|
110
|
+
*
|
|
111
|
+
* Example:
|
|
112
|
+
*
|
|
113
|
+
* ```ts
|
|
114
|
+
* const newProductList = await productListProvider.untilChange();
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
readonly untilChange: () => Promise<T_3>;
|
|
98
118
|
};
|
|
99
119
|
};
|
|
100
120
|
//# sourceMappingURL=context-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-provider.d.ts","sourceRoot":"","sources":["src/context-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAiB,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;;;;;;;;;;OAaG;;IAGH;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;OAUG;;IAGH;;;;;;;;OAQG;0DACwC,MAAM;QAC/C;;WAEG;;QAGH;;;;;;;;;;;;;WAaG;;QAGH;;;;;;;;;;WAUG;;QAGH;;;;;;;;;;WAUG;;;CAGG,CAAC"}
|
|
1
|
+
{"version":3,"file":"context-provider.d.ts","sourceRoot":"","sources":["src/context-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAiB,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;;;;;;;;;;OAaG;;IAGH;;;;;;;;;;OAUG;;IAGH;;;;;;;;;;OAUG;;IAGH;;;;;;;;OAQG;;IAGH;;;;;;;;OAQG;0DACwC,MAAM;QAC/C;;WAEG;;QAGH;;;;;;;;;;;;;WAaG;;QAGH;;;;;;;;;;WAUG;;QAGH;;;;;;;;;;WAUG;;QAGH;;;;;;;;WAQG;;;CAGG,CAAC"}
|
package/context-provider.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { clearDetail, dispatch, getDetail } from './core.js';
|
|
1
|
+
import { clearDetail, dispatch, getDetail, untilNext } from './core.js';
|
|
2
2
|
/**
|
|
3
3
|
* Context provider interface.
|
|
4
4
|
*/
|
|
@@ -42,6 +42,16 @@ export const contextProvider = {
|
|
|
42
42
|
* ```
|
|
43
43
|
*/
|
|
44
44
|
expire: clearDetail,
|
|
45
|
+
/**
|
|
46
|
+
* Waits until the context value changes.
|
|
47
|
+
*
|
|
48
|
+
* Example:
|
|
49
|
+
*
|
|
50
|
+
* ```ts
|
|
51
|
+
* const newProductList = await contextProvider.untilChange<ProductListType>('product-list');
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
untilChange: untilNext,
|
|
45
55
|
/**
|
|
46
56
|
* Bind this interface to special context.
|
|
47
57
|
*
|
|
@@ -95,6 +105,16 @@ export const contextProvider = {
|
|
|
95
105
|
* ```
|
|
96
106
|
*/
|
|
97
107
|
expire: clearDetail.bind(null, contextId),
|
|
108
|
+
/**
|
|
109
|
+
* Waits until the context value changes.
|
|
110
|
+
*
|
|
111
|
+
* Example:
|
|
112
|
+
*
|
|
113
|
+
* ```ts
|
|
114
|
+
* const newProductList = await productListProvider.untilChange();
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
untilChange: untilNext.bind(null, contextId),
|
|
98
118
|
}),
|
|
99
119
|
};
|
|
100
120
|
//# sourceMappingURL=context-provider.js.map
|
package/context-provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-provider.js","sourceRoot":"","sources":["src/context-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"context-provider.js","sourceRoot":"","sources":["src/context-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAC,MAAM,WAAW,CAAC;AAItE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,SAAS;IAEnB;;;;;;;;;;OAUG;IACH,QAAQ,EAAE,QAAQ;IAElB;;;;;;;;;;OAUG;IACH,MAAM,EAAE,WAAW;IAEnB;;;;;;;;OAQG;IACH,WAAW,EAAE,SAAS;IAEtB;;;;;;;;OAQG;IACH,IAAI,EAAE,CAA0B,SAAiB,EAAE,EAAE,CAAA,CAAC;QACpD;;WAEG;QACH,EAAE,EAAE,SAAS;QAEb;;;;;;;;;;;;;WAaG;QACH,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAwC;QAEhF;;;;;;;;;;WAUG;QACH,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAuC;QAE9E;;;;;;;;;;WAUG;QACH,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAEzC;;;;;;;;WAQG;QACH,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAwC;KAC1E,CAAA;CACH,CAAC","sourcesContent":["import {clearDetail, dispatch, getDetail, untilNext} from './core.js';\n\nimport type {Stringifyable, OmitFirstParam} from '@alwatr/type';\n\n/**\n * Context provider interface.\n */\nexport const contextProvider = {\n /**\n * Get context value.\n *\n * Return undefined if context not set before or expired.\n *\n * Example:\n *\n * ```ts\n * const currentProductList = contextProvider.getValue<ProductListType>('product-list');\n * if (currentProductList === undefined) {\n * // productList not set before or expired.\n * }\n * ```\n */\n getValue: getDetail,\n\n /**\n * Set context value and send signal to all consumers.\n *\n * Signal detail changed immediately without any debounce.\n *\n * Example:\n *\n * ```ts\n * contextProvider.setValue<ProductListType>('product-list', newProductList);\n * ```\n */\n setValue: dispatch,\n\n /**\n * Clear current context value without send signal to all consumers.\n *\n * new subscriber options.receivePrevious not work until new signal\n *\n * Example:\n *\n * ```ts\n * contextProvider.expire('product-list');\n * ```\n */\n expire: clearDetail,\n\n /**\n * Waits until the context value changes.\n *\n * Example:\n *\n * ```ts\n * const newProductList = await contextProvider.untilChange<ProductListType>('product-list');\n * ```\n */\n untilChange: untilNext,\n\n /**\n * Bind this interface to special context.\n *\n * Example:\n *\n * ```ts\n * const productListProvider = contextProvider.bind<ProductListType>('product-list');\n * ```\n */\n bind: <T extends Stringifyable>(contextId: string) =>({\n /**\n * Context signal Id.\n */\n id: contextId,\n\n /**\n * Get context value.\n *\n * Return undefined if context not set before or expired.\n *\n * Example:\n *\n * ```ts\n * const currentProductList = productListProvider.getValue();\n * if (currentProductList === undefined) {\n * // productList not set before or expired.\n * }\n * ```\n */\n getValue: getDetail.bind(null, contextId) as OmitFirstParam<typeof getDetail<T>>,\n\n /**\n * Set context value and send signal to all consumers.\n *\n * Signal detail changed immediately without any debounce.\n *\n * Example:\n *\n * ```ts\n * productListProvider.setValue(newProductList);\n * ```\n */\n setValue: dispatch.bind(null, contextId) as OmitFirstParam<typeof dispatch<T>>,\n\n /**\n * Clear current context value without send signal to all consumers.\n *\n * new subscriber options.receivePrevious not work until new signal\n *\n * Example:\n *\n * ```ts\n * productListProvider.expire();\n * ```\n */\n expire: clearDetail.bind(null, contextId),\n\n /**\n * Waits until the context value changes.\n *\n * Example:\n *\n * ```ts\n * const newProductList = await productListProvider.untilChange();\n * ```\n */\n untilChange: untilNext.bind(null, contextId) as OmitFirstParam<typeof untilNext<T>>,\n } as const),\n} as const;\n"]}
|
package/core.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export declare const getSignalObject: <T extends Stringifyable>(id: string) => S
|
|
|
19
19
|
*
|
|
20
20
|
* Used inside dispatch, Don't use it directly.
|
|
21
21
|
*/
|
|
22
|
-
export declare const _callListeners: <T extends Stringifyable>(signal: SignalObject<T
|
|
22
|
+
export declare const _callListeners: <T extends Stringifyable>(signal: SignalObject<T>, detail: T) => void;
|
|
23
23
|
/**
|
|
24
24
|
* Subscribe new signal listener to a signal, work like addEventListener.
|
|
25
25
|
*
|
|
@@ -101,7 +101,7 @@ export declare const untilNext: <T extends Stringifyable>(signalId: string) => P
|
|
|
101
101
|
* setContextProvider('content-change', async (requestParam) => await fetchNewContent(requestParam));
|
|
102
102
|
* ```
|
|
103
103
|
*/
|
|
104
|
-
export declare const setContextProvider: <TContext extends Stringifyable, TRquest extends Stringifyable>(signalId: string, signalProvider: ProviderFunction<TRquest, void | TContext>, options?: Partial<ProviderOptions>) => void;
|
|
104
|
+
export declare const setContextProvider: <TContext extends Stringifyable, TRquest extends Stringifyable = null>(signalId: string, signalProvider: ProviderFunction<TRquest, void | TContext>, options?: Partial<ProviderOptions>) => void;
|
|
105
105
|
/**
|
|
106
106
|
* Defines the command and dispatch returned value.
|
|
107
107
|
*
|
|
@@ -120,7 +120,7 @@ export declare const setContextProvider: <TContext extends Stringifyable, TRques
|
|
|
120
120
|
*/
|
|
121
121
|
export declare const defineCommand: <TArgument extends StringifyableRecord, TReturn extends Stringifyable>(signalId: string, signalProvider: ProviderFunction<TArgument & {
|
|
122
122
|
_callbackSignalId?: string | undefined;
|
|
123
|
-
}, TReturn>, options?: Partial<Pick<ProviderOptions, 'debounce'>>) =>
|
|
123
|
+
}, TReturn>, options?: Partial<Pick<ProviderOptions, 'debounce'>>) => ListenerSpec;
|
|
124
124
|
/**
|
|
125
125
|
* Dispatch request context signal with requestParam as detail.
|
|
126
126
|
*
|
package/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAEhB,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEf,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAC,aAAa,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAmBrE,eAAO,MAAM,MAAM,uCAAgC,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,gCAAiC,MAAM,oBAWlE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,mEAAkE,IA0B5F,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,sCACV,MAAM,mDAEP,QAAQ,gBAAgB,CAAC,KACjC,YAuDF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,aAAc,YAAY,KAAG,IAOpD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,aAAc,MAAM,KAAG,IAMrD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,sCACT,MAAM,uBAEP,QAAQ,eAAe,CAAC,KAChC,IAoCF,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,SAAS,sCAAuC,MAAM,kBAElE,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,sCAAuC,MAAM,eASlE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,mFACnB,MAAM,wEAEP,QAAQ,eAAe,CAAC,KAChC,IAkBF,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,mFACd,MAAM;;uBAEP,QAAQ,KAAK,eAAe,EAAE,UAAU,CAAC,CAAC,KAClD,YAuBF,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,8CACd,MAAM,oCAER,QAAQ,eAAe,CAAC,KAChC,IAGF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,qDACd,MAAM,iCAEhB,IAGF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,oFAI1B,MAAM,iDAqBlB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,aAAc,MAAM,KAAG,IAI9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,aAAc,MAAM,KAAG,IAMhD,CAAC"}
|
package/core.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createLogger, globalAlwatr } from '@alwatr/logger';
|
|
2
|
+
import { requestAnimationFrame } from '@alwatr/util';
|
|
2
3
|
globalAlwatr.registeredList.push({
|
|
3
4
|
name: '@alwatr/signal',
|
|
4
5
|
version: _ALWATR_VERSION_,
|
|
@@ -42,14 +43,9 @@ export const getSignalObject = (id) => {
|
|
|
42
43
|
*
|
|
43
44
|
* Used inside dispatch, Don't use it directly.
|
|
44
45
|
*/
|
|
45
|
-
export const _callListeners = (signal) => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
logger.accident('_callListeners', 'no_signal_detail', 'signal must have a detail', {
|
|
49
|
-
signalId: signal.id,
|
|
50
|
-
});
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
46
|
+
export const _callListeners = (signal, detail) => {
|
|
47
|
+
var _a;
|
|
48
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_callListeners', { signalId: signal.id, signalDetail: detail });
|
|
53
49
|
const removeList = [];
|
|
54
50
|
for (const listener of signal.listenerList) {
|
|
55
51
|
if (listener.disabled)
|
|
@@ -57,7 +53,7 @@ export const _callListeners = (signal) => {
|
|
|
57
53
|
if (listener.once)
|
|
58
54
|
removeList.push(listener);
|
|
59
55
|
try {
|
|
60
|
-
const ret = listener.callback(
|
|
56
|
+
const ret = listener.callback(detail);
|
|
61
57
|
if (ret instanceof Promise) {
|
|
62
58
|
ret.catch((err) => logger.error('_callListeners', 'call_listener_failed', err, {
|
|
63
59
|
signalId: signal.id,
|
|
@@ -84,12 +80,12 @@ export const _callListeners = (signal) => {
|
|
|
84
80
|
* ```
|
|
85
81
|
*/
|
|
86
82
|
export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
87
|
-
var _a, _b, _c, _d;
|
|
83
|
+
var _a, _b, _c, _d, _e;
|
|
88
84
|
(_a = options.once) !== null && _a !== void 0 ? _a : (options.once = false);
|
|
89
85
|
(_b = options.disabled) !== null && _b !== void 0 ? _b : (options.disabled = false);
|
|
90
|
-
(_c = options.receivePrevious) !== null && _c !== void 0 ? _c : (options.receivePrevious = '
|
|
86
|
+
(_c = options.receivePrevious) !== null && _c !== void 0 ? _c : (options.receivePrevious = 'NextCycle');
|
|
91
87
|
(_d = options.priority) !== null && _d !== void 0 ? _d : (options.priority = false);
|
|
92
|
-
logger.logMethodArgs('subscribe', { signalId, options });
|
|
88
|
+
(_e = logger.logMethodArgs) === null || _e === void 0 ? void 0 : _e.call(logger, 'subscribe', { signalId, options });
|
|
93
89
|
const signal = getSignalObject(signalId);
|
|
94
90
|
const listener = {
|
|
95
91
|
id: ++_lastListenerAutoId,
|
|
@@ -98,8 +94,8 @@ export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
|
98
94
|
disabled: options.disabled,
|
|
99
95
|
callback: listenerCallback,
|
|
100
96
|
};
|
|
101
|
-
const
|
|
102
|
-
if (
|
|
97
|
+
const execCallback = signal.detail !== undefined && options.receivePrevious !== 'No' && options.disabled !== true;
|
|
98
|
+
if (execCallback) {
|
|
103
99
|
// Run callback for old dispatch signal
|
|
104
100
|
const callback = () => {
|
|
105
101
|
try {
|
|
@@ -120,7 +116,7 @@ export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
|
120
116
|
}
|
|
121
117
|
}
|
|
122
118
|
// if once then must remove listener after fist callback called! then why push it to listenerList?!
|
|
123
|
-
if (!(
|
|
119
|
+
if (!(execCallback && options.once)) {
|
|
124
120
|
if (options.priority === true) {
|
|
125
121
|
signal.listenerList.unshift(listener);
|
|
126
122
|
}
|
|
@@ -145,7 +141,8 @@ export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
|
145
141
|
* ```
|
|
146
142
|
*/
|
|
147
143
|
export const unsubscribe = (listener) => {
|
|
148
|
-
|
|
144
|
+
var _a;
|
|
145
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'unsubscribe', listener);
|
|
149
146
|
const signal = getSignalObject(listener.signalId);
|
|
150
147
|
const listenerIndex = signal.listenerList.findIndex((_listener) => _listener.id === listener.id);
|
|
151
148
|
if (listenerIndex !== -1) {
|
|
@@ -162,7 +159,8 @@ export const unsubscribe = (listener) => {
|
|
|
162
159
|
* ```
|
|
163
160
|
*/
|
|
164
161
|
export const removeAllListeners = (signalId) => {
|
|
165
|
-
|
|
162
|
+
var _a;
|
|
163
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'removeAllListeners', signalId);
|
|
166
164
|
const signal = getSignalObject(signalId);
|
|
167
165
|
if (signal.listenerList.length === 0)
|
|
168
166
|
return;
|
|
@@ -181,24 +179,31 @@ export const removeAllListeners = (signalId) => {
|
|
|
181
179
|
* ```
|
|
182
180
|
*/
|
|
183
181
|
export const dispatch = (signalId, detail, options = {}) => {
|
|
184
|
-
var _a;
|
|
182
|
+
var _a, _b;
|
|
185
183
|
(_a = options.debounce) !== null && _a !== void 0 ? _a : (options.debounce = 'AnimationFrame');
|
|
186
|
-
logger.logMethodArgs('dispatch', { signalId, detail, options });
|
|
184
|
+
(_b = logger.logMethodArgs) === null || _b === void 0 ? void 0 : _b.call(logger, 'dispatch', { signalId, detail, options });
|
|
187
185
|
const signal = getSignalObject(signalId);
|
|
188
186
|
// set detail before check signal.debounced for act like throttle (call listeners with last dispatch detail).
|
|
189
187
|
signal.detail = detail;
|
|
190
188
|
if (signal.disabled)
|
|
191
189
|
return; // signal is disabled.
|
|
192
|
-
// Simple debounce noise filtering
|
|
193
|
-
if (options.debounce !== 'No' && signal.debounced === true)
|
|
194
|
-
return; // last dispatch in progress.
|
|
195
190
|
if (options.debounce === 'No') {
|
|
196
|
-
return _callListeners(signal);
|
|
191
|
+
return _callListeners(signal, detail);
|
|
192
|
+
}
|
|
193
|
+
// else
|
|
194
|
+
if (options.debounce === 'NextCycle') {
|
|
195
|
+
setTimeout(_callListeners, 0, signal, detail);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
// else
|
|
199
|
+
if (signal.debounced === true) {
|
|
200
|
+
return; // last dispatch in progress.
|
|
197
201
|
}
|
|
198
202
|
// else
|
|
199
203
|
signal.debounced = true;
|
|
200
204
|
const callListeners = () => {
|
|
201
|
-
|
|
205
|
+
var _a;
|
|
206
|
+
_callListeners(signal, (_a = signal.detail) !== null && _a !== void 0 ? _a : detail);
|
|
202
207
|
signal.debounced = false;
|
|
203
208
|
};
|
|
204
209
|
options.debounce === 'AnimationFrame'
|
|
@@ -233,7 +238,8 @@ export const getDetail = (signalId) => {
|
|
|
233
238
|
*/
|
|
234
239
|
export const untilNext = (signalId) => {
|
|
235
240
|
return new Promise((resolve) => {
|
|
236
|
-
|
|
241
|
+
var _a;
|
|
242
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'untilNext', signalId);
|
|
237
243
|
subscribe(signalId, resolve, {
|
|
238
244
|
once: true,
|
|
239
245
|
priority: true,
|
|
@@ -252,10 +258,10 @@ export const untilNext = (signalId) => {
|
|
|
252
258
|
* ```
|
|
253
259
|
*/
|
|
254
260
|
export const setContextProvider = (signalId, signalProvider, options = {}) => {
|
|
255
|
-
var _a, _b;
|
|
261
|
+
var _a, _b, _c;
|
|
256
262
|
(_a = options.debounce) !== null && _a !== void 0 ? _a : (options.debounce = 'AnimationFrame');
|
|
257
263
|
(_b = options.receivePrevious) !== null && _b !== void 0 ? _b : (options.receivePrevious = 'AnimationFrame');
|
|
258
|
-
logger.logMethodArgs('setContextProvider', { signalId, options });
|
|
264
|
+
(_c = logger.logMethodArgs) === null || _c === void 0 ? void 0 : _c.call(logger, 'setContextProvider', { signalId, options });
|
|
259
265
|
const requestSignalId = 'request-' + signalId;
|
|
260
266
|
removeAllListeners(requestSignalId);
|
|
261
267
|
subscribe(requestSignalId, async (argumentObject) => {
|
|
@@ -284,12 +290,12 @@ export const setContextProvider = (signalId, signalProvider, options = {}) => {
|
|
|
284
290
|
* ```
|
|
285
291
|
*/
|
|
286
292
|
export const defineCommand = (signalId, signalProvider, options = {}) => {
|
|
287
|
-
var _a;
|
|
293
|
+
var _a, _b;
|
|
288
294
|
(_a = options.debounce) !== null && _a !== void 0 ? _a : (options.debounce = 'AnimationFrame');
|
|
289
|
-
logger.logMethodArgs('defineCommand', { commandId: signalId, options });
|
|
295
|
+
(_b = logger.logMethodArgs) === null || _b === void 0 ? void 0 : _b.call(logger, 'defineCommand', { commandId: signalId, options });
|
|
290
296
|
const requestSignalId = 'request-' + signalId;
|
|
291
297
|
removeAllListeners(requestSignalId);
|
|
292
|
-
subscribe(requestSignalId, async (argumentObject) => {
|
|
298
|
+
return subscribe(requestSignalId, async (argumentObject) => {
|
|
293
299
|
clearDetail(requestSignalId); // clean argumentObject from memory
|
|
294
300
|
if (argumentObject._callbackSignalId == null) {
|
|
295
301
|
signalProvider(argumentObject);
|
|
@@ -311,8 +317,9 @@ export const defineCommand = (signalId, signalProvider, options = {}) => {
|
|
|
311
317
|
* ```
|
|
312
318
|
*/
|
|
313
319
|
export const requestContext = (contextId, requestParam, options = {}) => {
|
|
314
|
-
|
|
315
|
-
|
|
320
|
+
var _a;
|
|
321
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'requestContext', { contextId, requestParam });
|
|
322
|
+
return dispatch(`request-${contextId}`, requestParam, options);
|
|
316
323
|
};
|
|
317
324
|
/**
|
|
318
325
|
* Dispatch request command signal with commandArgument as detail.
|
|
@@ -324,7 +331,8 @@ export const requestContext = (contextId, requestParam, options = {}) => {
|
|
|
324
331
|
* ```
|
|
325
332
|
*/
|
|
326
333
|
export const requestCommand = (commandId, commandArgument) => {
|
|
327
|
-
|
|
334
|
+
var _a;
|
|
335
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'requestCommand', { commandId, commandArgument });
|
|
328
336
|
dispatch(`request-${commandId}`, commandArgument, { debounce: 'No' });
|
|
329
337
|
};
|
|
330
338
|
/**
|
|
@@ -339,14 +347,15 @@ export const requestCommand = (commandId, commandArgument) => {
|
|
|
339
347
|
* ```
|
|
340
348
|
*/
|
|
341
349
|
export const requestCommandWithResponse = async (commandId, commandArgument) => {
|
|
342
|
-
|
|
350
|
+
var _a;
|
|
351
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'requestCommand', { commandId, commandArgument });
|
|
343
352
|
const _requestSignalId = `request-${commandId}`;
|
|
344
353
|
const _callbackSignalId = `callback-${commandId}-${++_lastListenerAutoId}`;
|
|
345
354
|
const untilCallback = untilNext(_callbackSignalId);
|
|
346
355
|
dispatch(_requestSignalId, {
|
|
347
356
|
...commandArgument,
|
|
348
357
|
_callbackSignalId,
|
|
349
|
-
}, { debounce: '
|
|
358
|
+
}, { debounce: 'NextCycle' });
|
|
350
359
|
const response = await untilCallback;
|
|
351
360
|
destroySignal(_callbackSignalId);
|
|
352
361
|
return response;
|
|
@@ -363,7 +372,8 @@ export const requestCommandWithResponse = async (commandId, commandArgument) =>
|
|
|
363
372
|
* ```
|
|
364
373
|
*/
|
|
365
374
|
export const clearDetail = (signalId) => {
|
|
366
|
-
|
|
375
|
+
var _a;
|
|
376
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'expire', signalId);
|
|
367
377
|
const signal = getSignalObject(signalId);
|
|
368
378
|
delete signal.detail;
|
|
369
379
|
};
|
|
@@ -379,7 +389,8 @@ export const clearDetail = (signalId) => {
|
|
|
379
389
|
* ```
|
|
380
390
|
*/
|
|
381
391
|
export const destroySignal = (signalId) => {
|
|
382
|
-
|
|
392
|
+
var _a;
|
|
393
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'destroySignal', signalId);
|
|
383
394
|
const signal = _signalStorage[signalId];
|
|
384
395
|
if (signal == null)
|
|
385
396
|
return;
|
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, globalAlwatr} from '@alwatr/logger';\n\nimport type {\n DispatchOptions,\n ListenerFunction,\n ListenerObject,\n SubscribeOptions,\n SignalObject,\n ProviderFunction,\n ProviderOptions,\n SignalStorage,\n ListenerSpec,\n} from './type.js';\nimport type {Stringifyable, StringifyableRecord} from '@alwatr/type';\n\nglobalAlwatr.registeredList.push({\n name: '@alwatr/signal',\n version: _ALWATR_VERSION_,\n});\n\n/**\n * Listener `id`\n */\nlet _lastListenerAutoId = 0;\n\nconst debounceTimeout = 5;\n\n/**\n * Signal stack database.\n */\nconst _signalStorage: SignalStorage = {};\n\nexport const logger = createLogger('alwatr/signal');\n\n/**\n * Get signal object by id, If not available, it will create a new signal with default options.\n *\n * Don't use it directly.\n *\n * Example:\n *\n * ```ts\n * const signal = getSignalObject<ContentType>('content-change');\n * signal.disabled = true;\n * ```\n */\nexport const getSignalObject = <T extends Stringifyable>(id: string): SignalObject<T> => {\n let signal = _signalStorage[id] as SignalObject<T> | undefined;\n if (signal == null) {\n signal = _signalStorage[id] = {\n id,\n disabled: false,\n debounced: false,\n listenerList: [],\n };\n }\n return signal;\n};\n\n/**\n * Call all listeners callback of special signal.\n *\n * Used inside dispatch, Don't use it directly.\n */\nexport const _callListeners = <T extends Stringifyable>(signal: SignalObject<T>): void => {\n logger.logMethodArgs('_callListeners', {signalId: signal.id, signalDetail: signal.detail});\n\n if (signal.detail === undefined) {\n logger.accident('_callListeners', 'no_signal_detail', 'signal must have a detail', {\n signalId: signal.id,\n });\n return;\n }\n\n const removeList: Array<ListenerObject<T>> = [];\n\n for (const listener of signal.listenerList) {\n if (listener.disabled) continue;\n if (listener.once) removeList.push(listener);\n try {\n const ret = listener.callback(signal.detail);\n if (ret instanceof Promise) {\n ret.catch((err) =>\n logger.error('_callListeners', 'call_listener_failed', err, {\n signalId: signal.id,\n }),\n );\n }\n }\n catch (err) {\n logger.error('_callListeners', 'call_listener_failed', err, {\n signalId: signal.id,\n });\n }\n }\n\n removeList.forEach((listener) => unsubscribe(listener));\n};\n\n/**\n * Subscribe new signal listener to a signal, work like addEventListener.\n *\n * Example:\n *\n * ```ts\n * const listener = subscribe<ContentType>('content-change', (content) => console.log(content));\n * // ...\n * unsubscribe(listener);\n * ```\n */\nexport const subscribe = <T extends Stringifyable>(\n signalId: string,\n listenerCallback: ListenerFunction<T>,\n options: Partial<SubscribeOptions> = {},\n): ListenerSpec => {\n options.once ??= false;\n options.disabled ??= false;\n options.receivePrevious ??= 'AnimationFrame';\n options.priority ??= false;\n\n logger.logMethodArgs('subscribe', {signalId, options});\n\n const signal = getSignalObject<T>(signalId);\n\n const listener: ListenerObject<T> = {\n id: ++_lastListenerAutoId,\n signalId: signal.id,\n once: options.once,\n disabled: options.disabled,\n callback: listenerCallback,\n };\n\n const callbackCall = signal.detail !== undefined && options.receivePrevious !== 'No';\n if (callbackCall) {\n // Run callback for old dispatch signal\n\n const callback = (): void => {\n try {\n if (signal.detail !== undefined) listenerCallback(signal.detail);\n }\n catch (err) {\n logger.error('subscribe', 'call_signal_callback_failed', err, {\n signalId: signal.id,\n });\n }\n };\n\n if (options.receivePrevious === 'AnimationFrame') {\n requestAnimationFrame(callback);\n }\n else {\n setTimeout(callback, options.receivePrevious === 'NextCycle' ? 0 : debounceTimeout);\n }\n }\n\n // if once then must remove listener after fist callback called! then why push it to listenerList?!\n if (!(callbackCall && options.once)) {\n if (options.priority === true) {\n signal.listenerList.unshift(listener);\n }\n else {\n signal.listenerList.push(listener);\n }\n }\n\n return {\n id: listener.id,\n signalId: listener.signalId,\n };\n};\n\n/**\n * Unsubscribe listener from signal, work like removeEventListener.\n *\n * Example:\n *\n * ```ts\n * const listener = subscribe<ContentType>('content-change', (content) => console.log(content));\n * // ...\n * unsubscribe(listener);\n * ```\n */\nexport const unsubscribe = (listener: ListenerSpec): void => {\n logger.logMethodArgs('unsubscribe', listener);\n const signal = getSignalObject(listener.signalId);\n const listenerIndex = signal.listenerList.findIndex((_listener) => _listener.id === listener.id);\n if (listenerIndex !== -1) {\n void signal.listenerList.splice(listenerIndex, 1);\n }\n};\n\n/**\n * Unsubscribe all listener from a signal, clear all listeners.\n *\n * Example:\n *\n * ```ts\n * removeAllListeners('content-change');\n * ```\n */\nexport const removeAllListeners = (signalId: string): void => {\n logger.logMethodArgs('removeAllListeners', signalId);\n const signal = getSignalObject(signalId);\n if (signal.listenerList.length === 0) return;\n signal.listenerList.length = 0;\n signal.listenerList = [];\n};\n\n/**\n * Dispatch (send) signal to all listeners.\n *\n * Signal detail changed immediately without any debounce.\n *\n * Example:\n *\n * ```ts\n * dispatch<ContentType>('content-change', newContent);\n * ```\n */\nexport const dispatch = <T extends Stringifyable>(\n signalId: string,\n detail: T,\n options: Partial<DispatchOptions> = {},\n): void => {\n options.debounce ??= 'AnimationFrame';\n\n logger.logMethodArgs('dispatch', {signalId, detail, options});\n\n const signal = getSignalObject<T>(signalId);\n\n // set detail before check signal.debounced for act like throttle (call listeners with last dispatch detail).\n signal.detail = detail;\n\n if (signal.disabled) return; // signal is disabled.\n\n // Simple debounce noise filtering\n if (options.debounce !== 'No' && signal.debounced === true) return; // last dispatch in progress.\n\n if (options.debounce === 'No') {\n return _callListeners(signal);\n }\n // else\n signal.debounced = true;\n const callListeners = (): void => {\n _callListeners(signal);\n signal.debounced = false;\n };\n options.debounce === 'AnimationFrame'\n ? requestAnimationFrame(callListeners)\n : setTimeout(callListeners, debounceTimeout);\n};\n\n/**\n * Get current signal detail/value.\n *\n * Return undefined if signal not dispatched before or expired.\n *\n * Example:\n *\n * ```ts\n * const currentContent = getDetail<ContentType>('content-change');\n * if (currentContent === undefined) {\n * // signal not dispatched yet\n * }\n * ```\n */\nexport const getDetail = <T extends Stringifyable>(signalId: string): T | undefined => {\n return getSignalObject<T>(signalId).detail;\n};\n\n/**\n * Get the detail/value of the next received signal.\n *\n * Example:\n *\n * ```ts\n * const newContent = await untilNext<ContentType>('content-change');\n * ```\n */\nexport const untilNext = <T extends Stringifyable>(signalId: string): Promise<T> => {\n return new Promise((resolve) => {\n logger.logMethodArgs('untilNext', signalId);\n subscribe<T>(signalId, resolve, {\n once: true,\n priority: true,\n receivePrevious: 'No',\n });\n });\n};\n\n/**\n * Defines the provider of the context signal that will be called when the context requested.\n * Subscribe to `request-signalId`.\n *\n * Example:\n *\n * ```ts\n * setContextProvider('content-change', async (requestParam) => await fetchNewContent(requestParam));\n * ```\n */\nexport const setContextProvider = <TContext extends Stringifyable, TRquest extends Stringifyable>(\n signalId: string,\n signalProvider: ProviderFunction<TRquest, TContext | void>,\n options: Partial<ProviderOptions> = {},\n): void => {\n options.debounce ??= 'AnimationFrame';\n options.receivePrevious ??= 'AnimationFrame';\n logger.logMethodArgs('setContextProvider', {signalId, options});\n const requestSignalId = 'request-' + signalId;\n removeAllListeners(requestSignalId);\n subscribe<TRquest>(\n requestSignalId,\n async (argumentObject): Promise<void> => {\n const signalDetail = await signalProvider(argumentObject);\n if (signalDetail !== undefined) {\n dispatch<TContext>(signalId, signalDetail, {debounce: options.debounce});\n }\n },\n {\n receivePrevious: options.receivePrevious,\n },\n );\n};\n\n/**\n * Defines the command and dispatch returned value.\n *\n * Subscribe commandFunction to request-command-signal and dispatch callback-signal with commandFunction return value.\n *\n * Example:\n *\n * ```ts\n * defineCommand<TArgument, TReturn>(\n * 'show-prompt',\n * async (argumentObject) => {\n * return await showPrompt(argumentObject);\n * },\n * );\n * ```\n */\nexport const defineCommand = <TArgument extends StringifyableRecord, TReturn extends Stringifyable>(\n signalId: string,\n signalProvider: ProviderFunction<TArgument & {_callbackSignalId?: string}, TReturn>,\n options: Partial<Pick<ProviderOptions, 'debounce'>> = {},\n): void => {\n options.debounce ??= 'AnimationFrame';\n logger.logMethodArgs('defineCommand', {commandId: signalId, options});\n const requestSignalId = 'request-' + signalId;\n removeAllListeners(requestSignalId);\n subscribe<TArgument & {_callbackSignalId?: string}>(\n requestSignalId,\n async (argumentObject) => {\n clearDetail(requestSignalId); // clean argumentObject from memory\n if (argumentObject._callbackSignalId == null) {\n signalProvider(argumentObject);\n }\n else {\n // prettier-ignore\n dispatch<TReturn>(\n argumentObject._callbackSignalId,\n await signalProvider(argumentObject),\n {debounce: options.debounce},\n );\n }\n },\n {receivePrevious: 'NextCycle'},\n );\n};\n\n/**\n * Dispatch request context signal with requestParam as detail.\n *\n * Example:\n *\n * ```ts\n * requestContext<RequestParamType>('content-change', {foo: 'bar'});\n * const newContent = await untilNext<ContentType>('content-change');\n * ```\n */\nexport const requestContext = <TRequest extends Stringifyable>(\n contextId: string,\n requestParam: TRequest,\n options: Partial<DispatchOptions> = {},\n): void => {\n logger.logMethodArgs('requestContext', {contextId, requestParam});\n return dispatch<TRequest>(contextId, requestParam, options);\n};\n\n/**\n * Dispatch request command signal with commandArgument as detail.\n *\n * Example:\n *\n * ```ts\n * requestCommand<ArgumentType>('show-dialog', {foo: 'bar'});\n * ```\n */\nexport const requestCommand = <TArgument extends StringifyableRecord>(\n commandId: string,\n commandArgument: TArgument,\n): void => {\n logger.logMethodArgs('requestCommand', {commandId, commandArgument});\n dispatch<TArgument>(`request-${commandId}`, commandArgument, {debounce: 'No'});\n};\n\n/**\n * Dispatch request command signal with commandArgument as detail and return untilNext of callback signal.\n *\n * Request command and wait for answer.\n *\n * Example:\n *\n * ```ts\n * const response = await requestCommandWithResponse<ArgumentType, ReturnType>('show-dialog', {foo: 'bar'});\n * ```\n */\nexport const requestCommandWithResponse = async <\n TArgument extends StringifyableRecord,\n TReturn extends Stringifyable\n>(\n commandId: string,\n commandArgument: TArgument,\n): Promise<TReturn> => {\n logger.logMethodArgs('requestCommand', {commandId, commandArgument});\n\n const _requestSignalId = `request-${commandId}`;\n const _callbackSignalId = `callback-${commandId}-${++_lastListenerAutoId}`;\n const untilCallback = untilNext<TReturn>(_callbackSignalId);\n\n dispatch<TArgument & {_callbackSignalId: string}>(\n _requestSignalId,\n {\n ...commandArgument,\n _callbackSignalId,\n },\n {debounce: 'No'},\n );\n\n const response = await untilCallback;\n destroySignal(_callbackSignalId);\n return response;\n};\n\n/**\n * Clear current signal detail without dispatch new signal.\n *\n * new subscriber options.receivePrevious not work until new signal\n *\n * Example:\n *\n * ```ts\n * clearDetail('product-list');\n * ```\n */\nexport const clearDetail = (signalId: string): void => {\n logger.logMethodArgs('expire', signalId);\n const signal = getSignalObject(signalId);\n delete signal.detail;\n};\n\n/**\n * Delete signal object with detail and listeners and options.\n *\n * new subscriber options.receivePrevious not work until new signal\n *\n * Example:\n *\n * ```ts\n * destroySignal('product-list');\n * ```\n */\nexport const destroySignal = (signalId: string): void => {\n logger.logMethodArgs('destroySignal', signalId);\n const signal = _signalStorage[signalId];\n if (signal == null) return;\n signal.listenerList.length = 0;\n delete _signalStorage[signalId];\n};\n"]}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, globalAlwatr} from '@alwatr/logger';\nimport {requestAnimationFrame} from '@alwatr/util';\n\nimport type {\n DispatchOptions,\n ListenerFunction,\n ListenerObject,\n SubscribeOptions,\n SignalObject,\n ProviderFunction,\n ProviderOptions,\n SignalStorage,\n ListenerSpec,\n} from './type.js';\nimport type {Stringifyable, StringifyableRecord} from '@alwatr/type';\n\nglobalAlwatr.registeredList.push({\n name: '@alwatr/signal',\n version: _ALWATR_VERSION_,\n});\n\n/**\n * Listener `id`\n */\nlet _lastListenerAutoId = 0;\n\nconst debounceTimeout = 5;\n\n/**\n * Signal stack database.\n */\nconst _signalStorage: SignalStorage = {};\n\nexport const logger = createLogger('alwatr/signal');\n\n/**\n * Get signal object by id, If not available, it will create a new signal with default options.\n *\n * Don't use it directly.\n *\n * Example:\n *\n * ```ts\n * const signal = getSignalObject<ContentType>('content-change');\n * signal.disabled = true;\n * ```\n */\nexport const getSignalObject = <T extends Stringifyable>(id: string): SignalObject<T> => {\n let signal = _signalStorage[id] as SignalObject<T> | undefined;\n if (signal == null) {\n signal = _signalStorage[id] = {\n id,\n disabled: false,\n debounced: false,\n listenerList: [],\n };\n }\n return signal;\n};\n\n/**\n * Call all listeners callback of special signal.\n *\n * Used inside dispatch, Don't use it directly.\n */\nexport const _callListeners = <T extends Stringifyable>(signal: SignalObject<T>, detail: T): void => {\n logger.logMethodArgs?.('_callListeners', {signalId: signal.id, signalDetail: detail});\n\n const removeList: Array<ListenerObject<T>> = [];\n\n for (const listener of signal.listenerList) {\n if (listener.disabled) continue;\n if (listener.once) removeList.push(listener);\n try {\n const ret = listener.callback(detail);\n if (ret instanceof Promise) {\n ret.catch((err) =>\n logger.error('_callListeners', 'call_listener_failed', err, {\n signalId: signal.id,\n }),\n );\n }\n }\n catch (err) {\n logger.error('_callListeners', 'call_listener_failed', err, {\n signalId: signal.id,\n });\n }\n }\n\n removeList.forEach((listener) => unsubscribe(listener));\n};\n\n/**\n * Subscribe new signal listener to a signal, work like addEventListener.\n *\n * Example:\n *\n * ```ts\n * const listener = subscribe<ContentType>('content-change', (content) => console.log(content));\n * // ...\n * unsubscribe(listener);\n * ```\n */\nexport const subscribe = <T extends Stringifyable>(\n signalId: string,\n listenerCallback: ListenerFunction<T>,\n options: Partial<SubscribeOptions> = {},\n): ListenerSpec => {\n options.once ??= false;\n options.disabled ??= false;\n options.receivePrevious ??= 'NextCycle';\n options.priority ??= false;\n\n logger.logMethodArgs?.('subscribe', {signalId, options});\n\n const signal = getSignalObject<T>(signalId);\n\n const listener: ListenerObject<T> = {\n id: ++_lastListenerAutoId,\n signalId: signal.id,\n once: options.once,\n disabled: options.disabled,\n callback: listenerCallback,\n };\n\n const execCallback = signal.detail !== undefined && options.receivePrevious !== 'No' && options.disabled !== true;\n if (execCallback) {\n // Run callback for old dispatch signal\n\n const callback = (): void => {\n try {\n if (signal.detail !== undefined) listenerCallback(signal.detail);\n }\n catch (err) {\n logger.error('subscribe', 'call_signal_callback_failed', err, {\n signalId: signal.id,\n });\n }\n };\n\n if (options.receivePrevious === 'AnimationFrame') {\n requestAnimationFrame(callback);\n }\n else {\n setTimeout(callback, options.receivePrevious === 'NextCycle' ? 0 : debounceTimeout);\n }\n }\n\n // if once then must remove listener after fist callback called! then why push it to listenerList?!\n if (!(execCallback && options.once)) {\n if (options.priority === true) {\n signal.listenerList.unshift(listener);\n }\n else {\n signal.listenerList.push(listener);\n }\n }\n\n return {\n id: listener.id,\n signalId: listener.signalId,\n };\n};\n\n/**\n * Unsubscribe listener from signal, work like removeEventListener.\n *\n * Example:\n *\n * ```ts\n * const listener = subscribe<ContentType>('content-change', (content) => console.log(content));\n * // ...\n * unsubscribe(listener);\n * ```\n */\nexport const unsubscribe = (listener: ListenerSpec): void => {\n logger.logMethodArgs?.('unsubscribe', listener);\n const signal = getSignalObject(listener.signalId);\n const listenerIndex = signal.listenerList.findIndex((_listener) => _listener.id === listener.id);\n if (listenerIndex !== -1) {\n void signal.listenerList.splice(listenerIndex, 1);\n }\n};\n\n/**\n * Unsubscribe all listener from a signal, clear all listeners.\n *\n * Example:\n *\n * ```ts\n * removeAllListeners('content-change');\n * ```\n */\nexport const removeAllListeners = (signalId: string): void => {\n logger.logMethodArgs?.('removeAllListeners', signalId);\n const signal = getSignalObject(signalId);\n if (signal.listenerList.length === 0) return;\n signal.listenerList.length = 0;\n signal.listenerList = [];\n};\n\n/**\n * Dispatch (send) signal to all listeners.\n *\n * Signal detail changed immediately without any debounce.\n *\n * Example:\n *\n * ```ts\n * dispatch<ContentType>('content-change', newContent);\n * ```\n */\nexport const dispatch = <T extends Stringifyable>(\n signalId: string,\n detail: T,\n options: Partial<DispatchOptions> = {},\n): void => {\n options.debounce ??= 'AnimationFrame';\n\n logger.logMethodArgs?.('dispatch', {signalId, detail, options});\n\n const signal = getSignalObject<T>(signalId);\n\n // set detail before check signal.debounced for act like throttle (call listeners with last dispatch detail).\n signal.detail = detail;\n\n if (signal.disabled) return; // signal is disabled.\n\n if (options.debounce === 'No') {\n return _callListeners(signal, detail);\n }\n\n // else\n if (options.debounce === 'NextCycle') {\n setTimeout(_callListeners, 0, signal, detail);\n return;\n }\n\n // else\n if (signal.debounced === true) {\n return; // last dispatch in progress.\n }\n\n // else\n signal.debounced = true;\n const callListeners = (): void => {\n _callListeners(signal, signal.detail ?? detail);\n signal.debounced = false;\n };\n options.debounce === 'AnimationFrame'\n ? requestAnimationFrame(callListeners)\n : setTimeout(callListeners, debounceTimeout);\n};\n\n/**\n * Get current signal detail/value.\n *\n * Return undefined if signal not dispatched before or expired.\n *\n * Example:\n *\n * ```ts\n * const currentContent = getDetail<ContentType>('content-change');\n * if (currentContent === undefined) {\n * // signal not dispatched yet\n * }\n * ```\n */\nexport const getDetail = <T extends Stringifyable>(signalId: string): T | undefined => {\n return getSignalObject<T>(signalId).detail;\n};\n\n/**\n * Get the detail/value of the next received signal.\n *\n * Example:\n *\n * ```ts\n * const newContent = await untilNext<ContentType>('content-change');\n * ```\n */\nexport const untilNext = <T extends Stringifyable>(signalId: string): Promise<T> => {\n return new Promise((resolve) => {\n logger.logMethodArgs?.('untilNext', signalId);\n subscribe<T>(signalId, resolve, {\n once: true,\n priority: true,\n receivePrevious: 'No',\n });\n });\n};\n\n/**\n * Defines the provider of the context signal that will be called when the context requested.\n * Subscribe to `request-signalId`.\n *\n * Example:\n *\n * ```ts\n * setContextProvider('content-change', async (requestParam) => await fetchNewContent(requestParam));\n * ```\n */\nexport const setContextProvider = <TContext extends Stringifyable, TRquest extends Stringifyable = null>(\n signalId: string,\n signalProvider: ProviderFunction<TRquest, TContext | void>,\n options: Partial<ProviderOptions> = {},\n): void => {\n options.debounce ??= 'AnimationFrame';\n options.receivePrevious ??= 'AnimationFrame';\n logger.logMethodArgs?.('setContextProvider', {signalId, options});\n const requestSignalId = 'request-' + signalId;\n removeAllListeners(requestSignalId);\n subscribe<TRquest>(\n requestSignalId,\n async (argumentObject): Promise<void> => {\n const signalDetail = await signalProvider(argumentObject);\n if (signalDetail !== undefined) {\n dispatch<TContext>(signalId, signalDetail, {debounce: options.debounce});\n }\n },\n {\n receivePrevious: options.receivePrevious,\n },\n );\n};\n\n/**\n * Defines the command and dispatch returned value.\n *\n * Subscribe commandFunction to request-command-signal and dispatch callback-signal with commandFunction return value.\n *\n * Example:\n *\n * ```ts\n * defineCommand<TArgument, TReturn>(\n * 'show-prompt',\n * async (argumentObject) => {\n * return await showPrompt(argumentObject);\n * },\n * );\n * ```\n */\nexport const defineCommand = <TArgument extends StringifyableRecord, TReturn extends Stringifyable>(\n signalId: string,\n signalProvider: ProviderFunction<TArgument & {_callbackSignalId?: string}, TReturn>,\n options: Partial<Pick<ProviderOptions, 'debounce'>> = {},\n): ListenerSpec => {\n options.debounce ??= 'AnimationFrame';\n logger.logMethodArgs?.('defineCommand', {commandId: signalId, options});\n const requestSignalId = 'request-' + signalId;\n removeAllListeners(requestSignalId);\n return subscribe<TArgument & {_callbackSignalId?: string}>(\n requestSignalId,\n async (argumentObject) => {\n clearDetail(requestSignalId); // clean argumentObject from memory\n if (argumentObject._callbackSignalId == null) {\n signalProvider(argumentObject);\n }\n else {\n // prettier-ignore\n dispatch<TReturn>(\n argumentObject._callbackSignalId,\n await signalProvider(argumentObject),\n {debounce: options.debounce},\n );\n }\n },\n {receivePrevious: 'NextCycle'},\n );\n};\n\n/**\n * Dispatch request context signal with requestParam as detail.\n *\n * Example:\n *\n * ```ts\n * requestContext<RequestParamType>('content-change', {foo: 'bar'});\n * const newContent = await untilNext<ContentType>('content-change');\n * ```\n */\nexport const requestContext = <TRequest extends Stringifyable>(\n contextId: string,\n requestParam: TRequest,\n options: Partial<DispatchOptions> = {},\n): void => {\n logger.logMethodArgs?.('requestContext', {contextId, requestParam});\n return dispatch<TRequest>(`request-${contextId}`, requestParam, options);\n};\n\n/**\n * Dispatch request command signal with commandArgument as detail.\n *\n * Example:\n *\n * ```ts\n * requestCommand<ArgumentType>('show-dialog', {foo: 'bar'});\n * ```\n */\nexport const requestCommand = <TArgument extends StringifyableRecord>(\n commandId: string,\n commandArgument: TArgument,\n): void => {\n logger.logMethodArgs?.('requestCommand', {commandId, commandArgument});\n dispatch<TArgument>(`request-${commandId}`, commandArgument, {debounce: 'No'});\n};\n\n/**\n * Dispatch request command signal with commandArgument as detail and return untilNext of callback signal.\n *\n * Request command and wait for answer.\n *\n * Example:\n *\n * ```ts\n * const response = await requestCommandWithResponse<ArgumentType, ReturnType>('show-dialog', {foo: 'bar'});\n * ```\n */\nexport const requestCommandWithResponse = async <\n TArgument extends StringifyableRecord,\n TReturn extends Stringifyable\n>(\n commandId: string,\n commandArgument: TArgument,\n): Promise<TReturn> => {\n logger.logMethodArgs?.('requestCommand', {commandId, commandArgument});\n\n const _requestSignalId = `request-${commandId}`;\n const _callbackSignalId = `callback-${commandId}-${++_lastListenerAutoId}`;\n const untilCallback = untilNext<TReturn>(_callbackSignalId);\n\n dispatch<TArgument & {_callbackSignalId: string}>(\n _requestSignalId,\n {\n ...commandArgument,\n _callbackSignalId,\n },\n {debounce: 'NextCycle'},\n );\n\n const response = await untilCallback;\n destroySignal(_callbackSignalId);\n return response;\n};\n\n/**\n * Clear current signal detail without dispatch new signal.\n *\n * new subscriber options.receivePrevious not work until new signal\n *\n * Example:\n *\n * ```ts\n * clearDetail('product-list');\n * ```\n */\nexport const clearDetail = (signalId: string): void => {\n logger.logMethodArgs?.('expire', signalId);\n const signal = getSignalObject(signalId);\n delete signal.detail;\n};\n\n/**\n * Delete signal object with detail and listeners and options.\n *\n * new subscriber options.receivePrevious not work until new signal\n *\n * Example:\n *\n * ```ts\n * destroySignal('product-list');\n * ```\n */\nexport const destroySignal = (signalId: string): void => {\n logger.logMethodArgs?.('destroySignal', signalId);\n const signal = _signalStorage[signalId];\n if (signal == null) return;\n signal.listenerList.length = 0;\n delete _signalStorage[signalId];\n};\n"]}
|
package/index.d.ts
CHANGED
|
@@ -6,5 +6,5 @@ export * from './event-listener.js';
|
|
|
6
6
|
export * from './event-trigger.js';
|
|
7
7
|
export * from './requestable-context-consumer.js';
|
|
8
8
|
export * from './requestable-context-provider.js';
|
|
9
|
-
export type { ListenerSpec } from './type.js';
|
|
9
|
+
export type { ListenerSpec, DebounceType, DispatchOptions } from './type.js';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,YAAY,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,YAAY,EAAC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAC,MAAM,WAAW,CAAC"}
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAGlD;;;;;;;EAOE","sourcesContent":["export * from './command-handler.js';\nexport * from './command-trigger.js';\nexport * from './context-consumer.js';\nexport * from './context-provider.js';\nexport * from './event-listener.js';\nexport * from './event-trigger.js';\nexport * from './requestable-context-consumer.js';\nexport * from './requestable-context-provider.js';\nexport type {ListenerSpec} from './type.js';\n\n/*\nTODO:\n 1. change signal option like disable\n 2. Get signal value without undefined\n (Get signal value from last dispatched signal (if any) or wait for new signal received.)\n 3. dispatched bool\n 4. optional commandProvider debounce\n*/\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAGlD;;;;;;;EAOE","sourcesContent":["export * from './command-handler.js';\nexport * from './command-trigger.js';\nexport * from './context-consumer.js';\nexport * from './context-provider.js';\nexport * from './event-listener.js';\nexport * from './event-trigger.js';\nexport * from './requestable-context-consumer.js';\nexport * from './requestable-context-provider.js';\nexport type {ListenerSpec, DebounceType, DispatchOptions} from './type.js';\n\n/*\nTODO:\n 1. change signal option like disable\n 2. Get signal value without undefined\n (Get signal value from last dispatched signal (if any) or wait for new signal received.)\n 3. dispatched bool\n 4. optional commandProvider debounce\n*/\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwatr/signal",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.31.0",
|
|
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,8 +29,10 @@
|
|
|
29
29
|
"url": "https://github.com/AliMD/alwatr/issues"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@alwatr/logger": "^0.
|
|
32
|
+
"@alwatr/logger": "^0.31.0",
|
|
33
|
+
"@alwatr/type": "^0.31.0",
|
|
34
|
+
"@alwatr/util": "^0.31.0",
|
|
33
35
|
"tslib": "^2.5.0"
|
|
34
36
|
},
|
|
35
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "896e64b58eed6e9048e870557ecf399d42705612"
|
|
36
38
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RequestableContext } from './type.js';
|
|
1
2
|
import type { Stringifyable } from '@alwatr/type';
|
|
2
3
|
/**
|
|
3
4
|
* Requestable context consumer interface.
|
|
@@ -10,7 +11,7 @@ export declare const requestableContextConsumer: {
|
|
|
10
11
|
*
|
|
11
12
|
* ```ts
|
|
12
13
|
* requestableContextConsumer.request<RequestParamType>('product-list', {foo: 'bar'});
|
|
13
|
-
*
|
|
14
|
+
* TODO: update me
|
|
14
15
|
* ```
|
|
15
16
|
*/
|
|
16
17
|
readonly request: <TRequest extends Stringifyable>(contextId: string, requestParam: TRequest, options?: Partial<import("./type.js").DispatchOptions>) => void;
|
|
@@ -23,7 +24,18 @@ export declare const requestableContextConsumer: {
|
|
|
23
24
|
* const productListConsumer = requestableContextConsumer.bind<ProductListType>('product-list');
|
|
24
25
|
* ```
|
|
25
26
|
*/
|
|
26
|
-
readonly bind: <
|
|
27
|
+
readonly bind: <TContextContent extends Stringifyable, TRquest extends Stringifyable = null>(contextId: string) => {
|
|
28
|
+
/**
|
|
29
|
+
* Get context value.
|
|
30
|
+
*
|
|
31
|
+
* Example:
|
|
32
|
+
*
|
|
33
|
+
* ```ts
|
|
34
|
+
* const currentProductList = productListConsumer.getValue();
|
|
35
|
+
* TODO: update me
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
readonly getValue: () => RequestableContext<TContextContent>;
|
|
27
39
|
/**
|
|
28
40
|
* Send new context request to the provider.
|
|
29
41
|
*
|
|
@@ -31,14 +43,13 @@ export declare const requestableContextConsumer: {
|
|
|
31
43
|
*
|
|
32
44
|
* ```ts
|
|
33
45
|
* productListConsumer.request({foo: 'bar'});
|
|
34
|
-
*
|
|
46
|
+
* TODO: update me
|
|
35
47
|
* ```
|
|
36
48
|
*/
|
|
37
49
|
readonly request: (requestParam: TRquest, options?: Partial<import("./type.js").DispatchOptions> | undefined) => void;
|
|
38
50
|
readonly id: string;
|
|
39
|
-
readonly
|
|
40
|
-
readonly
|
|
41
|
-
readonly subscribe: (listenerCallback: import("./type.js").ListenerFunction<TContext>, options?: Partial<import("./type.js").SubscribeOptions> | undefined) => import("./type.js").ListenerSpec;
|
|
51
|
+
readonly untilChange: () => Promise<RequestableContext<TContextContent>>;
|
|
52
|
+
readonly subscribe: (listenerCallback: import("./type.js").ListenerFunction<RequestableContext<TContextContent>>, options?: Partial<import("./type.js").SubscribeOptions> | undefined) => import("./type.js").ListenerSpec;
|
|
42
53
|
readonly unsubscribe: (listener: import("./type.js").ListenerSpec) => void;
|
|
43
54
|
};
|
|
44
55
|
readonly getValue: <T extends Stringifyable>(signalId: string) => T | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestable-context-consumer.d.ts","sourceRoot":"","sources":["src/requestable-context-consumer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"requestable-context-consumer.d.ts","sourceRoot":"","sources":["src/requestable-context-consumer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,EAAC,aAAa,EAAiB,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,0BAA0B;IAGrC;;;;;;;;;OASG;;IAGH;;;;;;;;OAQG;4GAC4F,MAAM;QAGnG;;;;;;;;;WASG;;QAIH;;;;;;;;;WASG;;;;;;;;;;;CAIG,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { contextConsumer } from './context-consumer.js';
|
|
2
|
-
import { requestContext } from './core.js';
|
|
2
|
+
import { getDetail, requestContext } from './core.js';
|
|
3
3
|
/**
|
|
4
4
|
* Requestable context consumer interface.
|
|
5
5
|
*/
|
|
@@ -12,7 +12,7 @@ export const requestableContextConsumer = {
|
|
|
12
12
|
*
|
|
13
13
|
* ```ts
|
|
14
14
|
* requestableContextConsumer.request<RequestParamType>('product-list', {foo: 'bar'});
|
|
15
|
-
*
|
|
15
|
+
* TODO: update me
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
18
|
request: requestContext,
|
|
@@ -27,6 +27,17 @@ export const requestableContextConsumer = {
|
|
|
27
27
|
*/
|
|
28
28
|
bind: (contextId) => ({
|
|
29
29
|
...contextConsumer.bind(contextId),
|
|
30
|
+
/**
|
|
31
|
+
* Get context value.
|
|
32
|
+
*
|
|
33
|
+
* Example:
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* const currentProductList = productListConsumer.getValue();
|
|
37
|
+
* TODO: update me
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
getValue: () => { var _a; return (_a = getDetail(contextId)) !== null && _a !== void 0 ? _a : { state: 'initial' }; },
|
|
30
41
|
/**
|
|
31
42
|
* Send new context request to the provider.
|
|
32
43
|
*
|
|
@@ -34,10 +45,10 @@ export const requestableContextConsumer = {
|
|
|
34
45
|
*
|
|
35
46
|
* ```ts
|
|
36
47
|
* productListConsumer.request({foo: 'bar'});
|
|
37
|
-
*
|
|
48
|
+
* TODO: update me
|
|
38
49
|
* ```
|
|
39
50
|
*/
|
|
40
|
-
request: requestContext,
|
|
51
|
+
request: requestContext.bind(null, contextId),
|
|
41
52
|
}),
|
|
42
53
|
};
|
|
43
54
|
//# sourceMappingURL=requestable-context-consumer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestable-context-consumer.js","sourceRoot":"","sources":["src/requestable-context-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"requestable-context-consumer.js","sourceRoot":"","sources":["src/requestable-context-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,SAAS,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AAKpD;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,GAAG,eAAe;IAElB;;;;;;;;;OASG;IACH,OAAO,EAAE,cAAc;IAEvB;;;;;;;;OAQG;IACH,IAAI,EAAE,CAA8E,SAAiB,EAAE,EAAE,CAAA,CAAC;QACxG,GAAG,eAAe,CAAC,IAAI,CAAsC,SAAS,CAAC;QAEvE;;;;;;;;;WASG;QACH,QAAQ,EAAE,GAAwC,EAAE,WAClD,OAAA,MAAA,SAAS,CAAsC,SAAS,CAAC,mCAAI,EAAC,KAAK,EAAE,SAAS,EAAC,CAAA,EAAA;QAEjF;;;;;;;;;WASG;QACH,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CACI;KACvC,CAAA;CACH,CAAC","sourcesContent":["import {contextConsumer} from './context-consumer.js';\nimport {getDetail, requestContext} from './core.js';\nimport {RequestableContext} from './type.js';\n\nimport type {Stringifyable, OmitFirstParam} from '@alwatr/type';\n\n/**\n * Requestable context consumer interface.\n */\nexport const requestableContextConsumer = {\n ...contextConsumer,\n\n /**\n * Send new context request to the provider.\n *\n * Example:\n *\n * ```ts\n * requestableContextConsumer.request<RequestParamType>('product-list', {foo: 'bar'});\n * TODO: update me\n * ```\n */\n request: requestContext,\n\n /**\n * Bind this interface to special context.\n *\n * Example:\n *\n * ```ts\n * const productListConsumer = requestableContextConsumer.bind<ProductListType>('product-list');\n * ```\n */\n bind: <TContextContent extends Stringifyable, TRquest extends Stringifyable = null>(contextId: string) =>({\n ...contextConsumer.bind<RequestableContext<TContextContent>>(contextId),\n\n /**\n * Get context value.\n *\n * Example:\n *\n * ```ts\n * const currentProductList = productListConsumer.getValue();\n * TODO: update me\n * ```\n */\n getValue: (): RequestableContext<TContextContent> =>\n getDetail<RequestableContext<TContextContent>>(contextId) ?? {state: 'initial'},\n\n /**\n * Send new context request to the provider.\n *\n * Example:\n *\n * ```ts\n * productListConsumer.request({foo: 'bar'});\n * TODO: update me\n * ```\n */\n request: requestContext.bind(null, contextId) as\n OmitFirstParam<typeof requestContext<TRquest>>,\n } as const),\n} as const;\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RequestableContext } from './type.js';
|
|
1
2
|
import type { Stringifyable } from '@alwatr/type';
|
|
2
3
|
/**
|
|
3
4
|
* Requestable context provider interface.
|
|
@@ -19,7 +20,7 @@ export declare const requestableContextProvider: {
|
|
|
19
20
|
* );
|
|
20
21
|
* ```
|
|
21
22
|
*/
|
|
22
|
-
readonly setProvider: <TContext extends Stringifyable, TRquest extends Stringifyable>(signalId: string, signalProvider: import("./type.js").ProviderFunction<TRquest, void | TContext>, options?: Partial<import("./type.js").ProviderOptions>) => void;
|
|
23
|
+
readonly setProvider: <TContext extends Stringifyable, TRquest extends Stringifyable = null>(signalId: string, signalProvider: import("./type.js").ProviderFunction<TRquest, void | TContext>, options?: Partial<import("./type.js").ProviderOptions>) => void;
|
|
23
24
|
/**
|
|
24
25
|
* Bind this interface to special context.
|
|
25
26
|
*
|
|
@@ -29,7 +30,18 @@ export declare const requestableContextProvider: {
|
|
|
29
30
|
* const productListProvider = requestableContextProvider.bind<ProductListType>('product-list');
|
|
30
31
|
* ```
|
|
31
32
|
*/
|
|
32
|
-
readonly bind: <
|
|
33
|
+
readonly bind: <TContextContent extends Stringifyable, TRquest_1 extends Stringifyable = null>(contextId: string) => {
|
|
34
|
+
/**
|
|
35
|
+
* Get context value.
|
|
36
|
+
*
|
|
37
|
+
* Example:
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* const currentProductList = productListConsumer.getValue();
|
|
41
|
+
* TODO: update me
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
readonly getValue: () => RequestableContext<TContextContent>;
|
|
33
45
|
/**
|
|
34
46
|
* Defines the provider of the context signal that will be called when the context requested.
|
|
35
47
|
*
|
|
@@ -43,14 +55,15 @@ export declare const requestableContextProvider: {
|
|
|
43
55
|
* });
|
|
44
56
|
* ```
|
|
45
57
|
*/
|
|
46
|
-
readonly setProvider: (signalProvider: import("./type.js").ProviderFunction<TRquest_1, void |
|
|
58
|
+
readonly setProvider: (signalProvider: import("./type.js").ProviderFunction<TRquest_1, void | RequestableContext<TContextContent>>, options?: Partial<import("./type.js").ProviderOptions> | undefined) => void;
|
|
47
59
|
readonly id: string;
|
|
48
|
-
readonly
|
|
49
|
-
readonly setValue: (detail: TContext_1, options?: Partial<import("./type.js").DispatchOptions> | undefined) => void;
|
|
60
|
+
readonly setValue: (detail: RequestableContext<TContextContent>, options?: Partial<import("./type.js").DispatchOptions> | undefined) => void;
|
|
50
61
|
readonly expire: () => void;
|
|
62
|
+
readonly untilChange: () => Promise<RequestableContext<TContextContent>>;
|
|
51
63
|
};
|
|
52
64
|
readonly getValue: <T extends Stringifyable>(signalId: string) => T | undefined;
|
|
53
65
|
readonly setValue: <T_1 extends Stringifyable>(signalId: string, detail: T_1, options?: Partial<import("./type.js").DispatchOptions>) => void;
|
|
54
66
|
readonly expire: (signalId: string) => void;
|
|
67
|
+
readonly untilChange: <T_2 extends Stringifyable>(signalId: string) => Promise<T_2>;
|
|
55
68
|
};
|
|
56
69
|
//# sourceMappingURL=requestable-context-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestable-context-provider.d.ts","sourceRoot":"","sources":["src/requestable-context-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"requestable-context-provider.d.ts","sourceRoot":"","sources":["src/requestable-context-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,WAAW,CAAC;AAE7C,OAAO,KAAK,EAAC,aAAa,EAAiB,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,0BAA0B;IAGrC;;;;;;;;;;;;;;;OAeG;;IAGH;;;;;;;;OAQG;8GAC4F,MAAM;QAGnG;;;;;;;;;WASG;;QAKH;;;;;;;;;;;;WAYG;;;;;;;;;;;CAIG,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { contextProvider } from './context-provider.js';
|
|
2
|
-
import { setContextProvider } from './core.js';
|
|
2
|
+
import { getDetail, setContextProvider } from './core.js';
|
|
3
3
|
/**
|
|
4
4
|
* Requestable context provider interface.
|
|
5
5
|
*/
|
|
@@ -33,6 +33,17 @@ export const requestableContextProvider = {
|
|
|
33
33
|
*/
|
|
34
34
|
bind: (contextId) => ({
|
|
35
35
|
...contextProvider.bind(contextId),
|
|
36
|
+
/**
|
|
37
|
+
* Get context value.
|
|
38
|
+
*
|
|
39
|
+
* Example:
|
|
40
|
+
*
|
|
41
|
+
* ```ts
|
|
42
|
+
* const currentProductList = productListConsumer.getValue();
|
|
43
|
+
* TODO: update me
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
getValue: () => { var _a; return (_a = getDetail(contextId)) !== null && _a !== void 0 ? _a : { state: 'initial' }; },
|
|
36
47
|
/**
|
|
37
48
|
* Defines the provider of the context signal that will be called when the context requested.
|
|
38
49
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requestable-context-provider.js","sourceRoot":"","sources":["src/requestable-context-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"requestable-context-provider.js","sourceRoot":"","sources":["src/requestable-context-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAC,SAAS,EAAE,kBAAkB,EAAC,MAAM,WAAW,CAAC;AAKxD;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,GAAG,eAAe;IAElB;;;;;;;;;;;;;;;OAeG;IACH,WAAW,EAAE,kBAAkB;IAE/B;;;;;;;;OAQG;IACH,IAAI,EAAE,CAA8E,SAAiB,EAAE,EAAE,CAAA,CAAC;QACxG,GAAG,eAAe,CAAC,IAAI,CAAsC,SAAS,CAAC;QAEvE;;;;;;;;;WASG;QACH,QAAQ,EAAE,GAAwC,EAAE,WAClD,OAAA,MAAA,SAAS,CAAsC,SAAS,CAAC,mCAAI,EAAC,KAAK,EAAE,SAAS,EAAC,CAAA,EAAA;QAGjF;;;;;;;;;;;;WAYG;QACH,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CACqC;KAChF,CAAA;CACH,CAAC","sourcesContent":["import {contextProvider} from './context-provider.js';\nimport {getDetail, setContextProvider} from './core.js';\nimport {RequestableContext} from './type.js';\n\nimport type {Stringifyable, OmitFirstParam} from '@alwatr/type';\n\n/**\n * Requestable context provider interface.\n */\nexport const requestableContextProvider = {\n ...contextProvider,\n\n /**\n * Defines the provider of the context signal that will be called when the context requested.\n *\n * subscribe to request context signal.\n *\n * Example:\n *\n * ```ts\n * requestableContextProvider.setProvider<ProductListType, RequestParamType>(\n * 'product-list',\n * async (requestParam) => {\n * return await fetchNewProductList(requestParam)\n * },\n * );\n * ```\n */\n setProvider: setContextProvider,\n\n /**\n * Bind this interface to special context.\n *\n * Example:\n *\n * ```ts\n * const productListProvider = requestableContextProvider.bind<ProductListType>('product-list');\n * ```\n */\n bind: <TContextContent extends Stringifyable, TRquest extends Stringifyable = null>(contextId: string) =>({\n ...contextProvider.bind<RequestableContext<TContextContent>>(contextId),\n\n /**\n * Get context value.\n *\n * Example:\n *\n * ```ts\n * const currentProductList = productListConsumer.getValue();\n * TODO: update me\n * ```\n */\n getValue: (): RequestableContext<TContextContent> =>\n getDetail<RequestableContext<TContextContent>>(contextId) ?? {state: 'initial'},\n\n\n /**\n * Defines the provider of the context signal that will be called when the context requested.\n *\n * subscribe to request context signal.\n *\n * Example:\n *\n * ```ts\n * productListProvider.setProvider(async (requestParam) => {\n * return await fetchNewProductList(requestParam)\n * });\n * ```\n */\n setProvider: setContextProvider.bind(null, contextId) as\n OmitFirstParam<typeof setContextProvider<RequestableContext<TContextContent>, TRquest>>,\n } as const),\n} as const;\n"]}
|
package/type.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MaybePromise, Stringifyable } from '@alwatr/type';
|
|
2
|
-
export type DebounceType = 'No' | 'AnimationFrame' | 'Timeout';
|
|
1
|
+
import type { MaybePromise, Stringifyable } from '@alwatr/type';
|
|
2
|
+
export type DebounceType = 'No' | 'NextCycle' | 'AnimationFrame' | 'Timeout';
|
|
3
3
|
/**
|
|
4
4
|
* Subscribe options type.
|
|
5
5
|
*/
|
|
@@ -24,18 +24,20 @@ export interface SubscribeOptions {
|
|
|
24
24
|
* Calling this listener (callback) with preview signal value (if dispatched before).
|
|
25
25
|
* If Immediate, the listener will be called immediately without any debounce for preview signal.
|
|
26
26
|
*
|
|
27
|
-
* @default `
|
|
27
|
+
* @default `NextCycle`
|
|
28
28
|
*/
|
|
29
|
-
receivePrevious: DebounceType
|
|
29
|
+
receivePrevious: DebounceType;
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* dispatchSignal options type
|
|
33
33
|
*/
|
|
34
34
|
export interface DispatchOptions {
|
|
35
35
|
/**
|
|
36
|
-
* If
|
|
37
|
-
*
|
|
38
|
-
*
|
|
36
|
+
* If 'AnimationFrame' or 'Timeout', the dispatch will be debounced (single dispatch for all changes).
|
|
37
|
+
*
|
|
38
|
+
* If 'No' or 'NextCycle', every signal is matter and count without debounced (every changes dispatched).
|
|
39
|
+
*
|
|
40
|
+
* tips: debounce work like throttle this means listeners call with latest dispatch value.
|
|
39
41
|
*
|
|
40
42
|
* @default `AnimationFrame`
|
|
41
43
|
*/
|
|
@@ -51,11 +53,13 @@ export interface ProviderOptions {
|
|
|
51
53
|
*
|
|
52
54
|
* @default `NextCycle`
|
|
53
55
|
*/
|
|
54
|
-
receivePrevious: DebounceType
|
|
56
|
+
receivePrevious: DebounceType;
|
|
55
57
|
/**
|
|
56
|
-
* If
|
|
57
|
-
*
|
|
58
|
-
*
|
|
58
|
+
* If 'AnimationFrame' or 'Timeout', the dispatch will be debounced (single dispatch for all changes).
|
|
59
|
+
*
|
|
60
|
+
* If 'No' or 'NextCycle', every signal is matter and count without debounced (every changes dispatched).
|
|
61
|
+
*
|
|
62
|
+
* tips: debounce work like throttle this means listeners call with latest dispatch value.
|
|
59
63
|
*
|
|
60
64
|
* @default `AnimationFrame`
|
|
61
65
|
*/
|
|
@@ -126,4 +130,17 @@ export type SignalObject<T extends Stringifyable> = {
|
|
|
126
130
|
* Signal stack storage.
|
|
127
131
|
*/
|
|
128
132
|
export type SignalStorage = Record<string, SignalObject<Stringifyable> | undefined>;
|
|
133
|
+
/**
|
|
134
|
+
* Requestable context value type.
|
|
135
|
+
*/
|
|
136
|
+
export type RequestableContext<T extends Stringifyable> = {
|
|
137
|
+
state: 'initial' | 'pending';
|
|
138
|
+
content?: never;
|
|
139
|
+
} | {
|
|
140
|
+
state: 'error';
|
|
141
|
+
content?: T;
|
|
142
|
+
} | {
|
|
143
|
+
state: 'complete' | 'reloading';
|
|
144
|
+
content: T;
|
|
145
|
+
};
|
|
129
146
|
//# sourceMappingURL=type.d.ts.map
|
package/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,WAAW,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,EAAE,OAAO,CAAC;IAEd;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,eAAe,EAAE,YAAY,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;;OAQG;IACH,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,eAAe,EAAE,YAAY,CAAC;IAE9B;;;;;;;;OAQG;IACH,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5F;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,SAAS,EAAE,OAAO,IAAI,CAAC,cAAc,EAAE,SAAS,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;AAExG;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,aAAa,IAAI,YAAY,GAAG;IACnE;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,aAAa,IAAI;IAClD;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC;IAEX;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;CACxC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC;AAEpF;;GAEG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAClD;IACE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB,GACD;IACE,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,CAAC,CAAC;CACb,GACD;IACE,KAAK,EAAE,UAAU,GAAG,WAAW,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC"}
|
package/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"","sourcesContent":["import {MaybePromise, Stringifyable} from '@alwatr/type';\n\nexport type DebounceType = 'No' | 'AnimationFrame' | 'Timeout';\n\n/**\n * Subscribe options type.\n */\nexport interface SubscribeOptions {\n /**\n * If true, the listener will be called only once.\n * @default false\n */\n once: boolean;\n\n /**\n * If true, the listener will be called before other.\n * @default false\n */\n priority: boolean;\n\n /**\n * If true, the listener will be defined disabled by default.\n *\n * @default false\n */\n disabled: boolean;\n\n /**\n * Calling this listener (callback) with preview signal value (if dispatched before).\n * If Immediate, the listener will be called immediately without any debounce for preview signal.\n *\n * @default `
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"","sourcesContent":["import type {MaybePromise, Stringifyable} from '@alwatr/type';\n\nexport type DebounceType = 'No' | 'NextCycle' | 'AnimationFrame' | 'Timeout';\n\n/**\n * Subscribe options type.\n */\nexport interface SubscribeOptions {\n /**\n * If true, the listener will be called only once.\n * @default false\n */\n once: boolean;\n\n /**\n * If true, the listener will be called before other.\n * @default false\n */\n priority: boolean;\n\n /**\n * If true, the listener will be defined disabled by default.\n *\n * @default false\n */\n disabled: boolean;\n\n /**\n * Calling this listener (callback) with preview signal value (if dispatched before).\n * If Immediate, the listener will be called immediately without any debounce for preview signal.\n *\n * @default `NextCycle`\n */\n receivePrevious: DebounceType;\n}\n\n/**\n * dispatchSignal options type\n */\nexport interface DispatchOptions {\n /**\n * If 'AnimationFrame' or 'Timeout', the dispatch will be debounced (single dispatch for all changes).\n *\n * If 'No' or 'NextCycle', every signal is matter and count without debounced (every changes dispatched).\n *\n * tips: debounce work like throttle this means listeners call with latest dispatch value.\n *\n * @default `AnimationFrame`\n */\n debounce: DebounceType;\n}\n\n/**\n * setSignalProvider options type.\n */\nexport interface ProviderOptions {\n /**\n * Calling signal provider (request signal callback) with preview signal value (if dispatched before).\n * If Immediate, the listener will be called immediately without any debounce for preview signal.\n *\n * @default `NextCycle`\n */\n receivePrevious: DebounceType;\n\n /**\n * If 'AnimationFrame' or 'Timeout', the dispatch will be debounced (single dispatch for all changes).\n *\n * If 'No' or 'NextCycle', every signal is matter and count without debounced (every changes dispatched).\n *\n * tips: debounce work like throttle this means listeners call with latest dispatch value.\n *\n * @default `AnimationFrame`\n */\n debounce: DebounceType;\n}\n\n/**\n * Subscribe callback function.\n */\nexport type ListenerFunction<T extends Stringifyable> = (detail: T) => void | Promise<void>;\n\n/**\n * Command/Context provider/handler function.\n */\nexport type ProviderFunction<TArgument, TReturn> = (argumentObject: TArgument) => MaybePromise<TReturn>;\n\n/**\n * Listener spec.\n */\nexport type ListenerSpec = {\n /**\n * Unique listener id\n */\n id: number;\n\n /**\n * Signal id\n */\n signalId: string;\n};\n\n/**\n * Signal listeners object in storage.\n */\nexport type ListenerObject<T extends Stringifyable> = ListenerSpec & {\n /**\n * If true, the listener will be called only once and removed automatically after first call\n */\n once: boolean;\n\n /**\n * If true, the listener will be disabled.\n */\n disabled: boolean;\n\n callback: ListenerFunction<T>;\n};\n\n/**\n * Signal object in storage.\n */\nexport type SignalObject<T extends Stringifyable> = {\n /**\n * Signal id for direct access.\n */\n id: string;\n\n /**\n * Last dispatched detail.\n */\n detail?: T;\n\n /**\n * If true, the signal is disabled.\n */\n disabled: boolean;\n\n /**\n * Dispatches debounced (delayed).\n * Internal use case for debounce dispatch signal.\n */\n debounced: boolean;\n\n /**\n * Signal listeners list.\n */\n listenerList: Array<ListenerObject<T>>;\n};\n\n/**\n * Signal stack storage.\n */\nexport type SignalStorage = Record<string, SignalObject<Stringifyable> | undefined>;\n\n/**\n * Requestable context value type.\n */\nexport type RequestableContext<T extends Stringifyable> =\n | {\n state: 'initial' | 'pending';\n content?: never;\n }\n | {\n state: 'error';\n content?: T; // last data\n }\n | {\n state: 'complete' | 'reloading';\n content: T;\n };\n"]}
|