service_mesh_nats 0.6.0 → 0.7.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: 683e607b098b1fd2c8a5aa3d2d89182658f2cc7271523456f4d0c50879a2748f
4
- data.tar.gz: 0202c5b52d82746c1ecf86204efc29326c64f1b5edf60bcb6052c538bc26bed5
3
+ metadata.gz: 8766fe267e81c95787f56181bf3124d3a4a12de3f88da6acf7eb6297f181b6fb
4
+ data.tar.gz: 558e29c69edc0287eca76e4ba26963551d6f9670937b5fc98d0fca00dfdf06ee
5
5
  SHA512:
6
- metadata.gz: 423a075d243dcc467dc0208a5c5fdb2881c70c03af0c602f48ce0b461a19e2efb08fa68158122724a74cdbecac04e105b459eb49ba492d9ec9b7315f3fa522ed
7
- data.tar.gz: 7e63ac578689eecbe34d4b3ee8b1880868eb4d1e40d7ec27e994e0ff8bcb2e911be6ec72ffb301d8fdb203d209b4fc6ec08a89c8c4e6a1861ec30d67b2727519
6
+ metadata.gz: f10332c9b690bf5d33606d588ad142a31e484e6ef70e8dc63d66dee5183e1fbf07dcfe8f0018ed75a230202f8cf8a6720255c7155404e395aca44422eca5e8eb
7
+ data.tar.gz: 7fd4f7fad61c811ccdd388e966cd9da91f504945691926d957dab6b77fcdc900a5ca7f4fc40549638039a2dda6c88fc2d829c97f8775b887349540fd34afe914
@@ -9,7 +9,7 @@ module ServiceMeshNats
9
9
  # connection and runs their handlers on a bounded thread pool.
10
10
  class Runtime
11
11
  # A validated Endpoint or Subscriber. queue nil means a plain subscription.
12
- Binding = Data.define(:subject, :queue, :target, :handler, :replies)
12
+ Subscription = Data.define(:subject, :queue, :target, :handler, :replies)
13
13
 
14
14
  FLUSH_BUDGET = 5.0
15
15
 
@@ -19,13 +19,13 @@ module ServiceMeshNats
19
19
  # Reads ServiceMesh::DEPLOYMENT_GROUP_KEY and CONCURRENCY_KEY from +config+;
20
20
  # connection keys are ignored, the client carries them. Raises
21
21
  # ServiceMesh::NoDeploymentGroup, BadConfig, ServiceMesh::KindMismatch, or
22
- # ServiceMesh::InvalidTarget. Two bindings on one subject become two
23
- # subscriptions. The connection is not touched until start.
22
+ # ServiceMesh::InvalidTarget. Two endpoints or subscribers on one subject
23
+ # become two subscriptions. The connection is not touched until start.
24
24
  def initialize(client, config, endpoints: [], subscribers: [], logger: Logger.new($stderr))
25
25
  @settings = RuntimeSettings.parse(config)
26
26
  @client = client
27
27
  @logger = logger
28
- @bindings = bind_all(endpoints, subscribers)
28
+ @subscriptions = prepare_all(endpoints, subscribers)
29
29
 
30
30
  @lock = Mutex.new
31
31
  @state = :created
@@ -42,7 +42,7 @@ module ServiceMeshNats
42
42
  @client.service_map
43
43
  end
44
44
 
45
- # Subscribes every binding on the client's connection and begins
45
+ # Subscribes every endpoint and subscriber on the client's connection and begins
46
46
  # receiving. Raises AlreadyStarted on a running runtime, Stopped after
47
47
  # stop, and Closed when the client has been closed. A failure while
48
48
  # subscribing or flushing unsubscribes what was subscribed, leaves the
@@ -57,7 +57,7 @@ module ServiceMeshNats
57
57
  pool = Concurrent::FixedThreadPool.new(@settings.concurrency, name: "service_mesh_nats")
58
58
  subs = []
59
59
  begin
60
- @bindings.each do |b|
60
+ @subscriptions.each do |b|
61
61
  opts = b.queue ? {queue: b.queue} : {}
62
62
  subs << nc.subscribe(b.subject, opts) { |msg| dispatch(pool, nc, b, msg) }
63
63
  end
@@ -111,41 +111,41 @@ module ServiceMeshNats
111
111
  @logger.warn("service_mesh_nats: flush during stop failed: #{e.message}")
112
112
  end
113
113
 
114
- def bind_all(endpoints, subscribers)
115
- bind = lambda do |target, want, use, metadata, handler, replies|
114
+ def prepare_all(endpoints, subscribers)
115
+ prepare = lambda do |target, want, use, metadata, handler, replies|
116
116
  Subject.check_kind!(target, want, use)
117
117
  subject = Subject.format(target)
118
118
  raise ArgumentError, "#{use} #{subject} handler must respond to call" unless handler.respond_to?(:call)
