Files
puter/extensions/puterfs/main.js
2025-11-19 16:13:26 -05:00

77 lines
2.7 KiB
JavaScript

/*
* Copyright (C) 2024-present Puter Technologies Inc.
*
* This file is part of Puter.
*
* Puter is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import FSEntryController from './fsentries/FSEntryController.js';
import PuterFSProvider from './PuterFSProvider.js';
import LocalDiskStorageController from './storage/LocalDiskStorageController.js';
import ProxyStorageController from './storage/ProxyStorageController.js';
const svc_event = extension.import('service:event');
const fsEntryController = new FSEntryController();
const storageController = new ProxyStorageController();
extension.on('init', async () => {
fsEntryController.init();
// Keep track of possible storage strategies for puterfs here
let defaultStorage = 'flat-files';
const storageStrategies = {
'flat-files': new LocalDiskStorageController(),
};
// Emit the "create storage strategies" event
const event = {
createStorageStrategy (name, implementation) {
storageStrategies[name] = implementation;
if ( implementation === undefined ) {
throw new Error('createStorageStrategy was called wrong');
}
if ( implementation.forceDefault ) {
defaultStorage = name;
}
},
};
// Awaiting the event ensures all the storage strategies are registered
await svc_event.emit('puterfs.storage.create', event);
let configuredStorage = defaultStorage;
if ( config.storage ) configuredStorage = config.storage;
// Not we can select the configured strategy
const storageToUse = storageStrategies[configuredStorage];
storageController.setDelegate(storageToUse);
// The StorageController may need to await some asynchronous operations
// before it's ready to be used.
await storageController.init();
});
extension.on('create.filesystem-types', event => {
event.createFilesystemType('puterfs', {
mount ({ path }) {
return new PuterFSProvider({
fsEntryController,
storageController,
});
},
});
});