83 lines
2.2 KiB
JavaScript
Raw Normal View History

2018-03-25 21:29:35 -04:00
import ScriptContext from "./script_context.js";
import server from "./server.js";
2019-10-20 10:00:18 +02:00
import toastService from "./toast.js";
2020-08-15 00:06:26 +02:00
import treeCache from "./tree_cache.js";
2018-08-10 13:30:20 +02:00
async function getAndExecuteBundle(noteId, originEntity = null) {
const bundle = await server.get('script/bundle/' + noteId);
2019-08-17 11:28:36 +02:00
return await executeBundle(bundle, originEntity);
}
2020-02-25 19:19:10 +01:00
async function executeBundle(bundle, originEntity, $container) {
const apiContext = await ScriptContext(bundle.noteId, bundle.allNoteIds, originEntity, $container);
try {
return await (function () {
return eval(`const apiContext = this; (async function() { ${bundle.script}\r\n})()`);
}.call(apiContext));
}
catch (e) {
2020-08-15 00:06:26 +02:00
const note = await treeCache.getNote(bundle.noteId);
toastService.showAndLogError(`Execution of JS note "${note.title}" with ID ${bundle.noteId} failed with error: ${e.message}`);
}
}
async function executeStartupBundles() {
const scriptBundles = await server.get("script/startup");
for (const bundle of scriptBundles) {
await executeBundle(bundle);
}
}
2020-03-16 23:25:52 +01:00
class WidgetsByParent {
constructor() {
this.byParent = {};
}
add(widget) {
if (!widget.parentWidget) {
console.log(`Custom widget does not have mandatory 'getParent()' method defined`);
return;
}
this.byParent[widget.parentWidget] = this.byParent[widget.parentWidget] || [];
this.byParent[widget.parentWidget].push(widget);
}
get(parentName) {
return this.byParent[parentName] || [];
}
}
2020-03-16 21:16:09 +01:00
async function getWidgetBundlesByParent() {
const scriptBundles = await server.get("script/widgets");
2020-03-16 23:25:52 +01:00
const widgetsByParent = new WidgetsByParent();
2020-03-16 21:16:09 +01:00
for (const bundle of scriptBundles) {
let widget;
try {
widget = await executeBundle(bundle);
}
catch (e) {
console.error("Widget initialization failed: ", e);
continue;
}
2020-03-16 23:25:52 +01:00
widgetsByParent.add(widget);
2020-03-16 21:16:09 +01:00
}
2020-03-16 23:25:52 +01:00
return widgetsByParent;
2020-03-16 21:16:09 +01:00
}
export default {
executeBundle,
getAndExecuteBundle,
2020-03-16 21:16:09 +01:00
executeStartupBundles,
getWidgetBundlesByParent
2020-06-14 14:30:57 +02:00
}