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)