smart_message 0.0.8 → 0.0.10

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 (87) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.irbrc +24 -0
  4. data/CHANGELOG.md +119 -0
  5. data/Gemfile.lock +6 -1
  6. data/README.md +389 -17
  7. data/docs/README.md +3 -1
  8. data/docs/addressing.md +119 -13
  9. data/docs/architecture.md +184 -46
  10. data/docs/dead_letter_queue.md +673 -0
  11. data/docs/dispatcher.md +87 -0
  12. data/docs/examples.md +59 -1
  13. data/docs/getting-started.md +8 -1
  14. data/docs/logging.md +382 -326
  15. data/docs/message_deduplication.md +488 -0
  16. data/docs/message_filtering.md +451 -0
  17. data/examples/01_point_to_point_orders.rb +54 -53
  18. data/examples/02_publish_subscribe_events.rb +14 -10
  19. data/examples/03_many_to_many_chat.rb +16 -8
  20. data/examples/04_redis_smart_home_iot.rb +20 -10
  21. data/examples/05_proc_handlers.rb +12 -11
  22. data/examples/06_custom_logger_example.rb +95 -100
  23. data/examples/07_error_handling_scenarios.rb +4 -2
  24. data/examples/08_entity_addressing_basic.rb +18 -6
  25. data/examples/08_entity_addressing_with_filtering.rb +27 -9
  26. data/examples/09_dead_letter_queue_demo.rb +559 -0
  27. data/examples/09_regex_filtering_microservices.rb +407 -0
  28. data/examples/10_header_block_configuration.rb +263 -0
  29. data/examples/10_message_deduplication.rb +209 -0
  30. data/examples/11_global_configuration_example.rb +219 -0
  31. data/examples/README.md +102 -0
  32. data/examples/dead_letters.jsonl +12 -0
  33. data/examples/performance_metrics/benchmark_results_ractor_20250818_205603.json +135 -0
  34. data/examples/performance_metrics/benchmark_results_ractor_20250818_205831.json +135 -0
  35. data/examples/performance_metrics/benchmark_results_test_20250818_204942.json +130 -0
  36. data/examples/performance_metrics/benchmark_results_threadpool_20250818_204942.json +130 -0
  37. data/examples/performance_metrics/benchmark_results_threadpool_20250818_204959.json +130 -0
  38. data/examples/performance_metrics/benchmark_results_threadpool_20250818_205044.json +130 -0
  39. data/examples/performance_metrics/benchmark_results_threadpool_20250818_205109.json +130 -0
  40. data/examples/performance_metrics/benchmark_results_threadpool_20250818_205252.json +130 -0
  41. data/examples/performance_metrics/benchmark_results_unknown_20250819_172852.json +130 -0
  42. data/examples/performance_metrics/compare_benchmarks.rb +519 -0
  43. data/examples/performance_metrics/dead_letters.jsonl +3100 -0
  44. data/examples/performance_metrics/performance_benchmark.rb +344 -0
  45. data/examples/show_logger.rb +367 -0
  46. data/examples/show_me.rb +145 -0
  47. data/examples/temp.txt +94 -0
  48. data/examples/tmux_chat/bot_agent.rb +4 -2
  49. data/examples/tmux_chat/human_agent.rb +4 -2
  50. data/examples/tmux_chat/room_monitor.rb +4 -2
  51. data/examples/tmux_chat/shared_chat_system.rb +6 -3
  52. data/lib/smart_message/addressing.rb +259 -0
  53. data/lib/smart_message/base.rb +123 -599
  54. data/lib/smart_message/circuit_breaker.rb +2 -1
  55. data/lib/smart_message/configuration.rb +199 -0
  56. data/lib/smart_message/ddq/base.rb +71 -0
  57. data/lib/smart_message/ddq/memory.rb +109 -0
  58. data/lib/smart_message/ddq/redis.rb +168 -0
  59. data/lib/smart_message/ddq.rb +31 -0
  60. data/lib/smart_message/dead_letter_queue.rb +27 -10
  61. data/lib/smart_message/deduplication.rb +174 -0
  62. data/lib/smart_message/dispatcher.rb +259 -61
  63. data/lib/smart_message/header.rb +5 -0
  64. data/lib/smart_message/logger/base.rb +21 -1
  65. data/lib/smart_message/logger/default.rb +88 -138
  66. data/lib/smart_message/logger/lumberjack.rb +324 -0
  67. data/lib/smart_message/logger/null.rb +81 -0
  68. data/lib/smart_message/logger.rb +17 -9
  69. data/lib/smart_message/messaging.rb +100 -0
  70. data/lib/smart_message/plugins.rb +132 -0
  71. data/lib/smart_message/serializer/base.rb +25 -8
  72. data/lib/smart_message/serializer/json.rb +5 -4
  73. data/lib/smart_message/subscription.rb +196 -0
  74. data/lib/smart_message/transport/base.rb +72 -41
  75. data/lib/smart_message/transport/memory_transport.rb +7 -5
  76. data/lib/smart_message/transport/redis_transport.rb +15 -45
  77. data/lib/smart_message/transport/stdout_transport.rb +18 -8
  78. data/lib/smart_message/transport.rb +1 -34
  79. data/lib/smart_message/utilities.rb +142 -0
  80. data/lib/smart_message/version.rb +1 -1
  81. data/lib/smart_message/versioning.rb +85 -0
  82. data/lib/smart_message/wrapper.rb.bak +132 -0
  83. data/lib/smart_message.rb +74 -28
  84. data/smart_message.gemspec +3 -0
  85. metadata +83 -3
  86. data/lib/smart_message/serializer.rb +0 -10
  87. data/lib/smart_message/wrapper.rb +0 -43
