// Path: src/main/java/org/webbitserver/EventSourceConnection.java
// public interface EventSourceConnection extends HttpConnection {
//     EventSourceConnection send(EventSourceMessage message);
// 
//     // Override methods to provide more specific return type.
// 
//     @Override
//     EventSourceConnection close();
// 
//     @Override
//     EventSourceConnection data(String key, Object value);
// }
// 
// Path: src/main/java/org/webbitserver/HttpRequest.java
// public interface HttpRequest extends DataHolder {
// 
//     public String COOKIE_HEADER = "Cookie";
// 
//     String uri();
// 
//     /**
//      * Modify uri
//      *
//      * @param uri new uri
//      */
//     HttpRequest uri(String uri);
// 
//     /**
//      * Retrieve the value single HTTP header.
//      * <p/>
//      * If the header is not found, null is returned.
//      * <p/>
//      * If there are multiple headers with the same name, it will return one of them, but it is not
//      * defined which one. Instead, use {@link #headers(String)}.
//      */
//     String header(String name);
// 
//     /**
//      * Retrieve all values for an HTTP header. If no values are found, an empty List is returned.
//      */
//     List<String> headers(String name);
// 
//     /**
//      * Whether a specific HTTP header was present in the request.
//      */
//     boolean hasHeader(String name);
// 
//     /**
//      * @return all inbound cookies
//      */
//     List<HttpCookie> cookies();
// 
//     /**
//      * Get a cookie with a specific name
//      *
//      * @param name cookie name
//      * @return cookie with that name
//      */
//     HttpCookie cookie(String name);
// 
//     /**
//      * Get query parameter value.
//      *
//      * @param key parameter name
//      * @return the value of the parameter
//      * @see #queryParams(String)
//      */
//     String queryParam(String key);
// 
//     /**
//      * Get all query parameter values.
//      *
//      * @param key parameter name
//      * @return the values of the parameter
//      * @see #queryParam(String)
//      */
//     List<String> queryParams(String key);
// 
//     /**
//      * List all query parameter keys.
//      *
//      * @see #queryParam(String)
//      */
//     Set<String> queryParamKeys();
// 
//     /**
//      * Get post parameter value.
//      *
//      * @param key parameter name
//      * @return the value of the parameter
//      * @see #postParams(String)
//      */
//     String postParam(String key);
// 
//     /**
//      * Get all post parameter values.
//      *
//      * @param key parameter name
//      * @return the values of the parameter
//      * @see #postParam(String)
//      */
//     List<String> postParams(String key);
// 
//     /**
//      * List all post parameter keys.
//      *
//      * @see #postParam(String)
//      */
//     Set<String> postParamKeys();
// 
//     /**
//      * Get the value of named cookie
//      *
//      * @param name cookie name
//      * @return cookie value, or null if the cookie does not exist.
//      */
//     String cookieValue(String name);
// 
//     /**
//      * Returns all headers sent from client.
//      */
//     List<Map.Entry<String, String>> allHeaders();
// 
//     /**
//      * HTTP method (e.g. "GET" or "POST")
//      */
//     String method();
// 
//     /**
//      * The body
//      */
//     String body();
// 
//     /**
//      * The body's byte array
//      */
//     byte[] bodyAsBytes();
// 
//     @Override
//     HttpRequest data(String key, Object value); // Override DataHolder to provide more specific return type.
// 
//     /**
//      * Remote address of connection (i.e. the host of the client).
//      */
//     SocketAddress remoteAddress();
// 
//     /**
//      * A unique identifier for this request. This should be treated as an opaque object,
//      * that can be used to track the lifecycle of a request.
//      */
//     Object id();
// 
//     /**
//      * Timestamp (millis since epoch) of when this request was first received by the server.
//      */
//     long timestamp();
// }
// 
// Path: src/main/java/org/webbitserver/WebSocketConnection.java
// public interface WebSocketConnection extends HttpConnection {
// 
//     /**
//      * Sends a text frame
//      *
//      * @param message frame payload
//      * @return this
//      */
//     WebSocketConnection send(String message);
// 
//     /**
//      * Sends a binary frame
//      *
//      * @param message frame payload
//      * @return this
//      */
//     WebSocketConnection send(byte[] message);
// 
//     /**
//      * Sends a binary frame
//      *
//      * @param message frame payload
//      * @param offset  The offset within the array of the first byte to be written; must be non-negative and no larger than <code>message.length</code>
//      * @param length  The maximum number of bytes to be written to the given array; must be non-negative and no larger than <code>message.length - offset</code>
//      * @return this
//      */
//     WebSocketConnection send(byte[] message, int offset, int length);
// 
//     /**
//      * Sends a ping frame
//      *
//      * @param message the payload of the ping
//      * @return this
//      */
//     WebSocketConnection ping(byte[] message);
// 
//     /**
//      * Sends a pong frame
//      *
//      * @param message the payload of the ping
//      * @return this
//      */
//     WebSocketConnection pong(byte[] message);
// 
//     /**
//      * @return the WebSocket protocol version
//      */
//     String version();
// 
//     // Override methods to provide more specific return type.
// 
//     @Override
//     WebSocketConnection close();
// 
//     @Override
//     WebSocketConnection data(String key, Object value);
// }


