Files
puter/extensions/puterfs/storage/LocalDiskStorageController.js
T
KernelDeimos 91f948f1fc dev: LocalDiskStorageController with upload method
Begin work on LocalDiskStorageController in the `puterfs` extension.
This replaces LocalDiskStorageStrategy and LocalDiskStorageService from
the core. The `upload()` method is implemented to verify that it's
working.

This commit by itself will break other storage strategies. The next step
is to allow extensions to register storage controllers for puterfs. Part
of that work is done in this commit by emitting an event to register
storage controllers, but this commit does not include a way to
configure/select storage controllers.
2025-11-19 16:13:26 -05:00

65 lines
1.7 KiB
JavaScript

import putility from '@heyputer/putility';
import fs from 'node:fs';
import path_ from 'node:path';
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 putility.libs.promise.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);
}
}