anycable-rack-server 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/anycable/rack/broadcast_subscribers/base_subscriber.rb +1 -1
- data/lib/anycable/rack/coders/json.rb +1 -1
- data/lib/anycable/rack/coders/msgpack.rb +22 -0
- data/lib/anycable/rack/config.rb +1 -0
- data/lib/anycable/rack/connection.rb +8 -3
- data/lib/anycable/rack/hub.rb +5 -6
- data/lib/anycable/rack/middleware.rb +1 -1
- data/lib/anycable/rack/pinger.rb +5 -2
- data/lib/anycable/rack/server.rb +7 -4
- data/lib/anycable/rack/socket.rb +15 -2
- data/lib/anycable/rack/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac33d07a88c1d94d982a7068f7636fc74013dd13e18a08ba29019c1b6e90bdb1
|
4
|
+
data.tar.gz: c655148349178d792f6609202762845189669053a14f89aa4a5f0c6efae67ff6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ecbcb8c30cfa5e4b79948bc37c06405068d80bb192f53d98901d7177110da4822a20eff456a12fb7da5e7a3c3f8757ad219acb0befb2d7cd705288b3b1a3b12
|
7
|
+
data.tar.gz: a687c493138b5e0c7429e6a58c1b99ea4388a8b988988f0cc4bcab656db4789494e6b0fb05d59936794dfb6a99dc1b4868b90f82c551c049a2c33cf1c9c78d98
|
@@ -32,7 +32,7 @@ module AnyCable
|
|
32
32
|
if data["stream"]
|
33
33
|
hub.broadcast(data["stream"], data["data"], coder)
|
34
34
|
elsif data["command"] == "disconnect"
|
35
|
-
hub.disconnect(data["payload"]["identifier"], data["payload"]["reconnect"])
|
35
|
+
hub.disconnect(data["payload"]["identifier"], data["payload"]["reconnect"], coder)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
gem "msgpack", "~> 1.4"
|
4
|
+
require "msgpack"
|
5
|
+
|
6
|
+
module AnyCable
|
7
|
+
module Rack
|
8
|
+
module Coders
|
9
|
+
module Msgpack # :nodoc:
|
10
|
+
class << self
|
11
|
+
def decode(bin)
|
12
|
+
MessagePack.unpack(bin)
|
13
|
+
end
|
14
|
+
|
15
|
+
def encode(ruby_obj)
|
16
|
+
BinaryFrame.new(MessagePack.pack(ruby_obj))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/anycable/rack/config.rb
CHANGED
@@ -67,7 +67,8 @@ module AnyCable
|
|
67
67
|
private
|
68
68
|
|
69
69
|
def transmit(cable_message)
|
70
|
-
|
70
|
+
encoded = encode(cable_message)
|
71
|
+
socket.transmit(encoded)
|
71
72
|
end
|
72
73
|
|
73
74
|
def close
|
@@ -133,7 +134,7 @@ module AnyCable
|
|
133
134
|
end
|
134
135
|
|
135
136
|
def process_command(response, identifier)
|
136
|
-
response.transmissions.each { |transmission| transmit(
|
137
|
+
response.transmissions.each { |transmission| transmit(decode_transmission(transmission)) }
|
137
138
|
hub.remove_channel(socket, identifier) if response.stop_streams
|
138
139
|
response.streams.each { |stream| hub.add_subscriber(stream, socket, identifier) }
|
139
140
|
response.stopped_streams.each { |stream| hub.remove_subscriber(stream, socket, identifier) }
|
@@ -145,7 +146,7 @@ module AnyCable
|
|
145
146
|
end
|
146
147
|
|
147
148
|
def process_open(response)
|
148
|
-
response.transmissions&.each { |transmission| transmit(
|
149
|
+
response.transmissions&.each { |transmission| transmit(decode_transmission(transmission)) }
|
149
150
|
if response.status == :SUCCESS
|
150
151
|
@_identifiers = response.identifiers
|
151
152
|
@_cstate = response.env.cstate&.to_h || {}
|
@@ -181,6 +182,10 @@ module AnyCable
|
|
181
182
|
coder.encode(cable_message)
|
182
183
|
end
|
183
184
|
|
185
|
+
def decode_transmission(json_message)
|
186
|
+
JSON.parse(json_message)
|
187
|
+
end
|
188
|
+
|
184
189
|
def decode(websocket_message)
|
185
190
|
coder.decode(websocket_message)
|
186
191
|
end
|
data/lib/anycable/rack/hub.rb
CHANGED
@@ -71,7 +71,7 @@ module AnyCable
|
|
71
71
|
end
|
72
72
|
|
73
73
|
list.each do |(channel_id, sockets)|
|
74
|
-
decoded =
|
74
|
+
decoded = JSON.parse(message)
|
75
75
|
cmessage = channel_message(channel_id, decoded, coder)
|
76
76
|
sockets.each { |socket| socket.transmit(cmessage) }
|
77
77
|
end
|
@@ -81,14 +81,14 @@ module AnyCable
|
|
81
81
|
sockets.each_key { |socket| socket.transmit(message) }
|
82
82
|
end
|
83
83
|
|
84
|
-
def disconnect(identifier, reconnect)
|
84
|
+
def disconnect(identifier, reconnect, coder)
|
85
85
|
sockets = @sync.synchronize do
|
86
86
|
return unless @streams[INTERNAL_STREAM].key?(identifier)
|
87
87
|
|
88
88
|
@streams[INTERNAL_STREAM][identifier].to_a
|
89
89
|
end
|
90
90
|
|
91
|
-
msg = disconnect_message("remote", reconnect)
|
91
|
+
msg = disconnect_message("remote", reconnect, coder)
|
92
92
|
|
93
93
|
sockets.each do |socket|
|
94
94
|
socket.transmit(msg)
|
@@ -115,9 +115,8 @@ module AnyCable
|
|
115
115
|
coder.encode(identifier: channel_id, message: message)
|
116
116
|
end
|
117
117
|
|
118
|
-
|
119
|
-
|
120
|
-
{type: :disconnect, reason: reason, reconnect: reconnect}.to_json
|
118
|
+
def disconnect_message(reason, reconnect, coder)
|
119
|
+
coder.encode({type: :disconnect, reason: reason, reconnect: reconnect})
|
121
120
|
end
|
122
121
|
end
|
123
122
|
end
|
@@ -9,7 +9,7 @@ require "anycable/rack/socket"
|
|
9
9
|
module AnyCable
|
10
10
|
module Rack
|
11
11
|
class Middleware # :nodoc:
|
12
|
-
PROTOCOLS = ["actioncable-v1-json", "actioncable-unsupported"].freeze
|
12
|
+
PROTOCOLS = ["actioncable-v1-json", "actioncable-v1-msgpack", "actioncable-unsupported"].freeze
|
13
13
|
attr_reader :pinger,
|
14
14
|
:hub,
|
15
15
|
:coder,
|
data/lib/anycable/rack/pinger.rb
CHANGED
@@ -8,7 +8,10 @@ module AnyCable
|
|
8
8
|
class Pinger
|
9
9
|
INTERVAL = 3
|
10
10
|
|
11
|
-
|
11
|
+
attr_reader :coder
|
12
|
+
|
13
|
+
def initialize(coder)
|
14
|
+
@coder = coder
|
12
15
|
@_sockets = []
|
13
16
|
@_stopped = false
|
14
17
|
end
|
@@ -45,7 +48,7 @@ module AnyCable
|
|
45
48
|
private
|
46
49
|
|
47
50
|
def ping_message(time)
|
48
|
-
{type: :ping, message: time}
|
51
|
+
coder.encode({type: :ping, message: time})
|
49
52
|
end
|
50
53
|
end
|
51
54
|
end
|
data/lib/anycable/rack/server.rb
CHANGED
@@ -8,7 +8,6 @@ require "anycable/rack/errors"
|
|
8
8
|
require "anycable/rack/middleware"
|
9
9
|
require "anycable/rack/logging"
|
10
10
|
require "anycable/rack/broadcast_subscribers/base_subscriber"
|
11
|
-
require "anycable/rack/coders/json"
|
12
11
|
|
13
12
|
module AnyCable # :nodoc: all
|
14
13
|
module Rack
|
@@ -28,9 +27,8 @@ module AnyCable # :nodoc: all
|
|
28
27
|
def initialize(config: AnyCable::Rack.config)
|
29
28
|
@config = config
|
30
29
|
@hub = Hub.new
|
31
|
-
@
|
32
|
-
|
33
|
-
@coder = Coders::JSON
|
30
|
+
@coder = resolve_coder(config.coder)
|
31
|
+
@pinger = Pinger.new(coder)
|
34
32
|
|
35
33
|
@broadcast = resolve_broadcast_adapter
|
36
34
|
@rpc_client = RPC::Client.new(
|
@@ -112,6 +110,11 @@ module AnyCable # :nodoc: all
|
|
112
110
|
raise ArgumentError, "Unsupported broadcast adatper: #{adapter}. AnyCable Rack server only supports: redis, http"
|
113
111
|
end
|
114
112
|
end
|
113
|
+
|
114
|
+
def resolve_coder(name)
|
115
|
+
require "anycable/rack/coders/#{name}"
|
116
|
+
AnyCable::Rack::Coders.const_get(name.capitalize)
|
117
|
+
end
|
115
118
|
end
|
116
119
|
end
|
117
120
|
end
|
data/lib/anycable/rack/socket.rb
CHANGED
@@ -4,6 +4,17 @@ require "anycable/rack/logging"
|
|
4
4
|
|
5
5
|
module AnyCable
|
6
6
|
module Rack
|
7
|
+
# Wrapper for outgoing data used to correctly set the WS frame type
|
8
|
+
class BinaryFrame
|
9
|
+
def initialize(data)
|
10
|
+
@data = data
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
@data.to_s
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
7
18
|
# Socket wrapper
|
8
19
|
class Socket
|
9
20
|
include Logging
|
@@ -22,7 +33,9 @@ module AnyCable
|
|
22
33
|
@_active = true
|
23
34
|
end
|
24
35
|
|
25
|
-
def transmit(data, type:
|
36
|
+
def transmit(data, type: nil)
|
37
|
+
# p "DATA: #{data.class} — #{data.to_s}"
|
38
|
+
type ||= data.is_a?(BinaryFrame) ? :binary : :text
|
26
39
|
frame = WebSocket::Frame::Outgoing::Server.new(
|
27
40
|
version: version,
|
28
41
|
data: data,
|
@@ -144,7 +157,7 @@ module AnyCable
|
|
144
157
|
end
|
145
158
|
end
|
146
159
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
147
|
-
log(:error, "Socket frame error: #{e}")
|
160
|
+
log(:error, "Socket frame error: #{e}\n #{e.backtrace.take(4).join("\n")}")
|
148
161
|
nil # client disconnected or timed out
|
149
162
|
end
|
150
163
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anycable-rack-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yulia Oletskaya
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-05-
|
12
|
+
date: 2021-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: anyway_config
|
@@ -170,6 +170,7 @@ files:
|
|
170
170
|
- lib/anycable/rack/broadcast_subscribers/http_subscriber.rb
|
171
171
|
- lib/anycable/rack/broadcast_subscribers/redis_subscriber.rb
|
172
172
|
- lib/anycable/rack/coders/json.rb
|
173
|
+
- lib/anycable/rack/coders/msgpack.rb
|
173
174
|
- lib/anycable/rack/config.rb
|
174
175
|
- lib/anycable/rack/connection.rb
|
175
176
|
- lib/anycable/rack/errors.rb
|