Changelog
All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Section titled “[Unreleased]”Changed
Section titled “Changed”- The license is now Apache-2.0, previously MIT.
1.2.0 - 2026-08-01
Section titled “1.2.0 - 2026-08-01”- Encoding version 3, which carries a message as a length prefix and the raw bytes instead of an escaped line of text. Client and server agree on it when the connection opens and fall back to version 2 against an older peer.
- Streaming requests and responses, through
NamedPipeClient.SendRequestAsync(address, writeMessage, readResponse)on one side andNamedPipeServer.UseMessageStreamwithNamedPipeRequestEventArgs.SetResponseon the other. A large payload no longer has to fit in memory. Both need version 3 and throwNotSupportedExceptionagainst an older peer. NamedPipeClient.SendBytesAsync, which sends and receives bytes without base64.NamedPipeServer.IncludeExceptionStackTrace, which keeps the stack trace of a failed request off the wire. The exception type and message are always sent.IsDisposedon the client, the server, the pool and the pool link.- XML documentation for the public API.
Changed
Section titled “Changed”- Setting
NamedPipeServer.Enabledtofalsecloses the connections that are still open. A client in the middle of a request getsNamedPipeConnectionLostException. NamedPipeClientPool.Dispose()waits for the requests that are still running. It used to return at once and leave the pool broken, so every later call ended inNullReferenceException.- An address that starts with
--is rejected withArgumentException, because the prefix is reserved for internal commands. - A connection that breaks while a request is in flight raises
NamedPipeConnectionLostException. Earlier versions reportedNotSupportedExceptionfor an unknown server response. NamedPipeClient.IsConnectedisfalseafterDispose().
- The library runs on Linux and macOS. Earlier versions used pipe calls that exist on Windows only, so a server on another platform never started listening and every client timed out.
- A disabled server no longer leaves behind a pipe that accepts connections and never answers, which also made a restart hang.
- The server no longer raises
Requestwith an empty address when a client disconnects. - Client and server agree on the encoding again after a reconnect. A reconnected client could otherwise send in a different version than the server expected.
NamedPipeConnectionBagis safe for concurrent access.NamedPipeClientandNamedPipeServerreject anullpipe name, andNamedPipeClientPoolrejects a size below one, which used to hang instead.
- The negotiated encoding version is applied to every connection in
NamedPipeClientPool.
NamedPipeClientPoolkeeps a bounded set of reusable connections.- Encoding version 1 is available for a peer that predates version 2, through
NamedPipeServer.SupportLegacyEncoding. Client and server negotiate the version when the connection opens.
- A
nullmessage no longer fails the request.
- First release:
NamedPipeServerandNamedPipeClientwith a request and response API over named pipes.