diff --git a/Janus/JanusSession.cs b/Janus/JanusSession.cs index 63d0dc1..56942e9 100644 --- a/Janus/JanusSession.cs +++ b/Janus/JanusSession.cs @@ -243,8 +243,9 @@ namespace WebRtcVoice }; _OutstandingRequests.Add(pReq.TransactionId, outReq); - HttpRequestMessage reqMsg = new HttpRequestMessage(HttpMethod.Post, pURI); string reqStr = pReq.ToJson(); + + HttpRequestMessage reqMsg = new HttpRequestMessage(HttpMethod.Post, pURI); reqMsg.Content = new StringContent(reqStr, System.Text.Encoding.UTF8, MediaTypeNames.Application.Json); reqMsg.Headers.Add("Accept", "application/json"); HttpResponseMessage response = await _HttpClient.SendAsync(reqMsg, _CancelTokenSource.Token); diff --git a/Janus/WebRtcJanusService.cs b/Janus/WebRtcJanusService.cs index 3ac115c..32a486c 100644 --- a/Janus/WebRtcJanusService.cs +++ b/Janus/WebRtcJanusService.cs @@ -177,7 +177,7 @@ namespace WebRtcVoice // This is the logic that takes the client's request and converts it into // operations on rooms in the audio bridge. // IWebRtcVoiceService.ProvisionVoiceAccountRequest - public async Task ProvisionVoiceAccountRequest(IVoiceViewerSession pSession, OSDMap pRequest, UUID pUserID, IScene pScene) + public async Task ProvisionVoiceAccountRequest(IVoiceViewerSession pSession, OSDMap pRequest, UUID pUserID, UUID pSceneID) { OSDMap ret = null; string errorMsg = null; @@ -226,7 +226,7 @@ namespace WebRtcVoice { // The client is sending an offer. Find the right room and join it. // _log.DebugFormat("{0} ProvisionVoiceAccountRequest: jsep type={1} sdp={2}", LogHeader, jsepType, jsepSdp); - viewerSession.Room = await viewerSession.AudioBridge.SelectRoom(pScene.RegionInfo.RegionID.ToString(), + viewerSession.Room = await viewerSession.AudioBridge.SelectRoom(pSceneID.ToString(), channel_type, isSpatial, parcel_local_id, channel_id); if (viewerSession.Room is null) { @@ -284,7 +284,7 @@ namespace WebRtcVoice } // IWebRtcVoiceService.VoiceAccountBalanceRequest - public async Task VoiceSignalingRequest(IVoiceViewerSession pSession, OSDMap pRequest, UUID pUserID, IScene pScene) + public async Task VoiceSignalingRequest(IVoiceViewerSession pSession, OSDMap pRequest, UUID pUserID, UUID pSceneID) { OSDMap ret = null; JanusViewerSession viewerSession = pSession as JanusViewerSession; @@ -340,26 +340,26 @@ namespace WebRtcVoice // This module should not be invoked with this signature // IWebRtcVoiceService.ProvisionVoiceAccountRequest - public Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, IScene pScene) + public Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, UUID pSceneID) { throw new NotImplementedException(); } // This module should not be invoked with this signature // IWebRtcVoiceService.VoiceSignalingRequest - public Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, IScene pScene) + public Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, UUID pSceneID) { throw new NotImplementedException(); } // The viewer session object holds all the connection information to Janus. // IWebRtcVoiceService.CreateViewerSession - public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, IScene pScene) + public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, UUID pSceneID) { return new JanusViewerSession(this) { AgentId = pUserID, - RegionId = pScene.RegionInfo.RegionID + RegionId = pSceneID }; } diff --git a/VERSION b/VERSION index 8fc77d0..524cb55 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.17 +1.1.1 diff --git a/WebRtcVoice/IWebRtcVoiceService.cs b/WebRtcVoice/IWebRtcVoiceService.cs index cf318c2..1720342 100644 --- a/WebRtcVoice/IWebRtcVoiceService.cs +++ b/WebRtcVoice/IWebRtcVoiceService.cs @@ -27,14 +27,14 @@ namespace WebRtcVoice // If there are problems, the returned map will contain an error message. // Initial calls to the voice server to get the user connected - public Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, IScene pScene); - public Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, IScene pScene); + public Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, UUID pScene); + public Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, UUID pScene); // Once connection state is looked up, the viewer session is passed in - public Task ProvisionVoiceAccountRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, IScene pScene); - public Task VoiceSignalingRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, IScene pScene); + public Task ProvisionVoiceAccountRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, UUID pScene); + public Task VoiceSignalingRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, UUID pScene); // Create a viewer session with all the variables needed for the underlying implementation - public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, IScene pScene); + public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, UUID pScene); } } diff --git a/WebRtcVoice/VoiceViewerSession.cs b/WebRtcVoice/VoiceViewerSession.cs index 5233fdc..32a5eb1 100644 --- a/WebRtcVoice/VoiceViewerSession.cs +++ b/WebRtcVoice/VoiceViewerSession.cs @@ -14,11 +14,29 @@ using System.Linq; using System.Collections.Generic; using OpenMetaverse; +using System.Threading.Tasks; namespace WebRtcVoice { - public static class VoiceViewerSession + public class VoiceViewerSession : IVoiceViewerSession { + + // A simple session structure that is used when the connection is actually in the + // remote service. + public VoiceViewerSession(IWebRtcVoiceService pVoiceService, UUID pRegionId, UUID pAgentId) + { + RegionId = pRegionId; + AgentId = pAgentId; + ViewerSessionID = UUID.Random().ToString(); + VoiceService = pVoiceService; + + } + public string ViewerSessionID { get; set; } + public IWebRtcVoiceService VoiceService { get ; set; } + public string VoiceServiceSessionId { get => throw new System.NotImplementedException(); set => throw new System.NotImplementedException(); } + public UUID RegionId { get ; set; } + public UUID AgentId { get ; set; } + // ===================================================================== // ViewerSessions hold the connection information for the client connection through to the voice service. // This collection is static and is simulator wide so there will be sessions for all regions and all clients. @@ -70,6 +88,26 @@ namespace WebRtcVoice } } + // Update a ViewSession from one ID to another. + // Remove the old session ID from the ViewerSessions collection, update the + // sessionID value in the IVoiceViewerSession, and add the session back to the + // collection. + // This is used in the kludge to synchronize a region's ViewerSessionID with the + // remote VoiceService's session ID. + public static void UpdateViewerSessionId(IVoiceViewerSession pSession, string pNewSessionId) + { + lock (ViewerSessions) + { + ViewerSessions.Remove(pSession.ViewerSessionID); + pSession.ViewerSessionID = pNewSessionId; + ViewerSessions[pSession.ViewerSessionID] = pSession; + } + } + + public Task Shutdown() + { + throw new System.NotImplementedException(); + } } } diff --git a/WebRtcVoice/WebRtcVoiceServerConnector.cs b/WebRtcVoice/WebRtcVoiceServerConnector.cs index d8e9e11..040ca88 100644 --- a/WebRtcVoice/WebRtcVoiceServerConnector.cs +++ b/WebRtcVoice/WebRtcVoiceServerConnector.cs @@ -75,7 +75,7 @@ namespace WebRtcVoice sharedModule.Initialise(pConfig); // Now that we have someone to handle the requests, we can set up the handlers - pServer.AddJsonRPCHandler("voice_provision_voice_account_request", Handle_ProvisionVoiceAccountRequest); + pServer.AddJsonRPCHandler("provision_voice_account_request", Handle_ProvisionVoiceAccountRequest); pServer.AddJsonRPCHandler("voice_signaling_request", Handle_VoiceSignalingRequest); } } @@ -83,28 +83,75 @@ namespace WebRtcVoice private bool Handle_ProvisionVoiceAccountRequest(OSDMap pJson, ref JsonRpcResponse pResponse) { + bool ret = false; m_log.DebugFormat("{0} Handle_ProvisionVoiceAccountRequest", LogHeader); if (m_MessageDetails) m_log.DebugFormat("{0} PVAR: req={1}", LogHeader, pJson.ToString()); - OSDMap resp = m_WebRtcVoiceService.ProvisionVoiceAccountRequest(pJson, UUID.Zero, null).Result; - pResponse = new JsonRpcResponse(); - pResponse.Result = resp; - if (m_MessageDetails) m_log.DebugFormat("{0} PVAR: resp={1}", LogHeader, resp.ToString()); + if (pJson.ContainsKey("params") && pJson["params"] is OSDMap paramsMap) + { + OSDMap request = paramsMap.ContainsKey("request") ? paramsMap["request"] as OSDMap : null; + UUID userID = paramsMap.ContainsKey("userID") ? paramsMap["userID"].AsUUID() : UUID.Zero; + UUID sceneID = paramsMap.ContainsKey("scene") ? paramsMap["scene"].AsUUID() : UUID.Zero; - return true; + try + { + if (m_WebRtcVoiceService is null) + { + m_log.ErrorFormat("{0} PVAR: no local service", LogHeader); + return false; + } + OSDMap resp = m_WebRtcVoiceService.ProvisionVoiceAccountRequest(request, userID, sceneID).Result; + + pResponse = new JsonRpcResponse(); + pResponse.Result = resp; + if (m_MessageDetails) m_log.DebugFormat("{0} PVAR: resp={1}", LogHeader, resp.ToString()); + ret = true; + } + catch (Exception e) + { + m_log.ErrorFormat("{0} PVAR: exception {1}", LogHeader, e); + } + } + else + { + m_log.ErrorFormat("{0} PVAR: missing parameters", LogHeader); + } + return ret; } private bool Handle_VoiceSignalingRequest(OSDMap pJson, ref JsonRpcResponse pResponse) { - m_log.DebugFormat("{0} Handle_VoiceSignalingRequest", LogHeader); - if (m_MessageDetails) m_log.DebugFormat("{0} VSR: req={1}", LogHeader, pJson.ToString()); + bool ret = false; + if (pJson.ContainsKey("params") && pJson["params"] is OSDMap paramsMap) + { + m_log.DebugFormat("{0} Handle_VoiceSignalingRequest", LogHeader); + if (m_MessageDetails) m_log.DebugFormat("{0} VSR: req={1}", LogHeader, paramsMap.ToString()); - OSDMap resp = m_WebRtcVoiceService.VoiceSignalingRequest(pJson, UUID.Zero, null).Result; - pResponse = new JsonRpcResponse(); - pResponse.Result = resp; - if (m_MessageDetails) m_log.DebugFormat("{0} VSR: resp={1}", LogHeader, resp.ToString()); + OSDMap request = paramsMap.ContainsKey("request") ? paramsMap["request"] as OSDMap : null; + UUID userID = paramsMap.ContainsKey("userID") ? paramsMap["userID"].AsUUID() : UUID.Zero; + UUID sceneID = paramsMap.ContainsKey("scene") ? paramsMap["scene"].AsUUID() : UUID.Zero; - return true; + try + { + OSDMap resp = m_WebRtcVoiceService.VoiceSignalingRequest(request, userID, sceneID).Result; + + pResponse = new JsonRpcResponse(); + pResponse.Result = resp; + if (m_MessageDetails) m_log.DebugFormat("{0} VSR: resp={1}", LogHeader, resp.ToString()); + + ret = true; + } + catch (Exception e) + { + m_log.ErrorFormat("{0} VSR: exception {1}", LogHeader, e); + } + } + else + { + m_log.ErrorFormat("{0} VSR: missing parameters", LogHeader); + } + + return ret; } } } diff --git a/WebRtcVoice/WebRtcVoiceServiceConnector.cs b/WebRtcVoice/WebRtcVoiceServiceConnector.cs index 81e4998..236231d 100644 --- a/WebRtcVoice/WebRtcVoiceServiceConnector.cs +++ b/WebRtcVoice/WebRtcVoiceServiceConnector.cs @@ -21,44 +21,183 @@ using OpenMetaverse.StructuredData; using log4net; using Nini.Config; +using OSHttpServer; namespace WebRtcVoice { - // Class that provides the local IWebRtcVoiceService interface to the XMLRPC Robust + // Class that provides the local IWebRtcVoiceService interface to the JsonRPC Robust // server. This is used by the region servers to talk to the Robust server. public class WebRtcVoiceServiceConnector : IWebRtcVoiceService { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly string LogHeader = "[WEBRTC VOICE SERVICE CONNECTOR]"; + private bool m_Enabled = false; + private bool m_MessageDetails = false; + private IConfigSource m_Config; - public WebRtcVoiceServiceConnector(IConfigSource config) + string m_serverURI = "http://localhost:8080"; + + public WebRtcVoiceServiceConnector(IConfigSource pConfig) { - // Nothing to do + m_Config = pConfig; + IConfig moduleConfig = m_Config.Configs["WebRtcVoice"]; + + if (moduleConfig is not null) + { + m_Enabled = moduleConfig.GetBoolean("Enabled", false); + if (m_Enabled) + { + m_serverURI = moduleConfig.GetString("WebRtcVoiceServerURI", string.Empty); + if (string.IsNullOrWhiteSpace(m_serverURI)) + { + m_log.ErrorFormat("{0} WebRtcVoiceServiceConnector enabled but no WebRtcVoiceServerURI specified", LogHeader); + m_Enabled = false; + } + else + { + m_log.InfoFormat("{0} WebRtcVoiceServiceConnector enabled", LogHeader); + } + + m_MessageDetails = moduleConfig.GetBoolean("MessageDetails", false); + } + } + } - public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, IScene pScene) + // Create a local viewer session. This gets a local viewer session ID that is + // later changed when the ProvisionVoiceAccountRequest response is returned + // so that the viewer session ID is the same here as from the WebRTC service. + public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, UUID pSceneID) { - throw new NotImplementedException(); + m_log.DebugFormat("{0} CreateViewerSession", LogHeader); + return new VoiceViewerSession(this, pUserID, pSceneID); } - public Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, IScene pScene) + public Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, UUID pSceneID) { - throw new NotImplementedException(); + m_log.DebugFormat("{0} ProvisionVoiceAccountRequest without ViewerSession. uID={1}, sID={2}", LogHeader, pUserID, pSceneID); + return null; } - public Task ProvisionVoiceAccountRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, IScene pScene) + // Received a ProvisionVoiceAccountRequest from a viewer. Forward it to the WebRTC service. + public async Task ProvisionVoiceAccountRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, UUID pSceneID) { - throw new NotImplementedException(); + m_log.DebugFormat("{0} VoiceSignalingRequest. uID={1}, sID={2}", LogHeader, pUserID, pSceneID); + OSDMap req = new OSDMap() + { + { "request", pRequest }, + { "userID", pUserID.ToString() }, + { "scene", pSceneID.ToString() } + }; + var resp = await JsonRpcRequest("provision_voice_account_request", m_serverURI, req); + + // Kludge to sync the viewer session number in our IVoiceViewerSession with the one from the WebRTC service. + if (resp.ContainsKey("viewer_session")) + { + string otherViewerSessionId = resp["viewer_session"].AsString(); + m_log.DebugFormat("{0} ProvisionVoiceAccountRequest: syncing viewSessionID. old={1}, new={2}", + LogHeader, pVSession.ViewerSessionID, otherViewerSessionId); + VoiceViewerSession.UpdateViewerSessionId(pVSession, otherViewerSessionId); + } + + return resp; } - public Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, IScene pScene) + public Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, UUID pSceneID) { - throw new NotImplementedException(); + m_log.DebugFormat("{0} VoiceSignalingRequest without ViewerSession. uID={1}, sID={2}", LogHeader, pUserID, pSceneID); + return null; } - public Task VoiceSignalingRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, IScene pScene) + public Task VoiceSignalingRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, UUID pSceneID) { - throw new NotImplementedException(); + m_log.DebugFormat("{0} VoiceSignalingRequest. uID={1}, sID={2}", LogHeader, pUserID, pSceneID); + OSDMap req = new OSDMap() + { + { "request", pRequest }, + { "userID", pUserID.ToString() }, + { "scene", pSceneID.ToString() } + }; + return JsonRpcRequest("voice_signaling_request", m_serverURI, req); } + + public Task JsonRpcRequest(string method, string uri, OSDMap pParams) + { + string jsonId = UUID.Random().ToString(); + + if(string.IsNullOrWhiteSpace(uri)) + return null; + + TaskCompletionSource tcs = new TaskCompletionSource(); + _ = Task.Run(() => + { + OSDMap request = new() + { + { "jsonrpc", OSD.FromString("2.0") }, + { "id", OSD.FromString(jsonId) }, + { "method", OSD.FromString(method) }, + { "params", pParams } + }; + + OSDMap outerResponse = null; + try + { + if (m_MessageDetails) m_log.DebugFormat("{0}: request: {1}", LogHeader, request); + outerResponse = WebUtil.PostToService(uri, request, 10000, true); + if (m_MessageDetails) m_log.DebugFormat("{0}: response: {1}", LogHeader, outerResponse); + } + catch (Exception e) + { + m_log.ErrorFormat("{0}: JsonRpc request '{1}' to {2} failed: {3}", LogHeader, method, uri, e); + m_log.DebugFormat("{0}: request: {1}", LogHeader, request); + tcs.SetResult(new OSDMap() + { + { "error", OSD.FromString(e.Message) } + }); + } + + OSD osdtmp; + if (!outerResponse.TryGetValue("_Result", out osdtmp) || (osdtmp is not OSDMap)) + { + string errm = String.Format("JsonRpc request '{0}' to {1} returned an invalid response: {2}", + method, uri, OSDParser.SerializeJsonString(outerResponse)); + m_log.ErrorFormat(errm); + tcs.SetResult(new OSDMap() + { + { "error", errm } + }); + } + + OSDMap response = osdtmp as OSDMap; + if (response.TryGetValue("error", out osdtmp)) + { + string errm = String.Format("JsonRpc request '{0}' to {1} returned an error: {2}", + method, uri, OSDParser.SerializeJsonString(osdtmp)); + m_log.ErrorFormat(errm); + tcs.SetResult(new OSDMap() + { + { "error", errm } + }); + } + + OSDMap resultmap = null; + if (!response.TryGetValue("result", out osdtmp) || (osdtmp is not OSDMap)) + { + string errm = String.Format("JsonRpc request '{0}' to {1} returned result as non-OSDMap: {2}", + method, uri, OSDParser.SerializeJsonString(outerResponse)); + m_log.ErrorFormat(errm); + tcs.SetResult(new OSDMap() + { + { "error", errm } + }); + } + resultmap = osdtmp as OSDMap; + + tcs.SetResult(resultmap); + }); + + return tcs.Task; + } + } } \ No newline at end of file diff --git a/WebRtcVoiceRegionModule/WebRtcVoiceRegionModule.cs b/WebRtcVoiceRegionModule/WebRtcVoiceRegionModule.cs index e42a631..d4b7fff 100644 --- a/WebRtcVoiceRegionModule/WebRtcVoiceRegionModule.cs +++ b/WebRtcVoiceRegionModule/WebRtcVoiceRegionModule.cs @@ -223,13 +223,10 @@ namespace WebRtcVoice { OSD tmp = OSDParser.DeserializeLLSDXml(inputStream); if (_MessageDetails) m_log.DebugFormat("{0}[ProvisionVoice]: Request: {1}", logHeader, tmp.ToString()); - - if (tmp is OSDMap) - { - map = (OSDMap)tmp; - } + map = tmp as OSDMap; } } + if (map is null) { m_log.ErrorFormat("{0}[ProvisionVoice]: No request data found. Agent={1}", logHeader, agentID.ToString()); @@ -258,7 +255,7 @@ namespace WebRtcVoice } // The checks passed. Send the request to the voice service. - OSDMap resp = voiceService.ProvisionVoiceAccountRequest(map, agentID, scene).Result; + OSDMap resp = voiceService.ProvisionVoiceAccountRequest(map, agentID, scene.RegionInfo.RegionID).Result; if (_MessageDetails) m_log.DebugFormat("{0}[ProvisionVoice]: response: {1}", logHeader, resp.ToString()); @@ -288,7 +285,7 @@ namespace WebRtcVoice if (inputStream.Length > 0) { OSD tmp = OSDParser.DeserializeLLSDXml(inputStream); - if (_MessageDetails) m_log.DebugFormat("{0}[VoiceSignaling]: Request: {1}", logHeader, tmp.ToString()); + if (_MessageDetails) m_log.DebugFormat("{0}[VoiceSignalingRequest]: Request: {1}", logHeader, tmp.ToString()); if (tmp is OSDMap) { @@ -298,7 +295,7 @@ namespace WebRtcVoice } if (map is null) { - m_log.ErrorFormat("{0}[VoiceSignaling]: No request data found. Agent={1}", logHeader, agentID.ToString()); + m_log.ErrorFormat("{0}[VoiceSignalingRequest]: No request data found. Agent={1}", logHeader, agentID.ToString()); response.StatusCode = (int)HttpStatusCode.NoContent; return; } @@ -321,9 +318,10 @@ namespace WebRtcVoice return; } - OSDMap resp = voiceService.VoiceSignalingRequest(map, agentID, scene).Result; + OSDMap resp = voiceService.VoiceSignalingRequest(map, agentID, scene.RegionInfo.RegionID).Result; + if (_MessageDetails) m_log.DebugFormat("{0}[VoiceSignalingRequest]: Response: {1}", logHeader, resp); - // TODO: check for erros and package the response + // TODO: check for errors and package the response response.StatusCode = (int)HttpStatusCode.OK; response.RawBuffer = Util.UTF8.GetBytes(""); diff --git a/WebRtcVoiceServiceModule/WebRtcVoiceServiceModule.cs b/WebRtcVoiceServiceModule/WebRtcVoiceServiceModule.cs index 06e97c7..a2247df 100644 --- a/WebRtcVoiceServiceModule/WebRtcVoiceServiceModule.cs +++ b/WebRtcVoiceServiceModule/WebRtcVoiceServiceModule.cs @@ -200,7 +200,7 @@ namespace WebRtcVoice // IWebRtcVoiceService // IWebRtcVoiceService.ProvisionVoiceAccountRequest - public async Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, IScene pScene) + public async Task ProvisionVoiceAccountRequest(OSDMap pRequest, UUID pUserID, UUID pSceneID) { OSDMap response = null; IVoiceViewerSession vSession = null; @@ -222,13 +222,13 @@ namespace WebRtcVoice if (channelType == "local") { // TODO: check if this userId is making a new session (case that user is reconnecting) - vSession = m_spatialVoiceService.CreateViewerSession(pRequest, pUserID, pScene); + vSession = m_spatialVoiceService.CreateViewerSession(pRequest, pUserID, pSceneID); VoiceViewerSession.AddViewerSession(vSession); } else { // TODO: check if this userId is making a new session (case that user is reconnecting) - vSession = m_nonSpatialVoiceService.CreateViewerSession(pRequest, pUserID, pScene); + vSession = m_nonSpatialVoiceService.CreateViewerSession(pRequest, pUserID, pSceneID); VoiceViewerSession.AddViewerSession(vSession); } } @@ -239,13 +239,13 @@ namespace WebRtcVoice } if (vSession is not null) { - response = await vSession.VoiceService.ProvisionVoiceAccountRequest(vSession, pRequest, pUserID, pScene); + response = await vSession.VoiceService.ProvisionVoiceAccountRequest(vSession, pRequest, pUserID, pSceneID); } return response; } // IWebRtcVoiceService.VoiceSignalingRequest - public async Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, IScene pScene) + public async Task VoiceSignalingRequest(OSDMap pRequest, UUID pUserID, UUID pSceneID) { OSDMap response = null; IVoiceViewerSession vSession = null; @@ -255,7 +255,7 @@ namespace WebRtcVoice string viewerSessionId = pRequest["viewer_session"].AsString(); if (VoiceViewerSession.TryGetViewerSession(viewerSessionId, out vSession)) { - response = await vSession.VoiceService.VoiceSignalingRequest(vSession, pRequest, pUserID, pScene); + response = await vSession.VoiceService.VoiceSignalingRequest(vSession, pRequest, pUserID, pSceneID); } else { @@ -270,18 +270,18 @@ namespace WebRtcVoice } // This module should never be called with this signature - public Task ProvisionVoiceAccountRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, IScene pScene) + public Task ProvisionVoiceAccountRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, UUID pSceneID) { throw new NotImplementedException(); } // This module should never be called with this signature - public Task VoiceSignalingRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, IScene pScene) + public Task VoiceSignalingRequest(IVoiceViewerSession pVSession, OSDMap pRequest, UUID pUserID, UUID pSceneID) { throw new NotImplementedException(); } - public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, IScene pScene) + public IVoiceViewerSession CreateViewerSession(OSDMap pRequest, UUID pUserID, UUID pSceneID) { throw new NotImplementedException(); }