ruby_rabbitmq_janus 0.1.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +46 -8
- data/config/requests/test.json +9 -0
- data/config.reek +1 -1
- data/lib/rrj/config.rb +19 -14
- data/lib/rrj/init.rb +41 -15
- data/lib/rrj/janus/janus.rb +16 -8
- data/lib/rrj/janus/message.rb +13 -66
- data/lib/rrj/janus/message_async.rb +54 -0
- data/lib/rrj/janus/message_sync.rb +34 -0
- data/lib/rrj/janus/response.rb +10 -13
- data/lib/rrj/log.rb +12 -5
- data/lib/rrj/rabbitmq/rabbitmq.rb +28 -14
- data/lib/rrj/request/path.rb +21 -0
- data/lib/rrj/request/replaces.rb +109 -0
- data/lib/rrj/{requests.rb → request/requests.rb} +4 -3
- data/lib/rrj/request/type_data.rb +30 -0
- data/lib/rrj/version.rb +1 -1
- data/lib/ruby_rabbitmq_janus.rb +7 -1
- data/rrj.gemspec +2 -0
- metadata +37 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6030e029ea0bd2a5679dcad05087626f714ff188
|
4
|
+
data.tar.gz: a58783ef89a8357ca40f1fbcb67caf83ec622d07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e8fc17ef4c1567c5e59080c6516661fb0f7300e77ccaaf2dd45d181f6111b736085ad58a56d6f2e3808a8e6adb518d18e5854980e4d49e7a75de3a2badcd75e
|
7
|
+
data.tar.gz: 0ef125e275f278881be03b53c194d81d7a1a562faad21b2aa88c571876c705776a401d9be961fc247974e2b77ec04fddbadbb6f22af10bdd148be7238796ccee
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# ruby-rabbitmq-janus
|
2
|
-
|
3
2
|
Ruby Gem for Janus WebRTC Gateway integration using RabbitMQ message queue
|
4
3
|
|
5
4
|
This gem is used to communicate to a server Janus through RabbitMQ software (
|
@@ -12,6 +11,9 @@ in a queue for gem. Once the received message is decoded and returned through th
|
|
12
11
|
* [Installation](#installation)
|
13
12
|
* [Configuration](#configuration)
|
14
13
|
* [Usage](#usage)
|
14
|
+
* [Usage Synchrounous](#usage-with-synchronous-request)
|
15
|
+
* [Usage Asynchrounous](#usage-with-asynchronous-request)
|
16
|
+
* [Aliases](#aliases)
|
15
17
|
* [Development](#development)
|
16
18
|
* [RSpec](#rspec-test)
|
17
19
|
* [Documentation](#documentation)
|
@@ -22,7 +24,7 @@ in a queue for gem. Once the received message is decoded and returned through th
|
|
22
24
|
|
23
25
|
Use bitbucket for installing gem in your Gemfile
|
24
26
|
```ruby
|
25
|
-
gem '
|
27
|
+
gem 'ruby_rabbitmq_janus'
|
26
28
|
```
|
27
29
|
|
28
30
|
### Configuration
|
@@ -31,13 +33,15 @@ If you want used a customize configuration see [ruby-rabbitmq-janus.yml](config/
|
|
31
33
|
|
32
34
|
### Usage
|
33
35
|
|
34
|
-
|
36
|
+
#### Usage with synchronous request
|
37
|
+
|
38
|
+
Exemple usage simple :
|
35
39
|
```ruby
|
36
40
|
# Initialize gem
|
37
41
|
transaction = RubyRabbitmqJanus::RRJ.new
|
38
42
|
|
39
43
|
# Send a message type 'create'
|
40
|
-
create = transaction.
|
44
|
+
create = transaction.message_template_ask_sync('create')
|
41
45
|
=> {"janus"=>"create",
|
42
46
|
"transaction"=>"U5MZ8IYNLF",
|
43
47
|
"correlation"=>"6e77d355-6c3e-450c-89ad-a5daeb8e006a"}
|
@@ -45,7 +49,7 @@ create_response = transaction.message_template_response(create)
|
|
45
49
|
=> {"janus"=>"success", "transaction"=>"U5MZ8IYNLF", "data"=>{"id"=>7123088323743398}}
|
46
50
|
|
47
51
|
# Destroy session created
|
48
|
-
destroy = transaction.
|
52
|
+
destroy = transaction.message_template_ask_sync('destroy')
|
49
53
|
=> {"janus"=>"destroy",
|
50
54
|
"session_id"=>7123088323743398,
|
51
55
|
"transaction"=>"PKS63VJD8C",
|
@@ -54,10 +58,44 @@ destroy_response = transaction_template_response(destroy)
|
|
54
58
|
=> {"janus"=>"success", "session_id"=>7123088323743398, "transaction"=>"PKS63VJD8C"}
|
55
59
|
```
|
56
60
|
|
57
|
-
|
61
|
+
Example usage with a complex request :
|
62
|
+
```ruby
|
63
|
+
# Initialize gem
|
64
|
+
transaction = RubyRabbitmqJanus::RRJ.new
|
65
|
+
|
66
|
+
# Send a request type
|
67
|
+
transaction.transaction_plugin do |session_running|
|
68
|
+
test = transaction.ask_sync('test', session_running)
|
69
|
+
session = transaction.response_sync(session_running)
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
73
|
+
#### Usage with asynchronous request
|
74
|
+
|
75
|
+
Exemple usage simple :
|
76
|
+
|
58
77
|
```ruby
|
59
|
-
|
60
|
-
|
78
|
+
# Initialize gem
|
79
|
+
transaction = RubyRabbitmqJanus::RRJ.new
|
80
|
+
|
81
|
+
# Send a message type create
|
82
|
+
create = transaction.ask_async('create')
|
83
|
+
=> {"janus"=>"success", "session_id"=>1144864650609378, "transaction"=>"0XGUTFDLBK"}
|
84
|
+
|
85
|
+
# Send a message type destroy
|
86
|
+
transaction.ask_async('destroy', create)
|
87
|
+
=> {"janus"=>"success", "session_id"=>1144864650609378, "transaction"=>"UPODB8YEG1"}
|
88
|
+
```
|
89
|
+
|
90
|
+
#### Aliases
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
# Aliases to methods synchronous
|
94
|
+
message_template_ask_sync => ask_sync
|
95
|
+
message_template_response => response_sync
|
96
|
+
|
97
|
+
# Aliases to methods asynchronous
|
98
|
+
message_template_ask_async => ask_async
|
61
99
|
```
|
62
100
|
|
63
101
|
## Development
|
data/config.reek
CHANGED
data/lib/rrj/config.rb
CHANGED
@@ -5,9 +5,9 @@ require 'yaml'
|
|
5
5
|
module RubyRabbitmqJanus
|
6
6
|
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
7
7
|
# Loading a yaml file for apply a configuration to gem.
|
8
|
-
# @!attribute [r] options
|
9
|
-
# @return [RubyRabbitmqJanus::Config] Options to gem.
|
10
8
|
class Config
|
9
|
+
include Singleton
|
10
|
+
|
11
11
|
attr_reader :options
|
12
12
|
|
13
13
|
# Define a default path to file configuration
|
@@ -20,12 +20,11 @@ module RubyRabbitmqJanus
|
|
20
20
|
CUSTOMIZE_CONF = 'config/ruby-rabbitmq-janus.yml'
|
21
21
|
|
22
22
|
# Initialize configuration file default or customize if exist
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
precise_log_level
|
23
|
+
def initialize
|
24
|
+
@options = nil
|
25
|
+
conf_customize
|
26
|
+
conf_default
|
27
|
+
define_log_level_used
|
29
28
|
end
|
30
29
|
|
31
30
|
private
|
@@ -33,20 +32,26 @@ module RubyRabbitmqJanus
|
|
33
32
|
# Load configuration file yaml
|
34
33
|
# @return [Yaml] Configuration file
|
35
34
|
# @param file [String] Path to configuration file (with name)
|
35
|
+
# :reek:UtilityFunction { public_methods_only: true }
|
36
36
|
def load_configuration(file)
|
37
|
-
|
37
|
+
Log.instance.info("Loading configuration file : #{file}")
|
38
38
|
YAML.load(File.read(file))
|
39
39
|
end
|
40
40
|
|
41
41
|
# Load customize configuration file if exist
|
42
|
-
|
43
|
-
|
44
|
-
def override_configuration(file)
|
42
|
+
def conf_customize
|
43
|
+
file = File.join(Dir.pwd, CUSTOMIZE_CONF)
|
45
44
|
@options = load_configuration(file) if File.exist?(file)
|
46
45
|
end
|
47
46
|
|
48
|
-
|
49
|
-
|
47
|
+
# Load default configuration if customize configuration doesn't exist
|
48
|
+
def conf_default
|
49
|
+
file = File.join(DEFAULT_PATH, DEFAULT_CONF)
|
50
|
+
@options ||= load_configuration(file)
|
51
|
+
end
|
52
|
+
|
53
|
+
def define_log_level_used
|
54
|
+
Log.instance.level = @options['gem']['log']['level']
|
50
55
|
end
|
51
56
|
end
|
52
57
|
end
|
data/lib/rrj/init.rb
CHANGED
@@ -3,21 +3,20 @@
|
|
3
3
|
module RubyRabbitmqJanus
|
4
4
|
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
5
5
|
# Initialize gem
|
6
|
-
# @!attribute [r]
|
7
|
-
# @return [
|
8
|
-
# server
|
9
|
-
# @!attribute [r] logs
|
10
|
-
# @return [RubyRabbitmqJanus::Log] Object Log for manipulate logs
|
11
|
-
# @!attribute [r] settings
|
12
|
-
# @return [RubyRabbitmqJanus::Config] Object Config to gem
|
6
|
+
# @!attribute [r] session
|
7
|
+
# @return [Hash] Response to request sending in transaction
|
13
8
|
class RRJ
|
9
|
+
attr_reader :session
|
10
|
+
|
14
11
|
# Returns a new instance of RubyRabbitmqJanus
|
15
12
|
def initialize
|
16
|
-
|
13
|
+
Log.instance
|
14
|
+
Config.instance
|
15
|
+
Requests.instance
|
16
|
+
|
17
|
+
@rabbit = RabbitMQ.new
|
17
18
|
|
18
|
-
@
|
19
|
-
@requests = RubyRabbitmqJanus::Requests.new(@logs)
|
20
|
-
@rabbit = RubyRabbitmqJanus::RabbitMQ.new(@settings, @requests.requests, @logs)
|
19
|
+
@session = nil
|
21
20
|
end
|
22
21
|
|
23
22
|
# Send a message, to RabbitMQ, with a template JSON
|
@@ -27,8 +26,8 @@ module RubyRabbitmqJanus
|
|
27
26
|
# @option opts [String] :janus The message type
|
28
27
|
# @option opts [String] :transaction The transaction identifier
|
29
28
|
# @option opts [Hash] :data The option data to request
|
30
|
-
def
|
31
|
-
@rabbit.
|
29
|
+
def message_template_ask_sync(template_used = 'info', opts = {})
|
30
|
+
@rabbit.ask_request_sync(template_used, opts)
|
32
31
|
end
|
33
32
|
|
34
33
|
# Send a message to RabbitMQ for reading a response
|
@@ -41,7 +40,34 @@ module RubyRabbitmqJanus
|
|
41
40
|
@rabbit.ask_response(info_request)
|
42
41
|
end
|
43
42
|
|
44
|
-
|
45
|
-
|
43
|
+
# Manage a transaction with an plugin in janus
|
44
|
+
# Is create an session and attach with a plugin configured in file conf to gem, then
|
45
|
+
# when a treatment is complet is destroy a session
|
46
|
+
# @yieldparam session_attach [Hash] Use a session created
|
47
|
+
# @yieldreturn [Hash] Contains a result to transaction with janus server
|
48
|
+
def transaction_plugin
|
49
|
+
@session = yield attach_session
|
50
|
+
destroy_session
|
51
|
+
end
|
52
|
+
|
53
|
+
def message_template_ask_async(template_used = 'info', opts = {})
|
54
|
+
@rabbit.ask_request_async(template_used, opts)
|
55
|
+
end
|
56
|
+
|
57
|
+
alias ask_async message_template_ask_async
|
58
|
+
alias ask_sync message_template_ask_sync
|
59
|
+
alias response_sync message_template_response
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def attach_session
|
64
|
+
Log.instance.debug 'Create an session'
|
65
|
+
response_sync(ask_sync('attach', ask_sync('create')))
|
66
|
+
end
|
67
|
+
|
68
|
+
def destroy_session
|
69
|
+
Log.instance.debug 'Destroy an session'
|
70
|
+
response_sync(ask_sync('destroy', response_sync(ask_sync('detach', @session))))
|
71
|
+
end
|
46
72
|
end
|
47
73
|
end
|
data/lib/rrj/janus/janus.rb
CHANGED
@@ -9,23 +9,31 @@ module RubyRabbitmqJanus
|
|
9
9
|
# Returns a new instance of Janus
|
10
10
|
# @param connection [String] Connection to RabbitMQ server
|
11
11
|
# @param logs [RRJ::Log] Instance to log
|
12
|
-
def initialize(connection
|
12
|
+
def initialize(connection)
|
13
13
|
@channel = connection.create_channel
|
14
|
-
@queues = options['queues']
|
15
|
-
@plugins = options['janus']['plugins']
|
16
|
-
@logs = logs
|
17
14
|
end
|
18
15
|
|
19
16
|
# Send a message to RabbitMQ
|
17
|
+
# @param request [String] Type request used by transaction
|
18
|
+
# @param opts [Hash] Contains the parameters used by request if necessary
|
19
|
+
# @return [Hash] Result to request
|
20
20
|
def send(request, opts)
|
21
|
-
message =
|
22
|
-
message.send(request
|
21
|
+
message = Sync.new(opts, @channel)
|
22
|
+
message.send(request)
|
23
|
+
end
|
24
|
+
|
25
|
+
def send_async(request, opts)
|
26
|
+
message = ASync.new(opts, @channel)
|
27
|
+
message.send(request)
|
23
28
|
end
|
24
29
|
|
25
30
|
# Read a message to RabbitMQ
|
31
|
+
# @param info_message [Hash] Information request asking to janus
|
32
|
+
# @param connection [Object] Object contains a information to connection
|
33
|
+
# @return [Hash] Result to request
|
26
34
|
def read(info_message, connection)
|
27
|
-
response = ResponseJanus.new(@channel, connection,
|
28
|
-
response.read
|
35
|
+
response = ResponseJanus.new(@channel, connection, info_message)
|
36
|
+
response.read
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
data/lib/rrj/janus/message.rb
CHANGED
@@ -1,84 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'json'
|
4
3
|
require 'securerandom'
|
4
|
+
require 'thread'
|
5
5
|
|
6
6
|
module RubyRabbitmqJanus
|
7
7
|
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
8
8
|
# Message Janus sending to rabbitmq server
|
9
9
|
class MessageJanus
|
10
10
|
# Initialiaze a message posting to RabbitMQ
|
11
|
-
|
11
|
+
# @param plugins [String] Name of plugin used by transaction
|
12
|
+
# @param logs [RubyRabbitmqJanus::Log] Instance log
|
13
|
+
# @param opts [Hash] Contains information to request sending
|
14
|
+
def initialize(opts_request, channel)
|
12
15
|
@correlation = SecureRandom.uuid
|
13
|
-
@
|
14
|
-
@
|
15
|
-
@logs = logs
|
16
|
-
@my_request = nil
|
17
|
-
@message = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
# Send a message to RabbitMQ server
|
21
|
-
def send(json, channel, queue_to)
|
22
|
-
@message = channel.default_exchange
|
23
|
-
@message.publish(test_request_and_replace(json),
|
24
|
-
routing_key: queue_to,
|
25
|
-
correlation_id: @correlation,
|
26
|
-
content_type: 'application/json')
|
27
|
-
return_info_message
|
16
|
+
@options_request = opts_request
|
17
|
+
@channel = channel
|
28
18
|
end
|
29
19
|
|
30
20
|
private
|
31
21
|
|
32
|
-
|
33
|
-
|
34
|
-
@my_request = JSON.parse(File.read(json_file))
|
35
|
-
replaces
|
36
|
-
@my_request.to_json
|
37
|
-
end
|
38
|
-
|
39
|
-
def replaces
|
40
|
-
replace_transaction
|
41
|
-
if @opts
|
42
|
-
replace_element('session_id')
|
43
|
-
replace_plugin
|
44
|
-
replace_element(@opts['handle_id'] ? 'handle_id' : 'sender', 'handle_id')
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# Replace a transaction field with an String format
|
49
|
-
def replace_transaction
|
50
|
-
@my_request['transaction'] = [*('A'..'Z'), *('0'..'9')].sample(10).join
|
51
|
-
end
|
52
|
-
|
53
|
-
# Replace a session_id field with an Integer
|
54
|
-
def replace_element(value, value_replace = value)
|
55
|
-
add_return(value_replace, value_data_or_precise(value)) \
|
56
|
-
if @my_request[value_replace]
|
57
|
-
end
|
58
|
-
|
59
|
-
# Replace plugin used for transaction
|
60
|
-
def replace_plugin
|
61
|
-
my_plugin = @my_request['plugin']
|
62
|
-
if my_plugin
|
63
|
-
my_plugin = @plugins[my_plugin.delete('<plugin[').delete(']').to_i]
|
64
|
-
add_return('plugin', my_plugin)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Prepare an Hash with information necessary to read a response in RabbitMQ queue
|
69
|
-
def return_info_message
|
70
|
-
@my_request['correlation'] = @correlation
|
71
|
-
@logs.debug @my_request
|
72
|
-
@my_request
|
73
|
-
end
|
74
|
-
|
75
|
-
def add_return(key, value)
|
76
|
-
@my_request[key] = value
|
77
|
-
@my_request.merge!(key => value)
|
78
|
-
end
|
22
|
+
attr_reader :channel, :options_request, :opts, :correlation, :my_request, :message
|
23
|
+
attr_reader :log
|
79
24
|
|
80
|
-
def
|
81
|
-
|
25
|
+
def define_request_sending(json)
|
26
|
+
request = Replace.new(json, @options_request)
|
27
|
+
@my_request = request.to_hash
|
28
|
+
request.to_json
|
82
29
|
end
|
83
30
|
end
|
84
31
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyRabbitmqJanus
|
4
|
+
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
5
|
+
# Message Janus sending to rabbitmq server
|
6
|
+
class ASync < MessageJanus
|
7
|
+
def initialize(opts_request, channel)
|
8
|
+
super
|
9
|
+
@response = nil
|
10
|
+
@condition = ConditionVariable.new
|
11
|
+
@lock = Mutex.new
|
12
|
+
@reply = channel.queue('', exclusive: true)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Send a message to RabbitMQ server
|
16
|
+
# @param json [String] Name of request used
|
17
|
+
# @param channel [Bunny::Channel] Channel used in transaction
|
18
|
+
# @param queue_to [String] Name of queue used for sending request in RabbitMQ
|
19
|
+
# @return [Hash] Result to request executed
|
20
|
+
def send(json)
|
21
|
+
Log.instance.debug 'Send a message ASYNCHRONE'
|
22
|
+
subscribe
|
23
|
+
channel_publish_message(json)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_reader :lock, :response
|
29
|
+
|
30
|
+
def channel_publish_message(json)
|
31
|
+
message = channel.default_exchange
|
32
|
+
message.publish(define_request_sending(json),
|
33
|
+
reply_to: @reply.name,
|
34
|
+
routing_key: Config.instance.options['queues']['queue_to'],
|
35
|
+
correlation_id: correlation,
|
36
|
+
content_type: 'application/json')
|
37
|
+
@lock.synchronize { @condition.wait(lock) }
|
38
|
+
@response
|
39
|
+
end
|
40
|
+
|
41
|
+
def subscribe
|
42
|
+
@reply.subscribe do |_delivery_info, properties, payload|
|
43
|
+
parse_queue properties, payload
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def parse_queue(properties, payload)
|
48
|
+
if properties[:correlation_id] == correlation
|
49
|
+
@response = JSON.parse payload
|
50
|
+
@lock.synchronize { @condition.signal }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyRabbitmqJanus
|
4
|
+
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
5
|
+
# Message Janus sending to rabbitmq server
|
6
|
+
class Sync < MessageJanus
|
7
|
+
def initialize(opts_request, channel)
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
# Send a message to RabbitMQ server
|
12
|
+
# @param json [String] Name of request used
|
13
|
+
# @param channel [Bunny::Channel] Channel used in transaction
|
14
|
+
# @param queue_to [String] Name of queue used for sending request in RabbitMQ
|
15
|
+
# @return [Hash] Result to request executed
|
16
|
+
def send(json)
|
17
|
+
message = channel.default_exchange
|
18
|
+
Log.instance.debug 'Send a message SYNCHRONE'
|
19
|
+
message.publish(define_request_sending(json),
|
20
|
+
routing_key: Config.instance.options['queues']['queue_to'],
|
21
|
+
correlation_id: correlation,
|
22
|
+
content_type: 'application/json')
|
23
|
+
return_info_message
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Prepare an Hash with information necessary to read a response in RabbitMQ queue
|
29
|
+
def return_info_message
|
30
|
+
my_request['properties'] = { 'correlation' => correlation }
|
31
|
+
my_request
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/rrj/janus/response.rb
CHANGED
@@ -6,20 +6,20 @@ module RubyRabbitmqJanus
|
|
6
6
|
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
7
7
|
# Response Janus received to RabbitMQ server
|
8
8
|
class ResponseJanus
|
9
|
-
|
9
|
+
# Initialiaze a response reading in RabbitMQ queue
|
10
|
+
def initialize(channel, connection, opts = {})
|
10
11
|
@channel = channel
|
11
12
|
@connection = connection
|
12
13
|
@opts = opts
|
13
|
-
@logs = logs
|
14
14
|
@response = nil
|
15
15
|
end
|
16
16
|
|
17
17
|
# Read a response to janus (in RabbitMQ queue)
|
18
18
|
# @return [Hash] resultat to request
|
19
|
-
def read
|
20
|
-
|
21
|
-
the_queue = @channel.queue(queue_from)
|
22
|
-
the_queue.subscribe(
|
19
|
+
def read
|
20
|
+
Log.instance.debug 'Read a response'
|
21
|
+
the_queue = @channel.queue(Config.instance.options['queues']['queue_from'])
|
22
|
+
the_queue.subscribe(block: true) do |info, prop, pay|
|
23
23
|
listen(info, prop, pay)
|
24
24
|
end
|
25
25
|
return_response_json
|
@@ -29,12 +29,13 @@ module RubyRabbitmqJanus
|
|
29
29
|
|
30
30
|
# Listen a response to queue
|
31
31
|
def listen(_delivery_info, properties, payload)
|
32
|
-
if @opts['correlation'] == properties[:correlation_id]
|
32
|
+
if @opts['properties']['correlation'] == properties[:correlation_id]
|
33
33
|
@response = payload
|
34
34
|
@connection.close
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
# Format the response returning
|
38
39
|
def return_response_json
|
39
40
|
@response = JSON.parse(@response)
|
40
41
|
case @opts['janus']
|
@@ -43,16 +44,12 @@ module RubyRabbitmqJanus
|
|
43
44
|
when 'attach'
|
44
45
|
merge('handle_id')
|
45
46
|
end
|
46
|
-
@logs.debug @response
|
47
47
|
@response
|
48
48
|
end
|
49
49
|
|
50
|
-
|
51
|
-
@response['data']['id']
|
52
|
-
end
|
53
|
-
|
50
|
+
# Update value to element in Hash
|
54
51
|
def merge(key)
|
55
|
-
@response[key] =
|
52
|
+
@response[key] = @response['data']['id']
|
56
53
|
end
|
57
54
|
end
|
58
55
|
end
|
data/lib/rrj/log.rb
CHANGED
@@ -17,38 +17,45 @@ module RubyRabbitmqJanus
|
|
17
17
|
# Define a default level to gem (:warn, :info, :debug)
|
18
18
|
DEFAULT_LEVEL = :debug
|
19
19
|
|
20
|
+
attr_reader :log_file
|
21
|
+
|
20
22
|
# Returns a new instance to Log
|
21
23
|
def initialize
|
22
24
|
@logs = Logging.logger[Time.now.to_s + ' --']
|
23
25
|
@logs.level = DEFAULT_LEVEL
|
24
|
-
@
|
26
|
+
@log_file = DEFAULT_LOG_DIR + '/' + DEFAULT_LOG_NAME
|
27
|
+
@logs.add_appenders Logging.appenders.file(@log_file)
|
25
28
|
|
26
|
-
welcome =
|
27
|
-
"====================================\n" \
|
28
|
-
"### Start gem Rails Rabbit Janus ###\n" \
|
29
|
-
'===================================='
|
29
|
+
welcome = '### Start gem Rails Rabbit Janus ###'
|
30
30
|
@logs.info(welcome)
|
31
31
|
end
|
32
32
|
|
33
|
+
# Level to log
|
34
|
+
# @return [Integer] The level to log instance
|
33
35
|
def level
|
34
36
|
@logs.level
|
35
37
|
end
|
36
38
|
|
39
|
+
# Save level to log
|
40
|
+
# @param level [Symbol] Save log level used by this gem
|
37
41
|
def level=(level)
|
38
42
|
@logs.level = level
|
39
43
|
end
|
40
44
|
|
41
45
|
# Write a message in log with a warn level
|
46
|
+
# @param message [String] Message writing in warning level in log
|
42
47
|
def warn(message)
|
43
48
|
@logs.warn(message)
|
44
49
|
end
|
45
50
|
|
46
51
|
# Write a message in log with a info level
|
52
|
+
# @param message [String] Message writing in info level in log
|
47
53
|
def info(message)
|
48
54
|
@logs.info(message)
|
49
55
|
end
|
50
56
|
|
51
57
|
# Write a message in log with a debug level
|
58
|
+
# @param message [String] Message writing in debug level in log
|
52
59
|
def debug(message)
|
53
60
|
@logs.debug(message)
|
54
61
|
end
|
@@ -7,22 +7,24 @@ module RubyRabbitmqJanus
|
|
7
7
|
# Class for connection with RabbitMQ Server
|
8
8
|
class RabbitMQ
|
9
9
|
# Return a new instance to RabbitMQ
|
10
|
-
|
11
|
-
# @param requests [Hash] Request sending to RabbitMQ
|
12
|
-
# @param logs [RRJ::Log] Log to gem
|
13
|
-
def initialize(configuration, requests, logs)
|
14
|
-
@settings = configuration
|
15
|
-
@logs = logs
|
16
|
-
@requests = requests
|
10
|
+
def initialize
|
17
11
|
@connection = Bunny.new(read_options_server)
|
18
|
-
@response = nil
|
19
|
-
@janus = nil
|
12
|
+
@janus, @response = nil
|
20
13
|
end
|
21
14
|
|
22
15
|
# Connect to server RabbitMQ and post a message in queue ('to-janus' by default)
|
23
|
-
def
|
16
|
+
def ask_request_sync(request_type, opts)
|
24
17
|
execute_request do
|
25
|
-
|
18
|
+
rqt = Requests.instance.requests[request_type.to_s]
|
19
|
+
@response = @janus.send(rqt, opts)
|
20
|
+
close_server_rabbitmq
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def ask_request_async(request_type, opts)
|
25
|
+
execute_request do
|
26
|
+
rqt = Requests.instance.requests[request_type.to_s]
|
27
|
+
@response = @janus.send_async(rqt, opts)
|
26
28
|
close_server_rabbitmq
|
27
29
|
end
|
28
30
|
end
|
@@ -49,10 +51,22 @@ module RubyRabbitmqJanus
|
|
49
51
|
end
|
50
52
|
|
51
53
|
# Use configuration information to connect RabbitMQ
|
54
|
+
# This method smells of :reek:DuplicateMethodCall
|
55
|
+
# This method smells of :reek:TooManyStatements
|
56
|
+
# This method smells of :reek:FeatureEnvy
|
52
57
|
def read_options_server
|
53
58
|
hash = {}
|
54
|
-
|
55
|
-
|
59
|
+
hash.merge!(define_options)
|
60
|
+
hash['log_level'] = Log.instance.level
|
61
|
+
hash['log_file'] = Log.instance.log_file
|
62
|
+
hash
|
63
|
+
end
|
64
|
+
|
65
|
+
# This method smells of :reek:UtilityFunction
|
66
|
+
def define_options
|
67
|
+
hash = {}
|
68
|
+
Config.instance.options.fetch('server').each do |key, server|
|
69
|
+
hash[key.to_sym] = server.to_s
|
56
70
|
end
|
57
71
|
hash
|
58
72
|
end
|
@@ -60,7 +74,7 @@ module RubyRabbitmqJanus
|
|
60
74
|
# Execute request
|
61
75
|
def execute_request
|
62
76
|
open_server_rabbitmq
|
63
|
-
@janus = Janus.new(@connection
|
77
|
+
@janus = Janus.new(@connection)
|
64
78
|
yield
|
65
79
|
@response
|
66
80
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'key_path'
|
4
|
+
|
5
|
+
module RubyRabbitmqJanus
|
6
|
+
# aze
|
7
|
+
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
8
|
+
class Path
|
9
|
+
attr_reader :path, :parent, :child, :value
|
10
|
+
|
11
|
+
def initialize(key)
|
12
|
+
@path = KeyPath::Path.new key
|
13
|
+
@parent = @path.parent.to_s
|
14
|
+
@child = @path.to_s.gsub(@parent + '.', '')
|
15
|
+
end
|
16
|
+
|
17
|
+
def path
|
18
|
+
@path.to_s
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'key_path'
|
5
|
+
|
6
|
+
module RubyRabbitmqJanus
|
7
|
+
# Format message request with good data
|
8
|
+
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
9
|
+
class Replace
|
10
|
+
def initialize(json_file, opts)
|
11
|
+
@request = JSON.parse(File.read(json_file))
|
12
|
+
@opts = opts
|
13
|
+
@path = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_hash
|
17
|
+
Hash @request
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json
|
21
|
+
replaces
|
22
|
+
@request.to_json
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Replace element in json request with information used by transaction
|
28
|
+
def replaces
|
29
|
+
create_transaction
|
30
|
+
return unless @opts
|
31
|
+
replace_standard_elements
|
32
|
+
replace_specific_elements if @opts.key?(:other_key) && @request.key?('body')
|
33
|
+
end
|
34
|
+
|
35
|
+
# Create an transaction string and replace in request field with an String format
|
36
|
+
def create_transaction
|
37
|
+
@request['transaction'] = [*('A'..'Z'), *('0'..'9')].sample(10).join
|
38
|
+
end
|
39
|
+
|
40
|
+
def replace_standard_elements
|
41
|
+
replace_element('session_id')
|
42
|
+
replace_plugin
|
43
|
+
replace_element(@opts['handle_id'] ? 'handle_id' : 'sender', 'handle_id')
|
44
|
+
end
|
45
|
+
|
46
|
+
def replace_specific_elements
|
47
|
+
if request_as_replace_specific
|
48
|
+
new_hash = rewrite_key_to_string(@opts[:other_key])
|
49
|
+
running_hash(new_hash)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Replace a session_id field with an Integer
|
54
|
+
def replace_element(value, value_replace = value)
|
55
|
+
add_return(value_replace, value_data_or_precise(value)) \
|
56
|
+
if @request[value_replace]
|
57
|
+
end
|
58
|
+
|
59
|
+
# Format the response return
|
60
|
+
def value_data_or_precise(key)
|
61
|
+
@opts[key] || @opts['data']['id']
|
62
|
+
end
|
63
|
+
|
64
|
+
# Format the json used for request sending
|
65
|
+
def add_return(key, value)
|
66
|
+
@request[key] = value
|
67
|
+
@request.merge!(key => value)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Replace plugin used for transaction
|
71
|
+
def replace_plugin
|
72
|
+
my_plugin = @request['plugin']
|
73
|
+
if my_plugin
|
74
|
+
number = TypeData.new(my_plugin)
|
75
|
+
add_return('plugin', Config.instance.options['janus']['plugins'][number.format])
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Rewrite key symbol to string
|
80
|
+
def rewrite_key_to_string(node)
|
81
|
+
Hash[
|
82
|
+
node.map do |key, value|
|
83
|
+
[key.to_s, value.is_a?(Hash) ? rewrite_key_to_string(value) : value]
|
84
|
+
end
|
85
|
+
]
|
86
|
+
end
|
87
|
+
|
88
|
+
def running_hash(hash, parent = '')
|
89
|
+
hash.each do |key, value|
|
90
|
+
if value.is_a?(Hash)
|
91
|
+
running_hash(value, new_parent(key, parent))
|
92
|
+
else
|
93
|
+
@request[parent][key] = value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def request_as_replace_specific
|
99
|
+
['<string>', '<number>'].each do |value|
|
100
|
+
return true if @request['body'].value?(value)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# This is method smells of :reek:UtilityFunction
|
105
|
+
def new_parent(key, parent)
|
106
|
+
"#{parent}#{'.' unless parent.empty?}#{key}"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -5,17 +5,18 @@ module RubyRabbitmqJanus
|
|
5
5
|
# Load files json in config/request.
|
6
6
|
# This file is used for sending a request to RabbitMQ
|
7
7
|
# @!attribute [r] requests
|
8
|
-
# @return [RubyRabbitmqJanus::Request] Array to request
|
9
8
|
class Requests
|
9
|
+
include Singleton
|
10
|
+
|
10
11
|
attr_reader :requests
|
11
12
|
|
12
13
|
# Define folder to request
|
13
14
|
PATH_REQUEST = 'config/requests/'
|
14
15
|
|
15
16
|
# Load all requests in folder
|
16
|
-
def initialize
|
17
|
+
def initialize
|
17
18
|
@requests = {}
|
18
|
-
|
19
|
+
Log.instance.info "Loading all requests in : #{PATH_REQUEST}"
|
19
20
|
Dir[File.join(PATH_REQUEST, '*')].count do |file|
|
20
21
|
if File.file?(file)
|
21
22
|
read_file(file)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyRabbitmqJanus
|
4
|
+
# Format data with type corresponding
|
5
|
+
class TypeData
|
6
|
+
def initialize(type, value = nil)
|
7
|
+
@type = type
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
# Cast a string
|
12
|
+
def format
|
13
|
+
case @type
|
14
|
+
when '<number>'
|
15
|
+
@value.to_i
|
16
|
+
when '<string>'
|
17
|
+
@value.to_s
|
18
|
+
when /^(?<plugin\[[0-9]\]>)/
|
19
|
+
extract_plugin_number
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# Extract the number of plugin to used for this request
|
26
|
+
def extract_plugin_number
|
27
|
+
@type.delete('<plugin[').delete(']').to_i
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/rrj/version.rb
CHANGED
data/lib/ruby_rabbitmq_janus.rb
CHANGED
@@ -4,11 +4,17 @@ require 'rrj/version'
|
|
4
4
|
require 'rrj/init'
|
5
5
|
require 'rrj/log'
|
6
6
|
require 'rrj/config'
|
7
|
-
|
7
|
+
|
8
|
+
require 'rrj/request/requests'
|
9
|
+
require 'rrj/request/type_data'
|
10
|
+
require 'rrj/request/replaces'
|
11
|
+
require 'rrj/request/path'
|
8
12
|
|
9
13
|
require 'rrj/rabbitmq/rabbitmq'
|
10
14
|
|
11
15
|
require 'rrj/janus/janus'
|
12
16
|
require 'rrj/janus/message'
|
17
|
+
require 'rrj/janus/message_sync'
|
18
|
+
require 'rrj/janus/message_async'
|
13
19
|
require 'rrj/janus/response'
|
14
20
|
require 'rrj/janus/error'
|
data/rrj.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_rabbitmq_janus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- VAILLANT Jeremy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -224,6 +224,34 @@ dependencies:
|
|
224
224
|
- - "~>"
|
225
225
|
- !ruby/object:Gem::Version
|
226
226
|
version: '2.1'
|
227
|
+
- !ruby/object:Gem::Dependency
|
228
|
+
name: key_path
|
229
|
+
requirement: !ruby/object:Gem::Requirement
|
230
|
+
requirements:
|
231
|
+
- - "~>"
|
232
|
+
- !ruby/object:Gem::Version
|
233
|
+
version: '1.2'
|
234
|
+
type: :runtime
|
235
|
+
prerelease: false
|
236
|
+
version_requirements: !ruby/object:Gem::Requirement
|
237
|
+
requirements:
|
238
|
+
- - "~>"
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
version: '1.2'
|
241
|
+
- !ruby/object:Gem::Dependency
|
242
|
+
name: thread
|
243
|
+
requirement: !ruby/object:Gem::Requirement
|
244
|
+
requirements:
|
245
|
+
- - "~>"
|
246
|
+
- !ruby/object:Gem::Version
|
247
|
+
version: 0.2.2
|
248
|
+
type: :runtime
|
249
|
+
prerelease: false
|
250
|
+
version_requirements: !ruby/object:Gem::Requirement
|
251
|
+
requirements:
|
252
|
+
- - "~>"
|
253
|
+
- !ruby/object:Gem::Version
|
254
|
+
version: 0.2.2
|
227
255
|
description: This gem is used to communicate to a server Janus through RabbitMQ software
|
228
256
|
(Message-oriented middleware). It waiting a messages to Rails API who send to RabbitMQ
|
229
257
|
server in a queue for janus server. Janus processes a message and send to RabbitMQ
|
@@ -253,15 +281,21 @@ files:
|
|
253
281
|
- config/requests/destroy.json
|
254
282
|
- config/requests/detach.json
|
255
283
|
- config/requests/info.json
|
284
|
+
- config/requests/test.json
|
256
285
|
- lib/rrj/config.rb
|
257
286
|
- lib/rrj/init.rb
|
258
287
|
- lib/rrj/janus/error.rb
|
259
288
|
- lib/rrj/janus/janus.rb
|
260
289
|
- lib/rrj/janus/message.rb
|
290
|
+
- lib/rrj/janus/message_async.rb
|
291
|
+
- lib/rrj/janus/message_sync.rb
|
261
292
|
- lib/rrj/janus/response.rb
|
262
293
|
- lib/rrj/log.rb
|
263
294
|
- lib/rrj/rabbitmq/rabbitmq.rb
|
264
|
-
- lib/rrj/
|
295
|
+
- lib/rrj/request/path.rb
|
296
|
+
- lib/rrj/request/replaces.rb
|
297
|
+
- lib/rrj/request/requests.rb
|
298
|
+
- lib/rrj/request/type_data.rb
|
265
299
|
- lib/rrj/version.rb
|
266
300
|
- lib/ruby_rabbitmq_janus.rb
|
267
301
|
- rrj.gemspec
|