@apillon/sdk
Version:
▶◀ Apillon SDK for NodeJS ▶◀
180 lines • 6.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.StorageBucket = void 0;
const apillon_1 = require("../../lib/apillon");
const apillon_api_1 = require("../../lib/apillon-api");
const apillon_logger_1 = require("../../lib/apillon-logger");
const common_1 = require("../../lib/common");
const apillon_2 = require("../../types/apillon");
const storage_1 = require("../../types/storage");
const file_utils_1 = require("../../util/file-utils");
const directory_1 = require("./directory");
const file_1 = require("./file");
const ipns_1 = require("./ipns");
class StorageBucket extends apillon_1.ApillonModel {
/**
* Constructor which should only be called via Storage class.
* @param uuid Unique identifier of the bucket.
* @param data Data to populate storage bucket with.
*/
constructor(uuid, data) {
super(uuid);
/**
* Name of the bucket.
*/
this.name = null;
/**
* Bucket description.
*/
this.description = null;
/**
* Size of the bucket in bytes.
*/
this.size = null;
/**
* Type of bucket (storage, hosting or NFT metadata)
*/
this.bucketType = null;
/**
* Bucket content which are files and directories.
*/
this.content = [];
this.API_PREFIX = `/storage/buckets/${uuid}`;
this.populate(data);
}
/**
* Gets contents of a bucket.
* @returns A a list of File and Directory objects.
*/
async listObjects(params) {
const content = [];
const url = (0, common_1.constructUrlWithQueryParams)(`${this.API_PREFIX}/content`, params);
const data = await apillon_api_1.ApillonApi.get(url);
for (const item of data.items) {
if (item.type == storage_1.StorageContentType.FILE) {
const file = item;
content.push(new file_1.File(this.uuid, file.directoryUuid, file.uuid, file));
}
else {
const directory = new directory_1.Directory(this.uuid, item.uuid, item);
content.push(directory, ...(await directory.get()));
}
}
this.content = content;
return { total: data.total, items: content };
}
/**
* Gets all files in a bucket.
* @param {?IBucketFilesRequest} [params] - query filter parameters
* @returns List of files in the bucket
*/
async listFiles(params) {
const url = (0, common_1.constructUrlWithQueryParams)(`${this.API_PREFIX}/files`, params);
const data = await apillon_api_1.ApillonApi.get(url);
return Object.assign(Object.assign({}, data), { items: data.items.map((file) => new file_1.File(this.uuid, file.directoryUuid, file.fileUuid, file)) });
}
/**
* Uploads files inside a local folder via path.
* @param folderPath Path to the folder to upload.
* @param {IFileUploadRequest} params - Optional parameters to be used for uploading files
* @returns List of uploaded files with their properties
*/
async uploadFromFolder(folderPath, params) {
const { files: uploadedFiles } = await (0, file_utils_1.uploadFiles)({
apiPrefix: this.API_PREFIX,
folderPath,
params,
});
return uploadedFiles;
}
/**
* Uploads files to the bucket.
* @param {FileMetadata[]} files - The files to be uploaded
* @param {IFileUploadRequest} params - Optional parameters to be used for uploading files
*/
async uploadFiles(files, params) {
const { files: uploadedFiles } = await (0, file_utils_1.uploadFiles)({
apiPrefix: this.API_PREFIX,
params,
files,
});
return uploadedFiles;
}
/**
* Gets file instance.
* @param fileUuid UUID of the file.
* @returns File instance.
*/
file(fileUuid) {
return new file_1.File(this.uuid, null, fileUuid);
}
/**
* Gets a directory instance.
* @param directoryUuid UUID of the directory.
* @returns Directory instance.
*/
directory(directoryUuid) {
return new directory_1.Directory(this.uuid, directoryUuid);
}
async resolveFileCIDs(sessionUuid, limit) {
let resolvedFiles = [];
// Resolve CIDs for each file
let retryTimes = 0;
apillon_logger_1.ApillonLogger.log('Resolving file CIDs...');
while (resolvedFiles.length === 0 || !resolvedFiles.every((f) => !!f.CID)) {
resolvedFiles = await this.getUploadedFiles(sessionUuid, limit);
await new Promise((resolve) => setTimeout(resolve, 1000));
if (++retryTimes >= 30) {
apillon_logger_1.ApillonLogger.log('Unable to resolve file CIDs', apillon_2.LogLevel.ERROR);
return resolvedFiles;
}
}
return resolvedFiles;
}
async getUploadedFiles(sessionUuid, limit) {
return (await this.listFiles({ sessionUuid, limit })).items.map((file) => ({
fileName: file.name,
fileUuid: file.uuid,
CID: file.CID,
// CIDv1: file.CIDv1,
}));
}
//#region IPNS methods
/**
* Gets an IPNS record instance.
* @param ipnsUuid UUID of the IPNS record.
* @returns Ipns instance.
*/
ipns(ipnsUuid) {
return new ipns_1.Ipns(this.uuid, ipnsUuid);
}
/**
* List all IPNS records for this bucket
* @param {IPNSListRequest?} [params] - Listing query filters
* @returns List of IPNS names in the bucket
*/
async listIpnsNames(params) {
const url = (0, common_1.constructUrlWithQueryParams)(`${this.API_PREFIX}/ipns`, params);
const data = await apillon_api_1.ApillonApi.get(url);
return Object.assign(Object.assign({}, data), { items: data.items.map((ipns) => new ipns_1.Ipns(this.uuid, ipns.ipnsUuid, ipns)) });
}
/**
* Create a new IPNS record for this bucket
* @param {ICreateIpns} body
* @returns New IPNS instance
*/
async createIpns(body) {
const data = await apillon_api_1.ApillonApi.post(`${this.API_PREFIX}/ipns`, body);
return new ipns_1.Ipns(this.uuid, data.ipnsUuid, data);
}
//#endregion
serializeFilter(key, value) {
const serialized = super.serializeFilter(key, value);
const enums = {
bucketType: storage_1.BucketType[value],
};
return Object.keys(enums).includes(key) ? enums[key] : serialized;
}
}
exports.StorageBucket = StorageBucket;
//# sourceMappingURL=storage-bucket.js.map