@railgun-community/waku-broadcaster-client-node 8.0.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  export declare class BroadcasterConfig {
2
2
  static IS_DEV: boolean;
3
- static readonly MINIMUM_BROADCASTER_VERSION = "6.0.0";
4
- static readonly MAXIMUM_BROADCASTER_VERSION = "6.999.0";
3
+ static readonly MINIMUM_BROADCASTER_VERSION = "7.0.0";
4
+ static readonly MAXIMUM_BROADCASTER_VERSION = "7.999.0";
5
5
  }
@@ -1,6 +1,6 @@
1
1
  export class BroadcasterConfig {
2
2
  static IS_DEV = false;
3
- static MINIMUM_BROADCASTER_VERSION = '6.0.0';
4
- static MAXIMUM_BROADCASTER_VERSION = '6.999.0';
3
+ static MINIMUM_BROADCASTER_VERSION = '7.0.0';
4
+ static MAXIMUM_BROADCASTER_VERSION = '7.999.0';
5
5
  }
6
6
  //# sourceMappingURL=broadcaster-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"broadcaster-config.js","sourceRoot":"","sources":["../../src/models/broadcaster-config.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IAEtB,MAAM,CAAU,2BAA2B,GAAG,OAAO,CAAC;IACtD,MAAM,CAAU,2BAA2B,GAAG,SAAS,CAAC","sourcesContent":["export class BroadcasterConfig {\n static IS_DEV = false;\n\n static readonly MINIMUM_BROADCASTER_VERSION = '6.0.0';\n static readonly MAXIMUM_BROADCASTER_VERSION = '6.999.0';\n}\n"]}
