smart_message 0.0.12 → 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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +155 -1
  4. data/Gemfile.lock +6 -6
  5. data/README.md +71 -25
  6. data/docs/core-concepts/architecture.md +5 -10
  7. data/docs/getting-started/examples.md +0 -12
  8. data/docs/getting-started/quick-start.md +4 -9
  9. data/docs/index.md +6 -4
  10. data/docs/reference/serializers.md +160 -488
  11. data/docs/reference/transports.md +47 -146
  12. data/docs/transports/memory-transport.md +2 -1
  13. data/docs/transports/multi-transport.md +484 -0
  14. data/docs/transports/redis-transport-comparison.md +215 -350
  15. data/docs/transports/redis-transport.md +3 -22
  16. data/examples/README.md +6 -9
  17. data/examples/city_scenario/README.md +1 -1
  18. data/examples/city_scenario/messages/emergency_911_message.rb +0 -1
  19. data/examples/city_scenario/messages/emergency_resolved_message.rb +0 -1
  20. data/examples/city_scenario/messages/fire_dispatch_message.rb +0 -1
  21. data/examples/city_scenario/messages/fire_emergency_message.rb +0 -1
  22. data/examples/city_scenario/messages/health_check_message.rb +0 -1
  23. data/examples/city_scenario/messages/health_status_message.rb +0 -1
  24. data/examples/city_scenario/messages/police_dispatch_message.rb +0 -1
  25. data/examples/city_scenario/messages/silent_alarm_message.rb +0 -1
  26. data/examples/file/00_run_all_file_demos.rb +260 -0
  27. data/examples/file/01_basic_file_transport_demo.rb +237 -0
  28. data/examples/file/02_fifo_transport_demo.rb +289 -0
  29. data/examples/file/03_file_watching_demo.rb +332 -0
  30. data/examples/file/04_multi_transport_file_demo.rb +432 -0
  31. data/examples/file/README.md +257 -0
  32. data/examples/memory/00_run_all_demos.rb +317 -0
  33. data/examples/memory/01_message_deduplication_demo.rb +18 -32
  34. data/examples/memory/02_dead_letter_queue_demo.rb +9 -12
  35. data/examples/memory/03_point_to_point_orders.rb +3 -5
  36. data/examples/memory/04_publish_subscribe_events.rb +15 -16
  37. data/examples/memory/05_many_to_many_chat.rb +19 -22
  38. data/examples/memory/06_stdout_publish_only.rb +145 -0
  39. data/examples/memory/07_proc_handlers_demo.rb +13 -14
  40. data/examples/memory/08_custom_logger_demo.rb +136 -140
  41. data/examples/memory/09_error_handling_demo.rb +7 -10
  42. data/examples/memory/10_entity_addressing_basic.rb +25 -31
  43. data/examples/memory/11_entity_addressing_with_filtering.rb +32 -36
  44. data/examples/memory/12_regex_filtering_microservices.rb +10 -11
  45. data/examples/memory/13_header_block_configuration.rb +0 -5
  46. data/examples/memory/14_global_configuration_demo.rb +12 -14
  47. data/examples/memory/15_logger_demo.rb +0 -1
  48. data/examples/memory/README.md +37 -20
  49. data/examples/memory/log/demo_app.log.1 +100 -0
  50. data/examples/memory/log/demo_app.log.2 +100 -0
  51. data/examples/multi_transport_example.rb +114 -0
  52. data/examples/redis/01_smart_home_iot_demo.rb +20 -24
  53. data/examples/redis/README.md +0 -2
  54. data/examples/utilities/box_it.rb +12 -0
  55. data/examples/utilities/doing.rb +19 -0
  56. data/examples/utilities/temp.md +28 -0
  57. data/lib/smart_message/base.rb +24 -17
  58. data/lib/smart_message/configuration.rb +2 -23
  59. data/lib/smart_message/dead_letter_queue.rb +1 -1
  60. data/lib/smart_message/errors.rb +3 -0
  61. data/lib/smart_message/header.rb +1 -1
  62. data/lib/smart_message/logger/default.rb +1 -1
  63. data/lib/smart_message/messaging.rb +37 -66
  64. data/lib/smart_message/plugins.rb +42 -41
  65. data/lib/smart_message/serializer/base.rb +1 -1
  66. data/lib/smart_message/serializer.rb +3 -2
  67. data/lib/smart_message/subscription.rb +18 -20
  68. data/lib/smart_message/transport/async_publish_queue.rb +284 -0
  69. data/lib/smart_message/transport/base.rb +42 -8
  70. data/lib/smart_message/transport/fifo_operations.rb +264 -0
  71. data/lib/smart_message/transport/file_operations.rb +200 -0
  72. data/lib/smart_message/transport/file_transport.rb +149 -0
  73. data/lib/smart_message/transport/file_watching.rb +72 -0
  74. data/lib/smart_message/transport/memory_transport.rb +23 -4
  75. data/lib/smart_message/transport/partitioned_files.rb +46 -0
  76. data/lib/smart_message/transport/redis_transport.rb +11 -0
  77. data/lib/smart_message/transport/registry.rb +0 -1
  78. data/lib/smart_message/transport/stdout_transport.rb +73 -41
  79. data/lib/smart_message/transport/stdout_transport.rb.backup +88 -0
  80. data/lib/smart_message/transport.rb +0 -1
  81. data/lib/smart_message/version.rb +1 -1
  82. metadata +25 -37
  83. data/docs/guides/redis-queue-getting-started.md +0 -697
  84. data/docs/guides/redis-queue-patterns.md +0 -889
  85. data/docs/guides/redis-queue-production.md +0 -1091
  86. data/docs/transports/redis-enhanced-transport.md +0 -524
  87. data/docs/transports/redis-queue-transport.md +0 -1304
  88. data/examples/redis_enhanced/README.md +0 -319
  89. data/examples/redis_enhanced/enhanced_01_basic_patterns.rb +0 -233
  90. data/examples/redis_enhanced/enhanced_02_fluent_api.rb +0 -331
  91. data/examples/redis_enhanced/enhanced_03_dual_publishing.rb +0 -281
  92. data/examples/redis_enhanced/enhanced_04_advanced_routing.rb +0 -419
  93. data/examples/redis_queue/01_basic_messaging.rb +0 -221
  94. data/examples/redis_queue/01_comprehensive_examples.rb +0 -508
  95. data/examples/redis_queue/02_pattern_routing.rb +0 -405
  96. data/examples/redis_queue/03_fluent_api.rb +0 -422
  97. data/examples/redis_queue/04_load_balancing.rb +0 -486
  98. data/examples/redis_queue/05_microservices.rb +0 -735
  99. data/examples/redis_queue/06_emergency_alerts.rb +0 -777
  100. data/examples/redis_queue/07_queue_management.rb +0 -587
  101. data/examples/redis_queue/README.md +0 -366
  102. data/examples/redis_queue/enhanced_01_basic_patterns.rb +0 -233
  103. data/examples/redis_queue/enhanced_02_fluent_api.rb +0 -331
  104. data/examples/redis_queue/enhanced_03_dual_publishing.rb +0 -281
  105. data/examples/redis_queue/enhanced_04_advanced_routing.rb +0 -419
  106. data/examples/redis_queue/redis_queue_architecture.svg +0 -148
  107. data/ideas/README.md +0 -41
  108. data/ideas/agents.md +0 -1001
  109. data/ideas/database_transport.md +0 -980
  110. data/ideas/improvement.md +0 -359
  111. data/ideas/meshage.md +0 -1788
  112. data/ideas/message_discovery.md +0 -178
  113. data/ideas/message_schema.md +0 -1381
  114. data/lib/smart_message/transport/redis_enhanced_transport.rb +0 -399
  115. data/lib/smart_message/transport/redis_queue_transport.rb +0 -555
  116. data/lib/smart_message/wrapper.rb.bak +0 -132
  117. /data/examples/memory/{06_pretty_print_demo.rb → 16_pretty_print_demo.rb} +0 -0
