opentok 2.4.0.beta.1 → 2.4.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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +2 -1
  4. data/README.md +8 -11
  5. data/lib/opentok.rb +1 -1
  6. data/lib/opentok/archive.rb +2 -3
  7. data/lib/opentok/archives.rb +4 -2
  8. data/lib/opentok/client.rb +37 -12
  9. data/lib/opentok/constants.rb +1 -0
  10. data/lib/opentok/opentok.rb +1 -1
  11. data/lib/opentok/session.rb +1 -1
  12. data/lib/opentok/token_generator.rb +0 -9
  13. data/lib/opentok/version.rb +1 -1
  14. data/opentok.gemspec +3 -2
  15. data/sample/Archiving/public/js/host.js +18 -7
  16. data/sample/Archiving/public/js/participant.js +18 -7
  17. data/sample/Archiving/views/host.erb +1 -1
  18. data/sample/Archiving/views/participant.erb +1 -1
  19. data/sample/HelloWorld/public/js/helloworld.js +26 -6
  20. data/sample/HelloWorld/views/index.erb +1 -1
  21. data/spec/cassettes/OpenTok_Archives/should_create_archives.yml +3 -3
  22. data/spec/cassettes/OpenTok_Archives/should_create_audio_only_archives.yml +3 -3
  23. data/spec/cassettes/OpenTok_Archives/should_create_individual_archives.yml +3 -3
  24. data/spec/cassettes/OpenTok_Archives/should_create_named_archives.yml +3 -3
  25. data/spec/cassettes/OpenTok_Archives/should_delete_an_archive_by_id.yml +3 -3
  26. data/spec/cassettes/OpenTok_Archives/should_find_archives_by_id.yml +3 -3
  27. data/spec/cassettes/OpenTok_Archives/should_find_archives_with_unknown_properties.yml +3 -3
  28. data/spec/cassettes/OpenTok_Archives/should_find_expired_archives.yml +3 -3
  29. data/spec/cassettes/OpenTok_Archives/should_find_paused_archives_by_id.yml +3 -3
  30. data/spec/cassettes/OpenTok_Archives/should_stop_archives.yml +3 -3
  31. data/spec/cassettes/OpenTok_Archives/when_many_archives_are_created/should_return_all_archives.yml +3 -3
  32. data/spec/cassettes/OpenTok_Archives/when_many_archives_are_created/should_return_archives_with_an_offset.yml +4 -4
  33. data/spec/cassettes/OpenTok_Archives/when_many_archives_are_created/should_return_count_number_of_archives.yml +4 -4
  34. data/spec/cassettes/OpenTok_Archives/when_many_archives_are_created/should_return_part_of_the_archives_when_using_offset_and_count.yml +4 -4
  35. data/spec/cassettes/OpenTok_Archives/when_many_archives_are_created/should_return_session_archives.yml +71 -0
  36. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions.yml +2 -2
  37. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_default_sessions.yml +2 -2
  38. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions.yml +2 -2
  39. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions_for_invalid_media_modes.yml +2 -2
  40. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions_with_a_location_hint.yml +2 -2
  41. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_routed_media_sessions.yml +2 -2
  42. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_routed_media_sessions_with_a_location_hint.yml +2 -2
  43. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_sessions_with_a_location_hint.yml +2 -2
  44. data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/with_an_addendum_to_the_user_agent_string/should_append_the_addendum_to_the_user_agent_header.yml +2 -2
  45. data/spec/matchers/token.rb +1 -2
  46. data/spec/opentok/archives_spec.rb +16 -0
  47. data/spec/opentok/opentok_spec.rb +5 -0
  48. data/spec/opentok/session_spec.rb +5 -0
  49. data/spec/shared/opentok_generates_tokens.rb +5 -25
  50. data/spec/shared/session_generates_tokens.rb +5 -0
  51. metadata +49 -84
  52. data/doc/OpenTok.html +0 -418
  53. data/doc/OpenTok/Archive.html +0 -1607
  54. data/doc/OpenTok/ArchiveList.html +0 -216
  55. data/doc/OpenTok/Archives.html +0 -1101
  56. data/doc/OpenTok/Client.html +0 -695
  57. data/doc/OpenTok/HashExtensions.html +0 -184
  58. data/doc/OpenTok/OpenTok.html +0 -1083
  59. data/doc/OpenTok/OpenTokArchiveError.html +0 -142
  60. data/doc/OpenTok/OpenTokAuthenticationError.html +0 -143
  61. data/doc/OpenTok/OpenTokError.html +0 -138
  62. data/doc/OpenTok/Session.html +0 -757
  63. data/doc/OpenTok/TokenGenerator.html +0 -204
  64. data/doc/OpenTok/TokenGenerator/ClassMethods.html +0 -187
  65. data/doc/README.md +0 -15
  66. data/doc/_index.html +0 -197
  67. data/doc/class_list.html +0 -58
  68. data/doc/css/common.css +0 -1
  69. data/doc/css/full_list.css +0 -57
  70. data/doc/css/style.css +0 -339
  71. data/doc/file.README.html +0 -87
  72. data/doc/file_list.html +0 -60
  73. data/doc/frames.html +0 -26
  74. data/doc/index.html +0 -87
  75. data/doc/js/app.js +0 -219
  76. data/doc/js/full_list.js +0 -181
  77. data/doc/js/jquery.js +0 -4
  78. data/doc/method_list.html +0 -261
  79. data/doc/top-level-namespace.html +0 -112
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5a1348f9a120404e5fa6a5dd9710a7f7d44b2be8
4
+ data.tar.gz: 194a975415e454028ab738929df4462c5dd8213a
5
+ SHA512:
6
+ metadata.gz: 6870dd1f8e7dfb518fd1027f40605f1267c9d4aa740916aaf03828c87f1f019d90cc48389134a6b5a18cd3c1f5bcdd2c7a5c2fa1b010acd43b4a86a14f6192cc
7
+ data.tar.gz: b5f30aa15b3db675de70b97065ef8165830c89de6193af18dda0c99d3253f4e49e7025d14030c79d553eed26ea1b69d624532af07577a822d3a1e1e7a0356224
data/.gitignore CHANGED
@@ -15,5 +15,6 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ vendor
18
19
 
19
20
  .DS_Store
data/.travis.yml CHANGED
@@ -9,7 +9,8 @@ rvm:
9
9
  - 2.0.0
10
10
  - 2.1.0
11
11
  - 2.2.0
12
- - rbx-2
12
+ - 2.3.0
13
+ - 2.4.0
13
14
  notifications:
14
15
  slack:
15
16
  secure: agVll2R9PTPvJMcUgbvOh9eGt60zGDc8kPUwEsiQr828rCgXh/ZxD5irYDyKQg3ZsS8+f3MjFCwzU7uQALkia2pDrie9d8g8m1dt4Q5U7Qm6QecshvE0U9JwbB5Ngxaftbqyf0XEFrE7CKs7RI1BzFRpe8m+fdZgfwccX8Gb7pc=
data/README.md CHANGED
@@ -17,7 +17,7 @@ Bundler helps manage dependencies for Ruby projects. Find more info here: <http:
17
17
  Add this gem to your `Gemfile`:
18
18
 
19
19
  ```ruby
20
- gem "opentok", "~> 2.4.0.beta.1"
20
+ gem "opentok", "~> 2.4"
21
21
  ```
22
22
 
23
23
  Allow bundler to install the change.
@@ -29,7 +29,7 @@ $ bundle install
29
29
  ## RubyGems:
30
30
 
31
31
  ```
32
- $ gem install opentok -v 2.4.0.beta.1
32
+ $ gem install opentok -v 2.4.0
33
33
  ```
34
34
 
35
35
  # Usage
@@ -75,10 +75,9 @@ session_id = session.session_id
75
75
 
76
76
  Once a Session is created, you can start generating Tokens for clients to use when connecting to it.
77
77
  You can generate a token either by calling the `opentok.generate_token(session_id, options)` method,
78
- or by calling the `Session#generate_token(options)` method on the an instance after creating it. The
78
+ or by calling the `Session#generate_token(options)` method on the instance after creating it. The
79
79
  `options` parameter is an optional Hash used to set the role, expire time, and connection data of
80
- the Token. For layout control in archives and broadcasts, the initial layout class list of streams
81
- published from connections using this token can be set as well.
80
+ the Token.
82
81
 
83
82
  ```ruby
84
83
  # Generate a Token from just a session_id (fetched from a database)
@@ -89,10 +88,9 @@ token = session.generate_token
89
88
 
90
89
  # Set some options in a token
91
90
  token = session.generate_token({
92
- :role => :moderator
93
- :expire_time => Time.now.to_i+(7 * 24 * 60 * 60) # in one week
94
- :data => 'name=Johnny',
95
- :initial_layout_classes => ['focus', 'inactive']
91
+ :role => :moderator,
92
+ :expire_time => Time.now.to_i+(7 * 24 * 60 * 60), # in one week
93
+ :data => 'name=Johnny'
96
94
  });
97
95
  ```
98
96
 
@@ -188,8 +186,7 @@ repository and follow the Walkthroughs:
188
186
 
189
187
  # Documentation
190
188
 
191
- Reference documentation is available at <http://www.tokbox.com//opentok/libraries/server/ruby/reference/index.html> and in the
192
- doc directory of the SDK.
189
+ Reference documentation is available at <http://www.tokbox.com//opentok/libraries/server/ruby/reference/index.html>.
193
190
 
194
191
  # Requirements
195
192
 
data/lib/opentok.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require "opentok/opentok"
2
2
 
3
- # Namespace for classes and modules in the OpenTok 2.2 Ruby SDK.
3
+ # Namespace for classes and modules in the OpenTok Ruby SDK.
4
4
  module OpenTok
5
5
 
6
6
  end
@@ -30,9 +30,8 @@ module OpenTok
30
30
  # The API key associated with the archive.
31
31
  #
32
32
  # @attr [string] reason
33
- # For archives with the status "stopped", this can be set to "90 mins exceeded", "failure",
34
- # "session ended", or "user initiated". For archives with the status "failed", this can be set
35
- # to "system failure".
33
+ # For archives with the status "stopped" or "failed", this string describes the
34
+ # reason the archive stopped (such as "maximum duration exceeded") or failed.
36
35
  #
37
36
  # @attr [string] session_id
38
37
  # The session ID of the OpenTok session associated with this archive.
@@ -96,11 +96,13 @@ module OpenTok
96
96
  # the most recent archive. If you do not specify an offset, 0 is used.
97
97
  # @option options [integer] :count Optional. The number of archives to be returned. The maximum
98
98
  # number of archives returned is 1000.
99
+ # @option options [String] :session_id Optional. The session ID that archives belong to. This is
100
+ # useful when listing multiple archives for an {https://tokbox.com/developer/guides/archiving/#automatic-archives automatically archived session}
99
101
  #
100
102
  # @return [ArchiveList] An ArchiveList object, which is an array of Archive objects.
101
103
  def all(options = {})
102
- raise ArgumentError, "Limit is invalid" unless options[:count].nil? or (0..100).include? options[:count]
103
- archive_list_json = @client.list_archives(options[:offset], options[:count])
104
+ raise ArgumentError, "Limit is invalid" unless options[:count].nil? or (0..1000).include? options[:count]
105
+ archive_list_json = @client.list_archives(options[:offset], options[:count], options[:sessionId])
104
106
  ArchiveList.new self, archive_list_json
105
107
  end
106
108
 
@@ -1,8 +1,10 @@
1
+ require "opentok/constants"
1
2
  require "opentok/exceptions"
2
3
  require "opentok/extensions/hash"
3
4
 
4
5
  require "active_support/inflector"
5
6
  require "httparty"
7
+ require "jwt"
6
8
 
7
9
  module OpenTok
8
10
  # @private For internal use by the SDK.
@@ -17,15 +19,34 @@ module OpenTok
17
19
  def initialize(api_key, api_secret, api_url, ua_addendum="")
18
20
  self.class.base_uri api_url
19
21
  self.class.headers({
20
- "X-TB-PARTNER-AUTH" => "#{api_key}:#{api_secret}",
21
22
  "User-Agent" => "OpenTok-Ruby-SDK/#{VERSION}" + (ua_addendum ? " #{ua_addendum}" : "")
22
23
  })
23
24
  @api_key = api_key
25
+ @api_secret = api_secret
26
+ end
27
+
28
+ def generate_jwt(api_key, api_secret)
29
+ now = Time.now.to_i
30
+ payload = {
31
+ :iss => api_key,
32
+ :iat => now,
33
+ :exp => now + AUTH_EXPIRE
34
+ }
35
+ token = JWT.encode payload, api_secret, 'HS256', :ist => 'project'
36
+ token
37
+ end
38
+
39
+ def generate_headers(extra_headers = {})
40
+ defaults = { "X-OPENTOK-AUTH" => generate_jwt(@api_key, @api_secret) }
41
+ defaults.merge extra_headers
24
42
  end
25
43
 
26
44
  def create_session(opts)
27
45
  opts.extend(HashExtensions)
28
- response = self.class.post("/session/create", :body => opts.camelize_keys!)
46
+ response = self.class.post("/session/create", {
47
+ :body => opts.camelize_keys!,
48
+ :headers => generate_headers
49
+ })
29
50
  case response.code
30
51
  when (200..300)
31
52
  response
@@ -41,9 +62,9 @@ module OpenTok
41
62
  def start_archive(session_id, opts)
42
63
  opts.extend(HashExtensions)
43
64
  body = { "sessionId" => session_id }.merge(opts.camelize_keys!)
44
- response = self.class.post("/v2/partner/#{@api_key}/archive", {
65
+ response = self.class.post("/v2/project/#{@api_key}/archive", {
45
66
  :body => body.to_json,
46
- :headers => { "Content-Type" => "application/json" }
67
+ :headers => generate_headers("Content-Type" => "application/json")
47
68
  })
48
69
  case response.code
49
70
  when 200
@@ -64,7 +85,9 @@ module OpenTok
64
85
  end
65
86
 
66
87
  def get_archive(archive_id)
67
- response = self.class.get("/v2/partner/#{@api_key}/archive/#{archive_id}")
88
+ response = self.class.get("/v2/project/#{@api_key}/archive/#{archive_id}", {
89
+ :headers => generate_headers
90
+ })
68
91
  case response.code
69
92
  when 200
70
93
  response
@@ -79,12 +102,14 @@ module OpenTok
79
102
  raise OpenTokError, "Failed to connect to OpenTok. Response code: #{e.message}"
80
103
  end
81
104
 
82
- def list_archives(offset, count)
105
+ def list_archives(offset, count, sessionId)
83
106
  query = Hash.new
84
107
  query[:offset] = offset unless offset.nil?
85
108
  query[:count] = count unless count.nil?
86
- response = self.class.get("/v2/partner/#{@api_key}/archive", {
87
- :query => query.empty? ? nil : query
109
+ query[:sessionId] = sessionId unless sessionId.nil?
110
+ response = self.class.get("/v2/project/#{@api_key}/archive", {
111
+ :query => query.empty? ? nil : query,
112
+ :headers => generate_headers
88
113
  })
89
114
  case response.code
90
115
  when 200
@@ -99,8 +124,8 @@ module OpenTok
99
124
  end
100
125
 
101
126
  def stop_archive(archive_id)
102
- response = self.class.post("/v2/partner/#{@api_key}/archive/#{archive_id}/stop", {
103
- :headers => { "Content-Type" => "application/json" }
127
+ response = self.class.post("/v2/project/#{@api_key}/archive/#{archive_id}/stop", {
128
+ :headers => generate_headers("Content-Type" => "application/json")
104
129
  })
105
130
  case response.code
106
131
  when 200
@@ -121,8 +146,8 @@ module OpenTok
121
146
  end
122
147
 
123
148
  def delete_archive(archive_id)
124
- response = self.class.delete("/v2/partner/#{@api_key}/archive/#{archive_id}", {
125
- :headers => { "Content-Type" => "application/json" }
149
+ response = self.class.delete("/v2/project/#{@api_key}/archive/#{archive_id}", {
150
+ :headers => generate_headers("Content-Type" => "application/json")
126
151
  })
127
152
  case response.code
128
153
  when 204
@@ -3,4 +3,5 @@ module OpenTok
3
3
  TOKEN_SENTINEL = "T1=="
4
4
  ROLES = { subscriber: "subscriber", publisher: "publisher", moderator: "moderator" }
5
5
  ARCHIVE_MODES = Set.new([:manual, :always])
6
+ AUTH_EXPIRE = 300
6
7
  end
@@ -34,7 +34,7 @@ module OpenTok
34
34
  # streams, and signal. (This is the default value if you do not specify a role.)
35
35
  #
36
36
  # * <code>:moderator</code> -- In addition to the privileges granted to a
37
- # publisher, in clients using the OpenTok.js 2.2 library, a moderator can call the
37
+ # publisher, in clients using the OpenTok.js library, a moderator can call the
38
38
  # <code>forceUnpublish()</code> and <code>forceDisconnect()</code> method of the
39
39
  # Session object.
40
40
  # @option options [integer] :expire_time The expiration time, in seconds since the UNIX epoch.
@@ -32,7 +32,7 @@ module OpenTok
32
32
  # streams, and signal. (This is the default value if you do not specify a role.)
33
33
  #
34
34
  # * <code>:moderator</code> -- In addition to the privileges granted to a
35
- # publisher, in clients using the OpenTok.js 2.2 library, a moderator can call the
35
+ # publisher, in clients using the OpenTok.js library, a moderator can call the
36
36
  # <code>forceUnpublish()</code> and <code>forceDisconnect()</code> method of the
37
37
  # Session object.
38
38
  # @option options [integer] :expire_time The expiration time, in seconds since the UNIX epoch.
@@ -81,15 +81,6 @@ module OpenTok
81
81
  end
82
82
  data_params[:connection_data] = data
83
83
  end
84
-
85
- if opts[:initial_layout_classes]
86
- if opts[:initial_layout_classes].is_a?(Array)
87
- data_params[:initial_layout_class_list] = opts[:initial_layout_classes].join(' ')
88
- else
89
- data_params[:initial_layout_class_list] = opts[:initial_layout_classes].to_s
90
- end
91
- end
92
-
93
84
  digest = OpenSSL::Digest.new('sha1')
94
85
  data_string = Addressable::URI.form_encode data_params
95
86
  meta_string = Addressable::URI.form_encode({
@@ -1,4 +1,4 @@
1
1
  module OpenTok
2
2
  # @private
3
- VERSION = '2.4.0.beta.1'
3
+ VERSION = '2.4.0'
4
4
  end
data/opentok.gemspec CHANGED
@@ -19,13 +19,14 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency "bundler", "~> 1.5"
20
20
  spec.add_development_dependency "rake", "~> 10.1.1"
21
21
  spec.add_development_dependency "rspec", "~> 2.14.1"
22
- spec.add_development_dependency "webmock", "~> 1.17.4"
22
+ spec.add_development_dependency "webmock", "~> 2.3.2"
23
23
  spec.add_development_dependency "vcr", "~> 2.8.0"
24
24
  spec.add_development_dependency "yard", "~> 0.8.7"
25
25
  # TODO: exclude this for compatibility with rbx
26
26
  # spec.add_development_dependency "debugger", "~> 1.6.6"
27
27
 
28
28
  spec.add_dependency "addressable", "~> 2.3" # 2.3.0 <= version < 3.0.0
29
- spec.add_dependency "httparty", "~> 0.13.1"
29
+ spec.add_dependency "httparty", "~> 0.14.0"
30
30
  spec.add_dependency "activesupport", ">= 2.0"
31
+ spec.add_dependency "jwt", "~> 1.5.6"
31
32
  end
@@ -1,16 +1,27 @@
1
- var session = OT.initSession(sessionId),
1
+ var session = OT.initSession(apiKey, sessionId),
2
2
  publisher = OT.initPublisher('publisher'),
3
3
  archiveID = null;
4
4
 
5
- session.connect(apiKey, token, function(err, info) {
6
- if(err) {
7
- alert(err.message || err);
5
+ session.connect(token, function(error, info) {
6
+ if (error) {
7
+ console.error('Failed to connect', error);
8
+ } else {
9
+ session.publish(publisher, function(error) {
10
+ if (error) {
11
+ console.error('Failed to publish', error);
12
+ }
13
+ });
8
14
  }
9
- session.publish(publisher);
10
15
  });
11
16
 
12
17
  session.on('streamCreated', function(event) {
13
- session.subscribe(event.stream, 'subscribers', { insertMode: 'append' });
18
+ session.subscribe(event.stream, 'subscribers', {
19
+ insertMode: 'append'
20
+ }, function(error) {
21
+ if (error) {
22
+ console.error('Failed to subscribe', error);
23
+ }
24
+ });
14
25
  });
15
26
 
16
27
  session.on('archiveStarted', function(event) {
@@ -30,7 +41,7 @@ session.on('archiveStopped', function(event) {
30
41
  });
31
42
 
32
43
  $(document).ready(function() {
33
- $('.start').click(function (event) {
44
+ $('.start').click(function(event) {
34
45
  var options = $('.archive-options').serialize();
35
46
  disableForm();
36
47
  $.post('/start', options).fail(enableForm);
@@ -1,13 +1,24 @@
1
- var session = OT.initSession(sessionId),
2
- publisher = OT.initPublisher("publisher");
1
+ var session = OT.initSession(apiKey, sessionId),
2
+ publisher = OT.initPublisher('publisher');
3
3
 
4
- session.connect(apiKey, token, function(err, info) {
5
- if(err) {
6
- alert(err.message || err);
4
+ session.connect(token, function(error, info) {
5
+ if (error) {
6
+ console.error('Failed to connect', error);
7
+ } else {
8
+ session.publish(publisher, function(error) {
9
+ if (error) {
10
+ console.error('Failed to publish', error);
11
+ }
12
+ });
7
13
  }
8
- session.publish(publisher);
9
14
  });
10
15
 
11
16
  session.on('streamCreated', function(event) {
12
- session.subscribe(event.stream, "subscribers", { insertMode : "append" });
17
+ session.subscribe(event.stream, 'subscribers', {
18
+ insertMode : 'append'
19
+ }, function(error) {
20
+ if (error) {
21
+ console.error('Failed to subscribe', error);
22
+ }
23
+ });
13
24
  });
@@ -1,4 +1,4 @@
1
- <script src="//static.opentok.com/webrtc/v2.2/js/opentok.min.js"></script>
1
+ <script src="https://static.opentok.com/v2/js/opentok.min.js"></script>
2
2
 
3
3
  <div class="container bump-me">
4
4
 
@@ -1,4 +1,4 @@
1
- <script src="//static.opentok.com/webrtc/v2.2/js/opentok.min.js"></script>
1
+ <script src="https://static.opentok.com/v2/js/opentok.min.js"></script>
2
2
 
3
3
  <div class="container bump-me">
4
4
 
@@ -1,8 +1,16 @@
1
1
  // Initialize an OpenTok Session object
2
- var session = TB.initSession(sessionId);
2
+ var session = OT.initSession(apiKey, sessionId);
3
3
 
4
4
  // Initialize a Publisher, and place it into the element with id="publisher"
5
- var publisher = TB.initPublisher(apiKey, 'publisher');
5
+ var publisher = OT.initPublisher('publisher', {
6
+ insertMode: 'append',
7
+ width: '100%',
8
+ height: '100%'
9
+ }, function(error) {
10
+ if (error) {
11
+ console.error('Failed to initialise publisher', error);
12
+ }
13
+ });
6
14
 
7
15
  // Attach event handlers
8
16
  session.on({
@@ -11,7 +19,11 @@ session.on({
11
19
  sessionConnected: function(event) {
12
20
  // Publish the publisher we initialzed earlier (this will trigger 'streamCreated' on other
13
21
  // clients)
14
- session.publish(publisher);
22
+ session.publish(publisher, function(error) {
23
+ if (error) {
24
+ console.error('Failed to publish', error);
25
+ }
26
+ });
15
27
  },
16
28
 
17
29
  // This function runs when another client publishes a stream (eg. session.publish())
@@ -23,10 +35,18 @@ session.on({
23
35
  document.getElementById('subscribers').appendChild(subContainer);
24
36
 
25
37
  // Subscribe to the stream that caused this event, put it inside the container we just made
26
- session.subscribe(event.stream, subContainer);
38
+ session.subscribe(event.stream, subContainer, function(error) {
39
+ if (error) {
40
+ console.error('Failed to subscribe', error);
41
+ }
42
+ });
27
43
  }
28
44
 
29
45
  });
30
46
 
31
- // Connect to the Session using the 'apiKey' of the application and a 'token' for permission
32
- session.connect(apiKey, token);
47
+ // Connect to the Session using a 'token'
48
+ session.connect(token, function(error) {
49
+ if (error) {
50
+ console.error('Failed to connect', error);
51
+ }
52
+ });
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <title>OpenTok Hello World</title>
6
- <script src="//static.opentok.com/webrtc/v2.2/js/TB.min.js"></script>
6
+ <script src="https://static.opentok.com/v2/js/opentok.min.js"></script>
7
7
  <script type="text/javascript">
8
8
  var apiKey = '<%= api_key %>';
9
9
  var sessionId = '<%= session_id %>';