Пример #1
0
        public async Task InitializeWebRtc()
        {
            try
            {
                var iceServers = await CasterSocket.GetIceServers();

                RtcSession = WebRtcSessionFactory.GetNewSession(this);

                if (RtcSession is null)
                {
                    return;
                }

                RtcSession.LocalSdpReady += async(sender, sdp) =>
                {
                    await CasterSocket.SendRtcOfferToBrowser(sdp.Content, ViewerConnectionID, iceServers);
                };
                RtcSession.IceCandidateReady += async(sender, candidate) =>
                {
                    await CasterSocket.SendIceCandidateToBrowser(candidate.Content, candidate.SdpMlineIndex, candidate.SdpMid, ViewerConnectionID);
                };

                await RtcSession.Init(iceServers);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
        }
Пример #2
0
        public async Task SendCursorChange(CursorInfo cursorInfo)
        {
            var dto = new CursorChangeDto(cursorInfo.ImageBytes, cursorInfo.HotSpot.X, cursorInfo.HotSpot.Y, cursorInfo.CssOverride);

            await SendToViewer(() => RtcSession.SendDto(dto),
                               () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
        }
Пример #3
0
        public async Task <IActionResult> OnGetAsync(Guid?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            Session = await _context.RtcSessions
                      .Include(session => session.Creator)
                      .FirstOrDefaultAsync(m => m.Id == id);

            if (Session == null)
            {
                return(NotFound());
            }

            var user = await _userManager.GetUserAsync(User);

            // get active invite
            ActiveInvite = await _inviteService.GetActiveAsync(Session.Id, user.Id);

            // get all grants (members)
            Grants = await _context.RtcSessionGrants
                     .OrderByDescending(grant => grant.CreationTime)
                     .Where(grant => grant.Session.Id == Session.Id)
                     .Include(grant => grant.User)
                     .ToListAsync();

            Joined = Grants.Any(grant => grant.User == user);

            return(Page());
        }
Пример #4
0
        public async Task SendScreenCapture(byte[] encodedImageBytes, int left, int top, int width, int height)
        {
            PendingSentFrames.Enqueue(DateTimeOffset.Now);

            for (var i = 0; i < encodedImageBytes.Length; i += 50_000)
            {
                var dto = new CaptureFrameDto()
                {
                    Left         = left,
                    Top          = top,
                    Width        = width,
                    Height       = height,
                    EndOfFrame   = false,
                    ImageBytes   = encodedImageBytes.Skip(i).Take(50_000).ToArray(),
                    ImageQuality = imageQuality
                };

                await SendToViewer(() => RtcSession.SendDto(dto),
                                   () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
            }

            var endOfFrameDto = new CaptureFrameDto()
            {
                Left         = left,
                Top          = top,
                Width        = width,
                Height       = height,
                EndOfFrame   = true,
                ImageQuality = imageQuality
            };

            await SendToViewer(() => RtcSession.SendDto(endOfFrameDto),
                               () => CasterSocket.SendDtoToViewer(endOfFrameDto, ViewerConnectionID));
        }
Пример #5
0
        public async Task SendClipboardText(string clipboardText)
        {
            var dto = new ClipboardTextDto(clipboardText);

            await SendToViewer(() => RtcSession.SendDto(dto),
                               () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
        }
Пример #6
0
        public async Task SendMachineName(string machineName)
        {
            var dto = new MachineNameDto(machineName);

            await SendToViewer(() => RtcSession.SendDto(dto),
                               () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
        }
Пример #7
0
        public async Task <IActionResult> OnPostAsync(Guid?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            var user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                return(Unauthorized());
            }

            Session = await _context.RtcSessions.FindAsync(id);

            if (Session == null)
            {
                return(NotFound());
            }

            if (Session.Creator != user)
            {
                return(Unauthorized());
            }

            Session.Deleted = true;
            await _context.SaveChangesAsync();

            return(RedirectToPage("./Index"));
        }
Пример #8
0
        public async Task <IActionResult> OnGetAsync(Guid?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            var user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                return(Unauthorized());
            }

            Session = await _context.RtcSessions.FirstOrDefaultAsync(m => m.Id == id);

            if (Session == null)
            {
                return(NotFound());
            }

            if (Session.Creator != user)
            {
                return(Unauthorized());
            }

            return(Page());
        }
Пример #9
0
        public async Task SendScreenSize(int width, int height)
        {
            var dto = new ScreenSizeDto(width, height);

            await SendToViewer(() => RtcSession.SendDto(dto),
                               () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
        }
Пример #10
0
        public async Task SendAudioSample(byte[] audioSample)
        {
            var dto = new AudioSampleDto(audioSample);

            await SendToViewer(() => RtcSession.SendDto(dto),
                               () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
        }
Пример #11
0
        public async Task SendScreenData(string selectedScreen, string[] displayNames)
        {
            var dto = new ScreenDataDto(selectedScreen, displayNames);

            await SendToViewer(() => RtcSession.SendDto(dto),
                               () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
        }
Пример #12
0
        public async Task SendFile(FileUpload fileUpload, Action <double> progressUpdateCallback)
        {
            try
            {
                var messageId = Guid.NewGuid().ToString();
                var fileDto   = new FileDto()
                {
                    EndOfFile   = false,
                    FileName    = fileUpload.DisplayName,
                    MessageId   = messageId,
                    StartOfFile = true
                };

                await SendToViewer(() => RtcSession.SendDto(fileDto),
                                   () => CasterSocket.SendDtoToViewer(fileDto, ViewerConnectionID));

                using var fs = File.OpenRead(fileUpload.FilePath);
                using var br = new BinaryReader(fs);
                while (fs.Position < fs.Length)
                {
                    fileDto = new FileDto()
                    {
                        Buffer    = br.ReadBytes(50_000),
                        FileName  = fileUpload.DisplayName,
                        MessageId = messageId
                    };

                    await SendToViewer(async() =>
                    {
                        await RtcSession.SendDto(fileDto);
                        //await TaskHelper.DelayUntilAsync(() => RtcSession.CurrentBuffer > 0, TimeSpan.FromSeconds(1), 100);
                        await TaskHelper.DelayUntilAsync(() => RtcSession.CurrentBuffer == 0, TimeSpan.MaxValue, 100);
                    },
                                       async() =>
                    {
                        await CasterSocket.SendDtoToViewer(fileDto, ViewerConnectionID);
                    });

                    progressUpdateCallback((double)fs.Position / fs.Length);
                }

                fileDto = new FileDto()
                {
                    EndOfFile   = true,
                    FileName    = fileUpload.DisplayName,
                    MessageId   = messageId,
                    StartOfFile = false
                };

                await SendToViewer(() => RtcSession.SendDto(fileDto),
                                   () => CasterSocket.SendDtoToViewer(fileDto, ViewerConnectionID));

                progressUpdateCallback(1);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
        }
Пример #13
0
 public async Task SendWindowsSessions()
 {
     if (EnvironmentHelper.IsWindows)
     {
         await SendToViewer(() => RtcSession.SendWindowsSessions(Win32Interop.GetActiveSessions()),
                            () => CasterSocket.SendWindowsSessions(Win32Interop.GetActiveSessions(), ViewerConnectionID));
     }
 }
Пример #14
0
        public async Task SendScreenCapture(IEnumerable <CaptureFrame> screenFrame)
        {
            PendingSentFrames.Enqueue(DateTimeOffset.Now);

            foreach (var frame in screenFrame)
            {
                var left   = frame.Left;
                var top    = frame.Top;
                var width  = frame.Width;
                var height = frame.Height;

                for (var i = 0; i < frame.EncodedImageBytes.Length; i += 50_000)
                {
                    var dto = new CaptureFrameDto()
                    {
                        Left         = left,
                        Top          = top,
                        Width        = width,
                        Height       = height,
                        EndOfFrame   = false,
                        ImageBytes   = frame.EncodedImageBytes.Skip(i).Take(50_000).ToArray(),
                        ImageQuality = _imageQuality,
                        EndOfCapture = false
                    };

                    await SendToViewer(() => RtcSession.SendDto(dto),
                                       () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
                }

                var endOfFrameDto = new CaptureFrameDto()
                {
                    Left         = left,
                    Top          = top,
                    Width        = width,
                    Height       = height,
                    EndOfFrame   = true,
                    ImageQuality = _imageQuality,
                    EndOfCapture = false
                };

                await SendToViewer(() => RtcSession.SendDto(endOfFrameDto),
                                   () => CasterSocket.SendDtoToViewer(endOfFrameDto, ViewerConnectionID));
            }

            var endofCaptureDto = new CaptureFrameDto()
            {
                Left         = 0,
                Top          = 0,
                Width        = 0,
                Height       = 0,
                EndOfFrame   = true,
                ImageQuality = _imageQuality,
                EndOfCapture = true
            };

            await SendToViewer(() => RtcSession.SendDto(endofCaptureDto),
                               () => CasterSocket.SendDtoToViewer(endofCaptureDto, ViewerConnectionID));
        }
Пример #15
0
 public async Task SendWindowsSessions()
 {
     if (EnvironmentHelper.IsWindows)
     {
         var dto = new WindowsSessionsDto(Win32Interop.GetActiveSessions());
         await SendToViewer(() => RtcSession.SendDto(dto),
                            () => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
     }
 }
Пример #16
0
        public async Task SendScreenCapture(byte[] encodedImageBytes, int left, int top, int width, int height)
        {
            PendingSentFrames.Enqueue(DateTimeOffset.Now);

            await SendToViewer(() =>
            {
                RtcSession.SendCaptureFrame(left, top, width, height, encodedImageBytes, ImageQuality);
            }, async() =>
            {
                await CasterSocket.SendScreenCapture(encodedImageBytes, ViewerConnectionID, left, top, width, height, ImageQuality);
            });
        }
Пример #17
0
 public async Task SendScreenCapture(byte[] encodedImageBytes, int left, int top, int width, int height)
 {
     await SendToViewer(() =>
     {
         RtcSession.SendCaptureFrame(left, top, width, height, encodedImageBytes, ImageQuality);
         WebSocketBuffer = 0;
     }, async() =>
     {
         await CasterSocket.SendScreenCapture(encodedImageBytes, ViewerConnectionID, left, top, width, height, ImageQuality);
         WebSocketBuffer += encodedImageBytes.Length;
     });
 }
Пример #18
0
        public async Task Create(RtcSession session, ApplicationUser user)
        {
            if (await Exists(session.Id, user.Id)) // TODO: should be restricted by database
            {
                return;
            }

            await _context.RtcSessionGrants.AddAsync(new RtcSessionGrant
            {
                CreationTime = DateTime.Now,
                Session      = session,
                User         = user
            });

            await _context.SaveChangesAsync();
        }
Пример #19
0
        public async Task <uint> CreateAsync(RtcSession session, ApplicationUser creator, uint expires)
        {
            var recent = await GetActiveAsync(session.Id, creator.Id);

            if (recent != null)
            {
                recent.Disabled = true;
            }

            var inviteId = GenerateInviteId();
            await _context.AddAsync(new RtcSessionInvite
            {
                Creator  = creator,
                Disabled = false,
                Expires  = DateTime.Now.AddMinutes(expires),
                Id       = inviteId,
                Session  = session
            });

            await _context.SaveChangesAsync();

            return(inviteId);
        }
Пример #20
0
 public async Task SendScreenData(string selectedScreen, string[] displayNames)
 {
     await SendToViewer(() => RtcSession.SendScreenData(selectedScreen, displayNames),
                        () => CasterSocket.SendScreenData(selectedScreen, displayNames, ViewerConnectionID));
 }
Пример #21
0
 public async Task SendMachineName(string machineName)
 {
     await SendToViewer(() => RtcSession.SendMachineName(machineName),
                        () => CasterSocket.SendMachineName(machineName, ViewerConnectionID));
 }
Пример #22
0
 public async Task SendCursorChange(CursorInfo cursorInfo)
 {
     await SendToViewer(() => RtcSession.SendCursorChange(cursorInfo),
                        () => CasterSocket.SendCursorChange(cursorInfo, ViewerConnectionID));
 }
Пример #23
0
 public async Task SendClipboardText(string clipboardText)
 {
     await SendToViewer(() => RtcSession.SendClipboardText(clipboardText),
                        () => CasterSocket.SendClipboardText(clipboardText, ViewerConnectionID));
 }
Пример #24
0
 public async Task SendAudioSample(byte[] audioSample)
 {
     await SendToViewer(() => RtcSession.SendAudioSample(audioSample),
                        () => CasterSocket.SendAudioSample(audioSample, ViewerConnectionID));
 }
Пример #25
0
 public void Dispose()
 {
     EncoderParams?.Dispose();
     RtcSession?.Dispose();
 }
Пример #26
0
 public void ToggleWebRtcVideo(bool toggleOn)
 {
     RtcSession.ToggleWebRtcVideo(toggleOn);
 }
Пример #27
0
 public async Task SendScreenSize(int width, int height, string viewerID)
 {
     await SendToViewer(() => RtcSession.SendScreenSize(width, height),
                        () => CasterSocket.SendScreenSize(width, height, viewerID));
 }
Пример #28
0
 public async Task SendScreenSize(int width, int height)
 {
     await SendToViewer(() => RtcSession.SendScreenSize(width, height),
                        () => CasterSocket.SendScreenSize(width, height, ViewerConnectionID));
 }
Пример #29
0
 public void Dispose()
 {
     RtcSession?.Dispose();
     Capturer?.Dispose();
 }
Пример #30
0
 public void Dispose()
 {
     RtcSession?.Dispose();
 }