@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/util/Set.ts"],
4
- "mappings": "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",
5
- "names": ["value"]
4
+ "mappings": "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",
5
+ "names": ["value", "MapOfIndexedSet"]
6
6
  }
@@ -19,6 +19,7 @@ export * from "./FormattedText.js";
19
19
  export * from "./GeneratedClass.js";
20
20
  export * from "./Ip.js";
21
21
  export * from "./Lifecycle.js";
22
+ export * from "./Map.js";
22
23
  export * from "./Mutex.js";
23
24
  export * from "./NamedHandler.js";
24
25
  export * from "./Number.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,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,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,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,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,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -19,6 +19,7 @@ export * from "./FormattedText.js";
19
19
  export * from "./GeneratedClass.js";
20
20
  export * from "./Ip.js";
21
21
  export * from "./Lifecycle.js";
22
+ export * from "./Map.js";
22
23
  export * from "./Mutex.js";
23
24
  export * from "./NamedHandler.js";
24
25
  export * from "./Number.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;",
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;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/general",
3
- "version": "0.14.0",
3
+ "version": "0.14.1-alpha.0-20250606-a9bcd03f9",
4
4
  "description": "Non-Matter support for Matter.js",
5
5
  "keywords": [
6
6
  "iot",
@@ -36,7 +36,7 @@
36
36
  "@noble/curves": "^1.9.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@matter/testing": "0.14.0"
39
+ "@matter/testing": "0.14.1-alpha.0-20250606-a9bcd03f9"
40
40
  },
