peerbit 1.1.6 → 1.2.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.
@@ -0,0 +1 @@
1
+ export declare const resolveBootstrapAddresses: () => Promise<string[]>;
@@ -0,0 +1,7 @@
1
+ export const resolveBootstrapAddresses = async () => {
2
+ // Bootstrap addresses for network
3
+ return (await (await fetch("https://raw.githubusercontent.com/dao-xyz/peerbit-bootstrap/master/bootstrap.env")).text())
4
+ .split(/\r?\n/)
5
+ .filter((x) => x.length > 0);
6
+ };
7
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,IAAuB,EAAE;IACtE,kCAAkC;IAClC,OAAO,CACN,MAAM,CACL,MAAM,KAAK,CACV,kFAAkF,CAClF,CACD,CAAC,IAAI,EAAE,CACR;SACC,KAAK,CAAC,OAAO,CAAC;SACd,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC"}
package/lib/esm/libp2p.js CHANGED
@@ -3,7 +3,7 @@ import { DirectSub } from "@peerbit/pubsub";
3
3
  import { DirectBlock } from "@peerbit/blocks";
4
4
  import { noise } from "@dao-xyz/libp2p-noise";
5
5
  import { mplex } from "@libp2p/mplex";
6
- import { transports, relay } from "./transports.js";
6
+ import { transports, relay, listen } from "./transports.js";
7
7
  import { identifyService } from "libp2p/identify";
