private async Task HandleClientImageRequest(OperationHandlerContext ctx, CancellationToken cancellationToken)
        {
            var request = ((ImageTaskRequest)ctx.Message).Payload;
            var image   = await Socket.ReceiveStreamAsync(cancellationToken);

            var task = _taskFactory.Create(image);

            void Callback(object sender, BaseTaskState arg)
            {
                if (!((BaseTask)sender).IsCompleted)
                {
                    return;
                }

                var _ = SendTaskUpdateAsync(task, cancellationToken);
            }

            task.DetectionTask.OnStateChanged += Callback;
            task.OnStateChanged += Callback;

            var _ = _taskRunner.RunTaskAsync(task, cancellationToken);
        }
 private async Task HandleClientHeartbeat(OperationHandlerContext ctx, CancellationToken cancellationToken)
 {
     await Socket.SendObjectAsync(new Heartbeat(SessionId), cancellationToken);
 }
 private Task HandleClientHandshake(OperationHandlerContext ctx, CancellationToken cancellationToken)
 {
     return(Task.FromException(new WebSocketControllerException(4405, "Server-only Operations")));
 }
 private Task HandleCloseSession(OperationHandlerContext ctx, CancellationToken cancellationToken)
 {
     return(Task.FromException(new WebSocketControllerException(4200, "Closure Requested by Client")));
 }