79 lines
2.1 KiB
Nim

## This file contains the base message request type that will be handled.
## The requests are created by the main thread and processed by
## the SDS Thread.
import std/json, results
import chronos, chronos/threadsync
import
../../ffi_types,
./requests/[sds_lifecycle_request, sds_message_request, sds_dependencies_request],
../../../src/[reliability_utils]
type RequestType* {.pure.} = enum
LIFECYCLE
MESSAGE
DEPENDENCIES
type SdsThreadRequest* = object
reqType: RequestType
reqContent: pointer
callback: SdsCallBack
userData: pointer
proc createShared*(
T: type SdsThreadRequest,
reqType: RequestType,
reqContent: pointer,
callback: SdsCallBack,
userData: pointer,
): ptr type T =
var ret = createShared(T)
ret[].reqType = reqType
ret[].reqContent = reqContent
ret[].callback = callback
ret[].userData = userData
return ret
proc handleRes[T: string | void](
res: Result[T, string], request: ptr SdsThreadRequest
) =
## Handles the Result responses, which can either be Result[string, string] or
## Result[void, string].
defer:
deallocShared(request)
if res.isErr():
foreignThreadGc:
let msg = "libsds error: handleRes fireSyncRes error: " & $res.error
request[].callback(
RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), request[].userData
)
return
foreignThreadGc:
var msg: cstring = ""
when T is string:
msg = res.get().cstring()
request[].callback(
RET_OK, unsafeAddr msg[0], cast[csize_t](len(msg)), request[].userData
)
return
proc process*(
T: type SdsThreadRequest, request: ptr SdsThreadRequest, rm: ptr ReliabilityManager
) {.async.} =
let retFut =
case request[].reqType
of LIFECYCLE:
cast[ptr SdsLifecycleRequest](request[].reqContent).process(rm)
of MESSAGE:
cast[ptr SdsMessageRequest](request[].reqContent).process(rm)
of DEPENDENCIES:
cast[ptr SdsDependenciesRequest](request[].reqContent).process(rm)
handleRes(await retFut, request)
proc `$`*(self: SdsThreadRequest): string =
return $self.reqType