@waku/core 0.0.36-f911bf8.0 → 0.0.37-2ed5ddc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/bundle/index.js +5647 -1359
- package/bundle/lib/message/version_0.js +1 -2
- package/bundle/{version_0-CiYGrPc2.js → version_0-Bc0h7ah2.js} +1886 -31
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/connection_manager/connection_limiter.d.ts +35 -0
- package/dist/lib/connection_manager/connection_limiter.js +103 -0
- package/dist/lib/connection_manager/connection_limiter.js.map +1 -0
- package/dist/lib/connection_manager/connection_manager.d.ts +19 -104
- package/dist/lib/connection_manager/connection_manager.js +64 -499
- package/dist/lib/connection_manager/connection_manager.js.map +1 -1
- package/dist/lib/connection_manager/discovery_dialer.d.ts +32 -0
- package/dist/lib/connection_manager/discovery_dialer.js +131 -0
- package/dist/lib/connection_manager/discovery_dialer.js.map +1 -0
- package/dist/lib/connection_manager/keep_alive_manager.d.ts +17 -7
- package/dist/lib/connection_manager/keep_alive_manager.js +110 -74
- package/dist/lib/connection_manager/keep_alive_manager.js.map +1 -1
- package/dist/lib/connection_manager/network_monitor.d.ts +22 -0
- package/dist/lib/connection_manager/network_monitor.js +63 -0
- package/dist/lib/connection_manager/network_monitor.js.map +1 -0
- package/dist/lib/connection_manager/shard_reader.d.ts +28 -0
- package/dist/lib/connection_manager/shard_reader.js +70 -0
- package/dist/lib/connection_manager/shard_reader.js.map +1 -0
- package/dist/lib/connection_manager/utils.d.ts +16 -1
- package/dist/lib/connection_manager/utils.js +23 -0
- package/dist/lib/connection_manager/utils.js.map +1 -1
- package/dist/lib/filter/filter.d.ts +7 -5
- package/dist/lib/filter/filter.js +14 -11
- package/dist/lib/filter/filter.js.map +1 -1
- package/dist/lib/light_push/light_push.d.ts +5 -5
- package/dist/lib/light_push/light_push.js +7 -7
- package/dist/lib/light_push/light_push.js.map +1 -1
- package/dist/lib/message/version_0.d.ts +3 -4
- package/dist/lib/message/version_0.js +1 -4
- package/dist/lib/message/version_0.js.map +1 -1
- package/dist/lib/message_hash/index.d.ts +1 -0
- package/dist/lib/message_hash/index.js +2 -0
- package/dist/lib/message_hash/index.js.map +1 -0
- package/dist/lib/message_hash/message_hash.d.ts +52 -0
- package/dist/lib/message_hash/message_hash.js +84 -0
- package/dist/lib/message_hash/message_hash.js.map +1 -0
- package/dist/lib/metadata/metadata.js +6 -4
- package/dist/lib/metadata/metadata.js.map +1 -1
- package/dist/lib/store/rpc.js +16 -10
- package/dist/lib/store/rpc.js.map +1 -1
- package/dist/lib/store/store.d.ts +5 -5
- package/dist/lib/store/store.js +19 -9
- package/dist/lib/store/store.js.map +1 -1
- package/dist/lib/stream_manager/stream_manager.d.ts +3 -4
- package/dist/lib/stream_manager/stream_manager.js +6 -8
- package/dist/lib/stream_manager/stream_manager.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -0
- package/src/lib/connection_manager/connection_limiter.ts +161 -0
- package/src/lib/connection_manager/connection_manager.ts +87 -668
- package/src/lib/connection_manager/discovery_dialer.ts +195 -0
- package/src/lib/connection_manager/keep_alive_manager.ts +154 -87
- package/src/lib/connection_manager/network_monitor.ts +88 -0
- package/src/lib/connection_manager/shard_reader.ts +134 -0
- package/src/lib/connection_manager/utils.ts +27 -1
- package/src/lib/filter/filter.ts +26 -15
- package/src/lib/light_push/light_push.ts +9 -10
- package/src/lib/message/version_0.ts +3 -7
- package/src/lib/message_hash/index.ts +1 -0
- package/src/lib/message_hash/message_hash.ts +106 -0
- package/src/lib/metadata/metadata.ts +8 -5
- package/src/lib/store/rpc.ts +23 -19
- package/src/lib/store/store.ts +22 -11
- package/src/lib/stream_manager/stream_manager.ts +8 -6
- package/bundle/base_protocol-DvQrudwy.js +0 -152
- package/bundle/index-CTo1my9M.js +0 -1543
- package/bundle/lib/base_protocol.js +0 -2
- package/dist/lib/base_protocol.d.ts +0 -18
- package/dist/lib/base_protocol.js +0 -25
- package/dist/lib/base_protocol.js.map +0 -1
- package/src/lib/base_protocol.ts +0 -44
package/dist/lib/store/store.js
CHANGED
@@ -3,20 +3,24 @@ import all from "it-all";
|
|
3
3
|
import * as lp from "it-length-prefixed";
|
4
4
|
import { pipe } from "it-pipe";
|
5
5
|
import { Uint8ArrayList } from "uint8arraylist";
|
6
|
-
import {
|
6
|
+
import { StreamManager } from "../stream_manager/index.js";
|
7
7
|
import { toProtoMessage } from "../to_proto_message.js";
|
8
8
|
import { DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE, StoreQueryRequest, StoreQueryResponse } from "./rpc.js";
|
9
9
|
const log = new Logger("store");
|
10
10
|
export const StoreCodec = "/vac/waku/store-query/3.0.0";
|
11
|
-
export class StoreCore
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
this.
|
11
|
+
export class StoreCore {
|
12
|
+
streamManager;
|
13
|
+
multicodec = StoreCodec;
|
14
|
+
constructor(libp2p) {
|
15
|
+
this.streamManager = new StreamManager(StoreCodec, libp2p.components);
|
16
16
|
}
|
17
17
|
async *queryPerPage(queryOpts, decoders, peerId) {
|
18
|
-
|
19
|
-
|
18
|
+
// Only validate decoder content topics for content-filtered queries
|
19
|
+
const isHashQuery = queryOpts.messageHashes && queryOpts.messageHashes.length > 0;
|
20
|
+
if (!isHashQuery &&
|
21
|
+
queryOpts.contentTopics &&
|
22
|
+
queryOpts.contentTopics.toString() !==
|
23
|
+
Array.from(decoders.keys()).toString()) {
|
20
24
|
throw new Error("Internal error, the decoders should match the query's content topics");
|
21
25
|
}
|
22
26
|
let currentCursor = queryOpts.paginationCursor;
|
@@ -25,9 +29,15 @@ export class StoreCore extends BaseProtocol {
|
|
25
29
|
...queryOpts,
|
26
30
|
paginationCursor: currentCursor
|
27
31
|
});
|
32
|
+
log.info("Sending store query request:", {
|
33
|
+
hasMessageHashes: !!queryOpts.messageHashes?.length,
|
34
|
+
messageHashCount: queryOpts.messageHashes?.length,
|
35
|
+
pubsubTopic: queryOpts.pubsubTopic,
|
36
|
+
contentTopics: queryOpts.contentTopics
|
37
|
+
});
|
28
38
|
let stream;
|
29
39
|
try {
|
30
|
-
stream = await this.getStream(peerId);
|
40
|
+
stream = await this.streamManager.getStream(peerId);
|
31
41
|
}
|
32
42
|
catch (e) {
|
33
43
|
log.error("Failed to get stream", e);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/lib/store/store.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/lib/store/store.ts"],"names":[],"mappings":"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"}
|
@@ -1,13 +1,12 @@
|
|
1
1
|
import type { PeerId, Stream } from "@libp2p/interface";
|
2
|
-
import type {
|
2
|
+
import type { Libp2pComponents } from "@waku/interfaces";
|
3
3
|
export declare class StreamManager {
|
4
4
|
private multicodec;
|
5
|
-
private
|
6
|
-
private addEventListener;
|
5
|
+
private readonly libp2p;
|
7
6
|
private readonly log;
|
8
7
|
private ongoingCreation;
|
9
8
|
private streamPool;
|
10
|
-
constructor(multicodec: string,
|
9
|
+
constructor(multicodec: string, libp2p: Libp2pComponents);
|
11
10
|
getStream(peerId: PeerId): Promise<Stream>;
|
12
11
|
private createStream;
|
13
12
|
private createStreamWithLock;
|
@@ -3,17 +3,15 @@ import { selectOpenConnection } from "./utils.js";
|
|
3
3
|
const STREAM_LOCK_KEY = "consumed";
|
4
4
|
export class StreamManager {
|
5
5
|
multicodec;
|
6
|
-
|
7
|
-
addEventListener;
|
6
|
+
libp2p;
|
8
7
|
log;
|
9
8
|
ongoingCreation = new Set();
|
10
9
|
streamPool = new Map();
|
11
|
-
constructor(multicodec,
|
10
|
+
constructor(multicodec, libp2p) {
|
12
11
|
this.multicodec = multicodec;
|
13
|
-
this.
|
14
|
-
this.addEventListener = addEventListener;
|
12
|
+
this.libp2p = libp2p;
|
15
13
|
this.log = new Logger(`stream-manager:${multicodec}`);
|
16
|
-
this.addEventListener("peer:update", this.handlePeerUpdateStreamPool);
|
14
|
+
this.libp2p.events.addEventListener("peer:update", this.handlePeerUpdateStreamPool);
|
17
15
|
}
|
18
16
|
async getStream(peerId) {
|
19
17
|
const peerIdStr = peerId.toString();
|
@@ -33,7 +31,7 @@ export class StreamManager {
|
|
33
31
|
return stream;
|
34
32
|
}
|
35
33
|
async createStream(peerId, retries = 0) {
|
36
|
-
const connections = this.getConnections(peerId);
|
34
|
+
const connections = this.libp2p.connectionManager.getConnections(peerId);
|
37
35
|
const connection = selectOpenConnection(connections);
|
38
36
|
if (!connection) {
|
39
37
|
throw new Error(`Failed to get a connection to the peer peerId=${peerId.toString()} multicodec=${this.multicodec}`);
|
@@ -94,7 +92,7 @@ export class StreamManager {
|
|
94
92
|
this.streamPool.set(peer.id.toString(), this.createStreamWithLock(peer));
|
95
93
|
}
|
96
94
|
getOpenStreamForCodec(peerId) {
|
97
|
-
const connections = this.getConnections(peerId);
|
95
|
+
const connections = this.libp2p.connectionManager.getConnections(peerId);
|
98
96
|
const connection = selectOpenConnection(connections);
|
99
97
|
if (!connection) {
|
100
98
|
return;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"stream_manager.js","sourceRoot":"","sources":["../../../src/lib/stream_manager/stream_manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,eAAe,GAAG,UAAU,CAAC;AAEnC,MAAM,OAAO,aAAa;IAOd;
|
1
|
+
{"version":3,"file":"stream_manager.js","sourceRoot":"","sources":["../../../src/lib/stream_manager/stream_manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@waku/core","version":"0.0.
|
1
|
+
{"name":"@waku/core","version":"0.0.37-2ed5ddc.0","description":"TypeScript implementation of the Waku v2 protocol","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./lib/message/version_0":{"types":"./dist/lib/message/version_0.d.ts","import":"./dist/lib/message/version_0.js"}},"typesVersions":{"*":{"lib/*":["dist/lib/*"],"constants/*":["dist/constants/*"]}},"type":"module","homepage":"https://github.com/waku-org/js-waku/tree/master/packages/core#readme","repository":{"type":"git","url":"https://github.com/waku-org/js-waku.git"},"bugs":{"url":"https://github.com/waku-org/js-waku/issues"},"license":"MIT OR Apache-2.0","keywords":["waku","decentralised","communication","web3","ethereum","dapps"],"scripts":{"build":"run-s build:**","build:esm":"tsc","build:bundle":"rollup --config rollup.config.js","fix":"run-s fix:*","fix:lint":"eslint src *.js --fix","check":"run-s check:*","check:tsc":"tsc -p tsconfig.dev.json","check:lint":"eslint src *.js","check:spelling":"cspell \"{README.md,src/**/*.ts}\"","test":"NODE_ENV=test run-s test:*","test:node":"NODE_ENV=test TS_NODE_PROJECT=./tsconfig.dev.json mocha","test:browser":"NODE_ENV=test karma start karma.conf.cjs","watch:build":"tsc -p tsconfig.json -w","watch:test":"mocha --watch","prepublish":"npm run build","reset-hard":"git clean -dfx -e .idea && git reset --hard && npm i && npm run build"},"engines":{"node":">=22"},"dependencies":{"@waku/enr":"0.0.31-2ed5ddc.0","@waku/interfaces":"0.0.32-2ed5ddc.0","@libp2p/ping":"2.0.35","@waku/proto":"0.0.12-2ed5ddc.0","@waku/utils":"0.0.25-2ed5ddc.0","debug":"^4.3.4","@noble/hashes":"^1.3.2","it-all":"^3.0.4","it-length-prefixed":"^9.0.4","it-pipe":"^3.0.1","uint8arraylist":"^2.4.3","uuid":"^9.0.0"},"devDependencies":{"@libp2p/peer-id":"5.1.7","@libp2p/interface":"2.10.4","@multiformats/multiaddr":"^12.0.0","@rollup/plugin-commonjs":"^25.0.7","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.3","@types/chai":"^4.3.11","@types/debug":"^4.1.12","@types/mocha":"^10.0.6","@types/uuid":"^9.0.8","@waku/build-utils":"*","chai":"^4.3.10","sinon":"^18.0.0","cspell":"^8.6.1","fast-check":"^3.19.0","ignore-loader":"^0.1.2","isomorphic-fetch":"^3.0.0","mocha":"^10.3.0","npm-run-all":"^4.1.5","process":"^0.11.10","rollup":"^4.12.0"},"peerDependencies":{"@multiformats/multiaddr":"^12.0.0","libp2p":"2.8.11"},"peerDependenciesMeta":{"@multiformats/multiaddr":{"optional":true},"libp2p":{"optional":true}},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"]}
|
package/src/index.ts
CHANGED
@@ -20,3 +20,5 @@ export { ConnectionManager } from "./lib/connection_manager/index.js";
|
|
20
20
|
export { StreamManager } from "./lib/stream_manager/index.js";
|
21
21
|
|
22
22
|
export { MetadataCodec, wakuMetadata } from "./lib/metadata/index.js";
|
23
|
+
|
24
|
+
export { messageHash, messageHashStr } from "./lib/message_hash/index.js";
|
@@ -0,0 +1,161 @@
|
|
1
|
+
import { Peer, PeerId } from "@libp2p/interface";
|
2
|
+
import { ConnectionManagerOptions, Libp2p, Tags } from "@waku/interfaces";
|
3
|
+
import { Logger } from "@waku/utils";
|
4
|
+
|
5
|
+
const log = new Logger("connection-limiter");
|
6
|
+
|
7
|
+
type Libp2pEventHandler<T> = (e: CustomEvent<T>) => void;
|
8
|
+
|
9
|
+
type ConnectionLimiterConstructorOptions = {
|
10
|
+
libp2p: Libp2p;
|
11
|
+
options: ConnectionManagerOptions;
|
12
|
+
};
|
13
|
+
|
14
|
+
interface IConnectionLimiter {
|
15
|
+
/**
|
16
|
+
* Dial all known peers because libp2p might have emitted `peer:discovery` before initialization
|
17
|
+
* and listen to `peer:connect` and `peer:disconnect` events to manage connections.
|
18
|
+
*/
|
19
|
+
start(): void;
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Stop listening to `peer:connect` and `peer:disconnect` events.
|
23
|
+
*/
|
24
|
+
stop(): void;
|
25
|
+
}
|
26
|
+
|
27
|
+
/**
|
28
|
+
* This class is responsible for limiting the number of connections to peers.
|
29
|
+
* It also dials all known peers because libp2p might have emitted `peer:discovery` before initialization
|
30
|
+
* and listen to `peer:connect` and `peer:disconnect` events to manage connections.
|
31
|
+
*/
|
32
|
+
export class ConnectionLimiter implements IConnectionLimiter {
|
33
|
+
private readonly libp2p: Libp2p;
|
34
|
+
private readonly options: ConnectionManagerOptions;
|
35
|
+
|
36
|
+
public constructor(options: ConnectionLimiterConstructorOptions) {
|
37
|
+
this.libp2p = options.libp2p;
|
38
|
+
this.options = options.options;
|
39
|
+
|
40
|
+
this.onConnectedEvent = this.onConnectedEvent.bind(this);
|
41
|
+
this.onDisconnectedEvent = this.onDisconnectedEvent.bind(this);
|
42
|
+
}
|
43
|
+
|
44
|
+
public start(): void {
|
45
|
+
// dial all known peers because libp2p might have emitted `peer:discovery` before initialization
|
46
|
+
void this.dialPeersFromStore();
|
47
|
+
|
48
|
+
this.libp2p.addEventListener(
|
49
|
+
"peer:connect",
|
50
|
+
this.onConnectedEvent as Libp2pEventHandler<PeerId>
|
51
|
+
);
|
52
|
+
|
53
|
+
/**
|
54
|
+
* NOTE: Event is not being emitted on closing nor losing a connection.
|
55
|
+
* @see https://github.com/libp2p/js-libp2p/issues/939
|
56
|
+
* @see https://github.com/status-im/js-waku/issues/252
|
57
|
+
*
|
58
|
+
* >This event will be triggered anytime we are disconnected from another peer,
|
59
|
+
* >regardless of the circumstances of that disconnection.
|
60
|
+
* >If we happen to have multiple connections to a peer,
|
61
|
+
* >this event will **only** be triggered when the last connection is closed.
|
62
|
+
* @see https://github.com/libp2p/js-libp2p/blob/bad9e8c0ff58d60a78314077720c82ae331cc55b/doc/API.md?plain=1#L2100
|
63
|
+
*/
|
64
|
+
this.libp2p.addEventListener(
|
65
|
+
"peer:disconnect",
|
66
|
+
this.onDisconnectedEvent as Libp2pEventHandler<PeerId>
|
67
|
+
);
|
68
|
+
}
|
69
|
+
|
70
|
+
public stop(): void {
|
71
|
+
this.libp2p.removeEventListener(
|
72
|
+
"peer:connect",
|
73
|
+
this.onConnectedEvent as Libp2pEventHandler<PeerId>
|
74
|
+
);
|
75
|
+
|
76
|
+
this.libp2p.removeEventListener(
|
77
|
+
"peer:disconnect",
|
78
|
+
this.onDisconnectedEvent as Libp2pEventHandler<PeerId>
|
79
|
+
);
|
80
|
+
}
|
81
|
+
|
82
|
+
private async onConnectedEvent(evt: CustomEvent<PeerId>): Promise<void> {
|
83
|
+
log.info(`Connected to peer ${evt.detail.toString()}`);
|
84
|
+
|
85
|
+
const peerId = evt.detail;
|
86
|
+
|
87
|
+
const tags = await this.getTagsForPeer(peerId);
|
88
|
+
const isBootstrap = tags.includes(Tags.BOOTSTRAP);
|
89
|
+
|
90
|
+
if (!isBootstrap) {
|
91
|
+
return;
|
92
|
+
}
|
93
|
+
|
94
|
+
if (await this.hasMoreThanMaxBootstrapConnections()) {
|
95
|
+
await this.libp2p.hangUp(peerId);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
private async onDisconnectedEvent(): Promise<void> {
|
100
|
+
if (this.libp2p.getConnections().length === 0) {
|
101
|
+
await this.dialPeersFromStore();
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
private async dialPeersFromStore(): Promise<void> {
|
106
|
+
const allPeers = await this.libp2p.peerStore.all();
|
107
|
+
const allConnections = this.libp2p.getConnections();
|
108
|
+
|
109
|
+
const promises = allPeers
|
110
|
+
.filter((p) => !allConnections.some((c) => c.remotePeer.equals(p.id)))
|
111
|
+
.map((p) => this.libp2p.dial(p.id));
|
112
|
+
|
113
|
+
try {
|
114
|
+
await Promise.all(promises);
|
115
|
+
} catch (error) {
|
116
|
+
log.error(`Unexpected error while dialing peer store peers`, error);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
private async hasMoreThanMaxBootstrapConnections(): Promise<boolean> {
|
121
|
+
try {
|
122
|
+
const peers = await Promise.all(
|
123
|
+
this.libp2p
|
124
|
+
.getConnections()
|
125
|
+
.map((conn) => conn.remotePeer)
|
126
|
+
.map((id) => this.getPeer(id))
|
127
|
+
);
|
128
|
+
|
129
|
+
const bootstrapPeers = peers.filter(
|
130
|
+
(peer) => peer && peer.tags.has(Tags.BOOTSTRAP)
|
131
|
+
);
|
132
|
+
|
133
|
+
return bootstrapPeers.length > this.options.maxBootstrapPeers;
|
134
|
+
} catch (error) {
|
135
|
+
log.error(
|
136
|
+
`Unexpected error while checking for bootstrap connections`,
|
137
|
+
error
|
138
|
+
);
|
139
|
+
return false;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
private async getPeer(peerId: PeerId): Promise<Peer | null> {
|
144
|
+
try {
|
145
|
+
return await this.libp2p.peerStore.get(peerId);
|
146
|
+
} catch (error) {
|
147
|
+
log.error(`Failed to get peer ${peerId}, error: ${error}`);
|
148
|
+
return null;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
private async getTagsForPeer(peerId: PeerId): Promise<string[]> {
|
153
|
+
try {
|
154
|
+
const peer = await this.libp2p.peerStore.get(peerId);
|
155
|
+
return Array.from(peer.tags.keys());
|
156
|
+
} catch (error) {
|
157
|
+
log.error(`Failed to get peer ${peerId}, error: ${error}`);
|
158
|
+
return [];
|
159
|
+
}
|
160
|
+
}
|
161
|
+
}
|