// Copyright 2025 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.diagnostics;

@discoverable(server="platform")
@available(added=HEAD)
open protocol LogFlusher {
    /// Flushes all pending logs through the logging pipeline
    /// to the serial port. Logs written to sockets prior to
    /// the call to Flush are guaranteed to be fully written
    /// to serial when this returns. Logs written to sockets
    /// after this call has been received by Archivist are
    /// not guaranteed to be flushed.
    /// Additionally, sockets must actually be connected to the Archivist
    /// before this call is made. If a socket hasn't been
    /// received by Archivist yet, those logs may be dropped.
    /// To ensure that logs are properly flushed, make sure
    /// to wait for the initial interest when logging.
    /// Important note: This may be called from the host,
    /// but host sockets will NOT be flushed by this method.
    /// If you write data from the host (not on the device,
    /// there is no guarantee that such logs will ever be printed).
    flexible WaitUntilFlushed() -> ();
};
