Skip to content

Commit 2c1a917

Browse files
committed
feat(NODE-1837): support passing compression level
1 parent 5577fc8 commit 2c1a917

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33

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

6-
export function compress(data: Buffer): Promise<Buffer>
6+
export function compress(data: Buffer, level?: number | undefined | null): Promise<Buffer>
77
export function decompress(data: Buffer): Promise<Buffer>

src/lib.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ use napi::{
77
};
88
use zstd::stream::{encode_all, decode_all};
99

10+
const DEFAULT_LEVEL: i32 = 3;
11+
1012
struct Encoder {
11-
data: Ref<JsBufferValue>
13+
data: Ref<JsBufferValue>,
14+
level: i32
1215
}
1316

1417
#[napi]
@@ -18,7 +21,7 @@ impl Task for Encoder {
1821

1922
fn compute(&mut self) -> Result<Self::Output> {
2023
let data: &[u8] = self.data.as_ref();
21-
encode_all(data, 3).map_err(|e| Error::new(Status::GenericFailure, format!("{}", e)))
24+
encode_all(data, self.level).map_err(|e| Error::new(Status::GenericFailure, format!("{}", e)))
2225
}
2326

2427
fn resolve(&mut self, env: Env, output: Self::Output) -> Result<JsBuffer> {
@@ -56,9 +59,10 @@ impl Task for Decoder {
5659
}
5760

5861
#[napi]
59-
fn compress(data: JsBuffer) -> Result<AsyncTask<Encoder>> {
62+
fn compress(data: JsBuffer, level: Option<i32>) -> Result<AsyncTask<Encoder>> {
6063
let encoder = Encoder {
6164
data: data.into_ref()?,
65+
level: level.unwrap_or(DEFAULT_LEVEL)
6266
};
6367
Ok(AsyncTask::new(encoder))
6468
}

test/index.test.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,36 @@ describe('zstd', () => {
55
describe('#compress', () => {
66
const buffer = Buffer.from('test');
77

8-
it('returns a compressed buffer', async () => {
9-
const result = await compress(buffer);
10-
expect(await decompress(result)).to.deep.equal(buffer);
8+
context('when not providing a compression level', () => {
9+
it('returns a compressed buffer', async () => {
10+
const result = await compress(buffer);
11+
expect(await decompress(result)).to.deep.equal(buffer);
12+
});
13+
});
14+
15+
context('when providing a compression level', () => {
16+
context('when the level is valid', () => {
17+
it('returns a compressed buffer', async () => {
18+
const result = await compress(buffer, 1);
19+
expect(await decompress(result)).to.deep.equal(buffer);
20+
});
21+
});
22+
23+
context('when the level is invalid', () => {
24+
context('when the level is too high', () => {
25+
it('returns a compressed buffer', async () => {
26+
const result = await compress(buffer, 100);
27+
expect(await decompress(result)).to.deep.equal(buffer);
28+
});
29+
});
30+
31+
context('when the level is too low', () => {
32+
it('returns a compressed buffer', async () => {
33+
const result = await compress(buffer, -100);
34+
expect(await decompress(result)).to.deep.equal(buffer);
35+
});
36+
});
37+
});
1138
});
1239
});
1340
});

0 commit comments

Comments
 (0)