|
| 1 | +function isArrayBuffer(maybeBuffer: unknown): maybeBuffer is ArrayBuffer { |
| 2 | + return ( |
| 3 | + maybeBuffer instanceof ArrayBuffer || |
| 4 | + (typeof maybeBuffer === 'object' && |
| 5 | + Object.prototype.toString.call(maybeBuffer) === '[object ArrayBuffer]') |
| 6 | + ); |
| 7 | +} |
| 8 | + |
1 | 9 | export async function arrayBufferToBase64(bufferOrBlob: ArrayBuffer | Blob) { |
2 | | - const blob = |
3 | | - bufferOrBlob instanceof Blob ? bufferOrBlob : new Blob([bufferOrBlob]); |
4 | | - return await new Promise<string>((resolve) => { |
5 | | - const reader = new FileReader(); |
6 | | - reader.onload = () => { |
7 | | - const dataUrl = reader.result as string; |
8 | | - const base64 = dataUrl.substring(dataUrl.indexOf(',') + 1); |
9 | | - resolve(base64); |
10 | | - }; |
11 | | - reader.readAsDataURL(blob); |
12 | | - }); |
| 10 | + if (isArrayBuffer(bufferOrBlob)) { |
| 11 | + if (globalThis.Buffer) { |
| 12 | + return Buffer.from(bufferOrBlob).toString('base64'); |
| 13 | + } |
| 14 | + |
| 15 | + return btoa(String.fromCharCode(...new Uint8Array(bufferOrBlob))); |
| 16 | + } |
| 17 | + |
| 18 | + return arrayBufferToBase64(await blobToArrayBuffer(bufferOrBlob)); |
13 | 19 | } |
14 | 20 |
|
15 | 21 | export async function arrayBufferToString(bufferOrBlob: ArrayBuffer | Blob) { |
16 | | - const blob = |
17 | | - bufferOrBlob instanceof Blob ? bufferOrBlob : new Blob([bufferOrBlob]); |
18 | | - return await new Promise<string>((resolve) => { |
19 | | - const reader = new FileReader(); |
20 | | - reader.onload = () => { |
21 | | - resolve(reader.result as string); |
22 | | - }; |
23 | | - reader.readAsText(blob); |
24 | | - }); |
| 22 | + if (isArrayBuffer(bufferOrBlob)) { |
| 23 | + if (globalThis.TextDecoder) { |
| 24 | + return new TextDecoder().decode(bufferOrBlob); |
| 25 | + } |
| 26 | + |
| 27 | + if (globalThis.Buffer) { |
| 28 | + return Buffer.from(bufferOrBlob).toString(); |
| 29 | + } |
| 30 | + |
| 31 | + return String.fromCharCode(...new Uint8Array(bufferOrBlob)); |
| 32 | + } |
| 33 | + |
| 34 | + if (bufferOrBlob instanceof Blob) { |
| 35 | + if (typeof bufferOrBlob.text === 'function') { |
| 36 | + return bufferOrBlob.text(); |
| 37 | + } |
| 38 | + |
| 39 | + if (globalThis.FileReader) { |
| 40 | + return await new Promise<string>((resolve) => { |
| 41 | + const reader = new FileReader(); |
| 42 | + reader.onload = () => { |
| 43 | + resolve(reader.result as string); |
| 44 | + }; |
| 45 | + reader.readAsText(bufferOrBlob); |
| 46 | + }); |
| 47 | + } |
| 48 | + } |
| 49 | + |
| 50 | + return arrayBufferToString(await blobToArrayBuffer(bufferOrBlob)); |
25 | 51 | } |
26 | 52 |
|
27 | 53 | export async function blobToArrayBuffer(blob: Blob): Promise<ArrayBuffer> { |
28 | | - return new Promise((resolve) => { |
29 | | - const fileReader = new FileReader(); |
30 | | - fileReader.onload = () => { |
31 | | - resolve(fileReader.result as ArrayBuffer); |
32 | | - }; |
33 | | - fileReader.readAsArrayBuffer(blob); |
34 | | - }); |
| 54 | + if (typeof blob.arrayBuffer === 'function') { |
| 55 | + return await blob.arrayBuffer(); |
| 56 | + } |
| 57 | + |
| 58 | + for (const symbolKey of Object.getOwnPropertySymbols(blob)) { |
| 59 | + // detecting if blob is a jsdom polyfill |
| 60 | + if (symbolKey.description === 'impl') { |
| 61 | + const blobImpl = (blob as any)[symbolKey]; |
| 62 | + const buffer = blobImpl._buffer as Buffer; |
| 63 | + return buffer.buffer.slice( |
| 64 | + buffer.byteOffset, |
| 65 | + buffer.byteOffset + buffer.byteLength, |
| 66 | + ); |
| 67 | + } |
| 68 | + } |
| 69 | + |
| 70 | + if (globalThis.FileReader) { |
| 71 | + return new Promise((resolve) => { |
| 72 | + const fileReader = new FileReader(); |
| 73 | + fileReader.onload = () => { |
| 74 | + resolve(fileReader.result as ArrayBuffer); |
| 75 | + }; |
| 76 | + fileReader.readAsArrayBuffer(blob); |
| 77 | + }); |
| 78 | + } |
| 79 | + |
| 80 | + throw new Error('Unable to convert blob to array buffer'); |
35 | 81 | } |
36 | 82 |
|
37 | 83 | // Credits: https://github.com/nfriedly/set-cookie-parser/blob/master/lib/set-cookie.js |
|
0 commit comments