anycable 0.6.1 → 0.6.3
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 +49 -2
- data/bin/anycable +1 -1
- data/bin/anycabled +30 -0
- data/lib/anycable/broadcast_adapters/redis.rb +1 -1
- data/lib/anycable/cli.rb +1 -1
- data/lib/anycable/config.rb +4 -2
- data/lib/anycable/exceptions_handling.rb +9 -3
- data/lib/anycable/rpc_handler.rb +27 -4
- data/lib/anycable/server.rb +22 -6
- data/lib/anycable/version.rb +1 -1
- metadata +7 -56
- data/.github/ISSUE_TEMPLATE.md +0 -25
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -31
- data/.gitignore +0 -40
- data/.hound.yml +0 -3
- data/.rubocop.yml +0 -71
- data/.travis.yml +0 -16
- data/Gemfile +0 -8
- data/Makefile +0 -5
- data/PITCHME.md +0 -139
- data/PITCHME.yaml +0 -1
- data/Rakefile +0 -8
- data/anycable.gemspec +0 -35
- data/assets/Memory3.png +0 -0
- data/assets/Memory5.png +0 -0
- data/assets/RTT3.png +0 -0
- data/assets/RTT5.png +0 -0
- data/assets/Scheme1.png +0 -0
- data/assets/Scheme2.png +0 -0
- data/assets/cpu_chart.gif +0 -0
- data/assets/cpu_chart2.gif +0 -0
- data/assets/evlms.png +0 -0
- data/benchmarks/.gitignore +0 -2
- data/benchmarks/2017-02-12.md +0 -308
- data/benchmarks/2018-03-04.md +0 -192
- data/benchmarks/2018-05-27-rpc-bench.md +0 -57
- data/benchmarks/2018-10-27.md +0 -181
- data/benchmarks/HowTo.md +0 -23
- data/benchmarks/ansible.cfg +0 -9
- data/benchmarks/assets/2018-10-27-action-cable-rss.png +0 -0
- data/benchmarks/assets/2018-10-27-action-cable-rtt.png +0 -0
- data/benchmarks/assets/2018-10-27-anycable-rss.png +0 -0
- data/benchmarks/assets/2018-10-27-anycable-rtt.png +0 -0
- data/benchmarks/assets/2018-10-27-async-rss.png +0 -0
- data/benchmarks/assets/2018-10-27-async-rtt.png +0 -0
- data/benchmarks/assets/2018-10-27-falcon-cable-rss.png +0 -0
- data/benchmarks/assets/2018-10-27-falcon-cable-rtt.png +0 -0
- data/benchmarks/assets/2018-10-27-iodine-cable-rss.png +0 -0
- data/benchmarks/assets/2018-10-27-iodine-cable-rtt.png +0 -0
- data/benchmarks/assets/2018-10-27-plezi-rss.png +0 -0
- data/benchmarks/assets/2018-10-27-plezi-rtt.png +0 -0
- data/benchmarks/bench.png +0 -0
- data/benchmarks/benchmark.yml +0 -69
- data/benchmarks/hosts +0 -5
- data/benchmarks/rtt_plot.py +0 -74
- data/benchmarks/rtt_plot_test.py +0 -16
- data/benchmarks/servers.yml +0 -58
- data/circle.yml +0 -8
- data/etc/bug_report_template.rb +0 -76
- data/lib/anycable/handler/capture_exceptions.rb +0 -39
- data/protos/rpc.proto +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 982192dbe84e0576b13033aadf3ead0238e28bf4c30b6dec2d08228cd2093f3c
|
4
|
+
data.tar.gz: 9af924544238340e0c5b171a738b9bec99ebe25c13cc398d279318f6c9cbef12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba03a684ddce90df929c469deb4b219a494578ab9c203321e9c9f900810f98132eb74d8fc16aa1b79c6042c28bd5b3da2ac83d39bd4e25944127191dc4b2f8b7
|
7
|
+
data.tar.gz: 77a874ad448dff0cca9d8ada4259c8c48ab4fdb87d1df1f3c6bee1dab50f23335f1fc390ee60fb96483a89cc0071700945bdffa73f908745987de2c2e7877c91
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,53 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.6.3 (2019-03-26)
|
6
|
+
|
7
|
+
- Relax `redis` gem version requirement. ([@palkan][])
|
8
|
+
|
9
|
+
Use the same restriction as Action Cable does (`>= 3`).
|
10
|
+
|
11
|
+
## 0.6.2 (2019-03-15)
|
12
|
+
|
13
|
+
- Add GRPC service method name and message content to exception notifications ([@sponomarev][])
|
14
|
+
|
15
|
+
`Anycable.capture_exception` allows accessing GRPC service method name and message content
|
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.
|
18
|
+
|
19
|
+
Example:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
AnyCable.capture_exception do |ex, method, message|
|
23
|
+
Honeybadger.notify(ex, component: "any_cable", action: method, params: message)
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
Usage of a handler proc with just a single argument is preserved for the sake of compatibility.
|
28
|
+
|
29
|
+
- Add deprecation warning to default host usage ([@sponomarev][])
|
30
|
+
|
31
|
+
Exposing AnyCable publicly is considered to be harmful and planned to be changed
|
32
|
+
in future versions.
|
33
|
+
|
34
|
+
- Allow running the server as a detachable daemon ([@sponomarev][])
|
35
|
+
|
36
|
+
Server is fully managed by the binary itself.
|
37
|
+
|
38
|
+
```
|
39
|
+
# Start anycable daemon
|
40
|
+
$ bundle exec anycabled start
|
41
|
+
|
42
|
+
# Pass cli options to anycable through daemon. Separate daemon options and anycable options with `--`
|
43
|
+
$ bundle exec anycabled start -- --rpc-host 127.0.0.1:31337
|
44
|
+
|
45
|
+
# Stop anycable daemon
|
46
|
+
$ bundle exec anycabled stop
|
47
|
+
|
48
|
+
# See more anycable daemon options
|
49
|
+
$ bundle exec anycabled
|
50
|
+
```
|
51
|
+
|
5
52
|
## 0.6.1 (2019-01-05)
|
6
53
|
|
7
54
|
- [Fix #63](https://github.com/anycable/anycable-rails/issues/63) Load `anyway_config` after application boot to make sure that all frameworks dependent functionality is loaded. ([@palkan][])
|
@@ -116,7 +163,7 @@ Minor fixes.
|
|
116
163
|
|
117
164
|
- [#28](https://github.com/anycable/anycable/issues/28) Support arbitrary headers. ([@palkan][])
|
118
165
|
|
119
|
-
Previously we hardcoded only "Cookie" header. Now we add all passed headers by WebSocket server to request env.
|
166
|
+
Previously we hardcoded only "Cookie" header. Now we add all passed headers by WebSocket server to request env.
|
120
167
|
|
121
168
|
- [#27](https://github.com/anycable/anycable/issues/27) Add `error_msg` to RPC responses. ([@palkan][])
|
122
169
|
|
@@ -130,7 +177,7 @@ We provide `error_msg` only when request status is `ERROR`.
|
|
130
177
|
|
131
178
|
- [#25](https://github.com/anycable/anycable/issues/25) Improve logging and exceptions handling. ([@palkan][])
|
132
179
|
|
133
|
-
Default logger logs to STDOUT with `info` level by default but can be configured to log to file with
|
180
|
+
Default logger logs to STDOUT with `info` level by default but can be configured to log to file with
|
134
181
|
any severity.
|
135
182
|
|
136
183
|
GRPC logging is turned off by default (can be turned on through `log_grpc` configuration parameter).
|
data/bin/anycable
CHANGED
data/bin/anycabled
ADDED
@@ -0,0 +1,30 @@
|
|
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/lib/anycable/cli.rb
CHANGED
data/lib/anycable/config.rb
CHANGED
@@ -8,10 +8,12 @@ module AnyCable
|
|
8
8
|
class Config < Anyway::Config
|
9
9
|
config_name :anycable
|
10
10
|
|
11
|
+
DefaultHostWrapper = Class.new(String)
|
12
|
+
|
11
13
|
attr_config(
|
12
14
|
### gRPC options
|
13
|
-
rpc_host: "[::]:50051",
|
14
|
-
# For defaults see https://github.com/grpc/grpc/blob/
|
15
|
+
rpc_host: DefaultHostWrapper.new("[::]:50051"),
|
16
|
+
# For defaults see https://github.com/grpc/grpc/blob/51f0d35509bcdaba572d422c4f856208162022de/src/ruby/lib/grpc/generic/rpc_server.rb#L186-L216
|
15
17
|
rpc_pool_size: GRPC::RpcServer::DEFAULT_POOL_SIZE,
|
16
18
|
rpc_max_waiting_requests: GRPC::RpcServer::DEFAULT_MAX_WAITING_REQUESTS,
|
17
19
|
rpc_poll_period: GRPC::RpcServer::DEFAULT_POLL_PERIOD,
|
@@ -4,15 +4,15 @@ module AnyCable
|
|
4
4
|
module ExceptionsHandling # :nodoc:
|
5
5
|
class << self
|
6
6
|
def add_handler(block)
|
7
|
-
handlers << block
|
7
|
+
handlers << procify(block)
|
8
8
|
end
|
9
9
|
|
10
10
|
alias << add_handler
|
11
11
|
|
12
|
-
def notify(exp)
|
12
|
+
def notify(exp, method_name, message)
|
13
13
|
handlers.each do |handler|
|
14
14
|
begin
|
15
|
-
handler.call(exp)
|
15
|
+
handler.call(exp, method_name, message)
|
16
16
|
rescue StandardError => exp
|
17
17
|
AnyCable.logger.error "!!! EXCEPTION HANDLER THREW AN ERROR !!!"
|
18
18
|
AnyCable.logger.error exp
|
@@ -23,6 +23,12 @@ module AnyCable
|
|
23
23
|
|
24
24
|
private
|
25
25
|
|
26
|
+
def procify(block)
|
27
|
+
return block unless block.lambda?
|
28
|
+
|
29
|
+
proc { |*args| block.call(*args.take(block.arity)) }
|
30
|
+
end
|
31
|
+
|
26
32
|
def handlers
|
27
33
|
@handlers ||= []
|
28
34
|
end
|
data/lib/anycable/rpc_handler.rb
CHANGED
@@ -4,15 +4,12 @@ require "anycable/socket"
|
|
4
4
|
require "anycable/rpc/rpc_pb"
|
5
5
|
require "anycable/rpc/rpc_services_pb"
|
6
6
|
|
7
|
-
require "anycable/handler/capture_exceptions"
|
8
|
-
|
9
7
|
# rubocop:disable Metrics/AbcSize
|
10
8
|
# rubocop:disable Metrics/MethodLength
|
9
|
+
# rubocop:disable Metrics/ClassLength
|
11
10
|
module AnyCable
|
12
11
|
# RPC service handler
|
13
12
|
class RPCHandler < AnyCable::RPC::Service
|
14
|
-
prepend AnyCable::Handler::CaptureExceptions
|
15
|
-
|
16
13
|
# Handle connection request from WebSocket server
|
17
14
|
def connect(request, _unused_call)
|
18
15
|
logger.debug("RPC Connect: #{request.inspect}")
|
@@ -32,6 +29,13 @@ module AnyCable
|
|
32
29
|
transmissions: socket.transmissions
|
33
30
|
)
|
34
31
|
end
|
32
|
+
rescue StandardError => exp
|
33
|
+
notify_exception(exp, :connect, request)
|
34
|
+
|
35
|
+
AnyCable::ConnectionResponse.new(
|
36
|
+
status: AnyCable::Status::ERROR,
|
37
|
+
error_msg: exp.message
|
38
|
+
)
|
35
39
|
end
|
36
40
|
|
37
41
|
def disconnect(request, _unused_call)
|
@@ -50,6 +54,13 @@ module AnyCable
|
|
50
54
|
else
|
51
55
|
AnyCable::DisconnectResponse.new(status: AnyCable::Status::FAILURE)
|
52
56
|
end
|
57
|
+
rescue StandardError => exp
|
58
|
+
notify_exception(exp, :disconnect, request)
|
59
|
+
|
60
|
+
AnyCable::DisconnectResponse.new(
|
61
|
+
status: AnyCable::Status::ERROR,
|
62
|
+
error_msg: exp.message
|
63
|
+
)
|
53
64
|
end
|
54
65
|
|
55
66
|
def command(message, _unused_call)
|
@@ -75,6 +86,13 @@ module AnyCable
|
|
75
86
|
streams: socket.streams,
|
76
87
|
transmissions: socket.transmissions
|
77
88
|
)
|
89
|
+
rescue StandardError => exp
|
90
|
+
notify_exception(exp, :command, message)
|
91
|
+
|
92
|
+
AnyCable::CommandResponse.new(
|
93
|
+
status: AnyCable::Status::ERROR,
|
94
|
+
error_msg: exp.message
|
95
|
+
)
|
78
96
|
end
|
79
97
|
|
80
98
|
private
|
@@ -114,7 +132,12 @@ module AnyCable
|
|
114
132
|
def factory
|
115
133
|
AnyCable.connection_factory
|
116
134
|
end
|
135
|
+
|
136
|
+
def notify_exception(exp, method_name, message)
|
137
|
+
AnyCable::ExceptionsHandling.notify(exp, method_name.to_s, message.to_h)
|
138
|
+
end
|
117
139
|
end
|
118
140
|
end
|
119
141
|
# rubocop:enable Metrics/AbcSize
|
120
142
|
# rubocop:enable Metrics/MethodLength
|
143
|
+
# rubocop:enable Metrics/ClassLength
|
data/lib/anycable/server.rb
CHANGED
@@ -12,8 +12,8 @@ module AnyCable
|
|
12
12
|
#
|
13
13
|
# Basic example:
|
14
14
|
#
|
15
|
-
# # create new server listening on
|
16
|
-
# server = AnyCable::Server.new(host: "
|
15
|
+
# # create new server listening on the loopback interface with 50051 port
|
16
|
+
# server = AnyCable::Server.new(host: "127.0.0.1:50051")
|
17
17
|
#
|
18
18
|
# # run gRPC server in bakground
|
19
19
|
# server.start
|
@@ -25,7 +25,7 @@ module AnyCable
|
|
25
25
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
26
26
|
def start(**options)
|
27
27
|
warn <<~DEPRECATION
|
28
|
-
Using AnyCable::Server.start is deprecated!
|
28
|
+
DEPRECATION WARNING: Using AnyCable::Server.start is deprecated!
|
29
29
|
Please, use anycable CLI instead.
|
30
30
|
|
31
31
|
See https://docs.anycable.io/#upgrade_to_0_6_0
|
@@ -63,11 +63,9 @@ module AnyCable
|
|
63
63
|
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
64
64
|
end
|
65
65
|
|
66
|
-
DEFAULT_HOST = "0.0.0.0:50051"
|
67
|
-
|
68
66
|
attr_reader :grpc_server, :host
|
69
67
|
|
70
|
-
def initialize(host
|
68
|
+
def initialize(host:, logger: AnyCable.logger, **options)
|
71
69
|
@logger = logger
|
72
70
|
@host = host
|
73
71
|
@grpc_server = build_server(options)
|
@@ -80,6 +78,8 @@ module AnyCable
|
|
80
78
|
|
81
79
|
raise "Cannot re-start stopped server" if stopped?
|
82
80
|
|
81
|
+
check_default_host
|
82
|
+
|
83
83
|
logger.info "RPC server is starting..."
|
84
84
|
|
85
85
|
@start_thread = Thread.new { grpc_server.run }
|
@@ -132,5 +132,21 @@ module AnyCable
|
|
132
132
|
)
|
133
133
|
health_checker
|
134
134
|
end
|
135
|
+
|
136
|
+
def check_default_host
|
137
|
+
return unless host.is_a?(Anycable::Config::DefaultHostWrapper)
|
138
|
+
|
139
|
+
warn <<~DEPRECATION
|
140
|
+
DEPRECATION WARNING: You're using default rpc_host configuration which starts AnyCable RPC
|
141
|
+
server on all available interfaces including external IPv4 and IPv6.
|
142
|
+
This is about to be changed to loopback interface only in future versions.
|
143
|
+
|
144
|
+
Please, consider switching to the loopback interface or set "[::]:50051"
|
145
|
+
explicitly in your configuration, if you want to continue with the current
|
146
|
+
behavior and supress this message.
|
147
|
+
|
148
|
+
See https://docs.anycable.io/#/configuration
|
149
|
+
DEPRECATION
|
150
|
+
end
|
135
151
|
end
|
136
152
|
end
|
data/lib/anycable/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anycable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: anyway_config
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
117
|
+
version: 0.65.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
124
|
+
version: 0.65.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: simplecov
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -155,70 +155,23 @@ email:
|
|
155
155
|
- dementiev.vm@gmail.com
|
156
156
|
executables:
|
157
157
|
- anycable
|
158
|
+
- anycabled
|
158
159
|
extensions: []
|
159
160
|
extra_rdoc_files: []
|
160
161
|
files:
|
161
|
-
- ".github/ISSUE_TEMPLATE.md"
|
162
|
-
- ".github/PULL_REQUEST_TEMPLATE.md"
|
163
|
-
- ".gitignore"
|
164
|
-
- ".hound.yml"
|
165
|
-
- ".rubocop.yml"
|
166
|
-
- ".travis.yml"
|
167
162
|
- CHANGELOG.md
|
168
|
-
- Gemfile
|
169
163
|
- MIT-LICENSE
|
170
|
-
- Makefile
|
171
|
-
- PITCHME.md
|
172
|
-
- PITCHME.yaml
|
173
164
|
- README.md
|
174
|
-
- Rakefile
|
175
|
-
- anycable.gemspec
|
176
|
-
- assets/Memory3.png
|
177
|
-
- assets/Memory5.png
|
178
|
-
- assets/RTT3.png
|
179
|
-
- assets/RTT5.png
|
180
|
-
- assets/Scheme1.png
|
181
|
-
- assets/Scheme2.png
|
182
|
-
- assets/cpu_chart.gif
|
183
|
-
- assets/cpu_chart2.gif
|
184
|
-
- assets/evlms.png
|
185
|
-
- benchmarks/.gitignore
|
186
|
-
- benchmarks/2017-02-12.md
|
187
|
-
- benchmarks/2018-03-04.md
|
188
|
-
- benchmarks/2018-05-27-rpc-bench.md
|
189
|
-
- benchmarks/2018-10-27.md
|
190
|
-
- benchmarks/HowTo.md
|
191
|
-
- benchmarks/ansible.cfg
|
192
|
-
- benchmarks/assets/2018-10-27-action-cable-rss.png
|
193
|
-
- benchmarks/assets/2018-10-27-action-cable-rtt.png
|
194
|
-
- benchmarks/assets/2018-10-27-anycable-rss.png
|
195
|
-
- benchmarks/assets/2018-10-27-anycable-rtt.png
|
196
|
-
- benchmarks/assets/2018-10-27-async-rss.png
|
197
|
-
- benchmarks/assets/2018-10-27-async-rtt.png
|
198
|
-
- benchmarks/assets/2018-10-27-falcon-cable-rss.png
|
199
|
-
- benchmarks/assets/2018-10-27-falcon-cable-rtt.png
|
200
|
-
- benchmarks/assets/2018-10-27-iodine-cable-rss.png
|
201
|
-
- benchmarks/assets/2018-10-27-iodine-cable-rtt.png
|
202
|
-
- benchmarks/assets/2018-10-27-plezi-rss.png
|
203
|
-
- benchmarks/assets/2018-10-27-plezi-rtt.png
|
204
|
-
- benchmarks/bench.png
|
205
|
-
- benchmarks/benchmark.yml
|
206
|
-
- benchmarks/hosts
|
207
|
-
- benchmarks/rtt_plot.py
|
208
|
-
- benchmarks/rtt_plot_test.py
|
209
|
-
- benchmarks/servers.yml
|
210
165
|
- bin/anycable
|
166
|
+
- bin/anycabled
|
211
167
|
- bin/console
|
212
168
|
- bin/setup
|
213
|
-
- circle.yml
|
214
|
-
- etc/bug_report_template.rb
|
215
169
|
- lib/anycable.rb
|
216
170
|
- lib/anycable/broadcast_adapters.rb
|
217
171
|
- lib/anycable/broadcast_adapters/redis.rb
|
218
172
|
- lib/anycable/cli.rb
|
219
173
|
- lib/anycable/config.rb
|
220
174
|
- lib/anycable/exceptions_handling.rb
|
221
|
-
- lib/anycable/handler/capture_exceptions.rb
|
222
175
|
- lib/anycable/health_server.rb
|
223
176
|
- lib/anycable/middleware.rb
|
224
177
|
- lib/anycable/middleware_chain.rb
|
@@ -228,7 +181,6 @@ files:
|
|
228
181
|
- lib/anycable/server.rb
|
229
182
|
- lib/anycable/socket.rb
|
230
183
|
- lib/anycable/version.rb
|
231
|
-
- protos/rpc.proto
|
232
184
|
homepage: http://github.com/anycable/anycable
|
233
185
|
licenses:
|
234
186
|
- MIT
|
@@ -248,8 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
248
200
|
- !ruby/object:Gem::Version
|
249
201
|
version: '0'
|
250
202
|
requirements: []
|
251
|
-
|
252
|
-
rubygems_version: 2.7.6
|
203
|
+
rubygems_version: 3.0.2
|
253
204
|
signing_key:
|
254
205
|
specification_version: 4
|
255
206
|
summary: AnyCable is a polyglot replacement for ActionCable-compatible servers
|