/** * The Authenticator interface provides methods for authenticating a user over an established protocol connection. */ interface Authenticator { /** * Authenticate a user identified by the given [username] and whose authenticity is confirmed by the given [key]. * The authentication protocol can read and write data within the underlying connection using [readFun] and * [writeFun]. * * @param username The name the user goes by. * @param key The confirmation of the user's identity and authenticity. It could be any public, private, or derived * (e.g. mixed with something else or hashed) datum, possibly shared between the server and the client, such as a * UTF-8-encoded password or a raw public key. * @param readFun A function to read incoming data from the underlying connection. * @param writeFun A function to write outgoing data into the underlying connection. * @throws except.FailedAuthenticationException if the authentication could not be performed. A human-readable * reason for the failure can be provided if necessary. */ fun authenticate(username: String, key: List, readFun: () -> List, writeFun: (b: List) -> Unit) }