This commit is contained in:
DecDuck
2025-11-20 11:38:11 +11:00
parent 416cada9f4
commit 894f2b354a
4 changed files with 29 additions and 18 deletions

View File

@ -146,7 +146,7 @@ test.skip("zip speed test", async (t) => {
t.pass(); t.pass();
}); });
test.skip("zip manifest test", async (t) => { test("zip manifest test", async (t) => {
const dropletHandler = new DropletHandler(); const dropletHandler = new DropletHandler();
const manifest = JSON.parse( const manifest = JSON.parse(
await new Promise((r, e) => await new Promise((r, e) =>
@ -161,6 +161,7 @@ test.skip("zip manifest test", async (t) => {
); );
for (const [filename, data] of Object.entries(manifest)) { for (const [filename, data] of Object.entries(manifest)) {
console.log(filename);
let start = 0; let start = 0;
for (const [chunkIndex, length] of data.lengths.entries()) { for (const [chunkIndex, length] of data.lengths.entries()) {
const hash = createHash("md5"); const hash = createHash("md5");

View File

@ -1,4 +1,4 @@
# yes "droplet is awesome" | dd of=./setup.exe bs=1024 count=1000000 # yes "droplet is awesome" | dd of=./setup.exe bs=1024 count=1000000
dd if=/dev/random of=./setup.exe bs=1024 count=1000000 dd if=/dev/random of=./setup.exe bs=1024 count=1000000
zip TheGame.zip setup.exe zip TheGame.zip setup.exe "test file.txt"
rm setup.exe rm setup.exe

View File

@ -1,6 +1,6 @@
{ {
"name": "@drop-oss/droplet", "name": "@drop-oss/droplet",
"version": "3.2.2", "version": "3.3.0",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",
"napi": { "napi": {

View File

@ -126,12 +126,15 @@ impl ZipVersionBackend {
pub struct ZipFileWrapper { pub struct ZipFileWrapper {
command: Child, command: Child,
reader: BufReader<ChildStdout> reader: BufReader<ChildStdout>,
} }
impl ZipFileWrapper { impl ZipFileWrapper {
pub fn new(mut command: Child) -> Self { pub fn new(mut command: Child) -> Self {
let stdout = command.stdout.take().expect("failed to access stdout of 7z"); let stdout = command
.stdout
.take()
.expect("failed to access stdout of 7z");
let reader = BufReader::new(stdout); let reader = BufReader::new(stdout);
ZipFileWrapper { command, reader } ZipFileWrapper { command, reader }
} }
@ -148,9 +151,9 @@ impl Read for ZipFileWrapper {
} }
impl Drop for ZipFileWrapper { impl Drop for ZipFileWrapper {
fn drop(&mut self) { fn drop(&mut self) {
self.command.wait().expect("failed to wait for 7z exit"); self.command.wait().expect("failed to wait for 7z exit");
} }
} }
impl VersionBackend for ZipVersionBackend { impl VersionBackend for ZipVersionBackend {
@ -165,24 +168,28 @@ impl VersionBackend for ZipVersionBackend {
)); ));
} }
let raw_result = String::from_utf8(result.stdout)?; let raw_result = String::from_utf8(result.stdout)?;
let files = raw_result.split("\n").filter(|v| v.len() > 0).map(|v| v.split(" ").filter(|v| v.len() > 0)); let files = raw_result
.split("\n")
.filter(|v| v.len() > 0)
.map(|v| v.split(" ").filter(|v| v.len() > 0));
let mut results = Vec::new(); let mut results = Vec::new();
for file in files { for file in files {
let mut values = file.collect::<Vec<&str>>(); let values = file.collect::<Vec<&str>>();
values.reverse();
let mut iter = values.iter(); let mut iter = values.iter();
let (name, compress, size, attrs) = ( let (date, time, attrs, size, compress, name) = (
iter.next().expect("failed to fetch name"), iter.next().expect("failed to read date"),
iter.next().expect("failed to read compressed size"), iter.next().expect("failed to read time"),
iter.next().expect("failed to read file size"), iter.next().expect("failed to read attrs"),
iter.next().expect("failed to fetch attrs") iter.next().expect("failed to read size"),
iter.next().expect("failed to read compress"),
iter.collect::<Vec<&&str>>(),
); );
if attrs.starts_with("D") { if attrs.starts_with("D") {
continue; continue;
} }
results.push(VersionFile { results.push(VersionFile {
relative_filename: name.to_owned().to_owned(), relative_filename: name.into_iter().map(|v| *v).fold(String::new(), |a, b| a + b + " ").trim_end().to_owned(),
permission: 0o744, // owner r/w/x, everyone else, read permission: 0o744, // owner r/w/x, everyone else, read
size: size.parse().unwrap(), size: size.parse().unwrap(),
}); });
@ -199,7 +206,10 @@ impl VersionBackend for ZipVersionBackend {
) -> anyhow::Result<Box<dyn MinimumFileObject + '_>> { ) -> anyhow::Result<Box<dyn MinimumFileObject + '_>> {
let mut read_command = Command::new("7z"); let mut read_command = Command::new("7z");
read_command.args(vec!["e", "-so", &self.path, &file.relative_filename]); read_command.args(vec!["e", "-so", &self.path, &file.relative_filename]);
let output = read_command.stdout(Stdio::piped()).spawn().expect("failed to spawn 7z"); let output = read_command
.stdout(Stdio::piped())
.spawn()
.expect("failed to spawn 7z");
Ok(Box::new(ZipFileWrapper::new(output))) Ok(Box::new(ZipFileWrapper::new(output)))
} }