@libp2p/peer-store 3.0.0 → 3.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.
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter } from '@libp2p/interfaces/events';
2
- import type { PeerStore, AddressBook, KeyBook, MetadataBook, ProtoBook, PeerStoreEvents, PeerStoreInit, Peer } from '@libp2p/interface-peer-store';
2
+ import type { PeerStore, AddressBook, KeyBook, MetadataBook, ProtoBook, PeerStoreEvents, PeerStoreInit, Peer, TagOptions } from '@libp2p/interface-peer-store';
3
3
  import type { PeerId } from '@libp2p/interface-peer-id';
4
4
  import { Components, Initializable } from '@libp2p/components';
5
5
  /**
@@ -28,5 +28,11 @@ export declare class PersistentPeerStore extends EventEmitter<PeerStoreEvents> i
28
28
  * Returns true if we have a record of the peer
29
29
  */
30
30
  has(peerId: PeerId): Promise<boolean>;
31
+ tagPeer(peerId: PeerId, tag: string, options?: TagOptions): Promise<void>;
32
+ unTagPeer(peerId: PeerId, tag: string): Promise<void>;
33
+ getTags(peerId: PeerId): Promise<{
34
+ name: string;
35
+ value: number;
36
+ }[]>;
31
37
  }
32
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAMxD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;AAClJ,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAI9D;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,eAAe,CAAE,YAAW,SAAS,EAAE,aAAa;IACjG,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,YAAY,CAAA;IAC1B,SAAS,EAAE,SAAS,CAAA;IAE3B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;gBAEhB,IAAI,GAAE,aAAkB;IAUrC,IAAI,CAAE,UAAU,EAAE,UAAU;IAKtB,OAAO,CAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI;IAoBjC,GAAG,IAAK,OAAO,CAAC,IAAI,EAAE,CAAC;IAU7B;;OAEG;IACG,MAAM,CAAE,MAAM,EAAE,MAAM;IAa5B;;OAEG;IACG,GAAG,CAAE,MAAM,EAAE,MAAM;IAazB;;OAEG;IACG,GAAG,CAAE,MAAM,EAAE,MAAM;CAY1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAMxD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAC9J,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAM9D;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,YAAY,CAAC,eAAe,CAAE,YAAW,SAAS,EAAE,aAAa;IACjG,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,YAAY,CAAA;IAC1B,SAAS,EAAE,SAAS,CAAA;IAE3B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;gBAEhB,IAAI,GAAE,aAAkB;IAUrC,IAAI,CAAE,UAAU,EAAE,UAAU;IAKtB,OAAO,CAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI;IAoBjC,GAAG,IAAK,OAAO,CAAC,IAAI,EAAE,CAAC;IAU7B;;OAEG;IACG,MAAM,CAAE,MAAM,EAAE,MAAM;IAa5B;;OAEG;IACG,GAAG,CAAE,MAAM,EAAE,MAAM;IAazB;;OAEG;IACG,GAAG,CAAE,MAAM,EAAE,MAAM;IAanB,OAAO,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe;IA+B9D,SAAS,CAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAatC,OAAO,CAAE,MAAM,EAAE,MAAM;;;;CAqB9B"}
package/dist/src/index.js CHANGED
@@ -6,6 +6,8 @@ import { PeerStoreMetadataBook } from './metadata-book.js';
6
6
  import { PeerStoreProtoBook } from './proto-book.js';
7
7
  import { PersistentStore } from './store.js';
8
8
  import { Components } from '@libp2p/components';
9
+ import errCode from 'err-code';
10
+ import { Tags } from './pb/tags.js';
9
11
  const log = logger('libp2p:peer-store');
