Ports commit 14562878 onto PR #3807's logos_delivery/ layout. Changes vs original 14562878: - Plugin consumed via nimble dep (no submodule add); the PR #3807 nimble resolution already provides it. - mountMix signature carries both PR #3807's disableSpamProtection AND the patch's useOnchainLEZ parameters (callsite passes both). - WakuMix.new branches on disableSpamProtection while also setting useOnchainLEZ on the spam-protection config. Cover-traffic params come from the plugin config when RLN is enabled, fall back to waku defaults when disabled. - start() retains HEAD's split between local-only init and the separate registerDoSProtectionWithNetwork retry loop. publishGossipsubTrigger is promoted to a standalone proc instead of inline in an else branch. - MixProtocol.init uses libp2p_mix's new Opt-wrapped coverTraffic and the MixRlnSpamProtection.new constructor (not the renamed newMixRlnSpamProtection). - Makefile reverted to HEAD: PR #3807 dropped the separate mix-librln archive in favor of a single stateless zerokit, so the patch's MIX_LIBRLN_* additions are obsolete. - README/sim helper config files: HEAD's values retained (env-specific paths from patch author dropped). Adds: - logos_delivery/waku/waku_mix/logos_core_client.nim (RLN client layer) - logos_delivery/waku/waku_mix/coordination handler (via waku_node) - logos_delivery/waku/waku_rln_relay/rln_gifter/{client,protocol,rpc,rpc_codec}.nim - 5 new C FFI exports (logosdelivery_set_rln_fetcher, _set_rln_config, _set_rln_identity, _push_roots, _push_proof) - --mix-gifter-* CLI flags + MixConf fields + MixConfBuilder methods - tests/waku_rln_relay/test_rln_gifter.nim
Logos Messaging API (LMAPI) Library
A C FFI library providing a simplified interface to Logos Messaging functionality.
Overview
This library wraps the high-level API functions from waku/api/api.nim and exposes them via a C FFI interface, making them accessible from C, C++, and other languages that support C FFI.
API Functions
Node Lifecycle
logosdelivery_create_node
Creates a new instance of the node from the given configuration JSON.
void *logosdelivery_create_node(
const char *configJson,
FFICallBack callback,
void *userData
);
Parameters:
configJson: JSON string containing node configurationcallback: Callback function to receive the resultuserData: User data passed to the callback
Returns: Pointer to the context needed by other API functions, or NULL on error.
Example configuration JSON:
{
"mode": "Core",
"preset": "logos.dev",
"listenAddress": "0.0.0.0",
"tcpPort": 60000,
"discv5UdpPort": 9000
}
Configuration uses flat field names matching WakuNodeConf in tools/confutils/cli_args.nim.
Use "preset" to select a network preset (e.g., "twn", "logos.dev") which auto-configures
entry nodes, cluster ID, sharding, and other network-specific settings.
logosdelivery_start_node
Starts the node.
int logosdelivery_start_node(
void *ctx,
FFICallBack callback,
void *userData
);
logosdelivery_stop_node
Stops the node.
int logosdelivery_stop_node(
void *ctx,
FFICallBack callback,
void *userData
);
logosdelivery_destroy
Destroys a node instance and frees resources.
int logosdelivery_destroy(
void *ctx,
FFICallBack callback,
void *userData
);
Messaging
logosdelivery_subscribe
Subscribe to a content topic to receive messages.
int logosdelivery_subscribe(
void *ctx,
FFICallBack callback,
void *userData,
const char *contentTopic
);
Parameters:
ctx: Context pointer fromlogosdelivery_create_nodecallback: Callback function to receive the resultuserData: User data passed to the callbackcontentTopic: Content topic string (e.g., "/myapp/1/chat/proto")
logosdelivery_unsubscribe
Unsubscribe from a content topic.
int logosdelivery_unsubscribe(
void *ctx,
FFICallBack callback,
void *userData,
const char *contentTopic
);
logosdelivery_send
Send a message.
int logosdelivery_send(
void *ctx,
FFICallBack callback,
void *userData,
const char *messageJson
);
Parameters:
messageJson: JSON string containing the message
Example message JSON:
{
"contentTopic": "/myapp/1/chat/proto",
"payload": "SGVsbG8gV29ybGQ=",
"ephemeral": false
}
Note: The payload field should be base64-encoded.
Returns: Request ID in the callback message that can be used to track message delivery.
Events
logosdelivery_set_event_callback
Sets a callback that will be invoked whenever an event occurs (e.g., message received).
void logosdelivery_set_event_callback(
void *ctx,
FFICallBack callback,
void *userData
);
Important: The callback should be fast, non-blocking, and thread-safe.
Building
The library follows the same build system as the main Logos Messaging project.
Build the library
make liblogosdeliveryStatic # Build static library
# or
make liblogosdeliveryDynamic # Build dynamic library
Return Codes
All functions that return int use the following return codes:
RET_OK(0): SuccessRET_ERR(1): ErrorRET_MISSING_CALLBACK(2): Missing callback function
Callback Function
All API functions use the following callback signature:
typedef void (*FFICallBack)(
int callerRet,
const char *msg,
size_t len,
void *userData
);
Parameters:
callerRet: Return code (RET_OK, RET_ERR, etc.)msg: Response message (may be empty for success)len: Length of the messageuserData: User data passed in the original call
Example Usage
#include "liblogosdelivery.h"
#include <stdio.h>
void callback(int ret, const char *msg, size_t len, void *userData) {
if (ret == RET_OK) {
printf("Success: %.*s\n", (int)len, msg);
} else {
printf("Error: %.*s\n", (int)len, msg);
}
}
int main() {
const char *config = "{"
"\"logLevel\": \"INFO\","
"\"mode\": \"Core\","
"\"preset\": \"logos.dev\""
"}";
// Create node
void *ctx = logosdelivery_create_node(config, callback, NULL);
if (ctx == NULL) {
return 1;
}
// Start node
logosdelivery_start_node(ctx, callback, NULL);
// Subscribe to a topic
logosdelivery_subscribe(ctx, callback, NULL, "/myapp/1/chat/proto");
// Send a message
const char *msg = "{"
"\"contentTopic\": \"/myapp/1/chat/proto\","
"\"payload\": \"SGVsbG8gV29ybGQ=\","
"\"ephemeral\": false"
"}";
logosdelivery_send(ctx, callback, NULL, msg);
// Clean up
logosdelivery_stop_node(ctx, callback, NULL);
logosdelivery_destroy(ctx, callback, NULL);
return 0;
}
Architecture
The library is structured as follows:
liblogosdelivery.h: C header file with function declarationsliblogosdelivery.nim: Main library entry pointdeclare_lib.nim: Library declaration and initializationlmapi/node_api.nim: Node lifecycle API implementationlmapi/messaging_api.nim: Subscribe/send API implementation
The library uses the nim-ffi framework for FFI infrastructure, which handles:
- Thread-safe request processing
- Async operation management
- Memory management between C and Nim
- Callback marshaling
See Also
- Main API documentation:
waku/api/api.nim - Original libwaku library:
library/libwaku.nim - nim-ffi framework:
vendor/nim-ffi/