Skip to content

Commit 17d8fc3

Browse files
committed
fix context none in eventstream
1 parent 244541d commit 17d8fc3

2 files changed

Lines changed: 24 additions & 21 deletions

File tree

‎src/a2a/server/cluster/database_event_stream.py‎

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,20 +122,20 @@ async def _seq_at_or_before_version(
122122
session: AsyncSession,
123123
task_id: str,
124124
after: TaskVersion,
125-
owner: str | None,
125+
owner: str,
126126
) -> int:
127127
"""Seq to start polling from so nothing after `after` is missed."""
128128
if after.is_missing:
129129
return 0
130-
conditions = [
131-
self._event_model.task_id == task_id,
132-
self._event_model.task_version <= _as_int(after),
133-
]
134-
if owner is not None:
135-
conditions.append(self._event_model.owner == owner)
136130
stmt = (
137131
select(self._event_model.seq)
138-
.where(and_(*conditions))
132+
.where(
133+
and_(
134+
self._event_model.task_id == task_id,
135+
self._event_model.owner == owner,
136+
self._event_model.task_version <= _as_int(after),
137+
)
138+
)
139139
.order_by(self._event_model.seq.desc())
140140
.limit(1)
141141
)
@@ -151,7 +151,9 @@ async def subscribe( # type: ignore[override]
151151
) -> AsyncGenerator[VersionedEvent, None]:
152152
"""Polls the log for events of `task_id` newer than `after`."""
153153
await self._ensure_initialized()
154-
owner = self.owner_resolver(context) if context is not None else None
154+
if context is None:
155+
context = ServerCallContext()
156+
owner = self.owner_resolver(context)
155157
async with self._session_maker() as session:
156158
cursor = await self._seq_at_or_before_version(
157159
session, task_id, after, owner
@@ -160,19 +162,19 @@ async def subscribe( # type: ignore[override]
160162
while True:
161163
try:
162164
async with self._session_maker() as session:
163-
conditions = [
164-
self._event_model.task_id == task_id,
165-
self._event_model.seq > cursor,
166-
]
167-
if owner is not None:
168-
conditions.append(self._event_model.owner == owner)
169165
stmt = (
170166
select(
171167
self._event_model.seq,
172168
self._event_model.task_version,
173169
self._event_model.event_data,
174170
)
175-
.where(and_(*conditions))
171+
.where(
172+
and_(
173+
self._event_model.task_id == task_id,
174+
self._event_model.owner == owner,
175+
self._event_model.seq > cursor,
176+
)
177+
)
176178
.order_by(self._event_model.seq.asc())
177179
)
178180
rows = (await session.execute(stmt)).all()

‎tests/server/cluster/test_database_event_stream.py‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ async def test_owner_context_succeeds_on_all_methods(db_url: str) -> None:
362362
@pytest.mark.asyncio
363363
@pytest.mark.timeout(10)
364364
async def test_other_owner_context_does_not_receive_events(db_url: str) -> None:
365-
"""A different owner does not see events belonging to another owner."""
365+
"""A different owner (or no context) does not see events belonging to another owner."""
366366
task_id = 'task-other-owner'
367367
store_engine = create_async_engine(db_url)
368368
stream_engine = create_async_engine(db_url)
@@ -394,10 +394,11 @@ async def test_other_owner_context_does_not_receive_events(db_url: str) -> None:
394394
)
395395
other = ServerCallContext(user=SampleUser('someone_else'))
396396

397-
agen = stream.subscribe(task_id, after=v1, context=other)
398-
with pytest.raises(asyncio.TimeoutError):
399-
await asyncio.wait_for(agen.__anext__(), timeout=0.15)
400-
await agen.aclose()
397+
for ctx in (other, None):
398+
agen = stream.subscribe(task_id, after=v1, context=ctx)
399+
with pytest.raises(asyncio.TimeoutError):
400+
await asyncio.wait_for(agen.__anext__(), timeout=0.15)
401+
await agen.aclose()
401402
finally:
402403
await store_engine.dispose()
403404
await stream_engine.dispose()

0 commit comments

Comments
 (0)