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