@@ -49,12 +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)
53
- serializer SmartMessage::Serializer::Json.new
52
+ transport SmartMessage::Transport::MemoryTransport.new
54
53
  end
55
54
 
56
- def self.process(wrapper)
57
- message_header, message_payload = wrapper.split
55
+ def process(message)
56
+ message_header, message_payload = message
58
57
  user_data = JSON.parse(message_payload)
59
58
  puts "✅ User registration processed: #{user_data['username']} (#{user_data['email']})"
60
59
  end
@@ -98,12 +97,11 @@ class UserRegistrationMessageV2 < SmartMessage::Base
98
97
  description: "Timestamp when user account was created"
99
98
 
100
99
  config do
101
- transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
102
- serializer SmartMessage::Serializer::Json.new
100
+ transport SmartMessage::Transport::MemoryTransport.new
103
101
  end
104
102
 
105
- def self.process(wrapper)
106
- message_header, message_payload = wrapper.split
103
+ def process(message)
104
+ message_header, message_payload = message
107
105
  user_data = JSON.parse(message_payload)
108
106
  puts "✅ User registration V2 processed: #{user_data['username']} (#{user_data['email']}, #{user_data['phone_number']})"
109
107
  end
@@ -120,8 +118,7 @@ class MultiRequiredMessage < SmartMessage::Base
120
118
  property :optional_field, description: "Optional field for comparison"
