1111
1212from reactivestreams .publisher import Publisher
1313from reactivestreams .subscriber import Subscriber
14+ from rsocket .async_helpers import async_range
1415from rsocket .helpers import DefaultPublisherSubscription
1516from rsocket .logger import logger
1617from rsocket .reactivex .subscriber_adapter import SubscriberAdapter
@@ -66,8 +67,12 @@ async def _aio_next():
6667
6768 try :
6869 while True :
69- next_n = await request_n_queue .get ()
70- for i in range (next_n ):
70+ try :
71+ next_n = await request_n_queue .get ()
72+ except RuntimeError :
73+ return
74+
75+ async for i in async_range (next_n ):
7176 try :
7277 value = await iterator .__anext__ ()
7378 observer .on_next (value )
@@ -100,15 +105,23 @@ def cancel_sender():
100105async def observable_to_async_event_generator (observable : Observable ) -> AsyncGenerator [Notification , None ]:
101106 queue = asyncio .Queue ()
102107
108+ completed = object ()
109+
103110 def on_next (i ):
104111 queue .put_nowait (i )
105112
106113 observable .pipe (materialize ()).subscribe (
107- on_next = on_next
114+ on_next = on_next ,
115+ on_completed = lambda : queue .put_nowait (completed )
108116 )
109117
110118 while True :
111119 value = await queue .get ()
120+
121+ if value is completed :
122+ queue .task_done ()
123+ return
124+
112125 yield value
113126 queue .task_done ()
114127
@@ -128,7 +141,7 @@ async def _aio_next():
128141 try :
129142 while True :
130143 next_n = await request_n_queue .get ()
131- for i in range (next_n ):
144+ async for i in async_range (next_n ):
132145 event = await iterator .__anext__ ()
133146
134147 if isinstance (event , OnNext ):
0 commit comments