///|
/// A change to the P-256 signature-public-key roster returned by an applied
/// MLS commit or Welcome.
pub(all) enum RosterChange {
  Upsert(user_id~ : UInt64, signature_key~ : Bytes)
  Remove(user_id~ : UInt64)
} derive(Debug, Eq)

///|
/// The protocol outcome of processing an MLS commit.
pub(all) enum CommitResult {
  Applied(changes~ : Array[RosterChange])
  Ignored
  Failed(failure~ : MlsFailure)
} derive(Debug, Eq)

///|
/// The protocol outcome of processing an MLS Welcome.
pub(all) enum WelcomeResult {
  Applied(changes~ : Array[RosterChange])
  Failed(failure~ : MlsFailure)
} derive(Debug, Eq)

///|
/// Why media-frame encryption failed.
pub(all) enum EncryptFailure {
  EncryptionFailure
  MissingKeyRatchet
  MissingCryptor
  TooManyAttempts
  Unknown(code~ : Int)
} derive(Debug, Eq)

///|
/// Why media-frame decryption failed.
pub(all) enum DecryptFailure {
  DecryptionFailure
  MissingKeyRatchet
  InvalidNonce
  MissingCryptor
  Unknown(code~ : Int)
} derive(Debug, Eq)

///|
/// The kind of media carried by a DAVE frame.
pub(all) enum MediaType {
  Audio
  Video
} derive(Debug, Eq)

///|
/// A codec supported by libdave's frame processors.
///
/// libdave's `Unknown` codec is deliberately omitted because it cannot safely
/// be used for encryption.
pub(all) enum Codec {
  Opus
  Vp8
  Vp9
  H264
  H265
  Av1
} derive(Debug, Eq)