@railgun-community/waku-broadcaster-client-node 8.4.0 → 9.0.2
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 +138 -14
- package/dist/fees/broadcaster-fee-cache.d.ts +5 -0
- package/dist/fees/broadcaster-fee-cache.js +71 -0
- package/dist/fees/broadcaster-fee-cache.js.map +1 -1
- package/dist/fees/handle-authorized-fees-message.d.ts +2 -0
- package/dist/fees/handle-authorized-fees-message.js +34 -0
- package/dist/fees/handle-authorized-fees-message.js.map +1 -0
- package/dist/fees/handle-fees-message.d.ts +1 -1
- package/dist/fees/handle-fees-message.js +42 -3
- package/dist/fees/handle-fees-message.js.map +1 -1
- package/dist/models/broadcaster-config.d.ts +13 -2
- package/dist/models/broadcaster-config.js +7 -0
- package/dist/models/broadcaster-config.js.map +1 -1
- package/dist/models/constants.d.ts +3 -1
- package/dist/models/constants.js +7 -11
- package/dist/models/constants.js.map +1 -1
- package/dist/models/export-models.d.ts +10 -0
- package/dist/models/export-models.js.map +1 -1
- package/dist/search/best-broadcaster.d.ts +2 -2
- package/dist/search/best-broadcaster.js +31 -4
- package/dist/search/best-broadcaster.js.map +1 -1
- package/dist/status/broadcaster-connection-status.js +2 -1
- package/dist/status/broadcaster-connection-status.js.map +1 -1
- package/dist/transact/broadcaster-transact-response.d.ts +1 -1
- package/dist/transact/broadcaster-transact-response.js.map +1 -1
- package/dist/transact/broadcaster-transaction.js +10 -1
- package/dist/transact/broadcaster-transaction.js.map +1 -1
- package/dist/utils/broadcaster-debug.js.map +1 -1
- package/dist/utils/broadcaster-util.js.map +1 -1
- package/dist/utils/is-defined.d.ts +1 -1
- package/dist/waku/waku-broadcaster-waku-core-base.d.ts +31 -0
- package/dist/waku/waku-broadcaster-waku-core-base.js +171 -0
- package/dist/waku/waku-broadcaster-waku-core-base.js.map +1 -0
- package/dist/waku/waku-broadcaster-waku-core.d.ts +3 -24
- package/dist/waku/waku-broadcaster-waku-core.js +33 -141
- package/dist/waku/waku-broadcaster-waku-core.js.map +1 -1
- package/dist/waku/waku-observers.d.ts +12 -4
- package/dist/waku/waku-observers.js +82 -36
- package/dist/waku/waku-observers.js.map +1 -1
- package/dist/waku-broadcaster-client.d.ts +4 -6
- package/dist/waku-broadcaster-client.js +22 -29
- package/dist/waku-broadcaster-client.js.map +1 -1
- package/package.json +10 -9
|
@@ -1,25 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export declare class WakuBroadcasterWakuCore {
|
|
5
|
-
static hasError: boolean;
|
|
6
|
-
static restartCallback: () => void;
|
|
7
|
-
static waku: Optional<RelayNode>;
|
|
8
|
-
private static pubSubTopic;
|
|
9
|
-
private static additionalDirectPeers;
|
|
10
|
-
private static peerDiscoveryTimeout;
|
|
11
|
-
private static defaultShard;
|
|
12
|
-
static restartCount: number;
|
|
13
|
-
static initWaku: (chain: Chain) => Promise<void>;
|
|
14
|
-
static setWakuRestartCallback: (callback: () => void) => void;
|
|
15
|
-
static reinitWaku: (chain: Chain) => Promise<void>;
|
|
16
|
-
static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions): void;
|
|
17
|
-
static disconnect: () => Promise<void>;
|
|
18
|
-
private static connect;
|
|
19
|
-
static getMeshPeerCount(): number;
|
|
20
|
-
static getPubSubPeerCount(): number;
|
|
21
|
-
static getLightPushPeerCount(): Promise<number>;
|
|
22
|
-
static getFilterPeerCount(): Promise<number>;
|
|
23
|
-
private static waitForRemotePeer;
|
|
24
|
-
static broadcastMessage(data: object, contentTopic: string): Promise<void>;
|
|
1
|
+
import { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';
|
|
2
|
+
export declare class WakuBroadcasterWakuCore extends WakuBroadcasterWakuCoreBase {
|
|
3
|
+
protected static connect(): Promise<void>;
|
|
25
4
|
}
|
|
@@ -1,151 +1,43 @@
|
|
|
1
|
-
import { promiseTimeout } from '@railgun-community/shared-models';
|
|
2
|
-
import { WakuObservers } from './waku-observers.js';
|
|
3
|
-
import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
|
|
4
|
-
import { utf8ToBytes } from '../utils/conversion.js';
|
|
5
|
-
import { isDefined } from '../utils/is-defined.js';
|
|
6
1
|
import { tcp } from '@libp2p/tcp';
|
|
7
|
-
import { Protocols } from '@waku/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
static
|
|
15
|
-
static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;
|
|
16
|
-
static additionalDirectPeers = [];
|
|
17
|
-
static peerDiscoveryTimeout = 60000;
|
|
18
|
-
static defaultShard = WAKU_RAILGUN_DEFAULT_SHARD;
|
|
19
|
-
static restartCount = 0;
|
|
20
|
-
static initWaku = async (chain) => {
|
|
21
|
-
try {
|
|
22
|
-
await WakuBroadcasterWakuCore.connect();
|
|
23
|
-
if (!WakuBroadcasterWakuCore.waku) {
|
|
24
|
-
BroadcasterDebug.log('No waku instance found');
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
WakuObservers.resetCurrentChain();
|
|
28
|
-
await WakuObservers.setObserversForChain(WakuBroadcasterWakuCore.waku, chain);
|
|
29
|
-
}
|
|
30
|
-
catch (err) {
|
|
31
|
-
if (!(err instanceof Error)) {
|
|
32
|
-
throw err;
|
|
33
|
-
}
|
|
34
|
-
BroadcasterDebug.error(err);
|
|
35
|
-
throw err;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
static setWakuRestartCallback = (callback) => {
|
|
39
|
-
WakuBroadcasterWakuCore.restartCallback = callback;
|
|
40
|
-
};
|
|
41
|
-
static reinitWaku = async (chain) => {
|
|
42
|
-
if (isDefined(WakuBroadcasterWakuCore.waku) &&
|
|
43
|
-
WakuBroadcasterWakuCore.waku.isStarted()) {
|
|
44
|
-
await WakuBroadcasterWakuCore.disconnect();
|
|
45
|
-
}
|
|
46
|
-
BroadcasterDebug.log(`Reinit Waku, ${++WakuBroadcasterWakuCore.restartCount}`);
|
|
47
|
-
await WakuBroadcasterWakuCore.initWaku(chain);
|
|
48
|
-
if (WakuBroadcasterWakuCore.restartCallback) {
|
|
49
|
-
WakuBroadcasterWakuCore.restartCallback();
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
static setBroadcasterOptions(broadcasterOptions) {
|
|
53
|
-
if (isDefined(broadcasterOptions.pubSubTopic)) {
|
|
54
|
-
WakuBroadcasterWakuCore.pubSubTopic = broadcasterOptions.pubSubTopic;
|
|
55
|
-
}
|
|
56
|
-
if (broadcasterOptions.additionalDirectPeers) {
|
|
57
|
-
WakuBroadcasterWakuCore.additionalDirectPeers =
|
|
58
|
-
broadcasterOptions.additionalDirectPeers;
|
|
59
|
-
}
|
|
60
|
-
if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {
|
|
61
|
-
WakuBroadcasterWakuCore.peerDiscoveryTimeout =
|
|
62
|
-
broadcasterOptions.peerDiscoveryTimeout;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
static disconnect = async () => {
|
|
66
|
-
await WakuBroadcasterWakuCore.waku?.stop();
|
|
67
|
-
WakuBroadcasterWakuCore.waku = undefined;
|
|
68
|
-
};
|
|
69
|
-
static connect = async () => {
|
|
2
|
+
import { createLightNode, Protocols } from '@waku/sdk';
|
|
3
|
+
import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
|
|
4
|
+
import { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';
|
|
5
|
+
import { enrTree, wakuDnsDiscovery } from '@waku/discovery';
|
|
6
|
+
import { BroadcasterConfig } from '../models/broadcaster-config.js';
|
|
7
|
+
import { isDefined } from '@railgun-community/shared-models';
|
|
8
|
+
export class WakuBroadcasterWakuCore extends WakuBroadcasterWakuCoreBase {
|
|
9
|
+
static async connect() {
|
|
70
10
|
try {
|
|
71
|
-
|
|
11
|
+
this.hasError = false;
|
|
72
12
|
BroadcasterDebug.log(`Creating waku broadcast client`);
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (!isDefined(waku.relay)) {
|
|
89
|
-
throw new Error('No Waku relay instantiated.');
|
|
90
|
-
}
|
|
91
|
-
BroadcasterDebug.log('Waku peers:');
|
|
92
|
-
for (const peer of waku.libp2p.getPeers()) {
|
|
93
|
-
BroadcasterDebug.log(JSON.stringify(peer));
|
|
13
|
+
const libp2pOptions = {
|
|
14
|
+
transports: [tcp()],
|
|
15
|
+
hideWebSocketInfo: true,
|
|
16
|
+
};
|
|
17
|
+
if (BroadcasterConfig.useDNSDiscovery) {
|
|
18
|
+
const enrTreePeers = [];
|
|
19
|
+
if (isDefined(BroadcasterConfig.customDNS)) {
|
|
20
|
+
enrTreePeers.push(...BroadcasterConfig.customDNS.enrTreePeers);
|
|
21
|
+
if (!BroadcasterConfig.customDNS.onlyCustom) {
|
|
22
|
+
enrTreePeers.push(...[enrTree["SANDBOX"], enrTree["TEST"]]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
libp2pOptions.peerDiscovery = [
|
|
26
|
+
wakuDnsDiscovery(enrTreePeers),
|
|
27
|
+
];
|
|
94
28
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
catch (err) {
|
|
100
|
-
if (!(err instanceof Error)) {
|
|
101
|
-
throw err;
|
|
102
|
-
}
|
|
103
|
-
WakuBroadcasterWakuCore.hasError = true;
|
|
104
|
-
throw err;
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
static getMeshPeerCount() {
|
|
108
|
-
return this.getPubSubPeerCount();
|
|
109
|
-
}
|
|
110
|
-
static getPubSubPeerCount() {
|
|
111
|
-
const peers = this.waku?.libp2p.getPeers() ?? [];
|
|
112
|
-
return peers.length;
|
|
113
|
-
}
|
|
114
|
-
static async getLightPushPeerCount() {
|
|
115
|
-
return 0;
|
|
116
|
-
}
|
|
117
|
-
static async getFilterPeerCount() {
|
|
118
|
-
return 0;
|
|
119
|
-
}
|
|
120
|
-
static async waitForRemotePeer(waku) {
|
|
121
|
-
try {
|
|
122
|
-
const protocols = [Protocols.Relay];
|
|
123
|
-
await promiseTimeout(waku.waitForPeers(protocols), WakuBroadcasterWakuCore.peerDiscoveryTimeout);
|
|
124
|
-
}
|
|
125
|
-
catch (err) {
|
|
126
|
-
if (!(err instanceof Error)) {
|
|
127
|
-
throw err;
|
|
128
|
-
}
|
|
129
|
-
BroadcasterDebug.error(err);
|
|
130
|
-
throw new Error(err.message);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
static async broadcastMessage(data, contentTopic) {
|
|
134
|
-
const dataString = JSON.stringify(data);
|
|
135
|
-
const payload = utf8ToBytes(dataString);
|
|
136
|
-
const message = { payload };
|
|
137
|
-
try {
|
|
138
|
-
const encoder = createEncoder({
|
|
139
|
-
contentTopic,
|
|
140
|
-
pubsubTopicShardInfo: this.defaultShard,
|
|
29
|
+
this.waku = await createLightNode({
|
|
30
|
+
defaultBootstrap: true,
|
|
31
|
+
libp2p: libp2pOptions
|
|
141
32
|
});
|
|
142
|
-
await
|
|
33
|
+
await this.waku.start();
|
|
34
|
+
BroadcasterDebug.log('Waiting for remote peer.');
|
|
35
|
+
await this.waku.waitForPeers([Protocols.Filter, Protocols.LightPush, Protocols.Store], this.peerDiscoveryTimeout);
|
|
36
|
+
BroadcasterDebug.log('Waku initialized and connected to peers');
|
|
143
37
|
}
|
|
144
38
|
catch (err) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
BroadcasterDebug.error(err);
|
|
39
|
+
BroadcasterDebug.log(`Error initializing Waku: ${err.message}`);
|
|
40
|
+
this.hasError = true;
|
|
149
41
|
}
|
|
150
42
|
}
|
|
151
43
|
}
|
|
@@ -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 { 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 { tcp } from '@libp2p/tcp';\nimport { Protocols, type IMessage, type RelayNode } from '@waku/interfaces';\nimport { createEncoder } from '@waku/core';\nimport { createRelayNode } from '@waku/relay';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_PEERS_NODE,\n WAKU_RAILGUN_DEFAULT_SHARD,\n WAKU_RAILGUN_DEFAULT_SHARDS,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\n\nexport class WakuBroadcasterWakuCore {\n static hasError = false;\n static restartCallback: () => void;\n\n static waku: Optional<RelayNode>;\n\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 public static restartCount = 0;\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 setWakuRestartCallback = (callback: () => void) => {\n WakuBroadcasterWakuCore.restartCallback = callback;\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 BroadcasterDebug.log(\n `Reinit Waku, ${++WakuBroadcasterWakuCore.restartCount}`,\n );\n await WakuBroadcasterWakuCore.initWaku(chain);\n if (WakuBroadcasterWakuCore.restartCallback) {\n WakuBroadcasterWakuCore.restartCallback();\n }\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_NODE,\n ...this.additionalDirectPeers,\n ];\n const waku: RelayNode = await createRelayNode({\n networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,\n bootstrapPeers,\n libp2p: {\n transports: [tcp()],\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.relay)) {\n throw new Error('No Waku relay 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 this.getPubSubPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n const peers = this.waku?.libp2p.getPeers() ?? [];\n return peers.length;\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return 0;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return 0;\n }\n\n private static async waitForRemotePeer(waku: RelayNode): Promise<void> {\n try {\n const protocols = [Protocols.Relay];\n await promiseTimeout(\n waku.waitForPeers(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?.relay.send(encoder, message);\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":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,SAAS,EAA4B,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,MAAM,OAAO,uBAAwB,SAAQ,2BAA2B;IAC5D,MAAM,CAAC,KAAK,CAAC,OAAO;QAC5B,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YAEtB,gBAAgB,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YACvD,MAAM,aAAa,GAAwB;gBACzC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC;gBACnB,iBAAiB,EAAE,IAAI;aACxB,CAAA;YACD,IAAI,iBAAiB,CAAC,eAAe,EAAE,CAAC;gBACtC,MAAM,YAAY,GAAG,EAAE,CAAA;gBACvB,IAAI,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3C,YAAY,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;oBAC9D,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;wBAC5C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;oBAC7D,CAAC;gBACH,CAAC;gBACD,aAAa,CAAC,aAAa,GAAG;oBAC5B,gBAAgB,CAAC,YAAY,CAAC;iBAC/B,CAAA;YACH,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,MAAM,eAAe,CAAC;gBAChC,gBAAgB,EAAE,IAAI;gBACtB,MAAM,EAAE,aAAa;aACtB,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAExB,gBAAgB,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAEjH,gBAAgB,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,gBAAgB,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;CACF","sourcesContent":["import { tcp } from '@libp2p/tcp';\nimport { createLightNode, Protocols, type CreateLibp2pOptions } from '@waku/sdk';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';\nimport { enrTree, wakuDnsDiscovery } from '@waku/discovery';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\nimport { isDefined } from '@railgun-community/shared-models';\n\nexport class WakuBroadcasterWakuCore extends WakuBroadcasterWakuCoreBase {\n protected static async connect(): Promise<void> {\n try {\n this.hasError = false;\n\n BroadcasterDebug.log(`Creating waku broadcast client`);\n const libp2pOptions: CreateLibp2pOptions = {\n transports: [tcp()],\n hideWebSocketInfo: true,\n }\n if (BroadcasterConfig.useDNSDiscovery) {\n const enrTreePeers = []\n if (isDefined(BroadcasterConfig.customDNS)) {\n enrTreePeers.push(...BroadcasterConfig.customDNS.enrTreePeers)\n if (!BroadcasterConfig.customDNS.onlyCustom) {\n enrTreePeers.push(...[enrTree[\"SANDBOX\"], enrTree[\"TEST\"]])\n }\n }\n libp2pOptions.peerDiscovery = [\n wakuDnsDiscovery(enrTreePeers),\n ]\n }\n this.waku = await createLightNode({\n defaultBootstrap: true,\n libp2p: libp2pOptions\n });\n\n await this.waku.start();\n\n BroadcasterDebug.log('Waiting for remote peer.');\n await this.waku.waitForPeers([Protocols.Filter, Protocols.LightPush, Protocols.Store], this.peerDiscoveryTimeout)\n\n BroadcasterDebug.log('Waku initialized and connected to peers');\n } catch (err: any) {\n BroadcasterDebug.log(`Error initializing Waku: ${err.message}`);\n this.hasError = true;\n }\n }\n}\n"]}
|
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { Chain } from '@railgun-community/shared-models';
|
|
2
|
-
import { type
|
|
2
|
+
import { type LightNode, type IDecodedMessage } from '@waku/sdk';
|
|
3
3
|
export declare class WakuObservers {
|
|
4
4
|
private static currentChain;
|
|
5
5
|
private static currentContentTopics;
|
|
6
6
|
private static currentSubscriptions;
|
|
7
|
-
static
|
|
7
|
+
private static messageCache;
|
|
8
|
+
private static observedMessages;
|
|
9
|
+
private static MAX_CACHE_SIZE;
|
|
10
|
+
private static getMessageId;
|
|
11
|
+
private static wrapCallbackWithCache;
|
|
12
|
+
static setObserversForChain: (waku: Optional<LightNode>, chain: Chain) => Promise<void>;
|
|
8
13
|
static resetCurrentChain: () => void;
|
|
9
|
-
static checkSubscriptionsHealth: (waku: Optional<
|
|
14
|
+
static checkSubscriptionsHealth: (waku: Optional<LightNode>) => Promise<void>;
|
|
15
|
+
static unsubscribe(waku: Optional<LightNode>): Promise<void>;
|
|
10
16
|
private static removeAllObservers;
|
|
11
17
|
private static getDecodersForChain;
|
|
12
18
|
private static addChainObservers;
|
|
13
|
-
static addTransportSubscription(waku: Optional<
|
|
19
|
+
static addTransportSubscription(waku: Optional<LightNode>, topic: string, callback: (message: any) => void): Promise<void>;
|
|
14
20
|
private static addSubscriptions;
|
|
15
21
|
static getCurrentContentTopics(): string[];
|
|
22
|
+
static getLastMessage(topic: string): IDecodedMessage | undefined;
|
|
23
|
+
static getCallbackForTopic(topic: string): Optional<(message: any) => void>;
|
|
16
24
|
}
|
|
@@ -1,15 +1,47 @@
|
|
|
1
1
|
import { compareChains, delay } from '@railgun-community/shared-models';
|
|
2
|
-
import { createDecoder } from '@waku/
|
|
2
|
+
import { createDecoder, } from '@waku/sdk';
|
|
3
3
|
import { contentTopics } from './waku-topics.js';
|
|
4
4
|
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
8
|
import { WAKU_RAILGUN_DEFAULT_SHARD } from '../models/constants.js';
|
|
9
|
+
import { bytesToHex } from '../utils/conversion.js';
|
|
9
10
|
export class WakuObservers {
|
|
10
11
|
static currentChain;
|
|
11
12
|
static currentContentTopics = [];
|
|
12
13
|
static currentSubscriptions = [];
|
|
14
|
+
static messageCache = new Set();
|
|
15
|
+
static observedMessages = [];
|
|
16
|
+
static MAX_CACHE_SIZE = 5000;
|
|
17
|
+
static getMessageId(message) {
|
|
18
|
+
const timestamp = message.timestamp ? message.timestamp.getTime() : 0;
|
|
19
|
+
const payload = message.payload ? bytesToHex(message.payload) : '';
|
|
20
|
+
return `${timestamp}-${payload}`;
|
|
21
|
+
}
|
|
22
|
+
static wrapCallbackWithCache(callback) {
|
|
23
|
+
return (message) => {
|
|
24
|
+
if (!message.payload) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const messageId = this.getMessageId(message);
|
|
28
|
+
if (this.messageCache.has(messageId)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.messageCache.add(messageId);
|
|
32
|
+
if (this.messageCache.size > this.MAX_CACHE_SIZE) {
|
|
33
|
+
const first = this.messageCache.values().next().value;
|
|
34
|
+
if (first) {
|
|
35
|
+
this.messageCache.delete(first);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
this.observedMessages.push(message);
|
|
39
|
+
if (this.observedMessages.length > this.MAX_CACHE_SIZE) {
|
|
40
|
+
this.observedMessages.shift();
|
|
41
|
+
}
|
|
42
|
+
callback(message);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
13
45
|
static setObserversForChain = async (waku, chain) => {
|
|
14
46
|
if (!waku) {
|
|
15
47
|
return;
|
|
@@ -38,47 +70,41 @@ export class WakuObservers {
|
|
|
38
70
|
await delay(15 * 1000);
|
|
39
71
|
this.checkSubscriptionsHealth(waku);
|
|
40
72
|
};
|
|
41
|
-
static
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
if (isDefined(this.currentSubscriptions)) {
|
|
46
|
-
for (const { unsubscribe, params } of this.currentSubscriptions) {
|
|
47
|
-
if (unsubscribe instanceof Function) {
|
|
48
|
-
await unsubscribe();
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
await unsubscribe.subscription?.unsubscribe([params.topic]);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
this.currentSubscriptions = [];
|
|
55
|
-
this.currentContentTopics = [];
|
|
73
|
+
static async unsubscribe(waku) {
|
|
74
|
+
if (isDefined(waku) && isDefined(waku?.filter) && isDefined(this.currentSubscriptions)) {
|
|
75
|
+
waku.filter.unsubscribeAll();
|
|
56
76
|
}
|
|
77
|
+
this.currentSubscriptions = [];
|
|
78
|
+
this.currentContentTopics = [];
|
|
79
|
+
}
|
|
80
|
+
static removeAllObservers = async (waku) => {
|
|
81
|
+
await this.unsubscribe(waku);
|
|
57
82
|
};
|
|
58
83
|
static getDecodersForChain = (chain) => {
|
|
59
84
|
const contentTopicFees = contentTopics.fees(chain);
|
|
60
85
|
const contentTopicTransactResponse = contentTopics.transactResponse(chain);
|
|
61
86
|
const feesDecoder = createDecoder(contentTopicFees, WAKU_RAILGUN_DEFAULT_SHARD);
|
|
62
87
|
const transactResponseDecoder = createDecoder(contentTopicTransactResponse, WAKU_RAILGUN_DEFAULT_SHARD);
|
|
63
|
-
const feesCallback = (message) => handleBroadcasterFeesMessage(chain, message, contentTopicFees);
|
|
64
|
-
const transactResponseCallback = BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
const feesCallback = this.wrapCallbackWithCache((message) => handleBroadcasterFeesMessage(chain, message, contentTopicFees));
|
|
89
|
+
const transactResponseCallback = this.wrapCallbackWithCache((message) => BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage(message));
|
|
90
|
+
return [
|
|
91
|
+
{
|
|
92
|
+
topic: contentTopicFees,
|
|
93
|
+
decoder: feesDecoder,
|
|
94
|
+
callback: feesCallback,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
topic: contentTopicTransactResponse,
|
|
98
|
+
decoder: transactResponseDecoder,
|
|
99
|
+
callback: transactResponseCallback,
|
|
100
|
+
},
|
|
101
|
+
];
|
|
76
102
|
};
|
|
77
103
|
static addChainObservers = async (waku, chain) => {
|
|
78
|
-
if (!isDefined(waku.
|
|
104
|
+
if (!isDefined(waku.filter)) {
|
|
79
105
|
return;
|
|
80
106
|
}
|
|
81
|
-
|
|
107
|
+
await this.addSubscriptions(chain, waku).catch(err => {
|
|
82
108
|
BroadcasterDebug.log(`Error adding Observers. ${err.message}`);
|
|
83
109
|
return undefined;
|
|
84
110
|
});
|
|
@@ -95,14 +121,14 @@ export class WakuObservers {
|
|
|
95
121
|
}
|
|
96
122
|
const transportTopic = contentTopics.encrypted(topic);
|
|
97
123
|
const decoder = createDecoder(transportTopic, WAKU_RAILGUN_DEFAULT_SHARD);
|
|
124
|
+
const wrappedCallback = this.wrapCallbackWithCache(callback);
|
|
98
125
|
const params = {
|
|
99
126
|
topic: transportTopic,
|
|
100
127
|
decoder,
|
|
101
|
-
callback,
|
|
128
|
+
callback: wrappedCallback,
|
|
102
129
|
};
|
|
103
|
-
|
|
130
|
+
await waku.filter.subscribe(decoder, wrappedCallback);
|
|
104
131
|
this.currentSubscriptions?.push({
|
|
105
|
-
unsubscribe,
|
|
106
132
|
params,
|
|
107
133
|
});
|
|
108
134
|
WakuObservers.currentContentTopics.push(transportTopic);
|
|
@@ -118,9 +144,8 @@ export class WakuObservers {
|
|
|
118
144
|
this.currentContentTopics.push(...newTopics);
|
|
119
145
|
for (const params of subscriptionParams) {
|
|
120
146
|
const { decoder, callback } = params;
|
|
121
|
-
|
|
147
|
+
await waku.filter.subscribe(decoder, callback);
|
|
122
148
|
this.currentSubscriptions?.push({
|
|
123
|
-
unsubscribe,
|
|
124
149
|
params,
|
|
125
150
|
});
|
|
126
151
|
}
|
|
@@ -128,5 +153,26 @@ export class WakuObservers {
|
|
|
128
153
|
static getCurrentContentTopics() {
|
|
129
154
|
return WakuObservers.currentContentTopics;
|
|
130
155
|
}
|
|
156
|
+
static getLastMessage(topic) {
|
|
157
|
+
let latestMessage;
|
|
158
|
+
for (const msg of this.observedMessages) {
|
|
159
|
+
if (msg.contentTopic === topic) {
|
|
160
|
+
if (!latestMessage) {
|
|
161
|
+
latestMessage = msg;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const msgTime = msg.timestamp ? msg.timestamp.getTime() : 0;
|
|
165
|
+
const latestTime = latestMessage.timestamp ? latestMessage.timestamp.getTime() : 0;
|
|
166
|
+
if (msgTime > latestTime) {
|
|
167
|
+
latestMessage = msg;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return latestMessage;
|
|
172
|
+
}
|
|
173
|
+
static getCallbackForTopic(topic) {
|
|
174
|
+
const subscription = this.currentSubscriptions?.find(sub => sub.params.topic === topic);
|
|
175
|
+
return subscription?.params.callback;
|
|
176
|
+
}
|
|
131
177
|
}
|
|
132
178
|
//# sourceMappingURL=waku-observers.js.map
|
|
@@ -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 {\n IMessage,\n IDecoder,\n type RelayNode,\n type Unsubscribe,\n type SubscribeResult,\n} from '@waku/interfaces';\nimport { contentTopics } from './waku-topics.js';\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_DEFAULT_SHARD } 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: SubscribeResult | 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<RelayNode>,\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 this.removeAllObservers(waku);\n\n BroadcasterDebug.log('Removed all observers');\n await this.addChainObservers(waku, chain);\n BroadcasterDebug.log(\n `Waku listening for events on chain: ${chain.type}:${chain.id}`,\n );\n };\n\n static resetCurrentChain = () => {\n this.currentChain = undefined;\n };\n\n static checkSubscriptionsHealth = async (waku: Optional<RelayNode>) => {\n BroadcasterDebug.log(\n // @ts-ignore\n `WAKU Health Status: ${waku?.health.getHealthStatus()}`,\n );\n if (isDefined(this.currentSubscriptions)) {\n if (this.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 this.checkSubscriptionsHealth(waku);\n };\n\n private static removeAllObservers = async (waku: Optional<RelayNode>) => {\n if (!isDefined(waku?.relay)) {\n return;\n }\n if (isDefined(this.currentSubscriptions)) {\n for (const { unsubscribe, params } of this.currentSubscriptions) {\n if (unsubscribe instanceof Function) {\n await unsubscribe();\n } else {\n await unsubscribe.subscription?.unsubscribe([params.topic]);\n }\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: RelayNode, chain: Chain) => {\n if (!isDefined(waku.relay)) {\n return;\n }\n\n const subscriptionResult = await this.addSubscriptions(chain, waku).catch(\n err => {\n BroadcasterDebug.log(`Error adding Observers. ${err.message}`);\n return undefined;\n },\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\n static async addTransportSubscription(\n waku: Optional<RelayNode>,\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.relay.subscribeWithUnsubscribe(\n decoder,\n callback,\n );\n this.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<RelayNode>,\n ) {\n if (!isDefined(chain) || !isDefined(waku)) {\n BroadcasterDebug.log('AddSubscription: No Waku or Chain defined.');\n return;\n }\n const subscriptionParams = this.getDecodersForChain(chain);\n const topics = subscriptionParams.map(params => params.topic);\n const newTopics = topics.filter(\n topic => !this.currentContentTopics.includes(topic),\n );\n this.currentContentTopics.push(...newTopics);\n for (const params of subscriptionParams) {\n const { decoder, callback } = params;\n const unsubscribe = await waku.relay.subscribeWithUnsubscribe(\n decoder,\n callback,\n );\n this.currentSubscriptions?.push({\n unsubscribe,\n params,\n });\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 {\n createDecoder,\n type IMessage,\n type IDecoder,\n type LightNode,\n type IDecodedMessage,\n} from '@waku/sdk';\nimport { contentTopics } from './waku-topics.js';\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_DEFAULT_SHARD } from '../models/constants.js';\nimport { bytesToHex } from '../utils/conversion.js';\n\ntype SubscriptionParams = {\n topic: string;\n decoder: IDecoder<any> | IDecoder<any>[];\n callback: (message: any) => void;\n};\n\ntype ActiveSubscription = {\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 private static messageCache: Set<string> = new Set();\n private static observedMessages: IDecodedMessage[] = [];\n private static MAX_CACHE_SIZE = 5000;\n\n private static getMessageId(message: IMessage): string {\n const timestamp = message.timestamp ? message.timestamp.getTime() : 0;\n const payload = message.payload ? bytesToHex(message.payload) : '';\n return `${timestamp}-${payload}`;\n }\n\n private static wrapCallbackWithCache(\n callback: (message: IMessage) => void,\n ): (message: IMessage) => void {\n return (message: IMessage) => {\n if (!message.payload) {\n return;\n }\n const messageId = this.getMessageId(message);\n if (this.messageCache.has(messageId)) {\n return;\n }\n this.messageCache.add(messageId);\n if (this.messageCache.size > this.MAX_CACHE_SIZE) {\n const first = this.messageCache.values().next().value;\n if (first) {\n this.messageCache.delete(first);\n }\n }\n this.observedMessages.push(message as IDecodedMessage);\n if (this.observedMessages.length > this.MAX_CACHE_SIZE) {\n this.observedMessages.shift();\n }\n callback(message);\n };\n }\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 this.removeAllObservers(waku);\n\n BroadcasterDebug.log('Removed all observers');\n await this.addChainObservers(waku, chain);\n BroadcasterDebug.log(\n `Waku listening for events on chain: ${chain.type}:${chain.id}`,\n );\n };\n\n static resetCurrentChain = () => {\n this.currentChain = undefined;\n };\n\n static checkSubscriptionsHealth = async (waku: Optional<LightNode>) => {\n BroadcasterDebug.log(\n // @ts-ignore\n `WAKU Health Status: ${waku?.health.getHealthStatus()}`,\n );\n if (isDefined(this.currentSubscriptions)) {\n if (this.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 this.checkSubscriptionsHealth(waku);\n };\n\n static async unsubscribe(waku: Optional<LightNode>) {\n if (isDefined(waku) && isDefined(waku?.filter) && isDefined(this.currentSubscriptions)) {\n waku.filter.unsubscribeAll()\n }\n this.currentSubscriptions = [];\n this.currentContentTopics = [];\n }\n\n private static removeAllObservers = async (waku: Optional<LightNode>) => {\n await this.unsubscribe(waku);\n };\n\n private static getDecodersForChain = (chain: Chain) => {\n const contentTopicFees = contentTopics.fees(chain);\n const contentTopicTransactResponse = contentTopics.transactResponse(chain);\n\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\n const feesCallback = this.wrapCallbackWithCache((message: IMessage) =>\n handleBroadcasterFeesMessage(chain, message, contentTopicFees));\n const transactResponseCallback = this.wrapCallbackWithCache((message: IMessage) =>\n BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage(\n message,\n ));\n\n return [\n {\n topic: contentTopicFees,\n decoder: feesDecoder,\n callback: feesCallback,\n },\n {\n topic: contentTopicTransactResponse,\n decoder: transactResponseDecoder,\n callback: transactResponseCallback,\n },\n ];\n };\n\n private static addChainObservers = async (waku: LightNode, chain: Chain) => {\n if (!isDefined(waku.filter)) {\n return;\n }\n\n await this.addSubscriptions(chain, waku).catch(\n err => {\n BroadcasterDebug.log(`Error adding Observers. ${err.message}`);\n return undefined;\n },\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\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 wrappedCallback = this.wrapCallbackWithCache(callback);\n const params: SubscriptionParams = {\n topic: transportTopic,\n decoder,\n callback: wrappedCallback,\n };\n await waku.filter.subscribe(\n decoder,\n wrappedCallback,\n );\n this.currentSubscriptions?.push({\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 = this.getDecodersForChain(chain);\n const topics = subscriptionParams.map(params => params.topic);\n const newTopics = topics.filter(\n topic => !this.currentContentTopics.includes(topic),\n );\n this.currentContentTopics.push(...newTopics);\n for (const params of subscriptionParams) {\n const { decoder, callback } = params;\n await waku.filter.subscribe(\n decoder,\n callback,\n );\n this.currentSubscriptions?.push({\n params,\n });\n }\n }\n\n static getCurrentContentTopics(): string[] {\n return WakuObservers.currentContentTopics;\n }\n\n static getLastMessage(topic: string): IDecodedMessage | undefined {\n let latestMessage: IDecodedMessage | undefined;\n for (const msg of this.observedMessages) {\n if (msg.contentTopic === topic) {\n if (!latestMessage) {\n latestMessage = msg;\n continue;\n }\n const msgTime = msg.timestamp ? msg.timestamp.getTime() : 0;\n const latestTime = latestMessage.timestamp ? latestMessage.timestamp.getTime() : 0;\n if (msgTime > latestTime) {\n latestMessage = msg;\n }\n }\n }\n return latestMessage;\n }\n\n static getCallbackForTopic(topic: string): Optional<(message: any) => void> {\n const subscription = this.currentSubscriptions?.find(sub => sub.params.topic === topic);\n return subscription?.params.callback;\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Chain, SelectedBroadcaster } from '@railgun-community/shared-models';
|
|
2
2
|
import { BroadcasterConnectionStatusCallback, BroadcasterDebugger, BroadcasterOptions } from './models/export-models.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { LightNode } from '@waku/sdk';
|
|
4
4
|
export declare class WakuBroadcasterClient {
|
|
5
5
|
private static chain;
|
|
6
6
|
private static statusCallback;
|
|
@@ -8,8 +8,6 @@ export declare class WakuBroadcasterClient {
|
|
|
8
8
|
private static isRestarting;
|
|
9
9
|
static pollDelay: number;
|
|
10
10
|
static start(chain: Chain, broadcasterOptions: BroadcasterOptions, statusCallback: BroadcasterConnectionStatusCallback, broadcasterDebugger?: BroadcasterDebugger): Promise<void>;
|
|
11
|
-
private static peerRetryCount;
|
|
12
|
-
private static pollConnection;
|
|
13
11
|
static stop(): Promise<void>;
|
|
14
12
|
static isStarted(): boolean;
|
|
15
13
|
static setChain(chain: Chain): Promise<void>;
|
|
@@ -28,8 +26,8 @@ export declare class WakuBroadcasterClient {
|
|
|
28
26
|
private static restart;
|
|
29
27
|
private static pollStatus;
|
|
30
28
|
private static updateStatus;
|
|
31
|
-
static addTransportSubscription(waku: Optional<
|
|
32
|
-
static sendTransport(data: object, topic: string): void
|
|
33
|
-
static getWakuCore(): Optional<
|
|
29
|
+
static addTransportSubscription(waku: Optional<LightNode>, topic: string, callback: (message: any) => void): Promise<void>;
|
|
30
|
+
static sendTransport(data: object, topic: string): Promise<void>;
|
|
31
|
+
static getWakuCore(): Optional<LightNode>;
|
|
34
32
|
static setRestartCallback(callback: () => void): void;
|
|
35
33
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { delay, POI_REQUIRED_LISTS, BroadcasterConnectionStatus, } from '@railgun-community/shared-models';
|
|
1
|
+
import { delay, POI_REQUIRED_LISTS, BroadcasterConnectionStatus, isDefined, } from '@railgun-community/shared-models';
|
|
2
2
|
import { BroadcasterFeeCache } from './fees/broadcaster-fee-cache.js';
|
|
3
3
|
import { AddressFilter } from './filters/address-filter.js';
|
|
4
|
+
import { BroadcasterConfig } from './models/broadcaster-config.js';
|
|
4
5
|
import { BroadcasterSearch } from './search/best-broadcaster.js';
|
|
5
6
|
import { BroadcasterStatus } from './status/broadcaster-connection-status.js';
|
|
6
7
|
import { BroadcasterDebug } from './utils/broadcaster-debug.js';
|
|
@@ -12,12 +13,22 @@ export class WakuBroadcasterClient {
|
|
|
12
13
|
static statusCallback;
|
|
13
14
|
static started = false;
|
|
14
15
|
static isRestarting = false;
|
|
15
|
-
static pollDelay =
|
|
16
|
+
static pollDelay = 3_000;
|
|
16
17
|
static async start(chain, broadcasterOptions, statusCallback, broadcasterDebugger) {
|
|
17
18
|
this.chain = chain;
|
|
18
19
|
this.statusCallback = statusCallback;
|
|
19
20
|
WakuBroadcasterWakuCore.setBroadcasterOptions(broadcasterOptions);
|
|
20
|
-
if (
|
|
21
|
+
if (isDefined(broadcasterOptions.broadcasterVersionRange)) {
|
|
22
|
+
BroadcasterConfig.MINIMUM_BROADCASTER_VERSION =
|
|
23
|
+
broadcasterOptions.broadcasterVersionRange.minVersion;
|
|
24
|
+
BroadcasterConfig.MAXIMUM_BROADCASTER_VERSION =
|
|
25
|
+
broadcasterOptions.broadcasterVersionRange.maxVersion;
|
|
26
|
+
}
|
|
27
|
+
if (isDefined(broadcasterOptions.useDNSDiscovery)) {
|
|
28
|
+
BroadcasterConfig.useDNSDiscovery = broadcasterOptions.useDNSDiscovery;
|
|
29
|
+
BroadcasterConfig.customDNS = broadcasterOptions.useCustomDNS;
|
|
30
|
+
}
|
|
31
|
+
if (isDefined(broadcasterDebugger)) {
|
|
21
32
|
BroadcasterDebug.setDebugger(broadcasterDebugger);
|
|
22
33
|
}
|
|
23
34
|
BroadcasterFeeCache.init(broadcasterOptions.poiActiveListKeys ??
|
|
@@ -35,24 +46,6 @@ export class WakuBroadcasterClient {
|
|
|
35
46
|
throw new Error('Cannot connect to Broadcaster network.', { cause });
|
|
36
47
|
}
|
|
37
48
|
}
|
|
38
|
-
static peerRetryCount = 0;
|
|
39
|
-
static pollConnection = async () => {
|
|
40
|
-
const peerCount = WakuBroadcasterWakuCore.getMeshPeerCount();
|
|
41
|
-
if (peerCount < 1) {
|
|
42
|
-
if (this.peerRetryCount >= 2) {
|
|
43
|
-
this.peerRetryCount = 0;
|
|
44
|
-
await this.restart();
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
this.peerRetryCount += 1;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
this.peerRetryCount = 0;
|
|
52
|
-
}
|
|
53
|
-
await delay(WakuBroadcasterClient.pollDelay);
|
|
54
|
-
this.pollConnection();
|
|
55
|
-
};
|
|
56
49
|
static async stop() {
|
|
57
50
|
await WakuBroadcasterWakuCore.disconnect();
|
|
58
51
|
this.started = false;
|
|
@@ -139,12 +132,7 @@ export class WakuBroadcasterClient {
|
|
|
139
132
|
}
|
|
140
133
|
}
|
|
141
134
|
static async pollStatus() {
|
|
142
|
-
|
|
143
|
-
this.updateStatus();
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
this.updateStatus();
|
|
147
|
-
}
|
|
135
|
+
this.updateStatus();
|
|
148
136
|
await delay(WakuBroadcasterClient.pollDelay);
|
|
149
137
|
this.pollStatus();
|
|
150
138
|
}
|
|
@@ -159,9 +147,14 @@ export class WakuBroadcasterClient {
|
|
|
159
147
|
static async addTransportSubscription(waku, topic, callback) {
|
|
160
148
|
await WakuObservers.addTransportSubscription(WakuBroadcasterWakuCore.waku, topic, callback);
|
|
161
149
|
}
|
|
162
|
-
static sendTransport(data, topic) {
|
|
150
|
+
static async sendTransport(data, topic) {
|
|
163
151
|
const customTopic = contentTopics.encrypted(topic);
|
|
164
|
-
|
|
152
|
+
try {
|
|
153
|
+
await WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
BroadcasterDebug.log(`SendTransport error: ${e.message}`);
|
|
157
|
+
}
|
|
165
158
|
}
|
|
166
159
|
static getWakuCore() {
|
|
167
160
|
return WakuBroadcasterWakuCore.waku;
|