nats_service 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9f380f8f65520f974f16cd742b3eb7ac2ad0a17ab684971f8e42a1320e32c570
4
+ data.tar.gz: 20e3d310ea24473b0d8dd1729dda870184137f8536b3f9424aacecd49c6f4dc6
5
+ SHA512:
6
+ metadata.gz: b606638a3f19109ea3730a459205bfcebb296312f87dcd44ecbe1cdd452b4413faeee5f2c69a050ed59191dc2a1b32404c9cdff826076e40bc6da9694e7d1c2c
7
+ data.tar.gz: 7dd44e5eabaaa20639aa83a79eef7e3840389de5947ad167b5d2d38d1b8013a11d140a9980e224bc3a24c247c73a893197ddacce63d479742f85c7962b8ef34b
@@ -0,0 +1,55 @@
1
+ class NatsController < ApplicationController
2
+
3
+ def index
4
+ @durable = false # Default value for the toggle
5
+ end
6
+
7
+ def publish_message
8
+ subject = params[:subject]
9
+ message = params[:message]
10
+
11
+ nats_service = Rails.application.config.nats_service
12
+ nats_service.publish_message(subject, message)
13
+
14
+ flash[:notice] = "Message published to #{subject}."
15
+ redirect_to root_path
16
+ end
17
+
18
+ def subscribe_to_subject
19
+ subject = params[:subject]
20
+
21
+ nats_service = Rails.application.config.nats_service
22
+ nats_service.subscribe_to_subject(subject, "durable_#{subject}")
23
+
24
+ flash[:notice] = "Subscribed to #{subject}"
25
+ Rails.logger.info "Suscribed to #{subject}"
26
+ redirect_to root_path
27
+ end
28
+
29
+ def send_request
30
+ subject = params[:subject]
31
+ message = params[:message]
32
+
33
+ nats_service = NatsService.new
34
+ reply = nats_service.send_request(subject, message)
35
+
36
+ if reply
37
+ flash[:notice] = "Reply received: #{reply}"
38
+ else
39
+ flash[:alert] = "No reply received for subject: #{subject}"
40
+ end
41
+
42
+ redirect_to root_path
43
+ end
44
+
45
+ def listen_and_reply
46
+ subject = params[:subject]
47
+ reply_message = params[:reply_message]
48
+
49
+ nats_service = Rails.application.config.nats_service
50
+ nats_service.listen_and_reply(subject, reply_message)
51
+
52
+ flash[:notice] = "Listening for requests on #{subject} and replying with '#{reply_message}'"
53
+ redirect_to root_path
54
+ end
55
+ end
@@ -0,0 +1,88 @@
1
+ require 'nats/io/client'
2
+
3
+ class NatsService
4
+ def initialize
5
+ @nats = NATS.connect("nats://localhost:4222")
6
+ @js = @nats.jetstream
7
+ create_stream("default_stream")
8
+ Rails.logger.info "NATS Service initialized keyword ecm"
9
+ @subscriptions = {} # Almacenamos las suscripciones activas
10
+ end
11
+
12
+ # Create a stream
13
+ def create_stream(stream_name)
14
+ begin
15
+ stream = @js.stream_info(stream_name)
16
+ Rails.logger.info "Stream '#{stream_name}' already exists"
17
+ rescue NATS::JetStream::Error::NotFound
18
+ @js.add_stream(name: stream_name, subjects: ["subject1", "subject2"])
19
+ Rails.logger.info "Stream '#{stream_name}' created"
20
+ rescue => e
21
+ Rails.logger.error "Failed to create stream: #{e.message}"
22
+ end
23
+ end
24
+
25
+ # Publish a message to a subject
26
+ def publish_message(subject, message)
27
+ Rails.logger.info "keyword #{@nats.connected_server}"
28
+ begin
29
+ ack = @js.publish(subject, message)
30
+ Rails.logger.info "Message sent to #{subject}: #{message}, ACK: #{ack.inspect}"
31
+ rescue JSON::ParserError => e
32
+ Rails.logger.error "Error parsing response: #{e.message}"
33
+ rescue => e
34
+ Rails.logger.error "Unexpected error: #{e.message}"
35
+ end
36
+ end
37
+
38
+ def subscribe_to_subject(subject, durable_name = "durable_name")
39
+ Rails.logger.info "keyword #{@nats.connected_server}"
40
+ @js.subscribe(subject, durable: durable_name) do |msg|
41
+ Rails.logger.info "Message received on #{subject}: #{msg.data}"
42
+ msg.ack
43
+ end
44
+ end
45
+
46
+ # Método para enviar una solicitud
47
+ def send_request(subject, message)
48
+ begin
49
+ response = @nats.request(subject, message, timeout: 5) # Timeout de 5 segundos
50
+ Rails.logger.info "Received reply: #{response.data}"
51
+ response.data
52
+ rescue NATS::IO::Timeout
53
+ Rails.logger.error "Request timed out for subject: #{subject}"
54
+ nil
55
+ rescue => e
56
+ Rails.logger.error "Unexpected error: #{e.message}"
57
+ nil
58
+ end
59
+ end
60
+
61
+ # Método para responder a solicitudes
62
+ def listen_and_reply(subject, reply_message)
63
+ # Cancelamos la suscripción activa si ya existe para este subject
64
+ if @subscriptions[subject]
65
+ @subscriptions[subject].unsubscribe
66
+ Rails.logger.info "Unsubscribed from #{subject}"
67
+ end
68
+ Rails.logger.info "keyword ecm #{@subscriptions[subject].inspect}"
69
+
70
+ begin
71
+ # Creamos una nueva suscripción
72
+ Rails.logger.info "Suscribing a #{subject}"
73
+ subscription = @nats.subscribe(subject) do |msg|
74
+ Rails.logger.info "Request received on #{subject}: #{msg.data}"
75
+ msg.respond(reply_message)
76
+ Rails.logger.info "Replied to #{subject} with message: #{reply_message}"
77
+ end
78
+ rescue => e
79
+ Rails.logger.error "Error while replying: #{e.message}"
80
+ end
81
+
82
+ # Guardamos la nueva suscripción en el hash
83
+ @subscriptions[subject] = subscription
84
+ Rails.logger.info "Stored subscription for #{subject}: #{@subscriptions[subject].inspect}"
85
+ Rails.logger.info "Listening on #{subject} with reply message: #{reply_message}"
86
+ end
87
+
88
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nats_service
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Bea Graboloza
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-12-16 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A service to send and receive messages on a Rails application using NATS
14
+ email: beatriz.graboloza@bpo-advisors.net
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/nats_service.rb
20
+ - lib/nats_service/nats_controller.rb
21
+ homepage: https://rubygems.org/gems/nats_service
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.0.9
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: a NATS service
44
+ test_files: []