blob: cf00226b110d6ea3d2e8edd2d300ce11329f56ab [file] [log] [blame]
#ifndef AOS_EVENTS_LOGGING_S3_FETCHER_H_
#define AOS_EVENTS_LOGGING_S3_FETCHER_H_
#include <aws/s3/S3Client.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <future>
#include <string_view>
#include "aos/containers/resizeable_buffer.h"
#include "aos/events/logging/buffer_encoder.h"
namespace aos::logger {
// Fetches data from an S3 URL.
class S3Fetcher final : public DataDecoder {
public:
explicit S3Fetcher(std::string_view url);
S3Fetcher(const S3Fetcher &) = delete;
S3Fetcher &operator=(const S3Fetcher &) = delete;
size_t Read(uint8_t *begin, uint8_t *end) final;
std::string_view filename() const final { return url_; }
private:
const std::string url_;
// The current chunk we're reading from. Empty if there is no current chunk or
// we've read all of it.
ResizeableBuffer current_chunk_;
// If valid, the next chunk which we've triggered to be retrieved in the
// background.
std::future<Aws::S3::Model::GetObjectOutcome> get_next_chunk_;
// The next byte index we're going to request. This means we've already made
// requests for all prior bytes, but not necessarily received them.
uint64_t next_byte_to_request_ = 0;
// Set once we've received data for the end of the object. Some of it may
// still be in current_chunk_ though.
bool end_of_object_ = false;
// Kicks off a request for the next chunk.
void StartRequest();
};
Aws::S3::S3Client& GetS3Client();
struct ObjectName {
std::string bucket, key;
};
ObjectName ParseUrl(std::string_view url);
// Does an S3 object listing with the given URL prefix. Returns the URLs for all
// the objects under it.
std::vector<std::string> ListS3Objects(std::string_view url);
} // namespace aos::logger
#endif // AOS_EVENTS_LOGGING_S3_FETCHER_H_