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 ,
}