119
119
 
120
- queue = Subject.consumer_group(metadata, target.metadata, @settings.deployment_group)
121
- Binding.new(subject: subject, queue: queue, target: target, handler: handler, replies: replies)
120
+ queue = Subject.consumer_group(metadata, @settings.deployment_group)
121
+ Subscription.new(subject: subject, queue: queue, target: target, handler: handler, replies: replies)
122
122
  end
123
123
 
124
- endpoints.map { |e| bind.call(e.target, :route, "Endpoint", e.metadata, e.handler, true) } +
125
- subscribers.map { |s| bind.call(s.target, :topic, "Subscriber", s.metadata, s.handler, false) }
124
+ endpoints.map { |e| prepare.call(e.target, :route, "Endpoint", e.metadata, e.handler, true) } +
125
+ subscribers.map { |s| prepare.call(s.target, :topic, "Subscriber", s.metadata, s.handler, false) }
126
126
  end
127
127
 
128
128
  # Runs on nats-pure's subscription thread; hands the message to the pool.
129
- def dispatch(pool, nc, binding, msg)
130
- pool.post { serve(nc, binding, msg) }
129
+ def dispatch(pool, nc, subscription, msg)
130
+ pool.post { serve(nc, subscription, msg) }
131
131
  rescue Concurrent::RejectedExecutionError
132
132
  # The pool is shutting down; the subscription is already gone.
133
133
  end
134
134
 
135
- def serve(nc, binding, msg)
136
- inbound = ServiceMesh::Message.new(target: binding.target, metadata: msg.header || {}, payload: msg.data.to_s)
135
+ def serve(nc, subscription, msg)
136
+ inbound = ServiceMesh::Message.new(target: subscription.target, metadata: msg.header || {}, payload: msg.data.to_s)
137
137
 
138
- out = binding.handler.call(inbound)
139
- return unless binding.replies && msg.reply
138
+ out = subscription.handler.call(inbound)
139
+ return unless subscription.replies && msg.reply
140
140
 
141
141
  unless out.is_a?(ServiceMesh::Message)
142
- raise TypeError, "endpoint #{binding.subject} handler returned #{out.class}, expected ServiceMesh::Message"
142
+ raise TypeError, "endpoint #{subscription.subject} handler returned #{out.class}, expected ServiceMesh::Message"
143
143
  end
144
144
 
145
145
  reply(nc, msg.reply, out.metadata, out.payload)
146
146
  rescue => e
147
- @logger.error("service_mesh_nats: handler failed on #{binding.subject}: #{e.class}: #{e.message}")
148
- reply(nc, msg.reply, {HANDLER_ERROR_HEADER => e.message}, "") if binding.replies && msg.reply
147
+ @logger.error("service_mesh_nats: handler failed on #{subscription.subject}: #{e.class}: #{e.message}")
148
+ reply(nc, msg.reply, {HANDLER_ERROR_HEADER => e.message}, "") if subscription.replies && msg.reply
149
149
  end
150
150
 
151
151
  def reply(nc, subject, metadata, payload)
@@ -33,19 +33,15 @@ module ServiceMeshNats
33
33
  raise ServiceMesh::KindMismatch, "#{use} requires a #{want} target, got #{target.kind}"
34
34
  end
35
35
 
36
- # The queue group for a binding. Binding metadata wins, then target
37
- # metadata, then the deployment group. nil means a plain subscription.
38
- def consumer_group(binding_metadata, target_metadata, deployment_group)
39
- [binding_metadata, target_metadata].each do |md|
40
- next unless md.key?(ServiceMesh::CONSUMER_GROUP_KEY)
41
-
42
- value = md[ServiceMesh::CONSUMER_GROUP_KEY].to_s
43
- next if value.empty?
44
- return nil if value == ServiceMesh::CONSUMER_GROUP_NONE
45
-
46
- return value
47
- end
48
- deployment_group
36
+ # The queue group of an Endpoint or Subscriber, from its metadata, falling
37
+ # back to the runtime's deployment group. nil means a plain subscription.
38
+ # A Target carries no consumer group, so its metadata is not read.
39
+ def consumer_group(metadata, deployment_group)
40
+ value = metadata[ServiceMesh::CONSUMER_GROUP_KEY].to_s
41
+ return deployment_group if value.empty?
42
+ return nil if value == ServiceMesh::CONSUMER_GROUP_NONE
43
+
44
+ value
49
45
  end
50
46
  end
51
47
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ServiceMeshNats
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: service_mesh_nats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryant Morrill
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2026-09-29 00:00:00.000000000 Z
12
+ date: 2026-09-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nats-pure
@@ -31,14 +31,14 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0.4'
34
+ version: '0.5'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0.4'
41
+ version: '0.5'
42
42
  description:
43
43
  email:
44
44
  - bryantreadmorrill@gmail.com