You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					81 lines
				
				3.0 KiB
			
		
		
			
		
	
	
					81 lines
				
				3.0 KiB
			| 
											3 years ago
										 | "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)); | ||
|  | // Facilitate compressing a message using an agreed compressor
 | ||
|  | async function compress(options, dataToBeCompressed) { | ||
|  |     const zlibOptions = {}; | ||
|  |     switch (options.agreedCompressor) { | ||
|  |         case 'snappy': | ||
|  |             if ('kModuleError' in deps_1.Snappy) { | ||
|  |                 throw deps_1.Snappy['kModuleError']; | ||
|  |             } | ||
|  |             return deps_1.Snappy.compress(dataToBeCompressed); | ||
|  |         case 'zstd': | ||
|  |             if ('kModuleError' in deps_1.ZStandard) { | ||
|  |                 throw deps_1.ZStandard['kModuleError']; | ||
|  |             } | ||
|  |             return deps_1.ZStandard.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 compressor
 | ||
|  | async 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: | ||
|  |             if ('kModuleError' in deps_1.Snappy) { | ||
|  |                 throw deps_1.Snappy['kModuleError']; | ||
|  |             } | ||
|  |             return deps_1.Snappy.uncompress(compressedData, { asBuffer: true }); | ||
|  |         case exports.Compressor.zstd: | ||
|  |             if ('kModuleError' in deps_1.ZStandard) { | ||
|  |                 throw deps_1.ZStandard['kModuleError']; | ||
|  |             } | ||
|  |             return deps_1.ZStandard.decompress(compressedData); | ||
|  |         case exports.Compressor.zlib: | ||
|  |             return zlibInflate(compressedData); | ||
|  |         default: | ||
|  |             return compressedData; | ||
|  |     } | ||
|  | } | ||
|  | exports.decompress = decompress; | ||
|  | //# sourceMappingURL=compression.js.map
 |