121
119
 
122
120
  config do
123
- transport SmartMessage::Transport::StdoutTransport.new(loopback: true)
124
- serializer SmartMessage::Serializer::Json.new
121
+ transport SmartMessage::Transport::MemoryTransport.new
125
122
  end
126
123
  end
127
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,13 +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)
43
- serializer SmartMessage::Serializer::Json.new
42
+ transport SmartMessage::Transport::MemoryTransport.new
44
43
  end
45
44
 
46
- def self.process(wrapper)
47
- header = wrapper._sm_header
48
- payload = wrapper._sm_payload
45
+ def process(message)
46
+ header = message._sm_header
47
+ payload = message
49
48
  data = JSON.parse(payload)
50
49
  puts " 🎯 FULFILLMENT SERVICE received order:"
51
50
  puts " Order ID: #{data['order_id']}"
@@ -92,13 +91,12 @@ class SystemAnnouncementMessage < SmartMessage::Base
92
91
  property :effective_time, required: true
93
92
 
94
93
  config do
95
- transport SmartMessage::Transport.create(:stdout, loopback: true)
96
- serializer SmartMessage::Serializer::Json.new
94
+ transport SmartMessage::Transport::MemoryTransport.new
97
95
  end
98
96
 
99
- def self.process(wrapper)
100
- header = wrapper._sm_header
101
- payload = wrapper._sm_payload
97
+ def process(message)
98
+ header = message._sm_header
99
+ payload = message
102
100
  data = JSON.parse(payload)
103
101
  priority_icon = data['priority'] == 'high' ? '🚨' : '📢'
104
102
  puts " #{priority_icon} ALL SERVICES received announcement:"
@@ -144,13 +142,12 @@ class UserLookupRequest < SmartMessage::Base
144
142
  property :requested_fields, default: ['name', 'email']
145
143
 
146
144
  config do
147
- transport SmartMessage::Transport.create(:stdout, loopback: true)
148
- serializer SmartMessage::Serializer::Json.new
145
+ transport SmartMessage::Transport::MemoryTransport.new
149
146
  end
150
147
 
151
- def self.process(wrapper)
152
- header = wrapper._sm_header
153
- payload = wrapper._sm_payload
148
+ def process(message)
149
+ header = message._sm_header
150
+ payload = message
154
151
  data = JSON.parse(payload)
155
152
  puts " 🔍 USER SERVICE received lookup request:"
156
153
  puts " Request ID: #{data['request_id']}"
@@ -178,13 +175,12 @@ class UserLookupResponse < SmartMessage::Base
178
175
  property :error_message
179
176
 
180
177
  config do
181
- transport SmartMessage::Transport.create(:stdout, loopback: true)
182
- serializer SmartMessage::Serializer::Json.new
178
+ transport SmartMessage::Transport::MemoryTransport.new
183
179
  end
184
180
 
185
- def self.process(wrapper)
186
- header = wrapper._sm_header
187
- payload = wrapper._sm_payload
181
+ def process(message)
182
+ header = message._sm_header
183
+ payload = message
188
184
  data = JSON.parse(payload)
189
185
  puts " ✅ WEB SERVICE received lookup response:"
190
186
  puts " Request ID: #{data['request_id']}"
@@ -250,13 +246,12 @@ class PaymentMessage < SmartMessage::Base
250
246
  property :payment_method, default: 'credit_card'
251
247
 
252
248
  config do
253
- transport SmartMessage::Transport.create(:stdout, loopback: true)
254
- serializer SmartMessage::Serializer::Json.new
249
+ transport SmartMessage::Transport::MemoryTransport.new
255
250
  end
