From dd90ea0dd67ce37101c359238c7128f0bf77e1b2 Mon Sep 17 00:00:00 2001 From: Ivan Folgueira Bande Date: Wed, 20 Aug 2025 13:35:10 +0200 Subject: [PATCH] more temporary changes --- .gitmodules | 5 + library/alloc.nim | 42 - library/ffi_types.nim | 30 - library/libwaku.nim | 1497 ++++++++--------- library/waku_context.nim | 61 +- .../requests/discovery_request.nim | 5 +- .../requests/node_lifecycle_request.nim | 6 +- .../requests/peer_manager_request.nim | 23 +- .../requests/ping_request.nim | 4 +- .../requests/protocols/filter_request.nim | 5 +- .../requests/protocols/lightpush_request.nim | 5 +- .../requests/protocols/relay_request.nim | 3 +- .../requests/protocols/store_request.nim | 3 +- .../waku_thread_request.nim | 9 +- vendor/nim-ffi | 1 + waku.nimble | 1 + 16 files changed, 775 insertions(+), 925 deletions(-) delete mode 100644 library/alloc.nim delete mode 100644 library/ffi_types.nim create mode 160000 vendor/nim-ffi diff --git a/.gitmodules b/.gitmodules index 93a3a006f..090cac77c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -184,3 +184,8 @@ url = https://github.com/logos-messaging/waku-rlnv2-contract.git ignore = untracked branch = master +[submodule "vendor/nim-ffi"] + path = vendor/nim-ffi + url = https://github.com/waku-org/nim-ffi/ + ignore = untracked + branch = main diff --git a/library/alloc.nim b/library/alloc.nim deleted file mode 100644 index 1a6f118b5..000000000 --- a/library/alloc.nim +++ /dev/null @@ -1,42 +0,0 @@ -## Can be shared safely between threads -type SharedSeq*[T] = tuple[data: ptr UncheckedArray[T], len: int] - -proc alloc*(str: cstring): cstring = - # Byte allocation from the given address. - # There should be the corresponding manual deallocation with deallocShared ! - if str.isNil(): - var ret = cast[cstring](allocShared(1)) # Allocate memory for the null terminator - ret[0] = '\0' # Set the null terminator - return ret - - let ret = cast[cstring](allocShared(len(str) + 1)) - copyMem(ret, str, len(str) + 1) - return ret - -proc alloc*(str: string): cstring = - ## Byte allocation from the given address. - ## There should be the corresponding manual deallocation with deallocShared ! - var ret = cast[cstring](allocShared(str.len + 1)) - let s = cast[seq[char]](str) - for i in 0 ..< str.len: - ret[i] = s[i] - ret[str.len] = '\0' - return ret - -proc allocSharedSeq*[T](s: seq[T]): SharedSeq[T] = - let data = allocShared(sizeof(T) * s.len) - if s.len != 0: - copyMem(data, unsafeAddr s[0], s.len) - return (cast[ptr UncheckedArray[T]](data), s.len) - -proc deallocSharedSeq*[T](s: var SharedSeq[T]) = - deallocShared(s.data) - s.len = 0 - -proc toSeq*[T](s: SharedSeq[T]): seq[T] = - ## Creates a seq[T] from a SharedSeq[T]. No explicit dealloc is required - ## as req[T] is a GC managed type. - var ret = newSeq[T]() - for i in 0 ..< s.len: - ret.add(s.data[i]) - return ret diff --git a/library/ffi_types.nim b/library/ffi_types.nim deleted file mode 100644 index a5eeb9711..000000000 --- a/library/ffi_types.nim +++ /dev/null @@ -1,30 +0,0 @@ -################################################################################ -### Exported types - -type WakuCallBack* = proc( - callerRet: cint, msg: ptr cchar, len: csize_t, userData: pointer -) {.cdecl, gcsafe, raises: [].} - -const RET_OK*: cint = 0 -const RET_ERR*: cint = 1 -const RET_MISSING_CALLBACK*: cint = 2 - -### End of exported types -################################################################################ - -################################################################################ -### FFI utils - -template foreignThreadGc*(body: untyped) = - when declared(setupForeignThreadGc): - setupForeignThreadGc() - - body - - when declared(tearDownForeignThreadGc): - tearDownForeignThreadGc() - -type onDone* = proc() - -### End of FFI utils -################################################################################ diff --git a/library/libwaku.nim b/library/libwaku.nim index ad3afa134..100eeb6a1 100644 --- a/library/libwaku.nim +++ b/library/libwaku.nim @@ -5,9 +5,10 @@ when defined(linux): {.passl: "-Wl,-soname,libwaku.so".} -import std/[json, atomics, strformat, options, atomics] -import chronicles, chronos, chronos/threadsync +import std/[json, atomics, strformat, options, atomics, macros] +import chronicles, chronos, chronos/threadsync, ffi import + waku/factory/waku, waku/common/base64, waku/waku_core/message/message, waku/node/waku_node, @@ -16,8 +17,8 @@ import waku/waku_core/subscription/push_handler, waku/waku_relay, ./events/json_message_event, - ./waku_context, ./waku_thread_requests/requests/node_lifecycle_request, + ./waku_thread_requests/requests/create_node_request, ./waku_thread_requests/requests/peer_manager_request, ./waku_thread_requests/requests/protocols/relay_request, ./waku_thread_requests/requests/protocols/store_request, @@ -27,8 +28,6 @@ import ./waku_thread_requests/requests/discovery_request, ./waku_thread_requests/requests/ping_request, ./waku_thread_requests/waku_thread_request, - ./alloc, - ./ffi_types, ../waku/factory/app_callbacks ################################################################################ @@ -38,8 +37,11 @@ import ################################################################################ ### Not-exported components +expandMacros: + declareLibrary("waku") + template checkLibwakuParams*( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer + ctx: ptr FFIContext, callback: FFICallBack, userData: pointer ) = if not isNil(ctx): ctx[].userData = userData @@ -47,61 +49,22 @@ template checkLibwakuParams*( if isNil(callback): return RET_MISSING_CALLBACK -proc handleRequest( - ctx: ptr WakuContext, - requestType: RequestType, - content: pointer, - callback: WakuCallBack, - userData: pointer, -): cint = - waku_context.sendRequestToWakuThread(ctx, requestType, content, callback, userData).isOkOr: - let msg = "libwaku error: " & $error - callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) - return RET_ERR +# proc handleRequest(ctx: ptr FFIContext, ffiRequest: ptr FFIThreadRequest): cint = +# ffi_context.sendRequestToFFIThread(ctx, ffiRequest).isOkOr: +# let msg = "libwaku error: " & $error +# callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) +# return RET_ERR - return RET_OK +# return RET_OK ### End of not-exported components ################################################################################ -################################################################################ -### Library setup - -# Every Nim library must have this function called - the name is derived from -# the `--nimMainPrefix` command line option -proc libwakuNimMain() {.importc.} - -# To control when the library has been initialized -var initialized: Atomic[bool] - -if defined(android): - # Redirect chronicles to Android System logs - when compiles(defaultChroniclesStream.outputs[0].writer): - defaultChroniclesStream.outputs[0].writer = proc( - logLevel: LogLevel, msg: LogOutputStr - ) {.raises: [].} = - echo logLevel, msg - -proc initializeLibrary() {.exported.} = - if not initialized.exchange(true): - ## Every Nim library needs to call `NimMain` once exactly, to initialize the Nim runtime. - ## Being `` the value given in the optional compilation flag --nimMainPrefix:yourprefix - libwakuNimMain() - when declared(setupForeignThreadGc): - setupForeignThreadGc() - when declared(nimGC_setStackBottom): - var locals {.volatile, noinit.}: pointer - locals = addr(locals) - nimGC_setStackBottom(locals) - -### End of library setup -################################################################################ - ################################################################################ ### Exported procs proc waku_new( - configJson: cstring, callback: WakuCallback, userData: pointer + callback: FFICallback, userData: pointer, configJson: cstring ): pointer {.dynlib, exportc, cdecl.} = initializeLibrary() @@ -111,7 +74,7 @@ proc waku_new( return nil ## Create the Waku thread that will keep waiting for req from the main thread. - var ctx = waku_context.createWakuContext().valueOr: + var ctx = ffi_context.createFFIContext(Waku).valueOr: let msg = "Error in createWakuContext: " & $error callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) return nil @@ -119,735 +82,711 @@ proc waku_new( ctx.userData = userData let appCallbacks = AppCallbacks( - relayHandler: onReceivedMessage(ctx), - topicHealthChangeHandler: onTopicHealthChange(ctx), - connectionChangeHandler: onConnectionChange(ctx), + # relayHandler: onReceivedMessage(ctx), + # topicHealthChangeHandler: onTopicHealthChange(ctx), + # connectionChangeHandler: onConnectionChange(ctx), ) - let retCode = handleRequest( - ctx, - RequestType.LIFECYCLE, - NodeLifecycleRequest.createShared( - NodeLifecycleMsgType.CREATE_NODE, configJson, appCallbacks - ), - callback, - userData, - ) - - if retCode == RET_ERR: + ffi_context.sendRequestToFFIThread( + ctx, CreateNodeRequest.ffiNewReq(callback, userData, configJson, appCallbacks) + ).isOkOr: + let msg = "error in sendRequestToFFIThread: " & $error + callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) return nil return ctx -proc waku_destroy( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - waku_context.destroyWakuContext(ctx).isOkOr: - let msg = "libwaku error: " & $error - callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) - return RET_ERR - - ## always need to invoke the callback although we don't retrieve value to the caller - callback(RET_OK, nil, 0, userData) - - return RET_OK - -proc waku_version( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - callback( - RET_OK, - cast[ptr cchar](WakuNodeVersionString), - cast[csize_t](len(WakuNodeVersionString)), - userData, - ) - - return RET_OK - -proc waku_set_event_callback( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -) {.dynlib, exportc.} = - initializeLibrary() - ctx[].eventCallback = cast[pointer](callback) - ctx[].eventUserData = userData - -proc waku_content_topic( - ctx: ptr WakuContext, - appName: cstring, - appVersion: cuint, - contentTopicName: cstring, - encoding: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - # https://rfc.vac.dev/spec/36/#extern-char-waku_content_topicchar-applicationname-unsigned-int-applicationversion-char-contenttopicname-char-encoding - - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - let contentTopic = fmt"/{$appName}/{$appVersion}/{$contentTopicName}/{$encoding}" - callback( - RET_OK, unsafeAddr contentTopic[0], cast[csize_t](len(contentTopic)), userData - ) - - return RET_OK - -proc waku_pubsub_topic( - ctx: ptr WakuContext, topicName: cstring, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc, cdecl.} = - # https://rfc.vac.dev/spec/36/#extern-char-waku_pubsub_topicchar-name-char-encoding - - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - let outPubsubTopic = fmt"/waku/2/{$topicName}" - callback( - RET_OK, unsafeAddr outPubsubTopic[0], cast[csize_t](len(outPubsubTopic)), userData - ) - - return RET_OK - -proc waku_default_pubsub_topic( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - # https://rfc.vac.dev/spec/36/#extern-char-waku_default_pubsub_topic - - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - callback( - RET_OK, - cast[ptr cchar](DefaultPubsubTopic), - cast[csize_t](len(DefaultPubsubTopic)), - userData, - ) - - return RET_OK - -proc waku_relay_publish( - ctx: ptr WakuContext, - pubSubTopic: cstring, - jsonWakuMessage: cstring, - timeoutMs: cuint, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc, cdecl.} = - # https://rfc.vac.dev/spec/36/#extern-char-waku_relay_publishchar-messagejson-char-pubsubtopic-int-timeoutms - - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - var jsonMessage: JsonMessage - try: - let jsonContent = parseJson($jsonWakuMessage) - jsonMessage = JsonMessage.fromJsonNode(jsonContent).valueOr: - raise newException(JsonParsingError, $error) - except JsonParsingError: - let msg = fmt"Error parsing json message: {getCurrentExceptionMsg()}" - callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) - return RET_ERR - - let wakuMessage = jsonMessage.toWakuMessage().valueOr: - let msg = "Problem building the WakuMessage: " & $error - callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) - return RET_ERR - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared(RelayMsgType.PUBLISH, pubSubTopic, nil, wakuMessage), - callback, - userData, - ) - -proc waku_start( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - handleRequest( - ctx, - RequestType.LIFECYCLE, - NodeLifecycleRequest.createShared(NodeLifecycleMsgType.START_NODE), - callback, - userData, - ) - -proc waku_stop( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - handleRequest( - ctx, - RequestType.LIFECYCLE, - NodeLifecycleRequest.createShared(NodeLifecycleMsgType.STOP_NODE), - callback, - userData, - ) - -proc waku_relay_subscribe( - ctx: ptr WakuContext, - pubSubTopic: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - var cb = onReceivedMessage(ctx) - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared(RelayMsgType.SUBSCRIBE, pubSubTopic, WakuRelayHandler(cb)), - callback, - userData, - ) - -proc waku_relay_add_protected_shard( - ctx: ptr WakuContext, - clusterId: cint, - shardId: cint, - publicKey: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc, cdecl.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared( - RelayMsgType.ADD_PROTECTED_SHARD, - clusterId = clusterId, - shardId = shardId, - publicKey = publicKey, - ), - callback, - userData, - ) - -proc waku_relay_unsubscribe( - ctx: ptr WakuContext, - pubSubTopic: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared( - RelayMsgType.UNSUBSCRIBE, pubSubTopic, WakuRelayHandler(onReceivedMessage(ctx)) - ), - callback, - userData, - ) - -proc waku_relay_get_num_connected_peers( - ctx: ptr WakuContext, - pubSubTopic: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared(RelayMsgType.NUM_CONNECTED_PEERS, pubSubTopic), - callback, - userData, - ) - -proc waku_relay_get_connected_peers( - ctx: ptr WakuContext, - pubSubTopic: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared(RelayMsgType.LIST_CONNECTED_PEERS, pubSubTopic), - callback, - userData, - ) - -proc waku_relay_get_num_peers_in_mesh( - ctx: ptr WakuContext, - pubSubTopic: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared(RelayMsgType.NUM_MESH_PEERS, pubSubTopic), - callback, - userData, - ) - -proc waku_relay_get_peers_in_mesh( - ctx: ptr WakuContext, - pubSubTopic: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.RELAY, - RelayRequest.createShared(RelayMsgType.LIST_MESH_PEERS, pubSubTopic), - callback, - userData, - ) - -proc waku_filter_subscribe( - ctx: ptr WakuContext, - pubSubTopic: cstring, - contentTopics: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.FILTER, - FilterRequest.createShared( - FilterMsgType.SUBSCRIBE, - pubSubTopic, - contentTopics, - FilterPushHandler(onReceivedMessage(ctx)), - ), - callback, - userData, - ) - -proc waku_filter_unsubscribe( - ctx: ptr WakuContext, - pubSubTopic: cstring, - contentTopics: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.FILTER, - FilterRequest.createShared(FilterMsgType.UNSUBSCRIBE, pubSubTopic, contentTopics), - callback, - userData, - ) - -proc waku_filter_unsubscribe_all( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.FILTER, - FilterRequest.createShared(FilterMsgType.UNSUBSCRIBE_ALL), - callback, - userData, - ) - -proc waku_lightpush_publish( - ctx: ptr WakuContext, - pubSubTopic: cstring, - jsonWakuMessage: cstring, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc, cdecl.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - var jsonMessage: JsonMessage - try: - let jsonContent = parseJson($jsonWakuMessage) - jsonMessage = JsonMessage.fromJsonNode(jsonContent).valueOr: - raise newException(JsonParsingError, $error) - except JsonParsingError: - let msg = fmt"Error parsing json message: {getCurrentExceptionMsg()}" - callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) - return RET_ERR - - let wakuMessage = jsonMessage.toWakuMessage().valueOr: - let msg = "Problem building the WakuMessage: " & $error - callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) - return RET_ERR - - handleRequest( - ctx, - RequestType.LIGHTPUSH, - LightpushRequest.createShared(LightpushMsgType.PUBLISH, pubSubTopic, wakuMessage), - callback, - userData, - ) - -proc waku_connect( - ctx: ptr WakuContext, - peerMultiAddr: cstring, - timeoutMs: cuint, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared( - PeerManagementMsgType.CONNECT_TO, $peerMultiAddr, chronos.milliseconds(timeoutMs) - ), - callback, - userData, - ) - -proc waku_disconnect_peer_by_id( - ctx: ptr WakuContext, peerId: cstring, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared( - op = PeerManagementMsgType.DISCONNECT_PEER_BY_ID, peerId = $peerId - ), - callback, - userData, - ) - -proc waku_disconnect_all_peers( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared(op = PeerManagementMsgType.DISCONNECT_ALL_PEERS), - callback, - userData, - ) - -proc waku_dial_peer( - ctx: ptr WakuContext, - peerMultiAddr: cstring, - protocol: cstring, - timeoutMs: cuint, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared( - op = PeerManagementMsgType.DIAL_PEER, - peerMultiAddr = $peerMultiAddr, - protocol = $protocol, - ), - callback, - userData, - ) - -proc waku_dial_peer_by_id( - ctx: ptr WakuContext, - peerId: cstring, - protocol: cstring, - timeoutMs: cuint, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared( - op = PeerManagementMsgType.DIAL_PEER_BY_ID, peerId = $peerId, protocol = $protocol - ), - callback, - userData, - ) - -proc waku_get_peerids_from_peerstore( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared(PeerManagementMsgType.GET_ALL_PEER_IDS), - callback, - userData, - ) - -proc waku_get_connected_peers_info( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared(PeerManagementMsgType.GET_CONNECTED_PEERS_INFO), - callback, - userData, - ) - -proc waku_get_connected_peers( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared(PeerManagementMsgType.GET_CONNECTED_PEERS), - callback, - userData, - ) - -proc waku_get_peerids_by_protocol( - ctx: ptr WakuContext, protocol: cstring, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PEER_MANAGER, - PeerManagementRequest.createShared( - op = PeerManagementMsgType.GET_PEER_IDS_BY_PROTOCOL, protocol = $protocol - ), - callback, - userData, - ) - -proc waku_store_query( - ctx: ptr WakuContext, - jsonQuery: cstring, - peerAddr: cstring, - timeoutMs: cint, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.STORE, - StoreRequest.createShared(StoreReqType.REMOTE_QUERY, jsonQuery, peerAddr, timeoutMs), - callback, - userData, - ) - -proc waku_listen_addresses( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DEBUG, - DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_LISTENING_ADDRESSES), - callback, - userData, - ) - -proc waku_dns_discovery( - ctx: ptr WakuContext, - entTreeUrl: cstring, - nameDnsServer: cstring, - timeoutMs: cint, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DISCOVERY, - DiscoveryRequest.createRetrieveBootstrapNodesRequest( - DiscoveryMsgType.GET_BOOTSTRAP_NODES, entTreeUrl, nameDnsServer, timeoutMs - ), - callback, - userData, - ) - -proc waku_discv5_update_bootnodes( - ctx: ptr WakuContext, bootnodes: cstring, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - ## Updates the bootnode list used for discovering new peers via DiscoveryV5 - ## bootnodes - JSON array containing the bootnode ENRs i.e. `["enr:...", "enr:..."]` - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DISCOVERY, - DiscoveryRequest.createUpdateBootstrapNodesRequest( - DiscoveryMsgType.UPDATE_DISCV5_BOOTSTRAP_NODES, bootnodes - ), - callback, - userData, - ) - -proc waku_get_my_enr( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DEBUG, - DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_MY_ENR), - callback, - userData, - ) - -proc waku_get_my_peerid( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DEBUG, - DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_MY_PEER_ID), - callback, - userData, - ) - -proc waku_get_metrics( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DEBUG, - DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_METRICS), - callback, - userData, - ) - -proc waku_start_discv5( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DISCOVERY, - DiscoveryRequest.createDiscV5StartRequest(), - callback, - userData, - ) - -proc waku_stop_discv5( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DISCOVERY, - DiscoveryRequest.createDiscV5StopRequest(), - callback, - userData, - ) - -proc waku_peer_exchange_request( - ctx: ptr WakuContext, numPeers: uint64, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DISCOVERY, - DiscoveryRequest.createPeerExchangeRequest(numPeers), - callback, - userData, - ) - -proc waku_ping_peer( - ctx: ptr WakuContext, - peerAddr: cstring, - timeoutMs: cuint, - callback: WakuCallBack, - userData: pointer, -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.PING, - PingRequest.createShared(peerAddr, chronos.milliseconds(timeoutMs)), - callback, - userData, - ) - -proc waku_is_online( - ctx: ptr WakuContext, callback: WakuCallBack, userData: pointer -): cint {.dynlib, exportc.} = - initializeLibrary() - checkLibwakuParams(ctx, callback, userData) - - handleRequest( - ctx, - RequestType.DEBUG, - DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_ONLINE_STATE), - callback, - userData, - ) - -### End of exported procs -################################################################################ +# proc waku_destroy( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# ffi_context.destroyWakuContext(ctx).isOkOr: +# let msg = "libwaku error: " & $error +# callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) +# return RET_ERR + +# ## always need to invoke the callback although we don't retrieve value to the caller +# callback(RET_OK, nil, 0, userData) + +# return RET_OK + +# proc waku_version( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) +# callback( +# RET_OK, +# cast[ptr cchar](WakuNodeVersionString), +# cast[csize_t](len(WakuNodeVersionString)), +# userData, +# ) + +# return RET_OK + +# proc waku_set_event_callback( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ) {.dynlib, exportc.} = +# initializeLibrary() +# ctx[].eventCallback = cast[pointer](callback) +# ctx[].eventUserData = userData + +# proc waku_content_topic( +# ctx: ptr FFIContext, +# appName: cstring, +# appVersion: cuint, +# contentTopicName: cstring, +# encoding: cstring, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# # https://rfc.vac.dev/spec/36/#extern-char-waku_content_topicchar-applicationname-unsigned-int-applicationversion-char-contenttopicname-char-encoding + +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# let contentTopic = fmt"/{$appName}/{$appVersion}/{$contentTopicName}/{$encoding}" +# callback( +# RET_OK, unsafeAddr contentTopic[0], cast[csize_t](len(contentTopic)), userData +# ) + +# return RET_OK + +# proc waku_pubsub_topic( +# ctx: ptr FFIContext, topicName: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc, cdecl.} = +# # https://rfc.vac.dev/spec/36/#extern-char-waku_pubsub_topicchar-name-char-encoding + +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# let outPubsubTopic = fmt"/waku/2/{$topicName}" +# callback( +# RET_OK, unsafeAddr outPubsubTopic[0], cast[csize_t](len(outPubsubTopic)), userData +# ) + +# return RET_OK + +# proc waku_default_pubsub_topic( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# # https://rfc.vac.dev/spec/36/#extern-char-waku_default_pubsub_topic + +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# callback( +# RET_OK, +# cast[ptr cchar](DefaultPubsubTopic), +# cast[csize_t](len(DefaultPubsubTopic)), +# userData, +# ) + +# return RET_OK + +# proc waku_relay_publish( +# ctx: ptr FFIContext, +# pubSubTopic: cstring, +# jsonWakuMessage: cstring, +# timeoutMs: cuint, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc, cdecl.} = +# # https://rfc.vac.dev/spec/36/#extern-char-waku_relay_publishchar-messagejson-char-pubsubtopic-int-timeoutms + +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# var jsonMessage: JsonMessage +# try: +# let jsonContent = parseJson($jsonWakuMessage) +# jsonMessage = JsonMessage.fromJsonNode(jsonContent).valueOr: +# raise newException(JsonParsingError, $error) +# except JsonParsingError: +# let msg = fmt"Error parsing json message: {getCurrentExceptionMsg()}" +# callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) +# return RET_ERR + +# let wakuMessage = jsonMessage.toWakuMessage().valueOr: +# let msg = "Problem building the WakuMessage: " & $error +# callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) +# return RET_ERR + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared(RelayMsgType.PUBLISH, pubSubTopic, nil, wakuMessage), +# callback, +# userData, +# ) + +# proc waku_start( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) +# handleRequest( +# ctx, +# RequestType.LIFECYCLE, +# NodeLifecycleRequest.createShared(NodeLifecycleMsgType.START_NODE), +# callback, +# userData, +# ) + +# proc waku_stop( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) +# handleRequest( +# ctx, +# RequestType.LIFECYCLE, +# NodeLifecycleRequest.createShared(NodeLifecycleMsgType.STOP_NODE), +# callback, +# userData, +# ) + +# proc waku_relay_subscribe( +# ctx: ptr FFIContext, pubSubTopic: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# var cb = onReceivedMessage(ctx) + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared(RelayMsgType.SUBSCRIBE, pubSubTopic, WakuRelayHandler(cb)), +# callback, +# userData, +# ) + +# proc waku_relay_add_protected_shard( +# ctx: ptr FFIContext, +# clusterId: cint, +# shardId: cint, +# publicKey: cstring, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc, cdecl.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared( +# RelayMsgType.ADD_PROTECTED_SHARD, +# clusterId = clusterId, +# shardId = shardId, +# publicKey = publicKey, +# ), +# callback, +# userData, +# ) + +# proc waku_relay_unsubscribe( +# ctx: ptr FFIContext, pubSubTopic: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared( +# RelayMsgType.UNSUBSCRIBE, pubSubTopic, WakuRelayHandler(onReceivedMessage(ctx)) +# ), +# callback, +# userData, +# ) + +# proc waku_relay_get_num_connected_peers( +# ctx: ptr FFIContext, pubSubTopic: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared(RelayMsgType.NUM_CONNECTED_PEERS, pubSubTopic), +# callback, +# userData, +# ) + +# proc waku_relay_get_connected_peers( +# ctx: ptr FFIContext, pubSubTopic: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared(RelayMsgType.LIST_CONNECTED_PEERS, pubSubTopic), +# callback, +# userData, +# ) + +# proc waku_relay_get_num_peers_in_mesh( +# ctx: ptr FFIContext, pubSubTopic: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared(RelayMsgType.NUM_MESH_PEERS, pubSubTopic), +# callback, +# userData, +# ) + +# proc waku_relay_get_peers_in_mesh( +# ctx: ptr FFIContext, pubSubTopic: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.RELAY, +# RelayRequest.createShared(RelayMsgType.LIST_MESH_PEERS, pubSubTopic), +# callback, +# userData, +# ) + +# proc waku_filter_subscribe( +# ctx: ptr FFIContext, +# pubSubTopic: cstring, +# contentTopics: cstring, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.FILTER, +# FilterRequest.createShared( +# FilterMsgType.SUBSCRIBE, +# pubSubTopic, +# contentTopics, +# FilterPushHandler(onReceivedMessage(ctx)), +# ), +# callback, +# userData, +# ) + +# proc waku_filter_unsubscribe( +# ctx: ptr FFIContext, +# pubSubTopic: cstring, +# contentTopics: cstring, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.FILTER, +# FilterRequest.createShared(FilterMsgType.UNSUBSCRIBE, pubSubTopic, contentTopics), +# callback, +# userData, +# ) + +# proc waku_filter_unsubscribe_all( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.FILTER, +# FilterRequest.createShared(FilterMsgType.UNSUBSCRIBE_ALL), +# callback, +# userData, +# ) + +# proc waku_lightpush_publish( +# ctx: ptr FFIContext, +# pubSubTopic: cstring, +# jsonWakuMessage: cstring, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc, cdecl.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# var jsonMessage: JsonMessage +# try: +# let jsonContent = parseJson($jsonWakuMessage) +# jsonMessage = JsonMessage.fromJsonNode(jsonContent).valueOr: +# raise newException(JsonParsingError, $error) +# except JsonParsingError: +# let msg = fmt"Error parsing json message: {getCurrentExceptionMsg()}" +# callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) +# return RET_ERR + +# let wakuMessage = jsonMessage.toWakuMessage().valueOr: +# let msg = "Problem building the WakuMessage: " & $error +# callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData) +# return RET_ERR + +# handleRequest( +# ctx, +# RequestType.LIGHTPUSH, +# LightpushRequest.createShared(LightpushMsgType.PUBLISH, pubSubTopic, wakuMessage), +# callback, +# userData, +# ) + +# proc waku_connect( +# ctx: ptr FFIContext, +# peerMultiAddr: cstring, +# timeoutMs: cuint, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared( +# PeerManagementMsgType.CONNECT_TO, $peerMultiAddr, chronos.milliseconds(timeoutMs) +# ), +# callback, +# userData, +# ) + +# proc waku_disconnect_peer_by_id( +# ctx: ptr FFIContext, peerId: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared( +# op = PeerManagementMsgType.DISCONNECT_PEER_BY_ID, peerId = $peerId +# ), +# callback, +# userData, +# ) + +# proc waku_disconnect_all_peers( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared(op = PeerManagementMsgType.DISCONNECT_ALL_PEERS), +# callback, +# userData, +# ) + +# proc waku_dial_peer( +# ctx: ptr FFIContext, +# peerMultiAddr: cstring, +# protocol: cstring, +# timeoutMs: cuint, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared( +# op = PeerManagementMsgType.DIAL_PEER, +# peerMultiAddr = $peerMultiAddr, +# protocol = $protocol, +# ), +# callback, +# userData, +# ) + +# proc waku_dial_peer_by_id( +# ctx: ptr FFIContext, +# peerId: cstring, +# protocol: cstring, +# timeoutMs: cuint, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared( +# op = PeerManagementMsgType.DIAL_PEER_BY_ID, peerId = $peerId, protocol = $protocol +# ), +# callback, +# userData, +# ) + +# proc waku_get_peerids_from_peerstore( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared(PeerManagementMsgType.GET_ALL_PEER_IDS), +# callback, +# userData, +# ) + +# proc waku_get_connected_peers_info( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared(PeerManagementMsgType.GET_CONNECTED_PEERS_INFO), +# callback, +# userData, +# ) + +# proc waku_get_connected_peers( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared(PeerManagementMsgType.GET_CONNECTED_PEERS), +# callback, +# userData, +# ) + +# proc waku_get_peerids_by_protocol( +# ctx: ptr FFIContext, protocol: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PEER_MANAGER, +# PeerManagementRequest.createShared( +# op = PeerManagementMsgType.GET_PEER_IDS_BY_PROTOCOL, protocol = $protocol +# ), +# callback, +# userData, +# ) + +# proc waku_store_query( +# ctx: ptr FFIContext, +# jsonQuery: cstring, +# peerAddr: cstring, +# timeoutMs: cint, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.STORE, +# StoreRequest.createShared(StoreReqType.REMOTE_QUERY, jsonQuery, peerAddr, timeoutMs), +# callback, +# userData, +# ) + +# proc waku_listen_addresses( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DEBUG, +# DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_LISTENING_ADDRESSES), +# callback, +# userData, +# ) + +# proc waku_dns_discovery( +# ctx: ptr FFIContext, +# entTreeUrl: cstring, +# nameDnsServer: cstring, +# timeoutMs: cint, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DISCOVERY, +# DiscoveryRequest.createRetrieveBootstrapNodesRequest( +# DiscoveryMsgType.GET_BOOTSTRAP_NODES, entTreeUrl, nameDnsServer, timeoutMs +# ), +# callback, +# userData, +# ) + +# proc waku_discv5_update_bootnodes( +# ctx: ptr FFIContext, bootnodes: cstring, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# ## Updates the bootnode list used for discovering new peers via DiscoveryV5 +# ## bootnodes - JSON array containing the bootnode ENRs i.e. `["enr:...", "enr:..."]` +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DISCOVERY, +# DiscoveryRequest.createUpdateBootstrapNodesRequest( +# DiscoveryMsgType.UPDATE_DISCV5_BOOTSTRAP_NODES, bootnodes +# ), +# callback, +# userData, +# ) + +# proc waku_get_my_enr( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DEBUG, +# DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_MY_ENR), +# callback, +# userData, +# ) + +# proc waku_get_my_peerid( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DEBUG, +# DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_MY_PEER_ID), +# callback, +# userData, +# ) + +# proc waku_get_metrics( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DEBUG, +# DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_METRICS), +# callback, +# userData, +# ) + +# proc waku_start_discv5( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DISCOVERY, +# DiscoveryRequest.createDiscV5StartRequest(), +# callback, +# userData, +# ) + +# proc waku_stop_discv5( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DISCOVERY, +# DiscoveryRequest.createDiscV5StopRequest(), +# callback, +# userData, +# ) + +# proc waku_peer_exchange_request( +# ctx: ptr FFIContext, numPeers: uint64, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DISCOVERY, +# DiscoveryRequest.createPeerExchangeRequest(numPeers), +# callback, +# userData, +# ) + +# proc waku_ping_peer( +# ctx: ptr FFIContext, +# peerAddr: cstring, +# timeoutMs: cuint, +# callback: FFICallBack, +# userData: pointer, +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.PING, +# PingRequest.createShared(peerAddr, chronos.milliseconds(timeoutMs)), +# callback, +# userData, +# ) + +# proc waku_is_online( +# ctx: ptr FFIContext, callback: FFICallBack, userData: pointer +# ): cint {.dynlib, exportc.} = +# initializeLibrary() +# checkLibwakuParams(ctx, callback, userData) + +# handleRequest( +# ctx, +# RequestType.DEBUG, +# DebugNodeRequest.createShared(DebugNodeMsgType.RETRIEVE_ONLINE_STATE), +# callback, +# userData, +# ) + +# ### End of exported procs +# ################################################################################ diff --git a/library/waku_context.nim b/library/waku_context.nim index ab4b996af..5c56ee1d1 100644 --- a/library/waku_context.nim +++ b/library/waku_context.nim @@ -3,39 +3,24 @@ {.passc: "-fPIC".} import std/[options, atomics, os, net, locks] -import chronicles, chronos, chronos/threadsync, taskpools/channels_spsc_single, results +import + chronicles, chronos, chronos/threadsync, taskpools/channels_spsc_single, results, ffi import waku/common/logging, waku/factory/waku, - waku/node/peer_manager, + # waku/node/peer_manager, waku/waku_relay/[protocol, topic_health], waku/waku_core/[topics/pubsub_topic, message], ./waku_thread_requests/[waku_thread_request, requests/debug_node_request], - ./ffi_types, ./events/[ json_message_event, json_topic_health_change_event, json_connection_change_event, json_waku_not_responding_event, ] -type WakuContext* = object - wakuThread: Thread[(ptr WakuContext)] - watchdogThread: Thread[(ptr WakuContext)] - # monitors the Waku thread and notifies the Waku SDK consumer if it hangs - lock: Lock - reqChannel: ChannelSPSCSingle[ptr WakuThreadRequest] - reqSignal: ThreadSignalPtr - # to inform The Waku Thread (a.k.a TWT) that a new request is sent - reqReceivedSignal: ThreadSignalPtr - # to inform the main thread that the request is rx by TWT - userData*: pointer - eventCallback*: pointer - eventUserdata*: pointer - running: Atomic[bool] # To control when the threads are running - const git_version* {.strdefine.} = "n/a" const versionString = "version / git commit hash: " & waku.git_version -template callEventCallback(ctx: ptr WakuContext, eventName: string, body: untyped) = +template callEventCallback(ctx: ptr FFIContext, eventName: string, body: untyped) = if isNil(ctx[].eventCallback): error eventName & " - eventCallback is nil" return @@ -43,41 +28,41 @@ template callEventCallback(ctx: ptr WakuContext, eventName: string, body: untype foreignThreadGc: try: let event = body - cast[WakuCallBack](ctx[].eventCallback)( + cast[FFICallBack](ctx[].eventCallback)( RET_OK, unsafeAddr event[0], cast[csize_t](len(event)), ctx[].eventUserData ) except Exception, CatchableError: let msg = "Exception " & eventName & " when calling 'eventCallBack': " & getCurrentExceptionMsg() - cast[WakuCallBack](ctx[].eventCallback)( + cast[FFICallBack](ctx[].eventCallback)( RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), ctx[].eventUserData ) -proc onConnectionChange*(ctx: ptr WakuContext): ConnectionChangeHandler = - return proc(peerId: PeerId, peerEvent: PeerEventKind) {.async.} = - callEventCallback(ctx, "onConnectionChange"): - $JsonConnectionChangeEvent.new($peerId, peerEvent) +# proc onConnectionChange*(ctx: ptr FFIContext): ConnectionChangeHandler = +# return proc(peerId: PeerId, peerEvent: PeerEventKind) {.async.} = +# callEventCallback(ctx, "onConnectionChange"): +# $JsonConnectionChangeEvent.new($peerId, peerEvent) -proc onReceivedMessage*(ctx: ptr WakuContext): WakuRelayHandler = +proc onReceivedMessage*(ctx: ptr FFIContext): WakuRelayHandler = return proc(pubsubTopic: PubsubTopic, msg: WakuMessage) {.async.} = callEventCallback(ctx, "onReceivedMessage"): $JsonMessageEvent.new(pubsubTopic, msg) -proc onTopicHealthChange*(ctx: ptr WakuContext): TopicHealthChangeHandler = +proc onTopicHealthChange*(ctx: ptr FFIContext): TopicHealthChangeHandler = return proc(pubsubTopic: PubsubTopic, topicHealth: TopicHealth) {.async.} = callEventCallback(ctx, "onTopicHealthChange"): $JsonTopicHealthChangeEvent.new(pubsubTopic, topicHealth) -proc onWakuNotResponding*(ctx: ptr WakuContext) = +proc onWakuNotResponding*(ctx: ptr FFIContext) = callEventCallback(ctx, "onWakuNotResponsive"): $JsonWakuNotRespondingEvent.new() proc sendRequestToWakuThread*( - ctx: ptr WakuContext, + ctx: ptr FFIContext, reqType: RequestType, reqContent: pointer, - callback: WakuCallBack, + callback: FFICallBack, userData: pointer, timeout = InfiniteDuration, ): Result[void, string] = @@ -113,10 +98,10 @@ proc sendRequestToWakuThread*( ## process proc. See the 'waku_thread_request.nim' module for more details. ok() -proc watchdogThreadBody(ctx: ptr WakuContext) {.thread.} = +proc watchdogThreadBody(ctx: ptr FFIContext) {.thread.} = ## Watchdog thread that monitors the Waku thread and notifies the library user if it hangs. - let watchdogRun = proc(ctx: ptr WakuContext) {.async.} = + let watchdogRun = proc(ctx: ptr FFIContext) {.async.} = const WatchdogStartDelay = 10.seconds const WatchdogTimeinterval = 1.seconds const WakuNotRespondingTimeout = 3.seconds @@ -127,7 +112,7 @@ proc watchdogThreadBody(ctx: ptr WakuContext) {.thread.} = await sleepAsync(WatchdogTimeinterval) if ctx.running.load == false: - info "Watchdog thread exiting because WakuContext is not running" + info "Watchdog thread exiting because FFIContext is not running" break let wakuCallback = proc( @@ -151,12 +136,12 @@ proc watchdogThreadBody(ctx: ptr WakuContext) {.thread.} = waitFor watchdogRun(ctx) -proc wakuThreadBody(ctx: ptr WakuContext) {.thread.} = +proc wakuThreadBody(ctx: ptr FFIContext) {.thread.} = ## Waku thread that attends library user requests (stop, connect_to, etc.) logging.setupLog(logging.LogLevel.DEBUG, logging.LogFormat.TEXT) - let wakuRun = proc(ctx: ptr WakuContext) {.async.} = + let wakuRun = proc(ctx: ptr FFIContext) {.async.} = var waku: Waku while true: await ctx.reqSignal.wait() @@ -179,10 +164,10 @@ proc wakuThreadBody(ctx: ptr WakuContext) {.thread.} = waitFor wakuRun(ctx) -proc createWakuContext*(): Result[ptr WakuContext, string] = +proc createWakuContext*[T](): Result[ptr FFIContext, string] = ## This proc is called from the main thread and it creates ## the Waku working thread. - var ctx = createShared(WakuContext, 1) + var ctx = createShared(FFIContext, 1) ctx.reqSignal = ThreadSignalPtr.new().valueOr: return err("couldn't create reqSignal ThreadSignalPtr") ctx.reqReceivedSignal = ThreadSignalPtr.new().valueOr: @@ -205,7 +190,7 @@ proc createWakuContext*(): Result[ptr WakuContext, string] = return ok(ctx) -proc destroyWakuContext*(ctx: ptr WakuContext): Result[void, string] = +proc destroyWakuContext*(ctx: ptr FFIContext): Result[void, string] = ctx.running.store(false) let signaledOnTime = ctx.reqSignal.fireSync().valueOr: diff --git a/library/waku_thread_requests/requests/discovery_request.nim b/library/waku_thread_requests/requests/discovery_request.nim index 405483a46..78f0889a2 100644 --- a/library/waku_thread_requests/requests/discovery_request.nim +++ b/library/waku_thread_requests/requests/discovery_request.nim @@ -1,13 +1,12 @@ import std/json -import chronos, chronicles, results, strutils, libp2p/multiaddress +import chronos, chronicles, results, strutils, libp2p/multiaddress, ffi import ../../../waku/factory/waku, ../../../waku/discovery/waku_dnsdisc, ../../../waku/discovery/waku_discv5, ../../../waku/waku_core/peers, - ../../../waku/node/waku_node, + ../../../waku/node/waku_node ../../../waku/node/kernel_api, - ../../alloc type DiscoveryMsgType* = enum GET_BOOTSTRAP_NODES diff --git a/library/waku_thread_requests/requests/node_lifecycle_request.nim b/library/waku_thread_requests/requests/node_lifecycle_request.nim index aa71ac6bb..bf973d9ee 100644 --- a/library/waku_thread_requests/requests/node_lifecycle_request.nim +++ b/library/waku_thread_requests/requests/node_lifecycle_request.nim @@ -1,5 +1,5 @@ import std/[options, json, strutils, net] -import chronos, chronicles, results, confutils, confutils/std/net +import chronos, chronicles, results, confutils, confutils/std/net, ffi import waku/node/peer_manager/peer_manager, @@ -8,10 +8,9 @@ import waku/factory/node_factory, waku/factory/networks_config, waku/factory/app_callbacks, - waku/rest_api/endpoint/builder + waku/waku_api/rest/builder import - ../../alloc type NodeLifecycleMsgType* = enum CREATE_NODE @@ -30,7 +29,6 @@ proc createShared*( appCallbacks: AppCallbacks = nil, ): ptr type T = var ret = createShared(T) - ret[].operation = op ret[].appCallbacks = appCallbacks ret[].configJson = configJson.alloc() return ret diff --git a/library/waku_thread_requests/requests/peer_manager_request.nim b/library/waku_thread_requests/requests/peer_manager_request.nim index cac5ca30e..58a980440 100644 --- a/library/waku_thread_requests/requests/peer_manager_request.nim +++ b/library/waku_thread_requests/requests/peer_manager_request.nim @@ -1,9 +1,8 @@ import std/[sequtils, strutils, tables] -import chronicles, chronos, results, options, json +import chronicles, chronos, results, options, json, ffi import ../../../waku/factory/waku, ../../../waku/node/waku_node, - ../../alloc, ../../../waku/node/peer_manager type PeerManagementMsgType* {.pure.} = enum @@ -57,7 +56,7 @@ proc destroyShared(self: ptr PeerManagementRequest) = deallocShared(self) proc process*( - self: ptr PeerManagementRequest, waku: Waku + self: ptr PeerManagementRequest, waku: ptr Waku ): Future[Result[string, string]] {.async.} = defer: destroyShared(self) @@ -65,18 +64,18 @@ proc process*( case self.operation of CONNECT_TO: let peers = ($self[].peerMultiAddr).split(",").mapIt(strip(it)) - await waku.node.connectToNodes(peers, source = "static") + await waku[].node.connectToNodes(peers, source = "static") return ok("") of GET_ALL_PEER_IDS: ## returns a comma-separated string of peerIDs let peerIDs = - waku.node.peerManager.switch.peerStore.peers().mapIt($it.peerId).join(",") + waku[].node.peerManager.switch.peerStore.peers().mapIt($it.peerId).join(",") return ok(peerIDs) of GET_CONNECTED_PEERS_INFO: ## returns a JSON string mapping peerIDs to objects with protocols and addresses var peersMap = initTable[string, PeerInfo]() - let peers = waku.node.peerManager.switch.peerStore.peers().filterIt( + let peers = waku[].node.peerManager.switch.peerStore.peers().filterIt( it.connectedness == Connected ) @@ -92,7 +91,7 @@ proc process*( return ok(jsonStr) of GET_PEER_IDS_BY_PROTOCOL: ## returns a comma-separated string of peerIDs that mount the given protocol - let connectedPeers = waku.node.peerManager.switch.peerStore + let connectedPeers = waku[].node.peerManager.switch.peerStore .peers($self[].protocol) .filterIt(it.connectedness == Connected) .mapIt($it.peerId) @@ -102,16 +101,16 @@ proc process*( let peerId = PeerId.init($self[].peerId).valueOr: error "DISCONNECT_PEER_BY_ID failed", error = $error return err($error) - await waku.node.peerManager.disconnectNode(peerId) + await waku[].node.peerManager.disconnectNode(peerId) return ok("") of DISCONNECT_ALL_PEERS: - await waku.node.peerManager.disconnectAllPeers() + await waku[].node.peerManager.disconnectAllPeers() return ok("") of DIAL_PEER: let remotePeerInfo = parsePeerInfo($self[].peerMultiAddr).valueOr: error "DIAL_PEER failed", error = $error return err($error) - let conn = await waku.node.peerManager.dialPeer(remotePeerInfo, $self[].protocol) + let conn = await waku[].node.peerManager.dialPeer(remotePeerInfo, $self[].protocol) if conn.isNone(): let msg = "failed dialing peer" error "DIAL_PEER failed", error = msg, peerId = $remotePeerInfo.peerId @@ -120,7 +119,7 @@ proc process*( let peerId = PeerId.init($self[].peerId).valueOr: error "DIAL_PEER_BY_ID failed", error = $error return err($error) - let conn = await waku.node.peerManager.dialPeer(peerId, $self[].protocol) + let conn = await waku[].node.peerManager.dialPeer(peerId, $self[].protocol) if conn.isNone(): let msg = "failed dialing peer" error "DIAL_PEER_BY_ID failed", error = msg, peerId = $peerId @@ -128,7 +127,7 @@ proc process*( of GET_CONNECTED_PEERS: ## returns a comma-separated string of peerIDs let - (inPeerIds, outPeerIds) = waku.node.peerManager.connectedPeers() + (inPeerIds, outPeerIds) = waku[].node.peerManager.connectedPeers() connectedPeerids = concat(inPeerIds, outPeerIds) return ok(connectedPeerids.mapIt($it).join(",")) diff --git a/library/waku_thread_requests/requests/ping_request.nim b/library/waku_thread_requests/requests/ping_request.nim index 716b9ed68..14af55341 100644 --- a/library/waku_thread_requests/requests/ping_request.nim +++ b/library/waku_thread_requests/requests/ping_request.nim @@ -1,7 +1,7 @@ import std/[json, strutils] -import chronos, results +import chronos, results, ffi import libp2p/[protocols/ping, switch, multiaddress, multicodec] -import ../../../waku/[factory/waku, waku_core/peers, node/waku_node], ../../alloc +import ../../../waku/[factory/waku, waku_core/peers, node/waku_node] type PingRequest* = object peerAddr: cstring diff --git a/library/waku_thread_requests/requests/protocols/filter_request.nim b/library/waku_thread_requests/requests/protocols/filter_request.nim index cd401d443..9b43a64ac 100644 --- a/library/waku_thread_requests/requests/protocols/filter_request.nim +++ b/library/waku_thread_requests/requests/protocols/filter_request.nim @@ -1,5 +1,5 @@ import options, std/[strutils, sequtils] -import chronicles, chronos, results +import chronicles, chronos, results, ffi import ../../../../waku/waku_filter_v2/client, ../../../../waku/waku_core/message/message, @@ -10,8 +10,7 @@ import ../../../../waku/node/waku_node, ../../../../waku/node/kernel_api, ../../../../waku/waku_core/topics/pubsub_topic, - ../../../../waku/waku_core/topics/content_topic, - ../../../alloc + ../../../../waku/waku_core/topics/content_topic type FilterMsgType* = enum SUBSCRIBE diff --git a/library/waku_thread_requests/requests/protocols/lightpush_request.nim b/library/waku_thread_requests/requests/protocols/lightpush_request.nim index bc3d9de2c..7818cba08 100644 --- a/library/waku_thread_requests/requests/protocols/lightpush_request.nim +++ b/library/waku_thread_requests/requests/protocols/lightpush_request.nim @@ -1,5 +1,5 @@ import options -import chronicles, chronos, results +import chronicles, chronos, results, ffi import ../../../../waku/waku_core/message/message, ../../../../waku/waku_core/codecs, @@ -9,8 +9,7 @@ import ../../../../waku/waku_core/topics/pubsub_topic, ../../../../waku/waku_lightpush_legacy/client, ../../../../waku/waku_lightpush_legacy/common, - ../../../../waku/node/peer_manager/peer_manager, - ../../../alloc + ../../../../waku/node/peer_manager/peer_manager type LightpushMsgType* = enum PUBLISH diff --git a/library/waku_thread_requests/requests/protocols/relay_request.nim b/library/waku_thread_requests/requests/protocols/relay_request.nim index e110f689e..093c78c10 100644 --- a/library/waku_thread_requests/requests/protocols/relay_request.nim +++ b/library/waku_thread_requests/requests/protocols/relay_request.nim @@ -1,5 +1,5 @@ import std/[net, sequtils, strutils] -import chronicles, chronos, stew/byteutils, results +import chronicles, chronos, stew/byteutils, results, ffi import waku/waku_core/message/message, waku/factory/[validator_signed, waku], @@ -13,7 +13,6 @@ import waku/node/peer_manager import - ../../../alloc type RelayMsgType* = enum SUBSCRIBE diff --git a/library/waku_thread_requests/requests/protocols/store_request.nim b/library/waku_thread_requests/requests/protocols/store_request.nim index 3fe1e2f13..f0ff25597 100644 --- a/library/waku_thread_requests/requests/protocols/store_request.nim +++ b/library/waku_thread_requests/requests/protocols/store_request.nim @@ -1,8 +1,7 @@ import std/[json, sugar, strutils, options] -import chronos, chronicles, results, stew/byteutils +import chronos, chronicles, results, stew/byteutils, ffi import ../../../../waku/factory/waku, - ../../../alloc, ../../../utils, ../../../../waku/waku_core/peers, ../../../../waku/waku_core/time, diff --git a/library/waku_thread_requests/waku_thread_request.nim b/library/waku_thread_requests/waku_thread_request.nim index 50462fba7..67a084b95 100644 --- a/library/waku_thread_requests/waku_thread_request.nim +++ b/library/waku_thread_requests/waku_thread_request.nim @@ -3,10 +3,9 @@ ## the Waku Thread. import std/json, results -import chronos, chronos/threadsync +import chronos, chronos/threadsync, ffi import ../../waku/factory/waku, - ../ffi_types, ./requests/node_lifecycle_request, ./requests/peer_manager_request, ./requests/protocols/relay_request, @@ -31,14 +30,14 @@ type RequestType* {.pure.} = enum type WakuThreadRequest* = object reqType: RequestType reqContent: pointer - callback: WakuCallBack + callback: FFICallBack userData: pointer proc createShared*( T: type WakuThreadRequest, reqType: RequestType, reqContent: pointer, - callback: WakuCallBack, + callback: FFICallBack, userData: pointer, ): ptr type T = var ret = createShared(T) @@ -78,7 +77,7 @@ proc process*( T: type WakuThreadRequest, request: ptr WakuThreadRequest, waku: ptr Waku ) {.async.} = let retFut = - case request[].reqType + case request[].reqId of LIFECYCLE: cast[ptr NodeLifecycleRequest](request[].reqContent).process(waku) of PEER_MANAGER: diff --git a/vendor/nim-ffi b/vendor/nim-ffi new file mode 160000 index 000000000..fc743fbbd --- /dev/null +++ b/vendor/nim-ffi @@ -0,0 +1 @@ +Subproject commit fc743fbbdd2423d6f541e78cbd5c278cac8137ce diff --git a/waku.nimble b/waku.nimble index 09ff48969..aa51aa96a 100644 --- a/waku.nimble +++ b/waku.nimble @@ -31,6 +31,7 @@ requires "nim >= 2.2.4", "results", "db_connector", "minilru" + "ffi" ### Helper functions proc buildModule(filePath, params = "", lang = "c"): bool =