rocket_chat-realtime 0.1.0 → 0.1.1
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/Gemfile.lock +10 -9
- data/README.md +58 -6
- data/lib/rocket_chat/realtime/adapter.rb +20 -9
- data/lib/rocket_chat/realtime/client.rb +17 -6
- data/lib/rocket_chat/realtime/reactor.rb +2 -0
- data/lib/rocket_chat/realtime/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bb47488855acda343dbd9c40235cd4c1335a84054fe398d316a667c82882bdd
|
4
|
+
data.tar.gz: 8afcf13cd2d6ae9a7e0b6fb0ed4cb773b3534bd6e74fac8e873c23d72343702c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a5cc9722b8aa5edce1de87ebebe1f8cf4cbfb14496460f37505aead18d9bbbdba03492d694dd8dba76021a59ff32aacfefdf193845ea7fe4e4ac19b49619cd9
|
7
|
+
data.tar.gz: a2b35855823bc1f0ab8c6e06023d8bab32bb18161ebf2464134981c793f1550d0ae20f6268e654477647bf602806eb8d1b3d968d0c2ccc7ff8e91cd8c332f640
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rocket_chat-realtime (0.1.
|
4
|
+
rocket_chat-realtime (0.1.1)
|
5
5
|
concurrent-ruby (~> 1.1)
|
6
6
|
nio4r (~> 2.5)
|
7
7
|
websocket-driver (~> 0.7)
|
@@ -22,7 +22,7 @@ GEM
|
|
22
22
|
docile (1.3.2)
|
23
23
|
iniparse (1.5.0)
|
24
24
|
method_source (1.0.0)
|
25
|
-
nio4r (2.5.
|
25
|
+
nio4r (2.5.4)
|
26
26
|
overcommit (0.55.0)
|
27
27
|
childprocess (>= 0.6.3, < 5)
|
28
28
|
iniparse (~> 1.4)
|
@@ -34,7 +34,7 @@ GEM
|
|
34
34
|
method_source (~> 1.0)
|
35
35
|
rainbow (3.0.0)
|
36
36
|
rake (12.3.3)
|
37
|
-
regexp_parser (1.
|
37
|
+
regexp_parser (1.8.0)
|
38
38
|
rexml (3.2.4)
|
39
39
|
rspec (3.9.0)
|
40
40
|
rspec-core (~> 3.9.0)
|
@@ -60,19 +60,20 @@ GEM
|
|
60
60
|
rubocop-ast (>= 0.3.0, < 1.0)
|
61
61
|
ruby-progressbar (~> 1.7)
|
62
62
|
unicode-display_width (>= 1.4.0, < 2.0)
|
63
|
-
rubocop-ast (0.
|
63
|
+
rubocop-ast (0.4.2)
|
64
64
|
parser (>= 2.7.1.4)
|
65
|
-
rubocop-performance (1.
|
66
|
-
rubocop (>= 0.
|
67
|
-
|
68
|
-
|
65
|
+
rubocop-performance (1.8.1)
|
66
|
+
rubocop (>= 0.87.0)
|
67
|
+
rubocop-ast (>= 0.4.0)
|
68
|
+
rubocop-rspec (1.43.2)
|
69
|
+
rubocop (~> 0.87)
|
69
70
|
rubocop-thread_safety (0.4.1)
|
70
71
|
rubocop (>= 0.51.0)
|
71
72
|
ruby-progressbar (1.10.1)
|
72
73
|
simplecov (0.19.0)
|
73
74
|
docile (~> 1.1)
|
74
75
|
simplecov-html (~> 0.11)
|
75
|
-
simplecov-html (0.12.
|
76
|
+
simplecov-html (0.12.3)
|
76
77
|
thor (1.0.1)
|
77
78
|
unicode-display_width (1.7.0)
|
78
79
|
websocket-driver (0.7.3)
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# RocketChat::Realtime
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
The ruby implement for [RocketChat Realtime API](https://docs.rocket.chat/api/realtime-api).
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,7 +20,61 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
### Create a client
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
client = RocketChat::Realtime::Client.new(server: 'wss://chat.example.com')
|
27
|
+
```
|
28
|
+
|
29
|
+
### Connect to server
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
client.connect
|
33
|
+
```
|
34
|
+
|
35
|
+
or use a shortcut via `.connect`
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
client = RocketChat::Realtime.connect(server: 'wss://chat.example.com')
|
39
|
+
```
|
40
|
+
|
41
|
+
### Login to server
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
client.login(username, password)
|
45
|
+
```
|
46
|
+
|
47
|
+
The Realtime API is async and depend on the Metro.js DDP, we can use `Concurrent::Promises` to capture the return message.
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
client
|
51
|
+
.login(username, password)
|
52
|
+
.then { |res| puts "Token is #{res['token']}" }
|
53
|
+
```
|
54
|
+
|
55
|
+
### Subscribe room messages
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
client
|
59
|
+
.subscribe_room_messages('ROOM_ID')
|
60
|
+
.then { puts 'Ready!' }
|
61
|
+
```
|
62
|
+
|
63
|
+
### Process room messages
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
client.on('stream-room-messages') do |message|
|
67
|
+
puts "Received message: #{message['args'][0]['msg']}"
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
### Send message
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
client
|
75
|
+
.send_message('ROOM_ID', 'MESSAGE')
|
76
|
+
.then { |res| puts 'Success' }
|
77
|
+
```
|
26
78
|
|
27
79
|
## Development
|
28
80
|
|
@@ -32,9 +84,9 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
84
|
|
33
85
|
## Contributing
|
34
86
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
87
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/5xRuby/rocket_chat-realtime. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/5xRuby/rocket_chat-realtime/blob/master/CODE_OF_CONDUCT.md).
|
36
88
|
|
37
89
|
|
38
90
|
## Code of Conduct
|
39
91
|
|
40
|
-
Everyone interacting in the RocketChat::Realtime project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
92
|
+
Everyone interacting in the RocketChat::Realtime project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/5xRuby/rocket_chat-realtime/blob/master/CODE_OF_CONDUCT.md).
|
@@ -7,17 +7,26 @@ module RocketChat
|
|
7
7
|
# @since 0.1.0
|
8
8
|
class Adapter
|
9
9
|
# @since 0.1.0
|
10
|
-
attr_reader :url
|
10
|
+
attr_reader :url, :monitor
|
11
11
|
|
12
12
|
# @param url [String] the server to connect
|
13
13
|
#
|
14
14
|
# @since 0.1.0
|
15
|
-
def initialize(url)
|
15
|
+
def initialize(url, monitor)
|
16
16
|
@url = url
|
17
|
+
@monitor = monitor
|
17
18
|
@mutex = Mutex.new
|
18
19
|
@buffer = ''
|
19
20
|
end
|
20
21
|
|
22
|
+
def pending?
|
23
|
+
@buffer.empty? == false
|
24
|
+
end
|
25
|
+
|
26
|
+
def dispose
|
27
|
+
@monitor = nil
|
28
|
+
end
|
29
|
+
|
21
30
|
# Enqueue data to send to server
|
22
31
|
#
|
23
32
|
# @param data [String]
|
@@ -25,6 +34,8 @@ module RocketChat
|
|
25
34
|
# @since 0.1.0
|
26
35
|
def write(data)
|
27
36
|
@mutex.synchronize { @buffer = @buffer.dup.concat(data) }
|
37
|
+
pump_buffer
|
38
|
+
Reactor.selector.wakeup unless monitor.interests == :r
|
28
39
|
end
|
29
40
|
|
30
41
|
# Pump Buffer
|
@@ -34,17 +45,17 @@ module RocketChat
|
|
34
45
|
# @return [Number] total bytes written
|
35
46
|
#
|
36
47
|
# @since 0.1.0
|
37
|
-
def pump_buffer
|
48
|
+
def pump_buffer
|
38
49
|
@mutex.synchronize do
|
39
50
|
written = 0
|
40
|
-
|
41
|
-
|
42
|
-
@buffer = @buffer.byteslice(written..-1) if written.positive?
|
43
|
-
rescue IO::WaitWritable, IO::WaitReadable
|
44
|
-
return written
|
45
|
-
end
|
51
|
+
written = monitor.io.write_nonblock @buffer unless @buffer.empty?
|
52
|
+
@buffer = @buffer.byteslice(written..-1) if written.positive?
|
46
53
|
written
|
47
54
|
end
|
55
|
+
rescue IO::WaitWritable, IO::WaitReadable
|
56
|
+
written
|
57
|
+
ensure
|
58
|
+
monitor.interests = pending? ? :rw : :r
|
48
59
|
end
|
49
60
|
end
|
50
61
|
end
|
@@ -33,7 +33,7 @@ module RocketChat
|
|
33
33
|
delegate %w[ping pong] => :driver
|
34
34
|
|
35
35
|
# @since 0.1.0
|
36
|
-
attr_reader :server, :connector, :adapter, :driver
|
36
|
+
attr_reader :server, :connector, :adapter, :driver, :dispatcher
|
37
37
|
|
38
38
|
# @param options [Hash]
|
39
39
|
#
|
@@ -41,9 +41,6 @@ module RocketChat
|
|
41
41
|
def initialize(options = {})
|
42
42
|
@server = options[:server]
|
43
43
|
@connector = Connector.new(endpoint)
|
44
|
-
@adapter = Adapter.new(endpoint)
|
45
|
-
@driver = WebSocket::Driver.client(adapter)
|
46
|
-
@dispatcher = Dispatcher.new(self)
|
47
44
|
end
|
48
45
|
|
49
46
|
# @return [String] the realtime api endpoint
|
@@ -53,19 +50,32 @@ module RocketChat
|
|
53
50
|
"#{server}/websocket"
|
54
51
|
end
|
55
52
|
|
53
|
+
# Add to reactor
|
54
|
+
#
|
55
|
+
# @since 0.1.0
|
56
|
+
def add_to_reactor
|
57
|
+
monitor = Reactor.register(self)
|
58
|
+
return if monitor.nil?
|
59
|
+
|
60
|
+
@adapter = Adapter.new(endpoint, monitor)
|
61
|
+
@driver = WebSocket::Driver.client(adapter)
|
62
|
+
@dispatcher = Dispatcher.new(self)
|
63
|
+
end
|
64
|
+
|
56
65
|
# Connect to server
|
57
66
|
#
|
58
67
|
# @since 0.1.0
|
59
68
|
def connect
|
69
|
+
add_to_reactor
|
60
70
|
driver.start
|
61
71
|
driver.text(INITIALIZE_COMMAND.to_json)
|
62
|
-
Reactor.register(self)
|
63
72
|
end
|
64
73
|
|
65
74
|
# Close connection to server
|
66
75
|
#
|
67
76
|
# @since 0.1.0
|
68
77
|
def disconnect
|
78
|
+
@adapter.dispose
|
69
79
|
@dispatcher.dispose
|
70
80
|
driver.close
|
71
81
|
Reactor.deregister(self)
|
@@ -86,8 +96,9 @@ module RocketChat
|
|
86
96
|
#
|
87
97
|
# @since 0.1.0
|
88
98
|
def process(monitor)
|
99
|
+
monitor.interests = adapter.pending? ? :rw : :r
|
89
100
|
driver.parse(monitor.io.read_nonblock(2**14)) if monitor.readable?
|
90
|
-
adapter.pump_buffer
|
101
|
+
adapter.pump_buffer if monitor.writeable?
|
91
102
|
rescue IO::WaitReadable, IO::WaitWritable
|
92
103
|
# nope
|
93
104
|
rescue Errno::ECONNRESET, EOFError, Errno::ECONNABORTED
|
@@ -25,6 +25,7 @@ module RocketChat
|
|
25
25
|
stop
|
26
26
|
stopped?
|
27
27
|
reset
|
28
|
+
wakeup
|
28
29
|
] => :instance
|
29
30
|
end
|
30
31
|
|
@@ -64,6 +65,7 @@ module RocketChat
|
|
64
65
|
@clients.add(client)
|
65
66
|
monitor = selector.register(client.connector.socket, :rw)
|
66
67
|
monitor.value = client
|
68
|
+
monitor
|
67
69
|
end
|
68
70
|
|
69
71
|
# Deregister Client
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rocket_chat-realtime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 5xRuby
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-09-
|
11
|
+
date: 2020-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|