Fabiana Cecin 6837ae0c1f
feat: bump nim-libp2p to v2.0.0 (#3929)
* bump nim-libp2p pin to v2.0.0 tag
* bump json_rpc to v0.6.1, lsquic to v0.5.1, boringssl to v0.0.8 (latest tags)
* add libp2p_mix dep; repoint libp2p/protocols/mix -> libp2p_mix
* pin nimble.lock: websock / protobuf_serialization / npeg / jwt
* Makefile: add -d:libp2p_quic_support
* regenerate nix/deps.nix (adds libp2p_mix, refreshes pins)
* migrate rng ref HmacDrbgContext -> libp2p Rng across prod/channels/tests (interface-only; same DRBG)
* waku_switch: TransportConfig factory; unified 2.0.0 connection limits (withMaxInOut, withMaxConnections); local MaxConnections
* waku_relay/rendezvous/discv5/kademlia: v2.0.0 API (rng, config, ServiceDiscovery rename)
* call Service.setup() on post-build switch services (2.0.0 split setup/start)
* drop libp2p/utils/semaphore -> chronos AsyncSemaphore
* add logos_delivery/waku/compat/option_valueor shim (Option[T] valueOr/withValue, dropped upstream)
* add std/options where a transitive re-export was removed
* add newStandardSwitch shim (libp2p removed it in 2.0.0); mounts yamux+mplex to match prod muxer
* PeerId.random(rng); common.rng()/crypto.newRng(); hoist shared rng (instantiation cleanup)
* update expectations for 2.0.0 defaults: DEFAULT_PROTOCOLS += /ipfs/id/push/1.0.0; agent "nim-libp2p"
* drop relay reboot/reconnect test (asserted a Switch restart capability that is simply not supported)
* fix up a few tests that were flaking on MacOS (libp2p upgrade may have exposed these)
2026-06-15 09:56:15 -03:00
..

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 configuration
  • callback: Callback function to receive the result
  • userData: 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 from logosdelivery_create_node
  • callback: Callback function to receive the result
  • userData: User data passed to the callback
  • contentTopic: 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): Success
  • RET_ERR (1): Error
  • RET_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 message
  • userData: 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 declarations
  • liblogosdelivery.nim: Main library entry point
  • declare_lib.nim: Library declaration and initialization
  • lmapi/node_api.nim: Node lifecycle API implementation
  • lmapi/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/