mirror of
https://github.com/Drop-OSS/droplet.git
synced 2025-11-21 04:01:17 +10:00
fix: 7z and streams
This commit is contained in:
@ -67,7 +67,7 @@ test("read file", async (t) => {
|
||||
|
||||
let finalString = "";
|
||||
|
||||
for await (const chunk of stream.getStream()) {
|
||||
for await (const chunk of stream) {
|
||||
// Do something with each 'chunk'
|
||||
finalString += String.fromCharCode.apply(null, chunk);
|
||||
}
|
||||
@ -94,7 +94,7 @@ test("read file offset", async (t) => {
|
||||
|
||||
let finalString = "";
|
||||
|
||||
for await (const chunk of stream.getStream()) {
|
||||
for await (const chunk of stream) {
|
||||
// Do something with each 'chunk'
|
||||
finalString += String.fromCharCode.apply(null, chunk);
|
||||
}
|
||||
@ -121,7 +121,7 @@ test.skip("zip speed test", async (t) => {
|
||||
const timeThreshold = BigInt(1_000_000_000);
|
||||
let runningTotal = 0;
|
||||
let runningTime = BigInt(0);
|
||||
for await (const chunk of stream.getStream()) {
|
||||
for await (const chunk of stream) {
|
||||
// Do something with each 'chunk'
|
||||
const currentTime = process.hrtime.bigint();
|
||||
const timeDiff = currentTime - lastTime;
|
||||
@ -147,12 +147,16 @@ test.skip("zip speed test", async (t) => {
|
||||
});
|
||||
|
||||
test("zip manifest test", async (t) => {
|
||||
const zipFiles = fs.readdirSync("./assets").filter((v) => v.endsWith(".zip"));
|
||||
const dropletHandler = new DropletHandler();
|
||||
|
||||
for (const zipFile of zipFiles) {
|
||||
console.log("generating manifest for " + zipFile);
|
||||
const manifest = JSON.parse(
|
||||
await new Promise((r, e) =>
|
||||
generateManifest(
|
||||
dropletHandler,
|
||||
"./assets/TheGame.zip",
|
||||
"./assets/" + zipFile,
|
||||
(_, __) => {},
|
||||
(_, __) => {},
|
||||
(err, manifest) => (err ? e(err) : r(manifest))
|
||||
@ -161,18 +165,18 @@ test("zip manifest test", async (t) => {
|
||||
);
|
||||
|
||||
for (const [filename, data] of Object.entries(manifest)) {
|
||||
console.log(filename);
|
||||
let start = 0;
|
||||
for (const [chunkIndex, length] of data.lengths.entries()) {
|
||||
const hash = createHash("md5");
|
||||
const stream = (
|
||||
await dropletHandler.readFile(
|
||||
"./assets/TheGame.zip",
|
||||
"./assets/" + zipFile,
|
||||
filename,
|
||||
BigInt(start),
|
||||
BigInt(start + length)
|
||||
)
|
||||
).getStream();
|
||||
);
|
||||
console.log(stream);
|
||||
|
||||
let streamLength = 0;
|
||||
await stream.pipeTo(
|
||||
@ -198,6 +202,7 @@ test("zip manifest test", async (t) => {
|
||||
start += length;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
t.pass();
|
||||
});
|
||||
|
||||
6
index.d.ts
vendored
6
index.d.ts
vendored
@ -8,11 +8,7 @@ export declare class DropletHandler {
|
||||
hasBackendForPath(path: string): boolean
|
||||
listFiles(path: string): Array<string>
|
||||
peekFile(path: string, subPath: string): bigint
|
||||
readFile(path: string, subPath: string, start?: bigint | undefined | null, end?: bigint | undefined | null): JsDropStreamable
|
||||
}
|
||||
|
||||
export declare class JsDropStreamable {
|
||||
getStream(): any
|
||||
readFile(path: string, subPath: string, start?: bigint | undefined | null, end?: bigint | undefined | null): ReadableStream
|
||||
}
|
||||
|
||||
export declare class Script {
|
||||
|
||||
1
index.js
1
index.js
@ -377,7 +377,6 @@ if (!nativeBinding) {
|
||||
|
||||
module.exports = nativeBinding
|
||||
module.exports.DropletHandler = nativeBinding.DropletHandler
|
||||
module.exports.JsDropStreamable = nativeBinding.JsDropStreamable
|
||||
module.exports.Script = nativeBinding.Script
|
||||
module.exports.ScriptEngine = nativeBinding.ScriptEngine
|
||||
module.exports.callAltThreadFunc = nativeBinding.callAltThreadFunc
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@drop-oss/droplet",
|
||||
"version": "3.3.0",
|
||||
"version": "3.4.0",
|
||||
"main": "index.js",
|
||||
"types": "index.d.ts",
|
||||
"napi": {
|
||||
|
||||
@ -38,9 +38,7 @@ pub fn create_backend_constructor<'a>(
|
||||
let status = test.status().ok()?;
|
||||
if status.code().unwrap_or(1) == 0 {
|
||||
let buf = path.to_path_buf();
|
||||
return Some(Box::new(move || {
|
||||
Ok(Box::new(ZipVersionBackend::new(buf)?))
|
||||
}));
|
||||
return Some(Box::new(move || Ok(Box::new(ZipVersionBackend::new(buf)?))));
|
||||
}
|
||||
}
|
||||
|
||||
@ -111,7 +109,7 @@ impl<'a> DropletHandler<'a> {
|
||||
Ok(file.size)
|
||||
}
|
||||
|
||||
#[napi]
|
||||
#[napi(ts_return_type = "ReadableStream")]
|
||||
pub fn read_file(
|
||||
&mut self,
|
||||
reference: Reference<DropletHandler<'static>>,
|
||||
@ -120,7 +118,7 @@ impl<'a> DropletHandler<'a> {
|
||||
env: Env,
|
||||
start: Option<BigInt>,
|
||||
end: Option<BigInt>,
|
||||
) -> anyhow::Result<JsDropStreamable> {
|
||||
) -> anyhow::Result<*mut napi_value__> {
|
||||
let stream = reference.share_with(env, |handler| {
|
||||
let backend = handler
|
||||
.create_backend_for_path(path)
|
||||
@ -149,25 +147,9 @@ impl<'a> DropletHandler<'a> {
|
||||
// Apply Result::map_err to transform Err(std::io::Error) to Err(napi::Error)
|
||||
.map_err(napi::Error::from) // napi::Error implements From<tokio::io::Error>
|
||||
});
|
||||
// Create the napi-rs ReadableStream from the tokio_stream::Stream
|
||||
// The unwrap() here means if stream creation fails, it will panic.
|
||||
// For a production system, consider returning Result<Option<...>> and handling this.
|
||||
ReadableStream::create_with_stream_bytes(&env, stream)
|
||||
})?;
|
||||
|
||||
Ok(JsDropStreamable { inner: stream })
|
||||
}
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub struct JsDropStreamable {
|
||||
inner: SharedReference<DropletHandler<'static>, ReadableStream<'static, BufferSlice<'static>>>,
|
||||
}
|
||||
|
||||
#[napi]
|
||||
impl JsDropStreamable {
|
||||
#[napi]
|
||||
pub fn get_stream(&self) -> *mut napi_value__ {
|
||||
self.inner.raw()
|
||||
Ok(stream.raw())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user