NagyZoltanPeter 3603b838b9
feat: liblogosdelivery FFI library of new API (#3714)
* Initial for liblogosdelivery library (static & dynamic) based on current state of API. 
* nix build support added.
* logosdelivery_example
* Added support for missing logLevel/logFormat in new API create_node
* Added full JSON to NodeConfig support
* Added ctx and ctx.myLib check to avoid uninitialzed calls and crash. Adjusted logosdelivery_example with proper error handling and JSON config format
* target aware install phase
* Fix base64 decode of payload
2026-02-17 10:38:35 +01:00

5.6 KiB

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",
  "clusterId": 1,
  "entryNodes": [
    "enrtree://AIRVQ5DDA4FFWLRBCHJWUWOO6X6S4ZTZ5B667LQ6AJU6PEYDLRD5O@sandbox.waku.nodes.status.im"
  ],
  "networkingConfig": {
    "listenIpv4": "0.0.0.0",
    "p2pTcpPort": 60000,
    "discv5UdpPort": 9000
  }
}

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 = "{"
        "\"mode\": \"Core\","
        "\"clusterId\": 1"
        "}";

    // 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/