in server/src/graphStore.ts [75:179]
public decompress<T = object>(compressed: any[]): T {
let result = this.parent !== undefined ? this.parent.decompress(compressed) : Object.create(null);
for (let property of this.properties) {
let index = property.index;
let value = compressed[index];
if (value === null || value === undefined) {
continue;
}
let decompressor: Decompressor | undefined;
switch (property.compressionKind) {
case CompressionKind.id:
result[property.name] = value;
break;
case CompressionKind.ids:
result[property.name] = value;
break;
case CompressionKind.raw:
result[property.name] = value;
break;
case CompressionKind.scalar:
let convertedScalar = value;
if (property.longForm !== undefined) {
let long = property.longForm.get(value);
if (long !== undefined) {
convertedScalar = long;
}
}
let dotIndex = property.name.indexOf('.');
if (dotIndex !== -1) {
let container = property.name.substr(0, dotIndex);
let name = property.name.substring(dotIndex + 1);
if (result[container] === undefined) {
result[container] = Object.create(null);
}
result[container][name] = convertedScalar;
} else {
result[property.name] = convertedScalar;
}
break;
case CompressionKind.literal:
if (!Array.isArray(value) || typeof value[0] !== 'number') {
throw new Error(`Compression kind literal detected on non array value. The property is ${property.name}`);
}
let convertedLiteral: any;
decompressor = Decompressor.get(value[0]);
if (decompressor === undefined) {
throw new Error(`No decompression found for property ${property.name} and id ${value[0]}`);
}
convertedLiteral = decompressor.decompress(value);
result[property.name] = convertedLiteral;
break;
case CompressionKind.array:
if (!Array.isArray(value)) {
throw new Error(`Compression kind array detected on non array value. The property is ${property.name}`);
}
let convertedArray: any[] = [];
for (let element of value) {
let type = typeof element;
if (type === 'string' || type === 'number' || type === 'boolean') {
convertedArray.push(element);
} else if (Array.isArray(element) && element.length > 0 && typeof element[0] === 'number') {
decompressor = Decompressor.get(element[0]);
if (decompressor === undefined) {
throw new Error(`No decompression found for property ${property.name} and id ${element[0]}`);
}
convertedArray.push(decompressor.decompress(element));
} else {
throw new Error(`The array element is neither a scalar nor an array.`);
}
}
result[property.name] = convertedArray;
break;
case CompressionKind.any:
let convertedAny: any;
let type = typeof value;
if (type === 'string' || type === 'number' || type === 'boolean') {
convertedAny = value;
} else if (Array.isArray(value)) {
convertedAny = [];
for (let element of value) {
let type = typeof element;
if (type === 'string' || type === 'number' || type === 'boolean') {
(convertedAny as any[]).push(element);
} else if (Array.isArray(element) && element.length > 0 && typeof element[0] === 'number') {
decompressor = Decompressor.get(element[0]);
if (decompressor === undefined) {
throw new Error(`No decompression found for property ${property.name} and id ${element[0]}`);
}
(convertedAny as any[]).push(decompressor.decompress(element));
} else {
throw new Error(`The array element is neither a scalar nor an array.`);
}
}
}
if (convertedAny === undefined) {
throw new Error(`Comression kind any can't be handled for property ${property.name}. Value is ${JSON.stringify(value)}`);
}
result[property.name] = convertedAny;
break;
default:
throw new Error(`Compression kind ${property.compressionKind} unknown.`);
}
}
return result;
}