smart_message 0.0.13 → 0.0.16

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +120 -0
  4. data/Gemfile.lock +3 -3
  5. data/README.md +71 -25
  6. data/docs/index.md +2 -0
  7. data/docs/reference/transports.md +46 -21
  8. data/docs/transports/memory-transport.md +2 -1
  9. data/docs/transports/multi-transport.md +484 -0
  10. data/examples/file/00_run_all_file_demos.rb +260 -0
  11. data/examples/file/01_basic_file_transport_demo.rb +237 -0
  12. data/examples/file/02_fifo_transport_demo.rb +289 -0
  13. data/examples/file/03_file_watching_demo.rb +332 -0
  14. data/examples/file/04_multi_transport_file_demo.rb +432 -0
  15. data/examples/file/README.md +257 -0
  16. data/examples/memory/00_run_all_demos.rb +317 -0
  17. data/examples/memory/01_message_deduplication_demo.rb +18 -30
  18. data/examples/memory/02_dead_letter_queue_demo.rb +9 -9
  19. data/examples/memory/03_point_to_point_orders.rb +3 -3
  20. data/examples/memory/04_publish_subscribe_events.rb +15 -15
  21. data/examples/memory/05_many_to_many_chat.rb +19 -19
  22. data/examples/memory/06_stdout_publish_only.rb +145 -0
  23. data/examples/memory/07_proc_handlers_demo.rb +13 -13
  24. data/examples/memory/08_custom_logger_demo.rb +136 -136
  25. data/examples/memory/09_error_handling_demo.rb +7 -7
  26. data/examples/memory/10_entity_addressing_basic.rb +25 -25
  27. data/examples/memory/11_entity_addressing_with_filtering.rb +32 -32
  28. data/examples/memory/12_regex_filtering_microservices.rb +10 -10
  29. data/examples/memory/14_global_configuration_demo.rb +12 -12
  30. data/examples/memory/README.md +34 -17
  31. data/examples/memory/log/demo_app.log.1 +100 -0
  32. data/examples/memory/log/demo_app.log.2 +100 -0
  33. data/examples/multi_transport_example.rb +114 -0
  34. data/examples/redis/01_smart_home_iot_demo.rb +20 -20
  35. data/examples/utilities/box_it.rb +12 -0
  36. data/examples/utilities/doing.rb +19 -0
  37. data/examples/utilities/temp.md +28 -0
  38. data/lib/smart_message/base.rb +5 -7
  39. data/lib/smart_message/errors.rb +3 -0
  40. data/lib/smart_message/header.rb +1 -1
  41. data/lib/smart_message/logger/default.rb +1 -1
  42. data/lib/smart_message/messaging.rb +36 -6
  43. data/lib/smart_message/plugins.rb +46 -4
  44. data/lib/smart_message/serializer/base.rb +1 -1
  45. data/lib/smart_message/serializer.rb +3 -2
  46. data/lib/smart_message/subscription.rb +18 -20
  47. data/lib/smart_message/transport/async_publish_queue.rb +284 -0
  48. data/lib/smart_message/transport/fifo_operations.rb +264 -0
  49. data/lib/smart_message/transport/file_operations.rb +200 -0
  50. data/lib/smart_message/transport/file_transport.rb +149 -0
  51. data/lib/smart_message/transport/file_watching.rb +72 -0
  52. data/lib/smart_message/transport/partitioned_files.rb +46 -0
  53. data/lib/smart_message/transport/stdout_transport.rb +50 -36
  54. data/lib/smart_message/transport/stdout_transport.rb.backup +88 -0
  55. data/lib/smart_message/version.rb +1 -1
  56. metadata +24 -10
  57. data/ideas/README.md +0 -41
  58. data/ideas/agents.md +0 -1001
  59. data/ideas/database_transport.md +0 -980
  60. data/ideas/improvement.md +0 -359
  61. data/ideas/meshage.md +0 -1788
  62. data/ideas/message_discovery.md +0 -178
  63. data/ideas/message_schema.md +0 -1381
  64. data/lib/smart_message/wrapper.rb.bak +0 -132
  65. /data/examples/memory/{06_pretty_print_demo.rb → 16_pretty_print_demo.rb} +0 -0
@@ -49,11 +49,11 @@ class UserRegistrationMessage < SmartMessage::Base
49
49
  description: "Timestamp when user account was created"
