def websocket_handler(self, ws): pathlist = filter(lambda x: bool(x), ws.path.split("/")) session = pathlist[0] sm = self.sm_mapping.get(session) or self.init_session(session) if not session in self.clients: self.clients[session] = [ws] eventlet.spawn(self.websocket_response, sm, session) else: self.clients[session].append(ws) sm.send("websocket.connect") while True: message = ws.wait() if message is None: break evt = Processor.fromxml(str(message), origintype="javascript") sm.interpreter.externalQueue.put(evt) sm.send("websocket.disconnect") self.clients[session].remove(ws)
def type_scxml(session, data, sm, environ): event = Processor.fromxml(data) event.type = "HTTP" return event
def type_scxml(session, data, sm, environ, raw=None): event = Processor.fromxml(data) event.type = "HTTP" return event
toQueue=toQueue) elif target == "#_internal": self.interpreter.raiseFunction(event, data, sendid=sendid) elif target.startswith("#_scxml_"): #sessionid sessionid = target.split("#_scxml_")[-1] try: # toQueue = self.dm["_x"]["sessions"][sessionid].interpreter.externalQueue toQueue = self.dm.sessions[sessionid].interpreter.externalQueue except KeyError: raise SendCommunicationError("The session '%s' is inaccessible." % sessionid) sender = partial(defaultSend, event, data, toQueue=toQueue) elif target == "#_websocket": self.logger.debug("sending to _websocket") eventXML = Processor.toxml(eventstr, target, data, "", sendNode.get("id", ""), language="json") sender = partial(self.dm.websocket.put, eventXML) elif target.startswith("#_") and not target == "#_response": # invokeid try: sessionid = self.dm.sessionid + "." + target[2:] sm = self.dm.sessions[sessionid] except KeyError: e = SendCommunicationError("Line %s: No valid invoke target at '%s'." % (sendNode.sourceline, sessionid)) sender = partial(sm.interpreter.send, event, data, sendid=sendid) elif target.startswith("http://"): # target is a remote scxml processor origin = "unreachable" if self.dm["_ioprocessors"]["scxml"]["location"].startswith("http://"): origin = self.dm["_ioprocessors"]["scxml"]["location"] eventXML = Processor.toxml(eventstr, target, data, origin, sendNode.get("id", ""))
self.parentId].interpreter.externalQueue except KeyError: raise SendCommunicationError("There is no parent session.") sender = partial(defaultSend, self.interpreter.invokeId, toQueue=toQueue) elif target == "#_internal": sender = partial(self.interpreter.raiseFunction, event, data, sendid=sendid) elif target == "#_websocket": self.logger.debug("sending to _websocket") eventXML = Processor.toxml(eventstr, target, data, "", sendNode.get("id", ""), language=self.datamodel) sender = partial(self.dm.websocket.put, eventXML) elif target.startswith( "#_") and not target == "#_response": # invokeid try: sessionid = self.dm.sessionid + "." + target[2:] sm = self.dm.sessions[sessionid] except KeyError: e = SendCommunicationError( "Line %s: No valid invoke target at '%s'." % (sendNode.sourceline, sessionid)) sender = partial(sm.interpreter.send, event, data,