nats_messaging 0.1.7 → 1.0.1

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: a3e8eef7b8b10d8b83e5ce8a0236def7eb58d9d99325e2c2d64871554c470c0c
4
- data.tar.gz: 443547eff24fbbf7381e0bc9234bc56531e97bc10052b227d3372cc0f4ae7825
3
+ metadata.gz: 362ffb41d76609d059fbead81c5989ba38eeb75c2a74495128c23adebe22c44b
4
+ data.tar.gz: 74c67fec24a28c1e5f8e3083a823c0623a9f70201402df543514356df143a01d
5
5
  SHA512:
6
- metadata.gz: bfd3f40b4eb214e167bf528718a8dbc8cb0c8d29e3ccb2281d6152e486a8f8dff9a3ecd67d42f7eeab4605b5947f77318f039cfb63ece5bca9f31d0e4e20773a
7
- data.tar.gz: c3e5d781c9941f53c66185cb5738d66a4707bc42ef105896c09239ba4f058129cb17b4d38539774847773753eadecb71bd80a3850e4de0d506a343905862fa96
6
+ metadata.gz: 28b2311dfd747fe27c7f9688f4c5c89c0aca3634eeca153d0b050fc3cf96e3578204d4c751ea3b0e12e8b29bc6f086fc6aab53fc69d1eb2d50bb3163360aa89c
7
+ data.tar.gz: 94cd5da40b5ee9bb4bb78fd44c8c43225fbee8edd8b0f25824616d1c4ba37ae1773cbfa68f5cb21e9d58825307e66fbc9e8e0c193468c72bb5a6291503432551
@@ -3,20 +3,23 @@ require 'msgpack'
3
3
 
4
4
  module NatsMessaging
5
5
  class NatsService
6
- def initialize
7
- @nats = NATS.connect("nats://localhost:4222")
8
- @js = @nats.jetstream
9
- create_stream("default_stream")
6
+ def initialize(nats_url, stream_name: nil, subjects: [])
7
+ # para correr en local usar "nats://localhost:4222" como nats_url
8
+ @nats = NATS.connect(nats_url)
9
+ if stream_name
10
+ @js = @nats.jetstream
11
+ create_stream(stream_name, subjects)
12
+ end
10
13
  @subscriptions = {} # Store active subscriptions
11
14
  end
12
15
 
13
16
  # Create a stream
14
- def create_stream(stream_name)
17
+ def create_stream(stream_name, subjects)
15
18
  begin
16
19
  stream = @js.stream_info(stream_name)
17
20
  puts "NATS: Stream #{stream_name} already exists"
18
21
  rescue NATS::JetStream::Error::NotFound
19
- @js.add_stream(name: stream_name, subjects: ["subject1", "subject2"])
22
+ @js.add_stream(name: stream_name, subjects: subjects)
20
23
  puts "NATS: Stream #{stream_name} created"
21
24
  rescue => e
22
25
  puts "NATS: Failed to create stream: #{e.message}"
@@ -25,27 +28,54 @@ module NatsMessaging
25
28
 
26
29
  # Publish a message to a subject using MessagePack
27
30
  def publish_message(subject, message)
28
- begin
29
- packed_message = message.to_msgpack # Serializar a MessagePack
30
- ack = @js.publish(subject, packed_message)
31
- puts "NATS: Message sent to #{subject}: #{message}, ACK: #{ack.inspect}"
32
- rescue => e
33
- puts "NATS: Unexpected error: #{e.message}"
31
+ packed_message = message.to_msgpack # Serializar a MessagePack
32
+
33
+ if @js
34
+ begin
35
+ ack = @js.publish(subject, packed_message)
36
+ puts "NATS: Message sent to #{subject}: #{message}, ACK: #{ack.inspect}"
37
+ rescue NATS::JetStream::Error::NotFound
38
+ @nats.publish(subject, packed_message)
39
+ puts "NATS: Stream not found, falling back to regular NATS publish"
40
+ rescue => e
41
+ puts "NATS: Unexpected error: #{e.message}"
42
+ end
43
+ else
44
+ begin
45
+ @nats.publish(subject, packed_message)
46
+ puts "NATS: Message sent to #{subject}: #{message}, ACK: #{ack.inspect}"
47
+ rescue => e
48
+ puts "NATS: Unexpected error: #{e.message}"
49
+ end
34
50
  end
