anycable-rails 0.5.5 → 0.6.0.rc1
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/.github/ISSUE_TEMPLATE.md +29 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +31 -0
- data/.rubocop.yml +24 -34
- data/CHANGELOG.md +31 -1
- data/README.md +47 -92
- data/Rakefile +7 -2
- data/anycable-rails.gemspec +3 -3
- data/lib/action_cable/subscription_adapter/any_cable.rb +23 -0
- data/lib/anycable/rails.rb +4 -4
- data/lib/anycable/rails/actioncable/channel.rb +8 -4
- data/lib/anycable/rails/actioncable/connection.rb +57 -23
- data/lib/anycable/rails/compatibility.rb +57 -0
- data/lib/anycable/rails/compatibility/rubocop.rb +28 -0
- data/lib/anycable/rails/compatibility/rubocop/config/default.yml +12 -0
- data/lib/anycable/rails/compatibility/rubocop/cops/anycable/instance_vars.rb +50 -0
- data/lib/anycable/rails/compatibility/rubocop/cops/anycable/periodical_timers.rb +29 -0
- data/lib/anycable/rails/compatibility/rubocop/cops/anycable/remote_disconnect.rb +31 -0
- data/lib/anycable/rails/compatibility/rubocop/cops/anycable/stream_from.rb +100 -0
- data/lib/anycable/rails/config.rb +3 -2
- data/lib/anycable/rails/middlewares/executor.rb +21 -0
- data/lib/anycable/rails/middlewares/log_tagging.rb +21 -0
- data/lib/anycable/rails/railtie.rb +20 -27
- data/lib/anycable/rails/refinements/subscriptions.rb +1 -1
- data/lib/anycable/rails/version.rb +2 -2
- metadata +25 -19
- data/lib/anycable/rails/actioncable/server.rb +0 -14
- data/lib/anycable/rails/activerecord/release_connection.rb +0 -29
- data/lib/generators/anycable/USAGE +0 -7
- data/lib/generators/anycable/anycable_generator.rb +0 -16
- data/lib/generators/anycable/templates/anycable.yml +0 -41
- data/lib/generators/anycable/templates/script +0 -6
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Extend
|
3
|
+
# Extend AnyCable configuration with
|
4
4
|
# `access_logs_disabled` options (defaults to true)
|
5
|
-
|
5
|
+
AnyCable::Config.attr_config access_logs_disabled: true
|
6
|
+
AnyCable::Config.ignore_options :access_logs_disabled
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnyCable
|
4
|
+
module Rails
|
5
|
+
module Middlewares
|
6
|
+
# Executor runs Rails executor for each call
|
7
|
+
# See https://guides.rubyonrails.org/v5.2.0/threading_and_code_execution.html#framework-behavior
|
8
|
+
class Executor < AnyCable::Middleware
|
9
|
+
attr_reader :executor
|
10
|
+
|
11
|
+
def initialize(executor)
|
12
|
+
@executor = executor
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(*)
|
16
|
+
executor.wrap { yield }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnyCable
|
4
|
+
module Rails
|
5
|
+
module Middlewares
|
6
|
+
# Middleware to add `sid` (session ID) tag to logs.
|
7
|
+
#
|
8
|
+
# Session ID could be provided through gRPC metadata `sid` key.
|
9
|
+
#
|
10
|
+
# See https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md
|
11
|
+
class LogTagging < AnyCable::Middleware
|
12
|
+
def call(_request, call, _method)
|
13
|
+
sid = call.metadata["sid"]
|
14
|
+
return yield unless sid
|
15
|
+
|
16
|
+
AnyCable.logger.tagged("AnyCable sid=#{sid}") { yield }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,31 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module
|
3
|
+
module AnyCable
|
4
4
|
module Rails
|
5
|
-
# Use this proxy to quack like a TaggedLoggerProxy
|
6
|
-
class LoggerProxy
|
7
|
-
def initialize(logger)
|
8
|
-
@logger = logger
|
9
|
-
end
|
10
|
-
|
11
|
-
def add_tags(*_tags)
|
12
|
-
@logger.warn "Tagged logger is not supported by AnyCable. Skip"
|
13
|
-
end
|
14
|
-
|
15
|
-
%i[debug info warn error fatal unknown].each do |severity|
|
16
|
-
define_method(severity) do |message|
|
17
|
-
@logger.send severity, message
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
5
|
class Railtie < ::Rails::Railtie # :nodoc:
|
23
|
-
initializer "anycable.disable_action_cable_mount",
|
6
|
+
initializer "anycable.disable_action_cable_mount", after: "action_cable.set_configs" do |app|
|
7
|
+
# Disable Action Cable when AnyCable adapter is used
|
8
|
+
next unless ::ActionCable.server.config.cable&.fetch("adapter", nil) == "any_cable"
|
9
|
+
|
24
10
|
app.config.action_cable.mount_path = nil
|
25
11
|
end
|
26
12
|
|
27
|
-
initializer "anycable.logger", after:
|
28
|
-
|
13
|
+
initializer "anycable.logger", after: "action_cable.logger" do |_app|
|
14
|
+
AnyCable.logger = ActiveSupport::TaggedLogging.new(::ActionCable.server.config.logger)
|
29
15
|
|
30
16
|
# Broadcast logs to STDOUT in development
|
31
17
|
if ::Rails.env.development? &&
|
@@ -36,18 +22,25 @@ module Anycable
|
|
36
22
|
console.level = ::Rails.logger.level
|
37
23
|
::Rails.logger.extend(ActiveSupport::Logger.broadcast(console))
|
38
24
|
end
|
39
|
-
end
|
40
25
|
|
41
|
-
|
42
|
-
|
43
|
-
require "anycable/rails/
|
44
|
-
|
26
|
+
# Add tagging middleware
|
27
|
+
if AnyCable.logger.respond_to?(:tagged)
|
28
|
+
require "anycable/rails/middlewares/log_tagging"
|
29
|
+
|
30
|
+
AnyCable.middleware.use(AnyCable::Rails::Middlewares::LogTagging)
|
45
31
|
end
|
46
32
|
end
|
47
33
|
|
34
|
+
initializer "anycable.executor" do |app|
|
35
|
+
require "anycable/rails/middlewares/executor"
|
36
|
+
# see https://github.com/rails/rails/pull/33469/files
|
37
|
+
executor = app.config.reload_classes_only_on_change ? app.reloader : app.executor
|
38
|
+
AnyCable.middleware.use(AnyCable::Rails::Middlewares::Executor.new(executor))
|
39
|
+
end
|
40
|
+
|
48
41
|
initializer "anycable.connection_factory", after: "action_cable.set_configs" do |_app|
|
49
42
|
ActiveSupport.on_load(:action_cable) do
|
50
|
-
|
43
|
+
AnyCable.connection_factory = connection_class.call
|
51
44
|
end
|
52
45
|
end
|
53
46
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anycable-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: anycable
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.6.0.rc1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.6.0.rc1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,19 +81,19 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.4'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: sqlite3
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: simplecov
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,6 +143,8 @@ executables: []
|
|
143
143
|
extensions: []
|
144
144
|
extra_rdoc_files: []
|
145
145
|
files:
|
146
|
+
- ".github/ISSUE_TEMPLATE.md"
|
147
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
146
148
|
- ".gitignore"
|
147
149
|
- ".hound.yml"
|
148
150
|
- ".rubocop.yml"
|
@@ -158,20 +160,24 @@ files:
|
|
158
160
|
- circle.yml
|
159
161
|
- gemfiles/rails5.gemfile
|
160
162
|
- gemfiles/railsmaster.gemfile
|
163
|
+
- lib/action_cable/subscription_adapter/any_cable.rb
|
161
164
|
- lib/anycable-rails.rb
|
162
165
|
- lib/anycable/rails.rb
|
163
166
|
- lib/anycable/rails/actioncable/channel.rb
|
164
167
|
- lib/anycable/rails/actioncable/connection.rb
|
165
|
-
- lib/anycable/rails/
|
166
|
-
- lib/anycable/rails/
|
168
|
+
- lib/anycable/rails/compatibility.rb
|
169
|
+
- lib/anycable/rails/compatibility/rubocop.rb
|
170
|
+
- lib/anycable/rails/compatibility/rubocop/config/default.yml
|
171
|
+
- lib/anycable/rails/compatibility/rubocop/cops/anycable/instance_vars.rb
|
172
|
+
- lib/anycable/rails/compatibility/rubocop/cops/anycable/periodical_timers.rb
|
173
|
+
- lib/anycable/rails/compatibility/rubocop/cops/anycable/remote_disconnect.rb
|
174
|
+
- lib/anycable/rails/compatibility/rubocop/cops/anycable/stream_from.rb
|
167
175
|
- lib/anycable/rails/config.rb
|
176
|
+
- lib/anycable/rails/middlewares/executor.rb
|
177
|
+
- lib/anycable/rails/middlewares/log_tagging.rb
|
168
178
|
- lib/anycable/rails/railtie.rb
|
169
179
|
- lib/anycable/rails/refinements/subscriptions.rb
|
170
180
|
- lib/anycable/rails/version.rb
|
171
|
-
- lib/generators/anycable/USAGE
|
172
|
-
- lib/generators/anycable/anycable_generator.rb
|
173
|
-
- lib/generators/anycable/templates/anycable.yml
|
174
|
-
- lib/generators/anycable/templates/script
|
175
181
|
homepage: http://github.com/anycable/anycable-rails
|
176
182
|
licenses:
|
177
183
|
- MIT
|
@@ -187,9 +193,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
187
193
|
version: '0'
|
188
194
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
195
|
requirements:
|
190
|
-
- - "
|
196
|
+
- - ">"
|
191
197
|
- !ruby/object:Gem::Version
|
192
|
-
version:
|
198
|
+
version: 1.3.1
|
193
199
|
requirements: []
|
194
200
|
rubyforge_project:
|
195
201
|
rubygems_version: 2.7.7
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anycable
|
4
|
-
module Rails
|
5
|
-
module ActiveRecord
|
6
|
-
# Release ActiveRecord connection after every call (if any)
|
7
|
-
module ReleaseConnection
|
8
|
-
def connect(*)
|
9
|
-
wrap_release_connection { super }
|
10
|
-
end
|
11
|
-
|
12
|
-
def disconnect(*)
|
13
|
-
wrap_release_connection { super }
|
14
|
-
end
|
15
|
-
|
16
|
-
def command(*)
|
17
|
-
wrap_release_connection { super }
|
18
|
-
end
|
19
|
-
|
20
|
-
def wrap_release_connection
|
21
|
-
res = yield
|
22
|
-
::ActiveRecord::Base.connection_pool.release_connection if
|
23
|
-
::ActiveRecord::Base.connection_pool.active_connection?
|
24
|
-
res
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "rails/generators/base"
|
4
|
-
|
5
|
-
class AnycableGenerator < Rails::Generators::Base # :nodoc:
|
6
|
-
source_root File.expand_path('templates', __dir__)
|
7
|
-
|
8
|
-
def create_executable_file
|
9
|
-
template "script", "bin/anycable"
|
10
|
-
chmod "bin/anycable", 0o755
|
11
|
-
end
|
12
|
-
|
13
|
-
def add_anycable_config
|
14
|
-
template 'anycable.yml', 'config/anycable.yml'
|
15
|
-
end
|
16
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# grpс server settings, anycable grpc server will listen
|
2
|
-
# websocket server at given host:port, usually Anycable server runs locally to ws server
|
3
|
-
# MUST BE in sync with ws-server setting -rpc=0.0.0.0:50051
|
4
|
-
# rpc_host: "localhost:50051"
|
5
|
-
|
6
|
-
# redis url
|
7
|
-
# MUST BE in sync with ws-server setting -redis=redis://localhost:6379/5
|
8
|
-
# REM: Redis PubSub system doesn't use the database part of URI
|
9
|
-
# redis_url: "redis://localhost:6379/5"
|
10
|
-
|
11
|
-
# redis_sentinels:
|
12
|
-
# - { host: 'localhost', port: 26379 }
|
13
|
-
# - { host: 'redis-1-2', port: 26379 }
|
14
|
-
# - { host: 'redis-1-3', port: 26379 }
|
15
|
-
|
16
|
-
# anycable use single pubsub queue, this is queue name
|
17
|
-
# MUST BE in sync with ws-server setting -redis_channel=__anycable__
|
18
|
-
# redis_channel: "__anycable__",
|
19
|
-
|
20
|
-
#---------- ENVIRONMENT VARIABLES ----------
|
21
|
-
# since Anycable config based on anyway_config (https://github.com/palkan/anyway_config), all Anycable settings,
|
22
|
-
# can be set or overridden through corresponding Environment variable.
|
23
|
-
# Ex: rpc_host is overridden by ANYCABLE_RPC_HOST, redis_url by ANYCABLE_REDIS_URL e.t.c Look in anyway_config for more details
|
24
|
-
|
25
|
-
default: &default
|
26
|
-
rpc_host: "localhost:50051"
|
27
|
-
log_grpc: false
|
28
|
-
log_file: nil
|
29
|
-
debug: false # Shortcut to enable GRPC logging and debug level
|
30
|
-
log_level: info
|
31
|
-
redis_channel: "__anycable__"
|
32
|
-
redis_sentinels: []
|
33
|
-
|
34
|
-
|
35
|
-
production:
|
36
|
-
<<: *default
|
37
|
-
redis_url: "redis://localhost:6379/1"
|
38
|
-
|
39
|
-
development:
|
40
|
-
<<: *default
|
41
|
-
redis_url: "redis://localhost:6379/2"
|