ruby_rabbitmq_janus 0.3.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +64 -7
- data/.reek +7 -0
- data/.rubocop.yml +0 -3
- data/README.md +40 -2
- data/config/default.md +22 -6
- data/config/default.yml +24 -6
- data/config/requests/{test.json → admin/handle_info.json} +2 -4
- data/config/requests/admin/handles.json +6 -0
- data/config/requests/admin/log_level.json +6 -0
- data/config/requests/admin/sessions.json +5 -0
- data/config/requests/{attach.json → base/attach.json} +0 -0
- data/config/requests/{create.json → base/create.json} +0 -0
- data/config/requests/{destroy.json → base/destroy.json} +0 -0
- data/config/requests/{detach.json → base/detach.json} +0 -0
- data/config/requests/{info.json → base/info.json} +0 -0
- data/config/requests/base/keepalive.json +5 -0
- data/lib/generators/ruby_rabbitmq_janus/configuration_generator.rb +23 -0
- data/lib/generators/ruby_rabbitmq_janus/create_request_generator.rb +90 -0
- data/lib/generators/ruby_rabbitmq_janus/default_request_generator.rb +21 -0
- data/lib/generators/ruby_rabbitmq_janus/initializer_generator.rb +17 -0
- data/lib/rrj/errors/config.rb +21 -0
- data/lib/rrj/errors/error.rb +56 -0
- data/lib/rrj/errors/janus.rb +14 -0
- data/lib/rrj/errors/janus_message.rb +45 -0
- data/lib/rrj/errors/janus_response.rb +78 -0
- data/lib/rrj/errors/janus_transaction.rb +31 -0
- data/lib/rrj/errors/rabbit.rb +21 -0
- data/lib/rrj/errors/request.rb +21 -0
- data/lib/rrj/info.rb +40 -0
- data/lib/rrj/init.rb +113 -44
- data/lib/rrj/janus/admin.rb +27 -0
- data/lib/rrj/janus/janus.rb +10 -33
- data/lib/rrj/janus/keepalive.rb +69 -0
- data/lib/rrj/janus/message.rb +77 -22
- data/lib/rrj/janus/response.rb +79 -41
- data/lib/rrj/janus/transaction.rb +53 -0
- data/lib/rrj/janus/transaction_admin.rb +43 -0
- data/lib/rrj/janus/transaction_handle.rb +40 -0
- data/lib/rrj/janus/transaction_session.rb +17 -0
- data/lib/rrj/rabbit/connect.rb +75 -0
- data/lib/rrj/rabbit/propertie.rb +37 -0
- data/lib/rrj/rabbit/publish.rb +100 -0
- data/lib/rrj/rabbit/rabbit.rb +11 -0
- data/lib/rrj/tools/config.rb +63 -0
- data/lib/rrj/tools/env.rb +21 -0
- data/lib/rrj/tools/log.rb +106 -0
- data/lib/rrj/tools/replaces.rb +115 -0
- data/lib/rrj/tools/replaces_admin.rb +44 -0
- data/lib/rrj/tools/requests.rb +57 -0
- data/lib/rrj/tools/tools.rb +14 -0
- data/lib/ruby_rabbitmq_janus.rb +8 -13
- data/rrj.gemspec +7 -3
- metadata +108 -28
- data/config.reek +0 -3
- data/lib/rrj/config.rb +0 -57
- data/lib/rrj/janus/error.rb +0 -8
- data/lib/rrj/janus/message_async.rb +0 -54
- data/lib/rrj/janus/message_sync.rb +0 -34
- data/lib/rrj/log.rb +0 -63
- data/lib/rrj/rabbitmq/rabbitmq.rb +0 -82
- data/lib/rrj/request/path.rb +0 -21
- data/lib/rrj/request/replaces.rb +0 -109
- data/lib/rrj/request/requests.rb +0 -55
- data/lib/rrj/request/type_data.rb +0 -30
- data/lib/rrj/version.rb +0 -17
@@ -1,54 +0,0 @@
|
|
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
|
@@ -1,34 +0,0 @@
|
|
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/log.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'logging'
|
4
|
-
|
5
|
-
module RubyRabbitmqJanus
|
6
|
-
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
7
|
-
# Class for wrtting logs. Define level used (:warn, :info, :debug).
|
8
|
-
class Log
|
9
|
-
include Singleton
|
10
|
-
|
11
|
-
# Define folder to writing logs
|
12
|
-
DEFAULT_LOG_DIR = 'log'
|
13
|
-
|
14
|
-
# Define file name to writing logs
|
15
|
-
DEFAULT_LOG_NAME = 'rails-rabbit-janus.log'
|
16
|
-
|
17
|
-
# Define a default level to gem (:warn, :info, :debug)
|
18
|
-
DEFAULT_LEVEL = :debug
|
19
|
-
|
20
|
-
attr_reader :log_file
|
21
|
-
|
22
|
-
# Returns a new instance to Log
|
23
|
-
def initialize
|
24
|
-
@logs = Logging.logger[Time.now.to_s + ' --']
|
25
|
-
@logs.level = DEFAULT_LEVEL
|
26
|
-
@log_file = DEFAULT_LOG_DIR + '/' + DEFAULT_LOG_NAME
|
27
|
-
@logs.add_appenders Logging.appenders.file(@log_file)
|
28
|
-
|
29
|
-
welcome = '### Start gem Rails Rabbit Janus ###'
|
30
|
-
@logs.info(welcome)
|
31
|
-
end
|
32
|
-
|
33
|
-
# Level to log
|
34
|
-
# @return [Integer] The level to log instance
|
35
|
-
def level
|
36
|
-
@logs.level
|
37
|
-
end
|
38
|
-
|
39
|
-
# Save level to log
|
40
|
-
# @param level [Symbol] Save log level used by this gem
|
41
|
-
def level=(level)
|
42
|
-
@logs.level = level
|
43
|
-
end
|
44
|
-
|
45
|
-
# Write a message in log with a warn level
|
46
|
-
# @param message [String] Message writing in warning level in log
|
47
|
-
def warn(message)
|
48
|
-
@logs.warn(message)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Write a message in log with a info level
|
52
|
-
# @param message [String] Message writing in info level in log
|
53
|
-
def info(message)
|
54
|
-
@logs.info(message)
|
55
|
-
end
|
56
|
-
|
57
|
-
# Write a message in log with a debug level
|
58
|
-
# @param message [String] Message writing in debug level in log
|
59
|
-
def debug(message)
|
60
|
-
@logs.debug(message)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bunny'
|
4
|
-
|
5
|
-
module RubyRabbitmqJanus
|
6
|
-
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
7
|
-
# Class for connection with RabbitMQ Server
|
8
|
-
class RabbitMQ
|
9
|
-
# Return a new instance to RabbitMQ
|
10
|
-
def initialize
|
11
|
-
@connection = Bunny.new(read_options_server)
|
12
|
-
@janus, @response = nil
|
13
|
-
end
|
14
|
-
|
15
|
-
# Connect to server RabbitMQ and post a message in queue ('to-janus' by default)
|
16
|
-
def ask_request_sync(request_type, opts)
|
17
|
-
execute_request do
|
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)
|
28
|
-
close_server_rabbitmq
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
# Connect to server RabbitMQ and read a message in queue ('from-janus' by default)
|
33
|
-
def ask_response(info_request)
|
34
|
-
execute_request do
|
35
|
-
@response = @janus.read(info_request, @connection)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
# Establish connection with RabbitMQ server
|
42
|
-
# @return [RRJ::Janus] Janus object for manipulating data sending and receiving to
|
43
|
-
# rabbitmq server
|
44
|
-
def open_server_rabbitmq
|
45
|
-
@connection.start
|
46
|
-
end
|
47
|
-
|
48
|
-
# Close connection to rabbitmq server
|
49
|
-
def close_server_rabbitmq
|
50
|
-
@connection.close
|
51
|
-
end
|
52
|
-
|
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
|
57
|
-
def read_options_server
|
58
|
-
hash = {}
|
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
|
70
|
-
end
|
71
|
-
hash
|
72
|
-
end
|
73
|
-
|
74
|
-
# Execute request
|
75
|
-
def execute_request
|
76
|
-
open_server_rabbitmq
|
77
|
-
@janus = Janus.new(@connection)
|
78
|
-
yield
|
79
|
-
@response
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
data/lib/rrj/request/path.rb
DELETED
@@ -1,21 +0,0 @@
|
|
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
|
data/lib/rrj/request/replaces.rb
DELETED
@@ -1,109 +0,0 @@
|
|
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
|
data/lib/rrj/request/requests.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RubyRabbitmqJanus
|
4
|
-
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
5
|
-
# Load files json in config/request.
|
6
|
-
# This file is used for sending a request to RabbitMQ
|
7
|
-
# @!attribute [r] requests
|
8
|
-
class Requests
|
9
|
-
include Singleton
|
10
|
-
|
11
|
-
attr_reader :requests
|
12
|
-
|
13
|
-
# Define folder to request
|
14
|
-
PATH_REQUEST = 'config/requests/'
|
15
|
-
|
16
|
-
# Load all requests in folder
|
17
|
-
def initialize
|
18
|
-
@requests = {}
|
19
|
-
Log.instance.info "Loading all requests in : #{PATH_REQUEST}"
|
20
|
-
Dir[File.join(PATH_REQUEST, '*')].count do |file|
|
21
|
-
if File.file?(file)
|
22
|
-
read_file(file)
|
23
|
-
elsif File.directory?(file)
|
24
|
-
each_folder(File.basename(file))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
# Run folder contains templates json
|
32
|
-
def each_folder(subfolder)
|
33
|
-
Dir[File.join(PATH_REQUEST + subfolder, '*')].count do |file|
|
34
|
-
if File.file?(file)
|
35
|
-
read_folder(subfolder.gsub('/', '::') + '::', file)
|
36
|
-
elsif File.directory?(file)
|
37
|
-
each_folder(subfolder + '/' + File.basename(file))
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# Add template json to requests array
|
43
|
-
# @param file [File]
|
44
|
-
def read_file(file)
|
45
|
-
@requests[File.basename(file, '.json').to_s] = File.path(file)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Add template json to requests array with a path
|
49
|
-
# @param folder [Dir]
|
50
|
-
# @param file [File]
|
51
|
-
def read_folder(folder, file)
|
52
|
-
@requests[folder + File.basename(file, '.json').to_s] = File.path(file)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,30 +0,0 @@
|
|
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
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
|
3
|
-
# Define constant to gem.
|
4
|
-
module RubyRabbitmqJanus
|
5
|
-
# Define version to gem
|
6
|
-
VERSION = '0.3.0'
|
7
|
-
|
8
|
-
# Define a summary description to gem
|
9
|
-
SUMMARY = 'Ruby RabbitMQ Janus'
|
10
|
-
|
11
|
-
# Define a long description to gem
|
12
|
-
DESCRIPTION = 'This gem is used to communicate to a server Janus through RabbitMQ '\
|
13
|
-
'software (Message-oriented middleware). It waiting a messages to Rails API who ' \
|
14
|
-
'send to RabbitMQ server in a queue for janus server. Janus processes a message ' \
|
15
|
-
'and send to RabbitMQ server in a queue for gem. Once the received message is ' \
|
16
|
-
'decoded and returned through the Rails API.'
|
17
|
-
end
|