url-safe-bitpacking 0.1.14 → 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 +9 -0
- package/dist/enums/dataTypes.d.ts +4 -8
- package/dist/factory/arrayFactory.d.ts +2 -0
- package/dist/factory/enumArrayFactory.d.ts +2 -0
- package/dist/factory/enumFactory.d.ts +1 -1
- package/dist/factory/enumOptionsFactory.d.ts +2 -0
- package/dist/factory/factory.d.ts +13 -0
- package/dist/factory/floatFactory.d.ts +9 -0
- package/dist/factory/helperMethod.d.ts +19 -0
- package/dist/factory/optionalFactory.d.ts +2 -0
- package/dist/factory/utils.d.ts +9 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +536 -306
- package/dist/parsers/arrayParser.d.ts +4 -0
- package/dist/parsers/enumArrayParser.d.ts +4 -0
- package/dist/parsers/enumOptionsFactory.d.ts +4 -0
- package/dist/parsers/intParser.d.ts +6 -0
- package/dist/parsers/optionalParser.d.ts +4 -0
- package/dist/parsers/parsers.d.ts +81 -13
- package/dist/stateHandling/index.d.ts +1 -0
- package/dist/stateHandling/stateData.d.ts +3 -0
- package/dist/stateHandling/stateDataObject.d.ts +15 -0
- package/dist/typeFactory/dataEntryTyping.d.ts +6 -0
- package/dist/typeFactory/index.d.ts +1 -0
- package/dist/typeFactory/stateDataTyping.d.ts +1 -0
- package/dist/types/arrayData.d.ts +10 -0
- package/dist/types/booleanData.d.ts +1 -2
- package/dist/types/dataEntry.d.ts +64 -6
- package/dist/types/enumArrayData.d.ts +20 -0
- package/dist/types/enumData.d.ts +8 -2
- package/dist/types/enumOptionsData.d.ts +8 -0
- package/dist/types/floatData.d.ts +10 -2
- package/dist/types/index.d.ts +7 -5
- package/dist/types/intData.d.ts +8 -2
- package/dist/types/optionalData.d.ts +7 -0
- package/dist/types/stateDataEntry.d.ts +16 -0
- package/dist/types/versionData.d.ts +1 -2
- package/dist/update/arrayUpdate.d.ts +2 -0
- package/dist/update/enumArrayUpdate.d.ts +2 -0
- package/dist/update/enumOptionsUpdate.d.ts +2 -0
- package/dist/update/nestedDataMatching.d.ts +2 -0
- package/dist/update/optionalUpdate.d.ts +2 -0
- package/dist/update/updateValues.d.ts +14 -1
- package/package.json +3 -2
- package/dist/objectmap/index.d.ts +0 -4
- package/dist/objectmap/stateDataModel.d.ts +0 -19
- package/dist/objectmap/stateValueHelperMethods.d.ts +0 -13
- package/dist/objectmap/userMethods.d.ts +0 -12
- package/dist/types/arrayDefinitions.d.ts +0 -10
- package/dist/types/semanticMapping.d.ts +0 -6
- package/dist/types/stateValueModel.d.ts +0 -33
package/dist/index.js
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
// src/enums/dataTypes.ts
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
DataType2[DataType2["VERSION"] = 0] = "VERSION";
|
|
5
|
-
DataType2[DataType2["BOOLEAN"] = 1] = "BOOLEAN";
|
|
6
|
-
DataType2[DataType2["ENUM"] = 2] = "ENUM";
|
|
7
|
-
DataType2[DataType2["INT"] = 3] = "INT";
|
|
8
|
-
DataType2[DataType2["FLOAT"] = 4] = "FLOAT";
|
|
9
|
-
})(DataType || (DataType = {}));
|
|
10
|
-
// src/enums/objectGenerationTypes.ts
|
|
11
|
-
var ObjectGenerationOutputStatus;
|
|
12
|
-
(function(ObjectGenerationOutputStatus2) {
|
|
13
|
-
ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["DEFAULT"] = 0] = "DEFAULT";
|
|
14
|
-
ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["FROM_TYPE"] = 1] = "FROM_TYPE";
|
|
15
|
-
ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["PARSED"] = 2] = "PARSED";
|
|
16
|
-
ObjectGenerationOutputStatus2[ObjectGenerationOutputStatus2["ERROR_PARSING"] = 3] = "ERROR_PARSING";
|
|
17
|
-
})(ObjectGenerationOutputStatus || (ObjectGenerationOutputStatus = {}));
|
|
2
|
+
var DataTypeValues = ["VERSION", "BOOLEAN", "ENUM", "INT", "FLOAT", "ENUM_ARRAY"];
|
|
3
|
+
var ComplexDataValues = ["OPTIONAL", "ENUM_OPTIONS", "ARRAY"];
|
|
18
4
|
// src/types/floatData.ts
|
|
19
5
|
var SignificandMaxBits = 20;
|
|
20
|
-
|
|
21
|
-
// src/types/arrayDefinitions.ts
|
|
22
|
-
var PREFIX_SEPERATOR_DELIMETER = "_";
|
|
23
6
|
// src/types/enumData.ts
|
|
24
7
|
var EnumMaxBits = 8;
|
|
25
8
|
// src/types/intData.ts
|
|
26
9
|
var IntegerMaxBits = 12;
|
|
27
|
-
// src/types/
|
|
28
|
-
var
|
|
10
|
+
// src/types/dataEntry.ts
|
|
11
|
+
var PROTECTED_ATTRIBUTE_NAMES = [
|
|
12
|
+
"type",
|
|
13
|
+
"value",
|
|
14
|
+
"name",
|
|
15
|
+
"internalName",
|
|
16
|
+
"index",
|
|
17
|
+
"min",
|
|
18
|
+
"max",
|
|
19
|
+
"bits",
|
|
20
|
+
"precision",
|
|
21
|
+
"significand",
|
|
22
|
+
"minCount",
|
|
23
|
+
"maxCount",
|
|
24
|
+
"state",
|
|
25
|
+
"stateBits",
|
|
26
|
+
"descriptor",
|
|
27
|
+
"mapping"
|
|
28
|
+
];
|
|
29
29
|
// src/factory/helperMethod.ts
|
|
30
30
|
var getBitsForIntegerNumber = (number, maxBits) => {
|
|
31
31
|
const bitCount = Math.ceil(Math.log2(number));
|
|
@@ -33,14 +33,7 @@ var getBitsForIntegerNumber = (number, maxBits) => {
|
|
|
33
33
|
throw new Error(`Cannot get ${maxBits} bits for a number with ${bitCount} bits`);
|
|
34
34
|
return bitCount;
|
|
35
35
|
};
|
|
36
|
-
var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v));
|
|
37
|
-
var getVersionValueRangeValueForNumber = (v) => {
|
|
38
|
-
const minBits = getMinimumBitsForInteger(v);
|
|
39
|
-
const versionBits = VersionRange.find((x) => x >= minBits);
|
|
40
|
-
if (versionBits === undefined)
|
|
41
|
-
throw new Error(`Cannot find version range for ${v}, max amount of versions allowed is ${2 ** VersionRange[VersionRange.length - 1]}`);
|
|
42
|
-
return versionBits;
|
|
43
|
-
};
|
|
36
|
+
var getMinimumBitsForInteger = (v) => Math.ceil(Math.log2(v + 1));
|
|
44
37
|
|
|
45
38
|
// src/factory/floatFactory.ts
|
|
46
39
|
var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) => {
|
|
@@ -51,7 +44,7 @@ var create = (value, min = 0, max = 1, precision = 2, name = "", index = -1) =>
|
|
|
51
44
|
const significand = Math.max(1, getBitsForIntegerNumber(delta, SignificandMaxBits));
|
|
52
45
|
return {
|
|
53
46
|
value,
|
|
54
|
-
type:
|
|
47
|
+
type: "FLOAT",
|
|
55
48
|
min: roundedMin / precisionMultiplier,
|
|
56
49
|
max: roundedMax / precisionMultiplier,
|
|
57
50
|
precision,
|
|
@@ -70,31 +63,149 @@ var create2 = (value, min = 0, max = 10, name = "", index = -1) => {
|
|
|
70
63
|
if (Math.abs(max - min) > 2 ** IntegerMaxBits - 1)
|
|
71
64
|
throw new Error("max - min must be less than 1024");
|
|
72
65
|
const bits = getBitsForIntegerNumber(max - min + 1, IntegerMaxBits);
|
|
73
|
-
return { value, type:
|
|
66
|
+
return { value, type: "INT", min, max, bits, name, index };
|
|
74
67
|
};
|
|
75
68
|
|
|
76
69
|
// src/factory/booleanFactory.ts
|
|
77
|
-
var create3 = (value, name = "", index = -1) => ({
|
|
70
|
+
var create3 = (value, name = "", index = -1) => ({
|
|
71
|
+
value,
|
|
72
|
+
type: "BOOLEAN",
|
|
73
|
+
name,
|
|
74
|
+
index
|
|
75
|
+
});
|
|
78
76
|
|
|
79
77
|
// src/factory/versionFactory.ts
|
|
80
78
|
var create4 = (value, bits = 8, name = "", index = -1) => ({
|
|
81
79
|
value,
|
|
82
|
-
type:
|
|
80
|
+
type: "VERSION",
|
|
83
81
|
bits,
|
|
84
82
|
name,
|
|
85
83
|
index
|
|
86
84
|
});
|
|
87
85
|
|
|
86
|
+
// src/factory/utils.ts
|
|
87
|
+
var getOptionsFromEnumOptions = (options) => {
|
|
88
|
+
if (typeof options === "string")
|
|
89
|
+
return { max: options.length - 1, mapping: options.split(",").map(Number) };
|
|
90
|
+
if (typeof options === "number")
|
|
91
|
+
return { max: options, mapping: Array.from({ length: options + 1 }, (_, i) => i) };
|
|
92
|
+
return { max: options.length - 1, mapping: options };
|
|
93
|
+
};
|
|
94
|
+
|
|
88
95
|
// src/factory/enumFactory.ts
|
|
89
|
-
var create5 = (value,
|
|
96
|
+
var create5 = (value, options, name = "", index = -1) => {
|
|
97
|
+
const { max, mapping } = getOptionsFromEnumOptions(options);
|
|
90
98
|
if (!Number.isInteger(max))
|
|
91
|
-
throw new Error(
|
|
99
|
+
throw new Error(`max must be integers, you have given ${max}`);
|
|
92
100
|
if (max < 1)
|
|
93
101
|
throw new Error("max must be at least one");
|
|
94
102
|
if (max > 2 ** EnumMaxBits - 1)
|
|
95
103
|
throw new Error("max - min must be less than 256");
|
|
96
104
|
const bits = getBitsForIntegerNumber(max + 1, EnumMaxBits);
|
|
97
|
-
return { value, type:
|
|
105
|
+
return { value, type: "ENUM", max, bits, name, index, mapping };
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// src/factory/enumArrayFactory.ts
|
|
109
|
+
var create6 = (value, options, minCount = 1, maxCount = 10, name = "", index = -1) => {
|
|
110
|
+
const { max, mapping } = getOptionsFromEnumOptions(options);
|
|
111
|
+
if (!Number.isInteger(max))
|
|
112
|
+
throw new Error(`max must be integers, you have given ${max}`);
|
|
113
|
+
if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
|
|
114
|
+
throw new Error("minCount and maxCount must be integers");
|
|
115
|
+
if (max < 1)
|
|
116
|
+
throw new Error("must have at least two options");
|
|
117
|
+
if (max > 2 ** IntegerMaxBits - 1)
|
|
118
|
+
throw new Error(`maximum allowed options is 1024, you have given ${max + 1} options`);
|
|
119
|
+
minCount = Math.min(minCount, maxCount);
|
|
120
|
+
maxCount = Math.max(minCount, maxCount);
|
|
121
|
+
if (minCount < 1)
|
|
122
|
+
throw new Error("minCount must be at least one");
|
|
123
|
+
if (maxCount - minCount < 0)
|
|
124
|
+
throw new Error(`count range length must be positive, given count range length is ${Math.abs(maxCount - minCount)}`);
|
|
125
|
+
if (Math.abs(maxCount - minCount) > 2 ** IntegerMaxBits - 1)
|
|
126
|
+
throw new Error(`count range length must be less than 1024, given count range length is ${Math.abs(maxCount - minCount)}`);
|
|
127
|
+
value.forEach((v, i) => {
|
|
128
|
+
if (!Number.isInteger(v))
|
|
129
|
+
throw new Error(`all entries must be integers, index ${i} (${v}) is not`);
|
|
130
|
+
if (v > max)
|
|
131
|
+
throw new Error(`all entries must be within the range ${0} - ${max}, index ${i} (${v}) is not`);
|
|
132
|
+
});
|
|
133
|
+
if (value.length < minCount || value.length > maxCount)
|
|
134
|
+
throw new Error(`value length must be between minCount and maxCount, ${value.length} is not between ${minCount} and ${maxCount}`);
|
|
135
|
+
return {
|
|
136
|
+
type: "ENUM_ARRAY",
|
|
137
|
+
minCount,
|
|
138
|
+
maxCount,
|
|
139
|
+
value: JSON.parse(JSON.stringify(value)),
|
|
140
|
+
max,
|
|
141
|
+
name,
|
|
142
|
+
index,
|
|
143
|
+
mapping
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// src/factory/optionalFactory.ts
|
|
148
|
+
var create7 = (descriptor, defaultState = false, name = "", index = -1) => {
|
|
149
|
+
if (descriptor[0] === null && descriptor[1] === null)
|
|
150
|
+
throw new Error("descriptor must have at least one non-null value");
|
|
151
|
+
if (descriptor[0] !== null && descriptor[1] !== null)
|
|
152
|
+
throw new Error("descriptor must have only one non-null value");
|
|
153
|
+
return {
|
|
154
|
+
type: "OPTIONAL",
|
|
155
|
+
state: defaultState,
|
|
156
|
+
descriptor,
|
|
157
|
+
value: JSON.parse(JSON.stringify(defaultState ? descriptor[1] : descriptor[0])),
|
|
158
|
+
name,
|
|
159
|
+
index
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// src/factory/enumOptionsFactory.ts
|
|
164
|
+
var maxEnumOptions = 64;
|
|
165
|
+
var maxEnumOptionsBits = getMinimumBitsForInteger(maxEnumOptions);
|
|
166
|
+
var create8 = (descriptor, defaultState = 0, name = "", index = -1) => {
|
|
167
|
+
if (descriptor.length < 2)
|
|
168
|
+
throw new Error("descriptor must have at least two entries");
|
|
169
|
+
if (descriptor.length - 1 < defaultState)
|
|
170
|
+
throw new Error("defaultState must be less than the length of the descriptor");
|
|
171
|
+
return {
|
|
172
|
+
value: JSON.parse(JSON.stringify(descriptor[defaultState])),
|
|
173
|
+
descriptor,
|
|
174
|
+
name,
|
|
175
|
+
index,
|
|
176
|
+
type: "ENUM_OPTIONS",
|
|
177
|
+
stateBits: getBitsForIntegerNumber(descriptor.length, maxEnumOptionsBits),
|
|
178
|
+
state: defaultState
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
// src/factory/arrayFactory.ts
|
|
183
|
+
var maxArrayCount = 64;
|
|
184
|
+
var create9 = (descriptor, defaultState = 0, minCount = 0, maxCount = 10, name = "", index = -1) => {
|
|
185
|
+
if (!Number.isInteger(minCount) || !Number.isInteger(maxCount))
|
|
186
|
+
throw new Error("minCount and maxCount must be integers");
|
|
187
|
+
if (minCount < 0)
|
|
188
|
+
throw new Error("minCount must be at least 0");
|
|
189
|
+
if (maxCount < 0)
|
|
190
|
+
throw new Error("maxCount must be at least 0");
|
|
191
|
+
if (maxCount - minCount < 0)
|
|
192
|
+
throw new Error("maxCount must be greater than or equal to minCount");
|
|
193
|
+
if (maxCount - minCount > maxArrayCount)
|
|
194
|
+
throw new Error(`maxCount (${maxCount}) - minCount (${minCount}) = ${maxCount - minCount} must be less than or equal to maxArrayCount (${maxArrayCount})`);
|
|
195
|
+
if (defaultState < minCount || defaultState > maxCount)
|
|
196
|
+
throw new Error(`defaultState must be between minCount (${minCount}) and maxCount (${maxCount}), given defaultState is ${defaultState}`);
|
|
197
|
+
const stateBits = getMinimumBitsForInteger(maxCount - minCount);
|
|
198
|
+
return {
|
|
199
|
+
value: [...Array(defaultState)].map(() => JSON.parse(JSON.stringify(descriptor))),
|
|
200
|
+
descriptor,
|
|
201
|
+
type: "ARRAY",
|
|
202
|
+
minCount,
|
|
203
|
+
maxCount,
|
|
204
|
+
stateBits,
|
|
205
|
+
state: defaultState,
|
|
206
|
+
name,
|
|
207
|
+
index
|
|
208
|
+
};
|
|
98
209
|
};
|
|
99
210
|
|
|
100
211
|
// src/factory/factory.ts
|
|
@@ -103,10 +214,16 @@ var DataEntryFactory = {
|
|
|
103
214
|
createInt: create2,
|
|
104
215
|
createEnum: create5,
|
|
105
216
|
createBoolean: create3,
|
|
106
|
-
createVersion: create4
|
|
217
|
+
createVersion: create4,
|
|
218
|
+
createEnumArray: create6
|
|
219
|
+
};
|
|
220
|
+
var ComplexDataEntryFactory = {
|
|
221
|
+
createOptional: create7,
|
|
222
|
+
createEnumOptions: create8,
|
|
223
|
+
createArray: create9
|
|
107
224
|
};
|
|
108
225
|
// src/parsers/intParser.ts
|
|
109
|
-
var getBitsCount = (
|
|
226
|
+
var getBitsCount = (intData2) => intData2.bits;
|
|
110
227
|
var rawValueParser = (stateString, bitCount) => {
|
|
111
228
|
if (stateString.length < bitCount)
|
|
112
229
|
throw new Error(`To few bits for this int bit string (${stateString.length} instead of ${bitCount})`);
|
|
@@ -117,9 +234,9 @@ var rawValueParser = (stateString, bitCount) => {
|
|
|
117
234
|
throw new Error("Invalid int state string");
|
|
118
235
|
return parsed;
|
|
119
236
|
};
|
|
120
|
-
var rawParser = (stateString,
|
|
121
|
-
const v = rawValueParser(stateString,
|
|
122
|
-
if (v >
|
|
237
|
+
var rawParser = (stateString, intData2) => {
|
|
238
|
+
const v = rawValueParser(stateString, intData2.bits) + intData2.min;
|
|
239
|
+
if (v > intData2.max)
|
|
123
240
|
throw new Error("Value exceeds max");
|
|
124
241
|
return v;
|
|
125
242
|
};
|
|
@@ -128,16 +245,16 @@ var rawIntStringifier = (value, bitCount) => {
|
|
|
128
245
|
throw new Error("Value is not an integer");
|
|
129
246
|
return value.toString(2).padStart(bitCount, "0");
|
|
130
247
|
};
|
|
131
|
-
var rawStringifier = (value,
|
|
132
|
-
if (value <
|
|
248
|
+
var rawStringifier = (value, intData2) => {
|
|
249
|
+
if (value < intData2.min)
|
|
133
250
|
throw new Error("Value is below min");
|
|
134
|
-
if (value >
|
|
251
|
+
if (value > intData2.max)
|
|
135
252
|
throw new Error("Value exceeds max");
|
|
136
|
-
return rawIntStringifier(value -
|
|
253
|
+
return rawIntStringifier(value - intData2.min, intData2.bits);
|
|
137
254
|
};
|
|
138
255
|
|
|
139
256
|
// src/parsers/floatParser.ts
|
|
140
|
-
var getBitsCount2 = (
|
|
257
|
+
var getBitsCount2 = (floatData2) => floatData2.significand;
|
|
141
258
|
var rawValueParser2 = (stateString, significandBits, precision) => {
|
|
142
259
|
if (stateString.length < significandBits)
|
|
143
260
|
throw new Error(`To few bits for this float bit string (${stateString.length} instead of ${significandBits})`);
|
|
@@ -146,13 +263,13 @@ var rawValueParser2 = (stateString, significandBits, precision) => {
|
|
|
146
263
|
const significand = rawValueParser(stateString, significandBits);
|
|
147
264
|
return significand * 10 ** -precision;
|
|
148
265
|
};
|
|
149
|
-
var rawParser2 = (stateString,
|
|
150
|
-
const v =
|
|
151
|
-
if (v >
|
|
266
|
+
var rawParser2 = (stateString, floatData2) => {
|
|
267
|
+
const v = floatData2.min + rawValueParser2(stateString, floatData2.significand, floatData2.precision);
|
|
268
|
+
if (v > floatData2.max)
|
|
152
269
|
throw new Error("Float value exceeds max");
|
|
153
270
|
return v;
|
|
154
271
|
};
|
|
155
|
-
var rawStringifier2 = (value,
|
|
272
|
+
var rawStringifier2 = (value, floatData2) => rawIntStringifier(Math.round((value - floatData2.min) * 10 ** floatData2.precision), floatData2.significand);
|
|
156
273
|
|
|
157
274
|
// src/parsers/enumParser.ts
|
|
158
275
|
var getBitsCount3 = (versionData2) => versionData2.bits;
|
|
@@ -184,66 +301,202 @@ var rawValueParser3 = (stateString) => {
|
|
|
184
301
|
var rawParser5 = (stateString) => rawValueParser3(stateString);
|
|
185
302
|
var rawStringifier5 = (value) => value ? "1" : "0";
|
|
186
303
|
|
|
304
|
+
// src/parsers/enumArrayParser.ts
|
|
305
|
+
var getCountBitsCount = (enumArrayData2) => getBitsForIntegerNumber(enumArrayData2.maxCount - enumArrayData2.minCount + 1, IntegerMaxBits);
|
|
306
|
+
var getNumberBitsCountForBase = (count, base) => getBitsForEnumArrayCountOfBase(count, base);
|
|
307
|
+
var getEnumArrayBase = (enumArrayData2) => enumArrayData2.max + 1;
|
|
308
|
+
var getCount = (enumArrayData2, bitString) => {
|
|
309
|
+
const countBits = getCountBitsCount(enumArrayData2);
|
|
310
|
+
if (countBits === 0)
|
|
311
|
+
return enumArrayData2.minCount;
|
|
312
|
+
return rawValueParser(bitString.slice(0, countBits), countBits) + enumArrayData2.minCount;
|
|
313
|
+
};
|
|
314
|
+
var getBitsCount6 = (enumArrayData2, bitString) => {
|
|
315
|
+
const countBits = getCountBitsCount(enumArrayData2);
|
|
316
|
+
const count = getCount(enumArrayData2, bitString);
|
|
317
|
+
const valuesBitCount = getNumberBitsCountForBase(count, getEnumArrayBase(enumArrayData2));
|
|
318
|
+
return countBits + valuesBitCount;
|
|
319
|
+
};
|
|
320
|
+
var rawParser6 = (bitString, enumArrayData2) => {
|
|
321
|
+
const countBits = getCountBitsCount(enumArrayData2);
|
|
322
|
+
const count = getCount(enumArrayData2, bitString);
|
|
323
|
+
const base = getEnumArrayBase(enumArrayData2);
|
|
324
|
+
const valuesBitCount = getNumberBitsCountForBase(count, base);
|
|
325
|
+
return convertBitStringToArbitraryBase(bitString.slice(countBits, countBits + valuesBitCount), base, count);
|
|
326
|
+
};
|
|
327
|
+
var rawStringifier6 = (value, enumArrayData2) => {
|
|
328
|
+
const countBits = getCountBitsCount(enumArrayData2);
|
|
329
|
+
const count = value.length;
|
|
330
|
+
const base = getEnumArrayBase(enumArrayData2);
|
|
331
|
+
const countBitstring = countBits ? rawIntStringifier(count - enumArrayData2.minCount, countBits) : "";
|
|
332
|
+
const enumArrayBitstring = convertArbitraryBaseToBitString(value, base);
|
|
333
|
+
return countBitstring + enumArrayBitstring;
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
// src/parsers/arrayParser.ts
|
|
337
|
+
var getCount2 = (arrayData2, bitString) => {
|
|
338
|
+
if (arrayData2.stateBits === 0)
|
|
339
|
+
return arrayData2.minCount;
|
|
340
|
+
return rawValueParser(bitString.slice(0, arrayData2.stateBits), arrayData2.stateBits) + arrayData2.minCount;
|
|
341
|
+
};
|
|
342
|
+
var rawParser7 = (bitString, arrayData2) => {
|
|
343
|
+
const state = getCount2(arrayData2, bitString);
|
|
344
|
+
bitString = bitString.slice(arrayData2.stateBits);
|
|
345
|
+
const value = [];
|
|
346
|
+
for (let i = 0;i < state; i++) {
|
|
347
|
+
const [nestedData, remainingBitstring] = nestedDataBitstringParser(bitString, arrayData2.descriptor);
|
|
348
|
+
value.push(nestedData);
|
|
349
|
+
bitString = remainingBitstring;
|
|
350
|
+
}
|
|
351
|
+
return [{ ...arrayData2, value, state }, bitString];
|
|
352
|
+
};
|
|
353
|
+
var rawStateStringifier = (arrayData2) => arrayData2.stateBits ? rawIntStringifier(arrayData2.value.length - arrayData2.minCount, arrayData2.stateBits) : "";
|
|
354
|
+
|
|
355
|
+
// src/parsers/optionalParser.ts
|
|
356
|
+
var getState = (bitString) => Number(bitString.slice(0, 1));
|
|
357
|
+
var rawParser8 = (bitString, optionalData2) => {
|
|
358
|
+
const descriptorIndex = getState(bitString);
|
|
359
|
+
bitString = bitString.slice(1);
|
|
360
|
+
const [value, remainingBitstring] = optionalData2.descriptor[descriptorIndex] ? nestedDataBitstringParser(bitString, optionalData2.descriptor[descriptorIndex]) : [null, bitString];
|
|
361
|
+
const state = Boolean(descriptorIndex);
|
|
362
|
+
return [{ ...optionalData2, value, state }, remainingBitstring];
|
|
363
|
+
};
|
|
364
|
+
var rawStateStringifier2 = (optionalData2) => optionalData2.state ? "1" : "0";
|
|
365
|
+
|
|
366
|
+
// src/parsers/enumOptionsFactory.ts
|
|
367
|
+
var getStateIndex = (enumOptionsData2, bitString) => {
|
|
368
|
+
if (enumOptionsData2.stateBits === 0)
|
|
369
|
+
return 0;
|
|
370
|
+
return rawValueParser(bitString.slice(0, enumOptionsData2.stateBits), enumOptionsData2.stateBits);
|
|
371
|
+
};
|
|
372
|
+
var rawParser9 = (bitString, enumOptionsData2) => {
|
|
373
|
+
const state = getStateIndex(enumOptionsData2, bitString);
|
|
374
|
+
bitString = bitString.slice(enumOptionsData2.stateBits);
|
|
375
|
+
const [value, remainingBitstring] = nestedDataBitstringParser(bitString, enumOptionsData2.descriptor[state]);
|
|
376
|
+
return [{ ...enumOptionsData2, value, state }, remainingBitstring];
|
|
377
|
+
};
|
|
378
|
+
var rawStateStringifier3 = (enumOptionsData2) => rawIntStringifier(enumOptionsData2.state, enumOptionsData2.stateBits);
|
|
379
|
+
|
|
187
380
|
// src/parsers/parsers.ts
|
|
188
381
|
var valueBitsParser = (bitString, mapData) => {
|
|
189
382
|
switch (mapData.type) {
|
|
190
|
-
case
|
|
383
|
+
case "BOOLEAN":
|
|
191
384
|
return rawParser5(bitString);
|
|
192
|
-
case
|
|
385
|
+
case "INT":
|
|
193
386
|
return rawParser(bitString, mapData);
|
|
194
|
-
case
|
|
387
|
+
case "ENUM":
|
|
195
388
|
return rawParser3(bitString, mapData);
|
|
196
|
-
case
|
|
389
|
+
case "FLOAT":
|
|
197
390
|
return rawParser2(bitString, mapData);
|
|
198
|
-
case
|
|
391
|
+
case "VERSION":
|
|
199
392
|
return rawParser4(bitString, mapData);
|
|
393
|
+
case "ENUM_ARRAY":
|
|
394
|
+
return rawParser6(bitString, mapData);
|
|
200
395
|
}
|
|
201
396
|
};
|
|
202
397
|
var dataBitsParser = (rawString, mapData) => {
|
|
203
398
|
switch (mapData.type) {
|
|
204
|
-
case
|
|
399
|
+
case "BOOLEAN":
|
|
400
|
+
return { ...mapData, value: valueBitsParser(rawString, mapData) };
|
|
401
|
+
case "ENUM":
|
|
402
|
+
case "INT":
|
|
403
|
+
case "FLOAT":
|
|
404
|
+
case "VERSION":
|
|
205
405
|
return { ...mapData, value: valueBitsParser(rawString, mapData) };
|
|
206
|
-
case
|
|
207
|
-
case DataType.INT:
|
|
208
|
-
case DataType.FLOAT:
|
|
209
|
-
case DataType.VERSION:
|
|
406
|
+
case "ENUM_ARRAY":
|
|
210
407
|
return { ...mapData, value: valueBitsParser(rawString, mapData) };
|
|
211
408
|
}
|
|
212
409
|
};
|
|
213
|
-
var
|
|
410
|
+
var getBitsCount7 = (mapData, bitString) => {
|
|
214
411
|
switch (mapData.type) {
|
|
215
|
-
case
|
|
412
|
+
case "BOOLEAN":
|
|
216
413
|
return getBitsCount5();
|
|
217
|
-
case
|
|
414
|
+
case "INT":
|
|
218
415
|
return getBitsCount(mapData);
|
|
219
|
-
case
|
|
416
|
+
case "FLOAT":
|
|
220
417
|
return getBitsCount2(mapData);
|
|
221
|
-
case
|
|
418
|
+
case "VERSION":
|
|
222
419
|
return getBitsCount4(mapData);
|
|
223
|
-
case
|
|
420
|
+
case "ENUM":
|
|
224
421
|
return getBitsCount3(mapData);
|
|
422
|
+
case "ENUM_ARRAY":
|
|
423
|
+
return getBitsCount6(mapData, bitString);
|
|
225
424
|
}
|
|
226
425
|
};
|
|
227
426
|
var dataEntryBitstringParser = (bitstring, dataEntry2) => [
|
|
228
|
-
dataBitsParser(bitstring.slice(0,
|
|
229
|
-
bitstring.slice(
|
|
427
|
+
dataBitsParser(bitstring.slice(0, getBitsCount7(dataEntry2, bitstring)), dataEntry2),
|
|
428
|
+
bitstring.slice(getBitsCount7(dataEntry2, bitstring))
|
|
230
429
|
];
|
|
430
|
+
var nestedDataBitstringParser = (bitstring, descriptor) => {
|
|
431
|
+
const resultingNestedData = descriptor.map((data) => {
|
|
432
|
+
const [resultingData, remainingBitstring] = ComplexDataValues.includes(data.type) ? complexDataEntryBitstringParser(bitstring, data) : dataEntryBitstringParser(bitstring, data);
|
|
433
|
+
bitstring = remainingBitstring;
|
|
434
|
+
return resultingData;
|
|
435
|
+
});
|
|
436
|
+
return [resultingNestedData, bitstring];
|
|
437
|
+
};
|
|
438
|
+
var complexDataEntryBitstringParser = (bitstring, complexDataEntry) => {
|
|
439
|
+
switch (complexDataEntry.type) {
|
|
440
|
+
case "ARRAY":
|
|
441
|
+
return rawParser7(bitstring, complexDataEntry);
|
|
442
|
+
case "OPTIONAL":
|
|
443
|
+
return rawParser8(bitstring, complexDataEntry);
|
|
444
|
+
case "ENUM_OPTIONS":
|
|
445
|
+
return rawParser9(bitstring, complexDataEntry);
|
|
446
|
+
}
|
|
447
|
+
};
|
|
231
448
|
var dataBitsStringifier = (data) => {
|
|
232
449
|
switch (data.type) {
|
|
233
|
-
case
|
|
450
|
+
case "BOOLEAN":
|
|
234
451
|
return rawStringifier5(data.value);
|
|
235
|
-
case
|
|
452
|
+
case "INT":
|
|
236
453
|
return rawStringifier(data.value, data);
|
|
237
|
-
case
|
|
454
|
+
case "FLOAT":
|
|
238
455
|
return rawStringifier2(data.value, data);
|
|
239
|
-
case
|
|
456
|
+
case "VERSION":
|
|
240
457
|
return rawStringifier4(data.value, data);
|
|
241
|
-
case
|
|
458
|
+
case "ENUM":
|
|
242
459
|
return rawStringifier3(data.value, data);
|
|
460
|
+
case "ENUM_ARRAY":
|
|
461
|
+
return rawStringifier6(data.value, data);
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
var complexDataStateStringifier = (complexDataEntry) => {
|
|
465
|
+
switch (complexDataEntry.type) {
|
|
466
|
+
case "ARRAY":
|
|
467
|
+
return rawStateStringifier(complexDataEntry);
|
|
468
|
+
case "OPTIONAL":
|
|
469
|
+
return rawStateStringifier2(complexDataEntry);
|
|
470
|
+
case "ENUM_OPTIONS":
|
|
471
|
+
return rawStateStringifier3(complexDataEntry);
|
|
243
472
|
}
|
|
244
473
|
};
|
|
245
474
|
var dataEntryCorrecting = (dataEntry2) => dataBitsParser(dataBitsStringifier(dataEntry2), dataEntry2);
|
|
246
475
|
var base64url = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
476
|
+
var getBitsForEnumArrayCountOfBase = (count, base) => Math.ceil(Math.log2(base) * count);
|
|
477
|
+
var convertArbitraryBaseToBitString = (input, fromBase) => {
|
|
478
|
+
const expectedOutputLength = getBitsForEnumArrayCountOfBase(input.length, fromBase);
|
|
479
|
+
const fromBaseBigInt = BigInt(fromBase);
|
|
480
|
+
let decimalValue = BigInt(0);
|
|
481
|
+
for (let i = input.length - 1;i >= 0; i--)
|
|
482
|
+
decimalValue = decimalValue * fromBaseBigInt + BigInt(input[i]);
|
|
483
|
+
const s = decimalValue.toString(2).padStart(expectedOutputLength, "0");
|
|
484
|
+
return s;
|
|
485
|
+
};
|
|
486
|
+
var convertBitStringToArbitraryBase = (input, toBase, expectedOutputLength) => {
|
|
487
|
+
let decimalValue = BigInt(`0b${input}`);
|
|
488
|
+
const toBaseBigInt = BigInt(toBase);
|
|
489
|
+
const result = [];
|
|
490
|
+
while (decimalValue > 0) {
|
|
491
|
+
const remainder = decimalValue % toBaseBigInt;
|
|
492
|
+
result.push(Number(remainder));
|
|
493
|
+
decimalValue = decimalValue / toBaseBigInt;
|
|
494
|
+
}
|
|
495
|
+
if (expectedOutputLength !== undefined && result.length !== expectedOutputLength)
|
|
496
|
+
for (let i = result.length;i < expectedOutputLength; i++)
|
|
497
|
+
result.push(0);
|
|
498
|
+
return result;
|
|
499
|
+
};
|
|
247
500
|
var parseBitsToBase64 = (bits) => {
|
|
248
501
|
const chunks = bits.match(/.{1,6}/g);
|
|
249
502
|
const numbers = chunks?.map((c) => Number.parseInt(c.padEnd(6, "0"), 2)) ?? [];
|
|
@@ -254,34 +507,22 @@ var parseBase64ToBits = (base64) => {
|
|
|
254
507
|
const chunks = numbers.map((n) => n.toString(2).padStart(6, "0"));
|
|
255
508
|
return chunks.join("");
|
|
256
509
|
};
|
|
257
|
-
var dataArrayStringifier = (dataEntryArray) => {
|
|
258
|
-
return dataEntryArray.map(dataBitsStringifier).join("");
|
|
259
|
-
};
|
|
260
510
|
// src/update/floatUpdate.ts
|
|
261
511
|
var updateValue = (original, update) => {
|
|
262
|
-
|
|
263
|
-
return
|
|
264
|
-
...original,
|
|
265
|
-
value
|
|
266
|
-
};
|
|
512
|
+
original.value = Math.max(Math.min(update.value, original.max), original.min);
|
|
513
|
+
return original;
|
|
267
514
|
};
|
|
268
515
|
|
|
269
516
|
// src/update/intUpdate.ts
|
|
270
517
|
var updateValue2 = (original, update) => {
|
|
271
|
-
|
|
272
|
-
return
|
|
273
|
-
...original,
|
|
274
|
-
value
|
|
275
|
-
};
|
|
518
|
+
original.value = Math.max(Math.min(update.value, original.max), original.min);
|
|
519
|
+
return original;
|
|
276
520
|
};
|
|
277
521
|
|
|
278
522
|
// src/update/enumUpdate.ts
|
|
279
523
|
var updateValue3 = (original, update) => {
|
|
280
|
-
|
|
281
|
-
return
|
|
282
|
-
...original,
|
|
283
|
-
value
|
|
284
|
-
};
|
|
524
|
+
original.value = Math.min(original.max, update.value);
|
|
525
|
+
return original;
|
|
285
526
|
};
|
|
286
527
|
|
|
287
528
|
// src/update/versionUpdate.ts
|
|
@@ -294,264 +535,253 @@ var updateValue4 = (original, update) => {
|
|
|
294
535
|
};
|
|
295
536
|
|
|
296
537
|
// src/update/booleanUpdate.ts
|
|
297
|
-
var updateValue5 = (original, update) =>
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
}
|
|
538
|
+
var updateValue5 = (original, update) => {
|
|
539
|
+
original.value = update.value;
|
|
540
|
+
return original;
|
|
541
|
+
};
|
|
301
542
|
|
|
302
|
-
// src/update/
|
|
543
|
+
// src/update/enumArrayUpdate.ts
|
|
303
544
|
var updateValue6 = (original, update) => {
|
|
545
|
+
const count = Math.max(Math.min(update.value.length, original.maxCount), original.minCount);
|
|
546
|
+
original.value = [...new Array(count)].map((_, i) => Math.min(update.value[i] ?? 0, original.max));
|
|
547
|
+
return original;
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
// src/update/nestedDataMatching.ts
|
|
551
|
+
var updateNestedData = (original, descriptor) => {
|
|
552
|
+
const descriptorClone = JSON.parse(JSON.stringify(descriptor));
|
|
553
|
+
if (!original)
|
|
554
|
+
return descriptorClone;
|
|
555
|
+
return descriptorClone.map((d, i) => original[i]?.type === d.type && original[i]?.name === d.name ? DataTypeValues.includes(original[i].type) ? updateValue7(d, original[i]) : updateComplexValue(d, original[i]) : d);
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
// src/update/optionalUpdate.ts
|
|
559
|
+
var updateComplexValue2 = (original, update) => {
|
|
560
|
+
if (update.descriptor[Number(original.state)] !== null && original.value !== null) {
|
|
561
|
+
original.state = update.state;
|
|
562
|
+
original.value.length = 0;
|
|
563
|
+
original.value.push(...updateNestedData(update.value, original.descriptor[Number(update.state)]));
|
|
564
|
+
}
|
|
565
|
+
return original;
|
|
566
|
+
};
|
|
567
|
+
|
|
568
|
+
// src/update/enumOptionsUpdate.ts
|
|
569
|
+
var updateComplexValue3 = (original, update) => {
|
|
570
|
+
if (update.state <= original.descriptor.length - 1) {
|
|
571
|
+
original.value.length = 0;
|
|
572
|
+
original.value.push(...updateNestedData(update.value, original.descriptor[update.state]));
|
|
573
|
+
original.state = update.state;
|
|
574
|
+
}
|
|
575
|
+
return original;
|
|
576
|
+
};
|
|
577
|
+
|
|
578
|
+
// src/update/arrayUpdate.ts
|
|
579
|
+
var updateComplexValue4 = (original, update) => {
|
|
580
|
+
if (update.state >= original.minCount && update.state <= original.maxCount) {
|
|
581
|
+
original.state = update.state;
|
|
582
|
+
original.value.length = 0;
|
|
583
|
+
for (let i = 0;i < original.state; i++)
|
|
584
|
+
original.value.push(updateNestedData(update.value[i], original.descriptor));
|
|
585
|
+
}
|
|
586
|
+
return original;
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
// src/update/updateValues.ts
|
|
590
|
+
var updateValue7 = (original, update) => {
|
|
304
591
|
if (original.type !== update.type)
|
|
305
592
|
throw new Error("Types do not match");
|
|
306
593
|
switch (original.type) {
|
|
307
|
-
case
|
|
594
|
+
case "FLOAT":
|
|
308
595
|
return updateValue(original, update);
|
|
309
|
-
case
|
|
596
|
+
case "INT":
|
|
310
597
|
return updateValue2(original, update);
|
|
311
|
-
case
|
|
598
|
+
case "ENUM":
|
|
312
599
|
return updateValue3(original, update);
|
|
313
|
-
case
|
|
600
|
+
case "BOOLEAN":
|
|
314
601
|
return updateValue5(original, update);
|
|
315
|
-
case
|
|
602
|
+
case "VERSION":
|
|
316
603
|
return updateValue4(original, update);
|
|
604
|
+
case "ENUM_ARRAY":
|
|
605
|
+
return updateValue6(original, update);
|
|
317
606
|
}
|
|
318
607
|
};
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
var
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
608
|
+
var updateComplexValue = (original, update) => {
|
|
609
|
+
if (original.type !== update.type)
|
|
610
|
+
throw new Error("Types do not match");
|
|
611
|
+
switch (original.type) {
|
|
612
|
+
case "OPTIONAL":
|
|
613
|
+
return updateComplexValue2(original, update);
|
|
614
|
+
case "ENUM_OPTIONS":
|
|
615
|
+
return updateComplexValue3(original, update);
|
|
616
|
+
case "ARRAY":
|
|
617
|
+
return updateComplexValue4(original, update);
|
|
618
|
+
}
|
|
619
|
+
};
|
|
620
|
+
// src/stateHandling/stateData.ts
|
|
621
|
+
var getStateData = (state) => {
|
|
622
|
+
const object = {};
|
|
623
|
+
state.forEach((item) => {
|
|
624
|
+
switch (item.type) {
|
|
625
|
+
case "BOOLEAN":
|
|
626
|
+
object[item.name] = item.value;
|
|
627
|
+
break;
|
|
628
|
+
case "INT":
|
|
629
|
+
object[item.name] = item.value;
|
|
630
|
+
break;
|
|
631
|
+
case "ENUM":
|
|
632
|
+
object[item.name] = item.mapping[item.value];
|
|
633
|
+
break;
|
|
634
|
+
case "FLOAT":
|
|
635
|
+
object[item.name] = item.value;
|
|
636
|
+
break;
|
|
637
|
+
case "VERSION":
|
|
638
|
+
object[item.name] = item.value;
|
|
639
|
+
break;
|
|
640
|
+
case "ENUM_ARRAY":
|
|
641
|
+
object[item.name] = item.value.map((v) => item.mapping[v]);
|
|
642
|
+
break;
|
|
643
|
+
case "OPTIONAL":
|
|
644
|
+
object[item.name] = item.value === null ? null : getStateData(item.value);
|
|
645
|
+
break;
|
|
646
|
+
case "ENUM_OPTIONS":
|
|
647
|
+
object[item.name] = {
|
|
648
|
+
...getStateData(item.value),
|
|
649
|
+
state: item.state
|
|
650
|
+
};
|
|
651
|
+
break;
|
|
652
|
+
case "ARRAY":
|
|
653
|
+
object[item.name] = item.value.map(getStateData);
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
return object;
|
|
658
|
+
};
|
|
353
659
|
|
|
354
|
-
// src/
|
|
355
|
-
var
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
if (additionalData) {
|
|
371
|
-
if (typeof additionalData === "string")
|
|
372
|
-
return readDataEntry(localDataEntry, additionalData);
|
|
373
|
-
else
|
|
374
|
-
return updateDataEntry(localDataEntry, additionalData);
|
|
660
|
+
// src/stateHandling/stateDataObject.ts
|
|
661
|
+
var getBitstringForStateDataEntry = (stateDataEntry2) => {
|
|
662
|
+
switch (stateDataEntry2.type) {
|
|
663
|
+
case "BOOLEAN":
|
|
664
|
+
case "INT":
|
|
665
|
+
case "ENUM":
|
|
666
|
+
case "FLOAT":
|
|
667
|
+
case "VERSION":
|
|
668
|
+
case "ENUM_ARRAY":
|
|
669
|
+
return stateDataEntry2.bitstring = stateDataEntry2.bitstring ?? dataBitsStringifier(stateDataEntry2);
|
|
670
|
+
case "OPTIONAL":
|
|
671
|
+
return stateDataEntry2.value === null ? complexDataStateStringifier(stateDataEntry2) : complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
|
|
672
|
+
case "ENUM_OPTIONS":
|
|
673
|
+
return complexDataStateStringifier(stateDataEntry2) + getBitstringForStateNestedData(stateDataEntry2.value);
|
|
674
|
+
case "ARRAY":
|
|
675
|
+
return complexDataStateStringifier(stateDataEntry2) + stateDataEntry2.value.map((vs) => getBitstringForStateNestedData(vs)).join("");
|
|
375
676
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
}
|
|
390
|
-
]
|
|
391
|
-
];
|
|
392
|
-
};
|
|
393
|
-
var getStateFromEnumEntryDataType = (eedt, prefix, attributeName) => (additionalData) => {
|
|
394
|
-
if (Math.round(eedt[0]) !== eedt[0])
|
|
395
|
-
`given default (${eedt[0]}) value isn't an integer, rounding it`;
|
|
396
|
-
if (eedt.length - 2 < Math.round(eedt[0]))
|
|
397
|
-
console.log(`given default value (${eedt[0]}) was larger than the amount of options available, using the largest value (${eedt.length - 2}) instead`);
|
|
398
|
-
if (eedt[0] < 0)
|
|
399
|
-
console.log(`given default value (${eedt[0]}) was negative, using first index (0) instead`);
|
|
400
|
-
const [updatedLocalAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createEnum(Math.max(Math.min(eedt.length - 2, Math.round(eedt[0])), 0), eedt.length - 1, attributeName), prefix, additionalData);
|
|
401
|
-
const [nestedAdditionalData, [_, v]] = getStateDateFromSingleLevelContentTypeArray(eedt[1 + s.value], s.internalName, attributeName)(updatedLocalAdditionalData);
|
|
402
|
-
return [
|
|
403
|
-
nestedAdditionalData,
|
|
404
|
-
[
|
|
405
|
-
attributeName,
|
|
406
|
-
{
|
|
407
|
-
s,
|
|
408
|
-
v
|
|
409
|
-
}
|
|
410
|
-
]
|
|
411
|
-
];
|
|
412
|
-
};
|
|
413
|
-
var getStateFromArrayEntryDataType = (aedt, prefix, attributeName) => (additionalData) => {
|
|
414
|
-
const [min, max] = [aedt[0][0], aedt[0][1]].sort((a, b) => a - b);
|
|
415
|
-
const [updatedAdditionalData, [__, s]] = internalGetDataEntry(DataEntryFactory.createInt(min, min, max, attributeName), prefix, additionalData);
|
|
416
|
-
const v = [];
|
|
417
|
-
let localAdditionalData = updatedAdditionalData;
|
|
418
|
-
for (let i = 0;i < s.value; i++) {
|
|
419
|
-
const [updateAdditionalData, [_, localStateData]] = getStateDateFromSingleLevelContentTypeArray(aedt[1], `${s.internalName}${PREFIX_SEPERATOR_DELIMETER}${i}`, attributeName)(localAdditionalData);
|
|
420
|
-
localAdditionalData = updateAdditionalData;
|
|
421
|
-
v.push(localStateData);
|
|
677
|
+
};
|
|
678
|
+
var getBitstringForStateNestedData = (nestedData) => nestedData.map(getBitstringForStateDataEntry).join("");
|
|
679
|
+
var setComplexDataEntryValuesAsStateDataEntry = (currenEntry, updateCallback) => {
|
|
680
|
+
switch (currenEntry.type) {
|
|
681
|
+
case "OPTIONAL":
|
|
682
|
+
currenEntry.value = currenEntry.value === null ? null : currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
|
|
683
|
+
break;
|
|
684
|
+
case "ARRAY":
|
|
685
|
+
currenEntry.value = currenEntry.value.map((vs) => vs.map((v) => getStateDataEntry(v, updateCallback)));
|
|
686
|
+
break;
|
|
687
|
+
case "ENUM_OPTIONS":
|
|
688
|
+
currenEntry.value = currenEntry.value.map((v) => getStateDataEntry(v, updateCallback));
|
|
689
|
+
break;
|
|
422
690
|
}
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
else
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
};
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
var getStateDataFromSingleLevelContentType = (slct, prefix) => {
|
|
459
|
-
if (singleLevelContentTypeIsDataEntry(slct))
|
|
460
|
-
return (additionalData) => internalGetDataEntry(slct, prefix, additionalData);
|
|
461
|
-
else if (singleLevelContentTypeIsNestedContentDataType(slct))
|
|
462
|
-
return getStateDataFromNestedContentType(slct[1], `${prefix}_${slct[0]}`, slct[0]);
|
|
463
|
-
throw new Error("this is an invalid output value, wonder why?");
|
|
464
|
-
};
|
|
465
|
-
var getGenerationMethodForSingleLevelContentTypeArray = (slct) => {
|
|
466
|
-
currentDataEntryIndex = -1;
|
|
467
|
-
return (additionalData) => getStateDateFromSingleLevelContentTypeArray(slct, "", "")(additionalData)[1][1];
|
|
468
|
-
};
|
|
469
|
-
// src/objectmap/userMethods.ts
|
|
470
|
-
var getParsedAdditionalData = (additionalData) => {
|
|
471
|
-
if (typeof additionalData === "string")
|
|
472
|
-
return parseBase64ToBits(additionalData);
|
|
473
|
-
if (additionalData && !Array.isArray(additionalData))
|
|
474
|
-
return getDataEntryArray(additionalData);
|
|
475
|
-
return additionalData;
|
|
476
|
-
};
|
|
477
|
-
var getVersionindex = (additionalData, versionMask, defaultIndex) => {
|
|
478
|
-
if (typeof additionalData === "string")
|
|
479
|
-
return readDataEntry(versionMask, additionalData)[1][1].value;
|
|
480
|
-
if (!additionalData)
|
|
481
|
-
return defaultIndex || 0;
|
|
482
|
-
return additionalData.find((d) => d.name === "version")?.value ?? defaultIndex ?? 0;
|
|
483
|
-
};
|
|
484
|
-
var getParserMethodForVersionDefinition = (vadt, versionBits, defaultVersion) => (state) => {
|
|
485
|
-
const additionalData = getParsedAdditionalData(state);
|
|
486
|
-
const versionIndex = getVersionindex(additionalData, DataEntryFactory.createVersion(0, versionBits, "version"), defaultVersion);
|
|
487
|
-
const versionDefinition = vadt[versionIndex];
|
|
488
|
-
const versionEntry = DataEntryFactory.createVersion(versionIndex, versionBits, "version");
|
|
489
|
-
return getGenerationMethodForSingleLevelContentTypeArray([versionEntry, ...versionDefinition])(additionalData);
|
|
490
|
-
};
|
|
491
|
-
var getUpdaterMethodForVersionDefinition = (parser) => (state, entryToUpdate) => parser([...Array.isArray(entryToUpdate) ? entryToUpdate : [entryToUpdate], ...getDataEntryArray(state)]);
|
|
492
|
-
var getStringifyMethodForVersionDefinition = (parser) => (data) => getBase64String(parser(data));
|
|
493
|
-
var createParserObject = (versionContent, maximumExpectedVersions, defaultVersion, enumSemanticsMapping, attributeSemanticsMapping, exposedVersions) => {
|
|
494
|
-
const versionBitCount = getVersionValueRangeValueForNumber(maximumExpectedVersions);
|
|
495
|
-
const localDefaultVersion = Math.max(0, Math.min(versionContent.length - 1, defaultVersion ?? 0));
|
|
496
|
-
if (versionContent.length > maximumExpectedVersions)
|
|
497
|
-
throw new Error(`Cannot have more than ${maximumExpectedVersions} versions`);
|
|
498
|
-
if (localDefaultVersion !== (defaultVersion ?? 0))
|
|
499
|
-
console.log(`Default version must be between 0 and ${versionContent.length - 1}, instead of ${defaultVersion} will be using ${localDefaultVersion}`);
|
|
500
|
-
const parser = getParserMethodForVersionDefinition(versionContent, versionBitCount, localDefaultVersion);
|
|
501
|
-
const updater = getUpdaterMethodForVersionDefinition(parser);
|
|
502
|
-
const stringify = getStringifyMethodForVersionDefinition(parser);
|
|
503
|
-
return {
|
|
504
|
-
versionBitCount,
|
|
505
|
-
exposedVersions,
|
|
506
|
-
parser,
|
|
507
|
-
updater,
|
|
508
|
-
stringify,
|
|
509
|
-
enumSemanticsMapping,
|
|
510
|
-
attributeSemanticsMapping
|
|
691
|
+
const newBitString = getBitstringForStateDataEntry(currenEntry);
|
|
692
|
+
currenEntry.bitstring = newBitString;
|
|
693
|
+
};
|
|
694
|
+
var updateStateDataEntry = (currenEntry, newEntry, updateCallback) => {
|
|
695
|
+
if (currenEntry.type !== newEntry.type || currenEntry.name !== newEntry.name)
|
|
696
|
+
throw new Error(`Types (${currenEntry.type} & ${newEntry.type}) or names (${currenEntry.name} & ${newEntry.name}) do not match`);
|
|
697
|
+
if (ComplexDataValues.includes(currenEntry.type)) {
|
|
698
|
+
if (currenEntry.state !== newEntry.state) {
|
|
699
|
+
const currentBitString = currenEntry.bitstring;
|
|
700
|
+
const updatedCurrentEntry = updateComplexValue(currenEntry, newEntry);
|
|
701
|
+
setComplexDataEntryValuesAsStateDataEntry(updatedCurrentEntry, updateCallback);
|
|
702
|
+
if (currentBitString !== updatedCurrentEntry.bitstring)
|
|
703
|
+
updateCallback();
|
|
704
|
+
}
|
|
705
|
+
} else {
|
|
706
|
+
const currentBitString = currenEntry.bitstring;
|
|
707
|
+
const updatedCurrentEntry = updateValue7(currenEntry, newEntry);
|
|
708
|
+
updatedCurrentEntry.bitstring = dataBitsStringifier(updatedCurrentEntry);
|
|
709
|
+
if (currentBitString !== updatedCurrentEntry.bitstring)
|
|
710
|
+
updateCallback();
|
|
711
|
+
}
|
|
712
|
+
return currenEntry;
|
|
713
|
+
};
|
|
714
|
+
var getStateDataEntry = (entry, updateCallback) => {
|
|
715
|
+
entry.bitstring = getBitstringForStateDataEntry(entry);
|
|
716
|
+
entry.updateValue = (newEntry) => updateStateDataEntry(entry, newEntry, updateCallback);
|
|
717
|
+
return entry;
|
|
718
|
+
};
|
|
719
|
+
var createStateDataObject = (initialState, updateCallback) => {
|
|
720
|
+
const stateObject = {};
|
|
721
|
+
const wrappedUpdateCallback = () => {
|
|
722
|
+
stateObject.bitstring = getBitstringForStateNestedData(stateObject.state);
|
|
723
|
+
stateObject.base64 = parseBitsToBase64(stateObject.bitstring);
|
|
724
|
+
stateObject.data = getStateData(stateObject.state);
|
|
725
|
+
updateCallback(stateObject);
|
|
511
726
|
};
|
|
727
|
+
stateObject.state = initialState.map((item) => getStateDataEntry(item, wrappedUpdateCallback));
|
|
728
|
+
wrappedUpdateCallback();
|
|
729
|
+
return stateObject;
|
|
512
730
|
};
|
|
731
|
+
var getInitialStateFromBase64 = (base64, descriptor) => nestedDataBitstringParser(parseBase64ToBits(base64), descriptor)[0];
|
|
513
732
|
// src/utils/interpolateData.ts
|
|
514
733
|
var interpolateEntryAt = (dataEntry2, t) => {
|
|
515
734
|
const localT = Math.max(Math.min(1, t), 0);
|
|
516
735
|
const cosT = Math.cos(localT * 2 * Math.PI) * 0.5 + 0.5;
|
|
517
736
|
switch (dataEntry2.type) {
|
|
518
|
-
case
|
|
737
|
+
case "BOOLEAN":
|
|
519
738
|
return { ...dataEntry2, value: Boolean(Math.round(localT)) };
|
|
520
|
-
case
|
|
739
|
+
case "VERSION":
|
|
521
740
|
return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.bits ** 2 - 0.001)) };
|
|
522
|
-
case
|
|
741
|
+
case "ENUM":
|
|
523
742
|
return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.max + 0.999)) };
|
|
524
|
-
case
|
|
743
|
+
case "INT":
|
|
525
744
|
return { ...dataEntry2, value: dataEntry2.min + Math.floor(cosT * (dataEntry2.max - dataEntry2.min + 0.999)) };
|
|
526
|
-
case
|
|
745
|
+
case "FLOAT":
|
|
527
746
|
const v = dataEntry2.min + cosT * (dataEntry2.max - dataEntry2.min);
|
|
528
747
|
return dataEntryCorrecting({ ...dataEntry2, value: Math.min(dataEntry2.max, Math.max(v, dataEntry2.min)) });
|
|
748
|
+
case "ENUM_ARRAY":
|
|
749
|
+
return { ...dataEntry2, value: dataEntry2.value.map((v2) => Math.floor(localT * (v2 + 0.999))) };
|
|
529
750
|
}
|
|
530
751
|
};
|
|
531
752
|
// src/utils/relativeValue.ts
|
|
532
753
|
var getRelativeValue = (dataEntry2) => {
|
|
533
754
|
switch (dataEntry2.type) {
|
|
534
|
-
case
|
|
755
|
+
case "BOOLEAN":
|
|
535
756
|
return Number(dataEntry2.value);
|
|
536
|
-
case
|
|
537
|
-
case
|
|
757
|
+
case "INT":
|
|
758
|
+
case "FLOAT":
|
|
538
759
|
return (dataEntry2.value - dataEntry2.min) / (dataEntry2.max - dataEntry2.min);
|
|
539
|
-
case
|
|
760
|
+
case "VERSION":
|
|
540
761
|
return dataEntry2.value / (2 ** dataEntry2.bits - 1);
|
|
541
|
-
case
|
|
762
|
+
case "ENUM":
|
|
542
763
|
return dataEntry2.value / dataEntry2.max;
|
|
764
|
+
case "ENUM_ARRAY":
|
|
765
|
+
return dataEntry2.value.reduce((acc, v) => acc + v, 0) / dataEntry2.value.length;
|
|
543
766
|
}
|
|
544
767
|
};
|
|
545
768
|
export {
|
|
769
|
+
valueBitsParser,
|
|
546
770
|
parseBase64ToBits,
|
|
547
771
|
interpolateEntryAt,
|
|
548
|
-
getStateValue,
|
|
549
772
|
getRelativeValue,
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
773
|
+
getInitialStateFromBase64,
|
|
774
|
+
getBitsCount7 as getBitsCount,
|
|
775
|
+
dataEntryCorrecting,
|
|
776
|
+
dataEntryBitstringParser,
|
|
777
|
+
dataBitsStringifier,
|
|
778
|
+
dataBitsParser,
|
|
779
|
+
createStateDataObject,
|
|
553
780
|
SignificandMaxBits,
|
|
781
|
+
PROTECTED_ATTRIBUTE_NAMES,
|
|
554
782
|
IntegerMaxBits,
|
|
555
|
-
|
|
556
|
-
DataEntryFactory
|
|
783
|
+
DataTypeValues,
|
|
784
|
+
DataEntryFactory,
|
|
785
|
+
ComplexDataValues,
|
|
786
|
+
ComplexDataEntryFactory
|
|
557
787
|
};
|