title: How to identify a disconnected client in gRPC?
body: <p>I am building an API using gRPC and in server side, I want to receive a notification when a client disconnects, identify it and perform some tasks based on that.</p>
  
  <p>So far, I was able to detect client disconnection using <code>grpc.StatsHandler</code> method <code>HandleConn</code>. I tried passing values using context, but they can't be accessed from server side.</p>
  
  <p>Client side:</p>
  
  <pre class="lang-golang prettyprint-override"><code>conn, err := grpc.DialContext(
      context.WithValue(context.Background(), "user_id", 1234),
      address,
      grpc.WithInsecure(),
  )
  </code></pre>
  
  <p>Server side:</p>
  
  <pre class="lang-golang prettyprint-override"><code>// Build stats handler
  type serverStats struct {}
  
  func (h *serverStats) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context {
      return ctx
  }
  
  func (h *serverStats) HandleRPC(ctx context.Context, s stats.RPCStats) {}
  
  func (h *serverStats) TagConn(ctx context.Context, info *stats.ConnTagInfo) context.Context {
      return context.TODO()
  }
  
  func (h *serverStats) HandleConn(ctx context.Context, s stats.ConnStats) {
      fmt.Println(ctx.Value("user_id")) // Returns nil, can't access the value
  
      switch s.(type) {
      case *stats.ConnEnd:
          fmt.Println("client disconnected")
          break
      }
  }
  
  
  // Build server
  s := grpc.NewServer(grpc.StatsHandler(&amp;serverStats{}))
  </code></pre>
  
  <p>I want to access the value passed from client side in server side. What is the right way to do it, or is there any other way to identify the client that has disconnected?</p>