summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/unit_node/zlib_test.ts30
-rw-r--r--ext/node/polyfills/_zlib.mjs21
2 files changed, 48 insertions, 3 deletions
diff --git a/cli/tests/unit_node/zlib_test.ts b/cli/tests/unit_node/zlib_test.ts
index 1819be268..fa94493c1 100644
--- a/cli/tests/unit_node/zlib_test.ts
+++ b/cli/tests/unit_node/zlib_test.ts
@@ -9,6 +9,8 @@ import {
createBrotliCompress,
createBrotliDecompress,
createDeflate,
+ gzipSync,
+ unzipSync,
} from "node:zlib";
import { Buffer } from "node:buffer";
import { createReadStream, createWriteStream } from "node:fs";
@@ -32,6 +34,13 @@ Deno.test("brotli compression async", async () => {
assertEquals(decompressed.toString(), "hello world");
});
+Deno.test("gzip compression sync", { sanitizeResources: false }, () => {
+ const buf = Buffer.from("hello world");
+ const compressed = gzipSync(buf);
+ const decompressed = unzipSync(compressed);
+ assertEquals(decompressed.toString(), "hello world");
+});
+
Deno.test("brotli compression", async () => {
const { promise, resolve } = Promise.withResolvers<void>();
const compress = createBrotliCompress();
@@ -125,3 +134,24 @@ Deno.test("should work with a buffer from an encoded string", () => {
const decompressed = brotliDecompressSync(compressed);
assertEquals(decompressed.toString(), "hello world");
});
+
+Deno.test(
+ "zlib compression with dataview",
+ { sanitizeResources: false },
+ () => {
+ const buf = Buffer.from("hello world");
+ const compressed = gzipSync(new DataView(buf.buffer));
+ const decompressed = unzipSync(compressed);
+ assertEquals(decompressed.toString(), "hello world");
+ },
+);
+
+Deno.test("zlib compression with an encoded string", {
+ sanitizeResources: false,
+}, () => {
+ const encoder = new TextEncoder();
+ const buffer = encoder.encode("hello world");
+ const compressed = gzipSync(buffer);
+ const decompressed = unzipSync(compressed);
+ assertEquals(decompressed.toString(), "hello world");
+});
diff --git a/ext/node/polyfills/_zlib.mjs b/ext/node/polyfills/_zlib.mjs
index a66ab6d04..15a0a51e3 100644
--- a/ext/node/polyfills/_zlib.mjs
+++ b/ext/node/polyfills/_zlib.mjs
@@ -155,10 +155,27 @@ export const inflateRawSync = function (buffer, opts) {
return zlibBufferSync(new InflateRaw(opts), buffer);
};
+function sanitizeInput(input) {
+ if (typeof input === "string") input = Buffer.from(input);
+
+ if (
+ !Buffer.isBuffer(input) &&
+ (input.buffer && !input.buffer.constructor === ArrayBuffer)
+ ) throw new TypeError("Not a string, buffer or dataview");
+
+ if (input.buffer) {
+ input = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
+ }
+
+ return input;
+}
+
function zlibBuffer(engine, buffer, callback) {
var buffers = [];
var nread = 0;
+ buffer = sanitizeInput(buffer);
+
engine.on("error", onError);
engine.on("end", onEnd);
@@ -197,9 +214,7 @@ function zlibBuffer(engine, buffer, callback) {
}
function zlibBufferSync(engine, buffer) {
- if (typeof buffer === "string") buffer = Buffer.from(buffer);
-
- if (!Buffer.isBuffer(buffer)) throw new TypeError("Not a string or buffer");
+ buffer = sanitizeInput(buffer);
var flushFlag = engine._finishFlushFlag;