import fs from 'node:fs'; import path_ from 'node:path'; import { TeePromise } from 'teepromise'; const { progress_stream, size_limit_stream, } = extension.import('core').util.streamutil; export default class LocalDiskStorageController { constructor () { this.path = path_.join(process.cwd(), '/storage'); } async init () { await fs.promises.mkdir(this.path, { recursive: true }); } async upload ({ uid, file, storage_api }) { const { progress_tracker } = storage_api; if ( file.buffer ) { const path = this.#getPath(uid); await fs.promises.writeFile(path, file.buffer); progress_tracker.set_total(file.buffer.length); progress_tracker.set(file.buffer.length); return; } let stream = file.stream; stream = progress_stream(stream, { total: file.size, progress_callback: evt => { progress_tracker.set_total(file.size); progress_tracker.set(evt.uploaded); }, }); stream = size_limit_stream(stream, { limit: file.size, }); const writePromise = new TeePromise(); const path = this.#getPath(uid); const write_stream = fs.createWriteStream(path); write_stream.on('error', () => writePromise.reject()); write_stream.on('finish', () => writePromise.resolve()); stream.pipe(write_stream); // @ts-ignore (it's wrong about this) await writePromise; } copy () { } delete () { } read () { } #getPath (key) { return path_.join(this.path, key); } }