256
251
 
257
- def self.process(wrapper)
258
- header = wrapper._sm_header
259
- payload = wrapper._sm_payload
252
+ def process(message)
253
+ header = message._sm_header
254
+ payload = message
260
255
  data = JSON.parse(payload)
261
256
  gateway_icon = header.to.include?('backup') ? '🔄' : '🏦'
262
257
  puts " #{gateway_icon} #{header.to.upcase} received payment:"
@@ -325,13 +320,12 @@ class ExternalAPIMessage < SmartMessage::Base
325
320
  property :partner_id, required: true
326
321
 
327
322
  config do
328
- transport SmartMessage::Transport.create(:stdout, loopback: true)
329
- serializer SmartMessage::Serializer::Json.new
323
+ transport SmartMessage::Transport::MemoryTransport.new
330
324
  end
331
325
 
332
- def self.process(wrapper)
333
- header = wrapper._sm_header
334
- payload = wrapper._sm_payload
326
+ def process(message)
327
+ header = message._sm_header
328
+ payload = message
335
329
  data = JSON.parse(payload)
336
330
  puts " 🌐 EXTERNAL PARTNER received API call:"
337
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,14 +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)
40
- serializer SmartMessage::Serializer::Json.new
39
+ transport SmartMessage::Transport::MemoryTransport.new
41
40
  end
42
41
 
43
42
  # Different handlers for different subscription filters
44
- def self.process_broadcast(wrapper)
45
- header = wrapper._sm_header
46
- payload = wrapper._sm_payload
43
+ def process_broadcast(message)
44
+ header = message._sm_header
45
+ payload = message
47
46
  data = JSON.parse(payload)
48
47
  puts " 📻 BROADCAST HANDLER received:"
49
48
  puts " Type: #{data['message_type']}"
@@ -51,9 +50,9 @@ class ServiceMessage < SmartMessage::Base
51
50
  puts " Data: #{data['data']}"
52
51
  end
53
52
 
54
- def self.process_directed(wrapper)
55
- header = wrapper._sm_header
56
- payload = wrapper._sm_payload
53
+ def process_directed(message)
54
+ header = message._sm_header
55
+ payload = message
57
56
  data = JSON.parse(payload)
58
57
  puts " 🎯 DIRECTED HANDLER received:"
59
58
  puts " Type: #{data['message_type']}"
@@ -61,9 +60,9 @@ class ServiceMessage < SmartMessage::Base
61
60
  puts " Data: #{data['data']}"
62
61
  end
63
62
 
64
- def self.process_from_admin(wrapper)
65
- header = wrapper._sm_header
66
- payload = wrapper._sm_payload
63
+ def process_from_admin(message)
64
+ header = message._sm_header
65
+ payload = message
67
66
  data = JSON.parse(payload)
68
67
  puts " 👮 ADMIN HANDLER received:"
69
68
  puts " Type: #{data['message_type']}"
@@ -153,13 +152,12 @@ class AlertMessage < SmartMessage::Base
153
152
  property :source_system
154
153
 
155
154
  config do
156
- transport SmartMessage::Transport.create(:stdout, loopback: true)
157
- serializer SmartMessage::Serializer::Json.new
155
+ transport SmartMessage::Transport::MemoryTransport.new
158
156
  end
159
157
 
160
- def self.process_critical_or_broadcast(wrapper)
161
- header = wrapper._sm_header
162
- payload = wrapper._sm_payload
158
+ def process_broadcast(message)
159
+ header = message._sm_header
160
+ payload = message
163
161
  data = JSON.parse(payload)
164
162
  icon = data['severity'] == 'critical' ? '🚨' : '📢'
165
163
  puts " #{icon} ALERT MONITOR received:"
@@ -168,9 +166,9 @@ class AlertMessage < SmartMessage::Base
168
166
  puts " Alert: #{data['alert_text']}"
169
167
  end
170
168
 
171
- def self.process_from_monitoring(wrapper)
172
- header = wrapper._sm_header
173
- payload = wrapper._sm_payload
169
+ def process_from_monitoring(message)
170
+ header = message._sm_header
171
+ payload = message
174
172
  data = JSON.parse(payload)
175
173
  puts " 📊 MONITORING TEAM received:"
176
174
  puts " From: #{header.from} (monitoring system)"
