forked from agentclientprotocol/python-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstate.py
More file actions
84 lines (61 loc) · 2.63 KB
/
Copy pathstate.py
File metadata and controls
84 lines (61 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from __future__ import annotations
import asyncio
from dataclasses import dataclass
from typing import Any, Protocol
__all__ = [
"InMemoryMessageStateStore",
"IncomingMessage",
"MessageStateStore",
"OutgoingMessage",
]
@dataclass(slots=True)
class OutgoingMessage:
request_id: int
method: str
future: asyncio.Future[Any]
@dataclass(slots=True)
class IncomingMessage:
method: str
params: Any
status: str = "pending"
result: Any = None
error: Any = None
class MessageStateStore(Protocol):
def register_outgoing(self, request_id: int, method: str) -> asyncio.Future[Any]: ...
def resolve_outgoing(self, request_id: int, result: Any) -> None: ...
def reject_outgoing(self, request_id: int, error: Any) -> None: ...
def reject_all_outgoing(self, error: Any) -> None: ...
def begin_incoming(self, method: str, params: Any) -> IncomingMessage: ...
def complete_incoming(self, record: IncomingMessage, result: Any) -> None: ...
def fail_incoming(self, record: IncomingMessage, error: Any) -> None: ...
class InMemoryMessageStateStore(MessageStateStore):
def __init__(self) -> None:
self._outgoing: dict[int, OutgoingMessage] = {}
self._incoming: list[IncomingMessage] = []
def register_outgoing(self, request_id: int, method: str) -> asyncio.Future[Any]:
future: asyncio.Future[Any] = asyncio.get_running_loop().create_future()
self._outgoing[request_id] = OutgoingMessage(request_id, method, future)
return future
def resolve_outgoing(self, request_id: int, result: Any) -> None:
record = self._outgoing.pop(request_id, None)
if record and not record.future.done():
record.future.set_result(result)
def reject_outgoing(self, request_id: int, error: Any) -> None:
record = self._outgoing.pop(request_id, None)
if record and not record.future.done():
record.future.set_exception(error)
def reject_all_outgoing(self, error: Any) -> None:
for record in self._outgoing.values():
if not record.future.done():
record.future.set_exception(error)
self._outgoing.clear()
def begin_incoming(self, method: str, params: Any) -> IncomingMessage:
record = IncomingMessage(method=method, params=params)
self._incoming.append(record)
return record
def complete_incoming(self, record: IncomingMessage, result: Any) -> None:
record.status = "completed"
record.result = result
def fail_incoming(self, record: IncomingMessage, error: Any) -> None:
record.status = "failed"
record.error = error