@matter/general 0.14.0 → 0.14.1-alpha.0-20250606-a9bcd03f9

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 (120) hide show
  1. package/dist/cjs/codec/DerCodec.js +2 -2
  2. package/dist/cjs/codec/DerCodec.js.map +1 -1
  3. package/dist/cjs/codec/DnsCodec.js +14 -14
  4. package/dist/cjs/codec/DnsCodec.js.map +1 -1
  5. package/dist/cjs/net/Network.d.ts +1 -0
  6. package/dist/cjs/net/Network.d.ts.map +1 -1
  7. package/dist/cjs/net/Network.js +3 -1
  8. package/dist/cjs/net/Network.js.map +1 -1
  9. package/dist/cjs/net/UdpChannel.d.ts +5 -2
  10. package/dist/cjs/net/UdpChannel.d.ts.map +1 -1
  11. package/dist/cjs/net/UdpChannel.js.map +1 -1
  12. package/dist/cjs/net/UdpInterface.d.ts +6 -6
  13. package/dist/cjs/net/UdpInterface.d.ts.map +1 -1
  14. package/dist/cjs/net/UdpInterface.js +32 -18
  15. package/dist/cjs/net/UdpInterface.js.map +1 -1
  16. package/dist/cjs/net/UdpMulticastServer.d.ts.map +1 -1
  17. package/dist/cjs/net/UdpMulticastServer.js +9 -8
  18. package/dist/cjs/net/UdpMulticastServer.js.map +1 -1
  19. package/dist/cjs/net/mock/MockUdpChannel.d.ts +2 -0
  20. package/dist/cjs/net/mock/MockUdpChannel.d.ts.map +1 -1
  21. package/dist/cjs/net/mock/MockUdpChannel.js +4 -0
  22. package/dist/cjs/net/mock/MockUdpChannel.js.map +1 -1
  23. package/dist/cjs/time/Time.d.ts +2 -0
  24. package/dist/cjs/time/Time.d.ts.map +1 -1
  25. package/dist/cjs/time/Time.js +7 -0
  26. package/dist/cjs/time/Time.js.map +1 -1
  27. package/dist/cjs/util/DataReadQueue.d.ts +1 -0
  28. package/dist/cjs/util/DataReadQueue.d.ts.map +1 -1
  29. package/dist/cjs/util/DataReadQueue.js +3 -0
  30. package/dist/cjs/util/DataReadQueue.js.map +1 -1
  31. package/dist/cjs/util/DataReader.d.ts +2 -2
  32. package/dist/cjs/util/DataReader.d.ts.map +1 -1
  33. package/dist/cjs/util/DataReader.js.map +1 -1
  34. package/dist/cjs/util/DataWriter.d.ts +2 -2
  35. package/dist/cjs/util/DataWriter.d.ts.map +1 -1
  36. package/dist/cjs/util/DataWriter.js.map +1 -1
  37. package/dist/cjs/util/Ip.d.ts +1 -0
  38. package/dist/cjs/util/Ip.d.ts.map +1 -1
  39. package/dist/cjs/util/Ip.js +45 -0
  40. package/dist/cjs/util/Ip.js.map +1 -1
  41. package/dist/cjs/util/Map.d.ts +24 -0
  42. package/dist/cjs/util/Map.d.ts.map +1 -0
  43. package/dist/cjs/util/Map.js +72 -0
  44. package/dist/cjs/util/Map.js.map +6 -0
  45. package/dist/cjs/util/Set.d.ts +52 -0
  46. package/dist/cjs/util/Set.d.ts.map +1 -1
  47. package/dist/cjs/util/Set.js +136 -10
  48. package/dist/cjs/util/Set.js.map +2 -2
  49. package/dist/cjs/util/index.d.ts +1 -0
  50. package/dist/cjs/util/index.d.ts.map +1 -1
  51. package/dist/cjs/util/index.js +1 -0
  52. package/dist/cjs/util/index.js.map +1 -1
  53. package/dist/esm/codec/DerCodec.js +3 -3
  54. package/dist/esm/codec/DerCodec.js.map +1 -1
  55. package/dist/esm/codec/DnsCodec.js +15 -15
  56. package/dist/esm/codec/DnsCodec.js.map +1 -1
  57. package/dist/esm/net/Network.d.ts +1 -0
  58. package/dist/esm/net/Network.d.ts.map +1 -1
  59. package/dist/esm/net/Network.js +3 -1
  60. package/dist/esm/net/Network.js.map +1 -1
  61. package/dist/esm/net/UdpChannel.d.ts +5 -2
  62. package/dist/esm/net/UdpChannel.d.ts.map +1 -1
  63. package/dist/esm/net/UdpChannel.js.map +1 -1
  64. package/dist/esm/net/UdpInterface.d.ts +6 -6
  65. package/dist/esm/net/UdpInterface.d.ts.map +1 -1
  66. package/dist/esm/net/UdpInterface.js +32 -18
  67. package/dist/esm/net/UdpInterface.js.map +1 -1
  68. package/dist/esm/net/UdpMulticastServer.d.ts.map +1 -1
  69. package/dist/esm/net/UdpMulticastServer.js +9 -8
  70. package/dist/esm/net/UdpMulticastServer.js.map +1 -1
  71. package/dist/esm/net/mock/MockUdpChannel.d.ts +2 -0
  72. package/dist/esm/net/mock/MockUdpChannel.d.ts.map +1 -1
  73. package/dist/esm/net/mock/MockUdpChannel.js +4 -0
  74. package/dist/esm/net/mock/MockUdpChannel.js.map +1 -1
  75. package/dist/esm/time/Time.d.ts +2 -0
  76. package/dist/esm/time/Time.d.ts.map +1 -1
  77. package/dist/esm/time/Time.js +7 -0
  78. package/dist/esm/time/Time.js.map +1 -1
  79. package/dist/esm/util/DataReadQueue.d.ts +1 -0
  80. package/dist/esm/util/DataReadQueue.d.ts.map +1 -1
  81. package/dist/esm/util/DataReadQueue.js +3 -0
  82. package/dist/esm/util/DataReadQueue.js.map +1 -1
  83. package/dist/esm/util/DataReader.d.ts +2 -2
  84. package/dist/esm/util/DataReader.d.ts.map +1 -1
  85. package/dist/esm/util/DataReader.js.map +1 -1
  86. package/dist/esm/util/DataWriter.d.ts +2 -2
  87. package/dist/esm/util/DataWriter.d.ts.map +1 -1
  88. package/dist/esm/util/DataWriter.js.map +1 -1
  89. package/dist/esm/util/Ip.d.ts +1 -0
  90. package/dist/esm/util/Ip.d.ts.map +1 -1
  91. package/dist/esm/util/Ip.js +45 -0
  92. package/dist/esm/util/Ip.js.map +1 -1
  93. package/dist/esm/util/Map.d.ts +24 -0
  94. package/dist/esm/util/Map.d.ts.map +1 -0
  95. package/dist/esm/util/Map.js +52 -0
  96. package/dist/esm/util/Map.js.map +6 -0
  97. package/dist/esm/util/Set.d.ts +52 -0
  98. package/dist/esm/util/Set.d.ts.map +1 -1
  99. package/dist/esm/util/Set.js +136 -10
  100. package/dist/esm/util/Set.js.map +2 -2
  101. package/dist/esm/util/index.d.ts +1 -0
  102. package/dist/esm/util/index.d.ts.map +1 -1
  103. package/dist/esm/util/index.js +1 -0
  104. package/dist/esm/util/index.js.map +1 -1
  105. package/package.json +2 -2
  106. package/src/codec/DerCodec.ts +5 -5
  107. package/src/codec/DnsCodec.ts +14 -14
  108. package/src/net/Network.ts +2 -0
  109. package/src/net/UdpChannel.ts +6 -2
  110. package/src/net/UdpInterface.ts +36 -17
  111. package/src/net/UdpMulticastServer.ts +8 -7
  112. package/src/net/mock/MockUdpChannel.ts +8 -0
  113. package/src/time/Time.ts +10 -0
  114. package/src/util/DataReadQueue.ts +4 -0
  115. package/src/util/DataReader.ts +2 -2
  116. package/src/util/DataWriter.ts +2 -2
  117. package/src/util/Ip.ts +50 -0
  118. package/src/util/Map.ts +65 -0
  119. package/src/util/Set.ts +169 -3
  120. package/src/util/index.ts +1 -0
