4.0:
Warning: Version 4.0 enables compression with the permessage-deflate extension.
In August 2017, Firefox and Chrome support it, but not Safari and IE.
Compression should improve performance but it increases RAM and CPU use.
If you want to disable compression, add compression=None when calling :func:`~server.serve()` or :func:`~client.connect()`.
Warning: Version 4.0 removes the ``state_name`` attribute of protocols.
Use protocol.state.name instead of protocol.state_name.
Also:
:class:`~protocol.WebSocketCommonProtocol` instances can be used as asynchronous iterators on Python ≥ 3.6. They yield incoming messages.
Added :func:`~websockets.server.unix_serve` for listening on Unix sockets.
Added the :attr:`~websockets.server.WebSocketServer.sockets` attribute.
Reorganized and extended documentation.
Aborted connections if they don't close within the configured timeout.
Rewrote connection termination to increase robustness in edge cases.
Stopped leaking pending tasks when :meth:`~asyncio.Task.cancel` is called on a connection while it's being closed.
Reduced verbosity of "Failing the WebSocket connection" logs.
Allowed extra_headers to override Server and User-Agent headers.
Renamed :func:`~websockets.server.serve()` and :func:`~websockets.client.connect()`'s klass argument to create_protocol to reflect that it can also be a callable. For backwards compatibility, klass is still supported.
:func:`~websockets.server.serve` can be used as an asynchronous context manager on Python ≥ 3.5.
Added support for customizing handling of incoming connections with :meth:`~websockets.server.WebSocketServerProtocol.process_request()`.
Made read and write buffer sizes configurable.
Rewrote HTTP handling for simplicity and performance.
Added an optional C extension to speed up low level operations.
An invalid response status code during :func:`~websockets.client.connect` now raises :class:`~websockets.exceptions.InvalidStatusCode` with a code attribute.
Python. It implements RFC 6455 with a focus on correctness and simplicity.
It passes the Autobahn Testsuite.
Built on top of Python's asynchronous I/O support introduced in PEP 3156,
it provides an API based on coroutines, making it easy to write highly
concurrent applications.