lex-mesh 0.3.1 → 0.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: 85f99c905c7878c400b57d6d7e1868838521ab8d2f7f5fad973d6a813c09f411
4
- data.tar.gz: b567bb9e7d1defaf1224aa3184fe63c80bc20458fce0d70fb936251e81247634
3
+ metadata.gz: aea56c9f61a9f536a407fdfee61d76717c92e9dd688365f58c33d6442ccb9d77
4
+ data.tar.gz: abfe8aa793907b98e051f5083c149a6f414fa0135261a603fbd50822bc0c9a93
5
5
  SHA512:
6
- metadata.gz: a7b28d8162556724cae30e898607e38633ad7749d98d10a273188c67c203517fb8aff0fa7408e365c2808f1e4dfc95bca5625077187ce7c814cc6ee30e2d5053
7
- data.tar.gz: e0e21868a89d6856b83c92d3034aa85d6ba9a1cda02f8afc62a8921c434211e05ad2764395c03b30f3439ca1eb89aa7ae3f616a07e15988b0af28932713f80c2
6
+ metadata.gz: 4fdba6f4567ca4bf713964d309ef421297c469c82bd619153297a39ad17327b784b3fac74ddf187a1e97f5c12c40ebc6983862639bb5a02f13f26af928487e6c
7
+ data.tar.gz: a7078556f34fd735dcb9186fa9c5d6b04ecbbe73b08db08baf2d0056be9afcf94534c34aaa1d0b03a32291e9088e947670c65d0921d78d912b2fc7ca008c5b72
@@ -50,10 +50,16 @@ module Legion
50
50
  agent_ids.filter_map { |id| @agents[id] }
51
51
  end
52
52
 
53
- def route_message(from:, to: nil, capability: nil, pattern: :unicast, payload: {})
53
+ def route_message(from:, to: nil, capability: nil, pattern: :unicast, payload: {}, hops: 0)
54
+ if hops >= Topology::MAX_HOPS
55
+ return { from: from, to: to, capability: capability, pattern: pattern,
56
+ payload: payload, hops: hops, at: Time.now.utc,
57
+ delivered_to: [], rejected: :max_hops_exceeded }
58
+ end
59
+
54
60
  msg = {
55
61
  from: from, to: to, capability: capability,
56
- pattern: pattern, payload: payload, at: Time.now.utc
62
+ pattern: pattern, payload: payload, hops: hops, at: Time.now.utc
57
63
  }
58
64
 
59
65
  targets = case pattern
@@ -9,7 +9,7 @@ module Legion
9
9
  module Delegation
10
10
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
11
11
 
