4.7 KiB
liblmapi - Summary
Overview
Created a new C FFI library liblmapi (Logos Messaging API) that provides a simplified interface to the high-level API functions from waku/api/api.nim.
Files Created
Core Library Files
-
liblmapi/liblmapi.h - C header file
- Defines C FFI interface
- Includes function declarations for node lifecycle and messaging
- Return codes and callback typedef
-
liblmapi/liblmapi.nim - Main library entry point
- Imports and includes API modules
- Exports
lmapi_destroyfunction - Follows same pattern as
library/libwaku.nim
-
liblmapi/declare_lib.nim - Library declaration
- Uses
declareLibrary("lmapi")macro - Exports
lmapi_set_event_callbackfunction
- Uses
-
liblmapi/nim.cfg - Nim configuration
- Sets up compiler flags (gc:refc, threads:on)
- Configures paths for nim-ffi and project root
- Library-specific build settings
API Implementation Files
-
liblmapi/lmapi/node_api.nim - Node lifecycle API
lmapi_create_node- Creates node from JSON configlmapi_start_node- Starts the nodelmapi_stop_node- Stops the node- Uses
registerReqFFImacro for CreateNodeRequest
-
liblmapi/lmapi/messaging_api.nim - Messaging API
lmapi_subscribe- Subscribe to content topiclmapi_unsubscribe- Unsubscribe from content topiclmapi_send- Send message with base64-encoded payload- All use
{.ffi.}pragma for automatic FFI wrapping
Documentation and Examples
-
liblmapi/README.md - Main documentation
- API function reference
- Configuration examples
- Build instructions
- Usage patterns
- Architecture overview
-
liblmapi/examples/liblmapi_example.c - C example program
- Demonstrates all API functions
- Shows proper callback handling
- Complete lifecycle example
-
liblmapi/examples/README.md - Example documentation
- Build instructions per platform
- Expected output
- Usage notes
Build System Integration
-
Modified waku.nims
- Added
liblmapiStatictask - Added
liblmapiDynamictask - Both use
buildLibraryhelper with chronicle params
- Added
-
Modified Makefile
- Added
liblmapito PHONY targets - Added
LMAPI_BUILD_COMMANDvariable - Added
liblmapitarget that calls nim tasks - Respects STATIC flag for static/dynamic build
- Added
API Functions
Node Lifecycle
lmapi_create_node- Create and configure nodelmapi_start_node- Start node operationslmapi_stop_node- Stop node operationslmapi_destroy- Clean up and free resources
Messaging
lmapi_subscribe- Subscribe to content topiclmapi_unsubscribe- Unsubscribe from content topiclmapi_send- Send message envelope
Events
lmapi_set_event_callback- Register event callback
Build Commands
# Build dynamic library (default)
make liblmapi
# Build static library
make liblmapi STATIC=1
# Or directly via nim
nim liblmapiDynamic waku.nims liblmapi.so
nim liblmapiStatic waku.nims liblmapi.a
Key Design Decisions
-
Follows libwaku pattern: Same structure and conventions as existing
library/libwaku.nim -
Uses nim-ffi framework: Leverages vendor/nim-ffi for:
- Thread-safe request processing
- Async operation management
- Callback marshaling
- Memory management between C and Nim
-
Wraps new high-level API: Directly wraps
waku/api/api.nimfunctions:createNode(config: NodeConfig)subscribe(w: Waku, contentTopic: ContentTopic)send(w: Waku, envelope: MessageEnvelope)
-
JSON-based configuration: Uses JSON for:
- Node configuration (mode, networking, protocols)
- Message envelopes (contentTopic, payload, ephemeral)
- Simplifies C interface while maintaining flexibility
-
Base64 payload encoding: Message payloads must be base64-encoded in JSON
- Avoids binary data issues in JSON
- Standard encoding for C interop
Integration Points
The library integrates with:
waku/api/api.nim- Main API functionswaku/api/api_conf.nim- Configuration types (NodeConfig, NetworkingConfig, etc.)waku/api/types.nim- Core types (MessageEnvelope, RequestId, etc.)waku/factory/waku.nim- Waku instance typevendor/nim-ffi/- FFI infrastructure
Testing
To test the library:
- Build it:
make liblmapi - Build the example:
make liblmapi_exampleorcd liblmapi/examples && gcc -o liblmapi_example liblmapi_example.c -I.. -L../../build -llmapi - Run:
./build/liblmapi_example
Next Steps
Potential enhancements:
- Add more examples (async, multi-threaded, etc.)
- Add proper test suite
- Add CI/CD integration
- Add mobile platform support (Android/iOS)
- Add language bindings (Python, Go, etc.)