1*14675a02SAndroid Build Coastguard Worker /* 2*14675a02SAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*14675a02SAndroid Build Coastguard Worker * 4*14675a02SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*14675a02SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*14675a02SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*14675a02SAndroid Build Coastguard Worker * 8*14675a02SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*14675a02SAndroid Build Coastguard Worker * 10*14675a02SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*14675a02SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*14675a02SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*14675a02SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*14675a02SAndroid Build Coastguard Worker * limitations under the License. 15*14675a02SAndroid Build Coastguard Worker */ 16*14675a02SAndroid Build Coastguard Worker 17*14675a02SAndroid Build Coastguard Worker #ifndef FCP_CLIENT_CACHE_RESOURCE_CACHE_H_ 18*14675a02SAndroid Build Coastguard Worker #define FCP_CLIENT_CACHE_RESOURCE_CACHE_H_ 19*14675a02SAndroid Build Coastguard Worker 20*14675a02SAndroid Build Coastguard Worker #include <optional> 21*14675a02SAndroid Build Coastguard Worker 22*14675a02SAndroid Build Coastguard Worker #include "google/protobuf/any.pb.h" 23*14675a02SAndroid Build Coastguard Worker #include "absl/status/status.h" 24*14675a02SAndroid Build Coastguard Worker #include "absl/status/statusor.h" 25*14675a02SAndroid Build Coastguard Worker #include "absl/strings/cord.h" 26*14675a02SAndroid Build Coastguard Worker 27*14675a02SAndroid Build Coastguard Worker namespace fcp { 28*14675a02SAndroid Build Coastguard Worker namespace client { 29*14675a02SAndroid Build Coastguard Worker namespace cache { 30*14675a02SAndroid Build Coastguard Worker 31*14675a02SAndroid Build Coastguard Worker /** 32*14675a02SAndroid Build Coastguard Worker * A ResourceCache is an interface for a cache that stores resources (entries) 33*14675a02SAndroid Build Coastguard Worker * for a certain duration. A resource consists of an absl::Cord payload and 34*14675a02SAndroid Build Coastguard Worker * accompanying metadata, keyed by a string ID. 35*14675a02SAndroid Build Coastguard Worker */ 36*14675a02SAndroid Build Coastguard Worker class ResourceCache { 37*14675a02SAndroid Build Coastguard Worker public: 38*14675a02SAndroid Build Coastguard Worker struct ResourceAndMetadata { 39*14675a02SAndroid Build Coastguard Worker absl::Cord resource; 40*14675a02SAndroid Build Coastguard Worker google::protobuf::Any metadata; 41*14675a02SAndroid Build Coastguard Worker }; 42*14675a02SAndroid Build Coastguard Worker 43*14675a02SAndroid Build Coastguard Worker virtual ~ResourceCache() = default; 44*14675a02SAndroid Build Coastguard Worker 45*14675a02SAndroid Build Coastguard Worker // Stores resource`under key cache_id. Will be deleted after now + max_age. If 46*14675a02SAndroid Build Coastguard Worker // cache_id already exists, the corresponding resource and metadata will be 47*14675a02SAndroid Build Coastguard Worker // overwritten. Metadata will be returned along with the resource when Get() 48*14675a02SAndroid Build Coastguard Worker // is called. A Resource is *not* guaranteed to be cached until now + max_age, 49*14675a02SAndroid Build Coastguard Worker // implementations may choose to delete resources earlier if needed. Returns 50*14675a02SAndroid Build Coastguard Worker // Ok on success On error, returns 51*14675a02SAndroid Build Coastguard Worker // - INTERNAL - unexpected error. 52*14675a02SAndroid Build Coastguard Worker // - INVALID_ARGUMENT - if max_age is in the past. 53*14675a02SAndroid Build Coastguard Worker // - RESOURCE_EXHAUSTED - if the resource is too big too be cached. 54*14675a02SAndroid Build Coastguard Worker virtual absl::Status Put(absl::string_view cache_id, 55*14675a02SAndroid Build Coastguard Worker const absl::Cord& resource, 56*14675a02SAndroid Build Coastguard Worker const google::protobuf::Any& metadata, 57*14675a02SAndroid Build Coastguard Worker absl::Duration max_age) = 0; 58*14675a02SAndroid Build Coastguard Worker 59*14675a02SAndroid Build Coastguard Worker // Returns resource along with caller-provided stored metadata. 60*14675a02SAndroid Build Coastguard Worker // If max_age is set, the stored max_age for this cache_id will be updated. 61*14675a02SAndroid Build Coastguard Worker // Returns Ok on success 62*14675a02SAndroid Build Coastguard Worker // On error, returns 63*14675a02SAndroid Build Coastguard Worker // - INTERNAL - unexpected error. 64*14675a02SAndroid Build Coastguard Worker // - NOT_FOUND - if cache_id not in ResourceCache 65*14675a02SAndroid Build Coastguard Worker virtual absl::StatusOr<ResourceAndMetadata> Get( 66*14675a02SAndroid Build Coastguard Worker absl::string_view cache_id, std::optional<absl::Duration> max_age) = 0; 67*14675a02SAndroid Build Coastguard Worker }; 68*14675a02SAndroid Build Coastguard Worker 69*14675a02SAndroid Build Coastguard Worker } // namespace cache 70*14675a02SAndroid Build Coastguard Worker } // namespace client 71*14675a02SAndroid Build Coastguard Worker } // namespace fcp 72*14675a02SAndroid Build Coastguard Worker 73*14675a02SAndroid Build Coastguard Worker #endif // FCP_CLIENT_CACHE_RESOURCE_CACHE_H_ 74