@@ -62,7 +62,8 @@ class SmartMessage::Logger::FileLogger < SmartMessage::Logger::Base
62
62
  @log_file_path = log_file_path
63
63
 
64
64
  # Ensure log directory exists
65
- FileUtils.mkdir_p(File.dirname(@log_file_path))
65
+ log_dir = File.dirname(@log_file_path)
66
+ FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
66
67
 
67
68
  # This is Ruby's standard Logger class from the 'logger' library
68
69
  # You could replace this with Rails.logger or any other logger:
@@ -76,24 +77,25 @@ class SmartMessage::Logger::FileLogger < SmartMessage::Logger::Base
76
77
  end
77
78
  end
78
79
 
79
- def log_message_created(message)
80
- @logger.info("MESSAGE_CREATED: #{message.class.name} - #{message.to_h}")
80
+ # Standard logging methods
81
+ def debug(message = nil, &block)
82
+ @logger.debug(message || block.call)
81
83
  end
82
84
 
83
- def log_message_published(message, transport)
84
- @logger.info("MESSAGE_PUBLISHED: #{message.class.name} via #{transport.class.name}")
85
+ def info(message = nil, &block)
86
+ @logger.info(message || block.call)
85
87
  end
86
88
 
87
- def log_message_received(message_class, payload)
88
- @logger.info("MESSAGE_RECEIVED: #{message_class.name} - #{payload}")
89
+ def warn(message = nil, &block)
90
+ @logger.warn(message || block.call)
89
91
  end
90
92
 
91
- def log_message_processed(message_class, result)
92
- @logger.info("MESSAGE_PROCESSED: #{message_class.name} - Result: #{result}")
93
+ def error(message = nil, &block)
94
+ @logger.error(message || block.call)
93
95
  end
94
96
 
95
- def log_error(message, error)
96
- @logger.error("MESSAGE_ERROR: #{message} - #{error.class.name}: #{error.message}")
97
+ def fatal(message = nil, &block)
98
+ @logger.fatal(message || block.call)
97
99
  end
98
100
  end
99
101
 
@@ -105,54 +107,47 @@ class SmartMessage::Logger::JSONLogger < SmartMessage::Logger::Base
105
107
  @log_file_path = log_file_path