12
- def delegate(from:, to:, task_context:, consent_level: :execute, parent_delegation_id: nil, **) # rubocop:disable Metrics/ParameterLists
12
+ def delegate(from:, to:, task_context:, consent_level: :execute, parent_delegation_id: nil, **)
13
13
  result = delegation_tracker.create(
14
14
  from: from,
15
15
  to: to,
@@ -32,7 +32,7 @@ module Legion
32
32
  result ? { alive: true } : { error: :not_registered }
33
33
  end
34
34
 
35
- def send_message(from:, to: nil, capability: nil, pattern: :unicast, payload: {}, **) # rubocop:disable Metrics/ParameterLists
35
+ def send_message(from:, to: nil, capability: nil, pattern: :unicast, payload: {}, **)
36
36
  return { error: :invalid_pattern } unless Helpers::Topology.valid_pattern?(pattern)
37
37
 
38
38
  msg = mesh_registry.route_message(from: from, to: to, capability: capability,
@@ -15,7 +15,7 @@ module Legion
15
15
 
16
16
  DEFAULT_TIMEOUT = 30
17
17
 
18
- def request_task(from:, to:, task:, payload:, timeout: DEFAULT_TIMEOUT, consent_level: :execute, **) # rubocop:disable Metrics/ParameterLists
18
+ def request_task(from:, to:, task:, payload:, timeout: DEFAULT_TIMEOUT, consent_level: :execute, **)
19
19
  target_id = resolve_target(to)
20
20
  return { success: false, reason: :no_agent_found, requested: to } unless target_id
21
21
 
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Mesh
6
- VERSION = '0.3.1'
6
+ VERSION = '0.3.2'
7
7
  end
8
8
  end
9
9
  end
@@ -239,6 +239,40 @@ RSpec.describe Legion::Extensions::Mesh::Helpers::Registry do
239
239
  end
240
240
  end
241
241
 
242
+ describe 'hop-count enforcement' do
243
+ it 'delivers normally when hops is below MAX_HOPS' do
244
+ result = registry.route_message(from: 'sender', to: 'a1', pattern: :unicast, hops: 0)
245
+ expect(result[:delivered_to]).to eq(['a1'])
246
+ expect(result[:rejected]).to be_nil
247
+ end
248
+
249
+ it 'rejects when hops equals MAX_HOPS' do
250
+ result = registry.route_message(from: 'sender', to: 'a1', pattern: :unicast,
251
+ hops: Legion::Extensions::Mesh::Helpers::Topology::MAX_HOPS)
252
+ expect(result[:delivered_to]).to eq([])
253
+ expect(result[:rejected]).to eq(:max_hops_exceeded)
254
+ end
255
+
256
+ it 'rejects when hops exceeds MAX_HOPS' do
257
+ result = registry.route_message(from: 'sender', to: 'a1', pattern: :unicast,
258
+ hops: Legion::Extensions::Mesh::Helpers::Topology::MAX_HOPS + 1)
259
+ expect(result[:delivered_to]).to eq([])
260
+ expect(result[:rejected]).to eq(:max_hops_exceeded)
261
+ end
262
+
263
+ it 'includes :max_hops_exceeded in the rejected field' do
264
+ result = registry.route_message(from: 'sender', pattern: :broadcast,
265
+ hops: Legion::Extensions::Mesh::Helpers::Topology::MAX_HOPS)
266
+ expect(result[:rejected]).to eq(:max_hops_exceeded)
267
+ end
268
+
269
+ it 'defaults hops to 0 for backward compatibility' do
270
+ result = registry.route_message(from: 'sender', to: 'a1', pattern: :unicast)
271
+ expect(result[:delivered_to]).to eq(['a1'])
272
+ expect(result[:rejected]).to be_nil
273
+ end
274
+ end
275
+
242
276
  describe 'message buffer cap' do
243
277
  it 'shifts old messages when buffer exceeds 1000' do
244
278
  1001.times { |i| registry.route_message(from: 'sender', to: "a#{i}", pattern: :unicast) }
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ unless defined?(Legion::Transport::Queue)
6
+ module Legion
7
+ module Transport
8
+ class Queue
9
+ def initialize(**); end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ unless defined?(Legion::Transport::Exchanges::Node)
16
+ module Legion
17
+ module Transport
18
+ module Exchanges
19
+ class Node # rubocop:disable Lint/EmptyClass
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ require 'legion/extensions/mesh/transport/queues/gossip'
27
+
28
+ RSpec.describe Legion::Extensions::Mesh::Transport::Queues::Gossip do
29
+ subject(:queue) { described_class.allocate }
30
+
31
+ describe '#queue_name' do
32
+ it "returns 'mesh.gossip'" do
33
+ expect(queue.queue_name).to eq('mesh.gossip')
34
+ end
35
+ end
36
+
37
+ describe '#exchange' do
38
+ it 'returns Legion::Transport::Exchanges::Node' do
39
+ expect(queue.exchange).to eq(Legion::Transport::Exchanges::Node)
40
+ end
41
+ end
42
+
43
+ describe '#routing_key' do
44
+ it "returns 'mesh.gossip'" do
45
+ expect(queue.routing_key).to eq('mesh.gossip')
46
+ end
47
+ end
48
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-mesh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -190,6 +190,7 @@ files:
190
190
  - spec/legion/extensions/mesh/transport/messages/mesh_departure_spec.rb
191
191
  - spec/legion/extensions/mesh/transport/messages/preference_query_spec.rb
192
192
  - spec/legion/extensions/mesh/transport/messages/preference_response_spec.rb
193
+ - spec/legion/extensions/mesh/transport/queues/gossip_spec.rb
193
194
  - spec/legion/extensions/mesh/transport/queues/preference_spec.rb
194
195
  - spec/spec_helper.rb
195
196
  homepage: https://github.com/LegionIO/lex-mesh