diff --git a/src/load/__tests__/fetchURL.test.ts b/src/load/__tests__/fetchURL.test.ts new file mode 100644 index 000000000..9b6152294 --- /dev/null +++ b/src/load/__tests__/fetchURL.test.ts @@ -0,0 +1,24 @@ +import { encodeDataURL } from '../../save/encodeDataURL.js'; +import { fetchURL } from '../fetchURL.js'; + +describe('testing fetchURL', () => { + test('decodes image from data URL', async () => { + const image = await fetchURL( + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAAAAACoBHk5AAAAFklEQVR4XmNggID///+DSCCEskHM/wCAnQr2TY5mOAAAAABJRU5ErkJggg==', + ); + expect(image.bitDepth).toBe(8); + expect(image.getRawImage().data).toEqual( + new Uint8Array([ + 0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, + 0, 255, 0, 255, 0, 255, + ]), + ); + }); + test('encoded URL must be equal to decoded one', async () => { + const dataURL = + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAAAAACoBHk5AAAAFklEQVR4XmNggID///+DSCCEskHM/wCAnQr2TY5mOAAAAABJRU5ErkJggg=='; + const image = await fetchURL(dataURL); + const result = encodeDataURL(image); + expect(result).toEqual(dataURL); + }); +}); diff --git a/src/load/fetchURL.ts b/src/load/fetchURL.ts new file mode 100644 index 000000000..5ecee53e6 --- /dev/null +++ b/src/load/fetchURL.ts @@ -0,0 +1,13 @@ +import { decode } from './decode.js'; + +/** + * Fetches image URL and decodes it. + * @param dataUrl - Image URL. + * @returns decoded image data. + */ +export async function fetchURL(dataUrl: string) { + const response = await fetch(dataUrl); + const arrayBuffer = await response.arrayBuffer(); + const image = decode(new DataView(arrayBuffer)); + return image; +} diff --git a/src/load/index.ts b/src/load/index.ts index f00ca9c0f..b20be777c 100644 --- a/src/load/index.ts +++ b/src/load/index.ts @@ -6,3 +6,4 @@ export * from './load.types.js'; export * from './read.js'; export * from './readCanvas.js'; export * from './readImg.js'; +export * from './fetchURL.js';