105 lines
2.8 KiB
Nim
Raw Normal View History

## This file contains the base message request type that will be handled.
## The requests are created by the main thread and processed by
## the Waku Thread.
import std/json, results
2024-12-02 10:56:12 -04:00
import chronos, chronos/threadsync
import
2025-06-26 11:27:39 +02:00
../../waku/factory/waku,
../ffi_types,
./requests/node_lifecycle_request,
./requests/peer_manager_request,
./requests/protocols/relay_request,
./requests/protocols/store_request,
./requests/protocols/lightpush_request,
2024-11-29 15:31:08 +01:00
./requests/protocols/filter_request,
./requests/debug_node_request,
2024-10-24 09:07:08 -04:00
./requests/discovery_request,
./requests/ping_request
type RequestType* {.pure.} = enum
LIFECYCLE
PEER_MANAGER
2024-10-24 09:07:08 -04:00
PING
RELAY
STORE
DEBUG
DISCOVERY
LIGHTPUSH
2024-11-29 15:31:08 +01:00
FILTER
2024-12-02 10:56:12 -04:00
type WakuThreadRequest* = object
reqType: RequestType
reqContent: pointer
2024-12-02 10:56:12 -04:00
callback: WakuCallBack
userData: pointer
proc createShared*(
2024-12-02 10:56:12 -04:00
T: type WakuThreadRequest,
reqType: RequestType,
reqContent: pointer,
callback: WakuCallBack,
userData: pointer,
): ptr type T =
var ret = createShared(T)
ret[].reqType = reqType
ret[].reqContent = reqContent
2024-12-02 10:56:12 -04:00
ret[].callback = callback
ret[].userData = userData
return ret
2024-12-02 10:56:12 -04:00
proc handleRes[T: string | void](
res: Result[T, string], request: ptr WakuThreadRequest
) =
## Handles the Result responses, which can either be Result[string, string] or
## Result[void, string].
defer:
deallocShared(request)
2024-12-02 10:56:12 -04:00
if res.isErr():
foreignThreadGc:
let msg = "libwaku error: handleRes fireSyncRes error: " & $res.error
request[].callback(
RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), request[].userData
)
return
2024-12-02 10:56:12 -04:00
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 WakuThreadRequest, request: ptr WakuThreadRequest, waku: ptr Waku
) {.async.} =
let retFut =
case request[].reqType
of LIFECYCLE:
cast[ptr NodeLifecycleRequest](request[].reqContent).process(waku)
of PEER_MANAGER:
cast[ptr PeerManagementRequest](request[].reqContent).process(waku[])
2024-10-24 09:07:08 -04:00
of PING:
cast[ptr PingRequest](request[].reqContent).process(waku)
of RELAY:
cast[ptr RelayRequest](request[].reqContent).process(waku)
of STORE:
cast[ptr StoreRequest](request[].reqContent).process(waku)
of DEBUG:
cast[ptr DebugNodeRequest](request[].reqContent).process(waku[])
of DISCOVERY:
cast[ptr DiscoveryRequest](request[].reqContent).process(waku)
of LIGHTPUSH:
cast[ptr LightpushRequest](request[].reqContent).process(waku)
2024-11-29 15:31:08 +01:00
of FILTER:
cast[ptr FilterRequest](request[].reqContent).process(waku)
2024-12-02 10:56:12 -04:00
handleRes(await retFut, request)
2024-12-02 10:56:12 -04:00
proc `$`*(self: WakuThreadRequest): string =
return $self.reqType