UNPKG

@acransac/vtk.js

Version:

Visualization Toolkit for the Web

141 lines (118 loc) 3.9 kB
import pako from 'pako'; import macro from 'vtk.js/Sources/macro'; import Base64 from 'vtk.js/Sources/Common/Core/Base64'; import Endian from 'vtk.js/Sources/Common/Core/Endian'; import { DataTypeByteSize } from 'vtk.js/Sources/Common/Core/DataArray/Constants'; const { vtkErrorMacro, vtkDebugMacro } = macro; let requestCount = 0; function getContent(url) { const el = document.querySelector(`.webResource[data-url="${url}"]`); return el ? el.innerHTML : null; } function getElement(url) { return document.querySelector(`.webResource[data-url="${url}"]`); } function removeLeadingSlash(str) { return str[0] === '/' ? str.substr(1) : str; } function fetchText(instance = {}, url, options = {}) { return new Promise((resolve, reject) => { const txt = getContent(url); if (txt === null) { reject(new Error(`No such text ${url}`)); } else { resolve(txt); } }); } function fetchJSON(instance = {}, url, options = {}) { return new Promise((resolve, reject) => { const txt = getContent(removeLeadingSlash(url)); if (txt === null) { reject(new Error(`No such JSON ${url}`)); } else { resolve(JSON.parse(txt)); } }); } function fetchArray(instance = {}, baseURL, array, options = {}) { return new Promise((resolve, reject) => { const url = removeLeadingSlash( [ baseURL, array.ref.basepath, options.compression ? `${array.ref.id}.gz` : array.ref.id, ].join('/') ); const txt = getContent(url); if (txt === null) { reject(new Error(`No such array ${url}`)); } else { if (array.dataType === 'string') { let bText = atob(txt); if (options.compression) { bText = pako.inflate(bText, { to: 'string' }); } array.values = JSON.parse(bText); } else { const uint8array = new Uint8Array(Base64.toArrayBuffer(txt)); array.buffer = new ArrayBuffer(uint8array.length); // copy uint8array to buffer const view = new Uint8Array(array.buffer); view.set(uint8array); if (options.compression) { if (array.dataType === 'string' || array.dataType === 'JSON') { array.buffer = pako.inflate(new Uint8Array(array.buffer), { to: 'string', }); } else { array.buffer = pako.inflate(new Uint8Array(array.buffer)).buffer; } } if (array.ref.encode === 'JSON') { array.values = JSON.parse(array.buffer); } else { if (Endian.ENDIANNESS !== array.ref.encode && Endian.ENDIANNESS) { // Need to swap bytes vtkDebugMacro(`Swap bytes of ${array.name}`); Endian.swapBytes(array.buffer, DataTypeByteSize[array.dataType]); } array.values = new window[array.dataType](array.buffer); } if (array.values.length !== array.size) { vtkErrorMacro( `Error in FetchArray: ${array.name} does not have the proper array size. Got ${array.values.length}, instead of ${array.size}` ); } } // Done with the ref and work delete array.ref; if (--requestCount === 0 && instance.invokeBusy) { instance.invokeBusy(false); } if (instance.modified) { instance.modified(); } resolve(array); } }); } // ---------------------------------------------------------------------------- function fetchImage(instance = {}, url, options = {}) { return new Promise((resolve, reject) => { const img = getElement(url); if (img) { resolve(img); } else { reject(new Error(`No such image ${url}`)); } }); } // ---------------------------------------------------------------------------- // Export fetch methods export default { fetchJSON, fetchText, fetchArray, fetchImage, };