@@ -261,13 +259,12 @@ class OrderMessage < SmartMessage::Base
261
259
  property :total_amount, required: true
262
260
 
263
261
  config do
264
- transport SmartMessage::Transport.create(:stdout, loopback: true)
265
- serializer SmartMessage::Serializer::Json.new
262
+ transport SmartMessage::Transport::MemoryTransport.new
266
263
  end
267
264
 
268
- def self.process_high_priority(wrapper)
269
- header = wrapper._sm_header
270
- payload = wrapper._sm_payload
265
+ def process_high_priority(message)
266
+ header = message._sm_header
267
+ payload = message
271
268
  data = JSON.parse(payload)
272
269
  puts " 🚀 HIGH PRIORITY ORDER HANDLER:"
273
270
  puts " Order ID: #{data['order_id']} (PRIORITY: #{data['priority'].upcase})"
@@ -275,9 +272,9 @@ class OrderMessage < SmartMessage::Base
275
272
  puts " Total: $#{data['total_amount']}"
276
273
  end
277
274
 
278
- def self.process_normal(wrapper)
279
- header = wrapper._sm_header
280
- payload = wrapper._sm_payload
275
+ def process_normal(message)
276
+ header = message._sm_header
277
+ payload = message
281
278
  data = JSON.parse(payload)
282
279
  puts " 📦 NORMAL ORDER HANDLER:"
283
280
  puts " Order ID: #{data['order_id']}"
@@ -356,13 +353,12 @@ class ServiceRequest < SmartMessage::Base
356
353
  property :data
357
354
 
358
355
  config do
359
- transport SmartMessage::Transport.create(:stdout, loopback: true)
360
- serializer SmartMessage::Serializer::Json.new
356
+ transport SmartMessage::Transport::MemoryTransport.new
361
357
  end
362
358
 
363
- def self.process_api_requests(wrapper)
364
- header = wrapper._sm_header
365
- payload = wrapper._sm_payload
359
+ def process_api_requests(message)
360
+ header = message._sm_header
361
+ payload = message
366
362
  data = JSON.parse(payload)
367
363
  puts " 🌐 API SERVICE received request:"
368
364
  puts " Request ID: #{data['request_id']}"
@@ -371,9 +367,9 @@ class ServiceRequest < SmartMessage::Base
371
367
  puts " Reply To: #{header.reply_to}"
372
368
  end
373
369
 
374
- def self.process_data_requests(wrapper)
375
- header = wrapper._sm_header
376
- payload = wrapper._sm_payload
370
+ def process_data_requests(message)
371
+ header = message._sm_header
372
+ payload = message
377
373
  data = JSON.parse(payload)
378
374
  puts " 💾 DATA SERVICE received request:"
379
375
  puts " Request ID: #{data['request_id']}"
@@ -30,8 +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)
34
- serializer SmartMessage::Serializer::Json.new
33
+ transport SmartMessage::Transport::MemoryTransport.new
35
34
  end
36
35
  end
37
36
 
@@ -43,9 +42,9 @@ class PaymentMessage < MicroserviceMessage
43
42
  property :amount, required: true
44
43
  property :currency, default: 'USD'
45
44
 
46
- def self.process(wrapper)
47
- header = wrapper._sm_header
48
- payload = wrapper._sm_payload
45
+ def process(message)
46
+ header = message._sm_header
47
+ payload = message
49
48
  msg_data = JSON.parse(payload)
50
49
  puts "💳 PaymentMessage processed by #{self.name}"
51
50
  puts " From: #{header.from} → To: #{header.to}"
@@ -62,9 +61,9 @@ class OrderMessage < MicroserviceMessage
62
61
  property :customer_id, required: true
63
62
  property :status, default: 'pending'
64
63
 
65
- def self.process(wrapper)
66
- header = wrapper._sm_header
67
- payload = wrapper._sm_payload
64
+ def process(message)
65
+ header = message._sm_header
66
+ payload = message
68
67
  msg_data = JSON.parse(payload)
69
68
  puts "📦 OrderMessage processed by #{self.name}"
70
69
  puts " From: #{header.from} → To: #{header.to}"
@@ -81,9 +80,9 @@ class AlertMessage < MicroserviceMessage
81
80
  property :component, required: true
82
81
  property :description, required: true
83
82
 
