opentok 4.9.0 → 4.12.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bf1e7d0f61794792bf98909f86601643c30df2cb2343297dcca0e8df7397d93a
4
- data.tar.gz: 2c336b28cd586be0f082770b8854fd7f222d4c7047ba060a2fe300c31bf2417f
3
+ metadata.gz: 454d2a2b89a14ec5af2ccb56e10c8a52d15eda5df4bf2f0f3274c4838499c8b4
4
+ data.tar.gz: d89e3eec35b639b3af4cc859291a4f1e464f197b5381333778112909ef1e11a7
5
5
  SHA512:
6
- metadata.gz: 2730c26df934c6fb413f177db04bdc048ea58285bf2dbd640d90873a9f2670f31264141f08280cf393860eb8b11f7b525f2ef61e5d450d5c15d0fe0437addc5d
7
- data.tar.gz: 3c6570e28e20be4c471ca6313fe1f6da293927637d78594288da2043fcde7b4a810113df5038c2aa8f836c30e8045c47fe6dd48ee3123dfad1df4db67058839e
6
+ metadata.gz: 38f6b630ff8ad46fb07ebf47093adb418174afd4c2917bd9cf0ce1514090d4e3c9c0d9f9f4e9165ffe059e004e4eb724b4ad028e29c419d33006d326595c1da4
7
+ data.tar.gz: d66dce967d068ade1412c2b2fc23b80ba2a71eb528be1c8dab33dcf04813db2d0dbdb81b85a82b5c512dd0c5f4e777be61009422e51c4bf02e1d946adac00e1f
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  matrix:
13
13
  os: [ubuntu-latest, windows-latest, macos-latest]
14
- ruby: [2.5, 2.6, 2.7, 3.0]
14
+ ruby: [3.0, 3.1, 3.2, 3.3]
15
15
  exclude:
16
16
  - os: windows-latest
17
17
  ruby: 3.0
