| 965 | // ----------------------------------------------------------------------- |
| 966 | |
| 967 | async function normalizePreviewInput(input: PreviewInput): Promise<ArrayBuffer> { |
| 968 | if (input instanceof ArrayBuffer) return input |
| 969 | if (input instanceof Uint8Array) { |
| 970 | const bytes = new Uint8Array(input.byteLength) |
| 971 | bytes.set(input) |
| 972 | return bytes.buffer |
| 973 | } |
| 974 | |
| 975 | const blobLike = input as Blob & { arrayBuffer?: () => Promise<ArrayBuffer> } |
| 976 | if (typeof blobLike.arrayBuffer === 'function') { |
| 977 | return blobLike.arrayBuffer() |
| 978 | } |
| 979 | |
| 980 | if (typeof FileReader !== 'undefined') { |
| 981 | return new Promise<ArrayBuffer>((resolve, reject) => { |
| 982 | const reader = new FileReader() |
| 983 | reader.onload = () => resolve(reader.result as ArrayBuffer) |
| 984 | reader.onerror = () => reject(reader.error ?? new Error('Failed to read Blob input')) |
| 985 | reader.readAsArrayBuffer(blobLike) |
| 986 | }) |
| 987 | } |
| 988 | |
| 989 | if (typeof Response !== 'undefined') { |
| 990 | return new Response(blobLike).arrayBuffer() |
| 991 | } |
| 992 | |
| 993 | throw new Error('Blob preview input is not supported in this runtime') |
| 994 | } |