|
11 | 11 | from typing import Final |
12 | 12 |
|
13 | 13 | import databento_dbn |
| 14 | +from databento_dbn import Metadata |
14 | 15 | from databento_dbn import Schema |
15 | 16 | from databento_dbn import SType |
16 | 17 |
|
@@ -195,28 +196,29 @@ def __init__( |
195 | 196 | self._user_streams = user_streams |
196 | 197 |
|
197 | 198 | def _process_dbn(self, data: bytes) -> None: |
198 | | - # Do no re-write the metadata to the stream to avoid corruption |
199 | | - if not self._metadata or not data.startswith(b"DBN"): |
200 | | - for stream, exc_callback in self._user_streams.items(): |
201 | | - try: |
202 | | - stream.write(data) |
203 | | - except Exception as exc: |
204 | | - stream_name = getattr(stream, "name", str(stream)) |
205 | | - logger.error( |
206 | | - "error writing %d bytes to `%s` stream", |
207 | | - len(data), |
208 | | - stream_name, |
209 | | - exc_info=exc, |
210 | | - ) |
211 | | - if exc_callback is not None: |
212 | | - exc_callback(exc) |
| 199 | + start_index = 0 |
| 200 | + if data.startswith(b"DBN") and self._metadata: |
| 201 | + # We have already received metata for the stream |
| 202 | + # Set start index to metadata length |
| 203 | + start_index = int.from_bytes(data[4:8], byteorder="little") + 8 |
| 204 | + self._metadata.check(Metadata.decode(bytes(data[:start_index]))) |
| 205 | + for stream, exc_callback in self._user_streams.items(): |
| 206 | + try: |
| 207 | + stream.write(data[start_index:]) |
| 208 | + except Exception as exc: |
| 209 | + stream_name = getattr(stream, "name", str(stream)) |
| 210 | + logger.error( |
| 211 | + "error writing %d bytes to `%s` stream", |
| 212 | + len(data[start_index:]), |
| 213 | + stream_name, |
| 214 | + exc_info=exc, |
| 215 | + ) |
| 216 | + if exc_callback is not None: |
| 217 | + exc_callback(exc) |
213 | 218 | return super()._process_dbn(data) |
214 | 219 |
|
215 | 220 | def received_metadata(self, metadata: databento_dbn.Metadata) -> None: |
216 | | - if not self._metadata: |
217 | | - self._metadata.data = metadata |
218 | | - else: |
219 | | - self._metadata.check(metadata) |
| 221 | + self._metadata.data = metadata |
220 | 222 | return super().received_metadata(metadata) |
221 | 223 |
|
222 | 224 | def received_record(self, record: DBNRecord) -> None: |
|
0 commit comments