implement extension mechanism, all engine are registered through extensions now

This commit is contained in:
Val Erastov 2018-10-26 20:27:17 -07:00
parent 2db4eb9b75
commit c230f24490
5 changed files with 85 additions and 72 deletions

View file

@ -1,58 +0,0 @@
import {STORAGE_GLOBAL_PREFIX} from '../projectPlugin';
const ENGINES_STORAGE_PREFIX = `${STORAGE_GLOBAL_PREFIX}.CraftEngines`;
let engines = [];
export function activate({services}) {
let enginesStr = services.storage.get(ENGINES_STORAGE_PREFIX);
if (enginesStr) {
engines = JSON.parse(enginesStr);
}
function registerEngine(id, url){
engines.push({id, url});
services.storage.set(ENGINES_STORAGE_PREFIX, JSON.stringify(engines));
startEngine(engines[engines.length - 1]);
}
function engineReady(id, handler) {
let engine = engines.find(e => e.id === id);
if (!engine) {
console.warn(`engine "${id}" not registered`);
} else {
engine.handler = handler;
console.info(`engine "${id}" is ready`);
}
services.lifecycle.loadProjectRequest();
}
function allEnginesReady() {
for (let e of engines) {
if (e.handler === NO_OP_HANDLER) {
return false;
}
}
return true;
}
services.craftEngines = {
registerEngine,
getRegisteredEngines: () => engines,
engineReady,
allEnginesReady
};
engines.forEach(e => e.handler = NO_OP_HANDLER);
engines.forEach(startEngine);
}
function startEngine({id, url}) {
console.info(`starting engine "${id}"...`);
let engineScript = document.createElement('script');
engineScript.setAttribute('src', url);
document.head.appendChild(engineScript);
}
const NO_OP_HANDLER = () => null;

View file

@ -0,0 +1,66 @@
import {STORAGE_GLOBAL_PREFIX} from '../projectPlugin';
const EXTENSIONS_STORAGE_PREFIX = `${STORAGE_GLOBAL_PREFIX}.Extensions`;
let extensions = [];
export function activate(ctx) {
let {services} = ctx;
let extensionsStr = services.storage.get(EXTENSIONS_STORAGE_PREFIX);
if (extensionsStr) {
extensions = JSON.parse(extensionsStr);
}
function registerExtension(id, url){
extensions.push({id, url});
services.storage.set(EXTENSIONS_STORAGE_PREFIX, JSON.stringify(extensions));
loadExtension(extensions[extensions.length - 1]);
}
function extensionReady(id, activate) {
let extension = extensions.find(e => e.id === id);
if (!extension) {
console.warn(`extension "${id}" not registered`);
} else {
extension.activate = activate;
console.info(`extension "${id}" is ready`);
}
services.lifecycle.loadProjectRequest();
}
function allExtensionsReady() {
for (let e of extensions) {
if (e.activate === NO_OP) {
return false;
}
}
return true;
}
function activateAllExtensions() {
for (let e of extensions) {
e.activate(ctx);
}
}
services.extension = {
registerExtension,
allExtensions: extensions,
extensionReady,
allExtensionsReady,
activateAllExtensions
};
extensions.forEach(e => e.activate = NO_OP);
extensions.forEach(loadExtension);
}
function loadExtension({id, url}) {
console.info(`starting extension "${id}"...`);
let extensionScript = document.createElement('script');
extensionScript.setAttribute('src', url);
document.head.appendChild(extensionScript);
}
const NO_OP = () => null;

View file

@ -46,18 +46,21 @@ export function activate(context) {
return op;
}
let handlers = [];
function runOperation(request, descriptor, services) {
for (let handler of handlers) {
let result = handler(descriptor.id, request, services);
if (result) {
return result;
}
}
return descriptor.run(request, services);
}
services.operation = {
registerOperations,
get
get,
handlers
};
}
function runOperation(request, descriptor, services) {
for (let engine of services.craftEngines.getRegisteredEngines()) {
let result = engine.handler(descriptor.id, request, services);
if (result) {
return result;
}
}
return descriptor.run(request, services);
}

View file

@ -1,4 +1,5 @@
import {state} from '../../../../modules/lstream';
import context from '../../../../modules/context';
export function activate({streams, services}) {
const startTime = performance.now();
@ -10,8 +11,9 @@ export function activate({streams, services}) {
loadProjectRequest: () => {
if (streams.lifecycle.appReady.value &&
!streams.lifecycle.projectLoaded.value &&
services.craftEngines.allEnginesReady()) {
services.extension.allExtensionsReady()) {
services.extension.activateAllExtensions();
services.project.load();
streams.lifecycle.projectLoaded.value = true;
const onLoadTime = performance.now();

View file

@ -12,7 +12,7 @@ import * as KeyboardPlugin from '../keyboard/keyboardPlugin';
import * as WizardPlugin from '../craft/wizard/wizardPlugin';
import * as PreviewPlugin from '../preview/previewPlugin';
import * as OperationPlugin from '../craft/operationPlugin';
import * as CraftEnginesPlugin from '../craft/enginesPlugin';
import * as ExtensionsPlugin from '../craft/extensionsPlugin';
import * as CadRegistryPlugin from '../craft/cadRegistryPlugin';
import * as CraftPlugin from '../craft/craftPlugin';
import * as CraftUiPlugin from '../craft/craftUiPlugin';
@ -41,7 +41,7 @@ export default function startApplication(callback) {
UiEntryPointsPlugin,
MenuPlugin,
KeyboardPlugin,
CraftEnginesPlugin,
ExtensionsPlugin,
OperationPlugin,
CraftPlugin,
WizardPlugin,