@actdim/msgmesh 1.2.4 → 1.2.6

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 CHANGED
@@ -1 +1,815 @@
1
- # @actdim/msgmesh
1
+ # @actdim/msgmesh - A type-safe, modular message mesh for scalable async communication in TypeScript
2
+
3
+ ## Quick Start
4
+
5
+ Try @actdim/msgmesh instantly in your browser without any installation:
6
+
7
+ [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/~/github.com/actdim/msgmesh)
8
+
9
+ Once the project loads, run the tests to see the message bus in action:
10
+
11
+ ```bash
12
+ pnpm run test
13
+ ```
14
+
15
+ ## Overview
16
+
17
+ ### The Challenge
18
+
19
+ Modern client-side TypeScript applications require robust event handling mechanisms. Events may be needed within a single component or for communication between components, serving as a decoupling layer independent of component hierarchy. As applications grow in complexity and scale, the convenience, performance, and flexibility of the event system become critical factors. A well-designed messaging system enables extensibility, maintainability, and scalability without losing control over component interactions or system observability. Such a system becomes one of the pillars of high-quality application architecture.
20
+
21
+ In our case, this message bus serves as the foundation of the @actdim/dynstruct architectural framework.
22
+
23
+ ### Analysis of Existing Solutions
24
+
25
+ When examining popular messaging systems in the frontend ecosystem, particularly for React-based applications, several categories emerge:
26
+
27
+ #### Event Emitters
28
+
29
+ - **Pros**: Simple to understand, typically local in scope
30
+ - **Cons**:
31
+ - Limited capabilities and scalability
32
+ - Weak support for interaction structures and declarative approaches
33
+ - Poor type safety (fictitious typing, manual implementation required)
34
+ - Incomplete Promise integration
35
+ - Lack of abstraction levels
36
+
37
+ #### Message Buses
38
+
39
+ - **Pros**: Reduce component coupling, beneficial for development and testing
40
+ - **Cons**:
41
+ - Underdeveloped type system despite TypeScript's power
42
+ - Often feel like academic experiments porting backend message buses to frontend
43
+ - Poor integration with common development patterns (limited adapters for rate limiting, throttling, debouncing, retry logic)
44
+ - More complex to maintain
45
+
46
+ #### Reactive Event Streams & Observer Pattern
47
+
48
+ - **Pros**: Powerful for compositions and complex data flows
49
+ - **Cons**:
50
+ - Complex to understand, maintain, and debug
51
+ - Strong architectural influence requiring paradigm shift (similar to procedural-to-functional programming transition)
52
+ - Often tightly embedded throughout the system as an integral part
53
+ - Creates hard dependencies across types, code style, tests, DI, error handling, and even team thinking
54
+ - Essentially becomes the "language" of the application
55
+
56
+ #### React State Management Systems
57
+
58
+ - **Pros**: Purpose-built for React ecosystem
59
+ - **Cons**:
60
+ - Tight coupling with React (hooks, lifecycle), making usage outside components difficult
61
+ - Significant boilerplate code slowing development and complicating maintenance
62
+ - Often enforce immutability paradigm, which looks elegant on paper but creates more problems and wrapper code than value in practice
63
+ - Rarely provide configuration for event/stream connections (possibly due to weak or inconvenient payload typing)
64
+
65
+ ### The Solution: @actdim/msgmesh
66
+
67
+ @actdim/msgmesh addresses these shortcomings by providing a message bus that is:
68
+
69
+ - **Flexible and extensible**: Adapts to various use cases without imposing rigid patterns
70
+ - **Scalable**: Grows with your application without losing manageability
71
+ - **Minimally opinionated**: Doesn't force a specific paradigm
72
+ - **Simple to understand**: Clear mental model and API
73
+ - **Local in impact**: Doesn't permeate every aspect of your codebase
74
+
75
+ ### Key Design Goals
76
+
77
+ #### Observability
78
+
79
+ - Comprehensive logging and tracing capabilities
80
+ - Ability to subscribe to any event at any time
81
+ - Minimal system complexity and coupling
82
+ - Maintained control and visibility
83
+
84
+ #### Lifecycle Management
85
+
86
+ - Convenient subscription and unsubscription with various configuration options
87
+ - Automatic cleanup
88
+ - Integration with React lifecycle (when needed)
89
+ - Support for AbortSignal and AbortController patterns
90
+
91
+ ## Architecture
92
+
93
+ ### Message Structure
94
+
95
+ The message bus is defined by a type structure consisting of three levels:
96
+
97
+ #### 1. Channels
98
+
99
+ Channels organize messages by task class, domain, event type, or any other logical grouping. Channels use string identifiers with dot notation recommended for namespacing.
100
+
101
+ **Reserved System Channel**: `MSGBUS.ERROR` - for system-level errors
102
+
103
+ #### 2. Groups
104
+
105
+ Groups connect related messages within a single channel. Standard groups include:
106
+
107
+ - **`in`**: For requests or arbitrary messages/events (default for most operations)
108
+ - **`out`**: For responses to requests
109
+ - **`error`**: Reserved system group for channel-specific errors
110
+
111
+ You can define custom groups for message multiplexing and input type overloading.
112
+
113
+ #### 3. Message Types
114
+
115
+ Each group defines a message structure (payload type). For standard buses, types can be any valid TypeScript type. For persistent message buses (work in progress), types must be serializable.
116
+
117
+ **Note**: You don't need to wrap `out` types in `Promise` - async handling is automatically supported at the API level.
118
+
119
+ ### Type Definition Example
120
+
121
+ ```typescript
122
+ import { RequireExtends, MsgStruct } from '@actdim/msgmesh';
123
+
124
+ export type MyBusStruct = RequireExtends<
125
+ {
126
+ 'Test.ComputeSum': {
127
+ in: { a: number; b: number };
128
+ out: number;
129
+ };
130
+ 'Test.DoSomeWork': {
131
+ in: string;
132
+ out: void;
133
+ };
134
+ 'Test.TestTaskWithRepeat': {
135
+ in: string;
136
+ out: void;
137
+ };
138
+ 'Test.Multiplexer': {
139
+ in1: string;
140
+ in2: number;
141
+ out: number;
142
+ };
143
+ },
144
+ MsgStruct
145
+ >;
146
+ ```
147
+
148
+ ## Usage Patterns
149
+
150
+ ### Global vs Local Usage
151
+
152
+ @actdim/msgmesh can be used in two primary ways:
153
+
154
+ #### Global Application-Level Bus
155
+
156
+ Maintain a system-wide type structure for messages/events, organizing them by:
157
+
158
+ - Tasks (component ownership)
159
+ - Groups (in/out, input type overloading)
160
+ - Topics (additional filtering)
161
+
162
+ #### Local Component/Module-Level Bus
163
+
164
+ Use within any logical grouping of components or modules.
165
+
166
+ **Important**: You only need **one bus instance** for the entire application. The bus routes messages based on keys, so as long as key uniqueness is maintained, a single instance can handle messages from any locally-defined schema.
167
+
168
+ ### Creating a Message Bus
169
+
170
+ ```typescript
171
+ import { createMsgBus, MsgBus } from '@actdim/msgmesh';
172
+ import { KeysOf } from '@actdim/utico/typeCore';
173
+
174
+ // Basic bus creation
175
+ const msgBus = createMsgBus<MyBusStruct>();
176
+
177
+ // With custom headers (if needed)
178
+ type CustomHeaders = MsgHeaders & {
179
+ userId?: string;
180
+ sessionId?: string;
181
+ };
182
+
183
+ const msgBusWithHeaders = createMsgBus<MyBusStruct, CustomHeaders>();
184
+
185
+ // Note: The instance can process messages from other structures too
186
+ // We only type the API for development convenience
187
+ // You can compose structures as needed, just ensure they don't overlap (unless intentional)
188
+
189
+ type AppBusStruct = ComponentBusStruct & ApiBusStruct;
190
+ const appMsgBus = createMsgBus<AppBusStruct>();
191
+ ```
192
+
193
+ ### Type Utilities
194
+
195
+ ```typescript
196
+ // Export bus type for dependency injection or props
197
+ export type MyMsgBus = MsgBus<MyBusStruct, CustomHeaders>;
198
+
199
+ // Generic string literal type for channels - useful for component constraints
200
+ type MyMsgChannels<TChannel extends keyof MyBusStruct | Array<keyof MyBusStruct>> = KeysOf<
201
+ MyBusStruct,
202
+ TChannel
203
+ >;
204
+
205
+ // Example: Restricting a component to specific channels
206
+ // Helper types are necessary for IntelliSense with dynamic types
207
+ // All API checks are enforced at compile time - you cannot violate defined contracts
208
+ type Behavior = {
209
+ messages: MyMsgChannels<'Test.ComputeSum' | 'Test.DoSomeWork'>;
210
+ };
211
+ ```
212
+
213
+ ## API Reference
214
+
215
+ ### Configuration
216
+
217
+ You can configure channels with various options:
218
+
219
+ ```typescript
220
+ import { MsgBusConfig } from '@actdim/msgmesh';
221
+
222
+ const config: MsgBusConfig<MyBusStruct> = {
223
+ 'Test.ComputeSum': {
224
+ replayBufferSize: 10, // Number of messages to buffer for replay
225
+ replayWindowTime: 5000, // Time window for replay (ms)
226
+ delay: 100, // Delay before processing (ms)
227
+ throttle: {
228
+ // Throttle configuration
229
+ duration: 1000,
230
+ leading: true,
231
+ trailing: true,
232
+ },
233
+ debounce: 500, // Debounce delay (ms)
234
+ },
235
+ };
236
+
237
+ const msgBus = createMsgBus<MyBusStruct>(config);
238
+ ```
239
+
240
+ ### Subscribing to Messages: `on()`
241
+
242
+ Subscribe to messages on a specific channel and group with optional topic filtering.
243
+
244
+ ```typescript
245
+ // Basic subscription
246
+ msgBus.on({
247
+ channel: 'Test.ComputeSum',
248
+ callback: (msg) => {
249
+ // msg.payload is typed as { a: number; b: number }
250
+ console.log('Received:', msg.payload);
251
+ },
252
+ });
253
+
254
+ // Subscribe to specific group
255
+ msgBus.on({
256
+ channel: 'Test.ComputeSum',
257
+ group: 'out', // Listen for responses
258
+ callback: (msg) => {
259
+ // msg.payload is typed as number
260
+ console.log('Result:', msg.payload);
261
+ },
262
+ });
263
+
264
+ // With topic filtering (regex pattern)
265
+ msgBus.on({
266
+ channel: 'Test.DoSomeWork',
267
+ topic: '/^task-.*/', // Match topics starting with "task-"
268
+ callback: (msg) => {
269
+ console.log('Task message:', msg.payload);
270
+ },
271
+ });
272
+
273
+ // With options
274
+ msgBus.on({
275
+ channel: 'Test.ComputeSum',
276
+ callback: (msg) => {
277
+ console.log('Message:', msg.payload);
278
+ },
279
+ options: {
280
+ fetchCount: 5, // Auto-unsubscribe after 5 messages
281
+ throttle: {
282
+ // Throttle the callback
283
+ duration: 1000,
284
+ leading: true,
285
+ trailing: false,
286
+ },
287
+ },
288
+ });
289
+ ```
290
+
291
+ #### Automatic Unsubscription
292
+
293
+ **Limit message count**: Use `fetchCount` to automatically unsubscribe after receiving a specific number of messages.
294
+
295
+ ```typescript
296
+ msgBus.on({
297
+ channel: 'Test.ComputeSum',
298
+ callback: (msg) => {
299
+ console.log(msg.payload);
300
+ },
301
+ options: {
302
+ fetchCount: 10, // Unsubscribe after 10 messages
303
+ },
304
+ });
305
+ ```
306
+
307
+ #### Manual Unsubscription with AbortSignal
308
+
309
+ Use `AbortSignal` for controlled unsubscription. This allows combining abort signals from multiple `AbortController` instances.
310
+
311
+ ```typescript
312
+ const abortController = new AbortController();
313
+
314
+ msgBus.on({
315
+ channel: "Test.ComputeSum",
316
+ callback: (msg) => {
317
+ console.log(msg.payload);
318
+ },
319
+ options: {
320
+ abortSignal: abortController.signal
321
+ }
322
+ });
323
+
324
+ // Later: unsubscribe
325
+ abortController.abort();
326
+
327
+ // Combining multiple abort signals
328
+ const controller1 = new AbortController();
329
+ const controller2 = new AbortController();
330
+
331
+ const combinedSignal = AbortSignal.any([
332
+ controller1.signal,
333
+ controller2.signal
334
+ ]);
335
+
336
+ msgBus.on({
337
+ channel: "Test.ComputeSum",
338
+ options: {
339
+ abortSignal: combinedSignal
340
+ },
341
+ callback: (msg) => {
342
+ console.log(msg.payload);
343
+ }
344
+ });
345
+
346
+ // React integration example - cleanup on unmount
347
+ import { useEffect } from 'react';
348
+
349
+ function MyComponent() {
350
+ useEffect(() => {
351
+ const controller = new AbortController();
352
+
353
+ msgBus.on({
354
+ channel: "Test.Events",
355
+ callback: handleEvent,
356
+ options: {
357
+ abortSignal: controller.signal
358
+ }
359
+ });
360
+
361
+ // Clean up when component unmounts
362
+ return () => {
363
+ controller.abort();
364
+ };
365
+ }, []);
366
+
367
+ return <div>Component content</div>;
368
+ }
369
+ ```
370
+
371
+ ### Awaiting a Single Message: `once()`
372
+
373
+ Subscribe and await the first (next) message on a specific channel and group, similar to `on()` but returns a Promise.
374
+
375
+ ```typescript
376
+ // Wait for one message
377
+ const msg = await msgBus.once({
378
+ channel: 'Test.ComputeSum',
379
+ });
380
+
381
+ console.log('Received:', msg.payload); // Typed as { a: number; b: number }
382
+
383
+ // With group specification
384
+ const response = await msgBus.once({
385
+ channel: 'Test.ComputeSum',
386
+ group: 'out',
387
+ });
388
+
389
+ console.log('Result:', response.payload); // Typed as number
390
+
391
+ // With topic filtering
392
+ const taskMsg = await msgBus.once({
393
+ channel: 'Test.DoSomeWork',
394
+ topic: '/^priority-.*/', // Match topics starting with "priority-"
395
+ });
396
+ ```
397
+
398
+ #### Timeout Configuration
399
+
400
+ Configure timeout duration via the `timeout` option. The `abortSignal` option also works with `once()`.
401
+
402
+ ```typescript
403
+ try {
404
+ const msg = await msgBus.once({
405
+ channel: 'Test.ComputeSum',
406
+ options: {
407
+ timeout: 5000, // 5 second timeout
408
+ },
409
+ });
410
+ console.log('Received:', msg.payload);
411
+ } catch (error) {
412
+ if (error instanceof TimeoutError) {
413
+ console.error('Timeout waiting for message');
414
+ }
415
+ }
416
+
417
+ // With abort signal
418
+ const abortController = new AbortController();
419
+
420
+ const messagePromise = msgBus.once({
421
+ channel: 'Test.ComputeSum',
422
+ options: {
423
+ timeout: 10000,
424
+ abortSignal: abortController.signal,
425
+ },
426
+ });
427
+
428
+ // Can cancel from elsewhere
429
+ setTimeout(() => abortController.abort('User cancelled'), 2000);
430
+
431
+ try {
432
+ const msg = await messagePromise;
433
+ } catch (error) {
434
+ if (error instanceof AbortError) {
435
+ console.error('Aborted:', error.cause);
436
+ }
437
+ }
438
+ ```
439
+
440
+ ### Providing Response Handlers: `provide()`
441
+
442
+ Register a handler for messages on a selected channel and group (typically `in`), which generates a response message for the `out` group of the same channel. This is essentially a subscription with automatic response handling.
443
+
444
+ The callback can be asynchronous and its result is automatically used to form the response.
445
+
446
+ ```typescript
447
+ // Simple provider
448
+ msgBus.provide({
449
+ channel: 'Test.ComputeSum',
450
+ callback: (msg) => {
451
+ // msg.payload is typed as { a: number; b: number }
452
+ // Return type is inferred as number (from 'out' type)
453
+ return msg.payload.a + msg.payload.b;
454
+ },
455
+ });
456
+
457
+ // Async provider
458
+ msgBus.provide({
459
+ channel: 'Test.DoSomeWork',
460
+ callback: async (msg) => {
461
+ // msg.payload is typed as string
462
+ await performWork(msg.payload);
463
+ // Return type is void (from 'out' type)
464
+ },
465
+ });
466
+
467
+ // With topic filtering
468
+ msgBus.provide({
469
+ channel: 'Test.ComputeSum',
470
+ topic: '/^calc-.*/',
471
+ callback: (msg) => {
472
+ return msg.payload.a + msg.payload.b;
473
+ },
474
+ });
475
+
476
+ // With options
477
+ msgBus.provide({
478
+ channel: 'Test.ComputeSum',
479
+ callback: (msg) => {
480
+ return msg.payload.a + msg.payload.b;
481
+ },
482
+ options: {
483
+ fetchCount: 100, // Handle 100 requests then unsubscribe
484
+ abortSignal: someController.signal,
485
+ },
486
+ });
487
+ ```
488
+
489
+ ### Sending Messages: `send()`
490
+
491
+ Send a message to the bus for a specific channel and group (default is `in`). The payload type is enforced according to the bus structure.
492
+
493
+ ```typescript
494
+ // Basic send
495
+ await msgBus.send({
496
+ channel: 'Test.ComputeSum',
497
+ payload: { a: 10, b: 20 }, // Typed and validated
498
+ });
499
+
500
+ // With group specification
501
+ await msgBus.send({
502
+ channel: 'Test.Multiplexer',
503
+ group: 'in1',
504
+ payload: 'hello', // Typed as string for 'in1' group
505
+ });
506
+
507
+ await msgBus.send({
508
+ channel: 'Test.Multiplexer',
509
+ group: 'in2',
510
+ payload: 42, // Typed as number for 'in2' group
511
+ });
512
+
513
+ // With topic
514
+ await msgBus.send({
515
+ channel: 'Test.DoSomeWork',
516
+ topic: 'priority-high',
517
+ payload: 'urgent task',
518
+ });
519
+
520
+ // With custom headers
521
+ await msgBus.send({
522
+ channel: 'Test.ComputeSum',
523
+ payload: { a: 5, b: 15 },
524
+ headers: {
525
+ correlationId: 'task-123',
526
+ priority: 1,
527
+ },
528
+ });
529
+ ```
530
+
531
+ #### Important Notes
532
+
533
+ 1. **Response Handling**: Any message sent to a non-`out` group can receive a response through the bus, which will be routed to the `out` group of the same channel.
534
+
535
+ 2. **Topic Specification**: You can specify a topic when sending to enable fine-grained filtering by subscribers.
536
+
537
+ ### Request-Response Pattern: `request()`
538
+
539
+ Send a message and automatically await a response from a handler (registered via `provide()`) on the same channel's `out` group. Returns a Promise that resolves with the response message.
540
+
541
+ ```typescript
542
+ // Basic request
543
+ const response = await msgBus.request({
544
+ channel: 'Test.ComputeSum',
545
+ payload: { a: 10, b: 20 },
546
+ });
547
+
548
+ console.log('Result:', response.payload); // Typed as number
549
+
550
+ // With group overloading (using different input groups)
551
+ const response1 = await msgBus.request({
552
+ channel: 'Test.Multiplexer',
553
+ group: 'in1',
554
+ payload: 'hello',
555
+ });
556
+
557
+ const response2 = await msgBus.request({
558
+ channel: 'Test.Multiplexer',
559
+ group: 'in2',
560
+ payload: 42,
561
+ });
562
+
563
+ // Both responses have payload with type - number ('out' group)
564
+
565
+ // With timeout
566
+ try {
567
+ const response = await msgBus.request({
568
+ channel: 'Test.ComputeSum',
569
+ payload: { a: 5, b: 15 },
570
+ options: {
571
+ timeout: 5000, // Overall timeout
572
+ },
573
+ });
574
+ } catch (error) {
575
+ if (error instanceof TimeoutError) {
576
+ console.error('Request timed out');
577
+ }
578
+ }
579
+
580
+ // With separate send and response timeouts
581
+ const response = await msgBus.request({
582
+ channel: 'Test.ComputeSum',
583
+ payload: { a: 5, b: 15 },
584
+ options: {
585
+ sendTimeout: 1000, // Timeout for sending the message
586
+ responseTimeout: 5000, // Timeout for receiving the response
587
+ },
588
+ });
589
+
590
+ // With headers for correlation
591
+ const response = await msgBus.request({
592
+ channel: 'Test.ComputeSum',
593
+ payload: { a: 5, b: 15 },
594
+ headers: {
595
+ sourceId: 'component-123',
596
+ correlationId: 'request-456',
597
+ },
598
+ });
599
+
600
+ // The response will include matching headers
601
+ console.log(response.headers.requestId); // Original message ID
602
+ console.log(response.headers.correlationId); // Preserved correlation ID
603
+ ```
604
+
605
+ #### Key Features
606
+
607
+ 1. **Input Type Overloading**: Use different input groups within the same channel to support multiple request signatures while maintaining a single response type.
608
+
609
+ 2. **Timeout Control**: Configure response timeout via the `responseTimeout` option to prevent indefinite waiting.
610
+
611
+ 3. **Header Propagation**: Headers like `correlationId` are automatically propagated from request to response for tracing.
612
+
613
+ ### Streaming Messages: `stream()`
614
+
615
+ Create an async iterable iterator for consuming messages as a stream.
616
+
617
+ ```typescript
618
+ // Basic streaming
619
+ const messageStream = msgBus.stream({
620
+ channel: 'Test.ComputeSum',
621
+ });
622
+
623
+ for await (const msg of messageStream) {
624
+ console.log('Received:', msg.payload);
625
+ // Process messages as they arrive
626
+ }
627
+
628
+ // With topic filtering
629
+ const taskStream = msgBus.stream({
630
+ channel: 'Test.DoSomeWork',
631
+ topic: '/^task-.*/',
632
+ options: {
633
+ timeout: 30000, // Stop streaming after 30s of inactivity
634
+ },
635
+ });
636
+
637
+ for await (const msg of taskStream) {
638
+ await processTask(msg.payload);
639
+ }
640
+ ```
641
+
642
+ ## Advanced Features
643
+
644
+ ### Message Replay
645
+
646
+ Configure channels to buffer and replay messages for late subscribers.
647
+
648
+ ```typescript
649
+ const msgBus = createMsgBus<MyBusStruct>({
650
+ 'Test.Events': {
651
+ replayBufferSize: 50, // Keep last 50 messages
652
+ replayWindowTime: 60000, // Keep messages for 60 seconds
653
+ },
654
+ });
655
+
656
+ // Send messages
657
+ for (let i = 0; i < 100; i++) {
658
+ await msgBus.send({
659
+ channel: 'Test.Events',
660
+ payload: `Message ${i}`,
661
+ });
662
+ }
663
+
664
+ // Late subscriber receives last 50 messages
665
+ msgBus.on({
666
+ channel: 'Test.Events',
667
+ callback: (msg) => {
668
+ console.log('Replayed:', msg.payload);
669
+ },
670
+ });
671
+ ```
672
+
673
+ ### Throttling and Debouncing
674
+
675
+ Control message processing rate at both channel and subscription levels.
676
+
677
+ ```typescript
678
+ // Channel-level throttling
679
+ const msgBus = createMsgBus<MyBusStruct>({
680
+ 'Test.Updates': {
681
+ throttle: {
682
+ duration: 1000,
683
+ leading: true,
684
+ trailing: true,
685
+ },
686
+ },
687
+ });
688
+
689
+ // Subscription-level debouncing
690
+ msgBus.on({
691
+ channel: 'Test.Updates',
692
+ callback: (msg) => {
693
+ updateUI(msg.payload);
694
+ },
695
+ options: {
696
+ debounce: 500, // Wait 500ms of inactivity before processing
697
+ },
698
+ });
699
+ ```
700
+
701
+ ### Error Handling
702
+
703
+ The bus includes built-in error handling and a reserved error channel.
704
+
705
+ ```typescript
706
+ // Subscribe to errors for a specific channel
707
+ msgBus.on({
708
+ channel: 'Test.ComputeSum',
709
+ group: 'error',
710
+ callback: (msg) => {
711
+ console.error('Error in ComputeSum:', msg.payload.error);
712
+ },
713
+ });
714
+
715
+ // Subscribe to all system errors
716
+ msgBus.on({
717
+ channel: 'MSGBUS.ERROR',
718
+ callback: (msg) => {
719
+ console.error('System error:', msg.payload);
720
+ },
721
+ });
722
+
723
+ // Errors in providers are automatically caught and routed
724
+ msgBus.provide({
725
+ channel: 'Test.ComputeSum',
726
+ callback: (msg) => {
727
+ if (msg.payload.a < 0) {
728
+ throw new Error('Negative numbers not allowed');
729
+ }
730
+ return msg.payload.a + msg.payload.b;
731
+ },
732
+ });
733
+ ```
734
+
735
+ ### Headers and Metadata
736
+
737
+ Messages support rich metadata through headers.
738
+
739
+ ```typescript
740
+ import { MsgHeaders } from '@actdim/msgmesh';
741
+
742
+ // Standard headers
743
+ type StandardHeaders = {
744
+ sourceId?: string; // Sender identifier
745
+ targetId?: string; // Recipient identifier
746
+ correlationId?: string; // Activity/trace identifier
747
+ traceId?: string; // Distributed trace identifier
748
+ requestId?: string; // Original request identifier
749
+ inResponseToId?: string; // Reply reference
750
+ publishedAt?: number; // Timestamp (Unix epoch, ms)
751
+ priority?: number; // Message priority
752
+ ttl?: number; // Time to live (ms)
753
+ tags?: string | string[]; // Message tags
754
+ };
755
+
756
+ // Custom headers
757
+ type MyHeaders = MsgHeaders & {
758
+ userId: string;
759
+ tenantId: string;
760
+ version: string;
761
+ };
762
+
763
+ const msgBus = createMsgBus<MyBusStruct, MyHeaders>();
764
+
765
+ await msgBus.send({
766
+ channel: 'Test.ComputeSum',
767
+ payload: { a: 10, b: 20 },
768
+ headers: {
769
+ userId: 'user-123',
770
+ tenantId: 'tenant-456',
771
+ version: '1.0',
772
+ correlationId: 'trace-789',
773
+ priority: 1,
774
+ },
775
+ });
776
+ ```
777
+
778
+ ## Comparison with Other Solutions
779
+
780
+ | Feature | @actdim/msgmesh | Event Emitters | RxJS |
781
+ | ---------------- | --------------- | -------------- | ----------- |
782
+ | Type Safety | ✅ Full | ⚠️ Limited | ✅ Full |
783
+ | Learning Curve | Low | Low | High |
784
+ | Async Support | ✅ Native | ⚠️ Limited | ✅ Full |
785
+ | Request-Response | ✅ Built-in | ❌ Manual | ⚠️ Complex |
786
+ | Boilerplate | Minimal | Minimal | Medium |
787
+ | Paradigm Shift | None | None | Significant |
788
+ | Scalability | ✅ Excellent | ⚠️ Limited | ✅ Good |
789
+
790
+ ## Conclusion
791
+
792
+ @actdim/msgmesh provides a powerful, type-safe, and flexible message bus solution for TypeScript applications. It combines the simplicity of event emitters with the power of message-oriented middleware, while maintaining excellent type safety and developer experience.
793
+
794
+ Key benefits:
795
+
796
+ - **Type Safety**: Full TypeScript support with compile-time checks
797
+ - **Flexibility**: Works at any scale - from single components to entire applications
798
+ - **Observability**: Built-in support for logging, tracing, and debugging
799
+ - **Developer Experience**: Minimal boilerplate, clear API, excellent IntelliSense support
800
+ - **Performance**: Single-instance architecture with efficient message routing
801
+ - **Integration**: Works seamlessly with React, async operations, and existing patterns
802
+
803
+ The message bus serves as a solid foundation for the @actdim/dynstruct architectural framework, enabling the development of scalable, maintainable, and testable applications.
804
+
805
+ ## TODO
806
+
807
+ - rate limiting (for single channel, using signal after auto-'ack') and backpressure (for "in" and "out" channel pair), real send promise
808
+ - async stream
809
+
810
+ ## Further Reading
811
+
812
+ - [GitHub Repository](https://github.com/actdim/msgmesh)
813
+ - [@actdim/dynstruct Documentation](https://github.com/actdim/dynstruct)
814
+ - [Type Safety Best Practices](https://www.typescriptlang.org/docs/handbook/2/types-from-types.html)
815
+ - [Message-Oriented Middleware Patterns](https://www.enterpriseintegrationpatterns.com/)
@@ -4,6 +4,7 @@ export declare const $CG_IN: "in";
4
4
  export declare const $CG_OUT: "out";
5
5
  export declare const $CG_ERROR: "error";
6
6
  export declare const $C_ERROR: "MSGBUS.ERROR";
7
+ export declare const $SYSTEM_TOPIC: "msgbus";
7
8
  export type InParam = {
8
9
  [$CG_IN]: any;
9
10
  };
@@ -50,7 +51,6 @@ export type MsgStructFactory<TStruct extends TStructBase, TStructBase extends Ms
50
51
  export type InStruct<TStruct extends MsgStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends InParam ? TStruct[TChannel]["in"] : undefined;
51
52
  export type OutStruct<TStruct extends MsgStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends OutParam ? TStruct[TChannel][keyof OutParam] : undefined;
52
53
  export type MsgChannelConfig<TChannel> = {
53
- replayCount?: number;
54
54
  initialValues?: {
55
55
  [TGroup in keyof TChannel]: TChannel[TGroup];
56
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
@@ -1,32 +1,33 @@
1
- const s = "in", c = "out", n = "error", a = "MSGBUS.ERROR";
1
+ const s = "in", c = "out", n = "error", a = "MSGBUS.ERROR", u = "msgbus";
2
2
  class o extends Error {
3
3
  name = "BaseError";
4
- constructor(r, e) {
5
- super(r, e), Object.setPrototypeOf(this, new.target.prototype);
4
+ constructor(r, t) {
5
+ super(r, t), Object.setPrototypeOf(this, new.target.prototype);
6
6
  }
7
7
  }
8
- class u extends o {
8
+ class E extends o {
9
9
  name = "TimeoutError";
10
- constructor(r, e) {
11
- super(r || "Timeout exceeded", { cause: e });
10
+ constructor(r, t) {
11
+ super(r || "Timeout exceeded", { cause: t });
12
12
  }
13
13
  }
14
14
  class p extends o {
15
15
  name = "AbortError";
16
- constructor(r, e) {
17
- super(r || "Operation aborted", { cause: e });
16
+ constructor(r, t) {
17
+ super(r || "Operation aborted", { cause: t });
18
18
  }
19
19
  }
20
- const E = Symbol("__<TStruct>"), R = Symbol("__<THeaders>");
20
+ const T = Symbol("__<TStruct>"), m = Symbol("__<THeaders>");
21
21
  export {
22
22
  n as $CG_ERROR,
23
23
  s as $CG_IN,
24
24
  c as $CG_OUT,
25
25
  a as $C_ERROR,
26
- R as $TypeArgHeaders,
27
- E as $TypeArgStruct,
26
+ u as $SYSTEM_TOPIC,
27
+ m as $TypeArgHeaders,
28
+ T as $TypeArgStruct,
28
29
  p as AbortError,
29
30
  o as BaseError,
30
- u as TimeoutError
31
+ E as TimeoutError
31
32
  };
32
33
  //# sourceMappingURL=contracts.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.es.js","sources":["../src/contracts.ts"],"sourcesContent":["//##############################################################################\r\n//# Copyright (c) Pavel Borodaev 2022 #\r\n//##############################################################################\r\n// SafeBus\r\nimport { IsTuple, MaybePromise, Overwrite, Skip } from \"@actdim/utico/typeCore\";\r\nimport { ThrottleOptions } from \"./util\";\r\n\r\nexport const $CG_IN = \"in\" as const;\r\n\r\nexport const $CG_OUT = \"out\" as const;\r\n\r\nexport const $CG_ERROR = \"error\" as const;\r\n\r\nexport const $C_ERROR = \"MSGBUS.ERROR\" as const;\r\n\r\nexport type InParam = {\r\n // [key in typeof $CG_IN]: any;\r\n [$CG_IN]: any;\r\n};\r\n\r\nexport type OutParam = {\r\n // [key in typeof $CG_OUT]: any;\r\n [$CG_OUT]: any;\r\n};\r\n\r\nexport type ErrorPayload = {\r\n error: any; // reason\r\n source?: any;\r\n handled?: boolean;\r\n};\r\n\r\nexport type ErrorParam<T extends ErrorPayload = ErrorPayload> = {\r\n // [key in typeof $CG_ERROR]: any;\r\n [$CG_ERROR]: T;\r\n};\r\n\r\nexport class BaseError extends Error {\r\n readonly name: string = 'BaseError';\r\n\r\n constructor(\r\n message: string,\r\n options?: {\r\n cause?: unknown;\r\n }\r\n ) {\r\n super(message, options);\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n }\r\n}\r\nexport class TimeoutError extends BaseError {\r\n readonly name: string = 'TimeoutError';\r\n\r\n constructor(message?: string, cause?: unknown) {\r\n // Operation\r\n super(message || \"Timeout exceeded\", { cause });\r\n }\r\n}\r\n\r\nexport class AbortError extends BaseError {\r\n readonly name: string = 'AbortError';\r\n\r\n constructor(message?: string, cause?: unknown) {\r\n super(message || \"Operation aborted\", { cause });\r\n }\r\n}\r\n\r\n// ReservedChannelGroup\r\nexport type SystemChannelGroup = `${keyof InParam | keyof OutParam | keyof OutParam}`;\r\n\r\n// TODO:\r\n// Point-to-Point (P2P): direct messaging with targeted, address delivery (exactly one recipient)\r\n// Broadcast\r\n// Queue group: Load Balancing, Round-Robin, Fan-out, Fan-in\r\n// QoS\r\n// Message Filtering\r\n// Cross-tab message delivery:\r\n// https://www.sitepen.com/blog/cross-tab-synchronization-with-the-web-locks-api\r\n// https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API\r\n// LocalStorage\r\n// https://github.com/GoogleChromeLabs/comlink\r\n\r\nexport type MsgChannelStruct = Partial<{ [group: string]: any } & InParam & OutParam & ErrorParam>;\r\n\r\n// type MsgChannelStruct = { [group: string]: any } & (\r\n// | InParam\r\n// | OutParam\r\n// | (InParam & OutParam)\r\n// );\r\n\r\n// SystemMsgtruct\r\nexport type MsgStructBase = {\r\n [$C_ERROR]?: {\r\n [$CG_IN]: ErrorPayload;\r\n };\r\n // \"*\": {\r\n // [$CG_IN]: any;\r\n // };\r\n};\r\n\r\nexport type MsgStruct = {\r\n [channel: string]: MsgChannelStruct;\r\n} & MsgStructBase;\r\n\r\n// MsgStructBuilder\r\nexport type MsgStructFactory<\r\n TStruct extends TStructBase,\r\n TStructBase extends MsgStruct = MsgStruct\r\n> = {\r\n [C in keyof TStruct]: TStruct[C] & ErrorParam;\r\n };\r\n\r\n// export type MsgStruct = Record<string, MsgChannelStruct>;\r\n\r\nexport type InStruct<TStruct extends MsgStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends InParam\r\n ? TStruct[TChannel][\"in\"] // keyof InParam or typeof $CG_IN\r\n : undefined; // never\r\n\r\n// export type InStruct<\r\n// TStruct extends MsgStruct,\r\n// TChannel extends keyof TStruct\r\n// > = TStruct[TChannel] extends InParam ? TStruct[TChannel][\"in\"] : never;\r\n\r\nexport type OutStruct<TStruct extends MsgStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends OutParam\r\n ? TStruct[TChannel][keyof OutParam]\r\n : undefined;\r\n\r\n// export type OutStruct<\r\n// TStruct extends MsgStruct,\r\n// TChannel extends keyof TStruct\r\n// > = TStruct[TChannel] extends OutParam ? TStruct[TChannel][\"out\"] : never;\r\n\r\nexport type MsgChannelConfig<TChannel> = {\r\n // (channel) message queue distribution and processing strategy\r\n replayCount?: number;\r\n initialValues?: { [TGroup in keyof TChannel]: TChannel[TGroup] };\r\n // persistent?: boolean; // durable? (for durable queue)\r\n // secure?: boolean; // encrypted\r\n // federated?: boolean; // broadcasting\r\n // autoDeleteTimeout?: number;\r\n\r\n // requireAck: boolean;\r\n // noAck?: boolean; // noAutoAck\r\n // manualAck?: boolean;\r\n // prefetchCount?: number; // for manual acknowledgment (max messages in flight without ack) \r\n // maxSubscribers?: number;\r\n replayBufferSize?: number;\r\n replayWindowTime?: number;\r\n\r\n delay?: number;\r\n throttle?: number | (ThrottleOptions & { duration: number; });\r\n debounce?: number;\r\n};\r\n\r\nexport type MsgSubOptions = {\r\n fetchCount?: number;\r\n abortSignal?: AbortSignal;\r\n\r\n throttle?: number | (ThrottleOptions & { duration: number; });\r\n debounce?: number;\r\n\r\n priority?: number;\r\n};\r\n\r\nexport type PromiseOptions = {\r\n abortSignal?: AbortSignal;\r\n timeout?: number;\r\n};\r\n\r\nexport type MsgBusConfig<TStruct extends MsgStruct> = {\r\n [TChannel in keyof TStruct]?: MsgChannelConfig<TStruct[TChannel]>;\r\n};\r\n\r\nexport type MsgAddress<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = {\r\n channel: TChannel;\r\n group?: TGroup; // typeGroup\r\n // supports wildcard matching (https://docs.nats.io/nats-concepts/subjects#wildcards)\r\n topic?: string;\r\n version?: string;\r\n};\r\n\r\nexport type MsgHeaders = {\r\n\r\n // similar to inReplyToId\r\n inResponseToId?: string;\r\n version?: string; // schemaVersion\r\n\r\n requestId?: string;\r\n\r\n // routing hints\r\n sourceId?: string; // senderId/producerId\r\n targetId?: string; // receiverId/recipientId\r\n\r\n originId?: string;\r\n\r\n correlationId?: string; // activityId\r\n traceId?: string;\r\n\r\n // timestamps (unix epoch, ms):\r\n publishedAt?: number;\r\n\r\n priority?: number;\r\n persistent?: boolean; // durable? (for durable queue)\r\n\r\n tags?: string | string[];\r\n\r\n auth?: {\r\n userId?: string;\r\n token?: string;\r\n }\r\n\r\n absoluteExpiration?: number;\r\n ttl?: number;\r\n slidingExpiration?: number;\r\n\r\n // discard policy (for dead-letter)?\r\n\r\n // ack/nack policy\r\n // requireAck: boolean;\r\n // ackMode: AckMode;\r\n\r\n // retryCount?: number;\r\n // deliveryAttempt?: number;\r\n\r\n // audience\r\n // intent \r\n // subject\r\n // group\r\n // schema\r\n // scope \r\n};\r\n\r\n// TODO: support MsgStatus\r\n// export type MsgStatus = \"pending\" | \"sent\" | \"delivered\" | \"processed\" | \"failed\" | \"expired\";\r\n\r\n// TODO: support ack/nack\r\n// TODO: integrate with https://github.com/connor4312/cockatiel \r\n// MsgEnvelope\r\nexport type Msg<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel],\r\n THeaders extends MsgHeaders = MsgHeaders // Record<string, string>\r\n> = {\r\n // transportId\r\n id?: string;\r\n address: MsgAddress<TStruct, TChannel, TGroup>;\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n headers?: THeaders;\r\n};\r\n\r\nexport type MsgSubBaseParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel],\r\n THeaders extends MsgHeaders = MsgHeaders\r\n> = MsgAddress<TStruct, TChannel, TGroup> & {\r\n channelSelector?: string | ((channel: string) => boolean);\r\n // topicSelector?: string | ((channel: string) => boolean); \r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => boolean;\r\n};\r\n\r\nexport type MsgSubParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel],\r\n THeaders extends MsgHeaders = MsgHeaders\r\n> = MsgSubBaseParams<TStruct, TChannel, TGroup, THeaders> & {\r\n callback?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => void;\r\n options?: MsgSubOptions;\r\n};\r\n\r\nexport type MsgSub<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgSubParams<TStruct, TChannel, TGroup, THeaders>\r\n) => void;\r\n\r\nexport type AwaitableMsgSubOptions = MsgSubOptions & PromiseOptions;\r\n\r\n// AwaitableMsgStreamOptions\r\nexport type MsgStreamOptions = AwaitableMsgSubOptions;\r\n\r\nexport type MsgStreamParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel],\r\n THeaders extends MsgHeaders = MsgHeaders\r\n> = MsgSubBaseParams<TStruct, TChannel, TGroup, THeaders> & {\r\n options?: MsgStreamOptions;\r\n};\r\n\r\nexport type MsgStream<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgStreamParams<TStruct, TChannel, TGroup>\r\n) => AsyncIterableIterator<Msg<TStruct, TChannel, TGroup, THeaders>>; // TGroup extends undefined ? typeof $CG_IN : TGroup\r\n\r\nexport type AwaitableMsgSubParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel],\r\n THeaders extends MsgHeaders = MsgHeaders\r\n> = MsgSubBaseParams<TStruct, TChannel, TGroup, THeaders> & {\r\n options?: AwaitableMsgSubOptions;\r\n};\r\n\r\nexport type AwaitableMsgSub<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: AwaitableMsgSubParams<TStruct, TChannel, TGroup>\r\n) => Promise<Msg<TStruct, TChannel, TGroup, THeaders>>; // TGroup extends undefined ? typeof $CG_IN : TGroup\r\n\r\nexport type MsgProviderOptions = MsgSubOptions;\r\n\r\nexport type MsgProviderParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], // typeof $CG_IN\r\n THeaders extends MsgHeaders = MsgHeaders\r\n> = MsgSubBaseParams<TStruct, TChannel, TGroup, THeaders> & {\r\n // resolve\r\n callback?: (msgIn: Msg<TStruct, TChannel, TGroup, THeaders>, headers?: THeaders) => MaybePromise<OutStruct<TStruct, TChannel>>;\r\n options?: MsgProviderOptions;\r\n headers?: THeaders;\r\n};\r\n\r\nexport type MsgProvider<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgProviderParams<TStruct, TChannel, TGroup, THeaders>\r\n) => void;\r\n\r\nexport type MsgSenderOptions = PromiseOptions;\r\n\r\nexport type MsgSenderParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], // typeof $CG_IN\r\n THeaders extends MsgHeaders = MsgHeaders\r\n> = MsgAddress<TStruct, TChannel, TGroup> & {\r\n channelSelector?: string | ((channel: string) => boolean);\r\n // topicSelector?: string | ((channel: string) => boolean);\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n payloadFn?: IsTuple<TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]> extends true\r\n ? (fn: (...args: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]) => void) => void\r\n : never;\r\n options?: MsgSenderOptions;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => boolean;\r\n headers?: THeaders;\r\n};\r\n\r\nexport type MsgSender<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgSenderParams<TStruct, TChannel, TGroup, THeaders>\r\n) => Promise<void>;\r\n\r\nexport type MsgRequestOptions = PromiseOptions & {\r\n sendTimeout?: number;\r\n responseTimeout?: number;\r\n};\r\n\r\nexport type MsgRequestDispatcherParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], // typeof $CG_IN\r\n THeaders extends MsgHeaders = MsgHeaders\r\n> = MsgAddress<TStruct, TChannel, TGroup> & {\r\n channelSelector?: string | ((channel: string) => boolean);\r\n // topicSelector?: string | ((channel: string) => boolean);\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n payloadFn?: IsTuple<TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]> extends true\r\n ? (fn: (...args: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]) => void) => void\r\n : never;\r\n options?: MsgRequestOptions;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => boolean;\r\n headers?: THeaders;\r\n};\r\n\r\nexport type MsgRequestDispatcher<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgRequestDispatcherParams<TStruct, TChannel, TGroup, THeaders>\r\n) => Promise<Msg<TStruct, TChannel, typeof $CG_OUT>>;\r\n\r\nexport type MsgChannelStructNormalized<TStruct extends MsgChannelStruct> = {\r\n [G in keyof TStruct]: Awaited<TStruct[G]>;\r\n};\r\n\r\nexport type MsgStructNormalized<TStruct extends MsgStruct> = {\r\n [C in keyof TStruct]: MsgChannelStructNormalized<TStruct[C]>;\r\n};\r\n\r\nexport const $TypeArgStruct = Symbol(\"__<TStruct>\");\r\nexport const $TypeArgHeaders = Symbol(\"__<THeaders>\");\r\n\r\nexport type MsgBus<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders> = {\r\n readonly config: MsgBusConfig<MsgStructNormalized<TStruct>>;\r\n // subscribe, listen\r\n readonly on: MsgSub<MsgStructNormalized<TStruct>, THeaders>;\r\n // listen once\r\n readonly once: AwaitableMsgSub<MsgStructNormalized<TStruct>, THeaders>;\r\n // listenStream, consume, receive\r\n readonly stream: MsgStream<MsgStructNormalized<TStruct>, THeaders>;\r\n // handle\r\n readonly provide: MsgProvider<MsgStructNormalized<TStruct>, THeaders>;\r\n // publish + delivery guarantee\r\n readonly send: MsgSender<MsgStructNormalized<TStruct>, THeaders>;\r\n // publish + subscribe\r\n readonly request: MsgRequestDispatcher<MsgStructNormalized<TStruct>, THeaders>;\r\n\r\n /**\r\n * @internal\r\n * Type-level only. Do not access at runtime.\r\n */\r\n readonly [$TypeArgStruct]?: TStruct;\r\n /**\r\n * @internal\r\n * Type-level only. Do not access at runtime.\r\n */\r\n readonly [$TypeArgHeaders]?: THeaders;\r\n};"],"names":["$CG_IN","$CG_OUT","$CG_ERROR","$C_ERROR","BaseError","message","options","TimeoutError","cause","AbortError","$TypeArgStruct","$TypeArgHeaders"],"mappings":"AAOO,MAAMA,IAAS,MAETC,IAAU,OAEVC,IAAY,SAEZC,IAAW;AAuBjB,MAAMC,UAAkB,MAAM;AAAA,EACxB,OAAe;AAAA,EAExB,YACIC,GACAC,GAGF;AACE,UAAMD,GAASC,CAAO,GACtB,OAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EACpD;AACJ;AACO,MAAMC,UAAqBH,EAAU;AAAA,EAC/B,OAAe;AAAA,EAExB,YAAYC,GAAkBG,GAAiB;AAE3C,UAAMH,KAAW,oBAAoB,EAAE,OAAAG,EAAA,CAAO;AAAA,EAClD;AACJ;AAEO,MAAMC,UAAmBL,EAAU;AAAA,EAC7B,OAAe;AAAA,EAExB,YAAYC,GAAkBG,GAAiB;AAC3C,UAAMH,KAAW,qBAAqB,EAAE,OAAAG,EAAA,CAAO;AAAA,EACnD;AACJ;AAmVO,MAAME,IAAiB,OAAO,aAAa,GACrCC,IAAkB,OAAO,cAAc;"}
1
+ {"version":3,"file":"contracts.es.js","sources":["../src/contracts.ts"],"sourcesContent":null,"names":["$CG_IN","$CG_OUT","$CG_ERROR","$C_ERROR","$SYSTEM_TOPIC","BaseError","message","options","TimeoutError","cause","AbortError","$TypeArgStruct","$TypeArgHeaders"],"mappings":"AAOO,MAAMA,IAAS,MAETC,IAAU,OAEVC,IAAY,SAEZC,IAAW,gBAEXC,IAAgB;AAuBtB,MAAMC,UAAkB,MAAM;AAAA,EACxB,OAAe;AAAA,EAExB,YACIC,GACAC,GAGF;AACE,UAAMD,GAASC,CAAO,GACtB,OAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EACpD;AACJ;AACO,MAAMC,UAAqBH,EAAU;AAAA,EAC/B,OAAe;AAAA,EAExB,YAAYC,GAAkBG,GAAiB;AAE3C,UAAMH,KAAW,oBAAoB,EAAE,OAAAG,EAAA,CAAO;AAAA,EAClD;AACJ;AAEO,MAAMC,UAAmBL,EAAU;AAAA,EAC7B,OAAe;AAAA,EAExB,YAAYC,GAAkBG,GAAiB;AAC3C,UAAMH,KAAW,qBAAqB,EAAE,OAAAG,EAAA,CAAO;AAAA,EACnD;AACJ;AAkVO,MAAME,IAAiB,OAAO,aAAa,GACrCC,IAAkB,OAAO,cAAc;"}
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,SAAS,EAIT,YAAY,EAIZ,mBAAmB,EAGnB,UAAU,EAMb,MAAM,aAAa,CAAC;AASrB,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,aAGrB,MAAM,YAS5B,CAAC;AAaF,wBAAgB,YAAY,CAAC,OAAO,SAAS,SAAS,EAAE,QAAQ,SAAS,UAAU,GAAG,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,6BA4apJ"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,SAAS,EAIT,YAAY,EAIZ,mBAAmB,EAGnB,UAAU,EAQb,MAAM,aAAa,CAAC;AASrB,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,aAGrB,MAAM,YAS5B,CAAC;AAaF,wBAAgB,YAAY,CAAC,OAAO,SAAS,SAAS,EAAE,QAAQ,SAAS,UAAU,GAAG,UAAU,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,6BAqbpJ"}
package/dist/core.es.js CHANGED
@@ -1,9 +1,9 @@
1
- import { TimeoutError as T, $CG_IN as v, $CG_ERROR as j, $C_ERROR as q, $CG_OUT as R } from "./contracts.es.js";
2
- import { v4 as $ } from "uuid";
3
- import { asyncScheduler as F, ReplaySubject as I, Subject as z } from "rxjs";
4
- import { filter as D, delay as G, observeOn as U, take as K, debounceTime as N } from "rxjs/operators";
1
+ import { TimeoutError as T, $CG_IN as v, $SYSTEM_TOPIC as W, $CG_ERROR as j, $C_ERROR as q, $CG_OUT as $ } from "./contracts.es.js";
2
+ import { v4 as R } from "uuid";
3
+ import { asyncScheduler as F, ReplaySubject as z, Subject as D } from "rxjs";
4
+ import { filter as G, delay as U, observeOn as K, take as N, debounceTime as Y } from "rxjs/operators";
5
5
  import { pipeFromArray as H, throttleOp as J } from "./util.es.js";
6
- import { delayError as k } from "@actdim/utico/utils";
6
+ import { delayError as O } from "@actdim/utico/utils";
7
7
  const Q = (s) => {
8
8
  if (s == null)
9
9
  return (a) => a == s;
@@ -13,13 +13,13 @@ const Q = (s) => {
13
13
  return (d) => a.test(d);
14
14
  } else
15
15
  return (a) => s === a;
16
- }, O = 1e3 * 60 * 2;
16
+ }, k = 1e3 * 60 * 2;
17
17
  function V() {
18
18
  return Date.now();
19
19
  }
20
20
  const X = ":";
21
- function re(s) {
22
- const a = "msgbus", d = F;
21
+ function ie(s) {
22
+ const a = W, d = F;
23
23
  function L(e) {
24
24
  return {
25
25
  id: e.id,
@@ -50,32 +50,32 @@ function re(s) {
50
50
  }, b(n);
51
51
  }
52
52
  const g = /* @__PURE__ */ new Map();
53
- function x(e, o) {
53
+ function M(e, o) {
54
54
  return `${e}${X}${o}`;
55
55
  }
56
- function w(e, o) {
57
- const t = x(e, o);
56
+ function S(e, o) {
57
+ const t = M(e, o);
58
58
  if (!g.has(t)) {
59
59
  let n = null;
60
60
  const r = s?.[e];
61
- r && (r.replayBufferSize != null || r.replayWindowTime != null) && (n = new I(r.replayBufferSize == null ? 1 / 0 : r.replayBufferSize, r.replayWindowTime == null ? 1 / 0 : r.replayWindowTime)), n || (n = new z()), g.set(
61
+ r && (r.replayBufferSize != null || r.replayWindowTime != null) && (n = new z(r.replayBufferSize == null ? 1 / 0 : r.replayBufferSize, r.replayWindowTime == null ? 1 / 0 : r.replayWindowTime)), n || (n = new D()), g.set(
62
62
  t,
63
63
  n
64
64
  );
65
65
  }
66
66
  return g.get(t);
67
67
  }
68
- function S(e, o, t) {
68
+ function w(e, o, t) {
69
69
  if (o != null) {
70
70
  let n, r = { leading: !0, trailing: !0 };
71
71
  typeof o == "number" ? n = o : (n = o.duration, r.leading = o.leading, r.trailing = o.trailing), e.push(J(n, r, t));
72
72
  }
73
73
  }
74
74
  function E(e, o, t) {
75
- o != null && e.push(N(o, t));
75
+ o != null && e.push(Y(o, t));
76
76
  }
77
77
  function p(e) {
78
- const o = String(e.channel), t = e.group == null ? v : String(e.group), n = w(o, t), r = Q(e.topic), i = D(
78
+ const o = String(e.channel), t = e.group == null ? v : String(e.group), n = S(o, t), r = Q(e.topic), i = G(
79
79
  (f) => (
80
80
  // msg.address.channel === channel &&
81
81
  // msg.address.group === group &&
@@ -86,13 +86,13 @@ function re(s) {
86
86
  const u = [];
87
87
  u.push(i);
88
88
  const c = s?.[o];
89
- S(u, c?.throttle, d), S(u, e.options?.throttle, d), E(u, c?.debounce, d), E(u, e.options?.debounce, d), c?.delay && u.push(G(c.delay, d)), d && u.push(U(d)), e.options?.fetchCount && u.push(K(e.options.fetchCount)), l = H(u)(n);
89
+ w(u, c?.throttle, d), w(u, e.options?.throttle, d), E(u, c?.debounce, d), E(u, e.options?.debounce, d), c?.delay && u.push(U(c.delay, d)), d && u.push(K(d)), e.options?.fetchCount && u.push(N(e.options.fetchCount)), l = H(u)(n);
90
90
  const h = l.subscribe({
91
91
  next: (f) => {
92
92
  try {
93
93
  return e.callback(f);
94
- } catch (W) {
95
- y(f, W);
94
+ } catch (I) {
95
+ y(f, I);
96
96
  }
97
97
  },
98
98
  error: (f) => {
@@ -118,21 +118,21 @@ function re(s) {
118
118
  });
119
119
  }
120
120
  function b(e) {
121
- e.id == null && (e.id = $()), e.headers == null && (e.headers = {});
121
+ e.id == null && (e.id = R()), e.headers == null && (e.headers = {});
122
122
  const o = e.headers;
123
123
  o.publishedAt = V();
124
124
  const t = String(e.address.channel);
125
125
  e.address.group == null && (e.address.group = v);
126
126
  const n = String(e.address.group);
127
- return w(t, n).next(e), Promise.resolve(e);
127
+ return S(t, n).next(e), Promise.resolve(e);
128
128
  }
129
- function B(e) {
129
+ function _(e) {
130
130
  p(e);
131
131
  }
132
- function M(e) {
133
- const o = e.options?.timeout == null ? O : e.options?.timeout;
132
+ function x(e) {
133
+ const o = e.options?.timeout == null ? k : e.options?.timeout;
134
134
  let t = !1;
135
- return Promise.race([k(o, () => new T()), new Promise((n, r) => {
135
+ return Promise.race([O(o, () => new T()), new Promise((n, r) => {
136
136
  try {
137
137
  const i = e.options?.abortSignal;
138
138
  let l = null;
@@ -168,7 +168,7 @@ function re(s) {
168
168
  }
169
169
  })]);
170
170
  }
171
- function _(e) {
171
+ function B(e) {
172
172
  const o = {
173
173
  ...e,
174
174
  callback: async (t) => {
@@ -180,7 +180,7 @@ function re(s) {
180
180
  }, r = await Promise.resolve(e.callback(t, n)), i = {
181
181
  address: {
182
182
  channel: t.address.channel,
183
- group: R,
183
+ group: $,
184
184
  topic: t.address.topic
185
185
  },
186
186
  headers: n,
@@ -195,11 +195,11 @@ function re(s) {
195
195
  p(o);
196
196
  }
197
197
  async function C(e) {
198
- const o = $();
198
+ const o = R();
199
199
  if (e.callback) {
200
200
  const n = {
201
201
  channel: e.channel,
202
- group: R,
202
+ group: $,
203
203
  topic: e.topic,
204
204
  options: {
205
205
  ...e.options,
@@ -229,9 +229,9 @@ function re(s) {
229
229
  });
230
230
  }
231
231
  async function A(e) {
232
- const o = e.options?.timeout == null ? O : e.options?.timeout;
232
+ const o = e.options?.timeout == null ? k : e.options?.timeout;
233
233
  let t = !1;
234
- return Promise.race([k(o, () => new T()), new Promise((n, r) => {
234
+ return Promise.race([O(o, () => new T()), new Promise((n, r) => {
235
235
  try {
236
236
  const i = e.options?.abortSignal;
237
237
  let l = null;
@@ -266,18 +266,18 @@ function re(s) {
266
266
  }
267
267
  return {
268
268
  config: s,
269
- on: (e) => B(e),
270
- once: (e) => M(e),
269
+ on: (e) => _(e),
270
+ once: (e) => x(e),
271
271
  stream: (e) => {
272
272
  throw new Error("Not implemented");
273
273
  },
274
- provide: (e) => _(e),
274
+ provide: (e) => B(e),
275
275
  send: (e) => C(e),
276
276
  request: (e) => A(e)
277
277
  };
278
278
  }
279
279
  export {
280
- re as createMsgBus,
280
+ ie as createMsgBus,
281
281
  Q as getMatchTest
282
282
  };
283
283
  //# sourceMappingURL=core.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.es.js","sources":["../src/core.ts"],"sourcesContent":["import {\r\n MsgBus,\r\n MsgStruct,\r\n Msg,\r\n $CG_IN,\r\n $CG_OUT,\r\n MsgBusConfig,\r\n MsgSubParams,\r\n AwaitableMsgSubParams,\r\n MsgProviderParams,\r\n MsgStructNormalized,\r\n $CG_ERROR,\r\n $C_ERROR,\r\n MsgHeaders,\r\n TimeoutError,\r\n MsgAddress,\r\n InStruct,\r\n MsgSenderOptions,\r\n MsgRequestDispatcherParams\r\n} from \"./contracts\";\r\nimport { v4 as uuid } from \"uuid\";\r\nimport { MonoTypeOperatorFunction, Observable, Subject, ReplaySubject, asyncScheduler, OperatorFunction, SchedulerLike } from \"rxjs\";\r\nimport { filter as filterOp, take as takeOp, observeOn, delay as delayOp, debounceTime as debounceOp } from \"rxjs/operators\";\r\n\r\nimport { IsTuple, Skip } from \"@actdim/utico/typeCore\";\r\nimport { pipeFromArray, throttleOp, ThrottleOptions } from \"./util\";\r\nimport { delayError } from \"@actdim/utico/utils\";\r\n\r\nexport const getMatchTest = (pattern: string) => {\r\n if (pattern == undefined) {\r\n // return (value: string) => true;\r\n return (value: string) => value == pattern;\r\n }\r\n if (pattern.startsWith(\"/\") && pattern.endsWith(\"/\")) {\r\n pattern = pattern.substring(1, pattern.length - 1);\r\n const regexp = new RegExp(pattern);\r\n return (value: string) => regexp.test(value);\r\n } else {\r\n return (value: string) => pattern === value;\r\n }\r\n};\r\n\r\nconst DEFAULT_PROMISE_TIMEOUT = 1000 * 60 * 2; // 2 minutes\r\n\r\n// see also https://www.npmjs.com/package/p-queue\r\n// https://github.com/postaljs/postal.js\r\n\r\nfunction now() {\r\n return Date.now(); // new Date().getTime() or +new Date()\r\n}\r\n\r\n// createServiceBus\r\nconst groupPrefix = \":\"; // \"/\", \":\", \"::\"\r\nexport function createMsgBus<TStruct extends MsgStruct, THeaders extends MsgHeaders = MsgHeaders>(config?: MsgBusConfig<MsgStructNormalized<TStruct>>) {\r\n type TStructN = MsgStructNormalized<TStruct>;\r\n type MsgInfo = Skip<Msg<TStructN>, \"payload\">;\r\n\r\n const errTopic = \"msgbus\";\r\n const scheduler: SchedulerLike = asyncScheduler;\r\n\r\n function getMsgInfo(msg: Msg<TStructN>) {\r\n return {\r\n id: msg.id,\r\n address: msg.address,\r\n headers: msg.headers\r\n } as MsgInfo;\r\n }\r\n\r\n function handleError(srcMsg: Msg<TStructN>, err: any) {\r\n const errPayload = {\r\n error: err,\r\n source: getMsgInfo(srcMsg)\r\n } as Msg<TStructN>[\"payload\"];\r\n let errMsg: Msg<TStructN>;\r\n errMsg = {\r\n address: {\r\n channel: srcMsg.address.channel,\r\n group: $CG_ERROR,\r\n topic: errTopic\r\n },\r\n payload: errPayload\r\n };\r\n publish(errMsg);\r\n errMsg = {\r\n address: {\r\n channel: $C_ERROR,\r\n group: $CG_IN,\r\n topic: errTopic\r\n },\r\n payload: errPayload\r\n };\r\n publish(errMsg);\r\n // + nack?\r\n }\r\n // observables\r\n const subjects: Map<string, Subject<Msg<TStructN>>> = new Map();\r\n\r\n function createRoutingKey(channel: string, group: string) {\r\n return `${channel}${groupPrefix}${group}`;\r\n }\r\n\r\n type MsgRecord = {\r\n msg: Msg<TStructN>;\r\n acked: boolean;\r\n // ackTimestamp\r\n ackedAt?: number;\r\n }\r\n\r\n function getOrCreateSubject(channel: string, group: string): Subject<Msg<TStructN>> {\r\n const routingKey = createRoutingKey(channel, group);\r\n // TODO: support BehaviorSubject\r\n if (!subjects.has(routingKey)) {\r\n let subject: Subject<Msg<TStructN>> = null;\r\n const channelConfig = config?.[channel];\r\n if (channelConfig) {\r\n if (channelConfig.replayBufferSize != undefined || channelConfig.replayWindowTime != undefined) {\r\n subject = new ReplaySubject<Msg<TStructN>>(channelConfig.replayBufferSize == undefined ? Infinity : channelConfig.replayBufferSize, channelConfig.replayWindowTime == undefined ? Infinity : channelConfig.replayWindowTime);\r\n }\r\n }\r\n if (!subject) {\r\n subject = new Subject<Msg<TStructN>>();\r\n }\r\n subjects.set(routingKey,\r\n subject\r\n );\r\n }\r\n return subjects.get(routingKey);\r\n }\r\n\r\n function applyThrottle(ops: OperatorFunction<any, any>[], throttle?: number | (ThrottleOptions & { duration: number; }), scheduler?: SchedulerLike) {\r\n if (throttle != undefined) {\r\n let duration: number;\r\n let options: ThrottleOptions = { leading: true, trailing: true };\r\n if (typeof throttle === \"number\") {\r\n duration = throttle;\r\n } else {\r\n duration = throttle.duration;\r\n options.leading = throttle.leading;\r\n options.trailing = throttle.trailing;\r\n }\r\n ops.push(throttleOp(duration, options, scheduler));\r\n }\r\n }\r\n\r\n function applyDebounce(ops: OperatorFunction<any, any>[], duration?: number, scheduler?: SchedulerLike) {\r\n if (duration != undefined) {\r\n ops.push(debounceOp(duration, scheduler));\r\n }\r\n }\r\n\r\n function subscribe(params: MsgSubParams<TStructN>) {\r\n // TODO: use [channel, group] as key?\r\n\r\n const channel = String(params.channel);\r\n\r\n const group = params.group == undefined ? $CG_IN : String(params.group);\r\n\r\n const subject = getOrCreateSubject(channel, group);\r\n\r\n const match = getMatchTest(params.topic);\r\n\r\n const fOp: MonoTypeOperatorFunction<Msg<TStructN>> = filterOp(\r\n (msg) =>\r\n // msg.address.channel === channel &&\r\n // msg.address.group === group &&\r\n match(msg.address.topic) && (!params.filter || params.filter(msg))\r\n );\r\n\r\n let observable: Observable<Msg<TStructN>>;\r\n\r\n const ops: OperatorFunction<any, any>[] = [];\r\n\r\n ops.push(fOp);\r\n\r\n const channelConfig = config?.[channel];\r\n\r\n applyThrottle(ops, channelConfig?.throttle, scheduler);\r\n\r\n applyThrottle(ops, params.options?.throttle, scheduler);\r\n\r\n applyDebounce(ops, channelConfig?.debounce, scheduler);\r\n\r\n applyDebounce(ops, params.options?.debounce, scheduler);\r\n\r\n if (channelConfig?.delay) {\r\n ops.push(delayOp(channelConfig.delay, scheduler));\r\n }\r\n\r\n if (scheduler) {\r\n ops.push(observeOn(scheduler));\r\n }\r\n\r\n if (params.options?.fetchCount) {\r\n ops.push(takeOp(params.options.fetchCount));\r\n }\r\n\r\n observable = pipeFromArray(ops)(subject);\r\n\r\n // TODO: support retryOp\r\n // TODO: support timeout\r\n const sub = observable.subscribe({\r\n next: (msg: Msg<TStructN>) => {\r\n try {\r\n return params.callback(msg);\r\n } catch (err) {\r\n handleError(msg, err);\r\n // throw err;\r\n }\r\n },\r\n error: (err) => {\r\n handleError(\r\n {\r\n address: {\r\n channel: channel,\r\n group: group,\r\n topic: params.topic\r\n }\r\n },\r\n err\r\n );\r\n },\r\n complete: () => {\r\n // cleanup\r\n }\r\n });\r\n\r\n const abortSignal = params.options?.abortSignal;\r\n abortSignal?.addEventListener(\"abort\", (e) => {\r\n // TODO: publish debug (internal) message\r\n console.debug(\r\n `Listening aborted for channel: ${channel}, group: ${group}, topic: ${params.topic}. Reason: ${abortSignal.reason}` // e.target\r\n );\r\n sub.unsubscribe();\r\n });\r\n }\r\n\r\n function publish(msg: Msg<TStructN>) {\r\n if (msg.id == undefined) {\r\n msg.id = uuid();\r\n }\r\n if (msg.headers == undefined) {\r\n msg.headers = {};\r\n }\r\n const headers = msg.headers;\r\n headers.publishedAt = now()\r\n const channel = String(msg.address.channel);\r\n if (msg.address.group == undefined) {\r\n msg.address.group = $CG_IN;\r\n }\r\n const group = String(msg.address.group);\r\n const subject = getOrCreateSubject(channel, group);\r\n subject.next(msg);\r\n // TODO: implement backpressure via signal after 'ack' or msg from out signal\r\n return Promise.resolve(msg);\r\n }\r\n\r\n function on(params: MsgSubParams<TStructN>) {\r\n subscribe(params);\r\n }\r\n\r\n function once(params: AwaitableMsgSubParams<TStructN>) {\r\n const timeout = params.options?.timeout == undefined ? DEFAULT_PROMISE_TIMEOUT : params.options?.timeout;\r\n let settled = false;\r\n return Promise.race([delayError(timeout, () => new TimeoutError()), new Promise<any>((res, rej) => {\r\n try {\r\n const abortSignal = params.options?.abortSignal;\r\n let cleanup: () => void = null;\r\n\r\n if (abortSignal) {\r\n let onAbort: () => void = null;\r\n cleanup = () => {\r\n abortSignal.removeEventListener(\"abort\", onAbort);\r\n };\r\n onAbort = () => {\r\n if (settled) {\r\n return\r\n };\r\n settled = true;\r\n cleanup();\r\n rej(new Error(\"Cancelled\", { cause: abortSignal.reason })); // e.target\r\n };\r\n abortSignal.addEventListener(\"abort\", onAbort);\r\n }\r\n\r\n const subParams: MsgSubParams<TStructN> = {\r\n ...params,\r\n ...{\r\n options: {\r\n ...params.options,\r\n ...{\r\n fetchCount: 1\r\n }\r\n },\r\n callback: (msg) => {\r\n try {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n cleanup?.();\r\n // sub.unsubscribe();\r\n res(msg);\r\n } catch (err) {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n cleanup?.();\r\n rej(err);\r\n }\r\n }\r\n }\r\n };\r\n subscribe(subParams);\r\n } catch (e) {\r\n rej(e);\r\n }\r\n })]);\r\n }\r\n\r\n function provide(params: MsgProviderParams<TStructN>) {\r\n const subParams: MsgSubParams<TStructN> = {\r\n ...params,\r\n ...{\r\n callback: async (msgIn) => {\r\n try {\r\n const headers = {\r\n ...msgIn.headers,\r\n ...params.headers,\r\n requestId: msgIn.id,\r\n }\r\n const payload = (await Promise.resolve(params.callback(msgIn, headers)));\r\n const msgOut: Msg<TStructN, keyof TStructN, typeof $CG_OUT> = {\r\n address: {\r\n channel: msgIn.address.channel,\r\n group: $CG_OUT,\r\n topic: msgIn.address.topic\r\n },\r\n headers: headers,\r\n payload: payload\r\n };\r\n publish(msgOut);\r\n } catch (err) {\r\n handleError(msgIn, err);\r\n // throw err;\r\n }\r\n }\r\n }\r\n };\r\n subscribe(subParams);\r\n }\r\n\r\n type MsgDispatcherParams<\r\n TStruct extends MsgStruct = MsgStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], // typeof $CG_IN\r\n THeaders extends MsgHeaders = MsgHeaders\r\n > = MsgAddress<TStruct, TChannel, TGroup> & {\r\n channelSelector?: string | ((channel: string) => boolean);\r\n // topicSelector?: string | ((channel: string) => boolean);\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n payloadFn?: IsTuple<TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]> extends true\r\n ? (fn: (...args: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]) => void) => void\r\n : never;\r\n options?: MsgSenderOptions;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => boolean;\r\n headers?: THeaders;\r\n callback?: (msg: Msg<TStruct, TChannel, typeof $CG_OUT, THeaders>) => void;\r\n };\r\n\r\n async function dispatch(params: MsgDispatcherParams<TStructN>) {\r\n const msgId = uuid();\r\n if (params.callback) {\r\n const subParams: MsgSubParams<TStructN, keyof TStructN, typeof $CG_OUT> = {\r\n channel: params.channel,\r\n group: $CG_OUT,\r\n topic: params.topic,\r\n options: {\r\n ...params.options,\r\n ...{\r\n fetchCount: 1\r\n }\r\n },\r\n callback: (msgOut) => {\r\n // sub.unsubscribe();\r\n params.callback(msgOut);\r\n },\r\n filter: (msgOut) => {\r\n return msgOut.headers?.requestId === msgId && (!params.filter || params.filter(msgOut)) // TODO: match topic?\r\n }\r\n };\r\n subscribe(subParams);\r\n }\r\n let payload: any;\r\n if (params.payloadFn) {\r\n params.payloadFn((...args) => {\r\n payload = args;\r\n });\r\n } else {\r\n payload = params.payload;\r\n }\r\n await publish({\r\n id: msgId,\r\n address: {\r\n channel: params.channel,\r\n group: params.group,\r\n topic: params.topic\r\n },\r\n headers: {\r\n ...params.headers\r\n },\r\n payload: payload\r\n });\r\n }\r\n\r\n async function request(params: MsgRequestDispatcherParams<TStructN>): Promise<any> {\r\n const timeout = params.options?.timeout == undefined ? DEFAULT_PROMISE_TIMEOUT : params.options?.timeout;\r\n let settled = false;\r\n return Promise.race([delayError(timeout, () => new TimeoutError()), new Promise((res, rej) => {\r\n try {\r\n const abortSignal = params.options?.abortSignal;\r\n let cleanup: () => void = null;\r\n\r\n if (abortSignal) {\r\n let onAbort: () => void = null;\r\n const cleanup = () => {\r\n abortSignal.removeEventListener(\"abort\", onAbort);\r\n };\r\n onAbort = () => {\r\n if (settled) {\r\n return\r\n };\r\n settled = true;\r\n cleanup();\r\n rej(new Error(\"Cancelled\", { cause: abortSignal.reason })); // e.target\r\n };\r\n abortSignal.addEventListener(\"abort\", onAbort);\r\n }\r\n\r\n const dispatchParams: MsgDispatcherParams<TStructN> = {\r\n ...params,\r\n callback: (msg) => {\r\n try {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n cleanup?.();\r\n res(msg);\r\n } catch (err) {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n cleanup?.();\r\n rej(err);\r\n }\r\n }\r\n };\r\n dispatch(dispatchParams);\r\n } catch (err) {\r\n rej(err);\r\n }\r\n })]);\r\n }\r\n\r\n const msgBus: MsgBus<TStruct, THeaders> = {\r\n config: config,\r\n on: (params) => on(params as MsgSubParams<TStructN>),\r\n once: (params) => once(params as AwaitableMsgSubParams<TStructN>),\r\n stream: (params) => {\r\n throw new Error(\"Not implemented\");\r\n },\r\n provide: (params) => provide(params as MsgProviderParams<TStructN>),\r\n send: (params) => dispatch(params as MsgDispatcherParams<TStructN>),\r\n request: (params) => request(params as MsgRequestDispatcherParams<TStructN>),\r\n };\r\n\r\n // msgBus[\"#subjects\"] = subjects;\r\n\r\n return msgBus;\r\n}\r\n\r\n// TODO: support stream\r\n// TODO: support persistence\r\n// TODO: support unsubscribe (abort) alias (like in hooks)\r\n// TODO: support msg ack via custom RepeatSubject and MsgRecord: (no acked messages in queue, auto ack on publish to \"out\" channel)\r\n// TODO: support rate limiting (single channel) and backpressure (for \"in\" and \"out\" channel pair), real send promise\r\n// TODO: support TTL, maxBufferLength\r\n/*\r\nclass RepeatSubject<T> {\r\n private buffer: Msg<T>[] = [];\r\n private subject = new Subject<Msg<T>>();\r\n\r\n next(msg: Msg<T>) {\r\n this.buffer.push(msg);\r\n this.subject.next(msg);\r\n }\r\n\r\n subscribe(\r\n observer: (msg: Msg<T>) => void,\r\n filterFn?: (msg: Msg<T>) => boolean\r\n ) { \r\n this.buffer.filter(filterFn ?? (() => true)).forEach(observer);\r\n \r\n return this.subject.subscribe(observer);\r\n }\r\n}\r\n*/\r\n"],"names":["getMatchTest","pattern","value","regexp","DEFAULT_PROMISE_TIMEOUT","now","groupPrefix","createMsgBus","config","errTopic","scheduler","asyncScheduler","getMsgInfo","msg","handleError","srcMsg","err","errPayload","errMsg","$CG_ERROR","publish","$C_ERROR","$CG_IN","subjects","createRoutingKey","channel","group","getOrCreateSubject","routingKey","subject","channelConfig","ReplaySubject","Subject","applyThrottle","ops","throttle","duration","options","throttleOp","applyDebounce","debounceOp","subscribe","params","match","fOp","filterOp","observable","delayOp","observeOn","takeOp","pipeFromArray","sub","abortSignal","e","uuid","headers","on","once","timeout","settled","delayError","TimeoutError","res","rej","cleanup","onAbort","subParams","provide","msgIn","payload","msgOut","$CG_OUT","dispatch","msgId","args","request","dispatchParams"],"mappings":"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"}
1
+ {"version":3,"file":"core.es.js","sources":["../src/core.ts"],"sourcesContent":null,"names":["getMatchTest","pattern","value","regexp","DEFAULT_PROMISE_TIMEOUT","now","groupPrefix","createMsgBus","config","errTopic","$SYSTEM_TOPIC","scheduler","asyncScheduler","getMsgInfo","msg","handleError","srcMsg","err","errPayload","errMsg","$CG_ERROR","publish","$C_ERROR","$CG_IN","subjects","createRoutingKey","channel","group","getOrCreateSubject","routingKey","subject","channelConfig","ReplaySubject","Subject","applyThrottle","ops","throttle","duration","options","throttleOp","applyDebounce","debounceOp","subscribe","params","match","fOp","filterOp","observable","delayOp","observeOn","takeOp","pipeFromArray","sub","abortSignal","e","uuid","headers","on","once","timeout","settled","delayError","TimeoutError","res","rej","cleanup","onAbort","subParams","provide","msgIn","payload","msgOut","$CG_OUT","dispatch","msgId","args","request","dispatchParams"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.es.js","sources":["../src/util.ts"],"sourcesContent":["import { asyncScheduler, Observable, SchedulerLike, Subscriber, timer, UnaryFunction } from \"rxjs\";\r\n\r\nexport function identity<T>(x: T): T {\r\n return x;\r\n}\r\n\r\nexport function pipeFromArray<T, R>(fns: Array<UnaryFunction<T, R>>): UnaryFunction<T, R> {\r\n if (fns.length === 0) {\r\n return identity as UnaryFunction<any, any>;\r\n }\r\n\r\n if (fns.length === 1) {\r\n return fns[0];\r\n }\r\n\r\n return function piped(input: T): R {\r\n return fns.reduce((prev: any, fn: UnaryFunction<T, R>) => fn(prev), input as any);\r\n };\r\n}\r\n\r\nexport type ThrottleOptions = {\r\n leading?: boolean;\r\n trailing?: boolean;\r\n}\r\n\r\nexport function throttleOp<T>(\r\n duration: number,\r\n options: ThrottleOptions = { leading: true, trailing: true },\r\n scheduler: SchedulerLike = asyncScheduler\r\n) {\r\n const { leading = true, trailing = false } = options;\r\n\r\n return (source: Observable<T>) =>\r\n new Observable<T>((subscriber: Subscriber<T>) => {\r\n let throttling = false;\r\n let lastValue: T | undefined;\r\n let timerSub: any;\r\n\r\n const endWindow = () => {\r\n if (trailing && lastValue !== undefined) {\r\n subscriber.next(lastValue);\r\n }\r\n lastValue = undefined;\r\n throttling = false;\r\n };\r\n\r\n const sourceSub = source.subscribe({\r\n next(value) {\r\n if (!throttling) {\r\n throttling = true;\r\n\r\n if (leading) {\r\n subscriber.next(value);\r\n } else if (trailing) {\r\n lastValue = value;\r\n }\r\n\r\n timerSub = timer(duration, scheduler).subscribe(() => {\r\n endWindow();\r\n timerSub?.unsubscribe();\r\n });\r\n } else if (trailing) {\r\n lastValue = value;\r\n }\r\n },\r\n error(err) {\r\n subscriber.error(err);\r\n },\r\n complete() {\r\n if (trailing && lastValue !== undefined) {\r\n subscriber.next(lastValue);\r\n }\r\n subscriber.complete();\r\n }\r\n });\r\n\r\n return () => {\r\n sourceSub.unsubscribe();\r\n timerSub?.unsubscribe();\r\n };\r\n });\r\n}"],"names":["identity","x","pipeFromArray","fns","input","prev","fn","throttleOp","duration","options","scheduler","asyncScheduler","leading","trailing","source","Observable","subscriber","throttling","lastValue","timerSub","endWindow","sourceSub","value","timer","err"],"mappings":";AAEO,SAASA,EAAYC,GAAS;AACjC,SAAOA;AACX;AAEO,SAASC,EAAoBC,GAAsD;AACtF,SAAIA,EAAI,WAAW,IACRH,IAGPG,EAAI,WAAW,IACRA,EAAI,CAAC,IAGT,SAAeC,GAAa;AAC/B,WAAOD,EAAI,OAAO,CAACE,GAAWC,MAA4BA,EAAGD,CAAI,GAAGD,CAAY;AAAA,EACpF;AACJ;AAOO,SAASG,EACZC,GACAC,IAA2B,EAAE,SAAS,IAAM,UAAU,GAAA,GACtDC,IAA2BC,GAC7B;AACE,QAAM,EAAE,SAAAC,IAAU,IAAM,UAAAC,IAAW,OAAUJ;AAE7C,SAAO,CAACK,MACJ,IAAIC,EAAc,CAACC,MAA8B;AAC7C,QAAIC,IAAa,IACbC,GACAC;AAEJ,UAAMC,IAAY,MAAM;AACpB,MAAIP,KAAYK,MAAc,UAC1BF,EAAW,KAAKE,CAAS,GAE7BA,IAAY,QACZD,IAAa;AAAA,IACjB,GAEMI,IAAYP,EAAO,UAAU;AAAA,MAC/B,KAAKQ,GAAO;AACR,QAAKL,IAaMJ,MACPK,IAAYI,MAbZL,IAAa,IAETL,IACAI,EAAW,KAAKM,CAAK,IACdT,MACPK,IAAYI,IAGhBH,IAAWI,EAAMf,GAAUE,CAAS,EAAE,UAAU,MAAM;AAClD,UAAAU,EAAA,GACAD,GAAU,YAAA;AAAA,QACd,CAAC;AAAA,MAIT;AAAA,MACA,MAAMK,GAAK;AACP,QAAAR,EAAW,MAAMQ,CAAG;AAAA,MACxB;AAAA,MACA,WAAW;AACP,QAAIX,KAAYK,MAAc,UAC1BF,EAAW,KAAKE,CAAS,GAE7BF,EAAW,SAAA;AAAA,MACf;AAAA,IAAA,CACH;AAED,WAAO,MAAM;AACT,MAAAK,EAAU,YAAA,GACVF,GAAU,YAAA;AAAA,IACd;AAAA,EACJ,CAAC;AACT;"}
1
+ {"version":3,"file":"util.es.js","sources":["../src/util.ts"],"sourcesContent":null,"names":["identity","x","pipeFromArray","fns","input","prev","fn","throttleOp","duration","options","scheduler","asyncScheduler","leading","trailing","source","Observable","subscriber","throttling","lastValue","timerSub","endWindow","sourceSub","value","timer","err"],"mappings":";AAEO,SAASA,EAAYC,GAAS;AACjC,SAAOA;AACX;AAEO,SAASC,EAAoBC,GAAsD;AACtF,SAAIA,EAAI,WAAW,IACRH,IAGPG,EAAI,WAAW,IACRA,EAAI,CAAC,IAGT,SAAeC,GAAa;AAC/B,WAAOD,EAAI,OAAO,CAACE,GAAWC,MAA4BA,EAAGD,CAAI,GAAGD,CAAY;AAAA,EACpF;AACJ;AAOO,SAASG,EACZC,GACAC,IAA2B,EAAE,SAAS,IAAM,UAAU,GAAA,GACtDC,IAA2BC,GAC7B;AACE,QAAM,EAAE,SAAAC,IAAU,IAAM,UAAAC,IAAW,OAAUJ;AAE7C,SAAO,CAACK,MACJ,IAAIC,EAAc,CAACC,MAA8B;AAC7C,QAAIC,IAAa,IACbC,GACAC;AAEJ,UAAMC,IAAY,MAAM;AACpB,MAAIP,KAAYK,MAAc,UAC1BF,EAAW,KAAKE,CAAS,GAE7BA,IAAY,QACZD,IAAa;AAAA,IACjB,GAEMI,IAAYP,EAAO,UAAU;AAAA,MAC/B,KAAKQ,GAAO;AACR,QAAKL,IAaMJ,MACPK,IAAYI,MAbZL,IAAa,IAETL,IACAI,EAAW,KAAKM,CAAK,IACdT,MACPK,IAAYI,IAGhBH,IAAWI,EAAMf,GAAUE,CAAS,EAAE,UAAU,MAAM;AAClD,UAAAU,EAAA,GACAD,GAAU,YAAA;AAAA,QACd,CAAC;AAAA,MAIT;AAAA,MACA,MAAMK,GAAK;AACP,QAAAR,EAAW,MAAMQ,CAAG;AAAA,MACxB;AAAA,MACA,WAAW;AACP,QAAIX,KAAYK,MAAc,UAC1BF,EAAW,KAAKE,CAAS,GAE7BF,EAAW,SAAA;AAAA,MACf;AAAA,IAAA,CACH;AAED,WAAO,MAAM;AACT,MAAAK,EAAU,YAAA,GACVF,GAAU,YAAA;AAAA,IACd;AAAA,EACJ,CAAC;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actdim/msgmesh",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "description": "A type-safe, modular message mesh for scalable async communication in TypeScript",
5
5
  "author": "Pavel Borodaev",
6
6
  "license": "Proprietary",