)]}'
{
  "commit": "d56e16e15a066389d7e1a6002d2f27ce637e2ac7",
  "tree": "075b279c5b479077685762329a6e0a23047975fc",
  "parents": [
    "c8b1052048f1755982feef370c7a07d4418d0f04"
  ],
  "author": {
    "name": "martinduke",
    "email": "martinduke@google.com",
    "time": "Mon Oct 12 10:10:40 2026 -0700"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Mon Oct 12 10:11:39 2026 -0700"
  },
  "message": "Synthesize an EndOfGroup object when FIN arrives without data.\n\nCurrently, when parsing a has_end_of_group stream, when the object is complete but no FIN has arrived, it can\u0027t be delivered because we don\u0027t know the status yet. If a FIN arrives later, the object\u0027s status will change to kEndOfGroup.\n\nThis introduces object delivery latency. Furthermore, there is a bug in that it can induce calls to OnObjectFragment() where the offset is \u003e 0 and the payload is empty, which is not envisioned in the API and is causing QUICHE_BUG in interop.\n\nThis CL removes the kAwaitingNextByte state; any object with payload can be delivered. If a FIN arrives immediately after, the parser will create a synthetic kEndOfGroup object.\n\nIf the payload is delivered in parts, it is possible for the object_status to suddenly change from Normal to EndOfGroup. PublishedObjectMetadata no longer regards this as a malformed track. This might open up some shenanigans where two publishers have different EndsOfGroup, but detection of that is best-effort. There is a performance advantage because if the last Normal object is delivered with EndOfGroup status, it is able to be FINed / EOGed immediately rather than waiting for a separate, synthetic object to arrive.\n\nPiperOrigin-RevId: 997993975\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8d5b0bfe2f2bede55e7797bfdcc0e55886af3eba",
      "old_mode": 33188,
      "old_path": "quiche/quic/moqt/moqt_object.h",
      "new_id": "5b2d2ce5c99fd504d62df12a1f8a9de4db57a439",
      "new_mode": 33188,
      "new_path": "quiche/quic/moqt/moqt_object.h"
    },
    {
      "type": "modify",
      "old_id": "c30b8ced9856c67d99f5f0029e0b346657b5147d",
      "old_mode": 33188,
      "old_path": "quiche/quic/moqt/moqt_object_test.cc",
      "new_id": "d22aeaef6fd05883f8f97574524181b8cf7cc0c9",
      "new_mode": 33188,
      "new_path": "quiche/quic/moqt/moqt_object_test.cc"
    },
    {
      "type": "modify",
      "old_id": "2b08a5bd20a4b4a623c1c8c2ac1409cfbbc0ef27",
      "old_mode": 33188,
      "old_path": "quiche/quic/moqt/moqt_parser.cc",
      "new_id": "451e7074dbebd14b2c61d6ac661b9c0028cb146e",
      "new_mode": 33188,
      "new_path": "quiche/quic/moqt/moqt_parser.cc"
    },
    {
      "type": "modify",
      "old_id": "f2e02057224f1561c2a882d91ee37f6019ac8598",
      "old_mode": 33188,
      "old_path": "quiche/quic/moqt/moqt_parser.h",
      "new_id": "642635598452e23d82e4156a1e1073e55289ce9d",
      "new_mode": 33188,
      "new_path": "quiche/quic/moqt/moqt_parser.h"
    },
    {
      "type": "modify",
      "old_id": "ab81ada23228952d405f054d488a54cc0ddbf444",
      "old_mode": 33188,
      "old_path": "quiche/quic/moqt/moqt_parser_test.cc",
      "new_id": "cc35e3d9c9c14bd92a56cd30267ad1c86a14ddb2",
      "new_mode": 33188,
      "new_path": "quiche/quic/moqt/moqt_parser_test.cc"
    }
  ]
}
