diff --git a/.gitmodules b/.gitmodules
index 242d7cd..f6cf6a9 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
-[submodule "waku-sys/vendor"]
- path = waku-sys/vendor
- url = https://github.com/waku-org/nwaku
+[submodule "waku-sys/vendor/nwaku"]
+ path = waku-sys/vendor/nwaku
+ url = https://github.com/waku-org/nwaku.git
diff --git a/examples/Cargo.lock b/examples/Cargo.lock
index 6ccf393..27d14c5 100644
--- a/examples/Cargo.lock
+++ b/examples/Cargo.lock
@@ -4945,7 +4945,7 @@ checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7"
[[package]]
name = "waku-bindings"
-version = "0.5.0"
+version = "1.0.0"
dependencies = [
"aes-gcm",
"base64 0.21.7",
@@ -4972,7 +4972,7 @@ dependencies = [
[[package]]
name = "waku-sys"
-version = "0.5.0"
+version = "1.0.0"
dependencies = [
"bindgen",
"cc",
diff --git a/waku-sys/Cargo.toml b/waku-sys/Cargo.toml
index 3875135..20729d7 100644
--- a/waku-sys/Cargo.toml
+++ b/waku-sys/Cargo.toml
@@ -13,18 +13,16 @@ repository = "https://github.com/waku-org/waku-rust-bindings"
keywords = ["waku", "peer-to-peer", "libp2p", "networking"]
categories = ["network-programming"]
-exclude = [
- "vendor/examples/*",
- "vendor/docs/*",
- "vendor/coverage/*",
- "vendor/pkg/*",
- "vendor/tests/*",
- "vendor/ci/*",
- "vendor/cmd/*",
- "**/*.md",
- "**/*.lock",
- "**/*.nix",
- "**/Dockerfile",
+include = [
+ "build.rs",
+ "src/cmd.c",
+ "src/lib.rs",
+ "libwaku/libwaku.a",
+ "libwaku/libwaku.h",
+ "libwaku/libbacktrace_wrapper.o",
+ "libwaku/libbacktrace.a",
+ "libwaku/libminiupnpc.a",
+ "libwaku/libnatpmp.a",
]
[lib]
diff --git a/waku-sys/README.md b/waku-sys/README.md
index a7c485e..9b60693 100644
--- a/waku-sys/README.md
+++ b/waku-sys/README.md
@@ -5,7 +5,7 @@
[
](https://docs.rs/waku-sys)
[
](https://github.com/waku-org/waku-rust-bindings/actions/workflows/main.yml?query=branch%3Amaster)
-Rust layer on top of [`go-waku`](https://github.com/status-im/go-waku) [c ffi bindings](https://github.com/status-im/go-waku/blob/v0.2.2/library/README.md).
+Rust layer on top of [`nwaku`](https://github.com/status-im/go-waku) [c ffi bindings](https://github.com/waku-org/nwaku/blob/master/library/libwaku.h).
## Usage
@@ -18,7 +18,6 @@ Add this to your `Cargo.toml`:
waku-sys = "0.1.0"
```
-
## About [Waku](https://waku.org/)
Waku is the communication layer for Web3. Decentralized communication that scales.
@@ -46,6 +45,24 @@ The first version of Waku had its origins in the Whisper protocol, with optimiza
This makes it ideal for running a p2p protocol on mobile, or in other similarly resource-restricted environments.
+Read the [Waku docs](https://docs.wakuconnect.dev/)
+
+## Compile waku-sys crate
+
+The waku-sys crate is a wrapper on top of [nwaku](https://github.com/waku-org/nwaku).
+This has nwaku a submodule within the vendor folder and, we need to manually compile the
+libwaku.a file. The build.rs file assumes the libwaku.a
+already exists.
+
+### Compile libwaku.a
+
+In Linux, do:
+
+```code
+bash build-libwaku.sh
+```
+and that should create the needed files in waku-sys/libwaku folder. Notice that these files should
+be committed in order to create a waku-sys package.
+
-Read the [Waku docs](https://docs.wakuconnect.dev/)
\ No newline at end of file
diff --git a/waku-sys/build-libwaku.sh b/waku-sys/build-libwaku.sh
new file mode 100644
index 0000000..f3fca4b
--- /dev/null
+++ b/waku-sys/build-libwaku.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+## This is needed to manually build libwaku and copy the needed files
+## into the waku-sys/libwaku folder.
+## The waky-sys folder will take the files contained in waku-sys/libwaku/, which are git-versioned.
+
+cd vendor/nwaku/
+
+## Create vendor/nwaku/build/libwaku.a
+make POSTGRES=1 STATIC=true libwaku -j8
+
+echo "Stripping the library"
+## Reduce the libwaku.a size
+strip --strip-debug build/libwaku.a
+
+## Go back to the previous folder
+cd -
+
+echo "Copying generated files to waku-sys/libwaku"
+
+cp vendor/nwaku/build/libwaku.a libwaku/
+cp vendor/nwaku/library/libwaku.h libwaku/
+cp vendor/nwaku/vendor/nim-libbacktrace/libbacktrace_wrapper.o libwaku/
+cp vendor/nwaku/vendor/nim-libbacktrace/install/usr/lib/libbacktrace.a libwaku/
+cp vendor/nwaku/vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc/build/libminiupnpc.a libwaku/
+cp vendor/nwaku/vendor/nim-nat-traversal/vendor/libnatpmp-upstream/libnatpmp.a libwaku/
+
diff --git a/waku-sys/build.rs b/waku-sys/build.rs
index 2183e60..9bbc1cc 100644
--- a/waku-sys/build.rs
+++ b/waku-sys/build.rs
@@ -1,69 +1,29 @@
use std::env;
-use std::env::set_current_dir;
use std::path::{Path, PathBuf};
-use std::process::Command;
extern crate cc;
-fn build_nwaku_lib(project_dir: &Path) {
- let vendor_path = project_dir.join("vendor");
-
- set_current_dir(vendor_path).expect("Moving to vendor dir");
-
- let mut cmd = Command::new("make");
- cmd.arg("libwaku").arg("STATIC=true");
- cmd.status()
- .map_err(|e| println!("cargo:warning=make build failed due to: {e}"))
- .unwrap();
-
- set_current_dir(project_dir).expect("Going back to project dir");
-}
-
fn generate_bindgen_code(project_dir: &Path) {
- let vendor_path = project_dir.join("vendor");
- let header_path = vendor_path.join("library/libwaku.h");
+ let libwaku_path = project_dir.join("libwaku/"); // dir with libs, objects and header
- cc::Build::new()
- .object(
- vendor_path
- .join("vendor/nim-libbacktrace/libbacktrace_wrapper.o")
- .display()
- .to_string(),
- )
- .compile("libbacktrace_wrapper");
-
- println!("cargo:rerun-if-changed={}", header_path.display());
+ println!("cargo:rerun-if-changed={}", libwaku_path.display());
println!(
"cargo:rustc-link-search={}",
- vendor_path.join("build").display()
+ libwaku_path.join("build").display()
);
println!("cargo:rustc-link-lib=static=waku");
- println!(
- "cargo:rustc-link-search={}",
- vendor_path
- .join("vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc/build")
- .display()
- );
+ println!("cargo:rustc-link-search={}", libwaku_path.display());
println!("cargo:rustc-link-lib=static=miniupnpc");
- println!(
- "cargo:rustc-link-search={}",
- vendor_path
- .join("vendor/nim-nat-traversal/vendor/libnatpmp-upstream")
- .display()
- );
+ println!("cargo:rustc-link-search={}", libwaku_path.display());
+
println!("cargo:rustc-link-lib=static=natpmp");
println!("cargo:rustc-link-lib=dl");
println!("cargo:rustc-link-lib=m");
- println!(
- "cargo:rustc-link-search=native={}",
- vendor_path
- .join("vendor/nim-libbacktrace/install/usr/lib")
- .display()
- );
+ println!("cargo:rustc-link-search=native={}", libwaku_path.display());
println!("cargo:rustc-link-lib=static=backtrace");
cc::Build::new()
@@ -75,7 +35,7 @@ fn generate_bindgen_code(project_dir: &Path) {
let bindings = bindgen::Builder::default()
// The input header we would like to generate
// bindings for.
- .header(format!("{}", header_path.display()))
+ .header(format!("{}", libwaku_path.join("libwaku.h").display()))
// Tell cargo to invalidate the built crate whenever any of the
// included header files changed.
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
@@ -93,8 +53,7 @@ fn generate_bindgen_code(project_dir: &Path) {
#[cfg(not(doc))]
fn main() {
+ // Notice that CARGO_MANIFEST_DIR is different depending on "cargo build" or "cargo package"
let project_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
-
- build_nwaku_lib(&project_dir);
generate_bindgen_code(&project_dir);
}
diff --git a/waku-sys/libwaku/libbacktrace.a b/waku-sys/libwaku/libbacktrace.a
new file mode 100644
index 0000000..ed99347
Binary files /dev/null and b/waku-sys/libwaku/libbacktrace.a differ
diff --git a/waku-sys/libwaku/libbacktrace_wrapper.o b/waku-sys/libwaku/libbacktrace_wrapper.o
new file mode 100644
index 0000000..c2b9a73
Binary files /dev/null and b/waku-sys/libwaku/libbacktrace_wrapper.o differ
diff --git a/waku-sys/libwaku/libminiupnpc.a b/waku-sys/libwaku/libminiupnpc.a
new file mode 100644
index 0000000..3dedcf7
Binary files /dev/null and b/waku-sys/libwaku/libminiupnpc.a differ
diff --git a/waku-sys/libwaku/libnatpmp.a b/waku-sys/libwaku/libnatpmp.a
new file mode 100644
index 0000000..2b327dc
Binary files /dev/null and b/waku-sys/libwaku/libnatpmp.a differ
diff --git a/waku-sys/libwaku/libwaku.a b/waku-sys/libwaku/libwaku.a
new file mode 100644
index 0000000..ef61daa
Binary files /dev/null and b/waku-sys/libwaku/libwaku.a differ
diff --git a/waku-sys/libwaku/libwaku.h b/waku-sys/libwaku/libwaku.h
new file mode 100644
index 0000000..bd9b6bf
--- /dev/null
+++ b/waku-sys/libwaku/libwaku.h
@@ -0,0 +1,225 @@
+
+// Generated manually and inspired by the one generated by the Nim Compiler.
+// In order to see the header file generated by Nim just run `make libwaku`
+// from the root repo folder and the header should be created in
+// nimcache/release/libwaku/libwaku.h
+#ifndef __libwaku__
+#define __libwaku__
+
+#include
+#include
+
+// The possible returned values for the functions that return int
+#define RET_OK 0
+#define RET_ERR 1
+#define RET_MISSING_CALLBACK 2
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*WakuCallBack) (int callerRet, const char* msg, size_t len, void* userData);
+
+// Creates a new instance of the waku node.
+// Sets up the waku node from the given configuration.
+// Returns a pointer to the Context needed by the rest of the API functions.
+void* waku_new(
+ const char* configJson,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_start(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_stop(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+// Destroys an instance of a waku node created with waku_new
+int waku_destroy(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_version(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+void waku_set_event_callback(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_content_topic(void* ctx,
+ const char* appName,
+ unsigned int appVersion,
+ const char* contentTopicName,
+ const char* encoding,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_pubsub_topic(void* ctx,
+ const char* topicName,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_default_pubsub_topic(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_relay_publish(void* ctx,
+ const char* pubSubTopic,
+ const char* jsonWakuMessage,
+ unsigned int timeoutMs,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_lightpush_publish(void* ctx,
+ const char* pubSubTopic,
+ const char* jsonWakuMessage,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_relay_subscribe(void* ctx,
+ const char* pubSubTopic,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_relay_add_protected_shard(void* ctx,
+ int clusterId,
+ int shardId,
+ char* publicKey,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_relay_unsubscribe(void* ctx,
+ const char* pubSubTopic,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_filter_subscribe(void* ctx,
+ const char* pubSubTopic,
+ const char* contentTopics,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_filter_unsubscribe(void* ctx,
+ const char* pubSubTopic,
+ const char* contentTopics,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_filter_unsubscribe_all(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_relay_get_num_connected_peers(void* ctx,
+ const char* pubSubTopic,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_relay_get_num_peers_in_mesh(void* ctx,
+ const char* pubSubTopic,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_store_query(void* ctx,
+ const char* jsonQuery,
+ const char* peerAddr,
+ int timeoutMs,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_connect(void* ctx,
+ const char* peerMultiAddr,
+ unsigned int timeoutMs,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_disconnect_peer_by_id(void* ctx,
+ const char* peerId,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_dial_peer(void* ctx,
+ const char* peerMultiAddr,
+ const char* protocol,
+ int timeoutMs,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_dial_peer_by_id(void* ctx,
+ const char* peerId,
+ const char* protocol,
+ int timeoutMs,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_get_peerids_from_peerstore(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_get_peerids_by_protocol(void* ctx,
+ const char* protocol,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_listen_addresses(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_get_connected_peers(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+// Returns a list of multiaddress given a url to a DNS discoverable ENR tree
+// Parameters
+// char* entTreeUrl: URL containing a discoverable ENR tree
+// char* nameDnsServer: The nameserver to resolve the ENR tree url.
+// int timeoutMs: Timeout value in milliseconds to execute the call.
+int waku_dns_discovery(void* ctx,
+ const char* entTreeUrl,
+ const char* nameDnsServer,
+ int timeoutMs,
+ WakuCallBack callback,
+ void* userData);
+
+// Updates the bootnode list used for discovering new peers via DiscoveryV5
+// bootnodes - JSON array containing the bootnode ENRs i.e. `["enr:...", "enr:..."]`
+int waku_discv5_update_bootnodes(void* ctx,
+ char* bootnodes,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_start_discv5(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_stop_discv5(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+// Retrieves the ENR information
+int waku_get_my_enr(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_get_my_peerid(void* ctx,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_peer_exchange_request(void* ctx,
+ int numPeers,
+ WakuCallBack callback,
+ void* userData);
+
+int waku_ping_peer(void* ctx,
+ const char* peerAddr,
+ int timeoutMs,
+ WakuCallBack callback,
+ void* userData);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __libwaku__ */
diff --git a/waku-sys/vendor b/waku-sys/vendor
deleted file mode 160000
index 625c8ee..0000000
--- a/waku-sys/vendor
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 625c8ee51bc3e065da0e2e8d3a53d3634589f548
diff --git a/waku-sys/vendor/nwaku b/waku-sys/vendor/nwaku
new file mode 160000
index 0000000..9c0ad85
--- /dev/null
+++ b/waku-sys/vendor/nwaku
@@ -0,0 +1 @@
+Subproject commit 9c0ad85179c35a94096347d17eee7c933f542069