Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

node:zlib implem: Expose zlib.constants #2496

Merged
merged 1 commit into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading