@railgun-community/waku-broadcaster-client-node 8.4.0 → 9.0.1

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.
Files changed (43) hide show
  1. package/README.md +138 -14
  2. package/dist/fees/broadcaster-fee-cache.d.ts +3 -0
  3. package/dist/fees/broadcaster-fee-cache.js +12 -0
  4. package/dist/fees/broadcaster-fee-cache.js.map +1 -1
  5. package/dist/fees/handle-authorized-fees-message.d.ts +2 -0
  6. package/dist/fees/handle-authorized-fees-message.js +39 -0
  7. package/dist/fees/handle-authorized-fees-message.js.map +1 -0
  8. package/dist/fees/handle-fees-message.d.ts +1 -1
  9. package/dist/fees/handle-fees-message.js +34 -3
  10. package/dist/fees/handle-fees-message.js.map +1 -1
  11. package/dist/models/broadcaster-config.d.ts +12 -2
  12. package/dist/models/broadcaster-config.js +6 -0
  13. package/dist/models/broadcaster-config.js.map +1 -1
  14. package/dist/models/constants.d.ts +3 -1
  15. package/dist/models/constants.js +7 -11
  16. package/dist/models/constants.js.map +1 -1
  17. package/dist/models/export-models.d.ts +9 -0
  18. package/dist/models/export-models.js.map +1 -1
  19. package/dist/search/best-broadcaster.d.ts +2 -2
  20. package/dist/search/best-broadcaster.js +31 -4
  21. package/dist/search/best-broadcaster.js.map +1 -1
  22. package/dist/status/broadcaster-connection-status.js +2 -1
  23. package/dist/status/broadcaster-connection-status.js.map +1 -1
  24. package/dist/transact/broadcaster-transact-response.d.ts +1 -1
  25. package/dist/transact/broadcaster-transact-response.js.map +1 -1
  26. package/dist/transact/broadcaster-transaction.js +10 -1
  27. package/dist/transact/broadcaster-transaction.js.map +1 -1
  28. package/dist/utils/broadcaster-debug.js.map +1 -1
  29. package/dist/utils/broadcaster-util.js.map +1 -1
  30. package/dist/utils/is-defined.d.ts +1 -1
  31. package/dist/waku/waku-broadcaster-waku-core-base.d.ts +31 -0
  32. package/dist/waku/waku-broadcaster-waku-core-base.js +168 -0
  33. package/dist/waku/waku-broadcaster-waku-core-base.js.map +1 -0
  34. package/dist/waku/waku-broadcaster-waku-core.d.ts +3 -24
  35. package/dist/waku/waku-broadcaster-waku-core.js +33 -141
  36. package/dist/waku/waku-broadcaster-waku-core.js.map +1 -1
  37. package/dist/waku/waku-observers.d.ts +12 -4
  38. package/dist/waku/waku-observers.js +82 -36
  39. package/dist/waku/waku-observers.js.map +1 -1
  40. package/dist/waku-broadcaster-client.d.ts +4 -6
  41. package/dist/waku-broadcaster-client.js +22 -29
  42. package/dist/waku-broadcaster-client.js.map +1 -1
  43. package/package.json +10 -9
@@ -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/interfaces';
8
- import { createEncoder } from '@waku/core';
9
- import { createRelayNode } from '@waku/relay';
10
- import { WAKU_RAILGUN_DEFAULT_PEERS_NODE, WAKU_RAILGUN_DEFAULT_SHARD, WAKU_RAILGUN_DEFAULT_SHARDS, WAKU_RAILGUN_PUB_SUB_TOPIC, } from '../models/constants.js';
11
- export class WakuBroadcasterWakuCore {
12
- static hasError = false;
13
- static restartCallback;
14
- static waku;
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
- WakuBroadcasterWakuCore.hasError = false;
11
+ this.hasError = false;
72
12
  BroadcasterDebug.log(`Creating waku broadcast client`);
73
- const bootstrapPeers = [
74
- ...WAKU_RAILGUN_DEFAULT_PEERS_NODE,
75
- ...this.additionalDirectPeers,
76
- ];
77
- const waku = await createRelayNode({
78
- networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,
79
- bootstrapPeers,
80
- libp2p: {
81
- transports: [tcp()],
82
- },
83
- });
84
- BroadcasterDebug.log('Start Waku.');
85
- await waku.start();
86
- BroadcasterDebug.log('Waiting for remote peer.');
87
- await this.waitForRemotePeer(waku);
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
- BroadcasterDebug.log('Connected to Waku');
96
- WakuBroadcasterWakuCore.waku = waku;
97
- WakuBroadcasterWakuCore.hasError = false;
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 WakuBroadcasterWakuCore.waku?.relay.send(encoder, message);
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
- if (!(err instanceof Error)) {
146
- throw err;
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 RelayNode } from '@waku/interfaces';
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 setObserversForChain: (waku: Optional<RelayNode>, chain: Chain) => Promise<void>;
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<RelayNode>) => Promise<void>;
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<RelayNode>, topic: string, callback: (message: any) => void): Promise<void>;
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/core';
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 removeAllObservers = async (waku) => {
42
- if (!isDefined(waku?.relay)) {
43
- return;
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
- const feesSubscriptionParams = {
66
- topic: contentTopicFees,
67
- decoder: feesDecoder,
68
- callback: feesCallback,
69
- };
70
- const transactResponseSubscriptionParams = {
71
- topic: contentTopicTransactResponse,
72
- decoder: transactResponseDecoder,
73
- callback: transactResponseCallback,
74
- };
75
- return [feesSubscriptionParams, transactResponseSubscriptionParams];
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.relay)) {
104
+ if (!isDefined(waku.filter)) {
79
105
  return;
80
106
  }
81
- const subscriptionResult = await this.addSubscriptions(chain, waku).catch(err => {
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
- const unsubscribe = await waku.relay.subscribeWithUnsubscribe(decoder, callback);
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
- const unsubscribe = await waku.relay.subscribeWithUnsubscribe(decoder, callback);
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 { RelayNode } from '@waku/interfaces';
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<RelayNode>, topic: string, callback: (message: any) => void): Promise<void>;
32
- static sendTransport(data: object, topic: string): void;
33
- static getWakuCore(): Optional<RelayNode>;
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 = 10000;
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 (broadcasterDebugger) {
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
- if (!this.isRestarting) {
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
- WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);
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;