Skip to content

Commit 16e215a

Browse files
committed
feat: update to idomatic rust
1 parent 7e40311 commit 16e215a

File tree

2 files changed

+64
-21
lines changed

2 files changed

+64
-21
lines changed

Diff for: index.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33

44
/* auto-generated by NAPI-RS */
55

6-
export function compress(buffer: Buffer): Promise<Buffer>
7-
export function decompress(buffer: Buffer): Promise<Buffer>
6+
export function compress(data: Buffer): Promise<Buffer>
7+
export function decompress(data: Buffer): Promise<Buffer>

Diff for: src/lib.rs

+62-19
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,71 @@
11
#[macro_use]
22
extern crate napi_derive;
3-
extern crate tokio;
43

5-
use napi::bindgen_prelude::*;
6-
use async_compression::tokio::bufread::ZstdDecoder;
7-
use async_compression::tokio::write::ZstdEncoder;
8-
use tokio::io::AsyncReadExt as _;
9-
use tokio::io::AsyncWriteExt as _;
10-
use tokio::io::{BufReader, BufWriter};
4+
use napi::{
5+
bindgen_prelude::AsyncTask,
6+
Env, JsBuffer, JsBufferValue, Ref, Result, Task,
7+
};
8+
9+
struct Encoder {
10+
data: Ref<JsBufferValue>
11+
}
12+
13+
#[napi]
14+
impl Task for Encoder {
15+
type Output = Vec<u8>;
16+
type JsValue = JsBuffer;
17+
18+
fn compute(&mut self) -> Result<Self::Output> {
19+
let data: &[u8] = self.data.as_ref();
20+
Ok(data.to_vec())
21+
}
22+
23+
fn resolve(&mut self, env: Env, output: Self::Output) -> Result<JsBuffer> {
24+
env.create_buffer_with_data(output).map(|b| b.into_raw())
25+
}
26+
27+
fn finally(&mut self, env: Env) -> Result<()> {
28+
self.data.unref(env)?;
29+
Ok(())
30+
}
31+
}
32+
33+
struct Decoder {
34+
data: Ref<JsBufferValue>
35+
}
36+
37+
#[napi]
38+
impl Task for Decoder {
39+
type Output = Vec<u8>;
40+
type JsValue = JsBuffer;
41+
42+
fn compute(&mut self) -> Result<Self::Output> {
43+
let data: &[u8] = self.data.as_ref();
44+
Ok(data.to_vec())
45+
}
46+
47+
fn resolve(&mut self, env: Env, output: Self::Output) -> Result<JsBuffer> {
48+
env.create_buffer_with_data(output).map(|b| b.into_raw())
49+
}
50+
51+
fn finally(&mut self, env: Env) -> Result<()> {
52+
self.data.unref(env)?;
53+
Ok(())
54+
}
55+
}
1156

1257
#[napi]
13-
async fn compress(buffer: Buffer) -> Result<Buffer> {
14-
let input: Vec<u8> = buffer.into();
15-
let mut encoder = ZstdEncoder::new(BufWriter::new(input));
16-
let mut output: Vec<u8> = vec![];
17-
encoder.write_all(&mut output).await?;
18-
Ok(Buffer::from(output))
58+
fn compress(data: JsBuffer) -> Result<AsyncTask<Encoder>> {
59+
let encoder = Encoder {
60+
data: data.into_ref()?,
61+
};
62+
Ok(AsyncTask::new(encoder))
1963
}
2064

2165
#[napi]
22-
async fn decompress(buffer: Buffer) -> Result<Buffer> {
23-
let input: Vec<u8> = buffer.into();
24-
let mut decoder = ZstdDecoder::new(BufReader::new(input.as_slice()));
25-
let mut output: Vec<u8> = vec![];
26-
decoder.read_to_end(&mut output).await?;
27-
Ok(Buffer::from(output))
66+
fn decompress(data: JsBuffer) -> Result<AsyncTask<Decoder>> {
67+
let decoder = Decoder {
68+
data: data.into_ref()?,
69+
};
70+
Ok(AsyncTask::new(decoder))
2871
}

0 commit comments

Comments
 (0)