@project-chip/matter.js 0.0.2 → 0.2.0
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/README.md +14 -0
- package/dist/cjs/cluster/AccessControlCluster.js +105 -0
- package/dist/cjs/cluster/BasicInformationCluster.js +92 -0
- package/dist/cjs/cluster/BindingCluster.js +51 -0
- package/dist/cjs/cluster/BridgedDeviceBasicInformationCluster.js +75 -0
- package/dist/cjs/cluster/Cluster.js +49 -0
- package/dist/cjs/cluster/DescriptorCluster.js +53 -0
- package/dist/cjs/cluster/GeneralCommissioningCluster.js +89 -0
- package/dist/cjs/cluster/GroupsCluster.js +140 -0
- package/dist/cjs/cluster/IdentifyCluster.js +55 -0
- package/dist/cjs/cluster/LabelCluster.js +55 -0
- package/dist/cjs/cluster/OnOffCluster.js +105 -0
- package/dist/cjs/cluster/OperationalCredentialsCluster.js +205 -0
- package/dist/cjs/cluster/ScenesCluster.js +236 -0
- package/dist/cjs/common/AttributeId.js +23 -0
- package/dist/cjs/common/ClusterId.js +24 -0
- package/dist/cjs/common/DeviceTypeId.js +23 -0
- package/dist/cjs/common/EndpointNumber.js +23 -0
- package/dist/cjs/common/FabricId.js +24 -0
- package/dist/cjs/common/FabricIndex.js +28 -0
- package/dist/cjs/common/GroupId.js +30 -0
- package/dist/cjs/common/NodeId.js +31 -0
- package/dist/cjs/common/SubjectId.js +11 -0
- package/dist/cjs/common/VendorId.js +25 -0
- package/{dist-cjs → dist/cjs}/matter.js +12 -0
- package/dist/cjs/protocol/InteractionProtocol.js +136 -0
- package/dist/cjs/schema/BitmapSchema.js +133 -0
- package/{dist-cjs → dist/cjs}/tlv/TlvObject.js +6 -2
- package/{dist-cjs → dist/cjs}/util/ByteArray.js +2 -0
- package/{dist-cjs → dist/cjs}/util/Type.js +3 -0
- package/dist/dts/cluster/AccessControlCluster.d.ts +108 -0
- package/dist/dts/cluster/BasicInformationCluster.d.ts +57 -0
- package/dist/dts/cluster/BindingCluster.d.ts +23 -0
- package/dist/dts/cluster/BridgedDeviceBasicInformationCluster.d.ts +53 -0
- package/dist/dts/cluster/Cluster.d.ts +109 -0
- package/dist/dts/cluster/DescriptorCluster.d.ts +25 -0
- package/dist/dts/cluster/GeneralCommissioningCluster.d.ts +94 -0
- package/dist/dts/cluster/GroupsCluster.d.ts +92 -0
- package/dist/dts/cluster/IdentifyCluster.d.ts +60 -0
- package/dist/dts/cluster/LabelCluster.d.ts +34 -0
- package/dist/dts/cluster/OnOffCluster.d.ts +85 -0
- package/dist/dts/cluster/OperationalCredentialsCluster.d.ts +156 -0
- package/dist/dts/cluster/ScenesCluster.d.ts +200 -0
- package/dist/dts/common/AttributeId.d.ts +17 -0
- package/dist/dts/common/ClusterId.d.ts +18 -0
- package/dist/dts/common/DeviceTypeId.d.ts +17 -0
- package/dist/dts/common/EndpointNumber.d.ts +17 -0
- package/dist/dts/common/FabricId.d.ts +18 -0
- package/dist/dts/common/FabricIndex.d.ts +22 -0
- package/dist/dts/common/GroupId.d.ts +24 -0
- package/dist/dts/common/NodeId.d.ts +19 -0
- package/dist/dts/common/SubjectId.d.ts +15 -0
- package/dist/dts/common/VendorId.d.ts +19 -0
- package/dist/{matter.d.ts → dts/matter.d.ts} +12 -0
- package/dist/dts/protocol/InteractionProtocol.d.ts +159 -0
- package/dist/{schema → dts/schema}/BitmapSchema.d.ts +15 -3
- package/dist/{util → dts/util}/Type.d.ts +1 -0
- package/dist/es/cluster/AccessControlCluster.js +102 -0
- package/dist/es/cluster/BasicInformationCluster.js +89 -0
- package/dist/es/cluster/BindingCluster.js +48 -0
- package/dist/es/cluster/BridgedDeviceBasicInformationCluster.js +72 -0
- package/dist/es/cluster/Cluster.js +36 -0
- package/dist/es/cluster/DescriptorCluster.js +50 -0
- package/dist/es/cluster/GeneralCommissioningCluster.js +86 -0
- package/dist/es/cluster/GroupsCluster.js +137 -0
- package/dist/es/cluster/IdentifyCluster.js +52 -0
- package/dist/es/cluster/LabelCluster.js +52 -0
- package/dist/es/cluster/OnOffCluster.js +102 -0
- package/dist/es/cluster/OperationalCredentialsCluster.js +202 -0
- package/dist/es/cluster/ScenesCluster.js +233 -0
- package/dist/es/common/AttributeId.js +19 -0
- package/dist/es/common/ClusterId.js +20 -0
- package/dist/es/common/DeviceTypeId.js +19 -0
- package/dist/es/common/EndpointNumber.js +19 -0
- package/dist/es/common/FabricId.js +20 -0
- package/dist/es/common/FabricIndex.js +24 -0
- package/dist/es/common/GroupId.js +26 -0
- package/dist/es/common/NodeId.js +27 -0
- package/dist/es/common/SubjectId.js +8 -0
- package/dist/es/common/VendorId.js +21 -0
- package/dist/{matter.js → es/matter.js} +12 -0
- package/dist/es/protocol/InteractionProtocol.js +133 -0
- package/dist/es/schema/BitmapSchema.js +125 -0
- package/dist/{tlv → es/tlv}/TlvObject.js +6 -2
- package/dist/{util → es/util}/ByteArray.js +2 -0
- package/dist/{util → es/util}/Type.js +1 -1
- package/package.json +7 -8
- package/dist/schema/BitmapSchema.js +0 -48
- package/dist-cjs/schema/BitmapSchema.js +0 -55
- /package/{dist-cjs → dist/cjs}/schema/Schema.js +0 -0
- /package/{dist-cjs → dist/cjs}/spec/Specifications.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvAny.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvArray.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvBoolean.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvCodec.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvNullable.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvNumber.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvSchema.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvString.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvVoid.js +0 -0
- /package/{dist-cjs → dist/cjs}/tlv/TlvWrapper.js +0 -0
- /package/{dist-cjs → dist/cjs}/util/DataReader.js +0 -0
- /package/{dist-cjs → dist/cjs}/util/DataWriter.js +0 -0
- /package/{dist-cjs → dist/cjs}/util/Number.js +0 -0
- /package/dist/{schema → dts/schema}/Schema.d.ts +0 -0
- /package/dist/{spec → dts/spec}/Specifications.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvAny.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvArray.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvBoolean.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvCodec.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvNullable.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvNumber.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvObject.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvSchema.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvString.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvVoid.d.ts +0 -0
- /package/dist/{tlv → dts/tlv}/TlvWrapper.d.ts +0 -0
- /package/dist/{util → dts/util}/ByteArray.d.ts +0 -0
- /package/dist/{util → dts/util}/DataReader.d.ts +0 -0
- /package/dist/{util → dts/util}/DataWriter.d.ts +0 -0
- /package/dist/{util → dts/util}/Number.d.ts +0 -0
- /package/dist/{schema → es/schema}/Schema.js +0 -0
- /package/dist/{spec → es/spec}/Specifications.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvAny.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvArray.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvBoolean.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvCodec.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvNullable.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvNumber.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvSchema.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvString.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvVoid.js +0 -0
- /package/dist/{tlv → es/tlv}/TlvWrapper.js +0 -0
- /package/dist/{util → es/util}/DataReader.js +0 -0
- /package/dist/{util → es/util}/DataWriter.js +0 -0
- /package/dist/{util → es/util}/Number.js +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { TlvNodeId } from "../common/NodeId.js";
|
|
7
|
+
import { TlvAny } from "../tlv/TlvAny.js";
|
|
8
|
+
import { TlvArray } from "../tlv/TlvArray.js";
|
|
9
|
+
import { TlvBoolean } from "../tlv/TlvBoolean.js";
|
|
10
|
+
import { TlvEnum, TlvUInt16, TlvUInt32, TlvUInt64, TlvUInt8 } from "../tlv/TlvNumber.js";
|
|
11
|
+
import { TlvField, TlvList, TlvObject, TlvOptionalField } from "../tlv/TlvObject.js";
|
|
12
|
+
/**
|
|
13
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.6.1. StatusResponseMessage
|
|
14
|
+
*/
|
|
15
|
+
export const TlvStatusResponse = TlvObject({
|
|
16
|
+
status: TlvField(0, TlvEnum()),
|
|
17
|
+
interactionModelRevision: TlvField(0xFF, TlvUInt8),
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.5.2. AttributePathIB
|
|
21
|
+
*/
|
|
22
|
+
const TlvAttributePath = TlvList({
|
|
23
|
+
endpointId: TlvOptionalField(2, TlvUInt16),
|
|
24
|
+
clusterId: TlvOptionalField(3, TlvUInt32),
|
|
25
|
+
id: TlvOptionalField(4, TlvUInt32),
|
|
26
|
+
});
|
|
27
|
+
/**
|
|
28
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.6.2. ReadRequestMessage
|
|
29
|
+
*/
|
|
30
|
+
export const TlvReadRequest = TlvObject({
|
|
31
|
+
attributes: TlvField(0, TlvArray(TlvAttributePath)),
|
|
32
|
+
isFabricFiltered: TlvField(3, TlvBoolean),
|
|
33
|
+
interactionModelRevision: TlvField(0xFF, TlvUInt8),
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.6.3. ReportDataMessage
|
|
37
|
+
*/
|
|
38
|
+
export const TlvReportData = TlvObject({
|
|
39
|
+
subscriptionId: TlvOptionalField(0, TlvUInt32),
|
|
40
|
+
values: TlvField(1, TlvArray(TlvObject({
|
|
41
|
+
value: TlvField(1, TlvObject({
|
|
42
|
+
version: TlvField(0, TlvUInt32),
|
|
43
|
+
path: TlvField(1, TlvList({
|
|
44
|
+
endpointId: TlvField(2, TlvUInt16),
|
|
45
|
+
clusterId: TlvField(3, TlvUInt32),
|
|
46
|
+
id: TlvField(4, TlvUInt32),
|
|
47
|
+
})),
|
|
48
|
+
value: TlvField(2, TlvAny),
|
|
49
|
+
})),
|
|
50
|
+
}))),
|
|
51
|
+
isFabricFiltered: TlvOptionalField(4, TlvBoolean),
|
|
52
|
+
interactionModelRevision: TlvField(0xFF, TlvUInt8),
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.6.4. SubscribeRequestMessage
|
|
56
|
+
*/
|
|
57
|
+
export const TlvSubscribeRequest = TlvObject({
|
|
58
|
+
keepSubscriptions: TlvField(0, TlvBoolean),
|
|
59
|
+
minIntervalFloorSeconds: TlvField(1, TlvUInt16),
|
|
60
|
+
maxIntervalCeilingSeconds: TlvField(2, TlvUInt16),
|
|
61
|
+
attributeRequests: TlvOptionalField(3, TlvArray(TlvAttributePath)),
|
|
62
|
+
eventRequests: TlvOptionalField(4, TlvArray(TlvList({
|
|
63
|
+
node: TlvField(0, TlvNodeId),
|
|
64
|
+
endpoint: TlvField(1, TlvUInt16),
|
|
65
|
+
cluster: TlvField(2, TlvUInt32),
|
|
66
|
+
event: TlvField(3, TlvUInt32),
|
|
67
|
+
isUrgent: TlvField(4, TlvBoolean),
|
|
68
|
+
}))),
|
|
69
|
+
eventFilters: TlvOptionalField(5, TlvArray(TlvList({
|
|
70
|
+
node: TlvField(0, TlvNodeId),
|
|
71
|
+
eventMin: TlvField(1, TlvUInt64),
|
|
72
|
+
}))),
|
|
73
|
+
isFabricFiltered: TlvField(7, TlvBoolean),
|
|
74
|
+
dataVersionFilters: TlvOptionalField(8, TlvArray(TlvObject({
|
|
75
|
+
path: TlvField(0, TlvList({
|
|
76
|
+
node: TlvField(0, TlvNodeId),
|
|
77
|
+
endpoint: TlvField(1, TlvUInt16),
|
|
78
|
+
cluster: TlvField(2, TlvUInt32),
|
|
79
|
+
})),
|
|
80
|
+
dataVersion: TlvField(1, TlvUInt32),
|
|
81
|
+
}))),
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.6.5. SubscribeResponseMessage
|
|
85
|
+
*/
|
|
86
|
+
export const TlvSubscribeResponse = TlvObject({
|
|
87
|
+
subscriptionId: TlvField(0, TlvUInt32),
|
|
88
|
+
maxIntervalCeilingSeconds: TlvField(2, TlvUInt16),
|
|
89
|
+
interactionModelRevision: TlvField(0xFF, TlvUInt8),
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.6.9. InvokeRequestMessage
|
|
93
|
+
*/
|
|
94
|
+
export const TlvInvokeRequest = TlvObject({
|
|
95
|
+
suppressResponse: TlvField(0, TlvBoolean),
|
|
96
|
+
timedRequest: TlvField(1, TlvBoolean),
|
|
97
|
+
invokes: TlvField(2, TlvArray(TlvObject({
|
|
98
|
+
path: TlvField(0, TlvList({
|
|
99
|
+
endpointId: TlvField(0, TlvUInt16),
|
|
100
|
+
clusterId: TlvField(1, TlvUInt32),
|
|
101
|
+
id: TlvField(2, TlvUInt32),
|
|
102
|
+
})),
|
|
103
|
+
args: TlvField(1, TlvAny),
|
|
104
|
+
}))),
|
|
105
|
+
interactionModelRevision: TlvField(0xFF, TlvUInt8),
|
|
106
|
+
});
|
|
107
|
+
/**
|
|
108
|
+
* @see {@link MatterCoreSpecificationV1_0}, section 10.6.10. InvokeResponseMessage
|
|
109
|
+
*/
|
|
110
|
+
export const TlvInvokeResponse = TlvObject({
|
|
111
|
+
suppressResponse: TlvField(0, TlvBoolean),
|
|
112
|
+
responses: TlvField(1, TlvArray(TlvObject({
|
|
113
|
+
response: TlvOptionalField(0, TlvObject({
|
|
114
|
+
path: TlvField(0, TlvList({
|
|
115
|
+
endpointId: TlvField(0, TlvUInt16),
|
|
116
|
+
clusterId: TlvField(1, TlvUInt32),
|
|
117
|
+
id: TlvField(2, TlvUInt32),
|
|
118
|
+
})),
|
|
119
|
+
response: TlvField(1, TlvAny),
|
|
120
|
+
})),
|
|
121
|
+
result: TlvOptionalField(1, TlvObject({
|
|
122
|
+
path: TlvField(0, TlvList({
|
|
123
|
+
endpointId: TlvField(0, TlvUInt16),
|
|
124
|
+
clusterId: TlvField(1, TlvUInt32),
|
|
125
|
+
id: TlvField(2, TlvUInt32),
|
|
126
|
+
})),
|
|
127
|
+
result: TlvField(1, TlvObject({
|
|
128
|
+
code: TlvField(0, TlvUInt16),
|
|
129
|
+
})),
|
|
130
|
+
})),
|
|
131
|
+
}))),
|
|
132
|
+
interactionModelRevision: TlvField(0xFF, TlvUInt8),
|
|
133
|
+
});
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { ByteArray } from "../util/ByteArray";
|
|
7
|
+
import { Schema } from "./Schema";
|
|
8
|
+
const BitRange = (type, offset, length) => ({ type, offset, length });
|
|
9
|
+
export const BitFlag = (offset) => BitRange(0 /* BitRangeType.Flag */, offset, 1);
|
|
10
|
+
export const BitField = (offset, length) => BitRange(1 /* BitRangeType.Number */, offset, length);
|
|
11
|
+
export const BitFieldEnum = (offset, length) => BitRange(2 /* BitRangeType.Enum */, offset, length);
|
|
12
|
+
class BitmapSchemaInternal extends Schema {
|
|
13
|
+
constructor(bitSchemas) {
|
|
14
|
+
super();
|
|
15
|
+
this.bitSchemas = bitSchemas;
|
|
16
|
+
const masks = {};
|
|
17
|
+
for (const name in this.bitSchemas) {
|
|
18
|
+
const { offset, length } = this.bitSchemas[name];
|
|
19
|
+
masks[name] = ((1 << length) - 1) << offset;
|
|
20
|
+
}
|
|
21
|
+
this.masks = masks;
|
|
22
|
+
// TODO: validate that bitSchemas is coherent
|
|
23
|
+
}
|
|
24
|
+
encodeInternal(value) {
|
|
25
|
+
let result = 0;
|
|
26
|
+
for (const name in this.bitSchemas) {
|
|
27
|
+
const { type, offset } = this.bitSchemas[name];
|
|
28
|
+
switch (type) {
|
|
29
|
+
case 0 /* BitRangeType.Flag */:
|
|
30
|
+
if (value[name])
|
|
31
|
+
result |= this.masks[name];
|
|
32
|
+
break;
|
|
33
|
+
case 2 /* BitRangeType.Enum */:
|
|
34
|
+
case 1 /* BitRangeType.Number */:
|
|
35
|
+
result |= value[name] << offset;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
decodeInternal(bitmap) {
|
|
41
|
+
const result = {};
|
|
42
|
+
for (const name in this.bitSchemas) {
|
|
43
|
+
const { type, offset } = this.bitSchemas[name];
|
|
44
|
+
const mask = this.masks[name];
|
|
45
|
+
if (type === 0 /* BitRangeType.Flag */) {
|
|
46
|
+
result[name] = (bitmap & mask) !== 0;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
result[name] = (bitmap & mask) >> offset;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
class ByteArrayBitmapSchemaInternal extends Schema {
|
|
56
|
+
constructor(bitSchemas) {
|
|
57
|
+
super();
|
|
58
|
+
this.bitSchemas = bitSchemas;
|
|
59
|
+
let maxBitLength = 0;
|
|
60
|
+
const maskOffset = {};
|
|
61
|
+
for (const name in this.bitSchemas) {
|
|
62
|
+
const { offset, length } = this.bitSchemas[name];
|
|
63
|
+
const bitOffset = offset % 8;
|
|
64
|
+
const byteOffset = (offset - bitOffset) / 8;
|
|
65
|
+
const mask = ((1 << length) - 1) << bitOffset;
|
|
66
|
+
maskOffset[name] = { bitOffset, byteOffset, mask };
|
|
67
|
+
maxBitLength = Math.max(maxBitLength, offset + length);
|
|
68
|
+
}
|
|
69
|
+
this.byteArrayLength = Math.ceil(maxBitLength / 8);
|
|
70
|
+
this.maskOffset = maskOffset;
|
|
71
|
+
}
|
|
72
|
+
encodeInternal(value) {
|
|
73
|
+
let result = new ByteArray(this.byteArrayLength);
|
|
74
|
+
for (const name in this.bitSchemas) {
|
|
75
|
+
const { type } = this.bitSchemas[name];
|
|
76
|
+
let { mask, bitOffset, byteOffset } = this.maskOffset[name];
|
|
77
|
+
switch (type) {
|
|
78
|
+
case 0 /* BitRangeType.Flag */:
|
|
79
|
+
if (value[name])
|
|
80
|
+
result[byteOffset] |= mask;
|
|
81
|
+
break;
|
|
82
|
+
case 2 /* BitRangeType.Enum */:
|
|
83
|
+
case 1 /* BitRangeType.Number */:
|
|
84
|
+
let numValue = value[name];
|
|
85
|
+
while (mask !== 0) {
|
|
86
|
+
result[byteOffset++] |= ((numValue & mask) << bitOffset) & 0xFF;
|
|
87
|
+
const bitWritten = 8 - bitOffset;
|
|
88
|
+
bitOffset = 0;
|
|
89
|
+
numValue = numValue >> bitWritten;
|
|
90
|
+
mask = mask >> 8;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
decodeInternal(bitmap) {
|
|
97
|
+
if (bitmap.length !== this.byteArrayLength)
|
|
98
|
+
throw new Error(`Unexpected length: ${bitmap.length}. Expected ${this.byteArrayLength}`);
|
|
99
|
+
const result = {};
|
|
100
|
+
for (const name in this.bitSchemas) {
|
|
101
|
+
const { type } = this.bitSchemas[name];
|
|
102
|
+
let { mask, bitOffset, byteOffset } = this.maskOffset[name];
|
|
103
|
+
if (type === 0 /* BitRangeType.Flag */) {
|
|
104
|
+
result[name] = (bitmap[byteOffset] & mask) !== 0;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
let value = 0;
|
|
108
|
+
let valueBitOffset = 0;
|
|
109
|
+
while (mask !== 0) {
|
|
110
|
+
value |= ((bitmap[byteOffset++] & mask) >> bitOffset) << valueBitOffset;
|
|
111
|
+
const bitWritten = 8 - bitOffset;
|
|
112
|
+
bitOffset = 0;
|
|
113
|
+
valueBitOffset += bitWritten;
|
|
114
|
+
mask = mask >> 8;
|
|
115
|
+
}
|
|
116
|
+
result[name] = value;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Declares a bitmap schema by indicating the bit position and their names. */
|
|
123
|
+
export const BitmapSchema = (bitSchemas) => new BitmapSchemaInternal(bitSchemas);
|
|
124
|
+
/** Declares a bitmap schema backed by a ByteArray by indicating the bit position and their names. */
|
|
125
|
+
export const ByteArrayBitmapSchema = (bitSchemas) => new ByteArrayBitmapSchemaInternal(bitSchemas);
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { TlvSchema } from "./TlvSchema.js";
|
|
7
|
+
import { TlvAny } from "./TlvAny.js";
|
|
7
8
|
;
|
|
8
9
|
/**
|
|
9
10
|
* Schema to encode an object in TLV.
|
|
@@ -48,8 +49,11 @@ export class ObjectSchema extends TlvSchema {
|
|
|
48
49
|
if (id === undefined)
|
|
49
50
|
throw new Error("Structure element tags should have an id.");
|
|
50
51
|
const fieldName = this.fieldById[id];
|
|
51
|
-
if (fieldName === undefined)
|
|
52
|
-
|
|
52
|
+
if (fieldName === undefined) {
|
|
53
|
+
// Ignore unknown field by decoding it as raw TLV so we skip forward the proper length.
|
|
54
|
+
TlvAny.decodeTlvInternalValue(reader, elementTypeLength);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
53
57
|
const { field, name } = fieldName;
|
|
54
58
|
result[name] = field.schema.decodeTlvInternalValue(reader, elementTypeLength);
|
|
55
59
|
}
|
|
@@ -16,6 +16,8 @@ Uint8Array.prototype.equals = function (other) {
|
|
|
16
16
|
};
|
|
17
17
|
Uint8Array.fromHex = function (hexString) {
|
|
18
18
|
var _a;
|
|
19
|
+
if (hexString.length === 0)
|
|
20
|
+
return new ByteArray(0);
|
|
19
21
|
if (hexString.length % 2 !== 0)
|
|
20
22
|
throw new Error("Hex string should have an even length.");
|
|
21
23
|
const bytes = (_a = hexString.match(/.{1,2}/g)) === null || _a === void 0 ? void 0 : _a.map(byteHex => parseInt(byteHex, 16));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@project-chip/matter.js",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Matter protocol in pure js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"url": "https://github.com/project-chip/matter.js.git"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
|
-
"clean": "rm -rf dist; rm -rf
|
|
27
|
-
"build": "npm run clean; tsc --project tsconfig.dist.json; tsc --project tsconfig.dist-cjs.json",
|
|
26
|
+
"clean": "rm -rf dist; rm -rf out",
|
|
27
|
+
"build": "npm run clean; tsc --project tsconfig.dist-es.json; tsc --project tsconfig.dist-cjs.json; tsc --project tsconfig.dist-dts.json",
|
|
28
28
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
29
29
|
"test-web": "karma start karma.conf.cjs"
|
|
30
30
|
},
|
|
@@ -40,10 +40,9 @@
|
|
|
40
40
|
"typescript": "^4.9.3"
|
|
41
41
|
},
|
|
42
42
|
"files": [
|
|
43
|
-
"dist/**/*"
|
|
44
|
-
"dist-cjs/**/*"
|
|
43
|
+
"dist/**/*"
|
|
45
44
|
],
|
|
46
|
-
"main": "dist
|
|
47
|
-
"module": "dist/matter.js",
|
|
48
|
-
"types": "dist/matter.d.ts"
|
|
45
|
+
"main": "dist/cjs/matter.js",
|
|
46
|
+
"module": "dist/es/matter.js",
|
|
47
|
+
"types": "dist/dts/matter.d.ts"
|
|
49
48
|
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022 Project CHIP Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { Schema } from "./Schema.js";
|
|
7
|
-
const BitRange = (type, offset, length) => ({ type, mask: ((1 << length) - 1) << offset, offset });
|
|
8
|
-
export const BitFlag = (offset) => BitRange(0 /* BitRangeType.Flag */, offset, 1);
|
|
9
|
-
export const BitField = (offset, length) => BitRange(1 /* BitRangeType.Number */, offset, length);
|
|
10
|
-
export const BitFieldEnum = (offset, length) => BitRange(2 /* BitRangeType.Enum */, offset, length);
|
|
11
|
-
class BitmapSchemaInternal extends Schema {
|
|
12
|
-
constructor(bitSchemas) {
|
|
13
|
-
super();
|
|
14
|
-
this.bitSchemas = bitSchemas;
|
|
15
|
-
// TODO: validate that bitSchemas is coherent
|
|
16
|
-
}
|
|
17
|
-
encodeInternal(value) {
|
|
18
|
-
let result = 0;
|
|
19
|
-
for (const name in this.bitSchemas) {
|
|
20
|
-
const { type, offset, mask } = this.bitSchemas[name];
|
|
21
|
-
switch (type) {
|
|
22
|
-
case 0 /* BitRangeType.Flag */:
|
|
23
|
-
if (value[name])
|
|
24
|
-
result |= mask;
|
|
25
|
-
break;
|
|
26
|
-
case 2 /* BitRangeType.Enum */:
|
|
27
|
-
case 1 /* BitRangeType.Number */:
|
|
28
|
-
result |= value[name] << offset;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
33
|
-
decodeInternal(bitmap) {
|
|
34
|
-
const result = {};
|
|
35
|
-
for (const name in this.bitSchemas) {
|
|
36
|
-
const { type, offset, mask } = this.bitSchemas[name];
|
|
37
|
-
if (type === 0 /* BitRangeType.Flag */) {
|
|
38
|
-
result[name] = (bitmap & mask) !== 0;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
result[name] = (bitmap & mask) >> offset;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/** Declares a bitmap schema by indicating the bit position and their names. */
|
|
48
|
-
export const BitmapSchema = (bitSchemas) => new BitmapSchemaInternal(bitSchemas);
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2022 Project CHIP Authors
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.BitmapSchema = exports.BitFieldEnum = exports.BitField = exports.BitFlag = void 0;
|
|
9
|
-
const Schema_js_1 = require("./Schema.js");
|
|
10
|
-
const BitRange = (type, offset, length) => ({ type, mask: ((1 << length) - 1) << offset, offset });
|
|
11
|
-
const BitFlag = (offset) => BitRange(0 /* BitRangeType.Flag */, offset, 1);
|
|
12
|
-
exports.BitFlag = BitFlag;
|
|
13
|
-
const BitField = (offset, length) => BitRange(1 /* BitRangeType.Number */, offset, length);
|
|
14
|
-
exports.BitField = BitField;
|
|
15
|
-
const BitFieldEnum = (offset, length) => BitRange(2 /* BitRangeType.Enum */, offset, length);
|
|
16
|
-
exports.BitFieldEnum = BitFieldEnum;
|
|
17
|
-
class BitmapSchemaInternal extends Schema_js_1.Schema {
|
|
18
|
-
constructor(bitSchemas) {
|
|
19
|
-
super();
|
|
20
|
-
this.bitSchemas = bitSchemas;
|
|
21
|
-
// TODO: validate that bitSchemas is coherent
|
|
22
|
-
}
|
|
23
|
-
encodeInternal(value) {
|
|
24
|
-
let result = 0;
|
|
25
|
-
for (const name in this.bitSchemas) {
|
|
26
|
-
const { type, offset, mask } = this.bitSchemas[name];
|
|
27
|
-
switch (type) {
|
|
28
|
-
case 0 /* BitRangeType.Flag */:
|
|
29
|
-
if (value[name])
|
|
30
|
-
result |= mask;
|
|
31
|
-
break;
|
|
32
|
-
case 2 /* BitRangeType.Enum */:
|
|
33
|
-
case 1 /* BitRangeType.Number */:
|
|
34
|
-
result |= value[name] << offset;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return result;
|
|
38
|
-
}
|
|
39
|
-
decodeInternal(bitmap) {
|
|
40
|
-
const result = {};
|
|
41
|
-
for (const name in this.bitSchemas) {
|
|
42
|
-
const { type, offset, mask } = this.bitSchemas[name];
|
|
43
|
-
if (type === 0 /* BitRangeType.Flag */) {
|
|
44
|
-
result[name] = (bitmap & mask) !== 0;
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
result[name] = (bitmap & mask) >> offset;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/** Declares a bitmap schema by indicating the bit position and their names. */
|
|
54
|
-
const BitmapSchema = (bitSchemas) => new BitmapSchemaInternal(bitSchemas);
|
|
55
|
-
exports.BitmapSchema = BitmapSchema;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|