@libp2p/daemon-client 2.0.2 → 3.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/dist/src/index.d.ts +6 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +44 -7
- package/dist/src/index.js.map +1 -1
- package/package.json +15 -10
- package/src/index.ts +61 -12
package/dist/src/index.d.ts
CHANGED
|
@@ -5,10 +5,14 @@ import { PeerId } from '@libp2p/interface-peer-id';
|
|
|
5
5
|
import type { Duplex } from 'it-stream-types';
|
|
6
6
|
import type { CID } from 'multiformats/cid';
|
|
7
7
|
import type { PeerInfo } from '@libp2p/interface-peer-info';
|
|
8
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
8
9
|
export interface IdentifyResult {
|
|
9
10
|
peerId: PeerId;
|
|
10
11
|
addrs: Multiaddr[];
|
|
11
12
|
}
|
|
13
|
+
export interface StreamHandlerFunction {
|
|
14
|
+
(stream: Duplex<Uint8ArrayList, Uint8Array>): Promise<void>;
|
|
15
|
+
}
|
|
12
16
|
export interface DHTClient {
|
|
13
17
|
put: (key: Uint8Array, value: Uint8Array) => Promise<void>;
|
|
14
18
|
get: (key: Uint8Array) => Promise<Uint8Array>;
|
|
@@ -29,7 +33,8 @@ export interface DaemonClient {
|
|
|
29
33
|
dht: DHTClient;
|
|
30
34
|
pubsub: PubSubClient;
|
|
31
35
|
send: (request: Request) => Promise<StreamHandler>;
|
|
32
|
-
openStream: (peerId: PeerId, protocol: string) => Promise<Duplex<Uint8Array>>;
|
|
36
|
+
openStream: (peerId: PeerId, protocol: string) => Promise<Duplex<Uint8ArrayList, Uint8Array>>;
|
|
37
|
+
registerStreamHandler: (protocol: string, handler: StreamHandlerFunction) => Promise<void>;
|
|
33
38
|
}
|
|
34
39
|
export declare function createClient(multiaddr: Multiaddr): DaemonClient;
|
|
35
40
|
//# 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":"AAEA,OAAO,EAAE,SAAS,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAwB,MAAM,yBAAyB,CAAA;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGnD,OAAO,EAAY,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAG5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AA+OpD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5D;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;IAC7C,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC,QAAQ,CAAC,CAAA;IACpE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/C,eAAe,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,aAAa,CAAC,QAAQ,CAAC,CAAA;CAC9D;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,aAAa,CAAC,SAAS,CAAC,CAAA;IACtD,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CACnC;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;IACd,MAAM,EAAE,YAAY,CAAA;IAEpB,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;IAClD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAA;IAC7F,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3F;AAED,wBAAgB,YAAY,CAAE,SAAS,EAAE,SAAS,GAAG,YAAY,CAEhE"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import errcode from 'err-code';
|
|
2
2
|
import { TCP } from '@libp2p/tcp';
|
|
3
|
-
import { Request, Response } from '@libp2p/daemon-protocol';
|
|
3
|
+
import { Request, Response, StreamInfo } from '@libp2p/daemon-protocol';
|
|
4
4
|
import { StreamHandler } from '@libp2p/daemon-protocol/stream-handler';
|
|
5
5
|
import { Multiaddr } from '@multiformats/multiaddr';
|
|
6
6
|
import { DHT } from './dht.js';
|
|
@@ -8,6 +8,8 @@ import { Pubsub } from './pubsub.js';
|
|
|
8
8
|
import { isPeerId } from '@libp2p/interface-peer-id';
|
|
9
9
|
import { passThroughUpgrader } from '@libp2p/daemon-protocol/upgrader';
|
|
10
10
|
import { peerIdFromBytes } from '@libp2p/peer-id';
|
|
11
|
+
import { logger } from '@libp2p/logger';
|
|
12
|
+
const log = logger('libp2p:daemon-client');
|
|
11
13
|
class Client {
|
|
12
14
|
constructor(addr) {
|
|
13
15
|
this.multiaddr = addr;
|
|
@@ -23,6 +25,8 @@ class Client {
|
|
|
23
25
|
* @returns {MultiaddrConnection}
|
|
24
26
|
*/
|
|
25
27
|
async connectDaemon() {
|
|
28
|
+
// @ts-expect-error because we use a passthrough upgrader,
|
|
29
|
+
// this is actually a MultiaddrConnection and not a Connection
|
|
26
30
|
return await this.tcp.dial(this.multiaddr, {
|
|
27
31
|
upgrader: passThroughUpgrader
|
|
28
32
|
});
|
|
@@ -138,18 +142,51 @@ class Client {
|
|
|
138
142
|
/**
|
|
139
143
|
* Register a handler for inbound streams on a given protocol
|
|
140
144
|
*/
|
|
141
|
-
async registerStreamHandler(
|
|
142
|
-
if (!Multiaddr.isMultiaddr(addr)) {
|
|
143
|
-
throw errcode(new Error('invalid multiaddr received'), 'ERR_INVALID_MULTIADDR');
|
|
144
|
-
}
|
|
145
|
+
async registerStreamHandler(protocol, handler) {
|
|
145
146
|
if (typeof protocol !== 'string') {
|
|
146
147
|
throw errcode(new Error('invalid protocol received'), 'ERR_INVALID_PROTOCOL');
|
|
147
148
|
}
|
|
149
|
+
// open a tcp port, pipe any data from it to the handler function
|
|
150
|
+
const listener = this.tcp.createListener({
|
|
151
|
+
upgrader: passThroughUpgrader,
|
|
152
|
+
handler: (connection) => {
|
|
153
|
+
Promise.resolve()
|
|
154
|
+
.then(async () => {
|
|
155
|
+
const sh = new StreamHandler({
|
|
156
|
+
// @ts-expect-error because we are using a passthrough upgrader, this is a MultiaddrConnection
|
|
157
|
+
stream: connection
|
|
158
|
+
});
|
|
159
|
+
const message = await sh.read();
|
|
160
|
+
if (message == null) {
|
|
161
|
+
throw errcode(new Error('Could not read open stream response'), 'ERR_OPEN_STREAM_FAILED');
|
|
162
|
+
}
|
|
163
|
+
const response = StreamInfo.decode(message);
|
|
164
|
+
if (response.proto !== protocol) {
|
|
165
|
+
throw errcode(new Error('Incorrect protocol'), 'ERR_OPEN_STREAM_FAILED');
|
|
166
|
+
}
|
|
167
|
+
await handler(sh.rest());
|
|
168
|
+
})
|
|
169
|
+
.finally(() => {
|
|
170
|
+
connection.close()
|
|
171
|
+
.catch(err => {
|
|
172
|
+
log.error(err);
|
|
173
|
+
});
|
|
174
|
+
listener.close()
|
|
175
|
+
.catch(err => {
|
|
176
|
+
log.error(err);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
await listener.listen(new Multiaddr('/ip4/127.0.0.1/tcp/0'));
|
|
182
|
+
const address = listener.getAddrs()[0];
|
|
183
|
+
if (address == null) {
|
|
184
|
+
throw errcode(new Error('Could not listen on port'), 'ERR_REGISTER_STREAM_HANDLER_FAILED');
|
|
185
|
+
}
|
|
148
186
|
const sh = await this.send({
|
|
149
187
|
type: Request.Type.STREAM_HANDLER,
|
|
150
|
-
streamOpen: undefined,
|
|
151
188
|
streamHandler: {
|
|
152
|
-
addr:
|
|
189
|
+
addr: address.bytes,
|
|
153
190
|
proto: [protocol]
|
|
154
191
|
}
|
|
155
192
|
});
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAAa,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/daemon-client",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "libp2p-daemon client implementation",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p-daemon/tree/master/packages/libp2p-daemon-client#readme",
|
|
@@ -65,15 +65,15 @@
|
|
|
65
65
|
"release": "patch"
|
|
66
66
|
},
|
|
67
67
|
{
|
|
68
|
-
"type": "
|
|
68
|
+
"type": "docs",
|
|
69
69
|
"release": "patch"
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
|
-
"type": "
|
|
72
|
+
"type": "test",
|
|
73
73
|
"release": "patch"
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
|
-
"type": "
|
|
76
|
+
"type": "deps",
|
|
77
77
|
"release": "patch"
|
|
78
78
|
},
|
|
79
79
|
{
|
|
@@ -103,7 +103,11 @@
|
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
105
|
"type": "docs",
|
|
106
|
-
"section": "
|
|
106
|
+
"section": "Documentation"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"type": "deps",
|
|
110
|
+
"section": "Dependencies"
|
|
107
111
|
},
|
|
108
112
|
{
|
|
109
113
|
"type": "test",
|
|
@@ -130,7 +134,7 @@
|
|
|
130
134
|
"release": "aegir release"
|
|
131
135
|
},
|
|
132
136
|
"dependencies": {
|
|
133
|
-
"@libp2p/daemon-protocol": "^
|
|
137
|
+
"@libp2p/daemon-protocol": "^3.0.0",
|
|
134
138
|
"@libp2p/interface-peer-id": "^1.0.2",
|
|
135
139
|
"@libp2p/interface-peer-info": "^1.0.1",
|
|
136
140
|
"@libp2p/logger": "^2.0.0",
|
|
@@ -139,16 +143,17 @@
|
|
|
139
143
|
"@multiformats/multiaddr": "^10.1.8",
|
|
140
144
|
"err-code": "^3.0.1",
|
|
141
145
|
"it-stream-types": "^1.0.4",
|
|
142
|
-
"multiformats": "^9.6.4"
|
|
146
|
+
"multiformats": "^9.6.4",
|
|
147
|
+
"uint8arraylist": "^2.3.2"
|
|
143
148
|
},
|
|
144
149
|
"devDependencies": {
|
|
145
150
|
"@libp2p/components": "^2.0.0",
|
|
146
|
-
"@libp2p/daemon-server": "^
|
|
151
|
+
"@libp2p/daemon-server": "^3.0.0",
|
|
147
152
|
"@libp2p/interface-compliance-tests": "^3.0.1",
|
|
148
153
|
"@libp2p/interface-dht": "^1.0.0",
|
|
149
|
-
"@libp2p/interface-mocks": "^
|
|
154
|
+
"@libp2p/interface-mocks": "^4.0.1",
|
|
150
155
|
"@libp2p/interface-peer-store": "^1.0.0",
|
|
151
|
-
"@libp2p/interface-pubsub": "^
|
|
156
|
+
"@libp2p/interface-pubsub": "^2.0.1",
|
|
152
157
|
"@libp2p/peer-id-factory": "^1.0.9",
|
|
153
158
|
"aegir": "^37.2.0",
|
|
154
159
|
"it-all": "^1.0.6",
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import errcode from 'err-code'
|
|
2
2
|
import { TCP } from '@libp2p/tcp'
|
|
3
|
-
import { PSMessage, Request, Response } from '@libp2p/daemon-protocol'
|
|
3
|
+
import { PSMessage, Request, Response, StreamInfo } from '@libp2p/daemon-protocol'
|
|
4
4
|
import { StreamHandler } from '@libp2p/daemon-protocol/stream-handler'
|
|
5
5
|
import { Multiaddr } from '@multiformats/multiaddr'
|
|
6
6
|
import { DHT } from './dht.js'
|
|
@@ -11,6 +11,11 @@ import { peerIdFromBytes } from '@libp2p/peer-id'
|
|
|
11
11
|
import type { Duplex } from 'it-stream-types'
|
|
12
12
|
import type { CID } from 'multiformats/cid'
|
|
13
13
|
import type { PeerInfo } from '@libp2p/interface-peer-info'
|
|
14
|
+
import type { MultiaddrConnection } from '@libp2p/interface-connection'
|
|
15
|
+
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
16
|
+
import { logger } from '@libp2p/logger'
|
|
17
|
+
|
|
18
|
+
const log = logger('libp2p:daemon-client')
|
|
14
19
|
|
|
15
20
|
class Client implements DaemonClient {
|
|
16
21
|
private readonly multiaddr: Multiaddr
|
|
@@ -21,7 +26,6 @@ class Client implements DaemonClient {
|
|
|
21
26
|
constructor (addr: Multiaddr) {
|
|
22
27
|
this.multiaddr = addr
|
|
23
28
|
this.tcp = new TCP()
|
|
24
|
-
|
|
25
29
|
this.dht = new DHT(this)
|
|
26
30
|
this.pubsub = new Pubsub(this)
|
|
27
31
|
}
|
|
@@ -33,7 +37,9 @@ class Client implements DaemonClient {
|
|
|
33
37
|
* @async
|
|
34
38
|
* @returns {MultiaddrConnection}
|
|
35
39
|
*/
|
|
36
|
-
async connectDaemon () {
|
|
40
|
+
async connectDaemon (): Promise<MultiaddrConnection> {
|
|
41
|
+
// @ts-expect-error because we use a passthrough upgrader,
|
|
42
|
+
// this is actually a MultiaddrConnection and not a Connection
|
|
37
43
|
return await this.tcp.dial(this.multiaddr, {
|
|
38
44
|
upgrader: passThroughUpgrader
|
|
39
45
|
})
|
|
@@ -147,7 +153,7 @@ class Client implements DaemonClient {
|
|
|
147
153
|
/**
|
|
148
154
|
* Initiate an outbound stream to a peer on one of a set of protocols.
|
|
149
155
|
*/
|
|
150
|
-
async openStream (peerId: PeerId, protocol: string): Promise<Duplex<Uint8Array>> {
|
|
156
|
+
async openStream (peerId: PeerId, protocol: string): Promise<Duplex<Uint8ArrayList, Uint8Array>> {
|
|
151
157
|
if (!isPeerId(peerId)) {
|
|
152
158
|
throw errcode(new Error('invalid peer id received'), 'ERR_INVALID_PEER_ID')
|
|
153
159
|
}
|
|
@@ -178,20 +184,58 @@ class Client implements DaemonClient {
|
|
|
178
184
|
/**
|
|
179
185
|
* Register a handler for inbound streams on a given protocol
|
|
180
186
|
*/
|
|
181
|
-
async registerStreamHandler (
|
|
182
|
-
if (!Multiaddr.isMultiaddr(addr)) {
|
|
183
|
-
throw errcode(new Error('invalid multiaddr received'), 'ERR_INVALID_MULTIADDR')
|
|
184
|
-
}
|
|
185
|
-
|
|
187
|
+
async registerStreamHandler (protocol: string, handler: StreamHandlerFunction): Promise<void> {
|
|
186
188
|
if (typeof protocol !== 'string') {
|
|
187
189
|
throw errcode(new Error('invalid protocol received'), 'ERR_INVALID_PROTOCOL')
|
|
188
190
|
}
|
|
189
191
|
|
|
192
|
+
// open a tcp port, pipe any data from it to the handler function
|
|
193
|
+
const listener = this.tcp.createListener({
|
|
194
|
+
upgrader: passThroughUpgrader,
|
|
195
|
+
handler: (connection) => {
|
|
196
|
+
Promise.resolve()
|
|
197
|
+
.then(async () => {
|
|
198
|
+
const sh = new StreamHandler({
|
|
199
|
+
// @ts-expect-error because we are using a passthrough upgrader, this is a MultiaddrConnection
|
|
200
|
+
stream: connection
|
|
201
|
+
})
|
|
202
|
+
const message = await sh.read()
|
|
203
|
+
|
|
204
|
+
if (message == null) {
|
|
205
|
+
throw errcode(new Error('Could not read open stream response'), 'ERR_OPEN_STREAM_FAILED')
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const response = StreamInfo.decode(message)
|
|
209
|
+
|
|
210
|
+
if (response.proto !== protocol) {
|
|
211
|
+
throw errcode(new Error('Incorrect protocol'), 'ERR_OPEN_STREAM_FAILED')
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
await handler(sh.rest())
|
|
215
|
+
})
|
|
216
|
+
.finally(() => {
|
|
217
|
+
connection.close()
|
|
218
|
+
.catch(err => {
|
|
219
|
+
log.error(err)
|
|
220
|
+
})
|
|
221
|
+
listener.close()
|
|
222
|
+
.catch(err => {
|
|
223
|
+
log.error(err)
|
|
224
|
+
})
|
|
225
|
+
})
|
|
226
|
+
}
|
|
227
|
+
})
|
|
228
|
+
await listener.listen(new Multiaddr('/ip4/127.0.0.1/tcp/0'))
|
|
229
|
+
const address = listener.getAddrs()[0]
|
|
230
|
+
|
|
231
|
+
if (address == null) {
|
|
232
|
+
throw errcode(new Error('Could not listen on port'), 'ERR_REGISTER_STREAM_HANDLER_FAILED')
|
|
233
|
+
}
|
|
234
|
+
|
|
190
235
|
const sh = await this.send({
|
|
191
236
|
type: Request.Type.STREAM_HANDLER,
|
|
192
|
-
streamOpen: undefined,
|
|
193
237
|
streamHandler: {
|
|
194
|
-
addr:
|
|
238
|
+
addr: address.bytes,
|
|
195
239
|
proto: [protocol]
|
|
196
240
|
}
|
|
197
241
|
})
|
|
@@ -212,6 +256,10 @@ export interface IdentifyResult {
|
|
|
212
256
|
addrs: Multiaddr[]
|
|
213
257
|
}
|
|
214
258
|
|
|
259
|
+
export interface StreamHandlerFunction {
|
|
260
|
+
(stream: Duplex<Uint8ArrayList, Uint8Array>): Promise<void>
|
|
261
|
+
}
|
|
262
|
+
|
|
215
263
|
export interface DHTClient {
|
|
216
264
|
put: (key: Uint8Array, value: Uint8Array) => Promise<void>
|
|
217
265
|
get: (key: Uint8Array) => Promise<Uint8Array>
|
|
@@ -235,7 +283,8 @@ export interface DaemonClient {
|
|
|
235
283
|
pubsub: PubSubClient
|
|
236
284
|
|
|
237
285
|
send: (request: Request) => Promise<StreamHandler>
|
|
238
|
-
openStream: (peerId: PeerId, protocol: string) => Promise<Duplex<Uint8Array>>
|
|
286
|
+
openStream: (peerId: PeerId, protocol: string) => Promise<Duplex<Uint8ArrayList, Uint8Array>>
|
|
287
|
+
registerStreamHandler: (protocol: string, handler: StreamHandlerFunction) => Promise<void>
|
|
239
288
|
}
|
|
240
289
|
|
|
241
290
|
export function createClient (multiaddr: Multiaddr): DaemonClient {
|