2024-01-15 16:12:01 -08:00
import type { PeerId } from "@libp2p/interface" ;
2022-12-05 17:00:24 +11:00
2025-01-31 00:16:00 +01:00
import type { ConnectionManagerOptions } from "./connection_manager.js" ;
import type { FilterProtocolOptions } from "./filter.js" ;
2023-11-28 00:40:59 +01:00
import type { CreateLibp2pOptions } from "./libp2p.js" ;
2025-02-25 22:40:03 +01:00
import type { LightPushProtocolOptions } from "./light_push.js" ;
2023-02-24 23:22:04 +11:00
import type { IDecodedMessage } from "./message.js" ;
2025-02-25 22:40:03 +01:00
import type { ThisAndThat , ThisOrThat } from "./misc.js" ;
feat!: Introduce routing info concept
Concepts are being mixed up between the global network config (static vs auto sharding), that needs to be the same of all nodes in the network, individual node configuration (eg relay node subscribing to a given shard), and the routing characteristic of a specific message (eg pubsub topic, shard).
This stops proper configuration of nwaku post 0.36.0 because we know need to be deliberate on whether nwaku nodes are running with auto or static sharding.
It also included various back and forth conversions between shards, pubsub topics, etc.
With this change, we tidy up the network configuration, and make it explicit whether it is static or auto sharded.
We also introduce the concept of routing info, which is specific to a message, and tied to the overall network configuration.
Routing info abstract pubsub topic, shard, and autosharding needs. Which should lead to easier tidy up of the pubsub concept at a later stage.
# Conflicts:
# packages/core/src/lib/connection_manager/connection_manager.ts
# packages/core/src/lib/metadata/metadata.ts
# packages/interfaces/src/metadata.ts
# packages/interfaces/src/sharding.ts
# packages/relay/src/create.ts
# packages/sdk/src/filter/filter.ts
# packages/sdk/src/filter/types.ts
# packages/sdk/src/light_push/light_push.spec.ts
# packages/tests/tests/sharding/auto_sharding.spec.ts
# packages/tests/tests/sharding/static_sharding.spec.ts
# Conflicts:
# packages/sdk/src/store/store.ts
2025-07-11 13:33:45 +10:00
import { NetworkConfig } from "./sharding.js" ;
2025-01-31 00:16:00 +01:00
import type { StoreProtocolOptions } from "./store.js" ;
2022-12-05 17:00:24 +11:00
export enum Protocols {
Relay = "relay" ,
Store = "store" ,
LightPush = "lightpush" ,
2023-08-16 20:18:13 +05:30
Filter = "filter"
2022-12-05 17:00:24 +11:00
}
2025-01-31 00:16:00 +01:00
export type CreateNodeOptions = {
2024-07-03 12:09:34 +05:30
/ * *
2025-01-31 00:16:00 +01:00
* Set the user agent string to be used in identification of the node .
2024-07-26 01:21:52 +03:00
*
2025-01-31 00:16:00 +01:00
* @default "js-waku"
2024-07-26 01:21:52 +03:00
* /
2025-01-31 00:16:00 +01:00
userAgent? : string ;
2025-02-27 14:00:28 +01:00
/ * *
* Starts Waku node automatically upon creations .
* Calls { @link @waku / sdk ! WakuNode . start } before returning { @link @waku / sdk ! WakuNode }
*
* @default true
* /
autoStart? : boolean ;
2024-07-26 01:21:52 +03:00
/ * *
2024-08-13 05:23:20 +05:30
* Configuration for determining the network in use .
* Network configuration refers to the shards and clusters used in the network .
2024-07-26 01:21:52 +03:00
*
2024-08-13 05:23:20 +05:30
* If using Static Sharding :
* Cluster ID and shards are specified in the format : clusterId : number , shards : number [ ]
* The default value is configured for The Waku Network = > clusterId : 0 , shards : [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ]
2024-07-26 01:21:52 +03:00
* To learn more about the sharding specification , see [ Relay Sharding ] ( https : //rfc.vac.dev/spec/51/).
*
2024-08-13 05:23:20 +05:30
* If using Auto Sharding :
* Cluster ID and content topics are specified in the format : clusterId : number , contentTopics : string [ ]
* Content topics are used to determine the shards to be configured for the network .
* Cluster ID is optional , and defaults to The Waku Network ' s cluster ID = > 0
* To specify content topics , see [ Waku v2 Topic Usage Recommendations ] ( https : //github.com/vacp2p/rfc-index/blob/main/waku/informational/23/topics.md#content-topics) for details
*
* @default { clusterId : 1 , shards : [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] }
2024-04-30 01:47:45 +02:00
* /
2024-08-13 05:23:20 +05:30
networkConfig? : NetworkConfig ;
2025-01-31 00:16:00 +01:00
2023-02-09 13:15:23 +05:30
/ * *
2024-02-08 12:09:10 -08:00
* You can pass options to the ` Libp2p ` instance used by { @link @waku / sdk ! WakuNode } using the ` libp2p ` property .
2023-02-09 13:15:23 +05:30
* This property is the same type as the one passed to [ ` Libp2p.create ` ] ( https : //github.com/libp2p/js-libp2p/blob/master/doc/API.md#create)
* apart that we made the ` modules ` property optional and partial ,
* allowing its omission and letting Waku set good defaults .
2024-02-08 12:09:10 -08:00
* Notes that some values are overridden by { @link @waku / sdk ! WakuNode } to ensure it implements the Waku protocol .
2023-02-09 13:15:23 +05:30
* /
2023-11-28 00:40:59 +01:00
libp2p? : Partial < CreateLibp2pOptions > ;
2025-01-31 00:16:00 +01:00
2024-01-24 18:24:03 +05:30
/ * *
* Number of peers to connect to , for the usage of the protocol .
2025-02-25 22:40:03 +01:00
* This is used by Filter to retrieve messages .
2025-01-31 00:16:00 +01:00
*
* @default 2 .
2024-01-24 18:24:03 +05:30
* /
numPeersToUse? : number ;
2025-01-31 00:16:00 +01:00
2023-02-09 13:15:23 +05:30
/ * *
* Byte array used as key for the noise protocol used for connection encryption
* by [ ` Libp2p.create ` ] ( https : //github.com/libp2p/js-libp2p/blob/master/doc/API.md#create)
* This is only used for test purposes to not run out of entropy during CI runs .
* /
staticNoiseKey? : Uint8Array ;
2025-01-31 00:16:00 +01:00
2023-02-09 13:15:23 +05:30
/ * *
* Use recommended bootstrap method to discovery and connect to new nodes .
* /
defaultBootstrap? : boolean ;
2025-01-31 00:16:00 +01:00
2025-05-30 16:27:00 +05:30
/ * *
* Enable or disable specific discovery methods .
*
* @default { peerExchange : true , dns : true , localPeerCache : true }
* /
discovery ? : {
peerExchange : boolean ;
dns : boolean ;
localPeerCache : boolean ;
} ;
2024-03-04 10:56:20 +01:00
/ * *
* List of peers to use to bootstrap the node . Ignored if defaultBootstrap is set to true .
* /
bootstrapPeers? : string [ ] ;
2025-01-31 00:16:00 +01:00
/ * *
* Configuration for connection manager .
* If not specified - default values are applied .
* /
connectionManager? : Partial < ConnectionManagerOptions > ;
/ * *
* Configuration for Filter protocol .
* If not specified - default values are applied .
* /
filter? : Partial < FilterProtocolOptions > ;
2025-01-28 17:57:49 +05:30
/ * *
* Options for the Store protocol .
2025-02-25 22:40:03 +01:00
* If not specified - default values are applied .
2025-01-28 17:57:49 +05:30
* /
store? : Partial < StoreProtocolOptions > ;
2025-02-25 22:40:03 +01:00
/ * *
* Options for the LightPush protocol .
* If not specified - default values are applied .
* /
lightPush? : Partial < LightPushProtocolOptions > ;
2023-02-02 08:02:06 +05:30
} ;
2023-02-24 23:22:04 +11:00
export type Callback < T extends IDecodedMessage > = (
2023-08-16 20:18:13 +05:30
msg : T
2023-02-24 23:22:04 +11:00
) = > void | Promise < void > ;
2022-12-05 17:00:24 +11:00
2024-03-12 16:40:08 +05:30
export enum ProtocolError {
2025-02-25 22:40:03 +01:00
//
// GENERAL ERRORS SECTION
//
/ * *
* Could not determine the origin of the fault . Best to check connectivity and try again
* * /
2023-05-17 23:40:52 +02:00
GENERIC_FAIL = "Generic error" ,
2025-02-25 22:40:03 +01:00
2023-10-17 09:14:45 +11:00
/ * *
2025-02-25 22:40:03 +01:00
* The remote peer rejected the message . Information provided by the remote peer
* is logged . Review message validity , or mitigation for ` NO_PEER_AVAILABLE `
* or ` DECODE_FAILED ` can be used .
2023-10-17 09:14:45 +11:00
* /
2025-02-25 22:40:03 +01:00
REMOTE_PEER_REJECTED = "Remote peer rejected" ,
2023-10-17 09:14:45 +11:00
/ * *
* Failure to protobuf decode the message . May be due to a remote peer issue ,
* ensuring that messages are sent via several peer enable mitigation of this error .
* /
2023-05-17 23:40:52 +02:00
DECODE_FAILED = "Failed to decode" ,
2025-02-25 22:40:03 +01:00
2023-09-20 16:18:22 +10:00
/ * *
* Failure to find a peer with suitable protocols . This may due to a connection issue .
* Mitigation can be : retrying after a given time period , display connectivity issue
* to user or listening for ` peer:connected:bootstrap ` or ` peer:connected:peer-exchange `
* on the connection manager before retrying .
* /
2023-09-20 15:56:47 +10:00
NO_PEER_AVAILABLE = "No peer available" ,
2025-02-25 22:40:03 +01:00
2024-05-14 16:31:38 +05:30
/ * *
* Failure to find a stream to the peer . This may be because the connection with the peer is not still alive .
* Mitigation can be : retrying after a given time period , or mitigation for ` NO_PEER_AVAILABLE ` can be used .
* /
NO_STREAM_AVAILABLE = "No stream available" ,
2025-02-25 22:40:03 +01:00
2023-09-20 16:18:22 +10:00
/ * *
2023-09-21 11:32:34 +10:00
* The remote peer did not behave as expected . Mitigation for ` NO_PEER_AVAILABLE `
2023-09-20 16:18:22 +10:00
* or ` DECODE_FAILED ` can be used .
* /
2024-08-29 11:20:19 +02:00
NO_RESPONSE = "No response received" ,
2025-02-25 22:40:03 +01:00
//
// SEND ERRORS SECTION
//
2023-09-21 11:32:34 +10:00
/ * *
2025-02-25 22:40:03 +01:00
* Failure to protobuf encode the message . This is not recoverable and needs
* further investigation .
2023-09-21 11:32:34 +10:00
* /
2025-02-25 22:40:03 +01:00
ENCODE_FAILED = "Failed to encode" ,
2024-03-13 19:33:50 +05:30
/ * *
2025-02-25 22:40:03 +01:00
* The message payload is empty , making the message invalid . Ensure that a non - empty
* payload is set on the outgoing message .
2024-03-13 19:33:50 +05:30
* /
2025-02-25 22:40:03 +01:00
EMPTY_PAYLOAD = "Payload is empty" ,
2024-08-29 11:20:19 +02:00
/ * *
2025-02-25 22:40:03 +01:00
* The message size is above the maximum message size allowed on the Waku Network .
* Compressing the message or using an alternative strategy for large messages is recommended .
2024-08-29 11:20:19 +02:00
* /
2025-02-25 22:40:03 +01:00
SIZE_TOO_BIG = "Size is too big" ,
2024-08-29 11:20:19 +02:00
/ * *
2025-02-25 22:40:03 +01:00
* The PubsubTopic passed to the send function is not configured on the Waku node .
* Please ensure that the PubsubTopic is used when initializing the Waku node .
2024-08-29 11:20:19 +02:00
* /
2025-02-25 22:40:03 +01:00
TOPIC_NOT_CONFIGURED = "Topic not configured" ,
2024-08-29 11:20:19 +02:00
/ * *
2025-02-25 22:40:03 +01:00
* Fails when
2024-08-29 11:20:19 +02:00
* /
2025-02-25 22:40:03 +01:00
STREAM_ABORTED = "Stream aborted" ,
2024-08-29 11:20:19 +02:00
/ * *
* General proof generation error message .
* nwaku : https : //github.com/waku-org/nwaku/blob/c3cb06ac6c03f0f382d3941ea53b330f6a8dd127/waku/waku_rln_relay/group_manager/group_manager_base.nim#L201C19-L201C42
* /
2025-02-25 22:40:03 +01:00
RLN_PROOF_GENERATION = "Proof generation failed" ,
//
// RECEIVE ERRORS SECTION
//
/ * *
* The pubsub topic configured on the decoder does not match the pubsub topic setup on the protocol .
* Ensure that the pubsub topic used for decoder creation is the same as the one used for protocol .
* /
TOPIC_DECODER_MISMATCH = "Topic decoder mismatch" ,
/ * *
* The topics passed in the decoders do not match each other , or don ' t exist at all .
* Ensure that all the pubsub topics used in the decoders are valid and match each other .
* /
INVALID_DECODER_TOPICS = "Invalid decoder topics"
2023-05-17 23:40:52 +02:00
}
2024-03-11 18:50:34 +05:30
export interface Failure {
2024-03-12 16:40:08 +05:30
error : ProtocolError ;
2024-03-11 18:50:34 +05:30
peerId? : PeerId ;
}
2024-05-09 16:51:08 +05:30
export type CoreProtocolResult = ThisOrThat <
"success" ,
PeerId ,
"failure" ,
Failure
> ;
export type SDKProtocolResult = ThisAndThat <
"successes" ,
PeerId [ ] ,
"failures" ,
Failure [ ]
> ;