@okikio/observables 1.0.2

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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +578 -0
  3. package/esm/_dnt.polyfills.d.ts +20 -0
  4. package/esm/_dnt.polyfills.d.ts.map +1 -0
  5. package/esm/_dnt.polyfills.js +12 -0
  6. package/esm/_spec.d.ts +260 -0
  7. package/esm/_spec.d.ts.map +1 -0
  8. package/esm/_spec.js +1 -0
  9. package/esm/_types.d.ts +141 -0
  10. package/esm/_types.d.ts.map +1 -0
  11. package/esm/_types.js +20 -0
  12. package/esm/error.d.ts +331 -0
  13. package/esm/error.d.ts.map +1 -0
  14. package/esm/error.js +408 -0
  15. package/esm/events.d.ts +320 -0
  16. package/esm/events.d.ts.map +1 -0
  17. package/esm/events.js +451 -0
  18. package/esm/helpers/_types.d.ts +188 -0
  19. package/esm/helpers/_types.d.ts.map +1 -0
  20. package/esm/helpers/_types.js +1 -0
  21. package/esm/helpers/mod.d.ts +90 -0
  22. package/esm/helpers/mod.d.ts.map +1 -0
  23. package/esm/helpers/mod.js +90 -0
  24. package/esm/helpers/operations/batch.d.ts +109 -0
  25. package/esm/helpers/operations/batch.d.ts.map +1 -0
  26. package/esm/helpers/operations/batch.js +140 -0
  27. package/esm/helpers/operations/combination.d.ts +162 -0
  28. package/esm/helpers/operations/combination.d.ts.map +1 -0
  29. package/esm/helpers/operations/combination.js +350 -0
  30. package/esm/helpers/operations/conditional.d.ts +211 -0
  31. package/esm/helpers/operations/conditional.d.ts.map +1 -0
  32. package/esm/helpers/operations/conditional.js +280 -0
  33. package/esm/helpers/operations/core.d.ts +198 -0
  34. package/esm/helpers/operations/core.d.ts.map +1 -0
  35. package/esm/helpers/operations/core.js +264 -0
  36. package/esm/helpers/operations/errors.d.ts +277 -0
  37. package/esm/helpers/operations/errors.d.ts.map +1 -0
  38. package/esm/helpers/operations/errors.js +378 -0
  39. package/esm/helpers/operations/mod.d.ts +26 -0
  40. package/esm/helpers/operations/mod.d.ts.map +1 -0
  41. package/esm/helpers/operations/mod.js +25 -0
  42. package/esm/helpers/operations/timing.d.ts +206 -0
  43. package/esm/helpers/operations/timing.d.ts.map +1 -0
  44. package/esm/helpers/operations/timing.js +457 -0
  45. package/esm/helpers/operators.d.ts +520 -0
  46. package/esm/helpers/operators.d.ts.map +1 -0
  47. package/esm/helpers/operators.js +563 -0
  48. package/esm/helpers/pipe.d.ts +118 -0
  49. package/esm/helpers/pipe.d.ts.map +1 -0
  50. package/esm/helpers/pipe.js +129 -0
  51. package/esm/helpers/utils.d.ts +142 -0
  52. package/esm/helpers/utils.d.ts.map +1 -0
  53. package/esm/helpers/utils.js +193 -0
  54. package/esm/mod.d.ts +863 -0
  55. package/esm/mod.d.ts.map +1 -0
  56. package/esm/mod.js +861 -0
  57. package/esm/observable.d.ts +1610 -0
  58. package/esm/observable.d.ts.map +1 -0
  59. package/esm/observable.js +1970 -0
  60. package/esm/package.json +3 -0
  61. package/esm/queue.d.ts +201 -0
  62. package/esm/queue.d.ts.map +1 -0
  63. package/esm/queue.js +273 -0
  64. package/esm/symbol.d.ts +60 -0
  65. package/esm/symbol.d.ts.map +1 -0
  66. package/esm/symbol.js +132 -0
  67. package/package.json +96 -0
  68. package/script/_dnt.polyfills.d.ts +20 -0
  69. package/script/_dnt.polyfills.d.ts.map +1 -0
  70. package/script/_dnt.polyfills.js +13 -0
  71. package/script/_spec.d.ts +260 -0
  72. package/script/_spec.d.ts.map +1 -0
  73. package/script/_spec.js +2 -0
  74. package/script/_types.d.ts +141 -0
  75. package/script/_types.d.ts.map +1 -0
  76. package/script/_types.js +22 -0
  77. package/script/error.d.ts +331 -0
  78. package/script/error.d.ts.map +1 -0
  79. package/script/error.js +414 -0
  80. package/script/events.d.ts +320 -0
  81. package/script/events.d.ts.map +1 -0
  82. package/script/events.js +458 -0
  83. package/script/helpers/_types.d.ts +188 -0
  84. package/script/helpers/_types.d.ts.map +1 -0
  85. package/script/helpers/_types.js +2 -0
  86. package/script/helpers/mod.d.ts +90 -0
  87. package/script/helpers/mod.d.ts.map +1 -0
  88. package/script/helpers/mod.js +106 -0
  89. package/script/helpers/operations/batch.d.ts +109 -0
  90. package/script/helpers/operations/batch.d.ts.map +1 -0
  91. package/script/helpers/operations/batch.js +144 -0
  92. package/script/helpers/operations/combination.d.ts +162 -0
  93. package/script/helpers/operations/combination.d.ts.map +1 -0
  94. package/script/helpers/operations/combination.js +355 -0
  95. package/script/helpers/operations/conditional.d.ts +211 -0
  96. package/script/helpers/operations/conditional.d.ts.map +1 -0
  97. package/script/helpers/operations/conditional.js +286 -0
  98. package/script/helpers/operations/core.d.ts +198 -0
  99. package/script/helpers/operations/core.d.ts.map +1 -0
  100. package/script/helpers/operations/core.js +272 -0
  101. package/script/helpers/operations/errors.d.ts +277 -0
  102. package/script/helpers/operations/errors.d.ts.map +1 -0
  103. package/script/helpers/operations/errors.js +387 -0
  104. package/script/helpers/operations/mod.d.ts +26 -0
  105. package/script/helpers/operations/mod.d.ts.map +1 -0
  106. package/script/helpers/operations/mod.js +41 -0
  107. package/script/helpers/operations/timing.d.ts +206 -0
  108. package/script/helpers/operations/timing.d.ts.map +1 -0
  109. package/script/helpers/operations/timing.js +464 -0
  110. package/script/helpers/operators.d.ts +520 -0
  111. package/script/helpers/operators.d.ts.map +1 -0
  112. package/script/helpers/operators.js +570 -0
  113. package/script/helpers/pipe.d.ts +118 -0
  114. package/script/helpers/pipe.d.ts.map +1 -0
  115. package/script/helpers/pipe.js +132 -0
  116. package/script/helpers/utils.d.ts +142 -0
  117. package/script/helpers/utils.d.ts.map +1 -0
  118. package/script/helpers/utils.js +200 -0
  119. package/script/mod.d.ts +863 -0
  120. package/script/mod.d.ts.map +1 -0
  121. package/script/mod.js +877 -0
  122. package/script/observable.d.ts +1610 -0
  123. package/script/observable.d.ts.map +1 -0
  124. package/script/observable.js +1984 -0
  125. package/script/package.json +3 -0
  126. package/script/queue.d.ts +201 -0
  127. package/script/queue.d.ts.map +1 -0
  128. package/script/queue.js +286 -0
  129. package/script/symbol.d.ts +60 -0
  130. package/script/symbol.d.ts.map +1 -0
  131. package/script/symbol.js +135 -0
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Multicast event primitives built on top of the Observable runtime.
3
+ *
4
+ * This entrypoint is for the hot side of the library: shared event streams that
5
+ * multiple consumers can listen to at the same time. It exports `EventBus` for
6
+ * one-to-many pub/sub, `createEventDispatcher` for named and type-safe events,
7
+ * and helpers such as `withReplay` and `waitForEvent` for common coordination
8
+ * patterns.
9
+ *
10
+ * Use `Observable` when each subscription should start fresh work. Use this
11
+ * module when one emission should fan out to many listeners, such as UI events,
12
+ * app-wide notifications, or workflow status updates.
13
+ *
14
+ * @module
15
+ */
16
+ import "./_dnt.polyfills.js";
17
+ import type { Subscription } from "./_types.js";
18
+ import { Observable } from "./observable.js";
19
+ import { Symbol } from "./symbol.js";
20
+ /**
21
+ * A multicast event bus that extends {@link Observable<T>}, allowing
22
+ * emission of values to multiple subscribers and supporting both
23
+ * Observer-style and async-iterator consumption.
24
+ *
25
+ * @typeParam T - The type of values emitted by this bus.
26
+ *
27
+ * - Calling {@link emit} delivers the value to all active subscribers.
28
+ * - Calling {@link close} completes all subscribers and prevents further emissions.
29
+ * - Implements both {@link Symbol.dispose} and {@link Symbol.asyncDispose}
30
+ * for cleanup in synchronous and asynchronous contexts.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { EventBus } from './EventBus.ts';
35
+ *
36
+ * // Create a bus for string messages
37
+ * const bus = new EventBus<string>();
38
+ *
39
+ * // Subscribe using Observer
40
+ * bus.events.subscribe({
41
+ * next(msg) { console.log('Received:', msg); },
42
+ * complete() { console.log('Bus closed'); }
43
+ * });
44
+ *
45
+ * // Emit values
46
+ * bus.emit('hello');
47
+ * bus.emit('world');
48
+ *
49
+ * // Close the bus
50
+ * bus.close();
51
+ * ```
52
+ */
53
+ export declare class EventBus<T> extends Observable<T> {
54
+ #private;
55
+ /**
56
+ * Synchronous disposal method (for `using` syntax).
57
+ *
58
+ * Alias for {@link close}.
59
+ */
60
+ [Symbol.dispose]: () => void;
61
+ [Symbol.asyncDispose]: () => Promise<void>;
62
+ /**
63
+ * Construct a new EventBus instance.
64
+ *
65
+ * The base {@link Observable} constructor is invoked with the subscriber
66
+ * registration logic, adding and removing subscribers to the internal set.
67
+ */
68
+ constructor();
69
+ /**
70
+ * Exposes the bus itself as an {@link Observable<T>} for subscription.
71
+ *
72
+ * @returns The current instance as an Observable of T.
73
+ */
74
+ get events(): Observable<T>;
75
+ /**
76
+ * Emit a value to all active subscribers.
77
+ *
78
+ * @param value - The value to deliver.
79
+ */
80
+ emit(value: T): void;
81
+ /**
82
+ * Close the bus, completing all subscribers and preventing further emits.
83
+ */
84
+ close(): void;
85
+ }
86
+ /**
87
+ * A mapping from event names (keys) to their payload types (values).
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * interface MyEvents {
92
+ * login: { userId: string };
93
+ * logout: void;
94
+ * }
95
+ * ```
96
+ */
97
+ export type EventMap = object;
98
+ /**
99
+ * The return type of {@link createEventDispatcher}.
100
+ * Provides a strongly-typed event bus interface.
101
+ *
102
+ * @typeParam E - The event map type, mapping event names to payloads.
103
+ */
104
+ export interface EventDispatcher<E extends EventMap> {
105
+ /**
106
+ * Emit an event with the given name and payload.
107
+ * @param name - The event name.
108
+ * @param payload - The payload matching the event name.
109
+ */
110
+ emit<Name extends keyof E>(name: Name, payload: E[Name]): void;
111
+ /**
112
+ * Subscribe to a specific event by name.
113
+ * Only events with a matching `type` will invoke the handler.
114
+ * @param name - The event name to listen for.
115
+ * @param handler - The callback invoked with the event payload.
116
+ * @returns A subscription object with `unsubscribe()`.
117
+ */
118
+ on<Name extends keyof E>(name: Name, handler: (payload: E[Name]) => void): Subscription;
119
+ /**
120
+ * Observable stream of all emitted events, carrying `{ type, payload }` objects.
121
+ */
122
+ events: EventBus<{
123
+ type: keyof E;
124
+ payload: E[keyof E];
125
+ }>;
126
+ /**
127
+ * Close the bus, completing all subscribers and preventing further emits.
128
+ */
129
+ close(): void;
130
+ }
131
+ /**
132
+ * Creates a strongly-typed event bus based on {@link EventBus}, ensuring
133
+ * that both `emit` and `on` methods enforce matching event names and payload types.
134
+ *
135
+ * @typeParam E - The event map type, mapping event names to payloads.
136
+ *
137
+ * @returns An object with the following methods:
138
+ * - `emit(name, payload)`: Emit an event.
139
+ * - `on(name, handler)`: Subscribe to a specific event.
140
+ * - `events`: Observable stream of all events.
141
+ * - `close()`: Close the bus and complete all subscribers.
142
+ *
143
+ * @example
144
+ * ```ts
145
+ * interface MyEvents {
146
+ * message: { text: string };
147
+ * error: { code: number; message: string };
148
+ * }
149
+ *
150
+ * const bus = createTypedEventBus<MyEvents>();
151
+ *
152
+ * // Subscribe to `message` events
153
+ * bus.on('message', payload => {
154
+ * console.log('New message:', payload.text);
155
+ * });
156
+ *
157
+ * // Emit an event
158
+ * bus.emit('message', { text: 'Hello World' });
159
+ *
160
+ * // Close the bus when done
161
+ * bus.close();
162
+ * ```
163
+ */
164
+ export declare function createEventDispatcher<E extends EventMap>(): EventDispatcher<E>;
165
+ /**
166
+ * Options for `waitForEvent`.
167
+ */
168
+ export interface WaitForEventOptions {
169
+ /**
170
+ * An AbortSignal to cancel waiting for the event.
171
+ */
172
+ signal?: AbortSignal;
173
+ /**
174
+ * If true, rejects if the underlying stream completes before the event fires.
175
+ * @defaultValue false
176
+ */
177
+ throwOnClose?: boolean;
178
+ }
179
+ /**
180
+ * Waits for the next occurrence of a specific event on a typed event bus.
181
+ * Resolves with the event payload when the named event fires.
182
+ * Can be aborted or optionally reject if the bus closes first.
183
+ *
184
+ * @typeParam E - The event map type.
185
+ * @typeParam K - The specific event key to listen for.
186
+ *
187
+ * @param bus - An object with an `events` Observable emitting `{ type, payload }`.
188
+ * @param type - The event name to wait for.
189
+ * @param options - Optional signal to abort, and throwOnClose behavior.
190
+ * @returns A promise resolving to the payload of the event, or rejecting on error/abort/close.
191
+ *
192
+ * @example
193
+ * ```ts
194
+ * interface MyEvents {
195
+ * data: { value: number };
196
+ * done: void;
197
+ * }
198
+ *
199
+ * const bus = createTypedEventBus<MyEvents>();
200
+ *
201
+ * // somewhere else...
202
+ * waitForEvent(bus, 'data').then(payload => {
203
+ * console.log('Data arrived:', payload.value);
204
+ * });
205
+ *
206
+ * // later
207
+ * bus.emit('data', { value: 42 });
208
+ * ```
209
+ */
210
+ export declare function waitForEvent<E extends EventMap, K extends keyof E>(bus: {
211
+ events: Observable<{
212
+ type: keyof E;
213
+ payload: E[keyof E];
214
+ }>;
215
+ }, type: K, { signal, throwOnClose }?: WaitForEventOptions): Promise<E[K] | undefined>;
216
+ /**
217
+ * Controls when the replay buffer connects to the source Observable.
218
+ *
219
+ * - `'eager'`: Connects immediately and buffers values even with zero subscribers.
220
+ * Like a security camera that's always recording.
221
+ * - `'lazy'`: Connects only when the first subscriber arrives, disconnects when
222
+ * the last one leaves. Like a motion-activated camera.
223
+ *
224
+ * Choose 'eager' for system-critical events you never want to miss.
225
+ * Choose 'lazy' for expensive operations that shouldn't run without consumers.
226
+ */
227
+ export type ReplayMode = "eager" | "lazy";
228
+ /**
229
+ * Configuration options for replay behavior.
230
+ */
231
+ export interface ReplayOptions {
232
+ /**
233
+ * Maximum number of values to buffer.
234
+ * When the buffer is full, the oldest value is discarded (FIFO).
235
+ *
236
+ * @default Infinity (unlimited buffer, use with caution)
237
+ */
238
+ count?: number;
239
+ /**
240
+ * Determines when to connect to the source Observable.
241
+ *
242
+ * @default 'lazy' (resource-efficient, connects on-demand)
243
+ */
244
+ mode?: ReplayMode;
245
+ }
246
+ /**
247
+ * Adds replay capability to an Observable, multicasting values to multiple subscribers
248
+ * while maintaining a buffer of recent emissions.
249
+ *
250
+ * Without replay, each new subscriber triggers a fresh execution of the source Observable:
251
+ * ```ts
252
+ * const apiCall = new Observable(subscriber => {
253
+ * console.log('Making expensive API call...');
254
+ * fetch('/api/data').then(response => subscriber.next(response));
255
+ * });
256
+ *
257
+ * apiCall.subscribe(data1 => {}); // Triggers API call #1
258
+ * apiCall.subscribe(data2 => {}); // Triggers API call #2 (duplicate!)
259
+ * ```
260
+ *
261
+ * With replay, the source executes once and shares results:
262
+ * ```ts
263
+ * const sharedApi = withReplay(apiCall, { count: 1, mode: 'lazy' });
264
+ *
265
+ * sharedApi.subscribe(data1 => {}); // Triggers API call
266
+ * sharedApi.subscribe(data2 => {}); // Gets cached result, no new call!
267
+ * ```
268
+ *
269
+ * ## Memory Considerations
270
+ *
271
+ * - Buffer size directly impacts memory usage: `count * sizeof(T)`
272
+ * - 'eager' mode holds references even with no subscribers (potential memory leak)
273
+ * - 'lazy' mode clears buffer when all subscribers disconnect (automatic cleanup)
274
+ * - Consider using finite counts for long-running streams to prevent unbounded growth
275
+ *
276
+ * > **Note**: Infinite buffers are by default capped at 1000 items to prevent memory issues.
277
+ * > The primary reason for this cap is because some runtimes such as Deno and Node.js
278
+ * > litereally crash when you try to allocate Ininity-sized arrays.
279
+ *
280
+ * ## Performance Characteristics
281
+ *
282
+ * - Enqueue/Dequeue: O(1) constant time
283
+ * - New subscriber replay: O(n) where n = buffer size
284
+ * - Memory overhead: One queue + subscriber set + source subscription
285
+ *
286
+ * ## Edge Cases & Gotchas
287
+ *
288
+ * 1. **Late subscribers in eager mode**: May receive very old values if the source
289
+ * emitted long ago and no cleanup occurred.
290
+ *
291
+ * 2. **Infinite buffers**: Without a count limit, buffers grow indefinitely.
292
+ * Always set a reasonable count for production use.
293
+ *
294
+ * 3. **Error handling**: Errors are multicast to all subscribers but don't clear
295
+ * the buffer. New subscribers still get the replay before the error.
296
+ *
297
+ * 4. **Completion**: The source completion is multicast, but the replay buffer
298
+ * remains accessible to new subscribers (they get replay + completion).
299
+ *
300
+ * @param source The source Observable to add replay behavior to
301
+ * @param options Configuration for replay behavior
302
+ * @returns A new Observable with replay capability
303
+ *
304
+ * @example
305
+ * ```ts
306
+ * // Lazy mode - only buffers when subscribers are present
307
+ * const shared = withReplay(expensive, {
308
+ * count: 5,
309
+ * mode: 'lazy' // Only run expensive when needed
310
+ * });
311
+ *
312
+ * // Eager mode - always buffering, like a flight recorder
313
+ * const eventLog = withReplay(systemEvents, {
314
+ * count: 100,
315
+ * mode: 'eager' // Capture events even if no one's listening
316
+ * });
317
+ * ```
318
+ */
319
+ export declare function withReplay<T>(source: Observable<T>, { count, mode }?: ReplayOptions): Observable<T>;
320
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}