UNPKG

@apillon/sdk

Version:

▶◀ Apillon SDK for NodeJS ▶◀

180 lines 6.71 kB
"use strict"; 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