@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/mdns/MdnsSocket.ts
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
AsyncObservable,
|
|
9
|
-
BasicObservable,
|
|
10
|
-
Bytes,
|
|
11
|
-
Diagnostic,
|
|
12
|
-
DnsCodec,
|
|
13
|
-
DnsMessage,
|
|
14
|
-
DnsMessagePartiallyPreEncoded,
|
|
15
|
-
DnsMessageType,
|
|
16
|
-
DnsMessageTypeFlag,
|
|
17
|
-
Lifetime,
|
|
18
|
-
Logger,
|
|
19
|
-
MatterAggregateError,
|
|
20
|
-
MAX_MDNS_MESSAGE_SIZE,
|
|
21
|
-
MaybePromise,
|
|
22
|
-
Network,
|
|
23
|
-
UdpMulticastServer,
|
|
24
|
-
} from "#general";
|
|
25
|
-
import { MDNS_BROADCAST_IPV4, MDNS_BROADCAST_IPV6, MDNS_BROADCAST_PORT } from "./MdnsConsts.js";
|
|
26
|
-
|
|
27
|
-
const logger = Logger.get("MdnsListener");
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Manages the UDP socket for {@link MdnsServer} and {@link MdnsClient}.
|
|
31
|
-
*/
|
|
32
|
-
export class MdnsSocket {
|
|
33
|
-
#socket: UdpMulticastServer;
|
|
34
|
-
#handlers?: Set<PromiseLike<void>>;
|
|
35
|
-
#isClosed = false;
|
|
36
|
-
#receipt: AsyncObservable<[message: MdnsSocket.Message]> = new BasicObservable(
|
|
37
|
-
error => logger.error("Unhandled error in MDNS listener", error),
|
|
38
|
-
true,
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
static async create(
|
|
42
|
-
network: Network,
|
|
43
|
-
options?: { enableIpv4?: boolean; netInterface?: string; lifetime?: Lifetime.Owner },
|
|
44
|
-
) {
|
|
45
|
-
const { enableIpv4 = true, netInterface, lifetime } = options ?? {};
|
|
46
|
-
const socket = new MdnsSocket(
|
|
47
|
-
await UdpMulticastServer.create({
|
|
48
|
-
lifetime,
|
|
49
|
-
network,
|
|
50
|
-
netInterface,
|
|
51
|
-
broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : undefined,
|
|
52
|
-
broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
|
|
53
|
-
listeningPort: MDNS_BROADCAST_PORT,
|
|
54
|
-
}),
|
|
55
|
-
);
|
|
56
|
-
return socket;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
constructor(socket: UdpMulticastServer) {
|
|
60
|
-
this.#socket = socket;
|
|
61
|
-
socket.onMessage(this.#handleMessage.bind(this));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
get network() {
|
|
65
|
-
return this.#socket.network;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
get supportsIpv4() {
|
|
69
|
-
return this.#socket.supportsIpv4;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
get netInterface() {
|
|
73
|
-
return this.#socket.netInterface;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
get receipt() {
|
|
77
|
-
return this.#receipt;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async send(message: Partial<DnsMessage> & { messageType: DnsMessageType }, intf?: string, unicastDest?: string) {
|
|
81
|
-
const { messageType } = message;
|
|
82
|
-
// When we send Queries that are too long they need to have the Truncated flag set
|
|
83
|
-
const truncatedMessageType = DnsMessageType.isQuery(messageType)
|
|
84
|
-
? messageType | DnsMessageTypeFlag.TC
|
|
85
|
-
: messageType;
|
|
86
|
-
|
|
87
|
-
const chunk: DnsMessagePartiallyPreEncoded = {
|
|
88
|
-
transactionId: 0,
|
|
89
|
-
queries: [],
|
|
90
|
-
authorities: [],
|
|
91
|
-
|
|
92
|
-
...message,
|
|
93
|
-
|
|
94
|
-
answers: [],
|
|
95
|
-
additionalRecords: [],
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// Note - for size calculations we assume queries are relatively small. We only split answers across messages
|
|
99
|
-
let encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
|
|
100
|
-
let chunkSize = encodedChunkWithoutAnswers.byteLength;
|
|
101
|
-
|
|
102
|
-
// Add answers, splitting message as necessary
|
|
103
|
-
for (const answer of message.answers ?? []) {
|
|
104
|
-
const answerEncoded = DnsCodec.encodeRecord(answer);
|
|
105
|
-
|
|
106
|
-
if (chunkSize + answerEncoded.byteLength > MAX_MDNS_MESSAGE_SIZE) {
|
|
107
|
-
if (chunk.answers.length === 0) {
|
|
108
|
-
// The first answer is already too big, log at least a warning
|
|
109
|
-
logger.warn(
|
|
110
|
-
`MDNS message with ${Diagnostic.json(
|
|
111
|
-
chunk.queries,
|
|
112
|
-
)} is too big to fit into a single MDNS message. Send anyway, but please report!`,
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// New answer does not fit anymore, send out the message
|
|
117
|
-
// When sending a query, we set the Truncated flag to indicate more answers are available
|
|
118
|
-
await this.#send(
|
|
119
|
-
{
|
|
120
|
-
...chunk,
|
|
121
|
-
messageType: truncatedMessageType,
|
|
122
|
-
},
|
|
123
|
-
intf,
|
|
124
|
-
unicastDest,
|
|
125
|
-
);
|
|
126
|
-
|
|
127
|
-
// Reset the message, length counter and included answers to count for next message
|
|
128
|
-
if (chunk.queries.length) {
|
|
129
|
-
chunk.queries.length = 0;
|
|
130
|
-
encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
|
|
131
|
-
}
|
|
132
|
-
chunk.answers.length = 0;
|
|
133
|
-
chunkSize = encodedChunkWithoutAnswers.byteLength + answerEncoded.byteLength;
|
|
134
|
-
} else {
|
|
135
|
-
chunkSize += answerEncoded.byteLength;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
chunk.answers.push(answerEncoded);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Add "additional records"... We include these but only if they fit
|
|
142
|
-
const additionalRecords = message.additionalRecords ?? [];
|
|
143
|
-
for (const additionalRecord of additionalRecords) {
|
|
144
|
-
const additionalRecordEncoded = DnsCodec.encodeRecord(additionalRecord);
|
|
145
|
-
chunkSize += additionalRecordEncoded.byteLength;
|
|
146
|
-
if (chunkSize > MAX_MDNS_MESSAGE_SIZE) {
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
chunk.additionalRecords.push(additionalRecordEncoded);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
await this.#send(chunk, intf, unicastDest);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async #send(message: DnsMessagePartiallyPreEncoded, intf?: string, unicastDest?: string) {
|
|
156
|
-
await this.#socket.send(DnsCodec.encode(message), intf, unicastDest);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
async close() {
|
|
160
|
-
this.#isClosed = true;
|
|
161
|
-
await this.#socket.close();
|
|
162
|
-
if (this.#handlers) {
|
|
163
|
-
await MatterAggregateError.allSettled(this.#handlers);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
#handleMessage(bytes: Bytes, sourceIp: string, sourceIntf: string) {
|
|
168
|
-
// Ignore if closed
|
|
169
|
-
if (this.#isClosed) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Parse
|
|
174
|
-
const parsed = DnsCodec.decode(bytes);
|
|
175
|
-
|
|
176
|
-
// Skip unparseable
|
|
177
|
-
if (parsed === undefined) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
let promise = this.#receipt.emit({
|
|
182
|
-
...parsed,
|
|
183
|
-
sourceIp,
|
|
184
|
-
sourceIntf,
|
|
185
|
-
}) as MaybePromise;
|
|
186
|
-
|
|
187
|
-
if (MaybePromise.is(promise)) {
|
|
188
|
-
if (this.#handlers === undefined) {
|
|
189
|
-
this.#handlers = new Set();
|
|
190
|
-
}
|
|
191
|
-
promise = Promise.resolve(promise).finally(() => this.#handlers?.delete(promise as PromiseLike<void>));
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export namespace MdnsSocket {
|
|
197
|
-
export interface Message extends DnsMessage {
|
|
198
|
-
sourceIp: string;
|
|
199
|
-
sourceIntf: string;
|
|
200
|
-
}
|
|
201
|
-
}
|