10
12
  /**
11
13
  * An implementation of PeerStore that stores data in a Datastore
@@ -94,5 +96,55 @@ export class PersistentPeerStore extends EventEmitter {
94
96
  release();
95
97
  }
96
98
  }
99
+ async tagPeer(peerId, tag, options = {}) {
100
+ const providedValue = options.value ?? 0;
101
+ const value = Math.round(providedValue);
102
+ const ttl = options.ttl ?? undefined;
103
+ if (value !== providedValue || value < 0 || value > 100) {
104
+ throw errCode(new Error('Tag value must be between 0-100'), 'ERR_TAG_VALUE_OUT_OF_BOUNDS');
105
+ }
106
+ const buf = await this.metadataBook.getValue(peerId, 'tags');
107
+ let tags = [];
108
+ if (buf != null) {
109
+ tags = Tags.decode(buf).tags;
110
+ }
111
+ for (const t of tags) {
112
+ if (t.name === tag) {
113
+ throw errCode(new Error('Peer already tagged'), 'ERR_DUPLICATE_TAG');
114
+ }
115
+ }
116
+ tags.push({
117
+ name: tag,
118
+ value,
119
+ expiry: ttl == null ? undefined : BigInt(Date.now() + ttl)
120
+ });
121
+ await this.metadataBook.setValue(peerId, 'tags', Tags.encode({ tags }));
122
+ }
123
+ async unTagPeer(peerId, tag) {
124
+ const buf = await this.metadataBook.getValue(peerId, 'tags');
125
+ let tags = [];
126
+ if (buf != null) {
127
+ tags = Tags.decode(buf).tags;
128
+ }
129
+ tags = tags.filter(t => t.name !== tag);
130
+ await this.metadataBook.setValue(peerId, 'tags', Tags.encode({ tags }));
131
+ }
132
+ async getTags(peerId) {
133
+ const buf = await this.metadataBook.getValue(peerId, 'tags');
134
+ let tags = [];
135
+ if (buf != null) {
136
+ tags = Tags.decode(buf).tags;
137
+ }
138
+ const now = BigInt(Date.now());
139
+ const unexpiredTags = tags.filter(tag => tag.expiry == null || tag.expiry > now);
140
+ if (unexpiredTags.length !== tags.length) {
141
+ // remove any expired tags
142
+ await this.metadataBook.setValue(peerId, 'tags', Tags.encode({ tags: unexpiredTags }));
143
+ }
144
+ return unexpiredTags.map(t => ({
145
+ name: t.name,
146
+ value: t.value ?? 0
147
+ }));
148
+ }
97
149
  }
98
150
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Codec } from 'protons-runtime';
2
+ export interface Tags {
3
+ tags: Tag[];
4
+ }
5
+ export declare namespace Tags {
6
+ const codec: () => Codec<Tags>;
7
+ const encode: (obj: Tags) => Uint8Array;
8
+ const decode: (buf: Uint8Array) => Tags;
9
+ }
10
+ export interface Tag {
11
+ name: string;
12
+ value?: number;
13
+ expiry?: bigint;
14
+ }
15
+ export declare namespace Tag {
16
+ const codec: () => Codec<Tag>;
17
+ const encode: (obj: Tag) => Uint8Array;
18
+ const decode: (buf: Uint8Array) => Tag;
19
+ }
20
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/pb/tags.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,GAAG,EAAE,CAAA;CACZ;AAED,yBAAiB,IAAI,CAAC;IACb,MAAM,KAAK,QAAO,MAAM,IAAI,CAIlC,CAAA;IAEM,MAAM,MAAM,QAAS,IAAI,KAAG,UAElC,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,KAAG,IAExC,CAAA;CACF;AAED,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,yBAAiB,GAAG,CAAC;IACZ,MAAM,KAAK,QAAO,MAAM,GAAG,CAMjC,CAAA;IAEM,MAAM,MAAM,QAAS,GAAG,KAAG,UAEjC,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,KAAG,GAExC,CAAA;CACF"}
@@ -0,0 +1,34 @@
1
+ /* eslint-disable import/export */
2
+ /* eslint-disable @typescript-eslint/no-namespace */
3
+ import { encodeMessage, decodeMessage, message, string, uint32, uint64 } from 'protons-runtime';
4
+ export var Tags;
5
+ (function (Tags) {
6
+ Tags.codec = () => {
7
+ return message({
8
+ 1: { name: 'tags', codec: Tag.codec(), repeats: true }
9
+ });
10
+ };
11
+ Tags.encode = (obj) => {
12
+ return encodeMessage(obj, Tags.codec());
13
+ };
14
+ Tags.decode = (buf) => {
15
+ return decodeMessage(buf, Tags.codec());
16
+ };
17
+ })(Tags || (Tags = {}));
18
+ export var Tag;
19
+ (function (Tag) {
20
+ Tag.codec = () => {
21
+ return message({
22
+ 1: { name: 'name', codec: string },
23
+ 2: { name: 'value', codec: uint32, optional: true },
24
+ 3: { name: 'expiry', codec: uint64, optional: true }
25
+ });
26
+ };
27
+ Tag.encode = (obj) => {
28
+ return encodeMessage(obj, Tag.codec());
29
+ };
30
+ Tag.decode = (buf) => {
31
+ return decodeMessage(buf, Tag.codec());
32
+ };
33
+ })(Tag || (Tag = {}));
34
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/pb/tags.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AAEpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAO/F,MAAM,KAAW,IAAI,CAcpB;AAdD,WAAiB,IAAI;IACN,UAAK,GAAG,GAAgB,EAAE;QACrC,OAAO,OAAO,CAAO;YACnB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SACvD,CAAC,CAAA;IACJ,CAAC,CAAA;IAEY,WAAM,GAAG,CAAC,GAAS,EAAc,EAAE;QAC9C,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IACzC,CAAC,CAAA;IAEY,WAAM,GAAG,CAAC,GAAe,EAAQ,EAAE;QAC9C,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IACzC,CAAC,CAAA;AACH,CAAC,EAdgB,IAAI,KAAJ,IAAI,QAcpB;AAQD,MAAM,KAAW,GAAG,CAgBnB;AAhBD,WAAiB,GAAG;IACL,SAAK,GAAG,GAAe,EAAE;QACpC,OAAO,OAAO,CAAM;YAClB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YAClC,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnD,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;SACrD,CAAC,CAAA;IACJ,CAAC,CAAA;IAEY,UAAM,GAAG,CAAC,GAAQ,EAAc,EAAE;QAC7C,OAAO,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;IACxC,CAAC,CAAA;IAEY,UAAM,GAAG,CAAC,GAAe,EAAO,EAAE;QAC7C,OAAO,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;IACxC,CAAC,CAAA;AACH,CAAC,EAhBgB,GAAG,KAAH,GAAG,QAgBnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/peer-store",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Stores information about peers libp2p knows on the network",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p-peer-store#readme",
@@ -127,7 +127,7 @@
127
127
  "clean": "aegir clean",
128
128
  "lint": "aegir lint",
129
129
  "dep-check": "aegir dep-check",
130
- "generate": "protons src/pb/peer.proto",
130
+ "generate": "protons src/pb/peer.proto src/pb/tags.proto",
131
131
  "build": "aegir build",
132
132
  "test": "aegir test",
133
133
  "test:chrome": "aegir test -t browser --cov",
@@ -142,7 +142,7 @@
142
142
  "@libp2p/components": "^2.0.0",
143
143
  "@libp2p/interface-peer-id": "^1.0.2",
144
144
  "@libp2p/interface-peer-info": "^1.0.1",
145
- "@libp2p/interface-peer-store": "^1.0.0",
145
+ "@libp2p/interface-peer-store": "^1.1.0",
146
146
  "@libp2p/interface-record": "^1.0.1",
147
147
  "@libp2p/interfaces": "^3.0.2",
148
148
  "@libp2p/logger": "^2.0.0",
@@ -165,8 +165,9 @@
165
165
  "@libp2p/interface-compliance-tests": "^3.0.1",
166
166
  "@libp2p/peer-id-factory": "^1.0.0",
167
167
  "@libp2p/utils": "^2.0.0",
168
- "aegir": "^37.3.0",
168
+ "aegir": "^37.4.0",
169
169
  "datastore-core": "^7.0.1",
170
+ "delay": "^5.0.0",
170
171
  "p-defer": "^4.0.0",
171
172
  "p-wait-for": "^4.1.0",
172
173
  "protons": "^3.0.4",
package/src/index.ts CHANGED
@@ -5,9 +5,11 @@ import { PeerStoreKeyBook } from './key-book.js'
5
5
  import { PeerStoreMetadataBook } from './metadata-book.js'
6
6
  import { PeerStoreProtoBook } from './proto-book.js'
7
7
  import { PersistentStore, Store } from './store.js'
8
- import type { PeerStore, AddressBook, KeyBook, MetadataBook, ProtoBook, PeerStoreEvents, PeerStoreInit, Peer } from '@libp2p/interface-peer-store'
8
+ import type { PeerStore, AddressBook, KeyBook, MetadataBook, ProtoBook, PeerStoreEvents, PeerStoreInit, Peer, TagOptions } from '@libp2p/interface-peer-store'
9
9
  import type { PeerId } from '@libp2p/interface-peer-id'
10
10
  import { Components, Initializable } from '@libp2p/components'
11
+ import errCode from 'err-code'
12
+ import { Tag, Tags } from './pb/tags.js'
11
13
 
12
14
  const log = logger('libp2p:peer-store')
13
15
 
@@ -115,4 +117,70 @@ export class PersistentPeerStore extends EventEmitter<PeerStoreEvents> implement
115
117
  release()