import org.webbitserver.EventSourceConnection;
import org.webbitserver.HttpRequest;
import org.webbitserver.WebSocketConnection;
package org.webbitserver.handler.logging;


public interface LogSink {

    void httpStart(HttpRequest request);

    void httpEnd(HttpRequest request);

    void webSocketConnectionOpen(WebSocketConnection connection);

    void webSocketConnectionClose(WebSocketConnection connection);

    void webSocketInboundData(WebSocketConnection connection, String data);

    void webSocketInboundData(WebSocketConnection connection, byte[] message);

    void webSocketInboundPing(WebSocketConnection connection, byte[] msg);

    void webSocketInboundPong(WebSocketConnection connection, byte[] msg);

    void webSocketOutboundData(WebSocketConnection connection, String data);

// Path: src/main/java/org/webbitserver/EventSourceConnection.java
// public interface EventSourceConnection extends HttpConnection {
//     EventSourceConnection send(EventSourceMessage message);
// 
//     // Override methods to provide more specific return type.
// 
//     @Override
//     EventSourceConnection close();
// 
//     @Override
//     EventSourceConnection data(String key, Object value);
// }
// 
// Path: src/main/java/org/webbitserver/HttpRequest.java
// public interface HttpRequest extends DataHolder {
// 
//     public String COOKIE_HEADER = "Cookie";
// 
//     String uri();
// 
//     /**
//      * Modify uri
//      *
//      * @param uri new uri
//      */
//     HttpRequest uri(String uri);
// 
//     /**
//      * Retrieve the value single HTTP header.
//      * <p/>
//      * If the header is not found, null is returned.
//      * <p/>
//      * If there are multiple headers with the same name, it will return one of them, but it is not
//      * defined which one. Instead, use {@link #headers(String)}.
//      */
//     String header(String name);
// 
//     /**
//      * Retrieve all values for an HTTP header. If no values are found, an empty List is returned.
//      */
//     List<String> headers(String name);
// 
//     /**
//      * Whether a specific HTTP header was present in the request.
//      */
//     boolean hasHeader(String name);
// 
//     /**
//      * @return all inbound cookies
//      */
//     List<HttpCookie> cookies();
// 
//     /**
//      * Get a cookie with a specific name
//      *
//      * @param name cookie name
//      * @return cookie with that name
//      */
//     HttpCookie cookie(String name);
// 
//     /**
//      * Get query parameter value.
//      *
//      * @param key parameter name
//      * @return the value of the parameter
//      * @see #queryParams(String)
//      */
//     String queryParam(String key);
// 
//     /**
//      * Get all query parameter values.
//      *
//      * @param key parameter name
//      * @return the values of the parameter
//      * @see #queryParam(String)
//      */
//     List<String> queryParams(String key);
// 
//     /**
//      * List all query parameter keys.
//      *
//      * @see #queryParam(String)
//      */
//     Set<String> queryParamKeys();
// 
//     /**
//      * Get post parameter value.
//      *
//      * @param key parameter name
//      * @return the value of the parameter
//      * @see #postParams(String)
//      */
//     String postParam(String key);
// 
//     /**
//      * Get all post parameter values.
//      *
//      * @param key parameter name
//      * @return the values of the parameter
//      * @see #postParam(String)
//      */
//     List<String> postParams(String key);
// 
//     /**
//      * List all post parameter keys.
//      *
//      * @see #postParam(String)
//      */
//     Set<String> postParamKeys();
// 
//     /**
//      * Get the value of named cookie
//      *
//      * @param name cookie name
//      * @return cookie value, or null if the cookie does not exist.
//      */
//     String cookieValue(String name);
// 
//     /**
//      * Returns all headers sent from client.
//      */
//     List<Map.Entry<String, String>> allHeaders();
// 
//     /**
//      * HTTP method (e.g. "GET" or "POST")
//      */
//     String method();
// 
//     /**
//      * The body
//      */
//     String body();
// 
//     /**
//      * The body's byte array
//      */
//     byte[] bodyAsBytes();
// 
//     @Override
//     HttpRequest data(String key, Object value); // Override DataHolder to provide more specific return type.
// 
//     /**
//      * Remote address of connection (i.e. the host of the client).
//      */
//     SocketAddress remoteAddress();
// 
//     /**
//      * A unique identifier for this request. This should be treated as an opaque object,
//      * that can be used to track the lifecycle of a request.
//      */
//     Object id();
// 
//     /**
//      * Timestamp (millis since epoch) of when this request was first received by the server.
//      */
//     long timestamp();
// }
// 
// Path: src/main/java/org/webbitserver/WebSocketConnection.java
// public interface WebSocketConnection extends HttpConnection {
// 
//     /**
//      * Sends a text frame
//      *
//      * @param message frame payload
//      * @return this
//      */
//     WebSocketConnection send(String message);
// 
//     /**
//      * Sends a binary frame
//      *
//      * @param message frame payload
//      * @return this
//      */
//     WebSocketConnection send(byte[] message);
// 
//     /**
//      * Sends a binary frame
//      *
//      * @param message frame payload
//      * @param offset  The offset within the array of the first byte to be written; must be non-negative and no larger than <code>message.length</code>
//      * @param length  The maximum number of bytes to be written to the given array; must be non-negative and no larger than <code>message.length - offset</code>
//      * @return this
//      */
//     WebSocketConnection send(byte[] message, int offset, int length);
// 
//     /**
//      * Sends a ping frame
//      *
//      * @param message the payload of the ping
//      * @return this
//      */
//     WebSocketConnection ping(byte[] message);
// 
//     /**
//      * Sends a pong frame
//      *
//      * @param message the payload of the ping
//      * @return this
//      */
//     WebSocketConnection pong(byte[] message);
// 
//     /**
//      * @return the WebSocket protocol version
//      */
//     String version();
// 
//     // Override methods to provide more specific return type.
// 
//     @Override
//     WebSocketConnection close();
// 
//     @Override
//     WebSocketConnection data(String key, Object value);
// }


// Path: src/main/java/org/webbitserver/handler/logging/LogSink.java
import org.webbitserver.EventSourceConnection;
import org.webbitserver.HttpRequest;
import org.webbitserver.WebSocketConnection;

package org.webbitserver.handler.logging;


public interface LogSink {

    void httpStart(HttpRequest request);

    void httpEnd(HttpRequest request);

    void webSocketConnectionOpen(WebSocketConnection connection);

    void webSocketConnectionClose(WebSocketConnection connection);

    void webSocketInboundData(WebSocketConnection connection, String data);

    void webSocketInboundData(WebSocketConnection connection, byte[] message);

    void webSocketInboundPing(WebSocketConnection connection, byte[] msg);

    void webSocketInboundPong(WebSocketConnection connection, byte[] msg);

    void webSocketOutboundData(WebSocketConnection connection, String data);

    void webSocketOutboundData(WebSocketConnection connection, byte[] data);