rocket_chat-realtime 0.1.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 +7 -0
- data/.gitignore +11 -0
- data/.gitlab-ci.yml +50 -0
- data/.overcommit.yml +20 -0
- data/.rspec +3 -0
- data/.rubocop.yml +12 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +100 -0
- data/LICENSE +201 -0
- data/README.md +40 -0
- data/Rakefile +8 -0
- data/bin/console +12 -0
- data/bin/setup +8 -0
- data/lib/rocket_chat/realtime.rb +58 -0
- data/lib/rocket_chat/realtime/adapter.rb +51 -0
- data/lib/rocket_chat/realtime/async_task.rb +60 -0
- data/lib/rocket_chat/realtime/client.rb +100 -0
- data/lib/rocket_chat/realtime/connector.rb +79 -0
- data/lib/rocket_chat/realtime/dispatcher.rb +80 -0
- data/lib/rocket_chat/realtime/event_emitter.rb +65 -0
- data/lib/rocket_chat/realtime/handlers/base.rb +52 -0
- data/lib/rocket_chat/realtime/handlers/changed.rb +31 -0
- data/lib/rocket_chat/realtime/handlers/ready.rb +23 -0
- data/lib/rocket_chat/realtime/handlers/result.rb +34 -0
- data/lib/rocket_chat/realtime/message.rb +40 -0
- data/lib/rocket_chat/realtime/messages/changed.rb +44 -0
- data/lib/rocket_chat/realtime/messages/method.rb +37 -0
- data/lib/rocket_chat/realtime/messages/result.rb +40 -0
- data/lib/rocket_chat/realtime/messages/subscribe.rb +37 -0
- data/lib/rocket_chat/realtime/methods/auth.rb +33 -0
- data/lib/rocket_chat/realtime/methods/message.rb +33 -0
- data/lib/rocket_chat/realtime/reactor.rb +123 -0
- data/lib/rocket_chat/realtime/subscriptions/room.rb +30 -0
- data/lib/rocket_chat/realtime/version.rb +7 -0
- data/rocket_chat-realtime.gemspec +31 -0
- metadata +122 -0
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'concurrent'
|
4
|
+
|
5
|
+
module RocketChat
|
6
|
+
module Realtime
|
7
|
+
# Provide event listener support
|
8
|
+
#
|
9
|
+
# @since 0.1.0
|
10
|
+
module EventEmitter
|
11
|
+
# Register event listener
|
12
|
+
#
|
13
|
+
# @param event [String] event name
|
14
|
+
# @param callback [Proc] event handler
|
15
|
+
#
|
16
|
+
# @since 0.1.0
|
17
|
+
def on(event, &callback)
|
18
|
+
listeners.compute(event.to_s) do |current|
|
19
|
+
current ||= []
|
20
|
+
current.push(callback)
|
21
|
+
current
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Deregister event listener
|
26
|
+
#
|
27
|
+
# @param event [String] event name
|
28
|
+
# @param callback [Proc] callback to remove
|
29
|
+
#
|
30
|
+
# @since 0.1.0
|
31
|
+
def off(event, &callback)
|
32
|
+
listeners.compute(event.to_s) do |current|
|
33
|
+
current ||= []
|
34
|
+
current.delete(callback)
|
35
|
+
return nil if current.empty?
|
36
|
+
|
37
|
+
current
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Publish event
|
42
|
+
#
|
43
|
+
# @param event [String] event name
|
44
|
+
# @param data [Object] event to publish
|
45
|
+
#
|
46
|
+
# @since 0.1.0
|
47
|
+
def emit(event, data)
|
48
|
+
listeners[event.to_s]&.each do |listener|
|
49
|
+
listener.call(data)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
protected
|
54
|
+
|
55
|
+
# Event Listeners
|
56
|
+
#
|
57
|
+
# @return [Concurrent::Map]
|
58
|
+
#
|
59
|
+
# @since 0.1.0
|
60
|
+
def listeners
|
61
|
+
@listeners ||= Concurrent::Map.new
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
require 'rocket_chat/realtime/handlers/base'
|
6
|
+
|
7
|
+
module RocketChat
|
8
|
+
module Realtime
|
9
|
+
module Handlers
|
10
|
+
# Base Message Handler
|
11
|
+
#
|
12
|
+
# @since 0.1.0
|
13
|
+
class Base
|
14
|
+
class << self
|
15
|
+
# Dispatch message
|
16
|
+
#
|
17
|
+
# @param dispatcher [RocketChat::Realtime::Dispatcher]
|
18
|
+
# @param message [Hash] the message from server
|
19
|
+
#
|
20
|
+
# @since 0.1.0
|
21
|
+
def call(dispatcher, message)
|
22
|
+
new(dispatcher, message).process
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
extend Forwardable
|
27
|
+
|
28
|
+
# @since 0.1.0
|
29
|
+
attr_reader :dispatcher, :message
|
30
|
+
|
31
|
+
# @since 0.1.0
|
32
|
+
delegate %w[client] => :dispatcher
|
33
|
+
|
34
|
+
# @param dispatcher [RocketChat::Realtime::Dispatcher]
|
35
|
+
# @param message [Hash] the message from server
|
36
|
+
#
|
37
|
+
# @since 0.1.0
|
38
|
+
def initialize(dispatcher, message)
|
39
|
+
@dispatcher = dispatcher
|
40
|
+
@message = message
|
41
|
+
end
|
42
|
+
|
43
|
+
# Process message
|
44
|
+
#
|
45
|
+
# @since 0.1.0
|
46
|
+
def process
|
47
|
+
raise NotImplementedError
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rocket_chat/realtime/handlers/base'
|
4
|
+
require 'rocket_chat/realtime/messages/changed'
|
5
|
+
|
6
|
+
module RocketChat
|
7
|
+
module Realtime
|
8
|
+
module Handlers
|
9
|
+
# Changed Message Handler
|
10
|
+
#
|
11
|
+
# The DDP Subscribe changed event
|
12
|
+
#
|
13
|
+
# @since 0.1.0
|
14
|
+
class Changed < Base
|
15
|
+
# Changed
|
16
|
+
#
|
17
|
+
# @return [RocketChat::Realtime::Messages::Changed]
|
18
|
+
#
|
19
|
+
# @since 0.1.0
|
20
|
+
def changed
|
21
|
+
Messages::Changed.new(message['id'], message)
|
22
|
+
end
|
23
|
+
|
24
|
+
# @see RocketChat::Realtime::Handlers::Base#process
|
25
|
+
def process
|
26
|
+
client.emit(changed.collection, changed)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rocket_chat/realtime/handlers/base'
|
4
|
+
|
5
|
+
module RocketChat
|
6
|
+
module Realtime
|
7
|
+
module Handlers
|
8
|
+
# Ready Message Handler
|
9
|
+
#
|
10
|
+
# The DDP Subscribe success event
|
11
|
+
#
|
12
|
+
# @since 0.1.0
|
13
|
+
class Ready < Base
|
14
|
+
# @see RocketChat::Realtime::Handlers::Base#process
|
15
|
+
def process
|
16
|
+
message['subs']&.each do |id|
|
17
|
+
AsyncTask.resolve(id)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rocket_chat/realtime/handlers/base'
|
4
|
+
require 'rocket_chat/realtime/messages/result'
|
5
|
+
|
6
|
+
module RocketChat
|
7
|
+
module Realtime
|
8
|
+
module Handlers
|
9
|
+
# Result Message Handler
|
10
|
+
#
|
11
|
+
# The DDP RPC return value
|
12
|
+
#
|
13
|
+
# @since 0.1.0
|
14
|
+
class Result < Base
|
15
|
+
# The message result
|
16
|
+
#
|
17
|
+
# @return [RocketChat::Realtime::Messages::Result]
|
18
|
+
#
|
19
|
+
# @since 0.1.0
|
20
|
+
def result
|
21
|
+
Messages::Result.new(
|
22
|
+
message['id'],
|
23
|
+
message['result']
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
# @see RocketChat::Realtime::Handlers::Base#process
|
28
|
+
def process
|
29
|
+
AsyncTask.resolve(result.id, result)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'securerandom'
|
4
|
+
|
5
|
+
module RocketChat
|
6
|
+
module Realtime
|
7
|
+
# Abstract message model to send a method
|
8
|
+
#
|
9
|
+
# @since 0.1.0
|
10
|
+
class Message
|
11
|
+
# @since 0.1.0
|
12
|
+
attr_reader :id, :type
|
13
|
+
|
14
|
+
# @param type [String] message type
|
15
|
+
# @param id [String] unique id to identity command
|
16
|
+
#
|
17
|
+
# @since 0.1.0
|
18
|
+
def initialize(type = 'method', id = nil)
|
19
|
+
@id = id || SecureRandom.uuid
|
20
|
+
@type = type
|
21
|
+
end
|
22
|
+
|
23
|
+
# Body
|
24
|
+
#
|
25
|
+
# @return [Hash] the message body
|
26
|
+
def body
|
27
|
+
{}
|
28
|
+
end
|
29
|
+
|
30
|
+
# Convert to JSON
|
31
|
+
#
|
32
|
+
# @return [String] message json
|
33
|
+
def to_json(options = nil)
|
34
|
+
body
|
35
|
+
.merge(id: @id, msg: @type)
|
36
|
+
.to_json(options)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rocket_chat/realtime/message'
|
4
|
+
|
5
|
+
module RocketChat
|
6
|
+
module Realtime
|
7
|
+
module Messages
|
8
|
+
# The changed message
|
9
|
+
#
|
10
|
+
# The DDP subscription changed message
|
11
|
+
#
|
12
|
+
# @since 0.1.0
|
13
|
+
class Changed < Message
|
14
|
+
# @since 0.1.0
|
15
|
+
attr_reader :fields, :cleared, :collection
|
16
|
+
|
17
|
+
# @param args [Array] the parameters for method
|
18
|
+
def initialize(id, message)
|
19
|
+
super('changed', id)
|
20
|
+
|
21
|
+
@fields = message.fetch('fields', nil)
|
22
|
+
@cleared = message.fetch('cleared', nil)
|
23
|
+
@collection = message.fetch('collection', nil)
|
24
|
+
end
|
25
|
+
|
26
|
+
# @see RocketChat::Realtime::Message#body
|
27
|
+
#
|
28
|
+
# @since 0.1.0
|
29
|
+
def body
|
30
|
+
{
|
31
|
+
fields: fields,
|
32
|
+
cleared: cleared,
|
33
|
+
collection: collection
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
# :nodoc:
|
38
|
+
def [](key)
|
39
|
+
fields.fetch(key.to_s, nil)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rocket_chat/realtime/message'
|
4
|
+
|
5
|
+
module RocketChat
|
6
|
+
module Realtime
|
7
|
+
module Messages
|
8
|
+
# The method message
|
9
|
+
#
|
10
|
+
# The DDP RPC method call
|
11
|
+
#
|
12
|
+
# @since 0.1.0
|
13
|
+
class Method < Message
|
14
|
+
# @since 0.1.0
|
15
|
+
attr_reader :name, :parameters
|
16
|
+
|
17
|
+
# @param args [Array] the parameters for method
|
18
|
+
def initialize(name, *parameters)
|
19
|
+
super('method')
|
20
|
+
|
21
|
+
@name = name
|
22
|
+
@parameters = parameters
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see RocketChat::Realtime::Message#body
|
26
|
+
#
|
27
|
+
# @since 0.1.0
|
28
|
+
def body
|
29
|
+
{
|
30
|
+
method: name,
|
31
|
+
params: parameters
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rocket_chat/realtime/message'
|
4
|
+
|
5
|
+
module RocketChat
|
6
|
+
module Realtime
|
7
|
+
module Messages
|
8
|
+
# The result message
|
9
|
+
#
|
10
|
+
# The DDP RPC result message
|
11
|
+
#
|
12
|
+
# @since 0.1.0
|
13
|
+
class Result < Message
|
14
|
+
# @since 0.1.0
|
15
|
+
attr_reader :result
|
16
|
+
|
17
|
+
# @param args [Array] the parameters for method
|
18
|
+
def initialize(id, result)
|
19
|
+
super('result', id)
|
20
|
+
|
21
|
+
@result = result
|
22
|
+
end
|
23
|
+
|
24
|
+
# @see RocketChat::Realtime::Message#body
|
25
|
+
#
|
26
|
+
# @since 0.1.0
|
27
|
+
def body
|
28
|
+
{
|
29
|
+
result: result
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
# :nodoc:
|
34
|
+
def [](key)
|
35
|
+
result.fetch(key.to_s, nil)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rocket_chat/realtime/message'
|
4
|
+
|
5
|
+
module RocketChat
|
6
|
+
module Realtime
|
7
|
+
module Messages
|
8
|
+
# The subscribe message
|
9
|
+
#
|
10
|
+
# The DDP subscribe message
|
11
|
+
#
|
12
|
+
# @since 0.1.0
|
13
|
+
class Subscribe < Message
|
14
|
+
# @since 0.1.0
|
15
|
+
attr_reader :name, :parameters
|
16
|
+
|
17
|
+
# @param args [Array] the parameters for method
|
18
|
+
def initialize(name, *parameters)
|
19
|
+
super('sub')
|
20
|
+
|
21
|
+
@name = name
|
22
|
+
@parameters = parameters
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see RocketChat::Realtime::Message#body
|
26
|
+
#
|
27
|
+
# @since 0.1.0
|
28
|
+
def body
|
29
|
+
{
|
30
|
+
name: name,
|
31
|
+
params: parameters
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
require 'rocket_chat/realtime/messages/method'
|
6
|
+
|
7
|
+
module RocketChat
|
8
|
+
module Realtime
|
9
|
+
module Methods
|
10
|
+
# Auth methods
|
11
|
+
#
|
12
|
+
# @since 0.1.0
|
13
|
+
module Auth
|
14
|
+
# Login into server
|
15
|
+
#
|
16
|
+
# @param username [String]
|
17
|
+
# @param password [String]
|
18
|
+
#
|
19
|
+
# @since 0.1.0
|
20
|
+
def login(username, password)
|
21
|
+
method = Messages::Method.new(
|
22
|
+
'login',
|
23
|
+
user: { username: username },
|
24
|
+
password: { algorithm: 'sha-256', digest: Digest::SHA256.hexdigest(password) }
|
25
|
+
)
|
26
|
+
AsyncTask.start(method.id) do
|
27
|
+
driver.text(method.to_json)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|