You can accomplish that with CapabilityServerSet, which was added in this commit: https://github.com/sandstorm-io/capnproto/commit/8b8f8a2fc25d69c8a43ee0ac987521c2c4d5108c .
Unfortunately, there has not yet been a release that includes CapabilityServerSet, so you would need to install Cap'n Proto from git to make use of it. On Tue, Feb 21, 2017 at 1:06 PM, Johannes Zeppenfeld <[email protected]> wrote: > Knowing that the answer to the question in the subject is probably "don't > do that", I'm looking for a way to support database-like transactions > (i.e., event-loop atomic operations) spanning multiple server objects. > > Here's a simplified schema to help explain the problem: > > # A transaction holds a list of actions that should be processed in a > single > # event-loop atomic operation. > struct Transaction { > actions @0 :List(Action); > > struct Action { > union { > nop @0 :Void; > execute @1 :Callable; > #doSomething @2 :AnotherType; > #etc... > } > } > } > > # A callable is a server-side object conveying the capability of calling > # some server function as part of a transaction. > interface Callable { } > > # Some other interface that serves callables (simplified example) and > # processes transactions. > interface Bootstrap { > getCallable @0 (name :Text) -> (callable :Callable); > > process @1 (transaction :Transaction); > } > > A client can obtain Callables from the server through e.g. the Bootstrap > interface, and should then be able to pass that Callable as part of a > Transaction back to the server. The Callable::Server implementation > contains a std::function that should be called for any Callable that is > executed as part of a transaction. > > Unfortunately (although it totally makes sense), the Transaction Reader > available in the Bootstrap implementation's process method only provides a > Callable::Client, without a possibility (as far as I can tell) of > retrieving the associated Callable::Server object. Thus it is not possible > to retrieve nor call the std::function object associated with the Callable. > > Adding a call method to the Callable interface would allow it to be called > by the process method or directly by the client, but not (again as far as I > can tell) in an event-loop atomic manner as part of a transaction. > > I hope that the scenario above is understandable. If not I'd be more than > happy to elaborate on points that are not clear. > > Am I overlooking something that would allow somehow calling the > std::function of a Callable implementation from within the process method? > Does anyone have a different suggestion for achieving something like this? > > I would like to avoid implementing a custom capability system that > replaces Callable with a struct containing an id. But perhaps it is the > only way? > > Thanks! > Johannes > > -- > You received this message because you are subscribed to the Google Groups > "Cap'n Proto" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > Visit this group at https://groups.google.com/group/capnproto. > -- You received this message because you are subscribed to the Google Groups "Cap'n Proto" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. Visit this group at https://groups.google.com/group/capnproto.