1
+ {"version":3,"file":"broadcaster-config.js","sourceRoot":"","sources":["../../src/models/broadcaster-config.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;IAEtB,MAAM,CAAU,2BAA2B,GAAG,OAAO,CAAC;IACtD,MAAM,CAAU,2BAA2B,GAAG,SAAS,CAAC","sourcesContent":["export class BroadcasterConfig {\n static IS_DEV = false;\n\n static readonly MINIMUM_BROADCASTER_VERSION = '7.0.0';\n static readonly MAXIMUM_BROADCASTER_VERSION = '7.999.0';\n}\n"]}
@@ -1,3 +1,11 @@
1
- export declare const WAKU_RAILGUN_PUB_SUB_TOPIC = "/waku/2/railgun-broadcaster";
1
+ export declare const WAKU_RAILGUN_PUB_SUB_TOPIC = "/waku/2/rs/0/1";
2
+ export declare const WAKU_RAILGUN_DEFAULT_SHARD: {
3
+ clusterId: number;
4
+ shard: number;
5
+ };
6
+ export declare const WAKU_RAILGUN_DEFAULT_SHARDS: {
7
+ clusterId: number;
8
+ shards: number[];
9
+ };
2
10
  export declare const WAKU_RAILGUN_DEFAULT_PEERS_WEB: string[];
3
11
  export declare const WAKU_RAILGUN_DEFAULT_PEERS_NODE: string[];
@@ -1,8 +1,18 @@
1
- export const WAKU_RAILGUN_PUB_SUB_TOPIC = '/waku/2/railgun-broadcaster';
1
+ export const WAKU_RAILGUN_PUB_SUB_TOPIC = '/waku/2/rs/0/1';
2
+ export const WAKU_RAILGUN_DEFAULT_SHARD = {
3
+ clusterId: 0,
4
+ shard: 1,
5
+ };
6
+ export const WAKU_RAILGUN_DEFAULT_SHARDS = {
7
+ clusterId: 0,
8
+ shards: [0, 1, 2, 3, 4, 5],
9
+ };
2
10
  export const WAKU_RAILGUN_DEFAULT_PEERS_WEB = [
3
- '/dns4/horsey.horsewithsixlegs.xyz/tcp/8000/wss/p2p/16Uiu2HAmLWDFk5nGXgLx2Mz2deiEMRya1HNcvWELMDodkAC891Sd',
11
+ '/dns4/core.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',
12
+ '/dns4/fleet.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',
4
13
  ];
5
14
  export const WAKU_RAILGUN_DEFAULT_PEERS_NODE = [
6
- '/dns4/horsey.horsewithsixlegs.xyz/tcp/60000/p2p/16Uiu2HAmLWDFk5nGXgLx2Mz2deiEMRya1HNcvWELMDodkAC891Sd',
15
+ '/dns4/core.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',
16
+ '/dns4/fleet.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',
7
17
  ];
8
18
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/models/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC;AAExE,MAAM,CAAC,MAAM,8BAA8B,GAAa;IAEtD,0GAA0G;CAC3G,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAa;IAEvD,uGAAuG;CACxG,CAAC","sourcesContent":["export const WAKU_RAILGUN_PUB_SUB_TOPIC = '/waku/2/railgun-broadcaster';\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_WEB: string[] = [\n // Some Websocket broadcasters (web friendly):\n '/dns4/horsey.horsewithsixlegs.xyz/tcp/8000/wss/p2p/16Uiu2HAmLWDFk5nGXgLx2Mz2deiEMRya1HNcvWELMDodkAC891Sd',\n];\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_NODE: string[] = [\n // Some TCP broadcasters (node friendly):\n '/dns4/horsey.horsewithsixlegs.xyz/tcp/60000/p2p/16Uiu2HAmLWDFk5nGXgLx2Mz2deiEMRya1HNcvWELMDodkAC891Sd',\n];\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/models/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AAE3D,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAa;IAEtD,uGAAuG;IACvG,wGAAwG;CACzG,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAa;IAEvD,oGAAoG;IACpG,qGAAqG;CACtG,CAAC","sourcesContent":["export const WAKU_RAILGUN_PUB_SUB_TOPIC = '/waku/2/rs/0/1';\n\nexport const WAKU_RAILGUN_DEFAULT_SHARD = {\n clusterId: 0,\n shard: 1,\n};\n\nexport const WAKU_RAILGUN_DEFAULT_SHARDS = {\n clusterId: 0,\n shards: [0, 1, 2, 3, 4, 5],\n};\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_WEB: string[] = [\n // Some Websocket broadcasters (web friendly):\n '/dns4/core.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',\n '/dns4/fleet.rootedinprivacy.com/tcp/8000/wss/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',\n];\n\nexport const WAKU_RAILGUN_DEFAULT_PEERS_NODE: string[] = [\n // Some TCP broadcasters (node friendly):\n '/dns4/core.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm4Ai1GzKv4EykU26ST1BPT4AHtABsYCLKrDG74GWX7D6H',\n '/dns4/fleet.rootedinprivacy.com/tcp/60000/p2p/16Uiu2HAm3GnUDQhBfax298CMkZX9MBHTJ9B8GXhrbueozESUaRZP',\n];\n"]}
@@ -7,6 +7,7 @@ export declare class WakuBroadcasterWakuCore {
7
7
  private static pubSubTopic;
8
8
  private static additionalDirectPeers;
9
9
  private static peerDiscoveryTimeout;
10
+ private static defaultShard;
10
11
  static initWaku: (chain: Chain) => Promise<void>;
11
12
  static reinitWaku: (chain: Chain) => Promise<void>;
12
13
  static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions): void;
@@ -8,13 +8,14 @@ import { isDefined } from '../utils/is-defined.js';
8
8
  import { bootstrap } from '@libp2p/bootstrap';
9
9
  import { tcp } from '@libp2p/tcp';
10
10
  import { createLightNode } from '@waku/sdk';
11
- import { WAKU_RAILGUN_DEFAULT_PEERS_NODE, WAKU_RAILGUN_DEFAULT_PEERS_WEB, WAKU_RAILGUN_PUB_SUB_TOPIC, } from '../models/constants.js';
11
+ import { WAKU_RAILGUN_DEFAULT_PEERS_NODE, WAKU_RAILGUN_DEFAULT_SHARD, WAKU_RAILGUN_DEFAULT_SHARDS, WAKU_RAILGUN_PUB_SUB_TOPIC, } from '../models/constants.js';
12
12
  export class WakuBroadcasterWakuCore {
13
13
  static hasError = false;
14
14
  static waku;
15
15
  static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;
16
16
  static additionalDirectPeers = [];
17
17
  static peerDiscoveryTimeout = 60000;
18
+ static defaultShard = WAKU_RAILGUN_DEFAULT_SHARD;
18
19
  static initWaku = async (chain) => {
19
20
  try {
20
21
  await WakuBroadcasterWakuCore.connect();
@@ -61,21 +62,18 @@ export class WakuBroadcasterWakuCore {
61
62
  try {
62
63
  WakuBroadcasterWakuCore.hasError = false;
63
64
  BroadcasterDebug.log(`Creating waku broadcast client`);
64
- const peers = [
65
+ const bootstrapPeers = [
65
66
  ...WAKU_RAILGUN_DEFAULT_PEERS_NODE,
66
- ...WAKU_RAILGUN_DEFAULT_PEERS_WEB,
67
67
  ...this.additionalDirectPeers,
68
68
  ];
69
- const waitTimeoutBeforeBootstrap = 250;
69
+ const waitTimeoutBeforeBootstrap = 1250;
70
70
  const waku = await createLightNode({
71
- pubsubTopics: [WakuBroadcasterWakuCore.pubSubTopic],
72
- pingKeepAlive: 60,
73
- relayKeepAlive: 60,
71
+ networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,
74
72
  libp2p: {
75
- transports: [tcp()],
73
+ transports: [tcp({})],
76
74
  peerDiscovery: [
77
75
  bootstrap({
78
- list: peers,
76
+ list: bootstrapPeers,
79
77
  timeout: waitTimeoutBeforeBootstrap,
80
78
  }),
81
79
  ],
@@ -112,11 +110,11 @@ export class WakuBroadcasterWakuCore {
112
110
  return peers.length;
113
111
  }
114
112
  static async getLightPushPeerCount() {
115
- const peers = (await this.waku?.lightPush.allPeers()) ?? [];
113
+ const peers = this.waku?.lightPush.connectedPeers ?? [];
116
114
  return peers.length;
117
115
  }
118
116
  static async getFilterPeerCount() {
119
- const peers = (await this.waku?.filter.allPeers()) ?? [];
117
+ const peers = this.waku?.filter.connectedPeers ?? [];
120
118
  return peers.length;
121
119
  }
122
120
  static async waitForRemotePeer(waku) {
@@ -137,10 +135,11 @@ export class WakuBroadcasterWakuCore {
137
135
  const payload = utf8ToBytes(dataString);
138
136
  const message = { payload };
139
137
  try {
140
- const results = await WakuBroadcasterWakuCore.waku?.lightPush.send(createEncoder({
138
+ const encoder = createEncoder({
141
139
  contentTopic,
142
- pubsubTopic: WakuBroadcasterWakuCore.pubSubTopic,
143
- }), message);
140
+ pubsubTopicShardInfo: this.defaultShard,
141
+ });
142
+ await WakuBroadcasterWakuCore.waku?.lightPush.send(encoder, message);
144
143
  }
145
144
  catch (err) {
146
145
  if (!(err instanceof Error)) {
@@ -1 +1 @@
1
- {"version":3,"file":"waku-broadcaster-waku-core.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-waku-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, promiseTimeout } from '@railgun-community/shared-models';\nimport { waitForRemotePeer, createEncoder } from '@waku/core';\nimport { Protocols, IMessage, LightNode } from '@waku/interfaces';\nimport { WakuObservers } from './waku-observers.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { utf8ToBytes } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { tcp } from '@libp2p/tcp';\nimport { createLightNode } from '@waku/sdk';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_PEERS_NODE,\n WAKU_RAILGUN_DEFAULT_PEERS_WEB,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\n\nexport class WakuBroadcasterWakuCore {\n static hasError = false;\n\n static waku: Optional<LightNode>;\n\n private static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;\n private static additionalDirectPeers: string[] = [];\n private static peerDiscoveryTimeout = 60000;\n\n static initWaku = async (chain: Chain): Promise<void> => {\n try {\n await WakuBroadcasterWakuCore.connect();\n if (!WakuBroadcasterWakuCore.waku) {\n BroadcasterDebug.log('No waku instance found');\n return;\n }\n WakuObservers.resetCurrentChain();\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw err;\n }\n };\n\n static reinitWaku = async (chain: Chain) => {\n if (\n isDefined(WakuBroadcasterWakuCore.waku) &&\n WakuBroadcasterWakuCore.waku.isStarted()\n ) {\n await WakuBroadcasterWakuCore.disconnect();\n }\n\n await WakuBroadcasterWakuCore.initWaku(chain);\n };\n\n static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions) {\n if (isDefined(broadcasterOptions.pubSubTopic)) {\n WakuBroadcasterWakuCore.pubSubTopic = broadcasterOptions.pubSubTopic;\n }\n if (broadcasterOptions.additionalDirectPeers) {\n WakuBroadcasterWakuCore.additionalDirectPeers =\n broadcasterOptions.additionalDirectPeers;\n }\n if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {\n WakuBroadcasterWakuCore.peerDiscoveryTimeout =\n broadcasterOptions.peerDiscoveryTimeout;\n }\n }\n\n static disconnect = async () => {\n await WakuBroadcasterWakuCore.waku?.stop();\n WakuBroadcasterWakuCore.waku = undefined;\n };\n\n private static connect = async (): Promise<void> => {\n try {\n WakuBroadcasterWakuCore.hasError = false;\n\n BroadcasterDebug.log(`Creating waku broadcast client`);\n\n const peers: string[] = [\n ...WAKU_RAILGUN_DEFAULT_PEERS_NODE,\n ...WAKU_RAILGUN_DEFAULT_PEERS_WEB,\n ...this.additionalDirectPeers,\n ];\n const waitTimeoutBeforeBootstrap = 250; // 250 ms - default is 1000ms\n const waku: LightNode = await createLightNode({\n pubsubTopics: [WakuBroadcasterWakuCore.pubSubTopic],\n pingKeepAlive: 60,\n relayKeepAlive: 60,\n libp2p: {\n transports: [tcp()],\n peerDiscovery: [\n bootstrap({\n list: peers,\n timeout: waitTimeoutBeforeBootstrap,\n }),\n ],\n },\n });\n\n BroadcasterDebug.log('Start Waku.');\n await waku.start();\n\n BroadcasterDebug.log('Waiting for remote peer.');\n await this.waitForRemotePeer(waku);\n\n if (!isDefined(waku.lightPush)) {\n throw new Error('No Waku LightPush instantiated.');\n }\n\n BroadcasterDebug.log('Waku peers:');\n for (const peer of waku.libp2p.getPeers()) {\n BroadcasterDebug.log(JSON.stringify(peer));\n }\n\n BroadcasterDebug.log('Connected to Waku');\n WakuBroadcasterWakuCore.waku = waku;\n WakuBroadcasterWakuCore.hasError = false;\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n WakuBroadcasterWakuCore.hasError = true;\n throw err;\n }\n };\n\n static getMeshPeerCount(): number {\n return 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 const peers = (await this.waku?.lightPush.allPeers()) ?? [];\n return peers.length;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n const peers = (await this.waku?.filter.allPeers()) ?? [];\n return peers.length;\n }\n\n private static async waitForRemotePeer(waku: LightNode) {\n try {\n const protocols = [Protocols.LightPush, Protocols.Filter];\n await promiseTimeout(\n waitForRemotePeer(waku, protocols),\n WakuBroadcasterWakuCore.peerDiscoveryTimeout,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw new Error(err.message);\n }\n }\n\n static async broadcastMessage(\n data: object,\n contentTopic: string,\n ): Promise<void> {\n const dataString = JSON.stringify(data);\n const payload = utf8ToBytes(dataString);\n const message: IMessage = { payload };\n try {\n const results = await WakuBroadcasterWakuCore.waku?.lightPush.send(\n createEncoder({\n contentTopic,\n pubsubTopic: WakuBroadcasterWakuCore.pubSubTopic,\n }),\n message,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"waku-broadcaster-waku-core.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-waku-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, promiseTimeout } from '@railgun-community/shared-models';\nimport { waitForRemotePeer, createEncoder } from '@waku/core';\nimport { Protocols, IMessage, LightNode } from '@waku/interfaces';\nimport { WakuObservers } from './waku-observers.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { utf8ToBytes } from '../utils/conversion.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { bootstrap } from '@libp2p/bootstrap';\nimport { tcp } from '@libp2p/tcp';\nimport { createLightNode } from '@waku/sdk';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_PEERS_NODE,\n WAKU_RAILGUN_DEFAULT_PEERS_WEB,\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\n static waku: Optional<LightNode>;\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\n static initWaku = async (chain: Chain): Promise<void> => {\n try {\n await WakuBroadcasterWakuCore.connect();\n if (!WakuBroadcasterWakuCore.waku) {\n BroadcasterDebug.log('No waku instance found');\n return;\n }\n WakuObservers.resetCurrentChain();\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw err;\n }\n };\n\n static reinitWaku = async (chain: Chain) => {\n if (\n isDefined(WakuBroadcasterWakuCore.waku) &&\n WakuBroadcasterWakuCore.waku.isStarted()\n ) {\n // Reset fees, which will reset status to \"Searching\".\n await WakuBroadcasterWakuCore.disconnect();\n }\n\n await WakuBroadcasterWakuCore.initWaku(chain);\n };\n\n static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions) {\n if (isDefined(broadcasterOptions.pubSubTopic)) {\n WakuBroadcasterWakuCore.pubSubTopic = broadcasterOptions.pubSubTopic;\n }\n if (broadcasterOptions.additionalDirectPeers) {\n WakuBroadcasterWakuCore.additionalDirectPeers =\n broadcasterOptions.additionalDirectPeers;\n }\n if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {\n WakuBroadcasterWakuCore.peerDiscoveryTimeout =\n broadcasterOptions.peerDiscoveryTimeout;\n }\n }\n\n static disconnect = async () => {\n await WakuBroadcasterWakuCore.waku?.stop();\n WakuBroadcasterWakuCore.waku = undefined;\n };\n\n private static connect = async (): Promise<void> => {\n try {\n WakuBroadcasterWakuCore.hasError = false;\n\n BroadcasterDebug.log(`Creating waku broadcast client`);\n\n const bootstrapPeers: string[] = [\n ...WAKU_RAILGUN_DEFAULT_PEERS_NODE,\n ...this.additionalDirectPeers,\n ];\n const waitTimeoutBeforeBootstrap = 1250; // 1250 ms - default is 1000ms\n const waku: LightNode = await createLightNode({\n // bootstrapPeers, this works also, while removing peerDiscovery from libp2p, peerDiscovery might be needed for native build?\n networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,\n libp2p: {\n // @ts-ignore\n transports: [tcp({})],\n peerDiscovery: [\n bootstrap({\n list: bootstrapPeers,\n timeout: waitTimeoutBeforeBootstrap,\n }),\n ],\n },\n });\n\n BroadcasterDebug.log('Start Waku.');\n await waku.start();\n\n BroadcasterDebug.log('Waiting for remote peer.');\n await this.waitForRemotePeer(waku);\n\n if (!isDefined(waku.lightPush)) {\n throw new Error('No Waku LightPush instantiated.');\n }\n\n BroadcasterDebug.log('Waku peers:');\n for (const peer of waku.libp2p.getPeers()) {\n BroadcasterDebug.log(JSON.stringify(peer));\n }\n\n BroadcasterDebug.log('Connected to Waku');\n WakuBroadcasterWakuCore.waku = waku;\n WakuBroadcasterWakuCore.hasError = false;\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n WakuBroadcasterWakuCore.hasError = true;\n throw err;\n }\n };\n\n static getMeshPeerCount(): number {\n return 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 const peers = this.waku?.lightPush.connectedPeers ?? [];\n return peers.length;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n const peers = this.waku?.filter.connectedPeers ?? [];\n return peers.length;\n }\n\n private static async waitForRemotePeer(waku: LightNode) {\n try {\n const protocols = [Protocols.LightPush, Protocols.Filter];\n await promiseTimeout(\n waitForRemotePeer(waku, protocols),\n WakuBroadcasterWakuCore.peerDiscoveryTimeout,\n );\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n throw new Error(err.message);\n }\n }\n\n static async broadcastMessage(\n data: object,\n contentTopic: string,\n ): Promise<void> {\n const dataString = JSON.stringify(data);\n const payload = utf8ToBytes(dataString);\n const message: IMessage = { payload };\n try {\n const encoder = createEncoder({\n contentTopic,\n pubsubTopicShardInfo: this.defaultShard,\n });\n await WakuBroadcasterWakuCore.waku?.lightPush.send(encoder, message);\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n BroadcasterDebug.error(err);\n }\n }\n}\n"]}
@@ -6,12 +6,9 @@ export declare class WakuObservers {
6
6
  private static currentSubscriptions;
7
7
  static setObserversForChain: (waku: Optional<LightNode>, chain: Chain) => Promise<void>;
8
8
  static resetCurrentChain: () => void;
9
- private static resubScribeLoop;
10
- private static isPinging;
11
- static pingAllSubscriptions: (waku: Optional<LightNode>) => Promise<void>;
9
+ static checkSubscriptionsHealth: (waku: Optional<LightNode>) => Promise<void>;
12
10
  private static removeAllObservers;
13
11
  private static getDecodersForChain;
14
- static subscribedPeers: string[];
15
12
  private static addChainObservers;
16
13
  static hasStartedPinging: boolean;
17
14
  static addTransportSubscription(waku: Optional<LightNode>, topic: string, callback: (message: any) => void): Promise<void>;
@@ -5,12 +5,11 @@ import { handleBroadcasterFeesMessage } from '../fees/handle-fees-message.js';
5
5
  import { BroadcasterTransactResponse } from '../transact/broadcaster-transact-response.js';
6
6
  import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
7
7
  import { isDefined } from '../utils/is-defined.js';
8
- import { WAKU_RAILGUN_PUB_SUB_TOPIC } from '../models/constants.js';
9
- import { WakuBroadcasterClient } from '../waku-broadcaster-client.js';
8
+ import { WAKU_RAILGUN_DEFAULT_SHARD, } from '../models/constants.js';
10
9
  export class WakuObservers {
11
10
  static currentChain;
12
11
  static currentContentTopics = [];
13
- static currentSubscriptions;
12
+ static currentSubscriptions = [];
14
13
  static setObserversForChain = async (waku, chain) => {
15
14
  if (!waku) {
16
15
  return;
@@ -29,90 +28,34 @@ export class WakuObservers {
29
28
  static resetCurrentChain = () => {
30
29
  WakuObservers.currentChain = undefined;
31
30
  };
32
- static resubScribeLoop = async (subscription, decoder, callback) => {
33
- BroadcasterDebug.log('Resubscribe Loop');
34
- const result = await subscription
35
- .subscribe(decoder, callback)
36
- .then(() => {
37
- BroadcasterDebug.log('Resubscribed');
38
- })
39
- .catch(err => {
40
- BroadcasterDebug.error(new Error(`Error re-subscribing: ${err.message}`));
41
- return undefined;
42
- });
43
- return;
44
- };
45
- static isPinging = false;
46
- static pingAllSubscriptions = async (waku) => {
47
- if (WakuObservers.isPinging === true) {
48
- return;
49
- }
50
- WakuObservers.isPinging = true;
31
+ static checkSubscriptionsHealth = async (waku) => {
32
+ BroadcasterDebug.log(`WAKU Health Status: ${waku?.health.health.overallStatus}`);
51
33
  if (isDefined(WakuObservers.currentSubscriptions)) {
52
- try {
53
- if (WakuObservers.currentSubscriptions.length === 0) {
54
- BroadcasterDebug.log('No subscriptions to ping');
55
- throw new Error('No subscriptions to ping');
56
- }
57
- for (const { subscription, params, } of WakuObservers.currentSubscriptions) {
58
- if (!WakuObservers.isPinging) {
59
- BroadcasterDebug.log('Stop pinging');
60
- break;
61
- }
62
- let pingSuccess = false;
63
- await subscription
64
- .ping()
65
- .then(() => {
66
- BroadcasterDebug.log('Ping Success');
67
- pingSuccess = true;
68
- })
69
- .catch(async (err) => {
70
- BroadcasterDebug.error(new Error(`Ping Error: ${err.message}`));
71
- throw new Error(err.message);
72
- })
73
- .finally(() => {
74
- if (!pingSuccess) {
75
- BroadcasterDebug.log("pingAllSubscriptions: Ping failed, let's reconnect");
76
- throw new Error('Ping failed, lets reconnect');
77
- }
78
- });
79
- }
80
- }
81
- catch (error) {
82
- await WakuBroadcasterClient.tryReconnect();
83
- WakuObservers.isPinging = false;
84
- WakuObservers.subscribedPeers = [];
85
- await WakuObservers.addSubscriptions(WakuObservers.currentChain, waku).catch(err => {
86
- BroadcasterDebug.error(new Error(`Error adding subscriptions. ${err.message}`));
87
- });
34
+ if (WakuObservers.currentSubscriptions.length === 0) {
35
+ BroadcasterDebug.log('No subscriptions to ping');
36
+ throw new Error('No subscriptions to ping');
88
37
  }
89
38
  }
90
39
  await delay(15 * 1000);
91
- WakuObservers.isPinging = false;
92
- WakuObservers.pingAllSubscriptions(waku);
40
+ WakuObservers.checkSubscriptionsHealth(waku);
93
41
  };
94
42
  static removeAllObservers = async (waku) => {
95
43
  if (!isDefined(waku?.lightPush)) {
96
44
  return;
97
45
  }
98
- if (isDefined(WakuObservers.currentSubscriptions)) {
99
- for (const { subscription } of WakuObservers.currentSubscriptions) {
100
- await subscription
101
- .unsubscribe(WakuObservers.currentContentTopics)
102
- .catch((err) => {
103
- BroadcasterDebug.log(`Unsubscribe Error ${err.message}`);
104
- });
46
+ if (isDefined(this.currentSubscriptions)) {
47
+ for (const { unsubscribe } of this.currentSubscriptions) {
48
+ await unsubscribe();
105
49
  }
106
- WakuObservers.currentSubscriptions = [];
107
- WakuObservers.currentContentTopics = [];
108
- WakuObservers.subscribedPeers = [];
50
+ this.currentSubscriptions = [];
51
+ this.currentContentTopics = [];
109
52
  }
110
53
  };
111
54
  static getDecodersForChain = (chain) => {
112
55
  const contentTopicFees = contentTopics.fees(chain);
113
56
  const contentTopicTransactResponse = contentTopics.transactResponse(chain);
114
- const feesDecoder = createDecoder(contentTopicFees, WAKU_RAILGUN_PUB_SUB_TOPIC);
115
- const transactResponseDecoder = createDecoder(contentTopicTransactResponse, WAKU_RAILGUN_PUB_SUB_TOPIC);
57
+ const feesDecoder = createDecoder(contentTopicFees, WAKU_RAILGUN_DEFAULT_SHARD);
58
+ const transactResponseDecoder = createDecoder(contentTopicTransactResponse, WAKU_RAILGUN_DEFAULT_SHARD);
116
59
  const feesCallback = (message) => handleBroadcasterFeesMessage(chain, message, contentTopicFees);
117
60
  const transactResponseCallback = BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage;
118
61
  const feesSubscriptionParams = {
@@ -127,7 +70,6 @@ export class WakuObservers {
127
70
  };
128
71
  return [feesSubscriptionParams, transactResponseSubscriptionParams];
129
72
  };
130
- static subscribedPeers = [];
131
73
  static addChainObservers = async (waku, chain) => {
132
74
  if (!isDefined(waku.filter)) {
133
75
  return;
@@ -137,7 +79,7 @@ export class WakuObservers {
137
79
  });
138
80
  if (!WakuObservers.hasStartedPinging) {
139
81
  WakuObservers.hasStartedPinging = true;
140
- WakuObservers.pingAllSubscriptions(waku);
82
+ WakuObservers.checkSubscriptionsHealth(waku);
141
83
  }
142
84
  const currentContentTopics = WakuObservers.getCurrentContentTopics();
143
85
  BroadcasterDebug.log('Waku content topics:');
@@ -152,26 +94,17 @@ export class WakuObservers {
152
94
  return;
153
95
  }
154
96
  const transportTopic = contentTopics.encrypted(topic);
155
- const decoder = createDecoder(transportTopic, WAKU_RAILGUN_PUB_SUB_TOPIC);
156
- const peers = await waku.filter.allPeers();
157
- for (const peer of peers) {
158
- if (WakuObservers.subscribedPeers.includes(peer.id.toString())) {
159
- continue;
160
- }
161
- const filterSubscription = await waku.filter.createSubscription(WAKU_RAILGUN_PUB_SUB_TOPIC, peer.id);
162
- const params = {
163
- topic: transportTopic,
164
- decoder,
165
- callback,
166
- };
167
- await filterSubscription.subscribe(decoder, callback);
168
- WakuObservers.currentSubscriptions?.push({
169
- subscription: filterSubscription,
170
- params: [params],
171
- });
172
- WakuObservers.subscribedPeers.push(peer.id.toString());
173
- BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);
174
- }
97
+ const decoder = createDecoder(transportTopic, WAKU_RAILGUN_DEFAULT_SHARD);
98
+ const params = {
99
+ topic: transportTopic,
100
+ decoder,
101
+ callback,
102
+ };
103
+ const unsubscribe = await waku.filter.subscribeWithUnsubscribe(decoder, callback);
104
+ WakuObservers.currentSubscriptions?.push({
105
+ unsubscribe,
106
+ params,
107
+ });
175
108
  WakuObservers.currentContentTopics.push(transportTopic);
176
109
  }
177
110
  static async addSubscriptions(chain, waku) {
@@ -180,27 +113,16 @@ export class WakuObservers {
180
113
  return;
181
114
  }
182
115
  const subscriptionParams = WakuObservers.getDecodersForChain(chain);
183
- const topics = subscriptionParams.map(subParam => subParam.topic);
116
+ const topics = subscriptionParams.map(params => params.topic);
184
117
  const newTopics = topics.filter(topic => !WakuObservers.currentContentTopics.includes(topic));
185
118
  WakuObservers.currentContentTopics.push(...newTopics);
186
- const peers = await waku.libp2p.peerStore.all();
187
- for (const peer of peers) {
188
- if (WakuObservers.subscribedPeers.includes(peer.id.toString())) {
189
- continue;
190
- }
191
- const filterSubscription = await waku.filter.createSubscription(WAKU_RAILGUN_PUB_SUB_TOPIC, peer.id);
192
- for (const subParam of subscriptionParams) {
193
- const { decoder, callback } = subParam;
194
- await filterSubscription.subscribe(decoder, callback);
195
- }
196
- this.currentSubscriptions ??= [];
197
- const newParams = {
198
- subscription: filterSubscription,
199
- params: subscriptionParams,
200
- };
201
- WakuObservers.currentSubscriptions?.push(newParams);
202
- WakuObservers.subscribedPeers.push(peer.id.toString());
203
- BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);
119
+ for (const params of subscriptionParams) {
120
+ const { decoder, callback } = params;
121
+ const unsubscribe = await waku.filter.subscribeWithUnsubscribe(decoder, callback);
122
+ WakuObservers.currentSubscriptions?.push({
123
+ unsubscribe,
124
+ params,
125
+ });
204
126
  }
205
127
  }
206
128
  static getCurrentContentTopics() {
@@ -1 +1 @@
1
- {"version":3,"file":"waku-observers.js","sourceRoot":"","sources":["../../src/waku/waku-observers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, compareChains, delay } from '@railgun-community/shared-models';\nimport { createDecoder } from '@waku/core';\nimport { contentTopics } from './waku-topics.js';\nimport {\n LightNode,\n IMessage,\n IFilterSubscription,\n IDecoder,\n Unsubscribe,\n} from '@waku/interfaces';\nimport { handleBroadcasterFeesMessage } from '../fees/handle-fees-message.js';\nimport { BroadcasterTransactResponse } from '../transact/broadcaster-transact-response.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport { WAKU_RAILGUN_PUB_SUB_TOPIC } from '../models/constants.js';\nimport { WakuBroadcasterClient } from '../waku-broadcaster-client.js';\n\ntype SubscriptionParams = {\n topic: string;\n decoder: IDecoder<any> | IDecoder<any>[];\n callback: (message: any) => void;\n};\n\nexport class WakuObservers {\n private static currentChain: Optional<Chain>;\n private static currentContentTopics: string[] = [];\n private static currentSubscriptions:\n | { subscription: IFilterSubscription; params: SubscriptionParams[] }[]\n | undefined;\n\n static setObserversForChain = async (\n waku: Optional<LightNode>,\n chain: Chain,\n ) => {\n if (!waku) {\n return;\n }\n if (\n WakuObservers.currentChain &&\n compareChains(WakuObservers.currentChain, chain)\n ) {\n return;\n }\n BroadcasterDebug.log(\n `Add Waku observers for chain: ${chain.type}:${chain.id}`,\n );\n WakuObservers.currentChain = chain;\n await WakuObservers.removeAllObservers(waku);\n BroadcasterDebug.log('Removed all observers');\n await WakuObservers.addChainObservers(waku, chain);\n BroadcasterDebug.log(\n `Waku listening for events on chain: ${chain.type}:${chain.id}`,\n );\n };\n\n static resetCurrentChain = () => {\n WakuObservers.currentChain = undefined;\n };\n\n private static resubScribeLoop = async (\n subscription: IFilterSubscription,\n decoder: IDecoder<any> | IDecoder<any>[],\n callback: (message: any) => void,\n ): Promise<void> => {\n BroadcasterDebug.log('Resubscribe Loop');\n const result = await subscription\n .subscribe(decoder, callback)\n .then(() => {\n BroadcasterDebug.log('Resubscribed');\n })\n .catch(err => {\n BroadcasterDebug.error(\n new Error(`Error re-subscribing: ${err.message}`),\n );\n return undefined;\n });\n\n return;\n };\n private static isPinging = false;\n static pingAllSubscriptions = async (waku: Optional<LightNode>) => {\n if (WakuObservers.isPinging === true) {\n return;\n }\n WakuObservers.isPinging = true;\n if (isDefined(WakuObservers.currentSubscriptions)) {\n try {\n if (WakuObservers.currentSubscriptions.length === 0) {\n BroadcasterDebug.log('No subscriptions to ping');\n throw new Error('No subscriptions to ping');\n }\n for (const {\n subscription,\n params,\n } of WakuObservers.currentSubscriptions) {\n if (!WakuObservers.isPinging) {\n // removeAllObservers was called. Stop pinging.\n BroadcasterDebug.log('Stop pinging');\n break;\n }\n let pingSuccess = false;\n await subscription\n .ping()\n .then(() => {\n BroadcasterDebug.log('Ping Success');\n pingSuccess = true;\n })\n .catch(async (err: Error) => {\n // No response received for request\n // Failed to get a connection to the peer\n // the connection is being closed\n // peer has no subscriptions\n BroadcasterDebug.error(new Error(`Ping Error: ${err.message}`));\n throw new Error(err.message);\n })\n .finally(() => {\n if (!pingSuccess) {\n BroadcasterDebug.log(\n \"pingAllSubscriptions: Ping failed, let's reconnect\",\n );\n throw new Error('Ping failed, lets reconnect');\n }\n });\n }\n } catch (error) {\n await WakuBroadcasterClient.tryReconnect();\n WakuObservers.isPinging = false;\n WakuObservers.subscribedPeers = [];\n await WakuObservers.addSubscriptions(\n WakuObservers.currentChain,\n waku,\n ).catch(err => {\n BroadcasterDebug.error(\n new Error(`Error adding subscriptions. ${err.message}`),\n );\n });\n }\n }\n await delay(15 * 1000);\n WakuObservers.isPinging = false;\n WakuObservers.pingAllSubscriptions(waku);\n };\n\n private static removeAllObservers = async (waku: Optional<LightNode>) => {\n if (!isDefined(waku?.lightPush)) {\n return;\n }\n if (isDefined(WakuObservers.currentSubscriptions)) {\n for (const { subscription } of WakuObservers.currentSubscriptions) {\n await subscription\n .unsubscribe(WakuObservers.currentContentTopics)\n .catch((err: Error) => {\n BroadcasterDebug.log(`Unsubscribe Error ${err.message}`);\n });\n }\n WakuObservers.currentSubscriptions = [];\n WakuObservers.currentContentTopics = [];\n WakuObservers.subscribedPeers = [];\n }\n };\n\n private static getDecodersForChain = (chain: Chain) => {\n const contentTopicFees = contentTopics.fees(chain);\n const contentTopicTransactResponse = contentTopics.transactResponse(chain);\n const feesDecoder = createDecoder(\n contentTopicFees,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n );\n const transactResponseDecoder = createDecoder(\n contentTopicTransactResponse,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n );\n const feesCallback = (message: IMessage) =>\n handleBroadcasterFeesMessage(chain, message, contentTopicFees);\n const transactResponseCallback =\n BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage;\n\n const feesSubscriptionParams = {\n topic: contentTopicFees,\n decoder: feesDecoder,\n callback: feesCallback,\n };\n const transactResponseSubscriptionParams = {\n topic: contentTopicTransactResponse,\n decoder: transactResponseDecoder,\n callback: transactResponseCallback,\n };\n return [feesSubscriptionParams, transactResponseSubscriptionParams];\n };\n\n static subscribedPeers: string[] = [];\n\n private static addChainObservers = async (waku: LightNode, chain: Chain) => {\n if (!isDefined(waku.filter)) {\n return;\n }\n\n await WakuObservers.addSubscriptions(chain, waku).catch(err => {\n BroadcasterDebug.log(`Error adding Observers. ${err.message}`);\n });\n if (!WakuObservers.hasStartedPinging) {\n WakuObservers.hasStartedPinging = true;\n WakuObservers.pingAllSubscriptions(waku);\n }\n // Log current list of observers\n const currentContentTopics = WakuObservers.getCurrentContentTopics();\n BroadcasterDebug.log('Waku content topics:');\n for (const observer of currentContentTopics) {\n BroadcasterDebug.log(observer);\n }\n };\n static hasStartedPinging: boolean;\n\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n if (!isDefined(waku)) {\n BroadcasterDebug.log(\n 'No waku instance found, Transport Subscription not added.',\n );\n return;\n }\n const transportTopic = contentTopics.encrypted(topic);\n const decoder = createDecoder(transportTopic, WAKU_RAILGUN_PUB_SUB_TOPIC);\n const peers = await waku.filter.allPeers();\n\n for (const peer of peers) {\n if (WakuObservers.subscribedPeers.includes(peer.id.toString())) {\n continue;\n }\n const filterSubscription = await waku.filter.createSubscription(\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n peer.id,\n );\n const params: SubscriptionParams = {\n topic: transportTopic,\n decoder,\n callback,\n };\n await filterSubscription.subscribe(decoder, callback);\n WakuObservers.currentSubscriptions?.push({\n subscription: filterSubscription,\n params: [params],\n });\n WakuObservers.subscribedPeers.push(peer.id.toString());\n BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);\n }\n WakuObservers.currentContentTopics.push(transportTopic);\n }\n\n private static async addSubscriptions(\n chain: Optional<Chain>,\n waku: Optional<LightNode>,\n ) {\n if (!isDefined(chain) || !isDefined(waku)) {\n BroadcasterDebug.log('AddSubscription: No Waku or Chain defined.');\n return;\n }\n const subscriptionParams = WakuObservers.getDecodersForChain(chain);\n const topics = subscriptionParams.map(subParam => subParam.topic);\n const newTopics = topics.filter(\n topic => !WakuObservers.currentContentTopics.includes(topic),\n );\n WakuObservers.currentContentTopics.push(...newTopics);\n const peers = await waku.libp2p.peerStore.all();\n for (const peer of peers) {\n if (WakuObservers.subscribedPeers.includes(peer.id.toString())) {\n continue;\n }\n const filterSubscription = await waku.filter.createSubscription(\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n peer.id,\n );\n for (const subParam of subscriptionParams) {\n const { decoder, callback } = subParam;\n await filterSubscription.subscribe(decoder, callback);\n }\n this.currentSubscriptions ??= [];\n const newParams = {\n subscription: filterSubscription,\n params: subscriptionParams,\n };\n WakuObservers.currentSubscriptions?.push(newParams);\n WakuObservers.subscribedPeers.push(peer.id.toString());\n BroadcasterDebug.log(`Adding peer complete ${peer.id.toString()}`);\n }\n }\n\n static getCurrentContentTopics(): string[] {\n return WakuObservers.currentContentTopics;\n }\n}\n"]}
1
+ {"version":3,"file":"waku-observers.js","sourceRoot":"","sources":["../../src/waku/waku-observers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, compareChains, delay } from '@railgun-community/shared-models';\nimport { createDecoder } from '@waku/core';\nimport { contentTopics } from './waku-topics.js';\nimport {\n LightNode,\n IMessage,\n IDecoder,\n type Unsubscribe,\n} from '@waku/interfaces';\nimport { handleBroadcasterFeesMessage } from '../fees/handle-fees-message.js';\nimport { BroadcasterTransactResponse } from '../transact/broadcaster-transact-response.js';\nimport { BroadcasterDebug } from '../utils/broadcaster-debug.js';\nimport { isDefined } from '../utils/is-defined.js';\nimport {\n WAKU_RAILGUN_DEFAULT_SHARD,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\n\ntype SubscriptionParams = {\n topic: string;\n decoder: IDecoder<any> | IDecoder<any>[];\n callback: (message: any) => void;\n};\n\ntype ActiveSubscription = {\n unsubscribe: Unsubscribe;\n params: SubscriptionParams;\n};\n\nexport class WakuObservers {\n private static currentChain: Optional<Chain>;\n private static currentContentTopics: string[] = [];\n private static currentSubscriptions: ActiveSubscription[] | undefined = [];\n\n static setObserversForChain = async (\n waku: Optional<LightNode>,\n chain: Chain,\n ) => {\n if (!waku) {\n return;\n }\n if (\n WakuObservers.currentChain &&\n compareChains(WakuObservers.currentChain, chain)\n ) {\n return;\n }\n BroadcasterDebug.log(\n `Add Waku observers for chain: ${chain.type}:${chain.id}`,\n );\n WakuObservers.currentChain = chain;\n await WakuObservers.removeAllObservers(waku);\n BroadcasterDebug.log('Removed all observers');\n await WakuObservers.addChainObservers(waku, chain);\n BroadcasterDebug.log(\n `Waku listening for events on chain: ${chain.type}:${chain.id}`,\n );\n };\n\n static resetCurrentChain = () => {\n WakuObservers.currentChain = undefined;\n };\n\n static checkSubscriptionsHealth = async (waku: Optional<LightNode>) => {\n BroadcasterDebug.log(\n // @ts-ignore\n `WAKU Health Status: ${waku?.health.health.overallStatus}`,\n );\n if (isDefined(WakuObservers.currentSubscriptions)) {\n if (WakuObservers.currentSubscriptions.length === 0) {\n BroadcasterDebug.log('No subscriptions to ping');\n throw new Error('No subscriptions to ping');\n }\n }\n await delay(15 * 1000);\n WakuObservers.checkSubscriptionsHealth(waku);\n };\n\n private static removeAllObservers = async (waku: Optional<LightNode>) => {\n if (!isDefined(waku?.lightPush)) {\n return;\n }\n if (isDefined(this.currentSubscriptions)) {\n for (const { unsubscribe } of this.currentSubscriptions) {\n await unsubscribe();\n }\n this.currentSubscriptions = [];\n this.currentContentTopics = [];\n }\n };\n\n private static getDecodersForChain = (chain: Chain) => {\n const contentTopicFees = contentTopics.fees(chain);\n const contentTopicTransactResponse = contentTopics.transactResponse(chain);\n const feesDecoder = createDecoder(\n contentTopicFees,\n WAKU_RAILGUN_DEFAULT_SHARD,\n );\n const transactResponseDecoder = createDecoder(\n contentTopicTransactResponse,\n WAKU_RAILGUN_DEFAULT_SHARD,\n );\n const feesCallback = (message: IMessage) =>\n handleBroadcasterFeesMessage(chain, message, contentTopicFees);\n const transactResponseCallback =\n BroadcasterTransactResponse.handleBroadcasterTransactionResponseMessage;\n\n const feesSubscriptionParams = {\n topic: contentTopicFees,\n decoder: feesDecoder,\n callback: feesCallback,\n };\n const transactResponseSubscriptionParams = {\n topic: contentTopicTransactResponse,\n decoder: transactResponseDecoder,\n callback: transactResponseCallback,\n };\n return [feesSubscriptionParams, transactResponseSubscriptionParams];\n };\n\n private static addChainObservers = async (waku: LightNode, chain: Chain) => {\n if (!isDefined(waku.filter)) {\n return;\n }\n\n await WakuObservers.addSubscriptions(chain, waku).catch(err => {\n BroadcasterDebug.log(`Error adding Observers. ${err.message}`);\n });\n if (!WakuObservers.hasStartedPinging) {\n WakuObservers.hasStartedPinging = true;\n WakuObservers.checkSubscriptionsHealth(waku);\n }\n // Log current list of observers\n const currentContentTopics = WakuObservers.getCurrentContentTopics();\n BroadcasterDebug.log('Waku content topics:');\n for (const observer of currentContentTopics) {\n BroadcasterDebug.log(observer);\n }\n };\n static hasStartedPinging: boolean;\n\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n if (!isDefined(waku)) {\n BroadcasterDebug.log(\n 'No waku instance found, Transport Subscription not added.',\n );\n return;\n }\n const transportTopic = contentTopics.encrypted(topic);\n const decoder = createDecoder(transportTopic, WAKU_RAILGUN_DEFAULT_SHARD);\n const params: SubscriptionParams = {\n topic: transportTopic,\n decoder,\n callback,\n };\n const unsubscribe = await waku.filter.subscribeWithUnsubscribe(\n decoder,\n callback,\n );\n WakuObservers.currentSubscriptions?.push({\n unsubscribe,\n params,\n });\n WakuObservers.currentContentTopics.push(transportTopic);\n }\n\n private static async addSubscriptions(\n chain: Optional<Chain>,\n waku: Optional<LightNode>,\n ) {\n if (!isDefined(chain) || !isDefined(waku)) {\n BroadcasterDebug.log('AddSubscription: No Waku or Chain defined.');\n return;\n }\n const subscriptionParams = WakuObservers.getDecodersForChain(chain);\n const topics = subscriptionParams.map(params => params.topic);\n const newTopics = topics.filter(\n topic => !WakuObservers.currentContentTopics.includes(topic),\n );\n WakuObservers.currentContentTopics.push(...newTopics);\n for (const params of subscriptionParams) {\n const { decoder, callback } = params;\n const unsubscribe = await waku.filter.subscribeWithUnsubscribe(\n decoder,\n callback,\n );\n WakuObservers.currentSubscriptions?.push({\n unsubscribe,\n params,\n });\n }\n }\n\n static getCurrentContentTopics(): string[] {\n return WakuObservers.currentContentTopics;\n }\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import { Chain } from '@railgun-community/shared-models';
2
2
  export declare const contentTopics: {
3
+ default: () => string;
3
4
  fees: (chain: Chain) => string;
4
- encrypted: (topic: string) => string;
5
5
  transact: (chain: Chain) => string;
6
6
  transactResponse: (chain: Chain) => string;
7
+ metrics: () => string;
8
+ encrypted: (topic: string) => string;
7
9
  };
@@ -1,7 +1,9 @@
1
1
  export const contentTopics = {
2
- fees: (chain) => `/railgun/v2/${chain.type}/${chain.id}/fees/json`,
3
- encrypted: (topic) => `/railgun/v2/encrypted${topic}`,
4
- transact: (chain) => `/railgun/v2/${chain.type}/${chain.id}/transact/json`,
5
- transactResponse: (chain) => `/railgun/v2/${chain.type}/${chain.id}/transact-response/json`,
2
+ default: () => '/railgun/v2/default/json',
3
+ fees: (chain) => `/railgun/v2/${chain.type}-${chain.id}-fees/json`,
4
+ transact: (chain) => `/railgun/v2/${chain.type}-${chain.id}-transact/json`,
5
+ transactResponse: (chain) => `/railgun/v2/${chain.type}-${chain.id}-transact-response/json`,
6
+ metrics: () => `/railgun/v2/metrics/json`,
7
+ encrypted: (topic) => `/railgun/v2/encrypted-${topic}/json`,
6
8
  };
7
9
  //# sourceMappingURL=waku-topics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"waku-topics.js","sourceRoot":"","sources":["../../src/waku/waku-topics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,YAAY;IACzE,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,wBAAwB,KAAK,EAAE;IAC7D,QAAQ,EAAE,CAAC,KAAY,EAAE,EAAE,CACzB,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,gBAAgB;IACvD,gBAAgB,EAAE,CAAC,KAAY,EAAE,EAAE,CACjC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,yBAAyB;CACjE,CAAC","sourcesContent":["import { Chain } from '@railgun-community/shared-models';\n\nexport const contentTopics = {\n fees: (chain: Chain) => `/railgun/v2/${chain.type}/${chain.id}/fees/json`,\n encrypted: (topic: string) => `/railgun/v2/encrypted${topic}`,\n transact: (chain: Chain) =>\n `/railgun/v2/${chain.type}/${chain.id}/transact/json`,\n transactResponse: (chain: Chain) =>\n `/railgun/v2/${chain.type}/${chain.id}/transact-response/json`,\n};\n"]}
1
+ {"version":3,"file":"waku-topics.js","sourceRoot":"","sources":["../../src/waku/waku-topics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,0BAA0B;IACzC,IAAI,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,YAAY;IACzE,QAAQ,EAAE,CAAC,KAAY,EAAE,EAAE,CACzB,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,gBAAgB;IACvD,gBAAgB,EAAE,CAAC,KAAY,EAAE,EAAE,CACjC,eAAe,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,yBAAyB;IAChE,OAAO,EAAE,GAAG,EAAE,CAAC,0BAA0B;IACzC,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,yBAAyB,KAAK,OAAO;CACpE,CAAC","sourcesContent":["import { Chain } from '@railgun-community/shared-models';\n\nexport const contentTopics = {\n default: () => '/railgun/v2/default/json',\n fees: (chain: Chain) => `/railgun/v2/${chain.type}-${chain.id}-fees/json`,\n transact: (chain: Chain) =>\n `/railgun/v2/${chain.type}-${chain.id}-transact/json`,\n transactResponse: (chain: Chain) =>\n `/railgun/v2/${chain.type}-${chain.id}-transact-response/json`,\n metrics: () => `/railgun/v2/metrics/json`,\n encrypted: (topic: string) => `/railgun/v2/encrypted-${topic}/json`,\n};\n"]}
@@ -113,6 +113,7 @@ export class WakuBroadcasterClient {
113
113
  AddressFilter.setBlocklist(blocklist);
114
114
  }
115
115
  static async tryReconnect() {
116
+ BroadcasterFeeCache.resetCache(WakuBroadcasterClient.chain);
116
117
  WakuBroadcasterClient.updateStatus();
117
118
  await WakuBroadcasterClient.restart();
118
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"waku-broadcaster-client.js","sourceRoot":"","sources":["../src/waku-broadcaster-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,kBAAkB,EAClB,2BAA2B,GAE5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAM5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAC,KAAK,CAAQ;IACpB,MAAM,CAAC,cAAc,CAAsC;IAC3D,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;IAEpC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;IAExB,MAAM,CAAC,KAAK,CAAC,KAAK,CAChB,KAAY,EACZ,kBAAsC,EACtC,cAAmD,EACnD,mBAAyC;QAEzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QAErC,uBAAuB,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;QAElE,IAAI,mBAAmB,EAAE;YACvB,gBAAgB,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;SACnD;QAED,mBAAmB,CAAC,IAAI,CACtB,kBAAkB,CAAC,iBAAiB;YAClC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAC3C,CAAC;QAEF,IAAI;YACF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,MAAM,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YAGpB,IAAI,CAAC,UAAU,EAAE,CAAC;SACnB;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE;gBAC7B,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;aAC3D;YACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;SACtE;IACH,CAAC;IACO,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1B,MAAM,CAAC,cAAc,GAAG,KAAK,IAAI,EAAE;QACzC,MAAM,SAAS,GAAG,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;QAC7D,IAAI,SAAS,GAAG,CAAC,EAAE;YACjB,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE;gBAC5B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;gBACxB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;aACtB;iBAAM;gBACL,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;aAC1B;SACF;aAAM;YACL,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;SACzB;QACD,MAAM,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,IAAI;QACf,MAAM,uBAAuB,CAAC,UAAU,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAY;QAChC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;YAClC,OAAO;SACR;QAED,qBAAqB,CAAC,KAAK,GAAG,KAAK,CAAC;QACpC,MAAM,aAAa,CAAC,oBAAoB,CACtC,uBAAuB,CAAC,IAAI,EAC5B,KAAK,CACN,CAAC;QACF,qBAAqB,CAAC,YAAY,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,OAAO,aAAa,CAAC,uBAAuB,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,OAAO,uBAAuB,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,kBAAkB;QACvB,OAAO,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,qBAAqB;QAChC,OAAO,MAAM,uBAAuB,CAAC,qBAAqB,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB;QAC7B,OAAO,MAAM,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;IAC5D,CAAC;IAUD,MAAM,CAAC,mBAAmB,CACxB,KAAY,EACZ,YAAoB,EACpB,aAAsB;QAEtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;YAClC,OAAO;SACR;QAED,OAAO,iBAAiB,CAAC,mBAAmB,CAC1C,KAAK,EACL,YAAY,EACZ,aAAa,CACd,CAAC;IACJ,CAAC;IASD,MAAM,CAAC,2BAA2B,CAChC,KAAY,EACZ,aAAsB;QAEtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;YAClC,OAAO,EAAE,CAAC;SACX;QAED,OAAO,iBAAiB,CAAC,2BAA2B,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC7E,CAAC;IAkBD,MAAM,CAAC,6BAA6B,CAClC,KAAY,EACZ,YAAoB,EACpB,aAAsB,EACtB,sBAA8B,CAAC;QAE/B,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;YAClC,OAAO;SACR;QAED,OAAO,iBAAiB,CAAC,6BAA6B,CACpD,KAAK,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAYD,MAAM,CAAC,wBAAwB,CAC7B,KAAY,EACZ,YAAoB,EACpB,aAAsB;QAEtB,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;YAClC,OAAO;SACR;QAED,OAAO,iBAAiB,CAAC,wBAAwB,CAC/C,KAAK,EACL,YAAY,EACZ,aAAa,CACd,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,iBAAiB,CACtB,SAA6B,EAC7B,SAA6B;QAE7B,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACtC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY;QACvB,qBAAqB,CAAC,YAAY,EAAE,CAAC;QAErC,MAAM,qBAAqB,CAAC,OAAO,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,aAAa,CAClB,KAAY,EACZ,YAAoB,EACpB,aAAsB;QAEtB,OAAO,mBAAmB,CAAC,aAAa,CACtC,KAAK,EACL,YAAY,EACZ,aAAa,CACd,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,OAAO;QAC1B,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACtC,OAAO;SACR;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI;YACF,gBAAgB,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAC3C,MAAM,uBAAuB,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;SAC3B;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE;gBAC7B,OAAO;aACR;YACD,gBAAgB,CAAC,KAAK,CACpB,IAAI,KAAK,CAAC,8CAA8C,EAAE,EAAE,KAAK,EAAE,CAAC,CACrE,CAAC;SACH;IACH,CAAC;IAKO,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;aAAM;YACL,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;QACD,MAAM,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAG7C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,MAAM,CAAC,YAAY;QACzB,MAAM,MAAM,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,IACE,MAAM,KAAK,2BAA2B,CAAC,YAAY;YACnD,MAAM,KAAK,2BAA2B,CAAC,KAAK,EAC5C;YAEA,IAAI,CAAC,OAAO,EAAE,CAAC;SAChB;IACH,CAAC;IAGD,MAAM,CAAC,KAAK,CAAC,wBAAwB,CACnC,IAAyB,EACzB,KAAa,EACb,QAAgC;QAEhC,MAAM,aAAa,CAAC,wBAAwB,CAC1C,uBAAuB,CAAC,IAAI,EAC5B,KAAK,EACL,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,IAAY,EAAE,KAAa;QAC9C,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,uBAAuB,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,uBAAuB,CAAC,IAAI,CAAC;IACtC,CAAC","sourcesContent":["import {\n Chain,\n delay,\n POI_REQUIRED_LISTS,\n BroadcasterConnectionStatus,\n SelectedBroadcaster,\n} from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from './fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from './filters/address-filter.js';\nimport {\n BroadcasterConnectionStatusCallback,\n BroadcasterDebugger,\n BroadcasterOptions,\n} from './models/export-models.js';\nimport { BroadcasterSearch } from './search/best-broadcaster.js';\nimport { BroadcasterStatus } from './status/broadcaster-connection-status.js';\nimport { BroadcasterDebug } from './utils/broadcaster-debug.js';\nimport { WakuObservers } from './waku/waku-observers.js';\nimport { WakuBroadcasterWakuCore } from './waku/waku-broadcaster-waku-core.js';\nimport type { LightNode } from '@waku/interfaces';\nimport { contentTopics } from './waku/waku-topics.js';\n\nexport class WakuBroadcasterClient {\n private static chain: Chain;\n private static statusCallback: BroadcasterConnectionStatusCallback;\n private static started = false;\n private static isRestarting = false;\n\n static pollDelay = 3000;\n\n static async start(\n chain: Chain,\n broadcasterOptions: BroadcasterOptions,\n statusCallback: BroadcasterConnectionStatusCallback,\n broadcasterDebugger?: BroadcasterDebugger,\n ) {\n this.chain = chain;\n this.statusCallback = statusCallback;\n\n WakuBroadcasterWakuCore.setBroadcasterOptions(broadcasterOptions);\n\n if (broadcasterDebugger) {\n BroadcasterDebug.setDebugger(broadcasterDebugger);\n }\n\n BroadcasterFeeCache.init(\n broadcasterOptions.poiActiveListKeys ??\n POI_REQUIRED_LISTS.map(list => list.key),\n );\n\n try {\n this.started = false;\n await WakuBroadcasterWakuCore.initWaku(chain);\n this.started = true;\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n throw new Error('Cannot connect to Broadcaster network.', { cause });\n }\n }\n private static peerRetryCount = 0;\n private static pollConnection = async () => {\n const peerCount = WakuBroadcasterWakuCore.getMeshPeerCount();\n if (peerCount < 1) {\n if (this.peerRetryCount >= 2) {\n this.peerRetryCount = 0;\n await this.restart();\n } else {\n this.peerRetryCount += 1;\n }\n } else {\n this.peerRetryCount = 0;\n }\n await delay(WakuBroadcasterClient.pollDelay);\n this.pollConnection();\n };\n\n static async stop() {\n await WakuBroadcasterWakuCore.disconnect();\n this.started = false;\n this.updateStatus();\n }\n\n static isStarted() {\n return this.started;\n }\n\n static async setChain(chain: Chain): Promise<void> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n WakuBroadcasterClient.chain = chain;\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n WakuBroadcasterClient.updateStatus();\n }\n\n static getContentTopics(): string[] {\n return WakuObservers.getCurrentContentTopics();\n }\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getMeshPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getLightPushPeerCount();\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getFilterPeerCount();\n }\n /**\n * The function `findBestBroadcaster` finds the broadcaster with the lowest fees for a given chain and token.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBestBroadcaster(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n /**\n * The function `findAllBroadcastersForChain` returns an array of all available broadcasters fee-tokens for a given chain.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find all broadcasters for.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return [];\n }\n\n return BroadcasterSearch.findAllBroadcastersForChain(chain, useRelayAdapt);\n }\n\n /**\n * The function `findRandomBroadcasterForToken` selects a random broadcaster from a list of broadcasters that is based on\n * their fees for a specific token, and how much higher their fees are compared to the broadcaster with\n * the lowest fees.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @param {number} [percentageThreshold=5] - The `percentageThreshold` parameter is a number that\n * represents the maximum percentage increase in fees that a broadcaster can have compared to the broadcaster\n * with the lowest fees. For example, if the `percentageThreshold` is set to 5, it means that a\n * broadcaster can have a maximum of 5% higher fees than the broadcaster with the lowest fees and still be selected.\n * Defaults to 5.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number = 5,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findRandomBroadcasterForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n percentageThreshold,\n );\n }\n\n /**\n * The function `findBroadcastersForToken` takes in a chain, token address, and a boolean flag, and\n * returns an array of selected broadcasters based on the provided parameters.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network; a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n static setAddressFilters(\n allowlist: Optional<string[]>,\n blocklist: Optional<string[]>,\n ): void {\n AddressFilter.setAllowlist(allowlist);\n AddressFilter.setBlocklist(blocklist);\n }\n\n static async tryReconnect(): Promise<void> {\n WakuBroadcasterClient.updateStatus();\n\n await WakuBroadcasterClient.restart();\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ) {\n return BroadcasterFeeCache.supportsToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n private static async restart(): Promise<void> {\n if (this.isRestarting || !this.started) {\n return;\n }\n this.isRestarting = true;\n try {\n BroadcasterDebug.log('Restarting Waku...');\n await WakuBroadcasterWakuCore.reinitWaku(this.chain);\n this.isRestarting = false;\n } catch (cause) {\n this.isRestarting = false;\n if (!(cause instanceof Error)) {\n return;\n }\n BroadcasterDebug.error(\n new Error('Error reinitializing Waku Broadcaster Client', { cause }),\n );\n }\n }\n\n /**\n * Start keep-alive poller which checks Broadcaster status every few seconds.\n */\n private static async pollStatus(): Promise<void> {\n if (!this.isRestarting) {\n this.updateStatus();\n } else {\n this.updateStatus();\n }\n await delay(WakuBroadcasterClient.pollDelay);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n }\n\n private static updateStatus() {\n const status = BroadcasterStatus.getBroadcasterConnectionStatus(this.chain);\n\n this.statusCallback(this.chain, status);\n if (\n status === BroadcasterConnectionStatus.Disconnected ||\n status === BroadcasterConnectionStatus.Error\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.restart();\n }\n }\n\n // Waku Transport functions\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n await WakuObservers.addTransportSubscription(\n WakuBroadcasterWakuCore.waku,\n topic,\n callback,\n );\n }\n\n static sendTransport(data: object, topic: string): void {\n const customTopic = contentTopics.encrypted(topic);\n WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\n }\n}\n"]}
1
+ {"version":3,"file":"waku-broadcaster-client.js","sourceRoot":"","sources":["../src/waku-broadcaster-client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Chain,\n delay,\n POI_REQUIRED_LISTS,\n BroadcasterConnectionStatus,\n SelectedBroadcaster,\n} from '@railgun-community/shared-models';\nimport { BroadcasterFeeCache } from './fees/broadcaster-fee-cache.js';\nimport { AddressFilter } from './filters/address-filter.js';\nimport {\n BroadcasterConnectionStatusCallback,\n BroadcasterDebugger,\n BroadcasterOptions,\n} from './models/export-models.js';\nimport { BroadcasterSearch } from './search/best-broadcaster.js';\nimport { BroadcasterStatus } from './status/broadcaster-connection-status.js';\nimport { BroadcasterDebug } from './utils/broadcaster-debug.js';\nimport { WakuObservers } from './waku/waku-observers.js';\nimport { WakuBroadcasterWakuCore } from './waku/waku-broadcaster-waku-core.js';\nimport type { LightNode } from '@waku/interfaces';\nimport { contentTopics } from './waku/waku-topics.js';\n\nexport class WakuBroadcasterClient {\n private static chain: Chain;\n private static statusCallback: BroadcasterConnectionStatusCallback;\n private static started = false;\n private static isRestarting = false;\n\n static pollDelay = 3000;\n\n static async start(\n chain: Chain,\n broadcasterOptions: BroadcasterOptions,\n statusCallback: BroadcasterConnectionStatusCallback,\n broadcasterDebugger?: BroadcasterDebugger,\n ) {\n this.chain = chain;\n this.statusCallback = statusCallback;\n\n WakuBroadcasterWakuCore.setBroadcasterOptions(broadcasterOptions);\n\n if (broadcasterDebugger) {\n BroadcasterDebug.setDebugger(broadcasterDebugger);\n }\n\n BroadcasterFeeCache.init(\n broadcasterOptions.poiActiveListKeys ??\n POI_REQUIRED_LISTS.map(list => list.key),\n );\n\n try {\n this.started = false;\n await WakuBroadcasterWakuCore.initWaku(chain);\n this.started = true;\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n } catch (cause) {\n if (!(cause instanceof Error)) {\n throw new Error('Unexpected non-error thrown', { cause });\n }\n throw new Error('Cannot connect to Broadcaster network.', { cause });\n }\n }\n private static peerRetryCount = 0;\n private static pollConnection = async () => {\n const peerCount = WakuBroadcasterWakuCore.getMeshPeerCount();\n if (peerCount < 1) {\n if (this.peerRetryCount >= 2) {\n this.peerRetryCount = 0;\n await this.restart();\n } else {\n this.peerRetryCount += 1;\n }\n } else {\n this.peerRetryCount = 0;\n }\n await delay(WakuBroadcasterClient.pollDelay);\n this.pollConnection();\n };\n\n static async stop() {\n await WakuBroadcasterWakuCore.disconnect();\n this.started = false;\n this.updateStatus();\n }\n\n static isStarted() {\n return this.started;\n }\n\n static async setChain(chain: Chain): Promise<void> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n WakuBroadcasterClient.chain = chain;\n await WakuObservers.setObserversForChain(\n WakuBroadcasterWakuCore.waku,\n chain,\n );\n WakuBroadcasterClient.updateStatus();\n }\n\n static getContentTopics(): string[] {\n return WakuObservers.getCurrentContentTopics();\n }\n\n static getMeshPeerCount(): number {\n return WakuBroadcasterWakuCore.getMeshPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n return WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getLightPushPeerCount();\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return await WakuBroadcasterWakuCore.getFilterPeerCount();\n }\n /**\n * The function `findBestBroadcaster` finds the broadcaster with the lowest fees for a given chain and token.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findBestBroadcaster(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBestBroadcaster(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n /**\n * The function `findAllBroadcastersForChain` returns an array of all available broadcasters fee-tokens for a given chain.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find all broadcasters for.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findAllBroadcastersForChain(\n chain: Chain,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return [];\n }\n\n return BroadcasterSearch.findAllBroadcastersForChain(chain, useRelayAdapt);\n }\n\n /**\n * The function `findRandomBroadcasterForToken` selects a random broadcaster from a list of broadcasters that is based on\n * their fees for a specific token, and how much higher their fees are compared to the broadcaster with\n * the lowest fees.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network, a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @param {number} [percentageThreshold=5] - The `percentageThreshold` parameter is a number that\n * represents the maximum percentage increase in fees that a broadcaster can have compared to the broadcaster\n * with the lowest fees. For example, if the `percentageThreshold` is set to 5, it means that a\n * broadcaster can have a maximum of 5% higher fees than the broadcaster with the lowest fees and still be selected.\n * Defaults to 5.\n * @returns an Optional<SelectedBroadcaster> object.\n */\n static findRandomBroadcasterForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n percentageThreshold: number = 5,\n ): Optional<SelectedBroadcaster> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findRandomBroadcasterForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n percentageThreshold,\n );\n }\n\n /**\n * The function `findBroadcastersForToken` takes in a chain, token address, and a boolean flag, and\n * returns an array of selected broadcasters based on the provided parameters.\n * @param {Chain} chain - The `chain` parameter is a Chain object that represents the network to find a broadcaster for.\n * @param {string} tokenAddress - The `tokenAddress` parameter is a string that represents the\n * address of an ERC20 Token on the network; a broadcaster broadcasting fees for this token will be selected.\n * @param {boolean} useRelayAdapt - A boolean value indicating whether to select broadcasters that\n * support RelayAdapt transactions.\n * @returns an Optional<SelectedBroadcaster[]> object.\n */\n static findBroadcastersForToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ): Optional<SelectedBroadcaster[]> {\n if (!WakuBroadcasterClient.started) {\n return;\n }\n\n return BroadcasterSearch.findBroadcastersForToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n static setAddressFilters(\n allowlist: Optional<string[]>,\n blocklist: Optional<string[]>,\n ): void {\n AddressFilter.setAllowlist(allowlist);\n AddressFilter.setBlocklist(blocklist);\n }\n\n static async tryReconnect(): Promise<void> {\n // Reset fees, which will reset status to \"Searching\".\n BroadcasterFeeCache.resetCache(WakuBroadcasterClient.chain);\n WakuBroadcasterClient.updateStatus();\n\n await WakuBroadcasterClient.restart();\n }\n\n static supportsToken(\n chain: Chain,\n tokenAddress: string,\n useRelayAdapt: boolean,\n ) {\n return BroadcasterFeeCache.supportsToken(\n chain,\n tokenAddress,\n useRelayAdapt,\n );\n }\n\n private static async restart(): Promise<void> {\n if (this.isRestarting || !this.started) {\n return;\n }\n this.isRestarting = true;\n try {\n BroadcasterDebug.log('Restarting Waku...');\n await WakuBroadcasterWakuCore.reinitWaku(this.chain);\n this.isRestarting = false;\n } catch (cause) {\n this.isRestarting = false;\n if (!(cause instanceof Error)) {\n return;\n }\n BroadcasterDebug.error(\n new Error('Error reinitializing Waku Broadcaster Client', { cause }),\n );\n }\n }\n\n /**\n * Start keep-alive poller which checks Broadcaster status every few seconds.\n */\n private static async pollStatus(): Promise<void> {\n if (!this.isRestarting) {\n this.updateStatus();\n } else {\n this.updateStatus();\n }\n await delay(WakuBroadcasterClient.pollDelay);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.pollStatus();\n }\n\n private static updateStatus() {\n const status = BroadcasterStatus.getBroadcasterConnectionStatus(this.chain);\n\n this.statusCallback(this.chain, status);\n if (\n status === BroadcasterConnectionStatus.Disconnected ||\n status === BroadcasterConnectionStatus.Error\n ) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.restart();\n }\n }\n\n // Waku Transport functions\n static async addTransportSubscription(\n waku: Optional<LightNode>,\n topic: string,\n callback: (message: any) => void,\n ): Promise<void> {\n await WakuObservers.addTransportSubscription(\n WakuBroadcasterWakuCore.waku,\n topic,\n callback,\n );\n }\n\n static sendTransport(data: object, topic: string): void {\n const customTopic = contentTopics.encrypted(topic);\n WakuBroadcasterWakuCore.broadcastMessage(data, customTopic);\n }\n\n static getWakuCore(): Optional<LightNode> {\n return WakuBroadcasterWakuCore.waku;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@railgun-community/waku-broadcaster-client-node",
3
- "version": "8.0.0",
3
+ "version": "8.1.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -20,17 +20,27 @@
20
20
  "tsc-test": "tsc -p tsconfig.test.json && tsc-alias -p tsconfig.test.json",
21
21
  "compile-test": "npm run clean && npm run tsc-test",
22
22
  "test-coverage": "npm run compile-test && c8 mocha",
23
- "test": "npm run compile-test && NODE_ENV=test mocha 'dist/**/*.test.js'"
23
+ "test": "npm run compile-test && NODE_ENV=test mocha 'dist/**/*.test.js'",
24
+ "postinstall": "patch-package"
24
25
  },
25
26
  "dependencies": {
26
- "@libp2p/bootstrap": "^10.0.11",
27
- "@libp2p/interface-peer-id": "^2.0.2",
28
- "@libp2p/tcp": "9.0.17",
29
- "@waku/core": "0.0.27",
30
- "@waku/relay": "0.0.10",
31
- "@waku/sdk": "0.0.23",
32
- "@waku/interfaces": "0.0.22",
33
- "libp2p": "^1.1.2"
27
+ "@libp2p/bootstrap": "^10.1.2",
28
+ "@libp2p/identify": "^2.1.2",
29
+ "@libp2p/interface": "1.1.4",
30
+ "@libp2p/mplex": "^10.1.2",
31
+ "@libp2p/ping": "^1.1.2",
32
+ "@libp2p/tcp": "10.0.7",
33
+ "@libp2p/websockets": "^8.1.4",
34
+ "@noble/hashes": "^1.3.3",
35
+ "@waku/core": "0.0.32",
36
+ "@waku/discovery": "0.0.5",
37
+ "@waku/interfaces": "0.0.27",
38
+ "@waku/message-hash": "0.1.16",
39
+ "@waku/proto": "0.0.8",
40
+ "@waku/sdk": "0.0.28",
41
+ "@waku/utils": "0.0.20",
42
+ "libp2p": "^1.8.1",
43
+ "patch-package": "^8.0.0"
34
44
  },
35
45
  "peerDependencies": {
36
46
  "@railgun-community/shared-models": "7.4.4",
@@ -40,7 +50,6 @@
40
50
  "devDependencies": {
41
51
  "@railgun-community/shared-models": "7.4.4",
42
52
  "@railgun-community/wallet": "10.2.5",
43
- "ethers": "github:Railgun-Community/ethers.js#v6.7.10",
44
53
  "@types/chai": "^4.3.5",
45
54
  "@types/chai-as-promised": "^7.1.5",
46
55
  "@types/leveldown": "^4.0.3",
@@ -56,6 +65,7 @@
56
65
  "eslint-config-prettier": "^8.8.0",
57
66
  "eslint-plugin-flowtype": "^8.0.3",
58
67
  "eslint-plugin-import": "^2.27.5",
68
+ "ethers": "github:Railgun-Community/ethers.js#v6.7.10",
59
69
  "leveldown": "^6.1.1",
60
70
  "madge": "^6.1.0",
61
71
  "mocha": "^10.2.0",