Skip to content

Commit

Permalink
Merge pull request #2496 from cloudflare/npaun/zlib-sync-1
Browse files Browse the repository at this point in the history
node:zlib implem: Expose zlib.constants
  • Loading branch information
npaun authored Aug 12, 2024
2 parents 633dc99 + ad2cb1c commit 938fd9d
Show file tree
Hide file tree
Showing 7 changed files with 435 additions and 10 deletions.
18 changes: 17 additions & 1 deletion src/node/internal/internal_zlib.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { default as zlibUtil } from 'node-internal:zlib';
import { Buffer } from 'node-internal:internal_buffer';
import { validateUint32 } from 'node-internal:validators';
import { validateUint32 } from 'node-internal:validators';
import { isArrayBufferView } from 'node-internal:internal_types';
import { ERR_INVALID_ARG_TYPE } from 'node-internal:internal_errors';

Expand All @@ -14,6 +14,22 @@ function crc32(data: ArrayBufferView | string, value: number = 0): number {
return zlibUtil.crc32(data, value);
}


const constPrefix = 'CONST_';
const constants = {};

// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
Object.defineProperties(constants, Object.fromEntries(Object.entries(Object.getPrototypeOf(zlibUtil))
.filter(([k,]) => k.startsWith(constPrefix))
.map(([k, v]) => [k.slice(constPrefix.length), {
value: v,
writable: false,
configurable: false,
enumerable: true
}])
));

export {
crc32,
constants,
}
114 changes: 114 additions & 0 deletions src/node/internal/zlib.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,115 @@
export function crc32(data: ArrayBufferView, value: number): number;

// zlib.constants (part of the API contract for node:zlib)
export const CONST_Z_NO_FLUSH: number;
export const CONST_Z_PARTIAL_FLUSH: number;
export const CONST_Z_SYNC_FLUSH: number;
export const CONST_Z_FULL_FLUSH: number;
export const CONST_Z_FINISH: number;
export const CONST_Z_BLOCK: number;

export const CONST_Z_OK: number;
export const CONST_Z_STREAM_END: number;
export const CONST_Z_NEED_DICT: number;
export const CONST_Z_ERRNO: number;
export const CONST_Z_STREAM_ERROR: number;
export const CONST_Z_DATA_ERROR: number;
export const CONST_Z_MEM_ERROR: number;
export const CONST_Z_BUF_ERROR: number;
export const CONST_Z_VERSION_ERROR: number;

export const CONST_Z_NO_COMPRESSION: number;
export const CONST_Z_BEST_SPEED: number;
export const CONST_Z_BEST_COMPRESSION: number;
export const CONST_Z_DEFAULT_COMPRESSION: number;
export const CONST_Z_FILTERED: number;
export const CONST_Z_HUFFMAN_ONLY: number;
export const CONST_Z_RLE: number;
export const CONST_Z_FIXED: number;
export const CONST_Z_DEFAULT_STRATEGY: number;
export const CONST_ZLIB_VERNUM: number;

export const CONST_DEFLATE: number;
export const CONST_INFLATE: number;
export const CONST_GZIP: number;
export const CONST_GUNZIP: number;
export const CONST_DEFLATERAW: number;
export const CONST_INFLATERAW: number;
export const CONST_UNZIP: number;
export const CONST_BROTLI_DECODE: number;
export const CONST_BROTLI_ENCODE: number;

export const CONST_Z_MIN_WINDOWBITS: number;
export const CONST_Z_MAX_WINDOWBITS: number;
export const CONST_Z_DEFAULT_WINDOWBITS: number;
export const CONST_Z_MIN_CHUNK: number;
export const CONST_Z_MAX_CHUNK: number;
export const CONST_Z_DEFAULT_CHUNK: number;
export const CONST_Z_MIN_MEMLEVEL: number;
export const CONST_Z_MAX_MEMLEVEL: number;
export const CONST_Z_DEFAULT_MEMLEVEL: number;
export const CONST_Z_MIN_LEVEL: number;
export const CONST_Z_MAX_LEVEL: number;
export const CONST_Z_DEFAULT_LEVEL: number;

