ruby_rabbitmq_janus 1.1.12 → 1.2.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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +127 -0
  3. data/Rakefile +1 -3
  4. data/config/default.md +14 -14
  5. data/config/default.yml +12 -18
  6. data/config/requests.md +80 -0
  7. data/config/requests/{channel → peer}/answer.json +1 -1
  8. data/config/requests/{channel → peer}/offer.json +0 -0
  9. data/lib/generators/ruby_rabbitmq_janus/install_generator.rb +1 -0
  10. data/lib/rrj/errors/config.rb +8 -1
  11. data/lib/rrj/errors/error.rb +18 -5
  12. data/lib/rrj/errors/janus.rb +4 -2
  13. data/lib/rrj/errors/janus_message.rb +19 -15
  14. data/lib/rrj/errors/janus_response.rb +13 -26
  15. data/lib/rrj/errors/janus_transaction.rb +7 -13
  16. data/lib/rrj/errors/rabbit.rb +3 -9
  17. data/lib/rrj/info.rb +1 -1
  18. data/lib/rrj/init.rb +118 -68
  19. data/lib/rrj/janus/processus/concurrency.rb +8 -22
  20. data/lib/rrj/janus/processus/event.rb +13 -15
  21. data/lib/rrj/janus/processus/keepalive.rb +20 -15
  22. data/lib/rrj/janus/responses/response.rb +0 -1
  23. data/lib/rrj/janus/transactions/admin.rb +14 -22
  24. data/lib/rrj/janus/transactions/handle.rb +19 -33
  25. data/lib/rrj/janus/transactions/session.rb +13 -6
  26. data/lib/rrj/janus/transactions/transaction.rb +16 -24
  27. data/lib/rrj/rabbit/connect.rb +3 -4
  28. data/lib/rrj/rabbit/propertie.rb +6 -9
  29. data/lib/rrj/rabbit/publish/admin.rb +1 -1
  30. data/lib/rrj/rabbit/publish/base_publisher.rb +5 -0
  31. data/lib/rrj/rabbit/publish/listener.rb +1 -1
  32. data/lib/rrj/rabbit/publish/non_exclusive.rb +1 -1
  33. data/lib/rrj/tools/config.rb +44 -18
  34. data/lib/rrj/tools/log.rb +30 -15
  35. data/lib/rrj/tools/replaces/admin.rb +1 -3
  36. data/lib/rrj/tools/replaces/replace.rb +1 -6
  37. data/lib/rrj/tools/requests.rb +8 -8
  38. data/lib/rrj/tools/tools.rb +0 -1
  39. data/lib/ruby_rabbitmq_janus.rb +1 -0
  40. data/spec/request/admin/request_handle_info_spec.rb +3 -3
  41. data/spec/request/base/request_attach_spec.rb +7 -10
  42. data/spec/request/base/request_detach_spec.rb +6 -9
  43. data/spec/request/peer/request_answer_spec.rb +66 -0
  44. data/spec/request/peer/request_offer_spec.rb +113 -0
  45. data/spec/request/peer/request_trickle_spec.rb +9 -11
  46. data/spec/rrj/rrj_log_spec.rb +1 -6
  47. data/spec/spec_helper.rb +0 -1
  48. data/spec/support/examples.rb +6 -9
  49. data/spec/support/schemas/config/config.json +20 -32
  50. data/spec/support/schemas/request/peer/answer.json +15 -0
  51. data/spec/support/schemas/request/peer/offer.json +15 -0
  52. data/spec/support/schemas/request/peer/trickle.json +4 -12
  53. metadata +10 -19
  54. data/config/requests/channel/README.md +0 -29
  55. data/config/requests/channel/create.json +0 -9
  56. data/config/requests/channel/describe.json +0 -10
  57. data/config/requests/channel/destroy.json +0 -10
  58. data/config/requests/channel/exists.json +0 -10
  59. data/config/requests/channel/join.json +0 -11
  60. data/config/requests/channel/leave.json +0 -11
  61. data/config/requests/channel/list.json +0 -9
  62. data/config/requests/channel/select.json +0 -11
  63. data/config/requests/channel/trickle.json +0 -10
  64. data/config/requests/videocast/join.json +0 -12
  65. data/config/requests/videocast/leave.json +0 -11
  66. data/config/ruby-rabbitmq-janus.yml +0 -27
  67. data/lib/rrj/errors/request.rb +0 -21
  68. data/lib/rrj/tools/env.rb +0 -22