106
108
 
107
109
  # Ensure log directory exists
108
- FileUtils.mkdir_p(File.dirname(@log_file_path))
110
+ log_dir = File.dirname(@log_file_path)
111
+ FileUtils.mkdir_p(log_dir) unless Dir.exist?(log_dir)
109
112
  end
110
113
 
111
- def log_message_created(message)
114
+ # Standard logging methods with JSON output
115
+ def debug(message = nil, &block)
112
116
  write_log_entry({
113
- event: 'message_created',
114
- message_class: message.class.name,
115
- message_id: message._sm_header&.message_id,
116
- timestamp: Time.now.iso8601,
117
- data: message.to_h
117
+ level: 'DEBUG',
118
+ message: message || block&.call,
119
+ timestamp: Time.now.iso8601
118
120
  })
119
121
  end
120
122
 
121
- def log_message_published(message, transport)
123
+ def info(message = nil, &block)
122
124
  write_log_entry({
123
- event: 'message_published',
124
- message_class: message.class.name,
125
- message_id: message._sm_header&.message_id,
126
- transport: transport.class.name,
125
+ level: 'INFO',
126
+ message: message || block&.call,
127
127
  timestamp: Time.now.iso8601
128
128
  })
129
129
  end
130
130
 
131
- def log_message_received(message_class, payload)
131
+ def warn(message = nil, &block)
132
132
  write_log_entry({
133
- event: 'message_received',
134
- message_class: message_class.name,
135
- payload_size: payload.length,
133
+ level: 'WARN',
134
+ message: message || block&.call,
136
135
  timestamp: Time.now.iso8601
137
136
  })
138
137
  end
139
138
 
140
- def log_message_processed(message_class, result)
139
+ def error(message = nil, &block)
141
140
  write_log_entry({
142
- event: 'message_processed',
143
- message_class: message_class.name,
144
- result: result.to_s,
141
+ level: 'ERROR',
142
+ message: message || block&.call,
145
143
  timestamp: Time.now.iso8601
146
144
  })
147
145
  end
148
146
 
149
- def log_error(message, error)
147
+ def fatal(message = nil, &block)
150
148
  write_log_entry({
151
- event: 'error',
152
- message: message.to_s,
153
- error_class: error.class.name,
154
- error_message: error.message,
155
- backtrace: error.backtrace&.first(5),
149
+ level: 'FATAL',
150
+ message: message || block&.call,
156
151
  timestamp: Time.now.iso8601
157
152
  })
158
153
  end
@@ -168,24 +163,24 @@ end
168
163
 
169
164
  # Console Logger with Emoji Implementation
170
165
  class SmartMessage::Logger::EmojiConsoleLogger < SmartMessage::Logger::Base
171
- def log_message_created(message)
172
- puts "🏗️ Created: #{message.class.name} with data: #{message.to_h}"
166
+ def debug(message = nil, &block)
167
+ puts "🐛 DEBUG: #{message || block&.call}"
173
168
  end
174
169
 
175
- def log_message_published(message, transport)
176
- puts "📤 Published: #{message.class.name} via #{transport.class.name}"
170
+ def info(message = nil, &block)
171
+ puts "ℹ️ INFO: #{message || block&.call}"
177
172
  end
178
173
 
179
- def log_message_received(message_class, payload)
180
- puts "📥 Received: #{message_class.name} (#{payload.length} bytes)"
174
+ def warn(message = nil, &block)
175
+ puts "⚠️ WARN: #{message || block&.call}"
181
176
  end
182
177
 
183
- def log_message_processed(message_class, result)
184
- puts "⚙️ Processed: #{message_class.name} #{result}"
178
+ def error(message = nil, &block)
179
+ puts "❌ ERROR: #{message || block&.call}"
185
180
  end
186
181
 
