/// Represents a request to publish information to other clients.
abstract class PublishRequest {
  /// The ID of the client sending this request.
  String? get clientId;

  /// The name of the event to be sent.
  String? get eventName;

  /// The value to be published as an event.
  dynamic get value;

  /// Accept the request, with a response.
  void accept(PublishResponse response);

  /// Deny the request with an error message.
  void reject(String errorMessage);
}

/// A response to a publish request. Informs the caller of how much clients received the event.
class PublishResponse {
  /// The number of unique listeners to whom this event was propogated.
  final int listeners;

  /// The client ID returned the server. Significant in cases where an ad-hoc client was registered.
  final String? clientId;

  const PublishResponse(this.listeners, this.clientId);
}