@matter-server/ws-controller 0.6.3-alpha.0-20260429-7b8104b → 0.6.3

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,66 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { BorderRouterEntry } from "@matter-server/ws-client";
7
+ import { Bytes, type DnsRecord, DnsRecordType, Environment } from "@matter/main";
8
+ interface DnssdRecordLike {
9
+ recordType: DnsRecordType;
10
+ name: string;
11
+ value: unknown;
12
+ }
13
+ interface DnssdParametersLike extends ReadonlyMap<string, string> {
14
+ raw(key: string): Bytes | undefined;
15
+ }
16
+ interface DnssdNameLike {
17
+ readonly qname: string;
18
+ readonly parameters: DnssdParametersLike;
19
+ readonly records: Iterable<DnssdRecordLike>;
20
+ readonly isDiscovered: boolean;
21
+ on(observer: NameObserver): void;
22
+ off(observer: NameObserver): void;
23
+ }
24
+ interface DnssdNamesFiltersLike {
25
+ add(filter: (record: DnsRecord) => boolean): unknown;
26
+ delete(filter: (record: DnsRecord) => boolean): unknown;
27
+ }
28
+ interface DiscoveredObservableLike {
29
+ on(observer: DiscoveredObserver): void;
30
+ off(observer: DiscoveredObserver): void;
31
+ }
32
+ interface SolicitorLike {
33
+ solicit(solicitation: {
34
+ name: DnssdNameLike;
35
+ recordTypes: DnsRecordType[];
36
+ }): void;
37
+ }
38
+ interface DnssdNamesLike {
39
+ readonly filters: DnssdNamesFiltersLike;
40
+ readonly discovered: DiscoveredObservableLike;
41
+ readonly solicitor: SolicitorLike;
42
+ get(qname: string): DnssdNameLike;
43
+ maybeGet(qname: string): DnssdNameLike | undefined;
44
+ }
45
+ type DiscoveredObserver = (name: DnssdNameLike) => void;
46
+ type NameObserver = (changes: {
47
+ name: DnssdNameLike;
48
+ updated?: unknown[];
49
+ deleted?: unknown[];
50
+ }) => void;
51
+ /**
52
+ * Passive Thread Border Router discovery via mDNS.
53
+ *
54
+ * Subscribes to `_meshcop._udp.local` and `_trel._udp.local`, builds a per-extended-address
55
+ * registry, and exposes the current entries through {@link list}. Owned by {@link MatterController}.
56
+ */
57
+ export declare class BorderRouterDiscovery {
58
+ #private;
59
+ constructor(env: Environment, names?: DnssdNamesLike);
60
+ start(): Promise<void>;
61
+ stop(): Promise<void>;
62
+ list(): BorderRouterEntry[];
63
+ get(extAddressHex: string): BorderRouterEntry | undefined;
64
+ }
65
+ export {};
66
+ //# sourceMappingURL=BorderRouterDiscovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BorderRouterDiscovery.d.ts","sourceRoot":"","sources":["../../../src/controller/BorderRouterDiscovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,WAAW,EAA+B,MAAM,cAAc,CAAC;AAiB9G,UAAU,eAAe;IACrB,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,mBAAoB,SAAQ,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAC7D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;CACvC;AAED,UAAU,aAAa;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,EAAE,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACjC,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CACrC;AAED,UAAU,qBAAqB;IAC3B,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC;IACrD,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAG,OAAO,CAAC;CAC3D;AAED,UAAU,wBAAwB;IAC9B,EAAE,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACvC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC3C;AAED,UAAU,aAAa;IACnB,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,WAAW,EAAE,aAAa,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CACtF;AAED,UAAU,cAAc;IACpB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;CACtD;AAED,KAAK,kBAAkB,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AACxD,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;CAAE,KAAK,IAAI,CAAC;AAmBzG;;;;;GAKG;AACH,qBAAa,qBAAqB;;IAe9B,YAAY,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,cAAc,EAGnD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC3B;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA8B1B;IAED,IAAI,IAAI,iBAAiB,EAAE,CAE1B;IAED,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAGxD;CA+YJ"}
@@ -0,0 +1,450 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Bytes, DnsRecordType, Logger } from "@matter/main";
7
+ import { MdnsService } from "@matter/main/protocol";
8
+ const logger = Logger.get("BorderRouterDiscovery");
9
+ const REGISTRY_MAX_ENTRIES = 256;
10
+ const INSTANCE_OBSERVER_CAP = 512;
11
+ const MESHCOP_TYPE_QNAME = "_meshcop._udp.local";
12
+ const TREL_TYPE_QNAME = "_trel._udp.local";
13
+ const MESHCOP_SUFFIX = "._meshcop._udp.local";
14
+ const TREL_SUFFIX = "._trel._udp.local";
15
+ class BorderRouterDiscovery {
16
+ #env;
17
+ #registry = /* @__PURE__ */ new Map();
18
+ #instanceObservers = /* @__PURE__ */ new Map();
19
+ #targetObservers = /* @__PURE__ */ new Map();
20
+ #names;
21
+ #injectedNames;
22
+ #suffixFilter;
23
+ #discoveredObserver;
24
+ #started = false;
25
+ /** Incremented on every start/stop. Lets a pending `await mdns.construction.ready`
26
+ * detect that `stop()` ran while it was suspended and abort partial setup. */
27
+ #startGeneration = 0;
28
+ #evictionWarnedThisCycle = false;
29
+ constructor(env, names) {
30
+ this.#env = env;
31
+ this.#injectedNames = names;
32
+ }
33
+ async start() {
34
+ if (this.#started) return;
35
+ const gen = ++this.#startGeneration;
36
+ this.#evictionWarnedThisCycle = false;
37
+ let names;
38
+ if (this.#injectedNames !== void 0) {
39
+ names = this.#injectedNames;
40
+ } else {
41
+ try {
42
+ const mdns = this.#env.get(MdnsService);
43
+ await mdns.construction.ready;
44
+ if (gen !== this.#startGeneration) return;
45
+ names = mdns.names;
46
+ } catch (e) {
47
+ if (gen !== this.#startGeneration) return;
48
+ logger.warn("MDNS service unavailable; border router discovery inactive:", e);
49
+ return;
50
+ }
51
+ }
52
+ this.#started = true;
53
+ this.#names = names;
54
+ const suffixFilter = ({ name }) => {
55
+ const lower = name.toLowerCase();
56
+ return lower.endsWith(MESHCOP_SUFFIX) || lower.endsWith(TREL_SUFFIX);
57
+ };
58
+ this.#suffixFilter = suffixFilter;
59
+ names.filters.add(suffixFilter);
60
+ const meshcopType = names.get(MESHCOP_TYPE_QNAME);
61
+ const trelType = names.get(TREL_TYPE_QNAME);
62
+ names.solicitor.solicit({ name: meshcopType, recordTypes: [DnsRecordType.PTR] });
63
+ names.solicitor.solicit({ name: trelType, recordTypes: [DnsRecordType.PTR] });
64
+ const observer = (name) => this.#onDiscovered(name);
65
+ this.#discoveredObserver = observer;
66
+ names.discovered.on(observer);
67
+ }
68
+ async stop() {
69
+ this.#startGeneration++;
70
+ if (!this.#started) return;
71
+ this.#started = false;
72
+ const names = this.#names;
73
+ if (names !== void 0) {
74
+ if (this.#discoveredObserver !== void 0) {
75
+ names.discovered.off(this.#discoveredObserver);
76
+ }
77
+ if (this.#suffixFilter !== void 0) {
78
+ names.filters.delete(this.#suffixFilter);
79
+ }
80
+ }
81
+ this.#discoveredObserver = void 0;
82
+ this.#suffixFilter = void 0;
83
+ for (const tracking of this.#instanceObservers.values()) {
84
+ tracking.name.off(tracking.observer);
85
+ }
86
+ this.#instanceObservers.clear();
87
+ for (const tracking of this.#targetObservers.values()) {
88
+ tracking.target.off(tracking.observer);
89
+ }
90
+ this.#targetObservers.clear();
91
+ this.#registry.clear();
92
+ this.#names = void 0;
93
+ }
94
+ list() {
95
+ return Array.from(this.#registry.values(), (entry) => this.#snapshotEntry(entry));
96
+ }
97
+ get(extAddressHex) {
98
+ const entry = this.#registry.get(extAddressHex.toUpperCase());
99
+ return entry === void 0 ? void 0 : this.#snapshotEntry(entry);
100
+ }
101
+ /** Shallow copy so callers cannot mutate registry state through the returned reference. */
102
+ #snapshotEntry(entry) {
103
+ return {
104
+ ...entry,
105
+ sources: [...entry.sources],
106
+ addresses: [...entry.addresses]
107
+ };
108
+ }
109
+ #onDiscovered(name) {
110
+ if (!this.#started) return;
111
+ const lower = name.qname.toLowerCase();
112
+ if (lower === MESHCOP_TYPE_QNAME || lower === TREL_TYPE_QNAME) {
113
+ return;
114
+ }
115
+ let source;
116
+ if (lower.endsWith(MESHCOP_SUFFIX)) {
117
+ source = "meshcop";
118
+ } else if (lower.endsWith(TREL_SUFFIX)) {
119
+ source = "trel";
120
+ } else {
121
+ return;
122
+ }
123
+ const key = lower;
124
+ if (this.#instanceObservers.has(key)) {
125
+ return;
126
+ }
127
+ if (this.#instanceObservers.size >= INSTANCE_OBSERVER_CAP) {
128
+ while (this.#instanceObservers.size >= INSTANCE_OBSERVER_CAP) {
129
+ if (!this.#evictOldestPendingInstance() && !this.#evictOldest()) break;
130
+ }
131
+ }
132
+ const observer = () => this.#onInstanceChanged(name, source);
133
+ this.#instanceObservers.set(key, { name, source, observer, firstSeen: Date.now() });
134
+ name.on(observer);
135
+ this.#parseAndUpsert(name, source);
136
+ }
137
+ /**
138
+ * Evict the oldest xa-less instance observer when the observer cap is hit. Instances
139
+ * that never publish a valid `xa` (malformed broadcasters or hostile noise) would
140
+ * otherwise pin observers in `#instanceObservers` indefinitely — eviction targets only
141
+ * those because observers tied to real registry entries are managed by `#evictOldest`.
142
+ */
143
+ #evictOldestPendingInstance() {
144
+ let oldestKey;
145
+ let oldestSeen = Number.POSITIVE_INFINITY;
146
+ for (const [k, t] of this.#instanceObservers) {
147
+ if (t.xaKey !== void 0) continue;
148
+ if (t.firstSeen < oldestSeen) {
149
+ oldestSeen = t.firstSeen;
150
+ oldestKey = k;
151
+ }
152
+ }
153
+ if (oldestKey === void 0) return false;
154
+ const tracking = this.#instanceObservers.get(oldestKey);
155
+ if (tracking === void 0) return false;
156
+ tracking.name.off(tracking.observer);
157
+ if (tracking.targetKey !== void 0) {
158
+ this.#releaseTarget(tracking.targetKey);
159
+ }
160
+ this.#instanceObservers.delete(oldestKey);
161
+ return true;
162
+ }
163
+ #onInstanceChanged(name, source) {
164
+ if (!this.#started) return;
165
+ try {
166
+ this.#parseAndUpsert(name, source);
167
+ } catch (e) {
168
+ logger.debug("Error processing border router instance change:", e);
169
+ }
170
+ if (name.isDiscovered) {
171
+ return;
172
+ }
173
+ const key = name.qname.toLowerCase();
174
+ const tracking = this.#instanceObservers.get(key);
175
+ if (tracking === void 0) {
176
+ return;
177
+ }
178
+ tracking.name.off(tracking.observer);
179
+ this.#instanceObservers.delete(key);
180
+ if (tracking.targetKey !== void 0) {
181
+ this.#releaseTarget(tracking.targetKey);
182
+ }
183
+ const xaKey = tracking.xaKey;
184
+ if (xaKey === void 0) {
185
+ return;
186
+ }
187
+ const entry = this.#registry.get(xaKey);
188
+ if (entry === void 0) {
189
+ return;
190
+ }
191
+ const idx = entry.sources.indexOf(source);
192
+ if (idx !== -1) {
193
+ entry.sources.splice(idx, 1);
194
+ }
195
+ if (source === "meshcop") {
196
+ entry.meshcopPort = void 0;
197
+ entry.networkName = void 0;
198
+ entry.vendorName = void 0;
199
+ entry.modelName = void 0;
200
+ entry.threadVersion = void 0;
201
+ entry.borderAgentIdHex = void 0;
202
+ entry.stateBitmapHex = void 0;
203
+ entry.activeTimestampHex = void 0;
204
+ entry.partitionIdHex = void 0;
205
+ entry.domainName = void 0;
206
+ } else {
207
+ entry.trelPort = void 0;
208
+ }
209
+ if (entry.sources.length === 0) {
210
+ this.#registry.delete(xaKey);
211
+ return;
212
+ }
213
+ for (const otherTracking of this.#instanceObservers.values()) {
214
+ if (otherTracking.xaKey === xaKey && otherTracking.source !== source) {
215
+ this.#parseAndUpsert(otherTracking.name, otherTracking.source);
216
+ break;
217
+ }
218
+ }
219
+ }
220
+ #onTargetChanged(target) {
221
+ if (!this.#started) return;
222
+ try {
223
+ const targetQname = target.qname.toLowerCase();
224
+ for (const entry of this.#registry.values()) {
225
+ if (entry.hostname?.toLowerCase() === targetQname) {
226
+ entry.addresses = this.#sortAddresses(this.#collectAddresses(target));
227
+ }
228
+ }
229
+ } catch (e) {
230
+ logger.debug("Error processing border router target change:", e);
231
+ }
232
+ }
233
+ #parseAndUpsert(name, source) {
234
+ const names = this.#names;
235
+ if (names === void 0) return;
236
+ try {
237
+ const params = name.parameters;
238
+ const xaKey = rawHex(params.raw("xa"), 8);
239
+ if (xaKey === void 0) {
240
+ return;
241
+ }
242
+ const records = Array.from(name.records);
243
+ const srvRecord = records.find((r) => r.recordType === DnsRecordType.SRV);
244
+ let srvTarget;
245
+ let srvPort;
246
+ if (srvRecord !== void 0 && isSrvValue(srvRecord.value)) {
247
+ srvTarget = srvRecord.value.target;
248
+ srvPort = srvRecord.value.port;
249
+ }
250
+ let addresses = [];
251
+ const tracking = this.#instanceObservers.get(name.qname.toLowerCase());
252
+ if (srvTarget !== void 0) {
253
+ const target = names.get(srvTarget);
254
+ addresses = this.#sortAddresses(this.#collectAddresses(target));
255
+ this.#attachTargetObserver(name, srvTarget, target);
256
+ } else if (tracking?.targetKey !== void 0) {
257
+ this.#releaseTarget(tracking.targetKey);
258
+ tracking.targetKey = void 0;
259
+ }
260
+ const xp = rawHex(params.raw("xp"), 8);
261
+ const existing = this.#registry.get(xaKey);
262
+ const meshcopWins = source === "meshcop";
263
+ const entry = existing ?? {
264
+ extAddressHex: xaKey,
265
+ addresses: [],
266
+ sources: [],
267
+ lastSeen: Date.now()
268
+ };
269
+ const meshcopAlreadyContributed = entry.sources.includes("meshcop");
270
+ const canOverwrite = meshcopWins || !meshcopAlreadyContributed;
271
+ if (xp !== void 0 && canOverwrite) {
272
+ entry.extendedPanIdHex = xp;
273
+ }
274
+ const previousHostname = entry.hostname;
275
+ if (srvTarget !== void 0 && canOverwrite) {
276
+ entry.hostname = srvTarget;
277
+ }
278
+ if (source === "meshcop" && srvTarget !== void 0 && previousHostname !== void 0 && previousHostname.toLowerCase() !== srvTarget.toLowerCase()) {
279
+ this.#repointTrelTargetForXa(xaKey, previousHostname, srvTarget, names);
280
+ }
281
+ if (addresses.length > 0 && canOverwrite) {
282
+ entry.addresses = addresses;
283
+ }
284
+ if (source === "meshcop") {
285
+ if (srvPort !== void 0) entry.meshcopPort = srvPort;
286
+ const nn = params.get("nn");
287
+ if (nn !== void 0) entry.networkName = nn;
288
+ const vn = params.get("vn");
289
+ if (vn !== void 0) entry.vendorName = vn;
290
+ const mn = params.get("mn");
291
+ if (mn !== void 0) entry.modelName = mn;
292
+ const tv = params.get("tv");
293
+ if (tv !== void 0) entry.threadVersion = tv;
294
+ const dd = rawHex(params.raw("dd"));
295
+ if (dd !== void 0) entry.borderAgentIdHex = dd;
296
+ const sb = rawHex(params.raw("sb"), 4);
297
+ if (sb !== void 0) entry.stateBitmapHex = sb;
298
+ const at = rawHex(params.raw("at"), 8);
299
+ if (at !== void 0) entry.activeTimestampHex = at;
300
+ const pt = rawHex(params.raw("pt"), 4);
301
+ if (pt !== void 0) entry.partitionIdHex = pt;
302
+ const dn = params.get("dn");
303
+ if (dn !== void 0) entry.domainName = dn;
304
+ } else if (source === "trel") {
305
+ if (srvPort !== void 0) entry.trelPort = srvPort;
306
+ }
307
+ if (!entry.sources.includes(source)) {
308
+ if (source === "meshcop") {
309
+ entry.sources.unshift(source);
310
+ } else {
311
+ entry.sources.push(source);
312
+ }
313
+ }
314
+ entry.lastSeen = Date.now();
315
+ if (existing === void 0) {
316
+ if (this.#registry.size >= REGISTRY_MAX_ENTRIES) {
317
+ this.#evictOldest();
318
+ }
319
+ this.#registry.set(xaKey, entry);
320
+ }
321
+ if (tracking !== void 0) {
322
+ tracking.xaKey = xaKey;
323
+ }
324
+ } catch (e) {
325
+ logger.debug("Error parsing border router record:", e);
326
+ }
327
+ }
328
+ #collectAddresses(target) {
329
+ const out = new Array();
330
+ for (const record of target.records) {
331
+ if (record.recordType !== DnsRecordType.A && record.recordType !== DnsRecordType.AAAA) continue;
332
+ if (typeof record.value === "string") {
333
+ out.push(record.value);
334
+ }
335
+ }
336
+ return out;
337
+ }
338
+ #sortAddresses(addresses) {
339
+ const seen = /* @__PURE__ */ new Set();
340
+ const unique = new Array();
341
+ for (const addr of addresses) {
342
+ if (!seen.has(addr)) {
343
+ seen.add(addr);
344
+ unique.push(addr);
345
+ }
346
+ }
347
+ const ipv4 = unique.filter((a) => !a.includes(":"));
348
+ const ipv6 = unique.filter((a) => a.includes(":"));
349
+ const categorize = (a) => {
350
+ const lower = a.toLowerCase();
351
+ if (lower.startsWith("fe80:")) return 2;
352
+ if (lower.startsWith("fc") || lower.startsWith("fd")) return 1;
353
+ const firstChar = lower.charAt(0);
354
+ if (firstChar === "2" || firstChar === "3") return 0;
355
+ return 3;
356
+ };
357
+ ipv6.sort((a, b) => {
358
+ const ca = categorize(a);
359
+ const cb = categorize(b);
360
+ if (ca !== cb) return ca - cb;
361
+ return a.localeCompare(b);
362
+ });
363
+ ipv4.sort((a, b) => a.localeCompare(b));
364
+ return [...ipv4, ...ipv6];
365
+ }
366
+ #attachTargetObserver(instance, srvTarget, target) {
367
+ const targetKey = srvTarget.toLowerCase();
368
+ const instanceKey = instance.qname.toLowerCase();
369
+ const instanceTracking = this.#instanceObservers.get(instanceKey);
370
+ const previousTargetKey = instanceTracking?.targetKey;
371
+ if (previousTargetKey === targetKey) {
372
+ return;
373
+ }
374
+ if (previousTargetKey !== void 0) {
375
+ this.#releaseTarget(previousTargetKey);
376
+ }
377
+ const existing = this.#targetObservers.get(targetKey);
378
+ if (existing !== void 0) {
379
+ existing.refcount++;
380
+ } else {
381
+ const observer = () => this.#onTargetChanged(target);
382
+ target.on(observer);
383
+ this.#targetObservers.set(targetKey, { target, observer, refcount: 1 });
384
+ }
385
+ if (instanceTracking !== void 0) {
386
+ instanceTracking.targetKey = targetKey;
387
+ }
388
+ }
389
+ #repointTrelTargetForXa(xaKey, previousHostname, newTarget, names) {
390
+ const previousKey = previousHostname.toLowerCase();
391
+ for (const tracking of this.#instanceObservers.values()) {
392
+ if (tracking.xaKey !== xaKey) continue;
393
+ if (tracking.source !== "trel") continue;
394
+ if (tracking.targetKey !== previousKey) continue;
395
+ this.#attachTargetObserver(tracking.name, newTarget, names.get(newTarget));
396
+ }
397
+ }
398
+ #releaseTarget(targetKey) {
399
+ const tracking = this.#targetObservers.get(targetKey);
400
+ if (tracking === void 0) return;
401
+ tracking.refcount--;
402
+ if (tracking.refcount <= 0) {
403
+ tracking.target.off(tracking.observer);
404
+ this.#targetObservers.delete(targetKey);
405
+ }
406
+ }
407
+ #evictOldest() {
408
+ let oldestKey;
409
+ let oldestSeen = Number.POSITIVE_INFINITY;
410
+ for (const [xa, entry] of this.#registry) {
411
+ if (entry.lastSeen < oldestSeen) {
412
+ oldestSeen = entry.lastSeen;
413
+ oldestKey = xa;
414
+ }
415
+ }
416
+ if (oldestKey === void 0) return false;
417
+ this.#registry.delete(oldestKey);
418
+ let releasedObservers = 0;
419
+ for (const [instanceKey, tracking] of [...this.#instanceObservers]) {
420
+ if (tracking.xaKey !== oldestKey) continue;
421
+ tracking.name.off(tracking.observer);
422
+ if (tracking.targetKey !== void 0) {
423
+ this.#releaseTarget(tracking.targetKey);
424
+ }
425
+ this.#instanceObservers.delete(instanceKey);
426
+ releasedObservers++;
427
+ }
428
+ if (!this.#evictionWarnedThisCycle) {
429
+ this.#evictionWarnedThisCycle = true;
430
+ logger.warn(
431
+ `Border router registry exceeded ${REGISTRY_MAX_ENTRIES} entries; evicting oldest (released ${releasedObservers} instance observer${releasedObservers === 1 ? "" : "s"})`
432
+ );
433
+ } else {
434
+ logger.debug(`Evicted border router xa=${oldestKey}; released ${releasedObservers} instance observers`);
435
+ }
436
+ return true;
437
+ }
438
+ }
439
+ function isSrvValue(value) {
440
+ return typeof value === "object" && value !== null && "target" in value && typeof value.target === "string" && "port" in value && typeof value.port === "number";
441
+ }
442
+ function rawHex(bytes, expectedByteLength) {
443
+ if (bytes === void 0 || bytes.byteLength === 0) return void 0;
444
+ if (expectedByteLength !== void 0 && bytes.byteLength !== expectedByteLength) return void 0;
445
+ return Bytes.toHex(bytes).toUpperCase();
446
+ }
447
+ export {
448
+ BorderRouterDiscovery
449
+ };
450
+ //# sourceMappingURL=BorderRouterDiscovery.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/controller/BorderRouterDiscovery.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -6,6 +6,7 @@
6
6
  import { Bytes, Crypto, Environment, Timestamp } from "@matter/main";
