@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.
- package/dist/cjs/codec/DerCodec.js +2 -2
- package/dist/cjs/codec/DerCodec.js.map +1 -1
- package/dist/cjs/codec/DnsCodec.js +14 -14
- package/dist/cjs/codec/DnsCodec.js.map +1 -1
- package/dist/cjs/net/Network.d.ts +1 -0
- package/dist/cjs/net/Network.d.ts.map +1 -1
- package/dist/cjs/net/Network.js +3 -1
- package/dist/cjs/net/Network.js.map +1 -1
- package/dist/cjs/net/UdpChannel.d.ts +5 -2
- package/dist/cjs/net/UdpChannel.d.ts.map +1 -1
- package/dist/cjs/net/UdpChannel.js.map +1 -1
- package/dist/cjs/net/UdpInterface.d.ts +6 -6
- package/dist/cjs/net/UdpInterface.d.ts.map +1 -1
- package/dist/cjs/net/UdpInterface.js +32 -18
- package/dist/cjs/net/UdpInterface.js.map +1 -1
- package/dist/cjs/net/UdpMulticastServer.d.ts.map +1 -1
- package/dist/cjs/net/UdpMulticastServer.js +9 -8
- package/dist/cjs/net/UdpMulticastServer.js.map +1 -1
- package/dist/cjs/net/mock/MockUdpChannel.d.ts +2 -0
- package/dist/cjs/net/mock/MockUdpChannel.d.ts.map +1 -1
- package/dist/cjs/net/mock/MockUdpChannel.js +4 -0
- package/dist/cjs/net/mock/MockUdpChannel.js.map +1 -1
- package/dist/cjs/time/Time.d.ts +2 -0
- package/dist/cjs/time/Time.d.ts.map +1 -1
- package/dist/cjs/time/Time.js +7 -0
- package/dist/cjs/time/Time.js.map +1 -1
- package/dist/cjs/util/DataReadQueue.d.ts +1 -0
- package/dist/cjs/util/DataReadQueue.d.ts.map +1 -1
- package/dist/cjs/util/DataReadQueue.js +3 -0
- package/dist/cjs/util/DataReadQueue.js.map +1 -1
- package/dist/cjs/util/DataReader.d.ts +2 -2
- package/dist/cjs/util/DataReader.d.ts.map +1 -1
- package/dist/cjs/util/DataReader.js.map +1 -1
- package/dist/cjs/util/DataWriter.d.ts +2 -2
- package/dist/cjs/util/DataWriter.d.ts.map +1 -1
- package/dist/cjs/util/DataWriter.js.map +1 -1
- package/dist/cjs/util/Ip.d.ts +1 -0
- package/dist/cjs/util/Ip.d.ts.map +1 -1
- package/dist/cjs/util/Ip.js +45 -0
- package/dist/cjs/util/Ip.js.map +1 -1
- package/dist/cjs/util/Map.d.ts +24 -0
- package/dist/cjs/util/Map.d.ts.map +1 -0
- package/dist/cjs/util/Map.js +72 -0
- package/dist/cjs/util/Map.js.map +6 -0
- package/dist/cjs/util/Set.d.ts +52 -0
- package/dist/cjs/util/Set.d.ts.map +1 -1
- package/dist/cjs/util/Set.js +136 -10
- package/dist/cjs/util/Set.js.map +2 -2
- package/dist/cjs/util/index.d.ts +1 -0
- package/dist/cjs/util/index.d.ts.map +1 -1
- package/dist/cjs/util/index.js +1 -0
- package/dist/cjs/util/index.js.map +1 -1
- package/dist/esm/codec/DerCodec.js +3 -3
- package/dist/esm/codec/DerCodec.js.map +1 -1
- package/dist/esm/codec/DnsCodec.js +15 -15
- package/dist/esm/codec/DnsCodec.js.map +1 -1
- package/dist/esm/net/Network.d.ts +1 -0
- package/dist/esm/net/Network.d.ts.map +1 -1
- package/dist/esm/net/Network.js +3 -1
- package/dist/esm/net/Network.js.map +1 -1
- package/dist/esm/net/UdpChannel.d.ts +5 -2
- package/dist/esm/net/UdpChannel.d.ts.map +1 -1
- package/dist/esm/net/UdpChannel.js.map +1 -1
- package/dist/esm/net/UdpInterface.d.ts +6 -6
- package/dist/esm/net/UdpInterface.d.ts.map +1 -1
- package/dist/esm/net/UdpInterface.js +32 -18
- package/dist/esm/net/UdpInterface.js.map +1 -1
- package/dist/esm/net/UdpMulticastServer.d.ts.map +1 -1
- package/dist/esm/net/UdpMulticastServer.js +9 -8
- package/dist/esm/net/UdpMulticastServer.js.map +1 -1
- package/dist/esm/net/mock/MockUdpChannel.d.ts +2 -0
- package/dist/esm/net/mock/MockUdpChannel.d.ts.map +1 -1
- package/dist/esm/net/mock/MockUdpChannel.js +4 -0
- package/dist/esm/net/mock/MockUdpChannel.js.map +1 -1
- package/dist/esm/time/Time.d.ts +2 -0
- package/dist/esm/time/Time.d.ts.map +1 -1
- package/dist/esm/time/Time.js +7 -0
- package/dist/esm/time/Time.js.map +1 -1
- package/dist/esm/util/DataReadQueue.d.ts +1 -0
- package/dist/esm/util/DataReadQueue.d.ts.map +1 -1
- package/dist/esm/util/DataReadQueue.js +3 -0
- package/dist/esm/util/DataReadQueue.js.map +1 -1
- package/dist/esm/util/DataReader.d.ts +2 -2
- package/dist/esm/util/DataReader.d.ts.map +1 -1
- package/dist/esm/util/DataReader.js.map +1 -1
- package/dist/esm/util/DataWriter.d.ts +2 -2
- package/dist/esm/util/DataWriter.d.ts.map +1 -1
- package/dist/esm/util/DataWriter.js.map +1 -1
- package/dist/esm/util/Ip.d.ts +1 -0
- package/dist/esm/util/Ip.d.ts.map +1 -1
- package/dist/esm/util/Ip.js +45 -0
- package/dist/esm/util/Ip.js.map +1 -1
- package/dist/esm/util/Map.d.ts +24 -0
- package/dist/esm/util/Map.d.ts.map +1 -0
- package/dist/esm/util/Map.js +52 -0
- package/dist/esm/util/Map.js.map +6 -0
- package/dist/esm/util/Set.d.ts +52 -0
- package/dist/esm/util/Set.d.ts.map +1 -1
- package/dist/esm/util/Set.js +136 -10
- package/dist/esm/util/Set.js.map +2 -2
- package/dist/esm/util/index.d.ts +1 -0
- package/dist/esm/util/index.d.ts.map +1 -1
- package/dist/esm/util/index.js +1 -0
- package/dist/esm/util/index.js.map +1 -1
- package/package.json +2 -2
- package/src/codec/DerCodec.ts +5 -5
- package/src/codec/DnsCodec.ts +14 -14
- package/src/net/Network.ts +2 -0
- package/src/net/UdpChannel.ts +6 -2
- package/src/net/UdpInterface.ts +36 -17
- package/src/net/UdpMulticastServer.ts +8 -7
- package/src/net/mock/MockUdpChannel.ts +8 -0
- package/src/time/Time.ts +10 -0
- package/src/util/DataReadQueue.ts +4 -0
- package/src/util/DataReader.ts +2 -2
- package/src/util/DataWriter.ts +2 -2
- package/src/util/Ip.ts +50 -0
- package/src/util/Map.ts +65 -0
- package/src/util/Set.ts +169 -3
- 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<
|
|
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
|
|
160
|
+
return index!; // Need "!" due to (apparent) TS bug
|
|
142
161
|
}
|
|
143
162
|
|
|
144
|
-
|
|
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";
|