def handleMessage(self, query, callback=None):
        error = None
        if not (
            ("doc" in query and query["doc"] is None)
            or ("doc" in query and isinstance(query["doc"], (str, unicode)))
            or ("doc" not in query and self.lastReceivedDoc)
        ):
            error = "Invalid docName"
        if "create" in query and query["create"] is not True:
            error = "'create' must be True or missing"
        if "open" in query and query["open"] not in [True, False]:
            error = "'open' must be True, False or missing"
        if "snapshot" in query and query["snapshot"] is not None:
            error = "'snapshot' must be None or missing"
        if "type" in query and not isinstance(query["type"], (str, unicode)):
            error = "'type' invalid"
        if "v" in query and (not isinstance(query["v"], (int, float)) or query["v"] < 0):
            error = "'v' invalid"

        if error:
            print("Invalid query {0} from {1}: {2}".format(query, self.agent.sessionId, error))
            self.session.abort()
            if callback:
                return callback()
            else:
                return

        if "doc" in query:
            if query["doc"] is None:
                query["doc"] = self.lastReceivedDoc = hat.hat()
            else:
                self.lastReceivedDoc = query["doc"]
        else:
            if not self.lastReceivedDoc:
                print("msg.doc missing in query {0} from {1}".format(query, self.agent.sessionId))
                return self.session.abort()
            query["doc"] = self.lastReceivedDoc

        if query["doc"] not in self.docState:
            self.docState[query["doc"]] = {}

        if "queue" not in self.docState[query["doc"]]:

            def _queue_func(query, callback):
                if not self.docState:
                    return callback()

                if "open" in query and query["open"] == False:
                    self.handleClose(query, callback)
                elif "open" in query or ("snapshot" in query and query["snapshot"] is None) or "create" in query:
                    self.handleOpenCreateSnapshot(query, callback)
                elif "op" in query or ("meta" in query and "path" in query["meta"]):
                    self.handleOp(query, callback)
                else:
                    print("Invalid query {0} from {1}".format(json.dumps(query), self.agent.sessionId))
                    self.session.abort()
                    callback()

            self.docState[query["doc"]]["queue"] = syncQueue.syncQueue(_queue_func)

        self.docState[query["doc"]]["queue"](query)