@matter/protocol 0.12.0-alpha.0-20250108-7ae2a767d → 0.12.0-alpha.0-20250112-2972cf298
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/interaction/ServerSubscription.d.ts.map +1 -1
- package/dist/cjs/interaction/ServerSubscription.js +7 -3
- package/dist/cjs/interaction/ServerSubscription.js.map +1 -1
- package/dist/cjs/mdns/MdnsBroadcaster.d.ts +3 -3
- package/dist/cjs/mdns/MdnsBroadcaster.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsBroadcaster.js +55 -31
- package/dist/cjs/mdns/MdnsBroadcaster.js.map +1 -1
- package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsScanner.js +226 -28
- package/dist/cjs/mdns/MdnsScanner.js.map +1 -1
- package/dist/cjs/mdns/MdnsServer.d.ts +5 -1
- package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsServer.js +12 -7
- package/dist/cjs/mdns/MdnsServer.js.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.js +35 -2
- package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -1
- package/dist/cjs/protocol/DeviceAdvertiser.js +6 -1
- package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -1
- package/dist/cjs/protocol/DeviceCommissioner.js +5 -1
- package/dist/cjs/protocol/DeviceCommissioner.js.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.js +1 -1
- package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
- package/dist/esm/interaction/ServerSubscription.d.ts.map +1 -1
- package/dist/esm/interaction/ServerSubscription.js +7 -3
- package/dist/esm/interaction/ServerSubscription.js.map +1 -1
- package/dist/esm/mdns/MdnsBroadcaster.d.ts +3 -3
- package/dist/esm/mdns/MdnsBroadcaster.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsBroadcaster.js +56 -31
- package/dist/esm/mdns/MdnsBroadcaster.js.map +1 -1
- package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsScanner.js +226 -28
- package/dist/esm/mdns/MdnsScanner.js.map +1 -1
- package/dist/esm/mdns/MdnsServer.d.ts +5 -1
- package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsServer.js +12 -7
- package/dist/esm/mdns/MdnsServer.js.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.js +36 -3
- package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -1
- package/dist/esm/protocol/DeviceAdvertiser.js +6 -1
- package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -1
- package/dist/esm/protocol/DeviceCommissioner.js +5 -1
- package/dist/esm/protocol/DeviceCommissioner.js.map +1 -1
- package/dist/esm/protocol/ExchangeManager.js +1 -1
- package/dist/esm/protocol/ExchangeManager.js.map +1 -1
- package/package.json +6 -6
- package/src/interaction/ServerSubscription.ts +7 -3
- package/src/mdns/MdnsBroadcaster.ts +63 -35
- package/src/mdns/MdnsScanner.ts +264 -43
- package/src/mdns/MdnsServer.ts +20 -7
- package/src/peer/ControllerCommissioningFlow.ts +48 -3
- package/src/protocol/DeviceAdvertiser.ts +7 -1
- package/src/protocol/DeviceCommissioner.ts +11 -2
- package/src/protocol/ExchangeManager.ts +1 -1
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
Diagnostic,
|
|
13
13
|
ImplementationError,
|
|
14
14
|
Logger,
|
|
15
|
+
MatterAggregateError,
|
|
15
16
|
PtrRecord,
|
|
16
17
|
SrvRecord,
|
|
17
18
|
TxtRecord,
|
|
@@ -209,16 +210,31 @@ class MdnsBroadcaster {
|
|
|
209
210
|
sessionActiveThreshold = SESSION_ACTIVE_THRESHOLD_MS
|
|
210
211
|
} = {}) {
|
|
211
212
|
const currentOperationalFabrics = this.#activeOperationalAnnouncements.get(announcedNetPort);
|
|
213
|
+
this.#activeOperationalAnnouncements.set(
|
|
214
|
+
announcedNetPort,
|
|
215
|
+
fabrics.map((f) => ({
|
|
216
|
+
fabricIndex: f.fabricIndex,
|
|
217
|
+
forInstance: getDeviceMatterQname(
|
|
218
|
+
Bytes.toHex(f.operationalId).toUpperCase(),
|
|
219
|
+
NodeId.toHexString(f.nodeId)
|
|
220
|
+
)
|
|
221
|
+
}))
|
|
222
|
+
);
|
|
223
|
+
const expires = new Array();
|
|
212
224
|
if (currentOperationalFabrics !== void 0) {
|
|
213
225
|
const fabricIndexesSet = new Set(fabrics.map((f) => f.fabricIndex));
|
|
214
|
-
|
|
215
|
-
|
|
226
|
+
for (const { fabricIndex, forInstance } of currentOperationalFabrics) {
|
|
227
|
+
if (!fabricIndexesSet.has(fabricIndex)) {
|
|
228
|
+
expires.push(
|
|
229
|
+
this.#mdnsServer.expireAnnouncements({
|
|
230
|
+
announcedNetPort,
|
|
231
|
+
type: AnnouncementType.Operative,
|
|
232
|
+
forInstance
|
|
233
|
+
})
|
|
234
|
+
);
|
|
235
|
+
}
|
|
216
236
|
}
|
|
217
237
|
}
|
|
218
|
-
this.#activeOperationalAnnouncements.set(
|
|
219
|
-
announcedNetPort,
|
|
220
|
-
fabrics.map((f) => f.fabricIndex)
|
|
221
|
-
);
|
|
222
238
|
await this.#mdnsServer.setRecordsGenerator(announcedNetPort, AnnouncementType.Operative, async (netInterface) => {
|
|
223
239
|
const ipMac = await this.#network.getIpMac(netInterface);
|
|
224
240
|
if (ipMac === void 0) return [];
|
|
@@ -233,30 +249,39 @@ class MdnsBroadcaster {
|
|
|
233
249
|
logger.debug(
|
|
234
250
|
"Announcement Generator: Fabric",
|
|
235
251
|
Diagnostic.dict({
|
|
236
|
-
id: `${
|
|
252
|
+
id: `${operationalIdString}-${NodeId.toHexString(nodeId)}`,
|
|
237
253
|
qname: deviceMatterQname,
|
|
238
254
|
port: announcedNetPort,
|
|
239
255
|
interface: netInterface
|
|
240
256
|
})
|
|
241
257
|
);
|
|
242
258
|
const fabricRecords = [
|
|
243
|
-
PtrRecord(SERVICE_DISCOVERY_QNAME, fabricQname),
|
|
244
|
-
PtrRecord(MATTER_SERVICE_QNAME, deviceMatterQname),
|
|
245
|
-
PtrRecord(fabricQname, deviceMatterQname),
|
|
246
|
-
SrvRecord(
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
259
|
+
PtrRecord(SERVICE_DISCOVERY_QNAME, fabricQname, deviceMatterQname),
|
|
260
|
+
PtrRecord(MATTER_SERVICE_QNAME, deviceMatterQname, deviceMatterQname),
|
|
261
|
+
PtrRecord(fabricQname, deviceMatterQname, deviceMatterQname),
|
|
262
|
+
SrvRecord(
|
|
263
|
+
deviceMatterQname,
|
|
264
|
+
{ priority: 0, weight: 0, port: announcedNetPort, target: hostname },
|
|
265
|
+
deviceMatterQname
|
|
266
|
+
),
|
|
267
|
+
TxtRecord(
|
|
268
|
+
deviceMatterQname,
|
|
269
|
+
[
|
|
270
|
+
`SII=${sessionIdleInterval}`,
|
|
271
|
+
`SAI=${sessionActiveInterval}`,
|
|
272
|
+
`SAT=${sessionActiveThreshold}`
|
|
273
|
+
//`T=${TCP_SUPPORTED}` /* TCP not supported */,
|
|
274
|
+
//`ICD=${ICD_SUPPORTED}` /* ICD not supported */,
|
|
275
|
+
],
|
|
276
|
+
deviceMatterQname
|
|
277
|
+
)
|
|
254
278
|
];
|
|
255
279
|
records.push(...fabricRecords);
|
|
256
280
|
});
|
|
257
281
|
records.push(...this.#getIpRecords(hostname, [...ipV6, ...ipV4]));
|
|
258
282
|
return records;
|
|
259
283
|
});
|
|
284
|
+
await MatterAggregateError.allSettled(expires);
|
|
260
285
|
}
|
|
261
286
|
/** Set the Broadcaster data to announce a Commissioner (aka Commissioner discovery) */
|
|
262
287
|
async setCommissionerInfo(announcedNetPort, {
|
|
@@ -316,24 +341,24 @@ class MdnsBroadcaster {
|
|
|
316
341
|
async announce(announcementPort) {
|
|
317
342
|
this.#mdnsServer.announce(announcementPort).catch((error) => logger.error(error));
|
|
318
343
|
}
|
|
319
|
-
async expireFabricAnnouncement(
|
|
320
|
-
if (this.#activeOperationalAnnouncements.has(
|
|
321
|
-
await this.#mdnsServer.expireAnnouncements(
|
|
322
|
-
this.#activeOperationalAnnouncements.delete(
|
|
344
|
+
async expireFabricAnnouncement(announcedNetPort) {
|
|
345
|
+
if (this.#activeOperationalAnnouncements.has(announcedNetPort)) {
|
|
346
|
+
await this.#mdnsServer.expireAnnouncements({ announcedNetPort, type: AnnouncementType.Operative });
|
|
347
|
+
this.#activeOperationalAnnouncements.delete(announcedNetPort);
|
|
323
348
|
}
|
|
324
349
|
}
|
|
325
|
-
async expireCommissioningAnnouncement(
|
|
326
|
-
if (this.#activeCommissioningAnnouncements.has(
|
|
327
|
-
await this.#mdnsServer.expireAnnouncements(
|
|
328
|
-
this.#activeCommissioningAnnouncements.delete(
|
|
350
|
+
async expireCommissioningAnnouncement(announcedNetPort) {
|
|
351
|
+
if (this.#activeCommissioningAnnouncements.has(announcedNetPort)) {
|
|
352
|
+
await this.#mdnsServer.expireAnnouncements({ announcedNetPort, type: AnnouncementType.Commissionable });
|
|
353
|
+
this.#activeCommissioningAnnouncements.delete(announcedNetPort);
|
|
329
354
|
}
|
|
330
355
|
}
|
|
331
|
-
async expireAllAnnouncements(
|
|
332
|
-
if (!this.#activeCommissioningAnnouncements.has(
|
|
356
|
+
async expireAllAnnouncements(announcedNetPort) {
|
|
357
|
+
if (!this.#activeCommissioningAnnouncements.has(announcedNetPort) && !this.#activeOperationalAnnouncements.has(announcedNetPort))
|
|
333
358
|
return;
|
|
334
|
-
await this.#mdnsServer.expireAnnouncements(
|
|
335
|
-
this.#activeCommissioningAnnouncements.delete(
|
|
336
|
-
this.#activeOperationalAnnouncements.delete(
|
|
359
|
+
await this.#mdnsServer.expireAnnouncements({ announcedNetPort });
|
|
360
|
+
this.#activeCommissioningAnnouncements.delete(announcedNetPort);
|
|
361
|
+
this.#activeOperationalAnnouncements.delete(announcedNetPort);
|
|
337
362
|
}
|
|
338
363
|
async close() {
|
|
339
364
|
while (this.#instances.size) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/mdns/MdnsBroadcaster.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAsB,cAAwC;AAC9D;AAAA,EAKI;AAAA,OACG;AAEP;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,+BAA+B;AACxC,SAAS,kBAAkB,kBAAkB;AAE7C,MAAM,SAAS,OAAO,IAAI,iBAAiB;AAI3C,MAAM,uBAAuB;AAAA,EACzB,YAAY;AAAA,EACZ,cAAc;AAClB;AAKO,MAAM,gBAAgB;AAAA,EAChB,oCAAoC,oBAAI,IAAY;AAAA,EACpD,kCAAkC,oBAAI,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MdnsScanner.d.ts","sourceRoot":"","sources":["../../../src/mdns/MdnsScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEH,WAAW,EACX,UAAU,EASV,QAAQ,EAGR,OAAO,EACP,eAAe,EAIf,kBAAkB,EAGrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;AAC1C,OAAO,EACH,oBAAoB,EACpB,+BAA+B,EAC/B,aAAa,EACb,iBAAiB,EACjB,OAAO,EACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAkB7C,KAAK,4BAA4B,GAAG,eAAe,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"MdnsScanner.d.ts","sourceRoot":"","sources":["../../../src/mdns/MdnsScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEH,WAAW,EACX,UAAU,EASV,QAAQ,EAGR,OAAO,EACP,eAAe,EAIf,kBAAkB,EAGrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAC;AAC1C,OAAO,EACH,oBAAoB,EACpB,+BAA+B,EAC/B,aAAa,EACb,iBAAiB,EACjB,OAAO,EACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAkB7C,KAAK,4BAA4B,GAAG,eAAe,GAAG,QAAQ,CAAC;AAoC/D;;;GAGG;AACH,qBAAa,WAAY,YAAW,OAAO;;IACvC,IAAI,IAAI,gBAEP;WAEY,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;gBA4CnF,eAAe,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,OAAO;IAqQrE;;;OAGG;IACG,qBAAqB,CACvB,EAAE,aAAa,EAAE,EAAE,MAAM,EACzB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,EACvB,qBAAqB,UAAQ,GAC9B,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAyBzC,gCAAgC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAAO;IAKtF,mCAAmC,CAAC,UAAU,EAAE,+BAA+B,EAAE,cAAc,UAAO;IAQtG,8BAA8B,CAAC,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAoLxE;;;;;;;OAOG;IACG,yBAAyB,CAC3B,UAAU,EAAE,+BAA+B,EAC3C,cAAc,SAAI,EAClB,qBAAqB,UAAQ,GAC9B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAkBlC;;;OAGG;IACG,qCAAqC,CACvC,UAAU,EAAE,+BAA+B,EAC3C,QAAQ,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,EAChD,cAAc,CAAC,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAiDlC,kCAAkC,CAAC,UAAU,EAAE,+BAA+B;mBAnOvD,eAAe,EAAE;;;;;;;;;;;;;;;;;oBAhbxB,MAAM;YACd,MAAM;YACN,MAAM;YACN,MAAM;;IAopBd;;OAEG;IACG,KAAK;IA4rBX,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,aAAa;IAmBnD,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC;CASvF"}
|
|
@@ -52,12 +52,18 @@ class MdnsScanner {
|
|
|
52
52
|
enableIpv4
|
|
53
53
|
);
|
|
54
54
|
}
|
|
55
|
+
/** Active announces by queryId with queries and known answers */
|
|
55
56
|
#activeAnnounceQueries = /* @__PURE__ */ new Map();
|
|
56
|
-
|
|
57
|
-
#
|
|
57
|
+
/** Known IP addresses by network interface */
|
|
58
|
+
#discoveredIpRecords = /* @__PURE__ */ new Map();
|
|
59
|
+
/** Known operational device records by Matter Qname */
|
|
58
60
|
#operationalDeviceRecords = /* @__PURE__ */ new Map();
|
|
61
|
+
/** Known commissionable device records by queryId */
|
|
59
62
|
#commissionableDeviceRecords = /* @__PURE__ */ new Map();
|
|
63
|
+
/** Waiters for specific queryIds to resolve a promise when a record is discovered */
|
|
60
64
|
#recordWaiters = /* @__PURE__ */ new Map();
|
|
65
|
+
#queryTimer;
|
|
66
|
+
#nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS;
|
|
61
67
|
#periodicTimer;
|
|
62
68
|
#closing = false;
|
|
63
69
|
#multicastServer;
|
|
@@ -88,7 +94,9 @@ class MdnsScanner {
|
|
|
88
94
|
const allQueries = Array.from(this.#activeAnnounceQueries.values());
|
|
89
95
|
const queries = allQueries.flatMap(({ queries: queries2 }) => queries2);
|
|
90
96
|
const answers = allQueries.flatMap(
|
|
91
|
-
({ answers: answers2 }) => Object.values(answers2).flatMap(
|
|
97
|
+
({ answers: answers2 }) => Object.values(answers2).flatMap(
|
|
98
|
+
(answer) => Object.values(answer).flatMap((records) => Array.isArray(records) ? records : records.values())
|
|
99
|
+
)
|
|
92
100
|
);
|
|
93
101
|
this.#queryTimer = Time.getTimer(
|
|
94
102
|
"MDNS discovery",
|
|
@@ -173,9 +181,14 @@ class MdnsScanner {
|
|
|
173
181
|
this.#nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS;
|
|
174
182
|
this.#queryTimer = Time.getTimer("MDNS discovery", 0, () => this.#sendQueries()).start();
|
|
175
183
|
}
|
|
176
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Combines the known answers from all active queries and the known IP addresses from the network
|
|
186
|
+
* interface into one data package
|
|
187
|
+
*/
|
|
188
|
+
#getActiveQueryEarlierAnswers(netInterface) {
|
|
177
189
|
return this.#combineStructuredAnswers(
|
|
178
|
-
...[...this.#activeAnnounceQueries.values()].map(({ answers }) => answers)
|
|
190
|
+
...[...this.#activeAnnounceQueries.values()].map(({ answers }) => answers),
|
|
191
|
+
this.#discoveredIpRecords.get(netInterface) ?? {}
|
|
179
192
|
);
|
|
180
193
|
}
|
|
181
194
|
/**
|
|
@@ -550,21 +563,38 @@ class MdnsScanner {
|
|
|
550
563
|
/** Converts the discovery data into a structured format for performant access. */
|
|
551
564
|
#structureAnswers(...answersList) {
|
|
552
565
|
const structuredAnswers = {};
|
|
566
|
+
const discoveredAt = Time.nowMs();
|
|
553
567
|
answersList.forEach(
|
|
554
568
|
(answers) => answers.forEach((answer) => {
|
|
555
569
|
const { name, recordType } = answer;
|
|
556
570
|
if (name.endsWith(MATTER_SERVICE_QNAME)) {
|
|
557
571
|
structuredAnswers.operational = structuredAnswers.operational ?? {};
|
|
558
572
|
structuredAnswers.operational[recordType] = structuredAnswers.operational[recordType] ?? [];
|
|
559
|
-
structuredAnswers.operational[recordType].push(
|
|
573
|
+
structuredAnswers.operational[recordType].push({
|
|
574
|
+
discoveredAt,
|
|
575
|
+
...answer
|
|
576
|
+
});
|
|
560
577
|
} else if (name.endsWith(MATTER_COMMISSION_SERVICE_QNAME)) {
|
|
561
578
|
structuredAnswers.commissionable = structuredAnswers.commissionable ?? {};
|
|
562
579
|
structuredAnswers.commissionable[recordType] = structuredAnswers.commissionable[recordType] ?? [];
|
|
563
|
-
structuredAnswers.commissionable[recordType].push(
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
580
|
+
structuredAnswers.commissionable[recordType].push({
|
|
581
|
+
discoveredAt,
|
|
582
|
+
...answer
|
|
583
|
+
});
|
|
584
|
+
} else if (recordType === DnsRecordType.AAAA) {
|
|
585
|
+
structuredAnswers.addressesV6 = structuredAnswers.addressesV6 ?? {};
|
|
586
|
+
structuredAnswers.addressesV6[name] = structuredAnswers.addressesV6[name] ?? /* @__PURE__ */ new Map();
|
|
587
|
+
structuredAnswers.addressesV6[name].set(answer.value, {
|
|
588
|
+
discoveredAt,
|
|
589
|
+
...answer
|
|
590
|
+
});
|
|
591
|
+
} else if (this.#enableIpv4 && recordType === DnsRecordType.A) {
|
|
592
|
+
structuredAnswers.addressesV4 = structuredAnswers.addressesV4 ?? {};
|
|
593
|
+
structuredAnswers.addressesV4[name] = structuredAnswers.addressesV4[name] ?? /* @__PURE__ */ new Map();
|
|
594
|
+
structuredAnswers.addressesV4[name].set(answer.value, {
|
|
595
|
+
discoveredAt,
|
|
596
|
+
...answer
|
|
597
|
+
});
|
|
568
598
|
}
|
|
569
599
|
})
|
|
570
600
|
);
|
|
@@ -578,7 +608,14 @@ class MdnsScanner {
|
|
|
578
608
|
for (const [recordType, records] of Object.entries(answers.operational)) {
|
|
579
609
|
combinedAnswers.operational[recordType] = combinedAnswers.operational[recordType] ?? /* @__PURE__ */ new Map();
|
|
580
610
|
records.forEach((record) => {
|
|
581
|
-
combinedAnswers.operational[recordType].
|
|
611
|
+
const existingRecord = combinedAnswers.operational[recordType].get(record.name);
|
|
612
|
+
if (existingRecord && existingRecord.discoveredAt < record.discoveredAt) {
|
|
613
|
+
if (record.ttl === 0) {
|
|
614
|
+
combinedAnswers.operational[recordType].delete(record.name);
|
|
615
|
+
} else {
|
|
616
|
+
combinedAnswers.operational[recordType].set(record.name, record);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
582
619
|
});
|
|
583
620
|
}
|
|
584
621
|
}
|
|
@@ -587,15 +624,47 @@ class MdnsScanner {
|
|
|
587
624
|
for (const [recordType, records] of Object.entries(answers.commissionable)) {
|
|
588
625
|
combinedAnswers.commissionable[recordType] = combinedAnswers.commissionable[recordType] ?? /* @__PURE__ */ new Map();
|
|
589
626
|
records.forEach((record) => {
|
|
590
|
-
combinedAnswers.commissionable[recordType].
|
|
627
|
+
const existingRecord = combinedAnswers.commissionable[recordType].get(record.name);
|
|
628
|
+
if (existingRecord && existingRecord.discoveredAt < record.discoveredAt) {
|
|
629
|
+
if (record.ttl === 0) {
|
|
630
|
+
combinedAnswers.commissionable[recordType].delete(record.name);
|
|
631
|
+
} else {
|
|
632
|
+
combinedAnswers.commissionable[recordType].set(record.name, record);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
591
635
|
});
|
|
592
636
|
}
|
|
593
637
|
}
|
|
594
|
-
if (answers.
|
|
595
|
-
combinedAnswers.
|
|
596
|
-
for (const [name, records] of Object.entries(answers.
|
|
597
|
-
combinedAnswers.
|
|
598
|
-
|
|
638
|
+
if (answers.addressesV6) {
|
|
639
|
+
combinedAnswers.addressesV6 = combinedAnswers.addressesV6 ?? {};
|
|
640
|
+
for (const [name, records] of Object.entries(answers.addressesV6)) {
|
|
641
|
+
combinedAnswers.addressesV6[name] = combinedAnswers.addressesV6[name] ?? /* @__PURE__ */ new Map();
|
|
642
|
+
Object.values(records).forEach((record) => {
|
|
643
|
+
const existingRecord = combinedAnswers.addressesV6[name].get(record.value);
|
|
644
|
+
if (existingRecord && existingRecord.discoveredAt < record.discoveredAt) {
|
|
645
|
+
if (record.ttl === 0) {
|
|
646
|
+
combinedAnswers.addressesV6[name].delete(name);
|
|
647
|
+
} else {
|
|
648
|
+
combinedAnswers.addressesV6[name].set(name, record);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
if (this.#enableIpv4 && answers.addressesV4) {
|
|
655
|
+
combinedAnswers.addressesV4 = combinedAnswers.addressesV4 ?? {};
|
|
656
|
+
for (const [name, records] of Object.entries(answers.addressesV4)) {
|
|
657
|
+
combinedAnswers.addressesV4[name] = combinedAnswers.addressesV4[name] ?? /* @__PURE__ */ new Map();
|
|
658
|
+
Object.values(records).forEach((record) => {
|
|
659
|
+
const existingRecord = combinedAnswers.addressesV4[name].get(record.value);
|
|
660
|
+
if (existingRecord && existingRecord.discoveredAt < record.discoveredAt) {
|
|
661
|
+
if (record.ttl === 0) {
|
|
662
|
+
combinedAnswers.addressesV4[name].delete(name);
|
|
663
|
+
} else {
|
|
664
|
+
combinedAnswers.addressesV4[name].set(name, record);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
});
|
|
599
668
|
}
|
|
600
669
|
}
|
|
601
670
|
}
|
|
@@ -616,8 +685,11 @@ class MdnsScanner {
|
|
|
616
685
|
])
|
|
617
686
|
);
|
|
618
687
|
}
|
|
619
|
-
if (combinedAnswers.
|
|
620
|
-
result.
|
|
688
|
+
if (combinedAnswers.addressesV6) {
|
|
689
|
+
result.addressesV6 = combinedAnswers.addressesV6;
|
|
690
|
+
}
|
|
691
|
+
if (this.#enableIpv4 && combinedAnswers.addressesV4) {
|
|
692
|
+
result.addressesV4 = combinedAnswers.addressesV4;
|
|
621
693
|
}
|
|
622
694
|
return result;
|
|
623
695
|
}
|
|
@@ -632,14 +704,86 @@ class MdnsScanner {
|
|
|
632
704
|
if (message.messageType !== DnsMessageType.Response && message.messageType !== DnsMessageType.TruncatedResponse)
|
|
633
705
|
return;
|
|
634
706
|
const answers = this.#structureAnswers([...message.answers, ...message.additionalRecords]);
|
|
635
|
-
const formerAnswers = this.#getActiveQueryEarlierAnswers();
|
|
707
|
+
const formerAnswers = this.#getActiveQueryEarlierAnswers(netInterface);
|
|
636
708
|
this.#handleOperationalRecords(answers, formerAnswers, netInterface);
|
|
637
709
|
this.#handleCommissionableRecords(answers, formerAnswers, netInterface);
|
|
710
|
+
this.#updateIpRecords(answers, netInterface);
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Update the discovered matter relevant IP records with the new data from the DNS message.
|
|
714
|
+
*/
|
|
715
|
+
#updateIpRecords(answers, netInterface) {
|
|
716
|
+
const interfaceRecords = this.#discoveredIpRecords.get(netInterface);
|
|
717
|
+
if (interfaceRecords === void 0) {
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
let updated = false;
|
|
721
|
+
if (answers.addressesV6) {
|
|
722
|
+
for (const [target, ipAddresses] of Object.entries(answers.addressesV6)) {
|
|
723
|
+
if (interfaceRecords.addressesV6?.[target] !== void 0) {
|
|
724
|
+
for (const [ip, record] of Object.entries(ipAddresses)) {
|
|
725
|
+
if (record.ttl === 0) {
|
|
726
|
+
interfaceRecords.addressesV6[target].delete(ip);
|
|
727
|
+
} else {
|
|
728
|
+
interfaceRecords.addressesV6[target].set(ip, record);
|
|
729
|
+
}
|
|
730
|
+
updated = true;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
if (this.#enableIpv4 && answers.addressesV4) {
|
|
736
|
+
for (const [target, ipAddresses] of Object.entries(answers.addressesV4)) {
|
|
737
|
+
if (interfaceRecords.addressesV4?.[target] !== void 0) {
|
|
738
|
+
for (const [ip, record] of Object.entries(ipAddresses)) {
|
|
739
|
+
if (record.ttl === 0) {
|
|
740
|
+
interfaceRecords.addressesV4[target].delete(ip);
|
|
741
|
+
} else {
|
|
742
|
+
interfaceRecords.addressesV4[target].set(ip, record);
|
|
743
|
+
}
|
|
744
|
+
updated = true;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
if (updated) {
|
|
750
|
+
this.#discoveredIpRecords.set(netInterface, interfaceRecords);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
/**
|
|
754
|
+
* Register Matter relevant IP records for later usage.
|
|
755
|
+
*/
|
|
756
|
+
#registerIpRecords(ipAddresses, netInterface) {
|
|
757
|
+
const interfaceRecords = this.#discoveredIpRecords.get(netInterface) ?? {};
|
|
758
|
+
for (const record of ipAddresses) {
|
|
759
|
+
const { recordType, name, value: ip, ttl } = record;
|
|
760
|
+
if (ttl === 0) continue;
|
|
761
|
+
if (recordType === DnsRecordType.AAAA) {
|
|
762
|
+
interfaceRecords.addressesV6 = interfaceRecords.addressesV6 ?? {};
|
|
763
|
+
interfaceRecords.addressesV6[name] = interfaceRecords.addressesV6[name] ?? /* @__PURE__ */ new Map();
|
|
764
|
+
interfaceRecords.addressesV6[name].set(ip, record);
|
|
765
|
+
} else if (this.#enableIpv4 && recordType === DnsRecordType.A) {
|
|
766
|
+
interfaceRecords.addressesV4 = interfaceRecords.addressesV4 ?? {};
|
|
767
|
+
interfaceRecords.addressesV4[name] = interfaceRecords.addressesV4[name] ?? /* @__PURE__ */ new Map();
|
|
768
|
+
interfaceRecords.addressesV4[name].set(ip, record);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
this.#discoveredIpRecords.set(netInterface, interfaceRecords);
|
|
638
772
|
}
|
|
639
773
|
#handleIpRecords(answers, target, netInterface) {
|
|
640
|
-
const ipRecords =
|
|
641
|
-
|
|
642
|
-
|
|
774
|
+
const ipRecords = new Array();
|
|
775
|
+
answers.forEach((answer) => {
|
|
776
|
+
if (answer.addressesV6?.[target]) {
|
|
777
|
+
ipRecords.push(...answer.addressesV6[target].values());
|
|
778
|
+
}
|
|
779
|
+
if (this.#enableIpv4 && answer.addressesV4?.[target]) {
|
|
780
|
+
ipRecords.push(...answer.addressesV4[target].values());
|
|
781
|
+
}
|
|
782
|
+
});
|
|
783
|
+
if (ipRecords.length === 0) {
|
|
784
|
+
return [];
|
|
785
|
+
}
|
|
786
|
+
this.#registerIpRecords(ipRecords, netInterface);
|
|
643
787
|
const collectedIps = /* @__PURE__ */ new Map();
|
|
644
788
|
ipRecords.forEach((record) => {
|
|
645
789
|
const { value, ttl } = record;
|
|
@@ -727,6 +871,7 @@ class MdnsScanner {
|
|
|
727
871
|
discoveredAt,
|
|
728
872
|
ttl: ttl * 1e3
|
|
729
873
|
};
|
|
874
|
+
const ipsInitiallyEmpty = device.addresses.size === 0;
|
|
730
875
|
const { addresses } = device;
|
|
731
876
|
if (ips.length > 0) {
|
|
732
877
|
for (const { value: ip, ttl: ttl2 } of ips) {
|
|
@@ -743,9 +888,9 @@ class MdnsScanner {
|
|
|
743
888
|
addresses.set(address.ip, address);
|
|
744
889
|
}
|
|
745
890
|
device.addresses = addresses;
|
|
746
|
-
if (
|
|
891
|
+
if (ipsInitiallyEmpty) {
|
|
747
892
|
logger.debug(
|
|
748
|
-
`Added IPs for operational device ${matterName} to cache (interface ${netInterface}):`,
|
|
893
|
+
`Added ${addresses.size} IPs for operational device ${matterName} to cache (interface ${netInterface}):`,
|
|
749
894
|
...MdnsScanner.deviceAddressDiagnostics(addresses)
|
|
750
895
|
);
|
|
751
896
|
}
|
|
@@ -826,7 +971,7 @@ class MdnsScanner {
|
|
|
826
971
|
this.#commissionableDeviceRecords.delete(record.name);
|
|
827
972
|
continue;
|
|
828
973
|
}
|
|
829
|
-
const
|
|
974
|
+
const recordAddressesKnown = storedRecord.addresses.size > 0;
|
|
830
975
|
const ips = this.#handleIpRecords([formerAnswers, answers], target, netInterface);
|
|
831
976
|
if (ips.length > 0) {
|
|
832
977
|
for (const { value: ip, ttl: ttl2 } of ips) {
|
|
@@ -855,12 +1000,17 @@ class MdnsScanner {
|
|
|
855
1000
|
`Requesting IP addresses for commissionable device ${record.name} (interface ${netInterface}).`
|
|
856
1001
|
);
|
|
857
1002
|
this.#setQueryRecords(queryId2, queries, answers);
|
|
1003
|
+
} else if (!recordAddressesKnown) {
|
|
1004
|
+
logger.debug(
|
|
1005
|
+
`Added ${storedRecord.addresses.size} IPs for commissionable device ${record.name} to cache (interface ${netInterface}):`,
|
|
1006
|
+
...MdnsScanner.deviceAddressDiagnostics(storedRecord.addresses)
|
|
1007
|
+
);
|
|
858
1008
|
}
|
|
859
1009
|
if (storedRecord.addresses.size === 0) continue;
|
|
860
1010
|
const queryId = this.#findCommissionableQueryIdentifier(record.name, storedRecord);
|
|
861
1011
|
if (queryId === void 0) continue;
|
|
862
1012
|
queryMissingDataForInstances.delete(record.name);
|
|
863
|
-
this.#finishWaiter(queryId, true,
|
|
1013
|
+
this.#finishWaiter(queryId, true, recordAddressesKnown);
|
|
864
1014
|
}
|
|
865
1015
|
if (queryMissingDataForInstances.size !== 0) {
|
|
866
1016
|
for (const name of Array.from(queryMissingDataForInstances.values())) {
|
|
@@ -943,6 +1093,54 @@ class MdnsScanner {
|
|
|
943
1093
|
this.#commissionableDeviceRecords.delete(recordKey);
|
|
944
1094
|
}
|
|
945
1095
|
});
|
|
1096
|
+
[...this.#activeAnnounceQueries.values()].forEach(({ answers }) => this.#expireStructuredAnswers(answers, now));
|
|
1097
|
+
this.#discoveredIpRecords.forEach((answers) => this.#expireStructuredAnswers(answers, now));
|
|
1098
|
+
}
|
|
1099
|
+
#expireStructuredAnswers(data, now) {
|
|
1100
|
+
if (data.operational) {
|
|
1101
|
+
Object.keys(data.operational).forEach((recordType) => {
|
|
1102
|
+
const type = parseInt(recordType);
|
|
1103
|
+
data.operational[type] = data.operational[type].filter(
|
|
1104
|
+
({ discoveredAt, ttl }) => now < discoveredAt + this.#effectiveTTL(ttl * 1e3)
|
|
1105
|
+
);
|
|
1106
|
+
if (data.operational[type].length === 0) {
|
|
1107
|
+
delete data.operational[type];
|
|
1108
|
+
}
|
|
1109
|
+
});
|
|
1110
|
+
}
|
|
1111
|
+
if (data.commissionable) {
|
|
1112
|
+
Object.keys(data.commissionable).forEach((recordType) => {
|
|
1113
|
+
const type = parseInt(recordType);
|
|
1114
|
+
data.commissionable[type] = data.commissionable[type].filter(
|
|
1115
|
+
({ discoveredAt, ttl }) => now < discoveredAt + this.#effectiveTTL(ttl * 1e3)
|
|
1116
|
+
);
|
|
1117
|
+
if (data.commissionable[type].length === 0) {
|
|
1118
|
+
delete data.commissionable[type];
|
|
1119
|
+
}
|
|
1120
|
+
});
|
|
1121
|
+
}
|
|
1122
|
+
if (data.addressesV6) {
|
|
1123
|
+
Object.keys(data.addressesV6).forEach((name) => {
|
|
1124
|
+
for (const [ip, { discoveredAt, ttl }] of data.addressesV6[name].entries()) {
|
|
1125
|
+
if (now < discoveredAt + this.#effectiveTTL(ttl * 1e3)) continue;
|
|
1126
|
+
data.addressesV6[name].delete(ip);
|
|
1127
|
+
}
|
|
1128
|
+
if (data.addressesV6[name].size === 0) {
|
|
1129
|
+
delete data.addressesV6[name];
|
|
1130
|
+
}
|
|
1131
|
+
});
|
|
1132
|
+
}
|
|
1133
|
+
if (data.addressesV4) {
|
|
1134
|
+
Object.keys(data.addressesV4).forEach((name) => {
|
|
1135
|
+
for (const [ip, { discoveredAt, ttl }] of data.addressesV4[name].entries()) {
|
|
1136
|
+
if (now < discoveredAt + this.#effectiveTTL(ttl * 1e3)) continue;
|
|
1137
|
+
data.addressesV4[name].delete(ip);
|
|
1138
|
+
}
|
|
1139
|
+
if (data.addressesV4[name].size === 0) {
|
|
1140
|
+
delete data.addressesV4[name];
|
|
1141
|
+
}
|
|
1142
|
+
});
|
|
1143
|
+
}
|
|
946
1144
|
}
|
|
947
1145
|
static discoveryDataDiagnostics(data) {
|
|
948
1146
|
return Diagnostic.dict(
|