@@ -2,7 +2,7 @@ import { promisify } from 'util';
22import * as zlib from 'zlib' ;
33
44import { LEGACY_HELLO_COMMAND } from '../../constants' ;
5- import { Snappy , ZStandard } from '../../deps' ;
5+ import { getZstdLibrary , Snappy , ZStandard } from '../../deps' ;
66import { MongoDecompressionError , MongoInvalidArgumentError } from '../../error' ;
77
88/** @public */
@@ -37,35 +37,39 @@ const ZSTD_COMPRESSION_LEVEL = 3;
3737const zlibInflate = promisify ( zlib . inflate . bind ( zlib ) ) ;
3838const zlibDeflate = promisify ( zlib . deflate . bind ( zlib ) ) ;
3939
40+ let zstd : typeof ZStandard ;
41+
4042// Facilitate compressing a message using an agreed compressor
4143export async function compress (
4244 options : { zlibCompressionLevel : number ; agreedCompressor : CompressorName } ,
4345 dataToBeCompressed : Buffer
4446) : Promise < Buffer > {
4547 const zlibOptions = { } as zlib . ZlibOptions ;
4648 switch ( options . agreedCompressor ) {
47- case 'snappy' :
49+ case 'snappy' : {
4850 if ( 'kModuleError' in Snappy ) {
4951 throw Snappy [ 'kModuleError' ] ;
5052 }
5153 return Snappy . compress ( dataToBeCompressed ) ;
52-
53- case 'zstd' :
54- if ( 'kModuleError' in ZStandard ) {
55- throw ZStandard [ 'kModuleError' ] ;
54+ }
55+ case 'zstd' : {
56+ loadZstd ( ) ;
57+ if ( 'kModuleError' in zstd ) {
58+ throw zstd [ 'kModuleError' ] ;
5659 }
57- return ZStandard . compress ( dataToBeCompressed , ZSTD_COMPRESSION_LEVEL ) ;
58-
59- case 'zlib' :
60+ return zstd . compress ( dataToBeCompressed , ZSTD_COMPRESSION_LEVEL ) ;
61+ }
62+ case 'zlib' : {
6063 if ( options . zlibCompressionLevel ) {
6164 zlibOptions . level = options . zlibCompressionLevel ;
6265 }
6366 return zlibDeflate ( dataToBeCompressed , zlibOptions ) ;
64-
65- default :
67+ }
68+ default : {
6669 throw new MongoInvalidArgumentError (
6770 `Unknown compressor ${ options . agreedCompressor } failed to compress`
6871 ) ;
72+ }
6973 }
7074}
7175
@@ -83,22 +87,33 @@ export async function decompress(compressorID: number, compressedData: Buffer):
8387 }
8488
8589 switch ( compressorID ) {
86- case Compressor . snappy :
90+ case Compressor . snappy : {
8791 if ( 'kModuleError' in Snappy ) {
8892 throw Snappy [ 'kModuleError' ] ;
8993 }
9094 return Snappy . uncompress ( compressedData , { asBuffer : true } ) ;
91-
92- case Compressor . zstd :
93- if ( 'kModuleError' in ZStandard ) {
94- throw ZStandard [ 'kModuleError' ] ;
95+ }
96+ case Compressor . zstd : {
97+ loadZstd ( ) ;
98+ if ( 'kModuleError' in zstd ) {
99+ throw zstd [ 'kModuleError' ] ;
95100 }
96- return ZStandard . decompress ( compressedData ) ;
97-
98- case Compressor . zlib :
101+ return zstd . decompress ( compressedData ) ;
102+ }
103+ case Compressor . zlib : {
99104 return zlibInflate ( compressedData ) ;
100-
101- default :
105+ }
106+ default : {
102107 return compressedData ;
108+ }
109+ }
110+ }
111+
112+ /**
113+ * Load ZStandard if it is not already set.
114+ */
115+ function loadZstd ( ) {
116+ if ( ! zstd ) {
117+ zstd = getZstdLibrary ( ) ;
103118 }
104119}
0 commit comments