anycable 1.0.3 → 1.1.0.pre1
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 +19 -0
- data/README.md +1 -3
- metadata +17 -144
- data/bin/anycable +0 -13
- data/bin/anycabled +0 -30
- data/bin/console +0 -7
- data/bin/setup +0 -6
- data/lib/anycable.rb +0 -101
- data/lib/anycable/broadcast_adapters.rb +0 -35
- data/lib/anycable/broadcast_adapters/base.rb +0 -29
- data/lib/anycable/broadcast_adapters/http.rb +0 -130
- data/lib/anycable/broadcast_adapters/redis.rb +0 -43
- data/lib/anycable/cli.rb +0 -353
- data/lib/anycable/config.rb +0 -135
- data/lib/anycable/exceptions_handling.rb +0 -35
- data/lib/anycable/health_server.rb +0 -73
- data/lib/anycable/middleware.rb +0 -27
- data/lib/anycable/middleware_chain.rb +0 -58
- data/lib/anycable/middlewares/check_version.rb +0 -24
- data/lib/anycable/rpc.rb +0 -84
- data/lib/anycable/rpc/rpc_pb.rb +0 -74
- data/lib/anycable/rpc/rpc_services_pb.rb +0 -24
- data/lib/anycable/rpc_handler.rb +0 -183
- data/lib/anycable/rspec.rb +0 -6
- data/lib/anycable/rspec/rpc_command_context.rb +0 -20
- data/lib/anycable/rspec/rpc_stub_context.rb +0 -13
- data/lib/anycable/rspec/with_grpc_server.rb +0 -16
- data/lib/anycable/server.rb +0 -96
- data/lib/anycable/socket.rb +0 -90
- data/lib/anycable/version.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da7b50556f5acc1d91b726c2c534ac2530395b2b3cbf994a7191ca95f82150d6
|
4
|
+
data.tar.gz: d1a66b384073c987c490a549f08cbe0c0a9dcd12f2fca1ce8c7b7a0143f60b7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7238e70df8f7ec04c1c0301a3fa614a91cf764d541504a6d21aadbfe89691c949bb0f4828678ba30478249cfbe19d38a5e77332c1d466eac7d161aba8ed48fa
|
7
|
+
data.tar.gz: 92679d203f34bc1c5f26de2460f8724883b29c42e1b56fdc5b528b1749ed47ce1de4d81fe42fd934f6e31ce85964575e6084e1dddb1ff83a733efc73c51f2ba5
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,25 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 1.1.0-dev
|
6
|
+
|
7
|
+
- **BREAKING** Move middlewares from gRPC interceptors to custom implementation. ([@palkan][])
|
8
|
+
|
9
|
+
That allowed us to have _real_ middlewares with ability to modify responses, intercept exceptions, etc.
|
10
|
+
The API changed a bit:
|
11
|
+
|
12
|
+
```diff
|
13
|
+
class SomeMiddleware < AnyCable::Middleware
|
14
|
+
- def call(request, rpc_call, rpc_handler)
|
15
|
+
+ def call(rpc_method_name, request)
|
16
|
+
yield
|
17
|
+
end
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
- **Ruby >= 2.6** is required.
|
22
|
+
- **Anyway Config >= 2.1** is required.
|
23
|
+
|
5
24
|
## 1.0.3 (2021-03-05)
|
6
25
|
|
7
26
|
- Ruby 3.0 compatibility. ([@palkan][])
|
data/README.md
CHANGED
@@ -12,14 +12,12 @@ AnyCable allows you to use any WebSocket server (written in any language) as a r
|
|
12
12
|
|
13
13
|
AnyCable uses the same protocol as ActionCable, so you can use its [JavaScript client](https://www.npmjs.com/package/actioncable) without any monkey-patching.
|
14
14
|
|
15
|
-
**Important** This is a readme for the upcoming v1.0 release. For v0.6.x see the readme from the [0-6-stable](https://github.com/anycable/anycable/tree/0-6-stable) branch.
|
16
|
-
|
17
15
|
<a href="https://evilmartians.com/">
|
18
16
|
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
|
19
17
|
|
20
18
|
## Requirements
|
21
19
|
|
22
|
-
- Ruby >= 2.
|
20
|
+
- Ruby >= 2.6
|
23
21
|
- Redis (for broadcasting **in production**, [discuss other options](https://github.com/anycable/anycable/issues/2) with us!)
|
24
22
|
|
25
23
|
## Usage
|
metadata
CHANGED
@@ -1,180 +1,53 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anycable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.1.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: anycable-core
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.1.0.pre1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.1.0.pre1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: grpc
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.37'
|
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: '1.
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: redis
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '4.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '4.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '13.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '13.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rack
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '2.0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '2.0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rspec
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '3.5'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '3.5'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: webmock
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '3.8'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '3.8'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: webrick
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
40
|
+
version: '1.37'
|
139
41
|
description: AnyCable is a polyglot replacement for ActionCable-compatible servers
|
140
42
|
email:
|
141
43
|
- dementiev.vm@gmail.com
|
142
|
-
executables:
|
143
|
-
- anycable
|
144
|
-
- anycabled
|
44
|
+
executables: []
|
145
45
|
extensions: []
|
146
46
|
extra_rdoc_files: []
|
147
47
|
files:
|
148
48
|
- CHANGELOG.md
|
149
49
|
- MIT-LICENSE
|
150
50
|
- README.md
|
151
|
-
- bin/anycable
|
152
|
-
- bin/anycabled
|
153
|
-
- bin/console
|
154
|
-
- bin/setup
|
155
|
-
- lib/anycable.rb
|
156
|
-
- lib/anycable/broadcast_adapters.rb
|
157
|
-
- lib/anycable/broadcast_adapters/base.rb
|
158
|
-
- lib/anycable/broadcast_adapters/http.rb
|
159
|
-
- lib/anycable/broadcast_adapters/redis.rb
|
160
|
-
- lib/anycable/cli.rb
|
161
|
-
- lib/anycable/config.rb
|
162
|
-
- lib/anycable/exceptions_handling.rb
|
163
|
-
- lib/anycable/health_server.rb
|
164
|
-
- lib/anycable/middleware.rb
|
165
|
-
- lib/anycable/middleware_chain.rb
|
166
|
-
- lib/anycable/middlewares/check_version.rb
|
167
|
-
- lib/anycable/rpc.rb
|
168
|
-
- lib/anycable/rpc/rpc_pb.rb
|
169
|
-
- lib/anycable/rpc/rpc_services_pb.rb
|
170
|
-
- lib/anycable/rpc_handler.rb
|
171
|
-
- lib/anycable/rspec.rb
|
172
|
-
- lib/anycable/rspec/rpc_command_context.rb
|
173
|
-
- lib/anycable/rspec/rpc_stub_context.rb
|
174
|
-
- lib/anycable/rspec/with_grpc_server.rb
|
175
|
-
- lib/anycable/server.rb
|
176
|
-
- lib/anycable/socket.rb
|
177
|
-
- lib/anycable/version.rb
|
178
51
|
homepage: http://github.com/anycable/anycable
|
179
52
|
licenses:
|
180
53
|
- MIT
|
@@ -184,7 +57,7 @@ metadata:
|
|
184
57
|
documentation_uri: https://docs.anycable.io/
|
185
58
|
homepage_uri: https://anycable.io/
|
186
59
|
source_code_uri: http://github.com/anycable/anycable
|
187
|
-
post_install_message:
|
60
|
+
post_install_message:
|
188
61
|
rdoc_options: []
|
189
62
|
require_paths:
|
190
63
|
- lib
|
@@ -192,15 +65,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
192
65
|
requirements:
|
193
66
|
- - ">="
|
194
67
|
- !ruby/object:Gem::Version
|
195
|
-
version: 2.
|
68
|
+
version: 2.6.0
|
196
69
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
70
|
requirements:
|
198
|
-
- - "
|
71
|
+
- - ">"
|
199
72
|
- !ruby/object:Gem::Version
|
200
|
-
version:
|
73
|
+
version: 1.3.1
|
201
74
|
requirements: []
|
202
|
-
rubygems_version: 3.
|
203
|
-
signing_key:
|
75
|
+
rubygems_version: 3.2.15
|
76
|
+
signing_key:
|
204
77
|
specification_version: 4
|
205
78
|
summary: AnyCable is a polyglot replacement for ActionCable-compatible servers
|
206
79
|
test_files: []
|
data/bin/anycable
DELETED
data/bin/anycabled
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "anycable/cli"
|
4
|
-
|
5
|
-
begin
|
6
|
-
require "daemons"
|
7
|
-
rescue LoadError
|
8
|
-
raise <<~MSG
|
9
|
-
You need to add gem 'daemons' to your Gemfile if you want to use `anycabled`:
|
10
|
-
|
11
|
-
# Gemfile
|
12
|
-
gem "daemons", "~> 1.3", require: false
|
13
|
-
MSG
|
14
|
-
end
|
15
|
-
|
16
|
-
options = {
|
17
|
-
dir: "tmp/pids",
|
18
|
-
log_output: false
|
19
|
-
}
|
20
|
-
|
21
|
-
# Preserve current directory. We need it inside the server.
|
22
|
-
current_dir = Dir.pwd
|
23
|
-
|
24
|
-
# Clean ARGV from daemon command and args
|
25
|
-
_, _, args = Daemons::Controller.split_argv(ARGV)
|
26
|
-
|
27
|
-
Daemons.run_proc("anycable", options) do
|
28
|
-
Dir.chdir current_dir
|
29
|
-
AnyCable::CLI.new.run(args)
|
30
|
-
end
|
data/bin/console
DELETED
data/bin/setup
DELETED
data/lib/anycable.rb
DELETED
@@ -1,101 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "anycable/version"
|
4
|
-
require "logger"
|
5
|
-
|
6
|
-
require "anycable/exceptions_handling"
|
7
|
-
require "anycable/broadcast_adapters"
|
8
|
-
|
9
|
-
require "anycable/middleware_chain"
|
10
|
-
|
11
|
-
require "anycable/server"
|
12
|
-
|
13
|
-
# AnyCable allows to use any websocket service (written in any language) as a replacement
|
14
|
-
# for ActionCable server.
|
15
|
-
#
|
16
|
-
# AnyCable includes a gRPC server, which is used by external WS server to execute commands
|
17
|
-
# (authentication, subscription authorization, client-to-server messages).
|
18
|
-
#
|
19
|
-
# Broadcasting messages to WS is done through _broadcast adapter_ (Redis Pub/Sub by default).
|
20
|
-
module AnyCable
|
21
|
-
class << self
|
22
|
-
# Provide connection factory which
|
23
|
-
# is a callable object with build
|
24
|
-
# a Connection object
|
25
|
-
attr_accessor :connection_factory
|
26
|
-
|
27
|
-
attr_writer :logger
|
28
|
-
|
29
|
-
attr_reader :middleware
|
30
|
-
|
31
|
-
def logger
|
32
|
-
return @logger if instance_variable_defined?(:@logger)
|
33
|
-
|
34
|
-
log_output = AnyCable.config.log_file || $stdout
|
35
|
-
@logger = Logger.new(log_output).tap do |logger|
|
36
|
-
logger.level = AnyCable.config.log_level
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def config
|
41
|
-
@config ||= begin
|
42
|
-
# Load anyway_config as later as possible
|
43
|
-
# to make sure all framework-dependent patches are loaded
|
44
|
-
require "anycable/config"
|
45
|
-
Config.new
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def configure
|
50
|
-
yield(config) if block_given?
|
51
|
-
end
|
52
|
-
|
53
|
-
# Register a custom block that will be called
|
54
|
-
# when an exception is raised during gRPC call
|
55
|
-
def capture_exception(&block)
|
56
|
-
ExceptionsHandling << block
|
57
|
-
end
|
58
|
-
|
59
|
-
# Register a callback to be invoked before
|
60
|
-
# the server starts
|
61
|
-
def configure_server(&block)
|
62
|
-
server_callbacks << block
|
63
|
-
end
|
64
|
-
|
65
|
-
def server_callbacks
|
66
|
-
@server_callbacks ||= []
|
67
|
-
end
|
68
|
-
|
69
|
-
def broadcast_adapter
|
70
|
-
self.broadcast_adapter = AnyCable.config.broadcast_adapter.to_sym unless instance_variable_defined?(:@broadcast_adapter)
|
71
|
-
@broadcast_adapter
|
72
|
-
end
|
73
|
-
|
74
|
-
def broadcast_adapter=(adapter)
|
75
|
-
if adapter.is_a?(Symbol) || adapter.is_a?(Array)
|
76
|
-
adapter = BroadcastAdapters.lookup_adapter(adapter)
|
77
|
-
end
|
78
|
-
|
79
|
-
unless adapter.respond_to?(:broadcast)
|
80
|
-
raise ArgumentError, "BroadcastAdapter must implement #broadcast method. " \
|
81
|
-
"#{adapter.class} doesn't implement it."
|
82
|
-
end
|
83
|
-
|
84
|
-
@broadcast_adapter = adapter
|
85
|
-
end
|
86
|
-
|
87
|
-
# Raw broadcast message to the channel, sends only string!
|
88
|
-
# To send hash or object use ActionCable.server.broadcast instead!
|
89
|
-
def broadcast(channel, payload)
|
90
|
-
broadcast_adapter.broadcast(channel, payload)
|
91
|
-
end
|
92
|
-
|
93
|
-
private
|
94
|
-
|
95
|
-
attr_writer :middleware
|
96
|
-
end
|
97
|
-
|
98
|
-
require "anycable/middlewares/check_version"
|
99
|
-
|
100
|
-
self.middleware = MiddlewareChain.new
|
101
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "anycable/broadcast_adapters/base"
|
4
|
-
|
5
|
-
module AnyCable
|
6
|
-
module BroadcastAdapters # :nodoc:
|
7
|
-
module_function
|
8
|
-
|
9
|
-
# rubocop: disable Metrics/AbcSize, Metrics/MethodLength
|
10
|
-
def lookup_adapter(args)
|
11
|
-
adapter, options = Array(args)
|
12
|
-
path_to_adapter = "anycable/broadcast_adapters/#{adapter}"
|
13
|
-
adapter_class_name = adapter.to_s.split("_").map(&:capitalize).join
|
14
|
-
|
15
|
-
unless BroadcastAdapters.const_defined?(adapter_class_name, false)
|
16
|
-
begin
|
17
|
-
require path_to_adapter
|
18
|
-
rescue LoadError => e
|
19
|
-
# We couldn't require the adapter itself.
|
20
|
-
if e.path == path_to_adapter
|
21
|
-
raise e.class, "Couldn't load the '#{adapter}' broadcast adapter for AnyCable",
|
22
|
-
e.backtrace
|
23
|
-
# Bubbled up from the adapter require.
|
24
|
-
else
|
25
|
-
raise e.class, "Error loading the '#{adapter}' broadcast adapter for AnyCable",
|
26
|
-
e.backtrace
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
BroadcastAdapters.const_get(adapter_class_name, false).new(**(options || {}))
|
32
|
-
end
|
33
|
-
# rubocop: enable Metrics/AbcSize, Metrics/MethodLength
|
34
|
-
end
|
35
|
-
end
|