@@ -5,7 +5,11 @@ module RubyRabbitmqJanus
5
5
  # Modules for create autonomous processus
6
6
  module Concurrencies
7
7
  # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
8
- # Abstract class for janus Event and Keepalive
8
+
9
+ # # Class for manage threads
10
+ #
11
+ # @abstract Manage thread in this gem for keepalive message and listen
12
+ # standard queue.
9
13
  class Concurrency
10
14
  # Initialize class with elements for thread communication
11
15
  def initialize
@@ -14,37 +18,19 @@ module RubyRabbitmqJanus
14
18
  @lock = Mutex.new
15
19
  @condition = ConditionVariable.new
16
20
  @thread = Thread.new { initialize_thread }
17
- @thread.abort_on_exception = true
18
21
  end
19
22
 
20
23
  private
21
24
 
22
- # Initialize a thread
23
25
  def initialize_thread
24
- rabbit.transaction_long { transaction_running }
26
+ @rabbit.transaction_long { transaction_running }
25
27
  rescue Interrupt
26
28
  Tools::Log.instance.info "Stop transaction #{self.class.name}"
27
- rabbit.close
28
- end
29
-
30
- # Wait an signal
31
- def wait
32
- @lock.synchronize do
33
- @condition.wait(@lock)
34
- Tools::Log.instance.info 'Waitting signal'
35
- yield
36
- end
37
- end
38
-
39
- # Send and signal
40
- def signal
41
- @lock.synchronize do
42
- Tools::Log.instance.info 'Sending signal'
43
- @condition.signal
44
- end
29
+ @rabbit.close
45
30
  end
46
31
 
47
32
  attr_accessor :rabbit, :publish
33
+ attr_reader :thread, :lock, :condition
48
34
  end
49
35
  end
50
36
  end
@@ -1,33 +1,31 @@
1
1
  # frozen_string_literal: true
2
- # :reek:InstanceVariableAssumption and :reek:NilCheck
3
- # :reek:TooManyInstanceVariables and :reek:TooManyStatements
4
2
 
5
3
  module RubyRabbitmqJanus
6
- # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
7
4
  module Janus
8
5
  module Concurrencies
9
- # For listen standard queue ("from-janus" by default)
6
+ # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
7
+
8
+ # # Listen standar queue
9
+ #
10
+ # Listen standard queue and sending a block code to thread listen.
11
+ # The default queue is configured in config file.
12
+ #
13
+ # @see file:/config/default.md For more information to config file used.
10
14
  class Event < Concurrency
11
15
  include Singleton
12
16
 
13
- # Initialize Event object. Is used for listen an standard out queue to
14
- # Janus
15
- def initialize
16
- super
17
- @publish = @response = nil
18
- end
19
-
20
- # Execute an block code in a thread
17
+ # Create a thred for execute a block code in a thread
18
+ #
19
+ # @yield Send to publisher the actions when a Janus event is received
21
20
  def run(&block)
22
- @thread.join
21
+ thread.join
23
22
  Thread.new do
24
- loop { @thread.thread_variable_get(:publish).listen_events(&block) }
23
+ loop { thread.thread_variable_get(:publish).listen_events(&block) }
25
24
  end
26
25
  end
27
26
 
28
27
  private
29
28
 
30
- # Initialize a thread
31
29
  def transaction_running
32
30
  publisher = Rabbit::Publisher::Listener.new(rabbit)
33
31
  Thread.current.thread_variable_set(:publish, publisher)
@@ -4,59 +4,64 @@ module RubyRabbitmqJanus
4
4
  module Janus
5
5
  module Concurrencies
6
6
  # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
7
- # Manage sending keepalive message
7
+
8
+ # # Manage sending keepalive message
9
+ #
10
+ # Create a thread for sending keepalive to session created by this
11
+ # instanciate gem
8
12
  class Keepalive < Concurrency
9
13
  include Singleton
10
14
 
11
- # Initalize a keepalive message
15
+ # Create a thread
12
16
  def initialize
