Skip to content

Commit 124f713

Browse files
stainless-app[bot]stainless-bot
authored andcommitted
feat: OpenAPI spec update via Stainless API (#74)
1 parent 1ee44ae commit 124f713

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

src/cloudflare/_base_client.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
RAW_RESPONSE_HEADER,
8080
OVERRIDE_CAST_TO_HEADER,
8181
)
82-
from ._streaming import Stream, AsyncStream
82+
from ._streaming import Stream, SSEDecoder, AsyncStream, SSEBytesDecoder
8383
from ._exceptions import (
8484
APIStatusError,
8585
APITimeoutError,
@@ -430,6 +430,9 @@ def _prepare_url(self, url: str) -> URL:
430430

431431
return merge_url
432432

433+
def _make_sse_decoder(self) -> SSEDecoder | SSEBytesDecoder:
434+
return SSEDecoder()
435+
433436
def _build_request(
434437
self,
435438
options: FinalRequestOptions,

src/cloudflare/_streaming.py

+28-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import inspect
66
from types import TracebackType
77
from typing import TYPE_CHECKING, Any, Generic, TypeVar, Iterator, AsyncIterator, cast
8-
from typing_extensions import Self, TypeGuard, override, get_origin
8+
from typing_extensions import Self, Protocol, TypeGuard, override, get_origin, runtime_checkable
99

1010
import httpx
1111

@@ -23,6 +23,8 @@ class Stream(Generic[_T]):
2323

2424
response: httpx.Response
2525

26+
_decoder: SSEDecoder | SSEBytesDecoder
27+
2628
def __init__(
2729
self,
2830
*,
@@ -33,7 +35,7 @@ def __init__(
3335
self.response = response
3436
self._cast_to = cast_to
3537
self._client = client
36-
self._decoder = SSEDecoder()
38+
self._decoder = client._make_sse_decoder()
3739
self._iterator = self.__stream__()
3840

3941
def __next__(self) -> _T:
@@ -44,7 +46,10 @@ def __iter__(self) -> Iterator[_T]:
4446
yield item
4547

4648
def _iter_events(self) -> Iterator[ServerSentEvent]:
47-
yield from self._decoder.iter(self.response.iter_lines())
49+
if isinstance(self._decoder, SSEBytesDecoder):
50+
yield from self._decoder.iter_bytes(self.response.iter_bytes())
51+
else:
52+
yield from self._decoder.iter(self.response.iter_lines())
4853

4954
def __stream__(self) -> Iterator[_T]:
5055
cast_to = cast(Any, self._cast_to)
@@ -84,6 +89,8 @@ class AsyncStream(Generic[_T]):
8489

8590
response: httpx.Response
8691

92+
_decoder: SSEDecoder | SSEBytesDecoder
93+
8794
def __init__(
8895
self,
8996
*,
@@ -94,7 +101,7 @@ def __init__(
94101
self.response = response
95102
self._cast_to = cast_to
96103
self._client = client
97-
self._decoder = SSEDecoder()
104+
self._decoder = client._make_sse_decoder()
98105
self._iterator = self.__stream__()
99106

100107
async def __anext__(self) -> _T:
@@ -105,8 +112,12 @@ async def __aiter__(self) -> AsyncIterator[_T]:
105112
yield item
106113

107114
async def _iter_events(self) -> AsyncIterator[ServerSentEvent]:
108-
async for sse in self._decoder.aiter(self.response.aiter_lines()):
109-
yield sse
115+
if isinstance(self._decoder, SSEBytesDecoder):
116+
async for sse in self._decoder.aiter_bytes(self.response.aiter_bytes()):
117+
yield sse
118+
else:
119+
async for sse in self._decoder.aiter(self.response.aiter_lines()):
120+
yield sse
110121

111122
async def __stream__(self) -> AsyncIterator[_T]:
112123
cast_to = cast(Any, self._cast_to)
@@ -259,6 +270,17 @@ def decode(self, line: str) -> ServerSentEvent | None:
259270
return None
260271

261272

273+
@runtime_checkable
274+
class SSEBytesDecoder(Protocol):
275+
def iter_bytes(self, iterator: Iterator[bytes]) -> Iterator[ServerSentEvent]:
276+
"""Given an iterator that yields raw binary data, iterate over it & yield every event encountered"""
277+
...
278+
279+
def aiter_bytes(self, iterator: AsyncIterator[bytes]) -> AsyncIterator[ServerSentEvent]:
280+
"""Given an async iterator that yields raw binary data, iterate over it & yield every event encountered"""
281+
...
282+
283+
262284
def is_stream_class_type(typ: type) -> TypeGuard[type[Stream[object]] | type[AsyncStream[object]]]:
263285
"""TypeGuard for determining whether or not the given type is a subclass of `Stream` / `AsyncStream`"""
264286
origin = get_origin(typ) or typ

0 commit comments

Comments
 (0)