legion-transport 1.3.0 → 1.3.2

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: 55c23d109605074f58032f420c732b94ab43df16c73d5b2d0fe7aeedc2b66918
4
- data.tar.gz: 7f80b6e30c52a32bd367a1a98ddd867e462affaf6f72885c2bb17ad2f215b2b8
3
+ metadata.gz: 131a06c178704a57af2c9baef440704001342842e02d15a090297c09572505b5
4
+ data.tar.gz: e30dd4bdaac3fdfb42cf588f9512f3a3b930ae840b79f34ea073a960276e7fbb
5
5
  SHA512:
6
- metadata.gz: 579732a7b2688876efbecbdfeb26ece70d24d2a596104b87920cb8663f1ff61f0cb1baabe02158756a2408eaac4603360ef8902b443c1be20acbab674f4f0ceb
7
- data.tar.gz: 05d79297bc68c5820c252ce6513c488807d2c4e323c77ad4d680dffdd5334cd7c466d9676f3048fe45cb092741fbe0d7ab45b104140989bb114e29bec9dd4d81
6
+ metadata.gz: 89b5e05ec97fad24f0e191ac67bf4362afe758d1d4b1481629b6fa5575355e0ec56fa793d78d0f2cf3111213bf1087865d6c3791c234e41884adf3d13bf28568
7
+ data.tar.gz: 41bff2584db88fd03cc904bbe2996c628d4fdf689f6b793557f6207efb31fa808ad95e9e0aaa350026760d06c95e0411c62e75c9ca6087f21e6d1dd5a3f99acb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Legion::Transport ChangeLog
2
2
 
3
+ ## [1.3.2] - 2026-03-21
4
+
5
+ ### Added
6
+ - `Legion::Transport::Exchanges::Logging`: topic exchange (`legion.logging`) for structured log event publishing
7
+ - `Legion::Transport::Queues::RegionOutbound`: durable outbound queues for cross-region message routing (per-peer, skips current region)
8
+ - `Legion::Transport::Messages::RegionReRoute`: re-route message type for forwarding tasks to target regions
9
+
3
10
  ## [1.3.0] - 2026-03-21
4
11
 
5
12
  ### Added
data/CLAUDE.md CHANGED
@@ -25,7 +25,8 @@ Legion::Transport
25
25
  │ ├── Agent # Agent communication exchange (identity-bound: GAIA frames, preferences, proactive)
26
26
  │ ├── Crypt # Encryption exchange
27
27
  │ ├── Extensions # Extension exchange
28
- └── Lex # LEX exchange (inherits Extensions)
28
+ ├── Lex # LEX exchange (inherits Extensions)
29
+ │ └── Logging # Log event exchange (legion.logging) for structured log event publishing
29
30
  ├── Queue # Base queue class (extends Bunny::Queue)
30
31
  │ └── Queues/
31
32
  │ ├── Node # Node queue
data/CODEOWNERS ADDED
@@ -0,0 +1 @@
1
+ * @Esity
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Transport
5
+ module Exchanges
6
+ class Logging < Legion::Transport::Exchange
7
+ def exchange_name
8
+ 'legion.logging'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -125,6 +125,7 @@ module Legion
125
125
  @options[:headers] ||= Concurrent::Hash.new
126
126
  @options[:headers]['legion_protocol_version'] ||= '2.0'
127
127
  inject_region_header
128
+ inject_legion_region_header
128
129
  %i[task_id relationship_id trigger_namespace_id trigger_function_id parent_id master_id runner_namespace runner_class namespace_id function_id function
129
130
  chain_id debug].each do |header|
130
131
  next unless @options.key? header
@@ -182,6 +183,17 @@ module Legion
182
183
  @options[:headers]['x-legion-region-affinity'] = affinity
183
184
  end
184
185
 
186
+ def inject_legion_region_header
187
+ return unless defined?(Legion::Region) &&
188
+ Legion::Region.respond_to?(:current) &&
189
+ Legion::Region.current
190
+
191
+ @options[:headers]['region'] = Legion::Region.current
192
+ @options[:headers]['region_affinity'] = @options[:region_affinity] ||
193
+ (defined?(Legion::Settings) && Legion::Settings.dig(:region, :default_affinity)) ||
194
+ 'prefer_local'
195
+ end
196
+
185
197
  def spool_message(error)
186
198
  return unless defined?(Legion::Transport::Spool)
