ruby_rabbitmq_janus 1.2.9 → 2.0.0.pre.42

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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/README.md +145 -32
  4. data/config/default.yml +2 -0
  5. data/config/requests.md +2 -1
  6. data/config/requests/admin/add_token.json +6 -0
  7. data/config/requests/admin/allow_token.json +6 -0
  8. data/config/requests/admin/disallow_token.json +6 -0
  9. data/config/requests/admin/handle_info.json +1 -1
  10. data/config/requests/admin/handles.json +1 -1
  11. data/config/requests/admin/remove_token.json +6 -0
  12. data/config/requests/admin/sessions.json +1 -1
  13. data/config/requests/admin/set_locking_debug.json +6 -0
  14. data/config/requests/admin/{log_level.json → set_log_level.json} +1 -1
  15. data/config/requests/admin/tokens.json +5 -0
  16. data/config/requests/base/attach.json +1 -1
  17. data/config/requests/base/create.json +1 -1
  18. data/config/requests/base/destroy.json +1 -1
  19. data/config/requests/base/detach.json +1 -1
  20. data/config/requests/base/info.json +1 -1
  21. data/config/requests/base/keepalive.json +1 -1
  22. data/config/requests/peer/answer.json +1 -1
  23. data/config/requests/peer/offer.json +1 -1
  24. data/config/requests/peer/trickle.json +1 -1
  25. data/lib/generators/ruby_rabbitmq_janus/initializer_generator.rb +3 -0
  26. data/lib/rrj/admin.rb +34 -0
  27. data/lib/rrj/errors/error.rb +2 -1
  28. data/lib/rrj/errors/init.rb +6 -0
  29. data/lib/rrj/errors/janus/janus.rb +1 -0
  30. data/lib/rrj/errors/janus/janus_message.rb +8 -4
  31. data/lib/rrj/errors/janus/janus_processus_keepalive.rb +1 -0
  32. data/lib/rrj/errors/janus/janus_response.rb +27 -6
  33. data/lib/rrj/errors/janus/janus_transaction.rb +4 -0
  34. data/lib/rrj/errors/rabbit/rabbit.rb +3 -1
  35. data/lib/rrj/errors/tools/config.rb +1 -0
  36. data/lib/rrj/info.rb +1 -1
  37. data/lib/rrj/init.rb +37 -169
  38. data/lib/rrj/janus/messages/admin.rb +1 -2
  39. data/lib/rrj/janus/messages/message.rb +4 -4
  40. data/lib/rrj/janus/messages/standard.rb +3 -5
  41. data/lib/rrj/janus/processus/concurrency.rb +1 -1
  42. data/lib/rrj/janus/processus/keepalive.rb +10 -4
  43. data/lib/rrj/janus/responses/admin.rb +31 -0
  44. data/lib/rrj/janus/responses/event.rb +23 -5
  45. data/lib/rrj/janus/responses/response.rb +2 -0
  46. data/lib/rrj/janus/responses/standard.rb +26 -5
  47. data/lib/rrj/janus/transactions/admin.rb +22 -26
  48. data/lib/rrj/janus/transactions/handle.rb +13 -8
  49. data/lib/rrj/janus/transactions/session.rb +25 -7
  50. data/lib/rrj/janus/transactions/transaction.rb +2 -1
  51. data/lib/rrj/rabbit/connect.rb +2 -3
  52. data/lib/rrj/rabbit/publish/admin.rb +1 -6
  53. data/lib/rrj/rabbit/publish/base_publisher.rb +6 -11
  54. data/lib/rrj/rabbit/publish/exclusive.rb +1 -0
  55. data/lib/rrj/rabbit/publish/listener.rb +10 -27
  56. data/lib/rrj/rabbit/publish/non_exclusive.rb +2 -6
  57. data/lib/rrj/rabbit/publish/publisher.rb +4 -17
  58. data/lib/rrj/tools/{config.rb → gem/config.rb} +5 -5
  59. data/lib/rrj/tools/{log.rb → gem/log.rb} +21 -6
  60. data/lib/rrj/tools/gem/option.rb +57 -0
  61. data/lib/rrj/tools/{requests.rb → gem/requests.rb} +0 -0
  62. data/lib/rrj/tools/replaces/admin.rb +7 -13
  63. data/lib/rrj/tools/replaces/handle.rb +61 -0
  64. data/lib/rrj/tools/replaces/replace.rb +57 -27
  65. data/lib/rrj/tools/replaces/session.rb +34 -0
  66. data/lib/rrj/tools/replaces/type.rb +63 -11
  67. data/lib/rrj/tools/tools.rb +4 -3
  68. data/lib/ruby_rabbitmq_janus.rb +1 -0
  69. data/spec/request/admin/request_handle_info_spec.rb +13 -7
  70. data/spec/request/admin/request_handles_spec.rb +20 -0
  71. data/spec/request/admin/request_sessions_spec.rb +5 -4
  72. data/spec/request/admin/request_set_locking_debug_spec.rb +16 -0
  73. data/spec/request/admin/request_set_log_level_spec.rb +16 -0
  74. data/spec/request/admin/request_tokens_spec.rb +13 -0
  75. data/spec/request/base/request_attach_spec.rb +6 -9
  76. data/spec/request/base/request_create_spec.rb +5 -3
  77. data/spec/request/base/request_destroy_spec.rb +5 -3
  78. data/spec/request/base/request_detach_spec.rb +6 -7
  79. data/spec/request/base/request_info_spec.rb +5 -3
  80. data/spec/request/base/request_keepalive_spec.rb +5 -3
  81. data/spec/request/peer/request_offer_spec.rb +18 -92
  82. data/spec/request/peer/request_trickle_spec.rb +9 -28
  83. data/spec/request/peer/request_trickles_spec.rb +23 -0
  84. data/spec/rrj/responses/responses_admin_spec.rb +39 -0
  85. data/spec/rrj/responses/responses_event_spec.rb +25 -0
  86. data/spec/rrj/responses/responses_response_spec.rb +31 -0
  87. data/spec/rrj/responses/responses_standard_spec.rb +43 -0
  88. data/spec/rrj/rrj_config_spec.rb +7 -7
  89. data/spec/rrj/rrj_rabbitmq_spec.rb +1 -1
  90. data/spec/rrj/tools/replace_admin_spec.rb +86 -0
  91. data/spec/rrj/tools/replace_handle_spec.rb +78 -0
  92. data/spec/rrj/tools/replace_session_spec.rb +66 -0
  93. data/spec/rrj/tools/replace_spec.rb +69 -0
  94. data/spec/rrj/tools/type_spec.rb +150 -0
  95. data/spec/spec_helper.rb +46 -7
  96. data/spec/support/examples_request.rb +33 -61
  97. data/spec/support/examples_response.rb +30 -0
  98. data/spec/support/schemas/request/admin/handles.json +15 -0
  99. data/spec/support/schemas/request/admin/set_locking_debug.json +13 -0
  100. data/spec/support/schemas/request/admin/set_log_level.json +11 -0
  101. data/spec/support/schemas/request/admin/tokens.json +13 -0
  102. data/spec/support/type.rb +66 -0
  103. metadata +41 -69
  104. data/config/requests/peer/trickles.json +0 -7
  105. data/lib/rrj/tools/replaces/standard.rb +0 -101
  106. data/spec/fixtures/config/requests/admin/handle_info.json +0 -3
  107. data/spec/fixtures/config/requests/admin/handles.json +0 -3
  108. data/spec/fixtures/config/requests/admin/log_level.json +0 -3
  109. data/spec/fixtures/config/requests/admin/sessions.json +0 -3
  110. data/spec/fixtures/config/requests/base/attach.json +0 -3
  111. data/spec/fixtures/config/requests/base/create.json +0 -4
  112. data/spec/fixtures/config/requests/base/destroy.json +0 -3
  113. data/spec/fixtures/config/requests/base/detach.json +0 -3
  114. data/spec/fixtures/config/requests/base/info.json +0 -3
  115. data/spec/fixtures/config/requests/base/keepalive.json +0 -3
  116. data/spec/fixtures/config/requests/peer/answer.json +0 -3
  117. data/spec/fixtures/config/requests/peer/offer.json +0 -3
  118. data/spec/fixtures/config/requests/peer/trickle.json +0 -3
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyRabbitmqJanus
4
+ module Tools
5
+ module Replaces
6
+ # Format message request with good data to HASH format for Handle request.
7
+ # Manage sdp, handle_id, candidate or candidates.
8
+ #
9
+ # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
10
+ class Handle < Session
11
+ private
12
+
13
+ def replace_element_classic
14
+ super
15
+ replace_sdp if request.key?('jsep')
16
+ replace_handle if request.key?('handle_id')
17
+ replace_candidate \
18
+ if request.key?('candidate') || request.key?('candidates')
19
+ end
20
+
21
+ def replace_handle
22
+ request['handle_id'] = type.convert('handle_id', opts)
23
+ rescue => message
24
+ Tools::Log.instance.warn "Error handle replace : #{message}"
25
+ end
26
+
27
+ def replace_candidate
28
+ cdn = type.convert(determine_key_candidate, opts)
29
+ request[cdn[0]] = cdn[1]
30
+ delete_key_unless
31
+ rescue => message
32
+ Tools::Log.instance.warn "Error candidate replace : #{message}"
33
+ end
34
+
35
+ def replace_sdp
36
+ request['jsep']['sdp'] = type.convert('sdp', opts)
37
+ rescue => message
38
+ Tools::Log.instance.warn "Error sdp replace : #{message}"
39
+ end
40
+
41
+ def determine_key_candidate
42
+ if request.key?('candidate')
43
+ 'candidate'
44
+ else
45
+ 'candidates'
46
+ end
47
+ end
48
+
49
+ def delete_key_unless
50
+ singular = request['candidate']
51
+ plural = request['candidates']
52
+ if singular.eql?('<array>')
53
+ request.delete('candidate')
54
+ elsif plural.eql?('candidates')
55
+ request.delete['candidates']
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -4,25 +4,29 @@ module RubyRabbitmqJanus
4
4
  module Tools
