// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.firebase.messaging;

/// Client protocol created for a messaging client. This client is registered
/// and connected.
protocol Client {
    /// Sends an upstream message to the service.
    Send(Message message) -> (Error? error);

    /// Tells FCM backend to send connectivity events for this instance back to
    /// the service. While FCM is always aware of connectivity events, the
    /// service handling this device will only be notified if the events are
    /// enabled and the service is signed up for them.
    NotifyConnectivityEvents(ConnectivityEvent events);

    // The following events will also be sent on this channel:

    /// Wait for next message. Returns immediately if a message is waiting to be
    /// consumed.
    NextMessage() -> (DownstreamMessage message);

    /// Blocks until an error is received. Returns exactly once for each error.
    /// This includes errors specific to this particular app and service-wide
    /// errors in the client multiplexer.
    WaitForError() -> (Error error);

    /// Returns on connection setup/reset. Connections are automatically
    /// restarted on internal errors (eg. missing heartbeat ack, unexpected
    /// login response). This call is just informational.
    WaitForConnectionReset() -> ();
};
