// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/**
 * Package rpc defines interfaces for communication via remote procedure call.
 * <p><ul>
 *   <li>Concept: <a href="https://github.com/vanadium/docs/blob/master/concepts/rpc.md">https://github.com/vanadium/docs/blob/master/concepts/rpc.md</a>.</li>
 *   <li>Tutorial: (forthcoming)</li>
 * </ul><p>
 * There are two actors in the system, clients and servers.  {@link io.v.v23.rpc.Client}s invoke
 * methods on {@link io.v.v23.rpc.Server}s, using the
 * {@link io.v.v23.rpc.Client#startCall startCall} method. {@link io.v.v23.rpc.Server}s implement
 * methods on named objects.  The named object is found using a {@link io.v.v23.rpc.Dispatcher} and
 * the method is invoked using an {@link io.v.v23.rpc.Invoker}.
 * <p>
 * Instances of the {@link io.v.v23.VRuntime} host {@link io.v.v23.rpc.Client}s and
 * {@link io.v.v23.rpc.Server}s; such instances may simultaneously host both
 * {@link io.v.v23.rpc.Client}s and {@link io.v.v23.rpc.Server}s.  The {@link io.v.v23.VRuntime}
 * allows multiple names to be simultaneously supported via the {@link io.v.v23.rpc.Dispatcher}
 * interface.
 * <p>
 * The {@code naming} package provides a rendezvous mechanism for {@link io.v.v23.rpc.Client}s and
 * {@link io.v.v23.rpc.Server}s.  In particular, it allows {@link io.v.v23.VRuntime} hosting
 * {@link io.v.v23.rpc.Server}s to share endpoints with {@link io.v.v23.rpc.Client}s that enables
 * communication between them.  Endpoints encode sufficient addressing information to enable
 * communication.
 */
package io.v.v23.rpc;
