refactor(tvix/nix-compat): reorganize wire and bytes
Move everything bytes-related into its own module, and re-export both bytes and primitive in a flat space from wire/mod.rs. Expose this if a `wire` feature flag is set. We only have `async` stuff in here. Change-Id: Ia4ce4791f13a5759901cc9d6ce6bd6bbcca587c7 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11389 Autosubmit: flokli <flokli@flokli.de> Reviewed-by: raitobezarius <tvl@lahfa.xyz> Tested-by: BuildkiteCI Reviewed-by: Brian Olsen <me@griff.name>
This commit is contained in:
		
							parent
							
								
									839c971a0f
								
							
						
					
					
						commit
						36b296609b
					
				
					 12 changed files with 69 additions and 96 deletions
				
			
		| 
						 | 
					@ -6814,12 +6814,13 @@ rec {
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        features = {
 | 
					        features = {
 | 
				
			||||||
          "async" = [ "futures-util" "tokio" "pin-project-lite" ];
 | 
					          "async" = [ "futures-util" ];
 | 
				
			||||||
          "futures-util" = [ "dep:futures-util" ];
 | 
					          "futures-util" = [ "dep:futures-util" ];
 | 
				
			||||||
          "pin-project-lite" = [ "dep:pin-project-lite" ];
 | 
					          "pin-project-lite" = [ "dep:pin-project-lite" ];
 | 
				
			||||||
          "tokio" = [ "dep:tokio" ];
 | 
					          "tokio" = [ "dep:tokio" ];
 | 
				
			||||||
 | 
					          "wire" = [ "tokio" "pin-project-lite" ];
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        resolvedDefaultFeatures = [ "async" "futures-util" "pin-project-lite" "tokio" ];
 | 
					        resolvedDefaultFeatures = [ "async" "futures-util" "pin-project-lite" "tokio" "wire" ];
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      "nom" = rec {
 | 
					      "nom" = rec {
 | 
				
			||||||
        crateName = "nom";
 | 
					        crateName = "nom";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,10 @@ version = "0.1.0"
 | 
				
			||||||
edition = "2021"
 | 
					edition = "2021"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[features]
 | 
					[features]
 | 
				
			||||||
async = ["futures-util", "tokio", "pin-project-lite"]
 | 
					# async NAR writer
 | 
				
			||||||
 | 
					async = ["futures-util"]
 | 
				
			||||||
 | 
					# code emitting low-level packets used in the daemon protocol.
 | 
				
			||||||
 | 
					wire = ["tokio", "pin-project-lite"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
bitflags = "2.4.1"
 | 
					bitflags = "2.4.1"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,5 +3,5 @@
 | 
				
			||||||
depot.tvix.crates.workspaceMembers.nix-compat.build.override {
 | 
					depot.tvix.crates.workspaceMembers.nix-compat.build.override {
 | 
				
			||||||
  runTests = true;
 | 
					  runTests = true;
 | 
				
			||||||
  # make sure we also enable async here, so run the tests behind that feature flag.
 | 
					  # make sure we also enable async here, so run the tests behind that feature flag.
 | 
				
			||||||
  features = [ "default" "async" ];
 | 
					  features = [ "default" "async" "wire" ];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,4 +6,6 @@ pub mod nixbase32;
 | 
				
			||||||
pub mod nixhash;
 | 
					pub mod nixhash;
 | 
				
			||||||
pub mod path_info;
 | 
					pub mod path_info;
 | 
				
			||||||
pub mod store_path;
 | 
					pub mod store_path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[cfg(feature = "wire")]
 | 
				
			||||||
pub mod wire;
 | 
					pub mod wire;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,13 +2,20 @@ use std::{
 | 
				
			||||||
    io::{Error, ErrorKind},
 | 
					    io::{Error, ErrorKind},
 | 
				
			||||||
    ops::RangeBounds,
 | 
					    ops::RangeBounds,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					 | 
				
			||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
 | 
					use tokio::io::{AsyncReadExt, AsyncWriteExt};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mod reader;
 | 
				
			||||||
 | 
					pub use reader::BytesReader;
 | 
				
			||||||
 | 
					mod writer;
 | 
				
			||||||
 | 
					pub use writer::BytesWriter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use super::primitive;
 | 
					use super::primitive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// 8 null bytes, used to write out padding.
 | 
					/// 8 null bytes, used to write out padding.
 | 
				
			||||||
pub(crate) const EMPTY_BYTES: &[u8; 8] = &[0u8; 8];
 | 
					const EMPTY_BYTES: &[u8; 8] = &[0u8; 8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// The length of the size field, in bytes is always 8.
 | 
				
			||||||
 | 
					const LEN_SIZE: usize = 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[allow(dead_code)]
 | 
					#[allow(dead_code)]
 | 
				
			||||||
/// Read a "bytes wire packet" from the AsyncRead.
 | 
					/// Read a "bytes wire packet" from the AsyncRead.
 | 
				
			||||||
| 
						 | 
					@ -116,7 +123,7 @@ pub async fn write_bytes<W: AsyncWriteExt + Unpin, B: AsRef<[u8]>>(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Computes the number of bytes we should add to len (a length in
 | 
					/// Computes the number of bytes we should add to len (a length in
 | 
				
			||||||
/// bytes) to be alined on 64 bits (8 bytes).
 | 
					/// bytes) to be alined on 64 bits (8 bytes).
 | 
				
			||||||
pub(crate) fn padding_len(len: u64) -> u8 {
 | 
					fn padding_len(len: u64) -> u8 {
 | 
				
			||||||
    let modulo = len % 8;
 | 
					    let modulo = len % 8;
 | 
				
			||||||
    if modulo == 0 {
 | 
					    if modulo == 0 {
 | 
				
			||||||
        0
 | 
					        0
 | 
				
			||||||
| 
						 | 
					@ -125,6 +132,25 @@ pub(crate) fn padding_len(len: u64) -> u8 {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Models the position inside a "bytes wire packet" that the reader or writer
 | 
				
			||||||
 | 
					/// is in.
 | 
				
			||||||
 | 
					/// It can be in three different stages, inside size, payload or padding fields.
 | 
				
			||||||
 | 
					/// The number tracks the number of bytes written inside the specific field.
 | 
				
			||||||
 | 
					/// There shall be no ambiguous states, at the end of a stage we immediately
 | 
				
			||||||
 | 
					/// move to the beginning of the next one:
 | 
				
			||||||
 | 
					/// - Size(LEN_SIZE) must be expressed as Payload(0)
 | 
				
			||||||
 | 
					/// - Payload(self.payload_len) must be expressed as Padding(0)
 | 
				
			||||||
 | 
					/// There's one exception - Size(LEN_SIZE) in the reader represents a failure
 | 
				
			||||||
 | 
					/// state we enter in case the allowed size doesn't match the allowed range.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Padding(padding_len) means we're at the end of the bytes wire packet.
 | 
				
			||||||
 | 
					#[derive(Clone, Debug, PartialEq, Eq)]
 | 
				
			||||||
 | 
					enum BytesPacketPosition {
 | 
				
			||||||
 | 
					    Size(usize),
 | 
				
			||||||
 | 
					    Payload(u64),
 | 
				
			||||||
 | 
					    Padding(usize),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(test)]
 | 
					#[cfg(test)]
 | 
				
			||||||
mod tests {
 | 
					mod tests {
 | 
				
			||||||
    use tokio_test::{assert_ok, io::Builder};
 | 
					    use tokio_test::{assert_ok, io::Builder};
 | 
				
			||||||
| 
						 | 
					@ -5,9 +5,7 @@ use std::{
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use tokio::io::AsyncRead;
 | 
					use tokio::io::AsyncRead;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::wire::bytes::padding_len;
 | 
					use super::{padding_len, BytesPacketPosition, LEN_SIZE};
 | 
				
			||||||
 | 
					 | 
				
			||||||
use super::bytes_writer::{BytesPacketPosition, LEN_SIZE};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pin_project! {
 | 
					pin_project! {
 | 
				
			||||||
    /// Reads a "bytes wire packet" from the underlying reader.
 | 
					    /// Reads a "bytes wire packet" from the underlying reader.
 | 
				
			||||||
| 
						 | 
					@ -3,10 +3,7 @@ use std::task::{ready, Poll};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use tokio::io::AsyncWrite;
 | 
					use tokio::io::AsyncWrite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use super::bytes::EMPTY_BYTES;
 | 
					use super::{padding_len, BytesPacketPosition, EMPTY_BYTES, LEN_SIZE};
 | 
				
			||||||
 | 
					 | 
				
			||||||
/// The length of the size field, in bytes is always 8.
 | 
					 | 
				
			||||||
pub(crate) const LEN_SIZE: usize = 8;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pin_project! {
 | 
					pin_project! {
 | 
				
			||||||
    /// Writes a "bytes wire packet" to the underlying writer.
 | 
					    /// Writes a "bytes wire packet" to the underlying writer.
 | 
				
			||||||
| 
						 | 
					@ -44,25 +41,6 @@ pin_project! {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Models the position inside a "bytes wire packet" that the reader or writer
 | 
					 | 
				
			||||||
/// is in.
 | 
					 | 
				
			||||||
/// It can be in three different stages, inside size, payload or padding fields.
 | 
					 | 
				
			||||||
/// The number tracks the number of bytes written inside the specific field.
 | 
					 | 
				
			||||||
/// There shall be no ambiguous states, at the end of a stage we immediately
 | 
					 | 
				
			||||||
/// move to the beginning of the next one:
 | 
					 | 
				
			||||||
/// - Size(LEN_SIZE) must be expressed as Payload(0)
 | 
					 | 
				
			||||||
/// - Payload(self.payload_len) must be expressed as Padding(0)
 | 
					 | 
				
			||||||
/// There's one exception - Size(LEN_SIZE) in the reader represents a failure
 | 
					 | 
				
			||||||
/// state we enter in case the allowed size doesn't match the allowed range.
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// Padding(padding_len) means we're at the end of the bytes wire packet.
 | 
					 | 
				
			||||||
#[derive(Clone, Debug, PartialEq, Eq)]
 | 
					 | 
				
			||||||
pub(crate) enum BytesPacketPosition {
 | 
					 | 
				
			||||||
    Size(usize),
 | 
					 | 
				
			||||||
    Payload(u64),
 | 
					 | 
				
			||||||
    Padding(usize),
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl<W> BytesWriter<W>
 | 
					impl<W> BytesWriter<W>
 | 
				
			||||||
where
 | 
					where
 | 
				
			||||||
    W: AsyncWrite,
 | 
					    W: AsyncWrite,
 | 
				
			||||||
| 
						 | 
					@ -186,7 +164,7 @@ where
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                BytesPacketPosition::Padding(pos) => {
 | 
					                BytesPacketPosition::Padding(pos) => {
 | 
				
			||||||
                    // Write remaining padding, if there is padding to write.
 | 
					                    // Write remaining padding, if there is padding to write.
 | 
				
			||||||
                    let total_padding_len = super::bytes::padding_len(*this.payload_len) as usize;
 | 
					                    let total_padding_len = padding_len(*this.payload_len) as usize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if pos != total_padding_len {
 | 
					                    if pos != total_padding_len {
 | 
				
			||||||
                        let bytes_written = ensure_nonzero_bytes_written(ready!(this
 | 
					                        let bytes_written = ensure_nonzero_bytes_written(ready!(this
 | 
				
			||||||
| 
						 | 
					@ -217,7 +195,7 @@ where
 | 
				
			||||||
        // After a flush, being inside the padding state, and at the end of the padding
 | 
					        // After a flush, being inside the padding state, and at the end of the padding
 | 
				
			||||||
        // is the only way to prevent a dirty shutdown.
 | 
					        // is the only way to prevent a dirty shutdown.
 | 
				
			||||||
        if let BytesPacketPosition::Padding(pos) = *this.state {
 | 
					        if let BytesPacketPosition::Padding(pos) = *this.state {
 | 
				
			||||||
            let padding_len = super::bytes::padding_len(*this.payload_len) as usize;
 | 
					            let padding_len = padding_len(*this.payload_len) as usize;
 | 
				
			||||||
            if padding_len == pos {
 | 
					            if padding_len == pos {
 | 
				
			||||||
                // Shutdown the underlying writer
 | 
					                // Shutdown the underlying writer
 | 
				
			||||||
                return this.inner.poll_shutdown(cx);
 | 
					                return this.inner.poll_shutdown(cx);
 | 
				
			||||||
| 
						 | 
					@ -1,20 +1,10 @@
 | 
				
			||||||
//! Module parsing and emitting the wire format used by Nix, both in the
 | 
					//! Module parsing and emitting the wire format used by Nix, both in the
 | 
				
			||||||
//! nix-daemon protocol as well as in the NAR format.
 | 
					//! nix-daemon protocol as well as in the NAR format.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(feature = "async")]
 | 
					mod bytes;
 | 
				
			||||||
pub mod bytes;
 | 
					pub use bytes::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(feature = "async")]
 | 
					mod primitive;
 | 
				
			||||||
mod bytes_reader;
 | 
					pub use primitive::*;
 | 
				
			||||||
#[cfg(feature = "async")]
 | 
					 | 
				
			||||||
mod bytes_writer;
 | 
					 | 
				
			||||||
#[cfg(feature = "async")]
 | 
					 | 
				
			||||||
pub use bytes_reader::BytesReader;
 | 
					 | 
				
			||||||
#[cfg(feature = "async")]
 | 
					 | 
				
			||||||
pub use bytes_writer::BytesWriter;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[cfg(feature = "async")]
 | 
					 | 
				
			||||||
pub mod primitive;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[cfg(feature = "async")]
 | 
					 | 
				
			||||||
pub mod worker_protocol;
 | 
					pub mod worker_protocol;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								users/picnoir/tvix-daemon/Cargo.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								users/picnoir/tvix-daemon/Cargo.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -441,12 +441,6 @@ version = "0.3.30"
 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
 | 
					checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					 | 
				
			||||||
name = "futures-io"
 | 
					 | 
				
			||||||
version = "0.3.30"
 | 
					 | 
				
			||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
					 | 
				
			||||||
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "futures-macro"
 | 
					name = "futures-macro"
 | 
				
			||||||
version = "0.3.30"
 | 
					version = "0.3.30"
 | 
				
			||||||
| 
						 | 
					@ -477,10 +471,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
 | 
					checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "futures-core",
 | 
					 "futures-core",
 | 
				
			||||||
 "futures-io",
 | 
					 | 
				
			||||||
 "futures-macro",
 | 
					 "futures-macro",
 | 
				
			||||||
 "futures-task",
 | 
					 "futures-task",
 | 
				
			||||||
 "memchr",
 | 
					 | 
				
			||||||
 "pin-project-lite",
 | 
					 "pin-project-lite",
 | 
				
			||||||
 "pin-utils",
 | 
					 "pin-utils",
 | 
				
			||||||
 "slab",
 | 
					 "slab",
 | 
				
			||||||
| 
						 | 
					@ -753,7 +745,6 @@ dependencies = [
 | 
				
			||||||
 "ed25519",
 | 
					 "ed25519",
 | 
				
			||||||
 "ed25519-dalek",
 | 
					 "ed25519-dalek",
 | 
				
			||||||
 "enum-primitive-derive",
 | 
					 "enum-primitive-derive",
 | 
				
			||||||
 "futures-util",
 | 
					 | 
				
			||||||
 "glob",
 | 
					 "glob",
 | 
				
			||||||
 "nom",
 | 
					 "nom",
 | 
				
			||||||
 "num-traits",
 | 
					 "num-traits",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
# This file was @generated by crate2nix 0.12.0 with the command:
 | 
					# This file was @generated by crate2nix 0.13.0 with the command:
 | 
				
			||||||
#   "generate"
 | 
					#   "generate" "--all-features"
 | 
				
			||||||
# See https://github.com/kolloch/crate2nix for more info.
 | 
					# See https://github.com/kolloch/crate2nix for more info.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{ nixpkgs ? <nixpkgs>
 | 
					{ nixpkgs ? <nixpkgs>
 | 
				
			||||||
| 
						 | 
					@ -1386,16 +1386,6 @@ rec {
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        resolvedDefaultFeatures = [ "alloc" "default" "std" ];
 | 
					        resolvedDefaultFeatures = [ "alloc" "default" "std" ];
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      "futures-io" = rec {
 | 
					 | 
				
			||||||
        crateName = "futures-io";
 | 
					 | 
				
			||||||
        version = "0.3.30";
 | 
					 | 
				
			||||||
        edition = "2018";
 | 
					 | 
				
			||||||
        sha256 = "1hgh25isvsr4ybibywhr4dpys8mjnscw4wfxxwca70cn1gi26im4";
 | 
					 | 
				
			||||||
        features = {
 | 
					 | 
				
			||||||
          "default" = [ "std" ];
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        resolvedDefaultFeatures = [ "std" ];
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      "futures-macro" = rec {
 | 
					      "futures-macro" = rec {
 | 
				
			||||||
        crateName = "futures-macro";
 | 
					        crateName = "futures-macro";
 | 
				
			||||||
        version = "0.3.30";
 | 
					        version = "0.3.30";
 | 
				
			||||||
| 
						 | 
					@ -1452,13 +1442,6 @@ rec {
 | 
				
			||||||
            packageId = "futures-core";
 | 
					            packageId = "futures-core";
 | 
				
			||||||
            usesDefaultFeatures = false;
 | 
					            usesDefaultFeatures = false;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name = "futures-io";
 | 
					 | 
				
			||||||
            packageId = "futures-io";
 | 
					 | 
				
			||||||
            optional = true;
 | 
					 | 
				
			||||||
            usesDefaultFeatures = false;
 | 
					 | 
				
			||||||
            features = [ "std" ];
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            name = "futures-macro";
 | 
					            name = "futures-macro";
 | 
				
			||||||
            packageId = "futures-macro";
 | 
					            packageId = "futures-macro";
 | 
				
			||||||
| 
						 | 
					@ -1470,11 +1453,6 @@ rec {
 | 
				
			||||||
            packageId = "futures-task";
 | 
					            packageId = "futures-task";
 | 
				
			||||||
            usesDefaultFeatures = false;
 | 
					            usesDefaultFeatures = false;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name = "memchr";
 | 
					 | 
				
			||||||
            packageId = "memchr";
 | 
					 | 
				
			||||||
            optional = true;
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            name = "pin-project-lite";
 | 
					            name = "pin-project-lite";
 | 
				
			||||||
            packageId = "pin-project-lite";
 | 
					            packageId = "pin-project-lite";
 | 
				
			||||||
| 
						 | 
					@ -1511,7 +1489,7 @@ rec {
 | 
				
			||||||
          "unstable" = [ "futures-core/unstable" "futures-task/unstable" ];
 | 
					          "unstable" = [ "futures-core/unstable" "futures-task/unstable" ];
 | 
				
			||||||
          "write-all-vectored" = [ "io" ];
 | 
					          "write-all-vectored" = [ "io" ];
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        resolvedDefaultFeatures = [ "alloc" "async-await" "async-await-macro" "default" "futures-io" "futures-macro" "io" "memchr" "slab" "std" ];
 | 
					        resolvedDefaultFeatures = [ "alloc" "async-await" "async-await-macro" "default" "futures-macro" "slab" "std" ];
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      "generic-array" = rec {
 | 
					      "generic-array" = rec {
 | 
				
			||||||
        crateName = "generic-array";
 | 
					        crateName = "generic-array";
 | 
				
			||||||
| 
						 | 
					@ -2340,12 +2318,6 @@ rec {
 | 
				
			||||||
            name = "enum-primitive-derive";
 | 
					            name = "enum-primitive-derive";
 | 
				
			||||||
            packageId = "enum-primitive-derive";
 | 
					            packageId = "enum-primitive-derive";
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            name = "futures-util";
 | 
					 | 
				
			||||||
            packageId = "futures-util";
 | 
					 | 
				
			||||||
            optional = true;
 | 
					 | 
				
			||||||
            features = [ "io" ];
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            name = "glob";
 | 
					            name = "glob";
 | 
				
			||||||
            packageId = "glob";
 | 
					            packageId = "glob";
 | 
				
			||||||
| 
						 | 
					@ -2394,12 +2366,13 @@ rec {
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
        features = {
 | 
					        features = {
 | 
				
			||||||
          "async" = [ "futures-util" "tokio" "pin-project-lite" ];
 | 
					          "async" = [ "futures-util" ];
 | 
				
			||||||
          "futures-util" = [ "dep:futures-util" ];
 | 
					          "futures-util" = [ "dep:futures-util" ];
 | 
				
			||||||
          "pin-project-lite" = [ "dep:pin-project-lite" ];
 | 
					          "pin-project-lite" = [ "dep:pin-project-lite" ];
 | 
				
			||||||
          "tokio" = [ "dep:tokio" ];
 | 
					          "tokio" = [ "dep:tokio" ];
 | 
				
			||||||
 | 
					          "wire" = [ "tokio" "pin-project-lite" ];
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        resolvedDefaultFeatures = [ "async" "futures-util" "pin-project-lite" "tokio" ];
 | 
					        resolvedDefaultFeatures = [ "pin-project-lite" "tokio" "wire" ];
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      "nom" = rec {
 | 
					      "nom" = rec {
 | 
				
			||||||
        crateName = "nom";
 | 
					        crateName = "nom";
 | 
				
			||||||
| 
						 | 
					@ -4153,7 +4126,7 @@ rec {
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            name = "nix-compat";
 | 
					            name = "nix-compat";
 | 
				
			||||||
            packageId = "nix-compat";
 | 
					            packageId = "nix-compat";
 | 
				
			||||||
            features = [ "async" ];
 | 
					            features = [ "wire" ];
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            name = "tokio";
 | 
					            name = "tokio";
 | 
				
			||||||
| 
						 | 
					@ -5193,6 +5166,7 @@ rec {
 | 
				
			||||||
              (
 | 
					              (
 | 
				
			||||||
                _: {
 | 
					                _: {
 | 
				
			||||||
                  buildTests = true;
 | 
					                  buildTests = true;
 | 
				
			||||||
 | 
					                  release = false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
              );
 | 
					              );
 | 
				
			||||||
            # If the user hasn't set any pre/post commands, we don't want to
 | 
					            # If the user hasn't set any pre/post commands, we don't want to
 | 
				
			||||||
| 
						 | 
					@ -5217,6 +5191,16 @@ rec {
 | 
				
			||||||
            # recreate a file hierarchy as when running tests with cargo
 | 
					            # recreate a file hierarchy as when running tests with cargo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # the source for test data
 | 
					            # the source for test data
 | 
				
			||||||
 | 
					            # It's necessary to locate the source in $NIX_BUILD_TOP/source/
 | 
				
			||||||
 | 
					            # instead of $NIX_BUILD_TOP/
 | 
				
			||||||
 | 
					            # because we compiled those test binaries in the former and not the latter.
 | 
				
			||||||
 | 
					            # So all paths will expect source tree to be there and not in the build top directly.
 | 
				
			||||||
 | 
					            # For example: $NIX_BUILD_TOP := /build in general, if you ask yourself.
 | 
				
			||||||
 | 
					            # TODO(raitobezarius): I believe there could be more edge cases if `crate.sourceRoot`
 | 
				
			||||||
 | 
					            # do exist but it's very hard to reason about them, so let's wait until the first bug report.
 | 
				
			||||||
 | 
					            mkdir -p source/
 | 
				
			||||||
 | 
					            cd source/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ${pkgs.buildPackages.xorg.lndir}/bin/lndir ${crate.src}
 | 
					            ${pkgs.buildPackages.xorg.lndir}/bin/lndir ${crate.src}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # build outputs
 | 
					            # build outputs
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ version = "0.1.0"
 | 
				
			||||||
edition = "2021"
 | 
					edition = "2021"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
nix-compat = { path = "../../../tvix/nix-compat/", features = ["async"] }
 | 
					nix-compat = { path = "../../../tvix/nix-compat", features = ["wire"] }
 | 
				
			||||||
tokio-listener = "0.3.1"
 | 
					tokio-listener = "0.3.1"
 | 
				
			||||||
tokio = { version = "1.36.0", features = ["full"] }
 | 
					tokio = { version = "1.36.0", features = ["full"] }
 | 
				
			||||||
tracing-subscriber = "0.3.18"
 | 
					tracing-subscriber = "0.3.18"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ use tokio_listener::{self, SystemOptions, UserOptions};
 | 
				
			||||||
use tracing::{debug, error, info, instrument, Level};
 | 
					use tracing::{debug, error, info, instrument, Level};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use nix_compat::wire::{
 | 
					use nix_compat::wire::{
 | 
				
			||||||
    primitive,
 | 
					    self,
 | 
				
			||||||
    worker_protocol::{self, server_handshake_client, ClientSettings, Trust},
 | 
					    worker_protocol::{self, server_handshake_client, ClientSettings, Trust},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,7 +80,7 @@ where
 | 
				
			||||||
            // TODO: implement logging. For now, we'll just send
 | 
					            // TODO: implement logging. For now, we'll just send
 | 
				
			||||||
            // STDERR_LAST, which is good enough to get Nix respond to
 | 
					            // STDERR_LAST, which is good enough to get Nix respond to
 | 
				
			||||||
            // us.
 | 
					            // us.
 | 
				
			||||||
            primitive::write_u64(&mut client_connection.conn, worker_protocol::STDERR_LAST)
 | 
					            wire::write_u64(&mut client_connection.conn, worker_protocol::STDERR_LAST)
 | 
				
			||||||
                .await
 | 
					                .await
 | 
				
			||||||
                .unwrap();
 | 
					                .unwrap();
 | 
				
			||||||
            loop {
 | 
					            loop {
 | 
				
			||||||
| 
						 | 
					@ -112,6 +112,6 @@ where
 | 
				
			||||||
        worker_protocol::read_client_settings(&mut conn.conn, conn.version_minor).await?;
 | 
					        worker_protocol::read_client_settings(&mut conn.conn, conn.version_minor).await?;
 | 
				
			||||||
    // The client expects us to send some logs when we're processing
 | 
					    // The client expects us to send some logs when we're processing
 | 
				
			||||||
    // the settings. Sending STDERR_LAST signal we're done processing.
 | 
					    // the settings. Sending STDERR_LAST signal we're done processing.
 | 
				
			||||||
    primitive::write_u64(&mut conn.conn, worker_protocol::STDERR_LAST).await?;
 | 
					    wire::write_u64(&mut conn.conn, worker_protocol::STDERR_LAST).await?;
 | 
				
			||||||
    Ok(settings)
 | 
					    Ok(settings)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue