slack-ruby-client 0.12.0 → 0.13.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/.rubocop_todo.yml +1 -1
- data/.travis.yml +2 -0
- data/CHANGELOG.md +7 -0
- data/README.md +15 -6
- data/UPGRADING.md +17 -1
- data/examples/hi_real_time_async_async/Gemfile +6 -0
- data/examples/hi_real_time_async_async/Procfile +2 -0
- data/examples/hi_real_time_async_async/hi.rb +37 -0
- data/lib/slack/real_time/concurrency.rb +1 -0
- data/lib/slack/real_time/concurrency/async.rb +67 -0
- data/lib/slack/real_time/concurrency/celluloid.rb +3 -18
- data/lib/slack/real_time/concurrency/eventmachine.rb +8 -2
- data/lib/slack/real_time/config.rb +2 -2
- data/lib/slack/version.rb +1 -1
- data/spec/integration/integration_spec.rb +1 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a9bf266ef0726336ea6cdd36426970d5a21663646cf066e72a74a23b4c175d6
|
4
|
+
data.tar.gz: e36dd13202ddfe6bb65cc2bfde27f8ac27350da4114dfdf9545d1c6f2d0f0611
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ab13f62322d8f5b9f3b6723a003fc7303806b03f42a68d53eaf2bf12d6f96375d895c03ce6a4657cd26f74ce2c137fb04c4b88946ff0e3c5dbd8076ea285ee2
|
7
|
+
data.tar.gz: cf23b660a516ce28249b8de57e814bd997e828f712c467db46c28a6ea9be64827cf82d594369df686b4ab3c00c4a4968a40f83308b73d49b19469d667c385551
|
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2018-08-
|
3
|
+
# on 2018-08-27 13:29:57 +0200 using RuboCop version 0.58.2.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
### 0.13.0 (Next)
|
2
|
+
|
3
|
+
* [#219](https://github.com/slack-ruby/slack-ruby-client/pull/219): Added support for `async-websocket` - [@dblock](https://github.com/dblock), [@ioquatix](https://github.com/ioquatix).
|
4
|
+
* [#224](https://github.com/slack-ruby/slack-ruby-client/pull/224): Celluloid async support now uses a thread per client - [@dblock](https://github.com/dblock).
|
5
|
+
* [#224](https://github.com/slack-ruby/slack-ruby-client/pull/224): Attempt to shutdown EventMachine if a reactor wasn't already running on start - [@dblock](https://github.com/dblock).
|
6
|
+
* Your contribution here.
|
7
|
+
|
1
8
|
### 0.12.0 (8/20/2018)
|
2
9
|
|
3
10
|
* [#216](https://github.com/slack-ruby/slack-ruby-client/pull/216): Handle `Errno::ECONNRESET` and empty buffer reads with celluloid-io - [@dblock](https://github.com/dblock).
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ A Ruby client for the Slack [Web](https://api.slack.com/web) and [RealTime Messa
|
|
18
18
|
|
19
19
|
## Stable Release
|
20
20
|
|
21
|
-
You're reading the documentation for the **stable** release of slack-ruby-client,
|
21
|
+
You're reading the documentation for the **stable** release of slack-ruby-client, v0.13.0. See [UPGRADING](UPGRADING.md) when upgrading from an older version.
|
22
22
|
|
23
23
|
## Installation
|
24
24
|
|
@@ -28,11 +28,10 @@ Add to Gemfile.
|
|
28
28
|
gem 'slack-ruby-client'
|
29
29
|
```
|
30
30
|
|
31
|
-
If you're going to be using the RealTime client, add either `eventmachine` and `faye-websocket` or `celluloid-io`. See below for more information about concurrency.
|
31
|
+
If you're going to be using the RealTime client, add either `async-websocket`, `eventmachine` and `faye-websocket` or `celluloid-io`. See below for more information about concurrency. We recommend you use `async-websocket`.
|
32
32
|
|
33
33
|
```
|
34
|
-
gem '
|
35
|
-
gem 'faye-websocket'
|
34
|
+
gem 'async-websocket'
|
36
35
|
```
|
37
36
|
|
38
37
|
Run `bundle install`.
|
@@ -374,11 +373,11 @@ See [#134](https://github.com/slack-ruby/slack-ruby-client/issues/134) for a dis
|
|
374
373
|
|
375
374
|
#### Concurrency
|
376
375
|
|
377
|
-
`Slack::RealTime::Client` needs help from a concurrency library and supports [Faye::WebSocket](https://github.com/faye/faye-websocket-ruby) with [Eventmachine](https://github.com/eventmachine/eventmachine) and [Celluloid](https://github.com/celluloid/celluloid). It will auto-detect one or the other depending on the gems in your Gemfile, but you can also set concurrency explicitly.
|
376
|
+
`Slack::RealTime::Client` needs help from a concurrency library and supports [Async](https://github.com/socketry/async), [Faye::WebSocket](https://github.com/faye/faye-websocket-ruby) with [Eventmachine](https://github.com/eventmachine/eventmachine) and [Celluloid](https://github.com/celluloid/celluloid). It will auto-detect one or the other depending on the gems in your Gemfile, but you can also set concurrency explicitly.
|
378
377
|
|
379
378
|
```ruby
|
380
379
|
Slack::RealTime.configure do |config|
|
381
|
-
config.concurrency = Slack::RealTime::Concurrency::
|
380
|
+
config.concurrency = Slack::RealTime::Concurrency::Async
|
382
381
|
end
|
383
382
|
```
|
384
383
|
|
@@ -390,6 +389,16 @@ client = Slack::RealTime::Client.new
|
|
390
389
|
client.start_async
|
391
390
|
```
|
392
391
|
|
392
|
+
##### Async
|
393
|
+
|
394
|
+
This is the recommended library. Add `async-websocket` to your Gemfile.
|
395
|
+
|
396
|
+
```
|
397
|
+
gem 'async-websocket'
|
398
|
+
```
|
399
|
+
|
400
|
+
See a fully working example in [examples/hi_real_time_async_async](examples/hi_real_time_async_async/hi.rb).
|
401
|
+
|
393
402
|
##### Faye::Websocket with Eventmachine
|
394
403
|
|
395
404
|
Add the following to your Gemfile.
|
data/UPGRADING.md
CHANGED
@@ -1,6 +1,22 @@
|
|
1
1
|
Upgrading Slack-Ruby-Client
|
2
2
|
===========================
|
3
3
|
|
4
|
+
### Upgrading to >= 0.13.0
|
5
|
+
|
6
|
+
#### Recommended Async Library
|
7
|
+
|
8
|
+
The RealTime client now supports [async-websocket](https://github.com/socketry/async-websocket), which is actively maintained and is now the recommended library.
|
9
|
+
|
10
|
+
See [#219](https://github.com/slack-ruby/slack-ruby-client/pull/219) for implementation details.
|
11
|
+
|
12
|
+
#### Async Library Threading and Reactor Changes
|
13
|
+
|
14
|
+
The RealTime celluloid-io implementation now uses a `Thread` per client. Previous versions used an `Actor`.
|
15
|
+
|
16
|
+
The faye-websocket implementation with EventMachine will attempt to shutdown EventMachine via `EventMachine.stop` upon shutdown if a reactor wasn't already running.
|
17
|
+
|
18
|
+
See [#224](https://github.com/slack-ruby/slack-ruby-client/pull/224) for more information.
|
19
|
+
|
4
20
|
### Upgrading to >= 0.9.0
|
5
21
|
|
6
22
|
#### Changes in How the RTM Client Connects
|
@@ -37,7 +53,7 @@ Slack::RealTime::Client.config do |config|
|
|
37
53
|
end
|
38
54
|
```
|
39
55
|
|
40
|
-
See [#136](https://github.com/slack-ruby/slack-ruby-client/pull/136) for more
|
56
|
+
See [#136](https://github.com/slack-ruby/slack-ruby-client/pull/136) for more information.
|
41
57
|
|
42
58
|
### Upgrading to >= 0.6.0
|
43
59
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'slack-ruby-client'
|
2
|
+
require 'async'
|
3
|
+
|
4
|
+
raise 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
|
5
|
+
|
6
|
+
$stdout.sync = true
|
7
|
+
logger = Logger.new($stdout)
|
8
|
+
logger.level = Logger::DEBUG
|
9
|
+
|
10
|
+
threads = []
|
11
|
+
|
12
|
+
ENV['SLACK_API_TOKENS'].split.each do |token|
|
13
|
+
logger.info "Starting #{token[0..12]} ..."
|
14
|
+
|
15
|
+
client = Slack::RealTime::Client.new(token: token)
|
16
|
+
|
17
|
+
client.on :hello do
|
18
|
+
logger.info "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
|
19
|
+
end
|
20
|
+
|
21
|
+
client.on :message do |data|
|
22
|
+
logger.info data
|
23
|
+
|
24
|
+
client.typing channel: data.channel
|
25
|
+
|
26
|
+
case data.text
|
27
|
+
when /hi/ then
|
28
|
+
client.message channel: data.channel, text: "Hi <@#{data.user}>!"
|
29
|
+
else
|
30
|
+
client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
threads << client.start_async
|
35
|
+
end
|
36
|
+
|
37
|
+
threads.each(&:join)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'async/websocket'
|
2
|
+
|
3
|
+
module Slack
|
4
|
+
module RealTime
|
5
|
+
module Concurrency
|
6
|
+
module Async
|
7
|
+
class Client < ::Async::WebSocket::Client
|
8
|
+
extend ::Forwardable
|
9
|
+
def_delegators :@driver, :on, :text, :binary, :emit
|
10
|
+
end
|
11
|
+
|
12
|
+
class Socket < Slack::RealTime::Socket
|
13
|
+
attr_reader :client
|
14
|
+
|
15
|
+
def start_async(client)
|
16
|
+
Thread.new do
|
17
|
+
::Async::Reactor.run do
|
18
|
+
client.run_loop
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def connect!
|
24
|
+
super
|
25
|
+
run_loop
|
26
|
+
end
|
27
|
+
|
28
|
+
def close
|
29
|
+
@closing = true
|
30
|
+
@driver.close if @driver
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def run_loop
|
35
|
+
@closing = false
|
36
|
+
while @driver && @driver.next_event
|
37
|
+
# $stderr.puts event.inspect
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def build_ssl_context
|
44
|
+
OpenSSL::SSL::SSLContext.new(:TLSv1_2_client).tap do |ctx|
|
45
|
+
ctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_PEER)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def build_endpoint
|
50
|
+
endpoint = ::Async::IO::Endpoint.tcp(addr, port)
|
51
|
+
endpoint = ::Async::IO::SSLEndpoint.new(endpoint, ssl_context: build_ssl_context) if secure?
|
52
|
+
endpoint
|
53
|
+
end
|
54
|
+
|
55
|
+
def connect_socket
|
56
|
+
build_endpoint.connect
|
57
|
+
end
|
58
|
+
|
59
|
+
def connect
|
60
|
+
@socket = connect_socket
|
61
|
+
@driver = Client.new(@socket, url)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -68,12 +68,9 @@ module Slack
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def start_async(client)
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
def run_client_loop
|
76
|
-
@client.run_loop
|
71
|
+
Thread.new do
|
72
|
+
client.run_loop
|
73
|
+
end
|
77
74
|
end
|
78
75
|
|
79
76
|
def connected?
|
@@ -82,18 +79,6 @@ module Slack
|
|
82
79
|
|
83
80
|
protected
|
84
81
|
|
85
|
-
class Actor
|
86
|
-
attr_reader :future
|
87
|
-
|
88
|
-
def initialize(future)
|
89
|
-
@future = future
|
90
|
-
end
|
91
|
-
|
92
|
-
def join
|
93
|
-
@future.value
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
82
|
def build_socket
|
98
83
|
socket = ::Celluloid::IO::TCPSocket.new(addr, port)
|
99
84
|
socket = ::Celluloid::IO::SSLSocket.new(socket, build_ssl_context) if secure?
|
@@ -27,11 +27,17 @@ module Slack
|
|
27
27
|
|
28
28
|
class Socket < Slack::RealTime::Socket
|
29
29
|
def start_async(client)
|
30
|
-
thread = ensure_reactor_running
|
30
|
+
@thread = ensure_reactor_running
|
31
31
|
|
32
32
|
client.run_loop
|
33
33
|
|
34
|
-
thread
|
34
|
+
@thread
|
35
|
+
end
|
36
|
+
|
37
|
+
def close
|
38
|
+
super
|
39
|
+
EventMachine.stop if @thread
|
40
|
+
@thread = nil
|
35
41
|
end
|
36
42
|
|
37
43
|
def send_data(message)
|
@@ -36,7 +36,7 @@ module Slack
|
|
36
36
|
private
|
37
37
|
|
38
38
|
def detect_concurrency
|
39
|
-
%i[Eventmachine Celluloid].each do |concurrency|
|
39
|
+
%i[Async Eventmachine Celluloid].each do |concurrency|
|
40
40
|
begin
|
41
41
|
return Slack::RealTime::Concurrency.const_get(concurrency)
|
42
42
|
rescue LoadError, NameError
|
@@ -44,7 +44,7 @@ module Slack
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
raise NoConcurrencyError, 'Missing concurrency. Add faye-websocket or celluloid-io to your Gemfile.'
|
47
|
+
raise NoConcurrencyError, 'Missing concurrency. Add async-websocket, faye-websocket or celluloid-io to your Gemfile.'
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
data/lib/slack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack-ruby-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08
|
11
|
+
date: 2018-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -256,6 +256,9 @@ files:
|
|
256
256
|
- examples/hi_real_time_and_web/Gemfile
|
257
257
|
- examples/hi_real_time_and_web/hi.gif
|
258
258
|
- examples/hi_real_time_and_web/hi.rb
|
259
|
+
- examples/hi_real_time_async_async/Gemfile
|
260
|
+
- examples/hi_real_time_async_async/Procfile
|
261
|
+
- examples/hi_real_time_async_async/hi.rb
|
259
262
|
- examples/hi_real_time_async_celluloid/Gemfile
|
260
263
|
- examples/hi_real_time_async_celluloid/Procfile
|
261
264
|
- examples/hi_real_time_async_celluloid/hi.rb
|
@@ -281,6 +284,7 @@ files:
|
|
281
284
|
- lib/slack/real_time/api/typing.rb
|
282
285
|
- lib/slack/real_time/client.rb
|
283
286
|
- lib/slack/real_time/concurrency.rb
|
287
|
+
- lib/slack/real_time/concurrency/async.rb
|
284
288
|
- lib/slack/real_time/concurrency/celluloid.rb
|
285
289
|
- lib/slack/real_time/concurrency/eventmachine.rb
|
286
290
|
- lib/slack/real_time/config.rb
|