mirror of
https://github.com/logos-messaging/specs.git
synced 2026-01-02 14:13:06 +00:00
Merge pull request #87 from waku-org/weboko/waku-send-api
Add Send API to Waku API
This commit is contained in:
commit
fe5cfdf823
@ -29,6 +29,12 @@ contributors:
|
|||||||
* [Function definitions](#function-definitions)
|
* [Function definitions](#function-definitions)
|
||||||
* [Predefined values](#predefined-values)
|
* [Predefined values](#predefined-values)
|
||||||
* [Extended definitions](#extended-definitions)
|
* [Extended definitions](#extended-definitions)
|
||||||
|
* [Send messages](#send-messages)
|
||||||
|
* [Type definitions](#type-definitions-1)
|
||||||
|
* [Function definitions](#function-definitions-1)
|
||||||
|
* [Extended definitions](#extended-definitions-1)
|
||||||
|
* [Event source](#event-source)
|
||||||
|
* [Type definitions](#type-definitions-2)
|
||||||
* [The Validation API](#the-validation-api)
|
* [The Validation API](#the-validation-api)
|
||||||
* [Security/Privacy Considerations](#securityprivacy-considerations)
|
* [Security/Privacy Considerations](#securityprivacy-considerations)
|
||||||
* [Copyright](#copyright)
|
* [Copyright](#copyright)
|
||||||
@ -39,10 +45,10 @@ contributors:
|
|||||||
This document specifies an Application Programming Interface (API) that is RECOMMENDED for developers of the [WAKU2](https://github.com/vacp2p/rfc-index/blob/7b443c1aab627894e3f22f5adfbb93f4c4eac4f6/waku/standards/core/10/waku2.md) clients to implement,
|
This document specifies an Application Programming Interface (API) that is RECOMMENDED for developers of the [WAKU2](https://github.com/vacp2p/rfc-index/blob/7b443c1aab627894e3f22f5adfbb93f4c4eac4f6/waku/standards/core/10/waku2.md) clients to implement,
|
||||||
and for consumers to use as a single entry point to its functionalities.
|
and for consumers to use as a single entry point to its functionalities.
|
||||||
|
|
||||||
This API defines the RECOMMENDED interface for leveraging Waku protocols to send and receive messages.
|
This API defines the RECOMMENDED interface for leveraging Waku protocols to send and receive messages.
|
||||||
Application developers SHOULD use it to access capabilities for peer discovery, message routing, and peer-to-peer reliability.
|
Application developers SHOULD use it to access capabilities for peer discovery, message routing, and peer-to-peer reliability.
|
||||||
|
|
||||||
TODO: This spec must be further extended to include connection health inspection, message sending, subscription and store hash queries.
|
TODO: This spec must be further extended to include connection health inspection, subscription, and store hash queries.
|
||||||
|
|
||||||
## Motivation
|
## Motivation
|
||||||
|
|
||||||
@ -69,12 +75,13 @@ An alternative would be to choose a programming language. However, such choice m
|
|||||||
### Primitive types and general guidelines
|
### Primitive types and general guidelines
|
||||||
|
|
||||||
- No `default` means that the value is mandatory, meaning a `default` value implies an optional parameter.
|
- No `default` means that the value is mandatory, meaning a `default` value implies an optional parameter.
|
||||||
- Primitive types are `string`, `int`, `bool`, `enum` and `uint`
|
- Primitive types are `string`, `int`, `bool`, `byte`, `enum` and `uint`
|
||||||
- Complex pre-defined types are:
|
- Complex pre-defined types are:
|
||||||
- `object`: object and other nested types.
|
- `object`: object and other nested types.
|
||||||
- `array`: iterable object containing values of all the same type.
|
- `array`: iterable object containing values of all the same type. Syntax: `array<T>` where `T` is the element type (e.g., `array<string>`, `array<byte>`).
|
||||||
- `result`: an enum type that either contains a value or void (success), or an error (failure); The error is left to the implementor.
|
- `result`: an enum type that either contains a value or void (success), or an error (failure); The error is left to the implementor.
|
||||||
- `error`: Left to the implementor on whether `error` types are `string` or `object` in the given language.
|
- `error`: Left to the implementor on whether `error` types are `string` or `object` in the given language.
|
||||||
|
- `event_emitter`: an object that emits events with specific event names and associated event data types.
|
||||||
- Usage of `result` is RECOMMENDED, usage of exceptions is NOT RECOMMENDED, no matter the language.
|
- Usage of `result` is RECOMMENDED, usage of exceptions is NOT RECOMMENDED, no matter the language.
|
||||||
|
|
||||||
TODO: Review whether to specify categories of errors.
|
TODO: Review whether to specify categories of errors.
|
||||||
@ -90,11 +97,13 @@ language_mappings:
|
|||||||
- functions: "camelCase"
|
- functions: "camelCase"
|
||||||
- variables: "camelCase"
|
- variables: "camelCase"
|
||||||
- types: "PascalCase"
|
- types: "PascalCase"
|
||||||
|
event_emitter: "Use EventEmitter object with `emit`, `addListener`, etc; with event name the string specified in IDL. For example. eventEmitter.emit('message:sent',...)"
|
||||||
nim:
|
nim:
|
||||||
naming_convention:
|
naming_convention:
|
||||||
- functions: "camelCase"
|
- functions: "camelCase"
|
||||||
- variables: "camelCase"
|
- variables: "camelCase"
|
||||||
- types: "PascalCase"
|
- types: "PascalCase"
|
||||||
|
event_emitter: TBD
|
||||||
```
|
```
|
||||||
|
|
||||||
### Application
|
### Application
|
||||||
@ -118,6 +127,10 @@ types:
|
|||||||
WakuNode:
|
WakuNode:
|
||||||
type: object
|
type: object
|
||||||
description: "A Waku node instance."
|
description: "A Waku node instance."
|
||||||
|
fields:
|
||||||
|
message_events:
|
||||||
|
type: MessageEvents
|
||||||
|
description: "Message related events."
|
||||||
|
|
||||||
NodeConfig:
|
NodeConfig:
|
||||||
type: object
|
type: object
|
||||||
@ -151,6 +164,7 @@ types:
|
|||||||
description: "The passed nodes are prioritised for store queries."
|
description: "The passed nodes are prioritised for store queries."
|
||||||
cluster_id:
|
cluster_id:
|
||||||
type: uint
|
type: uint
|
||||||
|
description: "The cluster ID for the Waku network. Cluster IDs are defined in [RELAY-SHARDING](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/51/relay-sharding.md) and allocated in [RELAY-STATIC-SHARD-ALLOC](https://github.com/waku-org/specs/blob/master/informational/relay-static-shard-alloc.md)."
|
||||||
auto_sharding_config:
|
auto_sharding_config:
|
||||||
type: AutoShardingConfig
|
type: AutoShardingConfig
|
||||||
default: DefaultAutoShardingConfig
|
default: DefaultAutoShardingConfig
|
||||||
@ -201,10 +215,10 @@ types:
|
|||||||
fields:
|
fields:
|
||||||
contract_address:
|
contract_address:
|
||||||
type: string
|
type: string
|
||||||
description: "The address of the RLN contract exposes `root` and `getMerkleRoot` ABIs"
|
description: "The address of the RLN contract that exposes `root` and `getMerkleRoot` ABIs"
|
||||||
chain_id:
|
chain_id:
|
||||||
type: uint
|
type: uint
|
||||||
description: "The chain id on which the RLN contract is deployed"
|
description: "The chain ID on which the RLN contract is deployed"
|
||||||
epoch_size_sec:
|
epoch_size_sec:
|
||||||
type: uint
|
type: uint
|
||||||
description: "The epoch size to use for RLN, in seconds"
|
description: "The epoch size to use for RLN, in seconds"
|
||||||
@ -244,6 +258,7 @@ values:
|
|||||||
static_store_nodes: []
|
static_store_nodes: []
|
||||||
cluster_id: 1
|
cluster_id: 1
|
||||||
auto_sharding_config:
|
auto_sharding_config:
|
||||||
|
type: AutoShardingConfig
|
||||||
fields:
|
fields:
|
||||||
num_shards_in_cluster: 8
|
num_shards_in_cluster: 8
|
||||||
message_validation: TheWakuNetworkMessageValidation
|
message_validation: TheWakuNetworkMessageValidation
|
||||||
@ -253,6 +268,7 @@ values:
|
|||||||
fields:
|
fields:
|
||||||
max_message_size: "150 KiB"
|
max_message_size: "150 KiB"
|
||||||
rln_config:
|
rln_config:
|
||||||
|
type: RlnConfig
|
||||||
fields:
|
fields:
|
||||||
contract_address: "0xB9cd878C90E49F797B4431fBF4fb333108CB90e6"
|
contract_address: "0xB9cd878C90E49F797B4431fBF4fb333108CB90e6"
|
||||||
chain_id: 59141
|
chain_id: 59141
|
||||||
@ -291,7 +307,6 @@ If the `mode` set is `core`, the initialised `WakuNode` SHOULD use:
|
|||||||
- [RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/11/relay.md)
|
- [RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/11/relay.md)
|
||||||
- [LIGHTPUSH](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/19/lightpush.md) as service node
|
- [LIGHTPUSH](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/19/lightpush.md) as service node
|
||||||
- [FILTER](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/12/filter.md) as service node
|
- [FILTER](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/12/filter.md) as service node
|
||||||
- [PEER-EXCHANGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/34/peer-exchange.md) as service node
|
|
||||||
- [STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) as client
|
- [STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) as client
|
||||||
- [METADATA](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/66/metadata.md) as client and service node
|
- [METADATA](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/66/metadata.md) as client and service node
|
||||||
- [P2P-RELIABILITY](/standards/application/p2p-reliability.md)
|
- [P2P-RELIABILITY](/standards/application/p2p-reliability.md)
|
||||||
@ -302,6 +317,106 @@ If the `mode` set is `core`, the initialised `WakuNode` SHOULD use:
|
|||||||
`edge` mode SHOULD be used if node functions in resource restricted environment,
|
`edge` mode SHOULD be used if node functions in resource restricted environment,
|
||||||
whereas `core` SHOULD be used if node has no strong hardware or bandwidth restrictions.
|
whereas `core` SHOULD be used if node has no strong hardware or bandwidth restrictions.
|
||||||
|
|
||||||
|
## Send messages
|
||||||
|
|
||||||
|
#### Type definitions
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
types:
|
||||||
|
MessageEnvelope:
|
||||||
|
type: object
|
||||||
|
fields:
|
||||||
|
content_topic:
|
||||||
|
type: string
|
||||||
|
description: "Content-based filtering field as defined in [TOPICS](https://github.com/vacp2p/rfc-index/blob/main/waku/informational/23/topics.md#content-topics)"
|
||||||
|
payload:
|
||||||
|
type: array<byte>
|
||||||
|
description: "The message data to be sent."
|
||||||
|
ephemeral:
|
||||||
|
type: bool
|
||||||
|
default: false
|
||||||
|
description: "Whether the message is ephemeral. Read at [ATTRIBUTES](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md#message-attributes)"
|
||||||
|
|
||||||
|
RequestId:
|
||||||
|
type: string
|
||||||
|
description: "A unique identifier for a request"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Function definitions
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
functions:
|
||||||
|
send:
|
||||||
|
description: "Send a message through the network."
|
||||||
|
parameters:
|
||||||
|
- name: message
|
||||||
|
type: MessageEnvelope
|
||||||
|
description: "Parameters for sending the message."
|
||||||
|
returns:
|
||||||
|
type: result<RequestId, error>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Extended definitions
|
||||||
|
|
||||||
|
A first `message` sent with a certain `contentTopic`
|
||||||
|
SHOULD trigger a subscription based on `Subscribe to messages` section for such `contentTopic`.
|
||||||
|
|
||||||
|
The node uses [P2P-RELIABILITY](/standards/application/p2p-reliability.md) strategies to ensure message delivery.
|
||||||
|
|
||||||
|
## Event source
|
||||||
|
|
||||||
|
#### Type definitions
|
||||||
|
|
||||||
|
```yml
|
||||||
|
types:
|
||||||
|
MessageSentEvent:
|
||||||
|
type: object
|
||||||
|
description: "Event emitted when a message is sent to the network"
|
||||||
|
fields:
|
||||||
|
request_id:
|
||||||
|
type: RequestId
|
||||||
|
description: "The request ID associated with the sent message"
|
||||||
|
message_hash:
|
||||||
|
type: string
|
||||||
|
description: "Hash of the message that got sent to the network"
|
||||||
|
|
||||||
|
MessageErrorEvent:
|
||||||
|
type: object
|
||||||
|
description: "Event emitted when a message send operation fails"
|
||||||
|
fields:
|
||||||
|
request_id:
|
||||||
|
type: RequestId
|
||||||
|
description: "The request ID associated with the failed message"
|
||||||
|
message_hash:
|
||||||
|
type: string
|
||||||
|
description: "Optional property. Hash of the message that got error"
|
||||||
|
error:
|
||||||
|
type: string
|
||||||
|
description: "Error message describing what went wrong"
|
||||||
|
|
||||||
|
MessagePropagatedEvent:
|
||||||
|
type: object
|
||||||
|
description: "Confirmation that a message has been correctly delivered to some neighbouring nodes."
|
||||||
|
fields:
|
||||||
|
request_id:
|
||||||
|
type: RequestId
|
||||||
|
description: "The request ID associated with the propagated message in the network"
|
||||||
|
message_hash:
|
||||||
|
type: string
|
||||||
|
description: "Hash of the message that got propagated within the network"
|
||||||
|
|
||||||
|
MessageEvents:
|
||||||
|
type: event_emitter
|
||||||
|
description: "Event source for message-related events"
|
||||||
|
events:
|
||||||
|
"message:sent":
|
||||||
|
type: MessageSentEvent
|
||||||
|
"message:error":
|
||||||
|
type: MessageErrorEvent
|
||||||
|
"message:propagated":
|
||||||
|
type: MessagePropagatedEvent
|
||||||
|
```
|
||||||
|
|
||||||
## The Validation API
|
## The Validation API
|
||||||
|
|
||||||
[WAKU2-RLN-RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/17/rln-relay.md) is currently the primary message validation mechanism in place.
|
[WAKU2-RLN-RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/17/rln-relay.md) is currently the primary message validation mechanism in place.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user