50
50
 
51
51
  config do
52
- transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
52
+ transport SmartMessage::Transport::MemoryTransport.new
53
53
  end
54
54
 
55
- def self.process(wrapper)
56
- message_header, message_payload = wrapper.split
55
+ def process(message)
56
+ message_header, message_payload = message
57
57
  user_data = JSON.parse(message_payload)
58
58
  puts "✅ User registration processed: #{user_data['username']} (#{user_data['email']})"
59
59
  end
@@ -97,11 +97,11 @@ class UserRegistrationMessageV2 < SmartMessage::Base
97
97
  description: "Timestamp when user account was created"
98
98
 
99
99
  config do
100
- transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
100
+ transport SmartMessage::Transport::MemoryTransport.new
101
101
  end
102
102
 
103
- def self.process(wrapper)
104
- message_header, message_payload = wrapper.split
103
+ def process(message)
104
+ message_header, message_payload = message
105
105
  user_data = JSON.parse(message_payload)
106
106
  puts "✅ User registration V2 processed: #{user_data['username']} (#{user_data['email']}, #{user_data['phone_number']})"
107
107
  end
@@ -118,7 +118,7 @@ class MultiRequiredMessage < SmartMessage::Base
118
118
  property :optional_field, description: "Optional field for comparison"
119
119
 
120
120
  config do
121
- transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
121
+ transport SmartMessage::Transport::MemoryTransport.new
122
122
  end
123
123
  end
124
124
 
@@ -14,7 +14,7 @@ puts "🎯 SmartMessage Entity Addressing Demo"
14
14
  puts "=" * 50
15
15
 
16
16
  # Configure transport for demo
17
- transport = SmartMessage::Transport.create(:stdout, loopback: true)
17
+ transport = SmartMessage::Transport::MemoryTransport.new
18
18
  serializer = SmartMessage::Serializer::Json.new
19
19
 
20
20
  # =============================================================================
@@ -39,12 +39,12 @@ class OrderMessage < SmartMessage::Base
39
39
  property :total_amount, required: true
40
40
 
41
41
  config do
42
- transport SmartMessage::Transport.create(:stdout, loopback: true)
42
+ transport SmartMessage::Transport::MemoryTransport.new
43
43
  end
44
44
 
45
- def self.process(wrapper)
46
- header = wrapper._sm_header
47
- payload = wrapper._sm_payload
45
+ def process(message)
46
+ header = message._sm_header
47
+ payload = message
48
48
  data = JSON.parse(payload)
49
49
  puts " 🎯 FULFILLMENT SERVICE received order:"
50
50
  puts " Order ID: #{data['order_id']}"
@@ -91,12 +91,12 @@ class SystemAnnouncementMessage < SmartMessage::Base
91
91
  property :effective_time, required: true
92
92
 
93
93
  config do
94
- transport SmartMessage::Transport.create(:stdout, loopback: true)
94
+ transport SmartMessage::Transport::MemoryTransport.new
95
95
  end
96
96
 
97
- def self.process(wrapper)
98
- header = wrapper._sm_header
99
- payload = wrapper._sm_payload
97
+ def process(message)
98
+ header = message._sm_header
99
+ payload = message
100
100
  data = JSON.parse(payload)
101
101
  priority_icon = data['priority'] == 'high' ? '🚨' : '📢'
102
102
  puts " #{priority_icon} ALL SERVICES received announcement:"
@@ -142,12 +142,12 @@ class UserLookupRequest < SmartMessage::Base
142
142
  property :requested_fields, default: ['name', 'email']
143
143
 
144
144
  config do
145
- transport SmartMessage::Transport.create(:stdout, loopback: true)
145
+ transport SmartMessage::Transport::MemoryTransport.new
146
146
  end
147
147
 
148
- def self.process(wrapper)
149
- header = wrapper._sm_header
150
- payload = wrapper._sm_payload
148
+ def process(message)
149
+ header = message._sm_header
150
+ payload = message
151
151
  data = JSON.parse(payload)
152
152
  puts " 🔍 USER SERVICE received lookup request:"
153
153
  puts " Request ID: #{data['request_id']}"
@@ -175,12 +175,12 @@ class UserLookupResponse < SmartMessage::Base
175
175
  property :error_message
176
176
 
177
177
  config do
