slack-ruby-client 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|