railway-ipc 4.0.1 → 5.1.1
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/.ruby-version +1 -1
- data/CHANGELOG.md +21 -3
- data/lib/railway_ipc/consumer/consumer.rb +1 -1
- data/lib/railway_ipc/incoming_message.rb +2 -2
- data/lib/railway_ipc/message_encoders.rb +23 -0
- data/lib/railway_ipc/models/consumed_message.rb +10 -0
- data/lib/railway_ipc/models/published_message.rb +17 -8
- data/lib/railway_ipc/outgoing_message.rb +38 -0
- data/lib/railway_ipc/publisher.rb +5 -56
- data/lib/railway_ipc/version.rb +1 -1
- data/lib/railway_ipc.rb +2 -0
- data/priv/migrations/add_railway_ipc_consumed_messages.rb +1 -1
- data/priv/migrations/add_railway_ipc_published_messages.rb +1 -1
- data/railway_ipc.gemspec +3 -2
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a50920a8e02fc13ab3c9afef0761aff015d6acd1d5b252d4dd63e5398954cd87
|
4
|
+
data.tar.gz: 8f30819cb0a237b4af1761cb81387b5d0377a788355432f708bf88953a209add
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b2981894fb61a8fd32d66a309f44164d3007f1c1c52f9c743cc18a2526d17f01e60bdd85f0787ad2ae6bca39e068650bb71eafb7ea1f2033550191fd4c103ee
|
7
|
+
data.tar.gz: e35e1ad6e26ca87816df9dd5acefb9851c65cf66eee9fa9a69d8d6cf0b3dc4c27c7770ca81e7c43cf638b081c844a8ca64e78987f4df9a5f8119cac4cc60c1aa
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.7.2
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
5
|
|
7
6
|
## [Unreleased]
|
8
7
|
### Added
|
@@ -10,6 +9,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
10
9
|
### Removed
|
11
10
|
### Fixed
|
12
11
|
|
12
|
+
## [5.1.1] - 2022-09-09
|
13
|
+
### Fixed
|
14
|
+
* Made `google-protobuf` dependency explicit
|
15
|
+
|
16
|
+
## [5.0.0] - 2021-02-17
|
17
|
+
### Added
|
18
|
+
* Message encoders. Messages can now be encoded using either binary protobufs (the default) or JSON protobufs.
|
19
|
+
* `RailwayIpc::OutgoingMessage` abstraction that encapsulates everything about a message to be published.
|
20
|
+
|
21
|
+
### Changed
|
22
|
+
* `Publisher#publish` now takes an optional `format` parameter that specifies how the message should be encoded. It is added to the message header when the message is published. The default format is `binary_protobuf`.
|
23
|
+
* (Breaking change) `Publisher#publish` now returns an `OutgoingMessage` instead of a `Bunny::Exchange`.
|
24
|
+
* Refactor `PublishedMessage#store_message` to take an `OutgoingMessage`.
|
25
|
+
|
26
|
+
### Removed
|
27
|
+
* (Breaking change) Remove deprecated `SingletonPublisher`
|
28
|
+
|
13
29
|
## [4.0.1] - 2021-01-12
|
14
30
|
### Fixed
|
15
31
|
* Fixed `undefined method fetch for Bunny::MessageProperties` error. `Bunny::MessageProperties` isn't really a Hash, it wraps one (and doesn't provide a `#fetch` method).
|
@@ -100,7 +116,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
100
116
|
### Added
|
101
117
|
- Correlation ID and message UUID are auto generated for messages for IDs are not passed in [#23](https://github.com/learn-co/railway_ipc_gem/pull/23)
|
102
118
|
|
103
|
-
[Unreleased]: https://github.com/learn-co/railway_ipc_gem/compare/
|
119
|
+
[Unreleased]: https://github.com/learn-co/railway_ipc_gem/compare/v5.1.1...HEAD
|
120
|
+
[5.1.1]: https://github.com/learn-co/railway_ipc_gem/compare/v5.1.0...v5.1.1
|
121
|
+
[5.0.0]: https://github.com/learn-co/railway_ipc_gem/compare/v4.0.1...v5.0.0
|
104
122
|
[4.0.1]: https://github.com/learn-co/railway_ipc_gem/compare/v4.0.0...v4.0.1
|
105
123
|
[4.0.0]: https://github.com/learn-co/railway_ipc_gem/compare/v3.0.0...v4.0.0
|
106
124
|
[3.0.0]: https://github.com/learn-co/railway_ipc_gem/compare/v2.2.2...v3.0.0
|
@@ -61,7 +61,7 @@ module RailwayIpc
|
|
61
61
|
# override them. -BN
|
62
62
|
def work_with_params(payload, _delivery_info, metadata)
|
63
63
|
headers = metadata.headers || {}
|
64
|
-
message_format = headers.fetch('message_format', '
|
64
|
+
message_format = headers.fetch('message_format', 'binary_protobuf')
|
65
65
|
|
66
66
|
message = RailwayIpc::IncomingMessage.new(payload, message_format: message_format)
|
67
67
|
RailwayIpc::ProcessIncomingMessage.call(self, message)
|
@@ -47,8 +47,8 @@ module RailwayIpc
|
|
47
47
|
|
48
48
|
def get_decoder(name)
|
49
49
|
{
|
50
|
-
'
|
51
|
-
'
|
50
|
+
'binary_protobuf' => RailwayIpc::MessageDecoders::ProtobufBinaryDecoder,
|
51
|
+
'json_protobuf' => RailwayIpc::MessageDecoders::ProtobufJsonDecoder
|
52
52
|
}.fetch(name, DEFAULT_DECODER)
|
53
53
|
end
|
54
54
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailwayIpc
|
4
|
+
module MessageEncoders
|
5
|
+
ProtobufBinaryEncoder = lambda do |message|
|
6
|
+
{
|
7
|
+
type: message.type,
|
8
|
+
encoded_message: Base64.encode64(message.proto.class.encode(message.proto))
|
9
|
+
}.to_json
|
10
|
+
rescue NoMethodError
|
11
|
+
raise RailwayIpc::InvalidProtobuf.new("Message #{message} is not a valid protobuf")
|
12
|
+
end
|
13
|
+
|
14
|
+
ProtobufJsonEncoder = lambda do |message|
|
15
|
+
{
|
16
|
+
type: message.type,
|
17
|
+
encoded_message: message.proto.to_h
|
18
|
+
}.to_json
|
19
|
+
rescue NoMethodError
|
20
|
+
raise RailwayIpc::InvalidProtobuf.new("Message #{message} is not a valid protobuf")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -54,8 +54,18 @@ module RailwayIpc
|
|
54
54
|
|
55
55
|
private
|
56
56
|
|
57
|
+
# rails <= 5.1 uses this method to know the name of the created_at/updated_at fields
|
57
58
|
def timestamp_attributes_for_create
|
58
59
|
super << :inserted_at
|
59
60
|
end
|
61
|
+
|
62
|
+
# rails >= 6.0 moved this to the class level and uses strings instead of symbols
|
63
|
+
class << self
|
64
|
+
private
|
65
|
+
|
66
|
+
def timestamp_attributes_for_create
|
67
|
+
super << 'inserted_at'
|
68
|
+
end
|
69
|
+
end
|
60
70
|
end
|
61
71
|
end
|
@@ -7,23 +7,32 @@ module RailwayIpc
|
|
7
7
|
|
8
8
|
validates :uuid, :status, presence: true
|
9
9
|
|
10
|
-
def self.store_message(
|
11
|
-
encoded_message = RailwayIpc::Rabbitmq::Payload.encode(message)
|
10
|
+
def self.store_message(outgoing_message)
|
12
11
|
create!(
|
13
|
-
uuid:
|
14
|
-
message_type:
|
15
|
-
user_uuid:
|
16
|
-
correlation_id:
|
17
|
-
encoded_message:
|
12
|
+
uuid: outgoing_message.uuid,
|
13
|
+
message_type: outgoing_message.type,
|
14
|
+
user_uuid: outgoing_message.user_uuid,
|
15
|
+
correlation_id: outgoing_message.correlation_id,
|
16
|
+
encoded_message: outgoing_message.encoded,
|
18
17
|
status: 'sent',
|
19
|
-
exchange:
|
18
|
+
exchange: outgoing_message.exchange
|
20
19
|
)
|
21
20
|
end
|
22
21
|
|
23
22
|
private
|
24
23
|
|
24
|
+
# rails <= 5.1 uses this method to know the name of the created_at/updated_at fields
|
25
25
|
def timestamp_attributes_for_create
|
26
26
|
super << :inserted_at
|
27
27
|
end
|
28
|
+
|
29
|
+
# rails >= 6.0 moved this to the class level and uses strings instead of symbols
|
30
|
+
class << self
|
31
|
+
private
|
32
|
+
|
33
|
+
def timestamp_attributes_for_create
|
34
|
+
super << 'inserted_at'
|
35
|
+
end
|
36
|
+
end
|
28
37
|
end
|
29
38
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailwayIpc
|
4
|
+
class OutgoingMessage
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
attr_reader :proto, :exchange, :format
|
8
|
+
|
9
|
+
def_delegators :@proto, :uuid, :user_uuid, :correlation_id
|
10
|
+
|
11
|
+
def initialize(proto, exchange, format=nil)
|
12
|
+
proto.uuid = SecureRandom.uuid if proto.uuid.blank?
|
13
|
+
proto.correlation_id = SecureRandom.uuid if proto.correlation_id.blank?
|
14
|
+
@proto = proto
|
15
|
+
@exchange = exchange
|
16
|
+
@format = format
|
17
|
+
end
|
18
|
+
|
19
|
+
def type
|
20
|
+
proto.class.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def encoded
|
24
|
+
@encoded ||= encoder.call(self)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
DEFAULT_ENCODER = RailwayIpc::MessageEncoders::ProtobufBinaryEncoder
|
30
|
+
|
31
|
+
def encoder
|
32
|
+
{
|
33
|
+
'binary_protobuf' => RailwayIpc::MessageEncoders::ProtobufBinaryEncoder,
|
34
|
+
'json_protobuf' => RailwayIpc::MessageEncoders::ProtobufJsonEncoder
|
35
|
+
}.fetch(format, DEFAULT_ENCODER)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -1,55 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module RailwayIpc
|
4
|
-
class SingletonPublisher < Sneakers::Publisher
|
5
|
-
include ::Singleton
|
6
|
-
|
7
|
-
def self.exchange(exchange)
|
8
|
-
@exchange_name = exchange
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.exchange_name
|
12
|
-
raise 'Subclass must set the exchange' unless @exchange_name
|
13
|
-
|
14
|
-
@exchange_name
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
super(exchange: self.class.exchange_name, exchange_type: :fanout)
|
19
|
-
end
|
20
|
-
|
21
|
-
def publish(message, published_message_store=RailwayIpc::PublishedMessage)
|
22
|
-
RailwayIpc.logger.warn('DEPRECATED: Use new PublisherInstance class', log_message_options)
|
23
|
-
ensure_message_uuid(message)
|
24
|
-
ensure_correlation_id(message)
|
25
|
-
RailwayIpc.logger.info('Publishing message', log_message_options(message))
|
26
|
-
result = super(RailwayIpc::Rabbitmq::Payload.encode(message))
|
27
|
-
published_message_store.store_message(self.class.exchange_name, message)
|
28
|
-
result
|
29
|
-
rescue RailwayIpc::InvalidProtobuf => e
|
30
|
-
RailwayIpc.logger.error('Invalid protobuf', log_message_options(message))
|
31
|
-
raise e
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def ensure_message_uuid(message)
|
37
|
-
message.uuid = SecureRandom.uuid if message.uuid.blank?
|
38
|
-
message
|
39
|
-
end
|
40
|
-
|
41
|
-
def ensure_correlation_id(message)
|
42
|
-
message.correlation_id = SecureRandom.uuid if message.correlation_id.blank?
|
43
|
-
message
|
44
|
-
end
|
45
|
-
|
46
|
-
def log_message_options(message=nil)
|
47
|
-
options = { feature: 'railway_ipc_publisher', exchange: self.class.exchange_name }
|
48
|
-
message.nil? ? options : options.merge(protobuf: { type: message.class, data: message })
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
3
|
module RailwayIpc
|
54
4
|
class Publisher
|
55
5
|
attr_reader :exchange_name, :message_store
|
@@ -60,13 +10,12 @@ module RailwayIpc
|
|
60
10
|
end
|
61
11
|
|
62
12
|
# rubocop:disable Metrics/AbcSize
|
63
|
-
def publish(message)
|
64
|
-
|
65
|
-
|
13
|
+
def publish(message, format='binary_protobuf')
|
14
|
+
outgoing_message = OutgoingMessage.new(message, exchange_name, format)
|
15
|
+
stored_message = message_store.store_message(outgoing_message)
|
66
16
|
RailwayIpc.logger.info('Publishing message', log_message_options(message))
|
67
|
-
|
68
|
-
|
69
|
-
exchange.publish(RailwayIpc::Rabbitmq::Payload.encode(message))
|
17
|
+
exchange.publish(outgoing_message.encoded, headers: { message_format: format })
|
18
|
+
outgoing_message
|
70
19
|
rescue RailwayIpc::InvalidProtobuf => e
|
71
20
|
RailwayIpc.logger.error('Invalid protobuf', log_message_options(message))
|
72
21
|
raise e
|
data/lib/railway_ipc/version.rb
CHANGED
data/lib/railway_ipc.rb
CHANGED
@@ -14,8 +14,10 @@ require 'railway_ipc/unknown_message.pb'
|
|
14
14
|
require 'railway_ipc/rabbitmq/adapter'
|
15
15
|
require 'railway_ipc/handler'
|
16
16
|
require 'railway_ipc/handler_store'
|
17
|
+
require 'railway_ipc/message_encoders'
|
17
18
|
require 'railway_ipc/message_decoders'
|
18
19
|
require 'railway_ipc/incoming_message'
|
20
|
+
require 'railway_ipc/outgoing_message'
|
19
21
|
require 'railway_ipc/connection_manager'
|
20
22
|
require 'railway_ipc/publisher'
|
21
23
|
require 'railway_ipc/responder'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class AddRailwayIpcPublishedMessages < ActiveRecord::Migration
|
3
|
+
class AddRailwayIpcPublishedMessages < ActiveRecord::Migration[4.2]
|
4
4
|
def change
|
5
5
|
create_table :railway_ipc_published_messages, id: false do |t|
|
6
6
|
t.uuid :uuid, null: false
|
data/railway_ipc.gemspec
CHANGED
@@ -42,14 +42,15 @@ Gem::Specification.new do |spec|
|
|
42
42
|
spec.add_development_dependency 'rubocop', '~> 0.86'
|
43
43
|
|
44
44
|
spec.add_dependency 'bunny', '~> 2.2.0'
|
45
|
+
spec.add_dependency 'google-protobuf', '> 3.7'
|
45
46
|
spec.add_dependency 'sneakers', '~> 2.3.5'
|
46
47
|
|
47
48
|
# Setup for testing Rails type code within mock Rails app
|
48
49
|
spec.add_development_dependency 'database_cleaner', '~> 1.7'
|
49
50
|
spec.add_development_dependency 'listen', '~> 3.0.5'
|
50
|
-
spec.add_development_dependency 'pg', '~>
|
51
|
+
spec.add_development_dependency 'pg', '~> 1.1'
|
51
52
|
spec.add_development_dependency 'pry', '~> 0.13'
|
52
|
-
spec.add_development_dependency 'rails', '~>
|
53
|
+
spec.add_development_dependency 'rails', '~> 6.0'
|
53
54
|
spec.add_development_dependency 'rspec-rails'
|
54
55
|
spec.add_development_dependency 'shoulda-matchers', '~> 4.2'
|
55
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: railway-ipc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ''
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 2.2.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: google-protobuf
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '3.7'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '3.7'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: sneakers
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,14 +170,14 @@ dependencies:
|
|
156
170
|
requirements:
|
157
171
|
- - "~>"
|
158
172
|
- !ruby/object:Gem::Version
|
159
|
-
version: '
|
173
|
+
version: '1.1'
|
160
174
|
type: :development
|
161
175
|
prerelease: false
|
162
176
|
version_requirements: !ruby/object:Gem::Requirement
|
163
177
|
requirements:
|
164
178
|
- - "~>"
|
165
179
|
- !ruby/object:Gem::Version
|
166
|
-
version: '
|
180
|
+
version: '1.1'
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: pry
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,14 +198,14 @@ dependencies:
|
|
184
198
|
requirements:
|
185
199
|
- - "~>"
|
186
200
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
201
|
+
version: '6.0'
|
188
202
|
type: :development
|
189
203
|
prerelease: false
|
190
204
|
version_requirements: !ruby/object:Gem::Requirement
|
191
205
|
requirements:
|
192
206
|
- - "~>"
|
193
207
|
- !ruby/object:Gem::Version
|
194
|
-
version:
|
208
|
+
version: '6.0'
|
195
209
|
- !ruby/object:Gem::Dependency
|
196
210
|
name: rspec-rails
|
197
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -249,8 +263,10 @@ files:
|
|
249
263
|
- lib/railway_ipc/incoming_message.rb
|
250
264
|
- lib/railway_ipc/logger.rb
|
251
265
|
- lib/railway_ipc/message_decoders.rb
|
266
|
+
- lib/railway_ipc/message_encoders.rb
|
252
267
|
- lib/railway_ipc/models/consumed_message.rb
|
253
268
|
- lib/railway_ipc/models/published_message.rb
|
269
|
+
- lib/railway_ipc/outgoing_message.rb
|
254
270
|
- lib/railway_ipc/publisher.rb
|
255
271
|
- lib/railway_ipc/rabbitmq/adapter.rb
|
256
272
|
- lib/railway_ipc/rabbitmq/payload.rb
|
@@ -295,7 +311,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
295
311
|
- !ruby/object:Gem::Version
|
296
312
|
version: '0'
|
297
313
|
requirements: []
|
298
|
-
rubygems_version: 3.0.
|
314
|
+
rubygems_version: 3.0.6
|
299
315
|
signing_key:
|
300
316
|
specification_version: 4
|
301
317
|
summary: IPC components for Rails
|