| 469 | yield data |
| 470 | |
| 471 | def decode(self, line: str) -> ServerSentEvent | None: |
| 472 | # See: https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation # noqa: E501 |
| 473 | |
| 474 | if not line: |
| 475 | if not self._event and not self._data and not self._last_event_id and self._retry is None: |
| 476 | self._raw = [] |
| 477 | return None |
| 478 | |
| 479 | sse = ServerSentEvent( |
| 480 | event=self._event, |
| 481 | data="\n".join(self._data), |
| 482 | id=self._last_event_id, |
| 483 | retry=self._retry, |
| 484 | raw=self._raw, |
| 485 | ) |
| 486 | |
| 487 | # NOTE: as per the SSE spec, do not reset last_event_id. |
| 488 | self._event = None |
| 489 | self._data = [] |
| 490 | self._retry = None |
| 491 | self._raw = [] |
| 492 | |
| 493 | return sse |
| 494 | |
| 495 | self._raw.append(line) |
| 496 | |
| 497 | if line.startswith(":"): |
| 498 | return None |
| 499 | |
| 500 | fieldname, _, value = line.partition(":") |
| 501 | |
| 502 | if value.startswith(" "): |
| 503 | value = value[1:] |
| 504 | |
| 505 | if fieldname == "event": |
| 506 | self._event = value |
| 507 | elif fieldname == "data": |
| 508 | self._data.append(value) |
| 509 | elif fieldname == "id": |
| 510 | if "\0" in value: |
| 511 | pass |
| 512 | else: |
| 513 | self._last_event_id = value |
| 514 | elif fieldname == "retry": |
| 515 | try: |
| 516 | self._retry = int(value) |
| 517 | except (TypeError, ValueError): |
| 518 | pass |
| 519 | else: |
| 520 | pass # Field is ignored. |
| 521 | |
| 522 | return None |
| 523 | |
| 524 | |
| 525 | @runtime_checkable |