13
- @publish = @response = nil
17
+ @response = nil
14
18
  super
15
19
  end
16
20
 
17
- # Return an number session created
21
+ # @return [Fixnum] Identifier to session created by Janus
18
22
  def session
19
- wait { @response.session }
23
+ lock.synchronize do
24
+ condition.wait(lock)
25
+ Tools::Log.instance.info 'Waitting signal'
26
+ running_session
27
+ end
20
28
  end
21
29
 
22
30
  private
23
31
 
24
- # Star an session with janus and waiting an signal for saving session_id
25
32
  def transaction_running
26
33
  @response = Janus::Responses::Standard.new(create_session)
27
- signal
34
+ lock.synchronize do
35
+ Tools::Log.instance.info 'Sending signal'
36
+ condition.signal
37
+ end
28
38
  session_keepalive(ttl)
29
39
  end
30
40
 
31
- # Create an loop for sending a keepalive message
32
41
  def session_keepalive(time_to_live)
33
42
  loop do
34
43
  sleep time_to_live
35
- @publish.send_a_message(message_keepalive)
44
+ publish.send_a_message(message_keepalive)
36
45
  end
37
46
  rescue => message
38
47
  Tools::Log.instance.debug "Error keepalive : #{message}"
39
48
  end
40
49
 
41
- # Define a Time To Live between each request sending to janus
42
50
  def ttl
43
51
  Tools::Config.instance.options['gem']['session']['keepalive'].to_i
44
52
  rescue => error
45
53
  Tools::Log.instance.debug "TTL Not loading - #{error}"
46
54
  end
47
55
 
48
- # Create an message and publish for create session in Janus
49
56
  def create_session
50
- @publish = Rabbit::Publisher::PublishExclusive.new(rabbit.channel, '')
51
- @publish.send_a_message(Janus::Messages::Standard.new('base::create'))
57
+ publish = Rabbit::Publisher::PublishExclusive.new(rabbit.channel, '')
58
+ publish.send_a_message(Janus::Messages::Standard.new('base::create'))
52
59
  end
53
60
 
54
- # Return session_id
55
61
  def running_session
56
62
  @response.session
57
63
  end
58
64
 
59
- # Create an message with type keepalive
60
65
  def message_keepalive
61
66
  Janus::Messages::Standard.new('base::keepalive',
62
67
  'session_id' => running_session)
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # :reek:TooManyMethods and :reek:DuplicateMethodCall
3
2
 
4
3
  module RubyRabbitmqJanus
5
4
  module Janus
@@ -4,43 +4,37 @@ module RubyRabbitmqJanus
4
4
  module Janus
5
5
  module Transactions
6
6
  # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
7
+
7
8
  # This class work with janus and send a series of message
8
9
  class Admin < Handle
9
- # Initialize conncetion to Rabbit and Janus
10
+ # Opening a long transaction with rabbitmq. If handle is equal to 0
11
+ # create an handle, send request 'type::atach' before message.
12
+ #
13
+ # @yield Send a message to Janus
14
+ #
15
+ # @return [Fixnum] Sender using in current transaction
10
16
  def connect
11
17
  rabbit.transaction_short do
12
18
  choose_queue
13
- send_a_message { yield }
14
- end
15
- end
16
-
17
- # Choose queue, create an handle, connect to rabbitmq server and send
18
- # messages
19
- def handle_connect
20
- rabbit.transaction_long do
21
- choose_queue
22
- create_handle
19
+ create_handle if handle.eql?(0)
23
20
  yield
24
21
  end
22
+ handle
25
23
  end
26
24
 
27
25
  # Publish an message in handle
28
- def publish_message_handle(type, options = {})
26
+ def publish_message_handle(type, options)
29
27
  opts = {
30
28
  'session_id' => session,
31
29
  'handle_id' => handle,
32
- 'add' => {
33
- 'admin_secret' => admin_secret
34
- }
30
+ 'admin_secret' => admin_secret
35
31
  }
36
32
  msg = Janus::Messages::Admin.new(type, opts.merge!(options))
37
- send_a_message { msg }
33
+ publisher = publish.send_a_message(msg)
34
+ Janus::Responses::Standard.new(read_response(publisher))
38
35
  end
39
36
 
