@@ -27,8 +27,7 @@ export function isDriverInfoEqual(info1: DriverInfo, info2: DriverInfo): boolean
2727}
2828
2929/**
30- * @public
31- * @deprecated This interface will be made internal in the next major release.
30+ * @internal
3231 * @see https://github.com/mongodb/specifications/blob/master/source/mongodb-handshake/handshake.md#hello-command
3332 */
3433export interface ClientMetadata {
@@ -48,11 +47,14 @@ export interface ClientMetadata {
4847 } ;
4948 /** FaaS environment information */
5049 env ?: {
51- name : 'aws.lambda' | 'gcp.func' | 'azure.func' | 'vercel' ;
50+ name ? : 'aws.lambda' | 'gcp.func' | 'azure.func' | 'vercel' ;
5251 timeout_sec ?: Int32 ;
5352 memory_mb ?: Int32 ;
5453 region ?: string ;
55- url ?: string ;
54+ container ?: {
55+ runtime ?: string ;
56+ orchestrator ?: string ;
57+ } ;
5658 } ;
5759}
5860
@@ -103,10 +105,10 @@ type MakeClientMetadataOptions = Pick<MongoOptions, 'appName'>;
103105 * 3. Omit the `env` document entirely.
104106 * 4. Truncate `platform`. -- special we do not truncate this field
105107 */
106- export function makeClientMetadata (
108+ export async function makeClientMetadata (
107109 driverInfoList : DriverInfo [ ] ,
108110 { appName = '' } : MakeClientMetadataOptions
109- ) : ClientMetadata {
111+ ) : Promise < ClientMetadata > {
110112 const metadataDocument = new LimitedSizeDocument ( 512 ) ;
111113
112114 // Add app name first, it must be sent
@@ -178,19 +180,21 @@ export function makeClientMetadata(
178180 }
179181 }
180182 }
181- return metadataDocument . toObject ( ) as ClientMetadata ;
183+ return await addContainerMetadata ( metadataDocument . toObject ( ) as ClientMetadata ) ;
182184}
183185
184186let dockerPromise : Promise < boolean > ;
187+ type ContainerMetadata = NonNullable < NonNullable < ClientMetadata [ 'env' ] > [ 'container' ] > ;
185188/** @internal */
186- async function getContainerMetadata ( ) {
187- const containerMetadata : Record < string , any > = { } ;
189+ async function getContainerMetadata ( ) : Promise < ContainerMetadata > {
188190 dockerPromise ??= fileIsAccessible ( '/.dockerenv' ) ;
189191 const isDocker = await dockerPromise ;
190192
191193 const { KUBERNETES_SERVICE_HOST = '' } = process . env ;
192194 const isKubernetes = KUBERNETES_SERVICE_HOST . length > 0 ? true : false ;
193195
196+ const containerMetadata : ContainerMetadata = { } ;
197+
194198 if ( isDocker ) containerMetadata . runtime = 'docker' ;
195199 if ( isKubernetes ) containerMetadata . orchestrator = 'kubernetes' ;
196200
@@ -202,15 +206,16 @@ async function getContainerMetadata() {
202206 * Re-add each metadata value.
203207 * Attempt to add new env container metadata, but keep old data if it does not fit.
204208 */
205- export async function addContainerMetadata (
206- originalMetadata : ClientMetadata
207- ) : Promise < ClientMetadata > {
209+ async function addContainerMetadata ( originalMetadata : ClientMetadata ) : Promise < ClientMetadata > {
208210 const containerMetadata = await getContainerMetadata ( ) ;
209211 if ( Object . keys ( containerMetadata ) . length === 0 ) return originalMetadata ;
210212
211213 const extendedMetadata = new LimitedSizeDocument ( 512 ) ;
212214
213- const extendedEnvMetadata = { ...originalMetadata ?. env , container : containerMetadata } ;
215+ const extendedEnvMetadata : NonNullable < ClientMetadata [ 'env' ] > = {
216+ ...originalMetadata ?. env ,
217+ container : containerMetadata
218+ } ;
214219
215220 for ( const [ key , val ] of Object . entries ( originalMetadata ) ) {
216221 if ( key !== 'env' ) {
0 commit comments