url-safe-bitpacking 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +7 -7
- package/dist/index.js +0 -97
- package/package.json +2 -2
- package/dist/bundle.js +0 -577
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
1
|
+
export { ObjectGenerationOutputStatus, DataType } from './enums';
|
|
2
|
+
export { DataRangeDescriptionFactory, DataDescriptionFactory, DataEntryFactory } from './factory';
|
|
3
|
+
export { getDefaultObject, updateDataEntry } from './objectmap';
|
|
4
|
+
export { valueBitsParser, dataBitsParser, getBitsCount, dataBitsArrayParser, dataBitsStringifier, dataEntryCorrecting, parseBitsToBase64, parseBase64ToBits, dataArrayStringifier, } from './parsers';
|
|
5
|
+
export { SingleLevelContentType, NestedContentDataType, NestedContentType, DoubleLevelContentType, NonEmptyValidEntryArrayType, OptionalEntryDataType, EnumEntryDataType, VersionArrayDefinitionType, PrecisionRangeType, SignificandMaxBits, FloatData, IntegerMaxBits, IntData, VersionRangeType, VersionData, GlobalVersion, BooleanData, DataRangeDescription, BooleanDiscriptionType, IntDiscriptionType, EnumDiscriptionType, FloatDiscriptionType, VersionDiscriptionType, DataDescription, BooleanDescriptionWithValueType, IntDescriptionWithValueType, EnumDescriptionWithValueType, FloatDescriptionWithValueType, VersionDescriptionWithValueType, DataEntry, DataEntryArray, SemanticlyNestedDataEntry, SemanticlyNestedDataDescription, ObjectGeneratorMethod, DefinitionGenerationObject, DefinitionNestedArray, DefinitionNestedGenerationObject, DefinitionSubObject, DefinitionArrayObject, VersionDefinitionObject, VersionEnumSemantics, ParserForVersion, VersionParsers, } from './types';
|
|
6
|
+
export {} from './update';
|
|
7
|
+
export { interpolateEntryAt, getRelativeValue } from './utils';
|
package/dist/index.js
CHANGED
|
@@ -310,18 +310,6 @@ var dataArrayStringifier = (dataEntryArray) => {
|
|
|
310
310
|
|
|
311
311
|
// src/objectmap/versionReading.ts
|
|
312
312
|
var parameterOffset = 100;
|
|
313
|
-
var getVariableStrings = (definitionArrayObject) => {
|
|
314
|
-
const keys = [];
|
|
315
|
-
definitionArrayObject.forEach((value) => {
|
|
316
|
-
if (Array.isArray(value)) {
|
|
317
|
-
if (value.length === 2)
|
|
318
|
-
keys.push(...getVariableStrings(value[1]));
|
|
319
|
-
if (value.length === 3)
|
|
320
|
-
keys.push(value[1].name);
|
|
321
|
-
}
|
|
322
|
-
});
|
|
323
|
-
return keys;
|
|
324
|
-
};
|
|
325
313
|
var nestedDataEntryArrayToObject = (definitionArrayObject, startIndex) => {
|
|
326
314
|
const baseIndex = startIndex * parameterOffset;
|
|
327
315
|
return Object.fromEntries(definitionArrayObject.map((value, i) => {
|
|
@@ -334,60 +322,6 @@ var nestedDataEntryArrayToObject = (definitionArrayObject, startIndex) => {
|
|
|
334
322
|
return [value.name, { ...value, index: baseIndex + i }];
|
|
335
323
|
}));
|
|
336
324
|
};
|
|
337
|
-
var definitionArrayObjectParser = (bitString, v, orderIndex) => {
|
|
338
|
-
const [key, values] = v;
|
|
339
|
-
const [nestedSemanticObject, objectGenerationStatus, localEndIndex] = parsingDefinitionArrayObject(bitString, values, orderIndex);
|
|
340
|
-
return [[key, nestedSemanticObject], objectGenerationStatus, localEndIndex];
|
|
341
|
-
};
|
|
342
|
-
var methodParser = (bitString, v, orderIndex) => {
|
|
343
|
-
const [key, keyDataDescription, methodGenerator] = v;
|
|
344
|
-
const [keyDataEntry, status, bitWidth] = dataEntryParser(bitString, keyDataDescription, orderIndex);
|
|
345
|
-
const [result, localStatus, localEndIndex] = definitionArrayObjectParser(bitString, [key, methodGenerator(keyDataEntry)], orderIndex);
|
|
346
|
-
return [result, localStatus !== ObjectGenerationOutputStatus.PARSED ? localStatus : status, localEndIndex];
|
|
347
|
-
};
|
|
348
|
-
var dataEntryParser = (bitString, v, baseOrderIndex) => {
|
|
349
|
-
const bitWidth = getBitsCount6(v);
|
|
350
|
-
const value = dataBitsParser(bitString.slice(0, bitWidth), v);
|
|
351
|
-
return [{ ...value, index: baseOrderIndex }, ObjectGenerationOutputStatus.PARSED, bitWidth];
|
|
352
|
-
};
|
|
353
|
-
var parsingDefinitionArrayObject = (bitString, definitionArrayObject, orderIndex) => {
|
|
354
|
-
const baseOrderIndex = orderIndex * parameterOffset;
|
|
355
|
-
let startIndex = 0;
|
|
356
|
-
let objectGenerationStatus = ObjectGenerationOutputStatus.PARSED;
|
|
357
|
-
return [
|
|
358
|
-
Object.fromEntries(definitionArrayObject.map((value, i) => {
|
|
359
|
-
if (Array.isArray(value)) {
|
|
360
|
-
if (value.length === 2) {
|
|
361
|
-
const [[key, nestedSemanticObject], status, localEndIndex] = definitionArrayObjectParser(bitString.slice(startIndex), value, baseOrderIndex + i);
|
|
362
|
-
startIndex += localEndIndex;
|
|
363
|
-
ObjectGenerationOutputStatus.PARSED;
|
|
364
|
-
return [key, nestedSemanticObject];
|
|
365
|
-
} else {
|
|
366
|
-
const [[key, nestedSemanticObject], status, localEndIndex] = methodParser(bitString.slice(startIndex), value, baseOrderIndex + i);
|
|
367
|
-
startIndex += localEndIndex;
|
|
368
|
-
ObjectGenerationOutputStatus.PARSED;
|
|
369
|
-
return [key, nestedSemanticObject];
|
|
370
|
-
}
|
|
371
|
-
} else {
|
|
372
|
-
const [dataEntry, status, localEndIndex] = dataEntryParser(bitString.slice(startIndex), value, baseOrderIndex + i);
|
|
373
|
-
startIndex += localEndIndex;
|
|
374
|
-
ObjectGenerationOutputStatus.PARSED;
|
|
375
|
-
return [dataEntry.name, dataEntry];
|
|
376
|
-
}
|
|
377
|
-
})),
|
|
378
|
-
objectGenerationStatus,
|
|
379
|
-
startIndex
|
|
380
|
-
];
|
|
381
|
-
};
|
|
382
|
-
var readingVersion = (bitstring) => dataBitsArrayParser(bitstring, [DataDescriptionFactory.createVersion(8)])[0];
|
|
383
|
-
var parseUrlMethod = (url, parserVersions) => {
|
|
384
|
-
const bitString = parseBase64ToBits(url);
|
|
385
|
-
const version = readingVersion(bitString);
|
|
386
|
-
const versionParser = parserVersions[version.value];
|
|
387
|
-
if (!versionParser)
|
|
388
|
-
throw new Error(`No parser for version ${version.value}`);
|
|
389
|
-
return parsingDefinitionArrayObject(bitString, versionParser.objectGeneratorParameters, 0)[0];
|
|
390
|
-
};
|
|
391
325
|
var parseDownNestedDataDescription = (nestedDataDescription) => {
|
|
392
326
|
const dataDescriptions = [];
|
|
393
327
|
Object.values(nestedDataDescription).forEach((value) => {
|
|
@@ -398,28 +332,6 @@ var parseDownNestedDataDescription = (nestedDataDescription) => {
|
|
|
398
332
|
});
|
|
399
333
|
return dataDescriptions.sort();
|
|
400
334
|
};
|
|
401
|
-
var getURLForData = (data) => {
|
|
402
|
-
const dataEntryArray = parseDownNestedDataDescription(data);
|
|
403
|
-
const bitstring = dataArrayStringifier(dataEntryArray);
|
|
404
|
-
return parseBitsToBase64(bitstring);
|
|
405
|
-
};
|
|
406
|
-
var getTestStringValues = (data) => {
|
|
407
|
-
const dataEntryArray = parseDownNestedDataDescription(data);
|
|
408
|
-
const bitstring = dataArrayStringifier(dataEntryArray);
|
|
409
|
-
const url = parseBitsToBase64(bitstring);
|
|
410
|
-
const dataValueStrings = dataEntryArray.map((dataEntry) => dataBitsStringifier(dataEntry));
|
|
411
|
-
const singleString = dataValueStrings.join("");
|
|
412
|
-
const base64bitStringArray = singleString.match(/.{1,6}/g)?.map((c) => c.padEnd(6, "0")) ?? [];
|
|
413
|
-
const base64valueArray = url.split("").map((c) => c.padStart(6, "_"));
|
|
414
|
-
const raw = JSON.stringify(parseDownNestedDataDescription(data), undefined, 1);
|
|
415
|
-
return {
|
|
416
|
-
bitsString: dataValueStrings.join("-"),
|
|
417
|
-
base64BitString: base64bitStringArray.join("-"),
|
|
418
|
-
base64SplitString: base64valueArray.join("-"),
|
|
419
|
-
base64String: url,
|
|
420
|
-
raw
|
|
421
|
-
};
|
|
422
|
-
};
|
|
423
335
|
// src/update/floatUpdate.ts
|
|
424
336
|
var updateValue = (original, update) => {
|
|
425
337
|
const value = Math.max(Math.min(update.value, original.max), original.min);
|
|
@@ -565,18 +477,10 @@ var getRelativeValue = (dataEntry2) => {
|
|
|
565
477
|
};
|
|
566
478
|
export {
|
|
567
479
|
valueBitsParser,
|
|
568
|
-
updateValue6 as updateValue,
|
|
569
|
-
updateDataEntryObject,
|
|
570
480
|
updateDataEntry,
|
|
571
|
-
parseUrlMethod,
|
|
572
|
-
parseDownNestedDataDescription,
|
|
573
481
|
parseBitsToBase64,
|
|
574
482
|
parseBase64ToBits,
|
|
575
|
-
nestedDataEntryArrayToObject,
|
|
576
483
|
interpolateEntryAt,
|
|
577
|
-
getVariableStrings,
|
|
578
|
-
getURLForData,
|
|
579
|
-
getTestStringValues,
|
|
580
484
|
getRelativeValue,
|
|
581
485
|
getDefaultObject,
|
|
582
486
|
getBitsCount6 as getBitsCount,
|
|
@@ -588,7 +492,6 @@ export {
|
|
|
588
492
|
SignificandMaxBits,
|
|
589
493
|
ObjectGenerationOutputStatus,
|
|
590
494
|
IntegerMaxBits,
|
|
591
|
-
EnumMaxBits,
|
|
592
495
|
DataType,
|
|
593
496
|
DataRangeDescriptionFactory,
|
|
594
497
|
DataEntryFactory,
|
package/package.json
CHANGED
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
"dist/*.d.ts"
|
|
9
9
|
],
|
|
10
10
|
"type": "module",
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.2",
|
|
12
12
|
"author": "Jonas Ward",
|
|
13
13
|
"description": "Library for creating web safe base64 objects with custom bith widths and dynamic values.",
|
|
14
14
|
"scripts": {
|
|
15
15
|
"build": "bun build --target=node ./src/index.ts --outfile=dist/index.js && bun run build:declaration",
|
|
16
|
-
"build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json",
|
|
16
|
+
"build:declaration": "tsc --emitDeclarationOnly --isolatedDeclarations --project tsconfig.types.json",
|
|
17
17
|
"postbuild": "rimraf tsconfig.types.tsbuildinfo"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
package/dist/bundle.js
DELETED
|
@@ -1,577 +0,0 @@
|
|
|
1
|
-
// src/enums/dataTypes.ts
|
|
2
|
-
var DataType;
|
|
3
|
-
(function(DataType2) {
|
|
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 = {}));
|
|
18
|
-
// src/factory/intFactory.ts
|
|
19
|
-
var getBitsForIntegerNumber = (number) => Math.ceil(Math.log2(number));
|
|
20
|
-
var create = (min, max) => {
|
|
21
|
-
if (!Number.isInteger(min) || !Number.isInteger(max))
|
|
22
|
-
throw new Error("min and max must be integers");
|
|
23
|
-
if (max - min < 1)
|
|
24
|
-
throw new Error("max must be at least one");
|
|
25
|
-
if (Math.abs(max - min) > 1023)
|
|
26
|
-
throw new Error("max - min must be less than 1024");
|
|
27
|
-
const bits = getBitsForIntegerNumber(max - min + 1);
|
|
28
|
-
return { type: DataType.INT, min, max, bits };
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
// src/factory/floatFactory.ts
|
|
32
|
-
var create2 = (min, max, precision) => {
|
|
33
|
-
const precisionMultiplier = 10 ** precision;
|
|
34
|
-
const roundedMin = Math.floor(min * precisionMultiplier);
|
|
35
|
-
const roundedMax = Math.ceil(max * precisionMultiplier);
|
|
36
|
-
const delta = roundedMax - roundedMin;
|
|
37
|
-
const significand = Math.max(1, getBitsForIntegerNumber(delta));
|
|
38
|
-
return {
|
|
39
|
-
type: DataType.FLOAT,
|
|
40
|
-
min: roundedMin / precisionMultiplier,
|
|
41
|
-
max: roundedMax / precisionMultiplier,
|
|
42
|
-
precision,
|
|
43
|
-
significand
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
// src/factory/booleanFactory.ts
|
|
48
|
-
var create3 = () => ({ type: DataType.BOOLEAN });
|
|
49
|
-
|
|
50
|
-
// src/factory/versionFactory.ts
|
|
51
|
-
var create4 = (bits) => ({
|
|
52
|
-
type: DataType.VERSION,
|
|
53
|
-
bits
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// src/factory/enumFactory.ts
|
|
57
|
-
var create5 = (max) => {
|
|
58
|
-
if (!Number.isInteger(max))
|
|
59
|
-
throw new Error("min and max must be integers");
|
|
60
|
-
if (max < 1)
|
|
61
|
-
throw new Error("max must be at least one");
|
|
62
|
-
if (max > 1023)
|
|
63
|
-
throw new Error("max - min must be less than 1024");
|
|
64
|
-
const bits = getBitsForIntegerNumber(max + 1);
|
|
65
|
-
return { type: DataType.ENUM, max, bits };
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// src/factory/factory.ts
|
|
69
|
-
class DataRangeDescriptionFactory {
|
|
70
|
-
static createFloat = create2;
|
|
71
|
-
static createInt = create;
|
|
72
|
-
static createEnum = create5;
|
|
73
|
-
static createBoolean = create3;
|
|
74
|
-
static createVersion = create4;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
class DataDescriptionFactory {
|
|
78
|
-
static createFloat = (min = 0, max = 1, precision = 2, name = "", index = 0) => ({
|
|
79
|
-
...create2(min, max, precision),
|
|
80
|
-
name,
|
|
81
|
-
index
|
|
82
|
-
});
|
|
83
|
-
static createInt = (min = 0, max = 10, name = "", index = 0) => ({
|
|
84
|
-
...create(min, max),
|
|
85
|
-
name,
|
|
86
|
-
index
|
|
87
|
-
});
|
|
88
|
-
static createEnum = (max = 10, name = "", index = 0) => ({
|
|
89
|
-
...create5(max),
|
|
90
|
-
name,
|
|
91
|
-
index
|
|
92
|
-
});
|
|
93
|
-
static createBoolean = (name = "", index = 0) => ({
|
|
94
|
-
...create3(),
|
|
95
|
-
name,
|
|
96
|
-
index
|
|
97
|
-
});
|
|
98
|
-
static createVersion = (bits = 8, name = "", index = 0) => ({
|
|
99
|
-
...create4(bits),
|
|
100
|
-
name,
|
|
101
|
-
index
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
class DataEntryFactory {
|
|
106
|
-
static createFloat = (value, min = 0, max = 1, precision = 2, name = "", index = 0) => ({
|
|
107
|
-
...create2(min, max, precision),
|
|
108
|
-
value,
|
|
109
|
-
name,
|
|
110
|
-
index
|
|
111
|
-
});
|
|
112
|
-
static createInt = (value, min = 0, max = 10, name = "", index = 0) => ({
|
|
113
|
-
...create(min, max),
|
|
114
|
-
value,
|
|
115
|
-
name,
|
|
116
|
-
index
|
|
117
|
-
});
|
|
118
|
-
static createEnum = (value, max = 10, name = "", index = 0) => ({
|
|
119
|
-
...create5(max),
|
|
120
|
-
value,
|
|
121
|
-
name,
|
|
122
|
-
index
|
|
123
|
-
});
|
|
124
|
-
static createBoolean = (value, name = "", index = 0) => ({
|
|
125
|
-
...create3(),
|
|
126
|
-
value,
|
|
127
|
-
name,
|
|
128
|
-
index
|
|
129
|
-
});
|
|
130
|
-
static createVersion = (value, bits = 8, name = "", index = 0) => ({
|
|
131
|
-
...create4(bits),
|
|
132
|
-
value,
|
|
133
|
-
name,
|
|
134
|
-
index
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
// src/parsers/intParser.ts
|
|
138
|
-
var getBitsCount = (intData) => intData.bits;
|
|
139
|
-
var rawValueParser = (stateString, bitCount) => {
|
|
140
|
-
if (stateString.length < bitCount)
|
|
141
|
-
throw new Error(`To few bits for this int bit string (${stateString.length} instead of ${bitCount})`);
|
|
142
|
-
if (stateString.length > bitCount)
|
|
143
|
-
throw new Error(`To many bits for this int bit string (${stateString.length} instead of ${bitCount})`);
|
|
144
|
-
const parsed = parseInt(stateString, 2);
|
|
145
|
-
if (isNaN(parsed))
|
|
146
|
-
throw new Error("Invalid int state string");
|
|
147
|
-
return parsed;
|
|
148
|
-
};
|
|
149
|
-
var rawParser = (stateString, intData) => {
|
|
150
|
-
const v = rawValueParser(stateString, intData.bits) + intData.min;
|
|
151
|
-
if (v > intData.max)
|
|
152
|
-
throw new Error("Value exceeds max");
|
|
153
|
-
return v;
|
|
154
|
-
};
|
|
155
|
-
var rawIntStringifier = (value, bitCount) => {
|
|
156
|
-
if (Number.isInteger(value) === false)
|
|
157
|
-
throw new Error("Value is not an integer");
|
|
158
|
-
return value.toString(2).padStart(bitCount, "0");
|
|
159
|
-
};
|
|
160
|
-
var rawStringifier = (value, intData) => {
|
|
161
|
-
if (value < intData.min)
|
|
162
|
-
throw new Error("Value is below min");
|
|
163
|
-
if (value > intData.max)
|
|
164
|
-
throw new Error("Value exceeds max");
|
|
165
|
-
return rawIntStringifier(value - intData.min, intData.bits);
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
// src/parsers/floatParser.ts
|
|
169
|
-
var getBitsCount2 = (floatData) => floatData.significand;
|
|
170
|
-
var rawValueParser2 = (stateString, significandBits, precision) => {
|
|
171
|
-
if (stateString.length < significandBits)
|
|
172
|
-
throw new Error(`To few bits for this float bit string (${stateString.length} instead of ${significandBits})`);
|
|
173
|
-
if (stateString.length > significandBits)
|
|
174
|
-
throw new Error(`To many bits for this float bit string (${stateString.length} instead of ${significandBits})`);
|
|
175
|
-
const significand = rawValueParser(stateString, significandBits);
|
|
176
|
-
return significand * 10 ** -precision;
|
|
177
|
-
};
|
|
178
|
-
var rawParser2 = (stateString, floatData) => {
|
|
179
|
-
const v = floatData.min + rawValueParser2(stateString, floatData.significand, floatData.precision);
|
|
180
|
-
if (v > floatData.max)
|
|
181
|
-
throw new Error("Float value exceeds max");
|
|
182
|
-
return v;
|
|
183
|
-
};
|
|
184
|
-
var rawStringifier2 = (value, floatData) => rawIntStringifier(Math.round((value - floatData.min) * 10 ** floatData.precision), floatData.significand);
|
|
185
|
-
|
|
186
|
-
// src/parsers/enumParser.ts
|
|
187
|
-
var getBitsCount3 = (versionData) => versionData.bits;
|
|
188
|
-
var rawParser3 = (rawString, versionData) => rawValueParser(rawString, versionData.bits);
|
|
189
|
-
var rawStringifier3 = (value, versionData) => {
|
|
190
|
-
if (value > versionData.max)
|
|
191
|
-
throw new Error("Version exceeds max");
|
|
192
|
-
return rawIntStringifier(value, versionData.bits);
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
// src/parsers/versionParser.ts
|
|
196
|
-
var getBitsCount4 = (versionData) => versionData.bits;
|
|
197
|
-
var rawParser4 = (rawString, versionData) => rawValueParser(rawString, versionData.bits);
|
|
198
|
-
var rawStringifier4 = (value, versionData) => {
|
|
199
|
-
if (value > 2 ** versionData.bits - 1)
|
|
200
|
-
throw new Error("Version exceeds max");
|
|
201
|
-
return rawIntStringifier(value, versionData.bits);
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
// src/parsers/booleanParser.ts
|
|
205
|
-
var getBitsCount5 = () => 1;
|
|
206
|
-
var rawValueParser3 = (stateString) => {
|
|
207
|
-
if (stateString === "1")
|
|
208
|
-
return true;
|
|
209
|
-
if (stateString === "0")
|
|
210
|
-
return false;
|
|
211
|
-
throw new Error("Invalid boolean bit string");
|
|
212
|
-
};
|
|
213
|
-
var rawParser5 = (stateString) => rawValueParser3(stateString);
|
|
214
|
-
var rawStringifier5 = (value) => value ? "1" : "0";
|
|
215
|
-
|
|
216
|
-
// src/parsers/parsers.ts
|
|
217
|
-
var valueBitsParser = (bitString, mapData) => {
|
|
218
|
-
switch (mapData.type) {
|
|
219
|
-
case DataType.BOOLEAN:
|
|
220
|
-
return rawParser5(bitString);
|
|
221
|
-
case DataType.INT:
|
|
222
|
-
return rawParser(bitString, mapData);
|
|
223
|
-
case DataType.ENUM:
|
|
224
|
-
return rawParser3(bitString, mapData);
|
|
225
|
-
case DataType.FLOAT:
|
|
226
|
-
return rawParser2(bitString, mapData);
|
|
227
|
-
case DataType.VERSION:
|
|
228
|
-
return rawParser4(bitString, mapData);
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
var dataBitsParser = (rawString, mapData) => {
|
|
232
|
-
switch (mapData.type) {
|
|
233
|
-
case DataType.BOOLEAN:
|
|
234
|
-
return { ...mapData, value: valueBitsParser(rawString, mapData) };
|
|
235
|
-
case DataType.ENUM:
|
|
236
|
-
case DataType.INT:
|
|
237
|
-
case DataType.FLOAT:
|
|
238
|
-
case DataType.VERSION:
|
|
239
|
-
return { ...mapData, value: valueBitsParser(rawString, mapData) };
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
var getBitsCount6 = (mapData) => {
|
|
243
|
-
switch (mapData.type) {
|
|
244
|
-
case DataType.BOOLEAN:
|
|
245
|
-
return getBitsCount5();
|
|
246
|
-
case DataType.INT:
|
|
247
|
-
return getBitsCount(mapData);
|
|
248
|
-
case DataType.FLOAT:
|
|
249
|
-
return getBitsCount2(mapData);
|
|
250
|
-
case DataType.VERSION:
|
|
251
|
-
return getBitsCount4(mapData);
|
|
252
|
-
case DataType.ENUM:
|
|
253
|
-
return getBitsCount3(mapData);
|
|
254
|
-
}
|
|
255
|
-
};
|
|
256
|
-
var dataBitsArrayParser = (bitString, mapDataArray) => {
|
|
257
|
-
const bitCounts = mapDataArray.map((mapData) => getBitsCount6(mapData));
|
|
258
|
-
const bitStartEndMap = [];
|
|
259
|
-
bitCounts.forEach((bitCount, index) => {
|
|
260
|
-
const start = index === 0 ? 0 : bitStartEndMap[index - 1][1];
|
|
261
|
-
bitStartEndMap.push([start, start + bitCount]);
|
|
262
|
-
});
|
|
263
|
-
return mapDataArray.map((mapData, i) => dataBitsParser(bitString.slice(bitStartEndMap[i][0], bitStartEndMap[i][1]), mapData));
|
|
264
|
-
};
|
|
265
|
-
var dataBitsStringifier = (data) => {
|
|
266
|
-
switch (data.type) {
|
|
267
|
-
case DataType.BOOLEAN:
|
|
268
|
-
return rawStringifier5(data.value);
|
|
269
|
-
case DataType.INT:
|
|
270
|
-
return rawStringifier(data.value, data);
|
|
271
|
-
case DataType.FLOAT:
|
|
272
|
-
return rawStringifier2(data.value, data);
|
|
273
|
-
case DataType.VERSION:
|
|
274
|
-
return rawStringifier4(data.value, data);
|
|
275
|
-
case DataType.ENUM:
|
|
276
|
-
return rawStringifier3(data.value, data);
|
|
277
|
-
}
|
|
278
|
-
};
|
|
279
|
-
var dataEntryCorrecting = (dataEntry) => dataBitsParser(dataBitsStringifier(dataEntry), dataEntry);
|
|
280
|
-
var base64url = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
281
|
-
var parseBitsToBase64 = (bits) => {
|
|
282
|
-
const chunks = bits.match(/.{1,6}/g);
|
|
283
|
-
const numbers = chunks?.map((c) => Number.parseInt(c.padEnd(6, "0"), 2)) ?? [];
|
|
284
|
-
return numbers.map((n) => base64url.charAt(n)).join("");
|
|
285
|
-
};
|
|
286
|
-
var parseBase64ToBits = (base64) => {
|
|
287
|
-
const numbers = base64.split("").map((c) => base64url.indexOf(c));
|
|
288
|
-
const chunks = numbers.map((n) => n.toString(2).padStart(6, "0"));
|
|
289
|
-
return chunks.join("");
|
|
290
|
-
};
|
|
291
|
-
var dataArrayStringifier = (dataEntryArray) => {
|
|
292
|
-
return dataEntryArray.map(dataBitsStringifier).join("");
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
// src/objectmap/versionReading.ts
|
|
296
|
-
var parameterOffset = 100;
|
|
297
|
-
var getVariableStrings = (definitionArrayObject) => {
|
|
298
|
-
const keys = [];
|
|
299
|
-
definitionArrayObject.forEach((value) => {
|
|
300
|
-
if (Array.isArray(value)) {
|
|
301
|
-
if (value.length === 2)
|
|
302
|
-
keys.push(...getVariableStrings(value[1]));
|
|
303
|
-
if (value.length === 3)
|
|
304
|
-
keys.push(value[1].name);
|
|
305
|
-
}
|
|
306
|
-
});
|
|
307
|
-
return keys;
|
|
308
|
-
};
|
|
309
|
-
var nestedDataEntryArrayToObject = (definitionArrayObject, startIndex) => {
|
|
310
|
-
const baseIndex = startIndex * parameterOffset;
|
|
311
|
-
return Object.fromEntries(definitionArrayObject.map((value, i) => {
|
|
312
|
-
if (Array.isArray(value)) {
|
|
313
|
-
if (value.length === 2)
|
|
314
|
-
return [value[0], nestedDataEntryArrayToObject(value[1], baseIndex + i)];
|
|
315
|
-
else
|
|
316
|
-
return [value[0], nestedDataEntryArrayToObject(value[2](value[1]), baseIndex + i)];
|
|
317
|
-
}
|
|
318
|
-
return [value.name, { ...value, index: baseIndex + i }];
|
|
319
|
-
}));
|
|
320
|
-
};
|
|
321
|
-
var definitionArrayObjectParser = (bitString, v, orderIndex) => {
|
|
322
|
-
const [key, values] = v;
|
|
323
|
-
const [nestedSemanticObject, objectGenerationStatus, localEndIndex] = parsingDefinitionArrayObject(bitString, values, orderIndex);
|
|
324
|
-
return [[key, nestedSemanticObject], objectGenerationStatus, localEndIndex];
|
|
325
|
-
};
|
|
326
|
-
var methodParser = (bitString, v, orderIndex) => {
|
|
327
|
-
const [key, keyDataDescription, methodGenerator] = v;
|
|
328
|
-
const [keyDataEntry, status, bitWidth] = dataEntryParser(bitString, keyDataDescription, orderIndex);
|
|
329
|
-
const [result, localStatus, localEndIndex] = definitionArrayObjectParser(bitString, [key, methodGenerator(keyDataEntry)], orderIndex);
|
|
330
|
-
return [result, localStatus !== ObjectGenerationOutputStatus.PARSED ? localStatus : status, localEndIndex];
|
|
331
|
-
};
|
|
332
|
-
var dataEntryParser = (bitString, v, baseOrderIndex) => {
|
|
333
|
-
const bitWidth = getBitsCount6(v);
|
|
334
|
-
const value = dataBitsParser(bitString.slice(0, bitWidth), v);
|
|
335
|
-
return [{ ...value, index: baseOrderIndex }, ObjectGenerationOutputStatus.PARSED, bitWidth];
|
|
336
|
-
};
|
|
337
|
-
var parsingDefinitionArrayObject = (bitString, definitionArrayObject, orderIndex) => {
|
|
338
|
-
const baseOrderIndex = orderIndex * parameterOffset;
|
|
339
|
-
let startIndex = 0;
|
|
340
|
-
let objectGenerationStatus = ObjectGenerationOutputStatus.PARSED;
|
|
341
|
-
return [
|
|
342
|
-
Object.fromEntries(definitionArrayObject.map((value, i) => {
|
|
343
|
-
if (Array.isArray(value)) {
|
|
344
|
-
if (value.length === 2) {
|
|
345
|
-
const [[key, nestedSemanticObject], status, localEndIndex] = definitionArrayObjectParser(bitString.slice(startIndex), value, baseOrderIndex + i);
|
|
346
|
-
startIndex += localEndIndex;
|
|
347
|
-
ObjectGenerationOutputStatus.PARSED;
|
|
348
|
-
return [key, nestedSemanticObject];
|
|
349
|
-
} else {
|
|
350
|
-
const [[key, nestedSemanticObject], status, localEndIndex] = methodParser(bitString.slice(startIndex), value, baseOrderIndex + i);
|
|
351
|
-
startIndex += localEndIndex;
|
|
352
|
-
ObjectGenerationOutputStatus.PARSED;
|
|
353
|
-
return [key, nestedSemanticObject];
|
|
354
|
-
}
|
|
355
|
-
} else {
|
|
356
|
-
const [dataEntry, status, localEndIndex] = dataEntryParser(bitString.slice(startIndex), value, baseOrderIndex + i);
|
|
357
|
-
startIndex += localEndIndex;
|
|
358
|
-
ObjectGenerationOutputStatus.PARSED;
|
|
359
|
-
return [dataEntry.name, dataEntry];
|
|
360
|
-
}
|
|
361
|
-
})),
|
|
362
|
-
objectGenerationStatus,
|
|
363
|
-
startIndex
|
|
364
|
-
];
|
|
365
|
-
};
|
|
366
|
-
var readingVersion = (bitstring) => dataBitsArrayParser(bitstring, [DataDescriptionFactory.createVersion(8)])[0];
|
|
367
|
-
var parseUrlMethod = (url, parserVersions) => {
|
|
368
|
-
const bitString = parseBase64ToBits(url);
|
|
369
|
-
const version = readingVersion(bitString);
|
|
370
|
-
const versionParser = parserVersions[version.value];
|
|
371
|
-
if (!versionParser)
|
|
372
|
-
throw new Error(`No parser for version ${version.value}`);
|
|
373
|
-
return parsingDefinitionArrayObject(bitString, versionParser.objectGeneratorParameters, 0)[0];
|
|
374
|
-
};
|
|
375
|
-
var parseDownNestedDataDescription = (nestedDataDescription) => {
|
|
376
|
-
const dataDescriptions = [];
|
|
377
|
-
Object.values(nestedDataDescription).forEach((value) => {
|
|
378
|
-
if (value.hasOwnProperty("type"))
|
|
379
|
-
dataDescriptions.push(value);
|
|
380
|
-
else
|
|
381
|
-
dataDescriptions.push(...parseDownNestedDataDescription(value));
|
|
382
|
-
});
|
|
383
|
-
return dataDescriptions.sort();
|
|
384
|
-
};
|
|
385
|
-
var getURLForData = (data) => {
|
|
386
|
-
const dataEntryArray = parseDownNestedDataDescription(data);
|
|
387
|
-
const bitstring = dataArrayStringifier(dataEntryArray);
|
|
388
|
-
return parseBitsToBase64(bitstring);
|
|
389
|
-
};
|
|
390
|
-
var getTestStringValues = (data) => {
|
|
391
|
-
const dataEntryArray = parseDownNestedDataDescription(data);
|
|
392
|
-
const bitstring = dataArrayStringifier(dataEntryArray);
|
|
393
|
-
const url = parseBitsToBase64(bitstring);
|
|
394
|
-
const dataValueStrings = dataEntryArray.map((dataEntry) => dataBitsStringifier(dataEntry));
|
|
395
|
-
const singleString = dataValueStrings.join("");
|
|
396
|
-
const base64bitStringArray = singleString.match(/.{1,6}/g)?.map((c) => c.padEnd(6, "0")) ?? [];
|
|
397
|
-
const base64valueArray = url.split("").map((c) => c.padStart(6, "_"));
|
|
398
|
-
const raw = JSON.stringify(parseDownNestedDataDescription(data), undefined, 1);
|
|
399
|
-
return {
|
|
400
|
-
bitsString: dataValueStrings.join("-"),
|
|
401
|
-
base64BitString: base64bitStringArray.join("-"),
|
|
402
|
-
base64SplitString: base64valueArray.join("-"),
|
|
403
|
-
base64String: url,
|
|
404
|
-
raw
|
|
405
|
-
};
|
|
406
|
-
};
|
|
407
|
-
// src/update/floatUpdate.ts
|
|
408
|
-
var updateValue = (original, update) => {
|
|
409
|
-
const value = Math.max(Math.min(update.value, original.max), original.min);
|
|
410
|
-
return {
|
|
411
|
-
...original,
|
|
412
|
-
value
|
|
413
|
-
};
|
|
414
|
-
};
|
|
415
|
-
|
|
416
|
-
// src/update/intUpdate.ts
|
|
417
|
-
var updateValue2 = (original, update) => {
|
|
418
|
-
const value = Math.max(Math.min(update.value, original.max), original.min);
|
|
419
|
-
return {
|
|
420
|
-
...original,
|
|
421
|
-
value
|
|
422
|
-
};
|
|
423
|
-
};
|
|
424
|
-
|
|
425
|
-
// src/update/enumUpdate.ts
|
|
426
|
-
var updateValue3 = (original, update) => {
|
|
427
|
-
const value = Math.min(original.max, update.value);
|
|
428
|
-
return {
|
|
429
|
-
...original,
|
|
430
|
-
value
|
|
431
|
-
};
|
|
432
|
-
};
|
|
433
|
-
|
|
434
|
-
// src/update/versionUpdate.ts
|
|
435
|
-
var updateValue4 = (original, update) => {
|
|
436
|
-
const value = Math.min(original.bits ** 2 - 1, update.value);
|
|
437
|
-
return {
|
|
438
|
-
...original,
|
|
439
|
-
value
|
|
440
|
-
};
|
|
441
|
-
};
|
|
442
|
-
|
|
443
|
-
// src/update/booleanUpdate.ts
|
|
444
|
-
var updateValue5 = (original, update) => ({
|
|
445
|
-
...original,
|
|
446
|
-
value: update.value
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
// src/update/updateValues.ts
|
|
450
|
-
var updateValue6 = (original, update) => {
|
|
451
|
-
if (original.type !== update.type)
|
|
452
|
-
throw new Error("Types do not match");
|
|
453
|
-
switch (original.type) {
|
|
454
|
-
case DataType.FLOAT:
|
|
455
|
-
return updateValue(original, update);
|
|
456
|
-
case DataType.INT:
|
|
457
|
-
return updateValue2(original, update);
|
|
458
|
-
case DataType.ENUM:
|
|
459
|
-
return updateValue3(original, update);
|
|
460
|
-
case DataType.VERSION:
|
|
461
|
-
return updateValue4(original, update);
|
|
462
|
-
case DataType.BOOLEAN:
|
|
463
|
-
return updateValue5(original, update);
|
|
464
|
-
}
|
|
465
|
-
};
|
|
466
|
-
|
|
467
|
-
// src/objectmap/versionUpdate.ts
|
|
468
|
-
var dataEntryUpdating = (dataEntry, dataEntryArray) => {
|
|
469
|
-
const existingDataEntry = dataEntryArray.find((d) => d.name === dataEntry.name);
|
|
470
|
-
if (!existingDataEntry)
|
|
471
|
-
return [dataEntry.name, dataEntry];
|
|
472
|
-
return [dataEntry.name, updateValue6(dataEntry, existingDataEntry)];
|
|
473
|
-
};
|
|
474
|
-
var nestedDataEntryArrayUpdating = (definitionNestedArrray, dataEntryArray) => {
|
|
475
|
-
const [keyString, nestedDefinitionArray] = definitionNestedArrray;
|
|
476
|
-
return [keyString, updateDataEntryObject(nestedDefinitionArray, dataEntryArray)];
|
|
477
|
-
};
|
|
478
|
-
var generationObjectUpdating = (definitionArrayObject, dataEntryArray) => {
|
|
479
|
-
const [keyString, keyDataEntry, methodGenerator] = definitionArrayObject;
|
|
480
|
-
const foundKeyDataEntry = dataEntryArray.find((d) => d.name === keyDataEntry.name);
|
|
481
|
-
const newKeyData = foundKeyDataEntry ? updateValue6(keyDataEntry, foundKeyDataEntry) : keyDataEntry;
|
|
482
|
-
return [keyString, updateDataEntryObject(methodGenerator(newKeyData), dataEntryArray)];
|
|
483
|
-
};
|
|
484
|
-
var updateDataEntryObject = (definitionArrayObject, dataArray) => {
|
|
485
|
-
const newNestedObject = {};
|
|
486
|
-
definitionArrayObject.forEach((value) => {
|
|
487
|
-
if (Array.isArray(value)) {
|
|
488
|
-
if (value.length === 2) {
|
|
489
|
-
const [keyString, nestedDataEntry] = nestedDataEntryArrayUpdating(value, dataArray);
|
|
490
|
-
newNestedObject[keyString] = nestedDataEntry;
|
|
491
|
-
} else {
|
|
492
|
-
const [keyString, nestedDataEntry] = generationObjectUpdating(value, dataArray);
|
|
493
|
-
newNestedObject[keyString] = nestedDataEntry;
|
|
494
|
-
}
|
|
495
|
-
} else {
|
|
496
|
-
const [key, dataEntry] = dataEntryUpdating(value, dataArray);
|
|
497
|
-
newNestedObject[key] = dataEntry;
|
|
498
|
-
}
|
|
499
|
-
});
|
|
500
|
-
return newNestedObject;
|
|
501
|
-
};
|
|
502
|
-
var getDefaultObject = (versionObjects, versionindex) => {
|
|
503
|
-
const versionParser = versionObjects[versionindex];
|
|
504
|
-
if (!versionParser)
|
|
505
|
-
throw new Error(`No parser for version ${versionindex} index`);
|
|
506
|
-
return nestedDataEntryArrayToObject(versionParser.objectGeneratorParameters, 0);
|
|
507
|
-
};
|
|
508
|
-
var updateDataEntry = (data, newDataEntry, versionObjects) => {
|
|
509
|
-
const version = data.version;
|
|
510
|
-
const versionParser = versionObjects[version.value];
|
|
511
|
-
if (!versionParser)
|
|
512
|
-
throw new Error(`No parser for version ${version.value}`);
|
|
513
|
-
const correctedDataEntry = dataEntryCorrecting(newDataEntry);
|
|
514
|
-
const dataEntryArray = parseDownNestedDataDescription(data);
|
|
515
|
-
const virginDataEntryArray = [correctedDataEntry, ...dataEntryArray];
|
|
516
|
-
return updateDataEntryObject(versionParser.objectGeneratorParameters, virginDataEntryArray);
|
|
517
|
-
};
|
|
518
|
-
// src/utils/interpolateData.ts
|
|
519
|
-
var interpolateEntryAt = (dataEntry2, t) => {
|
|
520
|
-
const localT = Math.max(Math.min(1, t), 0);
|
|
521
|
-
const cosT = Math.cos(localT * 2 * Math.PI) * 0.5 + 0.5;
|
|
522
|
-
switch (dataEntry2.type) {
|
|
523
|
-
case DataType.BOOLEAN:
|
|
524
|
-
return { ...dataEntry2, value: Boolean(Math.round(localT)) };
|
|
525
|
-
case DataType.VERSION:
|
|
526
|
-
return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.bits ** 2 - 0.001)) };
|
|
527
|
-
case DataType.ENUM:
|
|
528
|
-
return { ...dataEntry2, value: Math.floor(localT * (dataEntry2.max + 0.999)) };
|
|
529
|
-
case DataType.INT:
|
|
530
|
-
return { ...dataEntry2, value: dataEntry2.min + Math.floor(cosT * (dataEntry2.max - dataEntry2.min + 0.999)) };
|
|
531
|
-
case DataType.FLOAT:
|
|
532
|
-
const v = dataEntry2.min + cosT * (dataEntry2.max - dataEntry2.min);
|
|
533
|
-
return dataEntryCorrecting({ ...dataEntry2, value: Math.min(dataEntry2.max, Math.max(v, dataEntry2.min)) });
|
|
534
|
-
}
|
|
535
|
-
};
|
|
536
|
-
// src/utils/relativeValue.ts
|
|
537
|
-
var getRelativeValue = (dataEntry2) => {
|
|
538
|
-
switch (dataEntry2.type) {
|
|
539
|
-
case DataType.BOOLEAN:
|
|
540
|
-
return Number(dataEntry2.value);
|
|
541
|
-
case DataType.INT:
|
|
542
|
-
case DataType.FLOAT:
|
|
543
|
-
return (dataEntry2.value - dataEntry2.min) / (dataEntry2.max - dataEntry2.min);
|
|
544
|
-
case DataType.VERSION:
|
|
545
|
-
return dataEntry2.value / (2 ** dataEntry2.bits - 1);
|
|
546
|
-
case DataType.ENUM:
|
|
547
|
-
return dataEntry2.value / dataEntry2.max;
|
|
548
|
-
}
|
|
549
|
-
};
|
|
550
|
-
export {
|
|
551
|
-
valueBitsParser,
|
|
552
|
-
updateValue6 as updateValue,
|
|
553
|
-
updateDataEntryObject,
|
|
554
|
-
updateDataEntry,
|
|
555
|
-
parseUrlMethod,
|
|
556
|
-
parseDownNestedDataDescription,
|
|
557
|
-
parseBitsToBase64,
|
|
558
|
-
parseBase64ToBits,
|
|
559
|
-
nestedDataEntryArrayToObject,
|
|
560
|
-
interpolateEntryAt,
|
|
561
|
-
getVariableStrings,
|
|
562
|
-
getURLForData,
|
|
563
|
-
getTestStringValues,
|
|
564
|
-
getRelativeValue,
|
|
565
|
-
getDefaultObject,
|
|
566
|
-
getBitsCount6 as getBitsCount,
|
|
567
|
-
dataEntryCorrecting,
|
|
568
|
-
dataBitsStringifier,
|
|
569
|
-
dataBitsParser,
|
|
570
|
-
dataBitsArrayParser,
|
|
571
|
-
dataArrayStringifier,
|
|
572
|
-
ObjectGenerationOutputStatus,
|
|
573
|
-
DataType,
|
|
574
|
-
DataRangeDescriptionFactory,
|
|
575
|
-
DataEntryFactory,
|
|
576
|
-
DataDescriptionFactory
|
|
577
|
-
};
|