)]}'
{
  "commit": "335e56f7c751a21dc7d2ce74062ca522461802f1",
  "tree": "51f21da8d0ca289d2de6fdca39b50a13a6394f12",
  "parents": [
    "687c6e70eaab87169f1623e8cc0f7273ef041c52"
  ],
  "author": {
    "name": "QUICHE team",
    "email": "quiche-dev@google.com",
    "time": "Mon Jul 29 15:06:31 2019 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Tue Jul 30 11:03:11 2019 -0700"
  },
  "message": "Create a QuartcMultiplexer which separates streams and datagrams into channels.\n\nQuartcMultiplexer effectively reorganizes the calls and callbacks for\nQuartcSession into three categories:\n - Per-channel send events\n - Per-channel receive events\n - Session-wide events that are not multiplexed\n\nQuartcMultiplexer works at a low level to hide streams and messages from other\nsenders and receivers.  It consists of a core multiplexer object which interacts\nwith the QuartcEndpoint/Session, a channel sender which handles outgoing data,\nand a channel receiver which handles incoming data.\n\nThe sender has a specific channel id, specified on creation.  A channel writes\nthis channel id in a varint form at the start of each new stream or datagram it\nsends.\n\nThe multiplexer intercepts all the callbacks for incoming streams and datagrams.\nIt reads a varint from the start of each stream or datagram to identify the\nchannel id.  It then looks up a receiver for that channel and delegates the\nstream or datagram to that receiver.\n\nA default receiver may be registered to handle all streams or datagrams not\nassigned to a specific receiver.  This allows endpoints to dispatch unhandled\ndata to a catch-all, or to await incoming data before registering a specific\nreceiver.  The latter may be useful to in conjunction with some forms of\nnegotiation; eg. when certain ranges of channel ids are allocated to different\nprotocols, but it is unknown which protocol will be used at startup.\n\ngfe-relnote: n/a (quartc only)\nPiperOrigin-RevId: 260588723\nChange-Id: I4a3b815b48c4f825c47bc60b0b3fd76d4e3614a5\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "001e2198d163836130032e3566ed86f60ce33d3e",
      "new_mode": 33188,
      "new_path": "quic/quartc/quartc_multiplexer.cc"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "aa19e7057b735f4cf92b3fc6edbefba3002dc631",
      "new_mode": 33188,
      "new_path": "quic/quartc/quartc_multiplexer.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "64609cbc56e45b32152f10fabad538f59d1163a0",
      "new_mode": 33188,
      "new_path": "quic/quartc/quartc_multiplexer_test.cc"
    },
    {
      "type": "modify",
      "old_id": "607fa432723555d33d873502d921bd8a395472a5",
      "old_mode": 33188,
      "old_path": "quic/quartc/quartc_stream.cc",
      "new_id": "f18d42defc8e7f1951027cbf770c9b3b2e644ccd",
      "new_mode": 33188,
      "new_path": "quic/quartc/quartc_stream.cc"
    }
  ]
}
