@alwatr/signal 0.30.0 → 0.32.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 +16 -0
- package/core.d.ts +1 -1
- package/core.d.ts.map +1 -1
- package/core.js +29 -20
- package/core.js.map +1 -1
- package/package.json +5 -5
- package/requestable-context-consumer.d.ts +17 -6
- package/requestable-context-consumer.d.ts.map +1 -1
- package/requestable-context-consumer.js +14 -3
- package/requestable-context-consumer.js.map +1 -1
- package/requestable-context-provider.d.ts +17 -6
- 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 +13 -0
- package/type.d.ts.map +1 -1
- package/type.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
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.32.0](https://github.com/AliMD/alwatr/compare/v0.31.0...v0.32.0) (2023-05-27)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @alwatr/signal
|
|
9
|
+
|
|
10
|
+
# [0.31.0](https://github.com/AliMD/alwatr/compare/v0.30.0...v0.31.0) (2023-05-08)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- new logger api ([9d83a7d](https://github.com/AliMD/alwatr/commit/9d83a7dc5c103bc3bb4282dacfd85fa998915300))
|
|
15
|
+
- **signal:** dont receivePrevious when listener is disabled ([68ae207](https://github.com/AliMD/alwatr/commit/68ae207ce9ecf104922b24910d8dfcedb13acde7))
|
|
16
|
+
- **signal:** requestableContextProvider.getValue ([0a7111d](https://github.com/AliMD/alwatr/commit/0a7111da7b8eb004566922dc9b35edfc02a55147))
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
- **signal:** new RequestableContext with state ([b8a8e55](https://github.com/AliMD/alwatr/commit/b8a8e550d3952863d85ba9d9d87513a668a9430d))
|
|
21
|
+
|
|
6
22
|
# [0.30.0](https://github.com/AliMD/alwatr/compare/v0.29.0...v0.30.0) (2023-03-06)
|
|
7
23
|
|
|
8
24
|
### Bug Fixes
|
package/core.d.ts
CHANGED
|
@@ -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
|
*
|
package/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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
|
@@ -44,7 +44,8 @@ export const getSignalObject = (id) => {
|
|
|
44
44
|
* Used inside dispatch, Don't use it directly.
|
|
45
45
|
*/
|
|
46
46
|
export const _callListeners = (signal, detail) => {
|
|
47
|
-
|
|
47
|
+
var _a;
|
|
48
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_callListeners', { signalId: signal.id, signalDetail: detail });
|
|
48
49
|
const removeList = [];
|
|
49
50
|
for (const listener of signal.listenerList) {
|
|
50
51
|
if (listener.disabled)
|
|
@@ -79,12 +80,12 @@ export const _callListeners = (signal, detail) => {
|
|
|
79
80
|
* ```
|
|
80
81
|
*/
|
|
81
82
|
export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
82
|
-
var _a, _b, _c, _d;
|
|
83
|
+
var _a, _b, _c, _d, _e;
|
|
83
84
|
(_a = options.once) !== null && _a !== void 0 ? _a : (options.once = false);
|
|
84
85
|
(_b = options.disabled) !== null && _b !== void 0 ? _b : (options.disabled = false);
|
|
85
86
|
(_c = options.receivePrevious) !== null && _c !== void 0 ? _c : (options.receivePrevious = 'NextCycle');
|
|
86
87
|
(_d = options.priority) !== null && _d !== void 0 ? _d : (options.priority = false);
|
|
87
|
-
logger.logMethodArgs('subscribe', { signalId, options });
|
|
88
|
+
(_e = logger.logMethodArgs) === null || _e === void 0 ? void 0 : _e.call(logger, 'subscribe', { signalId, options });
|
|
88
89
|
const signal = getSignalObject(signalId);
|
|
89
90
|
const listener = {
|
|
90
91
|
id: ++_lastListenerAutoId,
|
|
@@ -93,8 +94,8 @@ export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
|
93
94
|
disabled: options.disabled,
|
|
94
95
|
callback: listenerCallback,
|
|
95
96
|
};
|
|
96
|
-
const
|
|
97
|
-
if (
|
|
97
|
+
const execCallback = signal.detail !== undefined && options.receivePrevious !== 'No' && options.disabled !== true;
|
|
98
|
+
if (execCallback) {
|
|
98
99
|
// Run callback for old dispatch signal
|
|
99
100
|
const callback = () => {
|
|
100
101
|
try {
|
|
@@ -115,7 +116,7 @@ export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
// if once then must remove listener after fist callback called! then why push it to listenerList?!
|
|
118
|
-
if (!(
|
|
119
|
+
if (!(execCallback && options.once)) {
|
|
119
120
|
if (options.priority === true) {
|
|
120
121
|
signal.listenerList.unshift(listener);
|
|
121
122
|
}
|
|
@@ -140,7 +141,8 @@ export const subscribe = (signalId, listenerCallback, options = {}) => {
|
|
|
140
141
|
* ```
|
|
141
142
|
*/
|
|
142
143
|
export const unsubscribe = (listener) => {
|
|
143
|
-
|
|
144
|
+
var _a;
|
|
145
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'unsubscribe', listener);
|
|
144
146
|
const signal = getSignalObject(listener.signalId);
|
|
145
147
|
const listenerIndex = signal.listenerList.findIndex((_listener) => _listener.id === listener.id);
|
|
146
148
|
if (listenerIndex !== -1) {
|
|
@@ -157,7 +159,8 @@ export const unsubscribe = (listener) => {
|
|
|
157
159
|
* ```
|
|
158
160
|
*/
|
|
159
161
|
export const removeAllListeners = (signalId) => {
|
|
160
|
-
|
|
162
|
+
var _a;
|
|
163
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'removeAllListeners', signalId);
|
|
161
164
|
const signal = getSignalObject(signalId);
|
|
162
165
|
if (signal.listenerList.length === 0)
|
|
163
166
|
return;
|
|
@@ -176,9 +179,9 @@ export const removeAllListeners = (signalId) => {
|
|
|
176
179
|
* ```
|
|
177
180
|
*/
|
|
178
181
|
export const dispatch = (signalId, detail, options = {}) => {
|
|
179
|
-
var _a;
|
|
182
|
+
var _a, _b;
|
|
180
183
|
(_a = options.debounce) !== null && _a !== void 0 ? _a : (options.debounce = 'AnimationFrame');
|
|
181
|
-
logger.logMethodArgs('dispatch', { signalId, detail, options });
|
|
184
|
+
(_b = logger.logMethodArgs) === null || _b === void 0 ? void 0 : _b.call(logger, 'dispatch', { signalId, detail, options });
|
|
182
185
|
const signal = getSignalObject(signalId);
|
|
183
186
|
// set detail before check signal.debounced for act like throttle (call listeners with last dispatch detail).
|
|
184
187
|
signal.detail = detail;
|
|
@@ -235,7 +238,8 @@ export const getDetail = (signalId) => {
|
|
|
235
238
|
*/
|
|
236
239
|
export const untilNext = (signalId) => {
|
|
237
240
|
return new Promise((resolve) => {
|
|
238
|
-
|
|
241
|
+
var _a;
|
|
242
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'untilNext', signalId);
|
|
239
243
|
subscribe(signalId, resolve, {
|
|
240
244
|
once: true,
|
|
241
245
|
priority: true,
|
|
@@ -254,10 +258,10 @@ export const untilNext = (signalId) => {
|
|
|
254
258
|
* ```
|
|
255
259
|
*/
|
|
256
260
|
export const setContextProvider = (signalId, signalProvider, options = {}) => {
|
|
257
|
-
var _a, _b;
|
|
261
|
+
var _a, _b, _c;
|
|
258
262
|
(_a = options.debounce) !== null && _a !== void 0 ? _a : (options.debounce = 'AnimationFrame');
|
|
259
263
|
(_b = options.receivePrevious) !== null && _b !== void 0 ? _b : (options.receivePrevious = 'AnimationFrame');
|
|
260
|
-
logger.logMethodArgs('setContextProvider', { signalId, options });
|
|
264
|
+
(_c = logger.logMethodArgs) === null || _c === void 0 ? void 0 : _c.call(logger, 'setContextProvider', { signalId, options });
|
|
261
265
|
const requestSignalId = 'request-' + signalId;
|
|
262
266
|
removeAllListeners(requestSignalId);
|
|
263
267
|
subscribe(requestSignalId, async (argumentObject) => {
|
|
@@ -286,9 +290,9 @@ export const setContextProvider = (signalId, signalProvider, options = {}) => {
|
|
|
286
290
|
* ```
|
|
287
291
|
*/
|
|
288
292
|
export const defineCommand = (signalId, signalProvider, options = {}) => {
|
|
289
|
-
var _a;
|
|
293
|
+
var _a, _b;
|
|
290
294
|
(_a = options.debounce) !== null && _a !== void 0 ? _a : (options.debounce = 'AnimationFrame');
|
|
291
|
-
logger.logMethodArgs('defineCommand', { commandId: signalId, options });
|
|
295
|
+
(_b = logger.logMethodArgs) === null || _b === void 0 ? void 0 : _b.call(logger, 'defineCommand', { commandId: signalId, options });
|
|
292
296
|
const requestSignalId = 'request-' + signalId;
|
|
293
297
|
removeAllListeners(requestSignalId);
|
|
294
298
|
return subscribe(requestSignalId, async (argumentObject) => {
|
|
@@ -313,7 +317,8 @@ export const defineCommand = (signalId, signalProvider, options = {}) => {
|
|
|
313
317
|
* ```
|
|
314
318
|
*/
|
|
315
319
|
export const requestContext = (contextId, requestParam, options = {}) => {
|
|
316
|
-
|
|
320
|
+
var _a;
|
|
321
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'requestContext', { contextId, requestParam });
|
|
317
322
|
return dispatch(`request-${contextId}`, requestParam, options);
|
|
318
323
|
};
|
|
319
324
|
/**
|
|
@@ -326,7 +331,8 @@ export const requestContext = (contextId, requestParam, options = {}) => {
|
|
|
326
331
|
* ```
|
|
327
332
|
*/
|
|
328
333
|
export const requestCommand = (commandId, commandArgument) => {
|
|
329
|
-
|
|
334
|
+
var _a;
|
|
335
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'requestCommand', { commandId, commandArgument });
|
|
330
336
|
dispatch(`request-${commandId}`, commandArgument, { debounce: 'No' });
|
|
331
337
|
};
|
|
332
338
|
/**
|
|
@@ -341,7 +347,8 @@ export const requestCommand = (commandId, commandArgument) => {
|
|
|
341
347
|
* ```
|
|
342
348
|
*/
|
|
343
349
|
export const requestCommandWithResponse = async (commandId, commandArgument) => {
|
|
344
|
-
|
|
350
|
+
var _a;
|
|
351
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'requestCommand', { commandId, commandArgument });
|
|
345
352
|
const _requestSignalId = `request-${commandId}`;
|
|
346
353
|
const _callbackSignalId = `callback-${commandId}-${++_lastListenerAutoId}`;
|
|
347
354
|
const untilCallback = untilNext(_callbackSignalId);
|
|
@@ -365,7 +372,8 @@ export const requestCommandWithResponse = async (commandId, commandArgument) =>
|
|
|
365
372
|
* ```
|
|
366
373
|
*/
|
|
367
374
|
export const clearDetail = (signalId) => {
|
|
368
|
-
|
|
375
|
+
var _a;
|
|
376
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'expire', signalId);
|
|
369
377
|
const signal = getSignalObject(signalId);
|
|
370
378
|
delete signal.detail;
|
|
371
379
|
};
|
|
@@ -381,7 +389,8 @@ export const clearDetail = (signalId) => {
|
|
|
381
389
|
* ```
|
|
382
390
|
*/
|
|
383
391
|
export const destroySignal = (signalId) => {
|
|
384
|
-
|
|
392
|
+
var _a;
|
|
393
|
+
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'destroySignal', signalId);
|
|
385
394
|
const signal = _signalStorage[signalId];
|
|
386
395
|
if (signal == null)
|
|
387
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';\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 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 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>(\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"]}
|
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwatr/signal",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.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,10 +29,10 @@
|
|
|
29
29
|
"url": "https://github.com/AliMD/alwatr/issues"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@alwatr/logger": "^0.
|
|
33
|
-
"@alwatr/type": "^0.
|
|
34
|
-
"@alwatr/util": "^0.
|
|
32
|
+
"@alwatr/logger": "^0.32.0",
|
|
33
|
+
"@alwatr/type": "^0.32.0",
|
|
34
|
+
"@alwatr/util": "^0.32.0",
|
|
35
35
|
"tslib": "^2.5.0"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "b20d2574ec144e3d10f5ad9645ab30b58d1d2d77"
|
|
38
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,7 +45,7 @@ export const requestableContextConsumer = {
|
|
|
34
45
|
*
|
|
35
46
|
* ```ts
|
|
36
47
|
* productListConsumer.request({foo: 'bar'});
|
|
37
|
-
*
|
|
48
|
+
* TODO: update me
|
|
38
49
|
* ```
|
|
39
50
|
*/
|
|
40
51
|
request: requestContext.bind(null, contextId),
|
|
@@ -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,12 +55,11 @@ 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;
|
|
51
|
-
readonly untilChange: () => Promise<
|
|
62
|
+
readonly untilChange: () => Promise<RequestableContext<TContextContent>>;
|
|
52
63
|
};
|
|
53
64
|
readonly getValue: <T extends Stringifyable>(signalId: string) => T | undefined;
|
|
54
65
|
readonly setValue: <T_1 extends Stringifyable>(signalId: string, detail: T_1, options?: Partial<import("./type.js").DispatchOptions>) => void;
|
|
@@ -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
|
@@ -130,4 +130,17 @@ export type SignalObject<T extends Stringifyable> = {
|
|
|
130
130
|
* Signal stack storage.
|
|
131
131
|
*/
|
|
132
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
|
+
};
|
|
133
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,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,
|
|
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 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> = (
|
|
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"]}
|