package/src/util/Set.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { ImplementationError } from "#MatterError.js";
7
8
  import { Observable } from "./Observable.js";
8
9
 
9
10
  /**
@@ -36,9 +37,20 @@ export interface ObservableSet<T> {
36
37
 
37
38
  /**
38
39
  * An interface for index set lookup.
40
+ *
41
+ * Note that this interface only supports a single item for each key. If multiple items associate with a key only the
42
+ * first is returned.
39
43
  */
40
44
  export interface IndexedSet<T> {
45
+ /**
46
+ * Retrieve an item with the named {@link field} set to {@link value}.
47
+ */
41
48
  get<F extends keyof T>(field: F, value: T[F]): T | undefined;
49
+
50
+ /**
51
+ * Obtain a {@link Map} of values in {@link field} to the associated item in the set.
52
+ */
53
+ mapOf<F extends keyof T>(field: F): Map<T[F], T>;
42
54
  }
43
55
 
44
56
  /**
@@ -51,7 +63,10 @@ export class BasicSet<T, AddT = T> implements ImmutableSet<T>, MutableSet<T, Add
51
63
  #added?: Observable<[T]>;
52
64
  #deleted?: Observable<[T]>;
53
65
  #indices?: {
54
- [field in keyof T]?: Map<any, T>;
66
+ [field in keyof T]?: Map<T[field], T>;
67
+ };
68
+ #maps?: {
69
+ [field in keyof T]?: Map<T[field], T>;
55
70
  };
56
71
 
57
72
  constructor(...initialItems: AddT[]) {
@@ -123,6 +138,10 @@ export class BasicSet<T, AddT = T> implements ImmutableSet<T>, MutableSet<T, Add
123
138
  }
124
139
 
125
140
  get<F extends keyof T>(field: F, value: T[F]) {
141
+ return this.#indexOf(field).get(value);
142
+ }
143
+
144
+ #indexOf<F extends keyof T>(field: F) {
126
145
  if (!this.#indices) {
127
146
  this.#indices = {};
128
147
  }
@@ -138,10 +157,39 @@ export class BasicSet<T, AddT = T> implements ImmutableSet<T>, MutableSet<T, Add
138
157
  }
139
158
  this.#indices[field] = index;
140
159
  }
141
- return index?.get(value);
160
+ return index!; // Need "!" due to (apparent) TS bug
142
161
  }
143
162
 
144
- delete(item: T) {
163
+ /**
164
+ * Obtain key/value map using specific field as key.
165
+ *
166
+ * Note we use {@link This} to constrain usage to sets where {@link T} === {@link AddT} as required by {@link Map}.
167
+ */
168
+ mapOf<This extends BasicSet<T, T>, F extends keyof T>(this: This, field: F): Map<T[F], T> {
169
+ if (!this.#maps) {
170
+ this.#maps = {};
171
+ }
172
+ let map = this.#maps[field];
173
+ if (map === undefined) {
174
+ map = new MapOfIndexedSet(this, field, this.#indexOf(field));
175
+ this.#maps[field] = map;
176
+ }
177
+ return map;
178
+ }
179
+
180
+ delete(item: T): boolean;
181
+ delete<F extends keyof T>(field: keyof T, value: T[F]): boolean;
182
+ delete<F extends keyof T>(itemOrField: T | F, value?: T[F]): boolean {
183
+ let item: T | undefined;
184
+ if (value === undefined) {
185
+ item = itemOrField as T;
186
+ } else {
187
+ item = this.get(itemOrField as F, value);
188
+ if (item === undefined) {
189
+ return false; // Item not found
190
+ }
191
+ }
192
+
145
193
  if (!this.#entries.delete(item)) {
146
194
  return false;
147
195
  }
@@ -187,3 +235,121 @@ export class BasicSet<T, AddT = T> implements ImmutableSet<T>, MutableSet<T, Add
187
235
  return definition as unknown as T;
188
236
  }
189
237
  }
