anycable-rails 1.4.0 → 1.4.2
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 +4 -4
- data/CHANGELOG.md +18 -0
- metadata +10 -58
- data/lib/action_cable/subscription_adapter/any_cable.rb +0 -40
- data/lib/action_cable/subscription_adapter/anycable.rb +0 -10
- data/lib/anycable/rails/action_cable_ext/channel.rb +0 -51
- data/lib/anycable/rails/action_cable_ext/connection.rb +0 -90
- data/lib/anycable/rails/action_cable_ext/remote_connections.rb +0 -13
- data/lib/anycable/rails/channel_state.rb +0 -108
- data/lib/anycable/rails/compatibility/rubocop/config/default.yml +0 -14
- data/lib/anycable/rails/compatibility/rubocop/cops/anycable/instance_vars.rb +0 -50
- data/lib/anycable/rails/compatibility/rubocop/cops/anycable/periodical_timers.rb +0 -29
- data/lib/anycable/rails/compatibility/rubocop/cops/anycable/stream_from.rb +0 -100
- data/lib/anycable/rails/compatibility/rubocop.rb +0 -27
- data/lib/anycable/rails/compatibility.rb +0 -63
- data/lib/anycable/rails/config.rb +0 -19
- data/lib/anycable/rails/connection.rb +0 -211
- data/lib/anycable/rails/connection_factory.rb +0 -44
- data/lib/anycable/rails/connections/persistent_session.rb +0 -40
- data/lib/anycable/rails/connections/serializable_identification.rb +0 -46
- data/lib/anycable/rails/connections/session_proxy.rb +0 -81
- data/lib/anycable/rails/middlewares/executor.rb +0 -31
- data/lib/anycable/rails/middlewares/log_tagging.rb +0 -21
- data/lib/anycable/rails/rack.rb +0 -56
- data/lib/anycable/rails/railtie.rb +0 -92
- data/lib/anycable/rails/version.rb +0 -7
- data/lib/anycable/rails.rb +0 -76
- data/lib/anycable-rails.rb +0 -3
- data/lib/generators/anycable/download/USAGE +0 -14
- data/lib/generators/anycable/download/download_generator.rb +0 -85
- data/lib/generators/anycable/setup/USAGE +0 -2
- data/lib/generators/anycable/setup/setup_generator.rb +0 -300
- data/lib/generators/anycable/setup/templates/Procfile.dev.tt +0 -6
- data/lib/generators/anycable/setup/templates/config/anycable.yml.tt +0 -48
- data/lib/generators/anycable/setup/templates/config/cable.yml.tt +0 -11
- data/lib/generators/anycable/setup/templates/config/initializers/anycable.rb.tt +0 -9
- data/lib/generators/anycable/with_os_helpers.rb +0 -55
@@ -1,92 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "anycable/rails/action_cable_ext/connection"
|
4
|
-
require "anycable/rails/action_cable_ext/channel"
|
5
|
-
require "anycable/rails/action_cable_ext/remote_connections"
|
6
|
-
|
7
|
-
require "anycable/rails/channel_state"
|
8
|
-
require "anycable/rails/connection_factory"
|
9
|
-
|
10
|
-
module AnyCable
|
11
|
-
module Rails
|
12
|
-
class Railtie < ::Rails::Railtie # :nodoc:
|
13
|
-
initializer "anycable.disable_action_cable_mount", after: "action_cable.set_configs" do |app|
|
14
|
-
next unless AnyCable::Rails.enabled?
|
15
|
-
|
16
|
-
app.config.action_cable.mount_path = nil
|
17
|
-
end
|
18
|
-
|
19
|
-
initializer "anycable.logger", after: "action_cable.logger" do |_app|
|
20
|
-
AnyCable.logger = ::ActionCable.server.config.logger
|
21
|
-
|
22
|
-
AnyCable.configure_server do
|
23
|
-
server_logger = AnyCable.logger = ::ActionCable.server.config.logger
|
24
|
-
AnyCable.logger = ActiveSupport::TaggedLogging.new(server_logger) if server_logger.is_a?(::Logger)
|
25
|
-
# Broadcast server logs to STDOUT in development
|
26
|
-
if ::Rails.env.development? &&
|
27
|
-
!ActiveSupport::Logger.logger_outputs_to?(::Rails.logger, $stdout)
|
28
|
-
console = ActiveSupport::Logger.new($stdout)
|
29
|
-
console.formatter = ::Rails.logger.formatter if ::Rails.logger.respond_to?(:formatter)
|
30
|
-
console.level = ::Rails.logger.level if ::Rails.logger.respond_to?(:level)
|
31
|
-
AnyCable.logger.extend(ActiveSupport::Logger.broadcast(console))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# Add tagging middleware
|
36
|
-
if AnyCable.logger.respond_to?(:tagged)
|
37
|
-
require "anycable/rails/middlewares/log_tagging"
|
38
|
-
|
39
|
-
AnyCable.middleware.use(AnyCable::Rails::Middlewares::LogTagging)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
initializer "anycable.executor" do |app|
|
44
|
-
require "anycable/rails/middlewares/executor"
|
45
|
-
# see https://github.com/rails/rails/pull/33469/files
|
46
|
-
executor = app.config.reload_classes_only_on_change ? app.reloader : app.executor
|
47
|
-
AnyCable.middleware.use(AnyCable::Rails::Middlewares::Executor.new(executor))
|
48
|
-
|
49
|
-
if app.executor.respond_to?(:error_reporter)
|
50
|
-
AnyCable.capture_exception do |ex, method, message|
|
51
|
-
::Rails.error.report(ex, handled: false, context: {method: method.to_sym, payload: message})
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
initializer "anycable.connection_factory", after: "action_cable.set_configs" do |app|
|
57
|
-
ActiveSupport.on_load(:action_cable) do
|
58
|
-
app.config.to_prepare do
|
59
|
-
AnyCable.connection_factory = AnyCable::Rails::ConnectionFactory.new
|
60
|
-
end
|
61
|
-
|
62
|
-
if AnyCable.config.persistent_session_enabled?
|
63
|
-
require "anycable/rails/connections/persistent_session"
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
initializer "anycable.routes" do
|
69
|
-
next unless AnyCable::Rails.enabled?
|
70
|
-
|
71
|
-
config.after_initialize do |app|
|
72
|
-
config = AnyCable.config
|
73
|
-
unless config.http_rpc_mount_path.nil?
|
74
|
-
app.routes.prepend do
|
75
|
-
mount AnyCable::HTTRPC::Server.new => config.http_rpc_mount_path, :internal => true
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# Since Rails 6.1
|
82
|
-
if respond_to?(:server)
|
83
|
-
server do
|
84
|
-
next unless AnyCable.config.embedded? && AnyCable::Rails.enabled?
|
85
|
-
|
86
|
-
require "anycable/cli"
|
87
|
-
AnyCable::CLI.embed!
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
data/lib/anycable/rails.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "anycable"
|
4
|
-
require "anycable/rails/version"
|
5
|
-
require "anycable/rails/config"
|
6
|
-
require "anycable/rails/rack"
|
7
|
-
|
8
|
-
require "globalid"
|
9
|
-
|
10
|
-
module AnyCable
|
11
|
-
# Rails handler for AnyCable
|
12
|
-
module Rails
|
13
|
-
require "anycable/rails/railtie"
|
14
|
-
|
15
|
-
ADAPTER_ALIASES = %w[any_cable anycable].freeze
|
16
|
-
|
17
|
-
class << self
|
18
|
-
def enabled?
|
19
|
-
adapter = ::ActionCable.server.config.cable&.fetch("adapter", nil)
|
20
|
-
compatible_adapter?(adapter)
|
21
|
-
end
|
22
|
-
|
23
|
-
def compatible_adapter?(adapter)
|
24
|
-
ADAPTER_ALIASES.include?(adapter)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Serialize connection/channel state variable to string
|
28
|
-
# using GlobalID where possible or JSON (if json: true)
|
29
|
-
def serialize(obj, json: false)
|
30
|
-
obj.try(:to_gid_param) || (json ? obj.to_json : obj)
|
31
|
-
end
|
32
|
-
|
33
|
-
# Deserialize previously serialized value from string to
|
34
|
-
# Ruby object.
|
35
|
-
# If the resulting object is a Hash, make it indifferent
|
36
|
-
def deserialize(str, json: false)
|
37
|
-
str.yield_self do |val|
|
38
|
-
next val unless val.is_a?(String)
|
39
|
-
|
40
|
-
gval = GlobalID::Locator.locate(val)
|
41
|
-
return gval if gval
|
42
|
-
|
43
|
-
next val unless json
|
44
|
-
|
45
|
-
JSON.parse(val)
|
46
|
-
end.yield_self do |val|
|
47
|
-
next val.with_indifferent_access if val.is_a?(Hash)
|
48
|
-
val
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
module Extension
|
53
|
-
def broadcast(channel, payload)
|
54
|
-
super
|
55
|
-
::AnyCable.broadcast(channel, payload)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def extend_adapter!(adapter)
|
60
|
-
adapter.extend(Extension)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Warn if application has been already initialized.
|
67
|
-
# AnyCable should be loaded before initialization in order to work correctly.
|
68
|
-
if defined?(::Rails) && ::Rails.application && ::Rails.application.initialized?
|
69
|
-
puts("\n**************************************************")
|
70
|
-
puts(
|
71
|
-
"⛔️ WARNING: AnyCable loaded after application initialization. Might not work correctly.\n" \
|
72
|
-
"Please, make sure to remove `require: false` in your Gemfile or " \
|
73
|
-
"require manually in `environment.rb` before `Rails.application.initialize!`"
|
74
|
-
)
|
75
|
-
puts("**************************************************\n\n")
|
76
|
-
end
|
data/lib/anycable-rails.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
Description:
|
2
|
-
Install AnyCable-Go web server locally (the latest version by default).
|
3
|
-
|
4
|
-
Example:
|
5
|
-
rails generate anycable:download
|
6
|
-
|
7
|
-
This will ask:
|
8
|
-
Where to store a binary file.
|
9
|
-
This will create:
|
10
|
-
`<bin_path>/anycable-go`.
|
11
|
-
|
12
|
-
rails generate anycable:download --bin-path=/usr/local/bin
|
13
|
-
|
14
|
-
rails generate anycable:download --version=1.0.0
|
@@ -1,85 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "generators/anycable/with_os_helpers"
|
4
|
-
|
5
|
-
module AnyCableRailsGenerators
|
6
|
-
# Downloads anycable-go binary
|
7
|
-
class DownloadGenerator < ::Rails::Generators::Base
|
8
|
-
namespace "anycable:download"
|
9
|
-
|
10
|
-
include WithOSHelpers
|
11
|
-
|
12
|
-
VERSION = "latest"
|
13
|
-
|
14
|
-
class_option :bin_path,
|
15
|
-
type: :string,
|
16
|
-
desc: "Where to download AnyCable-Go server binary (default: #{DEFAULT_BIN_PATH})"
|
17
|
-
class_option :version,
|
18
|
-
type: :string,
|
19
|
-
desc: "Specify the AnyCable-Go version (defaults to latest release)"
|
20
|
-
|
21
|
-
def download_bin
|
22
|
-
out = options[:bin_path] || DEFAULT_BIN_PATH
|
23
|
-
version = options[:version] || VERSION
|
24
|
-
|
25
|
-
download_exe(
|
26
|
-
release_url(version),
|
27
|
-
to: out,
|
28
|
-
file_name: "anycable-go"
|
29
|
-
)
|
30
|
-
|
31
|
-
true
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def release_url(version)
|
37
|
-
return latest_release_url(version) if version == "latest"
|
38
|
-
|
39
|
-
if Gem::Version.new(version).segments.first >= 1
|
40
|
-
new_release_url("v#{version}")
|
41
|
-
else
|
42
|
-
legacy_release_url("v#{version}")
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def legacy_release_url(version)
|
47
|
-
"https://github.com/anycable/anycable-go/releases/download/#{version}/" \
|
48
|
-
"anycable-go-v#{version}-#{os_name}-#{cpu_name}"
|
49
|
-
end
|
50
|
-
|
51
|
-
def new_release_url(version)
|
52
|
-
"https://github.com/anycable/anycable-go/releases/download/#{version}/" \
|
53
|
-
"anycable-go-#{os_name}-#{cpu_name}"
|
54
|
-
end
|
55
|
-
|
56
|
-
def latest_release_url(version)
|
57
|
-
"https://github.com/anycable/anycable-go/releases/latest/download/" \
|
58
|
-
"anycable-go-#{os_name}-#{cpu_name}"
|
59
|
-
end
|
60
|
-
|
61
|
-
def download_exe(url, to:, file_name:)
|
62
|
-
file_path = File.join(to, file_name)
|
63
|
-
|
64
|
-
FileUtils.mkdir_p(to) unless File.directory?(to)
|
65
|
-
|
66
|
-
run "#{sudo(to)}curl -L #{url} -o #{file_path}", abort_on_failure: true
|
67
|
-
run "#{sudo(to)}chmod +x #{file_path}", abort_on_failure: true
|
68
|
-
run "#{file_path} -v", abort_on_failure: true
|
69
|
-
end
|
70
|
-
|
71
|
-
def sudo(path)
|
72
|
-
sudo = ""
|
73
|
-
unless File.writable?(path)
|
74
|
-
if yes? "Path is not writable 😕. Do you have sudo privileges?"
|
75
|
-
sudo = "sudo "
|
76
|
-
else
|
77
|
-
say_status :error, "❌ Failed to install AnyCable-Go WebSocket server", :red
|
78
|
-
raise StandardError, "Path #{path} is not writable!"
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
sudo
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
@@ -1,300 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "generators/anycable/with_os_helpers"
|
4
|
-
|
5
|
-
module AnyCableRailsGenerators
|
6
|
-
# Entry point for interactive installation
|
7
|
-
class SetupGenerator < ::Rails::Generators::Base
|
8
|
-
namespace "anycable:setup"
|
9
|
-
source_root File.expand_path("templates", __dir__)
|
10
|
-
|
11
|
-
DOCS_ROOT = "https://docs.anycable.io"
|
12
|
-
DEVELOPMENT_METHODS = %w[skip local docker].freeze
|
13
|
-
SERVER_SOURCES = %w[skip brew binary].freeze
|
14
|
-
|
15
|
-
class_option :devenv,
|
16
|
-
type: :string,
|
17
|
-
desc: "Select your development environment (options: #{DEVELOPMENT_METHODS.join(", ")})"
|
18
|
-
class_option :source,
|
19
|
-
type: :string,
|
20
|
-
desc: "Choose a way of installing AnyCable-Go server (options: #{SERVER_SOURCES.join(", ")})"
|
21
|
-
class_option :skip_heroku,
|
22
|
-
type: :boolean,
|
23
|
-
desc: "Do not copy Heroku configs"
|
24
|
-
class_option :skip_procfile_dev,
|
25
|
-
type: :boolean,
|
26
|
-
desc: "Do not create Procfile.dev"
|
27
|
-
class_option :skip_jwt,
|
28
|
-
type: :boolean,
|
29
|
-
desc: "Do not install anycable-rails-jwt"
|
30
|
-
class_option :skip_install,
|
31
|
-
type: :boolean,
|
32
|
-
desc: "Do not run bundle install when adding new gems"
|
33
|
-
|
34
|
-
include WithOSHelpers
|
35
|
-
|
36
|
-
class_option :bin_path,
|
37
|
-
type: :string,
|
38
|
-
desc: "Where to download AnyCable-Go server binary (default: #{DEFAULT_BIN_PATH})"
|
39
|
-
class_option :version,
|
40
|
-
type: :string,
|
41
|
-
desc: "Specify the AnyCable-Go version (defaults to latest release)"
|
42
|
-
|
43
|
-
def welcome
|
44
|
-
say "👋 Welcome to AnyCable interactive installer."
|
45
|
-
end
|
46
|
-
|
47
|
-
def configs
|
48
|
-
inside("config") do
|
49
|
-
template "cable.yml"
|
50
|
-
template "anycable.yml"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def cable_url
|
55
|
-
environment(nil, env: :development) do
|
56
|
-
<<~SNIPPET
|
57
|
-
# Specify AnyCable WebSocket server URL to use by JS client
|
58
|
-
config.after_initialize do
|
59
|
-
config.action_cable.url = ActionCable.server.config.url = ENV.fetch("CABLE_URL", "ws://localhost:8080/cable") if AnyCable::Rails.enabled?
|
60
|
-
end
|
61
|
-
SNIPPET
|
62
|
-
end
|
63
|
-
|
64
|
-
environment(nil, env: :production) do
|
65
|
-
<<~SNIPPET
|
66
|
-
# Specify AnyCable WebSocket server URL to use by JS client
|
67
|
-
config.after_initialize do
|
68
|
-
config.action_cable.url = ActionCable.server.config.url = ENV.fetch("CABLE_URL", "/cable") if AnyCable::Rails.enabled?
|
69
|
-
end
|
70
|
-
SNIPPET
|
71
|
-
end
|
72
|
-
|
73
|
-
say_status :info, "✅ 'config.action_cable.url' has been configured"
|
74
|
-
say_status :help, "⚠️ If you're using JS client make sure you have " \
|
75
|
-
"`action_cable_meta_tag` included before any <script> tag in your application.html"
|
76
|
-
end
|
77
|
-
|
78
|
-
def development_method
|
79
|
-
answer = DEVELOPMENT_METHODS.index(options[:devenv]) || 99
|
80
|
-
|
81
|
-
until DEVELOPMENT_METHODS[answer.to_i]
|
82
|
-
answer = ask "Which environment do you use for development? (1) Local, (2) Docker, (0) Skip"
|
83
|
-
end
|
84
|
-
|
85
|
-
case env = DEVELOPMENT_METHODS[answer.to_i]
|
86
|
-
when "skip"
|
87
|
-
say_status :help, "⚠️ Please, read this guide on how to install AnyCable-Go server 👉 #{DOCS_ROOT}/anycable-go/getting_started", :yellow
|
88
|
-
else
|
89
|
-
send "install_for_#{env}"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def heroku
|
94
|
-
if options[:skip_heroku].nil?
|
95
|
-
return unless yes? "Do you use Heroku for deployment? [Yn]"
|
96
|
-
elsif options[:skip_heroku]
|
97
|
-
return
|
98
|
-
end
|
99
|
-
|
100
|
-
in_root do
|
101
|
-
next unless File.file?("Procfile")
|
102
|
-
|
103
|
-
contents = File.read("Procfile")
|
104
|
-
contents.sub!(/^web: (.*)$/, %q(web: [[ "$ANYCABLE_DEPLOYMENT" == "true" ]] && bundle exec anycable --server-command="anycable-go" || \1))
|
105
|
-
File.write("Procfile", contents)
|
106
|
-
say_status :info, "✅ Procfile updated"
|
107
|
-
end
|
108
|
-
|
109
|
-
say_status :help, "️️⚠️ Please, read the required steps to configure Heroku applications 👉 #{DOCS_ROOT}/deployment/heroku", :yellow
|
110
|
-
end
|
111
|
-
|
112
|
-
def devise
|
113
|
-
in_root do
|
114
|
-
return unless File.file?("config/initializers/devise.rb")
|
115
|
-
end
|
116
|
-
|
117
|
-
inside("config/initializers") do
|
118
|
-
template "anycable.rb"
|
119
|
-
end
|
120
|
-
|
121
|
-
say_status :info, "✅ config/initializers/anycable.rb with Devise configuration has been added"
|
122
|
-
end
|
123
|
-
|
124
|
-
def stimulus_reflex
|
125
|
-
return unless stimulus_reflex?
|
126
|
-
|
127
|
-
say_status :help, "⚠️ Please, check out the documentation on using AnyCable with Stimulus Reflex: #{DOCS_ROOT}/rails/stimulus_reflex"
|
128
|
-
end
|
129
|
-
|
130
|
-
def rubocop_compatibility
|
131
|
-
return unless rubocop?
|
132
|
-
|
133
|
-
say_status :info, "🤖 Running static compatibility checks with RuboCop"
|
134
|
-
res = run "bundle exec rubocop -r 'anycable/rails/compatibility/rubocop' --only AnyCable/InstanceVars,AnyCable/PeriodicalTimers,AnyCable/InstanceVars"
|
135
|
-
say_status :help, "⚠️ Please, take a look at the icompatibilities above and fix them. See #{DOCS_ROOT}/rails/compatibility" unless res
|
136
|
-
end
|
137
|
-
|
138
|
-
def jwt
|
139
|
-
return if options[:skip_jwt]
|
140
|
-
|
141
|
-
return unless options[:skip_jwt] == false || yes?("Do you want to use JWT for authentication? [Yn]")
|
142
|
-
|
143
|
-
opts = " --skip-install" if options[:skip_install]
|
144
|
-
|
145
|
-
run "bundle add anycable-rails-jwt#{opts}"
|
146
|
-
end
|
147
|
-
|
148
|
-
def finish
|
149
|
-
say_status :info, "✅ AnyCable has been configured successfully!"
|
150
|
-
end
|
151
|
-
|
152
|
-
private
|
153
|
-
|
154
|
-
def stimulus_reflex?
|
155
|
-
!!gemfile_lock&.match?(/^\s+stimulus_reflex\b/)
|
156
|
-
end
|
157
|
-
|
158
|
-
def redis?
|
159
|
-
!!gemfile_lock&.match?(/^\s+redis\b/)
|
160
|
-
end
|
161
|
-
|
162
|
-
def nats?
|
163
|
-
!!gemfile_lock&.match?(/^\s+nats-pure\b/)
|
164
|
-
end
|
165
|
-
|
166
|
-
def webpacker?
|
167
|
-
!!gemfile_lock&.match?(/^\s+webpacker\b/)
|
168
|
-
end
|
169
|
-
|
170
|
-
def rubocop?
|
171
|
-
!!gemfile_lock&.match?(/^\s+rubocop\b/)
|
172
|
-
end
|
173
|
-
|
174
|
-
def gemfile_lock
|
175
|
-
@gemfile_lock ||= begin
|
176
|
-
res = nil
|
177
|
-
in_root do
|
178
|
-
next unless File.file?("Gemfile.lock")
|
179
|
-
res = File.read("Gemfile.lock")
|
180
|
-
end
|
181
|
-
res
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def install_for_docker
|
186
|
-
# Remove localhost from configuraiton
|
187
|
-
gsub_file "config/anycable.yml", /^.*redis_url:.*localhost[^\n]+\n/, ""
|
188
|
-
|
189
|
-
say_status :help, "️️⚠️ Docker development configuration could vary", :yellow
|
190
|
-
|
191
|
-
say "Here is an example snippet for docker-compose.yml:"
|
192
|
-
say <<~YML
|
193
|
-
─────────────────────────────────────────
|
194
|
-
ws:
|
195
|
-
image: anycable/anycable-go:1.2
|
196
|
-
ports:
|
197
|
-
- '8080:8080'
|
198
|
-
environment:
|
199
|
-
ANYCABLE_HOST: "0.0.0.0"
|
200
|
-
ANYCABLE_REDIS_URL: redis://redis:6379/0
|
201
|
-
ANYCABLE_RPC_HOST: anycable:50051
|
202
|
-
ANYCABLE_DEBUG: 1
|
203
|
-
depends_on:
|
204
|
-
redis:
|
205
|
-
condition: service_healthy
|
206
|
-
|
207
|
-
anycable:
|
208
|
-
<<: *backend
|
209
|
-
command: bundle exec anycable
|
210
|
-
environment:
|
211
|
-
<<: *backend_environment
|
212
|
-
ANYCABLE_REDIS_URL: redis://redis:6379/0
|
213
|
-
ANYCABLE_RPC_HOST: 0.0.0.0:50051
|
214
|
-
ANYCABLE_DEBUG: 1
|
215
|
-
ports:
|
216
|
-
- '50051'
|
217
|
-
depends_on:
|
218
|
-
<<: *backend_depends_on
|
219
|
-
ws:
|
220
|
-
condition: service_started
|
221
|
-
─────────────────────────────────────────
|
222
|
-
YML
|
223
|
-
end
|
224
|
-
|
225
|
-
def install_for_local
|
226
|
-
install_server
|
227
|
-
template_proc_files
|
228
|
-
end
|
229
|
-
|
230
|
-
def install_server
|
231
|
-
answer = SERVER_SOURCES.index(options[:source]) || 99
|
232
|
-
|
233
|
-
until SERVER_SOURCES[answer.to_i]
|
234
|
-
answer = ask "How do you want to install AnyCable-Go WebSocket server? (1) Homebrew, (2) Download binary, (0) Skip"
|
235
|
-
end
|
236
|
-
|
237
|
-
case answer.to_i
|
238
|
-
when 0
|
239
|
-
say_status :help, "⚠️ Please, read this guide on how to install AnyCable-Go server 👉 #{DOCS_ROOT}/anycable-go/getting_started", :yellow
|
240
|
-
return
|
241
|
-
else
|
242
|
-
return unless send("install_from_#{SERVER_SOURCES[answer.to_i]}")
|
243
|
-
end
|
244
|
-
|
245
|
-
say_status :info, "✅ AnyCable-Go WebSocket server has been successfully installed"
|
246
|
-
end
|
247
|
-
|
248
|
-
def template_proc_files
|
249
|
-
file_name = "Procfile.dev"
|
250
|
-
|
251
|
-
if file_exists?(file_name)
|
252
|
-
append_file file_name, "anycable: bundle exec anycable\nws: anycable-go#{anycable_go_options}", force: true
|
253
|
-
else
|
254
|
-
say_status :help, "💡 We recommend using Hivemind to manage multiple processes in development 👉 https://github.com/DarthSim/hivemind", :yellow
|
255
|
-
|
256
|
-
if options[:skip_procfile_dev].nil?
|
257
|
-
return unless yes? "Do you want to create a '#{file_name}' file?"
|
258
|
-
elsif options[:skip_procfile_dev]
|
259
|
-
return
|
260
|
-
end
|
261
|
-
|
262
|
-
template file_name
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
def install_from_brew
|
267
|
-
run "brew install anycable-go", abort_on_failure: true
|
268
|
-
run "anycable-go -v", abort_on_failure: true
|
269
|
-
end
|
270
|
-
|
271
|
-
def install_from_binary
|
272
|
-
bin_path ||= DEFAULT_BIN_PATH if options[:devenv] # User don't want interactive mode
|
273
|
-
bin_path ||= ask "Please, enter the path to download the AnyCable-Go binary to", default: DEFAULT_BIN_PATH, path: true
|
274
|
-
|
275
|
-
generate "anycable:download", download_options(bin_path: bin_path)
|
276
|
-
|
277
|
-
true
|
278
|
-
end
|
279
|
-
|
280
|
-
def download_options(**params)
|
281
|
-
opts = options.merge(params)
|
282
|
-
[].tap do |args|
|
283
|
-
args << "--os #{opts[:os]}" if opts[:os]
|
284
|
-
args << "--cpu #{opts[:cpu]}" if opts[:cpu]
|
285
|
-
args << "--bin-path=#{opts[:bin_path]}" if opts[:bin_path]
|
286
|
-
args << "--version #{opts[:version]}" if opts[:version]
|
287
|
-
end.join(" ")
|
288
|
-
end
|
289
|
-
|
290
|
-
def anycable_go_options
|
291
|
-
redis? ? " --port=8080" : " --port=8080 --broadcast_adapter=http"
|
292
|
-
end
|
293
|
-
|
294
|
-
def file_exists?(name)
|
295
|
-
in_root do
|
296
|
-
return File.file?(name)
|
297
|
-
end
|
298
|
-
end
|
299
|
-
end
|
300
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# This file contains per-environment settings for AnyCable.
|
2
|
-
#
|
3
|
-
# Since AnyCable config is based on anyway_config (https://github.com/palkan/anyway_config), all AnyCable settings
|
4
|
-
# can be set or overridden through the corresponding environment variables.
|
5
|
-
# E.g., `rpc_host` is overridden by ANYCABLE_RPC_HOST, `debug` by ANYCABLE_DEBUG etc.
|
6
|
-
#
|
7
|
-
# Note that AnyCable recognizes REDIS_URL env variable for Redis pub/sub adapter. If you want to
|
8
|
-
# use another Redis instance for AnyCable, provide ANYCABLE_REDIS_URL variable.
|
9
|
-
#
|
10
|
-
# Read more about AnyCable configuration here: <%= DOCS_ROOT %>/ruby/configuration
|
11
|
-
#
|
12
|
-
default: &default
|
13
|
-
# Turn on/off access logs ("Started..." and "Finished...")
|
14
|
-
access_logs_disabled: false
|
15
|
-
# Whether to enable gRPC level logging or not
|
16
|
-
log_grpc: false
|
17
|
-
<%- if redis? -%>
|
18
|
-
# Use Redis to broadcast messages to AnyCable server
|
19
|
-
broadcast_adapter: redis
|
20
|
-
<%- elsif nats? -%>
|
21
|
-
# Use NATS to broadcast messages to AnyCable server
|
22
|
-
broadcast_adapter: nats
|
23
|
-
<%- else -%>
|
24
|
-
# Use HTTP adapter for a quick start (since redis gem is not present in the project)
|
25
|
-
broadcast_adapter: http
|
26
|
-
<%- end -%>
|
27
|
-
# Use the same channel name for WebSocket server, e.g.:
|
28
|
-
# $ anycable-go --redis_channel="__anycable__"
|
29
|
-
redis_channel: "__anycable__"
|
30
|
-
<%- if redis? -%>
|
31
|
-
# You can use REDIS_URL env var to configure Redis URL.
|
32
|
-
# Localhost is used by default.
|
33
|
-
# redis_url: "redis://localhost:6379/1"
|
34
|
-
<%- end -%>
|
35
|
-
|
36
|
-
development:
|
37
|
-
<<: *default
|
38
|
-
|
39
|
-
test:
|
40
|
-
<<: *default
|
41
|
-
|
42
|
-
production:
|
43
|
-
<<: *default
|
44
|
-
<%- if !redis? && !nats? -%>
|
45
|
-
# Use Redis or NATS in production
|
46
|
-
broadcast_adapter: redis
|
47
|
-
# broadcast_adapter: nats
|
48
|
-
<%- end -%>
|
@@ -1,11 +0,0 @@
|
|
1
|
-
# Make it possible to switch adapters by passing the ACTION_CABLE_ADAPTER env variable.
|
2
|
-
# For example, you can use it fallback to the standard Action Cable in staging/review
|
3
|
-
# environments (by setting `ACTION_CABLE_ADAPTER=redis`).
|
4
|
-
development:
|
5
|
-
adapter: <%%= ENV.fetch("ACTION_CABLE_ADAPTER", "any_cable") %>
|
6
|
-
|
7
|
-
test:
|
8
|
-
adapter: test
|
9
|
-
|
10
|
-
production:
|
11
|
-
adapter: <%%= ENV.fetch("ACTION_CABLE_ADAPTER", "any_cable") %>
|
@@ -1,9 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Add Warden middleware to AnyCable stack to allow accessing
|
4
|
-
# Devise current user via `env["warden"].user`.
|
5
|
-
#
|
6
|
-
# See <%= DOCS_ROOT %>/ruby/authentication
|
7
|
-
AnyCable::Rails::Rack.middleware.use Warden::Manager do |config|
|
8
|
-
Devise.warden_config = config
|
9
|
-
end
|