33from types import TracebackType
44from typing import TypeVar
55
6+ from http import HTTPStatus
7+ import json
8+
69from .abstract_base_client import AbstractBaseClient
10+ from .errors .server_error import ServerError
711from .event .event import Event
812from .event .event_candidate import EventCandidate
913from .event .event_context import EventContext
@@ -30,7 +34,7 @@ def __init__(
3034 ):
3135 self .__http_client = HttpClient (base_url = base_url , api_token = api_token )
3236
33- async def __aenter__ (self ):
37+ async def __aenter__ (self ) -> "Client" :
3438 await self .__http_client .__aenter__ ()
3539 return self
3640
@@ -53,7 +57,37 @@ def http_client(self) -> HttpClient:
5357 return self .__http_client
5458
5559 async def ping (self ) -> None :
56- return await ping (self )
60+ OK_RESPONSE = "OK"
61+ STATUS_OK = "ok"
62+
63+ SPECVERSION_FIELD = "specversion"
64+ TYPE_FIELD = "type"
65+ PING_RECEIVED_TYPE = "io.eventsourcingdb.api.ping-received"
66+
67+ response = await self .http_client .get ("/api/v1/ping" )
68+ response_body = bytes .decode (await response .body .read (), encoding = "utf-8" )
69+
70+ if response .status_code != HTTPStatus .OK :
71+ raise ServerError (f"Received unexpected response: { response_body } " )
72+
73+ if response_body == OK_RESPONSE :
74+ return
75+
76+ try :
77+ response_json = json .loads (response_body )
78+ except json .JSONDecodeError as exc :
79+ raise ServerError (f"Received unexpected response: { response_body } " ) from exc
80+
81+ if (
82+ isinstance (response_json , dict )
83+ and SPECVERSION_FIELD in response_json
84+ and TYPE_FIELD in response_json
85+ and response_json .get (TYPE_FIELD ) == PING_RECEIVED_TYPE
86+ ):
87+ return
88+
89+ raise ServerError (f"Received unexpected response: { response_body } " )
90+
5791
5892 async def verify_api_token (self ) -> None :
5993 raise NotImplementedError ("verify_api_token is not implemented yet." )
0 commit comments