nwaku/waku/waku_store/common.nim

122 lines
3.0 KiB
Nim

when (NimMajor, NimMinor) < (1, 4):
{.push raises: [Defect].}
else:
{.push raises: [].}
import std/[options], stew/results
import ../waku_core, ../common/paging
const
WakuStoreCodec* = "/vac/waku/store-query/3.0.0"
DefaultPageSize*: uint64 = 20
MaxPageSize*: uint64 = 100
EmptyCursor*: WakuMessageHash = EmptyWakuMessageHash
type WakuStoreResult*[T] = Result[T, string]
## Public API types
type
StoreQueryRequest* = object
requestId*: string
includeData*: bool
pubsubTopic*: Option[PubsubTopic]
contentTopics*: seq[ContentTopic]
startTime*: Option[Timestamp]
endTime*: Option[Timestamp]
messageHashes*: seq[WakuMessageHash]
paginationCursor*: Option[WakuMessageHash]
paginationForward*: PagingDirection
paginationLimit*: Option[uint64]
WakuMessageKeyValue* = object
messageHash*: WakuMessageHash
message*: Option[WakuMessage]
pubsubTopic*: Option[PubsubTopic]
StoreQueryResponse* = object
requestId*: string
statusCode*: uint32
statusDesc*: string
messages*: seq[WakuMessageKeyValue]
paginationCursor*: Option[WakuMessageHash]
StatusCode* {.pure.} = enum
UNKNOWN = uint32(000)
SUCCESS = uint32(200)
BAD_RESPONSE = uint32(300)
BAD_REQUEST = uint32(400)
TOO_MANY_REQUESTS = uint32(429)
SERVICE_UNAVAILABLE = uint32(503)
PEER_DIAL_FAILURE = uint32(504)
ErrorCode* {.pure.} = enum
UNKNOWN = uint32(000)
BAD_RESPONSE = uint32(300)
BAD_REQUEST = uint32(400)
TOO_MANY_REQUESTS = uint32(429)
SERVICE_UNAVAILABLE = uint32(503)
PEER_DIAL_FAILURE = uint32(504)
StoreError* = object
case kind*: ErrorCode
of ErrorCode.PEER_DIAL_FAILURE:
address*: string
of ErrorCode.BAD_RESPONSE, ErrorCode.BAD_REQUEST:
cause*: string
else:
discard
StoreQueryResult* = Result[StoreQueryResponse, StoreError]
proc into*(errCode: ErrorCode): StatusCode =
StatusCode(uint32(errCode))
proc new*(T: type StoreError, code: uint32, desc: string): T =
let kind = ErrorCode.parse(code)
case kind
of ErrorCode.BAD_RESPONSE:
return StoreError(kind: kind, cause: desc)
of ErrorCode.BAD_REQUEST:
return StoreError(kind: kind, cause: desc)
of ErrorCode.TOO_MANY_REQUESTS:
return StoreError(kind: kind)
of ErrorCode.SERVICE_UNAVAILABLE:
return StoreError(kind: kind)
of ErrorCode.PEER_DIAL_FAILURE:
return StoreError(kind: kind, address: desc)
of ErrorCode.UNKNOWN:
return StoreError(kind: kind)
proc parse*(T: type ErrorCode, kind: uint32): T =
case kind
of 000, 300, 400, 429, 503, 504:
ErrorCode(kind)
else:
ErrorCode.UNKNOWN
proc `$`*(err: StoreError): string =
case err.kind
of ErrorCode.PEER_DIAL_FAILURE:
"PEER_DIAL_FAILURE: " & err.address
of ErrorCode.BAD_RESPONSE:
"BAD_RESPONSE: " & err.cause
of ErrorCode.BAD_REQUEST:
"BAD_REQUEST: " & err.cause
of ErrorCode.TOO_MANY_REQUESTS:
"TOO_MANY_REQUESTS"
of ErrorCode.SERVICE_UNAVAILABLE:
"SERVICE_UNAVAILABLE"
of ErrorCode.UNKNOWN:
"UNKNOWN"