Skip to content

Commit 222bb7b

Browse files
committed
chore: add typedefs peerstore book template
1 parent aa98bc2 commit 222bb7b

File tree

5 files changed

+55
-74
lines changed

5 files changed

+55
-74
lines changed

src/peer-store/address-book.js

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ const Envelope = require('../record/envelope')
3333
*
3434
* @typedef {Object} Entry
3535
* @property {Address[]} addresses peer Addresses.
36-
* @property {CertifiedRecord} record certified peer record.
36+
* @property {CertifiedRecord} [record] certified peer record.
3737
*/
3838

3939
/**
40-
* @extends {Book}
40+
* @extends {Book<Entry, Address[], Multiaddr[]>}
4141
*/
4242
class AddressBook extends Book {
4343
/**
@@ -56,12 +56,13 @@ class AddressBook extends Book {
5656
peerStore,
5757
eventName: 'change:multiaddrs',
5858
eventProperty: 'multiaddrs',
59-
eventTransformer: (data) => {
60-
if (!data.addresses) {
59+
eventTransformer: (entry) => {
60+
if (!entry || !entry.addresses) {
6161
return []
6262
}
63-
return data.addresses.map((address) => address.multiaddr)
64-
}
63+
return entry.addresses.map((address) => address.multiaddr)
64+
},
65+
getTransformer: (entry) => entry && entry.addresses ? [...entry.addresses] : undefined
6566
})
6667

6768
/**
@@ -263,23 +264,6 @@ class AddressBook extends Book {
263264
return this
264265
}
265266

266-
/**
267-
* Get the known data of a provided peer.
268-
*
269-
* @override
270-
* @param {PeerId} peerId
271-
* @returns {Address[]|undefined}
272-
*/
273-
get (peerId) {
274-
if (!PeerId.isPeerId(peerId)) {
275-
throw errcode(new Error('peerId must be an instance of peer-id'), ERR_INVALID_PARAMETERS)
276-
}
277-
278-
const entry = this.data.get(peerId.toB58String())
279-
280-
return entry && entry.addresses ? [...entry.addresses] : undefined
281-
}
282-
283267
/**
284268
* Transforms received multiaddrs into Address.
285269
*

src/peer-store/book.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ const passthrough = data => data
1313
* @typedef {import('./')} PeerStore
1414
*/
1515

16+
/**
17+
* @template Data, GetData, EventData
18+
*/
1619
class Book {
1720
/**
1821
* The Book is the skeleton for the PeerStore books.
@@ -22,18 +25,20 @@ class Book {
2225
* @param {PeerStore} properties.peerStore - PeerStore instance.
2326
* @param {string} properties.eventName - Name of the event to emit by the PeerStore.
2427
* @param {string} properties.eventProperty - Name of the property to emit by the PeerStore.
25-
* @param {(data: any) => any[]} [properties.eventTransformer] - Transformer function of the provided data for being emitted.
28+
* @param {(data: Data | undefined) => EventData | undefined} [properties.eventTransformer] - Transformer function of the provided data for being emitted.
29+
* @param {(data: Data | undefined) => GetData | undefined} [properties.getTransformer] - Transformer function of the provided data for being returned on get.
2630
*/
27-
constructor ({ peerStore, eventName, eventProperty, eventTransformer = passthrough }) {
31+
constructor ({ peerStore, eventName, eventProperty, eventTransformer = passthrough, getTransformer = passthrough }) {
2832
this._ps = peerStore
2933
this.eventName = eventName
3034
this.eventProperty = eventProperty
3135
this.eventTransformer = eventTransformer
36+
this.getTransformer = getTransformer
3237

3338
/**
3439
* Map known peers to their data.
3540
*
36-
* @type {Map<string, any[]|any>}
41+
* @type {Map<string, Data>}
3742
*/
3843
this.data = new Map()
3944
}
@@ -42,7 +47,7 @@ class Book {
4247
* Set known data of a provided peer.
4348
*
4449
* @param {PeerId} peerId
45-
* @param {any[]|any} data
50+
* @param {unknown} data
4651
*/
4752
set (peerId, data) {
4853
throw errcode(new Error('set must be implemented by the subclass'), 'ERR_NOT_IMPLEMENTED')
@@ -53,7 +58,7 @@ class Book {
5358
*
5459
* @protected
5560
* @param {PeerId} peerId - peerId of the data to store
56-
* @param {any} data - data to store.
61+
* @param {Data} data - data to store.
5762
* @param {Object} [options] - storing options.
5863
* @param {boolean} [options.emit = true] - emit the provided data.
5964
* @returns {void}
@@ -73,7 +78,7 @@ class Book {
7378
*
7479
* @protected
7580
* @param {PeerId} peerId
76-
* @param {any} [data]
81+
* @param {Data | undefined} [data]
7782
*/
7883
_emit (peerId, data) {
7984
this._ps.emit(this.eventName, {
@@ -87,7 +92,7 @@ class Book {
8792
* Returns `undefined` if there is no available data for the given peer.
8893
*
8994
* @param {PeerId} peerId
90-
* @returns {any[]|any|undefined}
95+
* @returns {GetData | undefined}
9196
*/
9297
get (peerId) {
9398
if (!PeerId.isPeerId(peerId)) {
@@ -96,8 +101,7 @@ class Book {
96101

97102
const rec = this.data.get(peerId.toB58String())
98103

99-
// @ts-ignore
100-
return rec ? [...rec] : undefined
104+
return this.getTransformer(rec)
101105
}
102106

103107
/**
@@ -115,7 +119,7 @@ class Book {
115119
return false
116120
}
117121

118-
this._emit(peerId, [])
122+
this._emit(peerId, undefined)
119123

120124
return true
121125
}

src/peer-store/key-book.js

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const {
2020
*/
2121

2222
/**
23-
* @extends {Book}
23+
* @extends {Book<PeerId, PublicKey, PublicKey>}
2424
*/
2525
class KeyBook extends Book {
2626
/**
@@ -34,7 +34,8 @@ class KeyBook extends Book {
3434
peerStore,
3535
eventName: 'change:pubkey',
3636
eventProperty: 'pubkey',
37-
eventTransformer: (data) => data.pubKey
37+
eventTransformer: (data) => data && data.pubKey,
38+
getTransformer: (data) => data && data.pubKey
3839
})
3940

4041
/**
@@ -74,23 +75,6 @@ class KeyBook extends Book {
7475

7576
return this
7677
}
77-
78-
/**
79-
* Get Public key of the given PeerId, if stored.
80-
*
81-
* @override
82-
* @param {PeerId} peerId
83-
* @returns {PublicKey | undefined}
84-
*/
85-
get (peerId) {
86-
if (!PeerId.isPeerId(peerId)) {
87-
throw errcode(new Error('peerId must be an instance of peer-id'), ERR_INVALID_PARAMETERS)
88-
}
89-
90-
const rec = this.data.get(peerId.toB58String())
91-
92-
return rec ? rec.pubKey : undefined
93-
}
9478
}
9579

9680
module.exports = KeyBook

src/peer-store/metadata-book.js

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,23 @@ const uint8ArrayEquals = require('uint8arrays/equals')
1010
const PeerId = require('peer-id')
1111

1212
const Book = require('./book')
13-
1413
const {
1514
codes: { ERR_INVALID_PARAMETERS }
1615
} = require('../errors')
1716

17+
const eventName = 'change:metadata'
18+
const eventProperty = 'metadata'
19+
1820
/**
1921
* @typedef {import('./')} PeerStore
2022
*/
2123

2224
/**
23-
* @extends {Book}
25+
* @typedef {Map<string, Uint8Array>} Metadata
26+
*/
27+
28+
/**
29+
* @extends {Book<Metadata, Metadata, string>}
2430
*
2531
* @fires MetadataBook#change:metadata
2632
*/
@@ -39,14 +45,14 @@ class MetadataBook extends Book {
3945
*/
4046
super({
4147
peerStore,
42-
eventName: 'change:metadata',
43-
eventProperty: 'metadata'
48+
eventName,
49+
eventProperty
4450
})
4551

4652
/**
4753
* Map known peers to their known protocols.
4854
*
49-
* @type {Map<string, Map<string, Uint8Array>>}
55+
* @type {Map<string, Metadata>}
5056
*/
5157
this.data = new Map()
5258
}
@@ -99,20 +105,6 @@ class MetadataBook extends Book {
99105
emit && this._emit(peerId, key)
100106
}
101107

102-
/**
103-
* Get the known data of a provided peer.
104-
*
105-
* @param {PeerId} peerId
106-
* @returns {Map<string, Uint8Array>|undefined}
107-
*/
108-
get (peerId) {
109-
if (!PeerId.isPeerId(peerId)) {
110-
throw errcode(new Error('peerId must be an instance of peer-id'), ERR_INVALID_PARAMETERS)
111-
}
112-
113-
return this.data.get(peerId.toB58String())
114-
}
115-
116108
/**
117109
* Get specific metadata value, if it exists
118110
*
@@ -167,7 +159,10 @@ class MetadataBook extends Book {
167159
return false
168160
}
169161

170-
this._emit(peerId, key)
162+
this._ps.emit(eventName, {
163+
peerId,
164+
[eventProperty]: key
165+
})
171166

172167
return true
173168
}

src/peer-store/proto-book.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,21 @@ const {
1717
* @typedef {import('./')} PeerStore
1818
*/
1919

20+
// @extends {Book<Entry, Address, Multiaddr>}
21+
22+
/**
23+
* @param {Set<string> | undefined} set
24+
* @returns {string[] | undefined}
25+
*/
26+
const transformSetToArray = (set) => {
27+
if (!set) {
28+
return undefined
29+
}
30+
return Array.from(set)
31+
}
32+
2033
/**
21-
* @extends {Book}
34+
* @extends {Book<Set<string>, string[], string[]>}
2235
*
2336
* @fires ProtoBook#change:protocols
2437
*/
@@ -39,7 +52,8 @@ class ProtoBook extends Book {
3952
peerStore,
4053
eventName: 'change:protocols',
4154
eventProperty: 'protocols',
42-
eventTransformer: (data) => Array.from(data)
55+
eventTransformer: (data) => transformSetToArray(data) || [],
56+
getTransformer: (data) => transformSetToArray(data)
4357
})
4458

4559
/**

0 commit comments

Comments
 (0)