aboutsummaryrefslogtreecommitdiff
path: root/zenserver/upstream/jupiter.h
blob: 5bcec2904b0b4f4719541b03e93e2a9fd912954b (plain) (blame)
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