178
- transport SmartMessage::Transport.create(:stdout, loopback: true)
178
+ transport SmartMessage::Transport::MemoryTransport.new
179
179
  end
180
180
 
181
- def self.process(wrapper)
182
- header = wrapper._sm_header
183
- payload = wrapper._sm_payload
181
+ def process(message)
182
+ header = message._sm_header
183
+ payload = message
184
184
  data = JSON.parse(payload)
185
185
  puts " ✅ WEB SERVICE received lookup response:"
186
186
  puts " Request ID: #{data['request_id']}"
@@ -246,12 +246,12 @@ class PaymentMessage < SmartMessage::Base
246
246
  property :payment_method, default: 'credit_card'
247
247
 
248
248
  config do
249
- transport SmartMessage::Transport.create(:stdout, loopback: true)
249
+ transport SmartMessage::Transport::MemoryTransport.new
250
250
  end
251
251
 
252
- def self.process(wrapper)
253
- header = wrapper._sm_header
254
- payload = wrapper._sm_payload
252
+ def process(message)
253
+ header = message._sm_header
254
+ payload = message
255
255
  data = JSON.parse(payload)
256
256
  gateway_icon = header.to.include?('backup') ? '🔄' : '🏦'
257
257
  puts " #{gateway_icon} #{header.to.upcase} received payment:"
@@ -320,12 +320,12 @@ class ExternalAPIMessage < SmartMessage::Base
320
320
  property :partner_id, required: true
321
321
 
322
322
  config do
323
- transport SmartMessage::Transport.create(:stdout, loopback: true)
323
+ transport SmartMessage::Transport::MemoryTransport.new
324
324
  end
325
325
 
326
- def self.process(wrapper)
327
- header = wrapper._sm_header
328
- payload = wrapper._sm_payload
326
+ def process(message)
327
+ header = message._sm_header
328
+ payload = message
329
329
  data = JSON.parse(payload)
330
330
  puts " 🌐 EXTERNAL PARTNER received API call:"
331
331
  puts " API Call: #{data['api_call']}"
@@ -15,7 +15,7 @@ puts "🎯 SmartMessage Entity Addressing & Filtering Demo"
15
15
  puts "=" * 50
16
16
 
17
17
  # Configure transport for demo
18
- transport = SmartMessage::Transport.create(:stdout, loopback: true)
18
+ transport = SmartMessage::Transport::MemoryTransport.new
19
19
  serializer = SmartMessage::Serializer::Json.new
20
20
 
21
21
  # =============================================================================
@@ -36,13 +36,13 @@ class ServiceMessage < SmartMessage::Base
36
36
  property :timestamp, default: -> { Time.now.to_s }
37
37
 
38
38
  config do
39
- transport SmartMessage::Transport.create(:stdout, loopback: true)
39
+ transport SmartMessage::Transport::MemoryTransport.new
40
40
  end
41
41
 
42
42
  # Different handlers for different subscription filters
43
- def self.process_broadcast(wrapper)
44
- header = wrapper._sm_header
45
- payload = wrapper._sm_payload
43
+ def process_broadcast(message)
44
+ header = message._sm_header
45
+ payload = message
46
46
  data = JSON.parse(payload)
47
47
  puts " 📻 BROADCAST HANDLER received:"
48
48
  puts " Type: #{data['message_type']}"
@@ -50,9 +50,9 @@ class ServiceMessage < SmartMessage::Base
50
50
  puts " Data: #{data['data']}"
51
51
  end
52
52
 
53
- def self.process_directed(wrapper)
54
- header = wrapper._sm_header
55
- payload = wrapper._sm_payload
53
+ def process_directed(message)
54
+ header = message._sm_header
55
+ payload = message
56
56
  data = JSON.parse(payload)
57
57
  puts " 🎯 DIRECTED HANDLER received:"
58
58
  puts " Type: #{data['message_type']}"
@@ -60,9 +60,9 @@ class ServiceMessage < SmartMessage::Base
60
60
  puts " Data: #{data['data']}"
61
61
  end
62
62
 
63
- def self.process_from_admin(wrapper)
64
- header = wrapper._sm_header
65
- payload = wrapper._sm_payload
63
+ def process_from_admin(message)
64
+ header = message._sm_header
65
+ payload = message
66
66
  data = JSON.parse(payload)
67
67
  puts " 👮 ADMIN HANDLER received:"
68
68
  puts " Type: #{data['message_type']}"