5
5
  # Tools for replace elements in request
6
6
  module Replaces
7
- # Tools for replace elements in request sending to Rabbitmq
7
+ # # Prepare request
8
+ #
9
+ # Tools for replace elements in request sending to Rabbitmq. It's a basic
10
+ # class. Manage just transaction element.
11
+ #
8
12
  # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
9
13
  class Replace
10
- # Initialize tool replace
14
+ # Initialize tool replace.
11
15
  #
12
16
  # @param [Hash] request Request parsing before sending to RabbitMQ/Janus
13
- # @param [Hash] options Replace/Add element in request
17
+ # @param [Hash] options Elements to be replaced in request
14
18
  def initialize(request, options = {})
15
19
  @request = request
16
20
  @opts = options
17
21
  @type = Tools::Type.new(@request)
18
- Tools::Log.instance.debug "Element to replace : #{@opts}"
19
22
  end
20
23
 
21
24
  # Replace element in hash request with information used for this
22
- # transaction
23
- # @return HASH request with element replace
25
+ # transaction.
26
+ #
27
+ # @return [Hash] request with element replace
24
28
  def transform_request
25
- replace_classic
29
+ replace_element_classic
26
30
  unless @opts.empty?
27
31
  replace_other if test_presence?('replace')
28
32
  add_other if test_presence?('add')
