code: def on_recv(self, callback):
          '''
          Register a callback for received messages (that we didn't initiate)
  
          :param func callback: A function which should be called when data is received
          '''
          if callback is None:
              return self.stream.on_recv(None)
  
          @tornado.gen.coroutine
          def wrap_callback(messages):
              payload = yield self._decode_messages(messages)
              if payload is not None:
                  callback(payload)
          return self.stream.on_recv(wrap_callbackf on_recv(self, callback):
          '''
          Register a callback for received messages (that we didn't initiate)
  
          :param func callback: A function which should be called when data is received
          '''
          if callback is None:
              return self.stream.on_recv(None)
  
          @tornado.gen.coroutine
          def wrap_callback(messages):
              payload = yield self._decode_messages(messages)
              if payload is not None:
                  callback(payload)
          return self.stream.on_recv(wrap_callback)
docs: Register a callback for received messages (that we didn't initiate)
  
          :param func callback: A function which should be called when data is received