Updated script that can be controled by Nodejs web app
This commit is contained in:
@ -0,0 +1,83 @@
|
||||
import gevent
|
||||
from gevent import queue
|
||||
from gevent.event import Event
|
||||
try:
|
||||
# use gevent-websocket if installed
|
||||
import geventwebsocket # noqa
|
||||
SimpleWebSocketWSGI = None
|
||||
except ImportError: # pragma: no cover
|
||||
# fallback to simple_websocket when gevent-websocket is not installed
|
||||
from engineio.async_drivers._websocket_wsgi import SimpleWebSocketWSGI
|
||||
|
||||
|
||||
class Thread(gevent.Greenlet): # pragma: no cover
|
||||
"""
|
||||
This wrapper class provides gevent Greenlet interface that is compatible
|
||||
with the standard library's Thread class.
|
||||
"""
|
||||
def __init__(self, target, args=[], kwargs={}):
|
||||
super().__init__(target, *args, **kwargs)
|
||||
|
||||
def _run(self):
|
||||
return self.run()
|
||||
|
||||
|
||||
if SimpleWebSocketWSGI is not None:
|
||||
class WebSocketWSGI(SimpleWebSocketWSGI): # pragma: no cover
|
||||
"""
|
||||
This wrapper class provides a gevent WebSocket interface that is
|
||||
compatible with eventlet's implementation, using the simple-websocket
|
||||
package.
|
||||
"""
|
||||
def __init__(self, handler, server):
|
||||
# to avoid the requirement that the standard library is
|
||||
# monkey-patched, here we pass the gevent versions of the
|
||||
# concurrency and networking classes required by simple-websocket
|
||||
import gevent.event
|
||||
import gevent.selectors
|
||||
super().__init__(handler, server,
|
||||
thread_class=Thread,
|
||||
event_class=gevent.event.Event,
|
||||
selector_class=gevent.selectors.DefaultSelector)
|
||||
else:
|
||||
class WebSocketWSGI: # pragma: no cover
|
||||
"""
|
||||
This wrapper class provides a gevent WebSocket interface that is
|
||||
compatible with eventlet's implementation, using the gevent-websocket
|
||||
package.
|
||||
"""
|
||||
def __init__(self, handler, server):
|
||||
self.app = handler
|
||||
|
||||
def __call__(self, environ, start_response):
|
||||
if 'wsgi.websocket' not in environ:
|
||||
raise RuntimeError('The gevent-websocket server is not '
|
||||
'configured appropriately. '
|
||||
'See the Deployment section of the '
|
||||
'documentation for more information.')
|
||||
self._sock = environ['wsgi.websocket']
|
||||
self.environ = environ
|
||||
self.version = self._sock.version
|
||||
self.path = self._sock.path
|
||||
self.origin = self._sock.origin
|
||||
self.protocol = self._sock.protocol
|
||||
return self.app(self)
|
||||
|
||||
def close(self):
|
||||
return self._sock.close()
|
||||
|
||||
def send(self, message):
|
||||
return self._sock.send(message)
|
||||
|
||||
def wait(self):
|
||||
return self._sock.receive()
|
||||
|
||||
|
||||
_async = {
|
||||
'thread': Thread,
|
||||
'queue': queue.JoinableQueue,
|
||||
'queue_empty': queue.Empty,
|
||||
'event': Event,
|
||||
'websocket': WebSocketWSGI,
|
||||
'sleep': gevent.sleep,
|
||||
}
|
Reference in New Issue
Block a user