@railgun-community/waku-broadcaster-client-web 7.2.7 → 8.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/dist/models/broadcaster-config.d.ts +2 -2
- package/dist/models/broadcaster-config.js +2 -2
- package/dist/models/broadcaster-config.js.map +1 -1
- package/dist/models/constants.d.ts +9 -1
- package/dist/models/constants.js +13 -3
- package/dist/models/constants.js.map +1 -1
- package/dist/waku/waku-broadcaster-waku-core.d.ts +1 -0
- package/dist/waku/waku-broadcaster-waku-core.js +13 -20
- package/dist/waku/waku-broadcaster-waku-core.js.map +1 -1
- package/dist/waku/waku-observers.d.ts +1 -4
- package/dist/waku/waku-observers.js +35 -113
- package/dist/waku/waku-observers.js.map +1 -1
- package/dist/waku/waku-topics.d.ts +3 -1
- package/dist/waku/waku-topics.js +6 -4
- package/dist/waku/waku-topics.js.map +1 -1
- package/dist/waku-broadcaster-client.js +1 -0
- package/dist/waku-broadcaster-client.js.map +1 -1
- package/package.json +19 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare class BroadcasterConfig {
|
|
2
2
|
static IS_DEV: boolean;
|
|
3
|
-
static readonly MINIMUM_BROADCASTER_VERSION = "
|
|
4
|
-
static readonly MAXIMUM_BROADCASTER_VERSION = "
|
|
3
|
+
static readonly MINIMUM_BROADCASTER_VERSION = "7.0.0";
|
|
4
|
+
static readonly MAXIMUM_BROADCASTER_VERSION = "7.999.0";
|
|
5
5
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export class BroadcasterConfig {
|
|
2
2
|
static IS_DEV = false;
|
|
3
|
-
static MINIMUM_BROADCASTER_VERSION = '
|
|
4
|
-
static MAXIMUM_BROADCASTER_VERSION = '
|
|
3
|
+
static MINIMUM_BROADCASTER_VERSION = '7.0.0';
|
|
4
|
+
static MAXIMUM_BROADCASTER_VERSION = '7.999.0';
|
|
5
5
|
}
|
|
6
6
|
//# sourceMappingURL=broadcaster-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcaster-config.js","sourceRoot":"","sources":["../../src/models/broadcaster-config.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IAEtB,MAAM,CAAU,2BAA2B,GAAG,OAAO,CAAC;IACtD,MAAM,CAAU,2BAA2B,GAAG,SAAS,CAAC","sourcesContent":["export class BroadcasterConfig {\n static IS_DEV = false;\n\n static readonly MINIMUM_BROADCASTER_VERSION = '
|
|
1
|
+
{"version":3,"file":"broadcaster-config.js","sourceRoot":"","sources":["../../src/models/broadcaster-config.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IAEtB,MAAM,CAAU,2BAA2B,GAAG,OAAO,CAAC;IACtD,MAAM,CAAU,2BAA2B,GAAG,SAAS,CAAC","sourcesContent":["export class BroadcasterConfig {\n static IS_DEV = false;\n\n static readonly MINIMUM_BROADCASTER_VERSION = '7.0.0';\n static readonly MAXIMUM_BROADCASTER_VERSION = '7.999.0';\n}\n"]}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
export declare const WAKU_RAILGUN_PUB_SUB_TOPIC = "/waku/2/
|
|
1
|
+
export declare const WAKU_RAILGUN_PUB_SUB_TOPIC = "/waku/2/rs/0/1";
|
|
2
|
+
export declare const WAKU_RAILGUN_DEFAULT_SHARD: {
|
|
3
|
+
clusterId: number;
|
|
4
|
+
shard: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const WAKU_RAILGUN_DEFAULT_SHARDS: {
|
|
7
|
+
clusterId: number;
|
|
8
|
+
shards: number[];
|
|
9
|
+
};
|
|
2
10
|
export declare const WAKU_RAILGUN_DEFAULT_PEERS_WEB: string[];
|
|
3
11
|
export declare const WAKU_RAILGUN_DEFAULT_PEERS_NODE: string[];
|
package/dist/models/constants.js
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
export const WAKU_RAILGUN_PUB_SUB_TOPIC = '/waku/2/
|
|
1
|
+
export const WAKU_RAILGUN_PUB_SUB_TOPIC = '/waku/2/rs/0/1';
|
|
2
|
+
export const WAKU_RAILGUN_DEFAULT_SHARD = {
|
|
3
|
+
clusterId: 0,
|
|
4
|
+
shard: 1,
|
|
5
|
+
};
|
|
6
|
+
export const WAKU_RAILGUN_DEFAULT_SHARDS = {
|
|
7
|
+
clusterId: 0,
|
|
8
|
+
shards: [0, 1, 2, 3, 4, 5],
|
|
9
|
+
};
|
|
2
10
|
export const WAKU_RAILGUN_DEFAULT_PEERS_WEB = [
|
|
3
|
-
'/dns4/
|
|
11
|
+
'/dns4/core.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',
|
|
12
|
+
'/dns4/fleet.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',
|
|
4
13
|
];
|
|
5
14
|
export const WAKU_RAILGUN_DEFAULT_PEERS_NODE = [
|
|
6
|
-
'/dns4/
|
|
15
|
+
'/dns4/core.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',
|
|
16
|
+
'/dns4/fleet.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',
|
|
7
17
|
];
|
|
8
18
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/models/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/models/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AAE3D,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,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,8BAA8B,GAAa;IAEtD,uGAAuG;IACvG,wGAAwG;CACzG,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAa;IAEvD,oGAAoG;IACpG,qGAAqG;CACtG,CAAC","sourcesContent":["export const WAKU_RAILGUN_PUB_SUB_TOPIC = '/waku/2/rs/0/1';\n\nexport const WAKU_RAILGUN_DEFAULT_SHARD = {\n clusterId: 0,\n shard: 1,\n};\n\nexport const WAKU_RAILGUN_DEFAULT_SHARDS = {\n clusterId: 0,\n shards: [0, 1, 2, 3, 4, 5],\n};\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_WEB: string[] = [\n // Some Websocket broadcasters (web friendly):\n '/dns4/core.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',\n '/dns4/fleet.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',\n];\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_NODE: string[] = [\n // Some TCP broadcasters (node friendly):\n '/dns4/core.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',\n '/dns4/fleet.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',\n];\n"]}
|
|
@@ -7,6 +7,7 @@ export declare class WakuBroadcasterWakuCore {
|
|
|
7
7
|
private static pubSubTopic;
|
|
8
8
|
private static additionalDirectPeers;
|
|
9
9
|
private static peerDiscoveryTimeout;
|
|
10
|
+
private static defaultShard;
|
|
10
11
|
static initWaku: (chain: Chain) => Promise<void>;
|
|
11
12
|
static reinitWaku: (chain: Chain) => Promise<void>;
|
|
12
13
|
static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions): void;
|
|
@@ -5,15 +5,16 @@ import { WakuObservers } from './waku-observers.js';
|
|
|
5
5
|
import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
|
|
6
6
|
import { utf8ToBytes } from '../utils/conversion.js';
|
|
7
7
|
import { isDefined } from '../utils/is-defined.js';
|
|
8
|
-
import { bootstrap } from '@libp2p/bootstrap';
|
|
9
8
|
import { createLightNode } from '@waku/sdk';
|
|
10
|
-
import { WAKU_RAILGUN_DEFAULT_PEERS_WEB, WAKU_RAILGUN_PUB_SUB_TOPIC, } from '../models/constants.js';
|
|
9
|
+
import { WAKU_RAILGUN_DEFAULT_PEERS_WEB, WAKU_RAILGUN_PUB_SUB_TOPIC, WAKU_RAILGUN_DEFAULT_SHARD, WAKU_RAILGUN_DEFAULT_SHARDS, } from '../models/constants.js';
|
|
10
|
+
import { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';
|
|
11
11
|
export class WakuBroadcasterWakuCore {
|
|
12
12
|
static hasError = false;
|
|
13
13
|
static waku;
|
|
14
14
|
static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;
|
|
15
15
|
static additionalDirectPeers = [];
|
|
16
16
|
static peerDiscoveryTimeout = 60000;
|
|
17
|
+
static defaultShard = WAKU_RAILGUN_DEFAULT_SHARD;
|
|
17
18
|
static initWaku = async (chain) => {
|
|
18
19
|
try {
|
|
19
20
|
await WakuBroadcasterWakuCore.connect();
|
|
@@ -37,6 +38,7 @@ export class WakuBroadcasterWakuCore {
|
|
|
37
38
|
WakuBroadcasterWakuCore.waku.isStarted()) {
|
|
38
39
|
await WakuBroadcasterWakuCore.disconnect();
|
|
39
40
|
}
|
|
41
|
+
BroadcasterFeeCache.resetCache(chain);
|
|
40
42
|
await WakuBroadcasterWakuCore.initWaku(chain);
|
|
41
43
|
};
|
|
42
44
|
static setBroadcasterOptions(broadcasterOptions) {
|
|
@@ -60,23 +62,13 @@ export class WakuBroadcasterWakuCore {
|
|
|
60
62
|
try {
|
|
61
63
|
WakuBroadcasterWakuCore.hasError = false;
|
|
62
64
|
BroadcasterDebug.log(`Creating waku broadcast client`);
|
|
63
|
-
const
|
|
65
|
+
const bootstrapPeers = [
|
|
64
66
|
...WAKU_RAILGUN_DEFAULT_PEERS_WEB,
|
|
65
67
|
...this.additionalDirectPeers,
|
|
66
68
|
];
|
|
67
|
-
const waitTimeoutBeforeBootstrap = 250;
|
|
68
69
|
const waku = await createLightNode({
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
relayKeepAlive: 60,
|
|
72
|
-
libp2p: {
|
|
73
|
-
peerDiscovery: [
|
|
74
|
-
bootstrap({
|
|
75
|
-
list: peers,
|
|
76
|
-
timeout: waitTimeoutBeforeBootstrap,
|
|
77
|
-
}),
|
|
78
|
-
],
|
|
79
|
-
},
|
|
70
|
+
bootstrapPeers,
|
|
71
|
+
networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,
|
|
80
72
|
});
|
|
81
73
|
BroadcasterDebug.log('Start Waku.');
|
|
82
74
|
await waku.start();
|
|
@@ -109,11 +101,11 @@ export class WakuBroadcasterWakuCore {
|
|
|
109
101
|
return peers.length;
|
|
110
102
|
}
|
|
111
103
|
static async getLightPushPeerCount() {
|
|
112
|
-
const peers =
|
|
104
|
+
const peers = WakuBroadcasterWakuCore.waku?.lightPush.connectedPeers ?? [];
|
|
113
105
|
return peers.length;
|
|
114
106
|
}
|
|
115
107
|
static async getFilterPeerCount() {
|
|
116
|
-
const peers = (await WakuBroadcasterWakuCore.waku?.filter.
|
|
108
|
+
const peers = (await WakuBroadcasterWakuCore.waku?.filter.connectedPeers) ?? [];
|
|
117
109
|
return peers.length;
|
|
118
110
|
}
|
|
119
111
|
static async waitForRemotePeer(waku) {
|
|
@@ -134,10 +126,11 @@ export class WakuBroadcasterWakuCore {
|
|
|
134
126
|
const payload = utf8ToBytes(dataString);
|
|
135
127
|
const message = { payload };
|
|
136
128
|
try {
|
|
137
|
-
|
|
129
|
+
const encoder = createEncoder({
|
|
138
130
|
contentTopic,
|
|
139
|
-
|
|
140
|
-
})
|
|
131
|
+
pubsubTopicShardInfo: this.defaultShard,
|
|
132
|
+
});
|
|
133
|
+
await WakuBroadcasterWakuCore.waku?.lightPush.send(encoder, message);
|
|
141
134
|
}
|
|
142
135
|
catch (err) {
|
|
143
136
|
if (!(err instanceof Error)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waku-broadcaster-waku-core.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-waku-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, promiseTimeout } from '@railgun-community/shared-models';\nimport { waitForRemotePeer, createEncoder } from '@waku/core';\nimport { Protocols, IMessage, LightNode } from '@waku/interfaces';\nimport { WakuObservers } from './waku-observers.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { utf8ToBytes } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { createLightNode } from '@waku/sdk';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_PEERS_WEB,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\n\nexport class WakuBroadcasterWakuCore {\n static hasError = false;\n\n static waku: Optional<LightNode>;\n private static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;\n private static additionalDirectPeers: string[] = [];\n private static peerDiscoveryTimeout = 60000;\n\n static initWaku = async (chain: Chain): Promise<void> => {\n try {\n await WakuBroadcasterWakuCore.connect();\n if (!WakuBroadcasterWakuCore.waku) {\n BroadcasterDebug.log('No waku instance found');\n return;\n }\n WakuObservers.resetCurrentChain();\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw err;\n }\n };\n\n static reinitWaku = async (chain: Chain) => {\n if (\n isDefined(WakuBroadcasterWakuCore.waku) &&\n WakuBroadcasterWakuCore.waku.isStarted()\n ) {\n await WakuBroadcasterWakuCore.disconnect();\n }\n\n await WakuBroadcasterWakuCore.initWaku(chain);\n };\n\n static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions) {\n if (isDefined(broadcasterOptions.pubSubTopic)) {\n WakuBroadcasterWakuCore.pubSubTopic = broadcasterOptions.pubSubTopic;\n }\n if (broadcasterOptions.additionalDirectPeers) {\n WakuBroadcasterWakuCore.additionalDirectPeers =\n broadcasterOptions.additionalDirectPeers;\n }\n if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {\n WakuBroadcasterWakuCore.peerDiscoveryTimeout =\n broadcasterOptions.peerDiscoveryTimeout;\n }\n }\n\n static disconnect = async () => {\n await WakuBroadcasterWakuCore.waku?.stop();\n WakuBroadcasterWakuCore.waku = undefined;\n };\n\n private static connect = async (): Promise<void> => {\n try {\n WakuBroadcasterWakuCore.hasError = false;\n\n BroadcasterDebug.log(`Creating waku broadcast client`);\n\n const peers: string[] = [\n ...WAKU_RAILGUN_DEFAULT_PEERS_WEB,\n ...this.additionalDirectPeers,\n ];\n const waitTimeoutBeforeBootstrap = 250; // 250 ms - default is 1000ms\n const waku: LightNode = await createLightNode({\n pubsubTopics: [WakuBroadcasterWakuCore.pubSubTopic],\n pingKeepAlive: 60,\n relayKeepAlive: 60,\n libp2p: {\n peerDiscovery: [\n bootstrap({\n list: peers,\n timeout: waitTimeoutBeforeBootstrap,\n }),\n ],\n },\n });\n\n BroadcasterDebug.log('Start Waku.');\n await waku.start();\n\n BroadcasterDebug.log('Waiting for remote peer.');\n await this.waitForRemotePeer(waku);\n\n if (!isDefined(waku.lightPush)) {\n throw new Error('No Waku LightPush instantiated.');\n }\n\n BroadcasterDebug.log('Waku peers:');\n for (const peer of waku.libp2p.getPeers()) {\n BroadcasterDebug.log(JSON.stringify(peer));\n }\n\n BroadcasterDebug.log('Connected to Waku');\n WakuBroadcasterWakuCore.waku = waku;\n WakuBroadcasterWakuCore.hasError = false;\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n WakuBroadcasterWakuCore.hasError = true;\n throw err;\n }\n };\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n const peers = WakuBroadcasterWakuCore.waku?.libp2p.getPeers() ?? [];\n return peers.length;\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n const peers =\n (await WakuBroadcasterWakuCore.waku?.lightPush.allPeers()) ?? [];\n return peers.length;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n const peers = (await WakuBroadcasterWakuCore.waku?.filter.allPeers()) ?? [];\n return peers.length;\n }\n\n private static async waitForRemotePeer(waku: LightNode) {\n try {\n const protocols = [Protocols.LightPush, Protocols.Filter];\n await promiseTimeout(\n waitForRemotePeer(waku, protocols),\n WakuBroadcasterWakuCore.peerDiscoveryTimeout,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw new Error(err.message);\n }\n }\n\n static async broadcastMessage(\n data: object,\n contentTopic: string,\n ): Promise<void> {\n const dataString = JSON.stringify(data);\n const payload = utf8ToBytes(dataString);\n const message: IMessage = { payload };\n try {\n await WakuBroadcasterWakuCore.waku?.lightPush.send(\n createEncoder({\n contentTopic,\n pubsubTopic: WakuBroadcasterWakuCore.pubSubTopic,\n }),\n message,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"waku-broadcaster-waku-core.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-waku-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, promiseTimeout } from '@railgun-community/shared-models';\nimport { waitForRemotePeer, createEncoder } from '@waku/core';\nimport { Protocols, IMessage, LightNode } from '@waku/interfaces';\nimport { WakuObservers } from './waku-observers.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { utf8ToBytes } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { createLightNode } from '@waku/sdk';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_PEERS_WEB,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n WAKU_RAILGUN_DEFAULT_SHARD,\n WAKU_RAILGUN_DEFAULT_SHARDS,\n} from '../models/constants.js';\nimport { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';\nimport { wakuDnsDiscovery } from '@waku/discovery';\nimport type { Libp2pOptions } from 'libp2p';\n\nexport class WakuBroadcasterWakuCore {\n static hasError = false;\n\n static waku: Optional<LightNode>;\n private static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;\n private static additionalDirectPeers: string[] = [];\n private static peerDiscoveryTimeout = 60000;\n private static defaultShard = WAKU_RAILGUN_DEFAULT_SHARD;\n\n static initWaku = async (chain: Chain): Promise<void> => {\n try {\n await WakuBroadcasterWakuCore.connect();\n if (!WakuBroadcasterWakuCore.waku) {\n BroadcasterDebug.log('No waku instance found');\n return;\n }\n WakuObservers.resetCurrentChain();\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw err;\n }\n };\n\n static reinitWaku = async (chain: Chain) => {\n if (\n isDefined(WakuBroadcasterWakuCore.waku) &&\n WakuBroadcasterWakuCore.waku.isStarted()\n ) {\n // Reset fees, which will reset status to \"Searching\".\n await WakuBroadcasterWakuCore.disconnect();\n }\n\n BroadcasterFeeCache.resetCache(chain);\n await WakuBroadcasterWakuCore.initWaku(chain);\n };\n\n static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions) {\n if (isDefined(broadcasterOptions.pubSubTopic)) {\n WakuBroadcasterWakuCore.pubSubTopic = broadcasterOptions.pubSubTopic;\n }\n if (broadcasterOptions.additionalDirectPeers) {\n WakuBroadcasterWakuCore.additionalDirectPeers =\n broadcasterOptions.additionalDirectPeers;\n }\n if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {\n WakuBroadcasterWakuCore.peerDiscoveryTimeout =\n broadcasterOptions.peerDiscoveryTimeout;\n }\n }\n\n static disconnect = async () => {\n await WakuBroadcasterWakuCore.waku?.stop();\n WakuBroadcasterWakuCore.waku = undefined;\n };\n\n private static connect = async (): Promise<void> => {\n try {\n WakuBroadcasterWakuCore.hasError = false;\n\n BroadcasterDebug.log(`Creating waku broadcast client`);\n\n const bootstrapPeers: string[] = [\n ...WAKU_RAILGUN_DEFAULT_PEERS_WEB,\n ...this.additionalDirectPeers,\n ];\n\n const waku = await createLightNode({\n bootstrapPeers,\n networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,\n });\n\n BroadcasterDebug.log('Start Waku.');\n await waku.start();\n\n BroadcasterDebug.log('Waiting for remote peer.');\n await this.waitForRemotePeer(waku);\n\n if (!isDefined(waku.lightPush)) {\n throw new Error('No Waku LightPush instantiated.');\n }\n\n BroadcasterDebug.log('Waku peers:');\n for (const peer of waku.libp2p.getPeers()) {\n BroadcasterDebug.log(JSON.stringify(peer));\n }\n\n BroadcasterDebug.log('Connected to Waku');\n WakuBroadcasterWakuCore.waku = waku;\n WakuBroadcasterWakuCore.hasError = false;\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n WakuBroadcasterWakuCore.hasError = true;\n throw err;\n }\n };\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n const peers = WakuBroadcasterWakuCore.waku?.libp2p.getPeers() ?? [];\n return peers.length;\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n const peers = WakuBroadcasterWakuCore.waku?.lightPush.connectedPeers ?? [];\n return peers.length;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n const peers =\n (await WakuBroadcasterWakuCore.waku?.filter.connectedPeers) ?? [];\n return peers.length;\n }\n\n private static async waitForRemotePeer(waku: LightNode) {\n try {\n const protocols = [Protocols.LightPush, Protocols.Filter];\n await promiseTimeout(\n waitForRemotePeer(waku, protocols),\n WakuBroadcasterWakuCore.peerDiscoveryTimeout,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw new Error(err.message);\n }\n }\n\n static async broadcastMessage(\n data: object,\n contentTopic: string,\n ): Promise<void> {\n const dataString = JSON.stringify(data);\n const payload = utf8ToBytes(dataString);\n const message: IMessage = { payload };\n try {\n const encoder = createEncoder({\n contentTopic,\n pubsubTopicShardInfo: this.defaultShard,\n });\n await WakuBroadcasterWakuCore.waku?.lightPush.send(encoder, message);\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n }\n }\n}\n"]}
|
|
@@ -6,12 +6,9 @@ export declare class WakuObservers {
|
|
|
6
6
|
private static currentSubscriptions;
|
|
7
7
|
static setObserversForChain: (waku: Optional<LightNode>, chain: Chain) => Promise<void>;
|
|
8
8
|
static resetCurrentChain: () => void;
|
|
9
|
-
|
|
10
|
-
private static isPinging;
|
|
11
|
-
static pingAllSubscriptions: (waku: Optional<LightNode>) => Promise<void>;
|
|
9
|
+
static checkSubscriptionsHealth: (waku: Optional<LightNode>) => Promise<void>;
|
|
12
10
|
private static removeAllObservers;
|
|
13
11
|
private static getDecodersForChain;
|
|
14
|
-
static subscribedPeers: string[];
|
|
15
12
|
private static addChainObservers;
|
|
16
13
|
static hasStartedPinging: boolean;
|
|
17
14
|
static addTransportSubscription(waku: Optional<LightNode>, topic: string, callback: (message: any) => void): Promise<void>;
|
|
@@ -5,12 +5,11 @@ import { handleBroadcasterFeesMessage } from '../fees/handle-fees-message.js';
|
|
|
5
5
|
import { BroadcasterTransactResponse } from '../transact/broadcaster-transact-response.js';
|
|
6
6
|
import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
|
|
7
7
|
import { isDefined } from '../utils/is-defined.js';
|
|
8
|
-
import {
|
|
9
|
-
import { WakuBroadcasterClient } from '../waku-broadcaster-client.js';
|
|
8
|
+
import { WAKU_RAILGUN_DEFAULT_SHARD, } from '../models/constants.js';
|
|
10
9
|
export class WakuObservers {
|
|
11
10
|
static currentChain;
|
|
12
11
|
static currentContentTopics = [];
|
|
13
|
-
static currentSubscriptions;
|
|
12
|
+
static currentSubscriptions = [];
|
|
14
13
|
static setObserversForChain = async (waku, chain) => {
|
|
15
14
|
if (!waku) {
|
|
16
15
|
return;
|
|
@@ -29,90 +28,34 @@ export class WakuObservers {
|
|
|
29
28
|
static resetCurrentChain = () => {
|
|
30
29
|
WakuObservers.currentChain = undefined;
|
|
31
30
|
};
|
|
32
|
-
static
|
|
33
|
-
BroadcasterDebug.log(
|
|
34
|
-
const result = await subscription
|
|
35
|
-
.subscribe(decoder, callback)
|
|
36
|
-
.then(() => {
|
|
37
|
-
BroadcasterDebug.log('Resubscribed');
|
|
38
|
-
})
|
|
39
|
-
.catch(err => {
|
|
40
|
-
BroadcasterDebug.error(new Error(`Error re-subscribing: ${err.message}`));
|
|
41
|
-
return undefined;
|
|
42
|
-
});
|
|
43
|
-
return;
|
|
44
|
-
};
|
|
45
|
-
static isPinging = false;
|
|
46
|
-
static pingAllSubscriptions = async (waku) => {
|
|
47
|
-
if (WakuObservers.isPinging === true) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
WakuObservers.isPinging = true;
|
|
31
|
+
static checkSubscriptionsHealth = async (waku) => {
|
|
32
|
+
BroadcasterDebug.log(`WAKU Health Status: ${waku?.health.health.overallStatus}`);
|
|
51
33
|
if (isDefined(WakuObservers.currentSubscriptions)) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
throw new Error('No subscriptions to ping');
|
|
56
|
-
}
|
|
57
|
-
for (const { subscription, params, } of WakuObservers.currentSubscriptions) {
|
|
58
|
-
if (!WakuObservers.isPinging) {
|
|
59
|
-
BroadcasterDebug.log('Stop pinging');
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
let pingSuccess = false;
|
|
63
|
-
await subscription
|
|
64
|
-
.ping()
|
|
65
|
-
.then(() => {
|
|
66
|
-
BroadcasterDebug.log('Ping Success');
|
|
67
|
-
pingSuccess = true;
|
|
68
|
-
})
|
|
69
|
-
.catch(async (err) => {
|
|
70
|
-
BroadcasterDebug.error(new Error(`Ping Error: ${err.message}`));
|
|
71
|
-
throw new Error(err.message);
|
|
72
|
-
})
|
|
73
|
-
.finally(() => {
|
|
74
|
-
if (!pingSuccess) {
|
|
75
|
-
BroadcasterDebug.log("pingAllSubscriptions: Ping failed, let's reconnect");
|
|
76
|
-
throw new Error('Ping failed, lets reconnect');
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch (error) {
|
|
82
|
-
await WakuBroadcasterClient.tryReconnect();
|
|
83
|
-
WakuObservers.isPinging = false;
|
|
84
|
-
WakuObservers.subscribedPeers = [];
|
|
85
|
-
await WakuObservers.addSubscriptions(WakuObservers.currentChain, waku).catch(err => {
|
|
86
|
-
BroadcasterDebug.error(new Error(`Error adding subscriptions. ${err.message}`));
|
|
87
|
-
});
|
|
34
|
+
if (WakuObservers.currentSubscriptions.length === 0) {
|
|
35
|
+
BroadcasterDebug.log('No subscriptions to ping');
|
|
36
|
+
throw new Error('No subscriptions to ping');
|
|
88
37
|
}
|
|
89
38
|
}
|
|
90
39
|
await delay(15 * 1000);
|
|
91
|
-
WakuObservers.
|
|
92
|
-
WakuObservers.pingAllSubscriptions(waku);
|
|
40
|
+
WakuObservers.checkSubscriptionsHealth(waku);
|
|
93
41
|
};
|
|
94
42
|
static removeAllObservers = async (waku) => {
|
|
95
43
|
if (!isDefined(waku?.lightPush)) {
|
|
96
44
|
return;
|
|
97
45
|
}
|
|
98
|
-
if (isDefined(
|
|
99
|
-
for (const {
|
|
100
|
-
await
|
|
101
|
-
.unsubscribe(WakuObservers.currentContentTopics)
|
|
102
|
-
.catch((err) => {
|
|
103
|
-
BroadcasterDebug.log(`Unsubscribe Error ${err.message}`);
|
|
104
|
-
});
|
|
46
|
+
if (isDefined(this.currentSubscriptions)) {
|
|
47
|
+
for (const { unsubscribe } of this.currentSubscriptions) {
|
|
48
|
+
await unsubscribe();
|
|
105
49
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
WakuObservers.subscribedPeers = [];
|
|
50
|
+
this.currentSubscriptions = [];
|
|
51
|
+
this.currentContentTopics = [];
|
|
109
52
|
}
|
|
110
53
|
};
|
|
111
54
|
static getDecodersForChain = (chain) => {
|
|
112
55
|
const contentTopicFees = contentTopics.fees(chain);
|
|
113
56
|
const contentTopicTransactResponse = contentTopics.transactResponse(chain);
|
|
114
|
-
const feesDecoder = createDecoder(contentTopicFees,
|
|
115
|
-
const transactResponseDecoder = createDecoder(contentTopicTransactResponse,
|
|
57
|
+
const feesDecoder = createDecoder(contentTopicFees, WAKU_RAILGUN_DEFAULT_SHARD);
|
|
58
|
+
const transactResponseDecoder = createDecoder(contentTopicTransactResponse, WAKU_RAILGUN_DEFAULT_SHARD);
|
|
116
59
|
const feesCallback = (message) => handleBroadcasterFeesMessage(chain, message, contentTopicFees);
|
|
117
60
|
const transactResponseCallback = BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage;
|
|
118
61
|
const feesSubscriptionParams = {
|
|
@@ -127,7 +70,6 @@ export class WakuObservers {
|
|
|
127
70
|
};
|
|
128
71
|
return [feesSubscriptionParams, transactResponseSubscriptionParams];
|
|
129
72
|
};
|
|
130
|
-
static subscribedPeers = [];
|
|
131
73
|
static addChainObservers = async (waku, chain) => {
|
|
132
74
|
if (!isDefined(waku.filter)) {
|
|
133
75
|
return;
|
|
@@ -137,7 +79,7 @@ export class WakuObservers {
|
|
|
137
79
|
});
|
|
138
80
|
if (!WakuObservers.hasStartedPinging) {
|
|
139
81
|
WakuObservers.hasStartedPinging = true;
|
|
140
|
-
WakuObservers.
|
|
82
|
+
WakuObservers.checkSubscriptionsHealth(waku);
|
|
141
83
|
}
|
|
142
84
|
const currentContentTopics = WakuObservers.getCurrentContentTopics();
|
|
143
85
|
BroadcasterDebug.log('Waku content topics:');
|
|
@@ -152,26 +94,17 @@ export class WakuObservers {
|
|
|
152
94
|
return;
|
|
153
95
|
}
|
|
154
96
|
const transportTopic = contentTopics.encrypted(topic);
|
|
155
|
-
const decoder = createDecoder(transportTopic,
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
};
|
|
167
|
-
await filterSubscription.subscribe(decoder, callback);
|
|
168
|
-
WakuObservers.currentSubscriptions?.push({
|
|
169
|
-
subscription: filterSubscription,
|
|
170
|
-
params: [params],
|
|
171
|
-
});
|
|
172
|
-
WakuObservers.subscribedPeers.push(peer.id.toString());
|
|
173
|
-
BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);
|
|
174
|
-
}
|
|
97
|
+
const decoder = createDecoder(transportTopic, WAKU_RAILGUN_DEFAULT_SHARD);
|
|
98
|
+
const params = {
|
|
99
|
+
topic: transportTopic,
|
|
100
|
+
decoder,
|
|
101
|
+
callback,
|
|
102
|
+
};
|
|
103
|
+
const unsubscribe = await waku.filter.subscribeWithUnsubscribe(decoder, callback);
|
|
104
|
+
WakuObservers.currentSubscriptions?.push({
|
|
105
|
+
unsubscribe,
|
|
106
|
+
params,
|
|
107
|
+
});
|
|
175
108
|
WakuObservers.currentContentTopics.push(transportTopic);
|
|
176
109
|
}
|
|
177
110
|
static async addSubscriptions(chain, waku) {
|
|
@@ -180,27 +113,16 @@ export class WakuObservers {
|
|
|
180
113
|
return;
|
|
181
114
|
}
|
|
182
115
|
const subscriptionParams = WakuObservers.getDecodersForChain(chain);
|
|
183
|
-
const topics = subscriptionParams.map(
|
|
116
|
+
const topics = subscriptionParams.map(params => params.topic);
|
|
184
117
|
const newTopics = topics.filter(topic => !WakuObservers.currentContentTopics.includes(topic));
|
|
185
118
|
WakuObservers.currentContentTopics.push(...newTopics);
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const { decoder, callback } = subParam;
|
|
194
|
-
await filterSubscription.subscribe(decoder, callback);
|
|
195
|
-
}
|
|
196
|
-
this.currentSubscriptions ??= [];
|
|
197
|
-
const newParams = {
|
|
198
|
-
subscription: filterSubscription,
|
|
199
|
-
params: subscriptionParams,
|
|
200
|
-
};
|
|
201
|
-
WakuObservers.currentSubscriptions?.push(newParams);
|
|
202
|
-
WakuObservers.subscribedPeers.push(peer.id.toString());
|
|
203
|
-
BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);
|
|
119
|
+
for (const params of subscriptionParams) {
|
|
120
|
+
const { decoder, callback } = params;
|
|
121
|
+
const unsubscribe = await waku.filter.subscribeWithUnsubscribe(decoder, callback);
|
|
122
|
+
WakuObservers.currentSubscriptions?.push({
|
|
123
|
+
unsubscribe,
|
|
124
|
+
params,
|
|
125
|
+
});
|
|
204
126
|
}
|
|
205
127
|
}
|
|
206
128
|
static getCurrentContentTopics() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waku-observers.js","sourceRoot":"","sources":["../../src/waku/waku-observers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, compareChains, delay } from '@railgun-community/shared-models';\nimport { createDecoder } from '@waku/core';\nimport { contentTopics } from './waku-topics.js';\nimport {\n LightNode,\n IMessage,\n IFilterSubscription,\n IDecoder,\n Unsubscribe,\n} from '@waku/interfaces';\nimport { handleBroadcasterFeesMessage } from '../fees/handle-fees-message.js';\nimport { BroadcasterTransactResponse } from '../transact/broadcaster-transact-response.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { WAKU_RAILGUN_PUB_SUB_TOPIC } from '../models/constants.js';\nimport { WakuBroadcasterClient } from '../waku-broadcaster-client.js';\n\ntype SubscriptionParams = {\n topic: string;\n decoder: IDecoder<any> | IDecoder<any>[];\n callback: (message: any) => void;\n};\n\nexport class WakuObservers {\n private static currentChain: Optional<Chain>;\n private static currentContentTopics: string[] = [];\n private static currentSubscriptions:\n | { subscription: IFilterSubscription; params: SubscriptionParams[] }[]\n | undefined;\n\n static setObserversForChain = async (\n waku: Optional<LightNode>,\n chain: Chain,\n ) => {\n if (!waku) {\n return;\n }\n if (\n WakuObservers.currentChain &&\n compareChains(WakuObservers.currentChain, chain)\n ) {\n return;\n }\n BroadcasterDebug.log(\n `Add Waku observers for chain: ${chain.type}:${chain.id}`,\n );\n WakuObservers.currentChain = chain;\n await WakuObservers.removeAllObservers(waku);\n BroadcasterDebug.log('Removed all observers');\n await WakuObservers.addChainObservers(waku, chain);\n BroadcasterDebug.log(\n `Waku listening for events on chain: ${chain.type}:${chain.id}`,\n );\n };\n\n static resetCurrentChain = () => {\n WakuObservers.currentChain = undefined;\n };\n\n private static resubScribeLoop = async (\n subscription: IFilterSubscription,\n decoder: IDecoder<any> | IDecoder<any>[],\n callback: (message: any) => void,\n ): Promise<void> => {\n BroadcasterDebug.log('Resubscribe Loop');\n const result = await subscription\n .subscribe(decoder, callback)\n .then(() => {\n BroadcasterDebug.log('Resubscribed');\n })\n .catch(err => {\n BroadcasterDebug.error(\n new Error(`Error re-subscribing: ${err.message}`),\n );\n return undefined;\n });\n\n return;\n };\n private static isPinging = false;\n static pingAllSubscriptions = async (waku: Optional<LightNode>) => {\n if (WakuObservers.isPinging === true) {\n return;\n }\n WakuObservers.isPinging = true;\n if (isDefined(WakuObservers.currentSubscriptions)) {\n try {\n if (WakuObservers.currentSubscriptions.length === 0) {\n BroadcasterDebug.log('No subscriptions to ping');\n throw new Error('No subscriptions to ping');\n }\n for (const {\n subscription,\n params,\n } of WakuObservers.currentSubscriptions) {\n if (!WakuObservers.isPinging) {\n // removeAllObservers was called. Stop pinging.\n BroadcasterDebug.log('Stop pinging');\n break;\n }\n let pingSuccess = false;\n await subscription\n .ping()\n .then(() => {\n BroadcasterDebug.log('Ping Success');\n pingSuccess = true;\n })\n .catch(async (err: Error) => {\n // No response received for request\n // Failed to get a connection to the peer\n // the connection is being closed\n // peer has no subscriptions\n BroadcasterDebug.error(new Error(`Ping Error: ${err.message}`));\n throw new Error(err.message);\n })\n .finally(() => {\n if (!pingSuccess) {\n BroadcasterDebug.log(\n \"pingAllSubscriptions: Ping failed, let's reconnect\",\n );\n throw new Error('Ping failed, lets reconnect');\n }\n });\n }\n } catch (error) {\n await WakuBroadcasterClient.tryReconnect();\n WakuObservers.isPinging = false;\n WakuObservers.subscribedPeers = [];\n await WakuObservers.addSubscriptions(\n WakuObservers.currentChain,\n waku,\n ).catch(err => {\n BroadcasterDebug.error(\n new Error(`Error adding subscriptions. ${err.message}`),\n );\n });\n }\n }\n await delay(15 * 1000);\n WakuObservers.isPinging = false;\n WakuObservers.pingAllSubscriptions(waku);\n };\n\n private static removeAllObservers = async (waku: Optional<LightNode>) => {\n if (!isDefined(waku?.lightPush)) {\n return;\n }\n if (isDefined(WakuObservers.currentSubscriptions)) {\n for (const { subscription } of WakuObservers.currentSubscriptions) {\n await subscription\n .unsubscribe(WakuObservers.currentContentTopics)\n .catch((err: Error) => {\n BroadcasterDebug.log(`Unsubscribe Error ${err.message}`);\n });\n }\n WakuObservers.currentSubscriptions = [];\n WakuObservers.currentContentTopics = [];\n WakuObservers.subscribedPeers = [];\n }\n };\n\n private static getDecodersForChain = (chain: Chain) => {\n const contentTopicFees = contentTopics.fees(chain);\n const contentTopicTransactResponse = contentTopics.transactResponse(chain);\n const feesDecoder = createDecoder(\n contentTopicFees,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n );\n const transactResponseDecoder = createDecoder(\n contentTopicTransactResponse,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n );\n const feesCallback = (message: IMessage) =>\n handleBroadcasterFeesMessage(chain, message, contentTopicFees);\n const transactResponseCallback =\n BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage;\n\n const feesSubscriptionParams = {\n topic: contentTopicFees,\n decoder: feesDecoder,\n callback: feesCallback,\n };\n const transactResponseSubscriptionParams = {\n topic: contentTopicTransactResponse,\n decoder: transactResponseDecoder,\n callback: transactResponseCallback,\n };\n return [feesSubscriptionParams, transactResponseSubscriptionParams];\n };\n\n static subscribedPeers: string[] = [];\n\n private static addChainObservers = async (waku: LightNode, chain: Chain) => {\n if (!isDefined(waku.filter)) {\n return;\n }\n\n await WakuObservers.addSubscriptions(chain, waku).catch(err => {\n BroadcasterDebug.log(`Error adding Observers. ${err.message}`);\n });\n if (!WakuObservers.hasStartedPinging) {\n WakuObservers.hasStartedPinging = true;\n WakuObservers.pingAllSubscriptions(waku);\n }\n // Log current list of observers\n const currentContentTopics = WakuObservers.getCurrentContentTopics();\n BroadcasterDebug.log('Waku content topics:');\n for (const observer of currentContentTopics) {\n BroadcasterDebug.log(observer);\n }\n };\n static hasStartedPinging: boolean;\n\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n if (!isDefined(waku)) {\n BroadcasterDebug.log(\n 'No waku instance found, Transport Subscription not added.',\n );\n return;\n }\n const transportTopic = contentTopics.encrypted(topic);\n const decoder = createDecoder(transportTopic, WAKU_RAILGUN_PUB_SUB_TOPIC);\n const peers = await waku.filter.allPeers();\n\n for (const peer of peers) {\n if (WakuObservers.subscribedPeers.includes(peer.id.toString())) {\n continue;\n }\n const filterSubscription = await waku.filter.createSubscription(\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n peer.id,\n );\n const params: SubscriptionParams = {\n topic: transportTopic,\n decoder,\n callback,\n };\n await filterSubscription.subscribe(decoder, callback);\n WakuObservers.currentSubscriptions?.push({\n subscription: filterSubscription,\n params: [params],\n });\n WakuObservers.subscribedPeers.push(peer.id.toString());\n BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);\n }\n WakuObservers.currentContentTopics.push(transportTopic);\n }\n\n private static async addSubscriptions(\n chain: Optional<Chain>,\n waku: Optional<LightNode>,\n ) {\n if (!isDefined(chain) || !isDefined(waku)) {\n BroadcasterDebug.log('AddSubscription: No Waku or Chain defined.');\n return;\n }\n const subscriptionParams = WakuObservers.getDecodersForChain(chain);\n const topics = subscriptionParams.map(subParam => subParam.topic);\n const newTopics = topics.filter(\n topic => !WakuObservers.currentContentTopics.includes(topic),\n );\n WakuObservers.currentContentTopics.push(...newTopics);\n const peers = await waku.libp2p.peerStore.all();\n for (const peer of peers) {\n if (WakuObservers.subscribedPeers.includes(peer.id.toString())) {\n continue;\n }\n const filterSubscription = await waku.filter.createSubscription(\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n peer.id,\n );\n for (const subParam of subscriptionParams) {\n const { decoder, callback } = subParam;\n await filterSubscription.subscribe(decoder, callback);\n }\n this.currentSubscriptions ??= [];\n const newParams = {\n subscription: filterSubscription,\n params: subscriptionParams,\n };\n WakuObservers.currentSubscriptions?.push(newParams);\n WakuObservers.subscribedPeers.push(peer.id.toString());\n BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);\n }\n }\n\n static getCurrentContentTopics(): string[] {\n return WakuObservers.currentContentTopics;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"waku-observers.js","sourceRoot":"","sources":["../../src/waku/waku-observers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, compareChains, delay } from '@railgun-community/shared-models';\nimport { createDecoder } from '@waku/core';\nimport { contentTopics } from './waku-topics.js';\nimport {\n LightNode,\n IMessage,\n IDecoder,\n type Unsubscribe,\n} from '@waku/interfaces';\nimport { handleBroadcasterFeesMessage } from '../fees/handle-fees-message.js';\nimport { BroadcasterTransactResponse } from '../transact/broadcaster-transact-response.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport {\n WAKU_RAILGUN_DEFAULT_SHARD,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\n\ntype SubscriptionParams = {\n topic: string;\n decoder: IDecoder<any> | IDecoder<any>[];\n callback: (message: any) => void;\n};\n\ntype ActiveSubscription = {\n unsubscribe: Unsubscribe;\n params: SubscriptionParams;\n};\n\nexport class WakuObservers {\n private static currentChain: Optional<Chain>;\n private static currentContentTopics: string[] = [];\n private static currentSubscriptions: ActiveSubscription[] | undefined = [];\n\n static setObserversForChain = async (\n waku: Optional<LightNode>,\n chain: Chain,\n ) => {\n if (!waku) {\n return;\n }\n if (\n WakuObservers.currentChain &&\n compareChains(WakuObservers.currentChain, chain)\n ) {\n return;\n }\n BroadcasterDebug.log(\n `Add Waku observers for chain: ${chain.type}:${chain.id}`,\n );\n WakuObservers.currentChain = chain;\n await WakuObservers.removeAllObservers(waku);\n BroadcasterDebug.log('Removed all observers');\n await WakuObservers.addChainObservers(waku, chain);\n BroadcasterDebug.log(\n `Waku listening for events on chain: ${chain.type}:${chain.id}`,\n );\n };\n\n static resetCurrentChain = () => {\n WakuObservers.currentChain = undefined;\n };\n\n static checkSubscriptionsHealth = async (waku: Optional<LightNode>) => {\n BroadcasterDebug.log(\n // @ts-ignore\n `WAKU Health Status: ${waku?.health.health.overallStatus}`,\n );\n if (isDefined(WakuObservers.currentSubscriptions)) {\n if (WakuObservers.currentSubscriptions.length === 0) {\n BroadcasterDebug.log('No subscriptions to ping');\n throw new Error('No subscriptions to ping');\n }\n }\n await delay(15 * 1000);\n WakuObservers.checkSubscriptionsHealth(waku);\n };\n\n private static removeAllObservers = async (waku: Optional<LightNode>) => {\n if (!isDefined(waku?.lightPush)) {\n return;\n }\n if (isDefined(this.currentSubscriptions)) {\n for (const { unsubscribe } of this.currentSubscriptions) {\n await unsubscribe();\n }\n this.currentSubscriptions = [];\n this.currentContentTopics = [];\n }\n };\n\n private static getDecodersForChain = (chain: Chain) => {\n const contentTopicFees = contentTopics.fees(chain);\n const contentTopicTransactResponse = contentTopics.transactResponse(chain);\n const feesDecoder = createDecoder(\n contentTopicFees,\n WAKU_RAILGUN_DEFAULT_SHARD,\n );\n const transactResponseDecoder = createDecoder(\n contentTopicTransactResponse,\n WAKU_RAILGUN_DEFAULT_SHARD,\n );\n const feesCallback = (message: IMessage) =>\n handleBroadcasterFeesMessage(chain, message, contentTopicFees);\n const transactResponseCallback =\n BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage;\n\n const feesSubscriptionParams = {\n topic: contentTopicFees,\n decoder: feesDecoder,\n callback: feesCallback,\n };\n const transactResponseSubscriptionParams = {\n topic: contentTopicTransactResponse,\n decoder: transactResponseDecoder,\n callback: transactResponseCallback,\n };\n return [feesSubscriptionParams, transactResponseSubscriptionParams];\n };\n\n private static addChainObservers = async (waku: LightNode, chain: Chain) => {\n if (!isDefined(waku.filter)) {\n return;\n }\n\n await WakuObservers.addSubscriptions(chain, waku).catch(err => {\n BroadcasterDebug.log(`Error adding Observers. ${err.message}`);\n });\n if (!WakuObservers.hasStartedPinging) {\n WakuObservers.hasStartedPinging = true;\n WakuObservers.checkSubscriptionsHealth(waku);\n }\n // Log current list of observers\n const currentContentTopics = WakuObservers.getCurrentContentTopics();\n BroadcasterDebug.log('Waku content topics:');\n for (const observer of currentContentTopics) {\n BroadcasterDebug.log(observer);\n }\n };\n static hasStartedPinging: boolean;\n\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n if (!isDefined(waku)) {\n BroadcasterDebug.log(\n 'No waku instance found, Transport Subscription not added.',\n );\n return;\n }\n const transportTopic = contentTopics.encrypted(topic);\n const decoder = createDecoder(transportTopic, WAKU_RAILGUN_DEFAULT_SHARD);\n const params: SubscriptionParams = {\n topic: transportTopic,\n decoder,\n callback,\n };\n const unsubscribe = await waku.filter.subscribeWithUnsubscribe(\n decoder,\n callback,\n );\n WakuObservers.currentSubscriptions?.push({\n unsubscribe,\n params,\n });\n WakuObservers.currentContentTopics.push(transportTopic);\n }\n\n private static async addSubscriptions(\n chain: Optional<Chain>,\n waku: Optional<LightNode>,\n ) {\n if (!isDefined(chain) || !isDefined(waku)) {\n BroadcasterDebug.log('AddSubscription: No Waku or Chain defined.');\n return;\n }\n const subscriptionParams = WakuObservers.getDecodersForChain(chain);\n const topics = subscriptionParams.map(params => params.topic);\n const newTopics = topics.filter(\n topic => !WakuObservers.currentContentTopics.includes(topic),\n );\n WakuObservers.currentContentTopics.push(...newTopics);\n for (const params of subscriptionParams) {\n const { decoder, callback } = params;\n const unsubscribe = await waku.filter.subscribeWithUnsubscribe(\n decoder,\n callback,\n );\n WakuObservers.currentSubscriptions?.push({\n unsubscribe,\n params,\n });\n }\n }\n\n static getCurrentContentTopics(): string[] {\n return WakuObservers.currentContentTopics;\n }\n}\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Chain } from '@railgun-community/shared-models';
|
|
2
2
|
export declare const contentTopics: {
|
|
3
|
+
default: () => string;
|
|
3
4
|
fees: (chain: Chain) => string;
|
|
4
|
-
encrypted: (topic: string) => string;
|
|
5
5
|
transact: (chain: Chain) => string;
|
|
6
6
|
transactResponse: (chain: Chain) => string;
|
|
7
|
+
metrics: () => string;
|
|
8
|
+
encrypted: (topic: string) => string;
|
|
7
9
|
};
|
package/dist/waku/waku-topics.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export const contentTopics = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
transact: (chain) => `/railgun/v2/${chain.type}
|
|
5
|
-
transactResponse: (chain) => `/railgun/v2/${chain.type}
|
|
2
|
+
default: () => '/railgun/v2/default/json',
|
|
3
|
+
fees: (chain) => `/railgun/v2/${chain.type}-${chain.id}-fees/json`,
|
|
4
|
+
transact: (chain) => `/railgun/v2/${chain.type}-${chain.id}-transact/json`,
|
|
5
|
+
transactResponse: (chain) => `/railgun/v2/${chain.type}-${chain.id}-transact-response/json`,
|
|
6
|
+
metrics: () => `/railgun/v2/metrics/json`,
|
|
7
|
+
encrypted: (topic) => `/railgun/v2/encrypted-${topic}/json`,
|
|
6
8
|
};
|
|
7
9
|
//# sourceMappingURL=waku-topics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waku-topics.js","sourceRoot":"","sources":["../../src/waku/waku-topics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,YAAY;IACzE,
|
|
1
|
+
{"version":3,"file":"waku-topics.js","sourceRoot":"","sources":["../../src/waku/waku-topics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,0BAA0B;IACzC,IAAI,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,YAAY;IACzE,QAAQ,EAAE,CAAC,KAAY,EAAE,EAAE,CACzB,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,gBAAgB;IACvD,gBAAgB,EAAE,CAAC,KAAY,EAAE,EAAE,CACjC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,yBAAyB;IAChE,OAAO,EAAE,GAAG,EAAE,CAAC,0BAA0B;IACzC,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,yBAAyB,KAAK,OAAO;CACpE,CAAC","sourcesContent":["import { Chain } from '@railgun-community/shared-models';\n\nexport const contentTopics = {\n default: () => '/railgun/v2/default/json',\n fees: (chain: Chain) => `/railgun/v2/${chain.type}-${chain.id}-fees/json`,\n transact: (chain: Chain) =>\n `/railgun/v2/${chain.type}-${chain.id}-transact/json`,\n transactResponse: (chain: Chain) =>\n `/railgun/v2/${chain.type}-${chain.id}-transact-response/json`,\n metrics: () => `/railgun/v2/metrics/json`,\n encrypted: (topic: string) => `/railgun/v2/encrypted-${topic}/json`,\n};\n"]}
|
|
@@ -113,6 +113,7 @@ export class WakuBroadcasterClient {
|
|
|
113
113
|
AddressFilter.setBlocklist(blocklist);
|
|
114
114
|
}
|
|
115
115
|
static async tryReconnect() {
|
|
116
|
+
BroadcasterFeeCache.resetCache(WakuBroadcasterClient.chain);
|
|
116
117
|
WakuBroadcasterClient.updateStatus();
|
|
117
118
|
await WakuBroadcasterClient.restart();
|
|
118
119
|
}
|
|
@@ -1 +1 @@
|
|
|
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} 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 { 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/interfaces';\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 = 3000;\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 (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 private static peerRetryCount = 0;\n private static pollConnection = async () => {\n const peerCount = WakuBroadcasterWakuCore.getMeshPeerCount();\n if (peerCount < 1) {\n if (this.peerRetryCount >= 2) {\n this.peerRetryCount = 0;\n await this.restart();\n } else {\n this.peerRetryCount += 1;\n }\n } else {\n this.peerRetryCount = 0;\n }\n await delay(WakuBroadcasterClient.pollDelay);\n this.pollConnection();\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 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 if (!this.isRestarting) {\n this.updateStatus();\n } else {\n this.updateStatus();\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() {\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 sendTransport(data: object, topic: string): void {\n const customTopic = contentTopics.encrypted(topic);\n WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\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} 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 { 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/interfaces';\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 = 3000;\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 (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 private static peerRetryCount = 0;\n private static pollConnection = async () => {\n const peerCount = WakuBroadcasterWakuCore.getMeshPeerCount();\n if (peerCount < 1) {\n if (this.peerRetryCount >= 2) {\n this.peerRetryCount = 0;\n await this.restart();\n } else {\n this.peerRetryCount += 1;\n }\n } else {\n this.peerRetryCount = 0;\n }\n await delay(WakuBroadcasterClient.pollDelay);\n this.pollConnection();\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 if (!this.isRestarting) {\n this.updateStatus();\n } else {\n this.updateStatus();\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() {\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 sendTransport(data: object, topic: string): void {\n const customTopic = contentTopics.encrypted(topic);\n WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@railgun-community/waku-broadcaster-client-web",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -19,16 +19,25 @@
|
|
|
19
19
|
"tsc-test": "tsc -p tsconfig.test.json && tsc-alias -p tsconfig.test.json",
|
|
20
20
|
"compile-test": "npm run clean && npm run tsc-test",
|
|
21
21
|
"test-coverage": "npm run compile-test && c8 mocha",
|
|
22
|
-
"test": "npm run compile-test && NODE_ENV=test mocha 'dist/**/*.test.js'"
|
|
22
|
+
"test": "npm run compile-test && NODE_ENV=test mocha 'dist/**/*.test.js'",
|
|
23
|
+
"postinstall": "patch-package"
|
|
23
24
|
},
|
|
24
25
|
"dependencies": {
|
|
25
|
-
"@libp2p/bootstrap": "^10.
|
|
26
|
-
"@libp2p/
|
|
27
|
-
"@
|
|
28
|
-
"@
|
|
29
|
-
"@
|
|
30
|
-
"@
|
|
31
|
-
"
|
|
26
|
+
"@libp2p/bootstrap": "^10.1.2",
|
|
27
|
+
"@libp2p/identify": "^2.1.2",
|
|
28
|
+
"@libp2p/mplex": "^10.1.2",
|
|
29
|
+
"@libp2p/ping": "^1.1.2",
|
|
30
|
+
"@libp2p/websockets": "^8.1.4",
|
|
31
|
+
"@noble/hashes": "^1.3.3",
|
|
32
|
+
"@waku/core": "0.0.32",
|
|
33
|
+
"@waku/discovery": "0.0.5",
|
|
34
|
+
"@waku/interfaces": "0.0.27",
|
|
35
|
+
"@waku/message-hash": "0.1.16",
|
|
36
|
+
"@waku/proto": "0.0.8",
|
|
37
|
+
"@waku/sdk": "0.0.28",
|
|
38
|
+
"@waku/utils": "0.0.20",
|
|
39
|
+
"libp2p": "^1.8.1",
|
|
40
|
+
"patch-package": "^8.0.0"
|
|
32
41
|
},
|
|
33
42
|
"peerDependencies": {
|
|
34
43
|
"@railgun-community/shared-models": "7.4.4",
|
|
@@ -38,7 +47,6 @@
|
|
|
38
47
|
"devDependencies": {
|
|
39
48
|
"@railgun-community/shared-models": "7.4.4",
|
|
40
49
|
"@railgun-community/wallet": "10.2.5",
|
|
41
|
-
"ethers": "github:Railgun-Community/ethers.js#v6.7.10",
|
|
42
50
|
"@types/chai": "^4.3.5",
|
|
43
51
|
"@types/chai-as-promised": "^7.1.5",
|
|
44
52
|
"@types/leveldown": "^4.0.3",
|
|
@@ -54,6 +62,7 @@
|
|
|
54
62
|
"eslint-config-prettier": "^8.8.0",
|
|
55
63
|
"eslint-plugin-flowtype": "^8.0.3",
|
|
56
64
|
"eslint-plugin-import": "^2.27.5",
|
|
65
|
+
"ethers": "github:Railgun-Community/ethers.js#v6.7.10",
|
|
57
66
|
"leveldown": "^6.1.1",
|
|
58
67
|
"madge": "^6.1.0",
|
|
59
68
|
"mocha": "^10.2.0",
|