@@ -34,39 +38,65 @@ module RubyRabbitmqJanus
34
38
 
35
39
  attr_reader :request, :opts, :type
36
40
 
37
- # Replace basic elements
38
- def replace_classic
39
- replace_transaction if @request.key?('transaction')
40
- replace_session if @request.key?('session_id')
41
- replace_plugin if @request.key?('plugin')
41
+ def test_presence?(presence_of_key)
42
+ @opts.key?(presence_of_key) && @request.key?('body') &&
43
+ !@opts[presence_of_key].blank?
42
44
  end
43
45
 
44
- # Create an transaction string and replace in request field with an
45
- # String format
46
- def replace_transaction
47
- @request['transaction'].replace \
48
- [*('A'..'Z'), *('0'..'9')].sample(10).join
46
+ def replace_other
47
+ values = @opts['replace']
48
+ running_hash(rewrite_key_to_string(values))
49
49
  rescue => message
50
- Tools::Log.instance.warn "Error transaction replace : #{message}"
50
+ Tools::Log.instance.warn "Error REPLACE other field : #{message}"
51
51
  end
52
52
 
53
- # Read option session and replace in request
54
- def replace_session
55
- @request['session_id'] = @type.convert('session_id', @opts)
53
+ def add_other
54
+ values = @opts['add']
55
+ @request['body'].merge!(values)
56
56
  rescue => message
57
- Tools::Log.instance.warn "Error session replace : #{message}"
57
+ Tools::Log.instance.warn "Error ADD other field : #{message}"
58
+ end
59
+
60
+ def rewrite_key_to_string(node)
61
+ Hash[
62
+ node.map do |key, value|
63
+ [key.to_s, value?(value)]
64
+ end
65
+ ]
66
+ end
67
+
68
+ def value?(value)
69
+ value.is_a?(Hash) ? rewrite_key_to_string(value) : value
70
+ end
71
+
72
+ def running_hash(hash, parent = 'body')
73
+ hash.each do |key, value|
74
+ if value.is_a?(Hash)
75
+ running_hash(value, new_parent(key, parent))
76
+ else
77
+ @request[parent][key] = value unless key.eql? 'sdp'
78
+ end
79
+ end
58
80
  end
59
81
 
