Пример #1
0
        public async Task InvokeAsync(HttpContext context)
        {
            _unitOfWork = context.RequestServices.GetRequiredService <IUnitOfWork>() as UnitOfWork;
            _config     = context.RequestServices.GetRequiredService <IConfiguration>();


            var token = context.Request.Query.Extract(Token);



            if (!context.WebSockets.IsWebSocketRequest)
            {
                await _next(context);

                return;
            }

            if (token == null)
            {
                await _next(context);

                return;
            }

            if (!Extensions.Extensions.AuthenticateJwt(token, _config))
            {
                await _next(context);

                return;
            }


            var roomId = Convert.ToInt32(token.GetIdentityFromToken(_config).ExtractRoomId());
            var userId = Convert.ToInt32(token.GetIdentityFromToken(_config).ExtractUserId());


            var socket = await context.WebSockets.AcceptWebSocketAsync();

            var id = _manager.AddSocket(socket);

            var dbSocket = new Socket
            {
                SocketId = id,
                UserId   = userId
            };
            await _unitOfWork.SocketRepository.AddSocketAsync(dbSocket);

            await _unitOfWork.CommitAsync();

            if (id != null)
            {
                if (socket.State == WebSocketState.Open)
                {
                    await socket.SendAsync(Encoding.UTF8.GetBytes(id), WebSocketMessageType.Text, true, CancellationToken.None);
                }
            }

            await Receive(socket, async (result, buffer) =>
            {
                switch (result.MessageType)
                {
                case WebSocketMessageType.Text:
                    await RouteJSONMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count), roomId, userId);
                    return;

                case WebSocketMessageType.Close:
                    var id = _manager.GetAll().FirstOrDefault(x => x.Value == socket).Key;
                    WebSocket sock;
                    _manager.GetAll().TryRemove(id, out sock);
                    await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);

                    return;
                }
            });
        }
Пример #2
0
 public virtual async Task <string> OnConnected(T socket)
 {
     return(WebSocketConnectionManager.AddSocket(socket));
 }