export const CONST_BROTLI_OPERATION_PROCESS: number;
export const CONST_BROTLI_OPERATION_FLUSH: number;
export const CONST_BROTLI_OPERATION_FINISH: number;
export const CONST_BROTLI_OPERATION_EMIT_METADATA: number;
export const CONST_BROTLI_PARAM_MODE: number;
export const CONST_BROTLI_MODE_GENERIC: number;
export const CONST_BROTLI_MODE_TEXT: number;
export const CONST_BROTLI_MODE_FONT: number;
export const CONST_BROTLI_DEFAULT_MODE: number;
export const CONST_BROTLI_PARAM_QUALITY: number;
export const CONST_BROTLI_MIN_QUALITY: number;
export const CONST_BROTLI_MAX_QUALITY: number;
export const CONST_BROTLI_DEFAULT_QUALITY: number;
export const CONST_BROTLI_PARAM_LGWIN: number;
export const CONST_BROTLI_MIN_WINDOW_BITS: number;
export const CONST_BROTLI_MAX_WINDOW_BITS: number;
export const CONST_BROTLI_LARGE_MAX_WINDOW_BITS: number;
export const CONST_BROTLI_DEFAULT_WINDOW: number;
export const CONST_BROTLI_PARAM_LGBLOCK: number;
export const CONST_BROTLI_MIN_INPUT_BLOCK_BITS: number;
export const CONST_BROTLI_MAX_INPUT_BLOCK_BITS: number;
export const CONST_BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: number;
export const CONST_BROTLI_PARAM_SIZE_HINT: number;
export const CONST_BROTLI_PARAM_LARGE_WINDOW: number;
export const CONST_BROTLI_PARAM_NPOSTFIX: number;
export const CONST_BROTLI_PARAM_NDIRECT: number;
export const CONST_BROTLI_DECODER_RESULT_ERROR: number;
export const CONST_BROTLI_DECODER_RESULT_SUCCESS: number;
export const CONST_BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: number;
export const CONST_BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: number;
export const CONST_BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: number;
export const CONST_BROTLI_DECODER_PARAM_LARGE_WINDOW: number;
export const CONST_BROTLI_DECODER_NO_ERROR: number;
export const CONST_BROTLI_DECODER_SUCCESS: number;
export const CONST_BROTLI_DECODER_NEEDS_MORE_INPUT: number;
export const CONST_BROTLI_DECODER_NEEDS_MORE_OUTPUT: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_RESERVED: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_PADDING_1: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_PADDING_2: number;
export const CONST_BROTLI_DECODER_ERROR_FORMAT_DISTANCE: number;
export const CONST_BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: number;
export const CONST_BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: number;
export const CONST_BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: number;
export const CONST_BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: number;
export const CONST_BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: number;
export const CONST_BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: number;
export const CONST_BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: number;
export const CONST_BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: number;
export const CONST_BROTLI_DECODER_ERROR_UNREACHABLE: number;
4 changes: 3 additions & 1 deletion src/node/zlib.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { crc32 } from 'node-internal:internal_zlib';
import { crc32, constants } from 'node-internal:internal_zlib';

export {
crc32,
constants,
}

export default {
crc32,
constants,
}
2 changes: 1 addition & 1 deletion src/workerd/api/node/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ wd_cc_library(
hdrs = glob(["**/*.h"]),
implementation_deps = [
"//src/workerd/util:perfetto",
"@capnp-cpp//src/kj/compat:kj-brotli",
"@capnp-cpp//src/kj/compat:kj-gzip",
"@simdutf",
"@nbytes",
],
visibility = ["//visibility:public"],
deps = [
"//src/workerd/io",
"@capnp-cpp//src/kj/compat:kj-brotli",
],
)

Expand Down
117 changes: 116 additions & 1 deletion src/workerd/api/node/tests/zlib-nodejs-test.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import {
strictEqual,
throws,
deepStrictEqual
} from 'node:assert';
import { Buffer } from 'node:buffer';
import { crc32 } from 'node:zlib';
import { crc32, constants } from 'node:zlib';


// The following test data comes from
Expand Down Expand Up @@ -213,3 +214,117 @@ export const crc32Test = {
});
}
}

