@@ -2,7 +2,7 @@ import { promisify } from 'util';
2
2
import * as zlib from 'zlib' ;
3
3
4
4
import { LEGACY_HELLO_COMMAND } from '../../constants' ;
5
- import { Snappy , ZStandard } from '../../deps' ;
5
+ import { getZstdLibrary , Snappy , type ZStandard } from '../../deps' ;
6
6
import { MongoDecompressionError , MongoInvalidArgumentError } from '../../error' ;
7
7
8
8
/** @public */
@@ -37,35 +37,39 @@ const ZSTD_COMPRESSION_LEVEL = 3;
37
37
const zlibInflate = promisify ( zlib . inflate . bind ( zlib ) ) ;
38
38
const zlibDeflate = promisify ( zlib . deflate . bind ( zlib ) ) ;
39
39
40
+ let zstd : typeof ZStandard ;
41
+
40
42
// Facilitate compressing a message using an agreed compressor
41
43
export async function compress (
42
44
options : { zlibCompressionLevel : number ; agreedCompressor : CompressorName } ,
43
45
dataToBeCompressed : Buffer
44
46
) : Promise < Buffer > {
45
47
const zlibOptions = { } as zlib . ZlibOptions ;
46
48
switch ( options . agreedCompressor ) {
47
- case 'snappy' :
49
+ case 'snappy' : {
48
50
if ( 'kModuleError' in Snappy ) {
49
51
throw Snappy [ 'kModuleError' ] ;
50
52
}
51
53
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' ] ;
56
59
}
57
- return ZStandard . compress ( dataToBeCompressed , ZSTD_COMPRESSION_LEVEL ) ;
58
-
59
- case 'zlib' :
60
+ return zstd . compress ( dataToBeCompressed , ZSTD_COMPRESSION_LEVEL ) ;
61
+ }
62
+ case 'zlib' : {
60
63
if ( options . zlibCompressionLevel ) {
61
64
zlibOptions . level = options . zlibCompressionLevel ;
62
65
}
63
66
return zlibDeflate ( dataToBeCompressed , zlibOptions ) ;
64
-
65
- default :
67
+ }
68
+ default : {
66
69
throw new MongoInvalidArgumentError (
67
70
`Unknown compressor ${ options . agreedCompressor } failed to compress`
68
71
) ;
72
+ }
69
73
}
70
74
}
71
75
@@ -83,22 +87,33 @@ export async function decompress(compressorID: number, compressedData: Buffer):
83
87
}
84
88
85
89
switch ( compressorID ) {
86
- case Compressor . snappy :
90
+ case Compressor . snappy : {
87
91
if ( 'kModuleError' in Snappy ) {
88
92
throw Snappy [ 'kModuleError' ] ;
89
93
}
90
94
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' ] ;
95
100
}
96
- return ZStandard . decompress ( compressedData ) ;
97
-
98
- case Compressor . zlib :
101
+ return zstd . decompress ( compressedData ) ;
102
+ }
103
+ case Compressor . zlib : {
99
104
return zlibInflate ( compressedData ) ;
100
-
101
- default :
105
+ }
106
+ default : {
102
107
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 ( ) ;
103
118
}
104
119
}
0 commit comments