40
- # Stop an handle running
41
- def handle_running_stop
42
- publish_message_handle('base::detach')
43
- end
37
+ private
44
38
 
45
39
  # Define queue used for admin message
46
40
  def choose_queue
@@ -48,8 +42,6 @@ module RubyRabbitmqJanus
48
42
  @publish = Rabbit::Publisher::PublisherAdmin.new(chan)
49
43
  end
50
44
 
51
- private
52
-
53
45
  # Override method for publishing an message and reading a response
54
46
  def send_a_message
55
47
  Tools::Log.instance.info 'Publish a message ...'
@@ -4,48 +4,40 @@ module RubyRabbitmqJanus
4
4
  module Janus
5
5
  module Transactions
6
6
  # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
7
+
7
8
  # This class work with janus and send a series of message
8
- # :reek:TooManyStatements
9
9
  class Handle < Session
10
- # Inistialize transaction handle
11
- def initialize(session)
10
+ # Initialize a transaction with handle
11
+ #
12
+ # @param [Fixnum] session
13
+ # Use a session identifier for created message
14
+ def initialize(session, exclusive, handle = 0)
12
15
  super(session)
13
- @exclusive = nil
14
- end
15
-
16
- # Initialize connection to Rabbit and Janus
17
- def handle_connect(exclusive)
18
16
  @exclusive = exclusive
19
- rabbit.transaction_long do
20
- choose_queue(exclusive)
21
- create_handle
22
- yield
23
- end
24
- handle
17
+ @handle = handle
25
18
  end
26
19
 
27
- # Initialize connection to Rabbit and Janus and close after sending an
28
- # received a response
29
- def handle_connect_and_stop(exclusive, sender)
30
- @exclusive = exclusive
20
+ # Opening a long transaction with rabbitmq and is ending closing
21
+ # transaction, so delete exclusive queue
22
+ #
23
+ # @yield Send a message to Janus
24
+ #
25
+ # @return [Fixnum] Sender using in current transaction
26
+ def connect
31
27
  rabbit.transaction_short do
32
- choose_queue(exclusive)
33
- sender.eql?(0) ? create_handle : connect_handle(sender)
28
+ choose_queue
29
+ create_handle
34
30
  yield
35
31
  end
36
- end
37
-
38
- # Stop an handle running
39
- def handle_running_stop
40
- publish_message_handle('base::detach')
32
+ handle
41
33
  end
42
34
 
43
35
  # Publish an message in handle
44
- def publish_message_handle(type, options = {})
36
+ def publish_message_handle(type, options)
45
37
  opts = { 'session_id' => session, 'handle_id' => handle }
46
38
  msg = Janus::Messages::Standard.new(type, opts.merge!(options))
47
39
  publisher = publish.send_a_message(msg)
48
- Janus::Responses::Standard.new(read_response(publisher, @exclusive))
40
+ Janus::Responses::Standard.new(read_response(publisher))
49
41
  end
50
42
 
51
43
  private
@@ -58,12 +50,6 @@ module RubyRabbitmqJanus
58
50
  @handle = send_a_message_exclusive { msg }
59
51
  end
60
52
 
61
- # Connect to handle
62
- def connect_handle(sender)
63
- Tools::Log.instance.info 'Connect an handle'
64
- @handle = sender
65
- end
66
-
67
53
  # Send a messaeg in exclusive queue
68
54
  def send_a_message_exclusive
