docs: def __on_message(self, ws, message):
          '''Handler for parsing WS messages.'''
          message = json.loads(message)
          self.logger.debug(json.dumps(message))
  
          table = message['table'] if 'table' in message else None
          action = message['action'] if 'action' in message else None
          try:
              if 'subscribe' in message:
                  self.logger.debug("Subscribed to %s." % message['subscribe'])
              elif action:
  
                  if table not in self.data:
                      self.data[table] = []
  
                  # There are four possible actions from the WS:
                  # 'partial' - full table image
                  # 'insert'  - new row
                  # 'update'  - update row
                  # 'delete'  - delete row
                  if action == 'partial':
                      self.logger.debug("%s: partial" % table)
                      self.data[table] += message['data']
                      # Keys are communicated on partials to let you know how to uniquely identify
                      # an item. We use it for updates.
                      self.keys[table] = message['keys']
                  elif action == 'insert':
                      self.logger.debug('%s: inserting %s' % (table, message['data']))
                      self.data[table] += message['data']
                  elif action == 'update':
                      self.logger.debug('%s: updating %s' % (table, message['data']))
                      # Locate the item in the collection and update it.
                      for updateData in message['data']:
                          item = findItemByKeys(self.keys[table], self.data[table], updateData)
                          if not item:
                              return  # No item found to update. Could happen before push
                          item.update(updateData)
                          # Remove cancelled / filled orders
                          if table == 'order' and item['leavesQty'] <= 0:
                              self.data[table].remove(item)
                  elif action == 'delete':
                      self.logger.debug('%s: deleting %s' % (table, message['data']))
                      # Locate the item in the collection and remove it.
                      for deleteData in message['data']:
                          item = findItemByKeys(self.keys[table], self.data[table], deleteData)
                          self.data[table].remove(item)
                  else:
                      raise Exception("Unknown action: %s" % action)
          except:
              self.logger.error(traceback.format_exc())