anycable-core 1.5.2 โ 1.6.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 +5 -1
- data/README.md +9 -57
- data/lib/anycable/grpc/rpc_services_pb.rb +1 -1
- data/lib/anycable/grpc_kit/server.rb +5 -0
- data/lib/anycable/protos/rpc_pb.rb +2 -1
- data/lib/anycable/rpc/handler.rb +13 -0
- data/lib/anycable/rpc/handlers/command.rb +2 -1
- data/lib/anycable/socket.rb +19 -3
- data/lib/anycable/version.rb +1 -1
- data/sig/anycable/rpc/handler.rbs +1 -0
- data/sig/anycable/rpc.rbs +13 -1
- data/sig/anycable/socket.rbs +4 -0
- metadata +14 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fbdcf86c3e6da895876548c38d63a1de943393851ab3fdd58c59bb583230043
|
4
|
+
data.tar.gz: e190ede53e8278dff5643ba37226aa04bde286b0e273a9e6be3c15731c58c598
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb633d8f1576d46d952c5def4e2be25a201589f1c0dd9f0d9fb9a0081b87a4869800d2c6e6ace0734bed8e50d69660d046831e72595a229641b7ed13fe431513
|
7
|
+
data.tar.gz: 6776f9a094896bf29e16c09dc58a81e9625e256c0e6651ae0cb53a05bb1ac0aa65a394ccd550c63c92722d19e329f3b22c10709723a344e202971e42f2ae3394
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 1.6.0 (2025-03-18)
|
6
|
+
|
7
|
+
- Add presence support. ([@palkan][])
|
8
|
+
|
5
9
|
## 1.5.2 (2024-12-27)
|
6
10
|
|
7
11
|
- Update google-protobuf to version 4 (support Ruby 3.4). ([@le0pard][])
|
@@ -213,7 +217,7 @@ See [#71](https://github.com/anycable/anycable/pull/71).
|
|
213
217
|
|
214
218
|
---
|
215
219
|
|
216
|
-
See [Changelog](https://github.com/anycable/anycable/blob/0-6-stable/CHANGELOG.md) for versions <1.0.0.
|
220
|
+
See [Changelog](https://github.com/anycable/anycable-rb/blob/0-6-stable/CHANGELOG.md) for versions <1.0.0.
|
217
221
|
|
218
222
|
[@palkan]: https://github.com/palkan
|
219
223
|
[@smasry]: https://github.com/smasry
|
data/README.md
CHANGED
@@ -1,77 +1,29 @@
|
|
1
1
|
[](https://rubygems.org/gems/anycable)
|
2
|
-
[](https://github.com/anycable/anycable/actions)
|
3
|
-
[](https://docs.anycable.io/v1)
|
2
|
+
[](https://github.com/anycable/anycable-rb/actions)
|
3
|
+
[](https://docs.anycable.io)
|
5
4
|
|
6
|
-
# AnyCable
|
5
|
+
# AnyCable Ruby SDK
|
7
6
|
|
8
7
|
<img align="right" height="150" width="129"
|
9
8
|
title="AnyCable logo" src="https://docs.anycable.io/assets/images/logo.svg">
|
10
9
|
|
11
|
-
AnyCable
|
10
|
+
[AnyCable](https://anycable.io) is an open-source language-agnostic realtime server for reliable two-way communication. This repository contains the Ruby SDK for AnyCable including RPC server implementations, broadcasting adapters and other utilities that could help you to integrate AnyCable into any Ruby application. For Rails integration, check out a dedicated gem: [anycable-rails](https://github.com/anycable/anycable-rails).
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
> [AnyCable Pro](https://docs.anycable.io/pro) has been launched ๐
|
16
|
-
|
17
|
-
<a href="https://evilmartians.com/">
|
18
|
-
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"></a>
|
12
|
+
๐ [Website](https://anycable.io) ยท ๐ [Documentation](https://docs.anycable.io/ruby/non_rails)
|
19
13
|
|
20
14
|
## Requirements
|
21
15
|
|
22
|
-
- Ruby
|
23
|
-
- Redis or NATS (for broadcasting **in production**, [discuss other options](https://github.com/anycable/anycable/issues/2) with us!)
|
24
|
-
|
25
|
-
## Usage
|
16
|
+
- Ruby 3.0+.
|
26
17
|
|
27
|
-
|
28
|
-
|
29
|
-
## Links
|
18
|
+
## Resources
|
30
19
|
|
31
20
|
- [AnyCable off Rails: connecting Twilio streams with Hanami](https://evilmartians.com/chronicles/anycable-goes-off-rails-connecting-twilio-streams-with-hanami)
|
32
21
|
|
33
|
-
- [AnyCable 1.0: Four years of real-time web with Ruby and Go](https://evilmartians.com/chronicles/anycable-1-0-four-years-of-real-time-web-with-ruby-and-go)
|
34
|
-
|
35
|
-
- [AnyCable: Action Cable on steroids!](https://evilmartians.com/chronicles/anycable-actioncable-on-steroids)
|
36
|
-
|
37
|
-
- [Connecting LiteCable to Hanami](http://gabrielmalakias.com.br/ruby/hanami/iot/2017/05/26/websockets-connecting-litecable-to-hanami.html) by [@GabrielMalakias](https://github.com/GabrielMalakias)
|
38
|
-
|
39
|
-
- [From Action to Any](https://medium.com/@leshchuk/from-action-to-any-1e8d863dd4cf) by [@alekseyl](https://github.com/alekseyl)
|
40
|
-
|
41
|
-
## Talks
|
42
|
-
|
43
|
-
- High-speed cables for Ruby, RubyConf 2018, [slides](https://speakerdeck.com/palkan/rubyconf-2018-high-speed-cables-for-ruby) and [video](https://www.youtube.com/watch?v=8XRcOZXOzV4) (EN)
|
44
|
-
|
45
|
-
- One cable to rule them all, RubyKaigi 2018, [slides](https://speakerdeck.com/palkan/rubykaigi-2018-anycable-one-cable-to-rule-them-all) and [video](https://www.youtube.com/watch?v=jXCPuNICT8s) (EN)
|
46
|
-
|
47
|
-
- Wroc_Love.rb 2018 [slides](https://speakerdeck.com/palkan/wroc-love-dot-rb-2018-cables-cables-cables) and [video](https://www.youtube.com/watch?v=AUxFFOehiy0) (EN)
|
48
|
-
|
49
|
-
- RubyConfMY 2017 [slides](https://speakerdeck.com/palkan/rubyconf-malaysia-2017-anycable) and [video](https://www.youtube.com/watch?v=j5oFx525zNw) (EN)
|
50
|
-
|
51
|
-
- 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)
|
52
|
-
|
53
|
-
## Building
|
54
|
-
|
55
|
-
### Generating gRPC files from `.proto`
|
56
|
-
|
57
|
-
- Install required GRPC gems:
|
58
|
-
|
59
|
-
```sh
|
60
|
-
gem install grpc
|
61
|
-
gem install grpc-tools
|
62
|
-
```
|
63
|
-
|
64
|
-
- Re-generate GRPC files (if necessary):
|
65
|
-
|
66
|
-
```sh
|
67
|
-
make
|
68
|
-
```
|
69
|
-
|
70
22
|
## Contributing
|
71
23
|
|
72
|
-
Bug reports and pull requests are welcome on GitHub at [https://github.com/anycable/anycable](https://github.com/anycable/anycable).
|
24
|
+
Bug reports and pull requests are welcome on GitHub at [https://github.com/anycable/anycable-rb](https://github.com/anycable/anycable-rb).
|
73
25
|
|
74
|
-
Please, provide reproduction script (using [this template](https://github.com/anycable/anycable/blob/master/etc/bug_report_template.rb)) when submitting bugs if possible.
|
26
|
+
Please, provide reproduction script (using [this template](https://github.com/anycable/anycable-rb/blob/master/etc/bug_report_template.rb)) when submitting bugs if possible.
|
75
27
|
|
76
28
|
## License
|
77
29
|
|
@@ -46,6 +46,7 @@ module AnyCable
|
|
46
46
|
|
47
47
|
@tls_credentials = options.delete(:tls_credentials)
|
48
48
|
@grpc_server = build_server(**options)
|
49
|
+
@sock = nil
|
49
50
|
end
|
50
51
|
|
51
52
|
# Start gRPC server in background and
|
@@ -63,6 +64,8 @@ module AnyCable
|
|
63
64
|
|
64
65
|
@start_thread = Thread.new do
|
65
66
|
loop do
|
67
|
+
break unless @sock
|
68
|
+
|
66
69
|
conn = @sock.accept
|
67
70
|
server.run(conn)
|
68
71
|
rescue IOError
|
@@ -118,6 +121,8 @@ module AnyCable
|
|
118
121
|
grpc_server.graceful_shutdown
|
119
122
|
sock.close
|
120
123
|
|
124
|
+
@sock = nil
|
125
|
+
|
121
126
|
logger.info "RPC server stopped"
|
122
127
|
end
|
123
128
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
require "google/protobuf"
|
7
7
|
|
8
|
-
descriptor_data = "\n\trpc.proto\x12\x08\x61nycable\"\xa3\x02\n\x03\x45nv\x12\x0b\n\x03url\x18\x01 \x01(\t\x12+\n\x07headers\x18\x02 \x03(\x0b\x32\x1a.anycable.Env.HeadersEntry\x12)\n\x06\x63state\x18\x03 \x03(\x0b\x32\x19.anycable.Env.CstateEntry\x12)\n\x06istate\x18\x04 \x03(\x0b\x32\x19.anycable.Env.IstateEntry\x1a.\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a-\n\x0b\x43stateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a-\n\x0bIstateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd1\x01\n\x0b\x45nvResponse\x12\x31\n\x06\x63state\x18\x01 \x03(\x0b\x32!.anycable.EnvResponse.CstateEntry\x12\x31\n\x06istate\x18\x02 \x03(\x0b\x32!.anycable.EnvResponse.IstateEntry\x1a-\n\x0b\x43stateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a-\n\x0bIstateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"/\n\x11\x43onnectionRequest\x12\x1a\n\x03\x65nv\x18\x03 \x01(\x0b\x32\r.anycable.Env\"\x99\x01\n\x12\x43onnectionResponse\x12 \n\x06status\x18\x01 \x01(\x0e\x32\x10.anycable.Status\x12\x13\n\x0bidentifiers\x18\x02 \x01(\t\x12\x15\n\rtransmissions\x18\x03 \x03(\t\x12\x11\n\terror_msg\x18\x04 \x01(\t\x12\"\n\x03\x65nv\x18\x05 \x01(\x0b\x32\x15.anycable.EnvResponse\"\x7f\n\x0e\x43ommandMessage\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x12\n\nidentifier\x18\x02 \x01(\t\x12\x1e\n\x16\x63onnection_identifiers\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\t\x12\x1a\n\x03\x65nv\x18\x05 \x01(\x0b\x32\r.anycable.Env\"\
|
8
|
+
descriptor_data = "\n\trpc.proto\x12\x08\x61nycable\"\xa3\x02\n\x03\x45nv\x12\x0b\n\x03url\x18\x01 \x01(\t\x12+\n\x07headers\x18\x02 \x03(\x0b\x32\x1a.anycable.Env.HeadersEntry\x12)\n\x06\x63state\x18\x03 \x03(\x0b\x32\x19.anycable.Env.CstateEntry\x12)\n\x06istate\x18\x04 \x03(\x0b\x32\x19.anycable.Env.IstateEntry\x1a.\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a-\n\x0b\x43stateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a-\n\x0bIstateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xd1\x01\n\x0b\x45nvResponse\x12\x31\n\x06\x63state\x18\x01 \x03(\x0b\x32!.anycable.EnvResponse.CstateEntry\x12\x31\n\x06istate\x18\x02 \x03(\x0b\x32!.anycable.EnvResponse.IstateEntry\x1a-\n\x0b\x43stateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a-\n\x0bIstateEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"G\n\x10PresenceResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0c\n\x04info\x18\x03 \x01(\t\x12\x0b\n\x03ttl\x18\x04 \x01(\r\"/\n\x11\x43onnectionRequest\x12\x1a\n\x03\x65nv\x18\x03 \x01(\x0b\x32\r.anycable.Env\"\x99\x01\n\x12\x43onnectionResponse\x12 \n\x06status\x18\x01 \x01(\x0e\x32\x10.anycable.Status\x12\x13\n\x0bidentifiers\x18\x02 \x01(\t\x12\x15\n\rtransmissions\x18\x03 \x03(\t\x12\x11\n\terror_msg\x18\x04 \x01(\t\x12\"\n\x03\x65nv\x18\x05 \x01(\x0b\x32\x15.anycable.EnvResponse\"\x7f\n\x0e\x43ommandMessage\x12\x0f\n\x07\x63ommand\x18\x01 \x01(\t\x12\x12\n\nidentifier\x18\x02 \x01(\t\x12\x1e\n\x16\x63onnection_identifiers\x18\x03 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\t\x12\x1a\n\x03\x65nv\x18\x05 \x01(\x0b\x32\r.anycable.Env\"\x83\x02\n\x0f\x43ommandResponse\x12 \n\x06status\x18\x01 \x01(\x0e\x32\x10.anycable.Status\x12\x12\n\ndisconnect\x18\x02 \x01(\x08\x12\x14\n\x0cstop_streams\x18\x03 \x01(\x08\x12\x0f\n\x07streams\x18\x04 \x03(\t\x12\x15\n\rtransmissions\x18\x05 \x03(\t\x12\x11\n\terror_msg\x18\x06 \x01(\t\x12\"\n\x03\x65nv\x18\x07 \x01(\x0b\x32\x15.anycable.EnvResponse\x12\x17\n\x0fstopped_streams\x18\x08 \x03(\t\x12,\n\x08presence\x18\t \x01(\x0b\x32\x1a.anycable.PresenceResponse\"[\n\x11\x44isconnectRequest\x12\x13\n\x0bidentifiers\x18\x01 \x01(\t\x12\x15\n\rsubscriptions\x18\x02 \x03(\t\x12\x1a\n\x03\x65nv\x18\x05 \x01(\x0b\x32\r.anycable.Env\"I\n\x12\x44isconnectResponse\x12 \n\x06status\x18\x01 \x01(\x0e\x32\x10.anycable.Status\x12\x11\n\terror_msg\x18\x02 \x01(\t*-\n\x06Status\x12\t\n\x05\x45RROR\x10\x00\x12\x0b\n\x07SUCCESS\x10\x01\x12\x0b\n\x07\x46\x41ILURE\x10\x02\x32\xda\x01\n\x03RPC\x12\x46\n\x07\x43onnect\x12\x1b.anycable.ConnectionRequest\x1a\x1c.anycable.ConnectionResponse\"\x00\x12@\n\x07\x43ommand\x12\x18.anycable.CommandMessage\x1a\x19.anycable.CommandResponse\"\x00\x12I\n\nDisconnect\x12\x1b.anycable.DisconnectRequest\x1a\x1c.anycable.DisconnectResponse\"\x00\x42\x0b\xea\x02\x08\x41nyCableb\x06proto3"
|
9
9
|
|
10
10
|
pool = Google::Protobuf::DescriptorPool.generated_pool
|
11
11
|
pool.add_serialized_file(descriptor_data)
|
@@ -13,6 +13,7 @@ pool.add_serialized_file(descriptor_data)
|
|
13
13
|
module AnyCable
|
14
14
|
Env = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("anycable.Env").msgclass
|
15
15
|
EnvResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("anycable.EnvResponse").msgclass
|
16
|
+
PresenceResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("anycable.PresenceResponse").msgclass
|
16
17
|
ConnectionRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("anycable.ConnectionRequest").msgclass
|
17
18
|
ConnectionResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("anycable.ConnectionResponse").msgclass
|
18
19
|
CommandMessage = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("anycable.CommandMessage").msgclass
|
data/lib/anycable/rpc/handler.rb
CHANGED
@@ -42,6 +42,19 @@ module AnyCable
|
|
42
42
|
)
|
43
43
|
end
|
44
44
|
|
45
|
+
def build_presence_response(socket)
|
46
|
+
return unless socket.presence
|
47
|
+
|
48
|
+
info = socket.presence[:info]
|
49
|
+
info = info.to_json if info && !info.is_a?(String)
|
50
|
+
|
51
|
+
AnyCable::PresenceResponse.new(
|
52
|
+
type: socket.presence.fetch(:type),
|
53
|
+
id: socket.presence.fetch(:id),
|
54
|
+
info: info
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
45
58
|
def logger
|
46
59
|
AnyCable.logger
|
47
60
|
end
|
@@ -27,7 +27,8 @@ module AnyCable
|
|
27
27
|
streams: socket.streams[:start],
|
28
28
|
stopped_streams: socket.streams[:stop],
|
29
29
|
transmissions: socket.transmissions,
|
30
|
-
env: build_env_response(socket)
|
30
|
+
env: build_env_response(socket),
|
31
|
+
presence: build_presence_response(socket)
|
31
32
|
)
|
32
33
|
end
|
33
34
|
end
|
data/lib/anycable/socket.rb
CHANGED
@@ -4,6 +4,7 @@ require "stringio"
|
|
4
4
|
|
5
5
|
module AnyCable
|
6
6
|
WHISPER_KEY = "$w"
|
7
|
+
PRESENCE_KEY = "$p"
|
7
8
|
|
8
9
|
# Socket mock to be used with application connection
|
9
10
|
class Socket
|
@@ -46,7 +47,7 @@ module AnyCable
|
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
49
|
-
attr_reader :transmissions
|
50
|
+
attr_reader :transmissions, :presence
|
50
51
|
|
51
52
|
def initialize(env:)
|
52
53
|
@transmissions = []
|
@@ -58,11 +59,11 @@ module AnyCable
|
|
58
59
|
end
|
59
60
|
|
60
61
|
def subscribe(_channel, broadcasting)
|
61
|
-
streams[:start] << broadcasting
|
62
|
+
streams[:start] << broadcasting unless streams[:start].include?(broadcasting)
|
62
63
|
end
|
63
64
|
|
64
65
|
def unsubscribe(_channel, broadcasting)
|
65
|
-
streams[:stop] << broadcasting
|
66
|
+
streams[:stop] << broadcasting unless streams[:stop].include?(broadcasting)
|
66
67
|
|
67
68
|
if istate.read(WHISPER_KEY) == broadcasting
|
68
69
|
istate.write(WHISPER_KEY, "")
|
@@ -73,6 +74,21 @@ module AnyCable
|
|
73
74
|
istate.write(WHISPER_KEY, broadcasting)
|
74
75
|
end
|
75
76
|
|
77
|
+
def presence_join(broadcasting, id, info)
|
78
|
+
raise ArgumentError, "ID is required for presence tracking" unless id
|
79
|
+
|
80
|
+
subscribe("", broadcasting)
|
81
|
+
istate.write(PRESENCE_KEY, broadcasting)
|
82
|
+
|
83
|
+
@presence = {type: "join", id: id, info: info}.compact
|
84
|
+
end
|
85
|
+
|
86
|
+
def presence_leave(id)
|
87
|
+
raise ArgumentError, "ID is required for presence tracking" unless id
|
88
|
+
|
89
|
+
@presence = {type: "leave", id: id}
|
90
|
+
end
|
91
|
+
|
76
92
|
def unsubscribe_from_all(_channel)
|
77
93
|
@stop_all_streams = true
|
78
94
|
if istate.read(WHISPER_KEY)
|
data/lib/anycable/version.rb
CHANGED
@@ -3,6 +3,7 @@ module AnyCable
|
|
3
3
|
interface _Handler
|
4
4
|
def build_socket: (env: Env) -> Socket
|
5
5
|
def build_env_response: (Socket socket) -> EnvResponse
|
6
|
+
def build_presence_response: (Socket socket) -> PresenceResponse?
|
6
7
|
def logger: () -> Logger
|
7
8
|
def factory: () -> _ConnectionFactory
|
8
9
|
end
|
data/sig/anycable/rpc.rbs
CHANGED
@@ -41,6 +41,16 @@ module AnyCable
|
|
41
41
|
def initialize: (?cstate: protoMap?, ?istate: protoMap?) -> void
|
42
42
|
end
|
43
43
|
|
44
|
+
type presenceEvent = "join" | "leave" | "update"
|
45
|
+
|
46
|
+
class PresenceResponse
|
47
|
+
attr_accessor type: presenceEvent
|
48
|
+
attr_accessor id: String
|
49
|
+
attr_accessor info: String?
|
50
|
+
|
51
|
+
def initialize: (?type: presenceEvent, ?id: String, ?info: String) -> void
|
52
|
+
end
|
53
|
+
|
44
54
|
interface _ProtoMessage
|
45
55
|
def initialize: (**untyped) -> void
|
46
56
|
end
|
@@ -130,6 +140,7 @@ module AnyCable
|
|
130
140
|
attr_accessor error_msg: String?
|
131
141
|
attr_accessor env: EnvResponse
|
132
142
|
attr_accessor stopped_streams: Array[String]
|
143
|
+
attr_accessor presence: PresenceResponse
|
133
144
|
|
134
145
|
%a{rbs:test:skip} def initialize: (
|
135
146
|
status: rpcStatus,
|
@@ -139,7 +150,8 @@ module AnyCable
|
|
139
150
|
?stopped_streams: Array[String],
|
140
151
|
?transmissions: Array[String],
|
141
152
|
?error_msg: String,
|
142
|
-
?env: EnvResponse
|
153
|
+
?env: EnvResponse?,
|
154
|
+
?presence: PresenceResponse?
|
143
155
|
) -> void
|
144
156
|
|
145
157
|
def to_h: () -> Hash[Symbol, untyped]
|
data/sig/anycable/socket.rbs
CHANGED
@@ -15,6 +15,7 @@ module AnyCable
|
|
15
15
|
|
16
16
|
attr_reader transmissions: Array[String]
|
17
17
|
attr_reader request_env: Env
|
18
|
+
attr_reader presence: Hash[Symbol, untyped]?
|
18
19
|
|
19
20
|
def initialize: (env: Env) -> void
|
20
21
|
def transmit: (String) -> void
|
@@ -30,6 +31,9 @@ module AnyCable
|
|
30
31
|
def env: () -> Hash[String, untyped]
|
31
32
|
def cstate: () -> State
|
32
33
|
def istate: () -> State
|
34
|
+
def whisper: (String, String) -> void
|
35
|
+
def presence_join: (String, String, String | Hash[untyped, untyped]) -> void
|
36
|
+
def presence_leave: (String) -> void
|
33
37
|
|
34
38
|
private
|
35
39
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anycable-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
autorequire:
|
7
|
+
- Vladimir Dementyev
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: anyway_config
|
@@ -220,8 +220,8 @@ dependencies:
|
|
220
220
|
- - ">="
|
221
221
|
- !ruby/object:Gem::Version
|
222
222
|
version: 1.9.1
|
223
|
-
description:
|
224
|
-
|
223
|
+
description: Ruby SDK for AnyCable, an open-source realtime server for reliable two-way
|
224
|
+
communication
|
225
225
|
email:
|
226
226
|
- dementiev.vm@gmail.com
|
227
227
|
executables:
|
@@ -309,17 +309,17 @@ files:
|
|
309
309
|
- sig/anycable/streams.rbs
|
310
310
|
- sig/anycable/version.rbs
|
311
311
|
- sig/manifest.yml
|
312
|
-
homepage: http://github.com/anycable/anycable
|
312
|
+
homepage: http://github.com/anycable/anycable-rb
|
313
313
|
licenses:
|
314
314
|
- MIT
|
315
315
|
metadata:
|
316
|
-
bug_tracker_uri: http://github.com/anycable/anycable/issues
|
317
|
-
changelog_uri: https://github.com/anycable/anycable/blob/master/CHANGELOG.md
|
316
|
+
bug_tracker_uri: http://github.com/anycable/anycable-rb/issues
|
317
|
+
changelog_uri: https://github.com/anycable/anycable-rb/blob/master/CHANGELOG.md
|
318
318
|
documentation_uri: https://docs.anycable.io/
|
319
319
|
homepage_uri: https://anycable.io/
|
320
|
-
source_code_uri: http://github.com/anycable/anycable
|
320
|
+
source_code_uri: http://github.com/anycable/anycable-rb
|
321
321
|
funding_uri: https://github.com/sponsors/anycable
|
322
|
-
post_install_message:
|
322
|
+
post_install_message:
|
323
323
|
rdoc_options: []
|
324
324
|
require_paths:
|
325
325
|
- lib
|
@@ -335,7 +335,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
335
335
|
version: '0'
|
336
336
|
requirements: []
|
337
337
|
rubygems_version: 3.4.19
|
338
|
-
signing_key:
|
338
|
+
signing_key:
|
339
339
|
specification_version: 4
|
340
|
-
summary: AnyCable
|
340
|
+
summary: Ruby SDK for AnyCable, an open-source realtime server for reliable two-way
|
341
|
+
communication
|
341
342
|
test_files: []
|