1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include <zencore/refcount.h>
#include <zencore/thread.h>
#include <atomic>
#include <list>
#include <memory>
#include <vector>
namespace zen {
namespace detail {
struct CloudCacheSessionState;
}
class IoBuffer;
class CloudCacheClient;
struct IoHash;
class CbObjectView;
/**
* Cached access token, for use with `Authorization:` header
*/
struct CloudCacheAccessToken
{
std::string GetAuthorizationHeaderValue();
void SetToken(std::string_view Token);
inline uint32_t GetSerial() const { return m_Serial.load(std::memory_order::memory_order_relaxed); }
private:
RwLock m_Lock;
std::string m_Token;
std::atomic<uint32_t> m_Serial;
};
/**
* Context for performing Jupiter operations
*
* Maintains an HTTP connection so that subsequent operations don't need to go
* through the whole connection setup process
*
*/
class CloudCacheSession
{
public:
CloudCacheSession(CloudCacheClient* OuterClient);
~CloudCacheSession();
IoBuffer Get(std::string_view BucketId, std::string_view Key);
void Put(std::string_view BucketId, std::string_view Key, IoBuffer Data);
void Put(std::string_view BucketId, std::string_view Key, CbObjectView Data);
std::vector<IoHash> Filter(std::string_view BucketId, const std::vector<IoHash>& ChunkHashes);
private:
RefPtr<CloudCacheClient> m_CacheClient;
detail::CloudCacheSessionState* m_SessionState;
};
/**
* Jupiter upstream cache client
*/
class CloudCacheClient : public RefCounted
{
public:
CloudCacheClient(std::string_view ServiceUrl,
std::string_view Namespace,
std::string_view OAuthProvider,
std::string_view OAuthClientId,
std::string_view OAuthSecret);
~CloudCacheClient();
bool AcquireAccessToken(std::string& AuthorizationHeaderValue);
std::string_view Namespace() const { return m_Namespace; }
std::string_view DefaultBucket() const { return m_DefaultBucket; }
std::string_view ServiceUrl() const { return m_ServiceUrl; }
private:
bool m_IsValid = false;
std::string m_ServiceUrl;
std::string m_OAuthDomain;
std::string m_OAuthUriPath;
std::string m_OAuthFullUri;
std::string m_Namespace;
std::string m_DefaultBucket;
std::string m_OAuthClientId;
std::string m_OAuthSecret;
CloudCacheAccessToken m_AccessToken;
RwLock m_SessionStateLock;
std::list<detail::CloudCacheSessionState*> m_SessionStateCache;
detail::CloudCacheSessionState* AllocSessionState();
void FreeSessionState(detail::CloudCacheSessionState*);
friend class CloudCacheSession;
};
} // namespace zen
|