| 337 | yield data |
| 338 | |
| 339 | def decode(self, line: str) -> ServerSentEvent | None: |
| 340 | # See: https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation # noqa: E501 |
| 341 | |
| 342 | if not line: |
| 343 | if not self._event and not self._data and not self._last_event_id and self._retry is None: |
| 344 | return None |
| 345 | |
| 346 | sse = ServerSentEvent( |
| 347 | event=self._event, |
| 348 | data="\n".join(self._data), |
| 349 | id=self._last_event_id, |
| 350 | retry=self._retry, |
| 351 | ) |
| 352 | |
| 353 | # NOTE: as per the SSE spec, do not reset last_event_id. |
| 354 | self._event = None |
| 355 | self._data = [] |
| 356 | self._retry = None |
| 357 | |
| 358 | return sse |
| 359 | |
| 360 | if line.startswith(":"): |
| 361 | return None |
| 362 | |
| 363 | fieldname, _, value = line.partition(":") |
| 364 | |
| 365 | if value.startswith(" "): |
| 366 | value = value[1:] |
| 367 | |
| 368 | if fieldname == "event": |
| 369 | self._event = value |
| 370 | elif fieldname == "data": |
| 371 | self._data.append(value) |
| 372 | elif fieldname == "id": |
| 373 | if "\0" in value: |
| 374 | pass |
| 375 | else: |
| 376 | self._last_event_id = value |
| 377 | elif fieldname == "retry": |
| 378 | try: |
| 379 | self._retry = int(value) |
| 380 | except (TypeError, ValueError): |
| 381 | pass |
| 382 | else: |
| 383 | pass # Field is ignored. |
| 384 | |
| 385 | return None |
| 386 | |
| 387 | |
| 388 | @runtime_checkable |