State machine
This patch was authored by @fabianfett and released by @0xTim.
Motivation
Connection state changes can be modeled with state machines. This PR introduces a ConnectionStateMachine that models the PostgresConnection's state. This will improve the Unit-testability of this package.
Changes
- This PR does not change any public API
- It replaces the underlying implementation of
PostgresConnectionwith a newPSQLConnection - All new classes and structs that support the new
PSQLConnectionlive in the/Newfolder - The
PSQLConnectionis mainly implemented using thesestructsandclasses:PSQLFrontendMessagea new enum modeling outgoing client messages to the serverPSQLBackendMessagea new enum modeling incoming server messages to the clientPSQLFrontendMessage.Encodera newMessageToByteEncoderPSQLBackendMessage.Decodera newByteToMessageEncoderConnectionStateMachinewith the sub state machines:AuthenticationStateMachineCloseStateMachineExtendedQueryStateMachinePrepareStatementStateMachine
PSQLChannelHandleris the mainChannelDuplexHandlerfor thePSQLConnectionPSQLEventsHandleris a newChannelHandlerthat observes the channel events and closes the connection when appropriate.PSQLEncodableis a new protocol to convert Swift types to Postgres types.PSQLDecodableis a new protocol to convert Postgres types to Swift types.PSQLEncodableandPSQLDecodabledefer the encoding and decoding as much as possible, saving unnecessary allocations and conversions.
- Thanks to these changes extended queries and prepared statements will now take the same code paths. Thus we ensure that code improvements for one query type will also lead to improvements for the other.
Result
We get a better testable PostgresConnection.