Example #1
0
        internal WebSocketConnection(WebSocketModule module, HttpListenerContext ctx)
        {
            WebSocketContext wctx = ctx.AcceptWebSocketAsync(null).Result;

            using (WebSocket ws = wctx.WebSocket)
            {
                this.socket = ws;
                this.isOpen = true;
                this.module = module;
                this.Join(module.MainChannel);
                module.RunConnectionCallback(new WebSocketMessageContext(new byte[] { }, this, module));

                WebSocketReceiveBuffer buffer = new WebSocketReceiveBuffer(null);
                while (ws.State == WebSocketState.Open)
                {
                    buffer.Clear();
                    this.socketResult = ws.ReceiveAsync(buffer.Data, CancellationToken.None).Result;
                    if (this.socketResult.MessageType == WebSocketMessageType.Close)
                    {
                        this.isOpen = false;
                        Task closing = ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
                        module.RunDisconnectionCallback(new WebSocketMessageContext(new byte[] { }, this, module));
                        closing.Wait();
                        break;
                    }
                    WebSocketMessageContext wsm = new WebSocketMessageContext(buffer, this, module);
                    switch (buffer.Type)
                    {
                    case WebSocketReceiveBuffer.MessageType.Numbered:
                        module.RunCallback(buffer.ID, wsm);
                        break;

                    case WebSocketReceiveBuffer.MessageType.Named:
                        module.RunCallback(buffer.Name, wsm);
                        break;

                    default:
                        throw new WebSocketException("The WebSocket message was not compliant with Alabaster WebSocket protocol.");
                    }
                }
            }
        }
Example #2
0
 internal WebSocketMessageContext(WebSocketReceiveBuffer dataBuffer, WebSocketConnection connection, WebSocketModule module)
 {
     this.Data       = dataBuffer.Data.ToArray();
     this.Connection = connection;
     this.Module     = module;
 }