From 75ae9f4fad78606fd1e1308de8fb3d39ddb7b3f0 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Tue, 28 Nov 2023 11:48:09 +0900 Subject: [PATCH] fix: fix unloader --- src/loader/preload.ts | 4 +- src/plugins/visualizer/index.ts | 124 ++++++++++++++++---------------- src/utils/index.ts | 5 +- 3 files changed, 69 insertions(+), 64 deletions(-) diff --git a/src/loader/preload.ts b/src/loader/preload.ts index 1f2e4cb9..fa65776e 100644 --- a/src/loader/preload.ts +++ b/src/loader/preload.ts @@ -21,6 +21,8 @@ const createContext = (id: string): PreloadContext => ({ }); export const forceUnloadPreloadPlugin = (id: string) => { + if (!loadedPluginMap[id]) return; + const hasStopped = stopPlugin(id, loadedPluginMap[id], { ctx: 'preload', context: createContext(id), @@ -73,7 +75,7 @@ export const loadAllPreloadPlugins = () => { const pluginConfigs = config.plugins.getPlugins(); for (const [pluginId, pluginDef] of Object.entries(preloadPlugins)) { - const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}) ; + const config = deepmerge(pluginDef.config ?? { enable: false }, pluginConfigs[pluginId] ?? {}) ; if (config.enabled) { forceLoadPreloadPlugin(pluginId); diff --git a/src/plugins/visualizer/index.ts b/src/plugins/visualizer/index.ts index e046aa72..c8923406 100644 --- a/src/plugins/visualizer/index.ts +++ b/src/plugins/visualizer/index.ts @@ -145,77 +145,79 @@ export default createPlugin({ ]; }, - async renderer({ getConfig }) { - const config = await getConfig(); + renderer: { + async onPlayerApiReady(_, { getConfig }) { + const config = await getConfig(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let visualizerType: { new(...args: any[]): Visualizer } = vudio; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let visualizerType: { new(...args: any[]): Visualizer } = vudio; - if (config.type === 'wave') { - visualizerType = wave; - } else if (config.type === 'butterchurn') { - visualizerType = butterchurn; - } + if (config.type === 'wave') { + visualizerType = wave; + } else if (config.type === 'butterchurn') { + visualizerType = butterchurn; + } - document.addEventListener( - 'audioCanPlay', - (e) => { - const video = document.querySelector('video'); - if (!video) { - return; - } - - const visualizerContainer = document.querySelector('#player'); - if (!visualizerContainer) { - return; - } - - let canvas = document.querySelector('#visualizer'); - if (!canvas) { - canvas = document.createElement('canvas'); - canvas.id = 'visualizer'; - visualizerContainer?.prepend(canvas); - } - - const resizeCanvas = () => { - if (canvas) { - canvas.width = visualizerContainer.clientWidth; - canvas.height = visualizerContainer.clientHeight; + document.addEventListener( + 'audioCanPlay', + (e) => { + const video = document.querySelector('video'); + if (!video) { + return; } - }; - resizeCanvas(); + const visualizerContainer = document.querySelector('#player'); + if (!visualizerContainer) { + return; + } - const gainNode = e.detail.audioContext.createGain(); - gainNode.gain.value = 1.25; - e.detail.audioSource.connect(gainNode); + let canvas = document.querySelector('#visualizer'); + if (!canvas) { + canvas = document.createElement('canvas'); + canvas.id = 'visualizer'; + visualizerContainer?.prepend(canvas); + } - const visualizer = new visualizerType( - e.detail.audioContext, - e.detail.audioSource, - visualizerContainer, - canvas, - gainNode, - video.captureStream(), - config, - ); + const resizeCanvas = () => { + if (canvas) { + canvas.width = visualizerContainer.clientWidth; + canvas.height = visualizerContainer.clientHeight; + } + }; - const resizeVisualizer = (width: number, height: number) => { resizeCanvas(); - visualizer.resize(width, height); - }; - resizeVisualizer(canvas.width, canvas.height); - const visualizerContainerObserver = new ResizeObserver((entries) => { - for (const entry of entries) { - resizeVisualizer(entry.contentRect.width, entry.contentRect.height); - } - }); - visualizerContainerObserver.observe(visualizerContainer); + const gainNode = e.detail.audioContext.createGain(); + gainNode.gain.value = 1.25; + e.detail.audioSource.connect(gainNode); - visualizer.render(); - }, - { passive: true }, - ); + const visualizer = new visualizerType( + e.detail.audioContext, + e.detail.audioSource, + visualizerContainer, + canvas, + gainNode, + video.captureStream(), + config, + ); + + const resizeVisualizer = (width: number, height: number) => { + resizeCanvas(); + visualizer.resize(width, height); + }; + + resizeVisualizer(canvas.width, canvas.height); + const visualizerContainerObserver = new ResizeObserver((entries) => { + for (const entry of entries) { + resizeVisualizer(entry.contentRect.width, entry.contentRect.height); + } + }); + visualizerContainerObserver.observe(visualizerContainer); + + visualizer.render(); + }, + { passive: true }, + ); + }, }, }); diff --git a/src/utils/index.ts b/src/utils/index.ts index 0405ee48..f3456c6e 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -126,10 +126,11 @@ export const stopPlugin = ( if (!def || !def[options.ctx]) return false; if (typeof def[options.ctx] === 'function') return false; - const stop = def[options.ctx] as PluginLifecycleSimple; - if (!stop) return null; + const defCtx = def[options.ctx] as { stop: PluginLifecycleSimple } | undefined; + if (!defCtx?.stop) return null; try { + const stop = defCtx.stop; const start = performance.now(); stop.bind(def[options.ctx])( options.context as Config & typeof options.context,