187
- def log_error(message, error)
188
- puts " Error: #{message} #{error.class.name}: #{error.message}"
182
+ def fatal(message = nil, &block)
183
+ puts "💀 FATAL: #{message || block&.call}"
189
184
  end
190
185
  end
191
186
 
@@ -198,60 +193,58 @@ class SmartMessage::Logger::RubyLoggerWrapper < SmartMessage::Logger::Base
198
193
  @logger = ruby_logger || Logger.new(STDOUT)
199
194
  end
200
195
 
201
- def log_message_created(message)
202
- @logger.debug { "SmartMessage created: #{message.class.name} ID: #{message._sm_header&.message_id}" }
196
+ # Standard logging methods that delegate to the Ruby logger
197
+ def debug(message = nil, &block)
198
+ @logger.debug(message, &block)
203
199
  end
204
200
 
205
- def log_message_published(message, transport)
206
- @logger.info { "SmartMessage published: #{message.class.name} via #{transport.class.name}" }
201
+ def info(message = nil, &block)
202
+ @logger.info(message, &block)
207
203
  end
208
204
 
209
- def log_message_received(message_class, payload)
210
- @logger.info { "SmartMessage received: #{message_class.name}" }
205
+ def warn(message = nil, &block)
206
+ @logger.warn(message, &block)
211
207
  end
212
208
 
213
- def log_message_processed(message_class, result)
214
- @logger.info { "SmartMessage processed: #{message_class.name}" }
209
+ def error(message = nil, &block)
210
+ @logger.error(message, &block)
215
211
  end
216
212
 
217
- def log_error(message, error)
218
- @logger.error { "SmartMessage error: #{message} - #{error.message}" }
219
- @logger.debug { error.backtrace.join("\n") }
213
+ def fatal(message = nil, &block)
214
+ @logger.fatal(message, &block)
220
215
  end
221
216
  end
222
217
 
223
218
  # Example: Rails Logger Wrapper (for Rails applications)
224
219
  # Uncomment and use this in your Rails application
225
220
  # class SmartMessage::Logger::RailsLogger < SmartMessage::Logger::Base
226
- # def log_message_created(message)
227
- # Rails.logger.tagged('SmartMessage', message.class.name) do
228
- # Rails.logger.info "Message created with ID: #{message._sm_header&.message_id}"
221
+ # def debug(message = nil, &block)
222
+ # Rails.logger.tagged('SmartMessage') do
223
+ # Rails.logger.debug(message || block&.call)
229
224
  # end
230
225
  # end
231
226
  #
232
- # def log_message_published(message, transport)
233
- # Rails.logger.tagged('SmartMessage', message.class.name) do
234
- # Rails.logger.info "Message published via #{transport.class.name}"
227
+ # def info(message = nil, &block)
228
+ # Rails.logger.tagged('SmartMessage') do
229
+ # Rails.logger.info(message || block&.call)
235
230
  # end
236
231
  # end
237
232
  #
238
- # def log_message_received(message_class, payload)
239
- # Rails.logger.tagged('SmartMessage', message_class.name) do
240
- # Rails.logger.info "Message received (#{payload.length} bytes)"
233
+ # def warn(message = nil, &block)
234
+ # Rails.logger.tagged('SmartMessage') do
235
+ # Rails.logger.warn(message || block&.call)
241
236
  # end
242
237
  # end
243
238
  #
244
- # def log_message_processed(message_class, result)
245
- # Rails.logger.tagged('SmartMessage', message_class.name) do
246
- # Rails.logger.info "Message processed successfully"
239
+ # def error(message = nil, &block)
240
+ # Rails.logger.tagged('SmartMessage') do
241
+ # Rails.logger.error(message || block&.call)
247
242
  # end
248
243
  # end
249
244
  #
250
- # def log_error(message, error)
245
+ # def fatal(message = nil, &block)
251
246
  # Rails.logger.tagged('SmartMessage') do
