@matter/general 0.16.1 → 0.16.2-alpha.0-20260114-b38c6b796

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 (144) hide show
  1. package/dist/cjs/net/Network.d.ts +2 -0
  2. package/dist/cjs/net/Network.d.ts.map +1 -1
  3. package/dist/cjs/net/Network.js +3 -0
  4. package/dist/cjs/net/Network.js.map +1 -1
  5. package/dist/cjs/net/RetrySchedule.d.ts +1 -1
  6. package/dist/cjs/net/ServerAddress.d.ts +52 -14
  7. package/dist/cjs/net/ServerAddress.d.ts.map +1 -1
  8. package/dist/cjs/net/ServerAddress.js +41 -6
  9. package/dist/cjs/net/ServerAddress.js.map +2 -2
  10. package/dist/cjs/net/ServerAddressSet.d.ts +65 -0
  11. package/dist/cjs/net/ServerAddressSet.d.ts.map +1 -0
  12. package/dist/cjs/net/ServerAddressSet.js +144 -0
  13. package/dist/cjs/net/ServerAddressSet.js.map +6 -0
  14. package/dist/cjs/net/dns-sd/MdnsSocket.d.ts +40 -0
  15. package/dist/cjs/net/dns-sd/MdnsSocket.d.ts.map +1 -0
  16. package/dist/cjs/net/dns-sd/MdnsSocket.js +164 -0
  17. package/dist/cjs/net/dns-sd/MdnsSocket.js.map +6 -0
  18. package/dist/cjs/net/dns-sd/index.d.ts +7 -0
  19. package/dist/cjs/net/dns-sd/index.d.ts.map +1 -0
  20. package/dist/cjs/net/dns-sd/index.js +24 -0
  21. package/dist/cjs/net/dns-sd/index.js.map +6 -0
  22. package/dist/cjs/net/index.d.ts +2 -0
  23. package/dist/cjs/net/index.d.ts.map +1 -1
  24. package/dist/cjs/net/index.js +2 -0
  25. package/dist/cjs/net/index.js.map +1 -1
  26. package/dist/cjs/time/TimeUnit.d.ts +4 -0
  27. package/dist/cjs/time/TimeUnit.d.ts.map +1 -1
  28. package/dist/cjs/time/TimeUnit.js +2 -0
  29. package/dist/cjs/time/TimeUnit.js.map +1 -1
  30. package/dist/cjs/time/Timestamp.d.ts +1 -1
  31. package/dist/cjs/time/Timestamp.d.ts.map +1 -1
  32. package/dist/cjs/time/Timestamp.js +1 -1
  33. package/dist/cjs/time/Timestamp.js.map +1 -1
  34. package/dist/cjs/util/Abort.d.ts +9 -0
  35. package/dist/cjs/util/Abort.d.ts.map +1 -1
  36. package/dist/cjs/util/Abort.js +20 -0
  37. package/dist/cjs/util/Abort.js.map +1 -1
  38. package/dist/cjs/util/Heap.d.ts +84 -0
  39. package/dist/cjs/util/Heap.d.ts.map +1 -0
  40. package/dist/cjs/util/Heap.js +286 -0
  41. package/dist/cjs/util/Heap.js.map +6 -0
  42. package/dist/cjs/util/Observable.d.ts +29 -6
  43. package/dist/cjs/util/Observable.d.ts.map +1 -1
  44. package/dist/cjs/util/Observable.js +40 -6
  45. package/dist/cjs/util/Observable.js.map +1 -1
  46. package/dist/cjs/util/Promises.d.ts +3 -0
  47. package/dist/cjs/util/Promises.d.ts.map +1 -1
  48. package/dist/cjs/util/Promises.js +33 -3
  49. package/dist/cjs/util/Promises.js.map +2 -2
  50. package/dist/cjs/util/Scheduler.d.ts +68 -0
  51. package/dist/cjs/util/Scheduler.d.ts.map +1 -0
  52. package/dist/cjs/util/Scheduler.js +207 -0
  53. package/dist/cjs/util/Scheduler.js.map +6 -0
  54. package/dist/cjs/util/Semaphore.d.ts +0 -4
  55. package/dist/cjs/util/Semaphore.d.ts.map +1 -1
  56. package/dist/cjs/util/Semaphore.js.map +1 -1
  57. package/dist/cjs/util/Set.d.ts.map +1 -1
  58. package/dist/cjs/util/Set.js +14 -8
  59. package/dist/cjs/util/Set.js.map +1 -1
  60. package/dist/cjs/util/index.d.ts +2 -0
  61. package/dist/cjs/util/index.d.ts.map +1 -1
  62. package/dist/cjs/util/index.js +2 -0
  63. package/dist/cjs/util/index.js.map +1 -1
  64. package/dist/esm/net/Network.d.ts +2 -0
  65. package/dist/esm/net/Network.d.ts.map +1 -1
  66. package/dist/esm/net/Network.js +3 -0
  67. package/dist/esm/net/Network.js.map +1 -1
  68. package/dist/esm/net/RetrySchedule.d.ts +1 -1
  69. package/dist/esm/net/ServerAddress.d.ts +52 -14
  70. package/dist/esm/net/ServerAddress.d.ts.map +1 -1
  71. package/dist/esm/net/ServerAddress.js +41 -6
  72. package/dist/esm/net/ServerAddress.js.map +2 -2
  73. package/dist/esm/net/ServerAddressSet.d.ts +65 -0
  74. package/dist/esm/net/ServerAddressSet.d.ts.map +1 -0
  75. package/dist/esm/net/ServerAddressSet.js +124 -0
  76. package/dist/esm/net/ServerAddressSet.js.map +6 -0
  77. package/dist/esm/net/dns-sd/MdnsSocket.d.ts +40 -0
  78. package/dist/esm/net/dns-sd/MdnsSocket.d.ts.map +1 -0
  79. package/dist/esm/net/dns-sd/MdnsSocket.js +149 -0
  80. package/dist/esm/net/dns-sd/MdnsSocket.js.map +6 -0
  81. package/dist/esm/net/dns-sd/index.d.ts +7 -0
  82. package/dist/esm/net/dns-sd/index.d.ts.map +1 -0
  83. package/dist/esm/net/dns-sd/index.js +7 -0
  84. package/dist/esm/net/dns-sd/index.js.map +6 -0
  85. package/dist/esm/net/index.d.ts +2 -0
  86. package/dist/esm/net/index.d.ts.map +1 -1
  87. package/dist/esm/net/index.js +2 -0
  88. package/dist/esm/net/index.js.map +1 -1
  89. package/dist/esm/time/TimeUnit.d.ts +4 -0
  90. package/dist/esm/time/TimeUnit.d.ts.map +1 -1
  91. package/dist/esm/time/TimeUnit.js +2 -0
  92. package/dist/esm/time/TimeUnit.js.map +1 -1
  93. package/dist/esm/time/Timestamp.d.ts +1 -1
  94. package/dist/esm/time/Timestamp.d.ts.map +1 -1
  95. package/dist/esm/time/Timestamp.js +1 -1
  96. package/dist/esm/time/Timestamp.js.map +1 -1
  97. package/dist/esm/util/Abort.d.ts +9 -0
  98. package/dist/esm/util/Abort.d.ts.map +1 -1
  99. package/dist/esm/util/Abort.js +20 -0
  100. package/dist/esm/util/Abort.js.map +1 -1
  101. package/dist/esm/util/Heap.d.ts +84 -0
  102. package/dist/esm/util/Heap.d.ts.map +1 -0
  103. package/dist/esm/util/Heap.js +266 -0
  104. package/dist/esm/util/Heap.js.map +6 -0
  105. package/dist/esm/util/Observable.d.ts +29 -6
  106. package/dist/esm/util/Observable.d.ts.map +1 -1
  107. package/dist/esm/util/Observable.js +40 -6
  108. package/dist/esm/util/Observable.js.map +1 -1
  109. package/dist/esm/util/Promises.d.ts +3 -0
  110. package/dist/esm/util/Promises.d.ts.map +1 -1
  111. package/dist/esm/util/Promises.js +33 -3
  112. package/dist/esm/util/Promises.js.map +2 -2
  113. package/dist/esm/util/Scheduler.d.ts +68 -0
  114. package/dist/esm/util/Scheduler.d.ts.map +1 -0
  115. package/dist/esm/util/Scheduler.js +187 -0
  116. package/dist/esm/util/Scheduler.js.map +6 -0
  117. package/dist/esm/util/Semaphore.d.ts +0 -4
  118. package/dist/esm/util/Semaphore.d.ts.map +1 -1
  119. package/dist/esm/util/Semaphore.js.map +1 -1
  120. package/dist/esm/util/Set.d.ts.map +1 -1
  121. package/dist/esm/util/Set.js +14 -8
  122. package/dist/esm/util/Set.js.map +1 -1
  123. package/dist/esm/util/index.d.ts +2 -0
  124. package/dist/esm/util/index.d.ts.map +1 -1
  125. package/dist/esm/util/index.js +2 -0
  126. package/dist/esm/util/index.js.map +1 -1
  127. package/package.json +2 -2
  128. package/src/net/Network.ts +2 -0
  129. package/src/net/RetrySchedule.ts +1 -1
  130. package/src/net/ServerAddress.ts +93 -19
  131. package/src/net/ServerAddressSet.ts +225 -0
  132. package/src/net/dns-sd/MdnsSocket.ts +203 -0
  133. package/src/net/dns-sd/index.ts +7 -0
  134. package/src/net/index.ts +2 -0
  135. package/src/time/TimeUnit.ts +5 -0
  136. package/src/time/Timestamp.ts +1 -1
  137. package/src/util/Abort.ts +25 -0
  138. package/src/util/Heap.ts +332 -0
  139. package/src/util/Observable.ts +74 -10
  140. package/src/util/Promises.ts +61 -4
  141. package/src/util/Scheduler.ts +185 -0
  142. package/src/util/Semaphore.ts +0 -5
  143. package/src/util/Set.ts +15 -8
  144. package/src/util/index.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Set.d.ts","sourceRoot":"","sources":["../../../src/util/Set.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Set.d.ts","sourceRoot":"","sources":["../../../src/util/Set.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  import { ImplementationError } from "#MatterError.js";
