jetstream_bridge 4.5.2 → 4.5.4

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: '08ea80256539bb801e52672dc900d0e858b4a22fcc76e0958dfa1341e908dcc8'
4
- data.tar.gz: 6fd4e80d372f8c9c022dfe0992356a73784f517d0a18d78e65ec78a01652443d
3
+ metadata.gz: 8f268d96e9181e741027749623be2f513fc3e06a95dee4b46f3ebbb34dc89e2a
4
+ data.tar.gz: ea64cc3f05eab3b20e562fc10a1f092d6ebe00e2a5d231ec1842cac957a2c229
5
5
  SHA512:
6
- metadata.gz: 5b3a853557c531acac60a559673f95e2daab985ec43adf9b711108d2541fef59e109b894e070459a9259a4a3ccceedc15812e1768ce3a41d47b0087ec40a4a65
7
- data.tar.gz: 76de67fbf04fdc62bab5c952238403a91f430396a20c738d9863aae4dbc2faed364cf9686791ddc566ffb7fb9a82acb2afef780f3dbbcbdb62d9287d6b58fea6
6
+ metadata.gz: 502702da2e9905488fc58c6d3d20f2372e92bd8b54c1c5ad561842ab5b4c563a2692688bf3271af057d719dd134ae2cb1d299a43609cb6281f14956b438e2f25
7
+ data.tar.gz: bc5a499270533e30d57b4c3c9af66939acbff0c1ff11b884a868ce636a19cc5edf697145a3e78cf7fed5e7a25c53ca7123497ee9fa507944bdfd78788571d30c
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'json'
3
4
  require_relative '../core/logging'
4
5
  require_relative '../core/duration'
5
6
  require_relative '../errors'
@@ -47,32 +48,7 @@ module JetstreamBridge
47
48
  # This bypasses the permission check in nats-pure's pull_subscribe
48
49
  nc = resolve_nc
49
50
 
50
- if nc.respond_to?(:new_inbox) && nc.respond_to?(:subscribe)
51
- prefix = @jts.instance_variable_get(:@prefix) || '$JS.API'
52
- deliver = nc.new_inbox
53
- sub = nc.subscribe(deliver)
54
-
55
- # Extend with PullSubscription module to add fetch methods
56
- sub.extend(NATS::JetStream::PullSubscription)
57
-
58
- # Set up the JSI (JetStream Info) struct that PullSubscription expects
59
- # This matches what nats-pure does in pull_subscribe
60
- subject = "#{prefix}.CONSUMER.MSG.NEXT.#{stream_name}.#{@durable}"
61
- sub.jsi = NATS::JetStream::JS::Sub.new(
62
- js: @jts,
63
- stream: stream_name,
64
- consumer: @durable,
65
- nms: subject
66
- )
67
-
68
- Logging.info(
69
- "Created pull subscription without verification for consumer #{@durable} " \
70
- "(stream=#{stream_name}, filter=#{filter_subject})",
71
- tag: 'JetstreamBridge::Consumer'
72
- )
73
-
74
- return sub
75
- end
51
+ return build_pull_subscription(nc) if nc.respond_to?(:new_inbox) && nc.respond_to?(:subscribe)
76
52
 
77
53
  # Fallback for environments (mocks/tests) where low-level NATS client is unavailable.
78
54
  if @jts.respond_to?(:pull_subscribe)
@@ -193,5 +169,82 @@ module JetstreamBridge
193
169
 
194
170
  nil
195
171
  end
172
+
173
+ def build_pull_subscription(nats_client)
174
+ prefix = @jts.instance_variable_get(:@prefix) || '$JS.API'
175
+ deliver = nats_client.new_inbox
176
+ sub = nats_client.subscribe(deliver)
177
+ sub.instance_variable_set(:@_jsb_nc, nats_client)
178
+ sub.instance_variable_set(:@_jsb_deliver, deliver)
179
+ sub.instance_variable_set(:@_jsb_next_subject, "#{prefix}.CONSUMER.MSG.NEXT.#{stream_name}.#{@durable}")
180
+
181
+ extend_pull_subscription(sub)
182
+ attach_jsi(sub)
183
+
184
+ Logging.info(
185
+ "Created pull subscription without verification for consumer #{@durable} " \
186
+ "(stream=#{stream_name}, filter=#{filter_subject})",
187
+ tag: 'JetstreamBridge::Consumer'
188
+ )
189
+
190
+ sub
191
+ end
192
+
193
+ def extend_pull_subscription(sub)
194
+ pull_mod = begin
195
+ NATS::JetStream.const_get(:PullSubscription)
196
+ rescue NameError
197
+ nil
198
+ end
199
+
200
+ sub.extend(pull_mod) if pull_mod
201
+ shim_fetch(sub) unless pull_mod
202
+ end
203
+
204
+ def shim_fetch(sub)
205
+ Logging.warn(
206
+ 'PullSubscription mixin unavailable; using shim fetch implementation',
207
+ tag: 'JetstreamBridge::Consumer'
208
+ )
209
+
210
+ sub.define_singleton_method(:fetch) do |batch_size, timeout: nil|
211
+ nc_handle = instance_variable_get(:@_jsb_nc)
212
+ deliver_subject = instance_variable_get(:@_jsb_deliver)
213
+ next_subject = instance_variable_get(:@_jsb_next_subject)
214
+ unless nc_handle && deliver_subject && next_subject
215
+ raise JetstreamBridge::ConnectionError, 'Missing NATS handles for fetch'
216
+ end
217
+
218
+ expires_ns = ((timeout || 5).to_f * 1_000_000_000).to_i
219
+ payload = { batch: batch_size, expires: expires_ns }.to_json
220
+
221
+ nc_handle.publish(next_subject, payload, deliver_subject)
222
+ nc_handle.flush
223
+
224
+ messages = []
225
+ batch_size.times do
226
+ msg = next_msg(timeout || 5)
227
+ messages << msg if msg
228
+ rescue NATS::IO::Timeout, NATS::Timeout
229
+ break
230
+ end
231
+ messages
232
+ end
233
+ end
234
+
235
+ def attach_jsi(sub)
236
+ js_sub_class = begin
237
+ NATS::JetStream.const_get(:JS).const_get(:Sub)
238
+ rescue NameError
239
+ Struct.new(:js, :stream, :consumer, :nms, keyword_init: true)
240
+ end
241
+
242
+ sub.jsi = js_sub_class.new(
243
+ js: @jts,
244
+ stream: stream_name,
245
+ consumer: @durable,
246
+ nms: sub.instance_variable_get(:@_jsb_next_subject)
247
+ )
248
+ end
196
249
  end
197
250
  end
@@ -4,5 +4,5 @@
4
4
  #
5
5
  # Version constant for the gem.
6
6
  module JetstreamBridge
7
- VERSION = '4.5.2'
7
+ VERSION = '4.5.4'
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jetstream_bridge
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.5.2
4
+ version: 4.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Attara