@@ -27,8 +27,7 @@ export function isDriverInfoEqual(info1: DriverInfo, info2: DriverInfo): boolean
27
27
}
28
28
29
29
/**
30
- * @public
31
- * @deprecated This interface will be made internal in the next major release.
30
+ * @internal
32
31
* @see https://github.com/mongodb/specifications/blob/master/source/mongodb-handshake/handshake.md#hello-command
33
32
*/
34
33
export interface ClientMetadata {
@@ -48,11 +47,14 @@ export interface ClientMetadata {
48
47
} ;
49
48
/** FaaS environment information */
50
49
env ?: {
51
- name : 'aws.lambda' | 'gcp.func' | 'azure.func' | 'vercel' ;
50
+ name ? : 'aws.lambda' | 'gcp.func' | 'azure.func' | 'vercel' ;
52
51
timeout_sec ?: Int32 ;
53
52
memory_mb ?: Int32 ;
54
53
region ?: string ;
55
- url ?: string ;
54
+ container ?: {
55
+ runtime ?: string ;
56
+ orchestrator ?: string ;
57
+ } ;
56
58
} ;
57
59
}
58
60
@@ -103,10 +105,10 @@ type MakeClientMetadataOptions = Pick<MongoOptions, 'appName'>;
103
105
* 3. Omit the `env` document entirely.
104
106
* 4. Truncate `platform`. -- special we do not truncate this field
105
107
*/
106
- export function makeClientMetadata (
108
+ export async function makeClientMetadata (
107
109
driverInfoList : DriverInfo [ ] ,
108
110
{ appName = '' } : MakeClientMetadataOptions
109
- ) : ClientMetadata {
111
+ ) : Promise < ClientMetadata > {
110
112
const metadataDocument = new LimitedSizeDocument ( 512 ) ;
111
113
112
114
// Add app name first, it must be sent
@@ -178,19 +180,21 @@ export function makeClientMetadata(
178
180
}
179
181
}
180
182
}
181
- return metadataDocument . toObject ( ) as ClientMetadata ;
183
+ return await addContainerMetadata ( metadataDocument . toObject ( ) as ClientMetadata ) ;
182
184
}
183
185
184
186
let dockerPromise : Promise < boolean > ;
187
+ type ContainerMetadata = NonNullable < NonNullable < ClientMetadata [ 'env' ] > [ 'container' ] > ;
185
188
/** @internal */
186
- async function getContainerMetadata ( ) {
187
- const containerMetadata : Record < string , any > = { } ;
189
+ async function getContainerMetadata ( ) : Promise < ContainerMetadata > {
188
190
dockerPromise ??= fileIsAccessible ( '/.dockerenv' ) ;
189
191
const isDocker = await dockerPromise ;
190
192
191
193
const { KUBERNETES_SERVICE_HOST = '' } = process . env ;
192
194
const isKubernetes = KUBERNETES_SERVICE_HOST . length > 0 ? true : false ;
193
195
196
+ const containerMetadata : ContainerMetadata = { } ;
197
+
194
198
if ( isDocker ) containerMetadata . runtime = 'docker' ;
195
199
if ( isKubernetes ) containerMetadata . orchestrator = 'kubernetes' ;
196
200
@@ -202,15 +206,16 @@ async function getContainerMetadata() {
202
206
* Re-add each metadata value.
203
207
* Attempt to add new env container metadata, but keep old data if it does not fit.
204
208
*/
205
- export async function addContainerMetadata (
206
- originalMetadata : ClientMetadata
207
- ) : Promise < ClientMetadata > {
209
+ async function addContainerMetadata ( originalMetadata : ClientMetadata ) : Promise < ClientMetadata > {
208
210
const containerMetadata = await getContainerMetadata ( ) ;
209
211
if ( Object . keys ( containerMetadata ) . length === 0 ) return originalMetadata ;
210
212
211
213
const extendedMetadata = new LimitedSizeDocument ( 512 ) ;
212
214
213
- const extendedEnvMetadata = { ...originalMetadata ?. env , container : containerMetadata } ;
215
+ const extendedEnvMetadata : NonNullable < ClientMetadata [ 'env' ] > = {
216
+ ...originalMetadata ?. env ,
217
+ container : containerMetadata
218
+ } ;
214
219
215
220
for ( const [ key , val ] of Object . entries ( originalMetadata ) ) {
216
221
if ( key !== 'env' ) {
0 commit comments