| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.decompress = exports.compress = exports.uncompressibleCommands = exports.Compressor = void 0;const util_1 = require("util");const zlib = require("zlib");const constants_1 = require("../../constants");const deps_1 = require("../../deps");const error_1 = require("../../error");/** @public */exports.Compressor = Object.freeze({    none: 0,    snappy: 1,    zlib: 2,    zstd: 3});exports.uncompressibleCommands = new Set([    constants_1.LEGACY_HELLO_COMMAND,    'saslStart',    'saslContinue',    'getnonce',    'authenticate',    'createUser',    'updateUser',    'copydbSaslStart',    'copydbgetnonce',    'copydb']);const ZSTD_COMPRESSION_LEVEL = 3;const zlibInflate = (0, util_1.promisify)(zlib.inflate.bind(zlib));const zlibDeflate = (0, util_1.promisify)(zlib.deflate.bind(zlib));let zstd;let Snappy = null;function loadSnappy() {    if (Snappy == null) {        const snappyImport = (0, deps_1.getSnappy)();        if ('kModuleError' in snappyImport) {            throw snappyImport.kModuleError;        }        Snappy = snappyImport;    }    return Snappy;}// Facilitate compressing a message using an agreed compressorasync function compress(options, dataToBeCompressed) {    const zlibOptions = {};    switch (options.agreedCompressor) {        case 'snappy': {            Snappy ??= loadSnappy();            return Snappy.compress(dataToBeCompressed);        }        case 'zstd': {            loadZstd();            if ('kModuleError' in zstd) {                throw zstd['kModuleError'];            }            return zstd.compress(dataToBeCompressed, ZSTD_COMPRESSION_LEVEL);        }        case 'zlib': {            if (options.zlibCompressionLevel) {                zlibOptions.level = options.zlibCompressionLevel;            }            return zlibDeflate(dataToBeCompressed, zlibOptions);        }        default: {            throw new error_1.MongoInvalidArgumentError(`Unknown compressor ${options.agreedCompressor} failed to compress`);        }    }}exports.compress = compress;// Decompress a message using the given compressorasync function decompress(compressorID, compressedData) {    if (compressorID !== exports.Compressor.snappy &&        compressorID !== exports.Compressor.zstd &&        compressorID !== exports.Compressor.zlib &&        compressorID !== exports.Compressor.none) {        throw new error_1.MongoDecompressionError(`Server sent message compressed using an unsupported compressor. (Received compressor ID ${compressorID})`);    }    switch (compressorID) {        case exports.Compressor.snappy: {            Snappy ??= loadSnappy();            return Snappy.uncompress(compressedData, { asBuffer: true });        }        case exports.Compressor.zstd: {            loadZstd();            if ('kModuleError' in zstd) {                throw zstd['kModuleError'];            }            return zstd.decompress(compressedData);        }        case exports.Compressor.zlib: {            return zlibInflate(compressedData);        }        default: {            return compressedData;        }    }}exports.decompress = decompress;/** * Load ZStandard if it is not already set. */function loadZstd() {    if (!zstd) {        zstd = (0, deps_1.getZstdLibrary)();    }}//# sourceMappingURL=compression.js.map
 |