diff --git a/web/app/cad/craft/enginesPlugin.js b/web/app/cad/craft/enginesPlugin.js deleted file mode 100644 index 83adc7e6..00000000 --- a/web/app/cad/craft/enginesPlugin.js +++ /dev/null @@ -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; \ No newline at end of file diff --git a/web/app/cad/craft/extensionsPlugin.js b/web/app/cad/craft/extensionsPlugin.js new file mode 100644 index 00000000..c9790956 --- /dev/null +++ b/web/app/cad/craft/extensionsPlugin.js @@ -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; \ No newline at end of file diff --git a/web/app/cad/craft/operationPlugin.js b/web/app/cad/craft/operationPlugin.js index b7f0241a..a5e5fd72 100644 --- a/web/app/cad/craft/operationPlugin.js +++ b/web/app/cad/craft/operationPlugin.js @@ -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); -} \ No newline at end of file diff --git a/web/app/cad/init/lifecyclePlugin.js b/web/app/cad/init/lifecyclePlugin.js index f3551954..8086a8cf 100644 --- a/web/app/cad/init/lifecyclePlugin.js +++ b/web/app/cad/init/lifecyclePlugin.js @@ -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(); diff --git a/web/app/cad/init/startApplication.js b/web/app/cad/init/startApplication.js index b15a613d..7feaf96e 100644 --- a/web/app/cad/init/startApplication.js +++ b/web/app/cad/init/startApplication.js @@ -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,