blob: 509628a36eb25c57888d08b81f3aa802e16437c2 [file] [log] [blame]
// 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 stream implements authenticated byte streams to vanadium endpoints.
//
// It is split into multiple sub-packages in an attempt to keep the code
// healthier by limiting the dependencies between objects. Most users should not
// need to use this package.
//
// Package contents and dependencies are as follows:
//
// * manager provides a factory for Manager objects.
// It depends on the vif and proxy packages.
// * vif implements a VIF type that wraps over a net.Conn and enables the
// creation of VC objects over the underlying network connection.
// It depends on the id, message and vc packages.
// * message implements serialization and deserialization for messages
// exchanged over a VIF.
// It depends on the id package.
// * vc provides types implementing VC and Flow.
// It depends on the id and crypto packages.
// * crypto provides types to secure communication over VCs.
// It does not depend on any other package.
// * id defines identifier types used by other packages.
// It does not depend on any other package.
package stream
// A dump of some ideas/thoughts/TODOs arising from the first iteration of this
// package. Big ticket items like proxying and TLS/authentication are obvious
// and won't be missed. I just wanted to put some smaller items on record (in
// no particular order).
//
// (1) Garbage collection of VIFs: Create a policy to close the underlying
// network connection (and shutdown the VIF) when it is "inactive" (i.e., no VCs
// have existed on it for a while).
// (2) On the first write of a new flow, counters are stolen from a shared pool
// (to avoid a round trip of a "create flow" message followed by a "here are
// your counters" message). Currently, this happens on either end of the flow
// (on both the remote and local process). This doesn't need to be the case,
// the end that received the first message of the flow doesn't need to steal
// on its first write.
// (3) Should flow control counters be part of the Data message?
// If so, maybe the flowQ should have a lower priority than that of Data
// messages? At a higher level I'm thinking of ways to reduce the number
// of messages sent per flow. Currently, just creating a flow results in
// two messages - One where the initiator sends counters to the receiver
// and one where the receiver does the same. The first write does not
// block on receiving the counters because of the "steal from shared pool on
// first write" scheme, but still, sounds like too much traffic.
// (4) As an example of the above, consider the following code:
// vc.Connect().Close()
// This will result in 3 messages. But ideally it should involve 0.
// (5) Encryption of control messages to protect from network sniffers.