actioncable_nats_adapter 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 57974d22efe8e7f98ff01e1db48094c86b294eccaf9909f17e914d5e280c4f90
4
+ data.tar.gz: 8184da81e7d233c9f741880e941e2c0c86a51753c1e29db9d608aba7e7f4c1f2
5
+ SHA512:
6
+ metadata.gz: 722a6bbaff38f85d9be69930c5ab8713eea6a4b04b791cdd9479d94f1e75be98691400c2ed4ea63373e72de858b260eca342eeab45a19bc3193e5291fce05582
7
+ data.tar.gz: 7678d76a28bacac4f78deac68f81b834284f2109162d36ec9c81b77189fb855ad90ffb162aa4a59e186ca5775d772596922c0ecde99fc84cb553dc067037b2a6
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # ActioncableNatsAdapter
2
+
3
+ Use this as a subscription adapter in Rails 6+ with NATs.
4
+
5
+ ## Installation
6
+
7
+ Add to your Gemfile:
8
+
9
+ ```bash
10
+ bundle add actioncable_nats_adapter
11
+ ```
12
+
13
+ TODO: publish action_cable_nats to rubygems.org
14
+
15
+
16
+ ## Usage
17
+
18
+ Set the `config/cable.yaml` adapter to nats.
19
+
20
+ Example:
21
+
22
+ ```yaml
23
+ development:
24
+ adapter: nats
25
+ url: "nats://127.0.0.1:4222"
26
+
27
+ test:
28
+ adapter: test
29
+
30
+ production:
31
+ adapter: nats
32
+ channel_prefix: natscable_production
33
+ url: <%= ENV.fetch("NATS_URL") { "nats://127.0.0.1:4222" } %>
34
+
35
+ ```
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: %i[]
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ gem 'nats-pure'
4
+ require 'nats/client'
5
+ require 'action_cable'
6
+
7
+ module ActionCable
8
+ module SubscriptionAdapter
9
+ class Nats < Inline # :nodoc:
10
+ prepend ChannelPrefix
11
+
12
+ def initialize(server)
13
+ super
14
+ nconf = server.config.cable.deep_symbolize_keys
15
+ @nats_conn = ::NATS.connect(nconf[:url], nconf[:cluster] || {})
16
+ @nats_conn.on_error do |e|
17
+ @logger.error "NATS Error: #{e}"
18
+ end
19
+
20
+ @nats_conn.on_reconnect do
21
+ @logger.info "NATS Reconnected to server at #{@nats_conn.connected_server}"
22
+ end
23
+
24
+ @nats_conn.on_disconnect do
25
+ @logger.warn "NATS Disconnected"
26
+ end
27
+
28
+ @nats_conn.on_close do
29
+ @logger.info "NATS connection close"
30
+ end
31
+ end
32
+
33
+ def broadcast(channel, payload)
34
+ @nats_conn.publish(channel, payload)
35
+ end
36
+
37
+ class Listener < SubscriberMap # :nodoc:
38
+ def initialize(nats_conn)
39
+ super()
40
+ @nats_conn = nats_conn
41
+ @nats_subs = {}
42
+ end
43
+
44
+ def add_channel(channel, on_success)
45
+ @nats_subs[channel] = @nats_conn.subscribe(channel) do |msg|
46
+ broadcast(channel, msg.data)
47
+ end
48
+ super
49
+ end
50
+
51
+ def remove_channel(channel)
52
+ @nats_subs[channel].unsubscribe
53
+ super
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ # Returns the channel name, including channel_prefix specified in cable.yml
60
+ def channel_with_prefix(channel)
61
+ [@server.config.cable[:channel_prefix], channel].compact.join('.')
62
+ end
63
+
64
+ def new_subscriber_map
65
+ Listener.new(@nats_conn)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActioncableNatsAdapter
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'actioncable_nats_adapter/version'
4
+
5
+ module ActioncableNatsAdapter
6
+ class Error < StandardError; end
7
+ end
@@ -0,0 +1,4 @@
1
+ module ActioncableNatsAdapter
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: actioncable_nats_adapter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Grant Gongaware
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nats-pure
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: actioncable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '6'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '6'
55
+ description: Use nats.io as the pub/sub backend for ActionCable
56
+ email:
57
+ - grant@telmate.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - README.md
63
+ - Rakefile
64
+ - lib/action_cable/subscription_adapter/nats.rb
65
+ - lib/actioncable_nats_adapter.rb
66
+ - lib/actioncable_nats_adapter/version.rb
67
+ - sig/actioncable_nats_adapter.rbs
68
+ homepage: https://github.com/telmate/actioncable_nats_adapter
69
+ licenses: []
70
+ metadata:
71
+ homepage_uri: https://github.com/telmate/actioncable_nats_adapter
72
+ source_code_uri: https://github.com/telmate/actioncable_nats_adapter
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 2.6.0
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 3.0.9
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: ActionCable subscription adapter in Rails 6+ with NATs.
92
+ test_files: []