@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.
Files changed (71) hide show
  1. package/dist/cjs/common/Scanner.d.ts +2 -2
  2. package/dist/cjs/common/Scanner.d.ts.map +1 -1
  3. package/dist/cjs/mdns/MdnsClient.d.ts +2 -3
  4. package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -1
  5. package/dist/cjs/mdns/MdnsClient.js.map +1 -1
  6. package/dist/cjs/mdns/MdnsConsts.d.ts +0 -3
  7. package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
  8. package/dist/cjs/mdns/MdnsConsts.js +0 -6
  9. package/dist/cjs/mdns/MdnsConsts.js.map +1 -1
  10. package/dist/cjs/mdns/MdnsServer.d.ts +1 -2
  11. package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
  12. package/dist/cjs/mdns/MdnsServer.js.map +1 -1
  13. package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
  14. package/dist/cjs/mdns/MdnsService.js +1 -2
  15. package/dist/cjs/mdns/MdnsService.js.map +1 -1
  16. package/dist/cjs/mdns/index.d.ts +0 -1
  17. package/dist/cjs/mdns/index.d.ts.map +1 -1
  18. package/dist/cjs/mdns/index.js +0 -1
  19. package/dist/cjs/mdns/index.js.map +1 -1
  20. package/dist/cjs/peer/Peer.d.ts +1 -1
  21. package/dist/cjs/peer/Peer.d.ts.map +1 -1
  22. package/dist/cjs/peer/Peer.js +8 -3
  23. package/dist/cjs/peer/Peer.js.map +1 -1
  24. package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
  25. package/dist/cjs/peer/PeerSet.js +8 -4
  26. package/dist/cjs/peer/PeerSet.js.map +1 -1
  27. package/dist/esm/common/Scanner.d.ts +2 -2
  28. package/dist/esm/common/Scanner.d.ts.map +1 -1
  29. package/dist/esm/common/Scanner.js.map +1 -1
  30. package/dist/esm/mdns/MdnsClient.d.ts +2 -3
  31. package/dist/esm/mdns/MdnsClient.d.ts.map +1 -1
  32. package/dist/esm/mdns/MdnsClient.js.map +1 -1
  33. package/dist/esm/mdns/MdnsConsts.d.ts +0 -3
  34. package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
  35. package/dist/esm/mdns/MdnsConsts.js +0 -6
  36. package/dist/esm/mdns/MdnsConsts.js.map +1 -1
  37. package/dist/esm/mdns/MdnsServer.d.ts +1 -2
  38. package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
  39. package/dist/esm/mdns/MdnsServer.js.map +1 -1
  40. package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
  41. package/dist/esm/mdns/MdnsService.js +1 -1
  42. package/dist/esm/mdns/MdnsService.js.map +1 -1
  43. package/dist/esm/mdns/index.d.ts +0 -1
  44. package/dist/esm/mdns/index.d.ts.map +1 -1
  45. package/dist/esm/mdns/index.js +0 -1
  46. package/dist/esm/mdns/index.js.map +1 -1
  47. package/dist/esm/peer/Peer.d.ts +1 -1
  48. package/dist/esm/peer/Peer.d.ts.map +1 -1
  49. package/dist/esm/peer/Peer.js +16 -4
  50. package/dist/esm/peer/Peer.js.map +1 -1
  51. package/dist/esm/peer/PeerSet.d.ts.map +1 -1
  52. package/dist/esm/peer/PeerSet.js +8 -4
  53. package/dist/esm/peer/PeerSet.js.map +1 -1
  54. package/package.json +6 -6
  55. package/src/common/Scanner.ts +2 -2
  56. package/src/mdns/MdnsClient.ts +6 -6
  57. package/src/mdns/MdnsConsts.ts +0 -4
  58. package/src/mdns/MdnsServer.ts +1 -1
  59. package/src/mdns/MdnsService.ts +1 -1
  60. package/src/mdns/index.ts +0 -1
  61. package/src/peer/Peer.ts +19 -4
  62. package/src/peer/PeerSet.ts +8 -4
  63. package/dist/cjs/mdns/MdnsSocket.d.ts +0 -33
  64. package/dist/cjs/mdns/MdnsSocket.d.ts.map +0 -1
  65. package/dist/cjs/mdns/MdnsSocket.js +0 -154
  66. package/dist/cjs/mdns/MdnsSocket.js.map +0 -6
  67. package/dist/esm/mdns/MdnsSocket.d.ts +0 -33
  68. package/dist/esm/mdns/MdnsSocket.d.ts.map +0 -1
  69. package/dist/esm/mdns/MdnsSocket.js +0 -145
  70. package/dist/esm/mdns/MdnsSocket.js.map +0 -6
  71. package/src/mdns/MdnsSocket.ts +0 -201
@@ -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<Lifespan> & {
60
+ Partial<AddressLifespan> & {
61
61
  /** The device's addresses IP/port pairs */
62
62
  addresses: SA[];
63
63
  };
@@ -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 & Lifespan;
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
- Lifespan & {
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
- Lifespan & {
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> & Lifespan;
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 = {
@@ -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";
@@ -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
 
@@ -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
@@ -8,4 +8,3 @@ export * from "./MdnsClient.js";
8
8
  export * from "./MdnsConsts.js";
9
9
  export * from "./MdnsServer.js";
10
10
  export * from "./MdnsService.js";
11
- export * from "./MdnsSocket.js";
package/src/peer/Peer.ts CHANGED
@@ -5,7 +5,16 @@
5
5
  */
6
6
 
7
7
  import { BasicInformation } from "#clusters/basic-information";
8
- import { BasicMultiplex, BasicSet, Diagnostic, isIpNetworkChannel, Lifetime, Logger, MaybePromise } from "#general";
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
- await this.close();
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("Peer closed");
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)) {
@@ -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 = undefined;
300
- resolver(channel);
299
+ if (peer.activeReconnection !== undefined) {
300
+ peer.activeReconnection = undefined;
301
+ resolver(channel);
302
+ }
301
303
  })
302
304
  .catch(error => {
303
- peer.activeReconnection = undefined;
304
- rejecter(error);
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": "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",
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
- }