@kitware/vtk.js
Version:
Visualization Toolkit for the Web
123 lines (114 loc) • 3.98 kB
JavaScript
import { strFromU8, decompressSync } from 'fflate';
import { m as macro } from '../../../macros2.js';
import Base64 from '../../../Common/Core/Base64.js';
import Endian from '../../../Common/Core/Endian.js';
import { DataTypeByteSize } from '../../../Common/Core/DataArray/Constants.js';
import { registerType } from '../DataAccessHelper.js';
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) {
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) {
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) {
let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
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 = strFromU8(decompressSync(bText));
}
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 = strFromU8(decompressSync(new Uint8Array(array.buffer)));
} else {
array.buffer = decompressSync(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 = macro.newTypedArray(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) {
return new Promise((resolve, reject) => {
const img = getElement(url);
if (img) {
resolve(img);
} else {
reject(new Error(`No such image ${url}`));
}
});
}
// ----------------------------------------------------------------------------
const HtmlDataAccessHelper = {
fetchJSON,
fetchText,
fetchArray,
fetchImage
};
registerType('html', options => HtmlDataAccessHelper);
export { HtmlDataAccessHelper as default };