It may seem weird that code and details would travel along two paths
now instead of one but it makes sense after considering that sometimes
the code and details are application data from the remote application
and sometimes they are transport data from the transport between the
local and remote applications.
- We use C++ as an example to show how this API can be used while still
providing an idiomatic interface in the wrapped language of choice.
- No testing yet.
(1) In _ingestion, it's the "details" attribute of a
NoSuchMethodException that we want. The "message" is inherited from the
base Exception class.
(2) In _transmission, use a proper sum type for representing operation
abortion. Trying to overload the existing _completion value for
status-and-details-when-aborting was trying to be too clever.
(3) In _calls... oof. Just look. Oof. Test coverage for this code path
is added.
(4) In _service, the application-provided
face.MultiMethodImplementation isn't directly callable, but rather
exposes a method named "service".
(5) In crust.implementations, the wrapping that we've put around the
application-provided face.MultiMethodImplementation *is* directly
callable, and *does not* expose a method named "service".
(6) Also in crust.implementations, base.NoSuchMethodError's constructor
takes a code value and a details value.
(7) Again in crust.implementations, the application-provided
face.MultiMethodImplementation may be None, and if it is None, we
shouldn't wrap it with an adaptation function that would only raise a
TypeError at a later time.
(1) Plumb the metadata transformer given at the Beta API through to the
InvocationLink where it will be used.
(2) In both InvocationLink and ServiceLink, if there isn't a registered
serializer or deserializer, just pass the payload through rather than
ignoring the entire RPC.
- The processor now belongs to the server credentials in core.
- The server credentials now needs to be refcounted.
- Changed slighly the vtable of credentials to make it easier to avoid
memory leaks (free'ing the pointer is now done at the common layer,
the implementations of the creds are now only reponsible for
destructing the implementations' specific members.
The invoker is an object derived from, and referring to, objects of the
Face implementation under test. If those objects are to be garbage
collected at the appropriate time the invoker that references them must
be made eligible for garbage collection in the test's tearDown method.