@libp2p/peer-store 8.1.4 → 8.2.1-05abd49f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +3 -3
  2. package/dist/index.min.js +14 -14
  3. package/dist/src/index.d.ts +6 -6
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +5 -8
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/store.d.ts +4 -4
  8. package/dist/src/store.d.ts.map +1 -1
  9. package/dist/src/store.js +38 -14
  10. package/dist/src/store.js.map +1 -1
  11. package/dist/src/utils/bytes-to-peer.d.ts +3 -3
  12. package/dist/src/utils/bytes-to-peer.d.ts.map +1 -1
  13. package/dist/src/utils/bytes-to-peer.js +6 -4
  14. package/dist/src/utils/bytes-to-peer.js.map +1 -1
  15. package/dist/src/utils/dedupe-addresses.d.ts +2 -2
  16. package/dist/src/utils/dedupe-addresses.js +1 -1
  17. package/dist/src/utils/dedupe-addresses.js.map +1 -1
  18. package/dist/src/utils/peer-data-to-datastore-peer.d.ts +2 -2
  19. package/dist/src/utils/peer-data-to-datastore-peer.js +1 -1
  20. package/dist/src/utils/peer-data-to-datastore-peer.js.map +1 -1
  21. package/dist/src/utils/peer-id-to-datastore-key.d.ts +1 -1
  22. package/dist/src/utils/peer-id-to-datastore-key.d.ts.map +1 -1
  23. package/dist/src/utils/peer-id-to-datastore-key.js +2 -2
  24. package/dist/src/utils/peer-id-to-datastore-key.js.map +1 -1
  25. package/dist/src/utils/to-peer-pb.d.ts +2 -2
  26. package/dist/src/utils/to-peer-pb.js +1 -1
  27. package/dist/src/utils/to-peer-pb.js.map +1 -1
  28. package/package.json +25 -115
  29. package/src/index.ts +9 -14
  30. package/src/store.ts +51 -18
  31. package/src/utils/bytes-to-peer.ts +8 -6
  32. package/src/utils/dedupe-addresses.ts +3 -3
  33. package/src/utils/peer-data-to-datastore-peer.ts +3 -3
  34. package/src/utils/peer-id-to-datastore-key.ts +2 -2
  35. package/src/utils/to-peer-pb.ts +3 -3
  36. package/dist/typedoc-urls.json +0 -16
package/src/index.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import { logger } from '@libp2p/logger'
2
2
  import { RecordEnvelope, PeerRecord } from '@libp2p/peer-record'
3
+ import all from 'it-all'
3
4
  import { PersistentStore, type PeerUpdate } from './store.js'
4
- import type { Libp2pEvents } from '@libp2p/interface-libp2p'
5
- import type { PeerId } from '@libp2p/interface-peer-id'
6
- import type { PeerStore, Peer, PeerData } from '@libp2p/interface-peer-store'
7
- import type { EventEmitter } from '@libp2p/interfaces/events'
5
+ import type { Libp2pEvents } from '@libp2p/interface'
6
+ import type { EventEmitter } from '@libp2p/interface/events'
7
+ import type { PeerId } from '@libp2p/interface/peer-id'
8
+ import type { PeerStore, Peer, PeerData, PeerQuery } from '@libp2p/interface/peer-store'
8
9
  import type { Multiaddr } from '@multiformats/multiaddr'
9
10
  import type { Datastore } from 'interface-datastore'
10
11
 
@@ -41,13 +42,13 @@ export class PersistentPeerStore implements PeerStore {
41
42
  this.store = new PersistentStore(components, init)
42
43
  }
43
44
 