8
8
  export const createLibp2pExtended = (opts = {
9
9
  services: {
@@ -26,7 +26,7 @@ export const createLibp2pExtended = (opts = {
26
26
  minConnections: 0,
27
27
  },
28
28
  addresses: {
29
- listen: ["/ip4/127.0.0.1/tcp/0", "/ip4/127.0.0.1/tcp/0/ws"],
29
+ listen: listen(),
30
30
  },
31
31
  transports: transports(),
32
32
  connectionEncryption: [noise()],
@@ -1 +1 @@
1
- {"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../src/libp2p.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4C,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAmBlD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CACnC,OAA4B;IAC3B,QAAQ,EAAE;QACT,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;KAC/B;CACD,EACyB,EAAE;IAC5B,MAAM,aAAa,GAAG;QACrB,KAAK,EAAE,KAAK,EAAE;QACd,QAAQ,EAAE,eAAe,EAAE;KAC3B,CAAC;IAEF,kDAAkD;IAClD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1C,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YACrC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;SAC1B;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;QACnB,iBAAiB,EAAE;YAClB,cAAc,EAAE,CAAC;SACjB;QACD,SAAS,EAAE;YACV,MAAM,EAAE,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;SAC3D;QACD,UAAU,EAAE,UAAU,EAAE;QACxB,oBAAoB,EAAE,CAAC,KAAK,EAAE,CAAC;QAC/B,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,GAAG,IAAI;QACP,QAAQ,EAAE;YACT,GAAG,aAAa;YAChB,MAAM,EACL,IAAI,CAAC,QAAQ,EAAE,MAAM;gBACrB,CAAC,CAAC,CAAC,EAAE,EAAE,CACN,IAAI,SAAS,CAAC,CAAC,EAAE;oBAChB,eAAe,EAAE,IAAI;oBACrB,eAAe,EAAE,cAAc;oBAC/B,iBAAiB,EAAE;wBAClB,QAAQ,EAAE,IAAI;qBACd;iBACD,CAAC,CAAC;YACL,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5D,GAAG,IAAI,CAAC,QAAQ;SAChB;KACD,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../src/libp2p.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4C,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAmBlD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CACnC,OAA4B;IAC3B,QAAQ,EAAE;QACT,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;KAC/B;CACD,EACyB,EAAE;IAC5B,MAAM,aAAa,GAAG;QACrB,KAAK,EAAE,KAAK,EAAE;QACd,QAAQ,EAAE,eAAe,EAAE;KAC3B,CAAC;IAEF,kDAAkD;IAClD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1C,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YACrC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;SAC1B;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;QACnB,iBAAiB,EAAE;YAClB,cAAc,EAAE,CAAC;SACjB;QACD,SAAS,EAAE;YACV,MAAM,EAAE,MAAM,EAAE;SAChB;QACD,UAAU,EAAE,UAAU,EAAE;QACxB,oBAAoB,EAAE,CAAC,KAAK,EAAE,CAAC;QAC/B,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,GAAG,IAAI;QACP,QAAQ,EAAE;YACT,GAAG,aAAa;YAChB,MAAM,EACL,IAAI,CAAC,QAAQ,EAAE,MAAM;gBACrB,CAAC,CAAC,CAAC,EAAE,EAAE,CACN,IAAI,SAAS,CAAC,CAAC,EAAE;oBAChB,eAAe,EAAE,IAAI;oBACrB,eAAe,EAAE,cAAc;oBAC/B,iBAAiB,EAAE;wBAClB,QAAQ,EAAE,IAAI;qBACd;iBACD,CAAC,CAAC;YACL,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5D,GAAG,IAAI,CAAC,QAAQ;SAChB;KACD,CAAC,CAAC;AACJ,CAAC,CAAC"}
package/lib/esm/peer.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import LazyLevel from "@peerbit/lazy-level";
2
2
  import { Multiaddr } from "@multiformats/multiaddr";
3
3
  import { Ed25519Keypair, Libp2pKeychain } from "@peerbit/crypto";
4
- import { Program, Address, ProgramInitializationOptions, ProgramClient } from "@peerbit/program";
4
+ import { Program, Address, ProgramClient, ProgramHandler } from "@peerbit/program";
5
5
  import "@libp2p/peer-id";
6
6
  import { Libp2pExtended, Libp2pCreateOptions as ClientCreateOptions } from "./libp2p.js";
7
+ import { OpenOptions } from "@peerbit/program";
7
8
  export declare const logger: import("pino").Logger<import("pino").LoggerOptions | import("pino").DestinationStream>;
8
9
  export type OptionalCreateOptions = {
9
10
  limitSigning?: boolean;
@@ -22,21 +23,15 @@ export type CreateInstanceOptions = {
22
23
  directory?: string;
23
24
  cache?: LazyLevel;
24
25
  } & OptionalCreateOptions;
25
- type ProgramMergeStrategy = "replace" | "reject" | "reuse";
26
- export type OpenOptions<Args> = {
27
- timeout?: number;
28
- existing?: ProgramMergeStrategy;
29
- } & ProgramInitializationOptions<Args>;
30
26
  export declare class Peerbit implements ProgramClient {
31
27
  _libp2p: Libp2pExtended;
32
28
  directory?: string;
33
- programs: Map<string, Program>;
34
29
  limitSigning: boolean;
35
30
  private _cache;
36
31
  private _libp2pExternal?;
37
32
  private _identity;
38
33
  private _keychain;
39
- private _openQueue;
34
+ private _handler;
40
35
  constructor(libp2p: Libp2pExtended, options: CreateOptions);
41
36
  static create(options?: CreateInstanceOptions): Promise<Peerbit>;
42
37
  get libp2p(): Libp2pExtended;
@@ -47,6 +42,7 @@ export declare class Peerbit implements ProgramClient {
47
42
  identify: any;
48
43
  } & import("./libp2p.js").Libp2pExtendServices;
49
44
  get keychain(): Libp2pKeychain;
45
+ get handler(): ProgramHandler;
50
46
  getMultiaddrs(): Multiaddr[];
51
47
  /**
52
48
  * Dial a peer with an Ed25519 peerId
@@ -54,9 +50,7 @@ export declare class Peerbit implements ProgramClient {
54
50
  dial(address: string | Multiaddr | Multiaddr[] | ProgramClient): Promise<boolean>;
55
51
  start(): Promise<void>;
56
52
  stop(): Promise<void>;
57
- private _onProgamClose;
58
- private _onProgramOpen;
59
- private checkProcessExisting;
53
+ bootstrap(): Promise<boolean[]>;
60
54
  /**
61
55
  * Default behaviour of a store is only to accept heads that are forks (new roots) with some probability
62
56
  * and to replicate heads (and updates) which is requested by another peer
@@ -64,7 +58,6 @@ export declare class Peerbit implements ProgramClient {
64
58
  * @param options
65
59
  * @returns
66
60
  */
67
- open<S extends Program<Args>, Args = any>(storeOrAddress: S | Address | string, options?: OpenOptions<Args>): Promise<S>;
61
+ open<S extends Program<Args>, Args = any>(storeOrAddress: S | Address | string, options?: OpenOptions<Args, S>): Promise<S>;
68
62
  get memory(): LazyLevel;
69
63
  }
70
- export {};
package/lib/esm/peer.js CHANGED
@@ -3,8 +3,7 @@ import { Level } from "level";
3
3
  import { MemoryLevel } from "memory-level";
4
4
  import { multiaddr, isMultiaddr } from "@multiformats/multiaddr";
5
5
  import { Ed25519Keypair, Ed25519PublicKey, Libp2pKeychain, } from "@peerbit/crypto";
6
- import { Program, } from "@peerbit/program";
7
- import { logger as loggerFn } from "@peerbit/logger";
6
+ import { ProgramHandler, } from "@peerbit/program";
8
7
  import { DirectSub } from "@peerbit/pubsub";
9
8
  import sodium from "libsodium-wrappers";
10
9
  import path from "path-browserify";
@@ -15,7 +14,8 @@ import { createLibp2pExtended, } from "./libp2p.js";
15
14
  import { DirectBlock } from "@peerbit/blocks";
16
15
  import { LevelDatastore } from "datastore-level";
17
16
  import { BinaryWriter } from "@dao-xyz/borsh";
18
- import PQueue from "p-queue";
17
+ import { logger as loggerFn } from "@peerbit/logger";
18
+ import { resolveBootstrapAddresses } from "./bootstrap.js";
19
19
  export const logger = loggerFn({ module: "client" });
20
20
  const isLibp2pInstance = (libp2p) => !!libp2p.getMultiaddrs;
21
21
  const createLevel = (path) => {
@@ -36,15 +36,13 @@ const createCache = async (directory, options) => {
36
36
  export class Peerbit {
37
37
  _libp2p;
38
38
  directory;
39
- /// program address => Program metadata
40
- programs;
41
39
  limitSigning;
42
40
  _cache;
43
41
  _libp2pExternal = false;
44
42
  // Libp2p peerid in Identity form
45
43
  _identity;
46
44
  _keychain; // Keychain + Caching + X25519 keys
47
- _openQueue;
45
+ _handler;
48
46
  constructor(libp2p, options) {
49
47
  if (libp2p == null) {
50
48
  throw new Error("Libp2p required");
@@ -60,11 +58,9 @@ export class Peerbit {
60
58
  this._identity = options.identity;
61
59
  this._keychain = options.keychain;
62
60
  this.directory = options.directory;
63
- this.programs = new Map();
64
61
  this.limitSigning = options.limitSigning || false;
65
62
  this._cache = options.cache;
66
63
  this._libp2pExternal = options.libp2pExternal;
67
- this._openQueue = new PQueue({ concurrency: 1 });
68
64
  }
69
65
  static async create(options = {}) {
70
66
  await sodium.ready; // Some of the modules depends on sodium to be readyy
@@ -167,6 +163,9 @@ export class Peerbit {
167
163
  get keychain() {
168
164
  return this._keychain;
169
165
  }
166
+ get handler() {
167
+ return this._handler;
168
+ }
170
169
  getMultiaddrs() {
171
170
  return this.libp2p.getMultiaddrs();
172
171
  }
@@ -192,54 +191,20 @@ export class Peerbit {
192
191
  }
193
192
  }
194
193
  async stop() {
195
- this._openQueue.clear();
196
- await this._openQueue.onIdle();
197
- // Close all open databases
198
- await Promise.all([...this.programs.values()].map((program) => program.close()));
194
+ await this._handler?.stop();
199
195
  await this._cache.close();
200
196
  // Close libp2p (after above)
201
197
  if (!this._libp2pExternal) {
202
198
  // only close it if we created it
203
199
  await this.libp2p.stop();
204
200
  }
205
- // Remove all databases from the state
206
- this.programs = new Map();
207
201
  }
208
- _onProgamClose(program) {
209
- this.programs.delete(program.address.toString());
210
- }
211
- async _onProgramOpen(program, mergeSrategy) {
212
- const programAddress = program.address?.toString();
213
- if (!programAddress) {
214
- throw new Error("Missing program address");
215
- }
216
- if (this.programs.has(programAddress)) {
217
- // second condition only makes this throw error if we are to add a new instance with the same address
218
- const existing = await this.checkProcessExisting(programAddress, program, mergeSrategy);
219
- if (!existing) {
220
- throw new Error("Unexpected");
221
- }
222
- this.programs.set(programAddress, program);
223
- }
224
- else {
225
- this.programs.set(programAddress, program);
226
- }
227
- }
228
- async checkProcessExisting(address, toOpen, mergeSrategy = "reject") {
229
- const prev = this.programs.get(address);
230
- if (mergeSrategy === "reject") {
231
- if (prev) {
232
- throw new Error(`Program at ${address} is already open`);
233
- }
234
- }
235
- else if (mergeSrategy === "replace") {
236
- if (prev && prev !== toOpen) {
237
- await prev.close(); // clouse previous
238
- }
239
- }
240
- else if (mergeSrategy === "reuse") {
241
- return prev;
202
+ async bootstrap() {
203
+ const addresses = await resolveBootstrapAddresses();
204
+ if (addresses.length === 0) {
205
+ throw new Error("Failed to find any addresses to dial");
242
206
  }
207
+ return Promise.all(addresses.map((x) => this.dial(x)));
243
208
  }
244
209
  /**
245
210
  * Default behaviour of a store is only to accept heads that are forks (new roots) with some probability
@@ -249,80 +214,7 @@ export class Peerbit {
249
214
  * @returns
250
215
  */
251
216
  async open(storeOrAddress, options = {}) {
252
- const fn = async () => {
253
- if (!this.libp2p.isStarted()) {
254
- throw new Error("Can not open a store while disconnected");
255
- }
256
- // TODO add locks for store lifecycle, e.g. what happens if we try to open and close a store at the same time?
257
- let program = storeOrAddress;
258
- if (typeof storeOrAddress === "string") {
259
- try {
260
- if (this.programs?.has(storeOrAddress.toString())) {
261
- const existing = await this.checkProcessExisting(storeOrAddress.toString(), program, options?.existing);
262
- if (existing) {
263
- return existing;
264
- }
265
- }
266
- else {
267
- program = (await Program.load(storeOrAddress, this._libp2p.services.blocks, options)); // TODO fix typings
268
- if (program instanceof Program === false) {
269
- throw new Error(`Failed to open program because program is of type ${program?.constructor.name} and not ${Program.name}`);
270
- }
271
- }
272
- }
273
- catch (error) {
274
- logger.error("Failed to load store with address: " + storeOrAddress.toString());
275
- throw error;
276
- }
277
- }
278
- else if (!program.closed) {
279
- const existing = this.programs.get(program.address);
280
- if (existing === program) {
281
- return program;
282
- }
283
- else if (existing) {
284
- const existing = await this.checkProcessExisting(program.address, program, options?.existing);
285
- if (existing) {
286
- return existing;
287
- }
288
- }
289
- }
290
- logger.debug(`Open database '${program.constructor.name}`);
291
- const address = await program.save(this.services.blocks);
292
- const existing = await this.checkProcessExisting(address, program, options?.existing);
293
- if (existing) {
294
- return existing;
295
- }
296
- await program.beforeOpen(this, {
297
- onBeforeOpen: (p) => {
298
- if (p instanceof Program && p.parents.length === 1 && !p.parents[0]) {
299
- return this._onProgramOpen(p, options?.existing);
300
- }
301
- },
302
- onClose: (p) => {
303
- if (p instanceof Program) {
304
- return this._onProgamClose(p);
305
- }
306
- },
307
- onDrop: (p) => {
308
- if (p instanceof Program) {
309
- return this._onProgamClose(p);
310
- }
311
- },
312
- ...options,
313
- // If the program opens more programs
314
- // reset: options.reset,
315
- });
316
- await program.open(options.args);
317
- await program.afterOpen();
318
- return program;
319
- };
320
- // Prevent deadlocks when a program is opened by another program
321
- // TODO make proper deduplciation behaviour
322
- if (options?.parent) {
323
- return fn();
324
- }
325
- return this._openQueue.add(fn); // TODO p-queue seem to return void type ;
217
+ return (this._handler || (this._handler = new ProgramHandler({ client: this }))).open(storeOrAddress, options);
326
218
  }
327
219
  get memory() {
328
220
  return this._cache;
@@ -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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"}
@@ -1,2 +1,3 @@
1
1
  export declare const transports: () => ((components: import("libp2p/dist/src/circuit-relay/transport").CircuitRelayTransportComponents) => import("@libp2p/interface-transport").Transport)[];
2
2
  export declare const relay: () => undefined;
3
+ export declare const listen: () => string[] | undefined;
@@ -10,4 +10,5 @@ export const transports = () => [
10
10
  webRTC({}),
11
11
  ];
12
12
  export const relay = () => undefined;
13
+ export const listen = () => undefined;
13
14
  //# sourceMappingURL=transports-browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transports-browser.js","sourceRoot":"","sources":["../../src/transports-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,qBAAqB,CAAC;QACrB,cAAc,EAAE,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC"}
1
+ {"version":3,"file":"transports-browser.js","sourceRoot":"","sources":["../../src/transports-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,qBAAqB,CAAC;QACrB,cAAc,EAAE,CAAC;KACjB,CAAC;IACF,MAAM,CAAC,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;AAErC,MAAM,CAAC,MAAM,MAAM,GAA+B,GAAG,EAAE,CAAC,SAAS,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export declare const transports: () => (((components: import("libp2p/dist/src/circuit-relay/transport").CircuitRelayTransportComponents) => import("@libp2p/interface-transport").Transport) | ((components?: import("@libp2p/tcp").TCPComponents | undefined) => import("@libp2p/interface-transport").Transport))[];
2
2
  export declare const relay: () => (components: import("libp2p/dist/src/circuit-relay/server").CircuitRelayServerComponents) => import("libp2p/circuit-relay").CircuitRelayService;
3
+ export declare const listen: () => string[] | undefined;
@@ -9,4 +9,8 @@ export const transports = () => [
9
9
  tcp(),
10
10
  ];
11
11
  export const relay = () => circuitRelayServer({ reservations: { maxReservations: 1000 } });
12
+ export const listen = () => [
13
+ "/ip4/127.0.0.1/tcp/0",
14
+ "/ip4/127.0.0.1/tcp/0/ws",
15
+ ];
12
16
  //# sourceMappingURL=transports.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/transports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACjD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,qBAAqB,EAAE;IACvB,GAAG,EAAE;CACL,CAAC;AACF,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE,CACzB,kBAAkB,CAAC,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"transports.js","sourceRoot":"","sources":["../../src/transports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACjD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,qBAAqB,EAAE;IACvB,GAAG,EAAE;CACL,CAAC;AACF,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,EAAE,CACzB,kBAAkB,CAAC,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,MAAM,GAA+B,GAAG,EAAE,CAAC;IACvD,sBAAsB;IACtB,yBAAyB;CACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peerbit",
3
- "version": "1.1.6",
3
+ "version": "1.2.0",
4
4
  "description": "Peerbit client",
5
5
  "author": "dao.xyz",
6
6
  "license": "MIT",
@@ -10,7 +10,7 @@
10
10
  "url": "https://github.com/dao-xyz/peerbit"
11
11
  },
12
12
  "engines": {
13
- "node": ">=16.15.1"
13
+ "node": ">=18"
14
14
  },
15
15
  "files": [
16
16
  "lib",
@@ -40,17 +40,16 @@
40
40
  "@libp2p/tcp": "^7.0.3",
41
41
  "@libp2p/webrtc": "^2.0.11",
42
42
  "@libp2p/websockets": "^6.0.3",
43
- "@peerbit/blocks": "^1.0.5",
44
- "@peerbit/crypto": "1.0.3",
45
- "@peerbit/lazy-level": "1.0.1",
43
+ "@peerbit/blocks": "^1.0.7",
44
+ "@peerbit/crypto": "1.0.4",
45
+ "@peerbit/lazy-level": "1.0.2",
46
46
  "@peerbit/logger": "1.0.1",
47
- "@peerbit/program": "1.0.6",
48
- "@peerbit/pubsub": "^1.0.5",
47
+ "@peerbit/program": "2.1.0",
48
+ "@peerbit/pubsub": "^1.0.7",
49
49
  "@peerbit/uint8arrays": "3.0.1",
50
50
  "datastore-level": "^10.1.2",
51
51
  "level": "^8.0.0",
52
52
  "memory-level": "^1.0.0",
53
- "p-queue": "^7.3.4",
54
53
  "path-browserify": "^1.0.1"
55
54
  },
56
55
  "devDependencies": {
@@ -74,5 +73,5 @@
74
73
  "p2p",
75
74
  "peer-to-peer"
76
75
  ],
77
- "gitHead": "99e30817f094e45ffcd60f4babd90a717bd26a22"
76
+ "gitHead": "4752c301fb49b2f937b4039533ff5bc3537da3e0"
78
77
  }
@@ -0,0 +1,12 @@
1
+ export const resolveBootstrapAddresses = async (): Promise<string[]> => {
2
+ // Bootstrap addresses for network
3
+ return (
4
+ await (
5
+ await fetch(
6
+ "https://raw.githubusercontent.com/dao-xyz/peerbit-bootstrap/master/bootstrap.env"
7
+ )
8
+ ).text()
9
+ )
10
+ .split(/\r?\n/)
11
+ .filter((x) => x.length > 0);
12
+ };
package/src/libp2p.ts CHANGED
@@ -3,7 +3,7 @@ import { DirectSub } from "@peerbit/pubsub";
3
3
  import { DirectBlock } from "@peerbit/blocks";
4
4
  import { noise } from "@dao-xyz/libp2p-noise";
5
5
  import { mplex } from "@libp2p/mplex";
6
- import { transports, relay } from "./transports.js";
6
+ import { transports, relay, listen } from "./transports.js";
7
7
  import { identifyService } from "libp2p/identify";
8
8
  import { CircuitRelayService } from "libp2p/dist/src/circuit-relay/index.js";
9
9
 
@@ -48,7 +48,7 @@ export const createLibp2pExtended = (
48
48
  minConnections: 0,
49
49
  },
50
50
  addresses: {
51
- listen: ["/ip4/127.0.0.1/tcp/0", "/ip4/127.0.0.1/tcp/0/ws"],
51
+ listen: listen(),
52
52
  },
53
53
  transports: transports(),
54
54
  connectionEncryption: [noise()],
package/src/peer.ts CHANGED
@@ -12,10 +12,9 @@ import {
12
12
  import {
13
13
  Program,
14
14
  Address,
15
- ProgramInitializationOptions,
16
15
  ProgramClient,
16
+ ProgramHandler,
17
17
  } from "@peerbit/program";
18
- import { logger as loggerFn } from "@peerbit/logger";
19
18
  import { DirectSub } from "@peerbit/pubsub";
20
19
  import sodium from "libsodium-wrappers";
21
20
  import path from "path-browserify";
@@ -31,7 +30,9 @@ import {
31
30
  import { DirectBlock } from "@peerbit/blocks";
32
31
  import { LevelDatastore } from "datastore-level";
33
32
  import { BinaryWriter } from "@dao-xyz/borsh";
34
- import PQueue from "p-queue";
33
+ import { logger as loggerFn } from "@peerbit/logger";
34
+ import { OpenOptions } from "@peerbit/program";
35
+ import { resolveBootstrapAddresses } from "./bootstrap.js";
35
36
 
36
37
  export const logger = loggerFn({ module: "client" });
37
38
 
@@ -53,13 +54,6 @@ export type CreateInstanceOptions = {
53
54
  directory?: string;
54
55
  cache?: LazyLevel;
55
56
  } & OptionalCreateOptions;
56
- type ProgramMergeStrategy = "replace" | "reject" | "reuse";
57
- export type OpenOptions<Args> = {
58
- timeout?: number;
59
- existing?: ProgramMergeStrategy;
60
- /*
61
- reset?: boolean; */
62
- } & ProgramInitializationOptions<Args>;
63
57
 
64
58
  const isLibp2pInstance = (libp2p: Libp2pExtended | ClientCreateOptions) =>
65
59
  !!(libp2p as Libp2p).getMultiaddrs;
@@ -90,8 +84,6 @@ export class Peerbit implements ProgramClient {
90
84
 
91
85
  directory?: string;
92
86
 
93
- /// program address => Program metadata
94
- programs: Map<string, Program>;
95
87
  limitSigning: boolean;
96
88
 
97
89
  private _cache: LazyLevel;
@@ -101,8 +93,7 @@ export class Peerbit implements ProgramClient {
101
93
  private _identity: Ed25519Keypair;
102
94
 
103
95
  private _keychain: Libp2pKeychain; // Keychain + Caching + X25519 keys
104
-
105
- private _openQueue: PQueue;
96
+ private _handler: ProgramHandler;
106
97
  constructor(libp2p: Libp2pExtended, options: CreateOptions) {
107
98
  if (libp2p == null) {
108
99
  throw new Error("Libp2p required");
@@ -123,11 +114,9 @@ export class Peerbit implements ProgramClient {
123
114
  this._keychain = options.keychain;
124
115
 
125
116
  this.directory = options.directory;
126
- this.programs = new Map();
127
117
  this.limitSigning = options.limitSigning || false;
128
118
  this._cache = options.cache;
129
119
  this._libp2pExternal = options.libp2pExternal;
130
- this._openQueue = new PQueue({ concurrency: 1 });
131
120
  }
132
121
 
133
122
  static async create(options: CreateInstanceOptions = {}): Promise<Peerbit> {
@@ -248,6 +237,10 @@ export class Peerbit implements ProgramClient {
248
237
  return this._keychain;
249
238
  }
250
239
 
240
+ get handler(): ProgramHandler {
241
+ return this._handler;
242
+ }
243
+
251
244
  getMultiaddrs(): Multiaddr[] {
252
245
  return this.libp2p.getMultiaddrs();
253
246
  }
@@ -283,14 +276,7 @@ export class Peerbit implements ProgramClient {
283
276
  }
284
277
  }
285
278
  async stop() {
286
- this._openQueue.clear();
287
- await this._openQueue.onIdle();
288
-
289
- // Close all open databases
290
- await Promise.all(
291
- [...this.programs.values()].map((program) => program.close())
292
- );
293
-
279
+ await this._handler?.stop();
294
280
  await this._cache.close();
295
281
 
296
282
  // Close libp2p (after above)
@@ -298,57 +284,16 @@ export class Peerbit implements ProgramClient {
298
284
  // only close it if we created it
299
285
  await this.libp2p.stop();
300
286
  }
301
-
302
- // Remove all databases from the state
303
- this.programs = new Map();
304
287
  }
305
288
 
306
- private _onProgamClose(program: Program) {
307
- this.programs.delete(program.address!.toString());
308
- }
309
-
310
- private async _onProgramOpen(
311
- program: Program,
312
- mergeSrategy?: ProgramMergeStrategy
313
- ) {
314
- const programAddress = program.address?.toString();
315
- if (!programAddress) {
316
- throw new Error("Missing program address");
317
- }
318
- if (this.programs.has(programAddress)) {
319
- // second condition only makes this throw error if we are to add a new instance with the same address
320
- const existing = await this.checkProcessExisting(
321
- programAddress,
322
- program,
323
- mergeSrategy
324
- );
325
- if (!existing) {
326
- throw new Error("Unexpected");
327
- }
328
- this.programs.set(programAddress, program);
329
- } else {
330
- this.programs.set(programAddress, program);
289
+ async bootstrap() {
290
+ const addresses = await resolveBootstrapAddresses();
291
+ if (addresses.length === 0) {
292
+ throw new Error("Failed to find any addresses to dial");
331
293
  }
294
+ return Promise.all(addresses.map((x) => this.dial(x)));
332
295
  }
333
296
 
334
- private async checkProcessExisting<S>(
335
- address: Address,
336
- toOpen: S,
337
- mergeSrategy: ProgramMergeStrategy = "reject"
338
- ): Promise<S | undefined> {
339
- const prev = this.programs.get(address);
340
- if (mergeSrategy === "reject") {
341
- if (prev) {
342
- throw new Error(`Program at ${address} is already open`);
343
- }
344
- } else if (mergeSrategy === "replace") {
345
- if (prev && prev !== toOpen) {
346
- await prev.close(); // clouse previous
347
- }
348
- } else if (mergeSrategy === "reuse") {
349
- return prev as S;
350
- }
351
- }
352
297
  /**
353
298
  * Default behaviour of a store is only to accept heads that are forks (new roots) with some probability
354
299
  * and to replicate heads (and updates) which is requested by another peer
@@ -359,105 +304,11 @@ export class Peerbit implements ProgramClient {
359
304
 
360
305
  async open<S extends Program<Args>, Args = any>(
361
306
  storeOrAddress: S | Address | string,
362
- options: OpenOptions<Args> = {}
307
+ options: OpenOptions<Args, S> = {}
363
308
  ): Promise<S> {
364
- const fn = async (): Promise<S> => {
365
- if (!this.libp2p.isStarted()) {
366
- throw new Error("Can not open a store while disconnected");
367
- }
368
-
369
- // TODO add locks for store lifecycle, e.g. what happens if we try to open and close a store at the same time?
370
-
371
- let program = storeOrAddress as S;
372
- if (typeof storeOrAddress === "string") {
373
- try {
374
- if (this.programs?.has(storeOrAddress.toString())) {
375
- const existing = await this.checkProcessExisting(
376
- storeOrAddress.toString(),
377
- program,
378
- options?.existing
379
- );
380
- if (existing) {
381
- return existing;
382
- }
383
- } else {
384
- program = (await Program.load(
385
- storeOrAddress,
386
- this._libp2p.services.blocks,
387
- options
388
- )) as S; // TODO fix typings
389
- if (program instanceof Program === false) {
390
- throw new Error(
391
- `Failed to open program because program is of type ${program?.constructor.name} and not ${Program.name}`
392
- );
393
- }
394
- }
395
- } catch (error) {
396
- logger.error(
397
- "Failed to load store with address: " + storeOrAddress.toString()
398
- );
399
- throw error;
400
- }
401
- } else if (!program.closed) {
402
- const existing = this.programs.get(program.address);
403
- if (existing === program) {
404
- return program;
405
- } else if (existing) {
406
- const existing = await this.checkProcessExisting(
407
- program.address,
408
- program,
409
- options?.existing
410
- );
411
-
412
- if (existing) {
413
- return existing;
414
- }
415
- }
416
- }
417
-
418
- logger.debug(`Open database '${program.constructor.name}`);
419
- const address = await program.save(this.services.blocks);
420
- const existing = await this.checkProcessExisting(
421
- address,
422
- program,
423
- options?.existing
424
- );
425
- if (existing) {
426
- return existing;
427
- }
428
- await program.beforeOpen(this, {
429
- onBeforeOpen: (p) => {
430
- if (p instanceof Program && p.parents.length === 1 && !p.parents[0]) {
431
- return this._onProgramOpen(p, options?.existing);
432
- }
433
- },
434
- onClose: (p) => {
435
- if (p instanceof Program) {
436
- return this._onProgamClose(p);
437
- }
438
- },
439
- onDrop: (p) => {
440
- if (p instanceof Program) {
441
- return this._onProgamClose(p);
442
- }
443
- },
444
- ...options,
445
- // If the program opens more programs
446
- // reset: options.reset,
447
- });
448
-
449
- await program.open(options.args);
450
- await program.afterOpen();
451
-
452
- return program as S;
453
- };
454
-
455
- // Prevent deadlocks when a program is opened by another program
456
- // TODO make proper deduplciation behaviour
457
- if (options?.parent) {
458
- return fn();
459
- }
460
- return this._openQueue.add(fn) as any as S; // TODO p-queue seem to return void type ;
309
+ return (
310
+ this._handler || (this._handler = new ProgramHandler({ client: this }))
311
+ ).open(storeOrAddress, options);
461
312
  }
462
313
 
463
314
  get memory() {
@@ -12,3 +12,5 @@ export const transports = () => [
12
12
  ];
13
13
 
14
14
  export const relay = () => undefined;
15
+
16
+ export const listen: () => string[] | undefined = () => undefined;
package/src/transports.ts CHANGED
@@ -10,3 +10,8 @@ export const transports = () => [
10
10
  ];
11
11
  export const relay = () =>
12
12
  circuitRelayServer({ reservations: { maxReservations: 1000 } });
13
+
14
+ export const listen: () => string[] | undefined = () => [
15
+ "/ip4/127.0.0.1/tcp/0",
16
+ "/ip4/127.0.0.1/tcp/0/ws",
17
+ ];