252
- # Rails.logger.error "Error: #{message}"
253
- # Rails.logger.error "#{error.class.name}: #{error.message}"
254
- # Rails.logger.debug error.backtrace.join("\n")
247
+ # Rails.logger.fatal(message || block&.call)
255
248
  # end
256
249
  # end
257
250
  # end
@@ -262,24 +255,24 @@ class SmartMessage::Logger::MultiLogger < SmartMessage::Logger::Base
262
255
  @loggers = loggers
263
256
  end
264
257
 
265
- def log_message_created(message)
266
- @loggers.each { |logger| logger.log_message_created(message) }
258
+ def debug(message = nil, &block)
259
+ @loggers.each { |logger| logger.debug(message, &block) }
267
260
  end
268
261
 
269
- def log_message_published(message, transport)
270
- @loggers.each { |logger| logger.log_message_published(message, transport) }
262
+ def info(message = nil, &block)
263
+ @loggers.each { |logger| logger.info(message, &block) }
271
264
  end
272
265
 
273
- def log_message_received(message_class, payload)
274
- @loggers.each { |logger| logger.log_message_received(message_class, payload) }
266
+ def warn(message = nil, &block)
267
+ @loggers.each { |logger| logger.warn(message, &block) }
275
268
  end
276
269
 
277
- def log_message_processed(message_class, result)
278
- @loggers.each { |logger| logger.log_message_processed(message_class, result) }
270
+ def error(message = nil, &block)
271
+ @loggers.each { |logger| logger.error(message, &block) }
279
272
  end
280
273
 
281
- def log_error(message, error)
282
- @loggers.each { |logger| logger.log_error(message, error) }
274
+ def fatal(message = nil, &block)
275
+ @loggers.each { |logger| logger.fatal(message, &block) }
283
276
  end
284
277
  end
285
278
 
@@ -310,10 +303,11 @@ class OrderProcessingMessage < SmartMessage::Base
310
303
  )
311
304
  end
312
305
 
313
- def self.process(message_header, message_payload)
306
+ def self.process(wrapper)
307
+ message_header, message_payload = wrapper.split
314
308
  # Simulate the logger being called during processing
315
309
  if logger
316
- logger.log_message_received(self, message_payload)
310
+ logger.info { "[SmartMessage] Received: #{self.name} (#{message_payload.bytesize} bytes)" }
317
311
  end
318
312
 
319
313
  # Process the message
@@ -324,7 +318,7 @@ class OrderProcessingMessage < SmartMessage::Base
324
318
 
325
319
  # Log processing completion
326
320
  if logger
327
- logger.log_message_processed(self, result)
321
+ logger.info { "[SmartMessage] Processed: #{self.name} - #{result}" }
328
322
  end
329
323
 
330
324
  result
@@ -333,15 +327,15 @@ class OrderProcessingMessage < SmartMessage::Base
333
327
  # Override publish to demonstrate logging hooks
334
328
  def publish
335
329
  # Log message creation
336
- logger_instance = logger || self.class.logger
330
+ logger_instance = self.class.logger || SmartMessage::Logger.default
337
331
  if logger_instance
338
- logger_instance.log_message_created(self)
332
+ logger_instance.debug { "[SmartMessage] Created: #{self.class.name}" }
339
333
  end
340
334
 
341
335
  # Log publishing
342
336
  transport_instance = transport || self.class.transport
343
337
  if logger_instance
344
- logger_instance.log_message_published(self, transport_instance)
338
+ logger_instance.info { "[SmartMessage] Published: #{self.class.name} via #{transport_instance.class.name.split('::').last}" }
345
339
  end
346
340
 
347
341
  # Call original publish method
@@ -349,7 +343,7 @@ class OrderProcessingMessage < SmartMessage::Base
349
343
  rescue => error
350
344
  # Log any errors during publishing
351
345
  if logger_instance
352
- logger_instance.log_error("Failed to publish #{self.class.name}", error)
346
+ logger_instance.error { "[SmartMessage] Error: Failed to publish #{self.class.name} - #{error.class.name}: #{error.message}" }
353
347
  end
