public getMetadata()

in src/connection-pool.ts [90:137]


  public getMetadata(): Promise<grpc.Metadata> {
    if (this.awaitingMetadata !== null) {
      return this.awaitingMetadata;
    }

    const hosts =
      typeof this.options.hosts === 'string' ? [this.options.hosts] : this.options.hosts;
    const auth = this.options.auth;

    if (!auth) {
      return Promise.resolve(new grpc.Metadata());
    }

    const attempt = (index: number, previousRejection?: Error): Promise<grpc.Metadata> => {
      if (index >= hosts.length) {
        this.awaitingMetadata = null;
        return Promise.reject(previousRejection);
      }

      const meta = new grpc.Metadata();
      const host = removeProtocolPrefix(hosts[index]);
      const context: CallContext = {
        method: 'authenticate',
        params: { name: auth.username, password: auth.password },
        service: 'Auth',
        isStream: false,
      };

      return this.getCredentialsFromHost(
        host,
        auth.username,
        auth.password,
        resolveCallOptions(
          resolveCallOptions(undefined, auth.callOptions, context),
          resolveCallOptions(undefined, this.options.defaultCallOptions, context),
          context,
        ),
        this.credentials,
      )
        .then(token => {
          meta.set('token', token);
          return meta;
        })
        .catch(err => attempt(index + 1, err));
    };

    return (this.awaitingMetadata = attempt(0));
  }