@@ -152,12 +152,12 @@ class AlertMessage < SmartMessage::Base
152
152
  property :source_system
153
153
 
154
154
  config do
155
- transport SmartMessage::Transport.create(:stdout, loopback: true)
155
+ transport SmartMessage::Transport::MemoryTransport.new
156
156
  end
157
157
 
158
- def self.process_critical_or_broadcast(wrapper)
159
- header = wrapper._sm_header
160
- payload = wrapper._sm_payload
158
+ def process_broadcast(message)
159
+ header = message._sm_header
160
+ payload = message
161
161
  data = JSON.parse(payload)
162
162
  icon = data['severity'] == 'critical' ? '🚨' : '📢'
163
163
  puts " #{icon} ALERT MONITOR received:"
@@ -166,9 +166,9 @@ class AlertMessage < SmartMessage::Base
166
166
  puts " Alert: #{data['alert_text']}"
167
167
  end
168
168
 
169
- def self.process_from_monitoring(wrapper)
170
- header = wrapper._sm_header
171
- payload = wrapper._sm_payload
169
+ def process_from_monitoring(message)
170
+ header = message._sm_header
171
+ payload = message
172
172
  data = JSON.parse(payload)
173
173
  puts " 📊 MONITORING TEAM received:"
174
174
  puts " From: #{header.from} (monitoring system)"
@@ -259,12 +259,12 @@ class OrderMessage < SmartMessage::Base
259
259
  property :total_amount, required: true
260
260
 
261
261
  config do
262
- transport SmartMessage::Transport.create(:stdout, loopback: true)
262
+ transport SmartMessage::Transport::MemoryTransport.new
263
263
  end
264
264
 
265
- def self.process_high_priority(wrapper)
266
- header = wrapper._sm_header
267
- payload = wrapper._sm_payload
265
+ def process_high_priority(message)
266
+ header = message._sm_header
267
+ payload = message
268
268
  data = JSON.parse(payload)
269
269
  puts " 🚀 HIGH PRIORITY ORDER HANDLER:"
270
270
  puts " Order ID: #{data['order_id']} (PRIORITY: #{data['priority'].upcase})"
@@ -272,9 +272,9 @@ class OrderMessage < SmartMessage::Base
272
272
  puts " Total: $#{data['total_amount']}"
273
273
  end
274
274
 
275
- def self.process_normal(wrapper)
276
- header = wrapper._sm_header
277
- payload = wrapper._sm_payload
275
+ def process_normal(message)
276
+ header = message._sm_header
277
+ payload = message
278
278
  data = JSON.parse(payload)
279
279
  puts " 📦 NORMAL ORDER HANDLER:"
280
280
  puts " Order ID: #{data['order_id']}"
@@ -353,12 +353,12 @@ class ServiceRequest < SmartMessage::Base
353
353
  property :data
354
354
 
355
355
  config do
356
- transport SmartMessage::Transport.create(:stdout, loopback: true)
356
+ transport SmartMessage::Transport::MemoryTransport.new
357
357
  end
358
358
 
359
- def self.process_api_requests(wrapper)
360
- header = wrapper._sm_header
361
- payload = wrapper._sm_payload
359
+ def process_api_requests(message)
360
+ header = message._sm_header
361
+ payload = message
362
362
  data = JSON.parse(payload)
363
363
  puts " 🌐 API SERVICE received request:"
364
364
  puts " Request ID: #{data['request_id']}"
@@ -367,9 +367,9 @@ class ServiceRequest < SmartMessage::Base
367
367
  puts " Reply To: #{header.reply_to}"
368
368
  end
369
369
 
370
- def self.process_data_requests(wrapper)
371
- header = wrapper._sm_header
372
- payload = wrapper._sm_payload
370
+ def process_data_requests(message)
371
+ header = message._sm_header
372
+ payload = message
373
373
  data = JSON.parse(payload)
374
374
  puts " 💾 DATA SERVICE received request:"
375
375
  puts " Request ID: #{data['request_id']}"
@@ -30,7 +30,7 @@ class MicroserviceMessage < SmartMessage::Base
30
30
 
31
31
  # Configure with STDOUT transport for demo visibility
32
32
  config do
33
- transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
33
+ transport SmartMessage::Transport::MemoryTransport.new
34
34
  end
35
35
  end
36
36
 
