// This is an implementation of the [HTTP/2][http2]
// framing layer for [node.js][node].
//
// The main building blocks are [node.js streams][node-stream] that are connected through pipes.
//
// The main components are:
//
// * [Endpoint](endpoint.html): represents an HTTP/2 endpoint (client or server). It's
// responsible for the the first part of the handshake process (sending/receiving the
// [connection header][http2-connheader]) and manages other components (framer, compressor,
// connection, streams) that make up a client or server.
//
// * [Connection](connection.html): multiplexes the active HTTP/2 streams, manages connection
// lifecycle and settings, and responsible for enforcing the connection level limits (flow
// control, initiated stream limit)
//
// * [Stream](stream.html): implementation of the [HTTP/2 stream concept][http2-stream].
// Implements the [stream state machine][http2-streamstate] defined by the standard, provides
// management methods and events for using the stream (sending/receiving headers, data, etc.),
// and enforces stream level constraints (flow control, sending only legal frames).
//
// * [Flow](flow.html): implements flow control for Connection and Stream as parent class.
//
// * [Compressor and Decompressor](compressor.html): compression and decompression of HEADER and
// PUSH_PROMISE frames
//
// * [Serializer and Deserializer](framer.html): the lowest layer in the stack that transforms
// between the binary and the JavaScript object representation of HTTP/2 frames
//
// [http2]: https://tools.ietf.org/html/rfc7540
// [http2-connheader]: https://tools.ietf.org/html/rfc7540#section-3.5
// [http2-stream]: https://tools.ietf.org/html/rfc7540#section-5
// [http2-streamstate]: https://tools.ietf.org/html/rfc7540#section-5.1
// [node]: https://nodejs.org/
// [node-stream]: https://nodejs.org/api/stream.html
// [node-https]: https://nodejs.org/api/https.html
// [node-http]: https://nodejs.org/api/http.html
exports.VERSION = 'h2';
exports.Endpoint = require('./endpoint').Endpoint;
/* Bunyan serializers exported by submodules that are worth adding when creating a logger. */
exports.serializers = {};
var modules = ['./framer', './compressor', './flow', './connection', './stream', './endpoint'];
try {
modules.map(require).forEach(function (module) {
for (var name in module.serializers) {
exports.serializers[name] = module.serializers[name];
}
});
} catch (e) {
// NOOP, probably in browser
}
/*
Stream API Endpoint API
Stream data
| ^ | ^
| | | |
| | | |
+-----------|------------|---------------------------------------+
| | | Endpoint |
| | | |
| +-------|------------|-----------------------------------+ |
| | | | Connection | |
| | v | | |
| | +-----------------------+ +-------------------- | |
| | | Stream | | Stream ... | |
| | +-----------------------+ +-------------------- | |
| | | ^ | ^ | |
| | v | v | | |
| | +------------+--+--------+--+------------+- ... | |
| | | ^ | |
| | | | | |
| +-----------------------|--------|-----------------------+ |
| | | |
| v | |
| +--------------------------+ +--------------------------+ |
| | Compressor | | Decompressor | |
| +--------------------------+ +--------------------------+ |
| | ^ |
| v | |
| +--------------------------+ +--------------------------+ |
| | Serializer | | Deserializer | |
| +--------------------------+ +--------------------------+ |
| | ^ |
+---------------------------|--------|---------------------------+
| |
v |
Raw data
*/
|