@fideus-labs/ngff-zarr 0.7.5 → 0.9.0

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.
Files changed (36) hide show
  1. package/esm/browser-mod.d.ts +2 -2
  2. package/esm/browser-mod.d.ts.map +1 -1
  3. package/esm/browser-mod.js +2 -2
  4. package/esm/browser-mod.js.map +1 -1
  5. package/esm/io/itk_image_to_ngff_image.d.ts.map +1 -1
  6. package/esm/io/itk_image_to_ngff_image.js +15 -7
  7. package/esm/io/itk_image_to_ngff_image.js.map +1 -1
  8. package/esm/mod.d.ts +1 -1
  9. package/esm/mod.d.ts.map +1 -1
  10. package/esm/mod.js +1 -1
  11. package/esm/mod.js.map +1 -1
  12. package/esm/utils/compute_omero-shared.d.ts +12 -5
  13. package/esm/utils/compute_omero-shared.d.ts.map +1 -1
  14. package/esm/utils/compute_omero-shared.js +28 -0
  15. package/esm/utils/compute_omero-shared.js.map +1 -1
  16. package/esm/utils/compute_omero.d.ts +12 -40
  17. package/esm/utils/compute_omero.d.ts.map +1 -1
  18. package/esm/utils/compute_omero.js +336 -86
  19. package/esm/utils/compute_omero.js.map +1 -1
  20. package/esm/utils/omero_worker_rpc.d.ts +37 -0
  21. package/esm/utils/omero_worker_rpc.d.ts.map +1 -0
  22. package/esm/utils/omero_worker_rpc.js +156 -0
  23. package/esm/utils/omero_worker_rpc.js.map +1 -0
  24. package/esm/workers/omero_codec_worker.d.ts +2 -0
  25. package/esm/workers/omero_codec_worker.d.ts.map +1 -0
  26. package/esm/workers/omero_codec_worker.js +215 -0
  27. package/esm/workers/omero_codec_worker.js.map +1 -0
  28. package/package.json +2 -3
  29. package/esm/utils/compute_omero-browser.d.ts +0 -45
  30. package/esm/utils/compute_omero-browser.d.ts.map +0 -1
  31. package/esm/utils/compute_omero-browser.js +0 -253
  32. package/esm/utils/compute_omero-browser.js.map +0 -1
  33. package/esm/workers/compute_omero_worker.d.ts +0 -47
  34. package/esm/workers/compute_omero_worker.d.ts.map +0 -1
  35. package/esm/workers/compute_omero_worker.js +0 -113
  36. package/esm/workers/compute_omero_worker.js.map +0 -1
@@ -1,136 +1,386 @@
1
1
  // SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
2
2
  // SPDX-License-Identifier: MIT
3
- import { zarrGet } from "./worker_pool.js";
3
+ /**
4
+ * Unified OMERO metadata computation using @fideus-labs/worker-pool.
5
+ *
6
+ * Works in Node.js, Deno, and browser environments. Each zarr chunk is
7
+ * decoded and its per-channel statistics computed in parallel via a
8
+ * WorkerPool. Decoded chunks are cached so that a subsequent zarrGet()
9
+ * with the same cache avoids redundant decompression.
10
+ */
11
+ import { WorkerPool } from "@fideus-labs/worker-pool";
12
+ import { createCacheKey, readArrayMetadata } from "@fideus-labs/fizarrita";
13
+ import { buildOmeroFromAccumulators, createAccumulator, extractChannel, mergeAccumulators, updateAccumulator, validateColor, validateQuantiles, } from "./compute_omero-shared.js";
14
+ import { getMetaId, workerDecodeAndStats } from "./omero_worker_rpc.js";
4
15
  // Re-export shared utilities for backward compatibility
5
16
  export { computeChannelStatistics, extractChannel, getDefaultColors, GLASBEY_COLORS, QUANTILE_SAMPLE_SIZE, validateColor, validateQuantiles, } from "./compute_omero-shared.js";
