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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.irbrc +24 -0
- data/CHANGELOG.md +119 -0
- data/Gemfile.lock +6 -1
- data/README.md +389 -17
- data/docs/README.md +3 -1
- data/docs/addressing.md +119 -13
- data/docs/architecture.md +184 -46
- data/docs/dead_letter_queue.md +673 -0
- data/docs/dispatcher.md +87 -0
- data/docs/examples.md +59 -1
- data/docs/getting-started.md +8 -1
- data/docs/logging.md +382 -326
- data/docs/message_deduplication.md +488 -0
- data/docs/message_filtering.md +451 -0
- data/examples/01_point_to_point_orders.rb +54 -53
- data/examples/02_publish_subscribe_events.rb +14 -10
- data/examples/03_many_to_many_chat.rb +16 -8
- data/examples/04_redis_smart_home_iot.rb +20 -10
- data/examples/05_proc_handlers.rb +12 -11
- data/examples/06_custom_logger_example.rb +95 -100
- data/examples/07_error_handling_scenarios.rb +4 -2
- data/examples/08_entity_addressing_basic.rb +18 -6
- data/examples/08_entity_addressing_with_filtering.rb +27 -9
- data/examples/09_dead_letter_queue_demo.rb +559 -0
- data/examples/09_regex_filtering_microservices.rb +407 -0
- data/examples/10_header_block_configuration.rb +263 -0
- data/examples/10_message_deduplication.rb +209 -0
- data/examples/11_global_configuration_example.rb +219 -0
- data/examples/README.md +102 -0
- data/examples/dead_letters.jsonl +12 -0
- data/examples/performance_metrics/benchmark_results_ractor_20250818_205603.json +135 -0
- data/examples/performance_metrics/benchmark_results_ractor_20250818_205831.json +135 -0
- data/examples/performance_metrics/benchmark_results_test_20250818_204942.json +130 -0
- data/examples/performance_metrics/benchmark_results_threadpool_20250818_204942.json +130 -0
- data/examples/performance_metrics/benchmark_results_threadpool_20250818_204959.json +130 -0
- data/examples/performance_metrics/benchmark_results_threadpool_20250818_205044.json +130 -0
- data/examples/performance_metrics/benchmark_results_threadpool_20250818_205109.json +130 -0
- data/examples/performance_metrics/benchmark_results_threadpool_20250818_205252.json +130 -0
- data/examples/performance_metrics/benchmark_results_unknown_20250819_172852.json +130 -0
- data/examples/performance_metrics/compare_benchmarks.rb +519 -0
- data/examples/performance_metrics/dead_letters.jsonl +3100 -0
- data/examples/performance_metrics/performance_benchmark.rb +344 -0
- data/examples/show_logger.rb +367 -0
- data/examples/show_me.rb +145 -0
- data/examples/temp.txt +94 -0
- data/examples/tmux_chat/bot_agent.rb +4 -2
- data/examples/tmux_chat/human_agent.rb +4 -2
- data/examples/tmux_chat/room_monitor.rb +4 -2
- data/examples/tmux_chat/shared_chat_system.rb +6 -3
- data/lib/smart_message/addressing.rb +259 -0
- data/lib/smart_message/base.rb +123 -599
- data/lib/smart_message/circuit_breaker.rb +2 -1
- data/lib/smart_message/configuration.rb +199 -0
- data/lib/smart_message/ddq/base.rb +71 -0
- data/lib/smart_message/ddq/memory.rb +109 -0
- data/lib/smart_message/ddq/redis.rb +168 -0
- data/lib/smart_message/ddq.rb +31 -0
- data/lib/smart_message/dead_letter_queue.rb +27 -10
- data/lib/smart_message/deduplication.rb +174 -0
- data/lib/smart_message/dispatcher.rb +259 -61
- data/lib/smart_message/header.rb +5 -0
- data/lib/smart_message/logger/base.rb +21 -1
- data/lib/smart_message/logger/default.rb +88 -138
- data/lib/smart_message/logger/lumberjack.rb +324 -0
- data/lib/smart_message/logger/null.rb +81 -0
- data/lib/smart_message/logger.rb +17 -9
- data/lib/smart_message/messaging.rb +100 -0
- data/lib/smart_message/plugins.rb +132 -0
- data/lib/smart_message/serializer/base.rb +25 -8
- data/lib/smart_message/serializer/json.rb +5 -4
- data/lib/smart_message/subscription.rb +196 -0
- data/lib/smart_message/transport/base.rb +72 -41
- data/lib/smart_message/transport/memory_transport.rb +7 -5
- data/lib/smart_message/transport/redis_transport.rb +15 -45
- data/lib/smart_message/transport/stdout_transport.rb +18 -8
- data/lib/smart_message/transport.rb +1 -34
- data/lib/smart_message/utilities.rb +142 -0
- data/lib/smart_message/version.rb +1 -1
- data/lib/smart_message/versioning.rb +85 -0
- data/lib/smart_message/wrapper.rb.bak +132 -0
- data/lib/smart_message.rb +74 -28
- data/smart_message.gemspec +3 -0
- metadata +83 -3
- data/lib/smart_message/serializer.rb +0 -10
- data/lib/smart_message/wrapper.rb +0 -43
@@ -0,0 +1,132 @@
|
|
1
|
+
# lib/smart_message/wrapper.rb
|
2
|
+
# encoding: utf-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'securerandom' # STDLIB
|
6
|
+
require_relative './header.rb'
|
7
|
+
|
8
|
+
module SmartMessage
|
9
|
+
module Wrapper
|
10
|
+
# Every smart message has a common wrapper format that contains
|
11
|
+
# information used to support the dispatching of subscribed
|
12
|
+
# messages upon receipt from a transport as well as the serialized
|
13
|
+
# payload.
|
14
|
+
#
|
15
|
+
# The wrapper consolidates header and payload into a single object
|
16
|
+
# for cleaner method signatures throughout the SmartMessage dataflow.
|
17
|
+
class Base < Hashie::Dash
|
18
|
+
include Hashie::Extensions::IndifferentAccess
|
19
|
+
include Hashie::Extensions::MethodAccess
|
20
|
+
include Hashie::Extensions::DeepMerge
|
21
|
+
|
22
|
+
# Core wrapper properties
|
23
|
+
# Using '_sm_' prefix to avoid collision with user message definitions
|
24
|
+
property :_sm_header,
|
25
|
+
required: true,
|
26
|
+
description: "SmartMessage header containing routing and metadata information"
|
27
|
+
|
28
|
+
property :_sm_payload,
|
29
|
+
required: true,
|
30
|
+
description: "Serialized message payload containing the business data"
|
31
|
+
|
32
|
+
# Create wrapper from header and payload
|
33
|
+
def initialize(header: nil, payload: nil, **props, &block)
|
34
|
+
# Handle different initialization patterns
|
35
|
+
if header && payload
|
36
|
+
attributes = {
|
37
|
+
_sm_header: header,
|
38
|
+
_sm_payload: payload
|
39
|
+
}
|
40
|
+
else
|
41
|
+
# Create default header if not provided
|
42
|
+
default_header = SmartMessage::Header.new(
|
43
|
+
uuid: SecureRandom.uuid,
|
44
|
+
message_class: 'SmartMessage::Wrapper::Base',
|
45
|
+
published_at: Time.now,
|
46
|
+
publisher_pid: Process.pid,
|
47
|
+
version: 1
|
48
|
+
)
|
49
|
+
|
50
|
+
attributes = {
|
51
|
+
_sm_header: default_header,
|
52
|
+
_sm_payload: nil
|
53
|
+
}.merge(props)
|
54
|
+
end
|
55
|
+
|
56
|
+
super(attributes, &block)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Convenience accessors for header and payload
|
60
|
+
def header
|
61
|
+
_sm_header
|
62
|
+
end
|
63
|
+
|
64
|
+
def payload
|
65
|
+
_sm_payload
|
66
|
+
end
|
67
|
+
|
68
|
+
# Check if this is a broadcast message (to field is nil)
|
69
|
+
def broadcast?
|
70
|
+
_sm_header.to.nil?
|
71
|
+
end
|
72
|
+
|
73
|
+
# Check if this is a directed message (to field is present)
|
74
|
+
def directed?
|
75
|
+
!broadcast?
|
76
|
+
end
|
77
|
+
|
78
|
+
# Get message class from header
|
79
|
+
def message_class
|
80
|
+
_sm_header.message_class
|
81
|
+
end
|
82
|
+
|
83
|
+
# Get sender from header
|
84
|
+
def from
|
85
|
+
_sm_header.from
|
86
|
+
end
|
87
|
+
|
88
|
+
# Get recipient from header
|
89
|
+
def to
|
90
|
+
_sm_header.to
|
91
|
+
end
|
92
|
+
|
93
|
+
# Get reply destination from header
|
94
|
+
def reply_to
|
95
|
+
_sm_header.reply_to
|
96
|
+
end
|
97
|
+
|
98
|
+
# Get message version from header
|
99
|
+
def version
|
100
|
+
_sm_header.version
|
101
|
+
end
|
102
|
+
|
103
|
+
# Get UUID from header
|
104
|
+
def uuid
|
105
|
+
_sm_header.uuid
|
106
|
+
end
|
107
|
+
|
108
|
+
# Convert wrapper to hash for serialization/transport
|
109
|
+
def to_hash
|
110
|
+
{
|
111
|
+
'_sm_header' => _sm_header.to_hash,
|
112
|
+
'_sm_payload' => _sm_payload
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
alias_method :to_h, :to_hash
|
117
|
+
|
118
|
+
# Outer-level JSON serialization for the wrapper
|
119
|
+
# This is level 2 serialization - always JSON for routing/monitoring
|
120
|
+
def to_json(*args)
|
121
|
+
require 'json'
|
122
|
+
to_hash.to_json(*args)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Split wrapper into header and payload components
|
126
|
+
# Enables destructuring assignment: header, payload = wrapper.split
|
127
|
+
def split
|
128
|
+
[_sm_header, _sm_payload]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
data/lib/smart_message.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
# encoding: utf-8
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
|
+
require 'zeitwerk'
|
6
|
+
|
5
7
|
# FIXME: handle this better
|
6
8
|
class MilClass # IMO nil is the same as an empty String
|
7
9
|
def to_s
|
@@ -9,48 +11,92 @@ class MilClass # IMO nil is the same as an empty String
|
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
|
-
|
13
14
|
require 'active_support/core_ext/string/inflections'
|
14
15
|
require 'date' # STDLIB
|
15
|
-
|
16
|
-
# Production logging should use the logger framework, not debug_me
|
17
|
-
|
18
16
|
require 'hashie' # Your friendly neighborhood hash library.
|
19
17
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
require_relative './smart_message/dead_letter_queue'
|
18
|
+
# Set up Zeitwerk autoloader
|
19
|
+
loader = Zeitwerk::Loader.for_gem
|
20
|
+
loader.tag = "smart_message"
|
21
|
+
loader.ignore("#{__dir__}/simple_stats.rb")
|
22
|
+
loader.setup
|
26
23
|
|
27
|
-
|
28
|
-
require_relative './
|
29
|
-
require_relative './smart_message/base.rb'
|
24
|
+
# Load simple_stats manually since it's not following the naming convention
|
25
|
+
require_relative './simple_stats'
|
30
26
|
|
31
27
|
# SmartMessage abstracts messages from the backend transport process
|
32
28
|
module SmartMessage
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
29
|
+
class << self
|
30
|
+
# Global configuration for SmartMessage
|
31
|
+
#
|
32
|
+
# Usage:
|
33
|
+
# SmartMessage.configure do |config|
|
34
|
+
# config.logger = MyApp::Logger.new
|
35
|
+
# config.transport = MyApp::Transport.new
|
36
|
+
# config.serializer = MyApp::Serializer.new
|
37
|
+
# end
|
38
|
+
def configure
|
39
|
+
yield(configuration)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get the global configuration instance
|
43
|
+
def configuration
|
44
|
+
@configuration ||= Configuration.new
|
45
|
+
end
|
46
|
+
|
47
|
+
# Reset global configuration to defaults
|
48
|
+
def reset_configuration!
|
49
|
+
@configuration = Configuration.new
|
50
|
+
end
|
51
|
+
end
|
52
|
+
# Module definitions for Zeitwerk to populate
|
41
53
|
module Serializer
|
42
|
-
|
43
|
-
|
54
|
+
class << self
|
55
|
+
def default
|
56
|
+
# Check global configuration first, then fall back to framework default
|
57
|
+
SmartMessage.configuration.default_serializer
|
58
|
+
end
|
44
59
|
end
|
45
60
|
end
|
46
61
|
|
47
|
-
# encapsulates the message logging capability
|
48
62
|
module Logger
|
49
|
-
|
50
|
-
|
63
|
+
class << self
|
64
|
+
def default
|
65
|
+
# Check global configuration first, then fall back to framework default
|
66
|
+
SmartMessage.configuration.default_logger
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
module Transport
|
72
|
+
class << self
|
73
|
+
def default
|
74
|
+
# Check global configuration first, then fall back to framework default
|
75
|
+
SmartMessage.configuration.default_transport
|
76
|
+
end
|
77
|
+
|
78
|
+
def registry
|
79
|
+
@registry ||= Registry.new
|
80
|
+
end
|
81
|
+
|
82
|
+
def register(name, transport_class)
|
83
|
+
registry.register(name, transport_class)
|
84
|
+
end
|
85
|
+
|
86
|
+
def get(name)
|
87
|
+
registry.get(name)
|
88
|
+
end
|
89
|
+
|
90
|
+
def create(name, **options)
|
91
|
+
transport_class = get(name)
|
92
|
+
transport_class&.new(**options)
|
93
|
+
end
|
94
|
+
|
95
|
+
def available
|
96
|
+
registry.list
|
97
|
+
end
|
51
98
|
end
|
52
99
|
end
|
53
100
|
end # module SmartMessage
|
54
101
|
|
55
|
-
|
56
|
-
require_relative './smart_message/logger'
|
102
|
+
# Don't eager load initially - let Zeitwerk handle lazy loading
|
data/smart_message.gemspec
CHANGED
@@ -41,6 +41,9 @@ Gem::Specification.new do |spec|
|
|
41
41
|
spec.add_dependency 'concurrent-ruby'
|
42
42
|
spec.add_dependency 'redis'
|
43
43
|
spec.add_dependency 'breaker_machines'
|
44
|
+
spec.add_dependency 'zeitwerk'
|
45
|
+
spec.add_dependency 'lumberjack'
|
46
|
+
spec.add_dependency 'colorize'
|
44
47
|
|
45
48
|
spec.add_development_dependency 'bundler'
|
46
49
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smart_message
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dewayne VanHoozer
|
@@ -79,6 +79,48 @@ dependencies:
|
|
79
79
|
- - ">="
|
80
80
|
- !ruby/object:Gem::Version
|
81
81
|
version: '0'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: zeitwerk
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
type: :runtime
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: lumberjack
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: colorize
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
type: :runtime
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
82
124
|
- !ruby/object:Gem::Dependency
|
83
125
|
name: bundler
|
84
126
|
requirement: !ruby/object:Gem::Requirement
|
@@ -203,6 +245,7 @@ extra_rdoc_files: []
|
|
203
245
|
files:
|
204
246
|
- ".envrc"
|
205
247
|
- ".gitignore"
|
248
|
+
- ".irbrc"
|
206
249
|
- ".travis.yml"
|
207
250
|
- CHANGELOG.md
|
208
251
|
- COMMITS.md
|
@@ -215,11 +258,14 @@ files:
|
|
215
258
|
- docs/README.md
|
216
259
|
- docs/addressing.md
|
217
260
|
- docs/architecture.md
|
261
|
+
- docs/dead_letter_queue.md
|
218
262
|
- docs/dispatcher.md
|
219
263
|
- docs/examples.md
|
220
264
|
- docs/getting-started.md
|
221
265
|
- docs/ideas_to_think_about.md
|
222
266
|
- docs/logging.md
|
267
|
+
- docs/message_deduplication.md
|
268
|
+
- docs/message_filtering.md
|
223
269
|
- docs/message_processing.md
|
224
270
|
- docs/proc_handlers_summary.md
|
225
271
|
- docs/properties.md
|
@@ -236,8 +282,29 @@ files:
|
|
236
282
|
- examples/07_error_handling_scenarios.rb
|
237
283
|
- examples/08_entity_addressing_basic.rb
|
238
284
|
- examples/08_entity_addressing_with_filtering.rb
|
285
|
+
- examples/09_dead_letter_queue_demo.rb
|
286
|
+
- examples/09_regex_filtering_microservices.rb
|
287
|
+
- examples/10_header_block_configuration.rb
|
288
|
+
- examples/10_message_deduplication.rb
|
289
|
+
- examples/11_global_configuration_example.rb
|
239
290
|
- examples/README.md
|
291
|
+
- examples/dead_letters.jsonl
|
292
|
+
- examples/performance_metrics/benchmark_results_ractor_20250818_205603.json
|
293
|
+
- examples/performance_metrics/benchmark_results_ractor_20250818_205831.json
|
294
|
+
- examples/performance_metrics/benchmark_results_test_20250818_204942.json
|
295
|
+
- examples/performance_metrics/benchmark_results_threadpool_20250818_204942.json
|
296
|
+
- examples/performance_metrics/benchmark_results_threadpool_20250818_204959.json
|
297
|
+
- examples/performance_metrics/benchmark_results_threadpool_20250818_205044.json
|
298
|
+
- examples/performance_metrics/benchmark_results_threadpool_20250818_205109.json
|
299
|
+
- examples/performance_metrics/benchmark_results_threadpool_20250818_205252.json
|
300
|
+
- examples/performance_metrics/benchmark_results_unknown_20250819_172852.json
|
301
|
+
- examples/performance_metrics/compare_benchmarks.rb
|
302
|
+
- examples/performance_metrics/dead_letters.jsonl
|
303
|
+
- examples/performance_metrics/performance_benchmark.rb
|
304
|
+
- examples/show_logger.rb
|
305
|
+
- examples/show_me.rb
|
240
306
|
- examples/smart_home_iot_dataflow.md
|
307
|
+
- examples/temp.txt
|
241
308
|
- examples/tmux_chat/README.md
|
242
309
|
- examples/tmux_chat/bot_agent.rb
|
243
310
|
- examples/tmux_chat/human_agent.rb
|
@@ -247,9 +314,16 @@ files:
|
|
247
314
|
- examples/tmux_chat/stop_chat_demo.sh
|
248
315
|
- lib/simple_stats.rb
|
249
316
|
- lib/smart_message.rb
|
317
|
+
- lib/smart_message/addressing.rb
|
250
318
|
- lib/smart_message/base.rb
|
251
319
|
- lib/smart_message/circuit_breaker.rb
|
320
|
+
- lib/smart_message/configuration.rb
|
321
|
+
- lib/smart_message/ddq.rb
|
322
|
+
- lib/smart_message/ddq/base.rb
|
323
|
+
- lib/smart_message/ddq/memory.rb
|
324
|
+
- lib/smart_message/ddq/redis.rb
|
252
325
|
- lib/smart_message/dead_letter_queue.rb
|
326
|
+
- lib/smart_message/deduplication.rb
|
253
327
|
- lib/smart_message/dispatcher.rb
|
254
328
|
- lib/smart_message/dispatcher/.keep
|
255
329
|
- lib/smart_message/errors.rb
|
@@ -257,19 +331,25 @@ files:
|
|
257
331
|
- lib/smart_message/logger.rb
|
258
332
|
- lib/smart_message/logger/base.rb
|
259
333
|
- lib/smart_message/logger/default.rb
|
334
|
+
- lib/smart_message/logger/lumberjack.rb
|
335
|
+
- lib/smart_message/logger/null.rb
|
336
|
+
- lib/smart_message/messaging.rb
|
337
|
+
- lib/smart_message/plugins.rb
|
260
338
|
- lib/smart_message/property_descriptions.rb
|
261
339
|
- lib/smart_message/property_validations.rb
|
262
|
-
- lib/smart_message/serializer.rb
|
263
340
|
- lib/smart_message/serializer/base.rb
|
264
341
|
- lib/smart_message/serializer/json.rb
|
342
|
+
- lib/smart_message/subscription.rb
|
265
343
|
- lib/smart_message/transport.rb
|
266
344
|
- lib/smart_message/transport/base.rb
|
267
345
|
- lib/smart_message/transport/memory_transport.rb
|
268
346
|
- lib/smart_message/transport/redis_transport.rb
|
269
347
|
- lib/smart_message/transport/registry.rb
|
270
348
|
- lib/smart_message/transport/stdout_transport.rb
|
349
|
+
- lib/smart_message/utilities.rb
|
271
350
|
- lib/smart_message/version.rb
|
272
|
-
- lib/smart_message/
|
351
|
+
- lib/smart_message/versioning.rb
|
352
|
+
- lib/smart_message/wrapper.rb.bak
|
273
353
|
- smart_message.gemspec
|
274
354
|
homepage: https://github.com/MadBomber/smart_message
|
275
355
|
licenses: []
|
@@ -1,10 +0,0 @@
|
|
1
|
-
# lib/smart_message/serializer.rb
|
2
|
-
# encoding: utf-8
|
3
|
-
# frozen_string_literal: true
|
4
|
-
|
5
|
-
require_relative 'serializer/base'
|
6
|
-
require_relative 'serializer/json'
|
7
|
-
|
8
|
-
module SmartMessage::Serializer
|
9
|
-
# Serializer module for message encoding/decoding
|
10
|
-
end # module SmartMessage::Serializer
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# lib/smart_message/wrapper.rb
|
2
|
-
# encoding: utf-8
|
3
|
-
# frozen_string_literal: true
|
4
|
-
|
5
|
-
# TODO: consider having a serializer plugin for the wrapper that is
|
6
|
-
# different than that used for the payload.
|
7
|
-
|
8
|
-
require_relative './header.rb'
|
9
|
-
|
10
|
-
module SmartMessage
|
11
|
-
module Wrapper
|
12
|
-
# Every smart message has a common wrapper format that contains
|
13
|
-
# information used to support the dispatching of subscribed
|
14
|
-
# messages upon receipt from a transport as well as the serialized
|
15
|
-
# payload.
|
16
|
-
class Base < Hashie::Dash
|
17
|
-
include Hashie::Extensions::IndifferentAccess
|
18
|
-
include Hashie::Extensions::MergeInitializer
|
19
|
-
include Hashie::Extensions::MethodAccess
|
20
|
-
|
21
|
-
# Common attributes of the smart message standard header
|
22
|
-
# Using '_sm_' as a prefix to avoid potential collision with
|
23
|
-
# a user's message definition.
|
24
|
-
property :_sm_header
|
25
|
-
property :_sm_payload
|
26
|
-
|
27
|
-
def initialize(**props, &block)
|
28
|
-
attributes = {
|
29
|
-
_sm_header: SmartMessage::Header.new(
|
30
|
-
uuid: SecureRandom.uuid,
|
31
|
-
message_class: self.class.to_s,
|
32
|
-
published_at: 2,
|
33
|
-
publisher_pid: 3
|
34
|
-
)
|
35
|
-
}.merge(props)
|
36
|
-
|
37
|
-
super(attributes, &block)
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|