Changelog
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
To see unreleased changes, please see the CHANGELOG on the main branch documentation.
Unreleased (2026-06-22)
Packaging
Dependency changes
Dropped support of
cbor2v5.x and added support of v6.X. (#448)
Changed
JSONSerializerinstances can now be used withBufferedStreamProtocolclasses. (#457)
Documentation
1.2.0 (2026-02-08)
Packaging
Added
Added Unix Socket’s control messages support on Linux, MacOS and BSD-related platforms:
UnixStreamClientandAsyncUnixStreamClient:send_packet(): Addedancillary_dataparameter.recv_packet(): Addedancillary_dataandancillary_bufsizeparameters.
UnixDatagramClientandAsyncUnixDatagramClient:send_packet(): Addedancillary_dataparameter.recv_packet(): Addedancillary_dataandancillary_bufsizeparameters.
StandaloneUnixStreamServerandAsyncUnixStreamServer:Added
ancillary_bufsizeparameter.
StandaloneUnixDatagramServerandAsyncUnixDatagramServer:Added
receive_ancillary_dataandancillary_bufsizeparameters.
Request handlers:
AsyncStreamRequestHandler:handle()andon_connection()mayyieldthe newRecvParamsobject.AsyncDatagramRequestHandler:handle()mayyieldthe newRecvParamsobject.Added
AsyncStreamClient.send_packet_with_ancillary().Added
AsyncDatagramClient.send_packet_with_ancillary().
Low-level API:
In
easynetwork.lowlevel.socketmodule:Added
SocketAncillarycontainer which handlesSCMRightsandSCMCredentialsmessages if available on current platform.
In
easynetwork.lowlevel.request_handlermodule:Added
RecvParamsandRecvAncillaryDataParams, used by request handlers.
Asynchronous API:
In
easynetwork.lowlevel.api_async.transportspackage:Added
AsyncStreamReadTransport.recv_with_ancillary().Added
AsyncStreamReadTransport.recv_with_ancillary_into().Added
AsyncStreamWriteTransport.send_all_with_ancillary().Added
AsyncDatagramReadTransport.recv_with_ancillary().Added
AsyncDatagramWriteTransport.send_with_ancillary().Added
AsyncDatagramListener.serve_with_ancillary().Added
AsyncDatagramListener.send_with_ancillary_to().
In
easynetwork.lowlevel.api_async.endpointspackage:Added
AsyncStreamReceiverEndpoint.recv_packet_with_ancillary().Added
AsyncStreamSenderEndpoint.send_packet_with_ancillary().Added
AsyncStreamEndpoint.recv_packet_with_ancillary().Added
AsyncStreamEndpoint.send_packet_with_ancillary().Added
AsyncDatagramReceiverEndpoint.recv_packet_with_ancillary().Added
AsyncDatagramSenderEndpoint.send_packet_with_ancillary().Added
AsyncDatagramEndpoint.recv_packet_with_ancillary().Added
AsyncDatagramEndpoint.send_packet_with_ancillary().
In
easynetwork.lowlevel.api_async.serverspackage:Added
ConnectedStreamClient.send_packet_with_ancillary().AsyncStreamServer.serve(): Generators returned byclient_connected_cbmayyieldthe newRecvParamsobject.AsyncStreamServer.serve(): Addedancillary_bufsizeparameter.Added
AsyncDatagramServer.send_packet_with_ancillary_to().Added
AsyncDatagramServer.serve_with_ancillary().AsyncDatagramServer.serve(): Generators returned bydatagram_received_cbmayyieldthe newRecvParamsobject.
Synchronous (blocking) API:
In
easynetwork.lowlevel.api_sync.transportspackage:Added
StreamReadTransport.recv_with_ancillary().Added
StreamReadTransport.recv_with_ancillary_into().Added
StreamWriteTransport.send_all_with_ancillary().Added
DatagramReadTransport.recv_with_ancillary().Added
DatagramWriteTransport.send_with_ancillary().
In
easynetwork.lowlevel.api_sync.endpointspackage:Added
StreamReceiverEndpoint.recv_packet_with_ancillary().Added
StreamSenderEndpoint.send_packet_with_ancillary().Added
StreamEndpoint.recv_packet_with_ancillary().Added
StreamEndpoint.send_packet_with_ancillary().Added
DatagramReceiverEndpoint.recv_packet_with_ancillary().Added
DatagramSenderEndpoint.send_packet_with_ancillary().Added
DatagramEndpoint.recv_packet_with_ancillary().Added
DatagramEndpoint.send_packet_with_ancillary().
GitHub PR: (#441)
Changed
UnixSocketAddressnow displays the Unix address in a similar way to that seen in/proc/net/unix. (#416)AsyncUnixStreamServerandAsyncUnixDatagramServer: There is a more explicit error message when the current platform does not support automatic socket binding. (#419)Low-level API:
trio: TheTaskGroupcontext manager raises a singletrio.Cancellederror when all the tasks has ben cancelled instead of anExceptionGroup. This is already the behavior withasyncio. (#426)
Fixed
Fixed connection errors not caught by
AsyncTCPNetworkClientandAsyncUnixStreamClientif the object is closed in a concurrent task. From now on, aClientClosedErroris raised in such case. (#424)Low-level API:
asyncio: FixedAsyncDatagramTransportandAsyncDatagramListenerraising anOSErrorwitherrno.ECONNABORTEDinstead oferrno.EBADFwhen the transport has been closed. (#424)Low-level API:
trio: Fixedtrio.ClosedResourceErrornot caught by :AsyncStreamTransport.recv_into()AsyncStreamTransport.send_all_from_iterable()AsyncDatagramTransport.recv()AsyncDatagramTransport.send()AsyncDatagramListener.serve()AsyncDatagramListener.send_to()
This exception is now transformed to the corresponding
OSError. (#426)Low-level API:
asyncio: Fixed performance issues inCancelScope. (#430)
Deprecated
Request handlers which
yielda number (for the timeout) will emit aDeprecationWarning. This affects:Requests handlers :
AsyncStreamRequestHandler.handle()AsyncStreamRequestHandler.on_connection()AsyncDatagramRequestHandler.handle()
Low-level API:
AsyncStreamServer.serve(): Generators returned byclient_connected_cb.AsyncDatagramServer.serve(): Generators returned bydatagram_received_cb.AsyncDatagramServer.serve_with_ancillary(): Generators returned bydatagram_received_cb.
Use
easynetwork.lowlevel.request_handler.RecvParamsinstead. (#441)
Removed
The following list :
UnixStreamClientandAsyncUnixStreamClientUnixDatagramClientandAsyncUnixDatagramClientStandaloneUnixStreamServerandAsyncUnixStreamServerStandaloneUnixDatagramServerandAsyncUnixDatagramServerIn
easynetwork.servers.handlers:UNIXClientAttribute
In
easynetwork.lowlevel.socket:UnixSocketAddressUnixCredentials
is no longer available on unsupported platforms (e.g. Windows). (#417)
UnixSocketAddress.from_abstract_name()andUnixSocketAddress.as_abstract_name()are no longer available on unsupported platforms (e.g. MacOS). (#419)
Documentation
1.1.4 (2025-07-29)
Fixed
Fixed data loss when
StreamProtocol.build_packet_from_chunks()raises an exception before the firstyieldstatement. (#413)
1.1.3 (2025-05-24)
Changed
Fixed
Documentation
Fixed missing warning for client’s
aclose()methods. (#404)
1.1.2 (2025-03-16)
Changed
Miscellaneous internal changes. (#392)
Improved handling of asynchronous generators. (#393)
Low-level API:
asyncioandtrio: TheTaskGroupno longer wrap single exception raised within context in anExceptionGroup. (#398)Low-level API:
asyncio: OptimizedAsyncListener.serve()coroutine by usingasyncio.AbstractEventLoop.add_reader()if available. The task is more efficient with event loops based on file descriptor polling. (#398)
Fixed
Low-level API:
asyncio: TheAsyncListener.serve()coroutine no longer emits log connection errors for direct subclasses of theBaseExceptionclass. (#392)Low-level API:
asyncio: Fixed backend’sCancelScopenot catching re-raised exceptions. (#395)Low-level API:
asyncio: Fixed backend’sCancelScopeswallowing exceptions by mistake. (#397)AsyncUDPNetworkServer: On server shut down, the datagram socket reading task is stopped before client tasks. This fixes a race condition where the socket was ready for reading a new datagram but the task group has been closed. (#398)Low-level API:
asyncio: FixedTaskGroup.start()andTaskGroup.start_soon()leaving a coroutine object unclosed onRuntimeError. (#398)AsyncTCPNetworkServer: On server shut down, the socket listeners are stopped before client tasks. This fixes a race condition where the socket was ready to accept a new client but the task group has been closed. (#398)Low-level API: Fixed
AsyncStreamServer.serve()andAsyncDatagramServer.serve()shutting down when an exception is thrown. (#399)
1.1.1 (2025-01-25)
Changed
1.1.0 (2025-01-19)
Packaging
Dependency changes
Bumped minimum version of
msgpackdependency to 1.1.0. (#357)
Added
Low-level API: Added
AsyncBackend.create_fair_lock()method. There is a library-agnostic default implementation that usesEventobjects. (#348)Low-level API: Added
StapledStreamTransportandAsyncStapledStreamTransportclasses. (#352)Low-level API: Added
StapledDatagramTransportandAsyncStapledDatagramTransportclasses. (#352)Low-level API:
build_lowlevel_stream_server_handler: Added variadic arguments forinitializerparameter. (#356)Low-level API:
build_lowlevel_datagram_server_handler: Added variadic arguments forinitializerparameter. (#356)Low-level API:
AsyncTLSListener: Addedhandshake_error_handlerparameter. (#360)Added Unix Sockets support:
Added
UnixStreamClientandAsyncUnixStreamClient.Added
UnixDatagramClientandAsyncUnixDatagramClient.Added
StandaloneUnixStreamServerandAsyncUnixStreamServer.Added
StandaloneUnixDatagramServerandAsyncUnixDatagramServer.Request handlers: Added
UNIXClientAttributetyped attribute set.Low-level API:
In
easynetwork.lowlevel.socketmodule:Added
UNIXSocketAttributetyped attributes set.Added
UnixCredentials.Added
UnixSocketAddress.
In
easynetwork.lowlevel.api_async.backendmodule:Added
AsyncBackend.create_unix_stream_connection().Added
AsyncBackend.create_unix_datagram_endpoint().Added
AsyncBackend.create_unix_stream_listener().Added
AsyncBackend.create_unix_datagram_listener().
GitHub PR: (#389)
Changed
AsyncTCPNetworkServer: Concurrently callingclient.send_packet()now ensures that packets are sent in a deterministic order, i.e. the task which has been waiting longest. (#348)Concurrently calling
AsyncUPNetworkClient.send_packet()now ensures that packets are sent in a deterministic order, i.e. the task which has been waiting longest. (#348)Concurrently calling
AsyncTCPNetworkClient.send_packet()now ensures that packets are sent in a deterministic order, i.e. the task which has been waiting longest. (#348)Low-level API:
trio: ImprovedAsyncDatagramListener.serve()performances. (#349)Low-level API:
aclose_forcefullynow takes any closeable object with abackend()method. (#350)Low-level API:
trio: Better way to connect a socket. (#353)AsyncUDPNetworkServer: Introduced a proper client cache system. (#356)AsyncTCPNetworkServer: When using SSL, handshake timeouts are not logged anymore. (#360)AsyncTCPNetworkServer: When using SSL, an error on handshake phase is now logged atWARNINGlevel instead ofERRORlevel. (#360)Low-level API: Faster access to extra attributes. (#362)
Low-level API:
asyncio: ImprovedAsyncStreamReadTransport.recv_into()performances. (#385)Low-level API:
asyncio: Clear traceback frames of exception objects saved by transports. (#385)
Fixed
Low-level API:
asyncio: Fixed TCP socket listener’saccept()not cancelled if the coroutine handles capacity errors. (#346)Low-level API:
trio: The TCP socket listener now handles accept(2) capacity errors. (#347)Low-level API:
trio: Fixed potential crash when calling concurrentlyAsyncDatagramListener.send_to()andsocket.sendto()would block. (#348)Low-level API:
AsyncStreamServer: Pending client data to read was cleared when explicitly closing the client object. Now it is done only when the client task is finished. (#350)Low-level API:
AsyncTLSStreamTransport: There was no task synchronization ( locks ) on read and write operations. (#350)Low-level API:
trio: When closing an UDP socket listener, it now waits for all pending datagram to be sent beforre closing the socket. (#350)AsyncTCPNetworkServer: Clients was not closed whenaclose()coroutine has been cancelled. (#350)Fixed
UDPNetworkClienttrying to bind sockets when it is not needed. (#354)Fixed
AsyncUDPNetworkClienttrying to bind sockets when it is not needed. (#354)AsyncUDPNetworkServer: Fixed slow access to the client’s extra attributes provided. (#355)AsyncTCPNetworkServer: Fixed slow access to the client’s extra attributes provided. (#355)Low-level API:
AsyncDatagramServer: Fixed cache inconsistency. (#356)AsyncTCPNetworkServer: When using SSL, connection errors during handshake phase do not produce a traceback log. (#360)Fixed
AsyncTCPNetworkServerstopping the main task because ofsocket.accept()raising ignorable errors. (#367)Low-level API:
trio: Fixed UDP socket listener crashing down application onsocket.recvfrom()errors. (#371)Fixed
AsyncTCPNetworkClientcrash withssl=Trueand OpenSSL version before 3.0. (#381)Fixed
TCPNetworkClientcrash withssl=Trueand OpenSSL version before 3.0. (#381)Low-level API:
AsyncStreamEndpoint: Fixed byte buffers not deallocated until garbage collection iftransport.aclose()raises an exception. (#385)Low-level API:
StreamEndpoint: Fixed byte buffers not deallocated until garbage collection iftransport.close()ortransport.aclose()raises an exception. (#385)Low-level API:
StreamReceiverEndpoint: Fixed byte buffers not deallocated until garbage collection iftransport.close()raises an exception. (#385)Low-level API:
AsyncStreamReceiverEndpoint: Fixed byte buffers not deallocated until garbage collection iftransport.aclose()raises an exception. (#385)AsyncTCPNetworkClientobjects was not closed whenaclose()coroutine has been cancelled. (#389)AsyncUDPNetworkClientobjects was not closed whenaclose()coroutine has been cancelled. (#389)
Removed
Removed
max_recv_sizeproperty from high-level API:AsyncTCPNetworkClientTCPNetworkClient
The returned value was not reliable. (#350)
Removed
max_recv_sizeproperty from low-level API:Asynchronous API:
AsyncStreamReceiverEndpointAsyncStreamEndpoint
Blocking API:
StreamReceiverEndpointStreamEndpoint
The returned value was not reliable. (#350)
Documentation
Build: Bumped minimum version of
sphinxdependency to 8.1. (#359)Build: Bumped minimum version of
sphinx-rtd-themedependency to 3.0. (#359)Fixed missing documentation on socket addresses and client attributes. (#374)
Removed
reuse_portoption from UDP clients. (#375)Clarify
AsyncBackend.create_condition_var()behavior with lock argument. (#377)Updated Copyright years. (#388)
1.0.0 (2024-09-07)
Initial stable release.