@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/dist/esm/util/Set.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/Set.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,kBAAkB;
|
|
5
|
-
"names": ["value"]
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["value", "MapOfIndexedSet"]
|
|
6
6
|
}
|
package/dist/esm/util/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/esm/util/index.js
CHANGED
|
@@ -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/**/*",
|
package/src/codec/DerCodec.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { UnexpectedDataError } from "../MatterError.js";
|
|
7
|
-
import { Bytes
|
|
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
|
|
270
|
+
return this.decodeRec(new DataReader(data));
|
|
271
271
|
}
|
|
272
272
|
|
|
273
|
-
private static decodeRec(reader: DataReader
|
|
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
|
|
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
|
|
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) {
|
package/src/codec/DnsCodec.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
413
|
+
const writer = new DataWriter();
|
|
414
414
|
if (qname !== undefined && qname.length > 0) {
|
|
415
415
|
// TODO: Implement compression
|
|
416
416
|
qname.split(".").forEach(label => {
|
package/src/net/Network.ts
CHANGED
|
@@ -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.
|
package/src/net/UdpChannel.ts
CHANGED
|
@@ -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:
|
|
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;
|
package/src/net/UdpInterface.ts
CHANGED
|
@@ -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(
|
|
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
|
|
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
|
|
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
|
|
37
|
-
listener(new UdpConnection(this
|
|
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
|
|
50
|
+
return this.#server.port;
|
|
43
51
|
}
|
|
44
52
|
|
|
45
53
|
close() {
|
|
46
|
-
return this
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
|
80
|
+
return this.#server.maxPayloadSize;
|
|
62
81
|
}
|
|
63
82
|
|
|
64
83
|
send(data: Uint8Array) {
|
|
65
|
-
return this
|
|
84
|
+
return this.#server.send(this.#peerAddress, this.#peerPort, data);
|
|
66
85
|
}
|
|
67
86
|
|
|
68
87
|
get name() {
|
|
69
|
-
return `${this.type}://[${this
|
|
88
|
+
return `${this.type}://[${this.#peerAddress}]:${this.#peerPort}`;
|
|
70
89
|
}
|
|
71
90
|
|
|
72
91
|
get networkAddress(): ServerAddressIp {
|
|
73
|
-
return { type: "udp", ip: this
|
|
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
|
-
|
|
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();
|
package/src/util/DataReader.ts
CHANGED
|
@@ -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
|
|
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;
|
package/src/util/DataWriter.ts
CHANGED
|
@@ -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
|
|
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
|
package/src/util/Map.ts
ADDED
|
@@ -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
|
+
}
|