116
118
  }
117
119
  }
120
+
121
+ async tagPeer (peerId: PeerId, tag: string, options: TagOptions = {}) {
122
+ const providedValue = options.value ?? 0
123
+ const value = Math.round(providedValue)
124
+ const ttl = options.ttl ?? undefined
125
+
126
+ if (value !== providedValue || value < 0 || value > 100) {
127
+ throw errCode(new Error('Tag value must be between 0-100'), 'ERR_TAG_VALUE_OUT_OF_BOUNDS')
128
+ }
129
+
130
+ const buf = await this.metadataBook.getValue(peerId, 'tags')
131
+ let tags: Tag[] = []
132
+
133
+ if (buf != null) {
134
+ tags = Tags.decode(buf).tags
135
+ }
136
+
137
+ for (const t of tags) {
138
+ if (t.name === tag) {
139
+ throw errCode(new Error('Peer already tagged'), 'ERR_DUPLICATE_TAG')
140
+ }
141
+ }
142
+
143
+ tags.push({
144
+ name: tag,
145
+ value,
146
+ expiry: ttl == null ? undefined : BigInt(Date.now() + ttl)
147
+ })
148
+
149
+ await this.metadataBook.setValue(peerId, 'tags', Tags.encode({ tags }))
150
+ }
151
+
152
+ async unTagPeer (peerId: PeerId, tag: string) {
153
+ const buf = await this.metadataBook.getValue(peerId, 'tags')
154
+ let tags: Tag[] = []
155
+
156
+ if (buf != null) {
157
+ tags = Tags.decode(buf).tags
158
+ }
159
+
160
+ tags = tags.filter(t => t.name !== tag)
161
+
162
+ await this.metadataBook.setValue(peerId, 'tags', Tags.encode({ tags }))
163
+ }
164
+
165
+ async getTags (peerId: PeerId) {
166
+ const buf = await this.metadataBook.getValue(peerId, 'tags')
167
+ let tags: Tag[] = []
168
+
169
+ if (buf != null) {
170
+ tags = Tags.decode(buf).tags
171
+ }
172
+
173
+ const now = BigInt(Date.now())
174
+ const unexpiredTags = tags.filter(tag => tag.expiry == null || tag.expiry > now)
175
+
176
+ if (unexpiredTags.length !== tags.length) {
177
+ // remove any expired tags
178
+ await this.metadataBook.setValue(peerId, 'tags', Tags.encode({ tags: unexpiredTags }))
179
+ }
180
+
181
+ return unexpiredTags.map(t => ({
182
+ name: t.name,
183
+ value: t.value ?? 0
184
+ }))
185
+ }
118
186
  }
@@ -0,0 +1,11 @@
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 ADDED
@@ -0,0 +1,49 @@
1
+ /* eslint-disable import/export */
2
+ /* eslint-disable @typescript-eslint/no-namespace */
3
+
4
+ import { encodeMessage, decodeMessage, message, string, uint32, uint64 } from 'protons-runtime'
5
+ import type { Codec } from 'protons-runtime'
6
+
7
+ export interface Tags {
8
+ tags: Tag[]
9
+ }
10
+
11
+ export namespace Tags {
12
+ export const codec = (): Codec<Tags> => {
13
+ return message<Tags>({
14
+ 1: { name: 'tags', codec: Tag.codec(), repeats: true }
15
+ })
16
+ }
17
+
18
+ export const encode = (obj: Tags): Uint8Array => {
19
+ return encodeMessage(obj, Tags.codec())
20
+ }
21
+
22
+ export const decode = (buf: Uint8Array): Tags => {
23
+ return decodeMessage(buf, Tags.codec())
24
+ }
25
+ }
26
+
27
+ export interface Tag {
28
+ name: string
29
+ value?: number
30
+ expiry?: bigint
31
+ }
32
+
33
+ export namespace Tag {
34
+ export const codec = (): Codec<Tag> => {
35
+ return message<Tag>({
36
+ 1: { name: 'name', codec: string },
37
+ 2: { name: 'value', codec: uint32, optional: true },
38
+ 3: { name: 'expiry', codec: uint64, optional: true }
39
+ })
40
+ }
41
+
42
+ export const encode = (obj: Tag): Uint8Array => {
43
+ return encodeMessage(obj, Tag.codec())
44
+ }
45
+
46
+ export const decode = (buf: Uint8Array): Tag => {
47
+ return decodeMessage(buf, Tag.codec())
48
+ }
49
+ }