187
199
 
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Transport
5
+ module Messages
6
+ class RegionReRoute < Legion::Transport::Message
7
+ def exchange
8
+ Legion::Transport::Exchanges::Task
9
+ end
10
+
11
+ def routing_key
12
+ "region.reroute.#{target_region}"
13
+ end
14
+
15
+ def message
16
+ {
17
+ original_payload: @options[:original_payload] || @options.except(:target_region),
18
+ target_region: target_region,
19
+ source_region: source_region,
20
+ rerouted_at: Time.now.to_i
21
+ }
22
+ end
23
+
24
+ def validate
25
+ raise ArgumentError, 'target_region is required' unless @options[:target_region].is_a?(String) && !@options[:target_region].empty?
26
+
27
+ @valid = true
28
+ end
29
+
30
+ private
31
+
32
+ def target_region
33
+ @options[:target_region]
34
+ end
35
+
36
+ def source_region
37
+ @options[:source_region] ||
38
+ (defined?(Legion::Settings) && Legion::Settings.dig(:region, :current)) ||
39
+ 'unknown'
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -84,3 +84,4 @@ require_relative 'queues/node_status'
84
84
  require_relative 'queues/task_log'
85
85
  require_relative 'queues/task_update'
86
86
  require_relative 'queues/agent'
87
+ require_relative 'queues/region_outbound'
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Transport
5
+ module Queues
6
+ module RegionOutbound
7
+ module_function
8
+
9
+ def declare_all
10
+ peers = defined?(Legion::Settings) && Legion::Settings.dig(:region, :peers)
11
+ return [] unless peers.is_a?(Array) && !peers.empty?
12
+
13
+ current = defined?(Legion::Region) ? Legion::Region.current : nil
14
+ peers.reject { |p| p == current }.map do |peer|
15
+ declare_outbound(peer)
16
+ end
17
+ end
18
+
19
+ def declare_outbound(target_region)
20
+ queue_name = queue_name_for(target_region)
21
+ channel = Legion::Transport::Connection.channel
22
+ channel.queue(
23
+ queue_name,
24
+ durable: true,
25
+ arguments: { 'x-dead-letter-exchange' => 'tasks.dlx' }
26
+ )
27
+ rescue StandardError => e
28
+ Legion::Transport.logger.warn "RegionOutbound: failed to declare queue for #{target_region}: #{e.message}"
29
+ nil
30
+ end
31
+
32
+ def queue_name_for(target_region)
33
+ "legion.tasks.outbound.#{target_region}"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Transport
5
- VERSION = '1.3.0'
5
+ VERSION = '1.3.2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legion-transport
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -94,6 +94,7 @@ files:
94
94
  - ".rubocop.yml"
95
95
  - CHANGELOG.md
96
96
  - CLAUDE.md
97
+ - CODEOWNERS
97
98
  - Gemfile
98
99
  - LICENSE
99
100
  - README.md
@@ -110,6 +111,7 @@ files:
110
111
  - lib/legion/transport/exchanges/crypt.rb
111
112
  - lib/legion/transport/exchanges/extensions.rb
112
113
  - lib/legion/transport/exchanges/lex.rb
114
+ - lib/legion/transport/exchanges/logging.rb
113
115
  - lib/legion/transport/exchanges/node.rb
114
116
  - lib/legion/transport/exchanges/task.rb
115
117
  - lib/legion/transport/helpers/channel_pool.rb
@@ -120,6 +122,7 @@ files:
120
122
  - lib/legion/transport/messages/check_subtask.rb
121
123
  - lib/legion/transport/messages/dynamic.rb
122
124
  - lib/legion/transport/messages/lex_register.rb
125
+ - lib/legion/transport/messages/region_re_route.rb
123
126
  - lib/legion/transport/messages/request_cluster_secret.rb
124
127
  - lib/legion/transport/messages/subtask.rb
125
128
  - lib/legion/transport/messages/task.rb
@@ -130,6 +133,7 @@ files:
130
133
  - lib/legion/transport/queues/node.rb
131
134
  - lib/legion/transport/queues/node_crypt.rb
132
135
  - lib/legion/transport/queues/node_status.rb
136
+ - lib/legion/transport/queues/region_outbound.rb
133
137
  - lib/legion/transport/queues/task_log.rb
134
138
  - lib/legion/transport/queues/task_update.rb
135
139
  - lib/legion/transport/settings.rb