aggregate_streams 1.0.0.0.rc1 → 1.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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