@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.
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +52 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/pb/tags.d.ts +20 -0
- package/dist/src/pb/tags.d.ts.map +1 -0
- package/dist/src/pb/tags.js +34 -0
- package/dist/src/pb/tags.js.map +1 -0
- package/package.json +5 -4
- package/src/index.ts +69 -1
- package/src/pb/tags.proto +11 -0
- package/src/pb/tags.ts +49 -0
package/dist/src/index.d.ts
CHANGED
|
@@ -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
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAS,MAAM,YAAY,CAAA;AAGnD,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAA;
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
+
}
|