@libp2p/peer-store 7.0.2 → 8.1.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.
Files changed (76) hide show
  1. package/README.md +0 -170
  2. package/dist/index.min.js +12 -12
  3. package/dist/src/errors.d.ts +0 -1
  4. package/dist/src/errors.d.ts.map +1 -1
  5. package/dist/src/errors.js +1 -2
  6. package/dist/src/errors.js.map +1 -1
  7. package/dist/src/index.d.ts +24 -25
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +120 -87
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/pb/peer.d.ts +28 -9
  12. package/dist/src/pb/peer.d.ts.map +1 -1
  13. package/dist/src/pb/peer.js +147 -31
  14. package/dist/src/pb/peer.js.map +1 -1
  15. package/dist/src/store.d.ts +18 -28
  16. package/dist/src/store.d.ts.map +1 -1
  17. package/dist/src/store.js +77 -147
  18. package/dist/src/store.js.map +1 -1
  19. package/dist/src/utils/bytes-to-peer.d.ts +4 -0
  20. package/dist/src/utils/bytes-to-peer.d.ts.map +1 -0
  21. package/dist/src/utils/bytes-to-peer.js +33 -0
  22. package/dist/src/utils/bytes-to-peer.js.map +1 -0
  23. package/dist/src/utils/dedupe-addresses.d.ts +6 -0
  24. package/dist/src/utils/dedupe-addresses.d.ts.map +1 -0
  25. package/dist/src/utils/dedupe-addresses.js +41 -0
  26. package/dist/src/utils/dedupe-addresses.js.map +1 -0
  27. package/dist/src/utils/peer-data-to-datastore-peer.d.ts +5 -0
  28. package/dist/src/utils/peer-data-to-datastore-peer.d.ts.map +1 -0
  29. package/dist/src/utils/peer-data-to-datastore-peer.js +92 -0
  30. package/dist/src/utils/peer-data-to-datastore-peer.js.map +1 -0
  31. package/dist/src/utils/peer-id-to-datastore-key.d.ts +5 -0
  32. package/dist/src/utils/peer-id-to-datastore-key.d.ts.map +1 -0
  33. package/dist/src/utils/peer-id-to-datastore-key.js +13 -0
  34. package/dist/src/utils/peer-id-to-datastore-key.js.map +1 -0
  35. package/dist/src/utils/to-peer-pb.d.ts +10 -0
  36. package/dist/src/utils/to-peer-pb.d.ts.map +1 -0
  37. package/dist/src/utils/to-peer-pb.js +182 -0
  38. package/dist/src/utils/to-peer-pb.js.map +1 -0
  39. package/dist/typedoc-urls.json +13 -2
  40. package/package.json +9 -10
  41. package/src/errors.ts +1 -2
  42. package/src/index.ts +133 -97
  43. package/src/pb/peer.proto +10 -7
  44. package/src/pb/peer.ts +187 -37
  45. package/src/store.ts +102 -189
  46. package/src/utils/bytes-to-peer.ts +41 -0
  47. package/src/utils/dedupe-addresses.ts +51 -0
  48. package/src/utils/peer-data-to-datastore-peer.ts +116 -0
  49. package/src/utils/peer-id-to-datastore-key.ts +15 -0
  50. package/src/utils/to-peer-pb.ts +237 -0
  51. package/dist/src/address-book.d.ts +0 -29
  52. package/dist/src/address-book.d.ts.map +0 -1
  53. package/dist/src/address-book.js +0 -304
  54. package/dist/src/address-book.js.map +0 -1
  55. package/dist/src/key-book.d.ts +0 -21
  56. package/dist/src/key-book.d.ts.map +0 -1
  57. package/dist/src/key-book.js +0 -121
  58. package/dist/src/key-book.js.map +0 -1
  59. package/dist/src/metadata-book.d.ts +0 -28
  60. package/dist/src/metadata-book.d.ts.map +0 -1
  61. package/dist/src/metadata-book.js +0 -211
  62. package/dist/src/metadata-book.js.map +0 -1
  63. package/dist/src/pb/tags.d.ts +0 -21
  64. package/dist/src/pb/tags.d.ts.map +0 -1
  65. package/dist/src/pb/tags.js +0 -111
  66. package/dist/src/pb/tags.js.map +0 -1
  67. package/dist/src/proto-book.d.ts +0 -18
  68. package/dist/src/proto-book.d.ts.map +0 -1
  69. package/dist/src/proto-book.js +0 -199
  70. package/dist/src/proto-book.js.map +0 -1
  71. package/src/address-book.ts +0 -367
  72. package/src/key-book.ts +0 -140
  73. package/src/metadata-book.ts +0 -244
  74. package/src/pb/tags.proto +0 -11
  75. package/src/pb/tags.ts +0 -145
  76. package/src/proto-book.ts +0 -234
