@libp2p/daemon-client 0.0.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/LICENSE +4 -0
- package/README.md +84 -0
- package/dist/src/dht.d.ts +40 -0
- package/dist/src/dht.d.ts.map +1 -0
- package/dist/src/dht.js +230 -0
- package/dist/src/dht.js.map +1 -0
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +195 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pubsub.d.ts +21 -0
- package/dist/src/pubsub.d.ts.map +1 -0
- package/dist/src/pubsub.js +81 -0
- package/dist/src/pubsub.js.map +1 -0
- package/dist/src/stream-handler.d.ts +28 -0
- package/dist/src/stream-handler.d.ts.map +1 -0
- package/dist/src/stream-handler.js +47 -0
- package/dist/src/stream-handler.js.map +1 -0
- package/dist/src/util/index.d.ts +12 -0
- package/dist/src/util/index.d.ts.map +1 -0
- package/dist/src/util/index.js +24 -0
- package/dist/src/util/index.js.map +1 -0
- package/package.json +160 -0
- package/src/dht.ts +285 -0
- package/src/index.ts +263 -0
- package/src/pubsub.ts +106 -0
- package/src/stream-handler.ts +65 -0
- package/src/util/index.ts +27 -0
package/LICENSE
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
libp2p-daemon client JavaScript implementation
|
|
2
|
+
======
|
|
3
|
+
|
|
4
|
+
[](https://protocol.ai/)
|
|
5
|
+
[](http://libp2p.io/)
|
|
6
|
+
[](http://webchat.freenode.net/?channels=%23libp2p)
|
|
7
|
+
[](https://discuss.libp2p.io)
|
|
8
|
+
|
|
9
|
+
> A Javascript client to interact with a standalone deployment of a libp2p host, running in its own OS process. Essentially, this client allows to communicate with other peers, interact with the DHT, participate in pubsub, etc. no matter the language they are implemented with.
|
|
10
|
+
|
|
11
|
+
## Lead Maintainer
|
|
12
|
+
|
|
13
|
+
[Vasco Santos](https://github.com/vasco-santos)
|
|
14
|
+
|
|
15
|
+
## Table of Contents
|
|
16
|
+
|
|
17
|
+
* [Specs](#specs)
|
|
18
|
+
* [Install](#install)
|
|
19
|
+
* [Usage](#usage)
|
|
20
|
+
* [API](#api)
|
|
21
|
+
* [Contribute](#contribute)
|
|
22
|
+
* [License](#license)
|
|
23
|
+
|
|
24
|
+
## Specs
|
|
25
|
+
|
|
26
|
+
The specs for the daemon are currently housed in the go implementation. You can read them at [libp2p/go-libp2p-daemon](https://github.com/libp2p/go-libp2p-daemon/blob/master/specs/README.md)
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
`npm install libp2p-daemon-client`
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
### Run a daemon process
|
|
35
|
+
|
|
36
|
+
There are currently two implementations of the `libp2p-daemon`:
|
|
37
|
+
|
|
38
|
+
- [js-libp2p-daemon](https://github.com/libp2p/js-libp2p-daemon)
|
|
39
|
+
- [go-libp2p-daemon](https://github.com/libp2p/go-libp2p-daemon)
|
|
40
|
+
|
|
41
|
+
### Interact with the daemon process using the client
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
const Client = require('libp2p-daemon-client')
|
|
45
|
+
|
|
46
|
+
const defaultSock = '/tmp/p2pd.sock'
|
|
47
|
+
const client = new Client(defaultSock)
|
|
48
|
+
|
|
49
|
+
// interact with the daemon
|
|
50
|
+
let identify
|
|
51
|
+
try {
|
|
52
|
+
identify = await client.identify()
|
|
53
|
+
} catch (err) {
|
|
54
|
+
// ...
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// close the socket
|
|
58
|
+
await client.close()
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## API
|
|
62
|
+
|
|
63
|
+
* [Getting started](API.md#getting-started)
|
|
64
|
+
* [`close`](API.md#close)
|
|
65
|
+
* [`connect`](API.md#connect)
|
|
66
|
+
* [`identify`](API.md#identify)
|
|
67
|
+
* [`listPeers`](API.md#listPeers)
|
|
68
|
+
* [`openStream`](API.md#openStream)
|
|
69
|
+
* [`registerStream`](API.md#registerStream)
|
|
70
|
+
* [`dht.put`](API.md#dht.put)
|
|
71
|
+
* [`dht.get`](API.md#dht.get)
|
|
72
|
+
* [`dht.findPeer`](API.md#dht.findPeer)
|
|
73
|
+
* [`dht.provide`](API.md#dht.provide)
|
|
74
|
+
* [`dht.findProviders`](API.md#dht.findProviders)
|
|
75
|
+
* [`dht.getClosestPeers`](API.md#dht.getClosestPeers)
|
|
76
|
+
* [`dht.getPublicKey`](API.md#dht.getPublicKey)
|
|
77
|
+
|
|
78
|
+
## Contribute
|
|
79
|
+
|
|
80
|
+
This module is actively under development. Please check out the issues and submit PRs!
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
MIT © Protocol Labs
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
2
|
+
import type { DaemonClient } from './index.js';
|
|
3
|
+
import { PeerId } from '@libp2p/interfaces/peer-id';
|
|
4
|
+
import type { PeerData } from '@libp2p/interfaces/peer-data';
|
|
5
|
+
export declare class DHT {
|
|
6
|
+
private client;
|
|
7
|
+
constructor(client: DaemonClient);
|
|
8
|
+
/**
|
|
9
|
+
* Write a value to a key in the DHT
|
|
10
|
+
*/
|
|
11
|
+
put(key: Uint8Array, value: Uint8Array): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Query the DHT for a value stored at a key in the DHT
|
|
14
|
+
*/
|
|
15
|
+
get(key: Uint8Array): Promise<Uint8Array>;
|
|
16
|
+
/**
|
|
17
|
+
* Query the DHT for a given peer's known addresses.
|
|
18
|
+
*
|
|
19
|
+
* @param {PeerId} peerId
|
|
20
|
+
* @returns {PeerInfo}
|
|
21
|
+
*/
|
|
22
|
+
findPeer(peerId: PeerId): Promise<PeerData>;
|
|
23
|
+
/**
|
|
24
|
+
* Announce to the network that the peer have data addressed by the provided CID
|
|
25
|
+
*/
|
|
26
|
+
provide(cid: CID): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Query the DHT for peers that have a piece of content, identified by a CID
|
|
29
|
+
*/
|
|
30
|
+
findProviders(cid: CID, count?: number): AsyncIterator<PeerData>;
|
|
31
|
+
/**
|
|
32
|
+
* Query the DHT routing table for peers that are closest to a provided key.
|
|
33
|
+
*/
|
|
34
|
+
getClosestPeers(key: Uint8Array): AsyncIterable<PeerData>;
|
|
35
|
+
/**
|
|
36
|
+
* Query the DHT routing table for a given peer's public key.
|
|
37
|
+
*/
|
|
38
|
+
getPublicKey(peerId: PeerId): Promise<Uint8Array | null | undefined>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=dht.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dht.d.ts","sourceRoot":"","sources":["../../src/dht.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAStC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAY,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAG5D,qBAAa,GAAG;IACd,OAAO,CAAC,MAAM,CAAc;gBAEf,MAAM,EAAE,YAAY;IAIjC;;OAEG;IACG,GAAG,CAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B7D;;OAEG;IACG,GAAG,CAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IA6BhD;;;;;OAKG;IACG,QAAQ,CAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiClD;;OAEG;IACG,OAAO,CAAE,GAAG,EAAE,GAAG;IAuBvB;;OAEG;IACK,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,KAAK,GAAE,MAAU,GAAG,aAAa,CAAC,QAAQ,CAAC;IAiD5E;;OAEG;IACK,eAAe,CAAE,GAAG,EAAE,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC;IAiDlE;;OAEG;IACG,YAAY,CAAE,MAAM,EAAE,MAAM;CA4BnC"}
|
package/dist/src/dht.js
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
2
|
+
import { Multiaddr } from '@multiformats/multiaddr';
|
|
3
|
+
import errcode from 'err-code';
|
|
4
|
+
import { Request, Response, DHTRequest, DHTResponse } from '@libp2p/daemon-protocol';
|
|
5
|
+
import { isPeerId } from '@libp2p/interfaces/peer-id';
|
|
6
|
+
import { peerIdFromBytes } from '@libp2p/peer-id';
|
|
7
|
+
export class DHT {
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Write a value to a key in the DHT
|
|
13
|
+
*/
|
|
14
|
+
async put(key, value) {
|
|
15
|
+
if (!(key instanceof Uint8Array)) {
|
|
16
|
+
throw errcode(new Error('invalid key received'), 'ERR_INVALID_KEY');
|
|
17
|
+
}
|
|
18
|
+
if (!(value instanceof Uint8Array)) {
|
|
19
|
+
throw errcode(new Error('value received is not a Uint8Array'), 'ERR_INVALID_VALUE');
|
|
20
|
+
}
|
|
21
|
+
const sh = await this.client.send({
|
|
22
|
+
type: Request.Type.DHT,
|
|
23
|
+
dht: {
|
|
24
|
+
type: DHTRequest.Type.PUT_VALUE,
|
|
25
|
+
key,
|
|
26
|
+
value
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
const message = await sh.read();
|
|
30
|
+
const response = Response.decode(message);
|
|
31
|
+
await sh.close();
|
|
32
|
+
if (response.type !== Response.Type.OK) {
|
|
33
|
+
throw errcode(new Error(response.error?.msg ?? 'DHT put failed'), 'ERR_DHT_PUT_FAILED');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Query the DHT for a value stored at a key in the DHT
|
|
38
|
+
*/
|
|
39
|
+
async get(key) {
|
|
40
|
+
if (!(key instanceof Uint8Array)) {
|
|
41
|
+
throw errcode(new Error('invalid key received'), 'ERR_INVALID_KEY');
|
|
42
|
+
}
|
|
43
|
+
const sh = await this.client.send({
|
|
44
|
+
type: Request.Type.DHT,
|
|
45
|
+
dht: {
|
|
46
|
+
type: DHTRequest.Type.GET_VALUE,
|
|
47
|
+
key
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
const message = await sh.read();
|
|
51
|
+
const response = Response.decode(message);
|
|
52
|
+
await sh.close();
|
|
53
|
+
if (response.type !== Response.Type.OK) {
|
|
54
|
+
throw errcode(new Error(response.error?.msg ?? 'DHT get failed'), 'ERR_DHT_GET_FAILED');
|
|
55
|
+
}
|
|
56
|
+
if (response.dht == null || response.dht.value == null) {
|
|
57
|
+
throw errcode(new Error('Invalid DHT get response'), 'ERR_DHT_GET_FAILED');
|
|
58
|
+
}
|
|
59
|
+
return response.dht.value;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Query the DHT for a given peer's known addresses.
|
|
63
|
+
*
|
|
64
|
+
* @param {PeerId} peerId
|
|
65
|
+
* @returns {PeerInfo}
|
|
66
|
+
*/
|
|
67
|
+
async findPeer(peerId) {
|
|
68
|
+
if (!isPeerId(peerId)) {
|
|
69
|
+
throw errcode(new Error('invalid peer id received'), 'ERR_INVALID_PEER_ID');
|
|
70
|
+
}
|
|
71
|
+
const sh = await this.client.send({
|
|
72
|
+
type: Request.Type.DHT,
|
|
73
|
+
dht: {
|
|
74
|
+
type: DHTRequest.Type.FIND_PEER,
|
|
75
|
+
peer: peerId.toBytes()
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const message = await sh.read();
|
|
79
|
+
const response = Response.decode(message);
|
|
80
|
+
await sh.close();
|
|
81
|
+
if (response.type !== Response.Type.OK) {
|
|
82
|
+
throw errcode(new Error(response.error?.msg ?? 'DHT find peer failed'), 'ERR_DHT_FIND_PEER_FAILED');
|
|
83
|
+
}
|
|
84
|
+
if (response.dht == null || response.dht.peer == null || response.dht.peer.addrs == null) {
|
|
85
|
+
throw errcode(new Error('Invalid response'), 'ERR_DHT_FIND_PEER_FAILED');
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
id: peerIdFromBytes(response.dht.peer.id),
|
|
89
|
+
multiaddrs: response.dht.peer.addrs.map((a) => new Multiaddr(a)),
|
|
90
|
+
protocols: []
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Announce to the network that the peer have data addressed by the provided CID
|
|
95
|
+
*/
|
|
96
|
+
async provide(cid) {
|
|
97
|
+
if (cid == null || CID.asCID(cid) == null) {
|
|
98
|
+
throw errcode(new Error('invalid cid received'), 'ERR_INVALID_CID');
|
|
99
|
+
}
|
|
100
|
+
const sh = await this.client.send({
|
|
101
|
+
type: Request.Type.DHT,
|
|
102
|
+
dht: {
|
|
103
|
+
type: DHTRequest.Type.PROVIDE,
|
|
104
|
+
cid: cid.bytes
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
const message = await sh.read();
|
|
108
|
+
const response = Response.decode(message);
|
|
109
|
+
await sh.close();
|
|
110
|
+
if (response.type !== Response.Type.OK) {
|
|
111
|
+
throw errcode(new Error(response.error?.msg ?? 'DHT provide failed'), 'ERR_DHT_PROVIDE_FAILED');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Query the DHT for peers that have a piece of content, identified by a CID
|
|
116
|
+
*/
|
|
117
|
+
async *findProviders(cid, count = 1) {
|
|
118
|
+
if (cid == null || CID.asCID(cid) == null) {
|
|
119
|
+
throw errcode(new Error('invalid cid received'), 'ERR_INVALID_CID');
|
|
120
|
+
}
|
|
121
|
+
const sh = await this.client.send({
|
|
122
|
+
type: Request.Type.DHT,
|
|
123
|
+
dht: {
|
|
124
|
+
type: DHTRequest.Type.FIND_PROVIDERS,
|
|
125
|
+
cid: cid.bytes,
|
|
126
|
+
count
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
let message = await sh.read();
|
|
130
|
+
// stream begin message
|
|
131
|
+
let response = Response.decode(message);
|
|
132
|
+
if (response.type !== Response.Type.OK) {
|
|
133
|
+
await sh.close();
|
|
134
|
+
throw errcode(new Error(response.error?.msg || 'DHT find providers failed'), 'ERR_DHT_FIND_PROVIDERS_FAILED');
|
|
135
|
+
}
|
|
136
|
+
while (true) {
|
|
137
|
+
message = await sh.read();
|
|
138
|
+
const response = DHTResponse.decode(message);
|
|
139
|
+
// Stream end
|
|
140
|
+
if (response.type === DHTResponse.Type.END) {
|
|
141
|
+
await sh.close();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Stream values
|
|
145
|
+
if (response.type === DHTResponse.Type.VALUE && response.peer != null && response.peer?.addrs != null) {
|
|
146
|
+
yield {
|
|
147
|
+
id: peerIdFromBytes(response.peer.id),
|
|
148
|
+
multiaddrs: response.peer.addrs.map((a) => new Multiaddr(a)),
|
|
149
|
+
protocols: []
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Unexpected message received
|
|
154
|
+
await sh.close();
|
|
155
|
+
throw errcode(new Error('unexpected message received'), 'ERR_UNEXPECTED_MESSAGE_RECEIVED');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Query the DHT routing table for peers that are closest to a provided key.
|
|
161
|
+
*/
|
|
162
|
+
async *getClosestPeers(key) {
|
|
163
|
+
if (!(key instanceof Uint8Array)) {
|
|
164
|
+
throw errcode(new Error('invalid key received'), 'ERR_INVALID_KEY');
|
|
165
|
+
}
|
|
166
|
+
const sh = await this.client.send({
|
|
167
|
+
type: Request.Type.DHT,
|
|
168
|
+
dht: {
|
|
169
|
+
type: DHTRequest.Type.GET_CLOSEST_PEERS,
|
|
170
|
+
key
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// stream begin message
|
|
174
|
+
let message = await sh.read();
|
|
175
|
+
let response = Response.decode(message);
|
|
176
|
+
if (response.type !== Response.Type.OK) {
|
|
177
|
+
await sh.close();
|
|
178
|
+
throw errcode(new Error(response.error?.msg ?? 'DHT find providers failed'), 'ERR_DHT_FIND_PROVIDERS_FAILED');
|
|
179
|
+
}
|
|
180
|
+
while (true) {
|
|
181
|
+
message = await sh.read();
|
|
182
|
+
const response = DHTResponse.decode(message);
|
|
183
|
+
// Stream end
|
|
184
|
+
if (response.type === DHTResponse.Type.END) {
|
|
185
|
+
await sh.close();
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// Stream values
|
|
189
|
+
if (response.type === DHTResponse.Type.VALUE && response.value != null) {
|
|
190
|
+
const peerId = peerIdFromBytes(response.value);
|
|
191
|
+
yield {
|
|
192
|
+
id: peerId,
|
|
193
|
+
multiaddrs: [],
|
|
194
|
+
protocols: []
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Unexpected message received
|
|
199
|
+
await sh.close();
|
|
200
|
+
throw errcode(new Error('unexpected message received'), 'ERR_UNEXPECTED_MESSAGE_RECEIVED');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Query the DHT routing table for a given peer's public key.
|
|
206
|
+
*/
|
|
207
|
+
async getPublicKey(peerId) {
|
|
208
|
+
if (!isPeerId(peerId)) {
|
|
209
|
+
throw errcode(new Error('invalid peer id received'), 'ERR_INVALID_PEER_ID');
|
|
210
|
+
}
|
|
211
|
+
const sh = await this.client.send({
|
|
212
|
+
type: Request.Type.DHT,
|
|
213
|
+
dht: {
|
|
214
|
+
type: DHTRequest.Type.GET_PUBLIC_KEY,
|
|
215
|
+
peer: peerId.toBytes()
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
const message = await sh.read();
|
|
219
|
+
const response = Response.decode(message);
|
|
220
|
+
await sh.close();
|
|
221
|
+
if (response.type !== Response.Type.OK) {
|
|
222
|
+
throw errcode(new Error(response.error?.msg ?? 'DHT get public key failed'), 'ERR_DHT_GET_PUBLIC_KEY_FAILED');
|
|
223
|
+
}
|
|
224
|
+
if (response.dht == null) {
|
|
225
|
+
throw errcode(new Error('Invalid response'), 'ERR_DHT_GET_PUBLIC_KEY_FAILED');
|
|
226
|
+
}
|
|
227
|
+
return response.dht.value;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=dht.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dht.js","sourceRoot":"","sources":["../../src/dht.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { IRequest } from '@libp2p/daemon-protocol';
|
|
2
|
+
import { StreamHandler } from './stream-handler.js';
|
|
3
|
+
import { Multiaddr } from '@multiformats/multiaddr';
|
|
4
|
+
import { PeerId } from '@libp2p/interfaces/peer-id';
|
|
5
|
+
export interface IdentifyResult {
|
|
6
|
+
peerId: PeerId;
|
|
7
|
+
addrs: Multiaddr[];
|
|
8
|
+
}
|
|
9
|
+
export interface DHTClient {
|
|
10
|
+
put: (key: Uint8Array, value: Uint8Array) => Promise<void>;
|
|
11
|
+
get: (key: Uint8Array) => Promise<Uint8Array>;
|
|
12
|
+
}
|
|
13
|
+
export interface DaemonClient {
|
|
14
|
+
identify: () => Promise<IdentifyResult>;
|
|
15
|
+
listPeers: () => Promise<PeerId[]>;
|
|
16
|
+
connect: (peerId: PeerId, addrs: Multiaddr[]) => Promise<void>;
|
|
17
|
+
dht: DHTClient;
|
|
18
|
+
send: (request: IRequest) => Promise<StreamHandler>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createClient(multiaddr: Multiaddr): DaemonClient;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAqB,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGnD,OAAO,EAAY,MAAM,EAAE,MAAM,4BAA4B,CAAA;AA0O7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1D,GAAG,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAA;IACvC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAClC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,GAAG,EAAE,SAAS,CAAA;IAEd,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;CACpD;AAED,wBAAgB,YAAY,CAAE,SAAS,EAAE,SAAS,GAAG,YAAY,CAEhE"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import errcode from 'err-code';
|
|
2
|
+
import { TCP } from '@libp2p/tcp';
|
|
3
|
+
import { Request, Response } from '@libp2p/daemon-protocol';
|
|
4
|
+
import { StreamHandler } from './stream-handler.js';
|
|
5
|
+
import { Multiaddr } from '@multiformats/multiaddr';
|
|
6
|
+
import { DHT } from './dht.js';
|
|
7
|
+
import { Pubsub } from './pubsub.js';
|
|
8
|
+
import { isPeerId } from '@libp2p/interfaces/peer-id';
|
|
9
|
+
import { passThroughUpgrader } from './util/index.js';
|
|
10
|
+
import { peerIdFromBytes } from '@libp2p/peer-id';
|
|
11
|
+
class Client {
|
|
12
|
+
constructor(addr) {
|
|
13
|
+
this.multiaddr = addr;
|
|
14
|
+
this.tcp = new TCP();
|
|
15
|
+
this.dht = new DHT(this);
|
|
16
|
+
this.pubsub = new Pubsub(this);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Connects to a daemon at the unix socket path the daemon
|
|
20
|
+
* was created with
|
|
21
|
+
*
|
|
22
|
+
* @async
|
|
23
|
+
* @returns {MultiaddrConnection}
|
|
24
|
+
*/
|
|
25
|
+
connectDaemon() {
|
|
26
|
+
return this.tcp.dial(this.multiaddr, {
|
|
27
|
+
upgrader: passThroughUpgrader
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Starts a server listening at `socketPath`. New connections
|
|
32
|
+
* will be sent to the `connectionHandler`.
|
|
33
|
+
*
|
|
34
|
+
* @param {Multiaddr} addr
|
|
35
|
+
* @param {function(Stream)} connectionHandler
|
|
36
|
+
* @returns {Promise}
|
|
37
|
+
*/
|
|
38
|
+
async start(addr, connectionHandler) {
|
|
39
|
+
if (this.listener) {
|
|
40
|
+
await this.close();
|
|
41
|
+
}
|
|
42
|
+
this.listener = this.tcp.createListener({
|
|
43
|
+
handler: maConn => connectionHandler(maConn),
|
|
44
|
+
upgrader: passThroughUpgrader
|
|
45
|
+
});
|
|
46
|
+
await this.listener.listen(addr);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sends the request to the daemon and returns a stream. This
|
|
50
|
+
* should only be used when sending daemon requests.
|
|
51
|
+
*/
|
|
52
|
+
async send(request) {
|
|
53
|
+
const maConn = await this.connectDaemon();
|
|
54
|
+
const streamHandler = new StreamHandler({ stream: maConn });
|
|
55
|
+
streamHandler.write(Request.encode(request).finish());
|
|
56
|
+
return streamHandler;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Closes the socket
|
|
60
|
+
*/
|
|
61
|
+
async close() {
|
|
62
|
+
this.listener && await this.listener.close();
|
|
63
|
+
this.listener = undefined;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Connect requests a connection to a known peer on a given set of addresses
|
|
67
|
+
*
|
|
68
|
+
* @param {PeerId} peerId
|
|
69
|
+
* @param {Array.<multiaddr>} addrs
|
|
70
|
+
*/
|
|
71
|
+
async connect(peerId, addrs) {
|
|
72
|
+
if (!isPeerId(peerId)) {
|
|
73
|
+
throw errcode(new Error('invalid peer id received'), 'ERR_INVALID_PEER_ID');
|
|
74
|
+
}
|
|
75
|
+
if (!Array.isArray(addrs)) {
|
|
76
|
+
throw errcode(new Error('addrs received are not in an array'), 'ERR_INVALID_ADDRS_TYPE');
|
|
77
|
+
}
|
|
78
|
+
addrs.forEach((addr) => {
|
|
79
|
+
if (!Multiaddr.isMultiaddr(addr)) {
|
|
80
|
+
throw errcode(new Error('received an address that is not a multiaddr'), 'ERR_NO_MULTIADDR_RECEIVED');
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
const sh = await this.send({
|
|
84
|
+
type: Request.Type.CONNECT,
|
|
85
|
+
connect: {
|
|
86
|
+
peer: peerId.toBytes(),
|
|
87
|
+
addrs: addrs.map((a) => a.bytes)
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
const message = await sh.read();
|
|
91
|
+
if (!message) {
|
|
92
|
+
throw errcode(new Error('unspecified'), 'ERR_CONNECT_FAILED');
|
|
93
|
+
}
|
|
94
|
+
const response = Response.decode(message);
|
|
95
|
+
if (response.type !== Response.Type.OK) {
|
|
96
|
+
const errResponse = response.error ?? { msg: 'unspecified' };
|
|
97
|
+
throw errcode(new Error(errResponse.msg ?? 'unspecified'), 'ERR_CONNECT_FAILED');
|
|
98
|
+
}
|
|
99
|
+
await sh.close();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* @typedef {Object} IdentifyResponse
|
|
103
|
+
* @property {PeerId} peerId
|
|
104
|
+
* @property {Array.<multiaddr>} addrs
|
|
105
|
+
*/
|
|
106
|
+
/**
|
|
107
|
+
* Identify queries the daemon for its peer ID and listen addresses.
|
|
108
|
+
*/
|
|
109
|
+
async identify() {
|
|
110
|
+
const sh = await this.send({
|
|
111
|
+
type: Request.Type.IDENTIFY
|
|
112
|
+
});
|
|
113
|
+
const message = await sh.read();
|
|
114
|
+
const response = Response.decode(message);
|
|
115
|
+
if (response.type !== Response.Type.OK) {
|
|
116
|
+
throw errcode(new Error(response.error?.msg ?? 'Identify failed'), 'ERR_IDENTIFY_FAILED');
|
|
117
|
+
}
|
|
118
|
+
if (response.identify == null || response.identify.addrs == null) {
|
|
119
|
+
throw errcode(new Error('Invalid response'), 'ERR_IDENTIFY_FAILED');
|
|
120
|
+
}
|
|
121
|
+
const peerId = peerIdFromBytes(response.identify?.id);
|
|
122
|
+
const addrs = response.identify.addrs.map((a) => new Multiaddr(a));
|
|
123
|
+
await sh.close();
|
|
124
|
+
return ({ peerId, addrs });
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get a list of IDs of peers the node is connected to
|
|
128
|
+
*/
|
|
129
|
+
async listPeers() {
|
|
130
|
+
const sh = await this.send({
|
|
131
|
+
type: Request.Type.LIST_PEERS
|
|
132
|
+
});
|
|
133
|
+
const message = await sh.read();
|
|
134
|
+
const response = Response.decode(message);
|
|
135
|
+
if (response.type !== Response.Type.OK) {
|
|
136
|
+
throw errcode(new Error(response.error?.msg ?? 'List peers failed'), 'ERR_LIST_PEERS_FAILED');
|
|
137
|
+
}
|
|
138
|
+
await sh.close();
|
|
139
|
+
return response.peers.map((peer) => peerIdFromBytes(peer.id));
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Initiate an outbound stream to a peer on one of a set of protocols.
|
|
143
|
+
*/
|
|
144
|
+
async openStream(peerId, protocol) {
|
|
145
|
+
if (!isPeerId(peerId)) {
|
|
146
|
+
throw errcode(new Error('invalid peer id received'), 'ERR_INVALID_PEER_ID');
|
|
147
|
+
}
|
|
148
|
+
if (typeof protocol !== 'string') {
|
|
149
|
+
throw errcode(new Error('invalid protocol received'), 'ERR_INVALID_PROTOCOL');
|
|
150
|
+
}
|
|
151
|
+
const sh = await this.send({
|
|
152
|
+
type: Request.Type.STREAM_OPEN,
|
|
153
|
+
streamOpen: {
|
|
154
|
+
peer: peerId.toBytes(),
|
|
155
|
+
proto: [protocol]
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
const message = await sh.read();
|
|
159
|
+
const response = Response.decode(message);
|
|
160
|
+
if (response.type !== Response.Type.OK) {
|
|
161
|
+
await sh.close();
|
|
162
|
+
throw errcode(new Error(response.error?.msg ?? 'Open stream failed'), 'ERR_OPEN_STREAM_FAILED');
|
|
163
|
+
}
|
|
164
|
+
return sh.rest();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Register a handler for inbound streams on a given protocol
|
|
168
|
+
*/
|
|
169
|
+
async registerStreamHandler(addr, protocol) {
|
|
170
|
+
if (!Multiaddr.isMultiaddr(addr)) {
|
|
171
|
+
throw errcode(new Error('invalid multiaddr received'), 'ERR_INVALID_MULTIADDR');
|
|
172
|
+
}
|
|
173
|
+
if (typeof protocol !== 'string') {
|
|
174
|
+
throw errcode(new Error('invalid protocol received'), 'ERR_INVALID_PROTOCOL');
|
|
175
|
+
}
|
|
176
|
+
const sh = await this.send({
|
|
177
|
+
type: Request.Type.STREAM_HANDLER,
|
|
178
|
+
streamOpen: null,
|
|
179
|
+
streamHandler: {
|
|
180
|
+
addr: addr.bytes,
|
|
181
|
+
proto: [protocol]
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
const message = await sh.read();
|
|
185
|
+
const response = Response.decode(message);
|
|
186
|
+
await sh.close();
|
|
187
|
+
if (response.type !== Response.Type.OK) {
|
|
188
|
+
throw errcode(new Error(response.error?.msg ?? 'Register stream handler failed'), 'ERR_REGISTER_STREAM_HANDLER_FAILED');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export function createClient(multiaddr) {
|
|
193
|
+
return new Client(multiaddr);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PSMessage } from '@libp2p/daemon-protocol';
|
|
2
|
+
import type { DaemonClient } from './index.js';
|
|
3
|
+
export declare class Pubsub {
|
|
4
|
+
private client;
|
|
5
|
+
constructor(client: DaemonClient);
|
|
6
|
+
/**
|
|
7
|
+
* Get a list of topics the node is subscribed to.
|
|
8
|
+
*
|
|
9
|
+
* @returns {Array<string>} topics
|
|
10
|
+
*/
|
|
11
|
+
getTopics(): Promise<string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Publish data under a topic
|
|
14
|
+
*/
|
|
15
|
+
publish(topic: string, data: Uint8Array): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Request to subscribe a certain topic
|
|
18
|
+
*/
|
|
19
|
+
subscribe(topic: string): AsyncGenerator<PSMessage, void, unknown>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=pubsub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub.d.ts","sourceRoot":"","sources":["../../src/pubsub.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,SAAS,EACV,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAc;gBAEf,MAAM,EAAE,YAAY;IAIjC;;;;OAIG;IACG,SAAS,IAAK,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBrC;;OAEG;IACG,OAAO,CAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;IA4B9C;;OAEG;IACK,SAAS,CAAE,KAAK,EAAE,MAAM;CA0BjC"}
|