@ethersphere/bee-js
Version:
Javascript client for Bee
135 lines (134 loc) • 4.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRedundancyStat = exports.getRedundancyStats = exports.approximateOverheadForRedundancyLevel = void 0;
const __1 = require("..");
const mediumTable = [
[94, 68, 46, 28, 14, 5, 1],
[9, 8, 7, 6, 5, 4, 3],
];
const encMediumTable = [
[47, 34, 23, 14, 7, 2],
[9, 8, 7, 6, 5, 4],
];
const strongTable = [
[104, 95, 86, 77, 69, 61, 53, 46, 39, 32, 26, 20, 15, 10, 6, 3, 1],
[21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5],
];
const encStrongTable = [
[52, 47, 43, 38, 34, 30, 26, 23, 19, 16, 13, 10, 7, 5, 3, 1],
[21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6],
];
const insaneTable = [
[92, 87, 82, 77, 73, 68, 63, 59, 54, 50, 45, 41, 37, 33, 29, 26, 22, 19, 16, 13, 10, 8, 5, 3, 2, 1],
[31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6],
];
const encInsaneTable = [
[46, 43, 41, 38, 36, 34, 31, 29, 27, 25, 22, 20, 18, 16, 14, 13, 11, 9, 8, 6, 5, 4, 2, 1],
[31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 7],
];
const paranoidTable = [
[
37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9,
8, 7, 6, 5, 4, 3, 2, 1,
],
[
90, 88, 87, 85, 84, 82, 81, 79, 77, 76, 74, 72, 71, 69, 67, 66, 64, 62, 60, 59, 57, 55, 53, 51, 49, 48, 46, 44, 41,
39, 37, 35, 32, 30, 27, 24, 20,
],
];
const encParanoidTable = [
[18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
[88, 85, 82, 79, 76, 72, 69, 66, 62, 59, 55, 51, 48, 44, 39, 35, 30, 24],
];
/**
* Returns an approximate multiplier for the overhead of a given redundancy level.
* Redundancy level is a tradeoff between storage overhead and fault tolerance.
* Use this number to estimate the amount of chunks that will be stored for a given
* redundancy level.
*/
function approximateOverheadForRedundancyLevel(chunks, level, encrypted) {
if (level === __1.RedundancyLevel.OFF) {
return 0;
}
const table = selectTable(level, encrypted);
const [supportedChunks, parities] = table;
for (let i = 0; i < supportedChunks.length; i++) {
if (chunks >= supportedChunks[i]) {
return parities[i] / supportedChunks[i];
}
}
return parities[parities.length - 1] / supportedChunks[supportedChunks.length - 1];
}
exports.approximateOverheadForRedundancyLevel = approximateOverheadForRedundancyLevel;
function selectTable(level, encrypted) {
switch (level) {
case __1.RedundancyLevel.MEDIUM:
return encrypted ? encMediumTable : mediumTable;
case __1.RedundancyLevel.STRONG:
return encrypted ? encStrongTable : strongTable;
case __1.RedundancyLevel.INSANE:
return encrypted ? encInsaneTable : insaneTable;
case __1.RedundancyLevel.PARANOID:
return encrypted ? encParanoidTable : paranoidTable;
default:
throw new Error(`Unknown redundancy level ${level}`);
}
}
const medium = {
label: 'medium',
value: __1.RedundancyLevel.MEDIUM,
errorTolerance: 0.01,
};
const strong = {
label: 'strong',
value: __1.RedundancyLevel.STRONG,
errorTolerance: 0.05,
};
const insane = {
label: 'insane',
value: __1.RedundancyLevel.INSANE,
errorTolerance: 0.1,
};
const paranoid = {
label: 'paranoid',
value: __1.RedundancyLevel.PARANOID,
errorTolerance: 0.5,
};
function getRedundancyStats() {
return {
medium,
strong,
insane,
paranoid,
};
}
exports.getRedundancyStats = getRedundancyStats;
function getRedundancyStat(level) {
if (typeof level === 'string') {
switch (level.toLowerCase()) {
case 'medium':
return medium;
case 'strong':
return strong;
case 'insane':
return insane;
case 'paranoid':
return paranoid;
default:
throw new Error(`Unknown redundancy level '${level}'`);
}
}
switch (level) {
case __1.RedundancyLevel.MEDIUM:
return medium;
case __1.RedundancyLevel.STRONG:
return strong;
case __1.RedundancyLevel.INSANE:
return insane;
case __1.RedundancyLevel.PARANOID:
return paranoid;
default:
throw new Error(`Unknown redundancy level '${level}'`);
}
}
exports.getRedundancyStat = getRedundancyStat;