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 +4 -4
- data/CHANGELOG.md +7 -0
- data/CLAUDE.md +2 -1
- data/CODEOWNERS +1 -0
- data/lib/legion/transport/exchanges/logging.rb +13 -0
- data/lib/legion/transport/message.rb +12 -0
- data/lib/legion/transport/messages/region_re_route.rb +44 -0
- data/lib/legion/transport/queue.rb +1 -0
- data/lib/legion/transport/queues/region_outbound.rb +38 -0
- data/lib/legion/transport/version.rb +1 -1
- metadata +5 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 131a06c178704a57af2c9baef440704001342842e02d15a090297c09572505b5
|
|
4
|
+
data.tar.gz: e30dd4bdaac3fdfb42cf588f9512f3a3b930ae840b79f34ea073a960276e7fbb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
│
|
|
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
|
|
@@ -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
|
|
@@ -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
|
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.
|
|
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
|