peerbit 4.4.19 → 5.0.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,10 +1,11 @@
1
1
  import type { CircuitRelayService } from "@libp2p/circuit-relay-v2";
2
2
  import { DirectBlock } from "@peerbit/blocks";
3
3
  import { type IPeerbitKeychain } from "@peerbit/keychain";
4
- import { DirectSub } from "@peerbit/pubsub";
4
+ import { FanoutTree, TopicControlPlane } from "@peerbit/pubsub";
5
5
  import { type Libp2p, type Libp2pOptions, type ServiceFactoryMap } from "libp2p";
6
6
  export type Libp2pExtendServices = {
7
- pubsub: DirectSub;
7
+ pubsub: TopicControlPlane;
8
+ fanout: FanoutTree;
8
9
  blocks: DirectBlock;
9
10
  keychain: IPeerbitKeychain;
10
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"libp2p.d.ts","sourceRoot":"","sources":["../../src/libp2p.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAEN,KAAK,gBAAgB,EAErB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACN,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEtB,MAAM,QAAQ,CAAC;AAGhB,MAAM,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,MAAM,CAClC;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,GAAG,oBAAoB,CACpE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAC9C,OAAO,CAAC,oBAAoB,GAAG;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,CAAC,CAC7E,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,aAAa,CACrD,OAAO,CAAC,oBAAoB,GAAG;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,CAAC,CAC7E,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,mBAAmB,GAAG;IACnE,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;CAClD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAChC,OAAM,0BAML,KACC,OAAO,CAAC,cAAc,CAqDxB,CAAC"}
1
+ {"version":3,"file":"libp2p.d.ts","sourceRoot":"","sources":["../../src/libp2p.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACN,KAAK,gBAAgB,EAErB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAyB,MAAM,iBAAiB,CAAC;AACvF,OAAO,EACN,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAEtB,MAAM,QAAQ,CAAC;AAGhB,MAAM,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,MAAM,CAClC;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,GAAG,oBAAoB,CACpE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAC9C,OAAO,CAAC,oBAAoB,GAAG;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,CAAC,CAC7E,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,aAAa,CACrD,OAAO,CAAC,oBAAoB,GAAG;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAA;CAAE,CAAC,CAC7E,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,mBAAmB,GAAG;IACnE,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;CAClD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAChC,OAAM,0BAA+B,KACnC,OAAO,CAAC,cAAc,CAmExB,CAAC"}
@@ -2,18 +2,22 @@ import { noise } from "@chainsafe/libp2p-noise";
2
2
  import { yamux } from "@chainsafe/libp2p-yamux";
3
3
  import { identify } from "@libp2p/identify";
4
4
  import { DirectBlock } from "@peerbit/blocks";
5
- import { DefaultCryptoKeychain, keychain, } from "@peerbit/keychain";
6
- import { DirectSub } from "@peerbit/pubsub";
5
+ import { keychain, } from "@peerbit/keychain";
6
+ import { FanoutTree, TopicControlPlane, TopicRootControlPlane } from "@peerbit/pubsub";
7
7
  import { createLibp2p, } from "libp2p";
8
8
  import { listen, relay, transports } from "./transports.js";
9
- export const createLibp2pExtended = (opts = {
10
- services: {
11
- blocks: (c) => new DirectBlock(c),
12
- pubsub: (c) => new DirectSub(c),
13
- keychain: keychain(),
14
- },
15
- }) => {
9
+ export const createLibp2pExtended = (opts = {}) => {
10
+ const topicRootControlPlane = new TopicRootControlPlane();
16
11
  let extraServices = {};
12
+ let fanoutInstance;
13
+ const configuredFanoutFactory = opts.services?.fanout ||
14
+ ((c) => new FanoutTree(c, { connectionManager: false, topicRootControlPlane }));
15
+ const getOrCreateFanout = (c) => {
16
+ if (!fanoutInstance) {
17
+ fanoutInstance = configuredFanoutFactory(c);
18
+ }
19
+ return fanoutInstance;
20
+ };
17
21
  if (opts.services?.["relay"] === null) {
18
22
  delete opts.services?.["relay"];
19
23
  }
@@ -48,17 +52,20 @@ export const createLibp2pExtended = (opts = {
48
52
  connectionEncrypters: opts.connectionEncrypters || [noise()],
49
53
  streamMuxers: opts.streamMuxers || [yamux()],
50
54
  services: {
55
+ ...opts.services,
51
56
  pubsub: opts.services?.pubsub ||
52
- ((c) => new DirectSub(c, {
57
+ ((c) => new TopicControlPlane(c, {
53
58
  canRelayMessage: true,
59
+ topicRootControlPlane,
60
+ fanout: getOrCreateFanout(c),
54
61
  // auto dial true
55
62
  // auto prune true
56
63
  })),
64
+ fanout: (c) => getOrCreateFanout(c),
57
65
  blocks: opts.services?.blocks || ((c) => new DirectBlock(c)),
58
- keychain: opts.services?.keychain || ((c) => new DefaultCryptoKeychain()),
59
- ...opts.services,
66
+ keychain: opts.services?.keychain || keychain(),
60
67
  ...extraServices,
61
68
  },
62
- });
69
+ }).then((libp2p) => libp2p);
63
70
  };
64
71
  //# sourceMappingURL=libp2p.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../src/libp2p.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../src/libp2p.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { type AnyStore } from "@peerbit/any-store";
4
4
  import { Ed25519Keypair, PublicSignKey } from "@peerbit/crypto";
5
5
  import type { Indices } from "@peerbit/indexer-interface";
6
6
  import { type Address, type ExtractArgs, type OpenOptions, type Program, type ProgramClient, ProgramHandler } from "@peerbit/program";
7
+ import { FanoutChannel, type FanoutTreeChannelOptions, type FanoutTreeJoinOptions } from "@peerbit/pubsub";
7
8
  import { type Libp2pExtended, type PartialLibp2pCreateOptions } from "./libp2p.js";
8
9
  export declare const logger: import("@libp2p/interface").Logger;
9
10
  export type OptionalCreateOptions = {
@@ -27,6 +28,13 @@ export type CreateInstanceOptions = (SimpleLibp2pOptions | Libp2pOptions) & {
27
28
  directory?: string;
28
29
  indexer?: (directory?: string) => Promise<Indices> | Indices;
29
30
  } & OptionalCreateOptions;
31
+ export type DialReadiness = "connection" | "services" | "services-and-fanout";
32
+ export type DialOptions = {
33
+ dialTimeoutMs?: number;
34
+ serviceWaitTimeoutMs?: number;
35
+ readiness?: DialReadiness;
36
+ signal?: AbortSignal;
37
+ };
30
38
  export declare class Peerbit implements ProgramClient {
31
39
  _libp2p: Libp2pExtended;
32
40
  directory?: string;
@@ -49,7 +57,7 @@ export declare class Peerbit implements ProgramClient {
49
57
  /**
50
58
  * Dial a peer with an Ed25519 peerId
51
59
  */
52
- dial(address: string | Multiaddr | Multiaddr[] | ProgramClient): Promise<boolean>;
60
+ dial(address: string | Multiaddr | Multiaddr[] | ProgramClient, options?: DialOptions): Promise<boolean>;
53
61
  hangUp(address: PeerId | PublicSignKey | string | Multiaddr): Promise<void>;
54
62
  start(): Promise<void>;
55
63
  stop(): Promise<void>;
@@ -62,6 +70,11 @@ export declare class Peerbit implements ProgramClient {
62
70
  * @returns
63
71
  */
64
72
  open<S extends Program<ExtractArgs<S>>>(storeOrAddress: S | Address | string, options?: OpenOptions<S>): Promise<S>;
73
+ fanoutChannel(topic: string, root?: string): FanoutChannel;
74
+ fanoutResolveRoot(topic: string): Promise<string>;
75
+ fanoutOpenAsRoot(topic: string, options: Omit<FanoutTreeChannelOptions, "role">): import("@peerbit/pubsub").FanoutTreeChannelId;
76
+ fanoutJoin(topic: string, root: string, options: Omit<FanoutTreeChannelOptions, "role">, joinOpts?: FanoutTreeJoinOptions): Promise<void>;
77
+ fanoutJoinAuto(topic: string, options: Omit<FanoutTreeChannelOptions, "role">, joinOpts?: FanoutTreeJoinOptions): Promise<void>;
65
78
  get storage(): AnyStore;
66
79
  get indexer(): Indices;
67
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../src/peer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../src/peer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACN,KAAK,SAAS,EAGd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,QAAQ,EAAe,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EACN,cAAc,EAEd,aAAa,EAIb,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,cAAc,EACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,aAAa,EAIb,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAE/B,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,MAAM,oCAA6B,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAAG;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;CACzB,GAAG,qBAAqB,CAAC;AAC1B,KAAK,aAAa,GAAG;IACpB,MAAM,CAAC,EAAE,cAAc,GAAG,CAAC,0BAA0B,GAAG;QAAE,MAAM,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,CAAC;CAC5E,CAAC;AACF,KAAK,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAC/C,MAAM,MAAM,qBAAqB,GAAG,CAAC,mBAAmB,GAAG,aAAa,CAAC,GAAG;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC7D,GAAG,qBAAqB,CAAC;AAE1B,MAAM,MAAM,aAAa,GACtB,YAAY,GACZ,UAAU,GACV,qBAAqB,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAuBF,qBAAa,OAAQ,YAAW,aAAa;IAC5C,OAAO,EAAE,cAAc,CAAC;IAExB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,eAAe,CAAC,CAAkB;IAG1C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa;WAuB7C,MAAM,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;IAkQ1E,IAAI,MAAM,IAAI,cAAc,CAE3B;IAED,IAAI,QAAQ,IAAI,cAAc,CAE7B;IAED,IAAI,MAAM,WAET;IAED,IAAI,QAAQ;;;mDAEX;IAED,IAAI,OAAO,IAAI,cAAc,CAE5B;IAED,aAAa,IAAI,SAAS,EAAE;IAG5B;;OAEG;IACG,IAAI,CACT,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,EAAE,GAAG,aAAa,EACzD,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC;IA4Fb,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS;IAW3D,KAAK;IASL,IAAI;IAYJ,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE;IAgKlD;;;;;;OAMG;IAEG,IAAI,CAAC,CAAC,SAAS,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAC3C,cAAc,EAAE,CAAC,GAAG,OAAO,GAAG,MAAM,EACpC,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC1B,OAAO,CAAC,CAAC,CAAC;IAMN,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAA2C;IAOxE,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvD,gBAAgB,CACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAKzC,UAAU,CAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAC/C,QAAQ,CAAC,EAAE,qBAAqB;IAKpB,cAAc,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,EAC/C,QAAQ,CAAC,EAAE,qBAAqB;IAMjC,IAAI,OAAO,aAEV;IAED,IAAI,OAAO,YAEV;CACD"}
package/dist/src/peer.js CHANGED
@@ -3,12 +3,11 @@ import { keys } from "@libp2p/crypto";
3
3
  import { isMultiaddr, multiaddr, } from "@multiformats/multiaddr";
4
4
  import { createStore } from "@peerbit/any-store";
5
5
  import { DirectBlock } from "@peerbit/blocks";
6
- import { Ed25519Keypair, Ed25519PublicKey, PublicSignKey, Secp256k1Keypair, getKeypairFromPrivateKey, } from "@peerbit/crypto";
7
- import { create as createSQLiteIndexer } from "@peerbit/indexer-sqlite3";
6
+ import { Ed25519Keypair, Ed25519PublicKey, PublicSignKey, Secp256k1Keypair, getPublicKeyFromPeerId, getKeypairFromPrivateKey, } from "@peerbit/crypto";
8
7
  import { DefaultCryptoKeychain, keychain } from "@peerbit/keychain";
9
8
  import { logger as loggerFn } from "@peerbit/logger";
10
9
  import { ProgramHandler, } from "@peerbit/program";
11
- import { DirectSub } from "@peerbit/pubsub";
10
+ import { FanoutChannel, FanoutTree, TopicControlPlane, TopicRootControlPlane, } from "@peerbit/pubsub";
12
11
  import sodium from "libsodium-wrappers";
13
12
  import path from "path-browserify";
14
13
  import { concat } from "uint8arrays";
@@ -64,7 +63,12 @@ export class Peerbit {
64
63
  const directory = options.directory;
65
64
  const hasDir = directory != null;
66
65
  const storage = await createCache(directory != null ? path.join(directory, "/cache") : undefined);
67
- const indexerFn = options.indexer || createSQLiteIndexer;
66
+ const indexerFn = options.indexer ||
67
+ (async (directory) => {
68
+ // Lazy-import to avoid loading sqlite-wasm in browser-like runtimes/tests
69
+ const { create } = await import("@peerbit/indexer-sqlite3");
70
+ return create(directory);
71
+ });
68
72
  const indexer = directory != null
69
73
  ? await indexerFn(path.join(directory, "/index"))
70
74
  : await indexerFn();
@@ -103,13 +107,109 @@ export class Peerbit {
103
107
  ]))
104
108
  : undefined;
105
109
  }
110
+ const topicRootControlPlane = new TopicRootControlPlane();
111
+ // Keep a single FanoutTree instance per peer so pubsub sharding + provider
112
+ // discovery share the same overlay.
113
+ let fanoutInstance;
114
+ const configuredFanoutFactory = extendedOptions?.services?.fanout ||
115
+ ((c) => new FanoutTree(c, {
116
+ connectionManager: false,
117
+ topicRootControlPlane,
118
+ }));
119
+ const getOrCreateFanout = (c) => {
120
+ if (!fanoutInstance) {
121
+ fanoutInstance = configuredFanoutFactory(c);
122
+ }
123
+ return fanoutInstance;
124
+ };
125
+ const blockProviderNamespace = (cid) => `cid:${cid}`;
106
126
  const services = {
107
127
  keychain: (components) => keychain({ libp2p: {}, crypto: cryptoKeychain })(components),
108
- blocks: (c) => new DirectBlock(c, {
128
+ fanout: (c) => getOrCreateFanout(c),
129
+ blocks: (c) => {
130
+ let blocksService;
131
+ const fanout = (() => {
132
+ try {
133
+ return getOrCreateFanout(c);
134
+ }
135
+ catch {
136
+ return undefined;
137
+ }
138
+ })();
139
+ const fallbackConnectedPeers = () => {
140
+ const out = [];
141
+ const push = (hash) => {
142
+ if (!hash)
143
+ return;
144
+ if (hash === blocksService?.publicKeyHash)
145
+ return;
146
+ // Small bounded list; avoid Set allocations on hot paths.
147
+ if (out.includes(hash))
148
+ return;
149
+ out.push(hash);
150
+ };
151
+ // Prefer peers we've already negotiated `/peerbit/direct-block` streams with.
152
+ for (const h of blocksService?.peers.keys() ?? []) {
153
+ push(h);
154
+ if (out.length >= 32)
155
+ return out;
156
+ }
157
+ // Fall back to currently connected libp2p peers.
158
+ for (const conn of c.connectionManager.getConnections()) {
159
+ try {
160
+ push(getPublicKeyFromPeerId(conn.remotePeer).hashcode());
161
+ }
162
+ catch {
163
+ // ignore unexpected key types
164
+ }
165
+ if (out.length >= 32)
166
+ break;
167
+ }
168
+ return out;
169
+ };
170
+ const resolveProviders = async (cid, options) => {
171
+ // 1) tracker-backed provider directory (best-effort, bounded)
172
+ try {
173
+ const providers = await fanout?.queryProviders(blockProviderNamespace(cid), {
174
+ want: 8,
175
+ timeoutMs: 2_000,
176
+ queryTimeoutMs: 500,
177
+ bootstrapMaxPeers: 2,
178
+ signal: options?.signal,
179
+ });
180
+ if (providers && providers.length > 0)
181
+ return providers;
182
+ }
183
+ catch {
184
+ // ignore discovery failures
185
+ }
186
+ // 2) fallback to currently connected peers (keeps local/small nets working without trackers)
187
+ return fallbackConnectedPeers();
188
+ };
189
+ blocksService = new DirectBlock(c, {
190
+ canRelayMessage: asRelay,
191
+ directory: blocksDirectory,
192
+ resolveProviders,
193
+ onPut: async (cid) => {
194
+ // Best-effort directory announce for "get without remote.from" workflows.
195
+ try {
196
+ await fanout?.announceProvider(blockProviderNamespace(cid), {
197
+ ttlMs: 120_000,
198
+ bootstrapMaxPeers: 2,
199
+ });
200
+ }
201
+ catch {
202
+ // ignore announce failures
203
+ }
204
+ },
205
+ });
206
+ return blocksService;
207
+ },
208
+ pubsub: (c) => new TopicControlPlane(c, {
109
209
  canRelayMessage: asRelay,
110
- directory: blocksDirectory,
210
+ topicRootControlPlane,
211
+ fanout: getOrCreateFanout(c),
111
212
  }),
112
- pubsub: (c) => new DirectSub(c, { canRelayMessage: asRelay }),
113
213
  ...extendedOptions?.services,
114
214
  };
115
215
  if (!asRelay) {
@@ -188,32 +288,78 @@ export class Peerbit {
188
288
  /**
189
289
  * Dial a peer with an Ed25519 peerId
190
290
  */
191
- async dial(address) {
291
+ async dial(address, options) {
192
292
  const maddress = typeof address === "string"
193
293
  ? multiaddr(address)
194
294
  : isMultiaddr(address) || Array.isArray(address)
195
295
  ? address
196
296
  : address.getMultiaddrs();
197
- const connection = await this.libp2p.dial(maddress);
198
- const publicKey = Ed25519PublicKey.fromPeerId(connection.remotePeer);
199
- // TODO, do this as a promise instead using the onPeerConnected vents in pubsub and blocks
200
- try {
201
- await this.libp2p.services.pubsub.waitFor(publicKey.hashcode(), {
202
- target: "neighbor",
203
- });
204
- }
205
- catch (error) {
206
- throw new Error(`Failed to dial peer. Not available on Pubsub`);
297
+ let dialSignal = options?.signal;
298
+ let dialAbortController;
299
+ let dialTimeout;
300
+ let onAbort;
301
+ if (options?.dialTimeoutMs != null) {
302
+ dialAbortController = new AbortController();
303
+ const abort = (reason) => {
304
+ if (dialAbortController?.signal.aborted)
305
+ return;
306
+ dialAbortController?.abort(reason);
307
+ };
308
+ dialTimeout = setTimeout(() => {
309
+ abort(new Error(`Dial timeout after ${options.dialTimeoutMs}ms`));
310
+ }, options.dialTimeoutMs);
311
+ if (dialSignal) {
312
+ if (dialSignal.aborted) {
313
+ abort(dialSignal.reason);
314
+ }
315
+ else {
316
+ onAbort = () => abort(dialSignal?.reason);
317
+ dialSignal.addEventListener("abort", onAbort, { once: true });
318
+ }
319
+ }
320
+ dialSignal = dialAbortController.signal;
207
321
  }
208
322
  try {
209
- await this.libp2p.services.blocks.waitFor(publicKey.hashcode(), {
210
- target: "neighbor",
211
- });
323
+ const connection = await this.libp2p.dial(maddress, dialSignal ? { signal: dialSignal } : undefined);
324
+ const publicKey = Ed25519PublicKey.fromPeerId(connection.remotePeer);
325
+ const peerHash = publicKey.hashcode();
326
+ const resolvedReadiness = options?.readiness ??
327
+ (this.libp2p.services.fanout ? "services-and-fanout" : "services");
328
+ const serviceWaitTimeoutMs = options?.serviceWaitTimeoutMs ?? options?.dialTimeoutMs;
329
+ if (resolvedReadiness === "connection") {
330
+ return true;
331
+ }
332
+ const waitForNeighbor = async (label, service) => {
333
+ try {
334
+ await service.waitFor(peerHash, {
335
+ target: "neighbor",
336
+ timeout: serviceWaitTimeoutMs,
337
+ signal: dialSignal,
338
+ });
339
+ }
340
+ catch (_error) {
341
+ throw new Error(`Failed to dial peer. Not available on ${label}`);
342
+ }
343
+ };
344
+ // TODO, do this as a promise instead using the onPeerConnected vents in pubsub and blocks
345
+ await waitForNeighbor("Pubsub", this.libp2p.services.pubsub);
346
+ await waitForNeighbor("Blocks", this.libp2p.services.blocks);
347
+ if (resolvedReadiness === "services-and-fanout") {
348
+ const fanoutService = this.libp2p.services.fanout;
349
+ if (!fanoutService?.waitFor) {
350
+ throw new Error("Failed to dial peer. Not available on Fanout (service missing)");
351
+ }
352
+ await waitForNeighbor("Fanout", fanoutService);
353
+ }
354
+ return true;
212
355
  }
213
- catch (error) {
214
- throw new Error(`Failed to dial peer. Not available on Blocks`);
356
+ finally {
357
+ if (dialTimeout)
358
+ clearTimeout(dialTimeout);
359
+ if (onAbort && options?.signal) {
360
+ options.signal.removeEventListener("abort", onAbort);
361
+ }
215
362
  }
216
- return true;
217
363
  }
218
364
  async hangUp(address) {
219
365
  await this.libp2p.hangUp(address instanceof PublicSignKey
@@ -246,7 +392,73 @@ export class Peerbit {
246
392
  if (_addresses.length === 0) {
247
393
  throw new Error("Failed to find any addresses to dial");
248
394
  }
249
- const settled = await Promise.allSettled(_addresses.map((x) => this.dial(x)));
395
+ const extractPeerId = (a) => {
396
+ const s = typeof a === "string" ? a : a.toString();
397
+ const m = s.match(/\/(?:p2p|ipfs)\/([^/]+)(?:\/|$)/);
398
+ return m?.[1];
399
+ };
400
+ // Keep fanout bootstrap config aligned with peer bootstrap config so fanout
401
+ // channels can join via the same rendezvous nodes.
402
+ try {
403
+ this.libp2p.services.fanout.setBootstraps(_addresses);
404
+ }
405
+ catch {
406
+ // ignore if fanout service is not present/overridden
407
+ }
408
+ // Avoid dialing the same peer multiple times concurrently (multiaddrs often come
409
+ // with both `/tcp` and `/ws` addresses for the same peer). Concurrent dials to
410
+ // the same peer can race internal stream readiness, causing waits to stall.
411
+ const byPeerId = new Map();
412
+ const unknown = [];
413
+ for (const a of _addresses) {
414
+ const pid = extractPeerId(a);
415
+ if (!pid) {
416
+ unknown.push(a);
417
+ continue;
418
+ }
419
+ const list = byPeerId.get(pid) ?? [];
420
+ list.push(a);
421
+ byPeerId.set(pid, list);
422
+ }
423
+ const dialTimeoutMs = 30_000;
424
+ const scoreBootstrapAddr = (a) => {
425
+ const s = a.toString();
426
+ const isCircuit = s.includes("p2p-circuit");
427
+ const isWs = s.includes("/ws") || s.includes("/wss");
428
+ return (isCircuit ? 2 : 0) + (isWs ? 1 : 0);
429
+ };
430
+ const dialPeer = async (list) => {
431
+ const maddrs = list
432
+ .map((x) => (typeof x === "string" ? multiaddr(x) : x))
433
+ .sort((a, b) => scoreBootstrapAddr(a) - scoreBootstrapAddr(b));
434
+ let lastError;
435
+ for (const ma of maddrs) {
436
+ try {
437
+ await this.dial(ma, { dialTimeoutMs });
438
+ return true;
439
+ }
440
+ catch (e) {
441
+ lastError = e;
442
+ }
443
+ }
444
+ throw lastError ?? new Error("Failed to dial bootstrap peer");
445
+ };
446
+ const dialTasks = [];
447
+ for (const list of byPeerId.values()) {
448
+ dialTasks.push({
449
+ label: list.map((x) => (typeof x === "string" ? x : x.toString())),
450
+ promise: dialPeer(list),
451
+ });
452
+ }
453
+ for (const a of unknown) {
454
+ dialTasks.push({
455
+ label: [typeof a === "string" ? a : a.toString()],
456
+ promise: this.dial(typeof a === "string" ? multiaddr(a) : a, {
457
+ dialTimeoutMs,
458
+ }),
459
+ });
460
+ }
461
+ const settled = await Promise.allSettled(dialTasks.map((t) => t.promise));
250
462
  let once = false;
251
463
  for (const [i, result] of settled.entries()) {
252
464
  if (result.status === "fulfilled") {
@@ -254,7 +466,7 @@ export class Peerbit {
254
466
  }
255
467
  else {
256
468
  logger.error("Failed to dial bootstrap address(s): " +
257
- JSON.stringify(_addresses[i]) +
469
+ JSON.stringify(dialTasks[i]?.label ?? []) +
258
470
  ". Reason: " +
259
471
  result.reason);
260
472
  }
@@ -262,6 +474,76 @@ export class Peerbit {
262
474
  if (!once) {
263
475
  throw new Error("Failed to succefully dial any bootstrap node");
264
476
  }
477
+ // Seed deterministic topic-root candidates for shard root resolution.
478
+ //
479
+ // IMPORTANT: this set must be stable across peers, otherwise different nodes
480
+ // will resolve different roots for the same shard and the overlay will partition.
481
+ //
482
+ // We therefore constrain candidates to the bootstrap peerIds we were asked
483
+ // to dial (and that we successfully connected to).
484
+ const servicesAny = this.libp2p.services;
485
+ const fanoutPlane = servicesAny?.fanout?.topicRootControlPlane;
486
+ const pubsubPlane = servicesAny?.pubsub?.topicRootControlPlane;
487
+ const planes = [...new Set([fanoutPlane, pubsubPlane].filter(Boolean))];
488
+ if (planes.length > 0) {
489
+ const bootstrapPeerIds = new Set();
490
+ for (const a of _addresses) {
491
+ const pid = extractPeerId(a);
492
+ if (pid)
493
+ bootstrapPeerIds.add(pid);
494
+ }
495
+ const candidates = new Set();
496
+ for (const connection of this.libp2p.getConnections()) {
497
+ if (bootstrapPeerIds.size > 0) {
498
+ const remoteId = connection.remotePeer?.toString?.();
499
+ if (!remoteId || !bootstrapPeerIds.has(remoteId))
500
+ continue;
501
+ }
502
+ try {
503
+ candidates.add(getPublicKeyFromPeerId(connection.remotePeer).hashcode());
504
+ }
505
+ catch {
506
+ // ignore peers without a resolvable public key
507
+ }
508
+ }
509
+ // If this node is itself one of the bootstraps, it won't show up among
510
+ // remote connections; add it explicitly so shard mapping matches other peers.
511
+ try {
512
+ if (bootstrapPeerIds.has(this.libp2p.peerId.toString())) {
513
+ candidates.add(this.services.pubsub.publicKeyHash);
514
+ }
515
+ }
516
+ catch {
517
+ // ignore
518
+ }
519
+ if (candidates.size > 0) {
520
+ const list = [...candidates];
521
+ // Prefer the pubsub helper so we also disable its auto-candidate mode.
522
+ try {
523
+ this.services.pubsub?.setTopicRootCandidates?.(list);
524
+ }
525
+ catch {
526
+ // ignore
527
+ }
528
+ for (const plane of planes) {
529
+ try {
530
+ plane.setTopicRootCandidates(list);
531
+ }
532
+ catch {
533
+ // ignore
534
+ }
535
+ }
536
+ // Open shard roots this node is responsible for (no-op for non-candidates).
537
+ try {
538
+ if (list.includes(this.services.pubsub.publicKeyHash)) {
539
+ await this.services.pubsub.hostShardRootsNow();
540
+ }
541
+ }
542
+ catch {
543
+ // ignore
544
+ }
545
+ }
546
+ }
265
547
  }
266
548
  /**
267
549
  * Default behaviour of a store is only to accept heads that are forks (new roots) with some probability
@@ -273,6 +555,32 @@ export class Peerbit {
273
555
  async open(storeOrAddress, options = {}) {
274
556
  return (this._handler || (this._handler = new ProgramHandler({ client: this }))).open(storeOrAddress, options);
275
557
  }
558
+ fanoutChannel(topic, root = this.services.fanout.publicKeyHash) {
559
+ if (root === this.services.fanout.publicKeyHash) {
560
+ return FanoutChannel.fromSelf(this.services.fanout, topic);
561
+ }
562
+ return new FanoutChannel(this.services.fanout, { topic, root });
563
+ }
564
+ async fanoutResolveRoot(topic) {
565
+ const servicesAny = this.services;
566
+ const topicRootControlPlane = servicesAny?.fanout?.topicRootControlPlane ||
567
+ servicesAny?.pubsub?.topicRootControlPlane;
568
+ const resolved = await topicRootControlPlane?.resolveTopicRoot?.(topic);
569
+ if (!resolved) {
570
+ throw new Error(`Failed to resolve fanout root for topic ${topic}. Configure topic-root candidates/resolver (Peerbit.bootstrap() does this automatically) or pass root explicitly.`);
571
+ }
572
+ return resolved;
573
+ }
574
+ fanoutOpenAsRoot(topic, options) {
575
+ return this.fanoutChannel(topic).openAsRoot(options);
576
+ }
577
+ fanoutJoin(topic, root, options, joinOpts) {
578
+ return this.fanoutChannel(topic, root).join(options, joinOpts);
579
+ }
580
+ async fanoutJoinAuto(topic, options, joinOpts) {
581
+ const root = await this.fanoutResolveRoot(topic);
582
+ return this.fanoutJoin(topic, root, options, joinOpts);
583
+ }
276
584
  get storage() {
277
585
  return this._storage;
278
586
  }
@@ -1 +1 @@
1
- {"version":3,"file":"peer.js","sourceRoot":"","sources":["../../src/peer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"peer.js","sourceRoot":"","sources":["../../src/peer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peerbit",
3
- "version": "4.4.19",
3
+ "version": "5.0.0",
4
4
  "description": "Peerbit client",
5
5
  "author": "dao.xyz",
6
6
  "license": "MIT",
@@ -83,20 +83,20 @@
83
83
  "p-queue": "^8.0.1",
84
84
  "uint8arrays": "^5.1.0",
85
85
  "libsodium-wrappers": "0.7.15",
86
- "@peerbit/any-store": "2.2.4",
87
- "@peerbit/any-store-opfs": "1.1.3",
88
- "@peerbit/indexer-interface": "2.1.1",
86
+ "@peerbit/any-store": "2.2.5",
87
+ "@peerbit/any-store-opfs": "1.1.4",
88
+ "@peerbit/crypto": "3.0.0",
89
+ "@peerbit/indexer-interface": "3.0.0",
89
90
  "@peerbit/logger": "2.0.0",
90
- "@peerbit/time": "2.3.0",
91
- "@peerbit/crypto": "2.4.1",
91
+ "@peerbit/time": "3.0.0",
92
92
  "@peerbit/build-assets": "1.1.0",
93
- "@peerbit/keychain": "1.2.4",
94
- "@peerbit/indexer-simple": "1.2.2",
95
- "@peerbit/indexer-sqlite3": "2.1.2",
96
- "@peerbit/program": "5.6.3",
97
- "@peerbit/blocks": "3.1.8",
98
- "@peerbit/pubsub": "4.1.4",
99
- "@peerbit/stream-interface": "5.4.0"
93
+ "@peerbit/keychain": "1.2.5",
94
+ "@peerbit/indexer-simple": "1.2.3",
95
+ "@peerbit/indexer-sqlite3": "3.0.0",
96
+ "@peerbit/program": "6.0.0",
97
+ "@peerbit/blocks": "4.0.0",
98
+ "@peerbit/pubsub": "5.0.0",
99
+ "@peerbit/stream-interface": "6.0.0"
100
100
  },
101
101
  "devDependencies": {
102
102
  "@types/libsodium-wrappers": "^0.7.14",
package/src/libp2p.ts CHANGED
@@ -4,11 +4,10 @@ import type { CircuitRelayService } from "@libp2p/circuit-relay-v2";
4
4
  import { identify } from "@libp2p/identify";
5
5
  import { DirectBlock } from "@peerbit/blocks";
6
6
  import {
7
- DefaultCryptoKeychain,
8
7
  type IPeerbitKeychain,
9
8
  keychain,
10
9
  } from "@peerbit/keychain";
11
- import { DirectSub } from "@peerbit/pubsub";
10
+ import { FanoutTree, TopicControlPlane, TopicRootControlPlane } from "@peerbit/pubsub";
12
11
  import {
13
12
  type Libp2p,
14
13
  type Libp2pOptions,
@@ -18,7 +17,8 @@ import {
18
17
  import { listen, relay, transports } from "./transports.js";
19
18
 
20
19
  export type Libp2pExtendServices = {
21
- pubsub: DirectSub;
20
+ pubsub: TopicControlPlane;
21
+ fanout: FanoutTree;
22
22
  blocks: DirectBlock;
23
23
  keychain: IPeerbitKeychain;
24
24
  };
@@ -39,15 +39,20 @@ export type Libp2pCreateOptionsWithServices = Libp2pCreateOptions & {
39
39
  };
40
40
 
41
41
  export const createLibp2pExtended = (
42
- opts: PartialLibp2pCreateOptions = {
43
- services: {
44
- blocks: (c: any) => new DirectBlock(c),
45
- pubsub: (c: any) => new DirectSub(c),
46
- keychain: keychain(),
47
- },
48
- },
42
+ opts: PartialLibp2pCreateOptions = {},
49
43
  ): Promise<Libp2pExtended> => {
44
+ const topicRootControlPlane = new TopicRootControlPlane();
50
45
  let extraServices: any = {};
46
+ let fanoutInstance: FanoutTree | undefined;
47
+ const configuredFanoutFactory =
48
+ opts.services?.fanout ||
49
+ ((c) => new FanoutTree(c, { connectionManager: false, topicRootControlPlane }));
50
+ const getOrCreateFanout = (c: any) => {
51
+ if (!fanoutInstance) {
52
+ fanoutInstance = configuredFanoutFactory(c) as FanoutTree;
53
+ }
54
+ return fanoutInstance;
55
+ };
51
56
 
52
57
  if (opts.services?.["relay"] === null) {
53
58
  delete opts.services?.["relay"];
@@ -85,18 +90,21 @@ export const createLibp2pExtended = (
85
90
  connectionEncrypters: opts.connectionEncrypters || [noise()],
86
91
  streamMuxers: opts.streamMuxers || [yamux()],
87
92
  services: {
93
+ ...opts.services,
88
94
  pubsub:
89
95
  opts.services?.pubsub ||
90
96
  ((c) =>
91
- new DirectSub(c, {
97
+ new TopicControlPlane(c, {
92
98
  canRelayMessage: true,
99
+ topicRootControlPlane,
100
+ fanout: getOrCreateFanout(c),
93
101
  // auto dial true
94
102
  // auto prune true
95
103
  })),
104
+ fanout: (c) => getOrCreateFanout(c),
96
105
  blocks: opts.services?.blocks || ((c) => new DirectBlock(c)),
97
- keychain: opts.services?.keychain || ((c) => new DefaultCryptoKeychain()),
98
- ...opts.services,
106
+ keychain: opts.services?.keychain || keychain(),
99
107
  ...extraServices,
100
108
  },
101
- });
109
+ }).then((libp2p) => libp2p as Libp2pExtended);
102
110
  };
package/src/peer.ts CHANGED
@@ -14,10 +14,10 @@ import {
14
14
  Ed25519PublicKey,
15
15
  PublicSignKey,
16
16
  Secp256k1Keypair,
17
+ getPublicKeyFromPeerId,
17
18
  getKeypairFromPrivateKey,
18
19
  } from "@peerbit/crypto";
19
20
  import type { Indices } from "@peerbit/indexer-interface";
20
- import { create as createSQLiteIndexer } from "@peerbit/indexer-sqlite3";
21
21
  import { DefaultCryptoKeychain, keychain } from "@peerbit/keychain";
22
22
  import { logger as loggerFn } from "@peerbit/logger";
23
23
  import {
@@ -28,7 +28,14 @@ import {
28
28
  type ProgramClient,
29
29
  ProgramHandler,
30
30
  } from "@peerbit/program";
31
- import { DirectSub } from "@peerbit/pubsub";
31
+ import {
32
+ FanoutChannel,
33
+ FanoutTree,
34
+ TopicControlPlane,
35
+ TopicRootControlPlane,
36
+ type FanoutTreeChannelOptions,
37
+ type FanoutTreeJoinOptions,
38
+ } from "@peerbit/pubsub";
32
39
  import type { Libp2p } from "libp2p";
33
40
  import sodium from "libsodium-wrappers";
34
41
  import path from "path-browserify";
@@ -61,6 +68,18 @@ export type CreateInstanceOptions = (SimpleLibp2pOptions | Libp2pOptions) & {
61
68
  indexer?: (directory?: string) => Promise<Indices> | Indices;
62
69
  } & OptionalCreateOptions;
63
70
 
71
+ export type DialReadiness =
72
+ | "connection"
73
+ | "services"
74
+ | "services-and-fanout";
75
+
76
+ export type DialOptions = {
77
+ dialTimeoutMs?: number;
78
+ serviceWaitTimeoutMs?: number;
79
+ readiness?: DialReadiness;
80
+ signal?: AbortSignal;
81
+ };
82
+
64
83
  const isLibp2pInstance = (libp2p: Libp2pExtended | ClientCreateOptions) =>
65
84
  !!(libp2p as Libp2p).getMultiaddrs;
66
85
 
@@ -132,7 +151,13 @@ export class Peerbit implements ProgramClient {
132
151
  const storage = await createCache(
133
152
  directory != null ? path.join(directory, "/cache") : undefined,
134
153
  );
135
- const indexerFn = options.indexer || createSQLiteIndexer;
154
+ const indexerFn =
155
+ options.indexer ||
156
+ (async (directory?: string) => {
157
+ // Lazy-import to avoid loading sqlite-wasm in browser-like runtimes/tests
158
+ const { create } = await import("@peerbit/indexer-sqlite3");
159
+ return create(directory);
160
+ });
136
161
  const indexer =
137
162
  directory != null
138
163
  ? await indexerFn(path.join(directory, "/index"))
@@ -186,19 +211,123 @@ export class Peerbit implements ProgramClient {
186
211
  ]),
187
212
  )
188
213
  : undefined;
189
- }
190
-
191
- const services: any = {
192
- keychain: (components: KeychainComponents) =>
193
- keychain({ libp2p: {}, crypto: cryptoKeychain })(components),
194
- blocks: (c: any) =>
195
- new DirectBlock(c, {
196
- canRelayMessage: asRelay,
197
- directory: blocksDirectory,
198
- }),
199
- pubsub: (c: any) => new DirectSub(c, { canRelayMessage: asRelay }),
200
- ...extendedOptions?.services,
201
- };
214
+ }
215
+
216
+ const topicRootControlPlane = new TopicRootControlPlane();
217
+
218
+ // Keep a single FanoutTree instance per peer so pubsub sharding + provider
219
+ // discovery share the same overlay.
220
+ let fanoutInstance: FanoutTree | undefined;
221
+ const configuredFanoutFactory =
222
+ extendedOptions?.services?.fanout ||
223
+ ((c: any) =>
224
+ new FanoutTree(c, {
225
+ connectionManager: false,
226
+ topicRootControlPlane,
227
+ }));
228
+ const getOrCreateFanout = (c: any) => {
229
+ if (!fanoutInstance) {
230
+ fanoutInstance = configuredFanoutFactory(c) as FanoutTree;
231
+ }
232
+ return fanoutInstance;
233
+ };
234
+
235
+ const blockProviderNamespace = (cid: string) => `cid:${cid}`;
236
+
237
+ const services: any = {
238
+ keychain: (components: KeychainComponents) =>
239
+ keychain({ libp2p: {}, crypto: cryptoKeychain })(components),
240
+ fanout: (c: any) => getOrCreateFanout(c),
241
+ blocks: (c: any) => {
242
+ let blocksService: DirectBlock | undefined;
243
+ const fanout = (() => {
244
+ try {
245
+ return getOrCreateFanout(c);
246
+ } catch {
247
+ return undefined;
248
+ }
249
+ })();
250
+
251
+ const fallbackConnectedPeers = () => {
252
+ const out: string[] = [];
253
+ const push = (hash?: string) => {
254
+ if (!hash) return;
255
+ if (hash === blocksService?.publicKeyHash) return;
256
+ // Small bounded list; avoid Set allocations on hot paths.
257
+ if (out.includes(hash)) return;
258
+ out.push(hash);
259
+ };
260
+
261
+ // Prefer peers we've already negotiated `/peerbit/direct-block` streams with.
262
+ for (const h of blocksService?.peers.keys() ?? []) {
263
+ push(h);
264
+ if (out.length >= 32) return out;
265
+ }
266
+
267
+ // Fall back to currently connected libp2p peers.
268
+ for (const conn of c.connectionManager.getConnections()) {
269
+ try {
270
+ push(getPublicKeyFromPeerId(conn.remotePeer).hashcode());
271
+ } catch {
272
+ // ignore unexpected key types
273
+ }
274
+ if (out.length >= 32) break;
275
+ }
276
+
277
+ return out;
278
+ };
279
+
280
+ const resolveProviders = async (
281
+ cid: string,
282
+ options?: { signal?: AbortSignal },
283
+ ) => {
284
+ // 1) tracker-backed provider directory (best-effort, bounded)
285
+ try {
286
+ const providers = await fanout?.queryProviders(
287
+ blockProviderNamespace(cid),
288
+ {
289
+ want: 8,
290
+ timeoutMs: 2_000,
291
+ queryTimeoutMs: 500,
292
+ bootstrapMaxPeers: 2,
293
+ signal: options?.signal,
294
+ },
295
+ );
296
+ if (providers && providers.length > 0) return providers;
297
+ } catch {
298
+ // ignore discovery failures
299
+ }
300
+
301
+ // 2) fallback to currently connected peers (keeps local/small nets working without trackers)
302
+ return fallbackConnectedPeers();
303
+ };
304
+
305
+ blocksService = new DirectBlock(c, {
306
+ canRelayMessage: asRelay,
307
+ directory: blocksDirectory,
308
+ resolveProviders,
309
+ onPut: async (cid) => {
310
+ // Best-effort directory announce for "get without remote.from" workflows.
311
+ try {
312
+ await fanout?.announceProvider(blockProviderNamespace(cid), {
313
+ ttlMs: 120_000,
314
+ bootstrapMaxPeers: 2,
315
+ });
316
+ } catch {
317
+ // ignore announce failures
318
+ }
319
+ },
320
+ });
321
+ return blocksService;
322
+ },
323
+ pubsub: (c: any) =>
324
+ new TopicControlPlane(c, {
325
+ canRelayMessage: asRelay,
326
+ topicRootControlPlane,
327
+ fanout: getOrCreateFanout(c),
328
+ }),
329
+ ...extendedOptions?.services,
330
+ };
202
331
 
203
332
  if (!asRelay) {
204
333
  services.relay = null;
@@ -294,6 +423,7 @@ export class Peerbit implements ProgramClient {
294
423
  */
295
424
  async dial(
296
425
  address: string | Multiaddr | Multiaddr[] | ProgramClient,
426
+ options?: DialOptions,
297
427
  ): Promise<boolean> {
298
428
  const maddress =
299
429
  typeof address === "string"
@@ -301,27 +431,89 @@ export class Peerbit implements ProgramClient {
301
431
  : isMultiaddr(address) || Array.isArray(address)
302
432
  ? address
303
433
  : address.getMultiaddrs();
304
- const connection = await this.libp2p.dial(maddress);
305
434
 
306
- const publicKey = Ed25519PublicKey.fromPeerId(connection.remotePeer);
435
+ let dialSignal: AbortSignal | undefined = options?.signal;
436
+ let dialAbortController: AbortController | undefined;
437
+ let dialTimeout: ReturnType<typeof setTimeout> | undefined;
438
+ let onAbort: (() => void) | undefined;
307
439
 
308
- // TODO, do this as a promise instead using the onPeerConnected vents in pubsub and blocks
309
- try {
310
- await this.libp2p.services.pubsub.waitFor(publicKey.hashcode(), {
311
- target: "neighbor",
312
- });
313
- } catch (error) {
314
- throw new Error(`Failed to dial peer. Not available on Pubsub`);
440
+ if (options?.dialTimeoutMs != null) {
441
+ dialAbortController = new AbortController();
442
+ const abort = (reason?: unknown) => {
443
+ if (dialAbortController?.signal.aborted) return;
444
+ dialAbortController?.abort(reason);
445
+ };
446
+
447
+ dialTimeout = setTimeout(() => {
448
+ abort(new Error(`Dial timeout after ${options.dialTimeoutMs}ms`));
449
+ }, options.dialTimeoutMs);
450
+
451
+ if (dialSignal) {
452
+ if (dialSignal.aborted) {
453
+ abort(dialSignal.reason);
454
+ } else {
455
+ onAbort = () => abort(dialSignal?.reason);
456
+ dialSignal.addEventListener("abort", onAbort, { once: true });
457
+ }
458
+ }
459
+
460
+ dialSignal = dialAbortController.signal;
315
461
  }
316
462
 
317
463
  try {
318
- await this.libp2p.services.blocks.waitFor(publicKey.hashcode(), {
319
- target: "neighbor",
320
- });
321
- } catch (error) {
322
- throw new Error(`Failed to dial peer. Not available on Blocks`);
464
+ const connection = await this.libp2p.dial(
465
+ maddress as any,
466
+ dialSignal ? ({ signal: dialSignal } as any) : undefined,
467
+ );
468
+
469
+ const publicKey = Ed25519PublicKey.fromPeerId(connection.remotePeer);
470
+ const peerHash = publicKey.hashcode();
471
+
472
+ const resolvedReadiness: DialReadiness =
473
+ options?.readiness ??
474
+ (this.libp2p.services.fanout ? "services-and-fanout" : "services");
475
+ const serviceWaitTimeoutMs =
476
+ options?.serviceWaitTimeoutMs ?? options?.dialTimeoutMs;
477
+ if (resolvedReadiness === "connection") {
478
+ return true;
479
+ }
480
+
481
+ const waitForNeighbor = async (
482
+ label: "Pubsub" | "Blocks" | "Fanout",
483
+ service: { waitFor: (peer: string, options?: any) => Promise<any> },
484
+ ) => {
485
+ try {
486
+ await service.waitFor(peerHash, {
487
+ target: "neighbor",
488
+ timeout: serviceWaitTimeoutMs,
489
+ signal: dialSignal,
490
+ });
491
+ } catch (_error) {
492
+ throw new Error(`Failed to dial peer. Not available on ${label}`);
493
+ }
494
+ };
495
+
496
+ // TODO, do this as a promise instead using the onPeerConnected vents in pubsub and blocks
497
+ await waitForNeighbor("Pubsub", this.libp2p.services.pubsub);
498
+ await waitForNeighbor("Blocks", this.libp2p.services.blocks);
499
+
500
+ if (resolvedReadiness === "services-and-fanout") {
501
+ const fanoutService = (this.libp2p.services as any).fanout;
502
+ if (!fanoutService?.waitFor) {
503
+ throw new Error(
504
+ "Failed to dial peer. Not available on Fanout (service missing)",
505
+ );
506
+ }
507
+ await waitForNeighbor("Fanout", fanoutService);
508
+ }
509
+
510
+ return true;
511
+ } finally {
512
+ if (dialTimeout) clearTimeout(dialTimeout);
513
+ if (onAbort && options?.signal) {
514
+ options.signal.removeEventListener("abort", onAbort);
515
+ }
323
516
  }
324
- return true;
325
517
  }
326
518
 
327
519
  async hangUp(address: PeerId | PublicSignKey | string | Multiaddr) {
@@ -361,9 +553,78 @@ export class Peerbit implements ProgramClient {
361
553
  if (_addresses.length === 0) {
362
554
  throw new Error("Failed to find any addresses to dial");
363
555
  }
364
- const settled = await Promise.allSettled(
365
- _addresses.map((x) => this.dial(x)),
366
- );
556
+
557
+ const extractPeerId = (a: string | Multiaddr): string | undefined => {
558
+ const s = typeof a === "string" ? a : a.toString();
559
+ const m = s.match(/\/(?:p2p|ipfs)\/([^/]+)(?:\/|$)/);
560
+ return m?.[1];
561
+ };
562
+
563
+ // Keep fanout bootstrap config aligned with peer bootstrap config so fanout
564
+ // channels can join via the same rendezvous nodes.
565
+ try {
566
+ this.libp2p.services.fanout.setBootstraps(_addresses);
567
+ } catch {
568
+ // ignore if fanout service is not present/overridden
569
+ }
570
+
571
+ // Avoid dialing the same peer multiple times concurrently (multiaddrs often come
572
+ // with both `/tcp` and `/ws` addresses for the same peer). Concurrent dials to
573
+ // the same peer can race internal stream readiness, causing waits to stall.
574
+ const byPeerId = new Map<string, (string | Multiaddr)[]>();
575
+ const unknown: (string | Multiaddr)[] = [];
576
+ for (const a of _addresses) {
577
+ const pid = extractPeerId(a as any);
578
+ if (!pid) {
579
+ unknown.push(a);
580
+ continue;
581
+ }
582
+ const list = byPeerId.get(pid) ?? [];
583
+ list.push(a);
584
+ byPeerId.set(pid, list);
585
+ }
586
+
587
+ const dialTimeoutMs = 30_000;
588
+ const scoreBootstrapAddr = (a: Multiaddr) => {
589
+ const s = a.toString();
590
+ const isCircuit = s.includes("p2p-circuit");
591
+ const isWs = s.includes("/ws") || s.includes("/wss");
592
+ return (isCircuit ? 2 : 0) + (isWs ? 1 : 0);
593
+ };
594
+
595
+ const dialPeer = async (list: (string | Multiaddr)[]) => {
596
+ const maddrs = list
597
+ .map((x) => (typeof x === "string" ? multiaddr(x) : x))
598
+ .sort((a, b) => scoreBootstrapAddr(a) - scoreBootstrapAddr(b));
599
+ let lastError: unknown;
600
+ for (const ma of maddrs) {
601
+ try {
602
+ await this.dial(ma, { dialTimeoutMs });
603
+ return true;
604
+ } catch (e) {
605
+ lastError = e;
606
+ }
607
+ }
608
+ throw lastError ?? new Error("Failed to dial bootstrap peer");
609
+ };
610
+
611
+ const dialTasks: Array<{ label: string[]; promise: Promise<boolean> }> = [];
612
+ for (const list of byPeerId.values()) {
613
+ dialTasks.push({
614
+ label: list.map((x) => (typeof x === "string" ? x : x.toString())),
615
+ promise: dialPeer(list),
616
+ });
617
+ }
618
+ for (const a of unknown) {
619
+ dialTasks.push({
620
+ label: [typeof a === "string" ? a : a.toString()],
621
+ promise: this.dial(typeof a === "string" ? multiaddr(a) : a, {
622
+ dialTimeoutMs,
623
+ }),
624
+ });
625
+ }
626
+
627
+ const settled = await Promise.allSettled(dialTasks.map((t) => t.promise));
367
628
  let once = false;
368
629
  for (const [i, result] of settled.entries()) {
369
630
  if (result.status === "fulfilled") {
@@ -371,7 +632,7 @@ export class Peerbit implements ProgramClient {
371
632
  } else {
372
633
  logger.error(
373
634
  "Failed to dial bootstrap address(s): " +
374
- JSON.stringify(_addresses[i]) +
635
+ JSON.stringify(dialTasks[i]?.label ?? []) +
375
636
  ". Reason: " +
376
637
  result.reason,
377
638
  );
@@ -380,6 +641,71 @@ export class Peerbit implements ProgramClient {
380
641
  if (!once) {
381
642
  throw new Error("Failed to succefully dial any bootstrap node");
382
643
  }
644
+
645
+ // Seed deterministic topic-root candidates for shard root resolution.
646
+ //
647
+ // IMPORTANT: this set must be stable across peers, otherwise different nodes
648
+ // will resolve different roots for the same shard and the overlay will partition.
649
+ //
650
+ // We therefore constrain candidates to the bootstrap peerIds we were asked
651
+ // to dial (and that we successfully connected to).
652
+ const servicesAny: any = this.libp2p.services as any;
653
+ const fanoutPlane = servicesAny?.fanout?.topicRootControlPlane;
654
+ const pubsubPlane = servicesAny?.pubsub?.topicRootControlPlane;
655
+ const planes = [...new Set([fanoutPlane, pubsubPlane].filter(Boolean))];
656
+ if (planes.length > 0) {
657
+ const bootstrapPeerIds = new Set<string>();
658
+ for (const a of _addresses) {
659
+ const pid = extractPeerId(a as any);
660
+ if (pid) bootstrapPeerIds.add(pid);
661
+ }
662
+
663
+ const candidates = new Set<string>();
664
+ for (const connection of this.libp2p.getConnections()) {
665
+ if (bootstrapPeerIds.size > 0) {
666
+ const remoteId = connection.remotePeer?.toString?.();
667
+ if (!remoteId || !bootstrapPeerIds.has(remoteId)) continue;
668
+ }
669
+ try {
670
+ candidates.add(getPublicKeyFromPeerId(connection.remotePeer).hashcode());
671
+ } catch {
672
+ // ignore peers without a resolvable public key
673
+ }
674
+ }
675
+ // If this node is itself one of the bootstraps, it won't show up among
676
+ // remote connections; add it explicitly so shard mapping matches other peers.
677
+ try {
678
+ if (bootstrapPeerIds.has(this.libp2p.peerId.toString())) {
679
+ candidates.add(this.services.pubsub.publicKeyHash);
680
+ }
681
+ } catch {
682
+ // ignore
683
+ }
684
+ if (candidates.size > 0) {
685
+ const list = [...candidates];
686
+ // Prefer the pubsub helper so we also disable its auto-candidate mode.
687
+ try {
688
+ (this.services.pubsub as any)?.setTopicRootCandidates?.(list);
689
+ } catch {
690
+ // ignore
691
+ }
692
+ for (const plane of planes) {
693
+ try {
694
+ plane.setTopicRootCandidates(list);
695
+ } catch {
696
+ // ignore
697
+ }
698
+ }
699
+ // Open shard roots this node is responsible for (no-op for non-candidates).
700
+ try {
701
+ if (list.includes(this.services.pubsub.publicKeyHash)) {
702
+ await this.services.pubsub.hostShardRootsNow();
703
+ }
704
+ } catch {
705
+ // ignore
706
+ }
707
+ }
708
+ }
383
709
  }
384
710
 
385
711
  /**
@@ -399,6 +725,52 @@ export class Peerbit implements ProgramClient {
399
725
  ).open(storeOrAddress, options);
400
726
  }
401
727
 
728
+ public fanoutChannel(topic: string, root: string = this.services.fanout.publicKeyHash) {
729
+ if (root === this.services.fanout.publicKeyHash) {
730
+ return FanoutChannel.fromSelf(this.services.fanout, topic);
731
+ }
732
+ return new FanoutChannel(this.services.fanout, { topic, root });
733
+ }
734
+
735
+ public async fanoutResolveRoot(topic: string): Promise<string> {
736
+ const servicesAny: any = this.services as any;
737
+ const topicRootControlPlane =
738
+ servicesAny?.fanout?.topicRootControlPlane ||
739
+ servicesAny?.pubsub?.topicRootControlPlane;
740
+ const resolved = await topicRootControlPlane?.resolveTopicRoot?.(topic);
741
+ if (!resolved) {
742
+ throw new Error(
743
+ `Failed to resolve fanout root for topic ${topic}. Configure topic-root candidates/resolver (Peerbit.bootstrap() does this automatically) or pass root explicitly.`,
744
+ );
745
+ }
746
+ return resolved;
747
+ }
748
+
749
+ public fanoutOpenAsRoot(
750
+ topic: string,
751
+ options: Omit<FanoutTreeChannelOptions, "role">,
752
+ ) {
753
+ return this.fanoutChannel(topic).openAsRoot(options);
754
+ }
755
+
756
+ public fanoutJoin(
757
+ topic: string,
758
+ root: string,
759
+ options: Omit<FanoutTreeChannelOptions, "role">,
760
+ joinOpts?: FanoutTreeJoinOptions,
761
+ ) {
762
+ return this.fanoutChannel(topic, root).join(options, joinOpts);
763
+ }
764
+
765
+ public async fanoutJoinAuto(
766
+ topic: string,
767
+ options: Omit<FanoutTreeChannelOptions, "role">,
768
+ joinOpts?: FanoutTreeJoinOptions,
769
+ ) {
770
+ const root = await this.fanoutResolveRoot(topic);
771
+ return this.fanoutJoin(topic, root, options, joinOpts);
772
+ }
773
+
402
774
  get storage() {
403
775
  return this._storage;
404
776
  }