| // 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 proxy implements a proxy for the stream layer. |
| // |
| // Each process in vanadium is uniquely identified by a routing id |
| // (naming.RoutingID). A proxy routes messages |
| // (v.io/x/ref/runtime/internal/rpc/stream/message) it receives on a network connection |
| // (net.Conn) to the network connection on which the destination process |
| // (identified by the routing id) is listening. |
| // |
| // Processes behind a NAT can use the proxy to export their services outside |
| // the NAT. |
| // Sample usage: |
| // var proxyEP naming.Endpoint // Endpoint of the proxy server |
| // var manager stream.Manager // Manager used to create and listen for VCs and Flows. |
| // ln, ep, err := manager.Listen(proxyEP.Network(), proxyEP.String()) |
| // // Now ln.Accept() will return Flows initiated by remote processes through the proxy. |
| // |
| // The proxy implemented in this package operates as follows: |
| // - When an OpenVC message is received at the proxy, the RoutingID(R) |
| // of the source endpoint is associated with the net.Conn the message |
| // was received on. |
| // - This association is used to route messages destined for R to the |
| // corresponding net.Conn |
| // - Servers can "listen" on the proxy's address by establishing a VC to the |
| // proxy. Once the VC is established, messages received at the proxy destined |
| // for the RoutingID of the server are forwarded to the net.Conn between the |
| // server and the proxy. |
| // |
| // For example, consider the following three processes: |
| // - Proxy(P) with routing id Rp |
| // - A server (S) wishing to listen on the proxy's address with routing id Rs |
| // - A client (C) wishing to connect to S through the proxy with routing id Rc. |
| // |
| // Here is a valid sequence of events that makes that possible: |
| // (1) S establishes a VC with P over a net.Conn c1 |
| // As a result, P knows that any messages intended for Rs should be |
| // forwarded on c1 |
| // (2) C connects to P over a net.Conn c2 and attempts to establish a VC with S |
| // using an OpenVC message. |
| // The source endpoint of this message contains the routing id Rc while the |
| // destination endpoint contains the routing id Rs. |
| // (3) The proxy sees this message and: |
| // (a) Forwards the message over c1 (since Rs is mapped to c1) |
| // (b) Updates its routing table so that messages intended for Rc are forwarded over c2 |
| // (4) Any messages from S intended for the client received on c1 are forwarded |
| // by the proxy over c2. |
| package proxy |