60
- # Replace plugin string
61
- def replace_plugin
62
- @request['plugin'] = Tools::Config.instance.plugin_at
82
+ def new_parent(key, parent)
83
+ "#{parent}#{'.' unless parent.empty?}#{key}"
84
+ end
85
+
86
+ def replace_element_classic
87
+ replace_transaction if @request.key?('transaction')
88
+ end
89
+
90
+ def replace_transaction
91
+ @request['transaction'] = @type.convert('transaction')
63
92
  rescue => message
64
- Tools::Log.instance.warn "Error plugin replace : #{message}"
93
+ Tools::Log.instance.warn "Error transaction replace : #{message}"
65
94
  end
66
95
  end
67
96
  end
68
97
  end
69
98
  end
70
99
 
71
- require 'rrj/tools/replaces/standard'
100
+ require 'rrj/tools/replaces/session'
101
+ require 'rrj/tools/replaces/handle'
72
102
  require 'rrj/tools/replaces/admin'
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyRabbitmqJanus
4
+ module Tools
5
+ module Replaces
6
+ # Format message request with good data to HASH format for Session
7
+ # request.
8
+ # Manage session and plugin.
9
+ #
10
+ # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
11
+ class Session < Replace
12
+ private
13
+
14
+ def replace_element_classic
15
+ super
16
+ replace_session if request.key?('session_id')
17
+ replace_plugin if request.key?('plugin')
18
+ end
19
+
20
+ def replace_session
21
+ request['session_id'] = type.convert('session_id', opts)
22
+ rescue => message
23
+ Tools::Log.instance.warn "Error session replace : #{message}"
24
+ end
25
+
26
+ def replace_plugin
27
+ request['plugin'] = type.convert('plugin')
28
+ rescue => message
29
+ Tools::Log.instance.warn "Error plugin replace : #{message}"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_support/core_ext/string'
4
+
5
+ # :reek:UtilityFunction
6
+ # :reek:TooManyStatements
7
+ # rubocop:disable Metrics/CyclomaticComplexity
8
+
3
9
  module RubyRabbitmqJanus
4
10
  module Tools
5
11
  # Class for converting elemnts given by apps to this gem an type conform
@@ -10,7 +16,7 @@ module RubyRabbitmqJanus
10
16
  # @param [Hash] request Request parsing before sending to RabbitMQ/Janus
11
17
  def initialize(request)
12
18
  @request = request
13
- @data = nil
19
+ @key = @data = nil
14
20
  end
15
21
 
16
22
  # Return an data with a type corresponding to string in request
@@ -19,35 +25,81 @@ module RubyRabbitmqJanus
19
25
  # @param [Hash] option Datas sending by user and adding/replace in request
20
26
  #
21
27
  # @return data with good type for JSON format
22
- def convert(key, option)
23
- @data = option[key]
24
- case @request[key]
28
+ def convert(key, option = {})
29
+ @key = key
30
+ @data = option[@key] if option.key?(@key)
31
+ convert_data
32
+ end
33
+
34
+ private
35
+
36
+ def convert_data
37
+ case search_key
25
38
  when '<string>' then convert_to_type_string
26
- when '<number>' then convert_to_type_number
39
+ when '<number>', '<integer>' then convert_to_type_number
27
40
  when '<boolean>' then convert_to_type_boolean
41
+ when '<array>' then convert_to_type_array
42
+ when '<transaction>' then convert_to_type_transaction
43
+ when /<plugin\[[0-9]\]>/ then convert_to_type_plugin
28
44
  end
29
45
  end
30
46
 
31
- private
47
+ def search_key
48
+ field = @request[@key]
49
+ if field.blank?
50
+ @request.each do |key, value|
51
+ test = @request[key]
52
+ field = test[@key] \
53
+ if value.is_a?(Hash) && test.key?(@key)
54
+ end
55
+ end
56
+ field
57
+ end
58
+
59
+ def convert_to_type_transaction
60
+ [*('A'..'Z'), *('0'..'9')].sample(10).join
61
+ end
32
62
 
33
- # Convert a data to String type
34
63
  def convert_to_type_string
35
64
  @data.to_s
36
65
  end
37
66
 
38
- # Convert a data to Integer type
39
67
  def convert_to_type_number
40
68
  @data.to_i
41
69
  end
42
70
 
43
- # Convert a data to Boolean type
44
71
  def convert_to_type_boolean
45
- if @data.casecmp('TRUE')
72
+ if test_boolean('TRUE', TrueClass)
46
73
  true
47
- elsif @data.casecmp('FALSE')
74
+ elsif test_boolean('FALSE', FalseClass)
48
75
  false
49
76
  end
50
77
  end
