js-isp
Version:
58 lines (57 loc) • 1.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Bucket = void 0;
const bucket_1 = require("./did/bucket");
const agent_1 = require("@dfinity/agent");
class Bucket {
constructor(canisterId, agent) {
this.bucketCanisterId = canisterId;
this.BucketActor = agent_1.Actor.createActor(bucket_1.idlFactory, { agent, canisterId });
}
async getFile(decodeArr, length) {
const File = new Uint8Array(length);
for (let i = 0; i < decodeArr.length; i++) {
let slice = decodeArr[i];
let start = 0;
for (let j = 0; j < i; j++) {
start += decodeArr[j].length;
}
File.set(slice, start);
}
return File;
}
async get_file(fileKey) {
try {
const queryPromiseArr = [];
const dataArr = [];
let fileSize = 0;
const chunkNumber = Number(await this.BucketActor.getFileTotalIndex(fileKey));
for (let i = 0; i < chunkNumber; i++) {
queryPromiseArr.push(this.BucketActor.get(fileKey, BigInt(i)));
}
const res = (await Promise.all(queryPromiseArr));
if (res[0][0]) {
const fileType = res[0][0][1];
res.forEach(e => {
if (e[0]) {
dataArr.push(e[0][0]);
fileSize += e[0][0].length;
}
});
const metadata = await this.getFile(dataArr, fileSize);
if (fileType === "text/plain")
return new TextDecoder().decode(metadata);
return new Blob([metadata.buffer], {
type: fileType,
});
}
else {
throw new Error("have no data");
}
}
catch (e) {
throw e;
}
}
}
exports.Bucket = Bucket;