Releases: mirage/capnp-rpc
2.0
CHANGES:
capnp-rpc 2.0 switches from using Lwt to Eio.
The capnp-rpc-lwt
package is now just Lwt wrappers around the Eio functions in capnp-rpc
.
This allows libraries using the old Lwt API to be used with applications and libraries using the new Eio one,
in the same binary.
Because Lwt libraries (using capnp-rpc-lwt
) can be used with Eio applications (using capnp-rpc-unix
),
you should first upgrade your application and then upgrade the libraries afterwards.
It is recommended to upgrade in stages, checking your application still works after each step:
-
Upgrade to the latest Lwt version (
opam install capnp-rpc-unix.1.2.4
).
This uses the new version of mirage-crypto, tls, etc,
which may be incompatible with other libraries you are using.
Get that sorted out before switching to capnp-rpc 2.0. -
Use lwt_eio to allow using Eio and Lwt together in your application.
This means replacing your call toLwt_main.run
with code to run Eio and Lwt together,
as explained at the start of thelwt_eio
README. -
Upgrade your main application to capnp-rpc-unix 2.0.
Calls to functions in theCapnp_rpc_unix
andCapnp_rpc_net
modules will need minor updates.
They were previously called from Lwt context, so you'll need to wrap them withLwt_eio.run_eio
(or remove aLwt_eio.run_lwt
if you already updated the surrounding code).
You should also usemirage-crypto-rng-eio
to ensure randomness is available
(capnp-rpc-unix
no longer does this, although some other library might). -
Upgrade code and libraries using
Capnp_rpc_lwt
:- Replace
open Capnp_rpc_lwt
withopen Capnp_rpc.Std
. - Replace all other uses of
Capnp_rpc_lwt
with justCapnp_rpc
. - In
dune
andopam
files, replacecapnp-rpc-lwt
withcapnp-rpc
. - Some modules are in
Capnp_rpc
but not theCapnp_rpc.Std
subset.
Those should now be fully qualified (e.g. replacePersistence
with
Capnp_rpc.Persistence
). - Replace
Service.return_lwt
withLwt_eio.run_lwt
.
ReplaceLwt.return (Ok x)
withService.return x
.
- Replace
Once all Lwt code is gone, you can remove the dependencies on lwt
and lwt_eio
.
New features:
- Allow numeric IPv6 listen addresses (@talex5 #296, requested by @BChabanne).
API changes:
-
Eio port (@talex5 #280 #284 #298 #292 #297 #300 #304).
This switches capnp-rpc from Lwt to Eio.
One particularly nice side effect of this is thatService.return_lwt
has gone,
as there is no distinction now between concurrent and non-concurrent service methods.Uses of
Capnp_rpc_lwt
should be replaced by uses ofCapnp_rpc
(and the oldCapnp_rpc
is now an internal module,Capnp_rpc_proto
).
The newCapnp_rpc
now providesError
,Exception
andDebug
aliases to the same modules inCapnp_rpc_proto
,
so thatCapnp_rpc_proto
doesn't need to be used directly.Capnp_rpc_lwt
now provides (deprecated) compatibility wrappers, usinglwt_eio
.This also adds
Capnp_rpc.Std
with some common module aliases,
to reduce the need toopen Capnp_rpc
(which is rather large).
Performance and bug fixes:
-
Add buffering of outgoing messages (@talex5 #287 #303).
Sending each message in its own TCP packet isn't very efficient, and also interacts very badly with Nagle's algorithm.
See https://roscidus.com/blog/blog/2024/07/22/performance/ for details. -
Only disconnect socket when sending is done (@talex5 #295).
Allows sending the reason for the disconnection in some cases. -
Fix type of
Capability.call
(@talex5 #293).
It was previously unusable.
Build:
1.2.4
CHANGES:
-
Update dependencies and remove capnp-rpc-mirage (@talex5 #276).
- Update for breaking changes in tls, mirage-crypto and mirage-flow.
- capnp-rpc-mirage isn't used much, and won't be needed after switching to Eio.
-
Update links to ocaml-ci and capnp-ocaml (@tmcgilchrist #271).
1.2.3
1.2.2
1.2.1
CHANGES:
-
Fix Fmt deprecation warnings (@tmcgilchrist #239).
-
Update to latest X509 and DNS APIs (@tmcgilchrist #240).
v1.2
CHANGES:
-
Don't crash if the peer disconnects before the bootstrap reply is ready (@talex5 #234).
When replying to a normal question we checked that the answer was still needed before trying to reply, but didn't for bootstrap requests. -
Replace
wait_until_settled
with saferawait_settled
(@talex5 #233).
wait_until_settled
makes it too easy to ignore errors. -
Require fmt >= 0.8.7 for
kstr
and set OCaml 4.08 as the minimum version everywhere (@talex5 #232).
Older versions aren't tested in CI because the unix and mirage packages require at least OCaml 4.08.
v1.1
CHANGES:
-
Update to latest X509, TCP and TLS APIs (@talex5 @hannesm #228).
-
Remove confusing debug details from
call_for_value_exn
errors (@talex5 #230).
The hidden information is now logged (at debug level) instead. -
Configure TCP keep-alives for incoming connections, not just outgoing ones (@talex5 #227).
This is needed when the client machine crashes without resetting the connection. -
Include version number in opam license field (@talex5 #226).
v1.0
v0.9.0
CHANGES:
-
Add connection progress indicator (@talex5 #220).
Clients can now useCapnp_rpc_unix.with_cap_exn
to show a progress indicator while waiting to connect.
It will use the log if enabled.
If not, but stderr is a tty, it shows a message while connecting and then erases it (if connecting takes longer than 0.5s).
If stderr is not a tty, it just prints a message there. -
Use
Mirage_crypto_rng_lwt.initialize
instead ofMirage_crypto_rng_unix.initialize
(@hannesm #217).
The former periodically feeds entropy to the RNG, while the latter seeds the RNG only once. -
Set TCP_KEEPIDLE=60 if possible (@talex5 #214).
Cap'n Proto connections tend to be long lived and we therefore turn on theSO_KEEPALIVE
option.
However, the default keepalive timeout of 2 hours is much too long for some networks.
In particular, Docker's libnetwork silently drops idle connections after about 10 minutes.
Windows support:
-
Prevent crash if ExtUnix wasn't built with sockopt (@MisterDA #218).
If ExtUnix isn't built with sockopt then the symbolhave_sockopt_int
isn't available and an exception is raised.
This may be the case on some environments (e.g., ExtUnix built with mingw-w64).
It is a workaround until support forTCP_KEEPIDLE
is added for these environments (e.g., using Winsock instead). -
Switch from "capnpc" to "capnp compile" (@talex5 #213).
capnpc
seems to be the old name, and isn't present on Windows.
Build changes:
-
Remove Travis and Dockerfile (@talex5 #220).
Travis is very slow and error-prone now, and ocaml-ci generates a working Dockerfile automatically for people who want it. -
Include transitive dependencies in opam files (@talex5 #219).
Patch generated by https://github.com/ocurrent/opam-dune-lint/ -
Require
tcpip.unix
specifically to get the checksum stubs linked (@hannesm #216).
v0.8.0
CHANGES:
Bug fixes and diagnostics:
-
Improve "Already resolved!" error message (@talex5, #209).
Show the state of the promise we were trying to set, and what we tried to set it to. -
Reject attempts to send after disconnecting (@talex5, #208).
-
Unix: don't leak FDs if
Network.connect
fails (@talex5, #206).
Also, useLwt
to open connections so we don't block the whole process.
New functions:
- Add
Sturdy_ref.with_cap
andwith_cap_exn
convenience functions (@talex5, #207).
Using the plainconnect
functions, it's easy to forget to release the live-ref at the end.
Build changes:
-
capnp-rpc-mirage: adapt test to tcpip 5.0.0 API (@hannesm, #205).
-
Switch tests to build in native code and use the test stanza (@avsm, #203).
Documentation: