aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/remote-store-connection.hh
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2023-04-17 13:40:46 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-06-19 12:08:23 -0400
commit9f69b7dee9fc6035b8aa0cc718f5e74af460d9aa (patch)
tree167c44235e63dd0ed73b7ee3497ee04ecccfda86 /src/libstore/remote-store-connection.hh
parent4e8b495ad7dddabc35bf9d6afe3573426ffed15d (diff)
Create `worker_proto::{Read,Write}Conn`
Pass this around instead of `Source &` and `Sink &` directly. This will give us something to put the protocol version on once the time comes. To do this ergonomically, we need to expose `RemoteStore::Connection`, so do that too. Give it some more API docs while we are at it.
Diffstat (limited to 'src/libstore/remote-store-connection.hh')
-rw-r--r--src/libstore/remote-store-connection.hh97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/libstore/remote-store-connection.hh b/src/libstore/remote-store-connection.hh
new file mode 100644
index 000000000..d32d91a60
--- /dev/null
+++ b/src/libstore/remote-store-connection.hh
@@ -0,0 +1,97 @@
+#include "remote-store.hh"
+#include "worker-protocol.hh"
+
+namespace nix {
+
+/**
+ * Bidirectional connection (send and receive) used by the Remote Store
+ * implementation.
+ *
+ * Contains `Source` and `Sink` for actual communication, along with
+ * other information learned when negotiating the connection.
+ */
+struct RemoteStore::Connection
+{
+ /**
+ * Send with this.
+ */
+ FdSink to;
+
+ /**
+ * Receive with this.
+ */
+ FdSource from;
+
+ /**
+ * Worker protocol version used for the connection.
+ *
+ * Despite its name, I think it is actually the maximum version both
+ * sides support. (If the maximum doesn't exist, we would fail to
+ * establish a connection and produce a value of this type.)
+ */
+ unsigned int daemonVersion;
+
+ /**
+ * Whether the remote side trusts us or not.
+ *
+ * 3 values: "yes", "no", or `std::nullopt` for "unknown".
+ *
+ * Note that the "remote side" might not be just the end daemon, but
+ * also an intermediary forwarder that can make its own trusting
+ * decisions. This would be the intersection of all their trust
+ * decisions, since it takes only one link in the chain to start
+ * denying operations.
+ */
+ std::optional<TrustedFlag> remoteTrustsUs;
+
+ /**
+ * The version of the Nix daemon that is processing our requests.
+ *
+ * Do note, it may or may not communicating with another daemon,
+ * rather than being an "end" `LocalStore` or similar.
+ */
+ std::optional<std::string> daemonNixVersion;
+
+ /**
+ * Time this connection was established.
+ */
+ std::chrono::time_point<std::chrono::steady_clock> startTime;
+
+ /**
+ * Coercion to `WorkerProto::ReadConn`. This makes it easy to use the
+ * factored out worker protocol searlizers with a
+ * `RemoteStore::Connection`.
+ *
+ * The worker protocol connection types are unidirectional, unlike
+ * this type.
+ */
+ operator WorkerProto::ReadConn ()
+ {
+ return WorkerProto::ReadConn {
+ .from = from,
+ };
+ }
+
+ /**
+ * Coercion to `WorkerProto::WriteConn`. This makes it easy to use the
+ * factored out worker protocol searlizers with a
+ * `RemoteStore::Connection`.
+ *
+ * The worker protocol connection types are unidirectional, unlike
+ * this type.
+ */
+ operator WorkerProto::WriteConn ()
+ {
+ return WorkerProto::WriteConn {
+ .to = to,
+ };
+ }
+
+ virtual ~Connection();
+
+ virtual void closeWrite() = 0;
+
+ std::exception_ptr processStderr(Sink * sink = 0, Source * source = 0, bool flush = true);
+};
+
+}