enhance(frontend): improve aiscript plugin error handling
This commit is contained in:
		| @@ -58,7 +58,7 @@ export async function mainBoot() { | ||||
| 	}); | ||||
|  | ||||
| 	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 | ||||
| 			await new Promise(r => setTimeout(r, 0)); | ||||
| 			install(plugin); | ||||
|   | ||||
| @@ -202,11 +202,17 @@ let note = $ref(deepClone(props.note)); | ||||
| // plugin | ||||
| if (noteViewInterruptors.length > 0) { | ||||
| 	onMounted(async () => { | ||||
| 		let result:Misskey.entities.Note | null = deepClone(note); | ||||
| 		let result: Misskey.entities.Note | null = deepClone(note); | ||||
| 		for (const interruptor of noteViewInterruptors) { | ||||
| 			result = await interruptor.handler(result); | ||||
|  | ||||
| 			if (result === null) return isDeleted.value = true; | ||||
| 			try { | ||||
| 				result = await interruptor.handler(result); | ||||
| 				if (result === null) { | ||||
| 					isDeleted.value = true; | ||||
| 					return; | ||||
| 				} | ||||
| 			} catch (err) { | ||||
| 				console.error(err); | ||||
| 			} | ||||
| 		} | ||||
| 		note = result; | ||||
| 	}); | ||||
|   | ||||
| @@ -239,11 +239,17 @@ let note = $ref(deepClone(props.note)); | ||||
| // plugin | ||||
| if (noteViewInterruptors.length > 0) { | ||||
| 	onMounted(async () => { | ||||
| 		let result:Misskey.entities.Note | null = deepClone(note); | ||||
| 		let result: Misskey.entities.Note | null = deepClone(note); | ||||
| 		for (const interruptor of noteViewInterruptors) { | ||||
| 			result = await interruptor.handler(result); | ||||
|  | ||||
| 			if (result === null) return isDeleted.value = true; | ||||
| 			try { | ||||
| 				result = await interruptor.handler(result); | ||||
| 				if (result === null) { | ||||
| 					isDeleted.value = true; | ||||
| 					return; | ||||
| 				} | ||||
| 			} catch (err) { | ||||
| 				console.error(err); | ||||
| 			} | ||||
| 		} | ||||
| 		note = result; | ||||
| 	}); | ||||
|   | ||||
| @@ -750,7 +750,11 @@ async function post(ev?: MouseEvent) { | ||||
| 	// plugin | ||||
| 	if (notePostInterruptors.length > 0) { | ||||
| 		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 pluginContexts = new Map<string, Interpreter>(); | ||||
|  | ||||
| export function install(plugin: Plugin): void { | ||||
| export async function install(plugin: Plugin): Promise<void> { | ||||
| 	// 後方互換性のため | ||||
| 	if (plugin.src == null) return; | ||||
| 	console.info('Plugin installed:', plugin.name, 'v' + plugin.version); | ||||
|  | ||||
| 	const aiscript = new Interpreter(createPluginEnv({ | ||||
| 		plugin: plugin, | ||||
| @@ -42,7 +41,14 @@ export function install(plugin: Plugin): void { | ||||
|  | ||||
| 	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> { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo