/** * Creates a new OpenTok session. * <p> * OpenTok sessions do not expire. However, authentication tokens do expire (see the * generateToken() method). Also note that sessions cannot explicitly be destroyed. * <p> * A session ID string can be up to 255 characters long. * <p> * Calling this method results in an OpenTokException in the event of an error. * Check the error message for details. * * You can also create a session using the * <a href="http://www.tokbox.com/opentok/api/#session_id_production">OpenTok * REST API</a> or the <a href="https://dashboard.tokbox.com/projects">OpenTok * sdashboard</a>. * * @param location (String) An IP address that the OpenTok servers will use to * situate the session in its global network. If you do not set a location hint, * the OpenTok servers will be based on the first client connecting to the session. * * @param mediaMode determine whether the session will transmit streams using the * OpenTok Media Router (MediaMode.ROUTED) or not (MediaMode.RELAYED). By default, sessions * use the OpenTok Media Router. * <p> * The <a href="http://tokbox.com/#multiparty" target="_top"> OpenTok Media Router</a> * provides the following benefits: * * <ul> * <li>The OpenTok Media Router can decrease bandwidth usage in multiparty sessions. * (When the <code>mediaMode</code> parameter is set to * <code>MediaMode.ROUTED</code>, each client must send a separate audio-video stream * to each client subscribing to it.)</li> * <li>The OpenTok Media Router can improve the quality of the user experience through * <a href="http://tokbox.com/#iqc" target="_top">Intelligent Quality Control</a>. With * Intelligent Quality Control, if a client's connectivity degrades to a degree that * it does not support video for a stream it's subscribing to, the video is dropped on * that client (without affecting other clients), and the client receives audio only. * If the client's connectivity improves, the video returns.</li> * <li>The OpenTok Media Router supports the * <a href="http://tokbox.com/#archiving" target="_top">archiving and playback</a> * feature, which lets you record, save, and retrieve OpenTok sessions.</li> * </ul> * * <p> * With the <code>mediaMode</code> parameter set to <code>MediaMode.RELAYED</code>, the * session will attempt to transmit streams directly between clients. If clients cannot * connect due to firewall restrictions, the session uses the OpenTok TURN server to relay * streams. * <p> * You will be billed for streamed minutes if you use the OpenTok Media Router or if the * session uses the OpenTok TURN server to relay streams. For information on pricing, see * the <a href="http://www.tokbox.com/pricing" target="_top">OpenTok pricing page</a>. * * @return A Session object representing the new session. The <code>Id</code> property of * the Session is the session ID, which uniquely identifies the session. You will use * this session ID in the client SDKs to identify the session. For example, when using the * OpenTok.js library, use the session ID when calling the * <a href="http://tokbox.com/opentok/libraries/client/js/reference/OT.html#initSession"> * OT.initSession()</a> method (to initialize an OpenTok session). */ public Session CreateSession(string location = "", MediaMode mediaMode = MediaMode.ROUTED) { if (!OpenTokUtils.TestIpAddress(location)) { throw new OpenTokArgumentException(string.Format("Location {0} is not a valid IP address", location)); } string preference = (mediaMode == MediaMode.RELAY) ? "enabled" : "disabled"; var headers = new Dictionary <string, string> { { "Content-type", "application/x-www-form-urlencoded" } }; var data = new Dictionary <string, object> { { "location", location }, { "p2p.preference", preference } }; var response = Client.Post("session/create", headers, data); var xmlDoc = Client.ReadXmlResponse(response); if (xmlDoc.GetElementsByTagName("session_id").Count == 0) { throw new OpenTokWebException("Session could not be provided. Are ApiKey and ApiSecret correctly set?"); } var sessionId = xmlDoc.GetElementsByTagName("session_id")[0].ChildNodes[0].Value; var apiKey = Convert.ToInt32(xmlDoc.GetElementsByTagName("partner_id")[0].ChildNodes[0].Value); return(new Session(sessionId, apiKey, ApiSecret, location, mediaMode)); }
/** * Creates a new OpenTok session. * <p> * OpenTok sessions do not expire. However, authentication tokens do expire (see the * generateToken() method). Also note that sessions cannot explicitly be destroyed. * <p> * A session ID string can be up to 255 characters long. * <p> * Calling this method results in an OpenTokException in the event of an error. * Check the error message for details. * * You can also create a session using the * <a href="http://www.tokbox.com/opentok/api/#session_id_production">OpenTok * REST API</a> or the <a href="https://dashboard.tokbox.com/projects">OpenTok * dashboard</a>. * * @param location (String) An IP address that the OpenTok servers will use to * situate the session in its global network. If you do not set a location hint, * the OpenTok servers will be based on the first client connecting to the session. * * @param mediaMode Whether the session will transmit streams using the * OpenTok Media Router (<code>MediaMode.ROUTED</code>) or not * (<code>MediaMode.RELAYED</code>). By default, the setting is * <code>MediaMode.RELAYED</code>. * <p> * With the <code>mediaMode</code> parameter set to <code>MediaMode.RELAYED</code>, the * session will attempt to transmit streams directly between clients. If clients cannot * connect due to firewall restrictions, the session uses the OpenTok TURN server to relay * streams. * <p> * The <a href="https://tokbox.com/opentok/tutorials/create-session/#media-mode" * target="_top">OpenTok Media Router</a> provides the following benefits: * * <ul> * <li>The OpenTok Media Router can decrease bandwidth usage in multiparty sessions. * (When the <code>mediaMode</code> parameter is set to * <code>MediaMode.ROUTED</code>, each client must send a separate audio-video stream * to each client subscribing to it.)</li> * <li>The OpenTok Media Router can improve the quality of the user experience through * <a href="https://tokbox.com/platform/fallback" target="_top">audio fallback and video * recovery</a>. With these features, if a client's connectivity degrades to a degree * that it does not support video for a stream it's subscribing to, the video is dropped * on that client (without affecting other clients), and the client receives audio only. * If the client's connectivity improves, the video returns.</li> * <li>The OpenTok Media Router supports the * <a href="http://tokbox.com/opentok/tutorials/archiving" target="_top">archiving</a> * feature, which lets you record, save, and retrieve OpenTok sessions.</li> * </ul> * * @param archiveMode Whether the session is automatically archived * (<code>ArchiveMode.ALWAYS</code>) or not (<code>ArchiveMode.MANUAL</code>). By default, * the setting is <code>ArchiveMode.MANUAL</code>, and you must call the * StartArchive() method of the OpenTok object to start archiving. To archive the session * (either automatically or not), you must set the mediaMode parameter to * <code>MediaMode.ROUTED</code>. * * @return A Session object representing the new session. The <code>Id</code> property of * the Session is the session ID, which uniquely identifies the session. You will use * this session ID in the client SDKs to identify the session. For example, when using the * OpenTok.js library, use the session ID when calling the * <a href="http://tokbox.com/opentok/libraries/client/js/reference/OT.html#initSession"> * OT.initSession()</a> method (to initialize an OpenTok session). */ public async Task <Session> CreateSession(string location = "", MediaMode mediaMode = MediaMode.RELAYED, ArchiveMode archiveMode = ArchiveMode.MANUAL) { if (!OpenTokUtils.TestIpAddress(location)) { throw new OpenTokArgumentException(string.Format("Location {0} is not a valid IP address", location)); } if (archiveMode == ArchiveMode.ALWAYS && mediaMode != MediaMode.ROUTED) { throw new OpenTokArgumentException("A session with always archive mode must also have the routed media mode."); } string preference = (mediaMode == MediaMode.RELAYED) ? "enabled" : "disabled"; var headers = new Dictionary <string, string> { { "Content-type", "application/x-www-form-urlencoded" } }; var data = new Dictionary <string, object> { { "location", location }, { "p2p.preference", preference }, { "archiveMode", archiveMode.ToString().ToLower() } }; var response = await Client.Post("session/create", headers, data); var xmlDoc = XDocument.Parse(response); if (!xmlDoc.Descendants("session_id").Any()) { throw new OpenTokWebException("Session could not be provided. Are ApiKey and ApiSecret correctly set?"); } var sessionId = xmlDoc.Descendants("session_id").First().Value; var apiKey = Convert.ToInt32(xmlDoc.Descendants("partner_id").First().Value); return(new Session(sessionId, apiKey, ApiSecret, location, mediaMode, archiveMode)); }