84
- def self.process(wrapper)
85
- header = wrapper._sm_header
86
- payload = wrapper._sm_payload
83
+ def process(message)
84
+ header = message._sm_header
85
+ payload = message
87
86
  msg_data = JSON.parse(payload)
88
87
  puts "🚨 AlertMessage processed by #{self.name}"
89
88
  puts " From: #{header.from} → To: #{header.to}"
@@ -32,7 +32,6 @@ class DirectMethodMessage < SmartMessage::Base
32
32
 
33
33
  config do
34
34
  transport SmartMessage::Transport.create(:stdout)
35
- serializer SmartMessage::Serializer::Json.new
36
35
  end
37
36
  end
38
37
 
@@ -63,7 +62,6 @@ class HeaderBlockMessage < SmartMessage::Base
63
62
 
64
63
  config do
65
64
  transport SmartMessage::Transport.create(:stdout)
66
- serializer SmartMessage::Serializer::Json.new
67
65
  end
68
66
  end
69
67
 
@@ -96,7 +94,6 @@ class MixedConfigMessage < SmartMessage::Base
96
94
 
97
95
  config do
98
96
  transport SmartMessage::Transport.create(:stdout)
99
- serializer SmartMessage::Serializer::Json.new
100
97
  end
101
98
  end
102
99
 
@@ -127,7 +124,6 @@ class FlexibleMessage < SmartMessage::Base
127
124
 
128
125
  config do
129
126
  transport SmartMessage::Transport.create(:stdout)
130
- serializer SmartMessage::Serializer::Json.new
131
127
  end
132
128
  end
133
129
 
@@ -234,7 +230,6 @@ class CheckableMessage < SmartMessage::Base
234
230
 
235
231
  config do
236
232
  transport SmartMessage::Transport.create(:stdout)
237
- serializer SmartMessage::Serializer::Json.new
238
233
  end
239
234
  end
240
235
 
@@ -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
@@ -62,12 +62,11 @@ class NotificationMessage < SmartMessage::Base
62
62
  # Explicitly use global configuration for demonstration
63
63
  config do
64
64
  transport SmartMessage::Transport.default
65
- serializer SmartMessage::Serializer.default
66
65
  logger SmartMessage::Logger.default
67
66
  end
68
67
 
69
- def self.process(wrapper)
70
- message_header, message_payload = wrapper.split
68
+ def process(message)
69
+ message_header, message_payload = message
71
70
  data = JSON.parse(message_payload)
72
71
 
73
72
  priority_emoji = case data['priority']
@@ -88,12 +87,11 @@ class OrderStatusMessage < SmartMessage::Base
88
87
  # Explicitly use global configuration for demonstration
89
88
  config do
90
89
  transport SmartMessage::Transport.default
91
- serializer SmartMessage::Serializer.default
92
90
  logger SmartMessage::Logger.default
93
91
  end
94
92
 
95
- def self.process(wrapper)
96
- message_header, message_payload = wrapper.split
93
+ def process(message)
94
+ message_header, message_payload = message
97
95
  data = JSON.parse(message_payload)
98
96
 
99
97
  status_emoji = case data['status']
@@ -154,8 +152,8 @@ class SpecialMessage < SmartMessage::Base
154
152
  # transport and serializer still use global configuration
155
153
  end
156
154
 
157
- def self.process(wrapper)
158
- message_header, message_payload = wrapper.split
155
+ def process(message)
156
+ message_header, message_payload = message
159
157
  data = JSON.parse(message_payload)
160
158
  puts "⭐ Special processing: #{data['content']}"
161
159
  end
@@ -273,7 +273,6 @@ class DemoMessage < SmartMessage::Base
273
273
 
274
274
  config do
275
275
  transport SmartMessage::Transport::StdoutTransport.new
276
- serializer SmartMessage::Serializer::Json.new
277
276
  from 'demo-logger-app'
278
277
  end
279
278
 
@@ -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,15 +41,15 @@ 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
- - JSON serialization of complex order data
47
+ - Automatic serialization of complex order data by transport
39
48
  - Bidirectional communication flow
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,15 +137,15 @@ 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
124
- - Global transport and serializer settings
125
- - Configuration inheritance
140
+ **Transport:** MemoryTransport
141
+ - Global transport settings
142
+ - Configuration inheritance (serialization handled by transport)
126
143
  - Default settings management
127
144
  - Application-wide configuration patterns
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