@libp2p/mdns 0.18.0 → 1.0.2
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/README.md +2 -2
- package/dist/src/compat/index.d.ts +10 -12
- package/dist/src/compat/index.d.ts.map +1 -1
- package/dist/src/compat/index.js +10 -10
- package/dist/src/compat/index.js.map +1 -1
- package/dist/src/compat/querier.d.ts +9 -9
- package/dist/src/compat/querier.d.ts.map +1 -1
- package/dist/src/compat/querier.js +25 -68
- package/dist/src/compat/querier.js.map +1 -1
- package/dist/src/compat/responder.d.ts +5 -10
- package/dist/src/compat/responder.d.ts.map +1 -1
- package/dist/src/compat/responder.js +39 -40
- package/dist/src/compat/responder.js.map +1 -1
- package/dist/src/compat/utils.d.ts +5 -0
- package/dist/src/compat/utils.d.ts.map +1 -0
- package/dist/src/compat/utils.js +70 -0
- package/dist/src/compat/utils.js.map +1 -0
- package/dist/src/index.d.ts +8 -12
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +28 -21
- package/dist/src/index.js.map +1 -1
- package/dist/src/query.d.ts +1 -1
- package/dist/src/query.d.ts.map +1 -1
- package/dist/src/query.js +15 -15
- package/dist/src/query.js.map +1 -1
- package/package.json +11 -11
- package/src/compat/index.ts +19 -14
- package/src/compat/querier.ts +31 -80
- package/src/compat/responder.ts +46 -54
- package/src/compat/utils.ts +81 -0
- package/src/index.ts +36 -31
- package/src/query.ts +18 -15
package/dist/src/index.js
CHANGED
|
@@ -1,37 +1,34 @@
|
|
|
1
1
|
import multicastDNS from 'multicast-dns';
|
|
2
|
-
import { EventEmitter } from '
|
|
3
|
-
import
|
|
2
|
+
import { CustomEvent, EventEmitter } from '@libp2p/interfaces';
|
|
3
|
+
import { logger } from '@libp2p/logger';
|
|
4
4
|
import * as query from './query.js';
|
|
5
5
|
import { GoMulticastDNS } from './compat/index.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
});
|
|
6
|
+
import { Components } from '@libp2p/interfaces/components';
|
|
7
|
+
const log = logger('libp2p:mdns');
|
|
9
8
|
export class MulticastDNS extends EventEmitter {
|
|
10
|
-
constructor(options) {
|
|
9
|
+
constructor(options = {}) {
|
|
11
10
|
super();
|
|
12
|
-
|
|
13
|
-
throw new Error('needs own PeerId to work');
|
|
14
|
-
}
|
|
11
|
+
this.components = new Components();
|
|
15
12
|
this.broadcast = options.broadcast !== false;
|
|
16
13
|
this.interval = options.interval ?? (1e3 * 10);
|
|
17
14
|
this.serviceTag = options.serviceTag ?? 'ipfs.local';
|
|
18
15
|
this.port = options.port ?? 5353;
|
|
19
|
-
this.peerId = options.peerId;
|
|
20
|
-
this.peerMultiaddrs = options.multiaddrs ?? [];
|
|
21
16
|
this._queryInterval = null;
|
|
22
17
|
this._onPeer = this._onPeer.bind(this);
|
|
23
18
|
this._onMdnsQuery = this._onMdnsQuery.bind(this);
|
|
24
19
|
this._onMdnsResponse = this._onMdnsResponse.bind(this);
|
|
25
20
|
if (options.compat !== false) {
|
|
26
21
|
this._goMdns = new GoMulticastDNS({
|
|
27
|
-
multiaddrs: this.peerMultiaddrs,
|
|
28
|
-
peerId: options.peerId,
|
|
29
22
|
queryPeriod: options.compatQueryPeriod,
|
|
30
23
|
queryInterval: options.compatQueryInterval
|
|
31
24
|
});
|
|
32
|
-
this._goMdns.
|
|
25
|
+
this._goMdns.addEventListener('peer', this._onPeer);
|
|
33
26
|
}
|
|
34
27
|
}
|
|
28
|
+
init(components) {
|
|
29
|
+
this.components = components;
|
|
30
|
+
this._goMdns?.init(components);
|
|
31
|
+
}
|
|
35
32
|
isStarted() {
|
|
36
33
|
return Boolean(this.mdns);
|
|
37
34
|
}
|
|
@@ -56,21 +53,31 @@ export class MulticastDNS extends EventEmitter {
|
|
|
56
53
|
if (this.mdns == null) {
|
|
57
54
|
return;
|
|
58
55
|
}
|
|
59
|
-
|
|
56
|
+
log.trace('received incoming mDNS query');
|
|
57
|
+
query.gotQuery(event, this.mdns, this.components.getPeerId(), this.components.getAddressManager().getAddresses(), this.serviceTag, this.broadcast);
|
|
60
58
|
}
|
|
61
59
|
_onMdnsResponse(event) {
|
|
60
|
+
log.trace('received mDNS query response');
|
|
62
61
|
try {
|
|
63
|
-
const foundPeer = query.gotResponse(event, this.
|
|
62
|
+
const foundPeer = query.gotResponse(event, this.components.getPeerId(), this.serviceTag);
|
|
64
63
|
if (foundPeer != null) {
|
|
65
|
-
|
|
64
|
+
log('discovered peer in mDNS qeury response %p', foundPeer.id);
|
|
65
|
+
this.dispatchEvent(new CustomEvent('peer', {
|
|
66
|
+
detail: foundPeer
|
|
67
|
+
}));
|
|
66
68
|
}
|
|
67
69
|
}
|
|
68
70
|
catch (err) {
|
|
69
|
-
log('Error processing peer response', err);
|
|
71
|
+
log.error('Error processing peer response', err);
|
|
70
72
|
}
|
|
71
73
|
}
|
|
72
|
-
_onPeer(
|
|
73
|
-
(this.mdns
|
|
74
|
+
_onPeer(evt) {
|
|
75
|
+
if (this.mdns == null) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.dispatchEvent(new CustomEvent('peer', {
|
|
79
|
+
detail: evt.detail
|
|
80
|
+
}));
|
|
74
81
|
}
|
|
75
82
|
/**
|
|
76
83
|
* Stop sending queries to the LAN.
|
|
@@ -83,7 +90,7 @@ export class MulticastDNS extends EventEmitter {
|
|
|
83
90
|
}
|
|
84
91
|
this.mdns.removeListener('query', this._onMdnsQuery);
|
|
85
92
|
this.mdns.removeListener('response', this._onMdnsResponse);
|
|
86
|
-
this._goMdns?.
|
|
93
|
+
this._goMdns?.removeEventListener('peer', this._onPeer);
|
|
87
94
|
if (this._queryInterval != null) {
|
|
88
95
|
clearInterval(this._queryInterval);
|
|
89
96
|
this._queryInterval = null;
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/query.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Multiaddr } from '@multiformats/multiaddr';
|
|
3
|
-
import { PeerId } from '@libp2p/peer-id';
|
|
3
|
+
import type { PeerId } from '@libp2p/interfaces/peer-id';
|
|
4
4
|
import type { PeerData } from '@libp2p/interfaces/peer-data';
|
|
5
5
|
import type { MulticastDNS, ResponsePacket, QueryPacket } from 'multicast-dns';
|
|
6
6
|
export declare function queryLAN(mdns: MulticastDNS, serviceTag: string, interval: number): NodeJS.Timer;
|
package/dist/src/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAA8B,MAAM,yBAAyB,CAAA;AAE/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAK9E,wBAAgB,QAAQ,CAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAejF;AAUD,wBAAgB,WAAW,CAAE,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA6D/G;AAED,wBAAgB,QAAQ,CAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,QAqE9I"}
|
package/dist/src/query.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import os from 'os';
|
|
2
|
-
import
|
|
3
|
-
import { Multiaddr } from '@multiformats/multiaddr';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
const log = Object.assign(debug('libp2p:mdns'), {
|
|
7
|
-
error: debug('libp2p:mdns:error')
|
|
8
|
-
});
|
|
2
|
+
import { logger } from '@libp2p/logger';
|
|
3
|
+
import { Multiaddr, protocols } from '@multiformats/multiaddr';
|
|
4
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
5
|
+
const log = logger('libp2p:mdns:query');
|
|
9
6
|
export function queryLAN(mdns, serviceTag, interval) {
|
|
10
7
|
const query = () => {
|
|
11
8
|
log('query', serviceTag);
|
|
@@ -69,28 +66,31 @@ export function gotResponse(rsp, localPeerId, serviceTag) {
|
|
|
69
66
|
multiaddrs.push(ma);
|
|
70
67
|
}
|
|
71
68
|
});
|
|
72
|
-
if (localPeerId.toString(
|
|
69
|
+
if (localPeerId.toString() === b58Id) {
|
|
73
70
|
return; // replied to myself, ignore
|
|
74
71
|
}
|
|
75
|
-
|
|
72
|
+
const id = peerIdFromString(b58Id);
|
|
73
|
+
log('peer found %p', id);
|
|
76
74
|
return {
|
|
77
|
-
id
|
|
75
|
+
id,
|
|
78
76
|
multiaddrs,
|
|
79
77
|
protocols: []
|
|
80
78
|
};
|
|
81
79
|
}
|
|
82
80
|
export function gotQuery(qry, mdns, peerId, multiaddrs, serviceTag, broadcast) {
|
|
83
81
|
if (!broadcast) {
|
|
82
|
+
log('not responding to mDNS query as broadcast mode is false');
|
|
84
83
|
return;
|
|
85
84
|
}
|
|
86
85
|
const addresses = multiaddrs.reduce((acc, addr) => {
|
|
87
|
-
if (addr.isThinWaistAddress()) {
|
|
86
|
+
if (addr.decapsulateCode(protocols('p2p').code).isThinWaistAddress()) {
|
|
88
87
|
acc.push(addr.toOptions());
|
|
89
88
|
}
|
|
90
89
|
return acc;
|
|
91
90
|
}, []);
|
|
92
91
|
// Only announce TCP for now
|
|
93
92
|
if (addresses.length === 0) {
|
|
93
|
+
log('no thin waist addresses present, cannot respond to query');
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
96
96
|
if (qry.questions[0] != null && qry.questions[0].name === serviceTag) {
|
|
@@ -100,12 +100,12 @@ export function gotQuery(qry, mdns, peerId, multiaddrs, serviceTag, broadcast) {
|
|
|
100
100
|
type: 'PTR',
|
|
101
101
|
class: 'IN',
|
|
102
102
|
ttl: 120,
|
|
103
|
-
data: peerId.toString(
|
|
103
|
+
data: peerId.toString() + '.' + serviceTag
|
|
104
104
|
});
|
|
105
105
|
// Only announce TCP multiaddrs for now
|
|
106
106
|
const port = addresses[0].port;
|
|
107
107
|
answers.push({
|
|
108
|
-
name: peerId.toString(
|
|
108
|
+
name: peerId.toString() + '.' + serviceTag,
|
|
109
109
|
type: 'SRV',
|
|
110
110
|
class: 'IN',
|
|
111
111
|
ttl: 120,
|
|
@@ -117,11 +117,11 @@ export function gotQuery(qry, mdns, peerId, multiaddrs, serviceTag, broadcast) {
|
|
|
117
117
|
}
|
|
118
118
|
});
|
|
119
119
|
answers.push({
|
|
120
|
-
name: peerId.toString(
|
|
120
|
+
name: peerId.toString() + '.' + serviceTag,
|
|
121
121
|
type: 'TXT',
|
|
122
122
|
class: 'IN',
|
|
123
123
|
ttl: 120,
|
|
124
|
-
data: peerId.toString(
|
|
124
|
+
data: peerId.toString()
|
|
125
125
|
});
|
|
126
126
|
addresses.forEach((addr) => {
|
|
127
127
|
if ([4, 6].includes(addr.family)) {
|
package/dist/src/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/mdns",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Node.js libp2p mDNS discovery implementation for peer discovery",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p-mdns#readme",
|
|
@@ -123,27 +123,27 @@
|
|
|
123
123
|
"dep-check": "aegir dep-check dist/src/**/*.js dist/test/**/*.js",
|
|
124
124
|
"build": "tsc",
|
|
125
125
|
"pretest": "npm run build",
|
|
126
|
-
"test": "aegir test -f ./dist/test",
|
|
126
|
+
"test": "aegir test -f ./dist/test/*.js -f ./dist/test/*/*.js",
|
|
127
127
|
"test:node": "npm run test -- -t node --cov",
|
|
128
128
|
"test:electron-main": "npm run test -- -t electron-main",
|
|
129
129
|
"release": "semantic-release"
|
|
130
130
|
},
|
|
131
131
|
"dependencies": {
|
|
132
|
-
"@libp2p/
|
|
133
|
-
"@
|
|
134
|
-
"
|
|
132
|
+
"@libp2p/logger": "^1.1.2",
|
|
133
|
+
"@libp2p/peer-id": "^1.1.8",
|
|
134
|
+
"@multiformats/multiaddr": "^10.1.5",
|
|
135
135
|
"multicast-dns": "^7.2.0",
|
|
136
136
|
"multiformats": "^9.6.3"
|
|
137
137
|
},
|
|
138
138
|
"devDependencies": {
|
|
139
|
-
"@libp2p/interface-compliance-tests": "^1.
|
|
140
|
-
"@libp2p/interfaces": "^1.
|
|
141
|
-
"@libp2p/peer-id-factory": "^1.0.
|
|
142
|
-
"@types/debug": "^4.1.7",
|
|
139
|
+
"@libp2p/interface-compliance-tests": "^1.1.16",
|
|
140
|
+
"@libp2p/interfaces": "^1.3.14",
|
|
141
|
+
"@libp2p/peer-id-factory": "^1.0.8",
|
|
143
142
|
"@types/multicast-dns": "^7.2.1",
|
|
144
|
-
"aegir": "^36.1.
|
|
143
|
+
"aegir": "^36.1.3",
|
|
145
144
|
"delay": "^5.0.0",
|
|
146
145
|
"p-defer": "^4.0.0",
|
|
147
|
-
"p-wait-for": "^4.1.0"
|
|
146
|
+
"p-wait-for": "^4.1.0",
|
|
147
|
+
"ts-sinon": "^2.0.2"
|
|
148
148
|
}
|
|
149
149
|
}
|
package/src/compat/index.ts
CHANGED
|
@@ -1,37 +1,42 @@
|
|
|
1
1
|
// Compatibility with Go libp2p MDNS
|
|
2
|
-
import { EventEmitter } from '
|
|
2
|
+
import { EventEmitter, CustomEvent } from '@libp2p/interfaces'
|
|
3
3
|
import { Responder } from './responder.js'
|
|
4
4
|
import { Querier } from './querier.js'
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import type { PeerDiscovery } from '@libp2p/interfaces/peer-discovery'
|
|
5
|
+
import type { PeerDiscovery, PeerDiscoveryEvents } from '@libp2p/interfaces/peer-discovery'
|
|
6
|
+
import type { Components, Initializable } from '@libp2p/interfaces/components'
|
|
8
7
|
|
|
9
|
-
export
|
|
8
|
+
export interface GoMulticastDNSInit {
|
|
9
|
+
queryPeriod?: number
|
|
10
|
+
queryInterval?: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class GoMulticastDNS extends EventEmitter<PeerDiscoveryEvents> implements PeerDiscovery, Initializable {
|
|
10
14
|
private _started: boolean
|
|
11
15
|
private readonly _responder: Responder
|
|
12
16
|
private readonly _querier: Querier
|
|
13
17
|
|
|
14
|
-
constructor (options:
|
|
18
|
+
constructor (options: GoMulticastDNSInit = {}) {
|
|
15
19
|
super()
|
|
16
|
-
const {
|
|
20
|
+
const { queryPeriod, queryInterval } = options
|
|
17
21
|
|
|
18
22
|
this._started = false
|
|
19
23
|
|
|
20
|
-
this._responder = new Responder(
|
|
21
|
-
peerId,
|
|
22
|
-
multiaddrs
|
|
23
|
-
})
|
|
24
|
+
this._responder = new Responder()
|
|
24
25
|
this._querier = new Querier({
|
|
25
|
-
peerId,
|
|
26
26
|
queryInterval,
|
|
27
27
|
queryPeriod
|
|
28
28
|
})
|
|
29
29
|
|
|
30
|
-
this._querier.
|
|
31
|
-
this.
|
|
30
|
+
this._querier.addEventListener('peer', (evt) => {
|
|
31
|
+
this.dispatchEvent(new CustomEvent('peer', { detail: evt.detail }))
|
|
32
32
|
})
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
init (components: Components): void {
|
|
36
|
+
this._responder.init(components)
|
|
37
|
+
this._querier.init(components)
|
|
38
|
+
}
|
|
39
|
+
|
|
35
40
|
isStarted () {
|
|
36
41
|
return this._started
|
|
37
42
|
}
|
package/src/compat/querier.ts
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import { EventEmitter } from '
|
|
1
|
+
import { CustomEvent, EventEmitter } from '@libp2p/interfaces'
|
|
2
2
|
import MDNS from 'multicast-dns'
|
|
3
|
-
import {
|
|
4
|
-
import { PeerId } from '@libp2p/peer-id'
|
|
5
|
-
import debug from 'debug'
|
|
3
|
+
import { logger } from '@libp2p/logger'
|
|
6
4
|
import { SERVICE_TAG_LOCAL, MULTICAST_IP, MULTICAST_PORT } from './constants.js'
|
|
7
|
-
import {
|
|
8
|
-
import type { PeerDiscovery } from '@libp2p/interfaces/peer-discovery'
|
|
5
|
+
import type { PeerDiscovery, PeerDiscoveryEvents } from '@libp2p/interfaces/peer-discovery'
|
|
9
6
|
import type { ResponsePacket } from 'multicast-dns'
|
|
10
7
|
import type { RemoteInfo } from 'dgram'
|
|
8
|
+
import { Components, Initializable } from '@libp2p/interfaces/components'
|
|
9
|
+
import { findPeerDataInAnswers } from './utils.js'
|
|
11
10
|
|
|
12
|
-
const log =
|
|
13
|
-
error: debug('libp2p:mdns:compat:querier:error')
|
|
14
|
-
})
|
|
11
|
+
const log = logger('libp2p:mdns:compat:querier')
|
|
15
12
|
|
|
16
|
-
export interface
|
|
17
|
-
peerId: PeerId
|
|
13
|
+
export interface QuerierInit {
|
|
18
14
|
queryInterval?: number
|
|
19
15
|
queryPeriod?: number
|
|
20
16
|
}
|
|
@@ -23,24 +19,17 @@ export interface Handle {
|
|
|
23
19
|
stop: () => Promise<void>
|
|
24
20
|
}
|
|
25
21
|
|
|
26
|
-
export class Querier extends EventEmitter implements PeerDiscovery {
|
|
27
|
-
private readonly
|
|
28
|
-
private readonly _options: Required<QuerierOptions>
|
|
22
|
+
export class Querier extends EventEmitter<PeerDiscoveryEvents> implements PeerDiscovery, Initializable {
|
|
23
|
+
private readonly _init: Required<QuerierInit>
|
|
29
24
|
private _handle?: Handle
|
|
25
|
+
private components: Components = new Components()
|
|
30
26
|
|
|
31
|
-
constructor (
|
|
27
|
+
constructor (init: QuerierInit = {}) {
|
|
32
28
|
super()
|
|
33
29
|
|
|
34
|
-
const {
|
|
35
|
-
|
|
36
|
-
if (peerId == null) {
|
|
37
|
-
throw new Error('missing peerId parameter')
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
this._peerIdStr = peerId.toString(base58btc)
|
|
41
|
-
this._options = {
|
|
42
|
-
peerId,
|
|
30
|
+
const { queryInterval, queryPeriod } = init
|
|
43
31
|
|
|
32
|
+
this._init = {
|
|
44
33
|
// Re-query in leu of network change detection (every 60s by default)
|
|
45
34
|
queryInterval: queryInterval ?? 60000,
|
|
46
35
|
// Time for which the MDNS server will stay alive waiting for responses
|
|
@@ -53,6 +42,10 @@ export class Querier extends EventEmitter implements PeerDiscovery {
|
|
|
53
42
|
this._onResponse = this._onResponse.bind(this)
|
|
54
43
|
}
|
|
55
44
|
|
|
45
|
+
init (components: Components): void {
|
|
46
|
+
this.components = components
|
|
47
|
+
}
|
|
48
|
+
|
|
56
49
|
isStarted () {
|
|
57
50
|
return Boolean(this._handle)
|
|
58
51
|
}
|
|
@@ -84,74 +77,32 @@ export class Querier extends EventEmitter implements PeerDiscovery {
|
|
|
84
77
|
}
|
|
85
78
|
}
|
|
86
79
|
}, {
|
|
87
|
-
period: this.
|
|
88
|
-
interval: this.
|
|
80
|
+
period: this._init.queryPeriod,
|
|
81
|
+
interval: this._init.queryInterval
|
|
89
82
|
})
|
|
90
83
|
}
|
|
91
84
|
|
|
92
85
|
_onResponse (event: ResponsePacket, info: RemoteInfo) {
|
|
86
|
+
log.trace('received mDNS query response')
|
|
93
87
|
const answers = event.answers ?? []
|
|
94
|
-
const ptrRecord = answers.find(a => a.type === 'PTR' && a.name === SERVICE_TAG_LOCAL)
|
|
95
|
-
|
|
96
|
-
// Only deal with responses for our service tag
|
|
97
|
-
if (ptrRecord == null) return
|
|
98
|
-
|
|
99
|
-
log('got response', event, info)
|
|
100
|
-
|
|
101
|
-
const txtRecord = answers.find(a => a.type === 'TXT')
|
|
102
|
-
if (txtRecord == null || txtRecord.type !== 'TXT') {
|
|
103
|
-
return log('missing TXT record in response')
|
|
104
|
-
}
|
|
105
88
|
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
peerIdStr = txtRecord.data[0].toString()
|
|
109
|
-
} catch (err) {
|
|
110
|
-
return log('failed to extract peer ID from TXT record data', txtRecord, err)
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (this._peerIdStr === peerIdStr) {
|
|
114
|
-
return log('ignoring reply to myself')
|
|
115
|
-
}
|
|
89
|
+
const peerData = findPeerDataInAnswers(answers, this.components.getPeerId())
|
|
116
90
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
} catch (err) {
|
|
121
|
-
return log('failed to create peer ID from TXT record data', peerIdStr, err)
|
|
91
|
+
if (peerData == null) {
|
|
92
|
+
log('could not read peer data from query response')
|
|
93
|
+
return
|
|
122
94
|
}
|
|
123
95
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
return
|
|
96
|
+
if (peerData.multiaddrs.length === 0) {
|
|
97
|
+
log('could not parse multiaddrs from mDNS response')
|
|
98
|
+
return
|
|
127
99
|
}
|
|
128
100
|
|
|
129
|
-
log('peer
|
|
101
|
+
log('discovered peer in mDNS qeury response %p', peerData.id)
|
|
130
102
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const multiaddrs = answers
|
|
135
|
-
.filter(a => ['A', 'AAAA'].includes(a.type))
|
|
136
|
-
.reduce<Multiaddr[]>((addrs, a) => {
|
|
137
|
-
if (a.type !== 'A' && a.type !== 'AAAA') {
|
|
138
|
-
return addrs
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const maStr = `/${protos[a.type]}/${a.data}/tcp/${port}`
|
|
142
|
-
try {
|
|
143
|
-
addrs.push(new Multiaddr(maStr))
|
|
144
|
-
log(maStr)
|
|
145
|
-
} catch (err) {
|
|
146
|
-
log(`failed to create multiaddr from ${a.type} record data`, maStr, port, err)
|
|
147
|
-
}
|
|
148
|
-
return addrs
|
|
149
|
-
}, [])
|
|
150
|
-
|
|
151
|
-
this.emit('peer', {
|
|
152
|
-
id: peerId,
|
|
153
|
-
multiaddrs
|
|
154
|
-
})
|
|
103
|
+
this.dispatchEvent(new CustomEvent('peer', {
|
|
104
|
+
detail: peerData
|
|
105
|
+
}))
|
|
155
106
|
}
|
|
156
107
|
|
|
157
108
|
async stop () {
|
package/src/compat/responder.ts
CHANGED
|
@@ -1,54 +1,45 @@
|
|
|
1
1
|
import OS from 'os'
|
|
2
2
|
import MDNS, { QueryPacket } from 'multicast-dns'
|
|
3
|
-
import
|
|
3
|
+
import { logger } from '@libp2p/logger'
|
|
4
4
|
import { SERVICE_TAG_LOCAL } from './constants.js'
|
|
5
|
-
import
|
|
6
|
-
import type { Multiaddr, MultiaddrObject } from '@multiformats/multiaddr'
|
|
7
|
-
import { base58btc } from 'multiformats/bases/base58'
|
|
5
|
+
import { MultiaddrObject, protocols } from '@multiformats/multiaddr'
|
|
8
6
|
import type { RemoteInfo } from 'dgram'
|
|
9
7
|
import type { Answer } from 'dns-packet'
|
|
8
|
+
import { Components, Initializable } from '@libp2p/interfaces/components'
|
|
10
9
|
|
|
11
|
-
const log =
|
|
12
|
-
error: debug('libp2p:mdns:compat:responder:error')
|
|
13
|
-
})
|
|
10
|
+
const log = logger('libp2p:mdns:compat:responder')
|
|
14
11
|
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
multiaddrs: Multiaddr[]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class Responder {
|
|
21
|
-
private readonly _peerIdStr: string
|
|
22
|
-
private readonly _multiaddrs: Multiaddr[]
|
|
12
|
+
export class Responder implements Initializable {
|
|
13
|
+
private components: Components = new Components()
|
|
23
14
|
private _mdns?: MDNS.MulticastDNS
|
|
24
15
|
|
|
25
|
-
constructor (
|
|
26
|
-
const { peerId, multiaddrs } = options
|
|
27
|
-
|
|
28
|
-
if (peerId == null) {
|
|
29
|
-
throw new Error('missing peerId parameter')
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
this._peerIdStr = peerId.toString(base58btc)
|
|
33
|
-
this._multiaddrs = multiaddrs
|
|
16
|
+
constructor () {
|
|
34
17
|
this._onQuery = this._onQuery.bind(this)
|
|
35
18
|
}
|
|
36
19
|
|
|
20
|
+
init (components: Components): void {
|
|
21
|
+
this.components = components
|
|
22
|
+
}
|
|
23
|
+
|
|
37
24
|
start () {
|
|
38
25
|
this._mdns = MDNS()
|
|
39
26
|
this._mdns.on('query', this._onQuery)
|
|
40
27
|
}
|
|
41
28
|
|
|
42
29
|
_onQuery (event: QueryPacket, info: RemoteInfo) {
|
|
43
|
-
const addresses = this.
|
|
30
|
+
const addresses = this.components.getAddressManager().getAddresses().reduce<MultiaddrObject[]>((acc, addr) => {
|
|
31
|
+
addr = addr.decapsulateCode(protocols('p2p').code)
|
|
32
|
+
|
|
44
33
|
if (addr.isThinWaistAddress()) {
|
|
45
34
|
acc.push(addr.toOptions())
|
|
46
35
|
}
|
|
36
|
+
|
|
47
37
|
return acc
|
|
48
38
|
}, [])
|
|
49
39
|
|
|
50
40
|
// Only announce TCP for now
|
|
51
41
|
if (addresses.length === 0) {
|
|
42
|
+
log('no tcp addresses configured so cannot respond to mDNS query')
|
|
52
43
|
return
|
|
53
44
|
}
|
|
54
45
|
|
|
@@ -57,10 +48,10 @@ export class Responder {
|
|
|
57
48
|
// Only respond to queries for our service tag
|
|
58
49
|
if (!questions.some(q => q.name === SERVICE_TAG_LOCAL)) return
|
|
59
50
|
|
|
60
|
-
log('got query', event, info)
|
|
51
|
+
log.trace('got query', event, info)
|
|
61
52
|
|
|
62
53
|
const answers: Answer[] = []
|
|
63
|
-
const peerServiceTagLocal = `${this.
|
|
54
|
+
const peerServiceTagLocal = `${this.components.getPeerId().toString()}.${SERVICE_TAG_LOCAL}`
|
|
64
55
|
|
|
65
56
|
answers.push({
|
|
66
57
|
name: SERVICE_TAG_LOCAL,
|
|
@@ -70,44 +61,45 @@ export class Responder {
|
|
|
70
61
|
data: peerServiceTagLocal
|
|
71
62
|
})
|
|
72
63
|
|
|
73
|
-
// Only announce TCP multiaddrs for now
|
|
74
|
-
const port = addresses[0].port
|
|
75
|
-
|
|
76
|
-
answers.push({
|
|
77
|
-
name: peerServiceTagLocal,
|
|
78
|
-
type: 'SRV',
|
|
79
|
-
class: 'IN',
|
|
80
|
-
ttl: 120,
|
|
81
|
-
data: {
|
|
82
|
-
priority: 10,
|
|
83
|
-
weight: 1,
|
|
84
|
-
port,
|
|
85
|
-
target: OS.hostname()
|
|
86
|
-
}
|
|
87
|
-
})
|
|
88
|
-
|
|
89
64
|
answers.push({
|
|
90
65
|
name: peerServiceTagLocal,
|
|
91
66
|
type: 'TXT',
|
|
92
67
|
class: 'IN',
|
|
93
68
|
ttl: 120,
|
|
94
|
-
data: [Buffer.from(this.
|
|
69
|
+
data: [Buffer.from(this.components.getPeerId().toString())]
|
|
95
70
|
})
|
|
96
71
|
|
|
97
|
-
addresses.forEach(
|
|
98
|
-
if ([4, 6].includes(ma.family)) {
|
|
99
|
-
|
|
100
|
-
name: OS.hostname(),
|
|
101
|
-
type: ma.family === 4 ? 'A' : 'AAAA',
|
|
102
|
-
class: 'IN',
|
|
103
|
-
ttl: 120,
|
|
104
|
-
data: ma.host
|
|
105
|
-
})
|
|
72
|
+
addresses.forEach(ma => {
|
|
73
|
+
if (![4, 6].includes(ma.family)) {
|
|
74
|
+
return
|
|
106
75
|
}
|
|
76
|
+
|
|
77
|
+
answers.push({
|
|
78
|
+
name: peerServiceTagLocal,
|
|
79
|
+
type: 'SRV',
|
|
80
|
+
class: 'IN',
|
|
81
|
+
ttl: 120,
|
|
82
|
+
data: {
|
|
83
|
+
priority: 10,
|
|
84
|
+
weight: 1,
|
|
85
|
+
port: ma.port,
|
|
86
|
+
target: OS.hostname()
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
answers.push({
|
|
91
|
+
name: OS.hostname(),
|
|
92
|
+
type: ma.family === 4 ? 'A' : 'AAAA',
|
|
93
|
+
class: 'IN',
|
|
94
|
+
ttl: 120,
|
|
95
|
+
data: ma.host
|
|
96
|
+
})
|
|
107
97
|
})
|
|
108
98
|
|
|
109
99
|
if (this._mdns != null) {
|
|
110
|
-
log('responding to query'
|
|
100
|
+
log.trace('responding to query')
|
|
101
|
+
log.trace('query answers', answers)
|
|
102
|
+
|
|
111
103
|
this._mdns.respond(answers, info)
|
|
112
104
|
}
|
|
113
105
|
}
|