export const constantsTest = {
test() {
deepStrictEqual(Object.keys(constants).sort(), [
"BROTLI_DECODE",
"BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES",
"BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP",
"BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES",
"BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1",
"BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2",
"BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS",
"BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET",
"BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1",
"BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2",
"BROTLI_DECODER_ERROR_FORMAT_CL_SPACE",
"BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT",
"BROTLI_DECODER_ERROR_FORMAT_DICTIONARY",
"BROTLI_DECODER_ERROR_FORMAT_DISTANCE",
"BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE",
"BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE",
"BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE",
"BROTLI_DECODER_ERROR_FORMAT_PADDING_1",
"BROTLI_DECODER_ERROR_FORMAT_PADDING_2",
"BROTLI_DECODER_ERROR_FORMAT_RESERVED",
"BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET",
"BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME",
"BROTLI_DECODER_ERROR_FORMAT_TRANSFORM",
"BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS",
"BROTLI_DECODER_ERROR_INVALID_ARGUMENTS",
"BROTLI_DECODER_ERROR_UNREACHABLE",
"BROTLI_DECODER_NEEDS_MORE_INPUT",
"BROTLI_DECODER_NEEDS_MORE_OUTPUT",
"BROTLI_DECODER_NO_ERROR",
"BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION",
"BROTLI_DECODER_PARAM_LARGE_WINDOW",
"BROTLI_DECODER_RESULT_ERROR",
"BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT",
"BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT",
"BROTLI_DECODER_RESULT_SUCCESS",
"BROTLI_DECODER_SUCCESS",
"BROTLI_DEFAULT_MODE",
"BROTLI_DEFAULT_QUALITY",
"BROTLI_DEFAULT_WINDOW",
"BROTLI_ENCODE",
"BROTLI_LARGE_MAX_WINDOW_BITS",
"BROTLI_MAX_INPUT_BLOCK_BITS",
"BROTLI_MAX_QUALITY",
"BROTLI_MAX_WINDOW_BITS",
"BROTLI_MIN_INPUT_BLOCK_BITS",
"BROTLI_MIN_QUALITY",
"BROTLI_MIN_WINDOW_BITS",
"BROTLI_MODE_FONT",
"BROTLI_MODE_GENERIC",
"BROTLI_MODE_TEXT",
"BROTLI_OPERATION_EMIT_METADATA",
"BROTLI_OPERATION_FINISH",
"BROTLI_OPERATION_FLUSH",
"BROTLI_OPERATION_PROCESS",
"BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING",
"BROTLI_PARAM_LARGE_WINDOW",
"BROTLI_PARAM_LGBLOCK",
"BROTLI_PARAM_LGWIN",
"BROTLI_PARAM_MODE",
"BROTLI_PARAM_NDIRECT",
"BROTLI_PARAM_NPOSTFIX",
"BROTLI_PARAM_QUALITY",
"BROTLI_PARAM_SIZE_HINT",
"DEFLATE",
"DEFLATERAW",
"GUNZIP",
"GZIP",
"INFLATE",
"INFLATERAW",
"UNZIP",
"ZLIB_VERNUM",
"Z_BEST_COMPRESSION",
"Z_BEST_SPEED",
"Z_BLOCK",
"Z_BUF_ERROR",
"Z_DATA_ERROR",
"Z_DEFAULT_CHUNK",
"Z_DEFAULT_COMPRESSION",
"Z_DEFAULT_LEVEL",
"Z_DEFAULT_MEMLEVEL",
"Z_DEFAULT_STRATEGY",
"Z_DEFAULT_WINDOWBITS",
"Z_ERRNO",
"Z_FILTERED",
"Z_FINISH",
"Z_FIXED",
"Z_FULL_FLUSH",
"Z_HUFFMAN_ONLY",
"Z_MAX_CHUNK",
"Z_MAX_LEVEL",
"Z_MAX_MEMLEVEL",
"Z_MAX_WINDOWBITS",
"Z_MEM_ERROR",
"Z_MIN_CHUNK",
"Z_MIN_LEVEL",
"Z_MIN_MEMLEVEL",
"Z_MIN_WINDOWBITS",
"Z_NEED_DICT",
"Z_NO_COMPRESSION",
"Z_NO_FLUSH",
"Z_OK",
"Z_PARTIAL_FLUSH",
"Z_RLE",
"Z_STREAM_END",
"Z_STREAM_ERROR",
"Z_SYNC_FLUSH",
"Z_VERSION_ERROR"
]);
}
}
4 changes: 0 additions & 4 deletions src/workerd/api/node/zlib-util.c++
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,9 @@
// https://opensource.org/licenses/Apache-2.0
#include "zlib-util.h"

#include "zlib.h"

namespace workerd::api::node {

uint32_t ZlibUtil::crc32Sync(kj::Array<kj::byte> data, uint32_t value) {
// Note: Bytef is defined in zlib.h
return crc32(value, reinterpret_cast<const Bytef*>(data.begin()), data.size());
}

} // namespace workerd::api::node
Loading

0 comments on commit 938fd9d

Please sign in to comment.