This repository has been archived on 2023-11-14. You can view files and clone it, but cannot push or open issues/pull-requests.
vogue/System.js

65 lines
1.5 KiB
JavaScript
Raw Normal View History

2021-05-02 17:42:04 -04:00
import Instance from './Instance.js';
import Serializable from './Serializable.js';
2021-05-06 09:33:28 -04:00
import _ from 'lodash';
import Module from './Module.js';
import debug from 'debug';
const log = debug('vogue:system')
2021-05-06 09:33:28 -04:00
const {get, set} = _;
2021-05-02 17:42:04 -04:00
export default class System extends Serializable {
instances = [];
modules = null;
namespace = null;
2021-05-02 17:42:04 -04:00
constructor(modules, location = '.running') {
super();
this.modules = modules;
this.createNamespace();
const bootModules = this.deriveBootModules();
log('instantiating modules...');
for(const name of bootModules)
this.newInstance(name);
}
deriveBootModules() {
log('deriving boot modules...');
const bootModules = this.modules.filter((module) => {
return module.singleton;
}).map((module) => {
return module.name.full;
});
for(const name of bootModules)
log(' ' + name);
return bootModules;
}
createNamespace() {
log('creating namespace map...');
this.namespace = this.modules.reduce((acc, val) => {
if(get(acc, val.name.full) instanceof Module)
throw new Error('Duplicate module "' + val.name.full + '"');
set(acc, val.name.full, val);
log(' ' + val.name.full);
return acc;
}, {});
2021-05-06 09:33:28 -04:00
}
getModule(name) {
return get(this.namespace, name);
2021-05-02 17:42:04 -04:00
}
createInstance(name, args = {}) {
2021-05-06 09:33:28 -04:00
return new Instance(this.getModule(name), null, args, this);
2021-05-02 17:42:04 -04:00
}
newInstance(name, args = {}) {
const instance = this.createInstance(name, args);
2021-05-06 23:05:36 -04:00
const link = instance.link;
2021-05-02 17:42:04 -04:00
instance.invokeInternal('restore');
return link;
}
}