@libp2p/mdns 0.18.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.
@@ -0,0 +1,145 @@
1
+ import multicastDNS from 'multicast-dns';
2
+ import { EventEmitter } from 'events';
3
+ import debug from 'debug';
4
+ import * as query from './query.js';
5
+ import { GoMulticastDNS } from './compat/index.js';
6
+ const log = Object.assign(debug('libp2p:mdns'), {
7
+ error: debug('libp2p:mdns:error')
8
+ });
9
+ export class MulticastDNS extends EventEmitter {
10
+ constructor(options) {
11
+ super();
12
+ if (options.peerId == null) {
13
+ throw new Error('needs own PeerId to work');
14
+ }
15
+ this.broadcast = options.broadcast !== false;
16
+ this.interval = options.interval ?? (1e3 * 10);
17
+ this.serviceTag = options.serviceTag ?? 'ipfs.local';
18
+ this.port = options.port ?? 5353;
19
+ this.peerId = options.peerId;
20
+ this.peerMultiaddrs = options.multiaddrs ?? [];
21
+ this._queryInterval = null;
22
+ this._onPeer = this._onPeer.bind(this);
23
+ this._onMdnsQuery = this._onMdnsQuery.bind(this);
24
+ this._onMdnsResponse = this._onMdnsResponse.bind(this);
25
+ if (options.compat !== false) {
26
+ this._goMdns = new GoMulticastDNS({
27
+ multiaddrs: this.peerMultiaddrs,
28
+ peerId: options.peerId,
29
+ queryPeriod: options.compatQueryPeriod,
30
+ queryInterval: options.compatQueryInterval
31
+ });
32
+ this._goMdns.on('peer', this._onPeer);
33
+ }
34
+ }
35
+ isStarted() {
36
+ return Boolean(this.mdns);
37
+ }
38
+ /**
39
+ * Start sending queries to the LAN.
40
+ *
41
+ * @returns {void}
42
+ */
43
+ async start() {
44
+ if (this.mdns != null) {
45
+ return;
46
+ }
47
+ this.mdns = multicastDNS({ port: this.port });
48
+ this.mdns.on('query', this._onMdnsQuery);
49
+ this.mdns.on('response', this._onMdnsResponse);
50
+ this._queryInterval = query.queryLAN(this.mdns, this.serviceTag, this.interval);
51
+ if (this._goMdns != null) {
52
+ await this._goMdns.start();
53
+ }
54
+ }
55
+ _onMdnsQuery(event) {
56
+ if (this.mdns == null) {
57
+ return;
58
+ }
59
+ query.gotQuery(event, this.mdns, this.peerId, this.peerMultiaddrs, this.serviceTag, this.broadcast);
60
+ }
61
+ _onMdnsResponse(event) {
62
+ try {
63
+ const foundPeer = query.gotResponse(event, this.peerId, this.serviceTag);
64
+ if (foundPeer != null) {
65
+ this.emit('peer', foundPeer);
66
+ }
67
+ }
68
+ catch (err) {
69
+ log('Error processing peer response', err);
70
+ }
71
+ }
72
+ _onPeer(peerData) {
73
+ (this.mdns != null) && this.emit('peer', peerData);
74
+ }
75
+ /**
76
+ * Stop sending queries to the LAN.
77
+ *
78
+ * @returns {Promise}
79
+ */
80
+ async stop() {
81
+ if (this.mdns == null) {
82
+ return;
83
+ }
84
+ this.mdns.removeListener('query', this._onMdnsQuery);
85
+ this.mdns.removeListener('response', this._onMdnsResponse);
86
+ this._goMdns?.removeListener('peer', this._onPeer);
87
+ if (this._queryInterval != null) {
88
+ clearInterval(this._queryInterval);
89
+ this._queryInterval = null;
90
+ }
91
+ await Promise.all([
92
+ this._goMdns?.stop(),
93
+ new Promise((resolve) => {
94
+ if (this.mdns != null) {
95
+ this.mdns.destroy(resolve);
96
+ }
97
+ else {
98
+ resolve();
99
+ }
100
+ })
101
+ ]);
102
+ this.mdns = undefined;
103
+ }
104
+ }
105
+ MulticastDNS.tag = 'mdns';
106
+ /* for reference
107
+
108
+ [ { name: 'discovery.ipfs.io.local',
109
+ type: 'PTR',
110
+ class: 1,
111
+ ttl: 120,
112
+ data: 'QmbBHw1Xx9pUpAbrVZUKTPL5Rsph5Q9GQhRvcWVBPFgGtC.discovery.ipfs.io.local' },
113
+
114
+ { name: 'QmbBHw1Xx9pUpAbrVZUKTPL5Rsph5Q9GQhRvcWVBPFgGtC.discovery.ipfs.io.local',
115
+ type: 'SRV',
116
+ class: 1,
117
+ ttl: 120,
118
+ data: { priority: 10, weight: 1, port: 4001, target: 'lorien.local' } },
119
+
120
+ { name: 'lorien.local',
121
+ type: 'A',
122
+ class: 1,
123
+ ttl: 120,
124
+ data: '127.0.0.1' },
125
+
126
+ { name: 'lorien.local',
127
+ type: 'A',
128
+ class: 1,
129
+ ttl: 120,
130
+ data: '127.94.0.1' },
131
+
132
+ { name: 'lorien.local',
133
+ type: 'A',
134
+ class: 1,
135
+ ttl: 120,
136
+ data: '172.16.38.224' },
137
+
138
+ { name: 'QmbBHw1Xx9pUpAbrVZUKTPL5Rsph5Q9GQhRvcWVBPFgGtC.discovery.ipfs.io.local',
139
+ type: 'TXT',
140
+ class: 1,
141
+ ttl: 120,
142
+ data: 'QmbBHw1Xx9pUpAbrVZUKTPL5Rsph5Q9GQhRvcWVBPFgGtC' } ],
143
+
144
+ */
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,QAAQ,CAAA;AACrC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAMlD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;IAC9C,KAAK,EAAE,KAAK,CAAC,mBAAmB,CAAC;CAClC,CAAC,CAAA;AAcF,MAAM,OAAO,YAAa,SAAQ,YAAY;IAc5C,YAAa,OAA4B;QACvC,KAAK,EAAE,CAAA;QAEP,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;SAC5C;QAED,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAA;QAC5C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,YAAY,CAAA;QACpD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAA;QAC9C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEtD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC;gBAChC,UAAU,EAAE,IAAI,CAAC,cAAc;gBAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,iBAAiB;gBACtC,aAAa,EAAE,OAAO,CAAC,mBAAmB;aAC3C,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;SACtC;IACH,CAAC;IAED,SAAS;QACP,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;YACrB,OAAM;SACP;QAED,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;QAE9C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE/E,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE;YACxB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;SAC3B;IACH,CAAC;IAED,YAAY,CAAE,KAA+B;QAC3C,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;YACrB,OAAM;SACP;QAED,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IACrG,CAAC;IAED,eAAe,CAAE,KAAkC;QACjD,IAAI;YACF,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;YAExE,IAAI,SAAS,IAAI,IAAI,EAAE;gBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;aAC7B;SACF;QAAC,OAAO,GAAG,EAAE;YACZ,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAA;SAC3C;IACH,CAAC;IAED,OAAO,CAAE,QAAkB;QACzB,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;YACrB,OAAM;SACP;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;QAC1D,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAElD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;YAC/B,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;SAC3B;QAED,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YACpB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC5B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;oBACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;iBAC3B;qBAAM;oBACL,OAAO,EAAE,CAAA;iBACV;YACH,CAAC,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;IACvB,CAAC;;AA1HM,gBAAG,GAAG,MAAM,CAAA;AA6HrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCE"}
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ import { Multiaddr } from '@multiformats/multiaddr';
3
+ import { PeerId } from '@libp2p/peer-id';
4
+ import type { PeerData } from '@libp2p/interfaces/peer-data';
5
+ import type { MulticastDNS, ResponsePacket, QueryPacket } from 'multicast-dns';
6
+ export declare function queryLAN(mdns: MulticastDNS, serviceTag: string, interval: number): NodeJS.Timer;
7
+ export declare function gotResponse(rsp: ResponsePacket, localPeerId: PeerId, serviceTag: string): PeerData | undefined;
8
+ export declare function gotQuery(qry: QueryPacket, mdns: MulticastDNS, peerId: PeerId, multiaddrs: Multiaddr[], serviceTag: string, broadcast: boolean): void;
9
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAmB,MAAM,yBAAyB,CAAA;AAEpE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAO9E,wBAAgB,QAAQ,CAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAcjF;AAUD,wBAAgB,WAAW,CAAE,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA2D/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,QAmE9I"}
@@ -0,0 +1,141 @@
1
+ import os from 'os';
2
+ import debug from 'debug';
3
+ import { Multiaddr } from '@multiformats/multiaddr';
4
+ import { base58btc } from 'multiformats/bases/base58';
5
+ import { PeerId } from '@libp2p/peer-id';
6
+ const log = Object.assign(debug('libp2p:mdns'), {
7
+ error: debug('libp2p:mdns:error')
8
+ });
9
+ export function queryLAN(mdns, serviceTag, interval) {
10
+ const query = () => {
11
+ log('query', serviceTag);
12
+ mdns.query({
13
+ questions: [{
14
+ name: serviceTag,
15
+ type: 'PTR'
16
+ }]
17
+ });
18
+ };
19
+ // Immediately start a query, then do it every interval.
20
+ query();
21
+ return setInterval(query, interval);
22
+ }
23
+ export function gotResponse(rsp, localPeerId, serviceTag) {
24
+ if (rsp.answers == null) {
25
+ return;
26
+ }
27
+ const answers = {
28
+ a: [],
29
+ aaaa: []
30
+ };
31
+ rsp.answers.forEach((answer) => {
32
+ switch (answer.type) {
33
+ case 'PTR':
34
+ answers.ptr = answer;
35
+ break;
36
+ case 'SRV':
37
+ answers.srv = answer;
38
+ break;
39
+ case 'TXT':
40
+ answers.txt = answer;
41
+ break;
42
+ case 'A':
43
+ answers.a.push(answer);
44
+ break;
45
+ case 'AAAA':
46
+ answers.aaaa.push(answer);
47
+ break;
48
+ default: break;
49
+ }
50
+ });
51
+ if (answers.ptr == null ||
52
+ answers.ptr.name !== serviceTag ||
53
+ answers.txt == null ||
54
+ answers.srv == null) {
55
+ return;
56
+ }
57
+ const b58Id = answers.txt.data[0].toString();
58
+ const port = answers.srv.data.port;
59
+ const multiaddrs = [];
60
+ answers.a.forEach((a) => {
61
+ const ma = new Multiaddr(`/ip4/${a.data}/tcp/${port}`);
62
+ if (!multiaddrs.some((m) => m.equals(ma))) {
63
+ multiaddrs.push(ma);
64
+ }
65
+ });
66
+ answers.aaaa.forEach((a) => {
67
+ const ma = new Multiaddr(`/ip6/${a.data}/tcp/${port}`);
68
+ if (!multiaddrs.some((m) => m.equals(ma))) {
69
+ multiaddrs.push(ma);
70
+ }
71
+ });
72
+ if (localPeerId.toString(base58btc) === b58Id) {
73
+ return; // replied to myself, ignore
74
+ }
75
+ log('peer found -', b58Id);
76
+ return {
77
+ id: PeerId.fromString(b58Id),
78
+ multiaddrs,
79
+ protocols: []
80
+ };
81
+ }
82
+ export function gotQuery(qry, mdns, peerId, multiaddrs, serviceTag, broadcast) {
83
+ if (!broadcast) {
84
+ return;
85
+ }
86
+ const addresses = multiaddrs.reduce((acc, addr) => {
87
+ if (addr.isThinWaistAddress()) {
88
+ acc.push(addr.toOptions());
89
+ }
90
+ return acc;
91
+ }, []);
92
+ // Only announce TCP for now
93
+ if (addresses.length === 0) {
94
+ return;
95
+ }
96
+ if (qry.questions[0] != null && qry.questions[0].name === serviceTag) {
97
+ const answers = [];
98
+ answers.push({
99
+ name: serviceTag,
100
+ type: 'PTR',
101
+ class: 'IN',
102
+ ttl: 120,
103
+ data: peerId.toString(base58btc) + '.' + serviceTag
104
+ });
105
+ // Only announce TCP multiaddrs for now
106
+ const port = addresses[0].port;
107
+ answers.push({
108
+ name: peerId.toString(base58btc) + '.' + serviceTag,
109
+ type: 'SRV',
110
+ class: 'IN',
111
+ ttl: 120,
112
+ data: {
113
+ priority: 10,
114
+ weight: 1,
115
+ port: port,
116
+ target: os.hostname()
117
+ }
118
+ });
119
+ answers.push({
120
+ name: peerId.toString(base58btc) + '.' + serviceTag,
121
+ type: 'TXT',
122
+ class: 'IN',
123
+ ttl: 120,
124
+ data: peerId.toString(base58btc)
125
+ });
126
+ addresses.forEach((addr) => {
127
+ if ([4, 6].includes(addr.family)) {
128
+ answers.push({
129
+ name: os.hostname(),
130
+ type: addr.family === 4 ? 'A' : 'AAAA',
131
+ class: 'IN',
132
+ ttl: 120,
133
+ data: addr.host
134
+ });
135
+ }
136
+ });
137
+ log('responding to query');
138
+ mdns.respond(answers);
139
+ }
140
+ }
141
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/query.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,149 @@
1
+ {
2
+ "name": "@libp2p/mdns",
3
+ "version": "0.18.0",
4
+ "description": "Node.js libp2p mDNS discovery implementation for peer discovery",
5
+ "license": "Apache-2.0 OR MIT",
6
+ "homepage": "https://github.com/libp2p/js-libp2p-mdns#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/libp2p/js-libp2p-mdns.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/libp2p/js-libp2p-mdns/issues"
13
+ },
14
+ "keywords": [
15
+ "IPFS"
16
+ ],
17
+ "engines": {
18
+ "node": ">=16.0.0",
19
+ "npm": ">=7.0.0"
20
+ },
21
+ "type": "module",
22
+ "types": "./dist/src/index.d.ts",
23
+ "files": [
24
+ "src",
25
+ "dist/src",
26
+ "!dist/test",
27
+ "!**/*.tsbuildinfo"
28
+ ],
29
+ "exports": {
30
+ ".": {
31
+ "import": "./dist/src/index.js"
32
+ }
33
+ },
34
+ "eslintConfig": {
35
+ "extends": "ipfs",
36
+ "parserOptions": {
37
+ "sourceType": "module"
38
+ }
39
+ },
40
+ "release": {
41
+ "branches": [
42
+ "master"
43
+ ],
44
+ "plugins": [
45
+ [
46
+ "@semantic-release/commit-analyzer",
47
+ {
48
+ "preset": "conventionalcommits",
49
+ "releaseRules": [
50
+ {
51
+ "breaking": true,
52
+ "release": "major"
53
+ },
54
+ {
55
+ "revert": true,
56
+ "release": "patch"
57
+ },
58
+ {
59
+ "type": "feat",
60
+ "release": "minor"
61
+ },
62
+ {
63
+ "type": "fix",
64
+ "release": "patch"
65
+ },
66
+ {
67
+ "type": "chore",
68
+ "release": "patch"
69
+ },
70
+ {
71
+ "type": "docs",
72
+ "release": "patch"
73
+ },
74
+ {
75
+ "type": "test",
76
+ "release": "patch"
77
+ },
78
+ {
79
+ "scope": "no-release",
80
+ "release": false
81
+ }
82
+ ]
83
+ }
84
+ ],
85
+ [
86
+ "@semantic-release/release-notes-generator",
87
+ {
88
+ "preset": "conventionalcommits",
89
+ "presetConfig": {
90
+ "types": [
91
+ {
92
+ "type": "feat",
93
+ "section": "Features"
94
+ },
95
+ {
96
+ "type": "fix",
97
+ "section": "Bug Fixes"
98
+ },
99
+ {
100
+ "type": "chore",
101
+ "section": "Trivial Changes"
102
+ },
103
+ {
104
+ "type": "docs",
105
+ "section": "Trivial Changes"
106
+ },
107
+ {
108
+ "type": "test",
109
+ "section": "Tests"
110
+ }
111
+ ]
112
+ }
113
+ }
114
+ ],
115
+ "@semantic-release/changelog",
116
+ "@semantic-release/npm",
117
+ "@semantic-release/github",
118
+ "@semantic-release/git"
119
+ ]
120
+ },
121
+ "scripts": {
122
+ "lint": "aegir lint",
123
+ "dep-check": "aegir dep-check dist/src/**/*.js dist/test/**/*.js",
124
+ "build": "tsc",
125
+ "pretest": "npm run build",
126
+ "test": "aegir test -f ./dist/test",
127
+ "test:node": "npm run test -- -t node --cov",
128
+ "test:electron-main": "npm run test -- -t electron-main",
129
+ "release": "semantic-release"
130
+ },
131
+ "dependencies": {
132
+ "@libp2p/peer-id": "^1.0.4",
133
+ "@multiformats/multiaddr": "^10.0.0",
134
+ "debug": "^4.3.1",
135
+ "multicast-dns": "^7.2.0",
136
+ "multiformats": "^9.6.3"
137
+ },
138
+ "devDependencies": {
139
+ "@libp2p/interface-compliance-tests": "^1.0.8",
140
+ "@libp2p/interfaces": "^1.1.1",
141
+ "@libp2p/peer-id-factory": "^1.0.3",
142
+ "@types/debug": "^4.1.7",
143
+ "@types/multicast-dns": "^7.2.1",
144
+ "aegir": "^36.1.0",
145
+ "delay": "^5.0.0",
146
+ "p-defer": "^4.0.0",
147
+ "p-wait-for": "^4.1.0"
148
+ }
149
+ }
@@ -0,0 +1,4 @@
1
+ export const SERVICE_TAG = '_ipfs-discovery._udp'
2
+ export const SERVICE_TAG_LOCAL = `${SERVICE_TAG}.local`
3
+ export const MULTICAST_IP = '224.0.0.251'
4
+ export const MULTICAST_PORT = 5353
@@ -0,0 +1,64 @@
1
+ // Compatibility with Go libp2p MDNS
2
+ import { EventEmitter } from 'events'
3
+ import { Responder } from './responder.js'
4
+ import { Querier } from './querier.js'
5
+ import type { Multiaddr } from '@multiformats/multiaddr'
6
+ import type { PeerId } from '@libp2p/interfaces/peer-id'
7
+ import type { PeerDiscovery } from '@libp2p/interfaces/peer-discovery'
8
+
9
+ export class GoMulticastDNS extends EventEmitter implements PeerDiscovery {
10
+ private _started: boolean
11
+ private readonly _responder: Responder
12
+ private readonly _querier: Querier
13
+
14
+ constructor (options: { peerId: PeerId, multiaddrs: Multiaddr[], queryPeriod?: number, queryInterval?: number }) {
15
+ super()
16
+ const { peerId, multiaddrs, queryPeriod, queryInterval } = options
17
+
18
+ this._started = false
19
+
20
+ this._responder = new Responder({
21
+ peerId,
22
+ multiaddrs
23
+ })
24
+ this._querier = new Querier({
25
+ peerId,
26
+ queryInterval,
27
+ queryPeriod
28
+ })
29
+
30
+ this._querier.on('peer', (peerData) => {
31
+ this.emit('peer', peerData)
32
+ })
33
+ }
34
+
35
+ isStarted () {
36
+ return this._started
37
+ }
38
+
39
+ async start () {
40
+ if (this.isStarted()) {
41
+ return
42
+ }
43
+
44
+ this._started = true
45
+
46
+ await Promise.all([
47
+ this._responder.start(),
48
+ this._querier.start()
49
+ ])
50
+ }
51
+
52
+ async stop () {
53
+ if (!this.isStarted()) {
54
+ return
55
+ }
56
+
57
+ this._started = false
58
+
59
+ await Promise.all([
60
+ this._responder.stop(),
61
+ this._querier.stop()
62
+ ])
63
+ }
64
+ }