@platformatic/kafka
Version:
Modern and performant client for Apache Kafka
114 lines (113 loc) • 4.03 kB
JavaScript
import { createRequire } from 'node:module';
import zlib from 'node:zlib';
import { UnsupportedCompressionError } from "../errors.js";
import { DynamicBuffer } from "./dynamic-buffer.js";
const require = createRequire(import.meta.url);
const { zstdCompressSync, zstdDecompressSync, gzipSync, gunzipSync } = zlib;
function ensureBuffer(data) {
return DynamicBuffer.isDynamicBuffer(data) ? data.slice() : data;
}
let snappyCompressSync;
let snappyDecompressSync;
let lz4CompressSync;
let lz4DecompressSync;
function loadSnappy() {
try {
const snappy = require('snappy');
snappyCompressSync = snappy.compressSync;
snappyDecompressSync = snappy.uncompressSync;
/* c8 ignore next 5 - In tests snappy is always available */
}
catch (e) {
throw new UnsupportedCompressionError('Cannot load snappy module, which is an optionalDependency. Please check your local installation.');
}
}
function loadLZ4() {
try {
const lz4 = require('lz4-napi');
lz4CompressSync = lz4.compressSync;
lz4DecompressSync = lz4.uncompressSync;
/* c8 ignore next 5 - In tests lz4-napi is always available */
}
catch (e) {
throw new UnsupportedCompressionError('Cannot load lz4-napi module, which is an optionalDependency. Please check your local installation.');
}
}
export const compressionsAlgorithms = {
/* c8 ignore next 8 - 'none' is actually never used but this is to please Typescript */
none: {
compressSync(data) {
return ensureBuffer(data);
},
decompressSync(data) {
return ensureBuffer(data);
},
bitmask: 0,
available: true
},
gzip: {
compressSync(data) {
return gzipSync(ensureBuffer(data));
},
decompressSync(data) {
return gunzipSync(ensureBuffer(data));
},
bitmask: 1,
available: true
},
snappy: {
compressSync(data) {
/* c8 ignore next 4 - In tests snappy is always available */
if (!snappyCompressSync) {
loadSnappy();
}
return snappyCompressSync(ensureBuffer(data));
},
decompressSync(data) {
/* c8 ignore next 4 - In tests snappy is always available */
if (!snappyDecompressSync) {
loadSnappy();
}
return snappyDecompressSync(ensureBuffer(data));
},
bitmask: 2,
available: true
},
lz4: {
compressSync(data) {
/* c8 ignore next 4 - In tests lz4-napi is always available */
if (!lz4CompressSync) {
loadLZ4();
}
return lz4CompressSync(ensureBuffer(data));
},
decompressSync(data) {
/* c8 ignore next 4 - In tests lz4-napi is always available */
if (!lz4DecompressSync) {
loadLZ4();
}
return lz4DecompressSync(ensureBuffer(data));
},
bitmask: 3,
available: true
},
zstd: {
/* c8 ignore next 7 - Tests are only run on Node.js versions that support zstd */
compressSync(data) {
if (!zstdCompressSync) {
throw new UnsupportedCompressionError('zstd is not supported in the current Node.js version');
}
return zstdCompressSync(ensureBuffer(data));
},
/* c8 ignore next 7 - Tests are only run on Node.js versions that support zstd */
decompressSync(data) {
if (!zstdCompressSync) {
throw new UnsupportedCompressionError('zstd is not supported in the current Node.js version');
}
return zstdDecompressSync(ensureBuffer(data));
},
bitmask: 4,
available: typeof zstdCompressSync === 'function'
}
};
export const compressionsAlgorithmsByBitmask = Object.fromEntries(Object.values(compressionsAlgorithms).map(a => [a.bitmask, a]));