opentok 4.5.1 → 4.7.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 +4 -4
- data/CHANGES.md +10 -0
- data/README.md +34 -3
- data/lib/opentok/client.rb +29 -0
- data/lib/opentok/exceptions.rb +2 -1
- data/lib/opentok/opentok.rb +29 -3
- data/lib/opentok/session.rb +11 -2
- data/lib/opentok/version.rb +1 -1
- data/lib/opentok/websocket.rb +37 -0
- data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_name.yml +42 -0
- data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_name_and_resolution.yml +42 -0
- data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_resolution.yml +42 -0
- data/spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_e2ee_sessions.yml +40 -0
- data/spec/cassettes/OpenTok_WebSocket/receives_a_valid_response.yml +37 -0
- data/spec/opentok/opentok_spec.rb +74 -2
- data/spec/opentok/websocket_spec.rb +26 -0
- metadata +15 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '019bb7945d8571c4805cab88854fd49914fac7fbb7169b2b1351fa393237ea46'
|
4
|
+
data.tar.gz: 9f167173216875bbc1b52bd2239c7fff7e9ff49c4aa92c28e6541d9fb178782d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e24be36a973fd9fe2ed63a620dbff3f0cb2fa24939318fd0f353a76374c8c09e4e46c8c920e223015c6b536dfbeddc2d94e75909f6cc3fbb54e6b39f85077402
|
7
|
+
data.tar.gz: 29b06c9529e61f19208d0c875ddf0caba12652afaaa4f87f59760a3c664a69b6a1686f200f1793a730b8518ec1d2f99cbd0ea7a29ee7ab2c5bcc7d42cb2b2af6
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# 4.7.0
|
2
|
+
|
3
|
+
* Adds support for the End-to-end encryption (E2EE) feature [#259](https://github.com/opentok/OpenTok-Ruby-SDK/pull/259)
|
4
|
+
* Implements Auto-archive improvements [#262](https://github.com/opentok/OpenTok-Ruby-SDK/pull/262)
|
5
|
+
* Updates the README to explain appending a custom value to the `UserAgent` header [#263](https://github.com/opentok/OpenTok-Ruby-SDK/pull/263)
|
6
|
+
|
7
|
+
# 4.6.0
|
8
|
+
|
9
|
+
* Adds functionality for working with the Audio Connector feature [#247](https://github.com/opentok/OpenTok-Ruby-SDK/pull/247)
|
10
|
+
|
1
11
|
# 4.5.1
|
2
12
|
|
3
13
|
* Fixes issue with uninitialized constant by adding missing `require` statement [#256](https://github.com/opentok/OpenTok-Ruby-SDK/pull/256)
|
data/README.md
CHANGED
@@ -18,6 +18,7 @@ The OpenTok Ruby SDK provides methods for:
|
|
18
18
|
* [Disconnecting clients from sessions](https://tokbox.com/developer/guides/moderation/rest/)
|
19
19
|
* [Forcing clients in a session to disconnect or mute published audio](https://tokbox.com/developer/guides/moderation/)
|
20
20
|
* Working with OpenTok [Experience Composers](https://tokbox.com/developer/guides/experience-composer)
|
21
|
+
* Working with OpenTok [Audio Connector](https://tokbox.com/developer/guides/audio-connector)
|
21
22
|
|
22
23
|
## Installation
|
23
24
|
|
@@ -58,6 +59,8 @@ opentok = OpenTok::OpenTok.new api_key, api_secret
|
|
58
59
|
|
59
60
|
#### Initialization Options
|
60
61
|
|
62
|
+
**Custom Timeout**
|
63
|
+
|
61
64
|
You can specify a custom timeout value for HTTP requests when initializing a new `OpenTok::OpenTok`
|
62
65
|
object:
|
63
66
|
|
@@ -70,6 +73,23 @@ opentok = OpenTok::OpenTok.new api_key, api_secret, :timeout_length => 10
|
|
70
73
|
The value for `:timeout_length` is an integer representing the number of seconds to wait for an HTTP
|
71
74
|
request to complete. The default is set to 2 seconds.
|
72
75
|
|
76
|
+
**UA Addendum**
|
77
|
+
|
78
|
+
You can also append a custom string to the `User-Agent` header value for HTTP requests when initializing a new `OpenTok::OpenTok`
|
79
|
+
object:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
require "opentok"
|
83
|
+
|
84
|
+
opentok = OpenTok::OpenTok.new api_key, api_secret, :ua_addendum => 'FOO'
|
85
|
+
```
|
86
|
+
|
87
|
+
The above would generate a `User-Agent` header something like this:
|
88
|
+
|
89
|
+
```
|
90
|
+
User-Agent: OpenTok-Ruby-SDK/4.6.0-Ruby-Version-3.1.2-p20 FOO
|
91
|
+
```
|
92
|
+
|
73
93
|
### Creating Sessions
|
74
94
|
|
75
95
|
To create an OpenTok Session, use the `OpenTok#create_session(properties)` method.
|
@@ -100,6 +120,9 @@ session = opentok.create_session :location => '12.34.56.78'
|
|
100
120
|
# A session with automatic archiving (must use the routed media mode):
|
101
121
|
session = opentok.create_session :archive_mode => :always, :media_mode => :routed
|
102
122
|
|
123
|
+
# A session with end-to-end encryption (must use the routed media mode):
|
124
|
+
session = opentok.create_session :e2ee => true, :media_mode => :routed
|
125
|
+
|
103
126
|
# Store this sessionId in the database for later use:
|
104
127
|
session_id = session.session_id
|
105
128
|
```
|
@@ -188,7 +211,10 @@ archive = opentok.archives.create session_id :output_mode => :individual
|
|
188
211
|
The `:output_mode => :composed` setting (the default) causes all streams in the archive to be
|
189
212
|
recorded to a single (composed) file.
|
190
213
|
|
191
|
-
For composed archives you can set the resolution of the archive, either "640x480"
|
214
|
+
For composed archives you can set the resolution of the archive, either "640x480"
|
215
|
+
(SD landscape, the default), "1280x720" (HD landscape), "1920x1080" (FHD landscape),
|
216
|
+
"480x640" (SD portrait), "720x1280" (HD portrait), or "1080x1920" (FHD portrait).
|
217
|
+
The `resolution` parameter is optional and could be included in the options
|
192
218
|
hash (second argument) of the `opentok.archives.create()` method.
|
193
219
|
|
194
220
|
```ruby
|
@@ -322,7 +348,7 @@ For more information on archiving, see the
|
|
322
348
|
|
323
349
|
### Signaling
|
324
350
|
|
325
|
-
You can send a signal using the `opentok.signals.send(session_id, connection_id, opts)` method.
|
351
|
+
You can send a signal using the `opentok.signals.send(session_id, connection_id, opts)` method.
|
326
352
|
If `connection_id` is nil or an empty string, then the signal is send to all valid connections in
|
327
353
|
the session.
|
328
354
|
|
@@ -457,7 +483,7 @@ You can cause a client to be forced to disconnect from a session by using the
|
|
457
483
|
|
458
484
|
### Forcing clients in a session to mute published audio
|
459
485
|
|
460
|
-
You can force the publisher of a specific stream to stop publishing audio using the
|
486
|
+
You can force the publisher of a specific stream to stop publishing audio using the
|
461
487
|
`opentok.streams.force_mute(session_id, stream_id)` method.
|
462
488
|
|
463
489
|
You can force the publisher of all streams in a session (except for an optional list of streams)
|
@@ -495,6 +521,11 @@ You can stop an Experience Composer by calling the `opentok.renders.stop(render_
|
|
495
521
|
You can get information about Experience Composers by calling the `opentok.renders.find(render_id)`
|
496
522
|
and `opentok.renders.list(options)` methods.
|
497
523
|
|
524
|
+
### Working with Audio Connector
|
525
|
+
|
526
|
+
You can start an [Audio Connector](https://tokbox.com/developer/guides/audio-connector) WebSocket
|
527
|
+
by calling the `opentok.websocket.connect()` method.
|
528
|
+
|
498
529
|
## Samples
|
499
530
|
|
500
531
|
There are three sample applications included in this repository. To get going as fast as possible, clone the whole
|
data/lib/opentok/client.rb
CHANGED
@@ -298,6 +298,35 @@ module OpenTok
|
|
298
298
|
raise OpenTokError, "Failed to connect to OpenTok. Response code: #{e.message}"
|
299
299
|
end
|
300
300
|
|
301
|
+
def connect_websocket(session_id, token, websocket_uri, opts)
|
302
|
+
opts.extend(HashExtensions)
|
303
|
+
body = { "sessionId" => session_id,
|
304
|
+
"token" => token,
|
305
|
+
"websocket" => { "uri" => websocket_uri }.merge(opts.camelize_keys!)
|
306
|
+
}
|
307
|
+
|
308
|
+
response = self.class.post("/v2/project/#{@api_key}/connect", {
|
309
|
+
:body => body.to_json,
|
310
|
+
:headers => generate_headers("Content-Type" => "application/json")
|
311
|
+
})
|
312
|
+
case response.code
|
313
|
+
when 200
|
314
|
+
response
|
315
|
+
when 400
|
316
|
+
raise ArgumentError, "One of the properties is invalid."
|
317
|
+
when 403
|
318
|
+
raise OpenTokAuthenticationError, "You are not authorized to start the call, check your authentication information."
|
319
|
+
when 409
|
320
|
+
raise OpenTokWebSocketError, "Conflict. Only routed sessions are allowed to initiate Connect Calls."
|
321
|
+
when 500
|
322
|
+
raise OpenTokError, "OpenTok server error."
|
323
|
+
else
|
324
|
+
raise OpenTokWebSocketError, "The WebSocket could not be connected"
|
325
|
+
end
|
326
|
+
rescue StandardError => e
|
327
|
+
raise OpenTokError, "Failed to connect to OpenTok. Response code: #{e.message}"
|
328
|
+
end
|
329
|
+
|
301
330
|
def dial(session_id, token, sip_uri, opts)
|
302
331
|
opts.extend(HashExtensions)
|
303
332
|
body = { "sessionId" => session_id,
|
data/lib/opentok/exceptions.rb
CHANGED
@@ -14,7 +14,8 @@ module OpenTok
|
|
14
14
|
class OpenTokStreamLayoutError < OpenTokError; end
|
15
15
|
# Defines errors raised when you perform Broadcast operations.
|
16
16
|
class OpenTokBroadcastError < OpenTokError; end
|
17
|
+
# Defines errors raised when connecting to WebSocket URIs.
|
18
|
+
class OpenTokWebSocketError < OpenTokError; end
|
17
19
|
# Defines errors raised when you perform Experience Composer render operations.
|
18
20
|
class OpenTokRenderError < OpenTokError; end
|
19
|
-
|
20
21
|
end
|
data/lib/opentok/opentok.rb
CHANGED
@@ -144,11 +144,26 @@ module OpenTok
|
|
144
144
|
# automatically (<code>:always</code>) or not (<code>:manual</code>). When using automatic
|
145
145
|
# archiving, the session must use the <code>:routed</code> media mode.
|
146
146
|
#
|
147
|
+
# @option opts [Symbol] :archive_name The name to use for archives in auto-archived sessions.
|
148
|
+
# When setting this option, the :archive_mode option must be set to :always or an error will result.
|
149
|
+
# The length of the archive name can be up to 80 chars.
|
150
|
+
# Due to encoding limitations the following special characters are translated to a colon (:) character: ~, -, _.
|
151
|
+
# If you do not set a name and the archiveMode option is set to always, the archive name will be empty.
|
152
|
+
#
|
153
|
+
# @option opts [Symbol] :archive_resolution The resolution of archives in an auto-archived session.
|
154
|
+
# Valid values are "480x640", "640x480" (the default), "720x1280", "1280x720", "1080x1920", and "1920x1080".
|
155
|
+
# When setting this option, the :archive_mode option must be set to :always or an error will result.
|
156
|
+
#
|
157
|
+
# @option opts [true, false] :e2ee
|
158
|
+
# (Boolean, optional) — Whether the session uses end-to-end encryption from client to client (default: false).
|
159
|
+
# This should not be set to `true` if `:media_mode` is `:relayed`.
|
160
|
+
# See the {https://tokbox.com/developer/guides/end-to-end-encryption/ documentation} for more information.
|
161
|
+
#
|
147
162
|
# @return [Session] The Session object. The session_id property of the object is the session ID.
|
148
163
|
def create_session(opts={})
|
149
164
|
|
150
165
|
# normalize opts so all keys are symbols and only include valid_opts
|
151
|
-
valid_opts = [ :media_mode, :location, :archive_mode ]
|
166
|
+
valid_opts = [ :media_mode, :location, :archive_mode, :archive_name, :archive_resolution, :e2ee ]
|
152
167
|
opts = opts.inject({}) do |m,(k,v)|
|
153
168
|
if valid_opts.include? k.to_sym
|
154
169
|
m[k.to_sym] = v
|
@@ -159,6 +174,13 @@ module OpenTok
|
|
159
174
|
# keep opts around for Session constructor, build REST params
|
160
175
|
params = opts.clone
|
161
176
|
|
177
|
+
# validate input combinations
|
178
|
+
raise ArgumentError, "A session with always archive mode must also have the routed media mode." if (params[:archive_mode] == :always && params[:media_mode] == :relayed)
|
179
|
+
|
180
|
+
raise ArgumentError, "A session with relayed media mode should not have e2ee set to true." if (params[:media_mode] == :relayed && params[:e2ee] == true)
|
181
|
+
|
182
|
+
raise ArgumentError, "A session with always archive mode must not have e2ee set to true." if (params[:archive_mode] == :always && params[:e2ee] == true)
|
183
|
+
|
162
184
|
# anything other than :relayed sets the REST param to "disabled", in which case we force
|
163
185
|
# opts to be :routed. if we were more strict we could raise an error when the value isn't
|
164
186
|
# either :relayed or :routed
|
@@ -175,10 +197,9 @@ module OpenTok
|
|
175
197
|
# archive mode is optional, but it has to be one of the valid values if present
|
176
198
|
unless params[:archive_mode].nil?
|
177
199
|
raise "archive mode must be either always or manual" unless ARCHIVE_MODES.include? params[:archive_mode].to_sym
|
200
|
+
raise ArgumentError, "archive name and/or archive resolution must not be set if archive mode is manual" if params[:archive_mode] == :manual && (params[:archive_name] || params[:archive_resolution])
|
178
201
|
end
|
179
202
|
|
180
|
-
raise "A session with always archive mode must also have the routed media mode." if (params[:archive_mode] == :always && params[:media_mode] == :relayed)
|
181
|
-
|
182
203
|
response = client.create_session(params)
|
183
204
|
Session.new api_key, api_secret, response['sessions']['Session']['session_id'], opts
|
184
205
|
end
|
@@ -218,6 +239,11 @@ module OpenTok
|
|
218
239
|
@connections ||= Connections.new client
|
219
240
|
end
|
220
241
|
|
242
|
+
# A WebSocket object, which lets you connect OpenTok streams to a WebSocket URI.
|
243
|
+
def websocket
|
244
|
+
@websocket ||= WebSocket.new client
|
245
|
+
end
|
246
|
+
|
221
247
|
protected
|
222
248
|
def client
|
223
249
|
@client ||= Client.new api_key, api_secret, api_url, ua_addendum, timeout_length: @timeout_length
|
data/lib/opentok/session.rb
CHANGED
@@ -20,6 +20,10 @@ module OpenTok
|
|
20
20
|
# @attr_reader [String] archive_mode Whether the session will be archived automatically
|
21
21
|
# (<code>:always</code>) or not (<code>:manual</code>).
|
22
22
|
#
|
23
|
+
# @attr_reader [String] archive_name The name to use for archives in auto-archived sessions.
|
24
|
+
#
|
25
|
+
# @attr_reader [String] :archive_resolution The resolution of archives in an auto-archived session.
|
26
|
+
#
|
23
27
|
# @!method generate_token(options)
|
24
28
|
# Generates a token.
|
25
29
|
#
|
@@ -57,7 +61,7 @@ module OpenTok
|
|
57
61
|
:session_id => ->(instance) { instance.session_id }
|
58
62
|
})
|
59
63
|
|
60
|
-
attr_reader :session_id, :media_mode, :location, :archive_mode, :api_key, :api_secret
|
64
|
+
attr_reader :session_id, :media_mode, :location, :archive_mode, :archive_name, :archive_resolution, :e2ee, :api_key, :api_secret
|
61
65
|
|
62
66
|
# @private
|
63
67
|
# this implementation doesn't completely understand the format of a Session ID
|
@@ -73,7 +77,12 @@ module OpenTok
|
|
73
77
|
# @private
|
74
78
|
def initialize(api_key, api_secret, session_id, opts={})
|
75
79
|
@api_key, @api_secret, @session_id = api_key, api_secret, session_id
|
76
|
-
@media_mode
|
80
|
+
@media_mode = opts.fetch(:media_mode, :relayed)
|
81
|
+
@location = opts[:location]
|
82
|
+
@archive_mode = opts.fetch(:archive_mode, :manual)
|
83
|
+
@archive_name = opts.fetch(:archive_name, '') if archive_mode == :always
|
84
|
+
@archive_resolution = opts.fetch(:archive_resolution, "640x480") if archive_mode == :always
|
85
|
+
@e2ee = opts.fetch(:e2ee, :false)
|
77
86
|
end
|
78
87
|
|
79
88
|
# @private
|
data/lib/opentok/version.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require "opentok/client"
|
2
|
+
|
3
|
+
# An object that lets you work with Audio Connector WebSocket connections.
|
4
|
+
module OpenTok
|
5
|
+
class WebSocket
|
6
|
+
# Starts an Audio Connector WebSocket connection to send audio from a Vonage Video API session to a WebSocket URI.
|
7
|
+
# See the {https://tokbox.com/developer/guides/audio-connector/ OpenTok Audio Connector developer guide}.
|
8
|
+
#
|
9
|
+
# @example
|
10
|
+
# opts = {
|
11
|
+
# "streams" => ["STREAMID1", "STREAMID2"],
|
12
|
+
# "headers" => {
|
13
|
+
# "key1" => "val1",
|
14
|
+
# "key2" => "val2"
|
15
|
+
# }
|
16
|
+
# }
|
17
|
+
# response = opentok.websocket.connect(SESSIONID, TOKEN, "ws://service.com/wsendpoint", opts)
|
18
|
+
#
|
19
|
+
# @param [String] session_id (required) The OpenTok session ID that includes the OpenTok streams you want to include in
|
20
|
+
# the WebSocket stream.
|
21
|
+
# @param [String] token (required) The OpenTok token to be used for the Audio Connector connection to the. OpenTok session.
|
22
|
+
# @param [String] websocket_uri (required) A publicly reachable WebSocket URI to be used for the destination of the audio
|
23
|
+
# stream (such as "wss://service.com/ws-endpoint").
|
24
|
+
# @param [Hash] opts (optional) A hash defining options for the Audio Connector WebSocket connection. For example:
|
25
|
+
# @option opts [Array] :streams (optional) An array of stream IDs for the OpenTok streams you want to include in the WebSocket stream.
|
26
|
+
# If you omit this property, all streams in the session will be included.
|
27
|
+
# @option opts [Hash] :headers (optional) A hash of key-value pairs of headers to be sent to your WebSocket server with each message,
|
28
|
+
# with a maximum length of 512 bytes.
|
29
|
+
def connect(session_id, token, websocket_uri, opts = {})
|
30
|
+
response = @client.connect_websocket(session_id, token, websocket_uri, opts)
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(client)
|
34
|
+
@client = client
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.opentok.com/session/create
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: archiveMode=always&archiveName=foo&p2p.preference=disabled
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- OpenTok-Ruby-SDK/<%= version %>
|
12
|
+
X-Opentok-Auth:
|
13
|
+
- eyJpc3QiOiJwcm9qZWN0IiwiYWxnIjoiSFMyNTYifQ.eyJpc3MiOiIxMjM0NTYiLCJpYXQiOjE0OTI1MTA2NjAsImV4cCI6MTQ5MjUxMDk2MH0.BplMVhJWx4ld7KLKXqEmow6MjNPPFw9W8IHCMfeb120
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- nginx
|
25
|
+
Date:
|
26
|
+
- Mon, 12 Jun 2023 16:17:36 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/xml
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- '*'
|
33
|
+
X-Tb-Host:
|
34
|
+
- fms503-nyc.tokbox.com
|
35
|
+
Content-Length:
|
36
|
+
- '282'
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg</session_id><partner_id>123456</partner_id><create_dt>Mon
|
40
|
+
Jun 12 16:17:36 GMT 2023</create_dt></Session></sessions>
|
41
|
+
recorded_at: Tue, 18 Apr 2017 10:17:40 GMT
|
42
|
+
recorded_with: VCR 6.0.0
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.opentok.com/session/create
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: archiveMode=always&archiveName=foo&archiveResolution=720x1280&p2p.preference=disabled
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- OpenTok-Ruby-SDK/<%= version %>
|
12
|
+
X-Opentok-Auth:
|
13
|
+
- eyJpc3QiOiJwcm9qZWN0IiwiYWxnIjoiSFMyNTYifQ.eyJpc3MiOiIxMjM0NTYiLCJpYXQiOjE0OTI1MTA2NjAsImV4cCI6MTQ5MjUxMDk2MH0.BplMVhJWx4ld7KLKXqEmow6MjNPPFw9W8IHCMfeb120
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- nginx
|
25
|
+
Date:
|
26
|
+
- Mon, 12 Jun 2023 16:17:36 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/xml
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- '*'
|
33
|
+
X-Tb-Host:
|
34
|
+
- fms503-nyc.tokbox.com
|
35
|
+
Content-Length:
|
36
|
+
- '282'
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg</session_id><partner_id>123456</partner_id><create_dt>Mon
|
40
|
+
Jun 12 16:17:36 GMT 2023</create_dt></Session></sessions>
|
41
|
+
recorded_at: Tue, 18 Apr 2017 10:17:40 GMT
|
42
|
+
recorded_with: VCR 6.0.0
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.opentok.com/session/create
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: archiveMode=always&archiveResolution=720x1280&p2p.preference=disabled
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- OpenTok-Ruby-SDK/<%= version %>
|
12
|
+
X-Opentok-Auth:
|
13
|
+
- eyJpc3QiOiJwcm9qZWN0IiwiYWxnIjoiSFMyNTYifQ.eyJpc3MiOiIxMjM0NTYiLCJpYXQiOjE0OTI1MTA2NjAsImV4cCI6MTQ5MjUxMDk2MH0.BplMVhJWx4ld7KLKXqEmow6MjNPPFw9W8IHCMfeb120
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- nginx
|
25
|
+
Date:
|
26
|
+
- Mon, 12 Jun 2023 16:17:36 GMT
|
27
|
+
Content-Type:
|
28
|
+
- text/xml
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- '*'
|
33
|
+
X-Tb-Host:
|
34
|
+
- fms503-nyc.tokbox.com
|
35
|
+
Content-Length:
|
36
|
+
- '282'
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg</session_id><partner_id>123456</partner_id><create_dt>Mon
|
40
|
+
Jun 12 16:17:36 GMT 2023</create_dt></Session></sessions>
|
41
|
+
recorded_at: Tue, 18 Apr 2017 10:17:40 GMT
|
42
|
+
recorded_with: VCR 6.0.0
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.opentok.com/session/create
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: e2ee=true&p2p.preference=disabled
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- OpenTok-Ruby-SDK/<%= version %>
|
12
|
+
X-Opentok-Auth:
|
13
|
+
- eyJpc3QiOiJwcm9qZWN0IiwiYWxnIjoiSFMyNTYifQ.eyJpc3MiOiIxMjM0NTYiLCJpYXQiOjE0OTI1MTA2NjAsImV4cCI6MTQ5MjUxMDk2MH0.BplMVhJWx4ld7KLKXqEmow6MjNPPFw9W8IHCMfeb120
|
14
|
+
Accept-Encoding: "gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
|
15
|
+
Accept: "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx
|
23
|
+
Date:
|
24
|
+
- Tue, 18 Apr 2023 16:17:40 GMT
|
25
|
+
Content-Type:
|
26
|
+
- text/xml
|
27
|
+
Connection:
|
28
|
+
- keep-alive
|
29
|
+
Access-Control-Allow-Origin:
|
30
|
+
- '*'
|
31
|
+
X-Tb-Host:
|
32
|
+
- mantis503-nyc.tokbox.com
|
33
|
+
Content-Length:
|
34
|
+
- '304'
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-MTIuMzQuNTYuNzh-TW9uIE1hciAxNyAwMTo0ODo1NSBQRFQgMjAxNH4wLjM0MTM0MzE0MDIyOTU4Mjh-</session_id><partner_id>123456</partner_id><create_dt>Tue
|
38
|
+
Apr 18 08:17:40 PDT 2023</create_dt></Session></sessions>
|
39
|
+
recorded_at: Tue, 18 Apr 2023 16:17:40 GMT
|
40
|
+
recorded_with: VCR 6.0.0
|
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://api.opentok.com/v2/project/123456/connect
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"sessionId":"SESSIONID","token":"TOKENID","websocket":{"uri":"ws://service.com/wsendpoint"}}'
|
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
|
+
Date:
|
26
|
+
- Sat, 06 Aug 2022 18:10:28 GMT
|
27
|
+
Content-Type:
|
28
|
+
- application/json
|
29
|
+
Content-Length:
|
30
|
+
- '73'
|
31
|
+
Connection:
|
32
|
+
- keep-alive
|
33
|
+
body:
|
34
|
+
encoding: UTF-8
|
35
|
+
string: '{"id":"2299ba24-a6de-417c-88f7-28da54a441cf","connectionId":"833a7182-61a5-49d4-baae-c324b09953af"}'
|
36
|
+
recorded_at: Tue, 18 Apr 2017 10:17:40 GMT
|
37
|
+
recorded_with: VCR 6.0.0
|
@@ -97,6 +97,7 @@ describe OpenTok::OpenTok do
|
|
97
97
|
expect(session.media_mode).to eq :relayed
|
98
98
|
expect(session.location).to eq nil
|
99
99
|
end
|
100
|
+
|
100
101
|
it "creates always archived sessions", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"} } do
|
101
102
|
session = opentok.create_session :media_mode => :routed, :archive_mode => :always
|
102
103
|
expect(session).to be_an_instance_of OpenTok::Session
|
@@ -105,9 +106,80 @@ describe OpenTok::OpenTok do
|
|
105
106
|
expect(session.location).to eq nil
|
106
107
|
end
|
107
108
|
|
109
|
+
it "creates always archived sessions with a set archive name", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"} } do
|
110
|
+
session = opentok.create_session :media_mode => :routed, :archive_mode => :always, :archive_name => 'foo'
|
111
|
+
expect(session).to be_an_instance_of OpenTok::Session
|
112
|
+
expect(session.session_id).to be_an_instance_of String
|
113
|
+
expect(session.archive_mode).to eq :always
|
114
|
+
expect(session.archive_name).to eq 'foo'
|
115
|
+
expect(session.location).to eq nil
|
116
|
+
end
|
117
|
+
|
118
|
+
it "creates always archived sessions with a set archive resolution", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"} } do
|
119
|
+
session = opentok.create_session :media_mode => :routed, :archive_mode => :always, :archive_resolution => "720x1280"
|
120
|
+
expect(session).to be_an_instance_of OpenTok::Session
|
121
|
+
expect(session.session_id).to be_an_instance_of String
|
122
|
+
expect(session.archive_mode).to eq :always
|
123
|
+
expect(session.archive_resolution).to eq "720x1280"
|
124
|
+
expect(session.location).to eq nil
|
125
|
+
end
|
126
|
+
|
127
|
+
it "creates always archived sessions with a set archive name and resolution", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"} } do
|
128
|
+
session = opentok.create_session :media_mode => :routed, :archive_mode => :always, :archive_name => 'foo', :archive_resolution => "720x1280"
|
129
|
+
expect(session).to be_an_instance_of OpenTok::Session
|
130
|
+
expect(session.session_id).to be_an_instance_of String
|
131
|
+
expect(session.archive_mode).to eq :always
|
132
|
+
expect(session.archive_name).to eq 'foo'
|
133
|
+
expect(session.archive_resolution).to eq "720x1280"
|
134
|
+
expect(session.location).to eq nil
|
135
|
+
end
|
136
|
+
|
137
|
+
it "creates e2ee sessions", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"} } do
|
138
|
+
session = opentok.create_session :media_mode => :routed, :e2ee => :true
|
139
|
+
expect(session).to be_an_instance_of OpenTok::Session
|
140
|
+
expect(session.session_id).to be_an_instance_of String
|
141
|
+
expect(session.e2ee).to eq :true
|
142
|
+
expect(session.location).to eq nil
|
143
|
+
end
|
144
|
+
|
108
145
|
context "with relayed media mode and always archive mode" do
|
109
|
-
|
110
|
-
|
146
|
+
it "raises an error" do
|
147
|
+
expect {
|
148
|
+
opentok.create_session :archive_mode => :always, :media_mode => :relayed
|
149
|
+
}.to raise_error ArgumentError
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context "with archive name set and manual archive mode" do
|
154
|
+
it "raises an error" do
|
155
|
+
expect {
|
156
|
+
opentok.create_session :archive_mode => :manual, :archive_name => 'foo'
|
157
|
+
}.to raise_error ArgumentError
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "with archive resolution set and manual archive mode" do
|
162
|
+
it "raises an error" do
|
163
|
+
expect {
|
164
|
+
opentok.create_session :archive_mode => :manual, :archive_resolution => "720x1280"
|
165
|
+
}.to raise_error ArgumentError
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context "with relayed media mode and e2ee set to true" do
|
170
|
+
it "raises an error" do
|
171
|
+
expect {
|
172
|
+
opentok.create_session :media_mode => :relayed, :e2ee => true
|
173
|
+
}.to raise_error ArgumentError
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "with always archive mode and e2ee set to true" do
|
178
|
+
it "raises an error" do
|
179
|
+
expect {
|
180
|
+
opentok.create_session :archive_mode => :always, :e2ee => true
|
181
|
+
}.to raise_error ArgumentError
|
182
|
+
end
|
111
183
|
end
|
112
184
|
|
113
185
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "opentok/opentok"
|
2
|
+
require "opentok/websocket"
|
3
|
+
require "opentok/version"
|
4
|
+
require "spec_helper"
|
5
|
+
|
6
|
+
describe OpenTok::WebSocket do
|
7
|
+
before(:each) do
|
8
|
+
now = Time.parse("2017-04-18 20:17:40 +1000")
|
9
|
+
allow(Time).to receive(:now) { now }
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:api_key) { "123456" }
|
13
|
+
let(:api_secret) { "1234567890abcdef1234567890abcdef1234567890" }
|
14
|
+
let(:session_id) { "SESSIONID" }
|
15
|
+
let(:connection_id) { "CONNID" }
|
16
|
+
let(:expiring_token) { "TOKENID" }
|
17
|
+
let(:websocket_uri) { "ws://service.com/wsendpoint" }
|
18
|
+
let(:opentok) { OpenTok::OpenTok.new api_key, api_secret }
|
19
|
+
let(:websocket) { opentok.websocket }
|
20
|
+
subject { websocket }
|
21
|
+
|
22
|
+
it "receives a valid response", :vcr => { :erb => { :version => OpenTok::VERSION + "-Ruby-Version-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"} } do
|
23
|
+
response = websocket.connect(session_id, expiring_token, websocket_uri)
|
24
|
+
expect(response).not_to be_nil
|
25
|
+
end
|
26
|
+
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.
|
4
|
+
version: 4.7.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:
|
15
|
+
date: 2023-06-20 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: bundler
|
@@ -206,6 +206,7 @@ files:
|
|
206
206
|
- lib/opentok/streams.rb
|
207
207
|
- lib/opentok/token_generator.rb
|
208
208
|
- lib/opentok/version.rb
|
209
|
+
- lib/opentok/websocket.rb
|
209
210
|
- opentok.gemspec
|
210
211
|
- sample/Archiving/Gemfile
|
211
212
|
- sample/Archiving/README.md
|
@@ -281,7 +282,11 @@ files:
|
|
281
282
|
- spec/cassettes/OpenTok_Broadcasts/stops_a_broadcast.yml
|
282
283
|
- spec/cassettes/OpenTok_Connections/forces_a_connection_to_be_terminated.yml
|
283
284
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions.yml
|
285
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_name.yml
|
286
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_name_and_resolution.yml
|
287
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_resolution.yml
|
284
288
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_default_sessions.yml
|
289
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_e2ee_sessions.yml
|
285
290
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions.yml
|
286
291
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions_for_invalid_media_modes.yml
|
287
292
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions_with_a_location_hint.yml
|
@@ -308,6 +313,7 @@ files:
|
|
308
313
|
- spec/cassettes/OpenTok_Streams/get_all_streams_information.yml
|
309
314
|
- spec/cassettes/OpenTok_Streams/get_specific_stream_information.yml
|
310
315
|
- spec/cassettes/OpenTok_Streams/layout_working_on_two_stream_list.yml
|
316
|
+
- spec/cassettes/OpenTok_WebSocket/receives_a_valid_response.yml
|
311
317
|
- spec/matchers/token.rb
|
312
318
|
- spec/opentok/archives_spec.rb
|
313
319
|
- spec/opentok/broadcasts_spec.rb
|
@@ -319,6 +325,7 @@ files:
|
|
319
325
|
- spec/opentok/signal_spec.rb
|
320
326
|
- spec/opentok/sip_spec.rb
|
321
327
|
- spec/opentok/streams_spec.rb
|
328
|
+
- spec/opentok/websocket_spec.rb
|
322
329
|
- spec/shared/opentok_generates_tokens.rb
|
323
330
|
- spec/shared/session_generates_tokens.rb
|
324
331
|
- spec/spec_helper.rb
|
@@ -391,7 +398,11 @@ test_files:
|
|
391
398
|
- spec/cassettes/OpenTok_Broadcasts/stops_a_broadcast.yml
|
392
399
|
- spec/cassettes/OpenTok_Connections/forces_a_connection_to_be_terminated.yml
|
393
400
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions.yml
|
401
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_name.yml
|
402
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_name_and_resolution.yml
|
403
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_always_archived_sessions_with_a_set_archive_resolution.yml
|
394
404
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_default_sessions.yml
|
405
|
+
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_e2ee_sessions.yml
|
395
406
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions.yml
|
396
407
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions_for_invalid_media_modes.yml
|
397
408
|
- spec/cassettes/OpenTok_OpenTok/when_initialized_properly/_create_session/creates_relayed_media_sessions_with_a_location_hint.yml
|
@@ -418,6 +429,7 @@ test_files:
|
|
418
429
|
- spec/cassettes/OpenTok_Streams/get_all_streams_information.yml
|
419
430
|
- spec/cassettes/OpenTok_Streams/get_specific_stream_information.yml
|
420
431
|
- spec/cassettes/OpenTok_Streams/layout_working_on_two_stream_list.yml
|
432
|
+
- spec/cassettes/OpenTok_WebSocket/receives_a_valid_response.yml
|
421
433
|
- spec/matchers/token.rb
|
422
434
|
- spec/opentok/archives_spec.rb
|
423
435
|
- spec/opentok/broadcasts_spec.rb
|
@@ -429,6 +441,7 @@ test_files:
|
|
429
441
|
- spec/opentok/signal_spec.rb
|
430
442
|
- spec/opentok/sip_spec.rb
|
431
443
|
- spec/opentok/streams_spec.rb
|
444
|
+
- spec/opentok/websocket_spec.rb
|
432
445
|
- spec/shared/opentok_generates_tokens.rb
|
433
446
|
- spec/shared/session_generates_tokens.rb
|
434
447
|
- spec/spec_helper.rb
|