anycable 0.6.3 → 1.0.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/CHANGELOG.md +23 -222
- data/MIT-LICENSE +1 -1
- data/README.md +21 -15
- data/lib/anycable.rb +3 -12
- data/lib/anycable/broadcast_adapters.rb +5 -3
- data/lib/anycable/broadcast_adapters/base.rb +29 -0
- data/lib/anycable/broadcast_adapters/http.rb +130 -0
- data/lib/anycable/broadcast_adapters/redis.rb +7 -6
- data/lib/anycable/cli.rb +24 -7
- data/lib/anycable/config.rb +44 -21
- data/lib/anycable/exceptions_handling.rb +5 -7
- data/lib/anycable/health_server.rb +6 -4
- data/lib/anycable/middleware.rb +9 -1
- data/lib/anycable/middleware_chain.rb +2 -2
- data/lib/anycable/middlewares/check_version.rb +24 -0
- data/lib/anycable/rpc.rb +84 -0
- data/lib/anycable/rpc/rpc_pb.rb +57 -39
- data/lib/anycable/rpc/rpc_services_pb.rb +4 -3
- data/lib/anycable/rpc_handler.rb +65 -25
- data/lib/anycable/rspec.rb +6 -0
- data/lib/anycable/rspec/rpc_command_context.rb +20 -0
- data/lib/anycable/rspec/rpc_stub_context.rb +13 -0
- data/lib/anycable/rspec/with_grpc_server.rb +15 -0
- data/lib/anycable/server.rb +7 -63
- data/lib/anycable/socket.rb +48 -6
- data/lib/anycable/version.rb +1 -1
- metadata +27 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deebe94f2e541a9d14ccf4a56df910cdb5a2fb17ae6815ffaaa2f761fdcd07ad
|
4
|
+
data.tar.gz: e96c5b0d28dd7617c2cfa1249fde5bd357465be7596915720c27718f486c4f16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b585f2797184d7bc78cc761707b741dcfa8a6b796df91cccd7ac1e44c9210a84852daba838adaaa6b2f1548d2d0f82cf57713b32a4a86d0ffa671f64321b9df1
|
7
|
+
data.tar.gz: dccd27127eaafc5b7821ba18404546269e9aaf3163faccffaba864e166cb1c19cdc914ccf9de87da963cac447541058e0d7ba906674298f9dda8573ca4e917c8
|
data/CHANGELOG.md
CHANGED
@@ -1,246 +1,47 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
-
##
|
3
|
+
## 1.0.0.rc1 (2020-06-10)
|
4
4
|
|
5
|
-
|
5
|
+
- Add `Env#istate` and `EnvResponse#istate` to store channel state. ([@palkan][])
|
6
6
|
|
7
|
-
|
7
|
+
That would allow to mimic instance variables usage in Action Cable channels.
|
8
8
|
|
9
|
-
|
9
|
+
- Add `CommandResponse#stopped_streams` to support unsubscribing from particular broadcastings. ([@palkan])
|
10
10
|
|
11
|
-
|
11
|
+
`Socket#unsubscribe` is now implemented as well.
|
12
12
|
|
13
|
-
- Add
|
13
|
+
- Add `AnyCable.broadcast_adapter#broadcast_command` method. ([@palkan][])
|
14
14
|
|
15
|
-
|
16
|
-
on which an exception was captured. It can be used for exceptions grouping in your tracker and
|
17
|
-
providing additional data to investigate a root of a problem.
|
15
|
+
It could be used to send commands to WS server (e.g., remote disconnect).
|
18
16
|
|
19
|
-
|
17
|
+
- Add `:http` broadcasting adapter. ([@palkan][])
|
20
18
|
|
21
|
-
|
22
|
-
AnyCable.capture_exception do |ex, method, message|
|
23
|
-
Honeybadger.notify(ex, component: "any_cable", action: method, params: message)
|
24
|
-
end
|
25
|
-
```
|
19
|
+
- **RPC schema has changed**. ([@palkan][])
|
26
20
|
|
27
|
-
|
21
|
+
Using `anycable-go` v1.x is required.
|
28
22
|
|
29
|
-
-
|
23
|
+
- **Ruby 2.5+ is required**. ([@palkan][])
|
30
24
|
|
31
|
-
|
32
|
-
in future versions.
|
25
|
+
- Added RPC proto version check. ([@palkan][])
|
33
26
|
|
34
|
-
|
27
|
+
Server must sent `protov` metadata with the supported versions (comma-separated list). If there is no matching version an exception is raised.
|
35
28
|
|
36
|
-
|
29
|
+
Current RPC proto version is **v1**.
|
37
30
|
|
38
|
-
|
39
|
-
# Start anycable daemon
|
40
|
-
$ bundle exec anycabled start
|
31
|
+
- Added `request` support to channels. ([@palkan][])
|
41
32
|
|
42
|
-
|
43
|
-
$ bundle exec anycabled start -- --rpc-host 127.0.0.1:31337
|
33
|
+
Now you can access `request` object in channels, too (e.g., to read headers/cookies/URL/etc).
|
44
34
|
|
45
|
-
|
46
|
-
$ bundle exec anycabled stop
|
35
|
+
- Change default server address from `[::]:50051` to `127.0.0.1:50051`. ([@palkan][])
|
47
36
|
|
48
|
-
|
49
|
-
$ bundle exec anycabled
|
50
|
-
```
|
37
|
+
See [#71](https://github.com/anycable/anycable/pull/71).
|
51
38
|
|
52
|
-
|
39
|
+
- Fix building Redis Sentinel config. ([@palkan][])
|
53
40
|
|
54
|
-
|
41
|
+
---
|
55
42
|
|
56
|
-
|
57
|
-
|
58
|
-
### Features
|
59
|
-
|
60
|
-
#### Broadcast adapters
|
61
|
-
|
62
|
-
AnyCable allows you to use custom broadcasting adapters (Redis is used by default):
|
63
|
-
|
64
|
-
```ruby
|
65
|
-
# Specify by name (tries to load `AnyCable::BroadcastAdapters::MyAdapter` from
|
66
|
-
# "anycable/broadcast_adapters/my_adapter")
|
67
|
-
AnyCable.broadcast_adapter = :my_adapter, { option: "value" }
|
68
|
-
# or provide an instance (should respond_to #broadcast)
|
69
|
-
AnyCable.broadcast_adapter = MyAdapter.new
|
70
|
-
```
|
71
|
-
|
72
|
-
**Breaking:** to use Redis adapter you must ensure that it is present in your Gemfile; AnyCable gem doesn't have `redis` as a dependency anymore.
|
73
|
-
|
74
|
-
#### CLI
|
75
|
-
|
76
|
-
AnyCable now ships with a CLI–`anycable`.
|
77
|
-
|
78
|
-
Use it to run a gRPC server:
|
79
|
-
|
80
|
-
```sh
|
81
|
-
# run anycable and load app from app.rb
|
82
|
-
bundle exec anycable -r app.rb
|
83
|
-
# or
|
84
|
-
bundle exec anycable --require app.rb
|
85
|
-
```
|
86
|
-
|
87
|
-
All configuration options are also supported as CLI options (see `anycable -h` for more information).
|
88
|
-
|
89
|
-
The only required options is the application file to load (`-r/--require`).
|
90
|
-
|
91
|
-
You can omit it if you want to load an app form `./config/environment.rb` (e.g. with Rails) or `./config/anycable.rb`.
|
92
|
-
|
93
|
-
AnyCable CLI also allows you to run a separate command (process) from within a RPC server:
|
94
|
-
|
95
|
-
```sh
|
96
|
-
$ bundle exec anycable --server-command "anycable-go -p 3334"
|
97
|
-
```
|
98
|
-
|
99
|
-
#### Configuration
|
100
|
-
|
101
|
-
- Default server host is changed from `localhost:50051` to `0.0.0.0:50051`
|
102
|
-
- Expose gRPC server parameters via `rpc_*` config params:
|
103
|
-
|
104
|
-
```ruby
|
105
|
-
AnyCable.configure do |config|
|
106
|
-
config.rpc_pool_size = 120
|
107
|
-
config.rpc_max_waiting_requests = 10
|
108
|
-
# etc
|
109
|
-
end
|
110
|
-
```
|
111
|
-
- `REDIS_URL` env is used by default if present (and no `ANYCABLE_REDIS_URL` specified)
|
112
|
-
- Make HTTP health check url configurable
|
113
|
-
- Add ability to pass Redis Sentinel config as array of string.
|
114
|
-
|
115
|
-
Now it's possible to pass Sentinel configuration via env vars:
|
116
|
-
|
117
|
-
```sh
|
118
|
-
ANYCABLE_REDIS_SENTINELS=127.0.0.1:26380,127.0.0.1:26381 bundle exec anycable
|
119
|
-
```
|
120
|
-
|
121
|
-
#### Other
|
122
|
-
|
123
|
-
- Added middlewares support
|
124
|
-
|
125
|
-
See [docs](https://docs.anycable.io/#/./middlewares).
|
126
|
-
|
127
|
-
- Added gRPC health checker.
|
128
|
-
|
129
|
-
See [docs](https://docs.anycable.io/#/./health_checking).
|
130
|
-
|
131
|
-
- Added hook to run code only within RPC server context.
|
132
|
-
|
133
|
-
Use `AnyCable.configure_server { ... }` to run code only when RPC server is running.
|
134
|
-
|
135
|
-
### API changes
|
136
|
-
|
137
|
-
**NOTE**: the old API is still working but deprecated (you'll see a notice).
|
138
|
-
|
139
|
-
- Use `AnyCable` instead of `Anycable`
|
140
|
-
|
141
|
-
- New API for registering error handlers:
|
142
|
-
|
143
|
-
```ruby
|
144
|
-
AnyCable.capture_exception do |ex|
|
145
|
-
Honeybadger.notify(ex)
|
146
|
-
end
|
147
|
-
```
|
148
|
-
|
149
|
-
- `AnyCable::Server.start` is deprecated
|
150
|
-
|
151
|
-
|
152
|
-
## 0.5.2 (2018-09-06)
|
153
|
-
|
154
|
-
- [#48](https://github.com/anycable/anycable/pull/48) Add HTTP health server ([@DarthSim][])
|
155
|
-
|
156
|
-
## 0.5.1 (2018-06-13)
|
157
|
-
|
158
|
-
Minor fixes.
|
159
|
-
|
160
|
-
## 0.5.0 (2017-10-21)
|
161
|
-
|
162
|
-
- [#2](https://github.com/anycable/anycable/issues/2) Add support for [Redis Sentinel](https://redis.io/topics/sentinel). ([@accessd][])
|
163
|
-
|
164
|
-
- [#28](https://github.com/anycable/anycable/issues/28) Support arbitrary headers. ([@palkan][])
|
165
|
-
|
166
|
-
Previously we hardcoded only "Cookie" header. Now we add all passed headers by WebSocket server to request env.
|
167
|
-
|
168
|
-
- [#27](https://github.com/anycable/anycable/issues/27) Add `error_msg` to RPC responses. ([@palkan][])
|
169
|
-
|
170
|
-
Now RPC responses has 3 statuses:
|
171
|
-
|
172
|
-
- `SUCCESS` – successful request, operation succeed
|
173
|
-
- `FAILURE` – successful request, operation failed (e.g. authentication failed)
|
174
|
-
- `ERROR` – request failed (exception raised).
|
175
|
-
|
176
|
-
We provide `error_msg` only when request status is `ERROR`.
|
177
|
-
|
178
|
-
- [#25](https://github.com/anycable/anycable/issues/25) Improve logging and exceptions handling. ([@palkan][])
|
179
|
-
|
180
|
-
Default logger logs to STDOUT with `info` level by default but can be configured to log to file with
|
181
|
-
any severity.
|
182
|
-
|
183
|
-
GRPC logging is turned off by default (can be turned on through `log_grpc` configuration parameter).
|
184
|
-
|
185
|
-
`ANYCABLE_DEBUG=1` acts as a shortcut to set `debug` level and turn on GRPC logging.
|
186
|
-
|
187
|
-
Now it's possible to add custom exception handlers (e.g. to notify external exception tracking services).
|
188
|
-
|
189
|
-
More on [Wiki](https://github.com/anycable/anycable/wiki/Logging-&-Exceptions-Handling).
|
190
|
-
|
191
|
-
## 0.4.6 (2017-05-20)
|
192
|
-
|
193
|
-
- Add `Anycable::Server#stop` method. ([@sadovnik][])
|
194
|
-
|
195
|
-
## 0.4.5 (2017-03-17)
|
196
|
-
|
197
|
-
- Fixed #11. ([@palkan][])
|
198
|
-
|
199
|
-
## 0.4.4 (2017-03-06)
|
200
|
-
|
201
|
-
- Handle `StandardError` gracefully in RPC calls. ([@palkan][])
|
202
|
-
|
203
|
-
## 0.4.3 (2017-02-18)
|
204
|
-
|
205
|
-
- Update `grpc` version dependency to support Ruby 2.4. ([@palkan][])
|
206
|
-
|
207
|
-
## 0.4.2 (2017-01-28)
|
208
|
-
|
209
|
-
- Change socket streaming API. ([@palkan][])
|
210
|
-
|
211
|
-
Add `Socket#subscribe`, `unsubscribe` and `unsubscribe_from_all` methods.
|
212
|
-
|
213
|
-
## 0.4.1 (2017-01-24)
|
214
|
-
|
215
|
-
- Introduce _fake_ socket instance to handle transmissions and streams. ([@palkan][])
|
216
|
-
|
217
|
-
- Make commands handling more abstract. ([@palkan][])
|
218
|
-
|
219
|
-
We now do not explicitly call channels action but use the only one entrypoing for all commands:
|
220
|
-
|
221
|
-
```ruby
|
222
|
-
connection.handle_channel_command(identifier, command, data)
|
223
|
-
```
|
224
|
-
|
225
|
-
This method should return `true` if command was successful and `false` otherwise.
|
226
|
-
|
227
|
-
## 0.4.0 (2017-01-22)
|
228
|
-
|
229
|
-
- Refactor RPC API. ([@palkan][])
|
230
|
-
|
231
|
-
Replace `Subscribe`, `Unsubscribe` and `Perform` methods with `Command` method.
|
232
|
-
|
233
|
-
- Extract Rails functionality to separate gem. ([@palkan][])
|
234
|
-
|
235
|
-
All Rails specifics now live here https://github.com/anycable/anycable-rails.
|
236
|
-
|
237
|
-
## 0.3.0 (2016-12-28)
|
238
|
-
|
239
|
-
- Handle `Disconnect` requests. ([@palkan][])
|
240
|
-
|
241
|
-
Implement `Disconnect` handler, which invokes `Connection#disconnect` (along with `Channel#unsubscribed` for each subscription).
|
43
|
+
See [Changelog](https://github.com/anycable/anycable/blob/0-6-stable/CHANGELOG.md) for versions <1.0.0.
|
242
44
|
|
243
45
|
[@palkan]: https://github.com/palkan
|
244
|
-
[@
|
245
|
-
[@
|
246
|
-
[@DarthSim]: https://github.com/DarthSim
|
46
|
+
[@sponomarev]: https://github.com/sponomarev
|
47
|
+
[@bibendi]: https://github.com/bibendi
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,27 +1,31 @@
|
|
1
|
-
[](https://gitpitch.com/anycable/anycable/master?grs=github)
|
1
|
+
[](https://gitpitch.com/anycable/anycable/master?grs=github)
|
2
|
+
[](https://rubygems.org/gems/anycable)
|
3
|
+
[](https://github.com/anycable/anycable/actions)
|
2
4
|
[](https://gitter.im/anycable/Lobby)
|
3
|
-
[](https://docs.anycable.io)
|
5
|
+
[](https://docs.anycable.io/v1)
|
4
6
|
|
5
7
|
# AnyCable
|
6
8
|
|
7
9
|
<img align="right" height="150" width="129"
|
8
10
|
title="AnyCable logo" src="https://docs.anycable.io/assets/images/logo.svg">
|
9
11
|
|
10
|
-
AnyCable allows you to use any WebSocket server (written in any language) as a replacement for your Ruby server (such as Faye,
|
12
|
+
AnyCable allows you to use any WebSocket server (written in any language) as a replacement for your Ruby server (such as Faye, Action Cable, etc).
|
11
13
|
|
12
|
-
AnyCable uses
|
14
|
+
AnyCable uses the same protocol as ActionCable, so you can use its [JavaScript client](https://www.npmjs.com/package/actioncable) without any monkey-patching.
|
15
|
+
|
16
|
+
**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.
|
13
17
|
|
14
18
|
<a href="https://evilmartians.com/">
|
15
19
|
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
|
16
20
|
|
17
21
|
## Requirements
|
18
22
|
|
19
|
-
- Ruby >= 2.
|
20
|
-
- Redis (for
|
23
|
+
- Ruby >= 2.5
|
24
|
+
- Redis (for broadcasting **in production**, [discuss other options](https://github.com/anycable/anycable/issues/2) with us!)
|
21
25
|
|
22
26
|
## Usage
|
23
27
|
|
24
|
-
Check out our 📑 [Documentation](https://docs.anycable.io).
|
28
|
+
Check out our 📑 [Documentation](https://docs.anycable.io/v1).
|
25
29
|
|
26
30
|
## Links
|
27
31
|
|
@@ -43,31 +47,33 @@ Check out our 📑 [Documentation](https://docs.anycable.io).
|
|
43
47
|
|
44
48
|
- RailsClub Moscow 2016 [slides](https://speakerdeck.com/palkan/railsclub-moscow-2016-anycable) and [video](https://www.youtube.com/watch?v=-k7GQKuBevY&list=PLiWUIs1hSNeOXZhotgDX7Y7qBsr24cu7o&index=4) (RU)
|
45
49
|
|
46
|
-
##
|
47
|
-
|
48
|
-
- [AnyCable Go](https://github.com/anycable/anycable-go)
|
49
|
-
- [ErlyCable](https://github.com/anycable/erlycable)
|
50
|
+
## Building
|
50
51
|
|
51
|
-
|
52
|
+
### Generating gRPC files from `.proto`
|
52
53
|
|
53
54
|
- Install required GRPC gems:
|
54
55
|
|
55
|
-
```
|
56
|
+
```sh
|
56
57
|
gem install grpc
|
57
58
|
gem install grpc-tools
|
58
59
|
```
|
59
60
|
|
60
61
|
- Re-generate GRPC files (if necessary):
|
61
62
|
|
62
|
-
```
|
63
|
+
```sh
|
63
64
|
make
|
64
65
|
```
|
65
66
|
|
66
67
|
## Contributing
|
67
68
|
|
68
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/anycable/anycable.
|
69
|
+
Bug reports and pull requests are welcome on GitHub at [https://github.com/anycable/anycable](https://github.com/anycable/anycable).
|
69
70
|
|
70
71
|
Please, provide reproduction script (using [this template](https://github.com/anycable/anycable/blob/master/etc/bug_report_template.rb)) when submitting bugs if possible.
|
71
72
|
|
72
73
|
## License
|
74
|
+
|
73
75
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
76
|
+
|
77
|
+
## Security Contact
|
78
|
+
|
79
|
+
To report a security vulnerability, please contact us at `anycable@evilmartians.com`. We will coordinate the fix and disclosure.
|
data/lib/anycable.rb
CHANGED
@@ -56,14 +56,6 @@ module AnyCable
|
|
56
56
|
ExceptionsHandling << block
|
57
57
|
end
|
58
58
|
|
59
|
-
def error_handlers
|
60
|
-
warn <<~DEPRECATION
|
61
|
-
Using `AnyCable.error_handlers` is deprecated!
|
62
|
-
Please, use `AnyCable.capture_exception` instead.
|
63
|
-
DEPRECATION
|
64
|
-
ExceptionsHandling
|
65
|
-
end
|
66
|
-
|
67
59
|
# Register a callback to be invoked before
|
68
60
|
# the server starts
|
69
61
|
def configure_server(&block)
|
@@ -75,7 +67,7 @@ module AnyCable
|
|
75
67
|
end
|
76
68
|
|
77
69
|
def broadcast_adapter
|
78
|
-
self.broadcast_adapter =
|
70
|
+
self.broadcast_adapter = AnyCable.config.broadcast_adapter.to_sym unless instance_variable_defined?(:@broadcast_adapter)
|
79
71
|
@broadcast_adapter
|
80
72
|
end
|
81
73
|
|
@@ -103,8 +95,7 @@ module AnyCable
|
|
103
95
|
attr_writer :middleware
|
104
96
|
end
|
105
97
|
|
98
|
+
require "anycable/middlewares/check_version"
|
99
|
+
|
106
100
|
self.middleware = MiddlewareChain.new
|
107
101
|
end
|
108
|
-
|
109
|
-
# Backward compatibility
|
110
|
-
Anycable = AnyCable
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "anycable/broadcast_adapters/base"
|
4
|
+
|
3
5
|
module AnyCable
|
4
6
|
module BroadcastAdapters # :nodoc:
|
5
7
|
module_function
|
@@ -17,16 +19,16 @@ module AnyCable
|
|
17
19
|
# We couldn't require the adapter itself.
|
18
20
|
if e.path == path_to_adapter
|
19
21
|
raise e.class, "Couldn't load the '#{adapter}' broadcast adapter for AnyCable",
|
20
|
-
|
22
|
+
e.backtrace
|
21
23
|
# Bubbled up from the adapter require.
|
22
24
|
else
|
23
25
|
raise e.class, "Error loading the '#{adapter}' broadcast adapter for AnyCable",
|
24
|
-
|
26
|
+
e.backtrace
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
29
|
-
BroadcastAdapters.const_get(adapter_class_name, false).new(options || {})
|
31
|
+
BroadcastAdapters.const_get(adapter_class_name, false).new(**(options || {}))
|
30
32
|
end
|
31
33
|
# rubocop: enable Metrics/AbcSize, Metrics/MethodLength
|
32
34
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AnyCable
|
4
|
+
module BroadcastAdapters
|
5
|
+
class Base
|
6
|
+
def raw_broadcast(_data)
|
7
|
+
raise NotImplementedError
|
8
|
+
end
|
9
|
+
|
10
|
+
def broadcast(stream, payload)
|
11
|
+
raw_broadcast({stream: stream, data: payload}.to_json)
|
12
|
+
end
|
13
|
+
|
14
|
+
def broadcast_command(command, **payload)
|
15
|
+
raw_broadcast({command: command, payload: payload}.to_json)
|
16
|
+
end
|
17
|
+
|
18
|
+
def announce!
|
19
|
+
logger.info "Broadcasting via #{self.class.name}"
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def logger
|
25
|
+
AnyCable.logger
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|