@railgun-community/waku-broadcaster-client-web 9.0.5 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/models/broadcaster-config.d.ts +23 -0
- package/dist/models/broadcaster-config.js +78 -1
- package/dist/models/broadcaster-config.js.map +1 -1
- package/dist/models/constants.d.ts +16 -2
- package/dist/models/constants.js +30 -8
- package/dist/models/constants.js.map +1 -1
- package/dist/models/export-models.d.ts +6 -0
- package/dist/models/export-models.js.map +1 -1
- package/dist/waku/waku-broadcaster-peer-discovery-core-base.d.ts +54 -0
- package/dist/waku/waku-broadcaster-peer-discovery-core-base.js +223 -0
- package/dist/waku/waku-broadcaster-peer-discovery-core-base.js.map +1 -0
- package/dist/waku/waku-broadcaster-waku-core-base.d.ts +37 -6
- package/dist/waku/waku-broadcaster-waku-core-base.js +35 -10
- package/dist/waku/waku-broadcaster-waku-core-base.js.map +1 -1
- package/dist/waku/waku-broadcaster-waku-core.d.ts +27 -3
- package/dist/waku/waku-broadcaster-waku-core.js +120 -42
- package/dist/waku/waku-broadcaster-waku-core.js.map +1 -1
- package/dist/waku/waku-healthcheck.d.ts +62 -0
- package/dist/waku/waku-healthcheck.js +88 -0
- package/dist/waku/waku-healthcheck.js.map +1 -0
- package/dist/waku/waku-observers.d.ts +1 -0
- package/dist/waku/waku-observers.js +10 -4
- package/dist/waku/waku-observers.js.map +1 -1
- package/dist/waku/waku-peer-discovery.d.ts +31 -0
- package/dist/waku/waku-peer-discovery.js +90 -0
- package/dist/waku/waku-peer-discovery.js.map +1 -0
- package/dist/waku-broadcaster-client.d.ts +3 -0
- package/dist/waku-broadcaster-client.js +55 -8
- package/dist/waku-broadcaster-client.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ const broadcasterOptions = {
|
|
|
31
31
|
peerDiscoveryTimeout: 10000, // 10 seconds
|
|
32
32
|
additionalDirectPeers: [], // Optional: Direct peers to connect to
|
|
33
33
|
poiActiveListKeys: [], // Optional: POI keys
|
|
34
|
-
useDNSDiscovery:
|
|
34
|
+
useDNSDiscovery: true, // Optional: DNS discovery is always on
|
|
35
35
|
useCustomDNS: { // Optional: Custom DNS config
|
|
36
36
|
onlyCustom: false,
|
|
37
37
|
enrTreePeers: []
|
|
@@ -182,4 +182,3 @@ This package relies on:
|
|
|
182
182
|
## License
|
|
183
183
|
|
|
184
184
|
MIT
|
|
185
|
-
|
|
@@ -4,6 +4,7 @@ export type CustomDNSConfig = {
|
|
|
4
4
|
};
|
|
5
5
|
export declare class BroadcasterConfig {
|
|
6
6
|
static IS_DEV: boolean;
|
|
7
|
+
static enableHealthcheckLogs: boolean;
|
|
7
8
|
static trustedFeeSigner: string | string[];
|
|
8
9
|
static feeExpirationTimeout: number;
|
|
9
10
|
static historicalLookBackTime: number;
|
|
@@ -14,4 +15,26 @@ export declare class BroadcasterConfig {
|
|
|
14
15
|
static useDNSDiscovery: boolean;
|
|
15
16
|
static customDNS: CustomDNSConfig | undefined;
|
|
16
17
|
static additionalDirectPeers: string[];
|
|
18
|
+
static storePeers: string[];
|
|
19
|
+
static clusterId: number;
|
|
20
|
+
static shardId: number;
|
|
21
|
+
static pubSubTopic: string;
|
|
22
|
+
static configureWakuNetwork(options: {
|
|
23
|
+
clusterId?: number;
|
|
24
|
+
shardId?: number;
|
|
25
|
+
pubSubTopic?: string;
|
|
26
|
+
}): void;
|
|
27
|
+
static getWakuRoutingInfo(): import("./constants.js").WakuShardInfo;
|
|
28
|
+
static getWakuNetworkConfig(): import("./constants.js").WakuNetworkConfig;
|
|
29
|
+
private static normalizeStringArray;
|
|
30
|
+
static configurePeerConnections(options: {
|
|
31
|
+
useDNSDiscovery?: boolean;
|
|
32
|
+
useCustomDNS?: CustomDNSConfig;
|
|
33
|
+
dnsDiscoveryUrls?: string[];
|
|
34
|
+
additionalDirectPeers?: string[];
|
|
35
|
+
additionalPeers?: string[];
|
|
36
|
+
storePeers?: string[];
|
|
37
|
+
}): void;
|
|
38
|
+
static shouldUseDefaultBootstrap(): boolean;
|
|
39
|
+
static setHealthcheckLoggingEnabled(enabled: boolean): void;
|
|
17
40
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { createWakuNetworkConfig, createWakuShardInfo, formatWakuRelayShardTopic, parseWakuRelayShardTopic, WAKU_RAILGUN_DEFAULT_ENR_TREE_URL, WAKU_RAILGUN_DEFAULT_SHARD, } from './constants.js';
|
|
1
2
|
export class BroadcasterConfig {
|
|
2
3
|
static IS_DEV = false;
|
|
4
|
+
static enableHealthcheckLogs = false;
|
|
3
5
|
static trustedFeeSigner;
|
|
4
6
|
static feeExpirationTimeout = 120_000;
|
|
5
7
|
static historicalLookBackTime = 1 * 60 * 1000;
|
|
@@ -7,8 +9,83 @@ export class BroadcasterConfig {
|
|
|
7
9
|
static authorizedFeeVariancePercentageUpper = 0.30;
|
|
8
10
|
static MINIMUM_BROADCASTER_VERSION = '8.0.0';
|
|
9
11
|
static MAXIMUM_BROADCASTER_VERSION = '8.999.0';
|
|
10
|
-
static useDNSDiscovery =
|
|
12
|
+
static useDNSDiscovery = true;
|
|
11
13
|
static customDNS = undefined;
|
|
12
14
|
static additionalDirectPeers = [];
|
|
15
|
+
static storePeers = [];
|
|
16
|
+
static clusterId = WAKU_RAILGUN_DEFAULT_SHARD.clusterId;
|
|
17
|
+
static shardId = WAKU_RAILGUN_DEFAULT_SHARD.shardId;
|
|
18
|
+
static pubSubTopic = WAKU_RAILGUN_DEFAULT_SHARD.pubsubTopic;
|
|
19
|
+
static configureWakuNetwork(options) {
|
|
20
|
+
const hasClusterId = options.clusterId !== undefined;
|
|
21
|
+
const hasShardId = options.shardId !== undefined;
|
|
22
|
+
let clusterId = options.clusterId ?? this.clusterId;
|
|
23
|
+
let shardId = options.shardId ?? this.shardId;
|
|
24
|
+
if (!hasClusterId && !hasShardId && options.pubSubTopic) {
|
|
25
|
+
const parsed = parseWakuRelayShardTopic(options.pubSubTopic);
|
|
26
|
+
if (parsed) {
|
|
27
|
+
clusterId = parsed.clusterId;
|
|
28
|
+
shardId = parsed.shardId;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
this.clusterId = clusterId;
|
|
32
|
+
this.shardId = shardId;
|
|
33
|
+
this.pubSubTopic =
|
|
34
|
+
hasClusterId || hasShardId || !options.pubSubTopic
|
|
35
|
+
? formatWakuRelayShardTopic(clusterId, shardId)
|
|
36
|
+
: options.pubSubTopic;
|
|
37
|
+
}
|
|
38
|
+
static getWakuRoutingInfo() {
|
|
39
|
+
return createWakuShardInfo(this.clusterId, this.shardId, this.pubSubTopic);
|
|
40
|
+
}
|
|
41
|
+
static getWakuNetworkConfig() {
|
|
42
|
+
return createWakuNetworkConfig(this.clusterId, this.shardId);
|
|
43
|
+
}
|
|
44
|
+
static normalizeStringArray(values) {
|
|
45
|
+
if (!values) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return [...new Set(values.map(value => value.trim()).filter(Boolean))];
|
|
49
|
+
}
|
|
50
|
+
static configurePeerConnections(options) {
|
|
51
|
+
const dnsDiscoveryUrls = this.normalizeStringArray(options.dnsDiscoveryUrls);
|
|
52
|
+
const additionalDirectPeers = this.normalizeStringArray(options.additionalDirectPeers);
|
|
53
|
+
const additionalPeers = this.normalizeStringArray(options.additionalPeers);
|
|
54
|
+
const storePeers = this.normalizeStringArray(options.storePeers);
|
|
55
|
+
this.additionalDirectPeers = [
|
|
56
|
+
...new Set([
|
|
57
|
+
...additionalDirectPeers,
|
|
58
|
+
...additionalPeers,
|
|
59
|
+
...storePeers,
|
|
60
|
+
]),
|
|
61
|
+
];
|
|
62
|
+
this.storePeers = storePeers;
|
|
63
|
+
if (dnsDiscoveryUrls.length > 0) {
|
|
64
|
+
this.useDNSDiscovery = true;
|
|
65
|
+
this.customDNS = {
|
|
66
|
+
onlyCustom: true,
|
|
67
|
+
enrTreePeers: dnsDiscoveryUrls,
|
|
68
|
+
};
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.useDNSDiscovery = true;
|
|
72
|
+
this.customDNS = options.useCustomDNS
|
|
73
|
+
? {
|
|
74
|
+
onlyCustom: options.useCustomDNS.onlyCustom,
|
|
75
|
+
enrTreePeers: this.normalizeStringArray(options.useCustomDNS.enrTreePeers),
|
|
76
|
+
}
|
|
77
|
+
: {
|
|
78
|
+
onlyCustom: true,
|
|
79
|
+
enrTreePeers: [WAKU_RAILGUN_DEFAULT_ENR_TREE_URL],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
static shouldUseDefaultBootstrap() {
|
|
83
|
+
const hasCustomDnsPeers = Boolean(this.customDNS?.enrTreePeers.length);
|
|
84
|
+
const hasDirectPeers = this.additionalDirectPeers.length > 0;
|
|
85
|
+
return !hasCustomDnsPeers && !hasDirectPeers;
|
|
86
|
+
}
|
|
87
|
+
static setHealthcheckLoggingEnabled(enabled) {
|
|
88
|
+
this.enableHealthcheckLogs = enabled;
|
|
89
|
+
}
|
|
13
90
|
}
|
|
14
91
|
//# sourceMappingURL=broadcaster-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcaster-config.js","sourceRoot":"","sources":["../../src/models/broadcaster-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"broadcaster-config.js","sourceRoot":"","sources":["../../src/models/broadcaster-config.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createWakuNetworkConfig,\n createWakuShardInfo,\n formatWakuRelayShardTopic,\n parseWakuRelayShardTopic,\n WAKU_RAILGUN_DEFAULT_ENR_TREE_URL,\n WAKU_RAILGUN_DEFAULT_SHARD,\n} from './constants.js';\n\nexport type CustomDNSConfig = {\n onlyCustom: boolean,\n enrTreePeers: string[]\n}\n\nexport class BroadcasterConfig {\n static IS_DEV = false;\n static enableHealthcheckLogs = false;\n\n static trustedFeeSigner: string | string[];\n\n static feeExpirationTimeout = 120_000; // 2 minutes\n static historicalLookBackTime = 1 * 60 * 1000; // 1 minute\n\n static authorizedFeeVariancePercentageLower = 0.10; // 10% lower variance\n static authorizedFeeVariancePercentageUpper = 0.30; // 30% upper variance\n\n static MINIMUM_BROADCASTER_VERSION = '8.0.0';\n static MAXIMUM_BROADCASTER_VERSION = '8.999.0';\n\n static useDNSDiscovery = true\n static customDNS: CustomDNSConfig | undefined = undefined\n\n static additionalDirectPeers: string[] = []\n static storePeers: string[] = []\n\n static clusterId = WAKU_RAILGUN_DEFAULT_SHARD.clusterId;\n static shardId = WAKU_RAILGUN_DEFAULT_SHARD.shardId;\n static pubSubTopic = WAKU_RAILGUN_DEFAULT_SHARD.pubsubTopic;\n\n static configureWakuNetwork(options: {\n clusterId?: number;\n shardId?: number;\n pubSubTopic?: string;\n }) {\n const hasClusterId = options.clusterId !== undefined;\n const hasShardId = options.shardId !== undefined;\n\n let clusterId = options.clusterId ?? this.clusterId;\n let shardId = options.shardId ?? this.shardId;\n\n if (!hasClusterId && !hasShardId && options.pubSubTopic) {\n const parsed = parseWakuRelayShardTopic(options.pubSubTopic);\n if (parsed) {\n clusterId = parsed.clusterId;\n shardId = parsed.shardId;\n }\n }\n\n this.clusterId = clusterId;\n this.shardId = shardId;\n this.pubSubTopic =\n hasClusterId || hasShardId || !options.pubSubTopic\n ? formatWakuRelayShardTopic(clusterId, shardId)\n : options.pubSubTopic;\n }\n\n static getWakuRoutingInfo() {\n return createWakuShardInfo(\n this.clusterId,\n this.shardId,\n this.pubSubTopic,\n );\n }\n\n static getWakuNetworkConfig() {\n return createWakuNetworkConfig(this.clusterId, this.shardId);\n }\n\n private static normalizeStringArray(values?: string[]): string[] {\n if (!values) {\n return [];\n }\n\n return [...new Set(values.map(value => value.trim()).filter(Boolean))];\n }\n\n static configurePeerConnections(options: {\n useDNSDiscovery?: boolean;\n useCustomDNS?: CustomDNSConfig;\n dnsDiscoveryUrls?: string[];\n additionalDirectPeers?: string[];\n additionalPeers?: string[];\n storePeers?: string[];\n }) {\n const dnsDiscoveryUrls = this.normalizeStringArray(options.dnsDiscoveryUrls);\n const additionalDirectPeers = this.normalizeStringArray(\n options.additionalDirectPeers,\n );\n const additionalPeers = this.normalizeStringArray(options.additionalPeers);\n const storePeers = this.normalizeStringArray(options.storePeers);\n\n this.additionalDirectPeers = [\n ...new Set([\n ...additionalDirectPeers,\n ...additionalPeers,\n ...storePeers,\n ]),\n ];\n this.storePeers = storePeers;\n\n if (dnsDiscoveryUrls.length > 0) {\n this.useDNSDiscovery = true;\n this.customDNS = {\n onlyCustom: true,\n enrTreePeers: dnsDiscoveryUrls,\n };\n return;\n }\n\n this.useDNSDiscovery = true;\n this.customDNS = options.useCustomDNS\n ? {\n onlyCustom: options.useCustomDNS.onlyCustom,\n enrTreePeers: this.normalizeStringArray(options.useCustomDNS.enrTreePeers),\n }\n : {\n onlyCustom: true,\n enrTreePeers: [WAKU_RAILGUN_DEFAULT_ENR_TREE_URL],\n };\n }\n\n static shouldUseDefaultBootstrap(): boolean {\n const hasCustomDnsPeers = Boolean(this.customDNS?.enrTreePeers.length);\n const hasDirectPeers = this.additionalDirectPeers.length > 0;\n\n return !hasCustomDnsPeers && !hasDirectPeers;\n }\n\n static setHealthcheckLoggingEnabled(enabled: boolean) {\n this.enableHealthcheckLogs = enabled;\n }\n}\n"]}
|
|
@@ -1,13 +1,27 @@
|
|
|
1
|
-
export
|
|
2
|
-
export declare const WAKU_RAILGUN_DEFAULT_SHARD: {
|
|
1
|
+
export type WakuShardInfo = {
|
|
3
2
|
clusterId: number;
|
|
4
3
|
shard: number;
|
|
5
4
|
shardId: number;
|
|
6
5
|
pubsubTopic: string;
|
|
7
6
|
};
|
|
7
|
+
export type WakuNetworkConfig = {
|
|
8
|
+
clusterId: number;
|
|
9
|
+
shards: number[];
|
|
10
|
+
};
|
|
11
|
+
export declare const formatWakuRelayShardTopic: (clusterId: number, shardId: number) => string;
|
|
12
|
+
export declare const createWakuShardInfo: (clusterId: number, shardId: number, pubsubTopic?: string) => WakuShardInfo;
|
|
13
|
+
export declare const createWakuNetworkConfig: (clusterId: number, shardId: number) => WakuNetworkConfig;
|
|
14
|
+
export declare const parseWakuRelayShardTopic: (pubSubTopic: string) => {
|
|
15
|
+
clusterId: number;
|
|
16
|
+
shardId: number;
|
|
17
|
+
} | undefined;
|
|
18
|
+
export declare const WAKU_RAILGUN_PUB_SUB_TOPIC: string;
|
|
19
|
+
export declare const WAKU_RAILGUN_DEFAULT_SHARD: WakuShardInfo;
|
|
20
|
+
export declare const WAKU_RAILGUN_DEFAULT_NETWORK_CONFIG: WakuNetworkConfig;
|
|
8
21
|
export declare const WAKU_RAILGUN_DEFAULT_SHARDS: {
|
|
9
22
|
clusterId: number;
|
|
10
23
|
shards: number[];
|
|
11
24
|
};
|
|
25
|
+
export declare const WAKU_RAILGUN_DEFAULT_ENR_TREE_URL = "enrtree://APMYHUVNQWHJNPI5L2KQ765EMCKUAMRWPUH3U2QIKPK6XEV3OW442@discovery.rootedinprivacy.com";
|
|
12
26
|
export declare const WAKU_RAILGUN_DEFAULT_PEERS_WEB: string[];
|
|
13
27
|
export declare const WAKU_RAILGUN_DEFAULT_PEERS_NODE: string[];
|
package/dist/models/constants.js
CHANGED
|
@@ -1,14 +1,36 @@
|
|
|
1
|
-
export const
|
|
2
|
-
export const
|
|
3
|
-
clusterId
|
|
4
|
-
shard:
|
|
5
|
-
shardId
|
|
6
|
-
pubsubTopic
|
|
1
|
+
export const formatWakuRelayShardTopic = (clusterId, shardId) => `/waku/2/rs/${clusterId}/${shardId}`;
|
|
2
|
+
export const createWakuShardInfo = (clusterId, shardId, pubsubTopic = formatWakuRelayShardTopic(clusterId, shardId)) => ({
|
|
3
|
+
clusterId,
|
|
4
|
+
shard: shardId,
|
|
5
|
+
shardId,
|
|
6
|
+
pubsubTopic,
|
|
7
|
+
});
|
|
8
|
+
export const createWakuNetworkConfig = (clusterId, shardId) => ({
|
|
9
|
+
clusterId,
|
|
10
|
+
shards: [shardId],
|
|
11
|
+
});
|
|
12
|
+
export const parseWakuRelayShardTopic = (pubSubTopic) => {
|
|
13
|
+
const match = /^\/waku\/2\/rs\/(\d+)\/(\d+)$/.exec(pubSubTopic);
|
|
14
|
+
if (!match) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
clusterId: Number(match[1]),
|
|
19
|
+
shardId: Number(match[2]),
|
|
20
|
+
};
|
|
7
21
|
};
|
|
22
|
+
export const WAKU_RAILGUN_PUB_SUB_TOPIC = formatWakuRelayShardTopic(5, 1);
|
|
23
|
+
export const WAKU_RAILGUN_DEFAULT_SHARD = createWakuShardInfo(5, 1);
|
|
24
|
+
export const WAKU_RAILGUN_DEFAULT_NETWORK_CONFIG = createWakuNetworkConfig(5, 1);
|
|
8
25
|
export const WAKU_RAILGUN_DEFAULT_SHARDS = {
|
|
9
|
-
clusterId:
|
|
26
|
+
clusterId: 5,
|
|
10
27
|
shards: [0, 1, 2, 3, 4, 5],
|
|
11
28
|
};
|
|
12
|
-
export const
|
|
29
|
+
export const WAKU_RAILGUN_DEFAULT_ENR_TREE_URL = 'enrtree://APMYHUVNQWHJNPI5L2KQ765EMCKUAMRWPUH3U2QIKPK6XEV3OW442@discovery.rootedinprivacy.com';
|
|
30
|
+
export const WAKU_RAILGUN_DEFAULT_PEERS_WEB = [
|
|
31
|
+
"/dns4/relay-a.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAmFbD2ZvAFi2j9jjDo6g4HFbQAhfjDfnTTrbyRGQRmtG7x",
|
|
32
|
+
"/dns4/relay-b.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAmPtEAoPPok7VLrpNNC6t92ZQFqLndHvkdx6Fk3CxA4MaG",
|
|
33
|
+
"/dns4/client-edge.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAmQdCGG5qREQCq96kucmpUVupmvLwrTRjMazPAaMTNP97A"
|
|
34
|
+
];
|
|
13
35
|
export const WAKU_RAILGUN_DEFAULT_PEERS_NODE = [];
|
|
14
36
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/models/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/models/constants.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,SAAiB,EACjB,OAAe,EACP,EAAE,CAAC,cAAc,SAAS,IAAI,OAAO,EAAE,CAAC;AAElD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,SAAiB,EACjB,OAAe,EACf,cAAsB,yBAAyB,CAAC,SAAS,EAAE,OAAO,CAAC,EACpD,EAAE,CAAC,CAAC;IACnB,SAAS;IACT,KAAK,EAAE,OAAO;IACd,OAAO;IACP,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,SAAiB,EACjB,OAAe,EACI,EAAE,CAAC,CAAC;IACvB,SAAS;IACT,MAAM,EAAE,CAAC,OAAO,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,WAAmB,EACiC,EAAE;IACtD,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEpE,MAAM,CAAC,MAAM,mCAAmC,GAAG,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAC5C,+FAA+F,CAAC;AAElG,MAAM,CAAC,MAAM,8BAA8B,GAAa;IACtD,0GAA0G;IAC1G,0GAA0G;IAC1G,8GAA8G;CAC/G,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAa,EAExD,CAAC","sourcesContent":["export type WakuShardInfo = {\n clusterId: number;\n shard: number;\n shardId: number;\n pubsubTopic: string;\n};\n\nexport type WakuNetworkConfig = {\n clusterId: number;\n shards: number[];\n};\n\nexport const formatWakuRelayShardTopic = (\n clusterId: number,\n shardId: number,\n): string => `/waku/2/rs/${clusterId}/${shardId}`;\n\nexport const createWakuShardInfo = (\n clusterId: number,\n shardId: number,\n pubsubTopic: string = formatWakuRelayShardTopic(clusterId, shardId),\n): WakuShardInfo => ({\n clusterId,\n shard: shardId,\n shardId,\n pubsubTopic,\n});\n\nexport const createWakuNetworkConfig = (\n clusterId: number,\n shardId: number,\n): WakuNetworkConfig => ({\n clusterId,\n shards: [shardId],\n});\n\nexport const parseWakuRelayShardTopic = (\n pubSubTopic: string,\n): { clusterId: number; shardId: number } | undefined => {\n const match = /^\\/waku\\/2\\/rs\\/(\\d+)\\/(\\d+)$/.exec(pubSubTopic);\n if (!match) {\n return undefined;\n }\n\n return {\n clusterId: Number(match[1]),\n shardId: Number(match[2]),\n };\n};\n\nexport const WAKU_RAILGUN_PUB_SUB_TOPIC = formatWakuRelayShardTopic(5, 1);\n\nexport const WAKU_RAILGUN_DEFAULT_SHARD = createWakuShardInfo(5, 1);\n\nexport const WAKU_RAILGUN_DEFAULT_NETWORK_CONFIG = createWakuNetworkConfig(5, 1);\n\nexport const WAKU_RAILGUN_DEFAULT_SHARDS = {\n clusterId: 5,\n shards: [0, 1, 2, 3, 4, 5],\n};\n\nexport const WAKU_RAILGUN_DEFAULT_ENR_TREE_URL =\n 'enrtree://APMYHUVNQWHJNPI5L2KQ765EMCKUAMRWPUH3U2QIKPK6XEV3OW442@discovery.rootedinprivacy.com';\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_WEB: string[] = [\n \"/dns4/relay-a.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAmFbD2ZvAFi2j9jjDo6g4HFbQAhfjDfnTTrbyRGQRmtG7x\",\n \"/dns4/relay-b.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAmPtEAoPPok7VLrpNNC6t92ZQFqLndHvkdx6Fk3CxA4MaG\",\n \"/dns4/client-edge.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAmQdCGG5qREQCq96kucmpUVupmvLwrTRjMazPAaMTNP97A\"\n];\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_NODE: string[] = [\n // Some TCP broadcasters (node friendly):\n];\n"]}
|
|
@@ -3,7 +3,13 @@ import type { CustomDNSConfig } from './broadcaster-config.js';
|
|
|
3
3
|
export type BroadcasterOptions = {
|
|
4
4
|
trustedFeeSigner: string | string[];
|
|
5
5
|
poiActiveListKeys?: string[];
|
|
6
|
+
enableHealthcheckLogs?: boolean;
|
|
6
7
|
pubSubTopic?: string;
|
|
8
|
+
clusterId?: number;
|
|
9
|
+
shardId?: number;
|
|
10
|
+
dnsDiscoveryUrls?: string[];
|
|
11
|
+
additionalPeers?: string[];
|
|
12
|
+
storePeers?: string[];
|
|
7
13
|
additionalDirectPeers?: string[];
|
|
8
14
|
peerDiscoveryTimeout?: number;
|
|
9
15
|
feeExpirationTimeout?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-models.js","sourceRoot":"","sources":["../../src/models/export-models.ts"],"names":[],"mappings":"","sourcesContent":["import {\n Chain,\n BroadcasterConnectionStatus,\n} from '@railgun-community/shared-models';\nimport type { CustomDNSConfig } from './broadcaster-config.js';\n\nexport type BroadcasterOptions = {\n trustedFeeSigner: string | string[];\n poiActiveListKeys?: string[];\n pubSubTopic?: string;\n additionalDirectPeers?: string[];\n peerDiscoveryTimeout?: number;\n feeExpirationTimeout?: number;\n historicalLookBackTime?: number;\n useDNSDiscovery?: boolean;\n useCustomDNS?: CustomDNSConfig,\n broadcasterVersionRange?: {\n minVersion: string;\n maxVersion: string;\n };\n};\n\nexport type BroadcasterConnectionStatusCallback = (\n chain: Chain,\n status: BroadcasterConnectionStatus,\n) => void;\n\nexport type BroadcasterDebugger = {\n log: (msg: string) => void;\n error: (error: Error) => void;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"export-models.js","sourceRoot":"","sources":["../../src/models/export-models.ts"],"names":[],"mappings":"","sourcesContent":["import {\n Chain,\n BroadcasterConnectionStatus,\n} from '@railgun-community/shared-models';\nimport type { CustomDNSConfig } from './broadcaster-config.js';\n\nexport type BroadcasterOptions = {\n trustedFeeSigner: string | string[];\n poiActiveListKeys?: string[];\n enableHealthcheckLogs?: boolean;\n pubSubTopic?: string;\n clusterId?: number;\n shardId?: number;\n dnsDiscoveryUrls?: string[];\n additionalPeers?: string[];\n storePeers?: string[];\n additionalDirectPeers?: string[];\n peerDiscoveryTimeout?: number;\n feeExpirationTimeout?: number;\n historicalLookBackTime?: number;\n useDNSDiscovery?: boolean;\n useCustomDNS?: CustomDNSConfig,\n broadcasterVersionRange?: {\n minVersion: string;\n maxVersion: string;\n };\n};\n\nexport type BroadcasterConnectionStatusCallback = (\n chain: Chain,\n status: BroadcasterConnectionStatus,\n) => void;\n\nexport type BroadcasterDebugger = {\n log: (msg: string) => void;\n error: (error: Error) => void;\n};\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type CreateLibp2pOptions } from '@waku/sdk';
|
|
2
|
+
import { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';
|
|
3
|
+
export declare abstract class WakuBroadcasterPeerDiscoveryCoreBase extends WakuBroadcasterWakuCoreBase {
|
|
4
|
+
protected static readonly maxBootstrapPeers = 2;
|
|
5
|
+
protected static readonly maxConnections = 5;
|
|
6
|
+
protected static admittedPeerExchangePeerIds: Set<string>;
|
|
7
|
+
protected static dialingPeerExchangePeerIds: Set<string>;
|
|
8
|
+
protected static pendingDiscoveredPeerInfos: Map<string, any>;
|
|
9
|
+
protected static createWakuNode: (options: any) => Promise<any>;
|
|
10
|
+
protected static createDnsPeerDiscovery: (enrTreePeers: string[]) => any;
|
|
11
|
+
protected static createPeerExchangeDiscovery: () => (components: any) => any;
|
|
12
|
+
protected static getEnrTrees(): {
|
|
13
|
+
SANDBOX: string;
|
|
14
|
+
TEST: string;
|
|
15
|
+
};
|
|
16
|
+
protected static getDefaultPeers(): string[];
|
|
17
|
+
protected static getBaseLibp2pOptions(): CreateLibp2pOptions;
|
|
18
|
+
protected static buildDnsPeerDiscovery(enrTreePeers: string[]): any;
|
|
19
|
+
protected static getDnsDiscoveryUrls(): string[];
|
|
20
|
+
protected static getConnectionManagerOptions(): {
|
|
21
|
+
connectionManager: {
|
|
22
|
+
maxBootstrapPeers: number;
|
|
23
|
+
maxConnections: number;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
protected static formatDiscoveryPeerId(peerId: any): string;
|
|
27
|
+
protected static getKnownPeerIds(peerStore?: {
|
|
28
|
+
all?: () => Promise<any[]>;
|
|
29
|
+
}): Promise<Set<string>>;
|
|
30
|
+
protected static getPeerInfoId(peerInfo: any): string;
|
|
31
|
+
protected static getPeerInfoMultiaddrStrings(peerInfo: any): string[];
|
|
32
|
+
protected static getConnectedPeerIds(): Set<string>;
|
|
33
|
+
protected static getConfiguredBootstrapPeerIds(): Set<string>;
|
|
34
|
+
protected static pruneAdmittedPeerExchangePeerIds(): void;
|
|
35
|
+
protected static queueDiscoveredPeer(peerInfo: any): void;
|
|
36
|
+
protected static flushPendingDiscoveredPeers(): Promise<void>;
|
|
37
|
+
protected static getDialableMultiaddrs(_peerInfo: any): string[];
|
|
38
|
+
protected static handleDialDiscoveredPeerFailure(peerId: string): void;
|
|
39
|
+
protected static createDialingDnsPeerDiscovery(enrTreePeers: string[]): (components: any) => any;
|
|
40
|
+
protected static dialDiscoveredPeers(peerInfos: any[]): Promise<void>;
|
|
41
|
+
protected static mapNewPeerInfo(peerInfo: any): any | undefined;
|
|
42
|
+
protected static onBeforeSelectPeerInfos(): void;
|
|
43
|
+
protected static onPeerInfosSelected(_peerInfos: any[]): Promise<void>;
|
|
44
|
+
protected static getPeerExchangeAttemptBuffer(): number;
|
|
45
|
+
protected static resetPlatformDiscoveryState(): void;
|
|
46
|
+
protected static afterNodeCreated(): Promise<void>;
|
|
47
|
+
protected static beforeNodeStart(): Promise<void>;
|
|
48
|
+
protected static afterNodeStart(): Promise<void>;
|
|
49
|
+
protected static applyConnectionLimitGuard(): void;
|
|
50
|
+
protected static getConnectedLogMessage(): string;
|
|
51
|
+
protected static handleConnectError(err: unknown): void;
|
|
52
|
+
protected static createLoggedPeerExchangeDiscovery(): (components: any) => any;
|
|
53
|
+
protected static connect(): Promise<void>;
|
|
54
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { Protocols, } from '@waku/sdk';
|
|
2
|
+
import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
|
|
3
|
+
import { isDefined } from '../utils/is-defined.js';
|
|
4
|
+
import { BroadcasterConfig } from '../models/broadcaster-config.js';
|
|
5
|
+
import { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';
|
|
6
|
+
import { createLoggedPeerExchangeDiscovery, formatDiscoveryPeerId, getConnectionManagerOptions, getDnsDiscoveryUrls, getKnownPeerIds, } from './waku-peer-discovery.js';
|
|
7
|
+
export class WakuBroadcasterPeerDiscoveryCoreBase extends WakuBroadcasterWakuCoreBase {
|
|
8
|
+
static maxBootstrapPeers = 2;
|
|
9
|
+
static maxConnections = 5;
|
|
10
|
+
static admittedPeerExchangePeerIds = new Set();
|
|
11
|
+
static dialingPeerExchangePeerIds = new Set();
|
|
12
|
+
static pendingDiscoveredPeerInfos = new Map();
|
|
13
|
+
static createWakuNode;
|
|
14
|
+
static createDnsPeerDiscovery;
|
|
15
|
+
static createPeerExchangeDiscovery;
|
|
16
|
+
static getEnrTrees() {
|
|
17
|
+
throw new Error("Method 'getEnrTrees' must be implemented.");
|
|
18
|
+
}
|
|
19
|
+
static getDefaultPeers() {
|
|
20
|
+
throw new Error("Method 'getDefaultPeers' must be implemented.");
|
|
21
|
+
}
|
|
22
|
+
static getBaseLibp2pOptions() {
|
|
23
|
+
return {
|
|
24
|
+
hideWebSocketInfo: true,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
static buildDnsPeerDiscovery(enrTreePeers) {
|
|
28
|
+
return this.createDnsPeerDiscovery(enrTreePeers);
|
|
29
|
+
}
|
|
30
|
+
static getDnsDiscoveryUrls() {
|
|
31
|
+
return getDnsDiscoveryUrls(this.getEnrTrees(), BroadcasterConfig.customDNS);
|
|
32
|
+
}
|
|
33
|
+
static getConnectionManagerOptions() {
|
|
34
|
+
return getConnectionManagerOptions(this.maxBootstrapPeers, this.maxConnections);
|
|
35
|
+
}
|
|
36
|
+
static formatDiscoveryPeerId(peerId) {
|
|
37
|
+
return formatDiscoveryPeerId(peerId);
|
|
38
|
+
}
|
|
39
|
+
static async getKnownPeerIds(peerStore) {
|
|
40
|
+
return getKnownPeerIds(peerStore);
|
|
41
|
+
}
|
|
42
|
+
static getPeerInfoId(peerInfo) {
|
|
43
|
+
return this.formatDiscoveryPeerId(peerInfo?.id ?? peerInfo?.ENR?.peerInfo?.id);
|
|
44
|
+
}
|
|
45
|
+
static getPeerInfoMultiaddrStrings(peerInfo) {
|
|
46
|
+
const rawMultiaddrs = peerInfo?.multiaddrs ??
|
|
47
|
+
peerInfo?.ENR?.peerInfo?.multiaddrs ??
|
|
48
|
+
peerInfo?.ENR?.multiaddrs ??
|
|
49
|
+
[];
|
|
50
|
+
if (!Array.isArray(rawMultiaddrs)) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
return rawMultiaddrs
|
|
54
|
+
.map(multiaddr => multiaddr?.toString?.() ?? String(multiaddr ?? ''))
|
|
55
|
+
.map(multiaddr => multiaddr.trim())
|
|
56
|
+
.filter(Boolean);
|
|
57
|
+
}
|
|
58
|
+
static getConnectedPeerIds() {
|
|
59
|
+
const connections = this.waku?.libp2p?.getConnections?.() ?? [];
|
|
60
|
+
return new Set(connections.map((connection) => this.formatDiscoveryPeerId(connection?.remotePeer)));
|
|
61
|
+
}
|
|
62
|
+
static getConfiguredBootstrapPeerIds() {
|
|
63
|
+
const directPeers = BroadcasterConfig.additionalDirectPeers.length
|
|
64
|
+
? BroadcasterConfig.additionalDirectPeers
|
|
65
|
+
: this.getDefaultPeers();
|
|
66
|
+
return new Set(directPeers
|
|
67
|
+
.map(peer => peer.match(/\/p2p\/([^/]+)$/)?.[1])
|
|
68
|
+
.filter(isDefined));
|
|
69
|
+
}
|
|
70
|
+
static pruneAdmittedPeerExchangePeerIds() {
|
|
71
|
+
const connectedPeerIds = this.getConnectedPeerIds();
|
|
72
|
+
this.admittedPeerExchangePeerIds = new Set([...this.admittedPeerExchangePeerIds].filter(peerId => connectedPeerIds.has(peerId)));
|
|
73
|
+
}
|
|
74
|
+
static queueDiscoveredPeer(peerInfo) {
|
|
75
|
+
const peerId = this.getPeerInfoId(peerInfo);
|
|
76
|
+
this.pendingDiscoveredPeerInfos.set(peerId, peerInfo);
|
|
77
|
+
}
|
|
78
|
+
static async flushPendingDiscoveredPeers() {
|
|
79
|
+
if (!this.waku || this.pendingDiscoveredPeerInfos.size === 0) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const peerInfos = [...this.pendingDiscoveredPeerInfos.values()];
|
|
83
|
+
this.pendingDiscoveredPeerInfos.clear();
|
|
84
|
+
await this.dialDiscoveredPeers(peerInfos);
|
|
85
|
+
}
|
|
86
|
+
static getDialableMultiaddrs(_peerInfo) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
static handleDialDiscoveredPeerFailure(peerId) {
|
|
90
|
+
this.admittedPeerExchangePeerIds.delete(peerId);
|
|
91
|
+
}
|
|
92
|
+
static createDialingDnsPeerDiscovery(enrTreePeers) {
|
|
93
|
+
return (components) => {
|
|
94
|
+
const discovery = this.createDnsPeerDiscovery(enrTreePeers)(components);
|
|
95
|
+
const onPeer = ((event) => {
|
|
96
|
+
this.queueDiscoveredPeer(event.detail);
|
|
97
|
+
void this.dialDiscoveredPeers([event.detail]);
|
|
98
|
+
});
|
|
99
|
+
discovery.addEventListener?.('peer', onPeer);
|
|
100
|
+
return discovery;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
static async dialDiscoveredPeers(peerInfos) {
|
|
104
|
+
const waku = this.waku;
|
|
105
|
+
if (!waku) {
|
|
106
|
+
for (const peerInfo of peerInfos) {
|
|
107
|
+
this.queueDiscoveredPeer(peerInfo);
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const connectedPeerIds = this.getConnectedPeerIds();
|
|
112
|
+
await Promise.all(peerInfos.map(async (peerInfo) => {
|
|
113
|
+
const peerId = this.getPeerInfoId(peerInfo);
|
|
114
|
+
if (connectedPeerIds.has(peerId) ||
|
|
115
|
+
this.dialingPeerExchangePeerIds.has(peerId)) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const [multiaddr] = this.getDialableMultiaddrs(peerInfo);
|
|
119
|
+
if (!multiaddr) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.dialingPeerExchangePeerIds.add(peerId);
|
|
123
|
+
try {
|
|
124
|
+
await waku.dial(multiaddr);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
this.handleDialDiscoveredPeerFailure(peerId);
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
this.dialingPeerExchangePeerIds.delete(peerId);
|
|
131
|
+
}
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
static mapNewPeerInfo(peerInfo) {
|
|
135
|
+
return peerInfo;
|
|
136
|
+
}
|
|
137
|
+
static onBeforeSelectPeerInfos() { }
|
|
138
|
+
static async onPeerInfosSelected(_peerInfos) { }
|
|
139
|
+
static getPeerExchangeAttemptBuffer() {
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
static resetPlatformDiscoveryState() {
|
|
143
|
+
this.admittedPeerExchangePeerIds.clear();
|
|
144
|
+
this.dialingPeerExchangePeerIds.clear();
|
|
145
|
+
this.pendingDiscoveredPeerInfos.clear();
|
|
146
|
+
}
|
|
147
|
+
static async afterNodeCreated() { }
|
|
148
|
+
static async beforeNodeStart() { }
|
|
149
|
+
static async afterNodeStart() { }
|
|
150
|
+
static applyConnectionLimitGuard() { }
|
|
151
|
+
static getConnectedLogMessage() {
|
|
152
|
+
return 'Waku initialized and connected to peers';
|
|
153
|
+
}
|
|
154
|
+
static handleConnectError(err) {
|
|
155
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
156
|
+
BroadcasterDebug.log(`Error initializing Waku: ${message}`);
|
|
157
|
+
this.hasError = true;
|
|
158
|
+
}
|
|
159
|
+
static createLoggedPeerExchangeDiscovery() {
|
|
160
|
+
return createLoggedPeerExchangeDiscovery({
|
|
161
|
+
createPeerExchangeDiscovery: () => this.createPeerExchangeDiscovery(),
|
|
162
|
+
getAdmittedPeerExchangePeerIds: () => this.admittedPeerExchangePeerIds,
|
|
163
|
+
getKnownPeerIds: peerStore => this.getKnownPeerIds(peerStore),
|
|
164
|
+
getPeerInfoId: peerInfo => this.getPeerInfoId(peerInfo),
|
|
165
|
+
mapNewPeerInfo: peerInfo => this.mapNewPeerInfo(peerInfo),
|
|
166
|
+
maxBootstrapPeers: this.maxBootstrapPeers,
|
|
167
|
+
maxConnections: this.maxConnections,
|
|
168
|
+
onBeforeSelectPeerInfos: () => this.onBeforeSelectPeerInfos(),
|
|
169
|
+
onPeerInfosSelected: peerInfos => this.onPeerInfosSelected(peerInfos),
|
|
170
|
+
peerExchangeAttemptBuffer: this.getPeerExchangeAttemptBuffer(),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
static async connect() {
|
|
174
|
+
try {
|
|
175
|
+
this.hasError = false;
|
|
176
|
+
this.resetPlatformDiscoveryState();
|
|
177
|
+
BroadcasterDebug.log('Creating waku broadcast client');
|
|
178
|
+
const libp2pOptions = this.getBaseLibp2pOptions();
|
|
179
|
+
if (BroadcasterConfig.useDNSDiscovery) {
|
|
180
|
+
const enrTreePeers = this.getDnsDiscoveryUrls();
|
|
181
|
+
libp2pOptions.peerDiscovery = [
|
|
182
|
+
this.buildDnsPeerDiscovery(enrTreePeers),
|
|
183
|
+
this.createLoggedPeerExchangeDiscovery(),
|
|
184
|
+
];
|
|
185
|
+
}
|
|
186
|
+
const defaultPeers = this.getDefaultPeers();
|
|
187
|
+
const directPeers = BroadcasterConfig.additionalDirectPeers.length
|
|
188
|
+
? BroadcasterConfig.additionalDirectPeers
|
|
189
|
+
: defaultPeers;
|
|
190
|
+
const storePeers = BroadcasterConfig.storePeers.length
|
|
191
|
+
? BroadcasterConfig.storePeers
|
|
192
|
+
: defaultPeers;
|
|
193
|
+
this.waku = await this.createWakuNode({
|
|
194
|
+
autoStart: false,
|
|
195
|
+
defaultBootstrap: BroadcasterConfig.shouldUseDefaultBootstrap(),
|
|
196
|
+
bootstrapPeers: directPeers,
|
|
197
|
+
libp2p: libp2pOptions,
|
|
198
|
+
networkConfig: BroadcasterConfig.getWakuNetworkConfig(),
|
|
199
|
+
store: {
|
|
200
|
+
peers: storePeers,
|
|
201
|
+
},
|
|
202
|
+
...this.getConnectionManagerOptions(),
|
|
203
|
+
});
|
|
204
|
+
const waku = this.waku;
|
|
205
|
+
if (!waku) {
|
|
206
|
+
throw new Error('Waku node was not created');
|
|
207
|
+
}
|
|
208
|
+
await this.afterNodeCreated();
|
|
209
|
+
this.applyConnectionLimitGuard();
|
|
210
|
+
await this.beforeNodeStart();
|
|
211
|
+
await waku.start();
|
|
212
|
+
await this.afterNodeStart();
|
|
213
|
+
BroadcasterDebug.log('Waiting for remote peer.');
|
|
214
|
+
await waku.waitForPeers([Protocols.Filter, Protocols.LightPush, Protocols.Store], this.peerDiscoveryTimeout);
|
|
215
|
+
BroadcasterDebug.log(this.getConnectedLogMessage());
|
|
216
|
+
this.hasError = false;
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
this.handleConnectError(err);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=waku-broadcaster-peer-discovery-core-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waku-broadcaster-peer-discovery-core-base.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-peer-discovery-core-base.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Protocols,\n type CreateLibp2pOptions,\n} from '@waku/sdk';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';\nimport {\n createLoggedPeerExchangeDiscovery,\n formatDiscoveryPeerId,\n getConnectionManagerOptions,\n getDnsDiscoveryUrls,\n getKnownPeerIds,\n} from './waku-peer-discovery.js';\n\nexport abstract class WakuBroadcasterPeerDiscoveryCoreBase extends WakuBroadcasterWakuCoreBase {\n protected static readonly maxBootstrapPeers = 2;\n protected static readonly maxConnections = 5;\n protected static admittedPeerExchangePeerIds = new Set<string>();\n protected static dialingPeerExchangePeerIds = new Set<string>();\n protected static pendingDiscoveredPeerInfos = new Map<string, any>();\n\n protected static createWakuNode: (options: any) => Promise<any>;\n protected static createDnsPeerDiscovery: (enrTreePeers: string[]) => any;\n protected static createPeerExchangeDiscovery: () => (components: any) => any;\n\n protected static getEnrTrees(): {\n SANDBOX: string;\n TEST: string;\n } {\n throw new Error(\"Method 'getEnrTrees' must be implemented.\");\n }\n\n protected static getDefaultPeers(): string[] {\n throw new Error(\"Method 'getDefaultPeers' must be implemented.\");\n }\n\n protected static getBaseLibp2pOptions(): CreateLibp2pOptions {\n return {\n hideWebSocketInfo: true,\n };\n }\n\n protected static buildDnsPeerDiscovery(enrTreePeers: string[]) {\n return this.createDnsPeerDiscovery(enrTreePeers);\n }\n\n protected static getDnsDiscoveryUrls(): string[] {\n return getDnsDiscoveryUrls(this.getEnrTrees(), BroadcasterConfig.customDNS);\n }\n\n protected static getConnectionManagerOptions() {\n return getConnectionManagerOptions(\n this.maxBootstrapPeers,\n this.maxConnections,\n );\n }\n\n protected static formatDiscoveryPeerId(peerId: any): string {\n return formatDiscoveryPeerId(peerId);\n }\n\n protected static async getKnownPeerIds(peerStore?: {\n all?: () => Promise<any[]>;\n }): Promise<Set<string>> {\n return getKnownPeerIds(peerStore);\n }\n\n protected static getPeerInfoId(peerInfo: any): string {\n return this.formatDiscoveryPeerId(\n peerInfo?.id ?? peerInfo?.ENR?.peerInfo?.id,\n );\n }\n\n protected static getPeerInfoMultiaddrStrings(peerInfo: any): string[] {\n const rawMultiaddrs =\n peerInfo?.multiaddrs ??\n peerInfo?.ENR?.peerInfo?.multiaddrs ??\n peerInfo?.ENR?.multiaddrs ??\n [];\n if (!Array.isArray(rawMultiaddrs)) {\n return [];\n }\n\n return rawMultiaddrs\n .map(multiaddr => multiaddr?.toString?.() ?? String(multiaddr ?? ''))\n .map(multiaddr => multiaddr.trim())\n .filter(Boolean);\n }\n\n protected static getConnectedPeerIds(): Set<string> {\n const connections = (this.waku as any)?.libp2p?.getConnections?.() ?? [];\n return new Set(\n connections.map((connection: any) =>\n this.formatDiscoveryPeerId(connection?.remotePeer),\n ),\n );\n }\n\n protected static getConfiguredBootstrapPeerIds(): Set<string> {\n const directPeers = BroadcasterConfig.additionalDirectPeers.length\n ? BroadcasterConfig.additionalDirectPeers\n : this.getDefaultPeers();\n\n return new Set(\n directPeers\n .map(peer => peer.match(/\\/p2p\\/([^/]+)$/)?.[1])\n .filter(isDefined),\n );\n }\n\n protected static pruneAdmittedPeerExchangePeerIds() {\n const connectedPeerIds = this.getConnectedPeerIds();\n this.admittedPeerExchangePeerIds = new Set(\n [...this.admittedPeerExchangePeerIds].filter(peerId =>\n connectedPeerIds.has(peerId),\n ),\n );\n }\n\n protected static queueDiscoveredPeer(peerInfo: any) {\n const peerId = this.getPeerInfoId(peerInfo);\n this.pendingDiscoveredPeerInfos.set(peerId, peerInfo);\n }\n\n protected static async flushPendingDiscoveredPeers() {\n if (!this.waku || this.pendingDiscoveredPeerInfos.size === 0) {\n return;\n }\n\n const peerInfos = [...this.pendingDiscoveredPeerInfos.values()];\n this.pendingDiscoveredPeerInfos.clear();\n await this.dialDiscoveredPeers(peerInfos);\n }\n\n protected static getDialableMultiaddrs(_peerInfo: any): string[] {\n return [];\n }\n\n protected static handleDialDiscoveredPeerFailure(peerId: string) {\n this.admittedPeerExchangePeerIds.delete(peerId);\n }\n\n protected static createDialingDnsPeerDiscovery(enrTreePeers: string[]) {\n return (components: any) => {\n const discovery = this.createDnsPeerDiscovery(enrTreePeers)(\n components,\n ) as any;\n const onPeer = ((event: CustomEvent<any>) => {\n this.queueDiscoveredPeer(event.detail);\n void this.dialDiscoveredPeers([event.detail]);\n }) as EventListener;\n\n discovery.addEventListener?.('peer', onPeer);\n return discovery;\n };\n }\n\n protected static async dialDiscoveredPeers(peerInfos: any[]) {\n const waku = this.waku;\n if (!waku) {\n for (const peerInfo of peerInfos) {\n this.queueDiscoveredPeer(peerInfo);\n }\n return;\n }\n\n const connectedPeerIds = this.getConnectedPeerIds();\n\n await Promise.all(\n peerInfos.map(async peerInfo => {\n const peerId = this.getPeerInfoId(peerInfo);\n if (\n connectedPeerIds.has(peerId) ||\n this.dialingPeerExchangePeerIds.has(peerId)\n ) {\n return;\n }\n\n const [multiaddr] = this.getDialableMultiaddrs(peerInfo);\n if (!multiaddr) {\n return;\n }\n\n this.dialingPeerExchangePeerIds.add(peerId);\n try {\n await waku.dial(multiaddr);\n } catch {\n this.handleDialDiscoveredPeerFailure(peerId);\n } finally {\n this.dialingPeerExchangePeerIds.delete(peerId);\n }\n }),\n );\n }\n\n protected static mapNewPeerInfo(peerInfo: any): any | undefined {\n return peerInfo;\n }\n\n protected static onBeforeSelectPeerInfos() {}\n\n protected static async onPeerInfosSelected(_peerInfos: any[]) {}\n\n protected static getPeerExchangeAttemptBuffer(): number {\n return 0;\n }\n\n protected static resetPlatformDiscoveryState() {\n this.admittedPeerExchangePeerIds.clear();\n this.dialingPeerExchangePeerIds.clear();\n this.pendingDiscoveredPeerInfos.clear();\n }\n\n protected static async afterNodeCreated() {}\n\n protected static async beforeNodeStart() {}\n\n protected static async afterNodeStart() {}\n\n protected static applyConnectionLimitGuard() {}\n\n protected static getConnectedLogMessage(): string {\n return 'Waku initialized and connected to peers';\n }\n\n protected static handleConnectError(err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n BroadcasterDebug.log(`Error initializing Waku: ${message}`);\n this.hasError = true;\n }\n\n protected static createLoggedPeerExchangeDiscovery() {\n return createLoggedPeerExchangeDiscovery({\n createPeerExchangeDiscovery: () => this.createPeerExchangeDiscovery(),\n getAdmittedPeerExchangePeerIds: () => this.admittedPeerExchangePeerIds,\n getKnownPeerIds: peerStore => this.getKnownPeerIds(peerStore),\n getPeerInfoId: peerInfo => this.getPeerInfoId(peerInfo),\n mapNewPeerInfo: peerInfo => this.mapNewPeerInfo(peerInfo),\n maxBootstrapPeers: this.maxBootstrapPeers,\n maxConnections: this.maxConnections,\n onBeforeSelectPeerInfos: () => this.onBeforeSelectPeerInfos(),\n onPeerInfosSelected: peerInfos => this.onPeerInfosSelected(peerInfos),\n peerExchangeAttemptBuffer: this.getPeerExchangeAttemptBuffer(),\n });\n }\n\n protected static async connect(): Promise<void> {\n try {\n this.hasError = false;\n this.resetPlatformDiscoveryState();\n\n BroadcasterDebug.log('Creating waku broadcast client');\n\n const libp2pOptions = this.getBaseLibp2pOptions();\n if (BroadcasterConfig.useDNSDiscovery) {\n const enrTreePeers = this.getDnsDiscoveryUrls();\n libp2pOptions.peerDiscovery = [\n this.buildDnsPeerDiscovery(enrTreePeers),\n this.createLoggedPeerExchangeDiscovery(),\n ];\n }\n\n const defaultPeers = this.getDefaultPeers();\n const directPeers = BroadcasterConfig.additionalDirectPeers.length\n ? BroadcasterConfig.additionalDirectPeers\n : defaultPeers;\n const storePeers = BroadcasterConfig.storePeers.length\n ? BroadcasterConfig.storePeers\n : defaultPeers;\n\n this.waku = await this.createWakuNode({\n autoStart: false,\n defaultBootstrap: BroadcasterConfig.shouldUseDefaultBootstrap(),\n bootstrapPeers: directPeers,\n libp2p: libp2pOptions,\n networkConfig: BroadcasterConfig.getWakuNetworkConfig(),\n store: {\n peers: storePeers,\n },\n ...this.getConnectionManagerOptions(),\n });\n const waku = this.waku;\n if (!waku) {\n throw new Error('Waku node was not created');\n }\n\n await this.afterNodeCreated();\n this.applyConnectionLimitGuard();\n await this.beforeNodeStart();\n await waku.start();\n await this.afterNodeStart();\n\n BroadcasterDebug.log('Waiting for remote peer.');\n await waku.waitForPeers(\n [Protocols.Filter, Protocols.LightPush, Protocols.Store],\n this.peerDiscoveryTimeout,\n );\n BroadcasterDebug.log(this.getConnectedLogMessage());\n this.hasError = false;\n } catch (err) {\n this.handleConnectError(err);\n }\n }\n}\n"]}
|
|
@@ -8,12 +8,6 @@ export declare abstract class WakuBroadcasterWakuCoreBase {
|
|
|
8
8
|
protected static pubSubTopic: string;
|
|
9
9
|
protected static additionalDirectPeers: string[];
|
|
10
10
|
protected static peerDiscoveryTimeout: number;
|
|
11
|
-
protected static defaultShard: {
|
|
12
|
-
clusterId: number;
|
|
13
|
-
shard: number;
|
|
14
|
-
shardId: number;
|
|
15
|
-
pubsubTopic: string;
|
|
16
|
-
};
|
|
17
11
|
static restartCount: number;
|
|
18
12
|
static initWaku(chain: Chain): Promise<void>;
|
|
19
13
|
static pollHistoricalTopics(): Promise<void>;
|
|
@@ -26,6 +20,43 @@ export declare abstract class WakuBroadcasterWakuCoreBase {
|
|
|
26
20
|
static getPubSubPeerCount(): number;
|
|
27
21
|
static getLightPushPeerCount(): Promise<number>;
|
|
28
22
|
static getFilterPeerCount(): Promise<number>;
|
|
23
|
+
static getHealthSnapshot(): Promise<{
|
|
24
|
+
hasWaku: boolean;
|
|
25
|
+
isStarted: boolean;
|
|
26
|
+
hasError: boolean;
|
|
27
|
+
restartCount: number;
|
|
28
|
+
peerDiscoveryTimeout: number;
|
|
29
|
+
routing: import("../models/constants.js").WakuShardInfo;
|
|
30
|
+
networkConfig: import("../models/constants.js").WakuNetworkConfig;
|
|
31
|
+
configuredPeers: {
|
|
32
|
+
useDNSDiscovery: boolean;
|
|
33
|
+
dnsDiscoveryUrls: string[];
|
|
34
|
+
bootstrapPeers: string[];
|
|
35
|
+
storePeers: string[];
|
|
36
|
+
};
|
|
37
|
+
connections: {
|
|
38
|
+
count: number;
|
|
39
|
+
peers: string[];
|
|
40
|
+
};
|
|
41
|
+
discovery: {
|
|
42
|
+
connectedPeerDetails: {
|
|
43
|
+
peerId: string;
|
|
44
|
+
supportsPeerExchange: boolean;
|
|
45
|
+
protocols: string[];
|
|
46
|
+
tags: string[];
|
|
47
|
+
}[];
|
|
48
|
+
peerStore: {
|
|
49
|
+
count: number;
|
|
50
|
+
bootstrapCount: number;
|
|
51
|
+
peerExchangeCount: number;
|
|
52
|
+
bootstrapPeers: string[];
|
|
53
|
+
peerExchangePeers: string[];
|
|
54
|
+
connectedPeersSupportingPeerExchange: string[];
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
contentTopics: string[];
|
|
58
|
+
}>;
|
|
59
|
+
private static getLightPushAcceptedCount;
|
|
29
60
|
static broadcastMessage(data: object, topic: string): Promise<void>;
|
|
30
61
|
static retrieveHistoricalForTopic(topic: string): Promise<void>;
|
|
31
62
|
}
|