blob: a9aa96ad45fb5da3e6e34e282bf76047cf62aeea [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_NETWORK_TRUST_TOKENS_PENDING_TRUST_TOKEN_STORE_H_
#define SERVICES_NETWORK_TRUST_TOKENS_PENDING_TRUST_TOKEN_STORE_H_
#include <memory>
#include "base/callback.h"
#include "base/containers/circular_deque.h"
#include "services/network/trust_tokens/trust_token_store.h"
namespace network {
// PendingTrustTokenStore provides an asynchronous interface with which to
// wrap operations against a TrustTokenStore that becomes ready at some point
// after the pending store's creation.
class PendingTrustTokenStore {
public:
PendingTrustTokenStore();
virtual ~PendingTrustTokenStore();
PendingTrustTokenStore(const PendingTrustTokenStore&) = delete;
PendingTrustTokenStore& operator=(const PendingTrustTokenStore&) = delete;
// Accepts a token store with which to execute operations previously (and
// subsequently) passed to |ExecuteOrEnqueue|. Call only once.
void OnStoreReady(std::unique_ptr<TrustTokenStore> store);
// Executes |fn| immediately if the store is available. Otherwise, defers the
// operation in FIFO order until the store finishes initializing and then
// immediately executes it.
void ExecuteOrEnqueue(base::OnceCallback<void(TrustTokenStore*)> fn);
private:
// Clears |queue_|, popping and executing its operations from front to back.
void ExecuteAll();
base::circular_deque<base::OnceCallback<void(TrustTokenStore*)>> queue_;
std::unique_ptr<TrustTokenStore> store_;
};
} // namespace network
#endif // SERVICES_NETWORK_TRUST_TOKENS_PENDING_TRUST_TOKEN_STORE_H_