mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-07-09 17:59:27 +00:00
* remove --mode from the CLI * move WakuMode to the messaging layer * expose store backend (db url, max connections) and a remote store node on the messaging surface * wakunode2 with no flags now runs as a full service node (store still opt-in) * add rateLimitMessagesPerEpoch * channel rate-limiting auto-enables if epochPeriodSec or messagesPerEpoch is set * fix JSON conf parser to be generic (works over all config types) * messaging config = mode + preset + messagingOverrides + channelsOverrides * add full messaging plus selective kernel config options to MessagingClientConf * mode (Core/Edge) expands to kernel protocol flags in the messaging layer * create_node parses the messaging config, drops the flat WakuNodeConf JSON entrypoint * wire channelsOverrides (segmentation/SDS/rate-limit) into channel creation * fix liblogosdelivery.h comments and README for the new config shape * messaging conf tests: switch names, reject-unknown, set-twice, field->kernel * add kernel log-level, log-format, nodekey to the messaging surface * Port 0 (ephemeral) default for messaging entry points * KernelConf alias for WakuNodeConf * rewrite the FFI examples to the new config shape * C/C++ examples use preset status.prod * drop operator-only confs from the examples * remove duplicate tests & misc test fixes * Delete p2pReliability from Kernel (Waku) resolver and config (keep preset definition) * Delete NodeConfig API (deprecation completed by p2pReliability removal from kernel) * Rename test_messaging_conf.nim to test_conf.nim (tests Logos Delivery config in general) * Rename messaging_conf_json.nim to logos_delivery_conf_json.nim * Add logos_delivery_conf.nim (defines LogosDeliveryConf aggregate) * misc docs/comments cleanups
221 lines
8.5 KiB
Nim
221 lines
8.5 KiB
Nim
import std/json
|
|
import chronos, chronicles, results, ffi
|
|
import logos_delivery/waku/common/base64
|
|
import
|
|
logos_delivery,
|
|
logos_delivery/waku/node/waku_node,
|
|
logos_delivery/api/types,
|
|
logos_delivery/waku/api/events/health_events,
|
|
logos_delivery/waku/api/events/peer_events,
|
|
logos_delivery/api/logos_delivery_conf_json,
|
|
../declare_lib,
|
|
../json_event
|
|
|
|
# Add JSON serialization for RequestId
|
|
proc `%`*(id: RequestId): JsonNode =
|
|
%($id)
|
|
|
|
registerReqFFI(CreateNodeRequest, ctx: ptr FFIContext[LogosDelivery]):
|
|
proc(configJson: cstring): Future[Result[string, string]] {.async.} =
|
|
let conf = parseLogosDeliveryConf($configJson).valueOr:
|
|
error "Failed to parse Logos Delivery configuration JSON",
|
|
error = error, configJson = $configJson
|
|
return err("failed parseLogosDeliveryConf " & error)
|
|
|
|
ctx.myLib[] = (await LogosDelivery.new(conf)).valueOr:
|
|
let errMsg = $error
|
|
chronicles.error "CreateNodeRequest failed", err = errMsg
|
|
return err(errMsg)
|
|
|
|
return ok("")
|
|
|
|
proc logosdelivery_destroy(
|
|
ctx: ptr FFIContext[LogosDelivery], callback: FFICallBack, userData: pointer
|
|
): cint {.dynlib, exportc, cdecl.} =
|
|
initializeLibrary()
|
|
checkParams(ctx, callback, userData)
|
|
|
|
ffi.destroyFFIContext(ctx).isOkOr:
|
|
let msg = "liblogosdelivery 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 logosdelivery_create_node(
|
|
configJson: cstring, callback: FFICallback, userData: pointer
|
|
): pointer {.dynlib, exportc, cdecl.} =
|
|
initializeLibrary()
|
|
|
|
if callback.isNil():
|
|
echo "error: missing callback in logosdelivery_create_node"
|
|
return nil
|
|
|
|
var ctx = ffi.createFFIContext[LogosDelivery]().valueOr:
|
|
let msg = "Error in createFFIContext: " & $error
|
|
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
|
|
return nil
|
|
|
|
ctx.userData = userData
|
|
|
|
ffi.sendRequestToFFIThread(
|
|
ctx, CreateNodeRequest.ffiNewReq(callback, userData, configJson)
|
|
).isOkOr:
|
|
let msg = "error in sendRequestToFFIThread: " & $error
|
|
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
|
|
# free allocated resources as they won't be available
|
|
ffi.destroyFFIContext(ctx).isOkOr:
|
|
chronicles.error "Error in destroyFFIContext after sendRequestToFFIThread during creation",
|
|
err = $error
|
|
return nil
|
|
|
|
return ctx
|
|
|
|
proc logosdelivery_start_node(
|
|
ctx: ptr FFIContext[LogosDelivery], callback: FFICallBack, userData: pointer
|
|
) {.ffi.} =
|
|
requireInitializedNode(ctx, "START_NODE"):
|
|
return err(errMsg)
|
|
|
|
# setting up outgoing event listeners
|
|
let sentListener = MessageSentEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: MessageSentEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onMessageSent"):
|
|
$newJsonEvent("message_sent", event),
|
|
).valueOr:
|
|
chronicles.error "MessageSentEvent.listen failed", err = $error
|
|
return err("MessageSentEvent.listen failed: " & $error)
|
|
|
|
let errorListener = MessageErrorEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: MessageErrorEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onMessageError"):
|
|
$newJsonEvent("message_error", event),
|
|
).valueOr:
|
|
chronicles.error "MessageErrorEvent.listen failed", err = $error
|
|
return err("MessageErrorEvent.listen failed: " & $error)
|
|
|
|
let propagatedListener = MessagePropagatedEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: MessagePropagatedEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onMessagePropagated"):
|
|
$newJsonEvent("message_propagated", event),
|
|
).valueOr:
|
|
chronicles.error "MessagePropagatedEvent.listen failed", err = $error
|
|
return err("MessagePropagatedEvent.listen failed: " & $error)
|
|
|
|
let receivedListener = MessageReceivedEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: MessageReceivedEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onMessageReceived"):
|
|
$newJsonEvent("message_received", event),
|
|
).valueOr:
|
|
chronicles.error "MessageReceivedEvent.listen failed", err = $error
|
|
return err("MessageReceivedEvent.listen failed: " & $error)
|
|
|
|
let ConnectionStatusChangeListener = EventConnectionStatusChange.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: EventConnectionStatusChange) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onConnectionStatusChange"):
|
|
$newJsonEvent("connection_status_change", event),
|
|
).valueOr:
|
|
chronicles.error "ConnectionStatusChange.listen failed", err = $error
|
|
return err("ConnectionStatusChange.listen failed: " & $error)
|
|
|
|
let shardTopicHealthListener = EventShardTopicHealthChange.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: EventShardTopicHealthChange) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onTopicHealthChange"):
|
|
$(
|
|
%*{
|
|
"eventType": "relay_topic_health_change",
|
|
"pubsubTopic": $event.topic,
|
|
"topicHealth": $event.health,
|
|
}
|
|
),
|
|
).valueOr:
|
|
chronicles.error "EventShardTopicHealthChange.listen failed", err = $error
|
|
return err("EventShardTopicHealthChange.listen failed: " & $error)
|
|
|
|
let peerEventListener = WakuPeerEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: WakuPeerEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onConnectionChange"):
|
|
$(
|
|
%*{
|
|
"eventType": "connection_change",
|
|
"peerId": $event.peerId,
|
|
"peerEvent": $event.kind,
|
|
}
|
|
),
|
|
).valueOr:
|
|
chronicles.error "WakuPeerEvent.listen failed", err = $error
|
|
return err("WakuPeerEvent.listen failed: " & $error)
|
|
|
|
let channelReceivedListener = ChannelMessageReceivedEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: ChannelMessageReceivedEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onChannelMessageReceived"):
|
|
$(
|
|
%*{
|
|
"eventType": "channel_message_received",
|
|
"channelId": string(event.channelId),
|
|
"senderId": $event.senderId,
|
|
"payload": string(base64.encode(event.payload)),
|
|
}
|
|
),
|
|
).valueOr:
|
|
chronicles.error "ChannelMessageReceivedEvent.listen failed", err = $error
|
|
return err("ChannelMessageReceivedEvent.listen failed: " & $error)
|
|
|
|
let channelSentListener = ChannelMessageSentEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: ChannelMessageSentEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onChannelMessageSent"):
|
|
$newJsonEvent("channel_message_sent", event),
|
|
).valueOr:
|
|
chronicles.error "ChannelMessageSentEvent.listen failed", err = $error
|
|
return err("ChannelMessageSentEvent.listen failed: " & $error)
|
|
|
|
let channelErrorListener = ChannelMessageErrorEvent.listen(
|
|
ctx.myLib[].waku.brokerCtx,
|
|
proc(event: ChannelMessageErrorEvent) {.async: (raises: []).} =
|
|
callEventCallback(ctx, "onChannelMessageError"):
|
|
$newJsonEvent("channel_message_error", event),
|
|
).valueOr:
|
|
chronicles.error "ChannelMessageErrorEvent.listen failed", err = $error
|
|
return err("ChannelMessageErrorEvent.listen failed: " & $error)
|
|
|
|
(await ctx.myLib[].start()).isOkOr:
|
|
let errMsg = $error
|
|
chronicles.error "START_NODE failed", err = errMsg
|
|
return err("failed to start: " & errMsg)
|
|
return ok("")
|
|
|
|
proc logosdelivery_stop_node(
|
|
ctx: ptr FFIContext[LogosDelivery], callback: FFICallBack, userData: pointer
|
|
) {.ffi.} =
|
|
requireInitializedNode(ctx, "STOP_NODE"):
|
|
return err(errMsg)
|
|
|
|
await MessageErrorEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await MessageSentEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await MessagePropagatedEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await MessageReceivedEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await EventConnectionStatusChange.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await EventShardTopicHealthChange.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await WakuPeerEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await ChannelMessageReceivedEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await ChannelMessageSentEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
await ChannelMessageErrorEvent.dropAllListeners(ctx.myLib[].waku.brokerCtx)
|
|
|
|
(await ctx.myLib[].stop()).isOkOr:
|
|
let errMsg = $error
|
|
chronicles.error "STOP_NODE failed", err = errMsg
|
|
return err("failed to stop: " & errMsg)
|
|
return ok("")
|