private Task Send <T>(T message, Func <T, byte[]> createFrame) { if (Handler == null) { throw new InvalidOperationException("Cannot send before handshake"); } if (!IsAvailable) { const string errorMessage = "Data sent while closing or after close. Ignoring."; FleckLog.Warn(errorMessage); var taskForException = new TaskCompletionSource <object>(); taskForException.SetException(new ConnectionNotAvailableException(errorMessage)); return(taskForException.Task); } var bytes = createFrame(message); return(SendBytes(bytes)); }
private void OnClientConnect(ISocket clientSocket) { if (clientSocket == null) { return; // socket closed } FleckLog.Debug(String.Format("Client connected from {0}:{1}", clientSocket.RemoteIpAddress, clientSocket.RemotePort.ToString())); ListenForClients(); WebSocketConnection connection = null; connection = new WebSocketConnection( clientSocket, _config, bytes => RequestParser.Parse(bytes, _scheme), r => HandlerFactory.BuildHandler(r, s => connection.OnMessage(s), connection.Close, b => connection.OnBinary(b), b => connection.OnPing(b), b => connection.OnPong(b)), s => SubProtocolNegotiator.Negotiate(SupportedSubProtocols, s)); if (IsSecure) { FleckLog.Debug("Authenticating Secure Connection"); clientSocket .Authenticate(Certificate, EnabledSslProtocols, connection.StartReceiving, e => FleckLog.Warn("Failed to Authenticate", e)); } else { connection.StartReceiving(); } }