7
7
  import { Observable, ObservableValue } from "./Observable.js";
8
8
  class BasicSet {
9
- #entries = /* @__PURE__ */ new Set();
9
+ #entries;
10
10
  #added;
11
11
  #deleted;
12
12
  #empty;
@@ -18,10 +18,10 @@ class BasicSet {
18
18
  }
19
19
  }
20
20
  [Symbol.iterator]() {
21
- return this.#entries[Symbol.iterator]();
21
+ return this.#definedEntries[Symbol.iterator]();
22
22
  }
23
23
  get size() {
24
- return this.#entries.size;
24
+ return this.#entries?.size ?? 0;
25
25
  }
26
26
  map(mapper) {
27
27
  return [...this].map(mapper);
@@ -43,14 +43,14 @@ class BasicSet {
43
43
  return result;
44
44
  }
45
45
  has(item) {
46
- return this.#entries.has(item);
46
+ return this.#entries?.has(item) ?? false;
47
47
  }
48
48
  add(item) {
49
49
  const created = this.create(item);
50
- if (this.#entries.has(item)) {
50
+ if (this.#definedEntries.has(item)) {
51
51
  return;
52
52
  }
53
- this.#entries.add(item);
53
+ this.#definedEntries.add(item);
54
54
  if (this.#indices) {
55
55
  for (const field in this.#indices) {
56
56
  const value = created[field];
@@ -72,6 +72,12 @@ class BasicSet {
72
72
  get(field, value) {
73
73
  return this.#indexOf(field).get(value);
74
74
  }
75
+ get #definedEntries() {
76
+ if (this.#entries === void 0) {
77
+ this.#entries = /* @__PURE__ */ new Set();
78
+ }
79
+ return this.#entries;
80
+ }
75
81
  #indexOf(field) {
76
82
  if (!this.#indices) {
77
83
  this.#indices = {};
@@ -116,7 +122,7 @@ class BasicSet {
116
122
  return false;
117
123
  }
118
124
  }
119
- if (!this.#entries.delete(item)) {
125
+ if (!this.#entries?.delete(item)) {
120
126
  return false;
121
127
  }
122
128
  if (this.#indices) {
@@ -156,7 +162,7 @@ class BasicSet {
156
162
  }
157
163
  get empty() {
158
164
  if (this.#empty === void 0) {
159
- this.#empty = ObservableValue(!this.#entries.size);
165
+ this.#empty = ObservableValue(!this.#entries?.size);
160
166
  }
161
167
  return this.#empty;
162
168
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/Set.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["value", "MapOfIndexedSet"]
6
6
  }
@@ -22,6 +22,7 @@ export * from "./FormattedText.js";
22
22
  export * from "./Function.js";
23
23
  export * from "./GeneratedClass.js";
24
24
  export * from "./Github.js";
25
+ export * from "./Heap.js";
25
26
  export * from "./identifier-case.js";
26
27
  export * from "./Ip.js";
27
28
  export * from "./Lifecycle.js";
@@ -34,6 +35,7 @@ export * from "./NamedHandler.js";
34
35
  export * from "./Number.js";
35
36
  export * from "./Observable.js";
36
37
  export * from "./Promises.js";
38
+ export * from "./Scheduler.js";
37
39
  export * from "./Semaphore.js";
38
40
  export * from "./serialize.js";
39
41
  export * from "./Set.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -22,6 +22,7 @@ export * from "./FormattedText.js";
22
22
  export * from "./Function.js";
23
23
  export * from "./GeneratedClass.js";
24
24
  export * from "./Github.js";
25
+ export * from "./Heap.js";
25
26
  export * from "./identifier-case.js";
26
27
  export * from "./Ip.js";
27
28
  export * from "./Lifecycle.js";
@@ -34,6 +35,7 @@ export * from "./NamedHandler.js";
34
35
  export * from "./Number.js";
35
36
  export * from "./Observable.js";
36
37
  export * from "./Promises.js";
38
+ export * from "./Scheduler.js";
37
39
  export * from "./Semaphore.js";
38
40
  export * from "./serialize.js";
39
41
  export * from "./Set.js";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/index.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/general",
3
- "version": "0.16.1",
3
+ "version": "0.16.2-alpha.0-20260114-b38c6b796",
4
4
  "description": "Non-Matter support for Matter.js",
5
5
  "keywords": [
6
6
  "iot",
@@ -36,7 +36,7 @@
36
36
  "@noble/curves": "^2.0.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@matter/testing": "0.16.1"
39
+ "@matter/testing": "0.16.2-alpha.0-20260114-b38c6b796"
40
40
  },
41
41
  "files": [
42
42
  "dist/**/*",
@@ -16,6 +16,8 @@ export class BindError extends NetworkError {}
16
16
 
17
17
  export class AddressInUseError extends BindError {}
18
18
 
19
+ export class AddressUnreachableError extends NetworkError {}
20
+
19
21
  export const STANDARD_MATTER_PORT = 5540;
20
22
 
21
23
  /**
@@ -68,7 +68,7 @@ export namespace RetrySchedule {
68
68
  /**
69
69
  * Overall timeout.
70
70
  *
71
- * Leave undefined to allow indefinite transmission.
71
+ * Leave undefined to allow unlimited retries.
72
72
  */
73
73
  readonly timeout?: Duration;
74
74
 
@@ -7,40 +7,69 @@
7
7
  import { Diagnostic } from "#log/Diagnostic.js";
8
8
  import { Duration } from "#time/Duration.js";
9
9
  import { Timestamp } from "#time/Timestamp.js";
10
- import { Seconds } from "#time/TimeUnit.js";
10
+
11
+ export interface AddressLifespan {
12
+ /**
13
+ * Beginning of lifespan
14
+ */
15
+ discoveredAt: Timestamp;
16
+
17
+ /**
18
+ * Length of lifespan, if known
19
+ */
20
+ ttl: Duration;
21
+ }
22
+
23
+ export interface AddressStatus extends Partial<AddressLifespan> {
24
+ /**
25
+ * Time of last successful access.
26
+ */
27
+ healthyAt?: Timestamp;
28
+
29
+ /**
30
+ * Time of last unsuccessful access.
31
+ */
32
+ unhealthyAt?: Timestamp;
33
+
34
+ /**
35
+ * DNS priority.
36
+ */
37
+ priority?: number;
38
+
39
+ /**
40
+ * DNS weight.
41
+ */
42
+ weight?: number;
43
+ }
11
44
 
12
45
  export type ServerAddressUdp = {
13
46
  type: "udp";
14
47
  ip: string;
15
48
  port: number;
16
- };
49
+ } & AddressStatus;
17
50
 
18
51
  export type ServerAddressTcp = {
19
52
  type: "tcp";
20
53
  ip: string;
21
54
  port: number;
22
- };
55
+ } & AddressStatus;
23
56
 
24
57
  export type ServerAddressBle = {
25
58
  type: "ble";
26
59
  peripheralAddress: string;
27
- };
60
+ } & AddressStatus;
28
61
 
29
- export interface Lifespan {
30
- /** Beginning of lifespan (system time in milliseconds) */
31
- discoveredAt: Timestamp;
32
-
33
- /** Length of lifespan, if known (seconds) */
34
- ttl: Duration;
35
- }
36
-
37
- export type ServerAddress = (ServerAddressUdp | ServerAddressTcp | ServerAddressBle) & Partial<Lifespan>;
62
+ export type ServerAddress = ServerAddressUdp | ServerAddressTcp | ServerAddressBle;
38
63
 
39
- export function ServerAddress(definition: ServerAddress.Definition) {
64
+ export function ServerAddress(definition: ServerAddress) {
40
65
  return {
66
+ ttl: undefined,
41
67
  discoveredAt: undefined,
68
+ healthyAt: undefined,
69
+ unhealthyAt: undefined,
70
+ priority: undefined,
71
+ weight: undefined,
42
72
  ...definition,
43
- ttl: Seconds(definition.ttl),
44
73
  } as ServerAddress;
45
74
  }
46
75
 
@@ -100,11 +129,56 @@ export namespace ServerAddress {
100
129
  return false;
101
130
  }
102
131
 
103
- export function definitionOf(address: ServerAddress): Definition {
104
- return address;
132
+ /**
133
+ * Compute logical health of an address.
134
+ *
135
+ * This returns heathyAt/unhealthyAt values with unhealthyAt set to undefined if the address was more recently
136
+ * healthy.
137
+ */
138
+ export function healthOf(health: AddressStatus): AddressStatus {
139
+ if (health.unhealthyAt === undefined) {
140
+ return health;
141
+ }
142
+
143
+ if (health.healthyAt !== undefined && health.healthyAt > health.unhealthyAt) {
144
+ return {
145
+ healthyAt: health.healthyAt,
146
+ };
147
+ }
148
+
149
+ return health;
150
+ }
151
+
152
+ /**
153
+ * Network address desirability from a Matter communication perspective.
154
+ *
155
+ * Lower values indicate higher preference. This is not a standard "happy eyeballs" ranking but works similarly.
156
+ */
157
+ export enum SelectionPreference {
158
+ IPV6_ULA,
159
+ IPV6_LINK_LOCAL,
160
+ IPV6,
161
+ IPV4,
162
+ NOT_IP = 3,
105
163
  }
106
164
 
107
- export interface Definition extends Omit<ServerAddress, "ttl"> {
108
- ttl?: Duration;
165
+ export function selectionPreferenceOf(address: ServerAddress) {
166
+ if (!("ip" in address)) {
167
+ return SelectionPreference.NOT_IP;
168
+ }
169
+
170
+ if (address.ip.startsWith("fd")) {
171
+ return SelectionPreference.IPV6_ULA;
172
+ }
173
+
174
+ if (address.ip.startsWith("fe00")) {
175
+ return SelectionPreference.IPV6_LINK_LOCAL;
176
+ }
177
+
178
+ if (address.ip.includes(":")) {
179
+ return SelectionPreference.IPV6;
180
+ }
181
+
182
+ return SelectionPreference.IPV4;
109
183
  }
110
184
  }
@@ -0,0 +1,225 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { AddressStatus, ServerAddress } from "./ServerAddress.js";
8
+
9
+ /**
10
+ * A set of server addresses ordered by a comparator.
11
+ */
12
+ export interface ServerAddressSet<T extends ServerAddress> {
13
+ /**
14
+ * Add an address.
15
+ *
16
+ * If the address alreay exists, returns the existing address to facilitate comparison by value. If not, returns
17
+ * the input address.
18
+ */
19
+ add(address: T): T;
20
+
21
+ /**
22
+ * Delete an address.
23
+ */
24
+ delete(address: T): boolean;
25
+
26
+ /**
27
+ * Replace the stored addresses.
28
+ */
29
+ replace(newAddresses: Iterable<T>): void;
30
+
31
+ /**
32
+ * Test for existence of address.
33
+ */
34
+ has(address: T): boolean;
35
+
36
+ /**
37
+ * The number of addresses.
38
+ */
39
+ size: number;
40
+
41
+ /**
42
+ * Iterate.
43
+ *
44
+ * If you replace addresses during iteration only addresses not already produced will be covered by remaining
45
+ * iterations.
46
+ */
47
+ [Symbol.iterator](): Iterator<T>;
48
+ }
49
+
50
+ /**
51
+ * Create a new {@link ServerAddressSet}.
52
+ */
53
+ export function ServerAddressSet<T extends ServerAddress>(
54
+ initial?: Iterable<T>,
55
+ comparator = ServerAddressSet.compareDesirability,
56
+ ) {
57
+ let version = 0;
58
+ let addresses: undefined | Map<string, T>;
59
+
60
+ const set: ServerAddressSet<T> = {
61
+ add(address: T) {
62
+ version++;
63
+ const key = ServerAddress.urlFor(address);
64
+ const existing = addresses?.get(key);
65
+ if (existing) {
66
+ return existing;
67
+ }
68
+
69
+ if (!addresses) {
70
+ addresses = new Map();
71
+ }
72
+
73
+ addresses.set(key, address);
74
+ return address;
75
+ },
76
+
77
+ delete(address: T) {
78
+ version++;
79
+ return addresses?.delete(ServerAddress.urlFor(address)) ?? false;
80
+ },
81
+
82
+ has(address: T) {
83
+ return addresses?.has(ServerAddress.urlFor(address)) ?? false;
84
+ },
85
+
86
+ replace(newAddresses) {
87
+ version++;
88
+ const oldAddresses = addresses;
89
+ addresses = new Map();
90
+ for (const address of newAddresses) {
91
+ const key = ServerAddress.urlFor(address);
92
+ addresses.set(key, oldAddresses?.get(key) ?? address);
93
+ }
94
+ },
95
+
96
+ get size() {
97
+ return addresses?.size ?? 0;
98
+ },
99
+
100
+ *[Symbol.iterator]() {
101
+ const tried = new Set<string>();
102
+
103
+ all: while (true) {
104
+ const currentVersion = version;
105
+ const ordered = addresses
106
+ ? [...addresses.entries()].map(([, address]) => address).sort(comparator)
107
+ : [];
108
+
109
+ for (const address of ordered) {
110
+ // Skip duplicates or addresses we've tried with previous sets
111
+ const key = ServerAddress.urlFor(address);
112
+ if (tried.has(key)) {
113
+ continue;
114
+ }
115
+
116
+ yield address;
117
+
118
+ // Restart iteration if the underlying address set changed
119
+ if (currentVersion !== version) {
120
+ continue all;
121
+ }
122
+ }
123
+
124
+ break;
125
+ }
126
+ },
127
+ };
128
+
129
+ if (initial) {
130
+ set.replace(initial);
131
+ }
132
+
133
+ return set;
134
+ }
135
+
136
+ export namespace ServerAddressSet {
137
+ export interface Comparator<T extends ServerAddress = ServerAddress> {
138
+ (addr1: T, addr2: T): number;
139
+ }
140
+
141
+ /**
142
+ * Update a list of addresses with health information from another list.
143
+ */
144
+ export function copyHealth<T extends ServerAddress>(targetAddresses: Iterable<T>, sourceAddresses: Iterable<T>) {
145
+ const output = [...targetAddresses];
146
+
147
+ nextTarget: for (let i = 0; i < output.length; i++) {
148
+ const target = output[i];
149
+ for (const source of sourceAddresses) {
150
+ if (ServerAddress.isEqual(target, source)) {
151
+ if (source.healthyAt !== undefined || source.unhealthyAt !== undefined) {
152
+ output[i] = { ...target, healthyAt: source.healthyAt, unhealthyAt: source.unhealthyAt };
153
+ }
154
+ continue nextTarget;
155
+ }
156
+ }
157
+ }
158
+
159
+ return output;
160
+ }
161
+
162
+ /**
163
+ * Compare the "desirability" of two addresses for communication.
164
+ */
165
+ export function compareDesirability(a: ServerAddress, b: ServerAddress) {
166
+ const value = ServerAddress.selectionPreferenceOf(a) - ServerAddress.selectionPreferenceOf(b);
167
+
168
+ if (value) {
169
+ return value;
170
+ }
171
+
172
+ // Compare health
173
+ const relativeHealth = compareHealth(a, b);
174
+ if (relativeHealth) {
175
+ return relativeHealth;
176
+ }
177
+
178
+ // Compare priority if known for both addresses
179
+ if (a.priority !== undefined && b.priority !== undefined) {
180
+ return b.priority - a.priority;
181
+ }
182
+
183
+ return 0;
184
+ }
185
+
186
+ /**
187
+ * Compare the health of two addresses.
188
+ *
189
+ * Returns a negative number if a is healthier, positive if b is healthier and 0 if assessment is neutral.
190
+ */
191
+ export function compareHealth(a: AddressStatus, b: AddressStatus) {
192
+ const ha = ServerAddress.healthOf(a);
193
+ const hb = ServerAddress.healthOf(b);
194
+
195
+ // If a is unhealthy, check b's unhealth
196
+ if (ha.unhealthyAt) {
197
+ if (hb.unhealthyAt) {
198
+ // Prefer smaller "unhealthy at" value
199
+ return ha.unhealthyAt - hb.unhealthyAt;
200
+ }
201
+
202
+ // Prefer b as it is healthy or unused
203
+ return 1;
204
+ }
205
+
206
+ // If b is unhealthy and a is not; prefer b
207
+ if (hb.unhealthyAt) {
208
+ return -1;
209
+ }
210
+
211
+ // If a is known healthy, check b's health
212
+ if (ha.healthyAt) {
213
+ if (hb.healthyAt) {
214
+ // Prefer greater health value
215
+ return hb.healthyAt - ha.healthyAt;
216
+ }
217
+
218
+ // Prefer a as b has not been used
219
+ return -1;
220
+ }
221
+
222
+ // No preference
223
+ return 0;
224
+ }
225
+ }