mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-28 19:34:14 +01:00
implement extension mechanism, all engine are registered through extensions now
This commit is contained in:
parent
2db4eb9b75
commit
c230f24490
5 changed files with 85 additions and 72 deletions
|
|
@ -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;
|
||||
66
web/app/cad/craft/extensionsPlugin.js
Normal file
66
web/app/cad/craft/extensionsPlugin.js
Normal 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;
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue