aggregate_streams 1.0.0.0.rc1 → 1.0.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18f3677271347279d2697fd882d26202f4de35f1b1a572f111f71215a3931796
4
- data.tar.gz: 0044e3485e0b089b938312743894272bdaa7db5bc34d71140c2ec0ce35d7552b
3
+ metadata.gz: cdcf7bac6c03a998987f6cf21d3e88efdf7bcef26f6d00c6e72f19363e1d58a3
4
+ data.tar.gz: d9cc11c444fd189ddc431009d5c32823144ed7f54b31285477c7ad67ce484791
5
5
  SHA512:
6
- metadata.gz: d0fde2fec378bc68128cb6fd5408a9c9498c7a2d20b5bab72b6df16bbe3b54b7c1c643e2f98bb4f50428cffcaf2baf88654702d6075d62a62196aa40fd8916b4
7
- data.tar.gz: 29d05a5f5ab4dbe717c1914a8134dc749bcd2aeb24867d4760c1dac30d6881fc94889a046ade1ce04e55042067e0c332c1bd5dfcd03fa5cc0861e9d828c1e2b1
6
+ metadata.gz: 75b2874f85d2c020e81065d27923cac9b3b32c20805989ef84e381ed1399bddd427d06bef4a3c87e51feb9a51d040af39e0fcca6f9cef63f780307b8275af318
7
+ data.tar.gz: 687bbdb915c196352707e7d27fc633083ac86b28bd9c3964c6a3c71ce9c60f419848d9d15eb2af5754db661c0380c0a38a9e86a66f77e1e1c570c741708d5b4a
@@ -1,7 +1,7 @@
1
1
  require 'consumer/postgres'
2
2
  require 'entity_store'
3
3
  require 'entity_snapshot/postgres'
4
- require 'try'
4
+ require 'retry'
5
5
 
6
6
  require 'aggregate_streams/aggregation'
7
7
  require 'aggregate_streams/projection'
@@ -2,7 +2,7 @@ module AggregateStreams
2
2
  module Controls
3
3
  module MessageData
4
4
  module Metadata
5
- def self.example(category: nil, stream_id: nil, stream_name: nil, position: nil, global_position: nil, causation_message_stream_name: nil, causation_message_position: nil, causation_message_global_position: nil, correlation_stream_name: nil, reply_stream_name: nil, schema_version: nil)
5
+ def self.example(category: nil, stream_id: nil, stream_name: nil, position: nil, global_position: nil, causation_message_stream_name: nil, causation_message_position: nil, causation_message_global_position: nil, correlation_stream_name: nil, reply_stream_name: nil, properties: nil, local_properties: nil, schema_version: nil)
6
6
  if stream_name == :none
7
7
  stream_name = nil
8
8
  else
@@ -51,6 +51,18 @@ module AggregateStreams
51
51
  reply_stream_name ||= Metadata.reply_stream_name
52
52
  end
53
53
 
54
+ if properties == :none
55
+ properties = nil
56
+ else
57
+ properties ||= self.properties
58
+ end
59
+
60
+ if local_properties == :none
61
+ local_properties = nil
62
+ else
63
+ local_properties ||= self.local_properties
64
+ end
65
+
54
66
  if schema_version == :none
55
67
  schema_version = nil
56
68
  else
@@ -68,6 +80,10 @@ module AggregateStreams
68
80
 
69
81
  :correlation_stream_name => correlation_stream_name,
70
82
  :reply_stream_name => reply_stream_name,
83
+
84
+ :properties => properties,
85
+ :local_properties => local_properties,
86
+
71
87
  :schema_version => schema_version
72
88
  }
73
89
 
@@ -108,6 +124,14 @@ module AggregateStreams
108
124
  Messaging::Controls::Metadata.reply_stream_name
109
125
  end
110
126
 
127
+ def self.properties
128
+ Messaging::Controls::Properties.example
129
+ end
130
+
131
+ def self.local_properties
132
+ Messaging::Controls::LocalProperties.example
133
+ end
134
+
111
135
  def self.schema_version
112
136
  Messaging::Controls::Metadata.schema_version
113
137
  end
@@ -5,6 +5,8 @@ module AggregateStreams
5
5
 
6
6
  include Log::Dependency
7
7
 
8
+ include Settings::Setting
9
+
8
10
  TransformError = Class.new(RuntimeError)
9
11
 
10
12
  setting :category
@@ -15,7 +17,9 @@ module AggregateStreams
15
17
  dependency :store, Store
16
18
  dependency :write, MessageStore::Postgres::Write
17
19
 
18
- def configure(session: nil)
20
+ def configure(session: nil, settings:)
21
+ settings.set(self)
22
+
19
23
  writer_session = self.writer_session
20
24
  writer_session ||= session
21
25
 
@@ -27,54 +31,67 @@ module AggregateStreams
27
31
  def handle(message_data)
28
32
  logger.trace { "Handling message (Stream: #{message_data.stream_name}, Global Position: #{message_data.global_position})" }
29
33
 
