 client does the same thing:
        // https://github.com/grpc/grpc/blob/fe11db09575f2dfbe1f88cd44bd417acc168e354/src/objective-c/GRPCClient/private/GRPCHost.m#L309-L314
        grpc_channel_.reset();
      });
}

void GrpcConnection::Register(GrpcCall* call) {
  active_calls_.push_back(call);
}

void GrpcConnection::Unregister(GrpcCall* call) {
  auto found = std::find(active_calls_.begin(), active_calls_.end(), call);
  HARD_ASSERT(found != active_calls_.end(), "Missing a gRPC call");
  active_calls_.erase(found);
}

/*static*/ void GrpcConnection::UseTestCertificate(
    const std::string& host,
    const Path& certificate_path,
    const std::string& target_name) {
  HARD_ASSERT(!host.empty(), "Empty host name");
  HARD_ASSERT(!certificate_path.native_value().empty(),
              "Empty path to test certificate");
  HARD_ASSERT(!target_name.empty(), "Empty SSL target name");

  HostConfig& host_config = Config()[host];
  host_config.certificate_path = certificate_path;
  host_config.target_name = target_name;
}

/*static*/ void GrpcConnection::UseInsecureChannel(const std::string& host) {
  HARD_ASSERT(!host.empty(), "Empty host name");

  HostConfig& host_config = Config()[host];
  host_config.use_insecure_channel = true;
}

}  // namespace remote
}  // namespace firestore
}  // namespace firebase


<Type Name="TaskCompletionSource" FullName="System.Threading.Tasks.TaskCompletionSource">
  <TypeSignature Language="C#" Value="public class TaskCompletionSource" />
  <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit TaskCompletionSource extends System.Object" />
  <TypeSignature Language="DocId" Value="T:System.Threading.Tasks.TaskCompletionSource" />
  <TypeSignature Language="VB.NET" Value="Public Class TaskCompletionSource" />
  <TypeSignature Language="C++ CLI" Value="public ref class TaskCompletionSource" />
  <TypeSignature Language="F#" Value="type TaskCompletionSource = class" />
  <AssemblyInfo>
    <AssemblyName>System.Runtime</AssemblyName>
    <AssemblyVersion>5.0.0.0