@@ -42,9 +42,9 @@ class PaymentMessage < MicroserviceMessage
42
42
  property :amount, required: true
43
43
  property :currency, default: 'USD'
44
44
 
45
- def self.process(wrapper)
46
- header = wrapper._sm_header
47
- payload = wrapper._sm_payload
45
+ def process(message)
46
+ header = message._sm_header
47
+ payload = message
48
48
  msg_data = JSON.parse(payload)
49
49
  puts "💳 PaymentMessage processed by #{self.name}"
50
50
  puts " From: #{header.from} → To: #{header.to}"
@@ -61,9 +61,9 @@ class OrderMessage < MicroserviceMessage
61
61
  property :customer_id, required: true
62
62
  property :status, default: 'pending'
63
63
 
64
- def self.process(wrapper)
65
- header = wrapper._sm_header
66
- payload = wrapper._sm_payload
64
+ def process(message)
65
+ header = message._sm_header
66
+ payload = message
67
67
  msg_data = JSON.parse(payload)
68
68
  puts "📦 OrderMessage processed by #{self.name}"
69
69
  puts " From: #{header.from} → To: #{header.to}"
@@ -80,9 +80,9 @@ class AlertMessage < MicroserviceMessage
80
80
  property :component, required: true
81
81
  property :description, required: true
82
82
 
83
- def self.process(wrapper)
84
- header = wrapper._sm_header
85
- payload = wrapper._sm_payload
83
+ def process(message)
84
+ header = message._sm_header
85
+ payload = message
86
86
  msg_data = JSON.parse(payload)
87
87
  puts "🚨 AlertMessage processed by #{self.name}"
88
88
  puts " From: #{header.from} → To: #{header.to}"
@@ -24,14 +24,14 @@ puts
24
24
  puts "2. Configuring Logging with String Path:"
25
25
  SmartMessage.configure do |config|
26
26
  config.logger = "log/my_application.log" # String = Lumberjack logger with this path
27
- config.transport = SmartMessage::Transport::StdoutTransport.new(loopback: true)
28
- config.serializer = SmartMessage::Serializer::Json.new
27
+ config.transport = SmartMessage::Transport::MemoryTransport.new
28
+ # Note: Serializers are configured per transport, not globally
29
29
  end
30
30
 
31
31
  puts " Configured Logger: #{SmartMessage::Logger.default.class}"
32
32
  puts " Log File: #{SmartMessage::Logger.default.log_file rescue 'N/A'}"
33
33
  puts " Configured Transport: #{SmartMessage::Transport.default.class}"
34
- puts " Configured Serializer: #{SmartMessage::Serializer.default.class}"
34
+ puts " Framework Default Serializer: #{SmartMessage::Serializer.default.class}"
35
35
  puts
36
36
 
37
37
  # Reset for next example
@@ -41,14 +41,14 @@ SmartMessage.reset_configuration!
41
41
  puts "3. Configuring with :default Symbol:"
42
42
  SmartMessage.configure do |config|
43
43
  config.logger = :default # Use Lumberjack with default settings
44
- config.transport = SmartMessage::Transport::StdoutTransport.new(loopback: true)
45
- config.serializer = SmartMessage::Serializer::Json.new
44
+ config.transport = SmartMessage::Transport::MemoryTransport.new
45
+ # Note: Serializers are configured per transport, not globally
46
46
  end
47
47
 
48
48
  puts " Configured Logger: #{SmartMessage::Logger.default.class}"
49
49
  puts " Log File: #{SmartMessage::Logger.default.log_file rescue 'N/A'}"
50
50
  puts " Configured Transport: #{SmartMessage::Transport.default.class}"
51
- puts " Configured Serializer: #{SmartMessage::Serializer.default.class}"
51
+ puts " Framework Default Serializer: #{SmartMessage::Serializer.default.class}"
52
52
  puts
53
53
 
54
54
  # Example 4: Message classes automatically use global configuration
@@ -65,8 +65,8 @@ class NotificationMessage < SmartMessage::Base
65
65
  logger SmartMessage::Logger.default
66
66
  end
67
67
 
68
- def self.process(wrapper)
69
- message_header, message_payload = wrapper.split
68
+ def process(message)
69
+ message_header, message_payload = message
70
70
  data = JSON.parse(message_payload)
71
71
 
72
72
  priority_emoji = case data['priority']
