You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.9 KiB
83 lines
2.9 KiB
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, |
|
}
|
|
|