78
+
79
+ def convert_to_type_plugin
80
+ index = @request[@key].gsub('<plugin[', '').gsub(']>', ']').to_i
81
+ Config.instance.plugin_at(index)
82
+ end
83
+
84
+ def convert_to_type_array
85
+ data = array_alone
86
+ key = data.is_a?(Hash) ? @key : @key.pluralize
87
+ [key, data]
88
+ end
89
+
90
+ def test_boolean(boolean_string, boolean_class)
91
+ @data.is_a?(boolean_class) ||
92
+ (@data.is_a?(String) && @data.casecmp(boolean_string).eql?(0))
93
+ end
94
+
95
+ def array_alone
96
+ if @data.is_a?(Array)
97
+ @data.count.eql?(1) ? @data[0] : @data
98
+ else
99
+ @data
100
+ end
101
+ end
51
102
  end
52
103
  end
53
104
  end
105
+ # rubocop:enable Metrics/CyclomaticComplexity
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rrj/tools/log'
4
- require 'rrj/tools/config'
5
- require 'rrj/tools/requests'
3
+ require 'rrj/tools/gem/log'
4
+ require 'rrj/tools/gem/config'
5
+ require 'rrj/tools/gem/requests'
6
+ require 'rrj/tools/gem/option'
6
7
  require 'rrj/tools/replaces/type'
7
8
  require 'rrj/tools/replaces/replace'
8
9
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  # Load all tools necessary to good functionlaty to this gem
4
4
  require 'rrj/init'
5
+ require 'rrj/admin'
5
6
 
6
7
  # Define tools for this gems
7
8
  require 'rrj/tools/tools'
@@ -2,13 +2,19 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe 'RubyRabbitmqJanus::RRJ -- message type handle_info' do
6
- before(:example) { @type = 'admin::handle_info' }
7
-
8
- describe '#message_admin', type: :request, level: :admin,
9
- name: :handle_info, broken: true do
10
- include_examples 'message_handle_admin should match json schema'
5
+ describe 'RubyRabbitmqJanus::RRJ -- message type handle info' do
6
+ before(:example) do
7
+ @type = 'admin::handle_info'
8
+ sender = nil
9
+ @gateway.start_transaction do |transaction|
10
+ sender = transaction.publish_message('base::attach').sender
11
+ end
12
+ @options = { 'handle_id' => sender }
11
13
  end
12
14
 
13
- # after(:example) { @gateway.handle_message_simple('base::detach') }
15
+ describe '#start_transaction_admin', type: :request,
16
+ level: :admin,
17
+ name: :handle_info do
18
+ include_examples 'transaction admin should match json schema'
19
+ end
14
20
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'RubyRabbitmqJanus::RRJ -- message type handles list' do
6
+ before(:example) do
7
+ @type = 'admin::handles'
8
+ sender = nil
9
+ @gateway.start_transaction do |transaction|
10
+ sender = transaction.publish_message('base::attach').sender
11
+ end
12
+ @options = { 'handle_id' => sender }
13
+ end
14
+
15
+ describe '#start_transaction_admin', type: :request,
16
+ level: :admin,
17
+ name: :handles do
18
+ include_examples 'transaction admin should match json schema'
19
+ end
20
+ end
@@ -2,11 +2,12 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe 'RubyRabbitmqJanus::RRJ -- message type sessions' do
5
+ describe 'RubyRabbitmqJanus::RRJ -- message type sessions list' do
6
6
  before(:example) { @type = 'admin::sessions' }
7
7
 
8
- describe '#message_admin', type: :request, level: :admin, name: :sessions,
9
- broken: true do
10
- include_examples 'message_admin should match json schema'
8
+ describe '#start_transaction_admin', type: :request,
9
+ level: :admin,
10
+ name: :sessions do
11
+ include_examples 'transaction admin should match json schema'
11
12
  end
12
13
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'RubyRabbitmqJanus::RRJ -- message type set locking debug' do
6
+ before(:example) do
7
+ @type = 'admin::set_locking_debug'
8
+ @options = { 'debug' => [true, false].sample }
9
+ end
10
+
11
+ describe '#start_transaction_admin', type: :request,
12
+ level: :admin,
13
+ name: :set_locking_debug do
14
+ include_examples 'transaction admin should match json schema'
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'RubyRabbitmqJanus::RRJ -- message type set log level' do
6
+ before(:example) do
7
+ @type = 'admin::set_log_level'
8
+ @options = { 'level' => Random.rand(7) }
9
+ end
10
+
11
+ describe '#start_transaction_admin', type: :request,
12
+ level: :admin,
13
+ name: :set_log_level do
14
+ include_examples 'transaction admin should match json schema'
15
+ end
16
+ end