@@ -90,8 +90,8 @@ class OrderStatusMessage < SmartMessage::Base
90
90
  logger SmartMessage::Logger.default
91
91
  end
92
92
 
93
- def self.process(wrapper)
94
- message_header, message_payload = wrapper.split
93
+ def process(message)
94
+ message_header, message_payload = message
95
95
  data = JSON.parse(message_payload)
96
96
 
97
97
  status_emoji = case data['status']
@@ -152,8 +152,8 @@ class SpecialMessage < SmartMessage::Base
152
152
  # transport and serializer still use global configuration
153
153
  end
154
154
 
155
- def self.process(wrapper)
156
- message_header, message_payload = wrapper.split
155
+ def process(message)
156
+ message_header, message_payload = message
157
157
  data = JSON.parse(message_payload)
158
158
  puts "⭐ Special processing: #{data['content']}"
159
159
  end
@@ -1,16 +1,25 @@
1
1
  # Memory Transport Examples
2
2
 
3
- This directory contains demonstration programs that use SmartMessage's **Memory Transport** and **Stdout Transport** (with loopback). These examples show the fundamentals of SmartMessage without requiring external dependencies like Redis or message queues.
3
+ This directory contains demonstration programs that use SmartMessage's **Memory Transport** and **STDOUT Transport**. These examples show the fundamentals of SmartMessage without requiring external dependencies like Redis or message queues.
4
4
 
5
5
  ## Transport Overview
6
6
 
7
- The Memory and Stdout (with loopback) transports are ideal for:
7
+ ### Memory Transport
8
+ Perfect for local development with message processing:
8
9
  - **Learning SmartMessage fundamentals**
9
- - **Rapid prototyping and testing**
10
+ - **Rapid prototyping and testing**
10
11
  - **Single-process applications**
11
12
  - **Development and debugging**
13
+ - **Local message processing**
12
14
 
13
- These transports keep all message routing in-memory within the current Ruby process.
15
+ ### STDOUT Transport
16
+ Publish-only transport for debugging and integration:
17
+ - **Debugging and logging**
18
+ - **Integration with external tools**
19
+ - **Development monitoring**
20
+ - **One-way message output**
21
+
22
+ The Memory transport keeps all message routing in-memory within the current Ruby process, while STDOUT transport outputs messages for external processing.
14
23
 
15
24
  ## Example Programs
16
25
 
@@ -32,7 +41,7 @@ These transports keep all message routing in-memory within the current Ruby proc
32
41
 
33
42
  ### 🛍️ 03_point_to_point_orders.rb
34
43
  **Demonstrates:** Point-to-point messaging (1:1)
35
- **Transport:** StdoutTransport with loopback
44
+ **Transport:** MemoryTransport
36
45
  - Order processing system between OrderService and PaymentService
37
46
  - Request/response message pattern
38
47
  - Automatic serialization of complex order data by transport
@@ -40,7 +49,7 @@ These transports keep all message routing in-memory within the current Ruby proc
40
49
 
41
50
  ### 📢 04_publish_subscribe_events.rb
42
51
  **Demonstrates:** Publish-subscribe messaging (1:many)
43
- **Transport:** StdoutTransport with loopback
52
+ **Transport:** MemoryTransport
44
53
  - User event notification system
45
54
  - Multiple subscribers (EmailService, SMSService, AuditService)
46
55
  - Event-driven architecture
@@ -48,13 +57,21 @@ These transports keep all message routing in-memory within the current Ruby proc
48
57
 
49
58
  ### 💬 05_many_to_many_chat.rb
50
59
  **Demonstrates:** Many-to-many messaging patterns
51
- **Transport:** StdoutTransport with loopback
60
+ **Transport:** MemoryTransport
52
61
  - Multi-user chat room system
53
62
  - Message broadcasting to multiple participants
54
63
  - User presence and room management
55
64
  - Complex message routing scenarios
56
65
 
57
- ### 🎨 06_pretty_print_demo.rb
66
+ ### 📤 06_stdout_publish_only.rb
67
+ **Demonstrates:** STDOUT transport publish-only usage
68
+ **Transport:** StdoutTransport (publish-only)
69
+ - Log message publishing to STDOUT
70
+ - Metrics publishing in JSON format
71
+ - Perfect for debugging and external tool integration
72
+ - Shows pretty-print vs JSON formatting options
73
+
74
+ ### 🎨 16_pretty_print_demo.rb
58
75
  **Demonstrates:** Message pretty-printing and debugging