354
348
  raise
355
349
  end
@@ -376,9 +370,10 @@ class NotificationMessage < SmartMessage::Base
376
370
  logger SmartMessage::Logger::FileLogger.new('logs/notifications.log', level: Logger::WARN)
377
371
  end
378
372
 
379
- def self.process(message_header, message_payload)
373
+ def self.process(wrapper)
374
+ message_header, message_payload = wrapper.split
380
375
  if logger
381
- logger.log_message_received(self, message_payload)
376
+ logger.info { "[SmartMessage] Received: #{self.name} (#{message_payload.bytesize} bytes)" }
382
377
  end
383
378
 
384
379
  notification_data = JSON.parse(message_payload)
@@ -387,7 +382,7 @@ class NotificationMessage < SmartMessage::Base
387
382
  puts "📬 Notification: #{result}"
388
383
 
389
384
  if logger
390
- logger.log_message_processed(self, result)
385
+ logger.info { "[SmartMessage] Processed: #{self.name} - #{result}" }
391
386
  end
392
387
 
393
388
  result
@@ -425,7 +420,8 @@ class StandardLoggerMessage < SmartMessage::Base
425
420
  # logger SmartMessage::Logger::RubyLoggerWrapper.new(Rails.logger)
426
421
  end
427
422
 
428
- def self.process(message_header, message_payload)
423
+ def self.process(wrapper)
424
+ message_header, message_payload = wrapper.split
429
425
  data = JSON.parse(message_payload)
430
426
  puts "📝 Processing: #{data['content']}"
431
427
  "Processed"
@@ -449,7 +445,8 @@ class DefaultLoggerMessage < SmartMessage::Base
449
445
  logger SmartMessage::Logger::Default.new
450
446
  end
451
447
 
452
- def self.process(message_header, message_payload)
448
+ def self.process(wrapper)
449
+ message_header, message_payload = wrapper.split
453
450
  data = JSON.parse(message_payload)
454
451
  puts "🎯 DefaultLogger: Processing #{data['message']}"
455
452
  "Processed with default logger"
@@ -584,10 +581,8 @@ class LoggerDemo
584
581
 
585
582
  # Simulate an error during processing
586
583
  if OrderProcessingMessage.logger
587
- OrderProcessingMessage.logger.log_error(
588
- "Simulated error for demo",
589
- StandardError.new("Invalid order data provided")
590
- )
584
+ error = StandardError.new("Invalid order data provided")
585
+ OrderProcessingMessage.logger.error { "[SmartMessage] Error: Simulated error for demo - #{error.class.name}: #{error.message}" }
591
586
  end
592
587
 
593
588
  rescue => error
@@ -53,7 +53,8 @@ class UserRegistrationMessage < SmartMessage::Base
53
53
  serializer SmartMessage::Serializer::JSON.new
54
54
  end
55
55
 
56
- def self.process(message_header, message_payload)
56
+ def self.process(wrapper)
57
+ message_header, message_payload = wrapper.split
57
58
  user_data = JSON.parse(message_payload)
58
59
  puts "✅ User registration processed: #{user_data['username']} (#{user_data['email']})"
59
60
  end
@@ -101,7 +102,8 @@ class UserRegistrationMessageV2 < SmartMessage::Base
101
102
  serializer SmartMessage::Serializer::JSON.new
102
103
  end
103
104
 
104
- def self.process(message_header, message_payload)
105
+ def self.process(wrapper)
106
+ message_header, message_payload = wrapper.split
105
107
  user_data = JSON.parse(message_payload)
106
108
  puts "✅ User registration V2 processed: #{user_data['username']} (#{user_data['email']}, #{user_data['phone_number']})"
107
109
  end
@@ -43,7 +43,9 @@ class OrderMessage < SmartMessage::Base
43
43
  serializer SmartMessage::Serializer::JSON.new
44
44
  end
45
45
 
