nats_messaging 0.1.7 → 1.0.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: a3e8eef7b8b10d8b83e5ce8a0236def7eb58d9d99325e2c2d64871554c470c0c
4
- data.tar.gz: 443547eff24fbbf7381e0bc9234bc56531e97bc10052b227d3372cc0f4ae7825
3
+ metadata.gz: e63689a8e27b2c36f01a7ecb7fb5f46fe61ca174666a98af7b6ce7ca594eb952
4
+ data.tar.gz: 44dbfbea1f01c068ff64d26bf0741d926271c03f5f057d2f54c62eda5d9dd78f
5
5
  SHA512:
6
- metadata.gz: bfd3f40b4eb214e167bf528718a8dbc8cb0c8d29e3ccb2281d6152e486a8f8dff9a3ecd67d42f7eeab4605b5947f77318f039cfb63ece5bca9f31d0e4e20773a
7
- data.tar.gz: c3e5d781c9941f53c66185cb5738d66a4707bc42ef105896c09239ba4f058129cb17b4d38539774847773753eadecb71bd80a3850e4de0d506a343905862fa96
6
+ metadata.gz: 03fceb9b443cc5e94086757a2c4e6b53ff68aaf9aea3ce1f207e91553b85a24108573a1178be7b7e708cd872009014bdccc0f2b107acbf0013aad0fe56fecd62
7
+ data.tar.gz: e8bb0c6130aac20266b96dbcde5d01ee7f08ac10864addabedc84c61d713873369d7ef12b7d391d8d64a7f9dab95ee8df1a67753ceccb9220df0c50afbf195f6
@@ -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,53 @@ 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}"
34
49
  end
35
50
  end
36
51
 
37
52
  # Subscribe to a subject using MessagePack
38
53
  def subscribe_to_subject(subject, durable_name = "durable_name")
39
54
  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
55
+
56
+ if @js
57
+ subscription = @js.subscribe(subject, durable: durable_name) do |msg|
58
+ process_received_message(msg, subject)
59
+ end
60
+ else
61
+ subscription = @nats.subscribe(subject) do |msg|
62
+ process_received_message(msg, subject)
63
+ end
64
+ end
65
+
66
+ @subscriptions[subject] = subscription
67
+ end
68
+
69
+ # Process received message
70
+ def process_received_message(msg, subject)
71
+ begin
72
+ unpacked_data = MessagePack.unpack(msg.data)
73
+ puts "NATS: Message received on #{subject}: #{unpacked_data}"
74
+ msg.ack if msg.respond_to?(:ack)
75
+ unpacked_data
76
+ rescue => e
77
+ puts "NATS: Error while processing message: #{e.message}"
49
78
  end
50
79
  end
51
80
 
@@ -77,20 +106,8 @@ module NatsMessaging
77
106
  # Create a new subscription
78
107
  puts "NATS: Suscribing to #{subject}"
79
108
  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
109
+ process_reply(msg, subject, reply_message)
110
+
94
111
  end
95
112
  rescue => e
96
113
  puts "NATS: Error while replying: #{e.message}"
@@ -102,4 +119,22 @@ module NatsMessaging
102
119
  puts "NATS: Listening on #{subject} with reply message: #{reply_message}"
103
120
  end
104
121
  end
122
+
123
+ # Process and reply a message received
124
+ def process_reply(msg, subject, reply_message)
125
+ begin
126
+ unpacked_data = MessagePack.unpack(msg.data) # Deserializar mensaje recibido
127
+ puts "NATS: Received request on #{subject}: #{received_data}"
128
+ packed_reply = reply_message.to_msgpack # Serializar respuesta
129
+ # Asegurar que msg.reply existe antes de responder
130
+ if msg.reply
131
+ @nats.publish(msg.reply, packed_reply)
132
+ puts "NATS: Replied to #{subject} with message: #{reply_message} new"
133
+ else
134
+ puts "NATS: No reply subject for #{subject}, cannot respond"
135
+ end
136
+ rescue => e
137
+ puts "NATS: Error while processing message: #{e.message}"
138
+ end
139
+ end
105
140
  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.0
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