59
76
  **Transport:** None (utility demo)
60
77
  - Shows SmartMessage's `pretty_print` method
@@ -64,7 +81,7 @@ These transports keep all message routing in-memory within the current Ruby proc
64
81
 
65
82
  ### ⚡ 07_proc_handlers_demo.rb
66
83
  **Demonstrates:** Proc-based message handlers
67
- **Transport:** StdoutTransport with loopback
84
+ **Transport:** MemoryTransport
68
85
  - Custom Proc handlers for message processing
69
86
  - Dynamic message routing
70
87
  - Flexible handler assignment
@@ -72,7 +89,7 @@ These transports keep all message routing in-memory within the current Ruby proc
72
89
 
73
90
  ### 📊 08_custom_logger_demo.rb
74
91
  **Demonstrates:** Custom logging implementations
75
- **Transport:** StdoutTransport with loopback
92
+ **Transport:** MemoryTransport
76
93
  - Multiple logger types and configurations
77
94
  - Custom logger classes
78
95
  - Log filtering and formatting
@@ -80,7 +97,7 @@ These transports keep all message routing in-memory within the current Ruby proc
80
97
 
81
98
  ### ❌ 09_error_handling_demo.rb
82
99
  **Demonstrates:** Error handling strategies
83
- **Transport:** StdoutTransport with loopback
100
+ **Transport:** MemoryTransport
84
101
  - Various error scenarios and recovery patterns
85
102
  - Exception handling in message processors
86
103
  - Error propagation and logging
@@ -88,7 +105,7 @@ These transports keep all message routing in-memory within the current Ruby proc
88
105
 
89
106
  ### 🎯 10_entity_addressing_basic.rb
90
107
  **Demonstrates:** Basic entity addressing
91
- **Transport:** StdoutTransport with loopback
108
+ **Transport:** MemoryTransport
92
109
  - Message routing by entity addresses
93
110
  - Order processing with specific routing
94
111
  - Customer and payment entity handling
@@ -96,7 +113,7 @@ These transports keep all message routing in-memory within the current Ruby proc
96
113
 
97
114
  ### 🔍 11_entity_addressing_with_filtering.rb
98
115
  **Demonstrates:** Advanced entity addressing with filters
99
- **Transport:** StdoutTransport with loopback
116
+ **Transport:** MemoryTransport
100
117
  - Complex filtering patterns
101
118
  - Regex-based address matching
102
119
  - Multiple entity types and routing rules
@@ -104,7 +121,7 @@ These transports keep all message routing in-memory within the current Ruby proc
104
121
 
105
122
  ### 🏢 12_regex_filtering_microservices.rb
106
123
  **Demonstrates:** Microservices with regex filtering
107
- **Transport:** StdoutTransport with loopback
124
+ **Transport:** MemoryTransport
108
125
  - Service-to-service communication patterns
109
126
  - Regular expression-based routing
110
127
  - Environment-based filtering (dev/staging/prod)
@@ -112,7 +129,7 @@ These transports keep all message routing in-memory within the current Ruby proc
112
129
 
113
130
  ### 📝 13_header_block_configuration.rb
114
131
  **Demonstrates:** Header configuration with blocks
115
- **Transport:** StdoutTransport
132
+ **Transport:** StdoutTransport (publish-only)
116
133
  - Dynamic header configuration
117
134
  - Block-based header modification
118
135
  - Custom header fields
@@ -120,7 +137,7 @@ These transports keep all message routing in-memory within the current Ruby proc
120
137
 
121
138
  ### 🌍 14_global_configuration_demo.rb
122
139
  **Demonstrates:** Global SmartMessage configuration
123
- **Transport:** StdoutTransport with loopback
140
+ **Transport:** MemoryTransport
124
141
  - Global transport settings
125
142
  - Configuration inheritance (serialization handled by transport)
126
143
  - Default settings management
@@ -128,7 +145,7 @@ These transports keep all message routing in-memory within the current Ruby proc
128
145
 
129
146
  ### 📋 15_logger_demo.rb
130
147
  **Demonstrates:** Logger configuration and usage
131
- **Transport:** StdoutTransport
148
+ **Transport:** StdoutTransport (publish-only)
132
149
  - Various logger configurations
133
150
  - Log level management
134
151
  - Custom log formatting