69
55
  Janus::Responses::Standard.new(read_response_exclusive do
@@ -4,14 +4,21 @@ module RubyRabbitmqJanus
4
4
  module Janus
5
5
  module Transactions
6
6
  # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
7
- # This class work with janus and send a series of message for session
8
- # level
7
+
8
+ # # Manage a transaction
9
+ # Manage a transaction with message if contains a session identifier
9
10
  class Session < Transaction
10
- # Connect to session and post an message
11
- def session_connect(exclusive)
11
+ # Opening a short transaction with rabbitmq and close when is ending
12
+ #
13
+ # @param [Boolean] exclusive
14
+ # Determine if the message is sending to a exclusive queue or not
15
+ #
16
+ # @yield Send a message to Janus
17
+ def connect(exclusive)
18
+ @exclusive = exclusive
12
19
  rabbit.transaction_short do
13
- choose_queue(exclusive)
14
- send_a_message(exclusive) { yield }
20
+ choose_queue
21
+ send_a_message { yield }
15
22
  end
16
23
  end
17
24
  end
@@ -1,39 +1,33 @@
1
1
  # frozen_string_literal: true
2
- # :reek:TooManyInstanceVariables and :reek:ControlParameter
3
- # :reek:ControlParameter and :reek:BooleanParameter
4
2
 
5
3
  module RubyRabbitmqJanus
6
4
  module Janus
7
- # Define an module for manipulate a message between apps and janus
5
+ # Define an module for manipulate messages between apps and Janus
8
6
  module Transactions
9
7
  # @author VAILLANT Jeremy <jeremy.vaillant@dazzl.tv>
10
- # This class work with janus and send a series of message
8
+
9
+ # # Manage a transactions
10
+ # This class work with Janus and send a series of message
11
11
  class Transaction
12
- # Initialize an transaction
12
+ # Initialize a transaction
13
+ #
14
+ # @param [Fixnum] session
15
+ # Use a session identifier for created message
13
16
  def initialize(session)
14
17
  @rabbit = Rabbit::Connect.new
15
18
  @session = session
16
- @response = @handle = @publish = nil
19
+ @publish = @exclusive = nil
17
20
  rescue => error
18
21
  raise Errors::JanusTransaction, error
19
22
  end
20
23
 
21
- # Opening a short transaction with rabbitmq and close when is ending
22
- def connect(exclusive)
23
- @rabbit.transaction_short do
24
- choose_queue(exclusive)
25
- send_a_message(exclusive) { yield }
26
- end
27
- end
28
-
29
24
  private
30
25
 
31
- attr_reader :rabbit, :session, :response, :handle, :publish
26
+ attr_reader :rabbit, :session, :response, :handle, :publish, :exclusive
32
27
 
33
- # determine queue used
34
- def choose_queue(exclusive)
28
+ def choose_queue
35
29
  chan = @rabbit.channel
36
- @publish = if exclusive
30
+ @publish = if @exclusive
37
31
  Tools::Log.instance.debug \
38
32
  'Choose an queue Exclusive : ampq.gen-xxx'
39
33
  Rabbit::Publisher::PublishExclusive.new(chan, '')
@@ -44,16 +38,14 @@ module RubyRabbitmqJanus
44
38
  end
45
39
  end
46
40
 
47
- # Send a message to queue
48
- def send_a_message(exclusive)
41
+ def send_a_message
49
42
  Tools::Log.instance.info 'Publish a message ...'
50
43
  publish = @publish.send_a_message(yield)
51
- Janus::Responses::Standard.new(read_response(publish, exclusive))
44
+ Janus::Responses::Standard.new(read_response(publish))
52
45
  end
53
46
 
54
- # Read a response if is a exclusive message
55
- def read_response(publish, exclusive)
56
- if exclusive
47
+ def read_response(publish)
48
+ if @exclusive
57
49
  Tools::Log.instance.info '... and read a janus response'
58
50
  publish
59
51
  else
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # :reek:FeatureEnvy
3
2
 
4
3
  module RubyRabbitmqJanus
5
4
  module Rabbit
@@ -9,7 +8,7 @@ module RubyRabbitmqJanus
9
8
  # Initialize connection to server RabbitMQ
10
9
  def initialize
11
10
  Tools::Log.instance.debug 'Initialize connection with RabbitMQ'
12
- @rabbit = Bunny.new(read_options_server)
11
+ @rabbit = Bunny.new(read_options_server.merge!(option_log_rabbit))
13
12
  end
14
13
 
15
14
  # Create an transaction with rabbitmq and close after response is received
@@ -54,9 +53,9 @@ module RubyRabbitmqJanus
54
53
  cfg = Tools::Config.instance.options['rabbit']
55
54
  opts = {}
56
55
  %w(host port pass user vhost).each do |val|
57
- opts.merge!(val.to_sym => Tools::Env.instance.test_env_var(cfg, val))
56
+ opts.merge!(val.to_sym => cfg[val])
58
57
  end
59
- opts.merge!(option_log_rabbit)
58
+ opts
60
59
  end
61
60
 
62
61
  # Define option logs for bunny