Skip to content

Commit

Permalink
Implement brotli one shot methods
Browse files Browse the repository at this point in the history
  • Loading branch information
npaun committed Sep 5, 2024
1 parent 71dc488 commit 3f23a80
Show file tree
Hide file tree
Showing 6 changed files with 281 additions and 63 deletions.
38 changes: 38 additions & 0 deletions src/node/internal/internal_zlib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,20 @@ export function unzipSync(
return Buffer.from(zlibUtil.zlibSync(data, options, zlibUtil.CONST_UNZIP));
}

export function brotliDecompressSync(
data: ArrayBufferView | string,
options: BrotliOptions = {}
): Buffer {
return Buffer.from(zlibUtil.brotliDecompressSync(data, options));
}

export function brotliCompressSync(
data: ArrayBufferView | string,
options: BrotliOptions = {}
): Buffer {
return Buffer.from(zlibUtil.brotliCompressSync(data, options));
}

function normalizeArgs(
optionsOrCallback: ZlibOptions | CompressCallback<Error, Buffer>,
callbackOrUndefined?: CompressCallback<Error, Buffer>
Expand Down Expand Up @@ -209,6 +223,30 @@ export function gzip(
zlibUtil.zlib(data, options, zlibUtil.CONST_GZIP, wrapCallback(callback));
}

export function brotliDecompress(
data: ArrayBufferView | string,
optionsOrCallback: BrotliOptions | CompressCallback<Error, Buffer>,
callbackOrUndefined?: CompressCallback<Error, Buffer>
): void {
const [options, callback] = normalizeArgs(
optionsOrCallback,
callbackOrUndefined
);
zlibUtil.brotliDecompress(data, options, wrapCallback(callback));
}

export function brotliCompress(
data: ArrayBufferView | string,
optionsOrCallback: BrotliOptions | CompressCallback<Error, Buffer>,
callbackOrUndefined?: CompressCallback<Error, Buffer>
): void {
const [options, callback] = normalizeArgs(
optionsOrCallback,
callbackOrUndefined
);
zlibUtil.brotliCompress(data, options, wrapCallback(callback));
}

export class Gzip extends Zlib {
public constructor(options: ZlibOptions) {
super(options, CONST_GZIP);
Expand Down
20 changes: 20 additions & 0 deletions src/node/internal/zlib.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,27 @@ export function zlib(
options: ZlibOptions,
mode: number,
cb: CompressCallback<string, ArrayBuffer>
): void;

export function brotliDecompressSync(
data: ArrayBufferView | string,
options: BrotliOptions
): ArrayBuffer;
export function brotliDecompress(
data: ArrayBufferView | string,
options: BrotliOptions,
cb: CompressCallback<string, ArrayBuffer>
): void;

export function brotliCompressSync(
data: ArrayBufferView | string,
options: BrotliOptions
): ArrayBuffer;
export function brotliCompress(
data: ArrayBufferView | string,
options: BrotliOptions,
cb: CompressCallback<string, ArrayBuffer>
): void;

// zlib.constants (part of the API contract for node:zlib)
export const CONST_Z_NO_FLUSH: number;
Expand Down
12 changes: 12 additions & 0 deletions src/node/zlib.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ const gunzip = protectMethod(zlib.gunzip);
const gunzipSync = protectMethod(zlib.gunzipSync);
const unzip = protectMethod(zlib.unzip);
const unzipSync = protectMethod(zlib.unzipSync);
const brotliCompress = protectMethod(zlib.brotliCompress);
const brotliDecompressSync = protectMethod(zlib.brotliDecompressSync);
const brotliDecompress = protectMethod(zlib.brotliDecompress);
const brotliCompressSync = protectMethod(zlib.brotliCompressSync);

export {
crc32,
Expand Down Expand Up @@ -92,6 +96,10 @@ export {
gunzipSync,
unzip,
unzipSync,
brotliDecompress,
brotliDecompressSync,
brotliCompress,
brotliCompressSync,
};

export default {
Expand Down Expand Up @@ -136,4 +144,8 @@ export default {
gunzipSync,
unzip,
unzipSync,
brotliDecompress,
brotliDecompressSync,
brotliCompress,
brotliCompressSync,
};
57 changes: 56 additions & 1 deletion src/workerd/api/node/tests/zlib-nodejs-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2090,6 +2090,61 @@ export const convenienceMethods = {
},
};

// Test taken from
// https://github.com/nodejs/node/blob/2bd6a57b7b934afcaf437a90e2abebcb79c13acf/test/parallel/test-zlib-brotli-from-string.js
export const brotliFromString = {
async test() {
const inputString =
'ΩΩLorem ipsum dolor sit amet, consectetur adipiscing eli' +
't. Morbi faucibus, purus at gravida dictum, libero arcu ' +
'convallis lacus, in commodo libero metus eu nisi. Nullam' +
' commodo, neque nec porta placerat, nisi est fermentum a' +
'ugue, vitae gravida tellus sapien sit amet tellus. Aenea' +
'n non diam orci. Proin quis elit turpis. Suspendisse non' +
' diam ipsum. Suspendisse nec ullamcorper odio. Vestibulu' +
'm arcu mi, sodales non suscipit id, ultrices ut massa. S' +
'ed ac sem sit amet arcu malesuada fermentum. Nunc sed. ';
const compressedString =
'G/gBQBwHdky2aHV5KK9Snf05//1pPdmNw/7232fnIm1IB' +
'K1AA8RsN8OB8Nb7Lpgk3UWWUlzQXZyHQeBBbXMTQXC1j7' +
'wg3LJs9LqOGHRH2bj/a2iCTLLx8hBOyTqgoVuD1e+Qqdn' +
'f1rkUNyrWq6LtOhWgxP3QUwdhKGdZm3rJWaDDBV7+pDk1' +
'MIkrmjp4ma2xVi5MsgJScA3tP1I7mXeby6MELozrwoBQD' +
'mVTnEAicZNj4lkGqntJe2qSnGyeMmcFgraK94vCg/4iLu' +
'Tw5RhKhnVY++dZ6niUBmRqIutsjf5TzwF5iAg8a9UkjF5' +
'2eZ0tB2vo6v8SqVfNMkBmmhxr0NT9LkYF69aEjlYzj7IE' +
'KmEUQf1HBogRYhFIt4ymRNEgHAIzOyNEsQM=';

{
const { promise, resolve } = Promise.withResolvers();

zlib.brotliCompress(inputString, (err, buffer) => {
assert.ifError(err);
assert(inputString.length > buffer.length);

zlib.brotliDecompress(buffer, (err, buffer) => {
assert.ifError(err);
assert.strictEqual(buffer.toString(), inputString);
resolve();
});
});
await promise;
}

{
const { promise, resolve } = Promise.withResolvers();
const buffer = Buffer.from(compressedString, 'base64');
zlib.brotliDecompress(buffer, (err, buffer) => {
assert.ifError(err);
assert.strictEqual(buffer.toString(), inputString);
resolve();
});

await promise;
}
},
};

// Node.js tests relevant to zlib
//
// - [ ] test-zlib-brotli-16GB.js
Expand All @@ -2107,7 +2162,7 @@ export const convenienceMethods = {
// - [x] test-zlib-flush-flags.js
// - [ ] test-zlib-kmaxlength-rangeerror.js
// - [ ] test-zlib-unused-weak.js
// - [ ] test-zlib-brotli-from-string.js
// - [x] test-zlib-brotli-from-string.js
// - [x] test-zlib-deflate-constructors.js
// - [x] test-zlib-flush.js
// - [ ] test-zlib-maxOutputLength.js
Expand Down
Loading

0 comments on commit 3f23a80

Please sign in to comment.