hydrate-protobuf-v2 (Transform Node)
The Hydrate Protobuf v2 node decodes HEAT capture data shaped as DataPacket / DataPacketBundle (see HEAT.Proto.Capture in the protolib), walks every nested packet, and extracts a single kind of simulation payload from each SimulationFrame: either the full frame, each EntityState, or each EntityDataEvent (from frame.events where the EntityEvent carries data_event).
Use this node when you need capture-aware extraction with stable envelope fields (parent input key, packet timestamps, origin_uuid, simulation tick/time) across all upstream parents. The original hydrate-protobuf node remains for Gaze, FolderUploadData, OpenDIS PDU, and its legacy SimulationFrame component flattening.
Capture hierarchy
Configuration schema
| Property | Type | Required | Description |
|---|---|---|---|
extractionTarget | string | Yes | One of SimulationFrame, EntityState, EntityDataEvent. |
outputFormat | "json" | "csv" | Yes | json: UTF-8 JSON object with a top-level records array. csv: scalar columns plus record_json (full row JSON) per line. |
sortBy | string | No | none (default), simulation_time_seconds, or packet_timestamp_unix_ms for stable ordering after merging parents. |
dataSourceName | string | No | Output data source; defaults to the runner default_store when omitted. |
enableUploadDeduplication | boolean | No | Logs output md5; full upload deduplication is not yet implemented. Default false. |
Output shape (JSON)
The artefact is a JSON object:
{
"extractionTarget": "EntityState",
"records": [
{
"parent_input_key": "upstream-node-name",
"payload_index": 0,
"inner_packet_index": 2,
"bundle_timestamp_unix_ms": null,
"packet_timestamp_unix_ms": 1710000000000,
"packet_timestamp_iso_utc": "2024-03-09T12:00:00.000Z",
"origin_uuid": "…",
"simulation_tick": 42,
"simulation_time_seconds": 1.5,
"capture_time_timestamp_ms": null,
"capture_time_iso_utc": null,
"capture_time_timezone_offset_minutes": 0,
"extraction_target": "EntityState",
"entity_state_index": 0,
"entity_state": { }
}
]
}For EntityDataEvent, each record follows the existing event dictionary layout from the decoder (event_category, event_type, event_data, …) plus the same envelope fields merged in.
Example configuration
{
"extractionTarget": "EntityState",
"outputFormat": "json",
"sortBy": "simulation_time_seconds",
"dataSourceName": "my-store"
}Inputs and outputs
- Inputs: All parents are merged. Each parent contributes a list of binary
DataPacketpayloads (same wire format as v1). - Output: One JSON or CSV artefact. Unlike v1, every parent key in
fetch_all_inputsis processed, not only the first.