105 lines
2.6 KiB
JavaScript
105 lines
2.6 KiB
JavaScript
var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) {
|
|
return value instanceof P ? value : new P(function (resolve) {
|
|
resolve(value);
|
|
});
|
|
}
|
|
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) {
|
|
try {
|
|
step(generator.next(value));
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
}
|
|
|
|
function rejected(value) {
|
|
try {
|
|
step(generator["throw"](value));
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
}
|
|
|
|
function step(result) {
|
|
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
}
|
|
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
|
|
import { getFeedUpdateChunkReference } from "./index.js";
|
|
import { readUint64BigEndian } from "../utils/uint64.js";
|
|
import { bytesToHex } from "../utils/hex.js";
|
|
|
|
function makeNumericIndex(index) {
|
|
if (index instanceof Uint8Array) {
|
|
return readUint64BigEndian(index);
|
|
}
|
|
|
|
if (typeof index === 'string') {
|
|
return parseInt(index);
|
|
}
|
|
|
|
if (typeof index === 'number') {
|
|
return index;
|
|
}
|
|
|
|
throw new TypeError('Unknown type of index!');
|
|
}
|
|
/**
|
|
* Function that checks if a chunk is retrievable by actually downloading it.
|
|
* The /stewardship/{reference} endpoint does not support verification of chunks, but only manifest's references.
|
|
*
|
|
* @param bee
|
|
* @param ref
|
|
* @param options
|
|
*/
|
|
|
|
|
|
function isChunkRetrievable(bee, ref, options) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
try {
|
|
yield bee.downloadChunk(ref, options);
|
|
return true;
|
|
} catch (e) {
|
|
const err = e;
|
|
|
|
if (err.status === 404) {
|
|
return false;
|
|
}
|
|
|
|
throw e;
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Creates array of references for all sequence updates chunk up to the given index.
|
|
*
|
|
* @param owner
|
|
* @param topic
|
|
* @param index
|
|
*/
|
|
|
|
|
|
function getAllSequenceUpdateReferences(owner, topic, index) {
|
|
const numIndex = makeNumericIndex(index);
|
|
const updateReferences = new Array(numIndex + 1);
|
|
|
|
for (let i = 0; i <= numIndex; i++) {
|
|
updateReferences[i] = bytesToHex(getFeedUpdateChunkReference(owner, topic, i));
|
|
}
|
|
|
|
return updateReferences;
|
|
}
|
|
|
|
export function areAllSequentialFeedsUpdateRetrievable(bee, owner, topic, index, options) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const chunkRetrievablePromises = getAllSequenceUpdateReferences(owner, topic, index).map(ref => __awaiter(this, void 0, void 0, function* () {
|
|
return isChunkRetrievable(bee, ref, options);
|
|
}));
|
|
return (yield Promise.all(chunkRetrievablePromises)).every(result => result);
|
|
});
|
|
} |