private async connectInternal()

in common/lib/authentication/iam_authentication_plugin.ts [65:134]


  private async connectInternal(
    hostInfo: HostInfo,
    props: Map<string, any>,
    isInitialConnection: boolean,
    connectFunc: () => Promise<ClientWrapper>
  ): Promise<ClientWrapper> {
    const user = WrapperProperties.USER.get(props);
    if (!user) {
      throw new AwsWrapperError(`${WrapperProperties.USER} is null or empty`);
    }

    const host = IamAuthUtils.getIamHost(props, hostInfo);
    const region: string = RegionUtils.getRegion(props.get(WrapperProperties.IAM_REGION.name), host);
    const port = IamAuthUtils.getIamPort(props, hostInfo, this.pluginService.getCurrentClient().defaultPort);
    const tokenExpirationSec = WrapperProperties.IAM_TOKEN_EXPIRATION.get(props);
    if (tokenExpirationSec < 0) {
      throw new AwsWrapperError(Messages.get("AuthenticationToken.tokenExpirationLessThanZero"));
    }
    const cacheKey: string = IamAuthUtils.getCacheKey(port, user, host, region);

    const tokenInfo = IamAuthenticationPlugin.tokenCache.get(cacheKey);
    const isCachedToken: boolean = tokenInfo !== undefined && !tokenInfo.isExpired();

    if (isCachedToken && tokenInfo) {
      logger.debug(Messages.get("AuthenticationToken.useCachedToken", tokenInfo.token));
      WrapperProperties.PASSWORD.set(props, tokenInfo.token);
    } else {
      const tokenExpiry: number = Date.now() + tokenExpirationSec * 1000;
      const token = await IamAuthUtils.generateAuthenticationToken(
        host,
        port,
        region,
        user,
        AwsCredentialsManager.getProvider(hostInfo, props),
        this.pluginService
      );
      this.fetchTokenCounter.inc();
      logger.debug(Messages.get("AuthenticationToken.generatedNewToken", token));
      WrapperProperties.PASSWORD.set(props, token);
      IamAuthenticationPlugin.tokenCache.set(cacheKey, new TokenInfo(token, tokenExpiry));
    }
    this.pluginService.updateConfigWithProperties(props);

    try {
      return await connectFunc();
    } catch (e) {
      logger.debug(Messages.get("Authentication.connectError", (e as Error).message));
      if (!this.pluginService.isLoginError(e as Error) || !isCachedToken) {
        throw e;
      }

      // Login unsuccessful with cached token
      // Try to generate a new token and try to connect again

      const tokenExpiry: number = Date.now() + tokenExpirationSec * 1000;
      const token = await IamAuthUtils.generateAuthenticationToken(
        host,
        port,
        region,
        user,
        AwsCredentialsManager.getProvider(hostInfo, props),
        this.pluginService
      );
      this.fetchTokenCounter.inc();
      logger.debug(Messages.get("AuthenticationToken.generatedNewToken", token));
      WrapperProperties.PASSWORD.set(props, token);
      IamAuthenticationPlugin.tokenCache.set(cacheKey, new TokenInfo(token, tokenExpiry));
      return connectFunc();
    }
  }