{"version":3,"file":"RegionDiscovery.js","sources":["../../src/authority/RegionDiscovery.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { INetworkModule } from \"../network/INetworkModule\";\nimport { NetworkResponse } from \"../network/NetworkManager\";\nimport { IMDSBadResponse } from \"../response/IMDSBadResponse\";\nimport { Constants, RegionDiscoverySources, ResponseCodes } from \"../utils/Constants\";\nimport { RegionDiscoveryMetadata } from \"./RegionDiscoveryMetadata\";\nimport { ImdsOptions } from \"./ImdsOptions\";\n\nexport class RegionDiscovery {\n // Network interface to make requests with.\n protected networkInterface: INetworkModule;\n // Options for the IMDS endpoint request\n protected static IMDS_OPTIONS: ImdsOptions = {\n headers: {\n Metadata: \"true\",\n },\n };\n\n constructor(networkInterface: INetworkModule) {\n this.networkInterface = networkInterface;\n }\n\n /**\n * Detect the region from the application's environment.\n * \n * @returns Promise\n */\n public async detectRegion(environmentRegion: string | undefined, regionDiscoveryMetadata: RegionDiscoveryMetadata, proxyUrl: string): Promise {\n // Initialize auto detected region with the region from the envrionment \n let autodetectedRegionName = environmentRegion;\n\n // Check if a region was detected from the environment, if not, attempt to get the region from IMDS \n if (!autodetectedRegionName) {\n const options = RegionDiscovery.IMDS_OPTIONS;\n if (proxyUrl) {\n options.proxyUrl = proxyUrl;\n }\n\n try {\n const localIMDSVersionResponse = await this.getRegionFromIMDS(Constants.IMDS_VERSION, options);\n if (localIMDSVersionResponse.status === ResponseCodes.httpSuccess) {\n autodetectedRegionName = localIMDSVersionResponse.body;\n regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;\n } \n \n // If the response using the local IMDS version failed, try to fetch the current version of IMDS and retry. \n if (localIMDSVersionResponse.status === ResponseCodes.httpBadRequest) {\n const currentIMDSVersion = await this.getCurrentVersion(options);\n if (!currentIMDSVersion) {\n regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;\n return null;\n }\n\n const currentIMDSVersionResponse = await this.getRegionFromIMDS(currentIMDSVersion, options);\n if (currentIMDSVersionResponse.status === ResponseCodes.httpSuccess) {\n autodetectedRegionName = currentIMDSVersionResponse.body;\n regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;\n }\n }\n } catch(e) {\n regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;\n return null;\n } \n } else {\n regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE;\n }\n\n // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION\n if (!autodetectedRegionName) {\n regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;\n }\n\n return autodetectedRegionName || null;\n }\n\n /**\n * Make the call to the IMDS endpoint\n * \n * @param imdsEndpointUrl\n * @returns Promise>\n */\n private async getRegionFromIMDS(version: string, options: ImdsOptions): Promise> {\n return this.networkInterface.sendGetRequestAsync(`${Constants.IMDS_ENDPOINT}?api-version=${version}&format=text`, options, Constants.IMDS_TIMEOUT);\n }\n\n /**\n * Get the most recent version of the IMDS endpoint available\n * \n * @returns Promise\n */\n private async getCurrentVersion(options: ImdsOptions): Promise {\n try {\n const response = await this.networkInterface.sendGetRequestAsync(`${Constants.IMDS_ENDPOINT}?format=json`, options);\n\n // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version.\n if (response.status === ResponseCodes.httpBadRequest && response.body && response.body[\"newest-versions\"] && response.body[\"newest-versions\"].length > 0) {\n return response.body[\"newest-versions\"][0];\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n}\n"],"names":[],"mappings":";;;;;AAAA;;;AAGG;AASH,IAAA,eAAA,kBAAA,YAAA;AAUI,IAAA,SAAA,eAAA,CAAY,gBAAgC,EAAA;AACxC,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;KAC5C;AAED;;;;AAIG;AACU,IAAA,eAAA,CAAA,SAAA,CAAA,YAAY,GAAzB,UAA0B,iBAAqC,EAAE,uBAAgD,EAAE,QAAgB,EAAA;;;;;;wBAE3H,sBAAsB,GAAG,iBAAiB,CAAC;6BAG3C,CAAC,sBAAsB,EAAvB,OAAuB,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA;AACjB,wBAAA,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC;AAC7C,wBAAA,IAAI,QAAQ,EAAE;AACV,4BAAA,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC/B,yBAAA;;;;wBAGoC,OAAM,CAAA,CAAA,YAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA,CAAA;;AAAxF,wBAAA,wBAAwB,GAAG,EAA6D,CAAA,IAAA,EAAA,CAAA;AAC9F,wBAAA,IAAI,wBAAwB,CAAC,MAAM,KAAK,aAAa,CAAC,WAAW,EAAE;AAC/D,4BAAA,sBAAsB,GAAG,wBAAwB,CAAC,IAAI,CAAC;AACvD,4BAAA,uBAAuB,CAAC,aAAa,GAAG,sBAAsB,CAAC,IAAI,CAAC;AACvE,yBAAA;8BAGG,wBAAwB,CAAC,MAAM,KAAK,aAAa,CAAC,cAAc,CAAA,EAAhE,OAAgE,CAAA,CAAA,YAAA,CAAA,CAAA,CAAA;AACrC,wBAAA,OAAA,CAAA,CAAA,YAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA,CAAA;;AAA1D,wBAAA,kBAAkB,GAAG,EAAqC,CAAA,IAAA,EAAA,CAAA;wBAChE,IAAI,CAAC,kBAAkB,EAAE;AACrB,4BAAA,uBAAuB,CAAC,aAAa,GAAG,sBAAsB,CAAC,qBAAqB,CAAC;AACrF,4BAAA,OAAA,CAAA,CAAA,aAAO,IAAI,CAAC,CAAA;AACf,yBAAA;wBAEkC,OAAM,CAAA,CAAA,YAAA,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA,CAAA;;AAAtF,wBAAA,0BAA0B,GAAG,EAAyD,CAAA,IAAA,EAAA,CAAA;AAC5F,wBAAA,IAAI,0BAA0B,CAAC,MAAM,KAAK,aAAa,CAAC,WAAW,EAAE;AACjE,4BAAA,sBAAsB,GAAG,0BAA0B,CAAC,IAAI,CAAC;AACzD,4BAAA,uBAAuB,CAAC,aAAa,GAAG,sBAAsB,CAAC,IAAI,CAAC;AACvE,yBAAA;;;;;AAGL,wBAAA,uBAAuB,CAAC,aAAa,GAAG,sBAAsB,CAAC,qBAAqB,CAAC;AACrF,wBAAA,OAAA,CAAA,CAAA,aAAO,IAAI,CAAC,CAAA;;;AAGhB,wBAAA,uBAAuB,CAAC,aAAa,GAAG,sBAAsB,CAAC,oBAAoB,CAAC;;;;wBAIxF,IAAI,CAAC,sBAAsB,EAAE;AACzB,4BAAA,uBAAuB,CAAC,aAAa,GAAG,sBAAsB,CAAC,qBAAqB,CAAC;AACxF,yBAAA;wBAED,OAAO,CAAA,CAAA,aAAA,sBAAsB,IAAI,IAAI,CAAC,CAAA;;;;AACzC,KAAA,CAAA;AAED;;;;;AAKG;AACW,IAAA,eAAA,CAAA,SAAA,CAAA,iBAAiB,GAA/B,UAAgC,OAAe,EAAE,OAAoB,EAAA;;;AACjE,gBAAA,OAAA,CAAA,CAAA,aAAO,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAY,SAAS,CAAC,aAAa,qBAAgB,OAAO,GAAA,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,CAAA;;;AAC9J,KAAA,CAAA;AAED;;;;AAIG;IACW,eAAiB,CAAA,SAAA,CAAA,iBAAA,GAA/B,UAAgC,OAAoB,EAAA;;;;;;;AAE3B,wBAAA,OAAA,CAAA,CAAA,YAAM,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,CAAqB,SAAS,CAAC,aAAa,GAAA,cAAc,EAAE,OAAO,CAAC,CAAA,CAAA;;AAA9H,wBAAA,QAAQ,GAAG,EAAmH,CAAA,IAAA,EAAA,CAAA;;AAGpI,wBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,cAAc,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;4BACtJ,OAAO,CAAA,CAAA,aAAA,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9C,yBAAA;AAED,wBAAA,OAAA,CAAA,CAAA,aAAO,IAAI,CAAC,CAAA;;;AAEZ,wBAAA,OAAA,CAAA,CAAA,aAAO,IAAI,CAAC,CAAA;;;;;AAEnB,KAAA,CAAA;;AA3FgB,IAAA,eAAA,CAAA,YAAY,GAAgB;AACzC,QAAA,OAAO,EAAE;AACL,YAAA,QAAQ,EAAE,MAAM;AACnB,SAAA;KACJ,CAAC;IAwFN,OAAC,eAAA,CAAA;AAAA,CAhGD,EAgGC;;;;"}