import { TagLib } from 'taglib-wasm'; import { fetchBlobURL } from './utils'; import _TagLibWasm from '!/taglib-wasm/dist/taglib-web.wasm?blob-url'; import type { AddMetadataMessage, TagLibFileResponse, TagLibMetadataResponse, TagLibReadMetadata, } from './taglib.types'; import TagLibWorker from './taglib.worker?worker'; let tagLib: Promise | null = null; async function fetchTagLib(): Promise { return fetchTagLib.blobUrl || (fetchTagLib.blobUrl = await _TagLibWasm()); } namespace fetchTagLib { export let blobUrl = ''; } export { fetchTagLib }; export async function addMetadataWithTagLib( audioData: Uint8Array, data: Omit ) { if (!(audioData instanceof Uint8Array)) { audioData = new Uint8Array(audioData); } const worker = new TagLibWorker(); const wasmUrl = await fetchTagLib(); return new Promise((resolve, reject) => { worker.onmessage = (e: MessageEvent) => { const { data, error } = e.data; if (error) { reject(new Error(error)); } else { resolve(data!); } }; worker.onerror = reject; worker.onmessageerror = reject; const transferables: Transferable[] = [audioData.buffer]; if ((data as any).cover?.data?.buffer instanceof ArrayBuffer) { transferables.push((data as any).cover.data.buffer); } worker.postMessage({ ...data, type: 'Add', wasmUrl, audioData }, transferables); }); } export async function getMetadataWithTagLib(audioData: Uint8Array) { if (!(audioData instanceof Uint8Array)) { audioData = new Uint8Array(audioData); } const worker = new TagLibWorker(); const wasmUrl = await fetchTagLib(); return new Promise((resolve, reject) => { worker.onmessage = (e: MessageEvent) => { const { data, error } = e.data; if (error) { reject(new Error(error)); } else { resolve(data!); } }; worker.onerror = reject; worker.onmessageerror = reject; worker.postMessage({ type: 'Get', wasmUrl, audioData }, [audioData.buffer]); }); }