46
- def self.process(header, payload)
46
+ def self.process(wrapper)
47
+ header = wrapper._sm_header
48
+ payload = wrapper._sm_payload
47
49
  data = JSON.parse(payload)
48
50
  puts " 🎯 FULFILLMENT SERVICE received order:"
49
51
  puts " Order ID: #{data['order_id']}"
@@ -94,7 +96,9 @@ class SystemAnnouncementMessage < SmartMessage::Base
94
96
  serializer SmartMessage::Serializer::JSON.new
95
97
  end
96
98
 
97
- def self.process(header, payload)
99
+ def self.process(wrapper)
100
+ header = wrapper._sm_header
101
+ payload = wrapper._sm_payload
98
102
  data = JSON.parse(payload)
99
103
  priority_icon = data['priority'] == 'high' ? '🚨' : '📢'
100
104
  puts " #{priority_icon} ALL SERVICES received announcement:"
@@ -144,7 +148,9 @@ class UserLookupRequest < SmartMessage::Base
144
148
  serializer SmartMessage::Serializer::JSON.new
145
149
  end
146
150
 
147
- def self.process(header, payload)
151
+ def self.process(wrapper)
152
+ header = wrapper._sm_header
153
+ payload = wrapper._sm_payload
148
154
  data = JSON.parse(payload)
149
155
  puts " 🔍 USER SERVICE received lookup request:"
150
156
  puts " Request ID: #{data['request_id']}"
@@ -176,7 +182,9 @@ class UserLookupResponse < SmartMessage::Base
176
182
  serializer SmartMessage::Serializer::JSON.new
177
183
  end
178
184
 
179
- def self.process(header, payload)
185
+ def self.process(wrapper)
186
+ header = wrapper._sm_header
187
+ payload = wrapper._sm_payload
180
188
  data = JSON.parse(payload)
181
189
  puts " ✅ WEB SERVICE received lookup response:"
182
190
  puts " Request ID: #{data['request_id']}"
@@ -246,7 +254,9 @@ class PaymentMessage < SmartMessage::Base
246
254
  serializer SmartMessage::Serializer::JSON.new
247
255
  end
248
256
 
249
- def self.process(header, payload)
257
+ def self.process(wrapper)
258
+ header = wrapper._sm_header
259
+ payload = wrapper._sm_payload
250
260
  data = JSON.parse(payload)
251
261
  gateway_icon = header.to.include?('backup') ? '🔄' : '🏦'
252
262
  puts " #{gateway_icon} #{header.to.upcase} received payment:"
@@ -319,7 +329,9 @@ class ExternalAPIMessage < SmartMessage::Base
319
329
  serializer SmartMessage::Serializer::JSON.new
320
330
  end
321
331
 
322
- def self.process(header, payload)
332
+ def self.process(wrapper)
333
+ header = wrapper._sm_header
334
+ payload = wrapper._sm_payload
323
335
  data = JSON.parse(payload)
324
336
  puts " 🌐 EXTERNAL PARTNER received API call:"
325
337
  puts " API Call: #{data['api_call']}"
@@ -41,7 +41,9 @@ class ServiceMessage < SmartMessage::Base
41
41
  end
42
42
 
43
43
  # Different handlers for different subscription filters
44
- def self.process_broadcast(header, payload)
44
+ def self.process_broadcast(wrapper)
45
+ header = wrapper._sm_header
46
+ payload = wrapper._sm_payload
45
47
  data = JSON.parse(payload)
46
48
  puts " 📻 BROADCAST HANDLER received:"
47
49
  puts " Type: #{data['message_type']}"
@@ -49,7 +51,9 @@ class ServiceMessage < SmartMessage::Base
49
51
  puts " Data: #{data['data']}"
50
52
  end
51
53
 
52
- def self.process_directed(header, payload)
54
+ def self.process_directed(wrapper)
55
+ header = wrapper._sm_header
56
+ payload = wrapper._sm_payload
53
57
  data = JSON.parse(payload)
54
58
  puts " 🎯 DIRECTED HANDLER received:"
