@matter/protocol 0.16.1-alpha.0-20260113-4616af40a → 0.16.2-alpha.0-20260114-d3127faee
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/cjs/common/Scanner.d.ts +2 -2
- package/dist/cjs/common/Scanner.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsClient.d.ts +2 -3
- package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsClient.js.map +1 -1
- package/dist/cjs/mdns/MdnsConsts.d.ts +0 -3
- package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsConsts.js +0 -6
- package/dist/cjs/mdns/MdnsConsts.js.map +1 -1
- package/dist/cjs/mdns/MdnsServer.d.ts +1 -2
- package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsServer.js.map +1 -1
- package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsService.js +1 -2
- package/dist/cjs/mdns/MdnsService.js.map +1 -1
- package/dist/cjs/mdns/index.d.ts +0 -1
- package/dist/cjs/mdns/index.d.ts.map +1 -1
- package/dist/cjs/mdns/index.js +0 -1
- package/dist/cjs/mdns/index.js.map +1 -1
- package/dist/cjs/peer/Peer.d.ts +1 -1
- package/dist/cjs/peer/Peer.d.ts.map +1 -1
- package/dist/cjs/peer/Peer.js +8 -3
- package/dist/cjs/peer/Peer.js.map +1 -1
- package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
- package/dist/cjs/peer/PeerSet.js +8 -4
- package/dist/cjs/peer/PeerSet.js.map +1 -1
- package/dist/esm/common/Scanner.d.ts +2 -2
- package/dist/esm/common/Scanner.d.ts.map +1 -1
- package/dist/esm/common/Scanner.js.map +1 -1
- package/dist/esm/mdns/MdnsClient.d.ts +2 -3
- package/dist/esm/mdns/MdnsClient.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsClient.js.map +1 -1
- package/dist/esm/mdns/MdnsConsts.d.ts +0 -3
- package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsConsts.js +0 -6
- package/dist/esm/mdns/MdnsConsts.js.map +1 -1
- package/dist/esm/mdns/MdnsServer.d.ts +1 -2
- package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsServer.js.map +1 -1
- package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsService.js +1 -1
- package/dist/esm/mdns/MdnsService.js.map +1 -1
- package/dist/esm/mdns/index.d.ts +0 -1
- package/dist/esm/mdns/index.d.ts.map +1 -1
- package/dist/esm/mdns/index.js +0 -1
- package/dist/esm/mdns/index.js.map +1 -1
- package/dist/esm/peer/Peer.d.ts +1 -1
- package/dist/esm/peer/Peer.d.ts.map +1 -1
- package/dist/esm/peer/Peer.js +16 -4
- package/dist/esm/peer/Peer.js.map +1 -1
- package/dist/esm/peer/PeerSet.d.ts.map +1 -1
- package/dist/esm/peer/PeerSet.js +8 -4
- package/dist/esm/peer/PeerSet.js.map +1 -1
- package/package.json +6 -6
- package/src/common/Scanner.ts +2 -2
- package/src/mdns/MdnsClient.ts +6 -6
- package/src/mdns/MdnsConsts.ts +0 -4
- package/src/mdns/MdnsServer.ts +1 -1
- package/src/mdns/MdnsService.ts +1 -1
- package/src/mdns/index.ts +0 -1
- package/src/peer/Peer.ts +19 -4
- package/src/peer/PeerSet.ts +8 -4
- package/dist/cjs/mdns/MdnsSocket.d.ts +0 -33
- package/dist/cjs/mdns/MdnsSocket.d.ts.map +0 -1
- package/dist/cjs/mdns/MdnsSocket.js +0 -154
- package/dist/cjs/mdns/MdnsSocket.js.map +0 -6
- package/dist/esm/mdns/MdnsSocket.d.ts +0 -33
- package/dist/esm/mdns/MdnsSocket.d.ts.map +0 -1
- package/dist/esm/mdns/MdnsSocket.js +0 -145
- package/dist/esm/mdns/MdnsSocket.js.map +0 -6
- package/src/mdns/MdnsSocket.ts +0 -201
package/src/common/Scanner.ts
CHANGED
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
+
AddressLifespan,
|
|
8
9
|
BasicSet,
|
|
9
10
|
ChannelType,
|
|
10
11
|
Duration,
|
|
11
12
|
Environment,
|
|
12
13
|
Environmental,
|
|
13
|
-
Lifespan,
|
|
14
14
|
ServerAddress,
|
|
15
15
|
ServerAddressUdp,
|
|
16
16
|
} from "#general";
|
|
@@ -57,7 +57,7 @@ export type DiscoveryData = {
|
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
export type DiscoverableDevice<SA extends ServerAddress> = DiscoveryData &
|
|
60
|
-
Partial<
|
|
60
|
+
Partial<AddressLifespan> & {
|
|
61
61
|
/** The device's addresses IP/port pairs */
|
|
62
62
|
addresses: SA[];
|
|
63
63
|
};
|
package/src/mdns/MdnsClient.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import {
|
|
8
|
+
AddressLifespan,
|
|
8
9
|
BasicSet,
|
|
9
10
|
ChannelType,
|
|
10
11
|
Diagnostic,
|
|
@@ -18,9 +19,9 @@ import {
|
|
|
18
19
|
ImplementationError,
|
|
19
20
|
Instant,
|
|
20
21
|
InternalError,
|
|
21
|
-
Lifespan,
|
|
22
22
|
Lifetime,
|
|
23
23
|
Logger,
|
|
24
|
+
MdnsSocket,
|
|
24
25
|
Millis,
|
|
25
26
|
Minutes,
|
|
26
27
|
ObserverGroup,
|
|
@@ -55,17 +56,16 @@ import {
|
|
|
55
56
|
getShortDiscriminatorQname,
|
|
56
57
|
getVendorQname,
|
|
57
58
|
} from "./MdnsConsts.js";
|
|
58
|
-
import { MdnsSocket } from "./MdnsSocket.js";
|
|
59
59
|
|
|
60
60
|
const logger = Logger.get("MdnsClient");
|
|
61
61
|
|
|
62
62
|
const MDNS_EXPIRY_GRACE_PERIOD_FACTOR = 1.05;
|
|
63
63
|
|
|
64
|
-
type MatterServerRecordWithExpire = ServerAddressUdp &
|
|
64
|
+
type MatterServerRecordWithExpire = ServerAddressUdp & AddressLifespan;
|
|
65
65
|
|
|
66
66
|
/** Type for commissionable Device records including Lifespan details. */
|
|
67
67
|
type CommissionableDeviceRecordWithExpire = Omit<CommissionableDevice, "addresses"> &
|
|
68
|
-
|
|
68
|
+
AddressLifespan & {
|
|
69
69
|
addresses: Map<string, MatterServerRecordWithExpire>; // Override addresses type to include expiration
|
|
70
70
|
instanceId: string; // instance ID
|
|
71
71
|
SD: number; // Additional Field for Short discriminator
|
|
@@ -75,12 +75,12 @@ type CommissionableDeviceRecordWithExpire = Omit<CommissionableDevice, "addresse
|
|
|
75
75
|
|
|
76
76
|
/** Type for operational Device records including Lifespan details. */
|
|
77
77
|
type OperationalDeviceRecordWithExpire = Omit<OperationalDevice, "addresses"> &
|
|
78
|
-
|
|
78
|
+
AddressLifespan & {
|
|
79
79
|
addresses: Map<string, MatterServerRecordWithExpire>; // Override addresses type to include expiration
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
/** Type for any DNS record with Lifespan (discoveredAt and ttl) details. */
|
|
83
|
-
type AnyDnsRecordWithExpiry = DnsRecord<any> &
|
|
83
|
+
type AnyDnsRecordWithExpiry = DnsRecord<any> & AddressLifespan;
|
|
84
84
|
|
|
85
85
|
/** Type for DNS answers with Address details structured for better direct access performance. */
|
|
86
86
|
type StructuredDnsAddressAnswers = {
|
package/src/mdns/MdnsConsts.ts
CHANGED
|
@@ -7,10 +7,6 @@
|
|
|
7
7
|
import { PairingHintBitmap } from "#advertisement/PairingHintBitmap.js";
|
|
8
8
|
import { GlobalFabricId, NodeId, VendorId } from "#types";
|
|
9
9
|
|
|
10
|
-
export const MDNS_BROADCAST_IPV4 = "224.0.0.251";
|
|
11
|
-
export const MDNS_BROADCAST_IPV6 = "ff02::fb";
|
|
12
|
-
export const MDNS_BROADCAST_PORT = 5353;
|
|
13
|
-
|
|
14
10
|
export const SERVICE_DISCOVERY_QNAME = "_services._dns-sd._udp.local";
|
|
15
11
|
export const MATTER_COMMISSION_SERVICE_QNAME = "_matterc._udp.local";
|
|
16
12
|
export const MATTER_COMMISSIONER_SERVICE_QNAME = "_matterd._udp.local";
|
package/src/mdns/MdnsServer.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
Lifetime,
|
|
18
18
|
Logger,
|
|
19
19
|
MatterAggregateError,
|
|
20
|
+
MdnsSocket,
|
|
20
21
|
Millis,
|
|
21
22
|
Minutes,
|
|
22
23
|
NetworkInterfaceDetails,
|
|
@@ -24,7 +25,6 @@ import {
|
|
|
24
25
|
Time,
|
|
25
26
|
Timer,
|
|
26
27
|
} from "#general";
|
|
27
|
-
import { MdnsSocket } from "./MdnsSocket.js";
|
|
28
28
|
|
|
29
29
|
const logger = Logger.get("MdnsServer");
|
|
30
30
|
|
package/src/mdns/MdnsService.ts
CHANGED
|
@@ -12,12 +12,12 @@ import {
|
|
|
12
12
|
Logger,
|
|
13
13
|
MatterAggregateError,
|
|
14
14
|
MaybePromise,
|
|
15
|
+
MdnsSocket,
|
|
15
16
|
Network,
|
|
16
17
|
VariableService,
|
|
17
18
|
} from "#general";
|
|
18
19
|
import { MdnsServer } from "../mdns/MdnsServer.js";
|
|
19
20
|
import { MdnsClient } from "./MdnsClient.js";
|
|
20
|
-
import { MdnsSocket } from "./MdnsSocket.js";
|
|
21
21
|
|
|
22
22
|
const logger = Logger.get("MDNS");
|
|
23
23
|
|
package/src/mdns/index.ts
CHANGED
package/src/peer/Peer.ts
CHANGED
|
@@ -5,7 +5,16 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { BasicInformation } from "#clusters/basic-information";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
AbortedError,
|
|
10
|
+
BasicMultiplex,
|
|
11
|
+
BasicSet,
|
|
12
|
+
Diagnostic,
|
|
13
|
+
isIpNetworkChannel,
|
|
14
|
+
Lifetime,
|
|
15
|
+
Logger,
|
|
16
|
+
MaybePromise,
|
|
17
|
+
} from "#general";
|
|
9
18
|
import type { MdnsClient } from "#mdns/MdnsClient.js";
|
|
10
19
|
import type { NodeSession } from "#session/NodeSession.js";
|
|
11
20
|
import type { SecureSession } from "#session/SecureSession.js";
|
|
@@ -91,13 +100,18 @@ export class Peer {
|
|
|
91
100
|
*/
|
|
92
101
|
async delete() {
|
|
93
102
|
logger.info("Removing", Diagnostic.strong(this.toString()));
|
|
94
|
-
|
|
103
|
+
try {
|
|
104
|
+
await this.close();
|
|
105
|
+
} catch (error) {
|
|
106
|
+
// When there are open reconnections, we could expect a peer closed abort error here, so ignore this error case
|
|
107
|
+
AbortedError.accept(error);
|
|
108
|
+
}
|
|
95
109
|
await this.#context.deletePeer(this);
|
|
96
110
|
await this.#context.sessions.deleteResumptionRecord(this.address);
|
|
97
111
|
}
|
|
98
112
|
|
|
99
113
|
/**
|
|
100
|
-
* Close the peer without removing persistent state.
|
|
114
|
+
* Close the peer without removing the persistent state.
|
|
101
115
|
*/
|
|
102
116
|
async close() {
|
|
103
117
|
using _lifetime = this.#lifetime.closing();
|
|
@@ -112,8 +126,9 @@ export class Peer {
|
|
|
112
126
|
}
|
|
113
127
|
|
|
114
128
|
if (this.activeReconnection) {
|
|
115
|
-
this.activeReconnection.rejecter
|
|
129
|
+
const rejecter = this.activeReconnection.rejecter;
|
|
116
130
|
this.activeReconnection = undefined;
|
|
131
|
+
rejecter(new AbortedError("Peer closed"));
|
|
117
132
|
}
|
|
118
133
|
|
|
119
134
|
for (const session of this.#context.sessions.sessionsFor(this.address)) {
|
package/src/peer/PeerSet.ts
CHANGED
|
@@ -296,12 +296,16 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
|
|
|
296
296
|
|
|
297
297
|
this.#resume(address, options, operationalAddress)
|
|
298
298
|
.then(channel => {
|
|
299
|
-
peer.activeReconnection
|
|
300
|
-
|
|
299
|
+
if (peer.activeReconnection !== undefined) {
|
|
300
|
+
peer.activeReconnection = undefined;
|
|
301
|
+
resolver(channel);
|
|
302
|
+
}
|
|
301
303
|
})
|
|
302
304
|
.catch(error => {
|
|
303
|
-
peer.activeReconnection
|
|
304
|
-
|
|
305
|
+
if (peer.activeReconnection !== undefined) {
|
|
306
|
+
peer.activeReconnection = undefined;
|
|
307
|
+
rejecter(error);
|
|
308
|
+
}
|
|
305
309
|
});
|
|
306
310
|
|
|
307
311
|
return promise;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { AsyncObservable, DnsMessage, DnsMessageType, Lifetime, Network, UdpMulticastServer } from "#general";
|
|
7
|
-
/**
|
|
8
|
-
* Manages the UDP socket for {@link MdnsServer} and {@link MdnsClient}.
|
|
9
|
-
*/
|
|
10
|
-
export declare class MdnsSocket {
|
|
11
|
-
#private;
|
|
12
|
-
static create(network: Network, options?: {
|
|
13
|
-
enableIpv4?: boolean;
|
|
14
|
-
netInterface?: string;
|
|
15
|
-
lifetime?: Lifetime.Owner;
|
|
16
|
-
}): Promise<MdnsSocket>;
|
|
17
|
-
constructor(socket: UdpMulticastServer);
|
|
18
|
-
get network(): Network;
|
|
19
|
-
get supportsIpv4(): boolean;
|
|
20
|
-
get netInterface(): string | undefined;
|
|
21
|
-
get receipt(): AsyncObservable<[message: MdnsSocket.Message], void>;
|
|
22
|
-
send(message: Partial<DnsMessage> & {
|
|
23
|
-
messageType: DnsMessageType;
|
|
24
|
-
}, intf?: string, unicastDest?: string): Promise<void>;
|
|
25
|
-
close(): Promise<void>;
|
|
26
|
-
}
|
|
27
|
-
export declare namespace MdnsSocket {
|
|
28
|
-
interface Message extends DnsMessage {
|
|
29
|
-
sourceIp: string;
|
|
30
|
-
sourceIntf: string;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=MdnsSocket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MdnsSocket.d.ts","sourceRoot":"","sources":["../../../src/mdns/MdnsSocket.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,eAAe,EAKf,UAAU,EAEV,cAAc,EAEd,QAAQ,EAKR,OAAO,EACP,kBAAkB,EACrB,MAAM,UAAU,CAAC;AAKlB;;GAEG;AACH,qBAAa,UAAU;;WASN,MAAM,CACf,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;KAAE;gBAgB5E,MAAM,EAAE,kBAAkB;IAKtC,IAAI,OAAO,YAEV;IAED,IAAI,YAAY,YAEf;IAED,IAAI,YAAY,uBAEf;IAED,IAAI,OAAO,yDAEV;IAEK,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG;QAAE,WAAW,EAAE,cAAc,CAAA;KAAE,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IA+ExG,KAAK;CAmCd;AAED,yBAAiB,UAAU,CAAC;IACxB,UAAiB,OAAQ,SAAQ,UAAU;QACvC,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACtB;CACJ"}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var MdnsSocket_exports = {};
|
|
20
|
-
__export(MdnsSocket_exports, {
|
|
21
|
-
MdnsSocket: () => MdnsSocket
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(MdnsSocket_exports);
|
|
24
|
-
var import_general = require("#general");
|
|
25
|
-
var import_MdnsConsts = require("./MdnsConsts.js");
|
|
26
|
-
/**
|
|
27
|
-
* @license
|
|
28
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
29
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
30
|
-
*/
|
|
31
|
-
const logger = import_general.Logger.get("MdnsListener");
|
|
32
|
-
class MdnsSocket {
|
|
33
|
-
#socket;
|
|
34
|
-
#handlers;
|
|
35
|
-
#isClosed = false;
|
|
36
|
-
#receipt = new import_general.BasicObservable(
|
|
37
|
-
(error) => logger.error("Unhandled error in MDNS listener", error),
|
|
38
|
-
true
|
|
39
|
-
);
|
|
40
|
-
static async create(network, options) {
|
|
41
|
-
const { enableIpv4 = true, netInterface, lifetime } = options ?? {};
|
|
42
|
-
const socket = new MdnsSocket(
|
|
43
|
-
await import_general.UdpMulticastServer.create({
|
|
44
|
-
lifetime,
|
|
45
|
-
network,
|
|
46
|
-
netInterface,
|
|
47
|
-
broadcastAddressIpv4: enableIpv4 ? import_MdnsConsts.MDNS_BROADCAST_IPV4 : void 0,
|
|
48
|
-
broadcastAddressIpv6: import_MdnsConsts.MDNS_BROADCAST_IPV6,
|
|
49
|
-
listeningPort: import_MdnsConsts.MDNS_BROADCAST_PORT
|
|
50
|
-
})
|
|
51
|
-
);
|
|
52
|
-
return socket;
|
|
53
|
-
}
|
|
54
|
-
constructor(socket) {
|
|
55
|
-
this.#socket = socket;
|
|
56
|
-
socket.onMessage(this.#handleMessage.bind(this));
|
|
57
|
-
}
|
|
58
|
-
get network() {
|
|
59
|
-
return this.#socket.network;
|
|
60
|
-
}
|
|
61
|
-
get supportsIpv4() {
|
|
62
|
-
return this.#socket.supportsIpv4;
|
|
63
|
-
}
|
|
64
|
-
get netInterface() {
|
|
65
|
-
return this.#socket.netInterface;
|
|
66
|
-
}
|
|
67
|
-
get receipt() {
|
|
68
|
-
return this.#receipt;
|
|
69
|
-
}
|
|
70
|
-
async send(message, intf, unicastDest) {
|
|
71
|
-
const { messageType } = message;
|
|
72
|
-
const truncatedMessageType = import_general.DnsMessageType.isQuery(messageType) ? messageType | import_general.DnsMessageTypeFlag.TC : messageType;
|
|
73
|
-
const chunk = {
|
|
74
|
-
transactionId: 0,
|
|
75
|
-
queries: [],
|
|
76
|
-
authorities: [],
|
|
77
|
-
...message,
|
|
78
|
-
answers: [],
|
|
79
|
-
additionalRecords: []
|
|
80
|
-
};
|
|
81
|
-
let encodedChunkWithoutAnswers = import_general.DnsCodec.encode(chunk);
|
|
82
|
-
let chunkSize = encodedChunkWithoutAnswers.byteLength;
|
|
83
|
-
for (const answer of message.answers ?? []) {
|
|
84
|
-
const answerEncoded = import_general.DnsCodec.encodeRecord(answer);
|
|
85
|
-
if (chunkSize + answerEncoded.byteLength > import_general.MAX_MDNS_MESSAGE_SIZE) {
|
|
86
|
-
if (chunk.answers.length === 0) {
|
|
87
|
-
logger.warn(
|
|
88
|
-
`MDNS message with ${import_general.Diagnostic.json(
|
|
89
|
-
chunk.queries
|
|
90
|
-
)} is too big to fit into a single MDNS message. Send anyway, but please report!`
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
await this.#send(
|
|
94
|
-
{
|
|
95
|
-
...chunk,
|
|
96
|
-
messageType: truncatedMessageType
|
|
97
|
-
},
|
|
98
|
-
intf,
|
|
99
|
-
unicastDest
|
|
100
|
-
);
|
|
101
|
-
if (chunk.queries.length) {
|
|
102
|
-
chunk.queries.length = 0;
|
|
103
|
-
encodedChunkWithoutAnswers = import_general.DnsCodec.encode(chunk);
|
|
104
|
-
}
|
|
105
|
-
chunk.answers.length = 0;
|
|
106
|
-
chunkSize = encodedChunkWithoutAnswers.byteLength + answerEncoded.byteLength;
|
|
107
|
-
} else {
|
|
108
|
-
chunkSize += answerEncoded.byteLength;
|
|
109
|
-
}
|
|
110
|
-
chunk.answers.push(answerEncoded);
|
|
111
|
-
}
|
|
112
|
-
const additionalRecords = message.additionalRecords ?? [];
|
|
113
|
-
for (const additionalRecord of additionalRecords) {
|
|
114
|
-
const additionalRecordEncoded = import_general.DnsCodec.encodeRecord(additionalRecord);
|
|
115
|
-
chunkSize += additionalRecordEncoded.byteLength;
|
|
116
|
-
if (chunkSize > import_general.MAX_MDNS_MESSAGE_SIZE) {
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
chunk.additionalRecords.push(additionalRecordEncoded);
|
|
120
|
-
}
|
|
121
|
-
await this.#send(chunk, intf, unicastDest);
|
|
122
|
-
}
|
|
123
|
-
async #send(message, intf, unicastDest) {
|
|
124
|
-
await this.#socket.send(import_general.DnsCodec.encode(message), intf, unicastDest);
|
|
125
|
-
}
|
|
126
|
-
async close() {
|
|
127
|
-
this.#isClosed = true;
|
|
128
|
-
await this.#socket.close();
|
|
129
|
-
if (this.#handlers) {
|
|
130
|
-
await import_general.MatterAggregateError.allSettled(this.#handlers);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
#handleMessage(bytes, sourceIp, sourceIntf) {
|
|
134
|
-
if (this.#isClosed) {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const parsed = import_general.DnsCodec.decode(bytes);
|
|
138
|
-
if (parsed === void 0) {
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
let promise = this.#receipt.emit({
|
|
142
|
-
...parsed,
|
|
143
|
-
sourceIp,
|
|
144
|
-
sourceIntf
|
|
145
|
-
});
|
|
146
|
-
if (import_general.MaybePromise.is(promise)) {
|
|
147
|
-
if (this.#handlers === void 0) {
|
|
148
|
-
this.#handlers = /* @__PURE__ */ new Set();
|
|
149
|
-
}
|
|
150
|
-
promise = Promise.resolve(promise).finally(() => this.#handlers?.delete(promise));
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=MdnsSocket.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/mdns/MdnsSocket.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAiBO;AACP,wBAA8E;AAxB9E;AAAA;AAAA;AAAA;AAAA;AA0BA,MAAM,SAAS,sBAAO,IAAI,cAAc;AAKjC,MAAM,WAAW;AAAA,EACpB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAA2D,IAAI;AAAA,IAC3D,WAAS,OAAO,MAAM,oCAAoC,KAAK;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEA,aAAa,OACT,SACA,SACF;AACE,UAAM,EAAE,aAAa,MAAM,cAAc,SAAS,IAAI,WAAW,CAAC;AAClE,UAAM,SAAS,IAAI;AAAA,MACf,MAAM,kCAAmB,OAAO;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBAAsB,aAAa,wCAAsB;AAAA,QACzD,sBAAsB;AAAA,QACtB,eAAe;AAAA,MACnB,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,QAA4B;AACpC,SAAK,UAAU;AACf,WAAO,UAAU,KAAK,eAAe,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,SAAgE,MAAe,aAAsB;AAC5G,UAAM,EAAE,YAAY,IAAI;AAExB,UAAM,uBAAuB,8BAAe,QAAQ,WAAW,IACzD,cAAc,kCAAmB,KACjC;AAEN,UAAM,QAAuC;AAAA,MACzC,eAAe;AAAA,MACf,SAAS,CAAC;AAAA,MACV,aAAa,CAAC;AAAA,MAEd,GAAG;AAAA,MAEH,SAAS,CAAC;AAAA,MACV,mBAAmB,CAAC;AAAA,IACxB;AAGA,QAAI,6BAA6B,wBAAS,OAAO,KAAK;AACtD,QAAI,YAAY,2BAA2B;AAG3C,eAAW,UAAU,QAAQ,WAAW,CAAC,GAAG;AACxC,YAAM,gBAAgB,wBAAS,aAAa,MAAM;AAElD,UAAI,YAAY,cAAc,aAAa,sCAAuB;AAC9D,YAAI,MAAM,QAAQ,WAAW,GAAG;AAE5B,iBAAO;AAAA,YACH,qBAAqB,0BAAW;AAAA,cAC5B,MAAM;AAAA,YACV,CAAC;AAAA,UACL;AAAA,QACJ;AAIA,cAAM,KAAK;AAAA,UACP;AAAA,YACI,GAAG;AAAA,YACH,aAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAGA,YAAI,MAAM,QAAQ,QAAQ;AACtB,gBAAM,QAAQ,SAAS;AACvB,uCAA6B,wBAAS,OAAO,KAAK;AAAA,QACtD;AACA,cAAM,QAAQ,SAAS;AACvB,oBAAY,2BAA2B,aAAa,cAAc;AAAA,MACtE,OAAO;AACH,qBAAa,cAAc;AAAA,MAC/B;AAEA,YAAM,QAAQ,KAAK,aAAa;AAAA,IACpC;AAGA,UAAM,oBAAoB,QAAQ,qBAAqB,CAAC;AACxD,eAAW,oBAAoB,mBAAmB;AAC9C,YAAM,0BAA0B,wBAAS,aAAa,gBAAgB;AACtE,mBAAa,wBAAwB;AACrC,UAAI,YAAY,sCAAuB;AACnC;AAAA,MACJ;AACA,YAAM,kBAAkB,KAAK,uBAAuB;AAAA,IACxD;AAEA,UAAM,KAAK,MAAM,OAAO,MAAM,WAAW;AAAA,EAC7C;AAAA,EAEA,MAAM,MAAM,SAAwC,MAAe,aAAsB;AACrF,UAAM,KAAK,QAAQ,KAAK,wBAAS,OAAO,OAAO,GAAG,MAAM,WAAW;AAAA,EACvE;AAAA,EAEA,MAAM,QAAQ;AACV,SAAK,YAAY;AACjB,UAAM,KAAK,QAAQ,MAAM;AACzB,QAAI,KAAK,WAAW;AAChB,YAAM,oCAAqB,WAAW,KAAK,SAAS;AAAA,IACxD;AAAA,EACJ;AAAA,EAEA,eAAe,OAAc,UAAkB,YAAoB;AAE/D,QAAI,KAAK,WAAW;AAChB;AAAA,IACJ;AAGA,UAAM,SAAS,wBAAS,OAAO,KAAK;AAGpC,QAAI,WAAW,QAAW;AACtB;AAAA,IACJ;AAEA,QAAI,UAAU,KAAK,SAAS,KAAK;AAAA,MAC7B,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACJ,CAAC;AAED,QAAI,4BAAa,GAAG,OAAO,GAAG;AAC1B,UAAI,KAAK,cAAc,QAAW;AAC9B,aAAK,YAAY,oBAAI,IAAI;AAAA,MAC7B;AACA,gBAAU,QAAQ,QAAQ,OAAO,EAAE,QAAQ,MAAM,KAAK,WAAW,OAAO,OAA4B,CAAC;AAAA,IACzG;AAAA,EACJ;AACJ;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { AsyncObservable, DnsMessage, DnsMessageType, Lifetime, Network, UdpMulticastServer } from "#general";
|
|
7
|
-
/**
|
|
8
|
-
* Manages the UDP socket for {@link MdnsServer} and {@link MdnsClient}.
|
|
9
|
-
*/
|
|
10
|
-
export declare class MdnsSocket {
|
|
11
|
-
#private;
|
|
12
|
-
static create(network: Network, options?: {
|
|
13
|
-
enableIpv4?: boolean;
|
|
14
|
-
netInterface?: string;
|
|
15
|
-
lifetime?: Lifetime.Owner;
|
|
16
|
-
}): Promise<MdnsSocket>;
|
|
17
|
-
constructor(socket: UdpMulticastServer);
|
|
18
|
-
get network(): Network;
|
|
19
|
-
get supportsIpv4(): boolean;
|
|
20
|
-
get netInterface(): string | undefined;
|
|
21
|
-
get receipt(): AsyncObservable<[message: MdnsSocket.Message], void>;
|
|
22
|
-
send(message: Partial<DnsMessage> & {
|
|
23
|
-
messageType: DnsMessageType;
|
|
24
|
-
}, intf?: string, unicastDest?: string): Promise<void>;
|
|
25
|
-
close(): Promise<void>;
|
|
26
|
-
}
|
|
27
|
-
export declare namespace MdnsSocket {
|
|
28
|
-
interface Message extends DnsMessage {
|
|
29
|
-
sourceIp: string;
|
|
30
|
-
sourceIntf: string;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=MdnsSocket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MdnsSocket.d.ts","sourceRoot":"","sources":["../../../src/mdns/MdnsSocket.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,eAAe,EAKf,UAAU,EAEV,cAAc,EAEd,QAAQ,EAKR,OAAO,EACP,kBAAkB,EACrB,MAAM,UAAU,CAAC;AAKlB;;GAEG;AACH,qBAAa,UAAU;;WASN,MAAM,CACf,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAA;KAAE;gBAgB5E,MAAM,EAAE,kBAAkB;IAKtC,IAAI,OAAO,YAEV;IAED,IAAI,YAAY,YAEf;IAED,IAAI,YAAY,uBAEf;IAED,IAAI,OAAO,yDAEV;IAEK,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG;QAAE,WAAW,EAAE,cAAc,CAAA;KAAE,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IA+ExG,KAAK;CAmCd;AAED,yBAAiB,UAAU,CAAC;IACxB,UAAiB,OAAQ,SAAQ,UAAU;QACvC,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACtB;CACJ"}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import {
|
|
7
|
-
BasicObservable,
|
|
8
|
-
Diagnostic,
|
|
9
|
-
DnsCodec,
|
|
10
|
-
DnsMessageType,
|
|
11
|
-
DnsMessageTypeFlag,
|
|
12
|
-
Logger,
|
|
13
|
-
MatterAggregateError,
|
|
14
|
-
MAX_MDNS_MESSAGE_SIZE,
|
|
15
|
-
MaybePromise,
|
|
16
|
-
UdpMulticastServer
|
|
17
|
-
} from "#general";
|
|
18
|
-
import { MDNS_BROADCAST_IPV4, MDNS_BROADCAST_IPV6, MDNS_BROADCAST_PORT } from "./MdnsConsts.js";
|
|
19
|
-
const logger = Logger.get("MdnsListener");
|
|
20
|
-
class MdnsSocket {
|
|
21
|
-
#socket;
|
|
22
|
-
#handlers;
|
|
23
|
-
#isClosed = false;
|
|
24
|
-
#receipt = new BasicObservable(
|
|
25
|
-
(error) => logger.error("Unhandled error in MDNS listener", error),
|
|
26
|
-
true
|
|
27
|
-
);
|
|
28
|
-
static async create(network, options) {
|
|
29
|
-
const { enableIpv4 = true, netInterface, lifetime } = options ?? {};
|
|
30
|
-
const socket = new MdnsSocket(
|
|
31
|
-
await UdpMulticastServer.create({
|
|
32
|
-
lifetime,
|
|
33
|
-
network,
|
|
34
|
-
netInterface,
|
|
35
|
-
broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : void 0,
|
|
36
|
-
broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
|
|
37
|
-
listeningPort: MDNS_BROADCAST_PORT
|
|
38
|
-
})
|
|
39
|
-
);
|
|
40
|
-
return socket;
|
|
41
|
-
}
|
|
42
|
-
constructor(socket) {
|
|
43
|
-
this.#socket = socket;
|
|
44
|
-
socket.onMessage(this.#handleMessage.bind(this));
|
|
45
|
-
}
|
|
46
|
-
get network() {
|
|
47
|
-
return this.#socket.network;
|
|
48
|
-
}
|
|
49
|
-
get supportsIpv4() {
|
|
50
|
-
return this.#socket.supportsIpv4;
|
|
51
|
-
}
|
|
52
|
-
get netInterface() {
|
|
53
|
-
return this.#socket.netInterface;
|
|
54
|
-
}
|
|
55
|
-
get receipt() {
|
|
56
|
-
return this.#receipt;
|
|
57
|
-
}
|
|
58
|
-
async send(message, intf, unicastDest) {
|
|
59
|
-
const { messageType } = message;
|
|
60
|
-
const truncatedMessageType = DnsMessageType.isQuery(messageType) ? messageType | DnsMessageTypeFlag.TC : messageType;
|
|
61
|
-
const chunk = {
|
|
62
|
-
transactionId: 0,
|
|
63
|
-
queries: [],
|
|
64
|
-
authorities: [],
|
|
65
|
-
...message,
|
|
66
|
-
answers: [],
|
|
67
|
-
additionalRecords: []
|
|
68
|
-
};
|
|
69
|
-
let encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
|
|
70
|
-
let chunkSize = encodedChunkWithoutAnswers.byteLength;
|
|
71
|
-
for (const answer of message.answers ?? []) {
|
|
72
|
-
const answerEncoded = DnsCodec.encodeRecord(answer);
|
|
73
|
-
if (chunkSize + answerEncoded.byteLength > MAX_MDNS_MESSAGE_SIZE) {
|
|
74
|
-
if (chunk.answers.length === 0) {
|
|
75
|
-
logger.warn(
|
|
76
|
-
`MDNS message with ${Diagnostic.json(
|
|
77
|
-
chunk.queries
|
|
78
|
-
)} is too big to fit into a single MDNS message. Send anyway, but please report!`
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
await this.#send(
|
|
82
|
-
{
|
|
83
|
-
...chunk,
|
|
84
|
-
messageType: truncatedMessageType
|
|
85
|
-
},
|
|
86
|
-
intf,
|
|
87
|
-
unicastDest
|
|
88
|
-
);
|
|
89
|
-
if (chunk.queries.length) {
|
|
90
|
-
chunk.queries.length = 0;
|
|
91
|
-
encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
|
|
92
|
-
}
|
|
93
|
-
chunk.answers.length = 0;
|
|
94
|
-
chunkSize = encodedChunkWithoutAnswers.byteLength + answerEncoded.byteLength;
|
|
95
|
-
} else {
|
|
96
|
-
chunkSize += answerEncoded.byteLength;
|
|
97
|
-
}
|
|
98
|
-
chunk.answers.push(answerEncoded);
|
|
99
|
-
}
|
|
100
|
-
const additionalRecords = message.additionalRecords ?? [];
|
|
101
|
-
for (const additionalRecord of additionalRecords) {
|
|
102
|
-
const additionalRecordEncoded = DnsCodec.encodeRecord(additionalRecord);
|
|
103
|
-
chunkSize += additionalRecordEncoded.byteLength;
|
|
104
|
-
if (chunkSize > MAX_MDNS_MESSAGE_SIZE) {
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
chunk.additionalRecords.push(additionalRecordEncoded);
|
|
108
|
-
}
|
|
109
|
-
await this.#send(chunk, intf, unicastDest);
|
|
110
|
-
}
|
|
111
|
-
async #send(message, intf, unicastDest) {
|
|
112
|
-
await this.#socket.send(DnsCodec.encode(message), intf, unicastDest);
|
|
113
|
-
}
|
|
114
|
-
async close() {
|
|
115
|
-
this.#isClosed = true;
|
|
116
|
-
await this.#socket.close();
|
|
117
|
-
if (this.#handlers) {
|
|
118
|
-
await MatterAggregateError.allSettled(this.#handlers);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
#handleMessage(bytes, sourceIp, sourceIntf) {
|
|
122
|
-
if (this.#isClosed) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
const parsed = DnsCodec.decode(bytes);
|
|
126
|
-
if (parsed === void 0) {
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
let promise = this.#receipt.emit({
|
|
130
|
-
...parsed,
|
|
131
|
-
sourceIp,
|
|
132
|
-
sourceIntf
|
|
133
|
-
});
|
|
134
|
-
if (MaybePromise.is(promise)) {
|
|
135
|
-
if (this.#handlers === void 0) {
|
|
136
|
-
this.#handlers = /* @__PURE__ */ new Set();
|
|
137
|
-
}
|
|
138
|
-
promise = Promise.resolve(promise).finally(() => this.#handlers?.delete(promise));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
export {
|
|
143
|
-
MdnsSocket
|
|
144
|
-
};
|
|
145
|
-
//# sourceMappingURL=MdnsSocket.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/mdns/MdnsSocket.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|