7
7
  import { VendorInfo } from "@matter/main/protocol";
8
8
  import { ConfigStorage } from "../server/ConfigStorage.js";
9
+ import { BorderRouterDiscovery } from "./BorderRouterDiscovery.js";
9
10
  import { ControllerCommandHandler } from "./ControllerCommandHandler.js";
10
11
  import { LegacyServerData } from "./LegacyDataInjector.js";
11
12
  import "@matter/nodejs-ble";
@@ -24,6 +25,7 @@ export declare class MatterController {
24
25
  constructor(environment: Environment, config: ConfigStorage, options: MatterControllerOptions, serverId: string);
25
26
  protected initialize(vendorId?: number, fabricId?: number | bigint, legacyCommissionedDates?: Map<string, Timestamp>): Promise<void>;
26
27
  get commandHandler(): ControllerCommandHandler;
28
+ get borderRouters(): BorderRouterDiscovery;
27
29
  /**
28
30
  * Get the DCL vendor info service instance.
29
31
  * Lazily initializes the service if not already present.
@@ -1 +1 @@
1
- {"version":3,"file":"MatterController.d.ts","sourceRoot":"","sources":["../../../src/controller/MatterController.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,KAAK,EAEL,MAAM,EAEN,WAAW,EAOX,SAAS,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAInD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAsB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,oBAAoB,CAAC;AAI5B,wBAAsB,uBAAuB,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,KAAK,EAAE,KAAK,GACb,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,MAAM,WAAW,uBAAuB;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+HAA+H;IAC/H,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qGAAqG;IACrG,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAmBD,qBAAa,gBAAgB;;IAWzB,OAAa,MAAM,CACf,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,uBAAuB,EAChC,UAAU,CAAC,EAAE,gBAAgB,6BA4DhC;IAED,YAAY,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,EAO9G;IAED,UAAgB,UAAU,CACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAC1B,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,iBAwBnD;IAED,IAAI,cAAc,6BAuCjB;IAED;;;OAGG;IACG,iBAAiB,kEAOtB;IAED;;;OAGG;IACG,kBAAkB,mEAOvB;IAED;;;OAGG;IACG,gBAAgB,iEAOrB;IAED;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAErE;IAED;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAE9D;IAEK,uBAAuB,kBAgB5B;IAEK,IAAI,kBAET;IAgBD;;;;OAIG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB9D;CACJ"}
1
+ {"version":3,"file":"MatterController.d.ts","sourceRoot":"","sources":["../../../src/controller/MatterController.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,KAAK,EAEL,MAAM,EAEN,WAAW,EAOX,SAAS,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAInD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAsB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,oBAAoB,CAAC;AAI5B,wBAAsB,uBAAuB,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,KAAK,EAAE,KAAK,GACb,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,MAAM,WAAW,uBAAuB;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+HAA+H;IAC/H,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qGAAqG;IACrG,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAmBD,qBAAa,gBAAgB;;IAYzB,OAAa,MAAM,CACf,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,uBAAuB,EAChC,UAAU,CAAC,EAAE,gBAAgB,6BA4DhC;IAED,YAAY,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,EAQ9G;IAED,UAAgB,UAAU,CACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAC1B,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,iBAwBnD;IAED,IAAI,cAAc,6BAyCjB;IAED,IAAI,aAAa,IAAI,qBAAqB,CAEzC;IAED;;;OAGG;IACG,iBAAiB,kEAOtB;IAED;;;OAGG;IACG,kBAAkB,mEAOvB;IAED;;;OAGG;IACG,gBAAgB,iEAOrB;IAED;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAErE;IAED;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAE9D;IAEK,uBAAuB,kBAgB5B;IAEK,IAAI,kBAGT;IAgBD;;;;OAIG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB9D;CACJ"}
@@ -18,6 +18,7 @@ import {
18
18
  import { VendorId } from "@matter/main/types";
19
19
  import { CommissioningController } from "@project-chip/matter.js";
20
20
  import { Readable } from "node:stream";
21
+ import { BorderRouterDiscovery } from "./BorderRouterDiscovery.js";
21
22
  import { ControllerCommandHandler } from "./ControllerCommandHandler.js";
22
23
  import { LegacyDataInjector } from "./LegacyDataInjector.js";
23
24
  import { resolveServerId } from "./ServerIdResolver.js";
@@ -44,6 +45,7 @@ class MatterController {
44
45
  #legacyCommissionedDates;
45
46
  #enableTestNetDcl = false;
46
47
  #disableOtaProvider = true;
48
+ #borderRouterDiscovery;
47
49
  static async create(environment, config, options, legacyData) {
48
50
  const serverId = await resolveServerId(
49
51
  environment,
@@ -96,6 +98,7 @@ class MatterController {
96
98
  }
97
99
  constructor(environment, config, options, serverId) {
98
100
  this.#env = environment;
101
+ this.#borderRouterDiscovery = new BorderRouterDiscovery(this.#env);
99
102
  this.#config = config;
100
103
  this.#serverId = serverId;
101
104
  this.#serverVersion = options.serverVersion ?? "0.0.0";
@@ -152,6 +155,7 @@ class MatterController {
152
155
  if (!this.#disableOtaProvider && this.#enableTestNetDcl) {
153
156
  initPromises.push(this.#enableTestOtaImages());
154
157
  }
158
+ initPromises.push(this.#borderRouterDiscovery.start());
155
159
  try {
156
160
  await MatterAggregateError.allSettled(initPromises);
157
161
  } catch (error) {
@@ -161,6 +165,9 @@ class MatterController {
161
165
  }
162
166
  return this.#commandHandler;
163
167
  }
168
+ get borderRouters() {
169
+ return this.#borderRouterDiscovery;
170
+ }
164
171
  /**
165
172
  * Get the DCL vendor info service instance.
166
173
  * Lazily initializes the service if not already present.
@@ -228,6 +235,7 @@ class MatterController {
228
235
  }
229
236
  }
230
237
  async stop() {
238
+ await this.#borderRouterDiscovery.stop();
231
239
  await this.#commandHandler?.close();
232
240
  }
233
241
  /**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/controller/MatterController.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketControllerHandler.d.ts","sourceRoot":"","sources":["../../../src/server/WebSocketControllerHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAKrE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAMH,eAAe,EAMlB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA+BnD,yDAAyD;AACzD,qBAAa,0BAA2B,YAAW,gBAAgB;;IAc/D,YAAY,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAMrF;IAED;;;OAGG;IACH,MAAM;QAIE,OAAO;QACP,UAAU;MAEjB;IAoBD;;OAEG;IACH,eAAe,IAAI,eAAe,EAAE,CAEnC;IAED,gBAAgB,IAAI,IAAI,CAEvB;IAEK,QAAQ,CAAC,MAAM,EAAE,UAAU,iBAiOhC;IAED,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B1B;CAivBJ"}
1
+ {"version":3,"file":"WebSocketControllerHandler.d.ts","sourceRoot":"","sources":["../../../src/server/WebSocketControllerHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAKrE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAMH,eAAe,EAMlB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA+BnD,yDAAyD;AACzD,qBAAa,0BAA2B,YAAW,gBAAgB;;IAc/D,YAAY,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAMrF;IAED;;;OAGG;IACH,MAAM;QAIE,OAAO;QACP,UAAU;MAEjB;IAoBD;;OAEG;IACH,eAAe,IAAI,eAAe,EAAE,CAEnC;IAED,gBAAgB,IAAI,IAAI,CAEvB;IAEK,QAAQ,CAAC,MAAM,EAAE,UAAU,iBAiOhC;IAED,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B1B;CAovBJ"}
@@ -384,6 +384,9 @@ class WebSocketControllerHandler {
384
384
  case "set_thread_dataset":
385
385
  result = await this.#handleSetThreadDataset(args);
386
386
  break;
387
+ case "get_thread_border_routers":
388
+ result = this.#controller.borderRouters.list();
389
+ break;
387
390
  case "open_commissioning_window":
388
391
  result = await this.#handleOpenCommissioningWindow(args);
389
392
  break;