55
59
  puts " Type: #{data['message_type']}"
@@ -57,7 +61,9 @@ class ServiceMessage < SmartMessage::Base
57
61
  puts " Data: #{data['data']}"
58
62
  end
59
63
 
60
- def self.process_from_admin(header, payload)
64
+ def self.process_from_admin(wrapper)
65
+ header = wrapper._sm_header
66
+ payload = wrapper._sm_payload
61
67
  data = JSON.parse(payload)
62
68
  puts " 👮 ADMIN HANDLER received:"
63
69
  puts " Type: #{data['message_type']}"
@@ -151,7 +157,9 @@ class AlertMessage < SmartMessage::Base
151
157
  serializer SmartMessage::Serializer::JSON.new
152
158
  end
153
159
 
154
- def self.process_critical_or_broadcast(header, payload)
160
+ def self.process_critical_or_broadcast(wrapper)
161
+ header = wrapper._sm_header
162
+ payload = wrapper._sm_payload
155
163
  data = JSON.parse(payload)
156
164
  icon = data['severity'] == 'critical' ? '🚨' : '📢'
157
165
  puts " #{icon} ALERT MONITOR received:"
@@ -160,7 +168,9 @@ class AlertMessage < SmartMessage::Base
160
168
  puts " Alert: #{data['alert_text']}"
161
169
  end
162
170
 
163
- def self.process_from_monitoring(header, payload)
171
+ def self.process_from_monitoring(wrapper)
172
+ header = wrapper._sm_header
173
+ payload = wrapper._sm_payload
164
174
  data = JSON.parse(payload)
165
175
  puts " 📊 MONITORING TEAM received:"
166
176
  puts " From: #{header.from} (monitoring system)"
@@ -255,7 +265,9 @@ class OrderMessage < SmartMessage::Base
255
265
  serializer SmartMessage::Serializer::JSON.new
256
266
  end
257
267
 
258
- def self.process_high_priority(header, payload)
268
+ def self.process_high_priority(wrapper)
269
+ header = wrapper._sm_header
270
+ payload = wrapper._sm_payload
259
271
  data = JSON.parse(payload)
260
272
  puts " 🚀 HIGH PRIORITY ORDER HANDLER:"
261
273
  puts " Order ID: #{data['order_id']} (PRIORITY: #{data['priority'].upcase})"
@@ -263,7 +275,9 @@ class OrderMessage < SmartMessage::Base
263
275
  puts " Total: $#{data['total_amount']}"
264
276
  end
265
277
 
266
- def self.process_normal(header, payload)
278
+ def self.process_normal(wrapper)
279
+ header = wrapper._sm_header
280
+ payload = wrapper._sm_payload
267
281
  data = JSON.parse(payload)
268
282
  puts " 📦 NORMAL ORDER HANDLER:"
269
283
  puts " Order ID: #{data['order_id']}"
@@ -346,7 +360,9 @@ class ServiceRequest < SmartMessage::Base
346
360
  serializer SmartMessage::Serializer::JSON.new
347
361
  end
348
362
 
349
- def self.process_api_requests(header, payload)
363
+ def self.process_api_requests(wrapper)
364
+ header = wrapper._sm_header
365
+ payload = wrapper._sm_payload
350
366
  data = JSON.parse(payload)
351
367
  puts " 🌐 API SERVICE received request:"
352
368
  puts " Request ID: #{data['request_id']}"
@@ -355,7 +371,9 @@ class ServiceRequest < SmartMessage::Base
355
371
  puts " Reply To: #{header.reply_to}"
356
372
  end
357
373
 
358
- def self.process_data_requests(header, payload)
374
+ def self.process_data_requests(wrapper)
375
+ header = wrapper._sm_header
376
+ payload = wrapper._sm_payload
359
377
  data = JSON.parse(payload)
360
378
  puts " 💾 DATA SERVICE received request:"
361
379
  puts " Request ID: #{data['request_id']}"