'This is called by our Adapter, passing in the data from the socket.
As long as we have buffer try and map out frame data.
:param str data_in: The data that is available to read'

def _on_data_available(self, data_in):

    self._append_frame_buffer(data_in)
    while self._frame_buffer:
        (consumed_count, frame_value) = self._read_frame()
        if (not frame_value):
            return
        self._trim_frame_buffer(consumed_count)
        self._process_frame(frame_value)