44
- async forEach (fn: (peer: Peer) => void): Promise<void> {
45
+ async forEach (fn: (peer: Peer,) => void, query?: PeerQuery): Promise<void> {
45
46
  log.trace('forEach await read lock')
46
47
  const release = await this.store.lock.readLock()
47
48
  log.trace('forEach got read lock')
48
49
 
49
50
  try {
50
- for await (const peer of this.store.all()) {
51
+ for await (const peer of this.store.all(query)) {
51
52
  fn(peer)
52
53
  }
53
54
  } finally {
@@ -56,19 +57,13 @@ export class PersistentPeerStore implements PeerStore {
56
57
  }
57
58
  }
58
59
 
59
- async all (): Promise<Peer[]> {
60
+ async all (query?: PeerQuery): Promise<Peer[]> {
60
61
  log.trace('all await read lock')
61
62
  const release = await this.store.lock.readLock()
62
63
  log.trace('all got read lock')
63
64
 
64
65
  try {
65
- const output: Peer[] = []
66
-
67
- for await (const peer of this.store.all()) {
68
- output.push(peer)
69
- }
70
-
71
- return output
66
+ return await all(this.store.all(query))
72
67
  } finally {
73
68
  log.trace('all release read lock')
74
69
  release()
package/src/store.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { CodeError } from '@libp2p/interfaces/errors'
1
+ import { CodeError } from '@libp2p/interface/errors'
2
+ import { PeerMap } from '@libp2p/peer-collections'
2
3
  import { peerIdFromBytes } from '@libp2p/peer-id'
3
4
  import mortice, { type Mortice } from 'mortice'
4
5
  import { base32 } from 'multiformats/bases/base32'
@@ -9,10 +10,10 @@ import { bytesToPeer } from './utils/bytes-to-peer.js'
9
10
  import { NAMESPACE_COMMON, peerIdToDatastoreKey } from './utils/peer-id-to-datastore-key.js'
10
11
  import { toPeerPB } from './utils/to-peer-pb.js'
11
12
  import type { AddressFilter, PersistentPeerStoreComponents, PersistentPeerStoreInit } from './index.js'
12
- import type { PeerUpdate as PeerUpdateExternal } from '@libp2p/interface-libp2p'
13
- import type { PeerId } from '@libp2p/interface-peer-id'
14
- import type { Peer, PeerData } from '@libp2p/interface-peer-store'
15
- import type { Datastore } from 'interface-datastore'
13
+ import type { PeerUpdate as PeerUpdateExternal } from '@libp2p/interface'
14
+ import type { PeerId } from '@libp2p/interface/peer-id'
15
+ import type { Peer, PeerData, PeerQuery } from '@libp2p/interface/peer-store'
16
+ import type { Datastore, Key, Query } from 'interface-datastore'
16
17
 
17
18
  /**
18
19
  * Event detail emitted when peer data changes
@@ -21,6 +22,41 @@ export interface PeerUpdate extends PeerUpdateExternal {
21
22
  updated: boolean
22
23
  }
23
24
 
25
+ function decodePeer (key: Key, value: Uint8Array, cache: PeerMap<Peer>): Peer {
26
+ // /peers/${peer-id-as-libp2p-key-cid-string-in-base-32}
27
+ const base32Str = key.toString().split('/')[2]
28
+ const buf = base32.decode(base32Str)
29
+ const peerId = peerIdFromBytes(buf)
30
+
31
+ const cached = cache.get(peerId)
32
+
33
+ if (cached != null) {
34
+ return cached
35
+ }
36
+
37
+ const peer = bytesToPeer(peerId, value)
38
+
39
+ cache.set(peerId, peer)
40
+
41
+ return peer
42
+ }
43
+
44
+ function mapQuery (query: PeerQuery, cache: PeerMap<Peer>): Query {
45
+ if (query == null) {
46
+ return {}
47
+ }
48
+
49
+ return {
50
+ prefix: NAMESPACE_COMMON,
51
+ filters: (query.filters ?? []).map(fn => ({ key, value }) => {
52
+ return fn(decodePeer(key, value, cache))
53
+ }),
54
+ orders: (query.orders ?? []).map(fn => (a, b) => {
55
+ return fn(decodePeer(a.key, a.value, cache), decodePeer(b.key, b.value, cache))
56
+ })
57
+ }
58
+ }
59
+
24
60
  export class PersistentStore {
25
61
  private readonly peerId: PeerId
26
62
  private readonly datastore: Datastore
@@ -96,28 +132,25 @@ export class PersistentStore {
96
132
  return this.#saveIfDifferent(peerId, peerPb, existingBuf, existingPeer)
97
133
  }
98
134
 
99
- async * all (): AsyncGenerator<Peer, void, unknown> {
100
- for await (const { key, value } of this.datastore.query({
101
- prefix: NAMESPACE_COMMON
102
- })) {
103
- // /peers/${peer-id-as-libp2p-key-cid-string-in-base-32}
104
- const base32Str = key.toString().split('/')[2]
105
- const buf = base32.decode(base32Str)
106
- const peerId = peerIdFromBytes(buf)
135
+ async * all (query?: PeerQuery): AsyncGenerator<Peer, void, unknown> {
136
+ const peerCache = new PeerMap<Peer>()
137
+
138
+ for await (const { key, value } of this.datastore.query(mapQuery(query ?? {}, peerCache))) {
139
+ const peer = decodePeer(key, value, peerCache)
107
140
 
108
- if (peerId.equals(this.peerId)) {
141
+ if (peer.id.equals(this.peerId)) {
109
142
  // Skip self peer if present
110
143
  continue
111
144
  }
112
145
 
113
- yield bytesToPeer(peerId, value)
146
+ yield peer
114
147
  }
115
148
  }
116
149
 
117
150
  async #findExistingPeer (peerId: PeerId): Promise<{ existingBuf?: Uint8Array, existingPeer?: Peer }> {
118
151
  try {
119
152
  const existingBuf = await this.datastore.get(peerIdToDatastoreKey(peerId))
120
- const existingPeer = await bytesToPeer(peerId, existingBuf)
153
+ const existingPeer = bytesToPeer(peerId, existingBuf)
121
154
 
122
155
  return {
123
156
  existingBuf,
@@ -137,7 +170,7 @@ export class PersistentStore {
137
170
 
138
171
  if (existingBuf != null && uint8ArrayEquals(buf, existingBuf)) {
139
172
  return {
140
- peer: await bytesToPeer(peerId, buf),
173
+ peer: bytesToPeer(peerId, buf),
141
174
  previous: existingPeer,
142
175
  updated: false
143
176
  }
@@ -146,7 +179,7 @@ export class PersistentStore {
146
179
  await this.datastore.put(peerIdToDatastoreKey(peerId), buf)
147
180
 
148
181
  return {
149
- peer: await bytesToPeer(peerId, buf),
182
+ peer: bytesToPeer(peerId, buf),
150
183
  previous: existingPeer,
151
184
  updated: true
152
185
  }
@@ -1,15 +1,17 @@
1
- import { unmarshalPublicKey } from '@libp2p/crypto/keys'
2
- import { createFromPubKey } from '@libp2p/peer-id-factory'
1
+ import { peerIdFromPeerId } from '@libp2p/peer-id'
3
2
  import { multiaddr } from '@multiformats/multiaddr'
4
3
  import { Peer as PeerPB } from '../pb/peer.js'
5
- import type { PeerId } from '@libp2p/interface-peer-id'
6
- import type { Peer, Tag } from '@libp2p/interface-peer-store'
4
+ import type { PeerId } from '@libp2p/interface/peer-id'
5
+ import type { Peer, Tag } from '@libp2p/interface/peer-store'
7
6
 
8
- export async function bytesToPeer (peerId: PeerId, buf: Uint8Array): Promise<Peer> {
7
+ export function bytesToPeer (peerId: PeerId, buf: Uint8Array): Peer {
9
8
  const peer = PeerPB.decode(buf)
10
9
 
11
10
  if (peer.publicKey != null && peerId.publicKey == null) {
12
- peerId = await createFromPubKey(unmarshalPublicKey(peer.publicKey))
11
+ peerId = peerIdFromPeerId({
12
+ ...peerId,
13
+ publicKey: peerId.publicKey
14
+ })
13
15
  }
14
16
 
15
17
  const tags = new Map<string, Tag>()
@@ -1,10 +1,10 @@
1
- import { CodeError } from '@libp2p/interfaces/errors'
1
+ import { CodeError } from '@libp2p/interface/errors'
2
2
  import { isMultiaddr, multiaddr } from '@multiformats/multiaddr'
3
3
  import { codes } from '../errors.js'
4
4
  import type { AddressFilter } from '../index.js'
5
5
  import type { Address as AddressPB } from '../pb/peer.js'
6
- import type { PeerId } from '@libp2p/interface-peer-id'
7
- import type { Address } from '@libp2p/interface-peer-store'
6
+ import type { PeerId } from '@libp2p/interface/peer-id'
7
+ import type { Address } from '@libp2p/interface/peer-store'
8
8
 
9
9
  export async function dedupeFilterAndSortAddresses (peerId: PeerId, filter: AddressFilter, addresses: Array<Address | AddressPB | undefined>): Promise<AddressPB[]> {
10
10
  const addressMap = new Map<string, Address>()
@@ -1,11 +1,11 @@
1
1
 
2
- import { CodeError } from '@libp2p/interfaces/errors'
2
+ import { CodeError } from '@libp2p/interface/errors'
3
3
  import { isMultiaddr } from '@multiformats/multiaddr'
4
4
  import { equals as uint8arrayEquals } from 'uint8arrays/equals'
5
5
  import { codes } from '../errors.js'
6
6
  import type { Peer as PeerPB } from '../pb/peer.js'
7
- import type { PeerId } from '@libp2p/interface-peer-id'
8
- import type { PeerData } from '@libp2p/interface-peer-store'
7
+ import type { PeerId } from '@libp2p/interface/peer-id'
8
+ import type { PeerData } from '@libp2p/interface/peer-store'
9
9
 
10
10
  export function toDatastorePeer (peerId: PeerId, data: PeerData): PeerPB {
11
11
  if (data == null) {
@@ -1,5 +1,5 @@
1
- import { isPeerId, type PeerId } from '@libp2p/interface-peer-id'
2
- import { CodeError } from '@libp2p/interfaces/errors'
1
+ import { CodeError } from '@libp2p/interface/errors'
2
+ import { isPeerId, type PeerId } from '@libp2p/interface/peer-id'
3
3
  import { Key } from 'interface-datastore/key'
4
4
  import { codes } from '../errors.js'
5
5
 
@@ -1,11 +1,11 @@
1
- import { CodeError } from '@libp2p/interfaces/errors'
1
+ import { CodeError } from '@libp2p/interface/errors'
2
2
  import { equals as uint8arrayEquals } from 'uint8arrays/equals'
3
3
  import { codes } from '../errors.js'
4
4
  import { dedupeFilterAndSortAddresses } from './dedupe-addresses.js'
5
5
  import type { AddressFilter } from '../index.js'
6
6
  import type { Tag, Peer as PeerPB } from '../pb/peer.js'
7
- import type { PeerId } from '@libp2p/interface-peer-id'
8
- import type { Address, Peer, PeerData, TagOptions } from '@libp2p/interface-peer-store'
7
+ import type { PeerId } from '@libp2p/interface/peer-id'
8
+ import type { Address, Peer, PeerData, TagOptions } from '@libp2p/interface/peer-store'
9
9
 
10
10
  export interface ToPBPeerOptions {
11
11
  addressFilter?: AddressFilter
@@ -1,16 +0,0 @@
1
- {
2
- "codec": "https://libp2p.github.io/js-libp2p-peer-store/functions/_internal_.Address.codec.html",
3
- "decode": "https://libp2p.github.io/js-libp2p-peer-store/functions/_internal_.Address.decode.html",
4
- "encode": "https://libp2p.github.io/js-libp2p-peer-store/functions/_internal_.Address.encode.html",
5
- "Peer$metadataEntry": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/_internal_.Peer.Peer_metadataEntry-1.html",
6
- "Peer$tagsEntry": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/_internal_.Peer.Peer_tagsEntry-1.html",
7
- "PersistentStore": "https://libp2p.github.io/js-libp2p-peer-store/classes/_internal_.PersistentStore.html",
8
- "Address": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/_internal_.Address-1.html",
9
- "Peer": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/_internal_.Peer-1.html",
10
- "PeerUpdate": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/_internal_.PeerUpdate.html",
11
- "Tag": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/_internal_.Tag-1.html",
12
- "PersistentPeerStore": "https://libp2p.github.io/js-libp2p-peer-store/classes/PersistentPeerStore.html",
13
- "AddressFilter": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/AddressFilter.html",
14
- "PersistentPeerStoreComponents": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/PersistentPeerStoreComponents.html",
15
- "PersistentPeerStoreInit": "https://libp2p.github.io/js-libp2p-peer-store/interfaces/PersistentPeerStoreInit.html"
16
- }