// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_INTEREST_GROUP_TRUSTED_SIGNALS_CACHE_IMPL_H_ #define CONTENT_BROWSER_INTEREST_GROUP_TRUSTED_SIGNALS_CACHE_IMPL_H_ #include <map> #include <memory> #include <optional> #include <set> #include <string> #include "base/functional/callback_forward.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/types/optional_ref.h" #include "base/unguessable_token.h" #include "base/values.h" #include "content/browser/interest_group/trusted_signals_fetcher.h" #include "content/common/content_export.h" #include "content/services/auction_worklet/public/mojom/trusted_signals_cache.mojom.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom-forward.h" #include "url/gurl.h" #include "url/origin.h" namespace content { struct BiddingAndAuctionServerKey; // Handles caching (not yet implemented) and dispatching of trusted bidding and // scoring signals requests. Only handles requests to Trusted Execution // Environments (TEEs), i.e., versions 2+ of the protocol, so does not handle // legacy bring-your-own-server (BYOS) requests. The browser process makes a // request and gets a Handle and a partition ID, which can then be used to fetch // the response through the Mojo auction_worklet::mojom::TrustedSignalsCache // API provided by the Cache. The Handle and partition ID are provided // immediately on invocation, but the network request may not be sent out // immediately. // // The values it vends are guaranteed to remain valid at least until the Handle // they were returned with is destroyed. Having the cache in the browser process // allows requests to be sent while the Javascript process is still starting up, // and allows the cache to live beyond the shutdown of the often short-live // Javascript processes. // // Internally, it uses 4 maps: // // * `fetches_`, a multimap of pending/live Fetches, with FetchKeys consisting // of what must be the same to share a fetch. On fetch completion, ownership of // the response is passed to the corresponding CompressionGroupData(s) and the // Fetch is deleted. See FetchKey for more details on why this is a multimap // rather than a map. // // * `compression_group_data_map_`, a map of UnguessableTokens // (`compression_group_tokens`) to CompressionGroupData, which contain the still // compressed response for a single partition group within a fetch. A // CompressionGroupData may have one or more partitions, each of which // corresponds to a single [Bidding|Scoring]CacheEntry. The lifetime of // CompressionGroupData is scoped to the Handle objects returned by the Cache. // // * `bidding_cache_entries_`, a map of BiddingCacheEntries, with // BiddingCacheKeys consisting of what must be the same to share a Fetch, a // compression group, and partition within the group. Fields that can be merged // between requests to share a partitiong (e.g., trusted signals keys) are part // of entry itself, not the key. This is a map, not a multimap, so if a // BiddingCacheEntry cannot be reused (with or without modification) to suit the // needs of an incoming request, the BiddingCacheEntry is deleted, and removed // from its CompressionGroupData. Destroying a BiddingCacheEntry in this way // will not destroy the CompressionGroupData, or the CompressionGroupData's // fetch, if it has one. // // * TODO(https://crbug.com/333445540): A map of ScoringCacheEntries much akin // to the map of BiddingCacheEntries. // // Fetches and CacheEntries have pointers to the corresponding // CompressionGroupData, while the CompressionGroupData owns the corresponding // values in the other two maps. Deleting a CompressionGroupData removes the // corresponding values in the two maps. One CompressionGroupData may own // multiple CacheEntries, but will only own one live/pending Fetch. Ownership of // a Fetch may be shared by multiple CompressionGroupData objects with matching // FetchKeys. // // Each handed out Handle object will keep its corresponding // CompressionGroupData alive until the handle is destroyed. // // TODO(https://crbug.com/333445540): Add caching support. Right now, entries // are cached only as long as there's something that owns a Handle, but should // instead cache for at least a short duration as long as an entry's TTL hasn't // expired. Holding onto a CompressionGroupData reference, which is refcounted, // is all that's needed to keep an entry alive. // // TODO(https://crbug.com/333445540): May need some sort of rate limit and size // cap. Currently, this class creates an arbitrary number of downloads, and // potentially stores an unlimited amount of data in browser process memory. class CONTENT_EXPORT TrustedSignalsCacheImpl : public auction_worklet::mojom::TrustedSignalsCache { … }; } // namespace content #endif // CONTENT_BROWSER_INTEREST_GROUP_TRUSTED_SIGNALS_CACHE_IMPL_H_