// 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.identity.tokens;

using fuchsia.auth;

/// `TokenManagerFactory` provides access to a global `TokenManager` on systems
/// that do not include an `AccountManager`.
///
/// On systems that do include `AccountManager`, that API should be used to
/// acquire a separate `TokenManager` instance for each system account.
[Discoverable]
protocol TokenManagerFactory {
    /// Connects a new `TokenManager` channel.
    ///
    /// + `ui_context_provider` An `AuthenticationContextProvider` capable of
    ///                         generating the `AuthenticationUiContext`
    ///                         channels used to display interactive
    ///                         authentication and authorization flows.
    /// + `token_manager` The server end of a `TokenManager` channel.
    // TODO(fxbug.dev/43298): Remove the dependency on AuthenticationContextProvider
    // once auth providers can acquire their UI resources through the session
    // framework. At this point we may be able to remove the TokenManagerFactory
    // protocol entirely and make the TokenManager protocol discoverable.
    GetTokenManager(fuchsia.auth.AuthenticationContextProvider
                    ui_context_provider, request<TokenManager> token_manager);
};
