@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.
- package/README.md +3 -3
- package/dist/index.min.js +14 -14
- package/dist/src/index.d.ts +6 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/store.d.ts +4 -4
- package/dist/src/store.d.ts.map +1 -1
- package/dist/src/store.js +38 -14
- package/dist/src/store.js.map +1 -1
- package/dist/src/utils/bytes-to-peer.d.ts +3 -3
- package/dist/src/utils/bytes-to-peer.d.ts.map +1 -1
- package/dist/src/utils/bytes-to-peer.js +6 -4
- package/dist/src/utils/bytes-to-peer.js.map +1 -1
- package/dist/src/utils/dedupe-addresses.d.ts +2 -2
- package/dist/src/utils/dedupe-addresses.js +1 -1
- package/dist/src/utils/dedupe-addresses.js.map +1 -1
- package/dist/src/utils/peer-data-to-datastore-peer.d.ts +2 -2
- package/dist/src/utils/peer-data-to-datastore-peer.js +1 -1
- package/dist/src/utils/peer-data-to-datastore-peer.js.map +1 -1
- package/dist/src/utils/peer-id-to-datastore-key.d.ts +1 -1
- package/dist/src/utils/peer-id-to-datastore-key.d.ts.map +1 -1
- package/dist/src/utils/peer-id-to-datastore-key.js +2 -2
- package/dist/src/utils/peer-id-to-datastore-key.js.map +1 -1
- package/dist/src/utils/to-peer-pb.d.ts +2 -2
- package/dist/src/utils/to-peer-pb.js +1 -1
- package/dist/src/utils/to-peer-pb.js.map +1 -1
- package/package.json +25 -115
- package/src/index.ts +9 -14
- package/src/store.ts +51 -18
- package/src/utils/bytes-to-peer.ts +8 -6
- package/src/utils/dedupe-addresses.ts +3 -3
- package/src/utils/peer-data-to-datastore-peer.ts +3 -3
- package/src/utils/peer-id-to-datastore-key.ts +2 -2
- package/src/utils/to-peer-pb.ts +3 -3
- 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
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
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
|
-
|
|
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/
|
|
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
|
|
13
|
-
import type { PeerId } from '@libp2p/interface
|
|
14
|
-
import type { Peer, PeerData } from '@libp2p/interface
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
})) {
|
|
103
|
-
|
|
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 (
|
|
141
|
+
if (peer.id.equals(this.peerId)) {
|
|
109
142
|
// Skip self peer if present
|
|
110
143
|
continue
|
|
111
144
|
}
|
|
112
145
|
|
|
113
|
-
yield
|
|
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 =
|
|
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:
|
|
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:
|
|
182
|
+
peer: bytesToPeer(peerId, buf),
|
|
150
183
|
previous: existingPeer,
|
|
151
184
|
updated: true
|
|
152
185
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import {
|
|
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
|
|
6
|
-
import type { Peer, Tag } from '@libp2p/interface
|
|
4
|
+
import type { PeerId } from '@libp2p/interface/peer-id'
|
|
5
|
+
import type { Peer, Tag } from '@libp2p/interface/peer-store'
|
|
7
6
|
|
|
8
|
-
export
|
|
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 =
|
|
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/
|
|
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
|
|
7
|
-
import type { Address } from '@libp2p/interface
|
|
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/
|
|
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
|
|
8
|
-
import type { PeerData } from '@libp2p/interface
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
|
package/src/utils/to-peer-pb.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { CodeError } from '@libp2p/
|
|
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
|
|
8
|
-
import type { Address, Peer, PeerData, TagOptions } from '@libp2p/interface
|
|
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
|
package/dist/typedoc-urls.json
DELETED
|
@@ -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
|
-
}
|