fix(c-bindings): userdata (#785)

This commit is contained in:
richΛrd 2023-10-28 19:37:53 -04:00 committed by GitHub
parent fc3b2f76d5
commit db222a24ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 557 additions and 453 deletions

View File

@ -1,41 +1,52 @@
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>
#include "main.h"
#include "base64.h"
#include "libgowaku.h"
#include "nxjson.c"
#include "base64.h"
#include "main.h"
#include <inttypes.h>
#include <unistd.h>
char *alicePrivKey = "0x4f012057e1a1458ce34189cb27daedbbe434f3df0825c1949475dec786e2c64e";
char *alicePubKey = "0x0440f05847c4c7166f57ae8ecaaf72d31bddcbca345e26713ca9e26c93fb8362ddcd5ae7f4533ee956428ad08a89cd18b234c2911a3b1c7fbd1c0047610d987302";
char *alicePrivKey =
"0x4f012057e1a1458ce34189cb27daedbbe434f3df0825c1949475dec786e2c64e";
char *alicePubKey =
"0x0440f05847c4c7166f57ae8ecaaf72d31bddcbca345e26713ca9e26c93fb8362ddcd5ae7"
"f4533ee956428ad08a89cd18b234c2911a3b1c7fbd1c0047610d987302";
char *bobPrivKey = "0xb91d6b2df8fb6ef8b53b51b2b30a408c49d5e2b530502d58ac8f94e5c5de1453";
char *bobPubKey = "0x045eef61a98ba1cf44a2736fac91183ea2bd86e67de20fe4bff467a71249a8a0c05f795dd7f28ced7c15eaa69c89d4212cc4f526ca5e9a62e88008f506d850cccd";
char *bobPrivKey =
"0xb91d6b2df8fb6ef8b53b51b2b30a408c49d5e2b530502d58ac8f94e5c5de1453";
char *bobPubKey =
"0x045eef61a98ba1cf44a2736fac91183ea2bd86e67de20fe4bff467a71249a8a0c05f795d"
"d7f28ced7c15eaa69c89d4212cc4f526ca5e9a62e88008f506d850cccd";
void on_error(int ret, const char *result, void *user_data) {
if (ret == 0) {
return;
}
char* result = NULL;
char* contentTopic;
void handle_ok(const char* msg, size_t len) {
if (result != NULL) {
free(result);
}
result = malloc(len * sizeof(char) + 1);
strcpy(result, msg);
printf("function execution failed. Returned code: %d\n", ret);
exit(1);
}
void handle_error(const char* msg, size_t len) {
printf("Error: %s\n", msg);
void on_response(int ret, const char *result, void *user_data) {
if (ret != 0) {
printf("function execution failed. Returned code: %d\n", ret);
exit(1);
}
if (user_data == NULL)
return;
char **data_ref = (char **)user_data;
size_t len = strlen(result);
if (*data_ref != NULL)
free(*data_ref);
*data_ref = malloc(len * sizeof(char) + 1);
strcpy(*data_ref, result);
}
void callBack(const char* signal, size_t len_0)
{
void callBack(int ret, const char *signal, void *user_data) {
// This callback will be executed each time a new message is received
// Example signal:
@ -54,32 +65,43 @@ void callBack(const char* signal, size_t len_0)
}
}*/
const nx_json *json = nx_json_parse((char*) signal, 0);
if (ret != 0) {
printf("function execution failed. Returned code: %d\n", ret);
exit(1);
}
const nx_json *json = nx_json_parse((char *)signal, 0);
const char *type = nx_json_get(json, "type")->text_value;
if (strcmp(type, "message") == 0)
{
const nx_json *wakuMsgJson = nx_json_get(nx_json_get(json, "event"), "wakuMessage");
const char *contentTopic = nx_json_get(wakuMsgJson, "contentTopic")->text_value;
if (strcmp(type, "message") == 0) {
const nx_json *wakuMsgJson =
nx_json_get(nx_json_get(json, "event"), "wakuMessage");
const char *contentTopic =
nx_json_get(wakuMsgJson, "contentTopic")->text_value;
if (strcmp(contentTopic, contentTopic) == 0)
{
char* msg = utils_extract_wakumessage_from_signal(wakuMsgJson);
WAKU_CALL(waku_decode_asymmetric(msg, bobPrivKey, handle_ok, handle_error));
if (strcmp(contentTopic, "/example/1/default/rfc26") == 0) {
char *msg = utils_extract_wakumessage_from_signal(wakuMsgJson);
char *decodedMsg = strdup(result);
// Decode a message using asymmetric encryption
char *decodedMsg = NULL;
waku_decode_asymmetric(msg, bobPrivKey, on_response, (void *)&decodedMsg);
const nx_json *dataJson = nx_json_parse(decodedMsg, 0);
const char *pubkey = nx_json_get(dataJson, "pubkey")->text_value;
const char *base64data = nx_json_get(dataJson, "data")->text_value;
size_t data_len = b64_decoded_size(base64data);
char *data = malloc(data_len);
b64_decode(base64data, (unsigned char *)data, data_len) ;
unsigned char *data = malloc(data_len);
b64_decode(base64data, data, data_len);
printf(">>> Received \"%s\" from %s\n", data, pubkey);
free(msg);
free(decodedMsg);
free(data);
fflush(stdout);
}
}
@ -87,79 +109,113 @@ void callBack(const char* signal, size_t len_0)
nx_json_free(json);
}
int main(int argc, char *argv[])
{
int main(int argc, char *argv[]) {
// Set callback to be executed each time a message is received
waku_set_event_callback(callBack);
char *configJSON = "{\"host\": \"0.0.0.0\", \"port\": 60000, \"logLevel\":\"error\", \"store\":true}";
WAKU_CALL( waku_new(configJSON, handle_error) ); // configJSON can be NULL too to use defaults
// configJSON can be NULL too to use defaults. Any value not defined will have
// a default set
char *configJSON = "{\"host\": \"0.0.0.0\", \"port\": 60000, "
"\"logLevel\":\"error\", \"store\":true}";
waku_new(configJSON, on_error, NULL);
WAKU_CALL(waku_start(handle_error) ); // Start the node, enabling the waku protocols
// Start the node, enabling the waku protocols
waku_start(on_error, NULL);
WAKU_CALL(waku_peerid(handle_ok, handle_error)); // Obtain the node peerID
char *peerID = strdup(result);
printf("PeerID: %s\n", result);
// Obtain the node's peerID
char *peerID = NULL;
waku_peerid(on_response, (void *)&peerID);
printf("PeerID: %s\n", peerID);
WAKU_CALL(waku_content_topic("example", 1, "default", "rfc26", handle_ok));
contentTopic = strdup(result);
WAKU_CALL(waku_connect("/dns4/node-01.gc-us-central1-a.wakuv2.test.statusim.net/tcp/30303/p2p/16Uiu2HAmJb2e28qLXxT5kZxVUUoJt72EMzNGXB47Rxx5hw3q4YjS", 0, handle_error)); // Connect to a node
// Obtain the node's multiaddresses
char *addresses = NULL;
waku_listen_addresses(on_response, (void *)&addresses);
printf("Addresses: %s\n", addresses);
// Build a content topic
char *contentTopic = NULL;
waku_content_topic("example", 1, "default", "rfc26", on_response,
(void *)&contentTopic);
printf("Content Topic: %s\n", contentTopic);
// Obtain the default pubsub topic
char *defaultPubsubTopic = NULL;
waku_default_pubsub_topic(on_response, (void *)&defaultPubsubTopic);
printf("Default pubsub topic: %s\n", defaultPubsubTopic);
// To use dns discovery, and retrieve nodes from a enrtree url
WAKU_CALL( waku_dns_discovery("enrtree://AO47IDOLBKH72HIZZOXQP6NMRESAN7CHYWIBNXDXWRJRZWLODKII6@test.wakuv2.nodes.status.im", "", 0, handle_ok, handle_error)); // Discover Nodes
printf("Discovered nodes: %s\n", result);
WAKU_CALL(waku_default_pubsub_topic(handle_ok));
char *pubsubTopic = strdup(result);
printf("Default pubsub topic: %s\n", pubsubTopic);
char *discoveredNodes = NULL;
waku_dns_discovery("enrtree://"
"AOGECG2SPND25EEFMAJ5WF3KSGJNSGV356DSTL2YVLLZWIV"
"6SAYBM@test.waku.nodes.status.im",
"", 0, on_response, (void *)&discoveredNodes);
printf("Discovered nodes: %s\n", discoveredNodes);
// Connect to a node
waku_connect("/dns4/node-01.do-ams3.wakuv2.test.statusim.net/tcp/30303/"
"p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ",
0, on_response, NULL);
// To see a store query in action:
/*
char query[1000];
sprintf(query, "{\"pubsubTopic\":\"%s\", \"pagingOptions\":{\"pageSize\": 40, \"forward\":false}}", pubsubTopic);
WAKU_CALL(waku_store_query(query, NULL, 0, handle_ok, handle_error));
printf("%s\n",result);
*/
WAKU_CALL( waku_relay_subscribe(NULL, handle_error));
// char query[1000];
// sprintf(query,
// "{\"pubsubTopic\":\"%s\", \"pagingOptions\":{\"pageSize\": 40, "
// "\"forward\":false}}",
// pubsubTopic);
// char *query_result = NULL;
// waku_store_query(query, NULL, 0, on_response, (void*)&query_result);
// printf("%s\n", query_result);
char contentFilter[1000];
sprintf(contentFilter,
"{\"pubsubTopic\":\"%s\",\"contentTopics\":[\"%s\"]}",
defaultPubsubTopic, contentTopic);
waku_relay_subscribe(contentFilter, on_error, NULL);
int i = 0;
int version = 1;
while (i < 5)
{
while (i < 5) {
i++;
char wakuMsg[1000];
char *msgPayload = b64_encode("Hello World!", 12);
unsigned char plain_text[] = "Hello World!";
char *msgPayload = b64_encode(&plain_text[0], 12);
sprintf(wakuMsg, "{\"payload\":\"%s\",\"contentTopic\":\"%s\",\"timestamp\":%"PRIu64"}", msgPayload, contentTopic, nowInNanosecs());
// Build the waku message
sprintf(wakuMsg,
"{\"payload\":\"%s\",\"contentTopic\":\"%s\",\"timestamp\":%" PRIu64
"}",
msgPayload, contentTopic, nowInNanosecs());
free(msgPayload);
// Use asymmetric encryption to encrypt the waku message
char *encodedMessage = NULL;
waku_encode_asymmetric(wakuMsg, bobPubKey, alicePrivKey, on_response,
(void *)&encodedMessage);
WAKU_CALL(waku_encode_asymmetric(wakuMsg, bobPubKey, alicePrivKey, handle_ok, handle_error));
char *encodedMessage = strdup(result);
WAKU_CALL(waku_relay_publish(encodedMessage, NULL, 0, handle_ok, handle_error)); // Broadcast via waku relay
printf("C\n");
char *messageID = strdup(result);
printf("MessageID: %s\n",messageID);
free(messageID);
// Broadcast via waku relay
char *messageID = NULL;
waku_relay_publish(encodedMessage, defaultPubsubTopic, 0, on_response,
(void *)&messageID);
printf("MessageID: %s\n", messageID);
sleep(1);
}
// To retrieve messages from local store, set store:true in the node config, and use waku_store_local_query
/*
char query[1000];
sprintf(query, "{\"pubsubTopic\":\"%s\", \"pagingOptions\":{\"pageSize\": 40, \"forward\":false}}", pubsubTopic);
WAKU_CALL(waku_store_local_query(query, handle_ok, handle_error));
printf("%s\n",result);
*/
// To retrieve messages from local store, set store:true in the node
// config, and use waku_store_local_query
// char query2[1000];
// sprintf(query2,
// "{\"pubsubTopic\":\"%s\", \"pagingOptions\":{\"pageSize\": 40, "
// "\"forward\":false}}",
// pubsubTopic);
// char *local_result = NULL;
// waku_store_local_query(query2, on_response, (void*)&local_result);
// printf("%s\n", local_result);
// Stop the node's execution
waku_stop(on_response, NULL);
// TODO: free all char*
WAKU_CALL(waku_stop(handle_error));
return 0;
}

View File

@ -2,6 +2,8 @@
#define MAIN_H
#include <stdbool.h>
#include <time.h>
#include <stdint.h>
#include "nxjson.c"
/// Convert seconds to nanoseconds

View File

@ -23,10 +23,10 @@ consume them.
All the API functions require passing callbacks which will be executed depending on the result of the execution result.
These callbacks are defined as
```c
typedef void (*WakuCallBack) (const char* msg, size_t len_0);
typedef void (*WakuCallBack) (int ret_code, const char* msg, void * user_data);
```
With `msg` containing a `\0` terminated string, and `len_0` the length of this string. The format of the data sent to these callbacks
will depend on the function being executed. The data can be characters, numeric or json.
With ret_code containing a status code indicating the execution result, `msg` containing a `\0` terminated string. The format of the data sent to these callbacks will depend on the function being executed. The data for succesful results can be characters, numeric or json.
If the function being invoked returns an error, `msg` will contain the error string.
### Status Codes
The API functions return an integer with status codes depending on the execution result. The following status codes are defined:
@ -74,21 +74,21 @@ Fields:
- `data`: Decrypted message payload base64 encoded,
- `padding`: Padding base64 encoded.
### `FilterSubscription` type
### `ContentFilter` type
The criteria to create subscription to a filter full node in JSON Format:
The criteria to create subscription in relay protocol or to a filter full node in JSON Format:
```ts
{
contentTopics: string[];
pubsubTopic: string;
pubsubTopic?: string;
}
```
Fields:
- `contentTopics`: Array of content topics.
- `topic`: Optional pubsub topic when using contentTopics as per Autosharding. In case of named or static-sharding, pubSub topic is mandatory.
- `pubsubTopic`: Optional pubsub topic when using contentTopics as per Autosharding. In case of named or static-sharding, pubSub topic is mandatory.
### `LegacyFilterSubscription` type
@ -97,18 +97,18 @@ The criteria to create subscription to a filter full node in JSON Format:
```ts
{
contentFilters: ContentFilter[];
contentFilters: LegacyContentFilter[];
pubsubTopic: string?;
}
```
Fields:
- `contentFilters`: Array of [`ContentFilter`](#contentfilter-type) being subscribed to / unsubscribed from.
- `contentFilters`: Array of [`LegacyContentFilter`](#legacycontentfilter-type) being subscribed to / unsubscribed from.
- `topic`: Optional pubsub topic.
### `ContentFilter` type
### `LegacyContentFilter` type
```ts
{
@ -127,7 +127,7 @@ Criteria used to retrieve historical messages
```ts
interface StoreQuery {
pubsubTopic?: string;
contentFilters?: ContentFilter[];
contentTopics: string[];
startTime?: number;
endTime?: number;
pagingOptions?: PagingOptions
@ -137,7 +137,7 @@ interface StoreQuery {
Fields:
- `pubsubTopic`: The pubsub topic on which messages are published.
- `contentFilters`: Array of [`ContentFilter`](#contentfilter-type) to query for historical messages,
- `contentTOpics`: Array of content topics to query for historical messages,
- `startTime`: The inclusive lower bound on the timestamp of queried messages. This field holds the Unix epoch time in nanoseconds.
- `endTime`: The inclusive upper bound on the timestamp of queried messages. This field holds the Unix epoch time in nanoseconds.
- `pagingOptions`: Paging information in [`PagingOptions`](#pagingoptions-type) format.
@ -216,7 +216,6 @@ For example:
{
"type": "message",
"event": {
"subscriptionId": 1,
"pubsubTopic": "/waku/2/default-waku/proto",
"messageId": "0x6496491e40dbe0b6c3a2198c2426b16301688a2daebc4f57ad7706115eac3ad1",
"wakuMessage": {
@ -249,15 +248,15 @@ Type of `event` field for a `message` event:
- `messageId`: The message id.
- `wakuMessage`: The message in [`JsonMessage`](#jsonmessage-type) format.
### `extern void waku_set_event_callback(void* cb)`
### `extern void waku_set_event_callback(WakuCallBack cb)`
Register callback to act as event handler and receive application signals,
which are used to react to asynchronous events in Waku.
**Parameters**
1. `void* cb`: callback that will be executed when an async event is emitted.
The function signature for the callback should be `void myCallback(char* jsonSignal)`
1. `WakuCallBack cb`: callback that will be executed when an async event is emitted.
The function signature for the callback should be `void myCallback(char* signal, void * user_data)`
## Node management
@ -481,7 +480,7 @@ If a key is `undefined`, or `null`, a default value will be set. If using `secur
- `keyPath`: secure websocket key path
### `extern int waku_new(char* jsonConfig, WakuCallBack onErrCb)`
### `extern int waku_new(char* jsonConfig, WakuCallBack onErrCb void* userData)`
Instantiates a Waku node.
@ -491,69 +490,72 @@ Instantiates a Waku node.
Type [`JsonConfig`](#jsonconfig-type).
It can be `NULL` to use defaults.
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_start(WakuCallBack onErrCb)`
### `extern int waku_start(WakuCallBack onErrCb void* userData)`
Start a Waku node mounting all the protocols that were enabled during the Waku node instantiation.
**Parameters**
1. `WakuCallBack onErrCb`: callback to be executed if the function fails
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_stop(WakuCallBack onErrCb)`
### `extern int waku_stop(WakuCallBack onErrCb void* userData)`
Stops a Waku node.
**Parameters**
1. `WakuCallBack onErrCb`: callback to be executed if the function fails
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_peerid(WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_peerid(WakuCallBack cb, void* userData)`
Get the peer ID of the waku node.
**Parameters**
1. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
1. `WakuCallBack cb`: callback to be executed.
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the base58 encoded peer ID, for example `QmWjHKUrXDHPCwoWXpUZ77E8o6UbAoTTZwf1AD1tDC4KNP`.
If the function is executed succesfully, `onOkCb` will receive the base58 encoded peer ID, for example `QmWjHKUrXDHPCwoWXpUZ77E8o6UbAoTTZwf1AD1tDC4KNP`
### `extern int waku_listen_addresses(WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_listen_addresses(WakuCallBack cb, void* userData)`
Get the multiaddresses the Waku node is listening to.
**Parameters**
1. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
1. `WakuCallBack cb`: callback to be executed
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive a json array of multiaddresses.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive a json array of multiaddresses.
The multiaddresses are `string`s.
For example:
```json
[
"/ip4/127.0.0.1/tcp/30303",
@ -565,7 +567,7 @@ For example:
## Connecting to peers
### `extern int waku_add_peer(char* address, char* protocolId, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_add_peer(char* address, char* protocolId, WakuCallBack cb, void* userData)`
Add a node multiaddress and protocol to the waku node's peerstore.
@ -573,18 +575,17 @@ Add a node multiaddress and protocol to the waku node's peerstore.
1. `char* address`: A multiaddress (with peer id) to reach the peer being added.
2. `char* protocolId`: A protocol we expect the peer to support.
3. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
4. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `WakuCallBack cb`: callback to be executed
4. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive the base 58 peer ID of the peer that was added.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the base 58 peer ID of the peer that was added.
For example: `QmWjHKUrXDHPCwoWXpUZ77E8o6UbAoTTZwf1AD1tDC4KNP`
### `extern int waku_connect(char* address, int timeoutMs, WakuCallBack onErrCb)`
### `extern int waku_connect(char* address, int timeoutMs, WakuCallBack onErrCb void* userData)`
Dial peer using a multiaddress.
@ -596,12 +597,13 @@ Dial peer using a multiaddress.
the execution will be canceled and an error returned.
Use `0` for no timeout.
3. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_connect_peerid(char* peerId, int timeoutMs, WakuCallBack onErrCb)`
### `extern int waku_connect_peerid(char* peerId, int timeoutMs, WakuCallBack onErrCb void* userData)`
Dial peer using its peer ID.
@ -616,12 +618,13 @@ Dial peer using its peer ID.
the execution will be canceled and an error returned.
Use `0` for no timeout.
3. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_disconnect(char* peerId, WakuCallBack onErrCb)`
### `extern int waku_disconnect(char* peerId, WakuCallBack onErrCb void* userData)`
Disconnect a peer using its peerID
@ -629,39 +632,40 @@ Disconnect a peer using its peerID
1. `char* peerID`: Peer ID to disconnect.
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_peer_cnt(WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_peer_cnt(WakuCallBack cb, void* userData)`
Get number of connected peers.
**Parameters**
1. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
1. `WakuCallBack cb`: callback to be executed
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the number of connected peers.
If the function is executed succesfully, `onOkCb` will receive the number of connected peers.
### `extern int waku_peers(WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_peers(WakuCallBack cb, void* userData)`
Retrieve the list of peers known by the Waku node.
**Parameters**
1. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
1. `WakuCallBack cb`: callback to be executed if the function is succesful
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive a json array with the list of peers.
This list has this format:
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive a json array with the list of peers.
The list of peers has this format:
```json
[
@ -682,7 +686,7 @@ This list has this format:
## Waku Relay
### `extern int waku_content_topic(char* applicationName, unsigned int applicationVersion, char* contentTopicName, char* encoding, WakuCallBack onOkCb)`
### `extern int waku_content_topic(char* applicationName, unsigned int applicationVersion, char* contentTopicName, char* encoding, WakuCallBack onOkCb void* userData)`
Create a content topic string according to [RFC 23](https://rfc.vac.dev/spec/23/).
@ -693,6 +697,7 @@ Create a content topic string according to [RFC 23](https://rfc.vac.dev/spec/23/
3. `char* contentTopicName`
4. `char* encoding`: depending on the payload, use `proto`, `rlp` or `rfc26`
5. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
6. `void* userData`: used to pass custom information to the callback function
**Returns**
@ -704,7 +709,7 @@ If the function is executed succesfully, `onOkCb` will receive the content topic
/{application-name}/{version-of-the-application}/{content-topic-name}/{encoding}
```
### `extern int waku_pubsub_topic(char* name, char* encoding, WakuCallBack onOkCb)`
### `extern int waku_pubsub_topic(char* name, char* encoding, WakuCallBack onOkCb, void* userData)`
Create a pubsub topic string according to [RFC 23](https://rfc.vac.dev/spec/23/).
@ -713,6 +718,7 @@ Create a pubsub topic string according to [RFC 23](https://rfc.vac.dev/spec/23/)
1. `char* name`
2. `char* encoding`: depending on the payload, use `proto`, `rlp` or `rfc26`
3. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
4. `void* userData`: used to pass custom information to the callback function
**Returns**
@ -724,7 +730,7 @@ If the function is executed succesfully, `onOkCb` will receive the pubsub topic
/waku/2/{topic-name}/{encoding}
```
### `extern int waku_default_pubsub_topic(WakuCallBack onOkCb)`
### `extern int waku_default_pubsub_topic(WakuCallBack onOkCb void* userData)`
Returns the default pubsub topic used for exchanging waku messages defined in [RFC 10](https://rfc.vac.dev/spec/10/).
@ -734,6 +740,7 @@ Returns the default pubsub topic used for exchanging waku messages defined in [R
1. `char* name`
2. `char* encoding`: depending on the payload, use `proto`, `rlp` or `rfc26`
3. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
4. `void* userData`: used to pass custom information to the callback function
**Returns**
@ -741,8 +748,7 @@ A status code. Refer to the [`Status codes`](#status-codes) section for possible
If the function is executed succesfully, `onOkCb` will receive the default pubsub topic: `/waku/2/default-waku/proto`
### `extern int waku_relay_publish(char* messageJson, char* pubsubTopic, int timeoutMs, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_relay_publish(char* messageJson, char* pubsubTopic, int timeoutMs, WakuCallBack cb, void* userData)`
Publish a message using Waku Relay.
@ -750,23 +756,21 @@ Publish a message using Waku Relay.
1. `char* messageJson`: JSON string containing the [Waku Message](https://rfc.vac.dev/spec/14/) as [`JsonMessage`](#jsonmessage-type).
2. `char* pubsubTopic`: pubsub topic on which to publish the message.
If `NULL`, it uses the default pubsub topic.
If `NULL`, it derives the pubsub topic from content-topic based on autosharding.
3. `int timeoutMs`: Timeout value in milliseconds to execute the call.
If the function execution takes longer than this value,
the execution will be canceled and an error returned.
Use `0` for no timeout.
4. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
5. `WakuCallBack onErrCb`: callback to be executed if the function fails
Note: `messageJson.version` is overwritten to `0`.
4. `WakuCallBack cb`: callback to be executed
5. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `onOkCb` will receive the message ID.
### `extern int waku_relay_enough_peers(char* pubsubTopic, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_relay_enough_peers(char* pubsubTopic, WakuCallBack cb, void* userData)`
Determine if there are enough peers to publish a message on a given pubsub topic.
@ -774,42 +778,42 @@ Determine if there are enough peers to publish a message on a given pubsub topic
1. `char* pubsubTopic`: Pubsub topic to verify.
If `NULL`, it verifies the number of peers in the default pubsub topic.
2. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
3. `WakuCallBack onErrCb`: callback to be executed if the function fails
2. `WakuCallBack cb`: callback to be executed
3. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `onOkCb` will receive a string `boolean` indicating whether there are enough peers, i.e. `true` or `false`
### `extern int waku_relay_subscribe(char* topic, WakuCallBack onErrCb)`
### `extern int waku_relay_subscribe(char* filterJSON, WakuCallBack onErrCb, void* userData)`
Subscribe to a Waku Relay pubsub topic to receive messages.
**Parameters**
1. `char* topic`: Pubsub topic to subscribe to.
If `NULL`, it subscribes to the default pubsub topic.
1. `char* filterJSON`: JSON string containing the [`ContentFilter`](#contentfilter-type) with the criteria of the messages to receive
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_relay_topics(WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_relay_topics(WakuCallBack cb, void* userData)`
Get the list of subscribed pubsub topics in Waku Relay.
**Parameters**
1. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
1. `WakuCallBack cb`: callback to be executed
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive a json array of pubsub topics.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive a json array of pubsub topics.
For example:
@ -843,16 +847,16 @@ For Example:
}
```
### `extern int waku_relay_unsubscribe(char* topic, WakuCallBack onErrCb)`
### `extern int waku_relay_unsubscribe(char* filterJSON, WakuCallBack onErrCb, void* userData)`
Closes the pubsub subscription to a pubsub topic. No more messages will be received
Closes the pubsub subscription to pubsub topic matching a criteria. No more messages will be received
from this pubsub topic.
**Parameters**
1. `char* pusubTopic`: Pubsub topic to unsubscribe from.
If `NULL`, unsubscribes from the default pubsub topic.
1. `char* filterJSON`: JSON string containing the [`ContentFilter`](#contentfilter-type) with the criteria of the messages to unsubscribe from
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `void* userData`: used to pass custom information to the callback function
**Returns**
@ -861,13 +865,13 @@ A status code. Refer to the [`Status codes`](#status-codes) section for possible
## Waku Filter
### `extern int waku_filter_subscribe(char* filterJSON, char* peerID, int timeoutMs, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_filter_subscribe(char* filterJSON, char* peerID, int timeoutMs, WakuCallBack cb, void* userData)`
Creates a subscription to a filter full node matching a content filter..
**Parameters**
1. `char* filterJSON`: JSON string containing the [`FilterSubscription`](#filtersubscription-type) to subscribe to.
1. `char* filterJSON`: JSON string containing the [`ContentFilter`](#contentfilter-type) with the criteria of the messages to receive
2. `char* peerID`: Peer ID to subscribe to.
The peer must be already known.
It must have been added before with [`waku_add_peer`](#extern-char-waku_add_peerchar-address-char-protocolid)
@ -877,14 +881,14 @@ Creates a subscription to a filter full node matching a content filter..
If the function execution takes longer than this value,
the execution will be canceled and an error returned.
Use `0` for no timeout.
4. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
5. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `WakuCallBack cb`: callback to be executed
5. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive the following subscription details along with any partial errors.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the following subscription details along with any partial errors.
For example:
@ -928,7 +932,7 @@ For Example:
```
### `extern int waku_filter_ping(char* peerID, int timeoutMs, WakuCallBack onErrCb)`
### `extern int waku_filter_ping(char* peerID, int timeoutMs, WakuCallBack onErrCb, void* userData)`
Used to know if a service node has an active subscription for this client
@ -943,13 +947,14 @@ Used to know if a service node has an active subscription for this client
the execution will be canceled and an error returned.
Use `0` for no timeout.
3. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_filter_unsubscribe(filterJSON *C.char, char* peerID, int timeoutMs, WakuCallBack onErrCb)`
### `extern int waku_filter_unsubscribe(filterJSON *C.char, char* peerID, int timeoutMs, WakuCallBack onErrCb, void* userData)`
Sends a requests to a service node to stop pushing messages matching this filter to this client. It might be used to modify an existing subscription by providing a subset of the original filter criteria
**Parameters**
@ -964,13 +969,14 @@ Sends a requests to a service node to stop pushing messages matching this filter
the execution will be canceled and an error returned.
Use `0` for no timeout.
4. `WakuCallBack onErrCb`: callback to be executed if the function fails
5. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
### `extern int waku_filter_unsubscribe_all(char* peerID, int timeoutMs, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_filter_unsubscribe_all(char* peerID, int timeoutMs, WakuCallBack cb, void* userData)`
Sends a requests to a service node (or all service nodes) to stop pushing messages
@ -985,14 +991,14 @@ Sends a requests to a service node (or all service nodes) to stop pushing messag
If the function execution takes longer than this value,
the execution will be canceled and an error returned.
Use `0` for no timeout.
3. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
4. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `WakuCallBack cb`: callback to be executed
4. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive an array with information about the state of each unsubscription attempt (one per peer)
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive an array with information about the state of each unsubscription attempt (one per peer)
For example:
@ -1009,7 +1015,7 @@ For example:
## Waku Legacy Filter
### `extern int waku_legacy_filter_subscribe(char* filterJSON, char* peerID, int timeoutMs, WakuCallBack onErrCb)`
### `extern int waku_legacy_filter_subscribe(char* filterJSON, char* peerID, int timeoutMs, WakuCallBack onErrCb, void* userData)`
Creates a subscription in a lightnode for messages that matches a content filter and optionally a [PubSub `topic`](https://github.com/libp2p/specs/blob/master/pubsub/README.md#the-topic-descriptor).
@ -1026,6 +1032,7 @@ Creates a subscription in a lightnode for messages that matches a content filter
the execution will be canceled and an error returned.
Use `0` for no timeout.
4. `WakuCallBack onErrCb`: callback to be executed if the function fails
5. `void* userData`: used to pass custom information to the callback function
**Returns**
@ -1056,7 +1063,7 @@ For Example:
}
```
### `extern int waku_legacy_filter_unsubscribe(char* filterJSON, int timeoutMs, WakuCallBack onErrCb)`
### `extern int waku_legacy_filter_unsubscribe(char* filterJSON, int timeoutMs, WakuCallBack onErrCb, void* userData)`
Removes subscriptions in a light node matching a content filter and, optionally, a [PubSub `topic`](https://github.com/libp2p/specs/blob/master/pubsub/README.md#the-topic-descriptor).
@ -1068,6 +1075,7 @@ Removes subscriptions in a light node matching a content filter and, optionally,
the execution will be canceled and an error returned.
Use `0` for no timeout.
3. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `void* userData`: used to pass custom information to the callback function
**Returns**
@ -1075,7 +1083,7 @@ A status code. Refer to the [`Status codes`](#status-codes) section for possible
## Waku Lightpush
### `extern int waku_lightpush_publish(char* messageJSON, char* topic, char* peerID, int timeoutMs, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_lightpush_publish(char* messageJSON, char* topic, char* peerID, int timeoutMs, WakuCallBack cb, void* userData)`
Publish a message using Waku Lightpush.
@ -1089,24 +1097,23 @@ Publish a message using Waku Lightpush.
It must have been added before with [`waku_add_peer`](#extern-char-waku_add_peerchar-address-char-protocolid)
or previously dialed with [`waku_connect_peer`](#extern-char-waku_connect_peerchar-address-int-timeoutms).
Use `NULL` to automatically select a node.
3. `int timeoutMs`: Timeout value in milliseconds to execute the call.
4. `int timeoutMs`: Timeout value in milliseconds to execute the call.
If the function execution takes longer than this value,
the execution will be canceled and an error returned.
Use `0` for no timeout.
4. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
5. `WakuCallBack onErrCb`: callback to be executed if the function fails
Note: `messageJson.version` is overwritten to `0`.
5. `WakuCallBack cb`: callback to be executed
6. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the message ID.
If the function is executed succesfully, `onOkCb` will receive the message ID.
## Waku Store
### `extern int waku_store_query(char* queryJSON, char* peerID, int timeoutMs, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_store_query(char* queryJSON, char* peerID, int timeoutMs, WakuCallBack cb, void* userData)`
Retrieves historical messages on specific content topics. This method may be called with [`PagingOptions`](#pagingoptions-type),
to retrieve historical messages on a per-page basis. If the request included [`PagingOptions`](#pagingoptions-type), the node
@ -1124,16 +1131,16 @@ must contain a cursor pointing to the Index from which a new page can be request
If the function execution takes longer than this value,
the execution will be canceled and an error returned.
Use `0` for no timeout.
4. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
5. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `WakuCallBack cb`: callback to be executed
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive a [`StoreResponse`](#storeresponse-type).
If the function is executed succesfully, `onOkCb` will receive a [`StoreResponse`](#storeresponse-type).
### `extern int waku_store_local_query(char* queryJSON, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_store_local_query(char* queryJSON, WakuCallBack cb, void* userData)`
Retrieves locally stored historical messages on specific content topics. This method may be called with [`PagingOptions`](#pagingoptions-type),
to retrieve historical messages on a per-page basis. If the request included [`PagingOptions`](#pagingoptions-type), the node
@ -1147,18 +1154,18 @@ must contain a cursor pointing to the Index from which a new page can be request
If the function execution takes longer than this value,
the execution will be canceled and an error returned.
Use `0` for no timeout.
3. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
4. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `WakuCallBack cb`: callback to be executed
2. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive a [`StoreResponse`](#storeresponse-type).
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive a [`StoreResponse`](#storeresponse-type).
## Encrypting messages
### `extern int waku_encode_symmetric(char* messageJson, char* symmetricKey, char* optionalSigningKey, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_encode_symmetric(char* messageJson, char* symmetricKey, char* optionalSigningKey, WakuCallBack cb, void* userData)`
Encrypt a message using symmetric encryption and optionally sign the message
@ -1167,18 +1174,18 @@ Encrypt a message using symmetric encryption and optionally sign the message
1. `char* messageJson`: JSON string containing the [Waku Message](https://rfc.vac.dev/spec/14/) as [`JsonMessage`](#jsonmessage-type).
2. `char* symmetricKey`: hex encoded secret key to be used for encryption.
3. `char* optionalSigningKey`: hex encoded private key to be used to sign the message.
4. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
5. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `WakuCallBack cb`: callback to be executed
5. `void* userData`: used to pass custom information to the callback function
Note: `messageJson.version` is overwritten to `1`.
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the encrypted waku message which can be broadcasted with relay or lightpush protocol publish functions
If the function is executed succesfully, `onOkCb` will receive the encrypted waku message which can be broadcasted with relay or lightpush protocol publish functions
### `extern int waku_encode_asymmetric(char* messageJson, char* publicKey, char* optionalSigningKey, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_encode_asymmetric(char* messageJson, char* publicKey, char* optionalSigningKey, WakuCallBack cb, void* userData)`
Encrypt a message using asymmetric encryption and optionally sign the message
@ -1187,37 +1194,37 @@ Encrypt a message using asymmetric encryption and optionally sign the message
1. `char* messageJson`: JSON string containing the [Waku Message](https://rfc.vac.dev/spec/14/) as [`JsonMessage`](#jsonmessage-type).
2. `char* publicKey`: hex encoded public key to be used for encryption.
3. `char* optionalSigningKey`: hex encoded private key to be used to sign the message.
4. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
5. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `WakuCallBack cb`: callback to be executed
5. `void* userData`: used to pass custom information to the callback function
Note: `messageJson.version` is overwritten to `1`.
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive the encrypted waku message which can be broadcasted with relay or lightpush protocol publish functions
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the encrypted waku message which can be broadcasted with relay or lightpush protocol publish functions
## Decrypting messages
### `extern int waku_decode_symmetric(char* messageJson, char* symmetricKey, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_decode_symmetric(char* messageJson, char* symmetricKey, WakuCallBack cb, void* userData)`
Decrypt a message using a symmetric key
**Parameters**
1. `char* messageJson`: JSON string containing the [Waku Message](https://rfc.vac.dev/spec/14/) as [`JsonMessage`](#jsonmessage-type).
2. `char* symmetricKey`: 32 byte symmetric key hex encoded.
3. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
4. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `WakuCallBack cb`: callback to be executed
4. `void* userData`: used to pass custom information to the callback function
Note: `messageJson.version` is expected to be `1`.
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive the decoded payload as a [`DecodedPayload`](#decodedpayload-type).
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the decoded payload as a [`DecodedPayload`](#decodedpayload-type).
```json
@ -1229,23 +1236,23 @@ If the function is executed succesfully, `onOkCb` will receive the decoded paylo
}
```
### `extern int waku_decode_asymmetric(char* messageJson, char* privateKey, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_decode_asymmetric(char* messageJson, char* privateKey, WakuCallBack cb, void* userData)`
Decrypt a message using a secp256k1 private key
**Parameters**
1. `char* messageJson`: JSON string containing the [Waku Message](https://rfc.vac.dev/spec/14/) as [`JsonMessage`](#jsonmessage-type).
2. `char* privateKey`: secp256k1 private key hex encoded.
3. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
4. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `WakuCallBack cb`: callback to be executed
4. `void* userData`: used to pass custom information to the callback function
Note: `messageJson.version` is expected to be `1`.
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function is executed succesfully, `onOkCb` will receive the decoded payload as a [`DecodedPayload`](#decodedpayload-type).
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `cb` will receive the decoded payload as a [`DecodedPayload`](#decodedpayload-type).
```json
{
@ -1258,7 +1265,7 @@ If the function is executed succesfully, `onOkCb` will receive the decoded paylo
## DNS Discovery
### `extern int waku_dns_discovery(char* url, char* nameserver, int timeoutMs, WakuCallBack onOkCb, WakuCallBack onErrCb)`
### `extern int waku_dns_discovery(char* url, char* nameserver, int timeoutMs, WakuCallBack cb, void* userData)`
Returns a list of multiaddress and enrs given a url to a DNS discoverable ENR tree
**Parameters**
@ -1270,16 +1277,15 @@ Returns a list of multiaddress and enrs given a url to a DNS discoverable ENR tr
If the function execution takes longer than this value,
the execution will be canceled and an error returned.
Use `0` for no timeout.
4. `WakuCallBack onOkCb`: callback to be executed if the function is succesful
5. `WakuCallBack onErrCb`: callback to be executed if the function fails
4. `WakuCallBack cb`: callback to be executed
3. `void* userData`: used to pass custom information to the callback function
**Returns**
A status code. Refer to the [`Status codes`](#status-codes) section for possible values.
If the function execution fails, `cb` will receive a string containing an error.
If the function is executed succesfully, `onOkCb` will receive an array objects describing the multiaddresses, enr and peerID each node found.
```json
[
{
@ -1296,13 +1302,14 @@ If the function is executed succesfully, `onOkCb` will receive an array objects
## DiscoveryV5
### `extern int waku_discv5_update_bootnodes(char* bootnodes, WakuCallBack onErrCb)`
### `extern int waku_discv5_update_bootnodes(char* bootnodes, WakuCallBack onErrCb, void* userData)`
Update the bootnode list used for discovering new peers via DiscoveryV5
**Parameters**
1. `char* bootnodes`: JSON array containing the bootnode ENRs i.e. `["enr:...", "enr:..."]`
2. `WakuCallBack onErrCb`: callback to be executed if the function fails
3. `void* userData`: used to pass custom information to the callback function
**Returns**

View File

@ -6,11 +6,11 @@ package main
#include <stddef.h>
// The possible returned values for the functions that return int
#define RET_OK 0
#define RET_ERR 1
#define RET_MISSING_CALLBACK 2
static const int RET_OK = 0;
static const int RET_ERR = 1;
static const int RET_MISSING_CALLBACK = 2;
typedef void (*WakuCallBack) (const char* msg, size_t len_0);
typedef void (*WakuCallBack) (int ret_code, const char* msg, void * user_data);
*/
import "C"
import (
@ -21,10 +21,6 @@ import (
"github.com/waku-org/go-waku/waku/v2/protocol"
)
const retOk = C.RET_OK
const retErr = C.RET_ERR
const retMissingCallback = C.RET_MISSING_CALLBACK
func main() {}
// Initialize a waku node. Receives a JSON string containing the configuration
@ -92,25 +88,25 @@ func main() {}
// - dns4DomainName: the domain name resolving to the node's public IPv4 address.
//
//export waku_new
func waku_new(configJSON *C.char, onErrCb C.WakuCallBack) C.int {
func waku_new(configJSON *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.NewNode(C.GoString(configJSON))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
// Starts the waku node
//
//export waku_start
func waku_start(onErrCb C.WakuCallBack) C.int {
func waku_start(onErr C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.Start()
return execErrCB(onErrCb, err)
return onError(err, onErr, userData)
}
// Stops a waku node
//
//export waku_stop
func waku_stop(onErrCb C.WakuCallBack) C.int {
func waku_stop(onErr C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.Stop()
return execErrCB(onErrCb, err)
return onError(err, onErr, userData)
}
// Determine is a node is started or not
@ -126,96 +122,96 @@ func waku_is_started() C.int {
type fn func() (string, error)
func singleFnExec(f fn, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func singleFnExec(f fn, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
result, err := f()
if err != nil {
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
return execOkCB(onOkCb, result)
return onSuccesfulResponse(result, cb, userData)
}
// Obtain the peer ID of the waku node
//
//export waku_peerid
func waku_peerid(onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_peerid(cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.PeerID()
}, onOkCb, onErrCb)
}, cb, userData)
}
// Obtain the multiaddresses the wakunode is listening to
//
//export waku_listen_addresses
func waku_listen_addresses(onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_listen_addresses(cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.ListenAddresses()
}, onOkCb, onErrCb)
}, cb, userData)
}
// Add node multiaddress and protocol to the wakunode peerstore
//
//export waku_add_peer
func waku_add_peer(address *C.char, protocolID *C.char, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_add_peer(address *C.char, protocolID *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.AddPeer(C.GoString(address), C.GoString(protocolID))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Connect to peer at multiaddress. if ms > 0, cancel the function execution if it takes longer than N milliseconds
//
//export waku_connect
func waku_connect(address *C.char, ms C.int, onErrCb C.WakuCallBack) C.int {
func waku_connect(address *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.Connect(C.GoString(address), int(ms))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
// Connect to known peer by peerID. if ms > 0, cancel the function execution if it takes longer than N milliseconds
//
//export waku_connect_peerid
func waku_connect_peerid(peerID *C.char, ms C.int, onErrCb C.WakuCallBack) C.int {
func waku_connect_peerid(peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.ConnectPeerID(C.GoString(peerID), int(ms))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
// Close connection to a known peer by peerID
//
//export waku_disconnect
func waku_disconnect(peerID *C.char, onErrCb C.WakuCallBack) C.int {
func waku_disconnect(peerID *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.Disconnect(C.GoString(peerID))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
// Get number of connected peers
//
//export waku_peer_cnt
func waku_peer_cnt(onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_peer_cnt(cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
peerCnt, err := library.PeerCnt()
return fmt.Sprintf("%d", peerCnt), err
}, onOkCb, onErrCb)
}, cb, userData)
}
// Create a content topic string according to RFC 23
//
//export waku_content_topic
func waku_content_topic(applicationName *C.char, applicationVersion C.uint, contentTopicName *C.char, encoding *C.char, onOkCb C.WakuCallBack) C.int {
func waku_content_topic(applicationName *C.char, applicationVersion C.uint, contentTopicName *C.char, encoding *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
contentTopic, _ := protocol.NewContentTopic(C.GoString(applicationName), uint32(applicationVersion), C.GoString(contentTopicName), C.GoString(encoding))
return execOkCB(onOkCb, contentTopic.String())
return onSuccesfulResponse(contentTopic.String(), cb, userData)
}
// Create a pubsub topic string according to RFC 23
//
//export waku_pubsub_topic
func waku_pubsub_topic(name *C.char, encoding *C.char, onOkCb C.WakuCallBack) C.int {
func waku_pubsub_topic(name *C.char, encoding *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
topic := library.PubsubTopic(C.GoString(name), C.GoString(encoding))
return execOkCB(onOkCb, topic)
return onSuccesfulResponse(topic, cb, userData)
}
// Get the default pubsub topic used in waku2: /waku/2/default-waku/proto
//
//export waku_default_pubsub_topic
func waku_default_pubsub_topic(onOkCb C.WakuCallBack) C.int {
return execOkCB(onOkCb, library.DefaultPubsubTopic())
func waku_default_pubsub_topic(cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return onSuccesfulResponse(library.DefaultPubsubTopic(), cb, userData)
}
// Register callback to act as signal handler and receive application signals
@ -230,8 +226,8 @@ func waku_set_event_callback(cb C.WakuCallBack) {
// Retrieve the list of peers known by the waku node
//
//export waku_peers
func waku_peers(onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_peers(cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.Peers()
}, onOkCb, onErrCb)
}, cb, userData)
}

View File

@ -5,7 +5,11 @@ package main
*/
import "C"
import "github.com/waku-org/go-waku/library"
import (
"unsafe"
"github.com/waku-org/go-waku/library"
)
// Returns a list of objects containing the peerID, enr and multiaddresses for each node found
//
@ -17,17 +21,17 @@ import "github.com/waku-org/go-waku/library"
// (in milliseconds) is reached, or an error will be returned
//
//export waku_dns_discovery
func waku_dns_discovery(url *C.char, nameserver *C.char, ms C.int, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_dns_discovery(url *C.char, nameserver *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.DNSDiscovery(C.GoString(url), C.GoString(nameserver), int(ms))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Update the bootnode list used for discovering new peers via DiscoveryV5
// The bootnodes param should contain a JSON array containing the bootnode ENRs i.e. `["enr:...", "enr:..."]`
//
//export waku_discv5_update_bootnodes
func waku_discv5_update_bootnodes(bootnodes *C.char, onErrCb C.WakuCallBack) C.int {
func waku_discv5_update_bootnodes(bootnodes *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.SetBootnodes(C.GoString(bootnodes))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}

View File

@ -4,24 +4,28 @@ package main
#include <cgo_utils.h>
*/
import "C"
import "github.com/waku-org/go-waku/library"
import (
"unsafe"
"github.com/waku-org/go-waku/library"
)
// Decode a waku message using a 32 bytes symmetric key. The key must be a hex encoded string with "0x" prefix
//
//export waku_decode_symmetric
func waku_decode_symmetric(messageJSON *C.char, symmetricKey *C.char, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_decode_symmetric(messageJSON *C.char, symmetricKey *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.DecodeSymmetric(C.GoString(messageJSON), C.GoString(symmetricKey))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Decode a waku message using a secp256k1 private key. The key must be a hex encoded string with "0x" prefix
//
//export waku_decode_asymmetric
func waku_decode_asymmetric(messageJSON *C.char, privateKey *C.char, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_decode_asymmetric(messageJSON *C.char, privateKey *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.DecodeAsymmetric(C.GoString(messageJSON), C.GoString(privateKey))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Encrypt a message with a secp256k1 public key.
@ -30,10 +34,10 @@ func waku_decode_asymmetric(messageJSON *C.char, privateKey *C.char, onOkCb C.Wa
// The message version will be set to 1
//
//export waku_encode_asymmetric
func waku_encode_asymmetric(messageJSON *C.char, publicKey *C.char, optionalSigningKey *C.char, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_encode_asymmetric(messageJSON *C.char, publicKey *C.char, optionalSigningKey *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.EncodeAsymmetric(C.GoString(messageJSON), C.GoString(publicKey), C.GoString(optionalSigningKey))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Encrypt a message with a 32 bytes symmetric key
@ -42,8 +46,8 @@ func waku_encode_asymmetric(messageJSON *C.char, publicKey *C.char, optionalSign
// The message version will be set to 1
//
//export waku_encode_symmetric
func waku_encode_symmetric(messageJSON *C.char, symmetricKey *C.char, optionalSigningKey *C.char, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_encode_symmetric(messageJSON *C.char, symmetricKey *C.char, optionalSigningKey *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.EncodeSymmetric(C.GoString(messageJSON), C.GoString(symmetricKey), C.GoString(optionalSigningKey))
}, onOkCb, onErrCb)
}, cb, userData)
}

View File

@ -4,7 +4,11 @@ package main
#include <cgo_utils.h>
*/
import "C"
import "github.com/waku-org/go-waku/library"
import (
"unsafe"
"github.com/waku-org/go-waku/library"
)
// Creates a subscription to a filter full node matching a content filter.
// filterJSON must contain a JSON with this format:
@ -20,10 +24,10 @@ import "github.com/waku-org/go-waku/library"
// It returns a json object containing the details of the subscriptions along with any errors in case of partial failures
//
//export waku_filter_subscribe
func waku_filter_subscribe(filterJSON *C.char, peerID *C.char, ms C.int, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_filter_subscribe(filterJSON *C.char, peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.FilterSubscribe(C.GoString(filterJSON), C.GoString(peerID), int(ms))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Used to know if a service node has an active subscription for this client
@ -32,9 +36,9 @@ func waku_filter_subscribe(filterJSON *C.char, peerID *C.char, ms C.int, onOkCb
// (in milliseconds) is reached, or an error will be returned
//
//export waku_filter_ping
func waku_filter_ping(peerID *C.char, ms C.int, onErrCb C.WakuCallBack) C.int {
func waku_filter_ping(peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.FilterPing(C.GoString(peerID), int(ms))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
// Sends a requests to a service node to stop pushing messages matching this filter to this client.
@ -51,9 +55,9 @@ func waku_filter_ping(peerID *C.char, ms C.int, onErrCb C.WakuCallBack) C.int {
// (in milliseconds) is reached, or an error will be returned
//
//export waku_filter_unsubscribe
func waku_filter_unsubscribe(filterJSON *C.char, peerID *C.char, ms C.int, onErrCb C.WakuCallBack) C.int {
func waku_filter_unsubscribe(filterJSON *C.char, peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.FilterUnsubscribe(C.GoString(filterJSON), C.GoString(peerID), int(ms))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
// Sends a requests to a service node (or all service nodes) to stop pushing messages
@ -63,8 +67,8 @@ func waku_filter_unsubscribe(filterJSON *C.char, peerID *C.char, ms C.int, onErr
// (in milliseconds) is reached, or an error will be returned
//
//export waku_filter_unsubscribe_all
func waku_filter_unsubscribe_all(peerID *C.char, ms C.int, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_filter_unsubscribe_all(peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.FilterUnsubscribeAll(C.GoString(peerID), int(ms))
}, onOkCb, onErrCb)
}, cb, userData)
}

View File

@ -4,7 +4,11 @@ package main
#include <cgo_utils.h>
*/
import "C"
import "github.com/waku-org/go-waku/library"
import (
"unsafe"
"github.com/waku-org/go-waku/library"
)
// Creates a subscription to a light node matching a content filter and, optionally, a pubSub topic.
// filterJSON must contain a JSON with this format:
@ -23,9 +27,9 @@ import "github.com/waku-org/go-waku/library"
// (in milliseconds) is reached, or an error will be returned
//
//export waku_legacy_filter_subscribe
func waku_legacy_filter_subscribe(filterJSON *C.char, peerID *C.char, ms C.int, onErrCb C.WakuCallBack) C.int {
func waku_legacy_filter_subscribe(filterJSON *C.char, peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.LegacyFilterSubscribe(C.GoString(filterJSON), C.GoString(peerID), int(ms))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}
// Removes subscriptions in a light node matching a content filter and, optionally, a pubSub topic.
@ -44,7 +48,7 @@ func waku_legacy_filter_subscribe(filterJSON *C.char, peerID *C.char, ms C.int,
// (in milliseconds) is reached, or an error will be returned
//
//export waku_legacy_filter_unsubscribe
func waku_legacy_filter_unsubscribe(filterJSON *C.char, ms C.int, onErrCb C.WakuCallBack) C.int {
func waku_legacy_filter_unsubscribe(filterJSON *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.LegacyFilterUnsubscribe(C.GoString(filterJSON), int(ms))
return execErrCB(onErrCb, err)
return onError(err, cb, userData)
}

View File

@ -4,7 +4,11 @@ package main
#include <cgo_utils.h>
*/
import "C"
import "github.com/waku-org/go-waku/library"
import (
"unsafe"
"github.com/waku-org/go-waku/library"
)
// Publish a message using waku lightpush. Use NULL for topic to derive the pubsub topic from the contentTopic.
// peerID should contain the ID of a peer supporting the lightpush protocol. Use NULL to automatically select a node
@ -12,8 +16,8 @@ import "github.com/waku-org/go-waku/library"
// (in milliseconds) is reached, or an error will be returned
//
//export waku_lightpush_publish
func waku_lightpush_publish(messageJSON *C.char, topic *C.char, peerID *C.char, ms C.int, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_lightpush_publish(messageJSON *C.char, topic *C.char, peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.LightpushPublish(C.GoString(messageJSON), C.GoString(topic), C.GoString(peerID), int(ms))
}, onOkCb, onErrCb)
}, cb, userData)
}

View File

@ -4,58 +4,74 @@ package main
#include <cgo_utils.h>
*/
import "C"
import "github.com/waku-org/go-waku/library"
import (
"unsafe"
"github.com/waku-org/go-waku/library"
)
// Determine if there are enough peers to publish a message on a topic. Use NULL
// to verify the number of peers in the default pubsub topic
//
//export waku_relay_enough_peers
func waku_relay_enough_peers(topic *C.char, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_relay_enough_peers(topic *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
result, err := library.RelayEnoughPeers(C.GoString(topic))
if result {
return "true", err
}
return "false", err
}, onOkCb, onErrCb)
}, cb, userData)
}
// Publish a message using waku relay and returns the message ID. Use NULL for topic to use the default pubsub topic
// Publish a message using waku relay and returns the message ID. Use NULL for topic to derive the pubsub topic from the contentTopic.
// If ms is greater than 0, the broadcast of the message must happen before the timeout
// (in milliseconds) is reached, or an error will be returned.
//
//export waku_relay_publish
func waku_relay_publish(messageJSON *C.char, topic *C.char, ms C.int, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_relay_publish(messageJSON *C.char, topic *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.RelayPublish(C.GoString(messageJSON), C.GoString(topic), int(ms))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Subscribe to a WakuRelay topic. Set the topic to NULL to subscribe
// to the default topic. Returns a json response. When a message is received,
// a "message" event is emitted containing the message and pubsub topic in which
// Subscribe to WakuRelay to receive messages matching a content filter.
// filterJSON must contain a JSON with this format:
//
// {
// "pubsubTopic": "the pubsub topic" // optional if using autosharding, mandatory if using static or named sharding.
// "contentTopics": ["the content topic"] // optional
// }
//
// When a message is received, a "message" event is emitted containing the message and pubsub topic in which
// the message was received
//
//export waku_relay_subscribe
func waku_relay_subscribe(topic *C.char, onErrCb C.WakuCallBack) C.int {
err := library.RelaySubscribe(C.GoString(topic))
return execErrCB(onErrCb, err)
func waku_relay_subscribe(filterJSON *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.RelaySubscribe(C.GoString(filterJSON))
return onError(err, cb, userData)
}
// Returns a json response with the list of pubsub topics the node
// is subscribed to in WakuRelay
//
//export waku_relay_topics
func waku_relay_topics(onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_relay_topics(cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.RelayTopics()
}, onOkCb, onErrCb)
}, cb, userData)
}
// Closes the pubsub subscription to a pubsub topic
// Closes the pubsub subscription to stop receiving messages matching a content filter
// filterJSON must contain a JSON with this format:
//
// {
// "pubsubTopic": "the pubsub topic" // optional if using autosharding, mandatory if using static or named sharding.
// "contentTopics": ["the content topic"] // optional
// }
//
//export waku_relay_unsubscribe
func waku_relay_unsubscribe(topic *C.char, onErrCb C.WakuCallBack) C.int {
err := library.RelayUnsubscribe(C.GoString(topic))
return execErrCB(onErrCb, err)
func waku_relay_unsubscribe(filterJSON *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
err := library.RelayUnsubscribe(C.GoString(filterJSON))
return onError(err, cb, userData)
}

View File

@ -4,30 +4,33 @@ package main
#include <cgo_utils.h>
*/
import "C"
import "github.com/waku-org/go-waku/library"
import (
"unsafe"
"github.com/waku-org/go-waku/library"
)
// Query historic messages using waku store protocol.
// queryJSON must contain a valid json string with the following format:
//
// {
// "pubsubTopic": "...", // optional string
// "startTime": 1234, // optional, unix epoch time in nanoseconds
// "endTime": 1234, // optional, unix epoch time in nanoseconds
// "contentFilters": [ // optional
// {
// contentTopic: "contentTopic1"
// }, ...
// ],
// "pagingOptions": {// optional pagination information
// "pageSize": 40, // number
// "startTime": 1234, // optional, unix epoch time in nanoseconds
// "endTime": 1234, // optional, unix epoch time in nanoseconds
// "contentTopics": [ // optional
// "contentTopic1",
// ...
// ],
// "pagingOptions": {// optional pagination information
// "pageSize": 40, // number
// "cursor": { // optional
// "digest": ...,
// "receiverTime": ...,
// "senderTime": ...,
// "pubsubTopic" ...,
// }
// "pubsubTopic": ...,
// },
// "forward": true, // sort order
// }
// }
// }
//
// If a non empty cursor is returned, this function should be executed again, setting the `cursor` attribute with the cursor returned in the response
@ -36,10 +39,10 @@ import "github.com/waku-org/go-waku/library"
// (in milliseconds) is reached, or an error will be returned
//
//export waku_store_query
func waku_store_query(queryJSON *C.char, peerID *C.char, ms C.int, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_store_query(queryJSON *C.char, peerID *C.char, ms C.int, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.StoreQuery(C.GoString(queryJSON), C.GoString(peerID), int(ms))
}, onOkCb, onErrCb)
}, cb, userData)
}
// Query historic messages stored in the localDB using waku store protocol.
@ -47,31 +50,30 @@ func waku_store_query(queryJSON *C.char, peerID *C.char, ms C.int, onOkCb C.Waku
//
// {
// "pubsubTopic": "...", // optional string
// "startTime": 1234, // optional, unix epoch time in nanoseconds
// "endTime": 1234, // optional, unix epoch time in nanoseconds
// "contentFilters": [ // optional
// {
// contentTopic: "contentTopic1"
// }, ...
// ],
// "pagingOptions": {// optional pagination information
// "pageSize": 40, // number
// "startTime": 1234, // optional, unix epoch time in nanoseconds
// "endTime": 1234, // optional, unix epoch time in nanoseconds
// "contentTopics": [ // optional
// "contentTopic1"
// ...
// ],
// "pagingOptions": {// optional pagination information
// "pageSize": 40, // number
// "cursor": { // optional
// "digest": ...,
// "receiverTime": ...,
// "senderTime": ...,
// "pubsubTopic" ...,
// }
// "pubsubTopic": ...,
// },
// "forward": true, // sort order
// }
// }
// }
//
// If a non empty cursor is returned, this function should be executed again, setting the `cursor` attribute with the cursor returned in the response
// Requires the `store` option to be passed when setting up the initial configuration
//
//export waku_store_local_query
func waku_store_local_query(queryJSON *C.char, onOkCb C.WakuCallBack, onErrCb C.WakuCallBack) C.int {
func waku_store_local_query(queryJSON *C.char, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
return singleFnExec(func() (string, error) {
return library.StoreLocalQuery(C.GoString(queryJSON))
}, onOkCb, onErrCb)
}, cb, userData)
}

View File

@ -4,6 +4,6 @@
// This is a bridge function to execute C callbacks.
// It's used internally in go-waku. Do not call directly
void _waku_execCB(WakuCallBack op, char* a, size_t b) {
op(a, b);
void _waku_execCB(WakuCallBack op, int retCode, char* msg, void * user_data) {
op(retCode, msg, user_data);
}

View File

@ -3,35 +3,51 @@ package main
/*
#include <stdlib.h>
#include <cgo_utils.h>
extern void _waku_execCB(WakuCallBack op, char* a, size_t b);
extern void _waku_execCB(WakuCallBack cb, int retCode, char* msg, void* user_data);
*/
import "C"
import "unsafe"
import (
"errors"
"unsafe"
)
func execOkCB(onOkCb C.WakuCallBack, value string) C.int {
if onOkCb == nil {
return retMissingCallback
const ret_ok = 0
const ret_err = 1
const ret_cb = 2
var errMissingCallback = errors.New("missing callback")
func onSuccesfulResponse(value string, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
retCode := ret_ok
if cb == nil {
retCode = ret_cb
value = errMissingCallback.Error()
}
val := C.CString(value)
valLen := C.size_t(len(value))
C._waku_execCB(onOkCb, val, valLen)
cstrVal := C.CString(value)
C._waku_execCB(cb, C.int(retCode), cstrVal, userData)
C.free(unsafe.Pointer(val))
C.free(unsafe.Pointer(cstrVal))
return retOk
return ret_ok
}
func execErrCB(onErrCb C.WakuCallBack, err error) C.int {
if onErrCb == nil {
return retMissingCallback
func onError(err error, cb C.WakuCallBack, userData unsafe.Pointer) C.int {
retCode := ret_err
if cb == nil {
retCode = ret_cb
err = errMissingCallback
}
if err != nil {
errMsg := err.Error()
execOkCB(onErrCb, errMsg) // reusing ok cb
return retErr
cstrVal := C.CString(errMsg)
C._waku_execCB(cb, C.int(retCode), cstrVal, userData)
C.free(unsafe.Pointer(cstrVal))
return ret_err
}
return retOk
retCode = ret_ok
C._waku_execCB(cb, C.int(retCode), nil, userData)
return ret_ok
}

View File

@ -1,6 +1,4 @@
#include <stdlib.h>
#include <stdint.h>
typedef void (*WakuCallBack) (const char* msg, size_t len_0);
typedef void (*BytesCallBack) (uint8_t* data, size_t len_0);
typedef void (*WakuCallBack) (int ret_code, const char* msg, void * user_data);

View File

@ -128,6 +128,18 @@ func extractPubKeyAndSignature(payload *payload.DecodedPayload) (pubkey string,
return
}
type v0Response struct {
Data []byte `json:"data"`
Padding []byte `json:"padding"`
}
type v1Response struct {
PubKey string `json:"pubkey,omitempty"`
Signature string `json:"signature,omitempty"`
Data []byte `json:"data"`
Padding []byte `json:"padding"`
}
// DecodeSymmetric decodes a waku message using a 32 bytes symmetric key. The key must be a hex encoded string with "0x" prefix
func DecodeSymmetric(messageJSON string, symmetricKey string) (string, error) {
var msg pb.WakuMessage
@ -137,7 +149,9 @@ func DecodeSymmetric(messageJSON string, symmetricKey string) (string, error) {
}
if msg.Version == 0 {
return marshalJSON(msg.Payload)
return marshalJSON(v0Response{
Data: msg.Payload,
})
} else if msg.Version > 1 {
return "", errors.New("unsupported wakumessage version")
}
@ -158,12 +172,7 @@ func DecodeSymmetric(messageJSON string, symmetricKey string) (string, error) {
pubkey, signature := extractPubKeyAndSignature(payload)
response := struct {
PubKey string `json:"pubkey,omitempty"`
Signature string `json:"signature,omitempty"`
Data []byte `json:"data"`
Padding []byte `json:"padding"`
}{
response := v1Response{
PubKey: pubkey,
Signature: signature,
Data: payload.Data,
@ -182,7 +191,9 @@ func DecodeAsymmetric(messageJSON string, privateKey string) (string, error) {
}
if msg.Version == 0 {
return marshalJSON(msg.Payload)
return marshalJSON(v0Response{
Data: msg.Payload,
})
} else if msg.Version > 1 {
return "", errors.New("unsupported wakumessage version")
}
@ -208,12 +219,7 @@ func DecodeAsymmetric(messageJSON string, privateKey string) (string, error) {
pubkey, signature := extractPubKeyAndSignature(payload)
response := struct {
PubKey string `json:"pubkey,omitempty"`
Signature string `json:"signature,omitempty"`
Data []byte `json:"data"`
Padding []byte `json:"padding"`
}{
response := v1Response{
PubKey: pubkey,
Signature: signature,
Data: payload.Data,

View File

@ -81,7 +81,10 @@ func FilterSubscribe(filterJSON string, peerID string, ms int) (string, error) {
}
var subResult subscribeResult
subResult.Subscriptions = subscriptions
subResult.Error = err.Error()
if err != nil {
subResult.Error = err.Error()
}
return marshalJSON(subResult)
}

View File

@ -52,5 +52,5 @@ func LightpushPublish(messageJSON string, pubsubTopic string, peerID string, ms
return "", err
}
return lightpushPublish(msg, getTopic(pubsubTopic), peerID, ms)
return lightpushPublish(msg, pubsubTopic, peerID, ms)
}

View File

@ -265,7 +265,7 @@ func AddPeer(address string, protocolID string) (string, error) {
return "", err
}
return marshalJSON(peerID)
return peerID.String(), nil
}
// Connect is used to connect to a peer at multiaddress. if ms > 0, cancel the function execution if it takes longer than N milliseconds
@ -350,13 +350,6 @@ func DefaultPubsubTopic() string {
return protocol.DefaultPubsubTopic().String()
}
func getTopic(topic string) string {
if topic == "" {
return protocol.DefaultPubsubTopic().String()
}
return topic
}
type subscriptionMsg struct {
MessageID string `json:"messageId"`
PubsubTopic string `json:"pubsubTopic"`
@ -382,5 +375,18 @@ func Peers() (string, error) {
return "", err
}
for _, p := range peers {
addrs := []multiaddr.Multiaddr{}
for i := range p.Addrs {
// Filtering out SNI addresses due to https://github.com/waku-org/waku-rust-bindings/issues/66
// TODO: once https://github.com/multiformats/rust-multiaddr/issues/88 is implemented, remove this
_, err := p.Addrs[i].ValueForProtocol(multiaddr.P_SNI)
if err != nil {
addrs = append(addrs, p.Addrs[i])
}
}
p.Addrs = addrs
}
return marshalJSON(peers)
}

View File

@ -4,17 +4,12 @@ import (
"context"
"time"
"sync"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/waku-org/go-waku/waku/v2/protocol"
"github.com/waku-org/go-waku/waku/v2/protocol/pb"
"github.com/waku-org/go-waku/waku/v2/protocol/relay"
)
var relaySubscriptions map[string]*relay.Subscription = make(map[string]*relay.Subscription)
var relaySubsMutex sync.Mutex
// RelayEnoughPeers determines if there are enough peers to publish a message on a topic
func RelayEnoughPeers(topic string) (bool, error) {
if wakuState.node == nil {
@ -55,43 +50,38 @@ func RelayPublish(messageJSON string, topic string, ms int) (string, error) {
return "", err
}
return relayPublish(msg, getTopic(topic), int(ms))
return relayPublish(msg, topic, int(ms))
}
func relaySubscribe(topic string) error {
topicToSubscribe := getTopic(topic)
relaySubsMutex.Lock()
defer relaySubsMutex.Unlock()
_, ok := relaySubscriptions[topicToSubscribe]
if ok {
return nil
}
subscription, err := wakuState.node.Relay().Subscribe(context.Background(), protocol.NewContentFilter(topicToSubscribe))
func relaySubscribe(filterJSON string) error {
cf, err := toContentFilter(filterJSON)
if err != nil {
return err
}
relaySubscriptions[topicToSubscribe] = subscription[0]
subscriptions, err := wakuState.node.Relay().Subscribe(context.Background(), cf)
if err != nil {
return err
}
go func(subscription *relay.Subscription) {
for envelope := range subscription.Ch {
send("message", toSubscriptionMessage(envelope))
}
}(subscription[0])
for _, sub := range subscriptions {
go func(subscription *relay.Subscription) {
for envelope := range subscription.Ch {
send("message", toSubscriptionMessage(envelope))
}
}(sub)
}
return nil
}
// RelaySubscribe subscribes to a WakuRelay topic.
func RelaySubscribe(topic string) error {
func RelaySubscribe(contentFilterJSON string) error {
if wakuState.node == nil {
return errWakuNodeNotReady
}
return relaySubscribe(topic)
return relaySubscribe(contentFilterJSON)
}
// RelayTopics returns a list of pubsub topics the node is subscribed to in WakuRelay
@ -104,24 +94,15 @@ func RelayTopics() (string, error) {
}
// RelayUnsubscribe closes the pubsub subscription to a pubsub topic
func RelayUnsubscribe(topic string) error {
func RelayUnsubscribe(contentFilterJSON string) error {
cf, err := toContentFilter(contentFilterJSON)
if err != nil {
return err
}
if wakuState.node == nil {
return errWakuNodeNotReady
}
topicToUnsubscribe := getTopic(topic)
relaySubsMutex.Lock()
defer relaySubsMutex.Unlock()
subscription, ok := relaySubscriptions[topicToUnsubscribe]
if ok {
return nil
}
subscription.Unsubscribe()
delete(relaySubscriptions, topicToUnsubscribe)
return wakuState.node.Relay().Unsubscribe(context.Background(), protocol.NewContentFilter(topicToUnsubscribe))
return wakuState.node.Relay().Unsubscribe(context.Background(), cf)
}

View File

@ -7,12 +7,12 @@
#include <stdbool.h>
#include "_cgo_export.h"
typedef void (*callback)(const char *jsonEvent, size_t len_0);
typedef void (*callback)(int retCode, const char *jsonEvent, void* userData);
callback gCallback = 0;
bool ServiceSignalEvent(const char *jsonEvent, size_t len_0) {
bool ServiceSignalEvent(const char *jsonEvent) {
if (gCallback) {
gCallback(jsonEvent, len_0);
gCallback(0, jsonEvent, NULL);
}
return true;

View File

@ -4,7 +4,7 @@ package library
#include <stddef.h>
#include <stdbool.h>
#include <stdlib.h>
extern bool ServiceSignalEvent(const char *jsonEvent, size_t len);
extern bool ServiceSignalEvent(const char *jsonEvent);
extern void SetEventCallback(void *cb);
*/
import "C"
@ -51,7 +51,7 @@ func send(signalType string, event interface{}) {
// ...and fallback to C implementation otherwise.
dataStr := string(data)
str := C.CString(dataStr)
C.ServiceSignalEvent(str, C.size_t(len(data)))
C.ServiceSignalEvent(str)
C.free(unsafe.Pointer(str))
}
}

View File

@ -22,11 +22,11 @@ type storePagingOptions struct {
}
type storeMessagesArgs struct {
Topic string `json:"pubsubTopic,omitempty"`
ContentFilters []*pb.ContentFilter `json:"contentFilters,omitempty"`
StartTime int64 `json:"startTime,omitempty"`
EndTime int64 `json:"endTime,omitempty"`
PagingOptions storePagingOptions `json:"pagingOptions,omitempty"`
Topic string `json:"pubsubTopic,omitempty"`
ContentTopics []string `json:"contentTopics,omitempty"`
StartTime int64 `json:"startTime,omitempty"`
EndTime int64 `json:"endTime,omitempty"`
PagingOptions storePagingOptions `json:"pagingOptions,omitempty"`
}
type storeMessagesReply struct {
@ -36,16 +36,11 @@ type storeMessagesReply struct {
}
func queryResponse(ctx context.Context, args storeMessagesArgs, options []store.HistoryRequestOption) (string, error) {
var contentTopics []string
for _, ct := range args.ContentFilters {
contentTopics = append(contentTopics, ct.ContentTopic)
}
res, err := wakuState.node.Store().Query(
ctx,
store.Query{
Topic: args.Topic,
ContentTopics: contentTopics,
ContentTopics: args.ContentTopics,
StartTime: args.StartTime,
EndTime: args.EndTime,
},

View File

@ -20,8 +20,8 @@ func NewContentTopicSet(contentTopics ...string) ContentTopicSet {
// ContentTopics - Specify list of content topics to be filtered under a pubSubTopic (for named and static sharding), or a list of contentTopics (in case ofAuto sharding)
// If pubSub topic is not specified, then content-topics are used to derive the shard and corresponding pubSubTopic using autosharding algorithm
type ContentFilter struct {
PubsubTopic string
ContentTopics ContentTopicSet
PubsubTopic string `json:"pubsubTopic"`
ContentTopics ContentTopicSet `json:"contentTopics"`
}
func (cf ContentFilter) ContentTopicsList() []string {

View File

@ -15,14 +15,14 @@ import (
type SubscriptionDetails struct {
sync.RWMutex
ID string
ID string `json:"subscriptionID"`
mapRef *SubscriptionsMap
Closed bool
Closed bool `json:"-"`
once sync.Once
PeerID peer.ID
ContentFilter protocol.ContentFilter
C chan *protocol.Envelope
PeerID peer.ID `json:"peerID"`
ContentFilter protocol.ContentFilter `json:"contentFilters"`
C chan *protocol.Envelope `json:"-"`
}
// Map of SubscriptionDetails.ID to subscriptions