diff --git a/waku/wrapper.py b/waku/wrapper.py new file mode 100644 index 0000000..3403270 --- /dev/null +++ b/waku/wrapper.py @@ -0,0 +1,75 @@ +import json +from cffi import FFI +from pathlib import Path + +ffi = FFI() + +ffi.cdef(""" +typedef void (*FFICallBack)(int callerRet, const char *msg, size_t len, void *userData); + +void *logosdelivery_create_node( + const char *configJson, + FFICallBack callback, + void *userData +); + +int logosdelivery_start_node( + void *ctx, + FFICallBack callback, + void *userData +); +""") + +_repo_root = Path(__file__).resolve().parents[1] +lib = ffi.dlopen(str(_repo_root / "lib" / "liblogosdelivery.so")) + +CallbackType = ffi.callback("void(int, const char*, size_t, void*)") + +class NodeHandle: + def __init__(self, ctx, cb_handle): + self.ctx = ctx + self._cb_handle = cb_handle # keep callback alive + +def logosdelivery_create_node(config: dict, py_callback): + config_json = json.dumps(config, separators=(",", ":"), ensure_ascii=False) + cnfig_bytes = config_json.encode("utf-8") + + def c_cb(ret, char_p, length, userData): + if char_p != ffi.NULL and length : + msg = ffi.buffer(char_p, length)[:] + else : + msg = b"" + py_callback(ret, msg) + + cb_handle = CallbackType(c_cb) + ctx = lib.logosdelivery_create_node( + cnfig_bytes, + cb_handle, + ffi.NULL, + ) + return NodeHandle(ctx, cb_handle) + +if __name__ == "__main__": + config = { + "logLevel": "DEBUG", + "mode": "Core", + "protocolsConfig": { + "entryNodes": [ + "/dns4/node-01.do-ams3.misc.logos-chat.status.im/tcp/30303/p2p/16Uiu2HAkxoqUTud5LUPQBRmkeL2xP4iKx2kaABYXomQRgmLUgf78" + ], + "clusterId": 3, + "autoShardingConfig": {"numShardsInCluster": 8}, + }, + "networkingConfig": { + "listenIpv4": "0.0.0.0", + "p2pTcpPort": 60000, + "discv5UdpPort": 9000, + }, + } + + def cb(ret, msg): + print("ret:", ret) + print("msg:", msg) + + h = logosdelivery_create_node(config, cb) + print("ctx:", h.ctx)