@railgun-community/waku-broadcaster-client-web 8.4.0 → 9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +148 -26
  2. package/dist/fees/broadcaster-fee-cache.d.ts +5 -0
  3. package/dist/fees/broadcaster-fee-cache.js +71 -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 +34 -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 +42 -3
  10. package/dist/fees/handle-fees-message.js.map +1 -1
  11. package/dist/models/broadcaster-config.d.ts +13 -2
  12. package/dist/models/broadcaster-config.js +7 -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 +10 -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 +171 -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 +30 -133
  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 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waku-broadcaster-waku-core-base.js","sourceRoot":"","sources":["../../src/waku/waku-broadcaster-waku-core-base.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chain, delay } 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 {\n createEncoder,\n createDecoder,\n type LightNode,\n type IDecodedMessage,\n type QueryRequestParams,\n} from '@waku/sdk';\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_SHARD,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n} from '../models/constants.js';\nimport { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';\nimport { BroadcasterConfig } from '../models/broadcaster-config.js';\n\nexport abstract class WakuBroadcasterWakuCoreBase {\n static hasError = false;\n static restartCallback: () => void;\n\n static waku: Optional<LightNode>;\n\n protected static pubSubTopic = WAKU_RAILGUN_PUB_SUB_TOPIC;\n protected static additionalDirectPeers: string[] = [];\n protected static peerDiscoveryTimeout = 60000;\n protected static defaultShard = WAKU_RAILGUN_DEFAULT_SHARD;\n public static restartCount = 0;\n\n static async initWaku(chain: Chain): Promise<void> {\n try {\n await this.connect();\n if (!this.waku) {\n BroadcasterDebug.log('No waku instance found');\n return;\n }\n WakuObservers.resetCurrentChain();\n await WakuObservers.setObserversForChain(\n this.waku,\n chain,\n );\n\n this.pollHistoricalTopics()\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 async pollHistoricalTopics() {\n BroadcasterDebug.log(\"Polling historical messages\")\n const topics = WakuObservers.getCurrentContentTopics();\n for (const topic of topics) {\n await this.retrieveHistoricalForTopic(topic);\n }\n await delay(10_000)\n }\n\n static setWakuRestartCallback(callback: () => void) {\n this.restartCallback = callback;\n }\n\n static async reinitWaku(chain: Chain) {\n if (\n isDefined(this.waku) &&\n this.waku.isStarted()\n ) {\n // Reset fees, which will reset status to \"Searching\".\n await this.disconnect();\n }\n BroadcasterFeeCache.resetCache(chain);\n BroadcasterDebug.log(\n `Reinit Waku, ${++this.restartCount}`,\n );\n await this.initWaku(chain);\n if (this.restartCallback) {\n this.restartCallback();\n }\n }\n\n static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions) {\n BroadcasterConfig.trustedFeeSigner = broadcasterOptions.trustedFeeSigner;\n\n if (isDefined(broadcasterOptions.pubSubTopic)) {\n this.pubSubTopic = broadcasterOptions.pubSubTopic;\n }\n if (broadcasterOptions.additionalDirectPeers) {\n this.additionalDirectPeers =\n broadcasterOptions.additionalDirectPeers;\n }\n if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {\n this.peerDiscoveryTimeout =\n broadcasterOptions.peerDiscoveryTimeout;\n }\n if (isDefined(broadcasterOptions.feeExpirationTimeout)) {\n BroadcasterConfig.feeExpirationTimeout =\n broadcasterOptions.feeExpirationTimeout;\n }\n if (isDefined(broadcasterOptions.historicalLookBackTime)) {\n BroadcasterConfig.historicalLookBackTime = broadcasterOptions.historicalLookBackTime\n }\n }\n\n static async disconnect() {\n await WakuObservers.unsubscribe(this.waku);\n await this.waku?.stop();\n this.waku = undefined;\n }\n\n protected static connect(): Promise<void> {\n throw new Error(\"Method 'connect' must be implemented.\");\n }\n\n static getMeshPeerCount(): number {\n return 0;\n }\n\n static getPubSubPeerCount(): number {\n return 0;\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n if (!this.waku) return 0;\n return this.waku.libp2p.getConnections().length;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n if (!this.waku) return 0;\n return this.waku.libp2p.getConnections().length;\n }\n\n\n\n static async broadcastMessage(data: object, topic: string): Promise<void> {\n if (!this.waku) {\n throw new Error('Waku not initialized');\n }\n const encoder = createEncoder({\n contentTopic: topic,\n routingInfo: WAKU_RAILGUN_DEFAULT_SHARD\n });\n\n const payload = utf8ToBytes(JSON.stringify(data));\n\n const result = await this.waku.lightPush.send(encoder, {\n payload,\n });\n\n if (result.failures && result.failures.length > 0) {\n throw new Error(`Failed to send message: ${result.failures.map(f => f.error).join(', ')}`);\n }\n }\n\n static async retrieveHistoricalForTopic(topic: string): Promise<void> {\n if (!this.waku) {\n return;\n }\n\n const callback = WakuObservers.getCallbackForTopic(topic);\n if (!callback) {\n BroadcasterDebug.log(`No callback found for topic: ${topic}`);\n return;\n }\n\n const decoder = createDecoder(topic, WAKU_RAILGUN_DEFAULT_SHARD);\n\n try {\n const startTime = new Date()\n // TODO: make a variable\n startTime.setTime(Date.now() - (BroadcasterConfig.historicalLookBackTime))\n const endTime = new Date(Date.now())\n const options: QueryRequestParams = {\n includeData: true,\n pubsubTopic: this.pubSubTopic,\n contentTopics: [topic],\n paginationForward: true,\n }\n const lastMessage = WakuObservers.getLastMessage(topic);\n if (lastMessage) {\n const cursor = this.waku.store.createCursor(lastMessage)\n options.paginationCursor = cursor\n } else {\n options.timeStart = startTime\n options.timeEnd = endTime\n }\n const generator = this.waku.store.queryGenerator([decoder], options);\n for await (const messagesPromises of generator) {\n messagesPromises.reverse()\n for (const messagePromise of messagesPromises) {\n if (isDefined(messagePromise)) {\n const message = await messagePromise\n if (isDefined(message)) {\n callback(message);\n }\n }\n }\n }\n } catch (err) {\n if (err instanceof Error) {\n BroadcasterDebug.log(\n `Error retrieving historical messages: ${err.message}`,\n );\n }\n }\n }\n}\n"]}
@@ -1,25 +1,4 @@
1
- import { Chain } from '@railgun-community/shared-models';
2
- import { type RelayNode } from '@waku/interfaces';
3
- import { BroadcasterOptions } from '../models/index.js';
4
- export declare class WakuBroadcasterWakuCore {
5
- static hasError: boolean;
6
- static restartCallback: () => void;
7
- static waku: Optional<RelayNode>;
8
- private static pubSubTopic;
9
- private static additionalDirectPeers;
10
- private static peerDiscoveryTimeout;
11
- private static defaultShard;
12
- static restartCount: number;
13
- static initWaku: (chain: Chain) => Promise<void>;
14
- static setWakuRestartCallback: (callback: () => void) => void;
15
- static reinitWaku: (chain: Chain) => Promise<void>;
16
- static setBroadcasterOptions(broadcasterOptions: BroadcasterOptions): void;
17
- static disconnect: () => Promise<void>;
18
- private static connect;
19
- static getMeshPeerCount(): number;
20
- static getPubSubPeerCount(): number;
21
- static getLightPushPeerCount(): Promise<number>;
22
- static getFilterPeerCount(): Promise<number>;
23
- private static waitForRemotePeer;
24
- static broadcastMessage(data: object, contentTopic: string): Promise<void>;
1
+ import { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';
2
+ export declare class WakuBroadcasterWakuCore extends WakuBroadcasterWakuCoreBase {
3
+ protected static connect(): Promise<void>;
25
4
  }
@@ -1,150 +1,47 @@
1
- import { promiseTimeout } from '@railgun-community/shared-models';
2
- import { WakuObservers } from './waku-observers.js';
1
+ import { createLightNode, Protocols } from '@waku/sdk';
3
2
  import { BroadcasterDebug } from '../utils/broadcaster-debug.js';
4
- import { utf8ToBytes } from '../utils/conversion.js';
5
- import { isDefined } from '../utils/is-defined.js';
6
- import { Protocols } from '@waku/interfaces';
7
- import { createEncoder } from '@waku/core';
8
- import { WAKU_RAILGUN_DEFAULT_PEERS_WEB, WAKU_RAILGUN_PUB_SUB_TOPIC, WAKU_RAILGUN_DEFAULT_SHARD, WAKU_RAILGUN_DEFAULT_SHARDS, } from '../models/constants.js';
9
- import { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';
10
- import { createRelayNode } from '@waku/relay';
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) => {
3
+ import { WakuBroadcasterWakuCoreBase } from './waku-broadcaster-waku-core-base.js';
4
+ import { enrTree, wakuDnsDiscovery } from '@waku/discovery';
5
+ import { BroadcasterConfig } from '../models/broadcaster-config.js';
6
+ import { isDefined } from '@railgun-community/shared-models';
7
+ export class WakuBroadcasterWakuCore extends WakuBroadcasterWakuCoreBase {
8
+ static async connect() {
21
9
  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
- BroadcasterFeeCache.resetCache(chain);
47
- BroadcasterDebug.log(`Reinit Waku, ${++WakuBroadcasterWakuCore.restartCount}`);
48
- await WakuBroadcasterWakuCore.initWaku(chain);
49
- if (WakuBroadcasterWakuCore.restartCallback) {
50
- WakuBroadcasterWakuCore.restartCallback();
51
- }
52
- };
53
- static setBroadcasterOptions(broadcasterOptions) {
54
- if (isDefined(broadcasterOptions.pubSubTopic)) {
55
- WakuBroadcasterWakuCore.pubSubTopic = broadcasterOptions.pubSubTopic;
56
- }
57
- if (broadcasterOptions.additionalDirectPeers) {
58
- WakuBroadcasterWakuCore.additionalDirectPeers =
59
- broadcasterOptions.additionalDirectPeers;
60
- }
61
- if (isDefined(broadcasterOptions.peerDiscoveryTimeout)) {
62
- WakuBroadcasterWakuCore.peerDiscoveryTimeout =
63
- broadcasterOptions.peerDiscoveryTimeout;
64
- }
65
- }
66
- static disconnect = async () => {
67
- await WakuBroadcasterWakuCore.waku?.stop();
68
- WakuBroadcasterWakuCore.waku = undefined;
69
- };
70
- static connect = async () => {
71
- try {
72
- WakuBroadcasterWakuCore.hasError = false;
10
+ this.hasError = false;
73
11
  BroadcasterDebug.log(`Creating waku broadcast client`);
74
- const bootstrapPeers = [
75
- ...WAKU_RAILGUN_DEFAULT_PEERS_WEB,
76
- ...this.additionalDirectPeers,
77
- ];
78
- const waku = await createRelayNode({
79
- networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,
80
- bootstrapPeers,
12
+ const libp2pOptions = {
13
+ hideWebSocketInfo: true,
14
+ };
15
+ if (BroadcasterConfig.useDNSDiscovery) {
16
+ const enrTreePeers = [];
17
+ if (isDefined(BroadcasterConfig.customDNS)) {
18
+ enrTreePeers.push(...BroadcasterConfig.customDNS.enrTreePeers);
19
+ if (!BroadcasterConfig.customDNS.onlyCustom) {
20
+ enrTreePeers.push(...[enrTree["SANDBOX"], enrTree["TEST"]]);
21
+ }
22
+ }
23
+ libp2pOptions.peerDiscovery = [
24
+ wakuDnsDiscovery(enrTreePeers),
25
+ ];
26
+ }
27
+ this.waku = await createLightNode({
28
+ defaultBootstrap: true,
29
+ libp2p: libp2pOptions
81
30
  });
82
31
  BroadcasterDebug.log('Start Waku.');
83
- await waku.start();
32
+ await this.waku.start();
84
33
  BroadcasterDebug.log('Waiting for remote peer.');
85
- await this.waitForRemotePeer(waku);
86
- if (!isDefined(waku.relay)) {
87
- throw new Error('No Waku relay instantiated.');
88
- }
89
- BroadcasterDebug.log('Waku peers:');
90
- for (const peer of waku.libp2p.getPeers()) {
91
- BroadcasterDebug.log(JSON.stringify(peer));
92
- }
34
+ await this.waku.waitForPeers([Protocols.Filter, Protocols.LightPush, Protocols.Store], this.peerDiscoveryTimeout);
93
35
  BroadcasterDebug.log('Connected to Waku');
94
- WakuBroadcasterWakuCore.waku = waku;
95
- WakuBroadcasterWakuCore.hasError = false;
36
+ this.hasError = false;
96
37
  }
97
38
  catch (err) {
98
39
  if (!(err instanceof Error)) {
99
40
  throw err;
100
41
  }
101
- WakuBroadcasterWakuCore.hasError = true;
42
+ this.hasError = true;
102
43
  throw err;
103
44
  }
104
- };
105
- static getMeshPeerCount() {
106
- return WakuBroadcasterWakuCore.getPubSubPeerCount();
107
- }
108
- static getPubSubPeerCount() {
109
- const peers = WakuBroadcasterWakuCore.waku?.libp2p.getPeers() ?? [];
110
- return peers.length;
111
- }
112
- static async getLightPushPeerCount() {
113
- return 0;
114
- }
115
- static async getFilterPeerCount() {
116
- return 0;
117
- }
118
- static async waitForRemotePeer(waku) {
119
- try {
120
- const protocols = [Protocols.Relay];
121
- await promiseTimeout(waku.waitForPeers(protocols), WakuBroadcasterWakuCore.peerDiscoveryTimeout);
122
- }
123
- catch (err) {
124
- if (!(err instanceof Error)) {
125
- throw err;
126
- }
127
- BroadcasterDebug.error(err);
128
- throw new Error(err.message);
129
- }
130
- }
131
- static async broadcastMessage(data, contentTopic) {
132
- const dataString = JSON.stringify(data);
133
- const payload = utf8ToBytes(dataString);
134
- const message = { payload };
135
- try {
136
- const encoder = createEncoder({
137
- contentTopic,
138
- pubsubTopicShardInfo: this.defaultShard,
139
- });
140
- await WakuBroadcasterWakuCore.waku?.relay.send(encoder, message);
141
- }
142
- catch (err) {
143
- if (!(err instanceof Error)) {
144
- throw err;
145
- }
146
- BroadcasterDebug.error(err);
147
- }
148
45
  }
149
46
  }
150
47
  //# sourceMappingURL=waku-broadcaster-waku-core.js.map
@@ -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 { Protocols, IMessage, type RelayNode } from '@waku/interfaces';\nimport { createEncoder } from '@waku/core';\n\nimport { BroadcasterOptions } from '../models/index.js';\nimport {\n WAKU_RAILGUN_DEFAULT_PEERS_WEB,\n WAKU_RAILGUN_PUB_SUB_TOPIC,\n WAKU_RAILGUN_DEFAULT_SHARD,\n WAKU_RAILGUN_DEFAULT_SHARDS,\n} from '../models/constants.js';\nimport { BroadcasterFeeCache } from '../fees/broadcaster-fee-cache.js';\nimport { createRelayNode } from '@waku/relay';\nexport class WakuBroadcasterWakuCore {\n static hasError = false;\n static restartCallback: () => void;\n\n static waku: Optional<RelayNode>;\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\n BroadcasterFeeCache.resetCache(chain);\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_WEB,\n ...this.additionalDirectPeers,\n ];\n const waku = await createRelayNode({\n networkConfig: WAKU_RAILGUN_DEFAULT_SHARDS,\n bootstrapPeers,\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 WakuBroadcasterWakuCore.getPubSubPeerCount();\n }\n\n static getPubSubPeerCount(): number {\n const peers = WakuBroadcasterWakuCore.waku?.libp2p.getPeers() ?? [];\n return peers.length;\n }\n\n static async getLightPushPeerCount(): Promise<number> {\n return 0;\n }\n\n static async getFilterPeerCount(): Promise<number> {\n return 0;\n }\n\n private static async waitForRemotePeer(waku: RelayNode) {\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,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;YAEvD,MAAM,aAAa,GAAwB;gBACzC,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;YAED,IAAI,CAAC,IAAI,GAAG,MAAM,eAAe,CAAC;gBAChC,gBAAgB,EAAE,IAAI;gBACtB,MAAM,EAAE,aAAa;aACtB,CAAC,CAAC;YAEH,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACpC,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,mBAAmB,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF","sourcesContent":["import { 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\n const libp2pOptions: CreateLibp2pOptions = {\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\n this.waku = await createLightNode({\n defaultBootstrap: true,\n libp2p: libp2pOptions\n });\n\n BroadcasterDebug.log('Start Waku.');\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('Connected to Waku');\n this.hasError = false;\n } catch (err) {\n if (!(err instanceof Error)) {\n throw err;\n }\n this.hasError = true;\n throw err;\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":"AAAA,OAAO,EAAS,aAAa,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQ3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAapE,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,YAAY,CAAkB;IACrC,MAAM,CAAC,oBAAoB,GAAa,EAAE,CAAC;IAC3C,MAAM,CAAC,oBAAoB,GAAqC,EAAE,CAAC;IAE3E,MAAM,CAAC,oBAAoB,GAAG,KAAK,EACjC,IAAyB,EACzB,KAAY,EACZ,EAAE;QACF,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,IACE,aAAa,CAAC,YAAY;YAC1B,aAAa,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,EAChD;YACA,OAAO;SACR;QACD,gBAAgB,CAAC,GAAG,CAClB,iCAAiC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAC1D,CAAC;QACF,aAAa,CAAC,YAAY,GAAG,KAAK,CAAC;QACnC,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEpC,gBAAgB,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,gBAAgB,CAAC,GAAG,CAClB,uCAAuC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAChE,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,CAAC,iBAAiB,GAAG,GAAG,EAAE;QAC9B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,CAAC,wBAAwB,GAAG,KAAK,EAAE,IAAyB,EAAE,EAAE;QACpE,gBAAgB,CAAC,GAAG,CAElB,uBAAuB,IAAI,EAAE,MAAM,CAAC,eAAe,EAAE,EAAE,CACxD,CAAC;QACF,IAAI,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;YACxC,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1C,gBAAgB,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;aAElD;SACF;QACD,MAAM,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;IAEM,MAAM,CAAC,kBAAkB,GAAG,KAAK,EAAE,IAAyB,EAAE,EAAE;QACtE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YAC3B,OAAO;SACR;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;YACxC,KAAK,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE;gBAC/D,IAAI,WAAW,YAAY,QAAQ,EAAE;oBACnC,MAAM,WAAW,EAAE,CAAC;iBACrB;qBAAM;oBACL,MAAM,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;iBAC7D;aACF;YACD,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;SAChC;IACH,CAAC,CAAC;IAEM,MAAM,CAAC,mBAAmB,GAAG,CAAC,KAAY,EAAE,EAAE;QACpD,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,4BAA4B,GAAG,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,aAAa,CAC/B,gBAAgB,EAChB,0BAA0B,CAC3B,CAAC;QACF,MAAM,uBAAuB,GAAG,aAAa,CAC3C,4BAA4B,EAC5B,0BAA0B,CAC3B,CAAC;QACF,MAAM,YAAY,GAAG,CAAC,OAAiB,EAAE,EAAE,CACzC,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjE,MAAM,wBAAwB,GAC5B,2BAA2B,CAAC,2CAA2C,CAAC;QAE1E,MAAM,sBAAsB,GAAG;YAC7B,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,YAAY;SACvB,CAAC;QACF,MAAM,kCAAkC,GAAG;YACzC,KAAK,EAAE,4BAA4B;YACnC,OAAO,EAAE,uBAAuB;YAChC,QAAQ,EAAE,wBAAwB;SACnC,CAAC;QACF,OAAO,CAAC,sBAAsB,EAAE,kCAAkC,CAAC,CAAC;IACtE,CAAC,CAAC;IAEM,MAAM,CAAC,iBAAiB,GAAG,KAAK,EAAE,IAAe,EAAE,KAAY,EAAE,EAAE;QACzE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC1B,OAAO;SACR;QAED,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CACvE,GAAG,CAAC,EAAE;YACJ,gBAAgB,CAAC,GAAG,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,OAAO,SAAS,CAAC;QACnB,CAAC,CACF,CAAC;QAEF,MAAM,oBAAoB,GAAG,aAAa,CAAC,uBAAuB,EAAE,CAAC;QACrE,gBAAgB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC7C,KAAK,MAAM,QAAQ,IAAI,oBAAoB,EAAE;YAC3C,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SAChC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,wBAAwB,CACnC,IAAyB,EACzB,KAAa,EACb,QAAgC;QAEhC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YACpB,gBAAgB,CAAC,GAAG,CAClB,2DAA2D,CAC5D,CAAC;YACF,OAAO;SACR;QACD,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAuB;YACjC,KAAK,EAAE,cAAc;YACrB,OAAO;YACP,QAAQ;SACT,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAC3D,OAAO,EACP,QAAQ,CACT,CAAC;QACF,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC;YAC9B,WAAW;YACX,MAAM;SACP,CAAC,CAAC;QACH,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,gBAAgB,CACnC,KAAsB,EACtB,IAAyB;QAEzB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YACzC,gBAAgB,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YACnE,OAAO;SACR;QACD,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAC7B,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CACpD,CAAC;QACF,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE;YACvC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;YACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAC3D,OAAO,EACP,QAAQ,CACT,CAAC;YACF,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC;gBAC9B,WAAW;gBACX,MAAM;aACP,CAAC,CAAC;SACJ;IACH,CAAC;IAED,MAAM,CAAC,uBAAuB;QAC5B,OAAO,aAAa,CAAC,oBAAoB,CAAC;IAC5C,CAAC","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
  }