public CasterSocket( IdleTimer idleTimer, IDtoMessageHandler messageHandler, IScreenCaster screenCastService, IRemoteControlAccessService remoteControlAccessService) { IdleTimer = idleTimer; MessageHandler = messageHandler; ScreenCaster = screenCastService; RemoteControlAccessService = remoteControlAccessService; }
private void ApplyConnectionHandlers() { // TODO: Remove circular dependencies and the need for static IServiceProvider instance // by emitting these events so other services can listen for them. var conductor = ServiceContainer.Instance.GetRequiredService <Conductor>(); Connection.Closed += (ex) => { Logger.Write($"Connection closed. Error: {ex?.Message}"); return(Task.CompletedTask); }; Connection.On("Disconnect", async(string reason) => { Logger.Write($"Disconnecting caster socket. Reason: {reason}"); await DisconnectAllViewers(); }); Connection.On("GetScreenCast", async( string viewerID, string requesterName, bool notifyUser, bool enforceAttendedAccess, bool useWebRtc, string organizationName) => { try { if (enforceAttendedAccess) { await SendMessageToViewer(viewerID, "Asking user for permission..."); IdleTimer.Stop(); var result = await RemoteControlAccessService.PromptForAccess(requesterName, organizationName); IdleTimer.Start(); if (!result) { await SendConnectionRequestDenied(viewerID); return; } } _ = Task.Run(() => { ScreenCaster.BeginScreenCasting(new ScreenCastRequest() { NotifyUser = notifyUser, ViewerID = viewerID, RequesterName = requesterName, UseWebRtc = useWebRtc }); }); } catch (Exception ex) { Logger.Write(ex); } }); Connection.On("ReceiveIceCandidate", (string candidate, int sdpMlineIndex, string sdpMid, string viewerID) => { try { if (conductor.Viewers.TryGetValue(viewerID, out var viewer)) { viewer.RtcSession.AddIceCandidate(sdpMid, sdpMlineIndex, candidate); } } catch (Exception ex) { Logger.Write(ex); } }); Connection.On("ReceiveRtcAnswer", async(string sdp, string viewerID) => { try { if (conductor.Viewers.TryGetValue(viewerID, out var viewer)) { await viewer.RtcSession.SetRemoteDescription("answer", sdp); } } catch (Exception ex) { Logger.Write(ex); } }); Connection.On("RequestScreenCast", (string viewerID, string requesterName, bool notifyUser, bool useWebRtc) => { conductor.InvokeScreenCastRequested(new ScreenCastRequest() { NotifyUser = notifyUser, ViewerID = viewerID, RequesterName = requesterName, UseWebRtc = useWebRtc }); }); Connection.On("SendDtoToClient", (byte[] baseDto, string viewerConnectionId) => { if (conductor.Viewers.TryGetValue(viewerConnectionId, out var viewer)) { MessageHandler.ParseMessage(viewer, baseDto); } }); Connection.On("SessionID", (string sessionID) => { conductor.InvokeSessionIDChanged(sessionID); }); Connection.On("ViewerDisconnected", async(string viewerID) => { await Connection.SendAsync("DisconnectViewer", viewerID, false); if (conductor.Viewers.TryGetValue(viewerID, out var viewer)) { viewer.DisconnectRequested = true; viewer.Dispose(); } conductor.InvokeViewerRemoved(viewerID); }); }