6
- // Import for internal use
7
- import { computeChannelStatistics, extractChannel, getDefaultColors, validateColor, validateQuantiles, } from "./compute_omero-shared.js";
17
+ // ---------------------------------------------------------------------------
18
+ // Worker pool for omero computation
19
+ // ---------------------------------------------------------------------------
20
+ /** Pool size for the omero worker pool. */
21
+ const POOL_SIZE = Math.min(typeof navigator !== "undefined" ? (navigator?.hardwareConcurrency || 4) : 4, 128);
22
+ /** Blob URL used by inlined browser builds — set by inline_worker.ts. */
23
+ let workerBlobUrl = null;
24
+ let _omeroPool = null;
25
+ function getOmeroPool() {
26
+ if (!_omeroPool) {
27
+ _omeroPool = new WorkerPool(POOL_SIZE);
28
+ }
29
+ return _omeroPool;
30
+ }
31
+ /** Create a new omero codec worker instance. */
32
+ function createOmeroWorker() {
33
+ return new Worker(new URL("../workers/omero_codec_worker.js", import.meta.url), { type: "module" });
34
+ }
35
+ /**
36
+ * Terminate the omero computation worker pool and release resources.
37
+ * Call this when you're done with OMERO computations to free memory.
38
+ */
39
+ export function terminateOmeroWorkerPool() {
40
+ if (_omeroPool) {
41
+ _omeroPool.terminateWorkers();
42
+ _omeroPool = null;
43
+ }
44
+ if (workerBlobUrl) {
45
+ URL.revokeObjectURL(workerBlobUrl);
46
+ workerBlobUrl = null;
47
+ }
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // Chunk coordinate enumeration
51
+ // ---------------------------------------------------------------------------
52
+ /**
53
+ * Enumerate all chunk coordinates for a given array shape and chunk shape.
54
+ * Returns an array of coordinate tuples.
55
+ */
56
+ function enumerateChunkCoords(shape, chunkShape) {
57
+ const gridDims = shape.map((s, i) => Math.ceil(s / chunkShape[i]));
58
+ const coords = [];
59
+ const ndim = gridDims.length;
60
+ // Recursive enumeration of all grid coordinates
61
+ function enumerate(dim, current) {
62
+ if (dim === ndim) {
63
+ coords.push([...current]);
64
+ return;
65
+ }
66
+ for (let i = 0; i < gridDims[dim]; i++) {
67
+ current[dim] = i;
68
+ enumerate(dim + 1, current);
69
+ }
70
+ }
71
+ enumerate(0, new Array(ndim).fill(0));
72
+ return coords;
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Shared TextDecoder for metadata reading
76
+ // ---------------------------------------------------------------------------
77
+ const _textDecoder = new TextDecoder();
78
+ // ---------------------------------------------------------------------------
79
+ // Codec detection — skip workers for unsupported codecs
80
+ // ---------------------------------------------------------------------------
81
+ const UNSUPPORTED_CODEC_NAMES = new Set(["sharding_indexed"]);
82
+ // deno-lint-ignore no-explicit-any
83
+ const _codecCheckCache = new WeakMap();
84
+ async function hasUnsupportedCodecs(arr) {
85
+ let pathMap = _codecCheckCache.get(arr.store);
86
+ if (pathMap?.has(arr.path)) {
87
+ return pathMap.get(arr.path);
88
+ }
89
+ const zarrJsonPath = (arr.path === "/" ? "/zarr.json" : `${arr.path}/zarr.json`);
90
+ const bytes = await arr.store.get(zarrJsonPath);
91
+ let result = false;
92
+ if (bytes) {
93
+ try {
94
+ const meta = JSON.parse(_textDecoder.decode(bytes));
95
+ const codecs = meta.codecs ?? [];
96
+ result = codecs.some((c) => UNSUPPORTED_CODEC_NAMES.has(c.name));
97
+ }
98
+ catch {
99
+ result = false;
100
+ }
101
+ }
102
+ if (!pathMap) {
103
+ pathMap = new Map();
104
+ _codecCheckCache.set(arr.store, pathMap);
105
+ }
106
+ pathMap.set(arr.path, result);
107
+ return result;
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Chunk key encoding (local fallback for when fizarrita metadata isn't usable)
111
+ // ---------------------------------------------------------------------------
112
+ function createChunkKeyEncoder(metadata, isV2) {
113
+ if (isV2) {
114
+ const separator = metadata.dimension_separator ?? ".";
115
+ return (chunk_coords) => chunk_coords.join(separator) || "0";
116
+ }
117
+ const encoding = metadata.chunk_key_encoding ?? { name: "default" };
118
+ if (encoding.name === "default") {
119
+ const separator = encoding.configuration?.separator ?? "/";
120
+ return (chunk_coords) => ["c", ...chunk_coords].join(separator);
121
+ }
122
+ if (encoding.name === "v2") {
123
+ const separator = encoding.configuration?.separator ?? ".";
124
+ return (chunk_coords) => chunk_coords.join(separator) || "0";
125
+ }
126
+ throw new Error(`Unknown chunk key encoding: ${encoding.name}`);
127
+ }
128
+ async function readLocalArrayMetadata(arr) {
129
+ const store = arr.store;
130
+ // Try v3 first: read zarr.json
131
+ const v3Path = (arr.path === "/" ? "/zarr.json" : `${arr.path}/zarr.json`);
132
+ const v3Bytes = await store.get(v3Path);
133
+ if (v3Bytes) {
134
+ const metadata = JSON.parse(_textDecoder.decode(v3Bytes));
135
+ return {
136
+ codecMeta: {
137
+ data_type: metadata.data_type,
138
+ chunk_shape: metadata.chunk_grid.configuration.chunk_shape,
139
+ codecs: metadata.codecs,
140
+ },
141
+ encodeChunkKey: createChunkKeyEncoder(metadata, false),
142
+ };
143
+ }
144
+ // Try v2: read .zarray
145
+ const v2Path = (arr.path === "/" ? "/.zarray" : `${arr.path}/.zarray`);
146
+ const v2Bytes = await store.get(v2Path);
147
+ if (v2Bytes) {
148
+ const metadata = JSON.parse(_textDecoder.decode(v2Bytes));
149
+ const codecs = [];
150
+ if (metadata.order === "F") {
151
+ codecs.push({ name: "transpose", configuration: { order: "F" } });
152
+ }
153
+ if (metadata.compressor) {
154
+ const { id, ...configuration } = metadata.compressor;
155
+ codecs.push({ name: id, configuration });
156
+ }
157
+ for (const { id, ...configuration } of metadata.filters ?? []) {
158
+ codecs.push({ name: id, configuration });
159
+ }
160
+ return {
161
+ codecMeta: {
162
+ data_type: arr.dtype,
163
+ chunk_shape: arr.chunks,
164
+ codecs: codecs.length > 0
165
+ ? codecs
166
+ : [{ name: "bytes", configuration: { endian: "little" } }],
167
+ },
168
+ encodeChunkKey: createChunkKeyEncoder(metadata, true),
169
+ };
170
+ }
171
+ // Fallback
172
+ return {
173
+ codecMeta: {
174
+ data_type: arr.dtype,
175
+ chunk_shape: arr.chunks,
176
+ codecs: [{ name: "bytes", configuration: { endian: "little" } }],
177
+ },
178
+ encodeChunkKey: createChunkKeyEncoder({
179
+ chunk_key_encoding: { name: "default" },
180
+ }, false),
181
+ };
182
+ }
183
+ // ---------------------------------------------------------------------------
184
+ // Main-thread fallback for stats computation from a cached/decoded chunk
185
+ // ---------------------------------------------------------------------------
186
+ function computeStatsFromDecodedChunk(chunkData, chunkShape, nChannels, cIndex) {
187
+ const accumulators = [];
188
+ if (cIndex >= 0) {
189
+ for (let ch = 0; ch < nChannels; ch++) {
190
+ const channelData = extractChannel(chunkData, chunkShape, ch, cIndex);
191
+ const acc = createAccumulator();
192
+ updateAccumulator(acc, channelData);
193
+ accumulators.push(acc);
194
+ }
195
+ }
196
+ else {
197
+ const acc = createAccumulator();
198
+ updateAccumulator(acc, chunkData);
199
+ accumulators.push(acc);
200
+ }
201
+ return accumulators;
202
+ }
203
+ // ---------------------------------------------------------------------------
204
+ // Main-thread fallback for full computation (unsupported codecs)
205
+ // ---------------------------------------------------------------------------
206
+ async function computeOmeroMainThread(image, options = {}) {
207
+ // Lazy import to avoid circular dependency
208
+ const { zarrGet } = await import("./worker_pool.js");
209
+ const quantiles = options.quantiles ?? [0.02, 0.98];
210
+ validateQuantiles(quantiles);
211
+ const dims = image.dims;
212
+ const shape = image.data.shape;
213
+ const cIndex = dims.indexOf("c");
214
+ const hasChannelDim = cIndex !== -1;
215
+ const nChannels = hasChannelDim ? shape[cIndex] : 1;
216
+ const result = await zarrGet(image.data);
217
+ const fullData = result.data;
218
+ const accumulators = Array.from({ length: nChannels }, () => createAccumulator());
219
+ if (hasChannelDim) {
220
+ for (let chIdx = 0; chIdx < nChannels; chIdx++) {
221
+ const channelData = extractChannel(fullData, shape, chIdx, cIndex);
222
+ updateAccumulator(accumulators[chIdx], channelData);
223
+ }
224
+ }
225
+ else {
226
+ updateAccumulator(accumulators[0], fullData);
227
+ }
228
+ return buildOmeroFromAccumulators(accumulators, quantiles, options.colors, options.labels);
229
+ }
230
+ // ---------------------------------------------------------------------------
231
+ // Public API: computeOmeroFromNgffImage
232
+ // ---------------------------------------------------------------------------
8
233
  /**
9
234
  * Compute OMERO metadata from an NgffImage.
10
235
  *
11
- * This function computes visualization parameters (OMERO metadata) from image data:
12
- * - min/max: The actual data range
13
- * - start/end: Display window based on quantiles (default 2% and 98%)
14
- *
15
- * For multi-channel images (with 'c' dimension), statistics are computed
16
- * separately for each channel, resulting in per-channel OMERO windows.
17
- *
18
- * Memory requirements: This function loads the entire image data into memory
19
- * for statistics computation. For large images, use the lowest resolution
20
- * image from a multiscales pyramid.
21
- *
22
- * Edge cases:
23
- * - If all values in a channel are NaN, the statistics will be NaN.
24
- * - If a channel has constant values, min/max/start/end will all be the same.
236
+ * Each zarr chunk is decoded and its per-channel statistics computed in
237
+ * parallel via a WorkerPool. Decoded chunks are optionally cached so that
238
+ * a subsequent zarrGet() with the same cache avoids redundant decompression.
25
239
  *
26
240
  * @param image - The NgffImage to compute metadata for
27
- * @param options - Optional configuration for quantiles, colors, and labels
28
- * - quantiles: Tuple of (low, high) quantile values. Must be between 0 and 1,
29
- * with low < high. Default is [0.02, 0.98] for 2% and 98% quantiles.
30
- * - colors: List of hex color strings (without #) for each channel.
31
- * Must be 6-digit hexadecimal strings (e.g., "FF0000" for red).
32
- * If not provided, uses white for single channel or Glasbey
33
- * progression for multi-channel.
34
- * - labels: List of label strings for each channel.
35
- * If not provided, uses empty strings.
241
+ * @param options - Optional configuration for quantiles, colors, labels, and cache
36
242
  * @returns Promise resolving to Omero metadata with computed window parameters
37
- * @throws {Error} If quantiles are invalid, colors are invalid format,
38
- * or not enough colors/labels provided.
39
- *
40
- * @example
41
- * ```ts
42
- * const omero = await computeOmeroFromNgffImage(image);
43
- * multiscales.metadata.omero = omero;
44
- * ```
45
243
  */
46
244
  export async function computeOmeroFromNgffImage(image, options = {}) {
47
245
  const quantiles = options.quantiles ?? [0.02, 0.98];
48
- // Validate quantiles
49
246
  validateQuantiles(quantiles);
50
247
  const dims = image.dims;
51
248
  const shape = image.data.shape;
52
- // Check if there's a channel dimension
53
- const hasChannelDim = dims.includes("c");
54
- const cIndex = hasChannelDim ? dims.indexOf("c") : -1;
249
+ const cIndex = dims.indexOf("c");
250
+ const hasChannelDim = cIndex !== -1;
55
251
  const nChannels = hasChannelDim ? shape[cIndex] : 1;
56
- // Get colors
57
- let channelColors;
252
+ // Validate colors
58
253
  if (options.colors !== undefined) {
59
254
  if (options.colors.length < nChannels) {
60
255
  throw new Error(`Not enough colors provided. Got ${options.colors.length}, need ${nChannels}.`);
61
256
  }
62
- // Validate each color
63
257
  for (const color of options.colors.slice(0, nChannels)) {
64
258
  validateColor(color);
65
259
  }
66
- channelColors = options.colors.slice(0, nChannels);
67
- }
68
- else {
69
- channelColors = getDefaultColors(nChannels);
70
260
  }
71
- // Get labels
72
- let channelLabels;
261
+ // Validate labels
73
262
  if (options.labels !== undefined) {
74
263
  if (options.labels.length < nChannels) {
75
264
  throw new Error(`Not enough labels provided. Got ${options.labels.length}, need ${nChannels}.`);
76
265
  }
77
- channelLabels = options.labels.slice(0, nChannels);
78
266
  }
79
- else {
80
- channelLabels = Array(nChannels).fill("");
267
+ // Fall back to main-thread for unsupported codecs (e.g. sharding)
268
+ if (await hasUnsupportedCodecs(image.data)) {
269
+ return computeOmeroMainThread(image, options);
81
270
  }
82
- // Read all data from the zarr array
83
- const result = await zarrGet(image.data);
84
- const fullData = result.data;
85
- // Compute statistics for each channel
86
- const channels = [];
87
- for (let chIdx = 0; chIdx < nChannels; chIdx++) {
88
- let channelData;
89
- if (hasChannelDim) {
90
- // Extract this channel's data
91
- channelData = extractChannel(fullData, shape, chIdx, cIndex);
271
+ // Read array metadata for codec pipeline + chunk key encoding
272
+ let codecMeta;
273
+ let encodeChunkKey;
274
+ try {
275
+ const metadata = await readArrayMetadata(image.data);
276
+ codecMeta = metadata.codecMeta;
277
+ encodeChunkKey = metadata.encodeChunkKey;
278
+ }
279
+ catch {
280
+ // Fall back to local metadata reading if fizarrita's version fails
281
+ const localMeta = await readLocalArrayMetadata(image.data);
282
+ codecMeta = localMeta.codecMeta;
283
+ encodeChunkKey = localMeta.encodeChunkKey;
284
+ }
285
+ const chunkShape = codecMeta.chunk_shape;
286
+ const metaId = getMetaId(codecMeta);
287
+ // Optional cache for decoded chunks
288
+ const cache = options.cache;
289
+ // Enumerate all chunk coordinates
290
+ const allChunkCoords = enumerateChunkCoords(shape, chunkShape);
291
+ // Build worker pool tasks — one per chunk
292
+ const pool = getOmeroPool();
293
+ const tasks = [];
294
+ for (const chunk_coords of allChunkCoords) {
295
+ const chunkKey = encodeChunkKey(chunk_coords);
296
+ const chunkPath = image.data.resolve(chunkKey).path;
297
+ // Compute edge chunk shape
298
+ const edgeChunkShape = chunk_coords.map((coord, dim) => Math.min(chunkShape[dim], shape[dim] - coord * chunkShape[dim]));
299
+ // Check cache before building the task
300
+ const cacheKey = cache
301
+ ? createCacheKey(image.data, encodeChunkKey, chunk_coords)
302
+ : "";
303
+ if (cache) {
304
+ const cachedChunk = cache.get(cacheKey);
305
+ if (cachedChunk) {
306
+ // Cache hit — compute stats from cached decoded chunk on main thread
307
+ const accs = computeStatsFromDecodedChunk(cachedChunk.data, cachedChunk.shape, nChannels, cIndex);
308
+ // No worker needed — return the slot directly for pool management.
309
+ // For cached results, we use the provided workerSlot if available,
310
+ // or create a worker to satisfy the type contract.
311
+ tasks.push((workerSlot) => {
312
+ const worker = workerSlot ?? createOmeroWorker();
313
+ return Promise.resolve({
314
+ worker,
315
+ result: accs,
316
+ });
317
+ });
318
+ continue;
319
+ }
92
320
  }
93
- else {
94
- channelData = fullData;
321
+ tasks.push(async (workerSlot) => {
322
+ const worker = workerSlot ?? createOmeroWorker();
323
+ // Fetch raw bytes from store on main thread
324
+ const rawBytes = await image.data.store.get(chunkPath);
325
+ if (!rawBytes) {
326
+ // Missing chunk — fill with zeros, compute trivial stats
327
+ const accs = [];
328
+ for (let ch = 0; ch < nChannels; ch++) {
329
+ accs.push(createAccumulator());
330
+ }
331
+ return { worker, result: accs };
332
+ }
333
+ // Send to worker: decode + compute stats in one round-trip
334
+ const { chunk, accumulators } = await workerDecodeAndStats(worker, rawBytes, metaId, codecMeta, nChannels, cIndex, edgeChunkShape);
335
+ // Cache decoded chunk for future zarrGet reuse.
336
+ // Cast needed: jsr:zarrita vs npm:zarrita Chunk types are structurally
337
+ // identical but TypeScript sees differing #private class fields.
338
+ if (cache) {
339
+ // deno-lint-ignore no-explicit-any
340
+ cache.set(cacheKey, chunk);
341
+ }
342
+ return { worker, result: accumulators };
343
+ });
344
+ }
345
+ // Execute all tasks with bounded concurrency
346
+ let allAccumulators;
347
+ if (tasks.length > 0) {
348
+ const { promise } = pool.runTasks(tasks);
349
+ allAccumulators = await promise;
350
+ }
351
+ else {
352
+ allAccumulators = [];
353
+ }
354
+ // Merge partial accumulators across all chunks
355
+ const mergedAccumulators = Array.from({ length: nChannels }, () => createAccumulator());
356
+ for (const chunkAccs of allAccumulators) {
357
+ for (let ch = 0; ch < nChannels; ch++) {
358
+ if (chunkAccs[ch]) {
359
+ mergedAccumulators[ch] = mergeAccumulators(mergedAccumulators[ch], chunkAccs[ch]);
360
+ }
95
361
  }
96
- // Compute statistics
97
- const stats = computeChannelStatistics(channelData, quantiles);
98
- // Create OMERO window
99
- const window = {
100
- min: stats.min,
101
- max: stats.max,
102
- start: stats.qLow,
103
- end: stats.qHigh,
104
- };
105
- // Create channel metadata
106
- const channel = {
107
- color: channelColors[chIdx],
108
- window,
109
- label: channelLabels[chIdx],
110
- };
111
- channels.push(channel);
112
362
  }
113
- return { channels };
363
+ return buildOmeroFromAccumulators(mergedAccumulators, quantiles, options.colors, options.labels);
114
364
  }
365
+ // ---------------------------------------------------------------------------
366
+ // Public API: computeOmeroFromMultiscales
367
+ // ---------------------------------------------------------------------------
115
368
  /**
116
369
  * Compute OMERO metadata from a Multiscales object.
117
370
  *
118
371
  * This is a convenience function that computes OMERO metadata from the
119
- * highest or lowest resolution image in a multiscales pyramid.
372
+ * highest resolution image in a multiscales pyramid for accurate statistics.
120
373
  *
121
374
  * @param multiscales - The Multiscales object to compute metadata for
122
- * @param options - Optional configuration for quantiles, colors, labels, and resolution
375
+ * @param options - Optional configuration for quantiles, colors, and labels
123
376
  * @returns Promise resolving to Omero metadata with computed window parameters
124
377
  */
125
378
  export async function computeOmeroFromMultiscales(multiscales, options = {}) {
126
379
  if (!multiscales.images || multiscales.images.length === 0) {
127
380
  throw new Error("Multiscales has no images");
128
381
  }
129
- const useLowestResolution = options.useLowestResolution ?? true;
130
- // Select which image to use based on resolution preference
131
- const image = useLowestResolution
132
- ? multiscales.images[multiscales.images.length - 1] // Last image (lowest resolution)
133
- : multiscales.images[0]; // First image (highest resolution)
382
+ // Always use the highest resolution (first) image for accurate statistics
383
+ const image = multiscales.images[0];
134
384
  const computeOptions = {};
135
385
  if (options.quantiles !== undefined) {
136
386
  computeOptions.quantiles = options.quantiles;
@@ -1 +1 @@
1
- {"version":3,"file":"compute_omero.js","sourceRoot":"","sources":["../../src/utils/compute_omero.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compute_omero.js","sourceRoot":"","sources":["../../src/utils/compute_omero.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Main-thread RPC helpers for communicating with the omero codec worker.
3
+ *
4
+ * Follows the same persistent-dispatcher pattern as fizarrita's worker-rpc.ts:
5
+ * - One message listener per worker, routed by request ID
6
+ * - Meta-init protocol: codec metadata sent once per worker per array config
7
+ * - Zero-copy buffer transfer where possible
8
+ *
9
+ * Adds the `workerDecodeAndStats` function for the decode_and_stats message.
10
+ */
11
+ import type { Chunk, DataType } from "zarrita";
12
+ import type { CodecChunkMeta } from "@fideus-labs/fizarrita";
13
+ import type { ChannelStatisticsAccumulator } from "./compute_omero-shared.js";
14
+ /**
15
+ * Get or create a stable metaId for the given codec metadata.
16
+ * Uses JSON.stringify as the dedup key — called once per unique array config.
17
+ */
18
+ export declare function getMetaId(meta: CodecChunkMeta): number;
19
+ /**
20
+ * Send raw bytes to the omero codec worker for decoding AND per-channel
21
+ * statistics computation. Returns both the decoded chunk (for caching)
22
+ * and partial accumulators (for merging).
23
+ *
24
+ * @param worker - The Web Worker to send the message to
25
+ * @param bytes - Raw encoded chunk bytes from the store
26
+ * @param metaId - Stable ID for the codec metadata
27
+ * @param meta - Codec metadata for this array
28
+ * @param nChannels - Number of channels in the image
29
+ * @param cIndex - Index of the channel dimension (-1 if no channel dim)
30
+ * @param actualChunkShape - Edge chunk shape correction (optional)
31
+ * @returns The decoded chunk and per-channel accumulators
32
+ */
33
+ export declare function workerDecodeAndStats<D extends DataType>(worker: Worker, bytes: Uint8Array, metaId: number, meta: CodecChunkMeta, nChannels: number, cIndex: number, actualChunkShape?: number[]): Promise<{
34
+ chunk: Chunk<D>;
35
+ accumulators: ChannelStatisticsAccumulator[];
36
+ }>;
37
+ //# sourceMappingURL=omero_worker_rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omero_worker_rpc.d.ts","sourceRoot":"","sources":["../../src/utils/omero_worker_rpc.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAyB,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AA2G9E;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAStD;AA+CD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAC3D,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC;IACT,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,YAAY,EAAE,4BAA4B,EAAE,CAAC;CAC9C,CAAC,CA8CD"}