data/CHANGES.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 4.12.0
2
+
3
+ * Updating the `Archives#create` method to allow `max_bitrate` as an option. See [#288](https://github.com/opentok/OpenTok-Ruby-SDK/pull/288)
4
+
5
+ # 4.11.0
6
+
7
+ * Updating client token creation to use JWTs by default. See [#287](https://github.com/opentok/OpenTok-Ruby-SDK/pull/274)
8
+
1
9
  # 4.9.0
2
10
 
3
11
  * Adds the `publisheronly` role for client token creation. See [#272](https://github.com/opentok/OpenTok-Ruby-SDK/pull/272)
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ gem "pry"
4
+
3
5
  # Specify your gem's dependencies in opentok.gemspec
4
6
  gemspec
@@ -79,6 +79,10 @@ module OpenTok
79
79
  # layout type. For more information, see
80
80
  # {https://tokbox.com/developer/guides/archiving/layout-control.html Customizing
81
81
  # the video layout for composed archives}.
82
+ # @option options [Integer] :max_bitrate (Optional) The maximum video bitrate for the archive, in bits per second. The minimum
83
+ # value is 100,000 and the maximum is 6,000,000. This option is only valid for composed archives. Set the maximum video bitrate
84
+ # to control the size of the composed archive. This maximum bitrate applies to the video bitrate only. If the output archive has
85
+ # audio, those bits will be excluded from the limit.
82
86
  #
83
87
  # @return [Archive] The Archive object, which includes properties defining the archive,
84
88
  # including the archive ID.
@@ -105,7 +109,8 @@ module OpenTok
105
109
  :resolution,
106
110
  :layout,
107
111
  :multi_archive_tag,
108
- :stream_mode
112
+ :stream_mode,
113
+ :max_bitrate
109
114
  ]
110
115
  opts = options.inject({}) do |m,(k,v)|
111
116
  if valid_opts.include? k.to_sym
@@ -36,6 +36,7 @@ module OpenTok
36
36
  # the token.
37
37
  #
38
38
  # @param [Hash] options A hash defining options for the token.
39
+ # @option options [String] :token_type The type of token to generate. Must be one of 'T1' or 'JWT'. 'JWT' is the default.
39
40
  # @option options [Symbol] :role The role for the token. Set this to one of the following
40
41
  # values:
41
42
  # * <code>:subscriber</code> -- A subscriber can only subscribe to streams.
@@ -28,6 +28,7 @@ module OpenTok
28
28
  # Generates a token.
29
29
  #
30
30
  # @param [Hash] options
31
+ # @option options [String] :token_type The type of token to generate. Must be one of 'T1' or 'JWT'. 'JWT' is the default.
31
32
  # @option options [Symbol] :role The role for the token. Set this to one of the following
32
33
  # values:
33
34
  # * <code>:subscriber</code> -- A subscriber can only subscribe to streams.
@@ -6,10 +6,13 @@ require "addressable/uri"
6
6
  require "openssl"
7
7
  require "active_support"
8
8
  require "active_support/time"
9
+ require "jwt"
9
10
 
10
11
  module OpenTok
11
12
  # @private
12
13
  module TokenGenerator
14
+ VALID_TOKEN_TYPES = ['T1', 'JWT'].freeze
15
+
13
16
  # this works when using include TokenGenerator
14
17
  def self.included(base)
15
18
  base.extend(ClassMethods)
@@ -33,7 +36,14 @@ module OpenTok
33
36
  end
34
37
  dynamic_args.compact!
35
38
  args = args.first(4-dynamic_args.length)
36
- self.class.generate_token.call(*dynamic_args, *args)
39
+ token_type = if args.any? && args.last.is_a?(Hash) && args.last.has_key?(:token_type)
40
+ args.last[:token_type].upcase
41
+ else
42
+ "JWT"
43
+ end
44
+ raise "'#{token_type}' is not a valid token type. Must be one of: #{VALID_TOKEN_TYPES.join(', ')}" unless VALID_TOKEN_TYPES.include? token_type
45
+
46
+ self.class.generate_token(token_type).call(*dynamic_args, *args)
37
47
  end
38
48
  end
39
49
 
@@ -43,14 +53,14 @@ module OpenTok
43
53
  end
44
54
 
45
55
  # Generates a token
46
- def generate_token
47
- TokenGenerator::GENERATE_TOKEN_LAMBDA
56
+ def generate_token(token_type)
57
+ token_type == 'T1' ? TokenGenerator::GENERATE_T1_TOKEN_LAMBDA : TokenGenerator::GENERATE_JWT_LAMBDA
48
58
  end
49
59
 
50
60
  end
51
61
 
52
62
  # @private TODO: this probably doesn't need to be a constant anyone can read
53
- GENERATE_TOKEN_LAMBDA = ->(api_key, api_secret, session_id, opts = {}) do
63
+ GENERATE_T1_TOKEN_LAMBDA = ->(api_key, api_secret, session_id, opts = {}) do
54
64
  # normalize required data params
55
65
  role = opts.fetch(:role, :publisher)
56
66
  unless ROLES.has_key? role
@@ -101,6 +111,52 @@ module OpenTok
101
111
  TOKEN_SENTINEL + Base64.strict_encode64(meta_string + ":" + data_string)
102
112
  end
103
113
 
114
+ GENERATE_JWT_LAMBDA = ->(api_key, api_secret, session_id, opts = {}) do
115
+ # normalize required data params
116
+ role = opts.fetch(:role, :publisher)
117
+ unless ROLES.has_key? role
118
+ raise "'#{role}' is not a recognized role"
119
+ end
120
+ unless Session.belongs_to_api_key? session_id.to_s, api_key
121
+ raise "Cannot generate token for a session_id that doesn't belong to api_key: #{api_key}"
122
+ end
123
+
124
+ # minimum data params
125
+ data_params = {
126
+ :iss => api_key,
127
+ :ist => "project",
128
+ :iat => Time.now.to_i,
129
+ :nonce => Random.rand,
130
+ :role => role,
131
+ :scope => "session.connect",
132
+ :session_id => session_id,
133
+ }
134
+
135
+ # normalize and add additional data params
136
+ unless (expire_time = opts[:expire_time].to_i) == 0
137
+ unless expire_time.between?(Time.now.to_i, (Time.now + 30.days).to_i)
138
+ raise "Expire time must be within the next 30 days"
139
+ end
140
+ data_params[:exp] = expire_time.to_i
141
+ end
142
+
143
+ unless opts[:data].nil?
144
+ unless (data = opts[:data].to_s).length < 1000
145
+ raise "Connection data must be less than 1000 characters"
146
+ end
147
+ data_params[:connection_data] = data
148
+ end
149
+
150
+ if opts[:initial_layout_class_list]
151
+ if opts[:initial_layout_class_list].is_a?(Array)
152
+ data_params[:initial_layout_class_list] = opts[:initial_layout_class_list].join(' ')
153
+ else
154
+ data_params[:initial_layout_class_list] = opts[:initial_layout_class_list].to_s
155
+ end
156
+ end
157
+
158
+ JWT.encode(data_params, api_secret, 'HS256', header_fields={typ: 'JWT'})
159
+ end
104
160
 
105
161
  # this works when using extend TokenGenerator
106
162
  # def generates_tokens(method_opts)
@@ -1,4 +1,4 @@
1
1
  module OpenTok
2
2
  # @private
3
- VERSION = '4.9.0'
3
+ VERSION = '4.12.0'
4
4
  end
@@ -0,0 +1,52 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.opentok.com/v2/project/123456/archive
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"sessionId":"SESSIONID","maxBitrate":200000}'
9
+ headers:
10
+ User-Agent:
11
+ - OpenTok-Ruby-SDK/<%= version %>
12
+ X-Opentok-Auth:
13
+ - eyJpc3QiOiJwcm9qZWN0IiwiYWxnIjoiSFMyNTYifQ.eyJpc3MiOiIxMjM0NTYiLCJpYXQiOjE0OTI1MTA2NjAsImV4cCI6MTQ5MjUxMDk2MH0.BplMVhJWx4ld7KLKXqEmow6MjNPPFw9W8IHCMfeb120
14
+ Content-Type:
15
+ - application/json
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ Accept:
19
+ - "*/*"
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Server:
26
+ - nginx
27
+ Date:
28
+ - Fri, 07 Feb 2025 12:17:20 GMT
29
+ Content-Type:
30
+ - application/json
31
+ Transfer-Encoding:
32
+ - chunked
33
+ Connection:
34
+ - keep-alive
35
+ body:
36
+ encoding: UTF-8
37
+ string: |-
38
+ {
39
+ "createdAt" : 1395183243556,
40
+ "duration" : 0,
41
+ "id" : "30b3ebf1-ba36-4f5b-8def-6f70d9986fe9",
42
+ "name" : "",
43
+ "partnerId" : 123456,
44
+ "reason" : "",
45
+ "sessionId" : "SESSIONID",
46
+ "size" : 0,
47
+ "status" : "started",
48
+ "url" : null,
49
+ "maxBitrate": 200000
50
+ }
51
+ recorded_at: Fri, 07 Feb 2025 12:17:20 GMT
52
+ recorded_with: VCR 6.0.0
@@ -3,8 +3,9 @@ require "rspec/matchers"
3
3
  require "base64"
4
4
  require "openssl"
5
5
  require "addressable/uri"
6
+ require "jwt"
6
7
 
7
- RSpec::Matchers.define :carry_token_data do |input_data|
8
+ RSpec::Matchers.define :carry_t1_token_data do |input_data|
8
9
  option_to_token_key = {
9
10
  :api_key => :partner_id,
10
11
  :data => :connection_data,
@@ -37,7 +38,7 @@ RSpec::Matchers.define :carry_token_data do |input_data|
37
38
  end
38
39
  end
39
40
 
40
- RSpec::Matchers.define :carry_valid_token_signature do |api_secret|
41
+ RSpec::Matchers.define :carry_valid_t1_token_signature do |api_secret|
41
42
  match do |token|
42
43
  decoded_token = Base64.decode64(token[4..token.length])
43
44
  metadata, data_string = decoded_token.split(':')
@@ -48,3 +49,34 @@ RSpec::Matchers.define :carry_valid_token_signature do |api_secret|
48
49
  signature == OpenSSL::HMAC.hexdigest(digest, api_secret, data_string)
49
50
  end
50
51
  end
52
+
53
+ RSpec::Matchers.define :carry_jwt_token_data do |input_data|
54
+ match do |token|
55
+ decoded_token = JWT.decode(token, nil, false)
56
+ token_data = decoded_token.first.transform_keys {|k| k.to_sym}.transform_values {|v| v.to_s}
57
+ check_token_data = lambda { |key, value|
58
+ if token_data.has_key? key
59
+ unless value.nil?
60
+ return token_data[key] == value.to_s
61
+ end
62
+ return true
63
+ end
64
+ false
65
+ }
66
+ unless input_data.respond_to? :all?
67
+ return check_token_data.call(input_data, nil)
68
+ end
69
+ input_data.all? { |k, v| check_token_data.call(k, v) }
70
+ end
71
+ end
72
+
73
+ RSpec::Matchers.define :carry_valid_jwt_token_signature do |api_secret|
74
+ match do |token|
75
+ begin
76
+ JWT.decode(token, api_secret, true)
77
+ rescue
78
+ return false
79
+ end
80
+ true
81
+ end
82
+ end
@@ -70,6 +70,13 @@ describe OpenTok::Archives do
70
70
  expect(archive.stream_mode).to eq stream_mode
71
71
  end
72
72
 
73
+ it "should create an archive with maxBitrate set to specified max_bitrate value", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"} } do
74
+ max_bitrate = 200000
75
+ archive = archives.create session_id, :max_bitrate => max_bitrate
76
+ expect(archive).to be_an_instance_of OpenTok::Archive
77
+ expect(archive.max_bitrate).to eq max_bitrate
78
+ end
79
+
73
80
  it "should create audio only archives", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}" } } do
74
81
  archive = archives.create session_id, :has_video => false
75
82
  expect(archive).to be_an_instance_of OpenTok::Archive
@@ -72,5 +72,4 @@ describe OpenTok::Session do
72
72
  end
73
73
  include_examples "session generates tokens"
74
74
  end
75
-
76
75
  end
@@ -15,124 +15,284 @@ shared_examples "opentok generates tokens" do
15
15
  let(:api_secret) { "1234567890abcdef1234567890abcdef1234567890" }
16
16
  let(:session_id) { "1_MX4xMjM0NTZ-flNhdCBNYXIgMTUgMTQ6NDI6MjMgUERUIDIwMTR-MC40OTAxMzAyNX4" }
17
17
  let(:default_role) { :publisher }
18
+ let(:ist) { "project" }
19
+ let(:scope) { "session.connect" }
18
20
 
19
- it "generates plain tokens" do
20
- plain_token = opentok.generate_token session_id
21
- expect(plain_token).to be_an_instance_of String
22
- expect(plain_token).to carry_token_data :session_id => session_id
23
- expect(plain_token).to carry_token_data :api_key => api_key
24
- expect(plain_token).to carry_token_data :role => default_role
25
- expect(plain_token).to carry_token_data [:nonce, :create_time]
26
- expect(plain_token).to carry_valid_token_signature api_secret
27
- end
21
+ context "when token type is T1" do
22
+ it "generates plain tokens" do
23
+ plain_token = opentok.generate_token session_id, :token_type => "T1"
24
+ expect(plain_token).to be_an_instance_of String
25
+ expect(plain_token).to carry_t1_token_data :session_id => session_id
26
+ expect(plain_token).to carry_t1_token_data :api_key => api_key
27
+ expect(plain_token).to carry_t1_token_data :role => default_role
28
+ expect(plain_token).to carry_t1_token_data [:nonce, :create_time]
29
+ expect(plain_token).to carry_valid_t1_token_signature api_secret
30
+ end
28
31
 
29
- it "generates tokens with an expire time" do
30
- expire_time = Time.now + (60*60*24)
31
- expiring_token = opentok.generate_token session_id, :expire_time => expire_time
32
- expect(expiring_token).to be_an_instance_of String
33
- expect(expiring_token).to carry_token_data :session_id => session_id
34
- expect(expiring_token).to carry_token_data :api_key => api_key
35
- expect(expiring_token).to carry_token_data :role => default_role
36
- expect(expiring_token).to carry_token_data :expire_time => expire_time.to_i
37
- expect(expiring_token).to carry_token_data [:nonce, :create_time]
38
- expect(expiring_token).to carry_valid_token_signature api_secret
39
- end
32
+ it "generates tokens with an expire time" do
33
+ expire_time = Time.now + (60*60*24)
34
+ expiring_token = opentok.generate_token session_id, :expire_time => expire_time, :token_type => "T1"
35
+ expect(expiring_token).to be_an_instance_of String
36
+ expect(expiring_token).to carry_t1_token_data :session_id => session_id
37
+ expect(expiring_token).to carry_t1_token_data :api_key => api_key
38
+ expect(expiring_token).to carry_t1_token_data :role => default_role
39
+ expect(expiring_token).to carry_t1_token_data :expire_time => expire_time.to_i
40
+ expect(expiring_token).to carry_t1_token_data [:nonce, :create_time]
41
+ expect(expiring_token).to carry_valid_t1_token_signature api_secret
42
+ end
40
43
 
41
- it "generates tokens with an integer expire time" do
42
- expire_time = Time.now.to_i + (60*60*24)
43
- expiring_token = opentok.generate_token session_id, :expire_time => expire_time
44
- expect(expiring_token).to be_an_instance_of String
45
- expect(expiring_token).to carry_token_data :session_id => session_id
46
- expect(expiring_token).to carry_token_data :api_key => api_key
47
- expect(expiring_token).to carry_token_data :role => default_role
48
- expect(expiring_token).to carry_token_data :expire_time => expire_time
49
- expect(expiring_token).to carry_token_data [:nonce, :create_time]
50
- expect(expiring_token).to carry_valid_token_signature api_secret
51
- end
44
+ it "generates tokens with an integer expire time" do
45
+ expire_time = Time.now.to_i + (60*60*24)
46
+ expiring_token = opentok.generate_token session_id, :expire_time => expire_time, :token_type => "T1"
47
+ expect(expiring_token).to be_an_instance_of String
48
+ expect(expiring_token).to carry_t1_token_data :session_id => session_id
49
+ expect(expiring_token).to carry_t1_token_data :api_key => api_key
50
+ expect(expiring_token).to carry_t1_token_data :role => default_role
51
+ expect(expiring_token).to carry_t1_token_data :expire_time => expire_time
52
+ expect(expiring_token).to carry_t1_token_data [:nonce, :create_time]
53
+ expect(expiring_token).to carry_valid_t1_token_signature api_secret
54
+ end
52
55
 
53
- it "generates tokens with a publisher role" do
54
- role = :publisher
55
- role_token = opentok.generate_token session_id, :role => role
56
- expect(role_token).to be_an_instance_of String
57
- expect(role_token).to carry_token_data :session_id => session_id
58
- expect(role_token).to carry_token_data :api_key => api_key
59
- expect(role_token).to carry_token_data :role => role
60
- expect(role_token).to carry_token_data [:nonce, :create_time]
61
- expect(role_token).to carry_valid_token_signature api_secret
62
- end
56
+ it "generates tokens with a publisher role" do
57
+ role = :publisher
58
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "T1"
59
+ expect(role_token).to be_an_instance_of String
60
+ expect(role_token).to carry_t1_token_data :session_id => session_id
61
+ expect(role_token).to carry_t1_token_data :api_key => api_key
62
+ expect(role_token).to carry_t1_token_data :role => role
63
+ expect(role_token).to carry_t1_token_data [:nonce, :create_time]
64
+ expect(role_token).to carry_valid_t1_token_signature api_secret
65
+ end
63
66
 
64
- it "generates tokens with a subscriber role" do
65
- role = :subscriber
66
- role_token = opentok.generate_token session_id, :role => role
67
- expect(role_token).to be_an_instance_of String
68
- expect(role_token).to carry_token_data :session_id => session_id
69
- expect(role_token).to carry_token_data :api_key => api_key
70
- expect(role_token).to carry_token_data :role => role
71
- expect(role_token).to carry_token_data [:nonce, :create_time]
72
- expect(role_token).to carry_valid_token_signature api_secret
73
- end
67
+ it "generates tokens with a subscriber role" do
68
+ role = :subscriber
69
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "T1"
70
+ expect(role_token).to be_an_instance_of String
71
+ expect(role_token).to carry_t1_token_data :session_id => session_id
72
+ expect(role_token).to carry_t1_token_data :api_key => api_key
73
+ expect(role_token).to carry_t1_token_data :role => role
74
+ expect(role_token).to carry_t1_token_data [:nonce, :create_time]
75
+ expect(role_token).to carry_valid_t1_token_signature api_secret
76
+ end
74
77
 
75
- it "generates tokens with a moderator role" do
76
- role = :moderator
77
- role_token = opentok.generate_token session_id, :role => role
78
- expect(role_token).to be_an_instance_of String
79
- expect(role_token).to carry_token_data :session_id => session_id
80
- expect(role_token).to carry_token_data :api_key => api_key
81
- expect(role_token).to carry_token_data :role => role
82
- expect(role_token).to carry_token_data [:nonce, :create_time]
83
- expect(role_token).to carry_valid_token_signature api_secret
84
- end
78
+ it "generates tokens with a moderator role" do
79
+ role = :moderator
80
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "T1"
81
+ expect(role_token).to be_an_instance_of String
82
+ expect(role_token).to carry_t1_token_data :session_id => session_id
83
+ expect(role_token).to carry_t1_token_data :api_key => api_key
84
+ expect(role_token).to carry_t1_token_data :role => role
85
+ expect(role_token).to carry_t1_token_data [:nonce, :create_time]
86
+ expect(role_token).to carry_valid_t1_token_signature api_secret
87
+ end
85
88
 
86
- it "generates tokens with a publisheronly role" do
87
- role = :publisheronly
88
- role_token = opentok.generate_token session_id, :role => role
89
- expect(role_token).to be_an_instance_of String
90
- expect(role_token).to carry_token_data :session_id => session_id
91
- expect(role_token).to carry_token_data :api_key => api_key
92
- expect(role_token).to carry_token_data :role => role
93
- expect(role_token).to carry_token_data [:nonce, :create_time]
94
- expect(role_token).to carry_valid_token_signature api_secret
95
- end
89
+ it "generates tokens with a publisheronly role" do
90
+ role = :publisheronly
91
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "T1"
92
+ expect(role_token).to be_an_instance_of String
93
+ expect(role_token).to carry_t1_token_data :session_id => session_id
94
+ expect(role_token).to carry_t1_token_data :api_key => api_key
95
+ expect(role_token).to carry_t1_token_data :role => role
96
+ expect(role_token).to carry_t1_token_data [:nonce, :create_time]
97
+ expect(role_token).to carry_valid_t1_token_signature api_secret
98
+ end
96
99
 
97
- it "generates tokens with data" do
98
- data = "name=Johnny"
99
- data_bearing_token = opentok.generate_token session_id, :data => data
100
- expect(data_bearing_token).to be_an_instance_of String
101
- expect(data_bearing_token).to carry_token_data :session_id => session_id
102
- expect(data_bearing_token).to carry_token_data :api_key => api_key
103
- expect(data_bearing_token).to carry_token_data :role => default_role
104
- expect(data_bearing_token).to carry_token_data :data => data
105
- expect(data_bearing_token).to carry_token_data [:nonce, :create_time]
106
- expect(data_bearing_token).to carry_valid_token_signature api_secret
100
+ it "generates tokens with data" do
101
+ data = "name=Johnny"
102
+ data_bearing_token = opentok.generate_token session_id, :data => data, :token_type => "T1"
103
+ expect(data_bearing_token).to be_an_instance_of String
104
+ expect(data_bearing_token).to carry_t1_token_data :session_id => session_id
105
+ expect(data_bearing_token).to carry_t1_token_data :api_key => api_key
106
+ expect(data_bearing_token).to carry_t1_token_data :role => default_role
107
+ expect(data_bearing_token).to carry_t1_token_data :data => data
108
+ expect(data_bearing_token).to carry_t1_token_data [:nonce, :create_time]
109
+ expect(data_bearing_token).to carry_valid_t1_token_signature api_secret
110
+ end
111
+
112
+ it "generates tokens with initial layout classes" do
113
+ layout_classes = ["focus", "small"]
114
+ layout_class_bearing_token = opentok.generate_token session_id, :initial_layout_class_list => layout_classes, :token_type => "T1"
115
+ expect(layout_class_bearing_token).to be_an_instance_of String
116
+ expect(layout_class_bearing_token).to carry_t1_token_data :session_id => session_id
117
+ expect(layout_class_bearing_token).to carry_t1_token_data :api_key => api_key
118
+ expect(layout_class_bearing_token).to carry_t1_token_data :role => default_role
119
+ expect(layout_class_bearing_token).to carry_t1_token_data :initial_layout_class_list => layout_classes.join(' ')
120
+ expect(layout_class_bearing_token).to carry_t1_token_data [:nonce, :create_time]
121
+ expect(layout_class_bearing_token).to carry_valid_t1_token_signature api_secret
122
+ end
123
+
124
+ it "generates tokens with one initial layout class" do
125
+ layout_class = "focus"
126
+ layout_class_bearing_token = opentok.generate_token session_id, :initial_layout_class_list => layout_class, :token_type => "T1"
127
+ expect(layout_class_bearing_token).to be_an_instance_of String
128
+ expect(layout_class_bearing_token).to carry_t1_token_data :session_id => session_id
129
+ expect(layout_class_bearing_token).to carry_t1_token_data :api_key => api_key
130
+ expect(layout_class_bearing_token).to carry_t1_token_data :role => default_role
131
+ expect(layout_class_bearing_token).to carry_t1_token_data :initial_layout_class_list => layout_class
132
+ expect(layout_class_bearing_token).to carry_t1_token_data [:nonce, :create_time]
133
+ expect(layout_class_bearing_token).to carry_valid_t1_token_signature api_secret
134
+ end
135
+
136
+ context "when the role is invalid" do
137
+ it "raises an error" do
138
+ expect { opentok.generate_token session_id, :role => :invalid_role, :token_type => "T1" }.to raise_error
139
+ end
140
+ end
107
141
  end
108
142
 
109
- it "generates tokens with initial layout classes" do
110
- layout_classes = ["focus", "small"]
111
- layout_class_bearing_token = opentok.generate_token session_id, :initial_layout_class_list => layout_classes
112
- expect(layout_class_bearing_token).to be_an_instance_of String
113
- expect(layout_class_bearing_token).to carry_token_data :session_id => session_id
114
- expect(layout_class_bearing_token).to carry_token_data :api_key => api_key
115
- expect(layout_class_bearing_token).to carry_token_data :role => default_role
116
- expect(layout_class_bearing_token).to carry_token_data :initial_layout_class_list => layout_classes.join(' ')
117
- expect(layout_class_bearing_token).to carry_token_data [:nonce, :create_time]
118
- expect(layout_class_bearing_token).to carry_valid_token_signature api_secret
143
+ context "when token type is JWT" do
144
+ it "generates plain tokens" do
145
+ plain_token = opentok.generate_token session_id, :token_type => "JWT"
146
+ expect(plain_token).to be_an_instance_of String
147
+ expect(plain_token).to carry_jwt_token_data :session_id => session_id
148
+ expect(plain_token).to carry_jwt_token_data :iss => api_key
149
+ expect(plain_token).to carry_jwt_token_data :ist => ist
150
+ expect(plain_token).to carry_jwt_token_data :scope => scope
151
+ expect(plain_token).to carry_jwt_token_data :role => default_role
152
+ expect(plain_token).to carry_jwt_token_data [:ist, :iat, :nonce]
153
+ expect(plain_token).to carry_valid_jwt_token_signature api_secret
154
+ end
155
+
156
+ it "generates tokens with a custom expire time" do
157
+ expire_time = Time.now + (60*60*24)
158
+ expiring_token = opentok.generate_token session_id, :expire_time => expire_time, :token_type => "JWT"
159
+ expect(expiring_token).to be_an_instance_of String
160
+ expect(expiring_token).to carry_jwt_token_data :session_id => session_id
161
+ expect(expiring_token).to carry_jwt_token_data :iss => api_key
162
+ expect(expiring_token).to carry_jwt_token_data :ist => ist
163
+ expect(expiring_token).to carry_jwt_token_data :scope => scope
164
+ expect(expiring_token).to carry_jwt_token_data :role => default_role
165
+ expect(expiring_token).to carry_jwt_token_data :exp => expire_time.to_i
166
+ expect(expiring_token).to carry_jwt_token_data [:ist, :iat, :nonce]
167
+ expect(expiring_token).to carry_valid_jwt_token_signature api_secret
168
+ end
169
+
170
+ it "generates tokens with an integer expire time" do
171
+ expire_time = Time.now.to_i + (60*60*24)
172
+ expiring_token = opentok.generate_token session_id, :expire_time => expire_time, :token_type => "JWT"
173
+ expect(expiring_token).to be_an_instance_of String
174
+ expect(expiring_token).to carry_jwt_token_data :session_id => session_id
175
+ expect(expiring_token).to carry_jwt_token_data :iss => api_key
176
+ expect(expiring_token).to carry_jwt_token_data :ist => ist
177
+ expect(expiring_token).to carry_jwt_token_data :scope => scope
178
+ expect(expiring_token).to carry_jwt_token_data :role => default_role
179
+ expect(expiring_token).to carry_jwt_token_data :exp => expire_time
180
+ expect(expiring_token).to carry_jwt_token_data [:ist, :iat, :nonce]
181
+ expect(expiring_token).to carry_valid_jwt_token_signature api_secret
182
+ end
183
+
184
+ it "generates tokens with a publisher role" do
185
+ role = :publisher
186
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "JWT"
187
+ expect(role_token).to be_an_instance_of String
188
+ expect(role_token).to carry_jwt_token_data :session_id => session_id
189
+ expect(role_token).to carry_jwt_token_data :iss => api_key
190
+ expect(role_token).to carry_jwt_token_data :ist => ist
191
+ expect(role_token).to carry_jwt_token_data :scope => scope
192
+ expect(role_token).to carry_jwt_token_data :role => role
193
+ expect(role_token).to carry_jwt_token_data [:ist, :iat, :nonce]
194
+ expect(role_token).to carry_valid_jwt_token_signature api_secret
195
+ end
196
+
197
+ it "generates tokens with a subscriber role" do
198
+ role = :subscriber
199
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "JWT"
200
+ expect(role_token).to be_an_instance_of String
201
+ expect(role_token).to carry_jwt_token_data :session_id => session_id
202
+ expect(role_token).to carry_jwt_token_data :iss => api_key
203
+ expect(role_token).to carry_jwt_token_data :ist => ist
204
+ expect(role_token).to carry_jwt_token_data :scope => scope
205
+ expect(role_token).to carry_jwt_token_data :role => role
206
+ expect(role_token).to carry_jwt_token_data [:ist, :iat, :nonce]
207
+ expect(role_token).to carry_valid_jwt_token_signature api_secret
208
+ end
209
+
210
+ it "generates tokens with a moderator role" do
211
+ role = :moderator
212
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "JWT"
213
+ expect(role_token).to be_an_instance_of String
214
+ expect(role_token).to carry_jwt_token_data :session_id => session_id
215
+ expect(role_token).to carry_jwt_token_data :iss => api_key
216
+ expect(role_token).to carry_jwt_token_data :ist => ist
217
+ expect(role_token).to carry_jwt_token_data :scope => scope
218
+ expect(role_token).to carry_jwt_token_data :role => role
219
+ expect(role_token).to carry_jwt_token_data [:ist, :iat, :nonce]
220
+ expect(role_token).to carry_valid_jwt_token_signature api_secret
221
+ end
222
+
223
+ it "generates tokens with a publisheronly role" do
224
+ role = :publisheronly
225
+ role_token = opentok.generate_token session_id, :role => role, :token_type => "JWT"
226
+ expect(role_token).to be_an_instance_of String
227
+ expect(role_token).to carry_jwt_token_data :session_id => session_id
228
+ expect(role_token).to carry_jwt_token_data :iss => api_key
229
+ expect(role_token).to carry_jwt_token_data :ist => ist
230
+ expect(role_token).to carry_jwt_token_data :scope => scope
231
+ expect(role_token).to carry_jwt_token_data :role => role
232
+ expect(role_token).to carry_jwt_token_data [:ist, :iat, :nonce]
233
+ expect(role_token).to carry_valid_jwt_token_signature api_secret
234
+ end
235
+
236
+ it "generates tokens with data" do
237
+ data = "name=Johnny"
238
+ data_bearing_token = opentok.generate_token session_id, :data => data, :token_type => "JWT"
239
+ expect(data_bearing_token).to be_an_instance_of String
240
+ expect(data_bearing_token).to carry_jwt_token_data :session_id => session_id
241
+ expect(data_bearing_token).to carry_jwt_token_data :iss => api_key
242
+ expect(data_bearing_token).to carry_jwt_token_data :ist => ist
243
+ expect(data_bearing_token).to carry_jwt_token_data :scope => scope
244
+ expect(data_bearing_token).to carry_jwt_token_data :role => default_role
245
+ expect(data_bearing_token).to carry_jwt_token_data :connection_data => data
246
+ expect(data_bearing_token).to carry_jwt_token_data [:ist, :iat, :nonce]
247
+ expect(data_bearing_token).to carry_valid_jwt_token_signature api_secret
248
+ end
249
+
250
+ it "generates tokens with initial layout classes" do
251
+ layout_classes = ["focus", "small"]
252
+ layout_class_bearing_token = opentok.generate_token session_id, :initial_layout_class_list => layout_classes, :token_type => "JWT"
253
+ expect(layout_class_bearing_token).to be_an_instance_of String
254
+ expect(layout_class_bearing_token).to carry_jwt_token_data :session_id => session_id
255
+ expect(layout_class_bearing_token).to carry_jwt_token_data :iss => api_key
256
+ expect(layout_class_bearing_token).to carry_jwt_token_data :ist => ist
257
+ expect(layout_class_bearing_token).to carry_jwt_token_data :scope => scope
258
+ expect(layout_class_bearing_token).to carry_jwt_token_data :role => default_role
259
+ expect(layout_class_bearing_token).to carry_jwt_token_data :initial_layout_class_list => layout_classes.join(' ')
260
+ expect(layout_class_bearing_token).to carry_jwt_token_data [:ist, :iat, :nonce]
261
+ expect(layout_class_bearing_token).to carry_valid_jwt_token_signature api_secret
262
+ end
263
+
264
+ it "generates tokens with one initial layout class" do
265
+ layout_class = "focus"
266
+ layout_class_bearing_token = opentok.generate_token session_id, :initial_layout_class_list => layout_class, :token_type => "JWT"
267
+ expect(layout_class_bearing_token).to be_an_instance_of String
268
+ expect(layout_class_bearing_token).to carry_jwt_token_data :session_id => session_id
269
+ expect(layout_class_bearing_token).to carry_jwt_token_data :iss => api_key
270
+ expect(layout_class_bearing_token).to carry_jwt_token_data :ist => ist
271
+ expect(layout_class_bearing_token).to carry_jwt_token_data :scope => scope
272
+ expect(layout_class_bearing_token).to carry_jwt_token_data :role => default_role
273
+ expect(layout_class_bearing_token).to carry_jwt_token_data :initial_layout_class_list => layout_class
274
+ expect(layout_class_bearing_token).to carry_jwt_token_data [:ist, :iat, :nonce]
275
+ expect(layout_class_bearing_token).to carry_valid_jwt_token_signature api_secret
276
+ end
277
+
278
+ context "when the role is invalid" do
279
+ it "raises an error" do
280
+ expect { opentok.generate_token session_id, :role => :invalid_role, :token_type => "JWT" }.to raise_error
281
+ end
282
+ end
119
283
  end
120
284
 
121
- it "generates tokens with one initial layout class" do
122
- layout_class = "focus"
123
- layout_class_bearing_token = opentok.generate_token session_id, :initial_layout_class_list => layout_class
124
- expect(layout_class_bearing_token).to be_an_instance_of String
125
- expect(layout_class_bearing_token).to carry_token_data :session_id => session_id
126
- expect(layout_class_bearing_token).to carry_token_data :api_key => api_key
127
- expect(layout_class_bearing_token).to carry_token_data :role => default_role
128
- expect(layout_class_bearing_token).to carry_token_data :initial_layout_class_list => layout_class
129
- expect(layout_class_bearing_token).to carry_token_data [:nonce, :create_time]
130
- expect(layout_class_bearing_token).to carry_valid_token_signature api_secret
285
+ context "when token type is not specified" do
286
+ it "generates a JWT token by default" do
287
+ default_token = opentok.generate_token session_id
288
+ expect(default_token).to be_an_instance_of String
289
+ expect(default_token).to carry_valid_jwt_token_signature api_secret
290
+ end
131
291
  end
132
292
 
133
- context "when the role is invalid" do
293
+ context "when token type is invalid" do
134
294
  it "raises an error" do
135
- expect { opentok.generate_token session_id, :role => :invalid_role }.to raise_error
295
+ expect { opentok.generate_token session_id, :token_type => "invalid_token_type" }.to raise_error
136
296
  end
137
297
  end
138
298
 
@@ -15,52 +15,124 @@ shared_examples "session generates tokens" do
15
15
  let(:api_secret) { "1234567890abcdef1234567890abcdef1234567890" }
16
16
  let(:session_id) { "1_MX4xMjM0NTZ-flNhdCBNYXIgMTUgMTQ6NDI6MjMgUERUIDIwMTR-MC40OTAxMzAyNX4" }
17
17
  let(:default_role) { :publisher }
18
+ let(:ist) { "project" }
19
+ let(:scope) { "session.connect" }
18
20
 
19
- it "generates plain tokens" do
20
- plain_token = session.generate_token
21
- expect(plain_token).to be_an_instance_of String
22
- expect(plain_token).to carry_token_data :session_id => session_id
23
- expect(plain_token).to carry_token_data :api_key => api_key
24
- expect(plain_token).to carry_token_data :role => default_role
25
- expect(plain_token).to carry_token_data [:nonce, :create_time]
26
- expect(plain_token).to carry_valid_token_signature api_secret
27
- end
21
+ context "when token type is T1" do
22
+ it "generates plain tokens" do
23
+ plain_token = session.generate_token :token_type => "T1"
24
+ expect(plain_token).to be_an_instance_of String
25
+ expect(plain_token).to carry_t1_token_data :session_id => session_id
26
+ expect(plain_token).to carry_t1_token_data :api_key => api_key
27
+ expect(plain_token).to carry_t1_token_data :role => default_role
28
+ expect(plain_token).to carry_t1_token_data [:nonce, :create_time]
29
+ expect(plain_token).to carry_valid_t1_token_signature api_secret
30
+ end
31
+
32
+ it "generates tokens with an expire time" do
33
+ expire_time = Time.now + (60*60*24)
34
+ expiring_token = session.generate_token :expire_time => expire_time, :token_type => "T1"
35
+ expect(expiring_token).to be_an_instance_of String
36
+ expect(expiring_token).to carry_t1_token_data :session_id => session_id
37
+ expect(expiring_token).to carry_t1_token_data :api_key => api_key
38
+ expect(expiring_token).to carry_t1_token_data :role => default_role
39
+ expect(expiring_token).to carry_t1_token_data :expire_time => expire_time.to_i
40
+ expect(expiring_token).to carry_t1_token_data [:nonce, :create_time]
41
+ expect(expiring_token).to carry_valid_t1_token_signature api_secret
42
+ end
28
43
 
29
- it "generates tokens with an expire time" do
30
- expire_time = Time.now + (60*60*24)
31
- expiring_token = session.generate_token :expire_time => expire_time
32
- expect(expiring_token).to be_an_instance_of String
33
- expect(expiring_token).to carry_token_data :session_id => session_id
34
- expect(expiring_token).to carry_token_data :api_key => api_key
35
- expect(expiring_token).to carry_token_data :role => default_role
36
- expect(expiring_token).to carry_token_data :expire_time => expire_time.to_i
37
- expect(expiring_token).to carry_token_data [:nonce, :create_time]
38
- expect(expiring_token).to carry_valid_token_signature api_secret
44
+ it "generates tokens with a role" do
45
+ role = :moderator
46
+ role_token = session.generate_token :role => role, :token_type => "T1"
47
+ expect(role_token).to be_an_instance_of String
48
+ expect(role_token).to carry_t1_token_data :session_id => session_id
49
+ expect(role_token).to carry_t1_token_data :api_key => api_key
50
+ expect(role_token).to carry_t1_token_data :role => role
51
+ expect(role_token).to carry_t1_token_data [:nonce, :create_time]
52
+ expect(role_token).to carry_valid_t1_token_signature api_secret
53
+ end
54
+
55
+ it "generates tokens with data" do
56
+ data = "name=Johnny"
57
+ data_bearing_token = session.generate_token :data => data, :token_type => "T1"
58
+ expect(data_bearing_token).to be_an_instance_of String
59
+ expect(data_bearing_token).to carry_t1_token_data :session_id => session_id
60
+ expect(data_bearing_token).to carry_t1_token_data :api_key => api_key
61
+ expect(data_bearing_token).to carry_t1_token_data :role => default_role
62
+ expect(data_bearing_token).to carry_t1_token_data :data => data
63
+ expect(data_bearing_token).to carry_t1_token_data [:nonce, :create_time]
64
+ expect(data_bearing_token).to carry_valid_t1_token_signature api_secret
65
+ end
39
66
  end
40
67
 
41
- it "generates tokens with a role" do
42
- role = :moderator
43
- role_token = session.generate_token :role => role
44
- expect(role_token).to be_an_instance_of String
45
- expect(role_token).to carry_token_data :session_id => session_id
46
- expect(role_token).to carry_token_data :api_key => api_key
47
- expect(role_token).to carry_token_data :role => role
48
- expect(role_token).to carry_token_data [:nonce, :create_time]
49
- expect(role_token).to carry_valid_token_signature api_secret
68
+ context "when token type is JWT" do
69
+ it "generates plain tokens" do
70
+ plain_token = session.generate_token :token_type => "JWT"
71
+ expect(plain_token).to be_an_instance_of String
72
+ expect(plain_token).to carry_jwt_token_data :session_id => session_id
73
+ expect(plain_token).to carry_jwt_token_data :iss => api_key
74
+ expect(plain_token).to carry_jwt_token_data :ist => ist
75
+ expect(plain_token).to carry_jwt_token_data :scope => scope
76
+ expect(plain_token).to carry_jwt_token_data :role => default_role
77
+ expect(plain_token).to carry_jwt_token_data [:ist, :iat, :nonce]
78
+ expect(plain_token).to carry_valid_jwt_token_signature api_secret
79
+ end
80
+
81
+ it "generates tokens with a custom expire time" do
82
+ expire_time = Time.now + (60*60*24)
83
+ expiring_token = session.generate_token :expire_time => expire_time, :token_type => "JWT"
84
+ expect(expiring_token).to be_an_instance_of String
85
+ expect(expiring_token).to carry_jwt_token_data :session_id => session_id
86
+ expect(expiring_token).to carry_jwt_token_data :iss => api_key
87
+ expect(expiring_token).to carry_jwt_token_data :ist => ist
88
+ expect(expiring_token).to carry_jwt_token_data :scope => scope
89
+ expect(expiring_token).to carry_jwt_token_data :role => default_role
90
+ expect(expiring_token).to carry_jwt_token_data :exp => expire_time.to_i
91
+ expect(expiring_token).to carry_jwt_token_data [:ist, :iat, :nonce]
92
+ expect(expiring_token).to carry_valid_jwt_token_signature api_secret
93
+ end
94
+
95
+ it "generates tokens with a non-default role" do
96
+ role = :moderator
97
+ role_token = session.generate_token :role => role, :token_type => "JWT"
98
+ expect(role_token).to be_an_instance_of String
99
+ expect(role_token).to carry_jwt_token_data :session_id => session_id
100
+ expect(role_token).to carry_jwt_token_data :iss => api_key
101
+ expect(role_token).to carry_jwt_token_data :ist => ist
102
+ expect(role_token).to carry_jwt_token_data :scope => scope
103
+ expect(role_token).to carry_jwt_token_data :role => role
104
+ expect(role_token).to carry_jwt_token_data [:ist, :iat, :nonce]
105
+ expect(role_token).to carry_valid_jwt_token_signature api_secret
106
+ end
107
+
108
+ it "generates tokens with data" do
109
+ data = "name=Johnny"
110
+ data_bearing_token = session.generate_token :data => data, :token_type => "JWT"
111
+ expect(data_bearing_token).to be_an_instance_of String
112
+ expect(data_bearing_token).to carry_jwt_token_data :session_id => session_id
113
+ expect(data_bearing_token).to carry_jwt_token_data :iss => api_key
114
+ expect(data_bearing_token).to carry_jwt_token_data :ist => ist
115
+ expect(data_bearing_token).to carry_jwt_token_data :scope => scope
116
+ expect(data_bearing_token).to carry_jwt_token_data :role => default_role
117
+ expect(data_bearing_token).to carry_jwt_token_data :connection_data => data
118
+ expect(data_bearing_token).to carry_jwt_token_data [:ist, :iat, :nonce]
119
+ expect(data_bearing_token).to carry_valid_jwt_token_signature api_secret
120
+ end
50
121
  end
51
122
 
52
- it "generates tokens with data" do
53
- data = "name=Johnny"
54
- data_bearing_token = session.generate_token :data => data
55
- expect(data_bearing_token).to be_an_instance_of String
56
- expect(data_bearing_token).to carry_token_data :session_id => session_id
57
- expect(data_bearing_token).to carry_token_data :api_key => api_key
58
- expect(data_bearing_token).to carry_token_data :role => default_role
59
- expect(data_bearing_token).to carry_token_data :data => data
60
- expect(data_bearing_token).to carry_token_data [:nonce, :create_time]
61
- expect(data_bearing_token).to carry_valid_token_signature api_secret
123
+ context "when token type is not specified" do
124
+ it "generates a JWT token by default" do
125
+ default_token = session.generate_token
126
+ expect(default_token).to be_an_instance_of String
127
+ expect(default_token).to carry_valid_jwt_token_signature api_secret
128
+ end
62
129
  end
63
130
 
131
+ context "when token type is invalid" do
132
+ it "raises an error" do
133
+ expect { session.generate_token :token_type => "invalid_token_type" }.to raise_error
134
+ end
135
+ end
64
136
 
65
137
  # TODO a context about using a bad session_id
66
138
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentok
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.9.0
4
+ version: 4.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stijn Mathysen
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2024-04-22 00:00:00.000000000 Z
15
+ date: 2025-02-10 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: bundler
@@ -245,6 +245,7 @@ files:
245
245
  - spec/cassettes/OpenTok_Archives/http_client_errors/.yml
246
246
  - spec/cassettes/OpenTok_Archives/removes_a_stream_from_an_archive.yml
247
247
  - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_matching_multi_archive_tag_when_multiArchiveTag_is_specified.yml
248
+ - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_maxBitrate_set_to_specified_max_bitrate_value.yml
248
249
  - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_multi_archive_tag_value_of_nil_when_multiArchiveTag_not_specified.yml
249
250
  - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_streamMode_set_to_specified_stream_mode_value.yml
250
251
  - spec/cassettes/OpenTok_Archives/should_create_an_archives_with_a_specified_multiArchiveTag.yml
@@ -366,6 +367,7 @@ test_files:
366
367
  - spec/cassettes/OpenTok_Archives/http_client_errors/.yml
367
368
  - spec/cassettes/OpenTok_Archives/removes_a_stream_from_an_archive.yml
368
369
  - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_matching_multi_archive_tag_when_multiArchiveTag_is_specified.yml
370
+ - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_maxBitrate_set_to_specified_max_bitrate_value.yml
369
371
  - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_multi_archive_tag_value_of_nil_when_multiArchiveTag_not_specified.yml
370
372
  - spec/cassettes/OpenTok_Archives/should_create_an_archive_with_streamMode_set_to_specified_stream_mode_value.yml
371
373
  - spec/cassettes/OpenTok_Archives/should_create_an_archives_with_a_specified_multiArchiveTag.yml