nwaku/examples/python/waku.py

154 lines
5.9 KiB
Python

from flask import Flask
import ctypes
import argparse
libwaku = object
try:
# This python script should be run from the root repo folder
libwaku = ctypes.CDLL("build/libwaku.so")
except Exception as e:
print("Exception: ", e)
print("""
The 'libwaku.so' library can be created with the next command from
the repo's root folder: `make libwaku`.
And it should build the library in 'build/libwaku.so'.
Therefore, make sure the LD_LIBRARY_PATH env var points at the location that
contains the 'libwaku.so' library.
""")
exit(-1)
def handle_event(ret, msg, user_data):
print("Event received: %s" % msg)
def call_waku(func):
ret = func()
if (ret != 0):
print("Error in %s. Error code: %d" % (locals().keys(), ret))
exit(1)
# Parse params
parser = argparse.ArgumentParser(description='libwaku integration in Python.')
parser.add_argument('-d', '--host', dest='host', default='0.0.0.0',
help='Address this node will listen to. [=0.0.0.0]')
parser.add_argument('-p', '--port', dest='port', default=60000, required=True,
help='Port this node will listen to. [=60000]')
parser.add_argument('-k', '--key', dest='key', default="", required=True,
help="""P2P node private key as 64 char hex string.
e.g.: 364d111d729a6eb6d2e6113e163f017b5ef03a6f94c9b5b7bb1bb36fa5cb07a9""")
parser.add_argument('-r', '--relay', dest='relay', default="true",
help="Enable relay protocol: true|false [=true]")
parser.add_argument('--peer', dest='peer', default="",
help="Multiqualified libp2p address")
args = parser.parse_args()
# The next 'json_config' is the item passed to the 'waku_new'.
json_config = "{ \
\"host\": \"%s\", \
\"port\": %d, \
\"key\": \"%s\", \
\"relay\": %s \
}" % (args.host,
int(args.port),
args.key,
"true" if args.relay else "false")
callback_type = ctypes.CFUNCTYPE(None, ctypes.c_int, ctypes.c_char_p, ctypes.c_size_t)
# Node creation
libwaku.waku_new.restype = ctypes.c_void_p
libwaku.waku_new.argtypes = [ctypes.c_char_p,
callback_type,
ctypes.c_void_p]
ctx = libwaku.waku_new(bytes(json_config, 'utf-8'),
callback_type(
#onErrCb
lambda ret, msg, len:
print("Error calling waku_new: %s",
msg.decode('utf-8'))
),
ctypes.c_void_p(0))
# Retrieve the current version of the library
libwaku.waku_version.argtypes = [ctypes.c_void_p,
callback_type,
ctypes.c_void_p]
libwaku.waku_version(ctx,
callback_type(lambda ret, msg, len:
print("Git Version: %s" %
msg.decode('utf-8'))),
ctypes.c_void_p(0))
# Retrieve the default pubsub topic
default_pubsub_topic = ""
libwaku.waku_default_pubsub_topic.argtypes = [ctypes.c_void_p,
callback_type,
ctypes.c_void_p]
libwaku.waku_default_pubsub_topic(ctx,
callback_type(
lambda ret, msg, len: (
globals().update(default_pubsub_topic = msg.decode('utf-8')),
print("Default pubsub topic: %s" % msg.decode('utf-8')))
),
ctypes.c_void_p(0))
print("Bind addr: {}:{}".format(args.host, args.port))
print("Waku Relay enabled: {}".format(args.relay))
# Set the event callback
callback = callback_type(handle_event) # This line is important so that the callback is not gc'ed
libwaku.waku_set_event_callback.argtypes = [callback_type, ctypes.c_void_p]
libwaku.waku_set_event_callback(callback, ctypes.c_void_p(0))
# Start the node
libwaku.waku_start.argtypes = [ctypes.c_void_p,
callback_type,
ctypes.c_void_p]
libwaku.waku_start(ctx,
callback_type(lambda ret, msg, len:
print("Error in waku_start: %s" %
msg.decode('utf-8'))),
ctypes.c_void_p(0))
# Subscribe to the default pubsub topic
libwaku.waku_relay_subscribe.argtypes = [ctypes.c_void_p,
ctypes.c_char_p,
callback_type,
ctypes.c_void_p]
libwaku.waku_relay_subscribe(ctx,
default_pubsub_topic.encode('utf-8'),
callback_type(
#onErrCb
lambda ret, msg, len:
print("Error calling waku_relay_subscribe: %s" %
msg.decode('utf-8'))
),
ctypes.c_void_p(0))
libwaku.waku_connect.argtypes = [ctypes.c_void_p,
ctypes.c_char_p,
ctypes.c_int,
callback_type,
ctypes.c_void_p]
libwaku.waku_connect(ctx,
args.peer.encode('utf-8'),
10000,
# onErrCb
callback_type(
lambda ret, msg, len:
print("Error calling waku_connect: %s" % msg.decode('utf-8'))),
ctypes.c_void_p(0))
# app = Flask(__name__)
# @app.route("/")
# def hello_world():
# return "Hello, World!"
# Simply avoid the app to
a = input()