@kuindji/reactive 1.0.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/README.md +985 -0
- package/dist/action.d.ts +49 -0
- package/dist/action.js +77 -0
- package/dist/actionBus.d.ts +43 -0
- package/dist/actionBus.js +81 -0
- package/dist/actionMap.d.ts +23 -0
- package/dist/actionMap.js +26 -0
- package/dist/event.d.ts +143 -0
- package/dist/event.js +538 -0
- package/dist/eventBus.d.ts +115 -0
- package/dist/eventBus.js +508 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +21 -0
- package/dist/lib/asyncCall.d.ts +1 -0
- package/dist/lib/asyncCall.js +17 -0
- package/dist/lib/listenerSorter.d.ts +5 -0
- package/dist/lib/listenerSorter.js +13 -0
- package/dist/lib/tagsIntersect.d.ts +1 -0
- package/dist/lib/tagsIntersect.js +11 -0
- package/dist/lib/types.d.ts +49 -0
- package/dist/lib/types.js +37 -0
- package/dist/react/ErrorBoundary.d.ts +10 -0
- package/dist/react/ErrorBoundary.js +25 -0
- package/dist/react/useAction.d.ts +21 -0
- package/dist/react/useAction.js +66 -0
- package/dist/react/useActionBus.d.ts +38 -0
- package/dist/react/useActionBus.js +44 -0
- package/dist/react/useActionMap.d.ts +23 -0
- package/dist/react/useActionMap.js +25 -0
- package/dist/react/useEvent.d.ts +47 -0
- package/dist/react/useEvent.js +66 -0
- package/dist/react/useEventBus.d.ts +117 -0
- package/dist/react/useEventBus.js +66 -0
- package/dist/react/useListenToAction.d.ts +3 -0
- package/dist/react/useListenToAction.js +38 -0
- package/dist/react/useListenToEvent.d.ts +4 -0
- package/dist/react/useListenToEvent.js +34 -0
- package/dist/react/useListenToEventBus.d.ts +5 -0
- package/dist/react/useListenToEventBus.js +37 -0
- package/dist/react/useStore.d.ts +51 -0
- package/dist/react/useStore.js +30 -0
- package/dist/react/useStoreState.d.ts +3 -0
- package/dist/react/useStoreState.js +32 -0
- package/dist/react.d.ts +10 -0
- package/dist/react.js +26 -0
- package/dist/store.d.ts +54 -0
- package/dist/store.js +193 -0
- package/package.json +70 -0
- package/src/index.ts +5 -0
package/dist/event.js
ADDED
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createEvent = createEvent;
|
|
4
|
+
const asyncCall_1 = require("./lib/asyncCall");
|
|
5
|
+
const listenerSorter_1 = require("./lib/listenerSorter");
|
|
6
|
+
const tagsIntersect_1 = require("./lib/tagsIntersect");
|
|
7
|
+
const types_1 = require("./lib/types");
|
|
8
|
+
function createEvent(eventOptions = {}) {
|
|
9
|
+
let listeners = [];
|
|
10
|
+
let errorListeners = [];
|
|
11
|
+
let queue = [];
|
|
12
|
+
let suspended = false;
|
|
13
|
+
let queued = false;
|
|
14
|
+
let triggered = 0;
|
|
15
|
+
let lastTrigger = null;
|
|
16
|
+
let sortListeners = false;
|
|
17
|
+
let currentTagsFilter = null;
|
|
18
|
+
const options = Object.assign({ async: null, limit: null, autoTrigger: null, filter: null, filterContext: null, maxListeners: 1000 }, eventOptions);
|
|
19
|
+
const addListener = (handler, listenerOptions = {}) => {
|
|
20
|
+
if (!handler) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (listeners.find((l) => l.handler === handler && l.context === listenerOptions.context)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (listeners.length >= options.maxListeners) {
|
|
27
|
+
throw new Error(`Max listeners (${options.maxListeners}) reached`);
|
|
28
|
+
}
|
|
29
|
+
const listener = Object.assign({ handler, called: 0, count: 0, index: listeners.length, start: 1, context: null, tags: [], extraData: null, first: false, alwaysFirst: false, alwaysLast: false, limit: 0, async: null }, listenerOptions);
|
|
30
|
+
if (listener.async === true) {
|
|
31
|
+
listener.async = 1;
|
|
32
|
+
}
|
|
33
|
+
if (listenerOptions.first === true
|
|
34
|
+
|| listenerOptions.alwaysFirst === true) {
|
|
35
|
+
listeners.unshift(listener);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
listeners.push(listener);
|
|
39
|
+
}
|
|
40
|
+
if (sortListeners) {
|
|
41
|
+
listeners.forEach((l, inx) => {
|
|
42
|
+
l.index = inx;
|
|
43
|
+
});
|
|
44
|
+
listeners.sort((l1, l2) => (0, listenerSorter_1.default)(l1, l2));
|
|
45
|
+
}
|
|
46
|
+
if ((listenerOptions === null || listenerOptions === void 0 ? void 0 : listenerOptions.alwaysFirst) === true
|
|
47
|
+
|| (listenerOptions === null || listenerOptions === void 0 ? void 0 : listenerOptions.alwaysLast) === true) {
|
|
48
|
+
sortListeners = true;
|
|
49
|
+
}
|
|
50
|
+
if (options.autoTrigger
|
|
51
|
+
&& lastTrigger !== null
|
|
52
|
+
&& !suspended) {
|
|
53
|
+
const prevFilter = options.filter;
|
|
54
|
+
options.filter = (args, l) => {
|
|
55
|
+
if (l && l.handler === handler) {
|
|
56
|
+
return prevFilter ? prevFilter(args, l) !== false : true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
};
|
|
60
|
+
_trigger(lastTrigger);
|
|
61
|
+
options.filter = prevFilter;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const removeListener = (handler, context, tag) => {
|
|
65
|
+
const inx = listeners.findIndex((l) => {
|
|
66
|
+
if (l.handler !== handler) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (!!l.context !== !!context) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (!!context && l.context !== context) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
if (!!tag && (!l.tags || l.tags.indexOf(tag) === -1)) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
});
|
|
80
|
+
if (inx === -1) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
listeners.splice(inx, 1);
|
|
84
|
+
return true;
|
|
85
|
+
};
|
|
86
|
+
const hasListener = (handler, context, tag) => {
|
|
87
|
+
if (handler) {
|
|
88
|
+
return (listeners.findIndex((l) => {
|
|
89
|
+
if (l.handler !== handler) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
if (context && l.context !== context) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
if (tag && (!l.tags || l.tags.indexOf(tag) === -1)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}) !== -1);
|
|
100
|
+
}
|
|
101
|
+
if (tag) {
|
|
102
|
+
return (listeners.findIndex((l) => l.tags && l.tags.indexOf(tag) !== -1) !== -1);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return listeners.length > 0;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const removeAllListeners = (tag) => {
|
|
109
|
+
if (tag) {
|
|
110
|
+
listeners = listeners.filter((l) => {
|
|
111
|
+
return !l.tags || l.tags.indexOf(tag) === -1;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
listeners = [];
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const addErrorListener = (handler, context) => {
|
|
119
|
+
if (listeners.find((l) => l.handler === handler && l.context === context)) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
errorListeners.push({ handler, context });
|
|
123
|
+
};
|
|
124
|
+
const removeErrorListener = (handler, context) => {
|
|
125
|
+
const inx = errorListeners.findIndex((l) => l.handler === handler && l.context === context);
|
|
126
|
+
if (inx === -1) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
errorListeners.splice(inx, 1);
|
|
130
|
+
return true;
|
|
131
|
+
};
|
|
132
|
+
const suspend = (withQueue = false) => {
|
|
133
|
+
suspended = true;
|
|
134
|
+
if (withQueue) {
|
|
135
|
+
queued = true;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const resume = () => {
|
|
139
|
+
suspended = false;
|
|
140
|
+
queued = false;
|
|
141
|
+
if (queue.length > 0) {
|
|
142
|
+
for (let i = 0, l = queue.length; i < l; i++) {
|
|
143
|
+
_trigger(queue[i][0], queue[i][1]);
|
|
144
|
+
}
|
|
145
|
+
queue = [];
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
const setOptions = (eventOptions) => {
|
|
149
|
+
Object.assign(options, eventOptions);
|
|
150
|
+
};
|
|
151
|
+
const isSuspended = () => suspended;
|
|
152
|
+
const isQueued = () => queued;
|
|
153
|
+
const reset = () => {
|
|
154
|
+
listeners.length = 0;
|
|
155
|
+
queue.length = 0;
|
|
156
|
+
suspended = false;
|
|
157
|
+
queued = false;
|
|
158
|
+
triggered = 0;
|
|
159
|
+
};
|
|
160
|
+
const _listenerCall = (listener, args, resolve = null) => {
|
|
161
|
+
let isAsync = listener.async;
|
|
162
|
+
if (isAsync === null || isAsync === undefined) {
|
|
163
|
+
isAsync = options.async;
|
|
164
|
+
}
|
|
165
|
+
if (isAsync === true) {
|
|
166
|
+
isAsync = 1;
|
|
167
|
+
}
|
|
168
|
+
if (isAsync === null || isAsync === undefined) {
|
|
169
|
+
isAsync = false;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const result = isAsync !== false
|
|
173
|
+
? (0, asyncCall_1.default)(listener.handler, listener.context, args, isAsync)
|
|
174
|
+
: listener.handler.bind(listener.context)(...args);
|
|
175
|
+
if (resolve !== null) {
|
|
176
|
+
if (result instanceof Promise) {
|
|
177
|
+
result.then(resolve);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
resolve(result);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
for (const errorListener of errorListeners) {
|
|
187
|
+
errorListener.handler({
|
|
188
|
+
error: error instanceof Error
|
|
189
|
+
? error
|
|
190
|
+
: new Error(error),
|
|
191
|
+
args: args,
|
|
192
|
+
type: "event",
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (errorListeners.length === 0) {
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const _listenerCallWPrev = (listener, args, prevValue, returnType) => {
|
|
202
|
+
if (returnType === types_1.TriggerReturnType.PIPE) {
|
|
203
|
+
args[0] = prevValue;
|
|
204
|
+
// since we don't user listener's arg transformer,
|
|
205
|
+
// we don't need to prepare args
|
|
206
|
+
// args = _prepareListenerArgs(args);
|
|
207
|
+
return _listenerCall(listener, args);
|
|
208
|
+
}
|
|
209
|
+
else if (returnType === types_1.TriggerReturnType.UNTIL_TRUE
|
|
210
|
+
&& prevValue === true) {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
else if (returnType === types_1.TriggerReturnType.UNTIL_FALSE
|
|
214
|
+
&& prevValue === false) {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
else if (returnType === types_1.TriggerReturnType.FIRST_NON_EMPTY
|
|
218
|
+
&& prevValue !== null
|
|
219
|
+
&& prevValue !== undefined) {
|
|
220
|
+
return prevValue;
|
|
221
|
+
}
|
|
222
|
+
return _listenerCall(listener, args);
|
|
223
|
+
};
|
|
224
|
+
const _trigger = (args, returnType = null, tags) => {
|
|
225
|
+
if (queued) {
|
|
226
|
+
queue.push([args, returnType]);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (suspended) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (options.limit && triggered >= options.limit) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
triggered++;
|
|
236
|
+
if (options.autoTrigger) {
|
|
237
|
+
lastTrigger = args.slice();
|
|
238
|
+
}
|
|
239
|
+
// in pipe mode if there is no listeners,
|
|
240
|
+
// we just return piped value
|
|
241
|
+
if (listeners.length === 0) {
|
|
242
|
+
if (returnType === types_1.TriggerReturnType.PIPE) {
|
|
243
|
+
return args.length > 0 ? args[0] : undefined;
|
|
244
|
+
}
|
|
245
|
+
else if (returnType === types_1.TriggerReturnType.ALL
|
|
246
|
+
|| returnType === types_1.TriggerReturnType.CONCAT
|
|
247
|
+
|| returnType === types_1.TriggerReturnType.RAW) {
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
250
|
+
else if (returnType === types_1.TriggerReturnType.MERGE) {
|
|
251
|
+
return {};
|
|
252
|
+
}
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const listenersQueue = listeners.slice();
|
|
256
|
+
const isConsequent = returnType === types_1.TriggerReturnType.PIPE
|
|
257
|
+
|| returnType === types_1.TriggerReturnType.UNTIL_TRUE
|
|
258
|
+
|| returnType === types_1.TriggerReturnType.UNTIL_FALSE
|
|
259
|
+
|| returnType === types_1.TriggerReturnType.FIRST_NON_EMPTY;
|
|
260
|
+
let listener;
|
|
261
|
+
let listenerResult;
|
|
262
|
+
const results = [];
|
|
263
|
+
let hasPromises = false;
|
|
264
|
+
while ((listener = listenersQueue.shift())) {
|
|
265
|
+
if (!listener) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (options.filter
|
|
269
|
+
&& options.filter.call(options.filterContext, args, listener)
|
|
270
|
+
=== false) {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (tags
|
|
274
|
+
&& tags.length > 0
|
|
275
|
+
&& (!listener.tags || !(0, tagsIntersect_1.default)(tags, listener.tags))) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (currentTagsFilter !== null
|
|
279
|
+
&& currentTagsFilter.length > 0
|
|
280
|
+
&& !(0, tagsIntersect_1.default)(currentTagsFilter, listener.tags)) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
listener.count++;
|
|
284
|
+
if (listener.start !== undefined
|
|
285
|
+
&& listener.start !== null
|
|
286
|
+
&& listener.count < listener.start) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (isConsequent && results.length > 0) {
|
|
290
|
+
let prev = results[results.length - 1];
|
|
291
|
+
if (hasPromises) {
|
|
292
|
+
const prevPromise = prev instanceof Promise
|
|
293
|
+
? prev
|
|
294
|
+
: Promise.resolve(prev);
|
|
295
|
+
listenerResult = prevPromise.then(((listener, args, returnType) => (value) => {
|
|
296
|
+
return _listenerCallWPrev(listener, args, value, returnType);
|
|
297
|
+
})(listener, args, returnType));
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
listenerResult = _listenerCallWPrev(listener, args,
|
|
301
|
+
// no promises here
|
|
302
|
+
prev, returnType);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
listenerResult = _listenerCall(listener, args);
|
|
307
|
+
}
|
|
308
|
+
listener.called++;
|
|
309
|
+
if (listener.called === listener.limit) {
|
|
310
|
+
removeListener(listener.handler, listener.context);
|
|
311
|
+
}
|
|
312
|
+
if (returnType === types_1.TriggerReturnType.FIRST) {
|
|
313
|
+
return listenerResult;
|
|
314
|
+
}
|
|
315
|
+
if (isConsequent) {
|
|
316
|
+
switch (returnType) {
|
|
317
|
+
case types_1.TriggerReturnType.UNTIL_TRUE: {
|
|
318
|
+
if (listenerResult === true) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
case types_1.TriggerReturnType.UNTIL_FALSE: {
|
|
324
|
+
if (listenerResult === false) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
case types_1.TriggerReturnType.FIRST_NON_EMPTY: {
|
|
330
|
+
if (!hasPromises
|
|
331
|
+
&& !(listenerResult instanceof Promise)
|
|
332
|
+
&& listenerResult !== null
|
|
333
|
+
&& listenerResult !== undefined) {
|
|
334
|
+
return listenerResult;
|
|
335
|
+
}
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (!hasPromises && listenerResult instanceof Promise) {
|
|
341
|
+
hasPromises = true;
|
|
342
|
+
}
|
|
343
|
+
results.push(listenerResult);
|
|
344
|
+
}
|
|
345
|
+
switch (returnType) {
|
|
346
|
+
case types_1.TriggerReturnType.RAW: {
|
|
347
|
+
return results;
|
|
348
|
+
}
|
|
349
|
+
case undefined:
|
|
350
|
+
case null: {
|
|
351
|
+
if (hasPromises) {
|
|
352
|
+
return Promise.all(results).then(() => undefined);
|
|
353
|
+
}
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
case types_1.TriggerReturnType.ALL: {
|
|
357
|
+
return hasPromises
|
|
358
|
+
? Promise.all(results)
|
|
359
|
+
: results;
|
|
360
|
+
}
|
|
361
|
+
case types_1.TriggerReturnType.CONCAT: {
|
|
362
|
+
return hasPromises
|
|
363
|
+
? Promise.all(results).then((results) => results.flat())
|
|
364
|
+
: results.flat();
|
|
365
|
+
}
|
|
366
|
+
case types_1.TriggerReturnType.MERGE: {
|
|
367
|
+
return hasPromises
|
|
368
|
+
? Promise.all(results).then((results) => Object.assign.apply(null, [{}, ...results]))
|
|
369
|
+
: Object.assign.apply(null, [{}, ...results]);
|
|
370
|
+
}
|
|
371
|
+
case types_1.TriggerReturnType.LAST: {
|
|
372
|
+
return results.pop();
|
|
373
|
+
}
|
|
374
|
+
case types_1.TriggerReturnType.UNTIL_TRUE: {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
case types_1.TriggerReturnType.UNTIL_FALSE: {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
case types_1.TriggerReturnType.FIRST_NON_EMPTY: {
|
|
381
|
+
return Promise.all(results).then((results) => results.find((r) => r !== undefined && r !== null));
|
|
382
|
+
}
|
|
383
|
+
case types_1.TriggerReturnType.PIPE: {
|
|
384
|
+
return results[results.length - 1];
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
const trigger = (...args) => {
|
|
389
|
+
_trigger(args);
|
|
390
|
+
};
|
|
391
|
+
const withTags = (tags, callback) => {
|
|
392
|
+
currentTagsFilter = tags;
|
|
393
|
+
const result = callback();
|
|
394
|
+
currentTagsFilter = null;
|
|
395
|
+
return result;
|
|
396
|
+
};
|
|
397
|
+
const promise = (options) => {
|
|
398
|
+
return new Promise((resolve) => {
|
|
399
|
+
options = Object.assign(Object.assign({}, (options || {})), { limit: 1 });
|
|
400
|
+
const l = ((...args) => resolve(args));
|
|
401
|
+
addListener(l, options);
|
|
402
|
+
});
|
|
403
|
+
};
|
|
404
|
+
const first = (...args) => {
|
|
405
|
+
return _trigger(args, types_1.TriggerReturnType.FIRST);
|
|
406
|
+
};
|
|
407
|
+
const resolveFirst = (...args) => {
|
|
408
|
+
const response = _trigger(args, types_1.TriggerReturnType.FIRST);
|
|
409
|
+
if (response instanceof Promise) {
|
|
410
|
+
return response;
|
|
411
|
+
}
|
|
412
|
+
return Promise.resolve(response);
|
|
413
|
+
};
|
|
414
|
+
const all = (...args) => {
|
|
415
|
+
return _trigger(args, types_1.TriggerReturnType.ALL);
|
|
416
|
+
};
|
|
417
|
+
const resolveAll = (...args) => {
|
|
418
|
+
const response = _trigger(args, types_1.TriggerReturnType.ALL);
|
|
419
|
+
if (response instanceof Promise) {
|
|
420
|
+
return response;
|
|
421
|
+
}
|
|
422
|
+
return Promise.resolve(response);
|
|
423
|
+
};
|
|
424
|
+
const last = (...args) => {
|
|
425
|
+
return _trigger(args, types_1.TriggerReturnType.LAST);
|
|
426
|
+
};
|
|
427
|
+
const resolveLast = (...args) => {
|
|
428
|
+
const response = _trigger(args, types_1.TriggerReturnType.LAST);
|
|
429
|
+
if (response instanceof Promise) {
|
|
430
|
+
return response;
|
|
431
|
+
}
|
|
432
|
+
return Promise.resolve(response);
|
|
433
|
+
};
|
|
434
|
+
const merge = (...args) => {
|
|
435
|
+
return _trigger(args, types_1.TriggerReturnType.MERGE);
|
|
436
|
+
};
|
|
437
|
+
const resolveMerge = (...args) => {
|
|
438
|
+
const response = _trigger(args, types_1.TriggerReturnType.MERGE);
|
|
439
|
+
if (response instanceof Promise) {
|
|
440
|
+
return response;
|
|
441
|
+
}
|
|
442
|
+
return Promise.resolve(response);
|
|
443
|
+
};
|
|
444
|
+
const concat = (...args) => {
|
|
445
|
+
return _trigger(args, types_1.TriggerReturnType.CONCAT);
|
|
446
|
+
};
|
|
447
|
+
const resolveConcat = (...args) => {
|
|
448
|
+
const response = _trigger(args, types_1.TriggerReturnType.CONCAT);
|
|
449
|
+
if (response instanceof Promise) {
|
|
450
|
+
return response;
|
|
451
|
+
}
|
|
452
|
+
return Promise.resolve(response);
|
|
453
|
+
};
|
|
454
|
+
const firstNonEmpty = (...args) => {
|
|
455
|
+
return _trigger(args, types_1.TriggerReturnType.FIRST_NON_EMPTY);
|
|
456
|
+
};
|
|
457
|
+
const resolveFirstNonEmpty = (...args) => {
|
|
458
|
+
const response = _trigger(args, types_1.TriggerReturnType.FIRST_NON_EMPTY);
|
|
459
|
+
if (response instanceof Promise) {
|
|
460
|
+
return response;
|
|
461
|
+
}
|
|
462
|
+
return Promise.resolve(response);
|
|
463
|
+
};
|
|
464
|
+
const untilTrue = (...args) => {
|
|
465
|
+
_trigger(args, types_1.TriggerReturnType.UNTIL_TRUE);
|
|
466
|
+
};
|
|
467
|
+
const untilFalse = (...args) => {
|
|
468
|
+
_trigger(args, types_1.TriggerReturnType.UNTIL_FALSE);
|
|
469
|
+
};
|
|
470
|
+
const pipe = (...args) => {
|
|
471
|
+
return _trigger(args, types_1.TriggerReturnType.PIPE);
|
|
472
|
+
};
|
|
473
|
+
const resolvePipe = (...args) => {
|
|
474
|
+
const response = _trigger(args, types_1.TriggerReturnType.PIPE);
|
|
475
|
+
if (response instanceof Promise) {
|
|
476
|
+
return response;
|
|
477
|
+
}
|
|
478
|
+
return Promise.resolve(response);
|
|
479
|
+
};
|
|
480
|
+
const raw = (...args) => {
|
|
481
|
+
return _trigger(args, types_1.TriggerReturnType.RAW);
|
|
482
|
+
};
|
|
483
|
+
const api = {
|
|
484
|
+
addListener,
|
|
485
|
+
/** @alias addListener */
|
|
486
|
+
on: addListener,
|
|
487
|
+
/** @alias addListener */
|
|
488
|
+
listen: addListener,
|
|
489
|
+
/** @alias addListener */
|
|
490
|
+
subscribe: addListener,
|
|
491
|
+
removeListener,
|
|
492
|
+
/** @alias removeListener */
|
|
493
|
+
un: removeListener,
|
|
494
|
+
/** @alias removeListener */
|
|
495
|
+
off: removeListener,
|
|
496
|
+
/** @alias removeListener */
|
|
497
|
+
remove: removeListener,
|
|
498
|
+
/** @alias removeListener */
|
|
499
|
+
unsubscribe: removeListener,
|
|
500
|
+
trigger,
|
|
501
|
+
/** @alias trigger */
|
|
502
|
+
emit: trigger,
|
|
503
|
+
/** @alias trigger */
|
|
504
|
+
dispatch: trigger,
|
|
505
|
+
hasListener,
|
|
506
|
+
/** @alias hasListener */
|
|
507
|
+
has: hasListener,
|
|
508
|
+
removeAllListeners,
|
|
509
|
+
addErrorListener,
|
|
510
|
+
removeErrorListener,
|
|
511
|
+
suspend,
|
|
512
|
+
resume,
|
|
513
|
+
setOptions,
|
|
514
|
+
reset,
|
|
515
|
+
isSuspended,
|
|
516
|
+
isQueued,
|
|
517
|
+
withTags,
|
|
518
|
+
promise,
|
|
519
|
+
first,
|
|
520
|
+
resolveFirst,
|
|
521
|
+
all,
|
|
522
|
+
resolveAll,
|
|
523
|
+
last,
|
|
524
|
+
resolveLast,
|
|
525
|
+
merge,
|
|
526
|
+
resolveMerge,
|
|
527
|
+
concat,
|
|
528
|
+
resolveConcat,
|
|
529
|
+
firstNonEmpty,
|
|
530
|
+
resolveFirstNonEmpty,
|
|
531
|
+
untilTrue,
|
|
532
|
+
untilFalse,
|
|
533
|
+
pipe,
|
|
534
|
+
resolvePipe,
|
|
535
|
+
raw,
|
|
536
|
+
};
|
|
537
|
+
return api;
|
|
538
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { createEvent } from "./event";
|
|
2
|
+
import type { EventDefinitionHelper, EventOptions, ListenerOptions } from "./event";
|
|
3
|
+
import { ApiType, BaseHandler, ErrorListenerSignature, KeyOf, MapKey, ProxyType, TriggerReturnType } from "./lib/types";
|
|
4
|
+
type InterceptorFunction = (name: MapKey, args: any[], tags: string[] | null, returnType: TriggerReturnType | null) => boolean;
|
|
5
|
+
type RelaySource = {
|
|
6
|
+
on: (name: any, fn: (...args: any[]) => any, options?: ListenerOptions) => void;
|
|
7
|
+
addAllEventsListener: (fn: (name: any, args: any[]) => any, options?: ListenerOptions) => void;
|
|
8
|
+
un: (name: any, fn: (...args: any[]) => any, context?: object | null, tag?: string | null) => void;
|
|
9
|
+
removeAllEventsListener: (fn: (name: any, args: any[]) => any, context?: object | null, tag?: string | null) => void;
|
|
10
|
+
};
|
|
11
|
+
export type EventSourceSubscriber = (name: MapKey, fn: BaseHandler, eventSource: EventSource, options?: ListenerOptions) => void;
|
|
12
|
+
export type EventSourceUnsubscriber = (name: MapKey, fn: BaseHandler, eventSource: EventSource, tag?: string | null) => void;
|
|
13
|
+
export type EventSource<On extends BaseHandler = EventSourceSubscriber, Un extends BaseHandler = EventSourceUnsubscriber> = {
|
|
14
|
+
name: MapKey;
|
|
15
|
+
on: On;
|
|
16
|
+
un: Un;
|
|
17
|
+
accepts: ((name: MapKey) => boolean) | boolean;
|
|
18
|
+
proxyType?: ProxyType;
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
};
|
|
21
|
+
export interface BaseEventMap {
|
|
22
|
+
[key: MapKey]: BaseHandler;
|
|
23
|
+
}
|
|
24
|
+
export type DefaultEventMap = {
|
|
25
|
+
[key: MapKey]: (...args: any[]) => void;
|
|
26
|
+
};
|
|
27
|
+
export interface EventBusOptions<EventsMap extends BaseEventMap> {
|
|
28
|
+
eventOptions?: {
|
|
29
|
+
[key in KeyOf<EventsMap>]: EventOptions<EventsMap[key]>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export type GetEventsMap<EventDefinitionsMap extends BaseEventMap> = {
|
|
33
|
+
[key in KeyOf<EventDefinitionsMap>]: EventDefinitionHelper<EventDefinitionsMap[key]>;
|
|
34
|
+
};
|
|
35
|
+
type GetEventTypesMap<EventDefinitionsMap extends BaseEventMap> = {
|
|
36
|
+
[key in KeyOf<EventDefinitionsMap>]: ReturnType<typeof createEvent<EventDefinitionsMap[key]>>;
|
|
37
|
+
};
|
|
38
|
+
export type EventBusDefinitionHelper<EventsMap extends BaseEventMap = BaseEventMap> = {
|
|
39
|
+
eventSignatures: EventsMap;
|
|
40
|
+
events: GetEventsMap<EventsMap>;
|
|
41
|
+
eventTypes: GetEventTypesMap<EventsMap>;
|
|
42
|
+
};
|
|
43
|
+
export declare function createEventBus<EventsMap extends BaseEventMap = DefaultEventMap>(eventBusOptions?: EventBusOptions<EventsMap>): ApiType<EventBusDefinitionHelper<EventsMap>, {
|
|
44
|
+
readonly addListener: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, options?: ListenerOptions) => void;
|
|
45
|
+
/** @alias addListener */
|
|
46
|
+
readonly on: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, options?: ListenerOptions) => void;
|
|
47
|
+
/** @alias addListener */
|
|
48
|
+
readonly listen: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, options?: ListenerOptions) => void;
|
|
49
|
+
/** @alias addListener */
|
|
50
|
+
readonly subscribe: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, options?: ListenerOptions) => void;
|
|
51
|
+
readonly once: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, options?: ListenerOptions) => void;
|
|
52
|
+
readonly promise: <K extends KeyOf<GetEventsMap<EventsMap>>>(name: K, options?: ListenerOptions) => Promise<Parameters<EventsMap[K]>>;
|
|
53
|
+
readonly removeListener: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, context?: object | null, tag?: string | null) => void;
|
|
54
|
+
/** @alias removeListener */
|
|
55
|
+
readonly un: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, context?: object | null, tag?: string | null) => void;
|
|
56
|
+
/** @alias removeListener */
|
|
57
|
+
readonly off: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, context?: object | null, tag?: string | null) => void;
|
|
58
|
+
/** @alias removeListener */
|
|
59
|
+
readonly remove: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, context?: object | null, tag?: string | null) => void;
|
|
60
|
+
/** @alias removeListener */
|
|
61
|
+
readonly unsubscribe: <K extends KeyOf<GetEventsMap<EventsMap>>, H extends GetEventsMap<EventsMap>[K]["signature"]>(name: K, handler: H, context?: object | null, tag?: string | null) => void;
|
|
62
|
+
readonly trigger: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => void;
|
|
63
|
+
/** @alias trigger */
|
|
64
|
+
readonly emit: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => void;
|
|
65
|
+
/** @alias trigger */
|
|
66
|
+
readonly dispatch: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => void;
|
|
67
|
+
readonly get: <K extends KeyOf<GetEventsMap<EventsMap>>>(name: K) => GetEventTypesMap<EventsMap>[K];
|
|
68
|
+
readonly add: (name: MapKey, options?: EventOptions<BaseHandler>) => void;
|
|
69
|
+
readonly first: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => ReturnType<EventsMap[K]> | undefined>;
|
|
70
|
+
readonly resolveFirst: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => Promise<Awaited<ReturnType<EventsMap[K]>> | undefined>>;
|
|
71
|
+
readonly all: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => ReturnType<EventsMap[K]>[]>;
|
|
72
|
+
readonly resolveAll: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => Promise<Awaited<ReturnType<EventsMap[K]>>[]>>;
|
|
73
|
+
readonly last: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => ReturnType<EventsMap[K]> | undefined>;
|
|
74
|
+
readonly resolveLast: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => Promise<Awaited<ReturnType<EventsMap[K]>> | undefined>>;
|
|
75
|
+
readonly merge: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => ReturnType<EventsMap[K]> | undefined>;
|
|
76
|
+
readonly resolveMerge: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => Promise<Awaited<ReturnType<EventsMap[K]>> | undefined>>;
|
|
77
|
+
readonly concat: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => (ReturnType<EventsMap[K]> extends infer T ? T extends ReturnType<EventsMap[K]> ? T extends (infer U)[] ? U : T : never : never)[]>;
|
|
78
|
+
readonly resolveConcat: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => Promise<(Awaited<ReturnType<EventsMap[K]>> extends infer T ? T extends Awaited<ReturnType<EventsMap[K]>> ? T extends (infer U)[] ? U : T : never : never)[]>>;
|
|
79
|
+
readonly firstNonEmpty: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => ReturnType<EventsMap[K]> | undefined>;
|
|
80
|
+
readonly resolveFirstNonEmpty: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => Promise<Awaited<ReturnType<EventsMap[K]>> | undefined>>;
|
|
81
|
+
readonly untilTrue: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => void>;
|
|
82
|
+
readonly untilFalse: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => void>;
|
|
83
|
+
readonly pipe: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => ReturnType<EventsMap[K]> | undefined>;
|
|
84
|
+
readonly resolvePipe: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => Promise<Awaited<ReturnType<EventsMap[K]>> | undefined>>;
|
|
85
|
+
readonly raw: <K extends KeyOf<GetEventsMap<EventsMap>>, A extends GetEventsMap<EventsMap>[K]["arguments"]>(name: K, ...args: A) => ReturnType<(...args: Parameters<EventsMap[K]>) => (ReturnType<EventsMap[K]> extends infer T ? T extends ReturnType<EventsMap[K]> ? T extends (infer U)[] ? U : T : never : never)[]>;
|
|
86
|
+
readonly withTags: <T extends (...args: any[]) => any>(tags: string[], callback: T) => ReturnType<T>;
|
|
87
|
+
readonly intercept: (fn: InterceptorFunction) => void;
|
|
88
|
+
readonly stopIntercepting: () => void;
|
|
89
|
+
readonly reset: () => void;
|
|
90
|
+
readonly suspendAll: (withQueue?: boolean) => void;
|
|
91
|
+
readonly resumeAll: () => void;
|
|
92
|
+
readonly relay: ({ eventSource, remoteEventName, localEventName, proxyType, localEventNamePrefix, }: {
|
|
93
|
+
eventSource: RelaySource;
|
|
94
|
+
remoteEventName: MapKey;
|
|
95
|
+
localEventName?: any;
|
|
96
|
+
proxyType?: ProxyType;
|
|
97
|
+
localEventNamePrefix?: string | null;
|
|
98
|
+
}) => void;
|
|
99
|
+
readonly unrelay: ({ eventSource, remoteEventName, localEventName, proxyType, localEventNamePrefix, }: {
|
|
100
|
+
eventSource: RelaySource;
|
|
101
|
+
remoteEventName: MapKey;
|
|
102
|
+
localEventName?: any;
|
|
103
|
+
proxyType?: ProxyType;
|
|
104
|
+
localEventNamePrefix?: string | null;
|
|
105
|
+
}) => void;
|
|
106
|
+
readonly addEventSource: (eventSource: EventSource) => void;
|
|
107
|
+
readonly removeEventSource: (eventSource: EventSource | MapKey) => void;
|
|
108
|
+
readonly addAllEventsListener: (handler: (name: MapKey, args: any[], tags: string[] | null) => void, listenerOptions?: ListenerOptions) => void;
|
|
109
|
+
readonly removeAllEventsListener: (handler: (name: MapKey, args: any[], tags: string[] | null) => void, context?: object | null, tag?: string | null) => boolean;
|
|
110
|
+
readonly addErrorListener: (handler: ErrorListenerSignature<any[]>, listenerOptions?: ListenerOptions) => void;
|
|
111
|
+
readonly removeErrorListener: (handler: ErrorListenerSignature<any[]>, context?: object | null, tag?: string | null) => boolean;
|
|
112
|
+
}>;
|
|
113
|
+
export type BaseEventBusDefinition = EventBusDefinitionHelper<BaseEventMap>;
|
|
114
|
+
export type BaseEventBus = ReturnType<typeof createEventBus<BaseEventMap>>;
|
|
115
|
+
export {};
|