Logos Storage Library
Logos Storage exposes a C binding that serves as a stable contract, making it straightforward to integrate Logos Storage into other languages such as Go.
The implementation was inspired by nim-library-template
and by the nwaku library.
The source code contains detailed comments to explain the threading and callback flow.
The diagram below summarizes the lifecycle: context creation, request execution, and shutdown.
sequenceDiagram
autonumber
actor App as App/User
participant Go as Go Wrapper
participant C as C API (libstorage.h)
participant Ctx as StorageContext
participant Thr as Worker Thread
participant Eng as CodexServer
App->>Go: Start
Go->>C: storage_start_node
C->>Ctx: enqueue request
C->>Ctx: fire signal
Ctx->>Thr: wake worker
Thr->>Ctx: dequeue request
Thr-->>Ctx: ACK
Ctx-->>C: forward ACK
C-->>Go: RET OK
Go->>App: Unblock
Thr->>Eng: execute (async)
Eng-->>Thr: result ready
Thr-->>Ctx: callback
Ctx-->>C: forward callback
C-->>Go: forward callback
Go-->>App: done
C API
C-exported interface for the Logos Storage shared library.
This API provides a C-compatible interface to the internal Nim implementation of Logos Storage.
Unless explicitly stated otherwise, all functions are asynchronous and execute their work on a separate thread, returning results via the provided callback. The int return value is the synchronous status of dispatch:
RET_OK: job dispatched to the worker threadRET_ERR: immediate failureRET_MISSING_CALLBACK: callback is missing
Some functions may emit progress updates via the callback using RET_PROGRESS, and finally complete with RET_OK or RET_ERR.
For upload/download streaming, msg contains a chunk of data and len the chunk length.
Types
StorageCallback
typedef void (*StorageCallback)(int callerRet, const char *msg, size_t len, void *userData);
Return codes
#define RET_OK 0
#define RET_ERR 1
#define RET_MISSING_CALLBACK 2
#define RET_PROGRESS 3
Context lifecycle
storage_new
Create a new instance of a Logos Storage node.
void *storage_new(
const char *configJson,
StorageCallback callback,
void *userData
);
configJson: JSON string with configuration overwriting defaults- Returns an opaque context pointer used for subsequent calls
Typical usage:
storage_new(...)storage_start(...)storage_stop(...)storage_destroy(...)
storage_start
Start the Logos Storage node (can be started/stopped multiple times).
int storage_start(void *ctx, StorageCallback callback, void *userData);
storage_stop
Stop the Logos Storage node (can be started/stopped multiple times).
int storage_stop(void *ctx, StorageCallback callback, void *userData);
storage_close
Close the node and release resources before destruction.
int storage_close(void *ctx, StorageCallback callback, void *userData);
storage_destroy
Destroy the node instance and free associated resources. Node must be stopped and closed.
int storage_destroy(void *ctx, StorageCallback callback, void *userData);
Version
storage_version
Get the Logos Storage version string. Does not require the node to be started and does not involve a thread call.
int storage_version(void *ctx, StorageCallback callback, void *userData);
storage_revision
Get the Logos Storage contracts revision. Does not require the node to be started and does not involve a thread call.
int storage_revision(void *ctx, StorageCallback callback, void *userData);
storage_repo
Get the repo (data-dir) used by the node.
int storage_repo(void *ctx, StorageCallback callback, void *userData);
Debug
storage_debug
Retrieve debug information (JSON).
int storage_debug(void *ctx, StorageCallback callback, void *userData);
storage_spr
Get the node's Signed Peer Record (SPR).
int storage_spr(void *ctx, StorageCallback callback, void *userData);
storage_peer_id
Get the node's peer ID (libp2p Peer Identity).
int storage_peer_id(void *ctx, StorageCallback callback, void *userData);
storage_peer_debug
Request debug information for a given peer ID.
Only available if compiled with storage_enable_api_debug_peers.
int storage_peer_debug(void *ctx, const char *peerId, StorageCallback callback, void *userData);
Logging
storage_log_level
Set the log level at run time.
logLevel can be: TRACE, DEBUG, INFO, NOTICE, WARN, ERROR, FATAL.
int storage_log_level(
void *ctx,
const char *logLevel,
StorageCallback callback,
void *userData
);
Networking
storage_connect
Connect to a peer by using peerAddresses if provided, otherwise use peerId.
Note that the peerId has to be advertised in the DHT for this to work.
int storage_connect(
void *ctx,
const char *peerId,
const char **peerAddresses,
size_t peerAddressesSize,
StorageCallback callback,
void *userData
);
Upload
storage_upload_init
Initialize an upload session for a file.
filepath: absolute path for file upload; for chunk uploads it's the file name. The metadata filename and mime type are derived from this value.chunkSize: chunk size for upload (default:1024 * 64bytes)- Callback returns the
sessionId
int storage_upload_init(
void *ctx,
const char *filepath,
size_t chunkSize,
StorageCallback callback,
void *userData
);
storage_upload_chunk
Upload a chunk for the given sessionId.
int storage_upload_chunk(
void *ctx,
const char *sessionId,
const uint8_t *chunk,
size_t len,
StorageCallback callback,
void *userData
);
storage_upload_finalize
Finalize an upload session identified by sessionId.
Callback returns the cid of the uploaded content.
int storage_upload_finalize(
void *ctx,
const char *sessionId,
StorageCallback callback,
void *userData
);
storage_upload_cancel
Cancel an ongoing upload session.
int storage_upload_cancel(
void *ctx,
const char *sessionId,
StorageCallback callback,
void *userData
);
storage_upload_file
Upload the file defined as filepath in the init method.
- Callback may be called with
RET_PROGRESSduring upload (depending on chunk size constraints) - Callback returns the
cidof the uploaded content
int storage_upload_file(
void *ctx,
const char *sessionId,
StorageCallback callback,
void *userData
);
Download API
storage_download_init
Initialize a download for cid.
chunkSize: chunk size for download (default:1024 * 64bytes)local: attempt local store retrieval only
int storage_download_init(
void *ctx,
const char *cid,
size_t chunkSize,
bool local,
StorageCallback callback,
void *userData
);
storage_download_stream
Perform a streaming download for cid. Init must have been called prior.
- If
filepathis provided, content is written to that file. - Callback may be called with
RET_PROGRESSupdates during download. localindicates whether to attempt local store retrieval only.
int storage_download_stream(
void *ctx,
const char *cid,
size_t chunkSize,
bool local,
const char *filepath,
StorageCallback callback,
void *userData
);
storage_download_chunk
Download a chunk for the given cid. Init must have been called prior.
Chunk returned via callback using RET_PROGRESS.
int storage_download_chunk(
void *ctx,
const char *cid,
StorageCallback callback,
void *userData
);
storage_download_cancel
Cancel an ongoing download for cid.
int storage_download_cancel(
void *ctx,
const char *cid,
StorageCallback callback,
void *userData
);
storage_download_manifest
Retrieve the manifest for the given cid (JSON).
int storage_download_manifest(
void *ctx,
const char *cid,
StorageCallback callback,
void *userData
);
Storage operations
storage_list
Retrieve the list of manifests stored in the node.
int storage_list(void *ctx, StorageCallback callback, void *userData);
storage_space
Retrieve storage space information (JSON).
int storage_space(void *ctx, StorageCallback callback, void *userData);
storage_delete
Delete the content identified by cid.
int storage_delete(void *ctx, const char *cid, StorageCallback callback, void *userData);
storage_fetch
Fetch content identified by cid from the network into local store
in background. The callback will not receive progress updates.
int storage_fetch(void *ctx, const char *cid, StorageCallback callback, void *userData);
storage_exists
Check if content identified by cid exists in local store.
int storage_exists(void *ctx, const char *cid, StorageCallback callback, void *userData);
storage_set_event_callback
Not used currently. Reserved for future use to set an event callback.
void storage_set_event_callback(void *ctx, StorageCallback callback, void *userData);
Go wrapper
A Go wrapper is available here.
Rust Wrapper
A Rust wrapper is available here.