package/src/key-book.ts DELETED
@@ -1,140 +0,0 @@
1
- import { logger } from '@libp2p/logger'
2
- import { CodeError } from '@libp2p/interfaces/errors'
3
- import { codes } from './errors.js'
4
- import { peerIdFromPeerId } from '@libp2p/peer-id'
5
- import { equals as uint8arrayEquals } from 'uint8arrays/equals'
6
- import { CustomEvent } from '@libp2p/interfaces/events'
7
- import type { Store } from './store.js'
8
- import type { PeerStore, KeyBook, PeerPublicKeyChangeData, Peer } from '@libp2p/interface-peer-store'
9
- import type { PeerId } from '@libp2p/interface-peer-id'
10
-
11
- const log = logger('libp2p:peer-store:key-book')
12
-
13
- const EVENT_NAME = 'change:pubkey'
14
-
15
- export class PeerStoreKeyBook implements KeyBook {
16
- private readonly dispatchEvent: PeerStore['dispatchEvent']
17
- private readonly store: Store
18
-
19
- /**
20
- * The KeyBook is responsible for keeping the known public keys of a peer
21
- */
22
- constructor (dispatchEvent: PeerStore['dispatchEvent'], store: Store) {
23
- this.dispatchEvent = dispatchEvent
24
- this.store = store
25
- }
26
-
27
- /**
28
- * Set the Peer public key
29
- */
30
- async set (peerId: PeerId, publicKey: Uint8Array): Promise<void> {
31
- peerId = peerIdFromPeerId(peerId)
32
-
33
- if (!(publicKey instanceof Uint8Array)) {
34
- log.error('publicKey must be an instance of Uint8Array to store data')
35
- throw new CodeError('publicKey must be an instance of PublicKey', codes.ERR_INVALID_PARAMETERS)
36
- }
37
-
38
- log.trace('set await write lock')
39
- const release = await this.store.lock.writeLock()
40
- log.trace('set got write lock')
41
-
42
- let updatedKey = false
43
- let peer: Peer | undefined
44
-
45
- try {
46
- try {
47
- peer = await this.store.load(peerId)
48
-
49
- if ((peer.pubKey != null) && uint8arrayEquals(peer.pubKey, publicKey)) {
50
- return
51
- }
52
- } catch (err: any) {
53
- if (err.code !== codes.ERR_NOT_FOUND) {
54
- throw err
55
- }
56
- }
57
-
58
- await this.store.patchOrCreate(peerId, {
59
- pubKey: publicKey
60
- })
61
- updatedKey = true
62
- } finally {
63
- log.trace('set release write lock')
64
- release()
65
- }
66
-
67
- if (updatedKey) {
68
- this.dispatchEvent(new CustomEvent<PeerPublicKeyChangeData>(EVENT_NAME, {
69
- detail: {
70
- peerId,
71
- publicKey,
72
- oldPublicKey: peer == null ? undefined : peer.pubKey
73
- }
74
- }))
75
- }
76
- }
77
-
78
- /**
79
- * Get Public key of the given PeerId, if stored
80
- */
81
- async get (peerId: PeerId): Promise<Uint8Array | undefined> {
82
- peerId = peerIdFromPeerId(peerId)
83
-
84
- log.trace('get await write lock')
85
- const release = await this.store.lock.readLock()
86
- log.trace('get got write lock')
87
-
88
- try {
89
- const peer = await this.store.load(peerId)
90
-
91
- return peer.pubKey
92
- } catch (err: any) {
93
- if (err.code !== codes.ERR_NOT_FOUND) {
94
- throw err
95
- }
96
- } finally {
97
- log('get release write lock')
98
- release()
99
- }
100
- }
101
-
102
- async delete (peerId: PeerId): Promise<void> {
103
- peerId = peerIdFromPeerId(peerId)
104
-
105
- log.trace('delete await write lock')
106
- const release = await this.store.lock.writeLock()
107
- log.trace('delete got write lock')
108
-
109
- let peer: Peer | undefined
110
-
111
- try {
112
- try {
113
- peer = await this.store.load(peerId)
114
- } catch (err: any) {
115
- if (err.code !== codes.ERR_NOT_FOUND) {
116
- throw err
117
- }
118
- }
119
-
120
- await this.store.patchOrCreate(peerId, {
121
- pubKey: undefined
122
- })
123
- } catch (err: any) {
124
- if (err.code !== codes.ERR_NOT_FOUND) {
125
- throw err
126
- }
127
- } finally {
128
- log.trace('delete release write lock')
129
- release()
130
- }
131
-
132
- this.dispatchEvent(new CustomEvent<PeerPublicKeyChangeData>(EVENT_NAME, {
133
- detail: {
134
- peerId,
135
- publicKey: undefined,
136
- oldPublicKey: peer == null ? undefined : peer.pubKey
137
- }
138
- }))
139
- }
140
- }
@@ -1,244 +0,0 @@
1
- import { logger } from '@libp2p/logger'
2
- import { CodeError } from '@libp2p/interfaces/errors'
3
- import { codes } from './errors.js'
4
- import { peerIdFromPeerId } from '@libp2p/peer-id'
5
- import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
6
- import { CustomEvent } from '@libp2p/interfaces/events'
7
- import type { Store } from './store.js'
8
- import type { PeerStore, MetadataBook, PeerMetadataChangeData, Peer } from '@libp2p/interface-peer-store'
9
- import type { PeerId } from '@libp2p/interface-peer-id'
10
-
11
- const log = logger('libp2p:peer-store:metadata-book')
12
-
13
- const EVENT_NAME = 'change:metadata'
14
-
15
- export class PeerStoreMetadataBook implements MetadataBook {
16
- private readonly dispatchEvent: PeerStore['dispatchEvent']
17
- private readonly store: Store
18
-
19
- /**
20
- * The MetadataBook is responsible for keeping metadata
21
- * about known peers
22
- */
23
- constructor (dispatchEvent: PeerStore['dispatchEvent'], store: Store) {
24
- this.dispatchEvent = dispatchEvent
25
- this.store = store
26
- }
27
-
28
- /**
29
- * Get the known data of a provided peer
30
- */
31
- async get (peerId: PeerId): Promise<Map<string, Uint8Array>> {
32
- peerId = peerIdFromPeerId(peerId)
33
-
34
- log.trace('get await read lock')
35
- const release = await this.store.lock.readLock()
36
- log.trace('get got read lock')
37
-
38
- try {
39
- const peer = await this.store.load(peerId)
40
-
41
- return peer.metadata
42
- } catch (err: any) {
43
- if (err.code !== codes.ERR_NOT_FOUND) {
44
- throw err
45
- }
46
- } finally {
47
- log.trace('get release read lock')
48
- release()
49
- }
50
-
51
- return new Map()
52
- }
53
-
54
- /**
55
- * Get specific metadata value, if it exists
56
- */
57
- async getValue (peerId: PeerId, key: string): Promise<Uint8Array | undefined> {
58
- peerId = peerIdFromPeerId(peerId)
59
-
60
- log.trace('getValue await read lock')
61
- const release = await this.store.lock.readLock()
62
- log.trace('getValue got read lock')
63
-
64
- try {
65
- const peer = await this.store.load(peerId)
66
-
67
- return peer.metadata.get(key)
68
- } catch (err: any) {
69
- if (err.code !== codes.ERR_NOT_FOUND) {
70
- throw err
71
- }
72
- } finally {
73
- log.trace('getValue release write lock')
74
- release()
75
- }
76
- }
77
-
78
- async set (peerId: PeerId, metadata: Map<string, Uint8Array>): Promise<void> {
79
- peerId = peerIdFromPeerId(peerId)
80
-
81
- if (!(metadata instanceof Map)) {
82
- log.error('valid metadata must be provided to store data')
83
- throw new CodeError('valid metadata must be provided', codes.ERR_INVALID_PARAMETERS)
84
- }
85
-
86
- log.trace('set await write lock')
87
- const release = await this.store.lock.writeLock()
88
- log.trace('set got write lock')
89
-
90
- let peer: Peer | undefined
91
-
92
- try {
93
- try {
94
- peer = await this.store.load(peerId)
95
- } catch (err: any) {
96
- if (err.code !== codes.ERR_NOT_FOUND) {
97
- throw err
98
- }
99
- }
100
-
101
- await this.store.mergeOrCreate(peerId, {
102
- metadata
103
- })
104
- } finally {
105
- log.trace('set release write lock')
106
- release()
107
- }
108
-
109
- this.dispatchEvent(new CustomEvent<PeerMetadataChangeData>(EVENT_NAME, {
110
- detail: {
111
- peerId,
112
- metadata,
113
- oldMetadata: peer == null ? new Map() : peer.metadata
114
- }
115
- }))
116
- }
117
-
118
- /**
119
- * Set metadata key and value of a provided peer
120
- */
121
- async setValue (peerId: PeerId, key: string, value: Uint8Array): Promise<void> {
122
- peerId = peerIdFromPeerId(peerId)
123
-
124
- if (typeof key !== 'string' || !(value instanceof Uint8Array)) {
125
- log.error('valid key and value must be provided to store data')
126
- throw new CodeError('valid key and value must be provided', codes.ERR_INVALID_PARAMETERS)
127
- }
128
-
129
- log.trace('setValue await write lock')
130
- const release = await this.store.lock.writeLock()
131
- log.trace('setValue got write lock')
132
-
133
- let peer: Peer | undefined
134
- let updatedPeer
135
-
136
- try {
137
- try {
138
- peer = await this.store.load(peerId)
139
- const existingValue = peer.metadata.get(key)
140
-
141
- if (existingValue != null && uint8ArrayEquals(value, existingValue)) {
142
- return
143
- }
144
- } catch (err: any) {
145
- if (err.code !== codes.ERR_NOT_FOUND) {
146
- throw err
147
- }
148
- }
149
-
150
- updatedPeer = await this.store.mergeOrCreate(peerId, {
151
- metadata: new Map([[key, value]])
152
- })
153
- } finally {
154
- log.trace('setValue release write lock')
155
- release()
156
- }
157
-
158
- this.dispatchEvent(new CustomEvent<PeerMetadataChangeData>(EVENT_NAME, {
159
- detail: {
160
- peerId,
161
- metadata: updatedPeer.metadata,
162
- oldMetadata: peer == null ? new Map() : peer.metadata
163
- }
164
- }))
165
- }
166
-
167
- async delete (peerId: PeerId): Promise<void> {
168
- peerId = peerIdFromPeerId(peerId)
169
-
170
- log.trace('delete await write lock')
171
- const release = await this.store.lock.writeLock()
172
- log.trace('delete got write lock')
173
-
174
- let peer: Peer | undefined
175
-
176
- try {
177
- try {
178
- peer = await this.store.load(peerId)
179
- } catch (err: any) {
180
- if (err.code !== codes.ERR_NOT_FOUND) {
181
- throw err
182
- }
183
- }
184
-
185
- if (peer != null) {
186
- await this.store.patch(peerId, {
187
- metadata: new Map()
188
- })
189
- }
190
- } finally {
191
- log.trace('delete release write lock')
192
- release()
193
- }
194
-
195
- if (peer != null) {
196
- this.dispatchEvent(new CustomEvent<PeerMetadataChangeData>(EVENT_NAME, {
197
- detail: {
198
- peerId,
199
- metadata: new Map(),
200
- oldMetadata: peer.metadata
201
- }
202
- }))
203
- }
204
- }
205
-
206
- async deleteValue (peerId: PeerId, key: string): Promise<void> {
207
- peerId = peerIdFromPeerId(peerId)
208
-
209
- log.trace('deleteValue await write lock')
210
- const release = await this.store.lock.writeLock()
211
- log.trace('deleteValue got write lock')
212
-
213
- let metadata
214
- let peer: Peer | undefined
215
-
216
- try {
217
- peer = await this.store.load(peerId)
218
- metadata = peer.metadata
219
-
220
- metadata.delete(key)
221
-
222
- await this.store.patch(peerId, {
223
- metadata
224
- })
225
- } catch (err: any) {
226
- if (err.code !== codes.ERR_NOT_FOUND) {
227
- throw err
228
- }
229
- } finally {
230
- log.trace('deleteValue release write lock')
231
- release()
232
- }
233
-
234
- if (metadata != null) {
235
- this.dispatchEvent(new CustomEvent<PeerMetadataChangeData>(EVENT_NAME, {
236
- detail: {
237
- peerId,
238
- metadata,
239
- oldMetadata: peer == null ? new Map() : peer.metadata
240
- }
241
- }))
242
- }
243
- }
244
- }
package/src/pb/tags.proto DELETED
@@ -1,11 +0,0 @@
1
- syntax = "proto3";
2
-
3
- message Tags {
4
- repeated Tag tags = 1;
5
- }
6
-
7
- message Tag {
8
- string name = 1; // e.g. 'priority'
9
- optional uint32 value = 2; // tag value 0-100
10
- optional uint64 expiry = 3; // ms timestamp after which the tag is no longer valid
11
- }
package/src/pb/tags.ts DELETED
@@ -1,145 +0,0 @@
1
- /* eslint-disable import/export */
2
- /* eslint-disable complexity */
3
- /* eslint-disable @typescript-eslint/no-namespace */
4
- /* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
5
- /* eslint-disable @typescript-eslint/no-empty-interface */
6
-
7
- import { encodeMessage, decodeMessage, message } from 'protons-runtime'
8
- import type { Codec } from 'protons-runtime'
9
- import type { Uint8ArrayList } from 'uint8arraylist'
10
-
11
- export interface Tags {
12
- tags: Tag[]
13
- }
14
-
15
- export namespace Tags {
16
- let _codec: Codec<Tags>
17
-
18
- export const codec = (): Codec<Tags> => {
19
- if (_codec == null) {
20
- _codec = message<Tags>((obj, w, opts = {}) => {
21
- if (opts.lengthDelimited !== false) {
22
- w.fork()
23
- }
24
-
25
- if (obj.tags != null) {
26
- for (const value of obj.tags) {
27
- w.uint32(10)
28
- Tag.codec().encode(value, w)
29
- }
30
- }
31
-
32
- if (opts.lengthDelimited !== false) {
33
- w.ldelim()
34
- }
35
- }, (reader, length) => {
36
- const obj: any = {
37
- tags: []
38
- }
39
-
40
- const end = length == null ? reader.len : reader.pos + length
41
-
42
- while (reader.pos < end) {
43
- const tag = reader.uint32()
44
-
45
- switch (tag >>> 3) {
46
- case 1:
47
- obj.tags.push(Tag.codec().decode(reader, reader.uint32()))
48
- break
49
- default:
50
- reader.skipType(tag & 7)
51
- break
52
- }
53
- }
54
-
55
- return obj
56
- })
57
- }
58
-
59
- return _codec
60
- }
61
-
62
- export const encode = (obj: Partial<Tags>): Uint8Array => {
63
- return encodeMessage(obj, Tags.codec())
64
- }
65
-
66
- export const decode = (buf: Uint8Array | Uint8ArrayList): Tags => {
67
- return decodeMessage(buf, Tags.codec())
68
- }
69
- }
70
-
71
- export interface Tag {
72
- name: string
73
- value?: number
74
- expiry?: bigint
75
- }
76
-
77
- export namespace Tag {
78
- let _codec: Codec<Tag>
79
-
80
- export const codec = (): Codec<Tag> => {
81
- if (_codec == null) {
82
- _codec = message<Tag>((obj, w, opts = {}) => {
83
- if (opts.lengthDelimited !== false) {
84
- w.fork()
85
- }
86
-
87
- if ((obj.name != null && obj.name !== '')) {
88
- w.uint32(10)
89
- w.string(obj.name)
90
- }
91
-
92
- if (obj.value != null) {
93
- w.uint32(16)
94
- w.uint32(obj.value)
95
- }
96
-
97
- if (obj.expiry != null) {
98
- w.uint32(24)
99
- w.uint64(obj.expiry)
100
- }
101
-
102
- if (opts.lengthDelimited !== false) {
103
- w.ldelim()
104
- }
105
- }, (reader, length) => {
106
- const obj: any = {
107
- name: ''
108
- }
109
-
110
- const end = length == null ? reader.len : reader.pos + length
111
-
112
- while (reader.pos < end) {
113
- const tag = reader.uint32()
114
-
115
- switch (tag >>> 3) {
116
- case 1:
117
- obj.name = reader.string()
118
- break
119
- case 2:
120
- obj.value = reader.uint32()
121
- break
122
- case 3:
123
- obj.expiry = reader.uint64()
124
- break
125
- default:
126
- reader.skipType(tag & 7)
127
- break
128
- }
129
- }
130
-
131
- return obj
132
- })
133
- }
134
-
135
- return _codec
136
- }
137
-
138
- export const encode = (obj: Partial<Tag>): Uint8Array => {
139
- return encodeMessage(obj, Tag.codec())
140
- }
141
-
142
- export const decode = (buf: Uint8Array | Uint8ArrayList): Tag => {
143
- return decodeMessage(buf, Tag.codec())
144
- }
145
- }