enhance(frontend): improve aiscript plugin error handling
This commit is contained in:
parent
f72228f428
commit
bfca457510
5 changed files with 35 additions and 13 deletions
|
@ -58,7 +58,7 @@ export async function mainBoot() {
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const plugin of ColdDeviceStorage.get('plugins').filter(p => p.active)) {
|
for (const plugin of ColdDeviceStorage.get('plugins').filter(p => p.active)) {
|
||||||
import('../plugin').then(async ({ install }) => {
|
import('@/plugin.js').then(async ({ install }) => {
|
||||||
// Workaround for https://bugs.webkit.org/show_bug.cgi?id=242740
|
// Workaround for https://bugs.webkit.org/show_bug.cgi?id=242740
|
||||||
await new Promise(r => setTimeout(r, 0));
|
await new Promise(r => setTimeout(r, 0));
|
||||||
install(plugin);
|
install(plugin);
|
||||||
|
|
|
@ -202,11 +202,17 @@ let note = $ref(deepClone(props.note));
|
||||||
// plugin
|
// plugin
|
||||||
if (noteViewInterruptors.length > 0) {
|
if (noteViewInterruptors.length > 0) {
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
let result:Misskey.entities.Note | null = deepClone(note);
|
let result: Misskey.entities.Note | null = deepClone(note);
|
||||||
for (const interruptor of noteViewInterruptors) {
|
for (const interruptor of noteViewInterruptors) {
|
||||||
result = await interruptor.handler(result);
|
try {
|
||||||
|
result = await interruptor.handler(result);
|
||||||
if (result === null) return isDeleted.value = true;
|
if (result === null) {
|
||||||
|
isDeleted.value = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
note = result;
|
note = result;
|
||||||
});
|
});
|
||||||
|
|
|
@ -239,11 +239,17 @@ let note = $ref(deepClone(props.note));
|
||||||
// plugin
|
// plugin
|
||||||
if (noteViewInterruptors.length > 0) {
|
if (noteViewInterruptors.length > 0) {
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
let result:Misskey.entities.Note | null = deepClone(note);
|
let result: Misskey.entities.Note | null = deepClone(note);
|
||||||
for (const interruptor of noteViewInterruptors) {
|
for (const interruptor of noteViewInterruptors) {
|
||||||
result = await interruptor.handler(result);
|
try {
|
||||||
|
result = await interruptor.handler(result);
|
||||||
if (result === null) return isDeleted.value = true;
|
if (result === null) {
|
||||||
|
isDeleted.value = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
note = result;
|
note = result;
|
||||||
});
|
});
|
||||||
|
|
|
@ -750,7 +750,11 @@ async function post(ev?: MouseEvent) {
|
||||||
// plugin
|
// plugin
|
||||||
if (notePostInterruptors.length > 0) {
|
if (notePostInterruptors.length > 0) {
|
||||||
for (const interruptor of notePostInterruptors) {
|
for (const interruptor of notePostInterruptors) {
|
||||||
postData = await interruptor.handler(deepClone(postData));
|
try {
|
||||||
|
postData = await interruptor.handler(deepClone(postData));
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,9 @@ import { Plugin, noteActions, notePostInterruptors, noteViewInterruptors, postFo
|
||||||
const parser = new Parser();
|
const parser = new Parser();
|
||||||
const pluginContexts = new Map<string, Interpreter>();
|
const pluginContexts = new Map<string, Interpreter>();
|
||||||
|
|
||||||
export function install(plugin: Plugin): void {
|
export async function install(plugin: Plugin): Promise<void> {
|
||||||
// 後方互換性のため
|
// 後方互換性のため
|
||||||
if (plugin.src == null) return;
|
if (plugin.src == null) return;
|
||||||
console.info('Plugin installed:', plugin.name, 'v' + plugin.version);
|
|
||||||
|
|
||||||
const aiscript = new Interpreter(createPluginEnv({
|
const aiscript = new Interpreter(createPluginEnv({
|
||||||
plugin: plugin,
|
plugin: plugin,
|
||||||
|
@ -42,7 +41,14 @@ export function install(plugin: Plugin): void {
|
||||||
|
|
||||||
initPlugin({ plugin, aiscript });
|
initPlugin({ plugin, aiscript });
|
||||||
|
|
||||||
aiscript.exec(parser.parse(plugin.src));
|
try {
|
||||||
|
await aiscript.exec(parser.parse(plugin.src));
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Plugin install failed:', plugin.name, 'v' + plugin.version);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.info('Plugin installed:', plugin.name, 'v' + plugin.version);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record<string, values.Value> {
|
function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record<string, values.Value> {
|
||||||
|
|
Loading…
Reference in a new issue