1+ {.push raises : [Defect ].}
2+
3+ import
4+ stew/ byteutils,
5+ chronicles,
6+ json_serialization,
7+ json_serialization/ std/ options,
8+ presto/ [route, client]
9+ import " ." / [serdes, utils],
10+ ../ wakunode2
11+
12+ logScope: topics = " rest_api_debug"
13+
14+
15+ # ### Types
16+
17+ type
18+ DebugWakuInfo * = object
19+ listenAddresses* : seq [string ]
20+ enrUri* : Option [string ]
21+
22+
23+ # ### Serialization and deserialization
24+
25+ proc writeValue * (writer: var JsonWriter [RestJson ], value: DebugWakuInfo )
26+ {.raises : [IOError , Defect ].} =
27+ writer.beginRecord ()
28+ writer.writeField (" listenAddresses" , value.listenAddresses)
29+ if value.enrUri.isSome:
30+ writer.writeField (" enrUri" , value.enrUri)
31+ writer.endRecord ()
32+
33+ proc readValue * (reader: var JsonReader [RestJson ], value: var DebugWakuInfo )
34+ {.raises : [SerializationError , IOError , Defect ].} =
35+ var
36+ listenAddresses: Option [seq [string ]]
37+ enrUri: Option [string ]
38+
39+ for fieldName in readObjectFields (reader):
40+ case fieldName
41+ of " listenAddresses" :
42+ if listenAddresses.isSome ():
43+ reader.raiseUnexpectedField (" Multiple `listenAddresses` fields found" , " DebugWakuInfo" )
44+ listenAddresses = some (reader.readValue (seq [string ]))
45+ of " enrUri" :
46+ if enrUri.isSome ():
47+ reader.raiseUnexpectedField (" Multiple `enrUri` fields found" , " DebugWakuInfo" )
48+ enrUri = some (reader.readValue (string ))
49+ else :
50+ unrecognizedFieldWarning ()
51+
52+ if listenAddresses.isNone ():
53+ reader.raiseUnexpectedValue (" Field `listenAddresses` is missing" )
54+
55+ value = DebugWakuInfo (
56+ listenAddresses: listenAddresses.get,
57+ enrUri: enrUri
58+ )
59+
60+
61+ # ### Server request handlers
62+
63+ proc toDebugWakuInfo (nodeInfo: WakuInfo ): DebugWakuInfo =
64+ DebugWakuInfo (
65+ listenAddresses: nodeInfo.listenAddresses,
66+ enrUri: some (nodeInfo.enrUri)
67+ )
68+
69+ const ROUTE_DEBUG_INFOV1 * = " /debug/v1/info"
70+
71+ proc installDebugInfoV1Handler (router: var RestRouter , node: WakuNode ) =
72+ router.api (MethodGet , ROUTE_DEBUG_INFOV1 ) do () -> RestApiResponse :
73+ let info = node.info ().toDebugWakuInfo ()
74+ let resp = RestApiResponse .jsonResponse (info, status= Http200 )
75+ if resp.isErr ():
76+ debug " An error ocurred while building the json respose" , error= resp.error ()
77+ return RestApiResponse .internalServerError ()
78+
79+ return resp.get ()
80+
81+ proc installDebugApiHandlers * (router: var RestRouter , node: WakuNode ) =
82+ installDebugInfoV1Handler (router, node)
83+
84+
85+ # ### Client
86+
87+ proc decodeBytes * (t: typedesc [DebugWakuInfo ], data: openArray [byte ], contentType: string ): RestResult [DebugWakuInfo ] =
88+ if MediaType .init (contentType) != MIMETYPE_JSON :
89+ error " Unsupported respose contentType value" , contentType = contentType
90+ return err (" Unsupported response contentType" )
91+
92+ let decoded = ? decodeFromJsonBytes (DebugWakuInfo , data)
93+ return ok (decoded)
94+
95+ # TODO : Check how we can use a constant to set the method endpoint (improve "rest" pragma under nim-presto)
96+ proc debugInfoV1 * (): DebugWakuInfo {.rest , endpoint : " /debug/v1/info" , meth : HttpMethod .MethodGet .}
0 commit comments