2023-09-18 09:21:50 +02:00
|
|
|
## 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.
|
|
|
|
|
|
2024-07-09 13:14:28 +02:00
|
|
|
import std/json, results
|
2024-12-02 10:56:12 -04:00
|
|
|
import chronos, chronos/threadsync
|
2023-09-18 09:21:50 +02:00
|
|
|
import
|
2024-05-03 14:07:15 +02:00
|
|
|
../../../waku/factory/waku,
|
2024-12-02 10:56:12 -04:00
|
|
|
../../ffi_types,
|
2023-09-18 09:21:50 +02:00
|
|
|
./requests/node_lifecycle_request,
|
|
|
|
|
./requests/peer_manager_request,
|
2023-12-11 08:49:13 +01:00
|
|
|
./requests/protocols/relay_request,
|
2024-02-21 12:06:05 +01:00
|
|
|
./requests/protocols/store_request,
|
2024-08-29 14:29:02 +02:00
|
|
|
./requests/protocols/lightpush_request,
|
2024-11-29 15:31:08 +01:00
|
|
|
./requests/protocols/filter_request,
|
2024-05-21 18:37:50 +02:00
|
|
|
./requests/debug_node_request,
|
2024-10-24 09:07:08 -04:00
|
|
|
./requests/discovery_request,
|
|
|
|
|
./requests/ping_request
|
2023-09-18 09:21:50 +02:00
|
|
|
|
2024-03-16 00:08:47 +01:00
|
|
|
type RequestType* {.pure.} = enum
|
|
|
|
|
LIFECYCLE
|
|
|
|
|
PEER_MANAGER
|
2024-10-24 09:07:08 -04:00
|
|
|
PING
|
2024-03-16 00:08:47 +01:00
|
|
|
RELAY
|
|
|
|
|
STORE
|
|
|
|
|
DEBUG
|
2024-05-21 18:37:50 +02:00
|
|
|
DISCOVERY
|
2024-08-29 14:29:02 +02:00
|
|
|
LIGHTPUSH
|
2024-11-29 15:31:08 +01:00
|
|
|
FILTER
|
2023-09-18 09:21:50 +02:00
|
|
|
|
2024-12-02 10:56:12 -04:00
|
|
|
type WakuThreadRequest* = object
|
2024-03-16 00:08:47 +01:00
|
|
|
reqType: RequestType
|
|
|
|
|
reqContent: pointer
|
2024-12-02 10:56:12 -04:00
|
|
|
callback: WakuCallBack
|
|
|
|
|
userData: pointer
|
2023-09-18 09:21:50 +02:00
|
|
|
|
2024-03-16 00:08:47 +01:00
|
|
|
proc createShared*(
|
2024-12-02 10:56:12 -04:00
|
|
|
T: type WakuThreadRequest,
|
|
|
|
|
reqType: RequestType,
|
|
|
|
|
reqContent: pointer,
|
|
|
|
|
callback: WakuCallBack,
|
|
|
|
|
userData: pointer,
|
2024-03-16 00:08:47 +01:00
|
|
|
): ptr type T =
|
2023-09-18 09:21:50 +02:00
|
|
|
var ret = createShared(T)
|
|
|
|
|
ret[].reqType = reqType
|
|
|
|
|
ret[].reqContent = reqContent
|
2024-12-02 10:56:12 -04:00
|
|
|
ret[].callback = callback
|
|
|
|
|
ret[].userData = userData
|
2023-09-18 09:21:50 +02:00
|
|
|
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].
|
|
|
|
|
|
2024-03-16 00:08:47 +01:00
|
|
|
defer:
|
|
|
|
|
deallocShared(request)
|
2023-09-18 09:21:50 +02:00
|
|
|
|
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
|
2023-09-18 09:21:50 +02:00
|
|
|
|
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.} =
|
2023-09-18 09:21:50 +02:00
|
|
|
let retFut =
|
|
|
|
|
case request[].reqType
|
2024-03-16 00:08:47 +01:00
|
|
|
of LIFECYCLE:
|
2024-05-03 14:07:15 +02:00
|
|
|
cast[ptr NodeLifecycleRequest](request[].reqContent).process(waku)
|
2024-03-16 00:08:47 +01:00
|
|
|
of PEER_MANAGER:
|
2024-05-03 14:07:15 +02:00
|
|
|
cast[ptr PeerManagementRequest](request[].reqContent).process(waku[])
|
2024-10-24 09:07:08 -04:00
|
|
|
of PING:
|
|
|
|
|
cast[ptr PingRequest](request[].reqContent).process(waku)
|
2024-03-16 00:08:47 +01:00
|
|
|
of RELAY:
|
2024-05-03 14:07:15 +02:00
|
|
|
cast[ptr RelayRequest](request[].reqContent).process(waku)
|
2024-03-16 00:08:47 +01:00
|
|
|
of STORE:
|
2024-05-03 14:07:15 +02:00
|
|
|
cast[ptr StoreRequest](request[].reqContent).process(waku)
|
2024-03-16 00:08:47 +01:00
|
|
|
of DEBUG:
|
2024-05-03 14:07:15 +02:00
|
|
|
cast[ptr DebugNodeRequest](request[].reqContent).process(waku[])
|
2024-05-21 18:37:50 +02:00
|
|
|
of DISCOVERY:
|
|
|
|
|
cast[ptr DiscoveryRequest](request[].reqContent).process(waku)
|
2024-08-29 14:29:02 +02:00
|
|
|
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)
|
2023-09-18 09:21:50 +02:00
|
|
|
|
2024-12-02 10:56:12 -04:00
|
|
|
handleRes(await retFut, request)
|
2023-09-18 09:21:50 +02:00
|
|
|
|
2024-12-02 10:56:12 -04:00
|
|
|
proc `$`*(self: WakuThreadRequest): string =
|
2024-03-16 00:08:47 +01:00
|
|
|
return $self.reqType
|