anycable 1.0.1 → 1.1.0
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 +31 -0
- data/MIT-LICENSE +1 -1
- data/README.md +1 -4
- metadata +16 -128
- 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 -131
- data/lib/anycable/exceptions_handling.rb +0 -35
- data/lib/anycable/health_server.rb +0 -69
- 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: e3121508f979e1e2a60dd831f3f1478a99e486afdc40708961f1881db8ab75fb
|
4
|
+
data.tar.gz: dd9d1c80ae0759133edc613d0977a70d5edc79760f33b5337b6d10bed358ca1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 825c3f19f44df803d4f1f61deeded9a38a915f19c045940330d3e5b25cfedff1ed92803b4563dc92b0536ec236042b66356437454d589e7f15bd414d5818b8aa
|
7
|
+
data.tar.gz: 1577c03e455d87ea59da2237de2b57bf79bf2411c751ef2c42b1b59ef9b94cbbbfd40926b80bbb73ae0f68ff15c7b595f6c5fa944a7c8a059306ec4b7ad15525
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,37 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 1.1.0 🚸 (2021-06-01)
|
6
|
+
|
7
|
+
- No changes since 1.1.0.rc1.
|
8
|
+
|
9
|
+
## 1.1.0.rc1 (2021-05-12)
|
10
|
+
|
11
|
+
- **BREAKING** Move middlewares from gRPC interceptors to custom implementation. ([@palkan][])
|
12
|
+
|
13
|
+
That allowed us to have _real_ middlewares with ability to modify responses, intercept exceptions, etc.
|
14
|
+
The API changed a bit:
|
15
|
+
|
16
|
+
```diff
|
17
|
+
class SomeMiddleware < AnyCable::Middleware
|
18
|
+
- def call(request, rpc_call, rpc_handler)
|
19
|
+
+ def call(rpc_method_name, request, metadata)
|
20
|
+
yield
|
21
|
+
end
|
22
|
+
end
|
23
|
+
```
|
24
|
+
|
25
|
+
- **Ruby >= 2.6** is required.
|
26
|
+
- **Anyway Config >= 2.1** is required.
|
27
|
+
|
28
|
+
## 1.0.3 (2021-03-05)
|
29
|
+
|
30
|
+
- Ruby 3.0 compatibility. ([@palkan][])
|
31
|
+
|
32
|
+
## 1.0.2 (2021-01-05)
|
33
|
+
|
34
|
+
- Handle TLS Redis connections by using VERIFY_NONE mode. ([@palkan][])
|
35
|
+
|
5
36
|
## 1.0.1 (2020-07-07)
|
6
37
|
|
7
38
|
- Support providing passwords for Redis Sentinels. ([@palkan][])
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
[](https://gitpitch.com/anycable/anycable/master?grs=github)
|
2
1
|
[](https://rubygems.org/gems/anycable)
|
3
2
|
[](https://github.com/anycable/anycable/actions)
|
4
3
|
[](https://gitter.im/anycable/Lobby)
|
@@ -13,14 +12,12 @@ AnyCable allows you to use any WebSocket server (written in any language) as a r
|
|
13
12
|
|
14
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.
|
15
14
|
|
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.
|
17
|
-
|
18
15
|
<a href="https://evilmartians.com/">
|
19
16
|
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
|
20
17
|
|
21
18
|
## Requirements
|
22
19
|
|
23
|
-
- Ruby >= 2.
|
20
|
+
- Ruby >= 2.6
|
24
21
|
- Redis (for broadcasting **in production**, [discuss other options](https://github.com/anycable/anycable/issues/2) with us!)
|
25
22
|
|
26
23
|
## Usage
|
metadata
CHANGED
@@ -1,166 +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
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- palkan
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-01 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
|
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
|
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'
|
40
|
+
version: '1.37'
|
125
41
|
description: AnyCable is a polyglot replacement for ActionCable-compatible servers
|
126
42
|
email:
|
127
43
|
- dementiev.vm@gmail.com
|
128
|
-
executables:
|
129
|
-
- anycable
|
130
|
-
- anycabled
|
44
|
+
executables: []
|
131
45
|
extensions: []
|
132
46
|
extra_rdoc_files: []
|
133
47
|
files:
|
134
48
|
- CHANGELOG.md
|
135
49
|
- MIT-LICENSE
|
136
50
|
- README.md
|
137
|
-
- bin/anycable
|
138
|
-
- bin/anycabled
|
139
|
-
- bin/console
|
140
|
-
- bin/setup
|
141
|
-
- lib/anycable.rb
|
142
|
-
- lib/anycable/broadcast_adapters.rb
|
143
|
-
- lib/anycable/broadcast_adapters/base.rb
|
144
|
-
- lib/anycable/broadcast_adapters/http.rb
|
145
|
-
- lib/anycable/broadcast_adapters/redis.rb
|
146
|
-
- lib/anycable/cli.rb
|
147
|
-
- lib/anycable/config.rb
|
148
|
-
- lib/anycable/exceptions_handling.rb
|
149
|
-
- lib/anycable/health_server.rb
|
150
|
-
- lib/anycable/middleware.rb
|
151
|
-
- lib/anycable/middleware_chain.rb
|
152
|
-
- lib/anycable/middlewares/check_version.rb
|
153
|
-
- lib/anycable/rpc.rb
|
154
|
-
- lib/anycable/rpc/rpc_pb.rb
|
155
|
-
- lib/anycable/rpc/rpc_services_pb.rb
|
156
|
-
- lib/anycable/rpc_handler.rb
|
157
|
-
- lib/anycable/rspec.rb
|
158
|
-
- lib/anycable/rspec/rpc_command_context.rb
|
159
|
-
- lib/anycable/rspec/rpc_stub_context.rb
|
160
|
-
- lib/anycable/rspec/with_grpc_server.rb
|
161
|
-
- lib/anycable/server.rb
|
162
|
-
- lib/anycable/socket.rb
|
163
|
-
- lib/anycable/version.rb
|
164
51
|
homepage: http://github.com/anycable/anycable
|
165
52
|
licenses:
|
166
53
|
- MIT
|
@@ -170,7 +57,8 @@ metadata:
|
|
170
57
|
documentation_uri: https://docs.anycable.io/
|
171
58
|
homepage_uri: https://anycable.io/
|
172
59
|
source_code_uri: http://github.com/anycable/anycable
|
173
|
-
|
60
|
+
funding_uri: https://github.com/sponsors/anycable
|
61
|
+
post_install_message:
|
174
62
|
rdoc_options: []
|
175
63
|
require_paths:
|
176
64
|
- lib
|
@@ -178,15 +66,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
178
66
|
requirements:
|
179
67
|
- - ">="
|
180
68
|
- !ruby/object:Gem::Version
|
181
|
-
version: 2.
|
69
|
+
version: 2.6.0
|
182
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
183
71
|
requirements:
|
184
72
|
- - ">="
|
185
73
|
- !ruby/object:Gem::Version
|
186
74
|
version: '0'
|
187
75
|
requirements: []
|
188
|
-
rubygems_version: 3.
|
189
|
-
signing_key:
|
76
|
+
rubygems_version: 3.2.15
|
77
|
+
signing_key:
|
190
78
|
specification_version: 4
|
191
79
|
summary: AnyCable is a polyglot replacement for ActionCable-compatible servers
|
192
80
|
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
|