84 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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,
 | |
| }
 |