41
41
  "files": [
42
42
  "dist/**/*",
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { UnexpectedDataError } from "../MatterError.js";
7
- import { Bytes, Endian } from "../util/Bytes.js";
7
+ import { Bytes } from "../util/Bytes.js";
8
8
  import { DataReader } from "../util/DataReader.js";
9
9
  import { toHex } from "../util/Number.js";
10
10
  import { isObject } from "../util/Type.js";
@@ -267,15 +267,15 @@ export class DerCodec {
267
267
  }
268
268
 
269
269
  static decode(data: Uint8Array): DerNode {
270
- return this.decodeRec(new DataReader(data, Endian.Big));
270
+ return this.decodeRec(new DataReader(data));
271
271
  }
272
272
 
273
- private static decodeRec(reader: DataReader<Endian.Big>): DerNode {
273
+ private static decodeRec(reader: DataReader): DerNode {
274
274
  const { tag, bytes } = this.decodeAsn1(reader);
275
275
  if (tag === DerType.BitString)
276
276
  return { [DerKey.TagId]: tag, [DerKey.Bytes]: bytes.slice(1), [DerKey.BitsPadding]: bytes[0] };
277
277
  if ((tag & CONSTRUCTED) === 0) return { [DerKey.TagId]: tag, [DerKey.Bytes]: bytes };
278
- const elementsReader = new DataReader(bytes, Endian.Big);
278
+ const elementsReader = new DataReader(bytes);
279
279
  const elements: DerNode[] = [];
280
280
  while (elementsReader.remainingBytesCount > 0) {
281
281
  elements.push(this.decodeRec(elementsReader));
@@ -283,7 +283,7 @@ export class DerCodec {
283
283
  return { [DerKey.TagId]: tag, [DerKey.Bytes]: bytes, [DerKey.Elements]: elements };
284
284
  }
285
285
 
286
- private static decodeAsn1(reader: DataReader<Endian.Big>): { tag: number; bytes: Uint8Array } {
286
+ private static decodeAsn1(reader: DataReader): { tag: number; bytes: Uint8Array } {
287
287
  const tag = reader.readUInt8();
288
288
  let length = reader.readUInt8();
289
289
  if ((length & 0x80) !== 0) {
@@ -141,7 +141,7 @@ export enum DnsRecordClass {
141
141
  export class DnsCodec {
142
142
  static decode(message: Uint8Array): DnsMessage | undefined {
143
143
  try {
144
- const reader = new DataReader(message, Endian.Big);
144
+ const reader = new DataReader(message);
145
145
  const transactionId = reader.readUInt16();
146
146
  const messageType = reader.readUInt16();
147
147
  const queriesCount = reader.readUInt16();
@@ -198,7 +198,7 @@ export class DnsCodec {
198
198
  }
199
199
  visited.add(reader.offset);
200
200
 
201
- const messageReader = new DataReader(message, Endian.Big);
201
+ const messageReader = new DataReader(message);
202
202
  const qNameItems = new Array<string>();
203
203
  while (true) {
204
204
  const itemLength = reader.readUInt8();
@@ -227,7 +227,7 @@ export class DnsCodec {
227
227
  private static decodeRecordValue(valueBytes: Uint8Array, recordType: DnsRecordType, message: Uint8Array) {
228
228
  switch (recordType) {
229
229
  case DnsRecordType.PTR:
230
- return this.decodeQName(new DataReader(valueBytes, Endian.Big), message);
230
+ return this.decodeQName(new DataReader(valueBytes), message);
231
231
  case DnsRecordType.SRV:
232
232
  return this.decodeSrvRecord(valueBytes, message);
233
233
  case DnsRecordType.TXT:
@@ -243,7 +243,7 @@ export class DnsCodec {
243
243
  }
244
244
 
245
245
  static decodeSrvRecord(valueBytes: Uint8Array, message: Uint8Array): SrvRecordValue {
246
- const reader = new DataReader(valueBytes, Endian.Big);
246
+ const reader = new DataReader(valueBytes);
247
247
  const priority = reader.readUInt16();
248
248
  const weight = reader.readUInt16();
249
249
  const port = reader.readUInt16();
@@ -252,7 +252,7 @@ export class DnsCodec {
252
252
  }
253
253
 
254
254
  static decodeTxtRecord(valueBytes: Uint8Array): string[] {
255
- const reader = new DataReader(valueBytes, Endian.Big);
255
+ const reader = new DataReader(valueBytes);
256
256
  const result = new Array<string>();
257
257
  let bytesRead = 0;
258
258
  while (bytesRead < valueBytes.length) {
@@ -264,7 +264,7 @@ export class DnsCodec {
264
264
  }
265
265
 
266
266
  static decodeAaaaRecord(valueBytes: Uint8Array): string {
267
- const reader = new DataReader(valueBytes, Endian.Big);
267
+ const reader = new DataReader(valueBytes);
268
268
  const ipItems = new Array<string>();
269
269
  for (let i = 0; i < 8; i++) {
270
270
  ipItems.push(reader.readUInt16().toString(16));
@@ -290,7 +290,7 @@ export class DnsCodec {
290
290
  }
291
291
 
292
292
  static decodeARecord(valueBytes: Uint8Array): string {
293
- const reader = new DataReader(valueBytes, Endian.Big);
293
+ const reader = new DataReader(valueBytes);
294
294
  const ipItems = new Array<string>();
295
295
  for (let i = 0; i < 4; i++) {
296
296
  ipItems.push(reader.readUInt8().toString());
@@ -311,7 +311,7 @@ export class DnsCodec {
311
311
  throw new InternalError("Queries can only be included in query messages!");
312
312
  if (authorities.length > 0) throw new NotImplementedError("Authority answers are not supported yet!");
313
313
 
314
- const writer = new DataWriter(Endian.Big);
314
+ const writer = new DataWriter();
315
315
  writer.writeUInt16(transactionId);
316
316
  writer.writeUInt16(messageType);
317
317
  writer.writeUInt16(queries.length);
@@ -336,7 +336,7 @@ export class DnsCodec {
336
336
  static encodeRecord(record: DnsRecord<any>): Uint8Array {
337
337
  const { name, recordType, recordClass, ttl, value, flushCache = false } = record;
338
338
 
339
- const writer = new DataWriter(Endian.Big);
339
+ const writer = new DataWriter();
340
340
  writer.writeByteArray(this.encodeQName(name));
341
341
  writer.writeUInt16(recordType);
342
342
  writer.writeUInt16(recordClass | (flushCache ? 0x8000 : 0));
@@ -367,7 +367,7 @@ export class DnsCodec {
367
367
 
368
368
  static encodeARecord(ip: string) {
369
369
  if (!isIPv4(ip)) throw new UnexpectedDataError(`Invalid A Record value: ${ip}`);
370
- const writer = new DataWriter(Endian.Big);
370
+ const writer = new DataWriter();
371
371
  ip.split(".").forEach(part => {
372
372
  writer.writeUInt8(parseInt(part));
373
373
  });
@@ -376,7 +376,7 @@ export class DnsCodec {
376
376
 
377
377
  static encodeAaaaRecord(ip: string) {
378
378
  if (!isIPv6(ip)) throw new UnexpectedDataError(`Invalid AAAA Record value: ${ip}`);
379
- const writer = new DataWriter(Endian.Big);
379
+ const writer = new DataWriter();
380
380
  const parts = ip.split(":");
381
381
  parts.forEach(part => {
382
382
  if (part === "") {
@@ -391,7 +391,7 @@ export class DnsCodec {
391
391
  }
392
392
 
393
393
  static encodeTxtRecord(entries: string[]) {
394
- const writer = new DataWriter(Endian.Big);
394
+ const writer = new DataWriter();
395
395
  entries.forEach(entry => {
396
396
  const entryData = Bytes.fromString(entry);
397
397
  writer.writeUInt8(entryData.length);
@@ -401,7 +401,7 @@ export class DnsCodec {
401
401
  }
402
402
 
403
403
  static encodeSrvRecord({ priority, weight, port, target }: SrvRecordValue) {
404
- const writer = new DataWriter(Endian.Big);
404
+ const writer = new DataWriter();
405
405
  writer.writeUInt16(priority);
406
406
  writer.writeUInt16(weight);
407
407
  writer.writeUInt16(port);
@@ -410,7 +410,7 @@ export class DnsCodec {
410
410
  }
411
411
 
412
412
  static encodeQName(qname: string) {
413
- const writer = new DataWriter(Endian.Big);
413
+ const writer = new DataWriter();
414
414
  if (qname !== undefined && qname.length > 0) {
415
415
  // TODO: Implement compression
416
416
  qname.split(".").forEach(label => {
@@ -12,6 +12,8 @@ export class NetworkError extends MatterError {}
12
12
 
13
13
  export class NoAddressAvailableError extends NetworkError {}
14
14
 
15
+ export const STANDARD_MATTER_PORT = 5540;
16
+
15
17
  /**
16
18
  * @see {@link MatterSpecification.v11.Core} § 11.11.4.4
17
19
  * Duplicated from the GeneralDiagnostics cluster to avoid circular dependencies.
@@ -4,22 +4,26 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { MaybePromise } from "#util/index.js";
7
8
  import { ChannelType } from "./Channel.js";
8
9
  import { TransportInterface } from "./TransportInterface.js";
9
10
 
10
11
  /** @see {@link MatterSpecification.v12.Core} § 4.4.4 */
11
12
  export const MAX_UDP_MESSAGE_SIZE = 1280 - 48; // 48 bytes IP and UDP header size for IPv6
12
13
 
14
+ export type UdpSocketType = "udp4" | "udp6";
15
+
13
16
  export interface UdpChannelOptions {
14
17
  listeningPort?: number;
15
- type: "udp4" | "udp6";
18
+ type: UdpSocketType;
16
19
  listeningAddress?: string;
17
20
  netInterface?: string;
18
- membershipAddresses?: string[];
19
21
  }
20
22
 
21
23
  export interface UdpChannel {
22
24
  maxPayloadSize: number;
25
+ addMembership(address: string): MaybePromise<void>;
26
+ dropMembership(address: string): MaybePromise<void>;
23
27
  onData(
24
28
  listener: (netInterface: string | undefined, peerAddress: string, peerPort: number, data: Uint8Array) => void,
25
29
  ): TransportInterface.Listener;
@@ -12,16 +12,24 @@ import { TransportInterface } from "./TransportInterface.js";
12
12
  import { UdpChannel } from "./UdpChannel.js";
13
13
 
14
14
  export class UdpInterface implements NetInterface {
15
+ readonly #server: UdpChannel;
16
+
15
17
  static async create(network: Network, type: "udp4" | "udp6", port?: number, host?: string, netInterface?: string) {
16
18
  return new UdpInterface(
17
19
  await network.createUdpChannel({ listeningPort: port, type, netInterface, listeningAddress: host }),
18
20
  );
19
21
  }
20
22
 
21
- constructor(private readonly server: UdpChannel) {}
23
+ constructor(server: UdpChannel) {
24
+ this.#server = server;
25
+ }
26
+
27
+ protected get server() {
28
+ return this.#server;
29
+ }
22
30
 
23
31
  supports(type: ChannelType, address: string) {
24
- return this.server.supports(type, address);
32
+ return this.#server.supports(type, address);
25
33
  }
26
34
 
27
35
  async openChannel(address: ServerAddress) {
@@ -29,48 +37,59 @@ export class UdpInterface implements NetInterface {
29
37
  throw new NetworkError(`Unsupported address type ${address.type}`);
30
38
  }
31
39
  const { ip, port } = address;
32
- return Promise.resolve(new UdpConnection(this.server, ip, port));
40
+ return Promise.resolve(new UdpConnection(this.#server, ip, port));
33
41
  }
34
42
 
35
43
  onData(listener: (channel: Channel<Uint8Array>, messageBytes: Uint8Array) => void): TransportInterface.Listener {
36
- return this.server.onData((_netInterface, peerHost, peerPort, data) =>
37
- listener(new UdpConnection(this.server, peerHost, peerPort), data),
44
+ return this.#server.onData((_netInterface, peerHost, peerPort, data) =>
45
+ listener(new UdpConnection(this.#server, peerHost, peerPort), data),
38
46
  );
39
47
  }
40
48
 
41
49
  get port() {
42
- return this.server.port;
50
+ return this.#server.port;
43
51
  }
44
52
 
45
53
  close() {
46
- return this.server.close();
54
+ return this.#server.close();
55
+ }
56
+
57
+ addMembership(address: string) {
58
+ return this.#server.addMembership(address);
59
+ }
60
+
61
+ dropMembership(address: string) {
62
+ return this.#server.dropMembership(address);
47
63
  }
48
64
  }
49
65
 
50
- class UdpConnection implements IpNetworkChannel<Uint8Array> {
66
+ export class UdpConnection implements IpNetworkChannel<Uint8Array> {
51
67
  readonly isReliable = false;
52
68
  readonly type = ChannelType.UDP;
69
+ readonly #server: UdpChannel;
70
+ readonly #peerAddress: string;
71
+ readonly #peerPort: number;
53
72
 
54
- constructor(
55
- private readonly server: UdpChannel,
56
- private readonly peerAddress: string,
57
- private readonly peerPort: number,
58
- ) {}
73
+ constructor(server: UdpChannel, peerAddress: string, peerPort: number) {
74
+ this.#server = server;
75
+ this.#peerAddress = peerAddress;
76
+ this.#peerPort = peerPort;
77
+ }
59
78
 
60
79
  get maxPayloadSize() {
61
- return this.server.maxPayloadSize;
80
+ return this.#server.maxPayloadSize;
62
81
  }
63
82
 
64
83
  send(data: Uint8Array) {
65
- return this.server.send(this.peerAddress, this.peerPort, data);
84
+ return this.#server.send(this.#peerAddress, this.#peerPort, data);
66
85
  }
67
86
 
68
87
  get name() {
69
- return `${this.type}://[${this.peerAddress}]:${this.peerPort}`;
88
+ return `${this.type}://[${this.#peerAddress}]:${this.#peerPort}`;
70
89
  }
71
90
 
72
91
  get networkAddress(): ServerAddressIp {
73
- return { type: "udp", ip: this.peerAddress, port: this.peerPort };
92
+ return { type: "udp", ip: this.#peerAddress, port: this.#peerPort };
74
93
  }
75
94
 
76
95
  async close() {
@@ -37,8 +37,8 @@ export class UdpMulticastServer {
37
37
  type: "udp4",
38
38
  netInterface,
39
39
  listeningPort,
40
- membershipAddresses: [broadcastAddressIpv4],
41
40
  });
41
+ await ipv4UdpChannel.addMembership(broadcastAddressIpv4);
42
42
  } catch (error) {
43
43
  NoAddressAvailableError.accept(error);
44
44
  logger.info(`IPv4 UDP channel not created because IPv4 is not available: ${asError(error).message}`);
@@ -46,18 +46,19 @@ export class UdpMulticastServer {
46
46
  }
47
47
 
48
48
  try {
49
+ const ipv6UdpChannel = await network.createUdpChannel({
50
+ type: "udp6",
51
+ netInterface,
52
+ listeningPort,
53
+ });
54
+ await ipv6UdpChannel.addMembership(broadcastAddressIpv6);
49
55
  return new UdpMulticastServer(
50
56
  network,
51
57
  broadcastAddressIpv4,
52
58
  broadcastAddressIpv6,
53
59
  listeningPort,
54
60
  ipv4UdpChannel,
55
- await network.createUdpChannel({
56
- type: "udp6",
57
- netInterface,
58
- listeningPort,
59
- membershipAddresses: [broadcastAddressIpv6],
60
- }),
61
+ ipv6UdpChannel,
61
62
  netInterface,
62
63
  );
63
64
  } catch (error) {
@@ -59,4 +59,12 @@ export class MockUdpChannel implements UdpChannel {
59
59
  supports(type: ChannelType, _address: string) {
60
60
  return type === ChannelType.UDP;
61
61
  }
62
+
63
+ addMembership(_address: string): void {
64
+ // No-op for mock channel
65
+ }
66
+
67
+ dropMembership(_address: string): void {
68
+ // No-op for mock channel
69
+ }
62
70
  }
package/src/time/Time.ts CHANGED
@@ -36,6 +36,11 @@ export class Time {
36
36
  }
37
37
  static readonly nowMs = (): number => Time.get().nowMs();
38
38
 
39
+ nowUs() {
40
+ return Math.floor(performance.now() + performance.timeOrigin) * 1000;
41
+ }
42
+ static readonly nowUs = (): number => Time.get().nowUs();
43
+
39
44
  /**
40
45
  * Create a timer that will call callback after durationMs has passed.
41
46
  */
@@ -91,6 +96,11 @@ export class Time {
91
96
  }
92
97
  }
93
98
 
99
+ // Check if performance API is available and has the required methods. Use lower accuracy fallback if not.
100
+ if (!performance || typeof performance.now !== "function" || typeof performance.timeOrigin !== "number") {
101
+ Time.prototype.nowUs = () => Time.nowMs() * 1000; // Fallback is a bit less accurate
102
+ }
103
+
94
104
  const time = new Time();
95
105
 
96
106
  Time.startup.systemMs = Time.startup.processMs = time.nowMs();
@@ -38,6 +38,10 @@ export class DataReadQueue<T> implements Stream<T> {
38
38
  this.push(data);
39
39
  }
40
40
 
41
+ get size() {
42
+ return this.#queue.length;
43
+ }
44
+
41
45
  /**
42
46
  * Same as write but doesn't require the await required to satisfy {@link Stream#write}.
43
47
  */
@@ -7,13 +7,13 @@
7
7
  import { Bytes, Endian } from "./Bytes.js";
8
8
 
9
9
  /** Reader that auto-increments its offset after each read. */
10
- export class DataReader<E extends Endian> {
10
+ export class DataReader<E extends Endian = Endian.Big> {
11
11
  readonly #littleEndian: boolean;
12
12
  readonly #dataView: DataView;
13
13
  readonly #buffer: Uint8Array;
14
14
  #offset = 0;
15
15
 
16
- constructor(buffer: Uint8Array, endian: E) {
16
+ constructor(buffer: Uint8Array, endian?: E) {
17
17
  this.#buffer = buffer;
18
18
  this.#dataView = Bytes.dataViewOf(this.#buffer);
19
19
  this.#littleEndian = endian === Endian.Little;
@@ -9,12 +9,12 @@ import { toBigInt, toNumber } from "./Number.js";
9
9
 
10
10
  /** Writer that auto-increments its offset after each write. */
11
11
  // TODO: some research should be done to make sure this is most performant implementation.
12
- export class DataWriter<E extends Endian> {
12
+ export class DataWriter<E extends Endian = Endian.Big> {
13
13
  private readonly littleEndian: boolean;
14
14
  private length = 0;
15
15
  private readonly chunks = new Array<Uint8Array>();
16
16
 
17
- constructor(endian: E) {
17
+ constructor(endian?: E) {
18
18
  this.littleEndian = endian === Endian.Little;
19
19
  }
20
20
 
package/src/util/Ip.ts CHANGED
@@ -46,6 +46,56 @@ export function ipv6ToBytes(ip: string) {
46
46
  return Uint8Array.from(Array.from(ipv6ToArray(ip)).flatMap(value => [value >> 8, value & 0xff]));
47
47
  }
48
48
 
49
+ export function ipv6BytesToString(bytes: Uint8Array): string {
50
+ if (bytes.length !== 16) {
51
+ throw new Error("IPv6 address must be 16 bytes");
52
+ }
53
+
54
+ // Divide into 8 blocks of 2 bytes (16 bits) each
55
+ const blocks = [];
56
+ for (let i = 0; i < 16; i += 2) {
57
+ blocks.push(((bytes[i] << 8) | bytes[i + 1]).toString(16));
58
+ }
59
+
60
+ // Compression of the longest zero sequence (RFC 5952)
61
+ let bestStart = -1;
62
+ let bestLen = 0;
63
+ let currStart = -1;
64
+ let currLen = 0;
65
+ for (let i = 0; i < 8; i++) {
66
+ if (blocks[i] === "0") {
67
+ if (currStart === -1) {
68
+ currStart = i;
69
+ currLen = 1;
70
+ } else {
71
+ currLen++;
72
+ }
73
+ } else {
74
+ if (currLen > bestLen) {
75
+ bestStart = currStart;
76
+ bestLen = currLen;
77
+ }
78
+ currStart = -1;
79
+ currLen = 0;
80
+ }
81
+ }
82
+ if (currLen > bestLen) {
83
+ bestStart = currStart;
84
+ bestLen = currLen;
85
+ }
86
+ if (bestLen > 1) {
87
+ blocks.splice(bestStart, bestLen, "");
88
+ if (bestStart === 0) {
89
+ blocks.unshift("");
90
+ }
91
+ if (bestStart + bestLen === 8) {
92
+ blocks.push("");
93
+ }
94
+ }
95
+
96
+ return blocks.join(":").replace(/:{3,}/, "::").toLowerCase();
97
+ }
98
+
49
99
  export function onSameNetwork(ip1: string, ip2: string, mask: string) {
50
100
  if (isIPv4(ip1)) {
51
101
  // IPv4 addresses
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Observable } from "#util/Observable.js";
7
+
8
+ /**
9
+ * Set change events.
10
+ */
11
+ export interface ObservableMap<K, V> {
12
+ get added(): Observable<[key: K, newValue: V]>;
13
+ get deleted(): Observable<[key: K, oldValue: V]>;
14
+ get changed(): Observable<[key: K, newValue: V, oldValue: V]>;
15
+ }
16
+
17
+ /** Map extension to get added, deleted or changed events */
18
+ export class BasicMap<K, V> extends Map<K, V> implements ObservableMap<K, V> {
19
+ #added?: Observable<[K, V]>;
20
+ #deleted?: Observable<[K, V]>;
21
+ #changed?: Observable<[K, V, V]>;
22
+
23
+ override set(key: K, value: V): this {
24
+ const existing = this.get(key);
25
+ if (existing !== undefined) {
26
+ if (existing === value) {
27
+ // No change, do not emit events
28
+ return this;
29
+ }
30
+ this.#changed?.emit(key, value, existing);
31
+ } else {
32
+ this.#added?.emit(key, value);
33
+ }
34
+ return super.set(key, value);
35
+ }
36
+
37
+ override delete(key: K): boolean {
38
+ const existing = this.get(key);
39
+ if (existing !== undefined) {
40
+ this.#deleted?.emit(key, existing);
41
+ }
42
+ return super.delete(key);
43
+ }
44
+
45
+ get added() {
46
+ if (this.#added === undefined) {
47
+ this.#added = Observable();
48
+ }
49
+ return this.#added;
50
+ }
51
+
52
+ get deleted() {
53
+ if (this.#deleted === undefined) {
54
+ this.#deleted = Observable();
55
+ }
56
+ return this.#deleted;
57
+ }
58
+
59
+ get changed() {
60
+ if (this.#changed === undefined) {
61
+ this.#changed = Observable();
62
+ }
63
+ return this.#changed;
64
+ }
65
+ }