1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-24 11:19:35 +01:00

libstore/filetransfer: Return an opaque handle from enqueueFileTransfer

This is necessary to make pausing/unpausing possible in a follow-up commit.
This commit is contained in:
Sergei Zimmerman 2025-11-22 00:18:50 +03:00
parent 3f8474a62f
commit ec0b270c6c
No known key found for this signature in database
2 changed files with 29 additions and 7 deletions

View file

@ -48,7 +48,7 @@ struct curlFileTransfer : public FileTransfer
std::random_device rd;
std::mt19937 mt19937;
struct TransferItem : public std::enable_shared_from_this<TransferItem>
struct TransferItem : public std::enable_shared_from_this<TransferItem>, public FileTransfer::Item
{
curlFileTransfer & fileTransfer;
FileTransferRequest request;
@ -849,7 +849,7 @@ struct curlFileTransfer : public FileTransfer
}
}
void enqueueItem(ref<TransferItem> item)
ItemHandle enqueueItem(ref<TransferItem> item)
{
if (item->request.data && item->request.uri.scheme() != "http" && item->request.uri.scheme() != "https"
&& item->request.uri.scheme() != "s3")
@ -864,19 +864,20 @@ struct curlFileTransfer : public FileTransfer
#ifndef _WIN32 // TODO need graceful async exit support on Windows?
writeFull(wakeupPipe.writeSide.get(), " ");
#endif
return ItemHandle(static_cast<Item &>(*item));
}
void enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) override
ItemHandle enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) override
{
/* Handle s3:// URIs by converting to HTTPS and optionally adding auth */
if (request.uri.scheme() == "s3") {
auto modifiedRequest = request;
modifiedRequest.setupForS3();
enqueueItem(make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback)));
return;
return enqueueItem(make_ref<TransferItem>(*this, std::move(modifiedRequest), std::move(callback)));
}
enqueueItem(make_ref<TransferItem>(*this, request, std::move(callback)));
return enqueueItem(make_ref<TransferItem>(*this, request, std::move(callback)));
}
};

View file

@ -226,6 +226,26 @@ class Store;
struct FileTransfer
{
protected:
class Item
{};
public:
/**
* An opaque handle to the file transfer. Can be used to reference an in-flight transfer operations.
*/
class ItemHandle
{
std::reference_wrapper<Item> item;
friend struct FileTransfer;
public:
ItemHandle(Item & item)
: item(item)
{
}
};
virtual ~FileTransfer() {}
/**
@ -233,7 +253,8 @@ struct FileTransfer
* the download. The future may throw a FileTransferError
* exception.
*/
virtual void enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) = 0;
virtual ItemHandle
enqueueFileTransfer(const FileTransferRequest & request, Callback<FileTransferResult> callback) = 0;
std::future<FileTransferResult> enqueueFileTransfer(const FileTransferRequest & request);