35
51
  end
36
52
 
37
53
  # Subscribe to a subject using MessagePack
38
54
  def subscribe_to_subject(subject, durable_name = "durable_name")
39
55
  puts "NATS: Subscribing to #{subject}"
40
- @js.subscribe(subject, durable: durable_name) do |msg|
41
- begin
42
- unpacked_data = MessagePack.unpack(msg.data) # Deserializar el mensaje recibido
43
- puts "NATS: Message received on #{subject}: #{unpacked_data}"
44
- msg.ack
45
- unpacked_data
46
- rescue => e
47
- puts "NATS: Error while processing message: #{e.message}"
48
- end
56
+
57
+ if @js
58
+ subscription = @js.subscribe(subject, durable: durable_name) do |msg|
59
+ process_received_message(msg, subject)
60
+ end
61
+ else
62
+ subscription = @nats.subscribe(subject) do |msg|
63
+ process_received_message(msg, subject)
64
+ end
65
+ end
66
+
67
+ @subscriptions[subject] = subscription
68
+ end
69
+
70
+ # Process received message
71
+ def process_received_message(msg, subject)
72
+ begin
73
+ unpacked_data = MessagePack.unpack(msg.data)
74
+ puts "NATS: Message received on #{subject}: #{unpacked_data}"
75
+ msg.ack if msg.respond_to?(:ack)
76
+ unpacked_data
77
+ rescue => e
78
+ puts "NATS: Error while processing message: #{e.message}"
49
79
  end
50
80
  end
51
81
 
@@ -77,20 +107,8 @@ module NatsMessaging
77
107
  # Create a new subscription
78
108
  puts "NATS: Suscribing to #{subject}"
79
109
  subscription = @nats.subscribe(subject) do |msg|
80
- begin
81
- received_data = MessagePack.unpack(msg.data) # Deserializar mensaje recibido
82
- puts "NATS: Received request on #{subject}: #{received_data}"
83
- packed_reply = reply_message.to_msgpack # Serializar respuesta
84
- # Asegurar que msg.reply existe antes de responder
85
- if msg.reply
86
- @nats.publish(msg.reply, packed_reply)
87
- puts "NATS: Replied to #{subject} with message: #{reply_message} new"
88
- else
89
- puts "NATS: No reply subject for #{subject}, cannot respond"
90
- end
91
- rescue => e
92
- puts "NATS: Error while processing message: #{e.message}"
93
- end
110
+ process_reply(msg, subject, reply_message)
111
+
94
112
  end
95
113
  rescue => e
96
114
  puts "NATS: Error while replying: #{e.message}"
@@ -102,4 +120,22 @@ module NatsMessaging
102
120
  puts "NATS: Listening on #{subject} with reply message: #{reply_message}"
103
121
  end
104
122
  end
123
+
124
+ # Process and reply a message received
125
+ def process_reply(msg, subject, reply_message)
126
+ begin
127
+ unpacked_data = MessagePack.unpack(msg.data) # Deserializar mensaje recibido
128
+ puts "NATS: Received request on #{subject}: #{received_data}"
129
+ packed_reply = reply_message.to_msgpack # Serializar respuesta
130
+ # Asegurar que msg.reply existe antes de responder
131
+ if msg.reply
132
+ @nats.publish(msg.reply, packed_reply)
133
+ puts "NATS: Replied to #{subject} with message: #{reply_message} new"
134
+ else
135
+ puts "NATS: No reply subject for #{subject}, cannot respond"
136
+ end
137
+ rescue => e
138
+ puts "NATS: Error while processing message: #{e.message}"
139
+ end
140
+ end
105
141
  end
@@ -2,7 +2,7 @@ require 'nats_messaging/nats_service'
2
2
 
3
3
  module NatsMessaging
4
4
  # Main entry point to expose the functionalities
5
- def self.service
6
- @service ||= NatsService.new
5
+ def self.service(nats_url, stream_name: nil, subjects: [])
6
+ @service ||= NatsService.new(nats_url, stream_name: stream_name, subjects: subjects)
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nats_messaging
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bea Graboloza
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-31 00:00:00.000000000 Z
11
+ date: 2025-02-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A service to send and receive messages on a Rails application using NATS
14
14
  email: beatriz.graboloza@bpo-advisors.net