238
+
239
+ /**
240
+ * A {@link Map} backed by an {@link IndexedSet}.
241
+ *
242
+ * This supports the common case where sets must be looked up by key. Implementations like {@link BasicSet} offer
243
+ * efficient lookup by key using {@link IndexedSet#get}, but usage like a {@link Map} is still cumbersome. This class
244
+ * works as an adapter to make key/value access patterns more natural.
245
+ */
246
+ export class MapOfIndexedSet<T, S extends ImmutableSet<T> & MutableSet<T> & IndexedSet<T>, K extends keyof T>
247
+ implements Map<T[K], T>
248
+ {
249
+ #set: S;
250
+ #key: K;
251
+
252
+ // This is an optimization for lookup
253
+ #index?: Map<T[K], T>;
254
+
255
+ /**
256
+ * Create a new map.
257
+ *
258
+ * @param set the backing data
259
+ * @param key a property of {@link T} used as the key
260
+ * @param index optional index that optimizes lookup by bypassing {@link IndexedSet#get}
261
+ */
262
+ constructor(set: S, key: K, index?: Map<T[K], T>) {
263
+ this.#set = set;
264
+ this.#key = key;
265
+ this.#index = index;
266
+ }
267
+
268
+ clear(): void {
269
+ this.#set.clear();
270
+ }
271
+
272
+ delete(key: T[K]): boolean {
273
+ const item = this.get(key);
274
+ if (item) {
275
+ return this.#set.delete(item);
276
+ }
277
+ return false;
278
+ }
279
+
280
+ forEach(callbackfn: (value: T, key: T[K], map: Map<T[K], T>) => void, thisArg?: any): void {
281
+ if (thisArg) {
282
+ callbackfn = callbackfn.bind(thisArg);
283
+ }
284
+ for (const [k, v] of this) {
285
+ callbackfn(v, k, this);
286
+ }
287
+ }
288
+
289
+ get(key: T[K]): T | undefined {
290
+ if (this.#index) {
291
+ return this.#index.get(key);
292
+ }
293
+ return this.#set.get(this.#key, key);
294
+ }
295
+
296
+ has(key: T[K]): boolean {
297
+ return this.#index ? this.#index.has(key) : this.#set.get(this.#key, key) !== undefined;
298
+ }
299
+
300
+ set(key: T[K], value: T): this {
301
+ if (value[this.#key] !== key) {
302
+ throw new MapOfIndexedSet.KeyValueMismatchError(
303
+ `Cannot set key "${key}" because value property ${String(this.#key)} is "${value[this.#key]}"`,
304
+ );
305
+ }
306
+ if (this.has(key)) {
307
+ if (this.get(key) === value) {
308
+ return this;
309
+ }
310
+ this.#set.delete((this.#index ? this.#index.get(key) : this.#set.get(this.#key, key)) as T);
311
+ }
312
+ this.#set.add(value);
313
+ return this;
314
+ }
315
+
316
+ get size() {
317
+ return this.#set.size;
318
+ }
319
+
320
+ entries(): MapIterator<[T[K], T]> {
321
+ return this[Symbol.iterator]();
322
+ }
323
+
324
+ keys(): MapIterator<T[K]> {
325
+ if (this.#index) {
326
+ return this.#index.keys();
327
+ }
328
+ const keys = [...this.#set].map(item => item[this.#key]).filter(key => key !== undefined);
329
+ return keys[Symbol.iterator]();
330
+ }
331
+
332
+ values(): MapIterator<T> {
333
+ if (this.#index) {
334
+ return this.#index.values();
335
+ }
336
+ const values = [...this.#set].map(item => item);
337
+ return values[Symbol.iterator]();
338
+ }
339
+
340
+ *[Symbol.iterator](): MapIterator<[T[K], T]> {
341
+ for (const item of this.#set) {
342
+ const k = item[this.#key];
343
+ if (k === undefined) {
344
+ continue;
345
+ }
346
+ yield [k, item];
347
+ }
348
+ }
349
+
350
+ [Symbol.toStringTag] = "Map";
351
+ }
352
+
353
+ export namespace MapOfIndexedSet {
354
+ export class KeyValueMismatchError extends ImplementationError {}
355
+ }
package/src/util/index.ts CHANGED
@@ -20,6 +20,7 @@ export * from "./FormattedText.js";
20
20
  export * from "./GeneratedClass.js";
21
21
  export * from "./Ip.js";
22
22
  export * from "./Lifecycle.js";
23
+ export * from "./Map.js";
23
24
  export * from "./Mutex.js";
24
25
  export * from "./NamedHandler.js";
25
26
  export * from "./Number.js";