30
- stream_id = Messaging::StreamName.get_id(message_data.stream_name)
34
+ Retry.(MessageStore::ExpectedVersion::Error, millisecond_intervals: [0, 10, 100, 1000]) do
35
+ stream_id = Messaging::StreamName.get_id(message_data.stream_name)
31
36
 
32
- aggregation, version = store.fetch(stream_id, include: :version)
37
+ aggregation, version = store.fetch(stream_id, include: :version)
33
38
 
34
- if aggregation.processed?(message_data)
35
- logger.info(tag: :ignored) { "Message already handled (Stream: #{message_data.stream_name}, Global Position: #{message_data.global_position})" }
36
- return
37
- end
39
+ if aggregation.processed?(message_data)
40
+ logger.info(tag: :ignored) { "Message already handled (Stream: #{message_data.stream_name}, Global Position: #{message_data.global_position})" }
41
+ return
42
+ end
38
43
 
39
- raw_input_data = Messaging::Message::Transform::MessageData.read(message_data)
40
- input_metadata = Messaging::Message::Metadata.build(raw_input_data[:metadata])
44
+ raw_input_data = Messaging::Message::Transform::MessageData.read(message_data)
45
+ input_metadata = Messaging::Message::Metadata.build(raw_input_data[:metadata])
41
46
 
42
- output_metadata = Messaging::Message::Metadata.build
47
+ output_metadata = raw_metadata(input_metadata)
43
48
 
44
- output_metadata.follow(input_metadata)
49
+ write_message_data = MessageStore::MessageData::Write.new
45
50
 
46
- output_metadata = output_metadata.to_h
47
- output_metadata.delete_if { |_, v| v.nil? }
51
+ SetAttributes.(write_message_data, message_data, copy: [:type, :data])
48
52
 
49
- write_message_data = MessageStore::MessageData::Write.new
53
+ write_message_data.metadata = output_metadata
50
54
 
51
- SetAttributes.(write_message_data, message_data, copy: [:type, :data])
55
+ input_category = Messaging::StreamName.get_category(message_data.stream_name)
56
+ write_message_data = transform(write_message_data, input_category)
52
57
 
53
- write_message_data.metadata = output_metadata
58
+ if write_message_data
59
+ assure_message_data(write_message_data)
60
+ else
61
+ logger.info(tag: :ignored) { "Message ignored (Stream: #{message_data.stream_name}, Global Position: #{message_data.global_position})" }
62
+ return
63
+ end
54
64
 
55
- input_category = Messaging::StreamName.get_category(message_data.stream_name)
56
- write_message_data = transform(write_message_data, input_category)
65
+ stream_name = stream_name(stream_id)
66
+ write.(write_message_data, stream_name, expected_version: version)
57
67
 
58
- if write_message_data
59
- assure_message_data(write_message_data)
60
- else
61
- logger.info(tag: :ignored) { "Message ignored (Stream: #{message_data.stream_name}, Global Position: #{message_data.global_position})" }
62
- return
63
- end
68
+ logger.info do
69
+ message_type = message_data.type
70
+ unless write_message_data.type == message_type
71
+ message_type = "#{write_message_data.type} #{message_type}"
72
+ end
64
73
 
65
- logger.info do
66
- message_type = message_data.type
67
- unless write_message_data.type == message_type
68
- message_type = "#{write_message_data.type} ← #{message_type}"
74
+ "Message copied (Message Type: #{message_type}, Stream: #{message_data.stream_name}, Global Position: #{message_data.global_position})"
69
75
  end
70
-
71
- "Message copied (Message Type: #{message_type}, Stream: #{message_data.stream_name}, Global Position: #{message_data.global_position})"
72
76
  end
77
+ end
73
78
 
74
- Try.(MessageStore::ExpectedVersion::Error) do
75
- stream_name = stream_name(stream_id)
76
- write.(write_message_data, stream_name, expected_version: version)
79
+ def raw_metadata(metadata)
80
+ output_metadata = Messaging::Message::Metadata.build
81
+
82
+ output_metadata.follow(metadata)
83
+
84
+ output_metadata = output_metadata.to_h
85
+
86
+ output_metadata.delete(:local_properties)
87
+
88
+ if output_metadata[:properties].empty?
89
+ output_metadata.delete(:properties)
77
90
  end
91
+
92
+ output_metadata.delete_if { |_, v| v.nil? }
93
+
94
+ output_metadata
78
95
  end
79
96
 
80
97
  def transform(write_message_data, stream_name)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aggregate_streams
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.0.rc1
4
+ version: 1.0.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Ladd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-22 00:00:00.000000000 Z
11
+ date: 2021-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: evt-consumer-postgres
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: evt-try
56
+ name: evt-retry
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -132,11 +132,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
132
  version: '2.7'
133
133
  required_rubygems_version: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - ">"
135
+ - - ">="
136
136
  - !ruby/object:Gem::Version
137
- version: 1.3.1
137
+ version: '0'
138
138
  requirements: []
139
- rubygems_version: 3.1.4
139
+ rubygems_version: 3.2.15
140
140
  signing_key:
141
141
  specification_version: 4
142
142
  summary: Combine messages from multiple Eventide streams into an aggregate stream