@matter/general 0.16.1 → 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 (98) hide show
  1. package/dist/cjs/net/ServerAddress.d.ts +52 -14
  2. package/dist/cjs/net/ServerAddress.d.ts.map +1 -1
  3. package/dist/cjs/net/ServerAddress.js +41 -6
  4. package/dist/cjs/net/ServerAddress.js.map +2 -2
  5. package/dist/cjs/net/ServerAddressSet.d.ts +65 -0
  6. package/dist/cjs/net/ServerAddressSet.d.ts.map +1 -0
  7. package/dist/cjs/net/ServerAddressSet.js +144 -0
  8. package/dist/cjs/net/ServerAddressSet.js.map +6 -0
  9. package/dist/cjs/net/dns-sd/MdnsSocket.d.ts +40 -0
  10. package/dist/cjs/net/dns-sd/MdnsSocket.d.ts.map +1 -0
  11. package/dist/cjs/net/dns-sd/MdnsSocket.js +164 -0
  12. package/dist/cjs/net/dns-sd/MdnsSocket.js.map +6 -0
  13. package/dist/cjs/net/dns-sd/index.d.ts +7 -0
  14. package/dist/cjs/net/dns-sd/index.d.ts.map +1 -0
  15. package/dist/cjs/net/dns-sd/index.js +24 -0
  16. package/dist/cjs/net/dns-sd/index.js.map +6 -0
  17. package/dist/cjs/net/index.d.ts +2 -0
  18. package/dist/cjs/net/index.d.ts.map +1 -1
  19. package/dist/cjs/net/index.js +2 -0
  20. package/dist/cjs/net/index.js.map +1 -1
  21. package/dist/cjs/util/Abort.d.ts +9 -0
  22. package/dist/cjs/util/Abort.d.ts.map +1 -1
  23. package/dist/cjs/util/Abort.js +20 -0
  24. package/dist/cjs/util/Abort.js.map +1 -1
  25. package/dist/cjs/util/Heap.d.ts +84 -0
  26. package/dist/cjs/util/Heap.d.ts.map +1 -0
  27. package/dist/cjs/util/Heap.js +286 -0
  28. package/dist/cjs/util/Heap.js.map +6 -0
  29. package/dist/cjs/util/Observable.d.ts +29 -6
  30. package/dist/cjs/util/Observable.d.ts.map +1 -1
  31. package/dist/cjs/util/Observable.js +40 -6
  32. package/dist/cjs/util/Observable.js.map +1 -1
  33. package/dist/cjs/util/Promises.d.ts +3 -0
  34. package/dist/cjs/util/Promises.d.ts.map +1 -1
  35. package/dist/cjs/util/Promises.js +33 -3
  36. package/dist/cjs/util/Promises.js.map +2 -2
  37. package/dist/cjs/util/Set.d.ts.map +1 -1
  38. package/dist/cjs/util/Set.js +14 -8
  39. package/dist/cjs/util/Set.js.map +1 -1
  40. package/dist/cjs/util/index.d.ts +1 -0
  41. package/dist/cjs/util/index.d.ts.map +1 -1
  42. package/dist/cjs/util/index.js +1 -0
  43. package/dist/cjs/util/index.js.map +1 -1
  44. package/dist/esm/net/ServerAddress.d.ts +52 -14
  45. package/dist/esm/net/ServerAddress.d.ts.map +1 -1
  46. package/dist/esm/net/ServerAddress.js +41 -6
  47. package/dist/esm/net/ServerAddress.js.map +2 -2
  48. package/dist/esm/net/ServerAddressSet.d.ts +65 -0
  49. package/dist/esm/net/ServerAddressSet.d.ts.map +1 -0
  50. package/dist/esm/net/ServerAddressSet.js +124 -0
  51. package/dist/esm/net/ServerAddressSet.js.map +6 -0
  52. package/dist/esm/net/dns-sd/MdnsSocket.d.ts +40 -0
  53. package/dist/esm/net/dns-sd/MdnsSocket.d.ts.map +1 -0
  54. package/dist/esm/net/dns-sd/MdnsSocket.js +149 -0
  55. package/dist/esm/net/dns-sd/MdnsSocket.js.map +6 -0
  56. package/dist/esm/net/dns-sd/index.d.ts +7 -0
  57. package/dist/esm/net/dns-sd/index.d.ts.map +1 -0
  58. package/dist/esm/net/dns-sd/index.js +7 -0
  59. package/dist/esm/net/dns-sd/index.js.map +6 -0
  60. package/dist/esm/net/index.d.ts +2 -0
  61. package/dist/esm/net/index.d.ts.map +1 -1
  62. package/dist/esm/net/index.js +2 -0
  63. package/dist/esm/net/index.js.map +1 -1
  64. package/dist/esm/util/Abort.d.ts +9 -0
  65. package/dist/esm/util/Abort.d.ts.map +1 -1
  66. package/dist/esm/util/Abort.js +20 -0
  67. package/dist/esm/util/Abort.js.map +1 -1
  68. package/dist/esm/util/Heap.d.ts +84 -0
  69. package/dist/esm/util/Heap.d.ts.map +1 -0
  70. package/dist/esm/util/Heap.js +266 -0
  71. package/dist/esm/util/Heap.js.map +6 -0
  72. package/dist/esm/util/Observable.d.ts +29 -6
  73. package/dist/esm/util/Observable.d.ts.map +1 -1
  74. package/dist/esm/util/Observable.js +40 -6
  75. package/dist/esm/util/Observable.js.map +1 -1
  76. package/dist/esm/util/Promises.d.ts +3 -0
  77. package/dist/esm/util/Promises.d.ts.map +1 -1
  78. package/dist/esm/util/Promises.js +33 -3
  79. package/dist/esm/util/Promises.js.map +2 -2
  80. package/dist/esm/util/Set.d.ts.map +1 -1
  81. package/dist/esm/util/Set.js +14 -8
  82. package/dist/esm/util/Set.js.map +1 -1
  83. package/dist/esm/util/index.d.ts +1 -0
  84. package/dist/esm/util/index.d.ts.map +1 -1
  85. package/dist/esm/util/index.js +1 -0
  86. package/dist/esm/util/index.js.map +1 -1
  87. package/package.json +2 -2
  88. package/src/net/ServerAddress.ts +93 -19
  89. package/src/net/ServerAddressSet.ts +225 -0
  90. package/src/net/dns-sd/MdnsSocket.ts +203 -0
  91. package/src/net/dns-sd/index.ts +7 -0
  92. package/src/net/index.ts +2 -0
  93. package/src/util/Abort.ts +25 -0
  94. package/src/util/Heap.ts +332 -0
  95. package/src/util/Observable.ts +74 -10
  96. package/src/util/Promises.ts +61 -4
  97. package/src/util/Set.ts +15 -8
  98. package/src/util/index.ts +1 -0
