@alleninstitute/vis-omezarr 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +11 -0
- package/dist/main.js +1365 -0
- package/dist/main.js.map +1 -0
- package/dist/module.js +969 -0
- package/dist/module.js.map +1 -0
- package/dist/types.d.ts +418 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +58 -0
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["packages/omezarr/src/index.ts","packages/omezarr/src/sliceview/slice-renderer.ts","packages/omezarr/src/sliceview/loader.ts","packages/omezarr/src/zarr/loading.ts","packages/omezarr/src/errors.ts","packages/omezarr/src/zarr/types.ts","packages/omezarr/src/sliceview/tile-renderer.ts","packages/omezarr/src/sliceview/worker-loader.ts","packages/omezarr/src/zarr/cache-lower.ts","packages/omezarr/src/zarr/cached-loading/store.ts","packages/omezarr/src/zarr/cached-loading/fetch-data.interface.ts","packages/omezarr/src/zarr/cached-loading/fetch-data.worker-loader.ts"],"sourcesContent":["export {\n buildOmeZarrSliceRenderer,\n buildAsyncOmezarrRenderer,\n type VoxelTileImage,\n type RenderSettings,\n type RenderSettingsChannel,\n type RenderSettingsChannels,\n} from './sliceview/slice-renderer';\nexport { VisZarrError, VisZarrDataError, VisZarrIndexError } from './errors';\nexport {\n type VoxelTile,\n defaultDecoder,\n getVisibleTiles,\n} from './sliceview/loader';\nexport { buildTileRenderCommand, buildRGBTileRenderCommand } from './sliceview/tile-renderer';\nexport {\n type ZarrDimension,\n type OmeZarrAxis,\n type OmeZarrCoordinateTranslation,\n type OmeZarrCoordinateScale,\n type OmeZarrCoordinateTransform,\n type OmeZarrDataset,\n type OmeZarrShapedDataset,\n type OmeZarrMultiscale,\n type OmeZarrOmeroChannelWindow,\n type OmeZarrOmeroChannel,\n type OmeZarrOmero,\n type OmeZarrAttrs,\n type OmeZarrArrayMetadata,\n OmeZarrAxisSchema,\n OmeZarrCoordinateTranslationSchema,\n OmeZarrCoordinateScaleSchema,\n OmeZarrCoordinateTransformSchema,\n OmeZarrDatasetSchema,\n OmeZarrMultiscaleSchema,\n OmeZarrOmeroChannelWindowSchema,\n OmeZarrOmeroChannelSchema,\n OmeZarrOmeroSchema,\n OmeZarrAttrsSchema,\n OmeZarrMetadata,\n type DehydratedOmeZarrArray,\n type DehydratedOmeZarrMetadata,\n} from './zarr/types';\nexport {\n loadMetadata,\n loadZarrArrayFile,\n loadZarrAttrsFile,\n pickBestScale,\n loadSlice,\n sizeInUnits,\n sizeInVoxels,\n nextSliceStep,\n planeSizeInVoxels,\n type ZarrRequest,\n} from './zarr/loading';\n\nexport { type CancelRequest, type ZarrSliceRequest, makeOmeZarrSliceLoaderWorker } from './sliceview/worker-loader';\nexport { decoderFactory } from './zarr/cache-lower';\nexport { setupFetchDataWorker } from './zarr/cached-loading/fetch-data.worker-loader';\nexport {\n type TransferrableRequestInit,\n type FetchMessagePayload,\n type FetchMessage,\n type FetchResponseMessage,\n type CancelMessage,\n isFetchMessage,\n isFetchResponseMessage,\n isCancelMessage,\n isCancellationError,\n} from './zarr/cached-loading/fetch-data.interface';\n","import {\n Box2D,\n type CartesianPlane,\n type Interval,\n type box2D,\n type vec2,\n type vec3,\n intervalToVec2,\n} from '@alleninstitute/vis-geometry';\nimport {\n type CachedTexture,\n type QueueOptions,\n type ReglCacheEntry,\n type Renderer,\n buildAsyncRenderer,\n logger,\n} from '@alleninstitute/vis-core';\nimport type REGL from 'regl';\nimport type { ZarrRequest } from '../zarr/loading';\nimport { type VoxelTile, getVisibleTiles } from './loader';\nimport { buildTileRenderCommand } from './tile-renderer';\nimport type { OmeZarrMetadata, OmeZarrShapedDataset } from '../zarr/types';\n\nexport type RenderSettingsChannel = {\n index: number;\n gamut: Interval;\n rgb: vec3;\n};\n\nexport type RenderSettingsChannels = {\n [key: string]: RenderSettingsChannel;\n};\nexport type RenderSettings = {\n camera: {\n view: box2D;\n screenSize: vec2;\n };\n planeLocation: number;\n tileSize: number;\n plane: CartesianPlane;\n channels: RenderSettingsChannels;\n};\n\n// represent a 2D slice of a volume\n\n// a slice of a volume (as voxels suitable for display)\nexport type VoxelTileImage = {\n data: Float32Array;\n shape: number[];\n};\n\ntype ImageChannels = {\n [channelKey: string]: CachedTexture;\n};\n\nfunction toZarrRequest(tile: VoxelTile, channel: number): ZarrRequest {\n const { plane, orthoVal, bounds } = tile;\n const { minCorner: min, maxCorner: max } = bounds;\n const u = { min: min[0], max: max[0] };\n const v = { min: min[1], max: max[1] };\n switch (plane) {\n case 'xy':\n return {\n x: u,\n y: v,\n t: 0,\n c: channel,\n z: orthoVal,\n };\n case 'xz':\n return {\n x: u,\n z: v,\n t: 0,\n c: channel,\n y: orthoVal,\n };\n case 'yz':\n return {\n y: u,\n z: v,\n t: 0,\n c: channel,\n x: orthoVal,\n };\n }\n}\n\nfunction isPrepared(cacheData: Record<string, ReglCacheEntry | undefined>): cacheData is ImageChannels {\n if (!cacheData) {\n return false;\n }\n const keys = Object.keys(cacheData);\n if (keys.length < 1) {\n return false;\n }\n return keys.every((key) => cacheData[key]?.type === 'texture');\n}\n\ntype Decoder = (\n dataset: OmeZarrMetadata,\n req: ZarrRequest,\n level: OmeZarrShapedDataset,\n signal?: AbortSignal,\n) => Promise<VoxelTileImage>;\n\nexport type OmeZarrSliceRendererOptions = {\n numChannels?: number;\n queueOptions?: QueueOptions;\n};\n\nconst DEFAULT_NUM_CHANNELS = 3;\n\nexport function buildOmeZarrSliceRenderer(\n regl: REGL.Regl,\n decoder: Decoder,\n options?: OmeZarrSliceRendererOptions | undefined,\n): Renderer<OmeZarrMetadata, VoxelTile, RenderSettings, ImageChannels> {\n const numChannels = options?.numChannels ?? DEFAULT_NUM_CHANNELS;\n function sliceAsTexture(slice: VoxelTileImage): CachedTexture {\n const { data, shape } = slice;\n return {\n bytes: data.byteLength,\n texture: regl.texture({\n data: data,\n width: shape[1],\n height: shape[0],\n format: 'luminance',\n }),\n type: 'texture',\n };\n }\n const cmd = buildTileRenderCommand(regl, numChannels);\n return {\n cacheKey: (item, requestKey, dataset, settings) => {\n const channelKeys = Object.keys(settings.channels);\n if (!channelKeys.includes(requestKey)) {\n const message = `cannot retrieve cache key: unrecognized requestKey [${requestKey}]`;\n logger.error(message);\n throw new Error(message);\n }\n return `${dataset.url}_${JSON.stringify(item)}_ch=${requestKey}`;\n },\n destroy: () => {},\n getVisibleItems: (dataset, settings) => {\n const { camera, plane, planeLocation, tileSize } = settings;\n return getVisibleTiles(camera, plane, planeLocation, dataset, tileSize);\n },\n fetchItemContent: (item, dataset, settings): Record<string, (sig: AbortSignal) => Promise<CachedTexture>> => {\n const contents: Record<string, (signal: AbortSignal) => Promise<CachedTexture>> = {};\n for (const key in settings.channels) {\n contents[key] = (signal) =>\n decoder(dataset, toZarrRequest(item, settings.channels[key].index), item.level, signal).then(\n sliceAsTexture,\n );\n }\n return contents;\n },\n isPrepared,\n renderItem: (target, item, dataset, settings, gpuData) => {\n const channels = Object.keys(gpuData).map((key) => ({\n tex: gpuData[key].texture,\n gamut: intervalToVec2(settings.channels[key].gamut),\n rgb: settings.channels[key].rgb,\n }));\n const layers = dataset.getNumLayers();\n // per the spec, the highest resolution layer should be first\n // we want that layer most in front, so:\n const depth = item.level.datasetIndex / layers;\n const { camera } = settings;\n cmd({\n channels,\n target,\n depth,\n tile: Box2D.toFlatArray(item.realBounds),\n view: Box2D.toFlatArray(camera.view),\n });\n },\n };\n}\n\nexport function buildAsyncOmezarrRenderer(regl: REGL.Regl, decoder: Decoder, options?: OmeZarrSliceRendererOptions) {\n return buildAsyncRenderer(buildOmeZarrSliceRenderer(regl, decoder, options), options?.queueOptions);\n}\n","import {\n Box2D,\n type CartesianPlane,\n Vec2,\n type box2D,\n type OrthogonalCartesianAxes,\n type vec2,\n} from '@alleninstitute/vis-geometry';\nimport type { Chunk } from 'zarrita';\nimport type { ZarrRequest } from '../zarr/loading';\nimport { indexOfRelativeSlice, loadSlice, pickBestScale, planeSizeInVoxels, sizeInUnits } from '../zarr/loading';\nimport type { VoxelTileImage } from './slice-renderer';\nimport type { OmeZarrMetadata, OmeZarrShapedDataset } from '../zarr/types';\n\nexport type VoxelTile = {\n plane: OrthogonalCartesianAxes; // the plane in which the tile sits\n realBounds: box2D; // in the space given by the axis descriptions of the omezarr dataset\n bounds: box2D; // in voxels, in the plane\n orthoVal: number; // the value along the orthogonal axis to the plane (e.g. the slice index along Z relative to an XY plane)\n level: OmeZarrShapedDataset; // the index in the resolution pyramid of the omezarr dataset\n};\n\n/**\n * given a image with @param size pixels, break it into tiles, each @param idealTilePx.\n * for all such tiles which intersect the given bounds, call the visitor\n * @param idealTilePx the size of a tile, in pixels\n * @param size the size of the image at this level of detail\n * @param bounds visit only the tiles that are within the given bounds (in pixels)\n */\nfunction visitTilesWithin(idealTilePx: vec2, size: vec2, bounds: box2D, visit: (tile: box2D) => void) {\n const withinBoth = Box2D.intersection(bounds, Box2D.create([0, 0], size));\n if (!withinBoth) {\n return;\n }\n // convert the image into tile indexes:\n const boundsInTiles = Box2D.map(withinBoth, (corner) => Vec2.div(corner, idealTilePx));\n for (let x = Math.floor(boundsInTiles.minCorner[0]); x < Math.ceil(boundsInTiles.maxCorner[0]); x += 1) {\n for (let y = Math.floor(boundsInTiles.minCorner[1]); y < Math.ceil(boundsInTiles.maxCorner[1]); y += 1) {\n // all tiles visited are always within both the bounds, and the image itself\n const lo = Vec2.mul([x, y], idealTilePx);\n const hi = Vec2.min(size, Vec2.add(lo, idealTilePx));\n visit(Box2D.create(lo, hi));\n }\n }\n}\n\nfunction getVisibleTilesInLayer(\n camera: {\n view: box2D;\n screenSize: vec2;\n },\n plane: CartesianPlane,\n orthoVal: number,\n dataset: OmeZarrMetadata,\n tileSize: number,\n level: OmeZarrShapedDataset,\n) {\n const size = planeSizeInVoxels(plane, dataset.attrs.multiscales[0].axes, level);\n const realSize = sizeInUnits(plane, dataset.attrs.multiscales[0].axes, level);\n if (!size || !realSize) return [];\n const scale = Vec2.div(realSize, size);\n const vxlToReal = (vxl: box2D) => Box2D.scale(vxl, scale);\n const realToVxl = (real: box2D) => Box2D.scale(real, Vec2.div([1, 1], scale));\n const visibleTiles: VoxelTile[] = [];\n visitTilesWithin([tileSize, tileSize], size, realToVxl(camera.view), (uv) => {\n visibleTiles.push({\n plane: plane.axes,\n realBounds: vxlToReal(uv),\n bounds: uv,\n orthoVal,\n level,\n });\n });\n return visibleTiles;\n}\n\n/**\n * Gets the list of tiles of the given OME-Zarr image which are visible (i.e. they intersect with @param camera.view).\n * @param camera an object describing the current view: the region of the omezarr, and the resolution at which it\n * will be displayed.\n * @param plane the plane (eg. CartesianPlane('xy')) from which to draw tiles\n * @param orthoVal the value of the dimension orthogonal to the reference plane, e.g. the Z value relative to an XY plane. This gives\n * which XY slice of voxels to display within the overall XYZ space of the 3D image.\n * Note that not all OME-Zarr LOD layers can be expected to have the same number of slices! An index which exists at a high LOD may not\n * exist at a low LOD.\n * @param metadata the OME-Zarr image to pull tiles from\n * @param tileSize the size of the tiles, in pixels. It is recommended to use a size that agrees with the chunking used in the dataset; however,\n * other utilities in this library will stitch together chunks to satisfy the requested tile size.\n * @returns an array of objects representing tiles (bounding information, etc.) which are visible within the given dataset\n */\nexport function getVisibleTiles(\n camera: {\n view: box2D;\n screenSize: vec2;\n },\n plane: CartesianPlane,\n planeLocation: number,\n metadata: OmeZarrMetadata,\n tileSize: number,\n): VoxelTile[] {\n // TODO (someday) open the array, look at its chunks, use that size for the size of the tiles I request!\n\n const layer = pickBestScale(metadata, plane, camera.view, camera.screenSize);\n // figure out the index of the slice\n\n const sliceIndex = indexOfRelativeSlice(layer, metadata.attrs.multiscales[0].axes, planeLocation, plane.ortho);\n return getVisibleTilesInLayer(camera, plane, sliceIndex, metadata, tileSize, layer);\n}\n\n/**\n * a function which returns a promise of float32 data from the requested region of an omezarr dataset.\n * Note that omezarr decoding can be slow - consider wrapping this function in a web-worker (or a pool of them)\n * to improve performance (note also that the webworker message passing will need to itself be wrapped in promises)\n * @param metadata an omezarr object\n * @param r a slice request @see getSlice\n * @param layerIndex an index into the LOD pyramid of the given ZarrDataset.\n * @returns the requested voxel information from the given layer of the given dataset.\n */\nexport const defaultDecoder = (\n metadata: OmeZarrMetadata,\n r: ZarrRequest,\n level: OmeZarrShapedDataset,\n signal?: AbortSignal,\n): Promise<VoxelTileImage> => {\n return loadSlice(metadata, r, level, signal).then((result: { shape: number[]; buffer: Chunk<'float32'> }) => {\n const { shape, buffer } = result;\n return { shape, data: new Float32Array(buffer.data) };\n });\n};\n","import {\n Box2D,\n type CartesianPlane,\n type Interval,\n Vec2,\n type box2D,\n limit,\n type vec2,\n} from '@alleninstitute/vis-geometry';\nimport { getResourceUrl, logger, type WebResource } from '@alleninstitute/vis-core';\nimport { VisZarrDataError } from '../errors';\nimport {\n OmeZarrAttrsSchema,\n OmeZarrMetadata,\n type OmeZarrAttrs,\n type OmeZarrAxis,\n type ZarrDimension,\n type OmeZarrShapedDataset,\n type OmeZarrArrayMetadata,\n} from './types';\nimport * as zarr from 'zarrita';\nimport { ZodError } from 'zod';\n\n// Documentation for OME-Zarr datasets (from which these types are built)\n// can be found here:\n// - top-level metadata: https://ngff.openmicroscopy.org/latest/#multiscale-md\n// - array metadata: v2: https://zarr-specs.readthedocs.io/en/latest/v2/v2.0.html#arrays\n// v3: https://zarr-specs.readthedocs.io/en/latest/v3/core/v3.0.html#array-metadata\n\nexport async function loadZarrAttrsFile(res: WebResource): Promise<OmeZarrAttrs> {\n const url = getResourceUrl(res);\n const store = new zarr.FetchStore(url);\n return loadZarrAttrsFileFromStore(store);\n}\n\nasync function loadZarrAttrsFileFromStore(store: zarr.FetchStore): Promise<OmeZarrAttrs> {\n const group = await zarr.open(store, { kind: 'group' });\n try {\n return OmeZarrAttrsSchema.parse(group.attrs);\n } catch (e) {\n if (e instanceof ZodError) {\n logger.error('could not load Zarr file: parsing failed');\n }\n throw e;\n }\n}\n\ntype OmeZarrArrayMetadataLoad = {\n metadata: OmeZarrArrayMetadata;\n raw: zarr.Array<zarr.DataType, zarr.FetchStore>;\n};\n\nexport async function loadZarrArrayFile(\n res: WebResource,\n path: string,\n version = 2,\n loadV2Attrs = true,\n): Promise<OmeZarrArrayMetadata> {\n const url = getResourceUrl(res);\n const store = new zarr.FetchStore(url);\n const result = await loadZarrArrayFileFromStore(store, path, version, loadV2Attrs);\n return result.metadata;\n}\n\nexport async function loadZarrArrayFileFromStore(\n store: zarr.FetchStore,\n path: string,\n version = 2,\n loadV2Attrs = true,\n): Promise<OmeZarrArrayMetadataLoad> {\n const root = zarr.root(store);\n let array: zarr.Array<zarr.DataType, zarr.FetchStore>;\n if (version === 3) {\n array = await zarr.open.v3(root.resolve(path), { kind: 'array' });\n } else if (version === 2) {\n array = await zarr.open.v2(root.resolve(path), { kind: 'array', attrs: loadV2Attrs });\n } else {\n const message = `unsupported Zarr format version specified: ${version}`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const { shape, attrs } = array;\n try {\n return { metadata: { path, shape, attrs }, raw: array };\n } catch (e) {\n if (e instanceof ZodError) {\n logger.error('could not load Zarr file: parsing failed');\n }\n throw e;\n }\n}\n\n/**\n *\n * @param url a url which resolves to an omezarr dataset\n * @returns a structure describing the omezarr dataset. See\n * https://ngff.openmicroscopy.org/latest/#multiscale-md for the specification.\n * The object returned from this function can be passed to most of the other utilities for ome-zarr data\n * manipulation.\n */\nexport async function loadMetadata(res: WebResource, loadV2ArrayAttrs = true): Promise<OmeZarrMetadata> {\n const url = getResourceUrl(res);\n const store = new zarr.FetchStore(url);\n const attrs: OmeZarrAttrs = await loadZarrAttrsFileFromStore(store);\n const version = attrs.zarrVersion;\n const arrays = await Promise.all(\n attrs.multiscales\n .map((multiscale) => {\n return (\n multiscale.datasets?.map(async (dataset) => {\n return (await loadZarrArrayFileFromStore(store, dataset.path, version, loadV2ArrayAttrs))\n .metadata;\n }) ?? []\n );\n })\n .reduce((prev, curr) => prev.concat(curr))\n .filter((v) => v !== undefined),\n );\n return new OmeZarrMetadata(url, attrs, arrays, version);\n}\n\nexport type ZarrRequest = Record<ZarrDimension, number | Interval | null>;\n\n/**\n * given a region of a volume to view at a certain output resolution, find the layer in the ome-zarr dataset which\n * is most appropriate - that is to say, as close to 1:1 relation between voxels and display pixels as possible.\n * @param zarr an object representing an omezarr file - see @function loadMetadata\n * @param plane a plane in the volume - the dimensions of this plane will be matched to the displayResolution\n * when choosing an appropriate LOD layer\n * @param relativeView a region of the selected plane which is the \"screen\" - the screen has resolution @param displayResolution.\n * an example relative view of [0,0],[1,1] would suggest we're trying to view the entire slice at the given resolution.\n * @param displayResolution\n * @returns an LOD (level-of-detail) layer from the given dataset, that is appropriate for viewing at the given\n * displayResolution.\n */\nexport function pickBestScale(\n zarr: OmeZarrMetadata,\n plane: CartesianPlane,\n relativeView: box2D, // a box in data-unit-space\n displayResolution: vec2, // in the plane given above\n): OmeZarrShapedDataset {\n const datasets = zarr.getAllShapedDatasets(0);\n const axes = zarr.attrs.multiscales[0].axes;\n const firstDataset = datasets[0];\n if (!firstDataset) {\n const message = 'invalid Zarr data: no datasets found';\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const realSize = sizeInUnits(plane, axes, firstDataset);\n if (!realSize) {\n const message = 'invalid Zarr data: could not determine the size of the plane in the given units';\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n\n const vxlPitch = (size: vec2) => Vec2.div(realSize, size);\n // size, in dataspace, of a pixel 1/res\n const pxPitch = Vec2.div(Box2D.size(relativeView), displayResolution);\n const dstToDesired = (a: vec2, goal: vec2) => {\n const diff = Vec2.sub(a, goal);\n if (diff[0] * diff[1] > 0) {\n // the res (a) is higher than our goal -\n // weight this heavily to prefer smaller than the goal\n return 1000 * Vec2.length(Vec2.sub(a, goal));\n }\n return Vec2.length(Vec2.sub(a, goal));\n };\n // we assume the datasets are ordered... hmmm TODO\n const choice = datasets.reduce((bestSoFar, cur) => {\n const planeSizeBest = planeSizeInVoxels(plane, axes, bestSoFar);\n const planeSizeCur = planeSizeInVoxels(plane, axes, cur);\n if (!planeSizeBest || !planeSizeCur) {\n return bestSoFar;\n }\n return dstToDesired(vxlPitch(planeSizeBest), pxPitch) > dstToDesired(vxlPitch(planeSizeCur), pxPitch)\n ? cur\n : bestSoFar;\n }, datasets[0]);\n return choice ?? datasets[datasets.length - 1];\n}\n// TODO this is a duplicate of indexOfDimension... delete one of them!\nfunction indexFor(dim: ZarrDimension, axes: readonly OmeZarrAxis[]) {\n return axes.findIndex((axis) => axis.name === dim);\n}\n/**\n *\n * @param layer a shaped layer from within the omezarr dataset\n * @param axes the axes describing this omezarr dataset\n * @param parameter a value from [0:1] indicating a parameter of the volume, along the given dimension @param dim,\n * @param dim the dimension (axis) along which @param parameter refers\n * @returns a valid index (between [0,layer.shape[axis] ]) from the volume, suitable for\n */\nexport function indexOfRelativeSlice(\n layer: OmeZarrShapedDataset,\n axes: readonly OmeZarrAxis[],\n parameter: number,\n dim: ZarrDimension,\n): number {\n const dimIndex = indexFor(dim, axes);\n return Math.floor(layer.shape[dimIndex] * Math.max(0, Math.min(1, parameter)));\n}\n/**\n * @param zarr\n * @param plane\n * @param relativeView\n * @param displayResolution\n * @returns\n */\nexport function nextSliceStep(\n zarr: OmeZarrMetadata,\n plane: CartesianPlane,\n relativeView: box2D, // a box in data-unit-space\n displayResolution: vec2, // in the plane given above\n) {\n // figure out what layer we'd be viewing\n const layer = pickBestScale(zarr, plane, relativeView, displayResolution);\n const axes = zarr.attrs.multiscales[0].axes;\n const slices = sizeInVoxels(plane.ortho, axes, layer);\n return slices === undefined ? undefined : 1 / slices;\n}\n\n/**\n * determine the size of a slice of the volume, in the units specified by the axes metadata\n * as described in the ome-zarr spec (https://ngff.openmicroscopy.org/latest/#axes-md)\n * NOTE that only scale transformations (https://ngff.openmicroscopy.org/latest/#trafo-md) are supported at present - other types will be ignored.\n * @param plane the plane to measure (eg. CartesianPlane('xy'))\n * @param axes the axes metadata from the omezarr file in question\n * @param dataset one of the \"datasets\" in the omezarr layer pyramid (https://ngff.openmicroscopy.org/latest/#multiscale-md)\n * @returns the size, with respect to the coordinateTransformations present on the given dataset, of the requested plane.\n * @example imagine a layer that is 29998 voxels wide in the X dimension, and a scale transformation of 0.00035 for that dimension.\n * this function would return (29998*0.00035 = 10.4993) for the size of that dimension, which you would interpret to be in whatever unit\n * is given by the axes metadata for that dimension (eg. millimeters)\n */\nexport function sizeInUnits(\n plane: CartesianPlane,\n axes: readonly OmeZarrAxis[],\n dataset: OmeZarrShapedDataset,\n): vec2 | undefined {\n const vxls = planeSizeInVoxels(plane, axes, dataset);\n\n if (vxls === undefined) return undefined;\n\n let size: vec2 = vxls;\n\n // now, just apply the correct transforms, if they exist...\n for (const trn of dataset.coordinateTransformations) {\n if (trn.type === 'scale') {\n // try to apply it!\n const uIndex = indexFor(plane.u, axes);\n const vIndex = indexFor(plane.v, axes);\n size = Vec2.mul(size, [trn.scale[uIndex], trn.scale[vIndex]]);\n }\n }\n return size;\n}\n/**\n * get the size in voxels of a layer of an omezarr on a given dimension\n * @param dim the dimension to measure\n * @param axes the axes metadata for the zarr dataset\n * @param dataset an entry in the datasets list in the multiscales list in a ZarrDataset object\n * @returns the size, in voxels, of the given dimension of the given layer\n * @example (pseudocode of course) return omezarr.multiscales[0].datasets[LAYER].shape[DIMENSION]\n */\nexport function sizeInVoxels(dim: ZarrDimension, axes: readonly OmeZarrAxis[], dataset: OmeZarrShapedDataset) {\n const uI = indexFor(dim, axes);\n if (uI === -1) return undefined;\n\n return dataset.shape[uI];\n}\n\n// TODO move into ZarrMetadata object\n/**\n * get the size of a plane of a volume (given a specific layer) in voxels\n * see @function sizeInVoxels\n * @param plane the plane to measure (eg. 'xy')\n * @param axes the axes metadata of an omezarr object\n * @param dataset a layer of the ome-zarr resolution pyramid\n * @returns a vec2 containing the requested sizes, or undefined if the requested plane is malformed, or not present in the dataset\n */\nexport function planeSizeInVoxels(\n plane: CartesianPlane,\n axes: readonly OmeZarrAxis[],\n dataset: OmeZarrShapedDataset,\n): vec2 | undefined {\n // first - u&v must not refer to the same dimension,\n // and both should exist in the axes...\n if (!plane.isValid()) {\n return undefined;\n }\n const uI = indexFor(plane.u, axes);\n const vI = indexFor(plane.v, axes);\n if (uI === -1 || vI === -1) {\n return undefined;\n }\n\n return [dataset.shape[uI], dataset.shape[vI]] as const;\n}\n\n// feel free to freak out if the request is over or under determined or whatever\nexport function buildQuery(r: Readonly<ZarrRequest>, axes: readonly OmeZarrAxis[], shape: readonly number[]) {\n const ordered = axes.map((a) => r[a.name as ZarrDimension]);\n // if any are undefined, throw up\n if (ordered.some((a) => a === undefined)) {\n throw new VisZarrDataError('request does not match expected dimensions of OME-Zarr dataset');\n }\n\n return ordered.map((d, i) => {\n const bounds = { min: 0, max: shape[i] };\n if (d === null) {\n return d;\n }\n if (typeof d === 'number') {\n return limit(bounds, d);\n }\n return zarr.slice(limit(bounds, d.min), limit(bounds, d.max));\n });\n}\n\nexport async function explain(z: OmeZarrMetadata) {\n logger.dir(z);\n}\n\n/**\n * get voxels / pixels from a region of a layer of an omezarr dataset\n * @param metadata a ZarrMetadata from which to request a slice of voxels\n * @param r a slice object, describing the requested region of data - note that it is quite possible to request\n * data that is not \"just\" a slice. The semantics of this slice object should match up with conventions in numpy or other multidimensional array tools:\n * @see https://zarrita.dev/slicing.html\n * @param level the layer within the LOD pyramid of the OME-Zarr dataset.\n * @returns the requested chunk of image data from the given layer of the omezarr LOD pyramid. Note that if the given layerIndex is invalid, it will be treated as though it is the highest index possible.\n * @throws an error if the request results in anything of lower-or-equal dimensionality than a single value\n */\nexport async function loadSlice(\n metadata: OmeZarrMetadata,\n r: ZarrRequest,\n level: OmeZarrShapedDataset,\n signal?: AbortSignal,\n) {\n // put the request in native order\n const store = new zarr.FetchStore(metadata.url);\n const scene = metadata.attrs.multiscales[0];\n const { axes } = scene;\n if (!level) {\n const message = 'invalid Zarr data: no datasets found';\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const arr = metadata.arrays.find((a) => a.path === level.path);\n if (!arr) {\n const message = `cannot load slice: no array found for path [${level.path}]`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const { raw } = await loadZarrArrayFileFromStore(store, arr.path, metadata.zarrVersion, false);\n const result = await zarr.get(raw, buildQuery(r, axes, level.shape), { opts: { signal: signal ?? null } });\n if (typeof result === 'number') {\n throw new Error('oh noes, slice came back all weird');\n }\n return {\n shape: result.shape,\n buffer: result,\n };\n}\n","import { VisError } from '@alleninstitute/vis-core';\n\nexport class VisZarrError extends VisError {}\n\nexport class VisZarrDataError extends VisZarrError {}\n\nexport class VisZarrIndexError extends VisZarrError {}\n","import type { CartesianPlane, Interval, vec3, vec4 } from '@alleninstitute/vis-geometry';\nimport { VisZarrDataError, VisZarrIndexError } from '../errors';\nimport { logger, makeRGBAColorVector } from '@alleninstitute/vis-core';\nimport { z } from 'zod';\n\nexport type ZarrDimension = 't' | 'c' | 'z' | 'y' | 'x';\n\n// these dimension indices are given for a 4-element shape array\nconst SHAPE_Z_DIM_INDEX = 1;\nconst SHAPE_Y_DIM_INDEX = 2;\nconst SHAPE_X_DIM_INDEX = 3;\n\nexport type OmeZarrAxis = {\n name: string;\n type: string;\n scale?: number | undefined;\n unit?: string | undefined;\n};\n\nexport const OmeZarrAxisSchema: z.ZodType<OmeZarrAxis> = z.object({\n name: z.string().toLowerCase(),\n type: z.string(),\n scale: z.number().optional(),\n unit: z.string().optional(),\n});\n\nexport type OmeZarrCoordinateTranslation = {\n translation: number[];\n type: 'translation';\n};\n\n// due to a difference in types between ZodObject and ZodType,\n// currently this schema cannot be associated directly with\n// ZarrCoordinateScale using z.ZodType<T>\n// TODO try to fix this in the future\nexport const OmeZarrCoordinateTranslationSchema = z.object({\n translation: z.number().array().min(4).max(5),\n type: z.literal('translation'),\n});\n\nexport type OmeZarrCoordinateScale = {\n scale: number[];\n type: 'scale';\n};\n\n// due to a difference in types between ZodObject and ZodType,\n// currently this schema cannot be associated directly with\n// ZarrCoordinateScale using z.ZodType<T>\n// TODO try to fix this in the future\nexport const OmeZarrCoordinateScaleSchema = z.object({\n scale: z.number().array().min(4).max(5),\n type: z.literal('scale'),\n});\n\nexport type OmeZarrCoordinateTransform = OmeZarrCoordinateTranslation | OmeZarrCoordinateScale;\n\nexport const OmeZarrCoordinateTransformSchema: z.ZodType<OmeZarrCoordinateTransform> = z.discriminatedUnion('type', [\n OmeZarrCoordinateTranslationSchema,\n OmeZarrCoordinateScaleSchema,\n]);\n\nexport type OmeZarrDataset = {\n coordinateTransformations: OmeZarrCoordinateTransform[];\n path: string;\n};\n\nexport type OmeZarrShapedDataset = OmeZarrDataset & {\n shape: ReadonlyArray<number>;\n multiscaleIndex: number;\n datasetIndex: number;\n};\n\nexport const OmeZarrDatasetSchema: z.ZodType<OmeZarrDataset> = z.object({\n coordinateTransformations: OmeZarrCoordinateTransformSchema.array().nonempty(),\n path: z.string(),\n});\n\nexport type OmeZarrMultiscale = {\n axes: OmeZarrAxis[];\n datasets: OmeZarrDataset[];\n name: string;\n version?: string | undefined;\n type?: string | undefined;\n};\n\nexport const OmeZarrMultiscaleSchema: z.ZodType<OmeZarrMultiscale> = z.object({\n name: z.string(),\n version: z.string().optional(),\n type: z.string().optional(),\n axes: OmeZarrAxisSchema.array().nonempty(),\n datasets: OmeZarrDatasetSchema.array().nonempty(),\n});\n\nexport type OmeZarrOmeroChannelWindow = {\n min: number;\n start: number;\n end: number;\n max: number;\n};\n\nexport const OmeZarrOmeroChannelWindowSchema: z.ZodType<OmeZarrOmeroChannelWindow> = z.object({\n min: z.number(),\n start: z.number(),\n end: z.number(),\n max: z.number(),\n});\n\nexport type OmeZarrOmeroChannel = {\n active?: boolean | undefined;\n color: string;\n label?: string | undefined;\n window: OmeZarrOmeroChannelWindow;\n};\n\nexport const OmeZarrOmeroChannelSchema: z.ZodType<OmeZarrOmeroChannel> = z.object({\n active: z.boolean().optional(),\n color: z.string(),\n label: z.string().optional(),\n window: OmeZarrOmeroChannelWindowSchema,\n});\n\nexport type OmeZarrOmero = {\n channels: OmeZarrOmeroChannel[];\n};\n\nexport type OmeZarrColorChannel = {\n rgb: vec3;\n rgba: vec4;\n window: Interval;\n range: Interval;\n active?: boolean | undefined;\n label?: string | undefined;\n};\n\nexport const OmeZarrOmeroSchema: z.ZodType<OmeZarrOmero> = z.object({\n channels: OmeZarrOmeroChannelSchema.array().nonempty(),\n});\n\nexport type BaseOmeZarrAttrs = {\n multiscales: OmeZarrMultiscale[];\n omero?: OmeZarrOmero | undefined; // omero is a transitional field, meaning it is expected to go away in a later version\n};\n\nexport type OmeZarrAttrsV2 = BaseOmeZarrAttrs;\n\nexport type OmeZarrAttrsV3 = {\n ome: BaseOmeZarrAttrs;\n};\n\nexport type OmeZarrAttrs = {\n zarrVersion: number;\n} & BaseOmeZarrAttrs;\n\nexport const OmeZarrAttrsBaseSchema: z.ZodType<OmeZarrAttrsV2> = z.object({\n multiscales: OmeZarrMultiscaleSchema.array().nonempty(),\n omero: OmeZarrOmeroSchema.optional(),\n});\n\nexport const OmeZarrAttrsV2Schema = OmeZarrAttrsBaseSchema;\n\nexport const OmeZarrAttrsV3Schema: z.ZodType<OmeZarrAttrsV3> = z.object({\n ome: OmeZarrAttrsBaseSchema,\n});\n\nexport const OmeZarrAttrsSchema = z\n .union([OmeZarrAttrsV2Schema, OmeZarrAttrsV3Schema])\n .transform<OmeZarrAttrs>((v: OmeZarrAttrsV2 | OmeZarrAttrsV3) => {\n if ('ome' in v) {\n return {\n zarrVersion: 3,\n ...v.ome,\n };\n }\n return {\n zarrVersion: 2,\n ...v,\n };\n });\n\nexport type DehydratedOmeZarrArray = {\n path: string;\n};\n\n// For details on Zarr Array Metadata format, see: https://zarr-specs.readthedocs.io/en/latest/v2/v2.0.html\nexport type OmeZarrArrayMetadata = {\n path: string;\n shape: number[];\n attrs?: Record<string, unknown> | undefined;\n};\n\nexport type DehydratedOmeZarrMetadata = {\n url: string;\n attrs: OmeZarrAttrs;\n arrays: OmeZarrArrayMetadata[];\n zarrVersion: number;\n};\n\nexport function convertFromOmeroToColorChannels(omero: OmeZarrOmero): OmeZarrColorChannel[] {\n return omero.channels.map(convertFromOmeroChannelToColorChannel);\n}\n\nexport function convertFromOmeroChannelToColorChannel(omeroChannel: OmeZarrOmeroChannel): OmeZarrColorChannel {\n const active = omeroChannel.active;\n const label = omeroChannel.label;\n const rgba = makeRGBAColorVector(omeroChannel.color);\n const rgb: vec3 = [rgba[0], rgba[1], rgba[2]];\n const { min: winMin, max: winMax } = omeroChannel.window;\n const { start: ranMin, end: ranMax } = omeroChannel.window;\n const window: Interval = { min: winMin, max: winMax };\n const range: Interval = { min: ranMin, max: ranMax };\n\n return { rgb, rgba, window, range, active, label };\n}\n\nexport type OmeZarrMetadataFlattened = {\n url: string;\n attrs: OmeZarrAttrs;\n arrays: ReadonlyArray<OmeZarrArrayMetadata>;\n zarrVersion: number;\n colorChannels: OmeZarrColorChannel[];\n redChannel: OmeZarrColorChannel | undefined;\n blueChannel: OmeZarrColorChannel | undefined;\n greenChannel: OmeZarrColorChannel | undefined;\n};\n\nexport class OmeZarrMetadata {\n #url: string;\n #attrs: OmeZarrAttrs;\n #arrays: ReadonlyArray<OmeZarrArrayMetadata>;\n #zarrVersion: number;\n\n constructor(url: string, attrs: OmeZarrAttrs, arrays: ReadonlyArray<OmeZarrArrayMetadata>, zarrVersion: number) {\n this.#url = url;\n this.#attrs = attrs;\n this.#arrays = arrays;\n this.#zarrVersion = zarrVersion;\n }\n\n get url(): string {\n return this.#url;\n }\n\n get attrs(): OmeZarrAttrs {\n return this.#attrs;\n }\n\n get arrays(): ReadonlyArray<OmeZarrArrayMetadata> {\n return this.#arrays;\n }\n\n get zarrVersion(): number {\n return this.#zarrVersion;\n }\n\n toJSON(): OmeZarrMetadataFlattened {\n return {\n url: this.url,\n attrs: this.attrs,\n arrays: this.arrays,\n zarrVersion: this.zarrVersion,\n colorChannels: this.colorChannels,\n redChannel: this.redChannel,\n blueChannel: this.blueChannel,\n greenChannel: this.greenChannel,\n };\n }\n\n #getMultiscaleIndex(multiscale?: number | string): number {\n if (multiscale !== undefined) {\n if (typeof multiscale === 'number') {\n if (multiscale < 0) {\n return -1;\n }\n return multiscale;\n }\n return this.#attrs.multiscales.findIndex((m) => m.name === multiscale);\n }\n return 0;\n }\n\n #getValidMultiscaleIndex(multiscale?: number | string): number {\n const multiscaleIndex = this.#getMultiscaleIndex(multiscale);\n if (multiscaleIndex < 0) {\n const message = `invalid multiscale requested: identifier [${multiscale}]`;\n logger.error(message);\n throw new VisZarrIndexError(message);\n }\n return multiscaleIndex;\n }\n\n #getDatasetIndex(dataset: number | string, multiscaleIndex: number): number {\n const datasets = this.#attrs.multiscales[multiscaleIndex]?.datasets ?? null;\n if (!datasets) {\n return -1;\n }\n if (typeof dataset === 'number') {\n if (dataset < 0 || dataset >= datasets.length) {\n return -1;\n }\n return dataset;\n }\n return datasets.findIndex((d) => d.path === dataset);\n }\n\n #getValidDatasetIndex(dataset: number | string, multiscaleIndex: number): number {\n const datasetIndex = this.#getDatasetIndex(dataset, multiscaleIndex);\n if (datasetIndex < 0) {\n const message = `invalid dataset requested: identifier [${dataset}]`;\n logger.error(message);\n throw new VisZarrIndexError(message);\n }\n return datasetIndex;\n }\n\n /** Private function that retrieves the X value from the `shape` of a given array, within a\n * specific multiscale representation of the data.\n */\n #getShapeX(array: OmeZarrArrayMetadata, multiscaleIndex: number): number {\n const shape = array.shape;\n if (!shape || shape.length < 4) {\n const message = `invalid dataset: .zarray formatting invalid, found array without valid shape; path [${multiscaleIndex}/${array.path}]`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const shapeIndex = shape.length === 5 ? SHAPE_X_DIM_INDEX + 1 : SHAPE_X_DIM_INDEX;\n return shape[shapeIndex];\n }\n\n /** Private function that retrieves the Y value from the `shape` of a given array, within a\n * specific multiscale representation of the data.\n */\n #getShapeY(array: OmeZarrArrayMetadata, multiscaleIndex: number): number {\n const shape = array.shape;\n if (!shape || shape.length < 4) {\n const message = `invalid dataset: .zarray formatting invalid, found array without valid shape; path [${multiscaleIndex}/${array.path}]`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const shapeIndex = shape.length === 5 ? SHAPE_Y_DIM_INDEX + 1 : SHAPE_Y_DIM_INDEX;\n return shape[shapeIndex];\n }\n\n /** Private function that retrieves the Z value from the `shape` of a given array, within a\n * specific multiscale representation of the data.\n */\n #getShapeZ(array: OmeZarrArrayMetadata, multiscaleIndex: number): number {\n const shape = array.shape;\n if (!shape || shape.length < 4) {\n const message = `invalid dataset: .zarray formatting invalid, found array without valid shape; path [${multiscaleIndex}/${array.path}]`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n\n // This checks to see if the shape provided has all 5 official OME-Zarr dimensions (t, c, z, y, x),\n // or just the 4 that we typically have in our data files (c, z, y, x)\n const shapeIndex = shape.length === 5 ? SHAPE_Z_DIM_INDEX + 1 : SHAPE_Z_DIM_INDEX;\n return shape[shapeIndex];\n }\n\n /** Private function to retrieve the maximum value for a given shape element, e.g.\n * the maximum value of one of the dimensions (t, c, z, y, x). It compares across all\n * the values of that dimension for all zarrays/datasets within a given multiscale\n * representation of the data.\n *\n * Note: Typically, we only receive the last 4 elements in the `shape` of a zarray.\n *\n * @param getShapeElement a function that retrieves one element from the `shape` of\n * a zarray\n * @returns the maxium value of that element across all arrays within the given\n * multiscale representation\n */\n #getShapeElementMax(\n getShapeElement: (a: OmeZarrArrayMetadata, multiscaleIndex: number) => number,\n multiscale?: number | string,\n ): number {\n const multiscaleIndex = this.#getValidMultiscaleIndex(multiscale);\n return this.#attrs.multiscales[multiscaleIndex].datasets\n .map((dataset) => {\n const array = this.#arrays.find((a) => a.path === dataset.path);\n if (!array) {\n const message = `invalid dataset: .zarray missing for dataset [${multiscaleIndex}/${dataset.path}]`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n return getShapeElement(array, multiscaleIndex);\n })\n .reduce((prev, curr) => Math.max(prev, curr));\n }\n\n /**\n * Given a specific @param multiscale representation of the Zarr data, finds the\n * largest X shape component among the shapes of the different dataset arrays.\n * @param multiscale the index or path of a specific multiscale representation (defaults to 0)\n * @returns the largest Z scale for the specified multiscale representation\n */\n maxX(multiscale: number | string = 0): number {\n return this.#getShapeElementMax(this.#getShapeX, multiscale);\n }\n\n /**\n * Given a specific @param multiscale representation of the Zarr data, finds the\n * largest Y shape component among the shapes of the different dataset arrays.\n * @param multiscale the index or path of a specific multiscale representation (defaults to 0)\n * @returns the largest Z scale for the specified multiscale representation\n */\n maxY(multiscale: number | string = 0): number {\n return this.#getShapeElementMax(this.#getShapeY, multiscale);\n }\n\n /**\n * Given a specific @param multiscale representation of the Zarr data, finds the\n * largest Z shape component among the shapes of the different dataset arrays.\n * @param multiscale the index or path of a specific multiscale representation (defaults to 0)\n * @returns the largest Z scale for the specified multiscale representation\n */\n maxZ(multiscale: number | string = 0): number {\n return this.#getShapeElementMax(this.#getShapeZ, multiscale);\n }\n\n maxOrthogonal(plane: CartesianPlane, multiscale: number | string = 0): number {\n if (plane.ortho === 'x') {\n return this.maxX(multiscale);\n }\n if (plane.ortho === 'y') {\n return this.maxY(multiscale);\n }\n if (plane.ortho === 'z') {\n return this.maxZ(multiscale);\n }\n throw new VisZarrDataError(`invalid plane: ortho set to '${plane.ortho}'`);\n }\n\n #makeShapedDataset(dataset: OmeZarrDataset, multiscaleIndex: number, datasetIndex: number) {\n const array = this.#arrays.find((a) => a.path === dataset.path);\n if (!array) {\n const message = `invalid dataset: .zarray missing for dataset [${multiscaleIndex}][${datasetIndex}]`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n return {\n ...dataset,\n shape: array.shape,\n multiscaleIndex,\n datasetIndex,\n };\n }\n\n getShapedDataset(indexOrPath: number | string, multiscale: number | string = 0): OmeZarrShapedDataset | undefined {\n try {\n const multiscaleIndex = this.#getValidMultiscaleIndex(multiscale);\n const datasetIndex = this.#getValidDatasetIndex(indexOrPath, multiscaleIndex);\n const dataset = this.#attrs.multiscales[multiscaleIndex].datasets[datasetIndex];\n return this.#makeShapedDataset(dataset, multiscaleIndex, datasetIndex);\n } catch (e) {\n if (e instanceof VisZarrIndexError) {\n logger.debug('encountered index error when retrieving shaped dataset; returning undefined');\n return undefined;\n }\n throw e;\n }\n }\n\n getFirstShapedDataset(multiscale: number | string = 0): OmeZarrShapedDataset | undefined {\n let multiscaleIndex: number;\n try {\n multiscaleIndex = this.#getValidMultiscaleIndex(multiscale);\n const dataset = this.#attrs.multiscales[multiscaleIndex].datasets[0];\n return this.#makeShapedDataset(dataset, multiscaleIndex, 0);\n } catch (e) {\n if (e instanceof VisZarrIndexError) {\n logger.debug('encountered index error when retrieving shaped dataset; returning undefined');\n return undefined;\n }\n throw e;\n }\n }\n\n getLastShapedDataset(multiscale: number | string = 0): OmeZarrShapedDataset | undefined {\n let multiscaleIndex: number;\n try {\n multiscaleIndex = this.#getValidMultiscaleIndex(multiscale);\n const datasets = this.#attrs.multiscales[multiscaleIndex].datasets;\n const dataset = datasets[datasets.length - 1];\n return this.#makeShapedDataset(dataset, multiscaleIndex, 0);\n } catch (e) {\n if (e instanceof VisZarrIndexError) {\n logger.debug('encountered index error when retrieving shaped dataset; returning undefined');\n return undefined;\n }\n throw e;\n }\n }\n getNumLayers(multiscale: number | string = 0) {\n const multiscaleIndex = this.#getValidMultiscaleIndex(multiscale);\n return this.#attrs.multiscales[multiscaleIndex].datasets.length;\n }\n getAllShapedDatasets(multiscale: number | string = 0): OmeZarrShapedDataset[] {\n const multiscaleIndex = this.#getValidMultiscaleIndex(multiscale);\n const datasets = this.#attrs.multiscales[multiscaleIndex].datasets;\n return datasets.map((dataset, i) => this.#makeShapedDataset(dataset, multiscaleIndex, i));\n }\n\n dehydrate(): DehydratedOmeZarrMetadata {\n return { url: this.#url, attrs: this.#attrs, arrays: [...this.#arrays], zarrVersion: this.#zarrVersion };\n }\n\n static async rehydrate(dehydrated: DehydratedOmeZarrMetadata): Promise<OmeZarrMetadata> {\n const { url, attrs, arrays, zarrVersion } = dehydrated;\n return new OmeZarrMetadata(url, attrs, arrays, zarrVersion);\n }\n\n #getChannelByMask(colorMask: string): OmeZarrColorChannel | undefined {\n if (!this.#attrs.omero || !this.#attrs.omero.channels) {\n logger.debug(`no omero data found for color mask ${colorMask}, returning undefined`);\n return undefined;\n }\n const omeroChannel = this.#attrs.omero.channels.find((ch) => ch.color === colorMask);\n if (!omeroChannel) {\n logger.debug(`no matching omero channel found for color mask ${colorMask}, returning undefined`);\n return undefined;\n }\n return convertFromOmeroChannelToColorChannel(omeroChannel);\n }\n\n get colorChannels(): OmeZarrColorChannel[] {\n return this.#attrs.omero ? convertFromOmeroToColorChannels(this.#attrs.omero) : [];\n }\n\n get redChannel(): OmeZarrColorChannel | undefined {\n return this.#getChannelByMask('#FF0000');\n }\n\n get greenChannel(): OmeZarrColorChannel | undefined {\n return this.#getChannelByMask('#00FF00');\n }\n\n get blueChannel(): OmeZarrColorChannel | undefined {\n return this.#getChannelByMask('#0000FF');\n }\n}\n","// render a slice of an ome-zarr file as a 2D image\n// note that the ome-zarr data must have exactly 3 channels\n// the channels may be mapped to color-channels (RGB) with a basic 2-post gamut control\n\nimport type { vec2, vec3, vec4 } from '@alleninstitute/vis-geometry';\nimport type REGL from 'regl';\nimport type { Framebuffer2D } from 'regl';\n\n/* ================ TILE RENDERING VERTEX SHADER ================ */\nconst tileVert = /*glsl*/ `\nprecision highp float;\nattribute vec2 pos;\n \nuniform vec4 view;\nuniform vec4 tile;\nuniform float depth;\nvarying vec2 texCoord;\nuniform float rot;\n\nvoid main(){\n vec2 tileSize = tile.zw-tile.xy;\n texCoord = pos;\n vec2 obj = (pos.xy*tileSize+tile.xy);\n\n vec2 p = (obj-view.xy)/(view.zw-view.xy);\n // now, to clip space\n p = (p*2.0)-1.0;\n gl_Position = vec4(p.x,p.y,depth,1.0);\n}\n`;\n/* -------------------------------------------------------------- */\n\n/* ============= RGB TILE RENDERING FRAGMENT SHADER ============= */\nconst rgbFrag = /*glsl*/ `\nprecision highp float;\nuniform sampler2D R;\nuniform sampler2D G;\nuniform sampler2D B; \n// for reasons which are pretty annoying\n// its more direct to do 3 separate channels...\nuniform vec2 Rgamut;\nuniform vec2 Ggamut;\nuniform vec2 Bgamut;\nvarying vec2 texCoord;\n\nvoid main(){\n vec3 mins = vec3(Rgamut.x, Ggamut.x, Bgamut.x);\n vec3 maxs = vec3(Rgamut.y, Ggamut.y, Bgamut.y);\n vec3 span = maxs - mins;\n vec3 color = (vec3(\n texture2D(R, texCoord).r,\n texture2D(G, texCoord).r,\n texture2D(B, texCoord).r\n ) - mins) / span;\n \n gl_FragColor = vec4(color, 1.0);\n}\n`;\n/* -------------------------------------------------------------- */\n\ntype CommonRenderProps = {\n target: Framebuffer2D | null;\n depth: number; // the Z value at which to render the tile, from 0 (the front) to 1 (the back)\n tile: vec4; // [minx,miny,maxx,maxy] representing the bounding box of the tile we're rendering\n view: vec4; // [minx,miny,maxx,maxy] representing the camera in the same space as the tile's bounding box\n};\n\ntype RGBTileRenderProps = CommonRenderProps & {\n Rgamut: vec2; // [min,max] RedOut = RedChannelValue-Rgamut.min/(Rgamut.max-Rgamut.min)\n Ggamut: vec2; // [min,max] GreenOut = GreenChannelValue-Ggamut.min/(Ggamut.max-Ggamut.min)\n Bgamut: vec2; // [min,max] BlueOut = BlueChannelValue-Bgamut.min/(Bgamut.max-Bgamut.min)\n R: REGL.Texture2D;\n G: REGL.Texture2D;\n B: REGL.Texture2D;\n};\n\ntype Channel = {\n tex: REGL.Texture2D;\n gamut: vec2;\n rgb: vec3;\n};\n\ntype TileRenderProps = CommonRenderProps & {\n channels: Channel[];\n};\n\n/**\n *\n * @param regl an active REGL context\n * @returns a function (regl command) which renders 3 individual channels as the RGB\n * components of an image. Each channel is mapped to the output RGB space via the given Gamut.\n * the rendering is done in the given target buffer (or null for the screen).\n */\nexport function buildRGBTileRenderCommand(regl: REGL.Regl) {\n const cmd = regl<\n {\n view: vec4;\n tile: vec4;\n depth: number;\n R: REGL.Texture2D;\n G: REGL.Texture2D;\n B: REGL.Texture2D;\n Rgamut: vec2;\n Ggamut: vec2;\n Bgamut: vec2;\n },\n { pos: REGL.BufferData },\n RGBTileRenderProps\n >({\n vert: tileVert,\n frag: rgbFrag,\n framebuffer: regl.prop<RGBTileRenderProps, 'target'>('target'),\n attributes: {\n pos: [0, 0, 1, 0, 1, 1, 0, 1],\n },\n uniforms: {\n tile: regl.prop<RGBTileRenderProps, 'tile'>('tile'),\n view: regl.prop<RGBTileRenderProps, 'view'>('view'),\n depth: regl.prop<RGBTileRenderProps, 'depth'>('depth'),\n R: regl.prop<RGBTileRenderProps, 'R'>('R'),\n G: regl.prop<RGBTileRenderProps, 'G'>('G'),\n B: regl.prop<RGBTileRenderProps, 'B'>('B'),\n Rgamut: regl.prop<RGBTileRenderProps, 'Rgamut'>('Rgamut'),\n Ggamut: regl.prop<RGBTileRenderProps, 'Ggamut'>('Ggamut'),\n Bgamut: regl.prop<RGBTileRenderProps, 'Bgamut'>('Bgamut'),\n },\n depth: {\n enable: true,\n },\n count: 4,\n primitive: 'triangle fan',\n });\n\n return (p: RGBTileRenderProps) => cmd(p);\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: type of uniforms cannot be given explicitly due to dynamic nature of uniforms in these shaders\ntype ReglUniforms = REGL.MaybeDynamicUniforms<any, REGL.DefaultContext, TileRenderProps>;\n\n/**\n *\n * @param regl an active REGL context\n * @param numChannels the number of channels this render command will support\n * @returns a function (regl command) which renders a set of individual channels (of any colorspace(s))\n * into a single RGB image. Each channel is mapped to the output RGB space via the given Gamut.\n * The rendering is done in the given target buffer (or null for the screen).\n */\nexport function buildTileRenderCommand(regl: REGL.Regl, numChannels: number) {\n const reglChannelUniforms: ReglUniforms[] = [];\n const fragmentChannelUniformDefs = [];\n const colorMerges = [];\n for (let i = 0; i < numChannels; i++) {\n reglChannelUniforms.push({\n [`gamut${i}`]: (_context: unknown, props: TileRenderProps) => props.channels[i].gamut,\n [`color${i}`]: (_context: unknown, props: TileRenderProps) => props.channels[i].rgb,\n [`tex${i}`]: (_context: unknown, props: TileRenderProps) => props.channels[i].tex,\n });\n fragmentChannelUniformDefs.push(`uniform vec2 gamut${i};`);\n fragmentChannelUniformDefs.push(`uniform vec3 color${i};`);\n fragmentChannelUniformDefs.push(`uniform sampler2D tex${i};`);\n colorMerges.push(`\n float ch${i}Val = texture2D(tex${i}, texCoord).r;\n ch${i}Val = (ch${i}Val - gamut${i}.x) / (gamut${i}.y - gamut${i}.x);\n color += (color${i} * ch${i}Val);\n `);\n }\n const staticReglUniforms: ReglUniforms = {\n tile: regl.prop<TileRenderProps, 'tile'>('tile'),\n view: regl.prop<TileRenderProps, 'view'>('view'),\n depth: regl.prop<TileRenderProps, 'depth'>('depth'),\n };\n const uniforms = reglChannelUniforms.reduce((acc: ReglUniforms, curr: ReglUniforms) => {\n for (const key in curr) {\n acc[key] = curr[key];\n }\n return acc;\n }, staticReglUniforms);\n\n const frag = `\n precision highp float;\n ${fragmentChannelUniformDefs.join('\\n')}\n varying vec2 texCoord;\n\n void main() {\n vec3 color = vec3(0.0, 0.0, 0.0);\n ${colorMerges.join('\\n')}\n color = clamp(color, 0.0, 1.0);\n gl_FragColor = vec4(color, 1.0);\n }`;\n\n // biome-ignore lint/suspicious/noExplicitAny: type of uniforms cannot be given explicitly due to dynamic nature of uniforms in these shaders\n const cmd = regl<any, { pos: REGL.BufferData }, TileRenderProps>({\n vert: tileVert,\n frag,\n framebuffer: regl.prop<TileRenderProps, 'target'>('target'),\n attributes: {\n pos: [0, 0, 1, 0, 1, 1, 0, 1],\n },\n uniforms,\n depth: {\n enable: true,\n },\n count: 4,\n primitive: 'triangle fan',\n });\n\n return (p: TileRenderProps) => cmd(p);\n}\n","import { logger } from '@alleninstitute/vis-core';\nimport type { Chunk, Float32 } from 'zarrita';\nimport { type DehydratedOmeZarrMetadata, OmeZarrMetadata, type OmeZarrShapedDataset } from '../zarr/types';\nimport { loadSlice, type ZarrRequest } from '../zarr/loading';\n// a helper for making a web-worker loader\nexport type ZarrSliceRequest = {\n id: string;\n type: 'ZarrSliceRequest';\n metadata: DehydratedOmeZarrMetadata;\n req: ZarrRequest;\n level: OmeZarrShapedDataset;\n};\n\nexport type CancelRequest = {\n type: 'cancel';\n id: string;\n};\n\nfunction isSliceRequest(payload: unknown): payload is ZarrSliceRequest {\n return typeof payload === 'object' && payload !== null && 'type' in payload && payload.type === 'ZarrSliceRequest';\n}\nfunction isCancellationRequest(payload: unknown): payload is CancelRequest {\n return typeof payload === 'object' && payload !== null && 'type' in payload && payload.type === 'cancel';\n}\n/**\n * a helper function to initialize a message handler on a webworker,\n * which responds to requests for omezarr slices:\n * messages must be of type MessageEvent<ZarrSliceRequest|CancelRequest>\n * @see ZarrSliceRequest\n * @see CancelRequest\n * @param ctx the \"global this\" aka self object on a webworker context.\n */\nexport function makeOmeZarrSliceLoaderWorker(ctx: typeof self) {\n const cancelers: Record<string, AbortController> = {};\n\n ctx.onmessage = (msg: MessageEvent<unknown>) => {\n const { data } = msg;\n try {\n if (isSliceRequest(data)) {\n const { metadata: dehydratedMetadata, req, level, id } = data;\n const abort = new AbortController();\n cancelers[id] = abort;\n OmeZarrMetadata.rehydrate(dehydratedMetadata).then((metadata) => {\n loadSlice(metadata, req, level, abort.signal)\n .then((result: { shape: number[]; buffer: Chunk<Float32> }) => {\n const { shape, buffer } = result;\n const data = new Float32Array(buffer.data);\n ctx.postMessage({ type: 'slice', id, shape, data }, { transfer: [data.buffer] });\n })\n .catch((err) => {\n if (\n !(\n err === 'cancelled' ||\n (typeof err === 'object' &&\n (('name' in err && err.name === 'AbortError') ||\n ('code' in err && err.code === 20)))\n )\n ) {\n logger.error('error in slice fetch worker: ', err);\n } // else ignore it\n });\n });\n } else if (isCancellationRequest(data)) {\n const { id } = data;\n cancelers[id]?.abort('cancelled');\n } else {\n logger.error('web-worker slice-fetcher recieved incomprehensible message: ', msg);\n }\n } catch (err) {\n logger.error('OME-Zarr fetch onmessage error', err);\n }\n };\n}\n","import type { OmeZarrShapedDataset, OmeZarrMetadata } from './types';\nimport { type ZarrRequest, buildQuery, loadZarrArrayFileFromStore } from './loading';\nimport { VisZarrDataError } from '../errors';\nimport * as zarr from 'zarrita';\nimport { logger, type WorkerInit } from '@alleninstitute/vis-core';\nimport { ZarrFetchStore, type CachingMultithreadedFetchStoreOptions } from './cached-loading/store';\n\nexport function decoderFactory(url: string, workerModule: WorkerInit, options?: CachingMultithreadedFetchStoreOptions) {\n const store = new ZarrFetchStore(url, workerModule, options);\n const getSlice = async (\n metadata: OmeZarrMetadata,\n req: ZarrRequest,\n level: OmeZarrShapedDataset,\n signal?: AbortSignal,\n ) => {\n if (metadata.url !== url) {\n throw new Error(\n 'trying to use a decoder from a different store - we cant do that yet, although we could build a map of url->stores here if we wanted later - TODO',\n );\n }\n const scene = metadata.attrs.multiscales[0];\n const { axes } = scene;\n if (!level) {\n const message = 'invalid Zarr data: no datasets found';\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const arr = metadata.arrays.find((a) => a.path === level.path);\n if (!arr) {\n const message = `cannot load slice: no array found for path [${level.path}]`;\n logger.error(message);\n throw new VisZarrDataError(message);\n }\n const { raw } = await loadZarrArrayFileFromStore(store, arr.path, metadata.zarrVersion, false);\n const result = await zarr.get(raw, buildQuery(req, axes, level.shape), { opts: { signal: signal ?? null } });\n if (typeof result === 'number') {\n throw new Error('oh noes, slice came back all weird');\n }\n const { shape, data } = result;\n if (typeof data !== 'object' || !('buffer' in data)) {\n throw new Error('slice was malformed, array-buffer response required');\n }\n // biome-ignore lint/suspicious/noExplicitAny: <hard to prove - but the typeof check above is sufficient for this to be safe>\n return { shape, data: new Float32Array(data as any) };\n };\n return {\n decoder: getSlice,\n destroy: () => {\n store.destroy();\n },\n };\n}\n","import { type Cacheable, logger, PriorityCache, type WorkerInit, WorkerPool } from '@alleninstitute/vis-core';\nimport * as zarr from 'zarrita';\nimport { FETCH_MESSAGE_TYPE, type FetchResponseMessage, isFetchResponseMessage } from './fetch-data.interface';\n\nconst DEFAULT_NUM_WORKERS = 6;\nconst DEFAULT_MAX_DATA_CACHE_BYTES = 256 * 2 ** 10; // 256 MB -- aribtrarily chosen at this point\n\n// @TODO implement a much more context-aware cache size limiting mechanism\nconst getDataCacheSizeLimit = () => {\n return DEFAULT_MAX_DATA_CACHE_BYTES;\n};\n\nexport const asCacheKey = (key: zarr.AbsolutePath, range?: zarr.RangeQuery | undefined): string => {\n const keyStr = JSON.stringify(key);\n const rangeStr = range ? JSON.stringify(range) : 'no-range';\n return `${keyStr} ${rangeStr}`;\n};\n\ntype FetchStoreOptions = {\n overrides?: RequestInit;\n useSuffixRequest?: boolean;\n};\n\nclass CacheableByteArray implements Cacheable {\n #arr: Uint8Array;\n\n constructor(arr: Uint8Array) {\n this.#arr = arr;\n }\n\n destroy() {}\n\n sizeInBytes(): number {\n return this.#arr.byteLength;\n }\n\n get array(): Uint8Array {\n return this.#arr;\n }\n}\n\ntype CacheKey = string;\n\ntype TransferableRequestInit = Omit<RequestInit, 'body' | 'headers' | 'signal'> & {\n body?: string | undefined;\n headers?: Record<string, string> | undefined;\n};\n\nconst copyToTransferableHeaders = (headers: RequestInit['headers']): Record<string, string> | undefined => {\n if (Array.isArray(headers)) {\n const result: Record<string, string> = {};\n headers.forEach(([key, val]) => {\n // TODO is key, val the correct order here?\n result[key] = val;\n });\n return result;\n }\n if (headers instanceof Headers) {\n const result: Record<string, string> = {};\n headers.forEach((val, key) => {\n result[key] = val;\n });\n return result;\n }\n return headers;\n};\n\nconst copyToTransferableRequestInit = (req: RequestInit | undefined): TransferableRequestInit => {\n if (req === undefined) {\n return {};\n }\n const updReq = { ...req };\n delete updReq.signal;\n delete updReq.window;\n return { ...updReq, body: req.body?.toString(), headers: copyToTransferableHeaders(req.headers) };\n};\n\nexport type CachingMultithreadedFetchStoreOptions = {\n maxBytes?: number | undefined;\n numWorkers?: number | undefined;\n maxFetches?: number | undefined;\n fetchStoreOptions?: FetchStoreOptions | undefined;\n};\n\ntype PromiseResolve<T> = (t: T) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// biome-ignore lint/suspicious/noExplicitAny: This is aligned with the standard Promise API\ntype PromiseReject = (reason: any) => void;\n\ntype PendingRequest<T> = {\n resolve: PromiseResolve<T>;\n reject: PromiseReject;\n promise: Promise<T>;\n};\n\ntype Guard<T> = (obj: unknown) => obj is T;\nexport interface RequestHandler<RequestType, ResponseType> {\n submitRequest(\n message: RequestType,\n responseValidator: Guard<ResponseType>,\n transfers: Transferable[],\n signal?: AbortSignal | undefined,\n ): Promise<ResponseType>;\n destroy: () => void;\n}\n\nexport class CachingMultithreadedFetchStore extends zarr.FetchStore {\n /**\n * Maintains a pool of available worker threads.\n *\n * TODO: Enable end-to-end Message-based type constraints for these that\n * enable us to restrict what types of messages can be sent to workers\n * for a given store instance.\n */\n // biome-ignore lint/suspicious/noExplicitAny: the type system for these parameters is a future feature\n #workerPool: RequestHandler<any, any>;\n\n /**\n * Stores the current set of cached data that has been successfully\n * fetched. This data is stored in raw byte array form so that it\n * integrates properly with the Zarrita framework.\n */\n #dataCache: PriorityCache<CacheableByteArray>;\n\n /**\n * Maps cache keys to numeric times; the higher the time, the higher the priority.\n *\n * This effectively means that more frequently-requested items will be kept longer.\n */\n #priorityByTimestamp: Map<CacheKey, number>;\n\n /**\n * Stores in-progress requests that have not yet resolved.\n */\n #pendingRequests: Map<CacheKey, PendingRequest<Uint8Array | undefined>>;\n\n /**\n * Stores one instance of a cache key for each time that cache key was requested,\n * removing them all once that particular request is fulfilled. This allows us to\n * keep track of whether or not it is safe to abort a pending request: as long as\n * there are at least 2 instances of the same cache key in this array, then that\n * means multiple requestors are waiting on a particular piece of data, and it is\n * not safe to abort that request.\n */\n #pendingRequestKeyCounts: Map<CacheKey, number>;\n\n /**\n * A callback form of the `score` function.\n */\n #scoreFn: (h: CacheKey) => number;\n\n // biome-ignore lint/suspicious/noExplicitAny: the type system for these parameters is a future feature\n constructor(url: string | URL, handler: RequestHandler<any, any>, options?: CachingMultithreadedFetchStoreOptions) {\n super(url, options?.fetchStoreOptions);\n this.#scoreFn = (h: CacheKey) => this.score(h);\n this.#dataCache = new PriorityCache<CacheableByteArray>(\n new Map<CacheKey, CacheableByteArray>(),\n this.#scoreFn,\n options?.maxBytes ?? getDataCacheSizeLimit(),\n );\n this.#priorityByTimestamp = new Map<CacheKey, number>();\n this.#workerPool = handler;\n this.#pendingRequests = new Map();\n this.#pendingRequestKeyCounts = new Map();\n }\n /**\n * Warning - nothing in this class should be considered useable after\n * calling this method - any/all methods called should be expected to be\n * completely unreliable. dont call me unless you're about to dispose of all references to this object\n */\n destroy() {\n // release all the web-workers!\n this.#workerPool.destroy();\n // todo: reject all promises\n this.#pendingRequests.forEach((p) => {\n p.reject('cancelled');\n });\n }\n protected score(key: CacheKey): number {\n return this.#priorityByTimestamp.get(key) ?? 0;\n }\n\n #fromCache(cacheKey: CacheKey): Uint8Array | undefined {\n const cached = this.#dataCache.get(cacheKey);\n if (cached === undefined) {\n return undefined;\n }\n this.#priorityByTimestamp.set(cacheKey, Date.now());\n return cached.array;\n }\n\n #incrementKeyCount(cacheKey: CacheKey): number {\n const count = this.#pendingRequestKeyCounts.get(cacheKey);\n const newCount = count !== undefined ? count + 1 : 1;\n this.#pendingRequestKeyCounts.set(cacheKey, newCount);\n return newCount;\n }\n\n #decrementKeyCount(cacheKey: CacheKey): number {\n const count = this.#pendingRequestKeyCounts.get(cacheKey);\n if (count === undefined) {\n logger.warn('attempted to decrement a non-existent request key');\n return 0;\n }\n if (count <= 1) {\n this.#pendingRequestKeyCounts.delete(cacheKey);\n return 0;\n }\n const newCount = count - 1;\n this.#pendingRequestKeyCounts.set(cacheKey, newCount);\n return newCount;\n }\n\n async #doFetch(\n key: zarr.AbsolutePath,\n range: zarr.RangeQuery | undefined,\n options: TransferableRequestInit,\n abort: AbortSignal | undefined,\n ): Promise<Uint8Array | undefined> {\n const cacheKey = asCacheKey(key, range);\n\n this.#priorityByTimestamp.set(cacheKey, Date.now());\n this.#dataCache.reprioritize(this.#scoreFn);\n\n this.#incrementKeyCount(cacheKey);\n\n const pending = this.#pendingRequests.get(cacheKey);\n if (pending !== undefined) {\n return pending.promise;\n }\n\n const { promise, resolve, reject } = Promise.withResolvers<Uint8Array | undefined>();\n\n this.#pendingRequests.set(cacheKey, { promise, resolve, reject });\n const chain = new AbortController();\n if (abort) {\n abort.addEventListener('abort', () => {\n const count = this.#decrementKeyCount(cacheKey);\n if (count === 0) {\n this.#priorityByTimestamp.set(cacheKey, 0);\n this.#dataCache.reprioritize(this.#scoreFn);\n chain.abort();\n }\n });\n }\n\n const request = this.#workerPool.submitRequest(\n {\n type: FETCH_MESSAGE_TYPE,\n payload: {\n rootUrl: this.url,\n path: key,\n range,\n options,\n },\n },\n isFetchResponseMessage,\n [],\n chain.signal,\n );\n\n request\n .then((response: FetchResponseMessage) => {\n const payload = response.payload;\n if (payload === undefined) {\n resolve(undefined);\n return;\n }\n const arr = new Uint8Array(payload);\n this.#dataCache.put(cacheKey, new CacheableByteArray(arr));\n resolve(arr);\n })\n .catch((e: unknown) => {\n reject(e);\n })\n .finally(() => {\n this.#pendingRequests.delete(cacheKey);\n this.#pendingRequestKeyCounts.delete(cacheKey);\n });\n\n return promise;\n }\n\n async get(key: zarr.AbsolutePath, options?: RequestInit): Promise<Uint8Array | undefined> {\n const cacheKey = asCacheKey(key);\n const cached = this.#fromCache(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const workerOptions = copyToTransferableRequestInit(options);\n const abort = options?.signal ?? undefined;\n return this.#doFetch(key, undefined, workerOptions, abort);\n }\n\n async getRange(\n key: zarr.AbsolutePath,\n range: zarr.RangeQuery,\n options?: RequestInit,\n ): Promise<Uint8Array | undefined> {\n const cacheKey = asCacheKey(key, range);\n const cached = this.#fromCache(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const workerOptions = copyToTransferableRequestInit(options);\n const abort = options?.signal ?? undefined;\n return this.#doFetch(key, range, workerOptions, abort);\n }\n}\n\nexport class ZarrFetchStore extends CachingMultithreadedFetchStore {\n constructor(url: string | URL, workerModule: WorkerInit, options?: CachingMultithreadedFetchStoreOptions) {\n super(url, new WorkerPool(options?.numWorkers ?? DEFAULT_NUM_WORKERS, workerModule), options);\n }\n}\n","import type { AbsolutePath, RangeQuery } from 'zarrita';\nimport z from 'zod';\n\nexport type TransferrableRequestInit = Omit<RequestInit, 'body' | 'headers' | 'signal'> & {\n body?: string;\n headers?: [string, string][] | Record<string, string>;\n};\n\nexport type FetchMessagePayload = {\n rootUrl: string;\n path: AbsolutePath;\n range?: RangeQuery | undefined;\n options?: TransferrableRequestInit | undefined;\n};\n\nexport const FETCH_MESSAGE_TYPE = 'fetch' as const;\nexport const FETCH_RESPONSE_MESSAGE_TYPE = 'fetch-response' as const;\nexport const CANCEL_MESSAGE_TYPE = 'cancel' as const;\n\nexport type FetchMessage = {\n type: typeof FETCH_MESSAGE_TYPE;\n id: string;\n payload: FetchMessagePayload;\n};\n\nexport type FetchResponseMessage = {\n type: typeof FETCH_RESPONSE_MESSAGE_TYPE;\n id: string;\n payload: ArrayBufferLike | undefined;\n};\n\nexport type CancelMessage = {\n type: typeof CANCEL_MESSAGE_TYPE;\n id: string;\n};\n\nconst FetchMessagePayloadSchema = z.object({\n rootUrl: z.string().nonempty(),\n path: z.string().nonempty().startsWith('/'),\n range: z\n .union([\n z.object({\n offset: z.number(),\n length: z.number(),\n }),\n z.object({\n suffixLength: z.number(),\n }),\n ])\n .optional(),\n options: z.unknown().optional(), // being \"lazy\" for now; doing a full schema for this could be complex and fragile\n});\n\nconst FetchMessageSchema = z.object({\n type: z.literal(FETCH_MESSAGE_TYPE),\n id: z.string().nonempty(),\n payload: FetchMessagePayloadSchema,\n});\n\nconst FetchResponseMessageSchema = z.object({\n type: z.literal(FETCH_RESPONSE_MESSAGE_TYPE),\n id: z.string().nonempty(),\n payload: z.unknown().optional(), // unclear if it's feasible/wise to define a schema for this one\n});\n\nconst CancelMessageSchema = z.object({\n type: z.literal(CANCEL_MESSAGE_TYPE),\n id: z.string().nonempty(),\n});\n\nexport function isFetchMessage(val: unknown): val is FetchMessage {\n return FetchMessageSchema.safeParse(val).success;\n}\n\nexport function isFetchResponseMessage(val: unknown): val is FetchResponseMessage {\n return FetchResponseMessageSchema.safeParse(val).success;\n}\n\nexport function isCancelMessage(val: unknown): val is CancelMessage {\n return CancelMessageSchema.safeParse(val).success;\n}\n\nexport function isCancellationError(err: unknown): boolean {\n return (\n err === 'cancelled' ||\n (typeof err === 'object' &&\n err !== null &&\n (('name' in err && err.name === 'AbortError') || ('code' in err && err.code === 20)))\n );\n}\n","// a web-worker which fetches slices of data, decodes them, and returns the result as a flat float32 array, using transferables\n\nimport { HEARTBEAT_RATE_MS, logger } from '@alleninstitute/vis-core';\nimport { type AbsolutePath, FetchStore, type RangeQuery } from 'zarrita';\nimport type { CancelMessage, FetchMessage, TransferrableRequestInit } from './fetch-data.interface';\nimport {\n FETCH_RESPONSE_MESSAGE_TYPE,\n isCancellationError,\n isCancelMessage,\n isFetchMessage,\n} from './fetch-data.interface';\n\nconst NUM_RETRIES = 2;\nconst RETRY_DELAY_MS = 500;\n\nconst fetchFile = async (\n rootUrl: string,\n path: AbsolutePath,\n options?: TransferrableRequestInit | undefined,\n abortController?: AbortController | undefined,\n): Promise<Uint8Array | undefined> => {\n const store = new FetchStore(rootUrl);\n return store.get(path, { ...(options || {}), signal: abortController?.signal ?? null });\n};\n\nconst fetchSlice = async (\n rootUrl: string,\n path: AbsolutePath,\n range: RangeQuery,\n options?: TransferrableRequestInit | undefined,\n abortController?: AbortController | undefined,\n): Promise<Uint8Array | undefined> => {\n const store = new FetchStore(rootUrl);\n const wait = async (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n for (let i = 0; i < NUM_RETRIES; i++) {\n try {\n return await store.getRange(path, range, { ...(options || {}), signal: abortController?.signal ?? null });\n } catch (e) {\n logger.error('getRange request failed:', e);\n const hasRetries = i < NUM_RETRIES - 1;\n const message = `getRange request ${i < NUM_RETRIES - 1 ? `will retry in ${RETRY_DELAY_MS}ms` : 'has no retries left'}`;\n logger.warn(message);\n if (hasRetries) {\n await wait(RETRY_DELAY_MS);\n }\n }\n }\n return undefined;\n};\n\nconst handleFetch = (message: FetchMessage, abortControllers: Record<string, AbortController>) => {\n const { id, payload } = message;\n const { rootUrl, path, range, options } = payload;\n\n if (id in abortControllers) {\n logger.error('cannot send message: request ID already in use');\n return;\n }\n\n const abort = new AbortController();\n abortControllers[id] = abort;\n\n const fetchFn =\n range !== undefined\n ? () => fetchSlice(rootUrl, path, range, options, abort)\n : () => fetchFile(rootUrl, path, options, abort);\n\n fetchFn()\n .then((result: Uint8Array | undefined) => {\n const buffer = result?.buffer;\n const options = buffer !== undefined ? { transfer: [buffer] } : {};\n self.postMessage(\n {\n type: FETCH_RESPONSE_MESSAGE_TYPE,\n id,\n payload: result?.buffer,\n },\n { ...options },\n );\n })\n .catch((e) => {\n if (!isCancellationError(e)) {\n logger.error('error in slice fetch worker: ', e);\n }\n // can ignore if it is a cancellation error\n });\n};\n\nconst handleCancel = (message: CancelMessage, abortControllers: Record<string, AbortController>) => {\n const { id } = message;\n const abortController = abortControllers[id];\n if (!abortController) {\n logger.warn('attempted to cancel a non-existent request');\n } else {\n abortController.abort('cancelled');\n }\n};\n\nconst startHeartbeat = () =>\n setInterval(() => {\n self.postMessage({ type: 'heartbeat' });\n }, HEARTBEAT_RATE_MS);\n\nconst setupOnMessage = () => {\n const abortControllers: Record<string, AbortController> = {};\n const onmessage = async (e: MessageEvent<unknown>) => {\n const { data: message } = e;\n\n if (isFetchMessage(message)) {\n handleFetch(message, abortControllers);\n } else if (isCancelMessage(message)) {\n handleCancel(message, abortControllers);\n }\n };\n return onmessage;\n};\n\nexport const setupFetchDataWorker = (ctx: typeof self) => {\n ctx.onmessage = setupOnMessage();\n return { startHeartbeat };\n};\n"],"names":[],"version":3,"file":"main.js.map"}
|