@railgun-community/waku-broadcaster-client-node 9.0.6 → 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 +14 -3
- package/dist/waku/waku-broadcaster-waku-core.js +42 -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 +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CustomDNSConfig } from '../models/broadcaster-config.js';
|
|
2
|
+
type PeerStore = {
|
|
3
|
+
all?: () => Promise<any[]>;
|
|
4
|
+
};
|
|
5
|
+
type ConnectionManagerOptions = {
|
|
6
|
+
connectionManager: {
|
|
7
|
+
maxBootstrapPeers: number;
|
|
8
|
+
maxConnections: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
type PeerExchangeDiscoveryConfig = {
|
|
12
|
+
createPeerExchangeDiscovery: () => (components: any) => any;
|
|
13
|
+
getAdmittedPeerExchangePeerIds: () => Set<string>;
|
|
14
|
+
getKnownPeerIds?: (peerStore?: PeerStore) => Promise<Set<string>>;
|
|
15
|
+
getPeerInfoId: (peerInfo: any) => string;
|
|
16
|
+
mapNewPeerInfo?: (peerInfo: any) => any | undefined;
|
|
17
|
+
maxBootstrapPeers: number;
|
|
18
|
+
maxConnections: number;
|
|
19
|
+
onBeforeSelectPeerInfos?: () => void;
|
|
20
|
+
onPeerInfosSelected?: (peerInfos: any[]) => Promise<void> | void;
|
|
21
|
+
peerExchangeAttemptBuffer?: number;
|
|
22
|
+
};
|
|
23
|
+
export declare const formatDiscoveryPeerId: (peerId: any) => string;
|
|
24
|
+
export declare const getKnownPeerIds: (peerStore?: PeerStore) => Promise<Set<string>>;
|
|
25
|
+
export declare const getDnsDiscoveryUrls: (enrTrees: {
|
|
26
|
+
SANDBOX: string;
|
|
27
|
+
TEST: string;
|
|
28
|
+
}, customDNS?: CustomDNSConfig) => string[];
|
|
29
|
+
export declare const getConnectionManagerOptions: (maxBootstrapPeers: number, maxConnections: number) => ConnectionManagerOptions;
|
|
30
|
+
export declare const createLoggedPeerExchangeDiscovery: ({ createPeerExchangeDiscovery, getAdmittedPeerExchangePeerIds, getKnownPeerIds: getKnownPeerIdsImpl, getPeerInfoId, mapNewPeerInfo, maxBootstrapPeers, maxConnections, onBeforeSelectPeerInfos, onPeerInfosSelected, peerExchangeAttemptBuffer, }: PeerExchangeDiscoveryConfig) => (components: any) => any;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { isDefined } from '@railgun-community/shared-models';
|
|
2
|
+
export const formatDiscoveryPeerId = (peerId) => peerId?.toString?.() ?? String(peerId ?? 'unknown-peer');
|
|
3
|
+
export const getKnownPeerIds = async (peerStore) => {
|
|
4
|
+
if (!peerStore?.all) {
|
|
5
|
+
return new Set();
|
|
6
|
+
}
|
|
7
|
+
const peers = await peerStore.all().catch(() => []);
|
|
8
|
+
return new Set(peers.map(peer => formatDiscoveryPeerId(peer.id)));
|
|
9
|
+
};
|
|
10
|
+
export const getDnsDiscoveryUrls = (enrTrees, customDNS) => {
|
|
11
|
+
const enrTreePeers = [];
|
|
12
|
+
if (isDefined(customDNS)) {
|
|
13
|
+
enrTreePeers.push(...customDNS.enrTreePeers);
|
|
14
|
+
if (!customDNS.onlyCustom) {
|
|
15
|
+
enrTreePeers.push(...[enrTrees.SANDBOX, enrTrees.TEST]);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return enrTreePeers;
|
|
19
|
+
};
|
|
20
|
+
export const getConnectionManagerOptions = (maxBootstrapPeers, maxConnections) => ({
|
|
21
|
+
connectionManager: {
|
|
22
|
+
maxBootstrapPeers,
|
|
23
|
+
maxConnections,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
export const createLoggedPeerExchangeDiscovery = ({ createPeerExchangeDiscovery, getAdmittedPeerExchangePeerIds, getKnownPeerIds: getKnownPeerIdsImpl = getKnownPeerIds, getPeerInfoId, mapNewPeerInfo = peerInfo => peerInfo, maxBootstrapPeers, maxConnections, onBeforeSelectPeerInfos, onPeerInfosSelected, peerExchangeAttemptBuffer = 0, }) => {
|
|
27
|
+
return (components) => {
|
|
28
|
+
const discovery = createPeerExchangeDiscovery()(components);
|
|
29
|
+
const originalQuery = discovery.query?.bind(discovery);
|
|
30
|
+
if (typeof originalQuery !== 'function') {
|
|
31
|
+
return discovery;
|
|
32
|
+
}
|
|
33
|
+
discovery.query = async (peerId) => {
|
|
34
|
+
const knownBefore = await getKnownPeerIdsImpl(components?.peerStore);
|
|
35
|
+
const originalPeerExchangeQuery = discovery.peerExchange?.query?.bind(discovery.peerExchange);
|
|
36
|
+
if (typeof originalPeerExchangeQuery === 'function') {
|
|
37
|
+
discovery.peerExchange.query = async (params) => {
|
|
38
|
+
const result = await originalPeerExchangeQuery(params);
|
|
39
|
+
const peerInfos = result?.peerInfos ?? [];
|
|
40
|
+
const knownBeforeLookup = new Set(knownBefore);
|
|
41
|
+
const knownPeerInfos = [];
|
|
42
|
+
const candidateNewPeerInfos = [];
|
|
43
|
+
for (const peerInfo of peerInfos) {
|
|
44
|
+
const discoveredPeerId = getPeerInfoId(peerInfo);
|
|
45
|
+
if (knownBeforeLookup.has(discoveredPeerId)) {
|
|
46
|
+
knownPeerInfos.push(peerInfo);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const mappedPeerInfo = mapNewPeerInfo(peerInfo);
|
|
50
|
+
if (isDefined(mappedPeerInfo)) {
|
|
51
|
+
candidateNewPeerInfos.push(mappedPeerInfo);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
onBeforeSelectPeerInfos?.();
|
|
55
|
+
const admittedPeerExchangePeerIds = getAdmittedPeerExchangePeerIds();
|
|
56
|
+
const availableSlots = Math.max(0, maxConnections - maxBootstrapPeers - admittedPeerExchangePeerIds.size);
|
|
57
|
+
const attemptWindow = Math.min(candidateNewPeerInfos.length, Math.max(availableSlots, 1) + peerExchangeAttemptBuffer);
|
|
58
|
+
const attemptNewPeerInfos = candidateNewPeerInfos.slice(0, attemptWindow);
|
|
59
|
+
const allowedNewPeerInfos = [];
|
|
60
|
+
for (const candidatePeerInfo of attemptNewPeerInfos) {
|
|
61
|
+
if (allowedNewPeerInfos.length >= availableSlots) {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
const discoveredPeerId = getPeerInfoId(candidatePeerInfo);
|
|
65
|
+
if (admittedPeerExchangePeerIds.has(discoveredPeerId)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
admittedPeerExchangePeerIds.add(discoveredPeerId);
|
|
69
|
+
allowedNewPeerInfos.push(candidatePeerInfo);
|
|
70
|
+
}
|
|
71
|
+
await onPeerInfosSelected?.(attemptNewPeerInfos);
|
|
72
|
+
return {
|
|
73
|
+
...result,
|
|
74
|
+
peerInfos: [...knownPeerInfos, ...allowedNewPeerInfos],
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
return await originalQuery(peerId);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
if (typeof originalPeerExchangeQuery === 'function') {
|
|
83
|
+
discovery.peerExchange.query = originalPeerExchangeQuery;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
return discovery;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=waku-peer-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waku-peer-discovery.js","sourceRoot":"","sources":["../../src/waku/waku-peer-discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import { isDefined } from '@railgun-community/shared-models';\nimport type { CustomDNSConfig } from '../models/broadcaster-config.js';\n\ntype PeerStore = {\n all?: () => Promise<any[]>;\n};\n\ntype ConnectionManagerOptions = {\n connectionManager: {\n maxBootstrapPeers: number;\n maxConnections: number;\n };\n};\n\ntype PeerExchangeDiscoveryConfig = {\n createPeerExchangeDiscovery: () => (components: any) => any;\n getAdmittedPeerExchangePeerIds: () => Set<string>;\n getKnownPeerIds?: (peerStore?: PeerStore) => Promise<Set<string>>;\n getPeerInfoId: (peerInfo: any) => string;\n mapNewPeerInfo?: (peerInfo: any) => any | undefined;\n maxBootstrapPeers: number;\n maxConnections: number;\n onBeforeSelectPeerInfos?: () => void;\n onPeerInfosSelected?: (peerInfos: any[]) => Promise<void> | void;\n peerExchangeAttemptBuffer?: number;\n};\n\nexport const formatDiscoveryPeerId = (peerId: any): string =>\n peerId?.toString?.() ?? String(peerId ?? 'unknown-peer');\n\nexport const getKnownPeerIds = async (peerStore?: PeerStore): Promise<Set<string>> => {\n if (!peerStore?.all) {\n return new Set();\n }\n\n const peers = await peerStore.all().catch(() => []);\n return new Set(peers.map(peer => formatDiscoveryPeerId(peer.id)));\n};\n\nexport const getDnsDiscoveryUrls = (enrTrees: {\n SANDBOX: string;\n TEST: string;\n}, customDNS?: CustomDNSConfig): string[] => {\n const enrTreePeers: string[] = [];\n if (isDefined(customDNS)) {\n enrTreePeers.push(...customDNS.enrTreePeers);\n if (!customDNS.onlyCustom) {\n enrTreePeers.push(...[enrTrees.SANDBOX, enrTrees.TEST]);\n }\n }\n return enrTreePeers;\n};\n\nexport const getConnectionManagerOptions = (\n maxBootstrapPeers: number,\n maxConnections: number,\n): ConnectionManagerOptions => ({\n connectionManager: {\n maxBootstrapPeers,\n maxConnections,\n },\n});\n\nexport const createLoggedPeerExchangeDiscovery = ({\n createPeerExchangeDiscovery,\n getAdmittedPeerExchangePeerIds,\n getKnownPeerIds: getKnownPeerIdsImpl = getKnownPeerIds,\n getPeerInfoId,\n mapNewPeerInfo = peerInfo => peerInfo,\n maxBootstrapPeers,\n maxConnections,\n onBeforeSelectPeerInfos,\n onPeerInfosSelected,\n peerExchangeAttemptBuffer = 0,\n}: PeerExchangeDiscoveryConfig) => {\n return (components: any) => {\n const discovery = createPeerExchangeDiscovery()(components) as any;\n const originalQuery = discovery.query?.bind(discovery);\n if (typeof originalQuery !== 'function') {\n return discovery;\n }\n\n discovery.query = async (peerId: any) => {\n const knownBefore = await getKnownPeerIdsImpl(components?.peerStore);\n const originalPeerExchangeQuery = discovery.peerExchange?.query?.bind(\n discovery.peerExchange,\n );\n\n if (typeof originalPeerExchangeQuery === 'function') {\n discovery.peerExchange.query = async (params: any) => {\n const result = await originalPeerExchangeQuery(params);\n const peerInfos = result?.peerInfos ?? [];\n const knownBeforeLookup = new Set(knownBefore);\n const knownPeerInfos: any[] = [];\n const candidateNewPeerInfos: any[] = [];\n\n for (const peerInfo of peerInfos) {\n const discoveredPeerId = getPeerInfoId(peerInfo);\n if (knownBeforeLookup.has(discoveredPeerId)) {\n knownPeerInfos.push(peerInfo);\n continue;\n }\n\n const mappedPeerInfo = mapNewPeerInfo(peerInfo);\n if (isDefined(mappedPeerInfo)) {\n candidateNewPeerInfos.push(mappedPeerInfo);\n }\n }\n\n onBeforeSelectPeerInfos?.();\n const admittedPeerExchangePeerIds = getAdmittedPeerExchangePeerIds();\n const availableSlots = Math.max(\n 0,\n maxConnections - maxBootstrapPeers - admittedPeerExchangePeerIds.size,\n );\n const attemptWindow = Math.min(\n candidateNewPeerInfos.length,\n Math.max(availableSlots, 1) + peerExchangeAttemptBuffer,\n );\n const attemptNewPeerInfos = candidateNewPeerInfos.slice(0, attemptWindow);\n const allowedNewPeerInfos: any[] = [];\n\n for (const candidatePeerInfo of attemptNewPeerInfos) {\n if (allowedNewPeerInfos.length >= availableSlots) {\n break;\n }\n\n const discoveredPeerId = getPeerInfoId(candidatePeerInfo);\n if (admittedPeerExchangePeerIds.has(discoveredPeerId)) {\n continue;\n }\n\n admittedPeerExchangePeerIds.add(discoveredPeerId);\n allowedNewPeerInfos.push(candidatePeerInfo);\n }\n\n await onPeerInfosSelected?.(attemptNewPeerInfos);\n\n return {\n ...result,\n peerInfos: [...knownPeerInfos, ...allowedNewPeerInfos],\n };\n };\n }\n\n try {\n return await originalQuery(peerId);\n } finally {\n if (typeof originalPeerExchangeQuery === 'function') {\n discovery.peerExchange.query = originalPeerExchangeQuery;\n }\n }\n };\n\n return discovery;\n };\n};\n"]}
|
|
@@ -10,6 +10,7 @@ export declare class WakuBroadcasterClient {
|
|
|
10
10
|
static start(chain: Chain, broadcasterOptions: BroadcasterOptions, statusCallback: BroadcasterConnectionStatusCallback, broadcasterDebugger?: BroadcasterDebugger): Promise<void>;
|
|
11
11
|
static stop(): Promise<void>;
|
|
12
12
|
static isStarted(): boolean;
|
|
13
|
+
static setHealthcheckLoggingEnabled(enabled: boolean): void;
|
|
13
14
|
static setChain(chain: Chain): Promise<void>;
|
|
14
15
|
static getContentTopics(): string[];
|
|
15
16
|
static getMeshPeerCount(): number;
|
|
@@ -26,6 +27,8 @@ export declare class WakuBroadcasterClient {
|
|
|
26
27
|
private static restart;
|
|
27
28
|
private static pollStatus;
|
|
28
29
|
private static updateStatus;
|
|
30
|
+
private static formatHealthcheckLog;
|
|
31
|
+
private static logHealthcheck;
|
|
29
32
|
static addTransportSubscription(waku: Optional<LightNode>, topic: string, callback: (message: any) => void): Promise<void>;
|
|
30
33
|
static sendTransport(data: object, topic: string): Promise<void>;
|
|
31
34
|
static getWakuCore(): Optional<LightNode>;
|
|
@@ -24,13 +24,15 @@ export class WakuBroadcasterClient {
|
|
|
24
24
|
BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION =
|
|
25
25
|
broadcasterOptions.broadcasterVersionRange.maxVersion;
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
BroadcasterConfig.configurePeerConnections({
|
|
28
|
+
useDNSDiscovery: broadcasterOptions.useDNSDiscovery,
|
|
29
|
+
useCustomDNS: broadcasterOptions.useCustomDNS,
|
|
30
|
+
dnsDiscoveryUrls: broadcasterOptions.dnsDiscoveryUrls,
|
|
31
|
+
additionalDirectPeers: broadcasterOptions.additionalDirectPeers,
|
|
32
|
+
additionalPeers: broadcasterOptions.additionalPeers,
|
|
33
|
+
storePeers: broadcasterOptions.storePeers,
|
|
34
|
+
});
|
|
35
|
+
BroadcasterConfig.setHealthcheckLoggingEnabled(broadcasterOptions.enableHealthcheckLogs ?? false);
|
|
34
36
|
if (isDefined(broadcasterDebugger)) {
|
|
35
37
|
BroadcasterDebug.setDebugger(broadcasterDebugger);
|
|
36
38
|
}
|
|
@@ -57,6 +59,9 @@ export class WakuBroadcasterClient {
|
|
|
57
59
|
static isStarted() {
|
|
58
60
|
return this.started;
|
|
59
61
|
}
|
|
62
|
+
static setHealthcheckLoggingEnabled(enabled) {
|
|
63
|
+
BroadcasterConfig.setHealthcheckLoggingEnabled(enabled);
|
|
64
|
+
}
|
|
60
65
|
static async setChain(chain) {
|
|
61
66
|
if (!WakuBroadcasterClient.started) {
|
|
62
67
|
return;
|
|
@@ -135,7 +140,10 @@ export class WakuBroadcasterClient {
|
|
|
135
140
|
}
|
|
136
141
|
}
|
|
137
142
|
static async pollStatus() {
|
|
138
|
-
this.updateStatus();
|
|
143
|
+
const status = this.updateStatus();
|
|
144
|
+
if (BroadcasterConfig.enableHealthcheckLogs) {
|
|
145
|
+
await this.logHealthcheck(status);
|
|
146
|
+
}
|
|
139
147
|
await delay(WakuBroadcasterClient.pollDelay);
|
|
140
148
|
this.pollStatus();
|
|
141
149
|
}
|
|
@@ -146,6 +154,45 @@ export class WakuBroadcasterClient {
|
|
|
146
154
|
status === BroadcasterConnectionStatus.Error) {
|
|
147
155
|
this.restart();
|
|
148
156
|
}
|
|
157
|
+
return status;
|
|
158
|
+
}
|
|
159
|
+
static formatHealthcheckLog(healthSnapshot) {
|
|
160
|
+
const discovery = healthSnapshot.discovery ?? {};
|
|
161
|
+
const peerStore = discovery.peerStore ?? {};
|
|
162
|
+
const connectedPeerDetails = discovery.connectedPeerDetails ?? [];
|
|
163
|
+
const lines = [
|
|
164
|
+
'Waku healthcheck:',
|
|
165
|
+
` status: ${healthSnapshot.status}`,
|
|
166
|
+
` chain: ${healthSnapshot.chain}`,
|
|
167
|
+
` started: ${healthSnapshot.started}, restarting: ${healthSnapshot.isRestarting}, wakuStarted: ${healthSnapshot.isStarted}, error: ${healthSnapshot.hasError}`,
|
|
168
|
+
` routing: cluster=${healthSnapshot.routing.clusterId}, shard=${healthSnapshot.routing.shardId}, topic=${healthSnapshot.routing.pubsubTopic}`,
|
|
169
|
+
` configured peers: dns=${healthSnapshot.configuredPeers.dnsDiscoveryUrls.length}, bootstrap=${healthSnapshot.configuredPeers.bootstrapPeers.length}, store=${healthSnapshot.configuredPeers.storePeers.length}`,
|
|
170
|
+
` connections: ${healthSnapshot.connections.count} / peers=${healthSnapshot.connections.peers.join(', ') || 'none'}`,
|
|
171
|
+
` peer store: total=${peerStore.count ?? 0}, bootstrap=${peerStore.bootstrapCount ?? 0}, peer-exchange=${peerStore.peerExchangeCount ?? 0}`,
|
|
172
|
+
` connected peer-exchange support: ${peerStore.connectedPeersSupportingPeerExchange?.join(', ') || 'none'}`,
|
|
173
|
+
` content topics: ${healthSnapshot.contentTopics.join(', ') || 'none'}`,
|
|
174
|
+
];
|
|
175
|
+
if (connectedPeerDetails.length) {
|
|
176
|
+
lines.push(' connected peer details:');
|
|
177
|
+
for (const peer of connectedPeerDetails) {
|
|
178
|
+
lines.push(` - ${peer.peerId} | px=${peer.supportsPeerExchange} | tags=${peer.tags.join(', ') || 'none'} | protocols=${peer.protocols.join(', ') || 'none'}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return lines.join('\n');
|
|
182
|
+
}
|
|
183
|
+
static async logHealthcheck(status) {
|
|
184
|
+
const chain = this.chain
|
|
185
|
+
? `${this.chain.type}:${this.chain.id}`
|
|
186
|
+
: 'undefined';
|
|
187
|
+
const healthSnapshot = {
|
|
188
|
+
pollDelay: this.pollDelay,
|
|
189
|
+
started: this.started,
|
|
190
|
+
isRestarting: this.isRestarting,
|
|
191
|
+
chain,
|
|
192
|
+
status,
|
|
193
|
+
...await WakuBroadcasterWakuCore.getHealthSnapshot(),
|
|
194
|
+
};
|
|
195
|
+
BroadcasterDebug.log(this.formatHealthcheckLog(healthSnapshot));
|
|
149
196
|
}
|
|
150
197
|
static async addTransportSubscription(waku, topic, callback) {
|
|
151
198
|
await WakuObservers.addTransportSubscription(WakuBroadcasterWakuCore.waku, topic, callback);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waku-broadcaster-client.js","sourceRoot":"","sources":["../src/waku-broadcaster-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,kBAAkB,EAClB,2BAA2B,EAE3B,SAAS,GACV,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAM5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAC,KAAK,CAAQ;IACpB,MAAM,CAAC,cAAc,CAAsC;IAC3D,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;IAEpC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;IAEzB,MAAM,CAAC,KAAK,CAAC,KAAK,CAChB,KAAY,EACZ,kBAAsC,EACtC,cAAmD,EACnD,mBAAyC;QAEzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QAErC,uBAAuB,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;QAElE,IAAI,SAAS,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC1D,iBAAiB,CAAC,2BAA2B;gBAC3C,kBAAkB,CAAC,uBAAuB,CAAC,UAAU,CAAC;YACxD,iBAAiB,CAAC,2BAA2B;gBAC3C,kBAAkB,CAAC,uBAAuB,CAAC,UAAU,CAAC;QAC1D,CAAC;QAED,IAAI,SAAS,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;YAClD,iBAAiB,CAAC,eAAe,GAAG,kBAAkB,CAAC,eAAe,CAAA;YACtE,iBAAiB,CAAC,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAA;QAC/D,CAAC;QAED,IAAI,SAAS,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACxD,iBAAiB,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,qBAAqB,CAAA;QACpF,CAAC;QAED,IAAI,SAAS,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACnC,gBAAgB,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;QACpD,CAAC;QAED,mBAAmB,CAAC,IAAI,CACtB,kBAAkB,CAAC,iBAAiB;YACpC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACzC,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,MAAM,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YAGpB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI;QACf,MAAM,uBAAuB,CAAC,UAAU,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAY;QAChC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,qBAAqB,CAAC,KAAK,GAAG,KAAK,CAAC;QACpC,MAAM,aAAa,CAAC,oBAAoB,CACtC,uBAAuB,CAAC,IAAI,EAC5B,KAAK,CACN,CAAC;QACF,qBAAqB,CAAC,YAAY,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,OAAO,aAAa,CAAC,uBAAuB,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,OAAO,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,kBAAkB;QACvB,OAAO,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,qBAAqB;QAChC,OAAO,MAAM,uBAAuB,CAAC,qBAAqB,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB;QAC7B,OAAO,MAAM,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;IAC5D,CAAC;IAUD,MAAM,CAAC,mBAAmB,CACxB,KAAY,EACZ,YAAoB,EACpB,aAAsB;QAEtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,OAAO,iBAAiB,CAAC,mBAAmB,CAC1C,KAAK,EACL,YAAY,EACZ,aAAa,CACd,CAAC;IACJ,CAAC;IASD,MAAM,CAAC,2BAA2B,CAChC,KAAY,EACZ,aAAsB;QAEtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC7E,CAAC;IAkBD,MAAM,CAAC,6BAA6B,CAClC,KAAY,EACZ,YAAoB,EACpB,aAAsB,EACtB,sBAA8B,CAAC;QAE/B,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,OAAO,iBAAiB,CAAC,6BAA6B,CACpD,KAAK,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAYD,MAAM,CAAC,wBAAwB,CAC7B,KAAY,EACZ,YAAoB,EACpB,aAAsB;QAEtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,OAAO,iBAAiB,CAAC,wBAAwB,CAC/C,KAAK,EACL,YAAY,EACZ,aAAa,CACd,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,iBAAiB,CACtB,SAA6B,EAC7B,SAA6B;QAE7B,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY;QAEvB,mBAAmB,CAAC,UAAU,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC5D,qBAAqB,CAAC,YAAY,EAAE,CAAC;QAErC,MAAM,qBAAqB,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,aAAa,CAClB,KAAY,EACZ,YAAoB,EACpB,aAAsB;QAEtB,OAAO,mBAAmB,CAAC,aAAa,CACtC,KAAK,EACL,YAAY,EACZ,aAAa,CACd,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,OAAO;QAC1B,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,gBAAgB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC3C,MAAM,uBAAuB,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,gBAAgB,CAAC,KAAK,CACpB,IAAI,KAAK,CAAC,8CAA8C,EAAE,EAAE,KAAK,EAAE,CAAC,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAKO,MAAM,CAAC,KAAK,CAAC,UAAU;QAE7B,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAG7C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,MAAM,CAAC,YAAY;QACzB,MAAM,MAAM,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,IACE,MAAM,KAAK,2BAA2B,CAAC,YAAY;YACnD,MAAM,KAAK,2BAA2B,CAAC,KAAK,EAC5C,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAGD,MAAM,CAAC,KAAK,CAAC,wBAAwB,CACnC,IAAyB,EACzB,KAAa,EACb,QAAgC;QAEhC,MAAM,aAAa,CAAC,wBAAwB,CAC1C,uBAAuB,CAAC,IAAI,EAC5B,KAAK,EACL,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,KAAa;QACpD,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC;YAEH,MAAM,uBAAuB,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,gBAAgB,CAAC,GAAG,CAClB,wBAAwB,CAAC,CAAC,OAAO,EAAE,CACpC,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,uBAAuB,CAAC,IAAI,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,QAAoB;QAC5C,uBAAuB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC","sourcesContent":["import {\n Chain,\n delay,\n POI_REQUIRED_LISTS,\n BroadcasterConnectionStatus,\n SelectedBroadcaster,\n isDefined,\n} from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from './fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from './filters/address-filter.js';\nimport {\n BroadcasterConnectionStatusCallback,\n BroadcasterDebugger,\n BroadcasterOptions,\n} from './models/export-models.js';\nimport { BroadcasterConfig } from './models/broadcaster-config.js';\nimport { BroadcasterSearch } from './search/best-broadcaster.js';\nimport { BroadcasterStatus } from './status/broadcaster-connection-status.js';\nimport { BroadcasterDebug } from './utils/broadcaster-debug.js';\nimport { WakuObservers } from './waku/waku-observers.js';\nimport { WakuBroadcasterWakuCore } from './waku/waku-broadcaster-waku-core.js';\nimport type { LightNode } from '@waku/sdk';\nimport { contentTopics } from './waku/waku-topics.js';\n\nexport class WakuBroadcasterClient {\n private static chain: Chain;\n private static statusCallback: BroadcasterConnectionStatusCallback;\n private static started = false;\n private static isRestarting = false;\n\n static pollDelay = 3_000;\n\n static async start(\n chain: Chain,\n broadcasterOptions: BroadcasterOptions,\n statusCallback: BroadcasterConnectionStatusCallback,\n broadcasterDebugger?: BroadcasterDebugger,\n ) {\n this.chain = chain;\n this.statusCallback = statusCallback;\n\n WakuBroadcasterWakuCore.setBroadcasterOptions(broadcasterOptions);\n\n if (isDefined(broadcasterOptions.broadcasterVersionRange)) {\n BroadcasterConfig.MINIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.minVersion;\n BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.maxVersion;\n }\n\n if (isDefined(broadcasterOptions.useDNSDiscovery)) {\n BroadcasterConfig.useDNSDiscovery = broadcasterOptions.useDNSDiscovery\n BroadcasterConfig.customDNS = broadcasterOptions.useCustomDNS\n }\n\n if (isDefined(broadcasterOptions.additionalDirectPeers)) {\n BroadcasterConfig.additionalDirectPeers = broadcasterOptions.additionalDirectPeers\n }\n\n if (isDefined(broadcasterDebugger)) {\n BroadcasterDebug.setDebugger(broadcasterDebugger);\n }\n\n BroadcasterFeeCache.init(\n broadcasterOptions.poiActiveListKeys ??\n POI_REQUIRED_LISTS.map(list => list.key),\n );\n\n try {\n this.started = false;\n await WakuBroadcasterWakuCore.initWaku(chain);\n this.started = true;\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n throw new Error('Cannot connect to Broadcaster network.', { cause });\n }\n }\n\n static async stop() {\n await WakuBroadcasterWakuCore.disconnect();\n this.started = false;\n this.updateStatus();\n }\n\n static isStarted() {\n return this.started;\n }\n\n static async setChain(chain: Chain): Promise<void> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n WakuBroadcasterClient.chain = chain;\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n WakuBroadcasterClient.updateStatus();\n }\n\n static getContentTopics(): string[] {\n return WakuObservers.getCurrentContentTopics();\n }\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getMeshPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getLightPushPeerCount();\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getFilterPeerCount();\n }\n /**\n * The function `findBestBroadcaster` finds the broadcaster with the lowest fees for a given chain and token.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBestBroadcaster(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n /**\n * The function `findAllBroadcastersForChain` returns an array of all available broadcasters fee-tokens for a given chain.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find all broadcasters for.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return [];\n }\n\n return BroadcasterSearch.findAllBroadcastersForChain(chain, useRelayAdapt);\n }\n\n /**\n * The function `findRandomBroadcasterForToken` selects a random broadcaster from a list of broadcasters that is based on\n * their fees for a specific token, and how much higher their fees are compared to the broadcaster with\n * the lowest fees.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @param {number} [percentageThreshold=5] - The `percentageThreshold` parameter is a number that\n * represents the maximum percentage increase in fees that a broadcaster can have compared to the broadcaster\n * with the lowest fees. For example, if the `percentageThreshold` is set to 5, it means that a\n * broadcaster can have a maximum of 5% higher fees than the broadcaster with the lowest fees and still be selected.\n * Defaults to 5.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number = 5,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findRandomBroadcasterForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n percentageThreshold,\n );\n }\n\n /**\n * The function `findBroadcastersForToken` takes in a chain, token address, and a boolean flag, and\n * returns an array of selected broadcasters based on the provided parameters.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network; a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n static setAddressFilters(\n allowlist: Optional<string[]>,\n blocklist: Optional<string[]>,\n ): void {\n AddressFilter.setAllowlist(allowlist);\n AddressFilter.setBlocklist(blocklist);\n }\n\n static async tryReconnect(): Promise<void> {\n // Reset fees, which will reset status to \"Searching\".\n BroadcasterFeeCache.resetCache(WakuBroadcasterClient.chain);\n WakuBroadcasterClient.updateStatus();\n\n await WakuBroadcasterClient.restart();\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ) {\n return BroadcasterFeeCache.supportsToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n private static async restart(): Promise<void> {\n if (this.isRestarting || !this.started) {\n return;\n }\n this.isRestarting = true;\n try {\n BroadcasterDebug.log('Restarting Waku...');\n await WakuBroadcasterWakuCore.reinitWaku(this.chain);\n this.isRestarting = false;\n } catch (cause) {\n this.isRestarting = false;\n if (!(cause instanceof Error)) {\n return;\n }\n BroadcasterDebug.error(\n new Error('Error reinitializing Waku Broadcaster Client', { cause }),\n );\n }\n }\n\n /**\n * Start keep-alive poller which checks Broadcaster status every few seconds.\n */\n private static async pollStatus(): Promise<void> {\n\n this.updateStatus();\n await delay(WakuBroadcasterClient.pollDelay);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n }\n\n private static updateStatus() {\n const status = BroadcasterStatus.getBroadcasterConnectionStatus(this.chain);\n\n this.statusCallback(this.chain, status);\n if (\n status === BroadcasterConnectionStatus.Disconnected ||\n status === BroadcasterConnectionStatus.Error\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.restart();\n }\n }\n\n // Waku Transport functions\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n await WakuObservers.addTransportSubscription(\n WakuBroadcasterWakuCore.waku,\n topic,\n callback,\n );\n }\n\n static async sendTransport(data: object, topic: string): Promise<void> {\n const customTopic = contentTopics.encrypted(topic);\n try {\n\n await WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n } catch (e) {\n BroadcasterDebug.log(\n `SendTransport error: ${e.message}`\n )\n }\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\n }\n\n static setRestartCallback(callback: () => void): void {\n WakuBroadcasterWakuCore.setWakuRestartCallback(callback);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"waku-broadcaster-client.js","sourceRoot":"","sources":["../src/waku-broadcaster-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Chain,\n delay,\n POI_REQUIRED_LISTS,\n BroadcasterConnectionStatus,\n SelectedBroadcaster,\n isDefined,\n} from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from './fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from './filters/address-filter.js';\nimport {\n BroadcasterConnectionStatusCallback,\n BroadcasterDebugger,\n BroadcasterOptions,\n} from './models/export-models.js';\nimport { BroadcasterConfig } from './models/broadcaster-config.js';\nimport { BroadcasterSearch } from './search/best-broadcaster.js';\nimport { BroadcasterStatus } from './status/broadcaster-connection-status.js';\nimport { BroadcasterDebug } from './utils/broadcaster-debug.js';\nimport { WakuObservers } from './waku/waku-observers.js';\nimport { WakuBroadcasterWakuCore } from './waku/waku-broadcaster-waku-core.js';\nimport type { LightNode } from '@waku/sdk';\nimport { contentTopics } from './waku/waku-topics.js';\n\nexport class WakuBroadcasterClient {\n private static chain: Chain;\n private static statusCallback: BroadcasterConnectionStatusCallback;\n private static started = false;\n private static isRestarting = false;\n\n static pollDelay = 3_000;\n\n static async start(\n chain: Chain,\n broadcasterOptions: BroadcasterOptions,\n statusCallback: BroadcasterConnectionStatusCallback,\n broadcasterDebugger?: BroadcasterDebugger,\n ) {\n this.chain = chain;\n this.statusCallback = statusCallback;\n\n WakuBroadcasterWakuCore.setBroadcasterOptions(broadcasterOptions);\n\n if (isDefined(broadcasterOptions.broadcasterVersionRange)) {\n BroadcasterConfig.MINIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.minVersion;\n BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION =\n broadcasterOptions.broadcasterVersionRange.maxVersion;\n }\n\n BroadcasterConfig.configurePeerConnections({\n useDNSDiscovery: broadcasterOptions.useDNSDiscovery,\n useCustomDNS: broadcasterOptions.useCustomDNS,\n dnsDiscoveryUrls: broadcasterOptions.dnsDiscoveryUrls,\n additionalDirectPeers: broadcasterOptions.additionalDirectPeers,\n additionalPeers: broadcasterOptions.additionalPeers,\n storePeers: broadcasterOptions.storePeers,\n });\n BroadcasterConfig.setHealthcheckLoggingEnabled(\n broadcasterOptions.enableHealthcheckLogs ?? false,\n );\n\n if (isDefined(broadcasterDebugger)) {\n BroadcasterDebug.setDebugger(broadcasterDebugger);\n }\n\n BroadcasterFeeCache.init(\n broadcasterOptions.poiActiveListKeys ??\n POI_REQUIRED_LISTS.map(list => list.key),\n );\n\n try {\n this.started = false;\n await WakuBroadcasterWakuCore.initWaku(chain);\n this.started = true;\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n throw new Error('Cannot connect to Broadcaster network.', { cause });\n }\n }\n\n static async stop() {\n await WakuBroadcasterWakuCore.disconnect();\n this.started = false;\n this.updateStatus();\n }\n\n static isStarted() {\n return this.started;\n }\n\n static setHealthcheckLoggingEnabled(enabled: boolean) {\n BroadcasterConfig.setHealthcheckLoggingEnabled(enabled);\n }\n\n static async setChain(chain: Chain): Promise<void> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n WakuBroadcasterClient.chain = chain;\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n WakuBroadcasterClient.updateStatus();\n }\n\n static getContentTopics(): string[] {\n return WakuObservers.getCurrentContentTopics();\n }\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getMeshPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getLightPushPeerCount();\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getFilterPeerCount();\n }\n /**\n * The function `findBestBroadcaster` finds the broadcaster with the lowest fees for a given chain and token.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBestBroadcaster(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n /**\n * The function `findAllBroadcastersForChain` returns an array of all available broadcasters fee-tokens for a given chain.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find all broadcasters for.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return [];\n }\n\n return BroadcasterSearch.findAllBroadcastersForChain(chain, useRelayAdapt);\n }\n\n /**\n * The function `findRandomBroadcasterForToken` selects a random broadcaster from a list of broadcasters that is based on\n * their fees for a specific token, and how much higher their fees are compared to the broadcaster with\n * the lowest fees.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @param {number} [percentageThreshold=5] - The `percentageThreshold` parameter is a number that\n * represents the maximum percentage increase in fees that a broadcaster can have compared to the broadcaster\n * with the lowest fees. For example, if the `percentageThreshold` is set to 5, it means that a\n * broadcaster can have a maximum of 5% higher fees than the broadcaster with the lowest fees and still be selected.\n * Defaults to 5.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number = 5,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findRandomBroadcasterForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n percentageThreshold,\n );\n }\n\n /**\n * The function `findBroadcastersForToken` takes in a chain, token address, and a boolean flag, and\n * returns an array of selected broadcasters based on the provided parameters.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network; a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n static setAddressFilters(\n allowlist: Optional<string[]>,\n blocklist: Optional<string[]>,\n ): void {\n AddressFilter.setAllowlist(allowlist);\n AddressFilter.setBlocklist(blocklist);\n }\n\n static async tryReconnect(): Promise<void> {\n // Reset fees, which will reset status to \"Searching\".\n BroadcasterFeeCache.resetCache(WakuBroadcasterClient.chain);\n WakuBroadcasterClient.updateStatus();\n\n await WakuBroadcasterClient.restart();\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ) {\n return BroadcasterFeeCache.supportsToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n private static async restart(): Promise<void> {\n if (this.isRestarting || !this.started) {\n return;\n }\n this.isRestarting = true;\n try {\n BroadcasterDebug.log('Restarting Waku...');\n await WakuBroadcasterWakuCore.reinitWaku(this.chain);\n this.isRestarting = false;\n } catch (cause) {\n this.isRestarting = false;\n if (!(cause instanceof Error)) {\n return;\n }\n BroadcasterDebug.error(\n new Error('Error reinitializing Waku Broadcaster Client', { cause }),\n );\n }\n }\n\n /**\n * Start keep-alive poller which checks Broadcaster status every few seconds.\n */\n private static async pollStatus(): Promise<void> {\n const status = this.updateStatus();\n if (BroadcasterConfig.enableHealthcheckLogs) {\n await this.logHealthcheck(status);\n }\n await delay(WakuBroadcasterClient.pollDelay);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n }\n\n private static updateStatus(): BroadcasterConnectionStatus {\n const status = BroadcasterStatus.getBroadcasterConnectionStatus(this.chain);\n\n this.statusCallback(this.chain, status);\n if (\n status === BroadcasterConnectionStatus.Disconnected ||\n status === BroadcasterConnectionStatus.Error\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.restart();\n }\n\n return status;\n }\n\n private static formatHealthcheckLog(healthSnapshot: any): string {\n const discovery = healthSnapshot.discovery ?? {};\n const peerStore = discovery.peerStore ?? {};\n const connectedPeerDetails = discovery.connectedPeerDetails ?? [];\n\n const lines = [\n 'Waku healthcheck:',\n ` status: ${healthSnapshot.status}`,\n ` chain: ${healthSnapshot.chain}`,\n ` started: ${healthSnapshot.started}, restarting: ${healthSnapshot.isRestarting}, wakuStarted: ${healthSnapshot.isStarted}, error: ${healthSnapshot.hasError}`,\n ` routing: cluster=${healthSnapshot.routing.clusterId}, shard=${healthSnapshot.routing.shardId}, topic=${healthSnapshot.routing.pubsubTopic}`,\n ` configured peers: dns=${healthSnapshot.configuredPeers.dnsDiscoveryUrls.length}, bootstrap=${healthSnapshot.configuredPeers.bootstrapPeers.length}, store=${healthSnapshot.configuredPeers.storePeers.length}`,\n ` connections: ${healthSnapshot.connections.count} / peers=${healthSnapshot.connections.peers.join(', ') || 'none'}`,\n ` peer store: total=${peerStore.count ?? 0}, bootstrap=${peerStore.bootstrapCount ?? 0}, peer-exchange=${peerStore.peerExchangeCount ?? 0}`,\n ` connected peer-exchange support: ${peerStore.connectedPeersSupportingPeerExchange?.join(', ') || 'none'}`,\n ` content topics: ${healthSnapshot.contentTopics.join(', ') || 'none'}`,\n ];\n\n if (connectedPeerDetails.length) {\n lines.push(' connected peer details:');\n for (const peer of connectedPeerDetails) {\n lines.push(\n ` - ${peer.peerId} | px=${peer.supportsPeerExchange} | tags=${peer.tags.join(', ') || 'none'} | protocols=${peer.protocols.join(', ') || 'none'}`,\n );\n }\n }\n\n return lines.join('\\n');\n }\n\n private static async logHealthcheck(status: BroadcasterConnectionStatus) {\n const chain = this.chain\n ? `${this.chain.type}:${this.chain.id}`\n : 'undefined';\n const healthSnapshot = {\n pollDelay: this.pollDelay,\n started: this.started,\n isRestarting: this.isRestarting,\n chain,\n status,\n ...await WakuBroadcasterWakuCore.getHealthSnapshot(),\n };\n\n BroadcasterDebug.log(this.formatHealthcheckLog(healthSnapshot));\n }\n\n // Waku Transport functions\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n await WakuObservers.addTransportSubscription(\n WakuBroadcasterWakuCore.waku,\n topic,\n callback,\n );\n }\n\n static async sendTransport(data: object, topic: string): Promise<void> {\n const customTopic = contentTopics.encrypted(topic);\n try {\n\n await WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n } catch (e) {\n BroadcasterDebug.log(\n `SendTransport error: ${e.message}`\n )\n }\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\n }\n\n static setRestartCallback(callback: () => void): void {\n WakuBroadcasterWakuCore.setWakuRestartCallback(callback);\n }\n}\n"]}
|