@@ -6,35 +6,73 @@
6
6
  import { Diagnostic } from "#log/Diagnostic.js";
7
7
  import { Duration } from "#time/Duration.js";
8
8
  import { Timestamp } from "#time/Timestamp.js";
9
+ export interface AddressLifespan {
10
+ /**
11
+ * Beginning of lifespan
12
+ */
13
+ discoveredAt: Timestamp;
14
+ /**
15
+ * Length of lifespan, if known
16
+ */
17
+ ttl: Duration;
18
+ }
19
+ export interface AddressStatus extends Partial<AddressLifespan> {
20
+ /**
21
+ * Time of last successful access.
22
+ */
23
+ healthyAt?: Timestamp;
24
+ /**
25
+ * Time of last unsuccessful access.
26
+ */
27
+ unhealthyAt?: Timestamp;
28
+ /**
29
+ * DNS priority.
30
+ */
31
+ priority?: number;
32
+ /**
33
+ * DNS weight.
34
+ */
35
+ weight?: number;
36
+ }
9
37
  export type ServerAddressUdp = {
10
38
  type: "udp";
11
39
  ip: string;
12
40
  port: number;
13
- };
41
+ } & AddressStatus;
14
42
  export type ServerAddressTcp = {
15
43
  type: "tcp";
16
44
  ip: string;
17
45
  port: number;
18
- };
46
+ } & AddressStatus;
19
47
  export type ServerAddressBle = {
20
48
  type: "ble";
21
49
  peripheralAddress: string;
22
- };
23
- export interface Lifespan {
24
- /** Beginning of lifespan (system time in milliseconds) */
25
- discoveredAt: Timestamp;
26
- /** Length of lifespan, if known (seconds) */
27
- ttl: Duration;
28
- }
29
- export type ServerAddress = (ServerAddressUdp | ServerAddressTcp | ServerAddressBle) & Partial<Lifespan>;
30
- export declare function ServerAddress(definition: ServerAddress.Definition): ServerAddress;
50
+ } & AddressStatus;
51
+ export type ServerAddress = ServerAddressUdp | ServerAddressTcp | ServerAddressBle;
52
+ export declare function ServerAddress(definition: ServerAddress): ServerAddress;
31
53
  export declare namespace ServerAddress {
32
54
  function urlFor(address: ServerAddress): string;
33
55
  function diagnosticFor(address: ServerAddress): Diagnostic;
34
56
  function isEqual(a: ServerAddress, b: ServerAddress): boolean;
35
- function definitionOf(address: ServerAddress): Definition;
36
- interface Definition extends Omit<ServerAddress, "ttl"> {
37
- ttl?: Duration;
57
+ /**
58
+ * Compute logical health of an address.
59
+ *
60
+ * This returns heathyAt/unhealthyAt values with unhealthyAt set to undefined if the address was more recently
61
+ * healthy.
62
+ */
63
+ function healthOf(health: AddressStatus): AddressStatus;
64
+ /**
65
+ * Network address desirability from a Matter communication perspective.
66
+ *
67
+ * Lower values indicate higher preference. This is not a standard "happy eyeballs" ranking but works similarly.
68
+ */
69
+ enum SelectionPreference {
70
+ IPV6_ULA = 0,
71
+ IPV6_LINK_LOCAL = 1,
72
+ IPV6 = 2,
73
+ IPV4 = 3,
74
+ NOT_IP = 3
38
75
  }
76
+ function selectionPreferenceOf(address: ServerAddress): SelectionPreference;
39
77
  }
40
78
  //# sourceMappingURL=ServerAddress.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServerAddress.d.ts","sourceRoot":"","sources":["../../../src/net/ServerAddress.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,WAAW,QAAQ;IACrB,0DAA0D;IAC1D,YAAY,EAAE,SAAS,CAAC;IAExB,6CAA6C;IAC7C,GAAG,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEzG,wBAAgB,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,UAAU,GAKzD,aAAa,CACrB;AAED,yBAAiB,aAAa,CAAC;IAC3B,SAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAYrD;IAED,SAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,cAuBnD;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAcnE;IAED,SAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,UAAU,CAE/D;IAED,UAAiB,UAAW,SAAQ,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;QAC1D,GAAG,CAAC,EAAE,QAAQ,CAAC;KAClB;CACJ"}
1
+ {"version":3,"file":"ServerAddress.d.ts","sourceRoot":"","sources":["../../../src/net/ServerAddress.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC5B;;OAEG;IACH,YAAY,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,GAAG,EAAE,QAAQ,CAAC;CACjB;AAED,MAAM,WAAW,aAAc,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC3D;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;OAEG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,EAAE,KAAK,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;CAC7B,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAEnF,wBAAgB,aAAa,CAAC,UAAU,EAAE,aAAa,GAS9C,aAAa,CACrB;AAED,yBAAiB,aAAa,CAAC;IAC3B,SAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAYrD;IAED,SAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,cAuBnD;IAED,SAAgB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAcnE;IAED;;;;;OAKG;IACH,SAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAY7D;IAED;;;;OAIG;IACH,KAAY,mBAAmB;QAC3B,QAAQ,IAAA;QACR,eAAe,IAAA;QACf,IAAI,IAAA;QACJ,IAAI,IAAA;QACJ,MAAM,IAAI;KACb;IAED,SAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,uBAkB3D;CACJ"}
@@ -23,7 +23,6 @@ __export(ServerAddress_exports, {
23
23
  module.exports = __toCommonJS(ServerAddress_exports);
24
24
  var import_Diagnostic = require("#log/Diagnostic.js");
25
25
  var import_Duration = require("#time/Duration.js");
26
- var import_TimeUnit = require("#time/TimeUnit.js");
27
26
  /**
28
27
  * @license
29
28
  * Copyright 2022-2026 Matter.js Authors
@@ -31,9 +30,13 @@ var import_TimeUnit = require("#time/TimeUnit.js");
31
30
  */
32
31
  function ServerAddress(definition) {
33
32
  return {
33
+ ttl: void 0,
34
34
  discoveredAt: void 0,
35
- ...definition,
36
- ttl: (0, import_TimeUnit.Seconds)(definition.ttl)
35
+ healthyAt: void 0,
36
+ unhealthyAt: void 0,
37
+ priority: void 0,
38
+ weight: void 0,
39
+ ...definition
37
40
  };
38
41
  }
39
42
  ((ServerAddress2) => {
@@ -82,9 +85,41 @@ function ServerAddress(definition) {
82
85
  return false;
83
86
  }
84
87
  ServerAddress2.isEqual = isEqual;
85
- function definitionOf(address) {
86
- return address;
88
+ function healthOf(health) {
89
+ if (health.unhealthyAt === void 0) {
90
+ return health;
91
+ }
92
+ if (health.healthyAt !== void 0 && health.healthyAt > health.unhealthyAt) {
93
+ return {
94
+ healthyAt: health.healthyAt
95
+ };
96
+ }
97
+ return health;
98
+ }
99
+ ServerAddress2.healthOf = healthOf;
100
+ let SelectionPreference;
101
+ ((SelectionPreference2) => {
102
+ SelectionPreference2[SelectionPreference2["IPV6_ULA"] = 0] = "IPV6_ULA";
103
+ SelectionPreference2[SelectionPreference2["IPV6_LINK_LOCAL"] = 1] = "IPV6_LINK_LOCAL";
104
+ SelectionPreference2[SelectionPreference2["IPV6"] = 2] = "IPV6";
105
+ SelectionPreference2[SelectionPreference2["IPV4"] = 3] = "IPV4";
106
+ SelectionPreference2[SelectionPreference2["NOT_IP"] = 3] = "NOT_IP";
107
+ })(SelectionPreference = ServerAddress2.SelectionPreference || (ServerAddress2.SelectionPreference = {}));
108
+ function selectionPreferenceOf(address) {
109
+ if (!("ip" in address)) {
110
+ return 3 /* NOT_IP */;
111
+ }
112
+ if (address.ip.startsWith("fd")) {
113
+ return 0 /* IPV6_ULA */;
114
+ }
115
+ if (address.ip.startsWith("fe00")) {
116
+ return 1 /* IPV6_LINK_LOCAL */;
117
+ }
118
+ if (address.ip.includes(":")) {
119
+ return 2 /* IPV6 */;
120
+ }
121
+ return 3 /* IPV4 */;
87
122
  }
88
- ServerAddress2.definitionOf = definitionOf;
123
+ ServerAddress2.selectionPreferenceOf = selectionPreferenceOf;
89
124
  })(ServerAddress || (ServerAddress = {}));
90
125
  //# sourceMappingURL=ServerAddress.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/net/ServerAddress.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,wBAA2B;AAC3B,sBAAyB;AAEzB,sBAAwB;AATxB;AAAA;AAAA;AAAA;AAAA;AAsCO,SAAS,cAAc,YAAsC;AAChE,SAAO;AAAA,IACH,cAAc;AAAA,IACd,GAAG;AAAA,IACH,SAAK,yBAAQ,WAAW,GAAG;AAAA,EAC/B;AACJ;AAAA,CAEO,CAAUA,mBAAV;AACI,WAAS,OAAO,SAAgC;AACnD,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AACD,eAAO,GAAG,QAAQ,IAAI,MAAM,QAAQ,EAAE,IAAI,QAAQ,IAAI;AAAA,MAE1D,KAAK;AACD,eAAO,SAAS,QAAQ,iBAAiB;AAAA,MAE7C;AACI,eAAO,GAAI,QAAgB,IAAI;AAAA,IACvC;AAAA,EACJ;AAZO,EAAAA,eAAS;AAcT,WAAS,cAAc,SAAwB;AAClD,UAAM,aAAa,MAAe;AAElC,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AACD,mBAAW,KAAK,GAAG,QAAQ,IAAI,OAAO,6BAAW,OAAO,QAAQ,EAAE,GAAG,KAAK,QAAQ,IAAI;AACtF;AAAA,MAEJ,KAAK;AACD,mBAAW,KAAK,UAAU,6BAAW,OAAO,QAAQ,iBAAiB,CAAC;AACtE;AAAA,MAEJ;AACI,mBAAW,KAAK,GAAI,QAAgB,IAAI,KAAK;AAC7C;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,UAAU;AACrD,iBAAW,KAAK,SAAS,yBAAS,OAAO,QAAQ,GAAG,CAAC;AAAA,IACzD;AAEA,WAAO,6BAAW,OAAO,GAAG,UAAU;AAAA,EAC1C;AAvBO,EAAAA,eAAS;AAyBT,WAAS,QAAQ,GAAkB,GAA2B;AACjE,QAAI,EAAE,SAAS,EAAE,MAAM;AACnB,aAAO;AAAA,IACX;AAEA,QAAI,EAAE,SAAS,SAAS,EAAE,SAAS,OAAO;AACtC,aAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;AAAA,IACzC;AAEA,QAAI,EAAE,SAAS,SAAS,EAAE,SAAS,OAAO;AACtC,aAAO,EAAE,sBAAsB,EAAE;AAAA,IACrC;AAEA,WAAO;AAAA,EACX;AAdO,EAAAA,eAAS;AAgBT,WAAS,aAAa,SAAoC;AAC7D,WAAO;AAAA,EACX;AAFO,EAAAA,eAAS;AAAA,GAxDH;",
5
- "names": ["ServerAddress"]
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,wBAA2B;AAC3B,sBAAyB;AAPzB;AAAA;AAAA;AAAA;AAAA;AA+DO,SAAS,cAAc,YAA2B;AACrD,SAAO;AAAA,IACH,KAAK;AAAA,IACL,cAAc;AAAA,IACd,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,GAAG;AAAA,EACP;AACJ;AAAA,CAEO,CAAUA,mBAAV;AACI,WAAS,OAAO,SAAgC;AACnD,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AACD,eAAO,GAAG,QAAQ,IAAI,MAAM,QAAQ,EAAE,IAAI,QAAQ,IAAI;AAAA,MAE1D,KAAK;AACD,eAAO,SAAS,QAAQ,iBAAiB;AAAA,MAE7C;AACI,eAAO,GAAI,QAAgB,IAAI;AAAA,IACvC;AAAA,EACJ;AAZO,EAAAA,eAAS;AAcT,WAAS,cAAc,SAAwB;AAClD,UAAM,aAAa,MAAe;AAElC,YAAQ,QAAQ,MAAM;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AACD,mBAAW,KAAK,GAAG,QAAQ,IAAI,OAAO,6BAAW,OAAO,QAAQ,EAAE,GAAG,KAAK,QAAQ,IAAI;AACtF;AAAA,MAEJ,KAAK;AACD,mBAAW,KAAK,UAAU,6BAAW,OAAO,QAAQ,iBAAiB,CAAC;AACtE;AAAA,MAEJ;AACI,mBAAW,KAAK,GAAI,QAAgB,IAAI,KAAK;AAC7C;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,OAAO,QAAQ,QAAQ,UAAU;AACrD,iBAAW,KAAK,SAAS,yBAAS,OAAO,QAAQ,GAAG,CAAC;AAAA,IACzD;AAEA,WAAO,6BAAW,OAAO,GAAG,UAAU;AAAA,EAC1C;AAvBO,EAAAA,eAAS;AAyBT,WAAS,QAAQ,GAAkB,GAA2B;AACjE,QAAI,EAAE,SAAS,EAAE,MAAM;AACnB,aAAO;AAAA,IACX;AAEA,QAAI,EAAE,SAAS,SAAS,EAAE,SAAS,OAAO;AACtC,aAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;AAAA,IACzC;AAEA,QAAI,EAAE,SAAS,SAAS,EAAE,SAAS,OAAO;AACtC,aAAO,EAAE,sBAAsB,EAAE;AAAA,IACrC;AAEA,WAAO;AAAA,EACX;AAdO,EAAAA,eAAS;AAsBT,WAAS,SAAS,QAAsC;AAC3D,QAAI,OAAO,gBAAgB,QAAW;AAClC,aAAO;AAAA,IACX;AAEA,QAAI,OAAO,cAAc,UAAa,OAAO,YAAY,OAAO,aAAa;AACzE,aAAO;AAAA,QACH,WAAW,OAAO;AAAA,MACtB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAZO,EAAAA,eAAS;AAmBT,MAAK;AAAL,IAAKC,yBAAL;AACH,IAAAA,0CAAA;AACA,IAAAA,0CAAA;AACA,IAAAA,0CAAA;AACA,IAAAA,0CAAA;AACA,IAAAA,0CAAA,YAAS,KAAT;AAAA,KALQ,sBAAAD,eAAA,wBAAAA,eAAA;AAQL,WAAS,sBAAsB,SAAwB;AAC1D,QAAI,EAAE,QAAQ,UAAU;AACpB,aAAO;AAAA,IACX;AAEA,QAAI,QAAQ,GAAG,WAAW,IAAI,GAAG;AAC7B,aAAO;AAAA,IACX;AAEA,QAAI,QAAQ,GAAG,WAAW,MAAM,GAAG;AAC/B,aAAO;AAAA,IACX;AAEA,QAAI,QAAQ,GAAG,SAAS,GAAG,GAAG;AAC1B,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAlBO,EAAAA,eAAS;AAAA,GAzFH;",
5
+ "names": ["ServerAddress", "SelectionPreference"]
6
6
  }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AddressStatus, ServerAddress } from "./ServerAddress.js";
7
+ /**
8
+ * A set of server addresses ordered by a comparator.
9
+ */
10
+ export interface ServerAddressSet<T extends ServerAddress> {
11
+ /**
12
+ * Add an address.
13
+ *
14
+ * If the address alreay exists, returns the existing address to facilitate comparison by value. If not, returns
15
+ * the input address.
16
+ */
17
+ add(address: T): T;
18
+ /**
19
+ * Delete an address.
20
+ */
21
+ delete(address: T): boolean;
22
+ /**
23
+ * Replace the stored addresses.
24
+ */
25
+ replace(newAddresses: Iterable<T>): void;
26
+ /**
27
+ * Test for existence of address.
28
+ */
29
+ has(address: T): boolean;
30
+ /**
31
+ * The number of addresses.
32
+ */
33
+ size: number;
34
+ /**
35
+ * Iterate.
36
+ *
37
+ * If you replace addresses during iteration only addresses not already produced will be covered by remaining
38
+ * iterations.
39
+ */
40
+ [Symbol.iterator](): Iterator<T>;
41
+ }
42
+ /**
43
+ * Create a new {@link ServerAddressSet}.
44
+ */
45
+ export declare function ServerAddressSet<T extends ServerAddress>(initial?: Iterable<T>, comparator?: typeof ServerAddressSet.compareDesirability): ServerAddressSet<T>;
46
+ export declare namespace ServerAddressSet {
47
+ interface Comparator<T extends ServerAddress = ServerAddress> {
48
+ (addr1: T, addr2: T): number;
49
+ }
50
+ /**
51
+ * Update a list of addresses with health information from another list.
52
+ */
53
+ function copyHealth<T extends ServerAddress>(targetAddresses: Iterable<T>, sourceAddresses: Iterable<T>): T[];
54
+ /**
55
+ * Compare the "desirability" of two addresses for communication.
56
+ */
57
+ function compareDesirability(a: ServerAddress, b: ServerAddress): number;
58
+ /**
59
+ * Compare the health of two addresses.
60
+ *
61
+ * Returns a negative number if a is healthier, positive if b is healthier and 0 if assessment is neutral.
62
+ */
63
+ function compareHealth(a: AddressStatus, b: AddressStatus): number;
64
+ }
65
+ //# sourceMappingURL=ServerAddressSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerAddressSet.d.ts","sourceRoot":"","sources":["../../../src/net/ServerAddressSet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,aAAa;IACrD;;;;;OAKG;IACH,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;IAEzB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;OAKG;IACH,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,aAAa,EACpD,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,UAAU,8CAAuC,uBA+EpD;AAED,yBAAiB,gBAAgB,CAAC;IAC9B,UAAiB,UAAU,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;QAC/D,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;KAChC;IAED;;OAEG;IACH,SAAgB,UAAU,CAAC,CAAC,SAAS,aAAa,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,OAgB7G;IAED;;OAEG;IACH,SAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,UAmBrE;IAED;;;;OAIG;IACH,SAAgB,aAAa,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,UAiC/D;CACJ"}
@@ -0,0 +1,144 @@
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 ServerAddressSet_exports = {};
20
+ __export(ServerAddressSet_exports, {
21
+ ServerAddressSet: () => ServerAddressSet
22
+ });
23
+ module.exports = __toCommonJS(ServerAddressSet_exports);
24
+ var import_ServerAddress = require("./ServerAddress.js");
25
+ /**
26
+ * @license
27
+ * Copyright 2022-2026 Matter.js Authors
28
+ * SPDX-License-Identifier: Apache-2.0
29
+ */
30
+ function ServerAddressSet(initial, comparator = ServerAddressSet.compareDesirability) {
31
+ let version = 0;
32
+ let addresses;
33
+ const set = {
34
+ add(address) {
35
+ version++;
36
+ const key = import_ServerAddress.ServerAddress.urlFor(address);
37
+ const existing = addresses?.get(key);
38
+ if (existing) {
39
+ return existing;
40
+ }
41
+ if (!addresses) {
42
+ addresses = /* @__PURE__ */ new Map();
43
+ }
44
+ addresses.set(key, address);
45
+ return address;
46
+ },
47
+ delete(address) {
48
+ version++;
49
+ return addresses?.delete(import_ServerAddress.ServerAddress.urlFor(address)) ?? false;
50
+ },
51
+ has(address) {
52
+ return addresses?.has(import_ServerAddress.ServerAddress.urlFor(address)) ?? false;
53
+ },
54
+ replace(newAddresses) {
55
+ version++;
56
+ const oldAddresses = addresses;
57
+ addresses = /* @__PURE__ */ new Map();
58
+ for (const address of newAddresses) {
59
+ const key = import_ServerAddress.ServerAddress.urlFor(address);
60
+ addresses.set(key, oldAddresses?.get(key) ?? address);
61
+ }
62
+ },
63
+ get size() {
64
+ return addresses?.size ?? 0;
65
+ },
66
+ *[Symbol.iterator]() {
67
+ const tried = /* @__PURE__ */ new Set();
68
+ all: while (true) {
69
+ const currentVersion = version;
70
+ const ordered = addresses ? [...addresses.entries()].map(([, address]) => address).sort(comparator) : [];
71
+ for (const address of ordered) {
72
+ const key = import_ServerAddress.ServerAddress.urlFor(address);
73
+ if (tried.has(key)) {
74
+ continue;
75
+ }
76
+ yield address;
77
+ if (currentVersion !== version) {
78
+ continue all;
79
+ }
80
+ }
81
+ break;
82
+ }
83
+ }
84
+ };
85
+ if (initial) {
86
+ set.replace(initial);
87
+ }
88
+ return set;
89
+ }
90
+ ((ServerAddressSet2) => {
91
+ function copyHealth(targetAddresses, sourceAddresses) {
92
+ const output = [...targetAddresses];
93
+ nextTarget: for (let i = 0; i < output.length; i++) {
94
+ const target = output[i];
95
+ for (const source of sourceAddresses) {
96
+ if (import_ServerAddress.ServerAddress.isEqual(target, source)) {
97
+ if (source.healthyAt !== void 0 || source.unhealthyAt !== void 0) {
98
+ output[i] = { ...target, healthyAt: source.healthyAt, unhealthyAt: source.unhealthyAt };
99
+ }
100
+ continue nextTarget;
101
+ }
102
+ }
103
+ }
104
+ return output;
105
+ }
106
+ ServerAddressSet2.copyHealth = copyHealth;
107
+ function compareDesirability(a, b) {
108
+ const value = import_ServerAddress.ServerAddress.selectionPreferenceOf(a) - import_ServerAddress.ServerAddress.selectionPreferenceOf(b);
109
+ if (value) {
110
+ return value;
111
+ }
112
+ const relativeHealth = compareHealth(a, b);
113
+ if (relativeHealth) {
114
+ return relativeHealth;
115
+ }
116
+ if (a.priority !== void 0 && b.priority !== void 0) {
117
+ return b.priority - a.priority;
118
+ }
119
+ return 0;
120
+ }
121
+ ServerAddressSet2.compareDesirability = compareDesirability;
122
+ function compareHealth(a, b) {
123
+ const ha = import_ServerAddress.ServerAddress.healthOf(a);
124
+ const hb = import_ServerAddress.ServerAddress.healthOf(b);
125
+ if (ha.unhealthyAt) {
126
+ if (hb.unhealthyAt) {
127
+ return ha.unhealthyAt - hb.unhealthyAt;
128
+ }
129
+ return 1;
130
+ }
131
+ if (hb.unhealthyAt) {
132
+ return -1;
133
+ }
134
+ if (ha.healthyAt) {
135
+ if (hb.healthyAt) {
136
+ return hb.healthyAt - ha.healthyAt;
137
+ }
138
+ return -1;
139
+ }
140
+ return 0;
141
+ }
142
+ ServerAddressSet2.compareHealth = compareHealth;
143
+ })(ServerAddressSet || (ServerAddressSet = {}));
144
+ //# sourceMappingURL=ServerAddressSet.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/net/ServerAddressSet.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,2BAA6C;AAN7C;AAAA;AAAA;AAAA;AAAA;AAoDO,SAAS,iBACZ,SACA,aAAa,iBAAiB,qBAChC;AACE,MAAI,UAAU;AACd,MAAI;AAEJ,QAAM,MAA2B;AAAA,IAC7B,IAAI,SAAY;AACZ;AACA,YAAM,MAAM,mCAAc,OAAO,OAAO;AACxC,YAAM,WAAW,WAAW,IAAI,GAAG;AACnC,UAAI,UAAU;AACV,eAAO;AAAA,MACX;AAEA,UAAI,CAAC,WAAW;AACZ,oBAAY,oBAAI,IAAI;AAAA,MACxB;AAEA,gBAAU,IAAI,KAAK,OAAO;AAC1B,aAAO;AAAA,IACX;AAAA,IAEA,OAAO,SAAY;AACf;AACA,aAAO,WAAW,OAAO,mCAAc,OAAO,OAAO,CAAC,KAAK;AAAA,IAC/D;AAAA,IAEA,IAAI,SAAY;AACZ,aAAO,WAAW,IAAI,mCAAc,OAAO,OAAO,CAAC,KAAK;AAAA,IAC5D;AAAA,IAEA,QAAQ,cAAc;AAClB;AACA,YAAM,eAAe;AACrB,kBAAY,oBAAI,IAAI;AACpB,iBAAW,WAAW,cAAc;AAChC,cAAM,MAAM,mCAAc,OAAO,OAAO;AACxC,kBAAU,IAAI,KAAK,cAAc,IAAI,GAAG,KAAK,OAAO;AAAA,MACxD;AAAA,IACJ;AAAA,IAEA,IAAI,OAAO;AACP,aAAO,WAAW,QAAQ;AAAA,IAC9B;AAAA,IAEA,EAAE,OAAO,QAAQ,IAAI;AACjB,YAAM,QAAQ,oBAAI,IAAY;AAE9B,UAAK,QAAO,MAAM;AACd,cAAM,iBAAiB;AACvB,cAAM,UAAU,YACV,CAAC,GAAG,UAAU,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,MAAM,OAAO,EAAE,KAAK,UAAU,IACtE,CAAC;AAEP,mBAAW,WAAW,SAAS;AAE3B,gBAAM,MAAM,mCAAc,OAAO,OAAO;AACxC,cAAI,MAAM,IAAI,GAAG,GAAG;AAChB;AAAA,UACJ;AAEA,gBAAM;AAGN,cAAI,mBAAmB,SAAS;AAC5B,qBAAS;AAAA,UACb;AAAA,QACJ;AAEA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,SAAS;AACT,QAAI,QAAQ,OAAO;AAAA,EACvB;AAEA,SAAO;AACX;AAAA,CAEO,CAAUA,sBAAV;AAQI,WAAS,WAAoC,iBAA8B,iBAA8B;AAC5G,UAAM,SAAS,CAAC,GAAG,eAAe;AAElC,eAAY,UAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AAChD,YAAM,SAAS,OAAO,CAAC;AACvB,iBAAW,UAAU,iBAAiB;AAClC,YAAI,mCAAc,QAAQ,QAAQ,MAAM,GAAG;AACvC,cAAI,OAAO,cAAc,UAAa,OAAO,gBAAgB,QAAW;AACpE,mBAAO,CAAC,IAAI,EAAE,GAAG,QAAQ,WAAW,OAAO,WAAW,aAAa,OAAO,YAAY;AAAA,UAC1F;AACA,mBAAS;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAhBO,EAAAA,kBAAS;AAqBT,WAAS,oBAAoB,GAAkB,GAAkB;AACpE,UAAM,QAAQ,mCAAc,sBAAsB,CAAC,IAAI,mCAAc,sBAAsB,CAAC;AAE5F,QAAI,OAAO;AACP,aAAO;AAAA,IACX;AAGA,UAAM,iBAAiB,cAAc,GAAG,CAAC;AACzC,QAAI,gBAAgB;AAChB,aAAO;AAAA,IACX;AAGA,QAAI,EAAE,aAAa,UAAa,EAAE,aAAa,QAAW;AACtD,aAAO,EAAE,WAAW,EAAE;AAAA,IAC1B;AAEA,WAAO;AAAA,EACX;AAnBO,EAAAA,kBAAS;AA0BT,WAAS,cAAc,GAAkB,GAAkB;AAC9D,UAAM,KAAK,mCAAc,SAAS,CAAC;AACnC,UAAM,KAAK,mCAAc,SAAS,CAAC;AAGnC,QAAI,GAAG,aAAa;AAChB,UAAI,GAAG,aAAa;AAEhB,eAAO,GAAG,cAAc,GAAG;AAAA,MAC/B;AAGA,aAAO;AAAA,IACX;AAGA,QAAI,GAAG,aAAa;AAChB,aAAO;AAAA,IACX;AAGA,QAAI,GAAG,WAAW;AACd,UAAI,GAAG,WAAW;AAEd,eAAO,GAAG,YAAY,GAAG;AAAA,MAC7B;AAGA,aAAO;AAAA,IACX;AAGA,WAAO;AAAA,EACX;AAjCO,EAAAA,kBAAS;AAAA,GAvDH;",
5
+ "names": ["ServerAddressSet"]
6
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { DnsMessage, DnsMessageType } from "#codec/DnsCodec.js";
7
+ import { Network } from "#net/Network.js";
8
+ import { UdpMulticastServer } from "#net/udp/UdpMulticastServer.js";
9
+ import { Lifetime } from "#util/Lifetime.js";
10
+ import { AsyncObservable } from "#util/Observable.js";
11
+ /**
12
+ * Manages the UDP socket for other components that implement MDNS logic.
13
+ */
14
+ export declare class MdnsSocket {
15
+ #private;
16
+ static create(network: Network, options?: {
17
+ enableIpv4?: boolean;
18
+ netInterface?: string;
19
+ lifetime?: Lifetime.Owner;
20
+ }): Promise<MdnsSocket>;
21
+ constructor(socket: UdpMulticastServer);
22
+ get network(): Network;
23
+ get supportsIpv4(): boolean;
24
+ get netInterface(): string | undefined;
25
+ get receipt(): AsyncObservable<[message: MdnsSocket.Message], void>;
26
+ send(message: Partial<DnsMessage> & {
27
+ messageType: DnsMessageType;
28
+ }, intf?: string, unicastDest?: string): Promise<void>;
29
+ close(): Promise<void>;
30
+ }
31
+ export declare namespace MdnsSocket {
32
+ interface Message extends DnsMessage {
33
+ sourceIp: string;
34
+ sourceIntf: string;
35
+ }
36
+ const BROADCAST_IPV4 = "224.0.0.251";
37
+ const BROADCAST_IPV6 = "ff02::fb";
38
+ const BROADCAST_PORT = 5353;
39
+ }
40
+ //# sourceMappingURL=MdnsSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MdnsSocket.d.ts","sourceRoot":"","sources":["../../../../src/net/dns-sd/MdnsSocket.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEH,UAAU,EAEV,cAAc,EAGjB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AAKvE;;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;IAEM,MAAM,cAAc,gBAAgB,CAAC;IACrC,MAAM,cAAc,aAAa,CAAC;IAClC,MAAM,cAAc,OAAO,CAAC;CACtC"}
@@ -0,0 +1,164 @@
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_DnsCodec = require("#codec/DnsCodec.js");
25
+ var import_Diagnostic = require("#log/Diagnostic.js");
26
+ var import_Logger = require("#log/Logger.js");
27
+ var import_MatterError = require("#MatterError.js");
28
+ var import_UdpMulticastServer = require("#net/udp/UdpMulticastServer.js");
29
+ var import_Observable = require("#util/Observable.js");
30
+ var import_Promises = require("#util/Promises.js");
31
+ /**
32
+ * @license
33
+ * Copyright 2022-2026 Matter.js Authors
34
+ * SPDX-License-Identifier: Apache-2.0
35
+ */
36
+ const logger = import_Logger.Logger.get("MdnsListener");
37
+ class MdnsSocket {
38
+ #socket;
39
+ #handlers;
40
+ #isClosed = false;
41
+ #receipt = new import_Observable.BasicObservable(
42
+ (error) => logger.error("Unhandled error in MDNS listener", error),
43
+ true
44
+ );
45
+ static async create(network, options) {
46
+ const { enableIpv4 = true, netInterface, lifetime } = options ?? {};
47
+ const socket = new MdnsSocket(
48
+ await import_UdpMulticastServer.UdpMulticastServer.create({
49
+ lifetime,
50
+ network,
51
+ netInterface,
52
+ broadcastAddressIpv4: enableIpv4 ? MdnsSocket.BROADCAST_IPV4 : void 0,
53
+ broadcastAddressIpv6: MdnsSocket.BROADCAST_IPV6,
54
+ listeningPort: MdnsSocket.BROADCAST_PORT
55
+ })
56
+ );
57
+ return socket;
58
+ }
59
+ constructor(socket) {
60
+ this.#socket = socket;
61
+ socket.onMessage(this.#handleMessage.bind(this));
62
+ }
63
+ get network() {
64
+ return this.#socket.network;
65
+ }
66
+ get supportsIpv4() {
67
+ return this.#socket.supportsIpv4;
68
+ }
69
+ get netInterface() {
70
+ return this.#socket.netInterface;
71
+ }
72
+ get receipt() {
73
+ return this.#receipt;
74
+ }
75
+ async send(message, intf, unicastDest) {
76
+ const { messageType } = message;
77
+ const truncatedMessageType = import_DnsCodec.DnsMessageType.isQuery(messageType) ? messageType | import_DnsCodec.DnsMessageTypeFlag.TC : messageType;
78
+ const chunk = {
79
+ transactionId: 0,
80
+ queries: [],
81
+ authorities: [],
82
+ ...message,
83
+ answers: [],
84
+ additionalRecords: []
85
+ };
86
+ let encodedChunkWithoutAnswers = import_DnsCodec.DnsCodec.encode(chunk);
87
+ let chunkSize = encodedChunkWithoutAnswers.byteLength;
88
+ for (const answer of message.answers ?? []) {
89
+ const answerEncoded = import_DnsCodec.DnsCodec.encodeRecord(answer);
90
+ if (chunkSize + answerEncoded.byteLength > import_DnsCodec.MAX_MDNS_MESSAGE_SIZE) {
91
+ if (chunk.answers.length === 0) {
92
+ logger.warn(
93
+ `MDNS message with ${import_Diagnostic.Diagnostic.json(
94
+ chunk.queries
95
+ )} is too big to fit into a single MDNS message. Send anyway, but please report!`
96
+ );
97
+ }
98
+ await this.#send(
99
+ {
100
+ ...chunk,
101
+ messageType: truncatedMessageType
102
+ },
103
+ intf,
104
+ unicastDest
105
+ );
106
+ if (chunk.queries.length) {
107
+ chunk.queries.length = 0;
108
+ encodedChunkWithoutAnswers = import_DnsCodec.DnsCodec.encode(chunk);
109
+ }
110
+ chunk.answers.length = 0;
111
+ chunkSize = encodedChunkWithoutAnswers.byteLength + answerEncoded.byteLength;
112
+ } else {
113
+ chunkSize += answerEncoded.byteLength;
114
+ }
115
+ chunk.answers.push(answerEncoded);
116
+ }
117
+ const additionalRecords = message.additionalRecords ?? [];
118
+ for (const additionalRecord of additionalRecords) {
119
+ const additionalRecordEncoded = import_DnsCodec.DnsCodec.encodeRecord(additionalRecord);
120
+ chunkSize += additionalRecordEncoded.byteLength;
121
+ if (chunkSize > import_DnsCodec.MAX_MDNS_MESSAGE_SIZE) {
122
+ break;
123
+ }
124
+ chunk.additionalRecords.push(additionalRecordEncoded);
125
+ }
126
+ await this.#send(chunk, intf, unicastDest);
127
+ }
128
+ async #send(message, intf, unicastDest) {
129
+ await this.#socket.send(import_DnsCodec.DnsCodec.encode(message), intf, unicastDest);
130
+ }
131
+ async close() {
132
+ this.#isClosed = true;
133
+ await this.#socket.close();
134
+ if (this.#handlers) {
135
+ await import_MatterError.MatterAggregateError.allSettled(this.#handlers);
136
+ }
137
+ }
138
+ #handleMessage(bytes, sourceIp, sourceIntf) {
139
+ if (this.#isClosed) {
140
+ return;
141
+ }
142
+ const parsed = import_DnsCodec.DnsCodec.decode(bytes);
143
+ if (parsed === void 0) {
144
+ return;
145
+ }
146
+ let promise = this.#receipt.emit({
147
+ ...parsed,
148
+ sourceIp,
149
+ sourceIntf
150
+ });
151
+ if (import_Promises.MaybePromise.is(promise)) {
152
+ if (this.#handlers === void 0) {
153
+ this.#handlers = /* @__PURE__ */ new Set();
154
+ }
155
+ promise = Promise.resolve(promise).finally(() => this.#handlers?.delete(promise));
156
+ }
157
+ }
158
+ }
159
+ ((MdnsSocket2) => {
160
+ MdnsSocket2.BROADCAST_IPV4 = "224.0.0.251";
161
+ MdnsSocket2.BROADCAST_IPV6 = "ff02::fb";
162
+ MdnsSocket2.BROADCAST_PORT = 5353;
163
+ })(MdnsSocket || (MdnsSocket = {}));
164
+ //# sourceMappingURL=MdnsSocket.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/net/dns-sd/MdnsSocket.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,sBAOO;AACP,wBAA2B;AAC3B,oBAAuB;AACvB,yBAAqC;AAErC,gCAAmC;AAGnC,wBAAiD;AACjD,sBAA6B;AAtB7B;AAAA;AAAA;AAAA;AAAA;AAwBA,MAAM,SAAS,qBAAO,IAAI,cAAc;AAKjC,MAAM,WAAW;AAAA,EACpB;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAA2D,IAAI;AAAA,IAC3D,WAAS,OAAO,MAAM,oCAAoC,KAAK;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEA,aAAa,OACT,SACA,SACF;AACE,UAAM,EAAE,aAAa,MAAM,cAAc,SAAS,IAAI,WAAW,CAAC;AAClE,UAAM,SAAS,IAAI;AAAA,MACf,MAAM,6CAAmB,OAAO;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBAAsB,aAAa,WAAW,iBAAiB;AAAA,QAC/D,sBAAsB,WAAW;AAAA,QACjC,eAAe,WAAW;AAAA,MAC9B,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,QAA4B;AACpC,SAAK,UAAU;AACf,WAAO,UAAU,KAAK,eAAe,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,KAAK,SAAgE,MAAe,aAAsB;AAC5G,UAAM,EAAE,YAAY,IAAI;AAExB,UAAM,uBAAuB,+BAAe,QAAQ,WAAW,IACzD,cAAc,mCAAmB,KACjC;AAEN,UAAM,QAAuC;AAAA,MACzC,eAAe;AAAA,MACf,SAAS,CAAC;AAAA,MACV,aAAa,CAAC;AAAA,MAEd,GAAG;AAAA,MAEH,SAAS,CAAC;AAAA,MACV,mBAAmB,CAAC;AAAA,IACxB;AAGA,QAAI,6BAA6B,yBAAS,OAAO,KAAK;AACtD,QAAI,YAAY,2BAA2B;AAG3C,eAAW,UAAU,QAAQ,WAAW,CAAC,GAAG;AACxC,YAAM,gBAAgB,yBAAS,aAAa,MAAM;AAElD,UAAI,YAAY,cAAc,aAAa,uCAAuB;AAC9D,YAAI,MAAM,QAAQ,WAAW,GAAG;AAE5B,iBAAO;AAAA,YACH,qBAAqB,6BAAW;AAAA,cAC5B,MAAM;AAAA,YACV,CAAC;AAAA,UACL;AAAA,QACJ;AAIA,cAAM,KAAK;AAAA,UACP;AAAA,YACI,GAAG;AAAA,YACH,aAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAGA,YAAI,MAAM,QAAQ,QAAQ;AACtB,gBAAM,QAAQ,SAAS;AACvB,uCAA6B,yBAAS,OAAO,KAAK;AAAA,QACtD;AACA,cAAM,QAAQ,SAAS;AACvB,oBAAY,2BAA2B,aAAa,cAAc;AAAA,MACtE,OAAO;AACH,qBAAa,cAAc;AAAA,MAC/B;AAEA,YAAM,QAAQ,KAAK,aAAa;AAAA,IACpC;AAGA,UAAM,oBAAoB,QAAQ,qBAAqB,CAAC;AACxD,eAAW,oBAAoB,mBAAmB;AAC9C,YAAM,0BAA0B,yBAAS,aAAa,gBAAgB;AACtE,mBAAa,wBAAwB;AACrC,UAAI,YAAY,uCAAuB;AACnC;AAAA,MACJ;AACA,YAAM,kBAAkB,KAAK,uBAAuB;AAAA,IACxD;AAEA,UAAM,KAAK,MAAM,OAAO,MAAM,WAAW;AAAA,EAC7C;AAAA,EAEA,MAAM,MAAM,SAAwC,MAAe,aAAsB;AACrF,UAAM,KAAK,QAAQ,KAAK,yBAAS,OAAO,OAAO,GAAG,MAAM,WAAW;AAAA,EACvE;AAAA,EAEA,MAAM,QAAQ;AACV,SAAK,YAAY;AACjB,UAAM,KAAK,QAAQ,MAAM;AACzB,QAAI,KAAK,WAAW;AAChB,YAAM,wCAAqB,WAAW,KAAK,SAAS;AAAA,IACxD;AAAA,EACJ;AAAA,EAEA,eAAe,OAAc,UAAkB,YAAoB;AAE/D,QAAI,KAAK,WAAW;AAChB;AAAA,IACJ;AAGA,UAAM,SAAS,yBAAS,OAAO,KAAK;AAGpC,QAAI,WAAW,QAAW;AACtB;AAAA,IACJ;AAEA,QAAI,UAAU,KAAK,SAAS,KAAK;AAAA,MAC7B,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACJ,CAAC;AAED,QAAI,6BAAa,GAAG,OAAO,GAAG;AAC1B,UAAI,KAAK,cAAc,QAAW;AAC9B,aAAK,YAAY,oBAAI,IAAI;AAAA,MAC7B;AACA,gBAAU,QAAQ,QAAQ,OAAO,EAAE,QAAQ,MAAM,KAAK,WAAW,OAAO,OAA4B,CAAC;AAAA,IACzG;AAAA,EACJ;AACJ;AAAA,CAEO,CAAUA,gBAAV;AAMI,EAAMA,YAAA,iBAAiB;AACvB,EAAMA,YAAA,iBAAiB;AACvB,EAAMA,YAAA,iBAAiB;AAAA,GARjB;",
5
+ "names": ["MdnsSocket"]
6
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export * from "./MdnsSocket.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/net/dns-sd/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,24 @@
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 __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+ var dns_sd_exports = {};
17
+ module.exports = __toCommonJS(dns_sd_exports);
18
+ __reExport(dns_sd_exports, require("./MdnsSocket.js"), module.exports);
19
+ /**
20
+ * @license
21
+ * Copyright 2022-2026 Matter.js Authors
22
+ * SPDX-License-Identifier: Apache-2.0
23
+ */
24
+ //# sourceMappingURL=index.js.map