@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.
- package/esm/browser-mod.d.ts +2 -2
- package/esm/browser-mod.d.ts.map +1 -1
- package/esm/browser-mod.js +2 -2
- package/esm/browser-mod.js.map +1 -1
- package/esm/io/itk_image_to_ngff_image.d.ts.map +1 -1
- package/esm/io/itk_image_to_ngff_image.js +15 -7
- package/esm/io/itk_image_to_ngff_image.js.map +1 -1
- package/esm/mod.d.ts +1 -1
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +1 -1
- package/esm/mod.js.map +1 -1
- package/esm/utils/compute_omero-shared.d.ts +12 -5
- package/esm/utils/compute_omero-shared.d.ts.map +1 -1
- package/esm/utils/compute_omero-shared.js +28 -0
- package/esm/utils/compute_omero-shared.js.map +1 -1
- package/esm/utils/compute_omero.d.ts +12 -40
- package/esm/utils/compute_omero.d.ts.map +1 -1
- package/esm/utils/compute_omero.js +336 -86
- package/esm/utils/compute_omero.js.map +1 -1
- package/esm/utils/omero_worker_rpc.d.ts +37 -0
- package/esm/utils/omero_worker_rpc.d.ts.map +1 -0
- package/esm/utils/omero_worker_rpc.js +156 -0
- package/esm/utils/omero_worker_rpc.js.map +1 -0
- package/esm/workers/omero_codec_worker.d.ts +2 -0
- package/esm/workers/omero_codec_worker.d.ts.map +1 -0
- package/esm/workers/omero_codec_worker.js +215 -0
- package/esm/workers/omero_codec_worker.js.map +1 -0
- package/package.json +2 -3
- package/esm/utils/compute_omero-browser.d.ts +0 -45
- package/esm/utils/compute_omero-browser.d.ts.map +0 -1
- package/esm/utils/compute_omero-browser.js +0 -253
- package/esm/utils/compute_omero-browser.js.map +0 -1
- package/esm/workers/compute_omero_worker.d.ts +0 -47
- package/esm/workers/compute_omero_worker.d.ts.map +0 -1
- package/esm/workers/compute_omero_worker.js +0 -113
- package/esm/workers/compute_omero_worker.js.map +0 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Local typed array constructor lookup (avoids depending on fizarrita internals
|
|
4
|
+
// from the main thread — the worker uses fizarrita's version)
|
|
5
|
+
function get_ctr(data_type) {
|
|
6
|
+
const ctr = {
|
|
7
|
+
int8: Int8Array,
|
|
8
|
+
int16: Int16Array,
|
|
9
|
+
int32: Int32Array,
|
|
10
|
+
int64: globalThis.BigInt64Array,
|
|
11
|
+
uint8: Uint8Array,
|
|
12
|
+
uint16: Uint16Array,
|
|
13
|
+
uint32: Uint32Array,
|
|
14
|
+
uint64: globalThis.BigUint64Array,
|
|
15
|
+
float32: Float32Array,
|
|
16
|
+
float64: Float64Array,
|
|
17
|
+
}[data_type];
|
|
18
|
+
if (!ctr) {
|
|
19
|
+
throw new Error(`Unsupported data_type for worker codec: ${data_type}`);
|
|
20
|
+
}
|
|
21
|
+
return ctr;
|
|
22
|
+
}
|
|
23
|
+
class WorkerDispatcher {
|
|
24
|
+
worker;
|
|
25
|
+
pending = new Map();
|
|
26
|
+
/** Tracks which metaIds have been sent to this worker. */
|
|
27
|
+
sentMetas = new Set();
|
|
28
|
+
constructor(worker) {
|
|
29
|
+
this.worker = worker;
|
|
30
|
+
worker.addEventListener("message", this.onMessage);
|
|
31
|
+
worker.addEventListener("error", this.onError);
|
|
32
|
+
}
|
|
33
|
+
onMessage = (event) => {
|
|
34
|
+
const { id } = event.data;
|
|
35
|
+
const req = this.pending.get(id);
|
|
36
|
+
if (!req)
|
|
37
|
+
return;
|
|
38
|
+
this.pending.delete(id);
|
|
39
|
+
if (event.data.error) {
|
|
40
|
+
req.reject(new Error(event.data.error));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
req.resolve(event.data);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
onError = (err) => {
|
|
47
|
+
const error = new Error(err.message ?? "Worker error");
|
|
48
|
+
for (const req of this.pending.values()) {
|
|
49
|
+
req.reject(error);
|
|
50
|
+
}
|
|
51
|
+
this.pending.clear();
|
|
52
|
+
};
|
|
53
|
+
send(id, message, transfer) {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
this.pending.set(id, { resolve, reject });
|
|
56
|
+
this.worker.postMessage(message, transfer);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
hasMeta(metaId) {
|
|
60
|
+
return this.sentMetas.has(metaId);
|
|
61
|
+
}
|
|
62
|
+
markMeta(metaId) {
|
|
63
|
+
this.sentMetas.add(metaId);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Map from Worker to its dispatcher. WeakMap so dispatchers are GC'd with workers. */
|
|
67
|
+
const dispatchers = new WeakMap();
|
|
68
|
+
function getDispatcher(worker) {
|
|
69
|
+
let d = dispatchers.get(worker);
|
|
70
|
+
if (!d) {
|
|
71
|
+
d = new WorkerDispatcher(worker);
|
|
72
|
+
dispatchers.set(worker, d);
|
|
73
|
+
}
|
|
74
|
+
return d;
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Meta ID registry — assigns stable IDs to unique codec metadata
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
let nextMetaId = 0;
|
|
80
|
+
const metaKeyToId = new Map();
|
|
81
|
+
const metaIdToMeta = new Map();
|
|
82
|
+
/**
|
|
83
|
+
* Get or create a stable metaId for the given codec metadata.
|
|
84
|
+
* Uses JSON.stringify as the dedup key — called once per unique array config.
|
|
85
|
+
*/
|
|
86
|
+
export function getMetaId(meta) {
|
|
87
|
+
const key = JSON.stringify(meta);
|
|
88
|
+
let id = metaKeyToId.get(key);
|
|
89
|
+
if (id === undefined) {
|
|
90
|
+
id = nextMetaId++;
|
|
91
|
+
metaKeyToId.set(key, id);
|
|
92
|
+
metaIdToMeta.set(id, meta);
|
|
93
|
+
}
|
|
94
|
+
return id;
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Request ID
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
let nextRequestId = 0;
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Buffer transfer helpers
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
function prepareTransferBuffer(buffer, byteOffset, byteLength) {
|
|
104
|
+
// Always copy: store-fetched bytes may be cached/shared
|
|
105
|
+
return buffer.slice(byteOffset, byteOffset + byteLength);
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Ensure meta is initialized on the worker
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
async function ensureMeta(dispatcher, metaId) {
|
|
111
|
+
if (dispatcher.hasMeta(metaId))
|
|
112
|
+
return;
|
|
113
|
+
const meta = metaIdToMeta.get(metaId);
|
|
114
|
+
const id = nextRequestId++;
|
|
115
|
+
await dispatcher.send(id, { type: "init", id, metaId, meta }, []);
|
|
116
|
+
dispatcher.markMeta(metaId);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Send raw bytes to the omero codec worker for decoding AND per-channel
|
|
120
|
+
* statistics computation. Returns both the decoded chunk (for caching)
|
|
121
|
+
* and partial accumulators (for merging).
|
|
122
|
+
*
|
|
123
|
+
* @param worker - The Web Worker to send the message to
|
|
124
|
+
* @param bytes - Raw encoded chunk bytes from the store
|
|
125
|
+
* @param metaId - Stable ID for the codec metadata
|
|
126
|
+
* @param meta - Codec metadata for this array
|
|
127
|
+
* @param nChannels - Number of channels in the image
|
|
128
|
+
* @param cIndex - Index of the channel dimension (-1 if no channel dim)
|
|
129
|
+
* @param actualChunkShape - Edge chunk shape correction (optional)
|
|
130
|
+
* @returns The decoded chunk and per-channel accumulators
|
|
131
|
+
*/
|
|
132
|
+
export async function workerDecodeAndStats(worker, bytes, metaId, meta, nChannels, cIndex, actualChunkShape) {
|
|
133
|
+
const dispatcher = getDispatcher(worker);
|
|
134
|
+
await ensureMeta(dispatcher, metaId);
|
|
135
|
+
const id = nextRequestId++;
|
|
136
|
+
const transferBuffer = prepareTransferBuffer(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
137
|
+
const response = (await dispatcher.send(id, {
|
|
138
|
+
type: "decode_and_stats",
|
|
139
|
+
id,
|
|
140
|
+
bytes: transferBuffer,
|
|
141
|
+
metaId,
|
|
142
|
+
actualChunkShape,
|
|
143
|
+
nChannels,
|
|
144
|
+
cIndex,
|
|
145
|
+
}, [transferBuffer]));
|
|
146
|
+
// Reconstruct the TypedArray from the transferred buffer
|
|
147
|
+
const Ctr = get_ctr(meta.data_type);
|
|
148
|
+
const data = new Ctr(response.data, 0, response.data.byteLength / Ctr.BYTES_PER_ELEMENT);
|
|
149
|
+
const chunk = {
|
|
150
|
+
data,
|
|
151
|
+
shape: response.shape,
|
|
152
|
+
stride: response.stride,
|
|
153
|
+
};
|
|
154
|
+
return { chunk, accumulators: response.accumulators };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=omero_worker_rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omero_worker_rpc.js","sourceRoot":"","sources":["../../src/utils/omero_worker_rpc.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAiB/B,gFAAgF;AAChF,8DAA8D;AAC9D,SAAS,OAAO,CACd,SAAY;IAEZ,MAAM,GAAG,GAA0C;QACjD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,UAAU,CAAC,aAAa;QAC/B,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,UAAU,CAAC,cAAc;QACjC,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;KACM,CAAC,SAAmB,CAEpC,CAAC;IACd,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,2CAA2C,SAAS,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAWD,MAAM,gBAAgB;IAKA;IAJZ,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IACpD,0DAA0D;IAClD,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,YAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAChC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAEO,SAAS,GAAG,CAAC,KAAmB,EAAQ,EAAE;QAChD,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAExB,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEM,OAAO,GAAG,CAAC,GAAe,EAAQ,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,IAAI,CACF,EAAU,EACV,OAAgB,EAChB,QAAwB;QAExB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,uFAAuF;AACvF,MAAM,WAAW,GAAG,IAAI,OAAO,EAA4B,CAAC;AAE5D,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAoB;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QACrB,EAAE,GAAG,UAAU,EAAE,CAAC;QAClB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzB,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,SAAS,qBAAqB,CAC5B,MAAmB,EACnB,UAAkB,EAClB,UAAkB;IAElB,wDAAwD;IACxD,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,KAAK,UAAU,UAAU,CACvB,UAA4B,EAC5B,MAAc;IAEd,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO;IACvC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IACvC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAClE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAaD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAc,EACd,KAAiB,EACjB,MAAc,EACd,IAAoB,EACpB,SAAiB,EACjB,MAAc,EACd,gBAA2B;IAK3B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAErC,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,MAAM,cAAc,GAAG,qBAAqB,CAC1C,KAAK,CAAC,MAAqB,EAC3B,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,CACjB,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,CACrC,EAAE,EACF;QACE,IAAI,EAAE,kBAAkB;QACxB,EAAE;QACF,KAAK,EAAE,cAAc;QACrB,MAAM;QACN,gBAAgB;QAChB,SAAS;QACT,MAAM;KACP,EACD,CAAC,cAAc,CAAC,CACjB,CAA2B,CAAC;IAE7B,yDAAyD;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAOjC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,QAAQ,CAAC,IAAI,EACb,CAAC,EACD,QAAQ,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,iBAAiB,CACjD,CAAC;IACF,MAAM,KAAK,GAAa;QACtB,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omero_codec_worker.d.ts","sourceRoot":"","sources":["../../src/workers/omero_codec_worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
/**
|
|
4
|
+
* Custom Web Worker that extends fizarrita's codec worker with OMERO
|
|
5
|
+
* statistics computation.
|
|
6
|
+
*
|
|
7
|
+
* Handles all standard fizarrita codec messages (init, decode, decode_into,
|
|
8
|
+
* encode) PLUS a new `decode_and_stats` message that decodes a chunk AND
|
|
9
|
+
* computes per-channel statistics in a single round-trip.
|
|
10
|
+
*
|
|
11
|
+
* Message protocol (superset of fizarrita's codec-worker):
|
|
12
|
+
* init: → init_ok (register codec pipeline metadata)
|
|
13
|
+
* decode: → decoded (decode raw bytes, return chunk)
|
|
14
|
+
* decode_into: → decode_into_ok (decode into SharedArrayBuffer)
|
|
15
|
+
* encode: → encoded (encode chunk data)
|
|
16
|
+
* decode_and_stats: → decoded_and_stats (decode + compute channel stats)
|
|
17
|
+
*/
|
|
18
|
+
// fizarrita internals for codec pipeline
|
|
19
|
+
import { create_codec_pipeline } from "@fideus-labs/fizarrita/internals/codec-pipeline";
|
|
20
|
+
import { compat_chunk, set_from_chunk_binary, } from "@fideus-labs/fizarrita/internals/setter";
|
|
21
|
+
import { get_ctr, get_strides } from "@fideus-labs/fizarrita/internals/util";
|
|
22
|
+
// ngff-zarr stats functions
|
|
23
|
+
import { createAccumulator, extractChannel, updateAccumulator, } from "../utils/compute_omero-shared.js";
|
|
24
|
+
// Use typeof self for cross-environment compatibility (Deno, Node.js, Browser workers)
|
|
25
|
+
// deno-lint-ignore no-explicit-any
|
|
26
|
+
const ctx = self;
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Edge chunk shape correction (same as fizarrita's codec-worker)
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function fixEdgeChunkShapeStride(chunk, actualChunkShape) {
|
|
31
|
+
if (actualChunkShape) {
|
|
32
|
+
const expectedElements = actualChunkShape.reduce((a, b) => a * b, 1);
|
|
33
|
+
const actualElements = chunk.data.length;
|
|
34
|
+
if (actualElements === expectedElements) {
|
|
35
|
+
return {
|
|
36
|
+
data: chunk.data,
|
|
37
|
+
shape: actualChunkShape,
|
|
38
|
+
stride: get_strides(actualChunkShape, "C"),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return chunk;
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Codec pipeline cache — keyed by metaId
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
const pipelineByMetaId = new Map();
|
|
48
|
+
const metaByMetaId = new Map();
|
|
49
|
+
const pipelineByKey = new Map();
|
|
50
|
+
function getPipeline(metaId) {
|
|
51
|
+
const pipeline = pipelineByMetaId.get(metaId);
|
|
52
|
+
if (!pipeline) {
|
|
53
|
+
throw new Error(`No pipeline for metaId ${metaId}. Send an 'init' message first.`);
|
|
54
|
+
}
|
|
55
|
+
return pipeline;
|
|
56
|
+
}
|
|
57
|
+
function getOrCreatePipelineLegacy(meta) {
|
|
58
|
+
const key = JSON.stringify(meta);
|
|
59
|
+
let pipeline = pipelineByKey.get(key);
|
|
60
|
+
if (!pipeline) {
|
|
61
|
+
pipeline = create_codec_pipeline({
|
|
62
|
+
data_type: meta.data_type,
|
|
63
|
+
shape: meta.chunk_shape,
|
|
64
|
+
codecs: meta.codecs,
|
|
65
|
+
});
|
|
66
|
+
pipelineByKey.set(key, pipeline);
|
|
67
|
+
}
|
|
68
|
+
return pipeline;
|
|
69
|
+
}
|
|
70
|
+
ctx.addEventListener("message", async (event) => {
|
|
71
|
+
const msg = event.data;
|
|
72
|
+
try {
|
|
73
|
+
if (msg.type === "init") {
|
|
74
|
+
metaByMetaId.set(msg.metaId, msg.meta);
|
|
75
|
+
const pipeline = create_codec_pipeline({
|
|
76
|
+
data_type: msg.meta.data_type,
|
|
77
|
+
shape: msg.meta.chunk_shape,
|
|
78
|
+
codecs: msg.meta.codecs,
|
|
79
|
+
});
|
|
80
|
+
pipelineByMetaId.set(msg.metaId, pipeline);
|
|
81
|
+
ctx.postMessage({ type: "init_ok", id: msg.id });
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (msg.type === "decode") {
|
|
85
|
+
const pipeline = msg.metaId !== undefined && pipelineByMetaId.has(msg.metaId)
|
|
86
|
+
? getPipeline(msg.metaId)
|
|
87
|
+
: getOrCreatePipelineLegacy(msg.meta);
|
|
88
|
+
const bytes = new Uint8Array(msg.bytes);
|
|
89
|
+
let chunk = (await pipeline.decode(bytes));
|
|
90
|
+
chunk = fixEdgeChunkShapeStride(chunk, msg.actualChunkShape);
|
|
91
|
+
const dataView = chunk.data;
|
|
92
|
+
const buffer = dataView.buffer;
|
|
93
|
+
const byteOffset = dataView.byteOffset;
|
|
94
|
+
const byteLength = dataView.byteLength;
|
|
95
|
+
let transferBuffer;
|
|
96
|
+
if (byteOffset === 0 && byteLength === buffer.byteLength) {
|
|
97
|
+
transferBuffer = buffer;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
transferBuffer = buffer.slice(byteOffset, byteOffset + byteLength);
|
|
101
|
+
}
|
|
102
|
+
ctx.postMessage({
|
|
103
|
+
type: "decoded",
|
|
104
|
+
id: msg.id,
|
|
105
|
+
data: transferBuffer,
|
|
106
|
+
shape: chunk.shape,
|
|
107
|
+
stride: chunk.stride,
|
|
108
|
+
}, [transferBuffer]);
|
|
109
|
+
}
|
|
110
|
+
else if (msg.type === "decode_into") {
|
|
111
|
+
const pipeline = getPipeline(msg.metaId);
|
|
112
|
+
const bytes = new Uint8Array(msg.bytes);
|
|
113
|
+
let chunk = (await pipeline.decode(bytes));
|
|
114
|
+
chunk = fixEdgeChunkShapeStride(chunk, msg.actualChunkShape);
|
|
115
|
+
const destView = new Uint8Array(msg.output, 0, msg.outputByteLength);
|
|
116
|
+
// deno-lint-ignore no-explicit-any
|
|
117
|
+
const src = compat_chunk(chunk);
|
|
118
|
+
set_from_chunk_binary({ data: destView, stride: msg.outputStride }, src, msg.bytesPerElement, msg.projections);
|
|
119
|
+
ctx.postMessage({ type: "decode_into_ok", id: msg.id });
|
|
120
|
+
}
|
|
121
|
+
else if (msg.type === "encode") {
|
|
122
|
+
let pipeline;
|
|
123
|
+
let meta;
|
|
124
|
+
if (msg.metaId !== undefined && pipelineByMetaId.has(msg.metaId)) {
|
|
125
|
+
pipeline = getPipeline(msg.metaId);
|
|
126
|
+
meta = metaByMetaId.get(msg.metaId);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
meta = msg.meta;
|
|
130
|
+
pipeline = getOrCreatePipelineLegacy(meta);
|
|
131
|
+
}
|
|
132
|
+
const Ctr = get_ctr(meta.data_type);
|
|
133
|
+
const data = new Ctr(msg.data, 0, msg.data.byteLength / Ctr.BYTES_PER_ELEMENT);
|
|
134
|
+
const shape = meta.chunk_shape;
|
|
135
|
+
const stride = get_strides(shape, "C");
|
|
136
|
+
const chunk = { data, shape, stride };
|
|
137
|
+
// deno-lint-ignore no-explicit-any
|
|
138
|
+
const encoded = await pipeline.encode(chunk);
|
|
139
|
+
const transferBuffer = encoded.byteOffset === 0 &&
|
|
140
|
+
encoded.byteLength === encoded.buffer.byteLength
|
|
141
|
+
? encoded.buffer
|
|
142
|
+
: encoded.buffer.slice(encoded.byteOffset, encoded.byteOffset + encoded.byteLength);
|
|
143
|
+
ctx.postMessage({
|
|
144
|
+
type: "encoded",
|
|
145
|
+
id: msg.id,
|
|
146
|
+
bytes: transferBuffer,
|
|
147
|
+
}, [transferBuffer]);
|
|
148
|
+
}
|
|
149
|
+
else if (msg.type === "decode_and_stats") {
|
|
150
|
+
// NEW: Decode chunk AND compute per-channel statistics in one pass
|
|
151
|
+
const pipeline = getPipeline(msg.metaId);
|
|
152
|
+
const bytes = new Uint8Array(msg.bytes);
|
|
153
|
+
let chunk = (await pipeline.decode(bytes));
|
|
154
|
+
chunk = fixEdgeChunkShapeStride(chunk, msg.actualChunkShape);
|
|
155
|
+
const chunkData = chunk.data;
|
|
156
|
+
const chunkShape = chunk.shape;
|
|
157
|
+
const { nChannels, cIndex } = msg;
|
|
158
|
+
// Compute per-channel statistics
|
|
159
|
+
const accumulators = [];
|
|
160
|
+
if (cIndex >= 0) {
|
|
161
|
+
// Multi-channel: extract each channel and compute stats
|
|
162
|
+
for (let ch = 0; ch < nChannels; ch++) {
|
|
163
|
+
const channelData = extractChannel(chunkData, chunkShape, ch, cIndex);
|
|
164
|
+
const acc = createAccumulator();
|
|
165
|
+
updateAccumulator(acc, channelData);
|
|
166
|
+
accumulators.push(acc);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// Single channel: compute stats on full chunk data
|
|
171
|
+
const acc = createAccumulator();
|
|
172
|
+
updateAccumulator(acc, chunkData);
|
|
173
|
+
accumulators.push(acc);
|
|
174
|
+
}
|
|
175
|
+
// Transfer the decoded data buffer back for caching
|
|
176
|
+
const dataView = chunk.data;
|
|
177
|
+
const buffer = dataView.buffer;
|
|
178
|
+
const byteOffset = dataView.byteOffset;
|
|
179
|
+
const byteLength = dataView.byteLength;
|
|
180
|
+
let transferBuffer;
|
|
181
|
+
if (byteOffset === 0 && byteLength === buffer.byteLength) {
|
|
182
|
+
transferBuffer = buffer;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
transferBuffer = buffer.slice(byteOffset, byteOffset + byteLength);
|
|
186
|
+
}
|
|
187
|
+
ctx.postMessage({
|
|
188
|
+
type: "decoded_and_stats",
|
|
189
|
+
id: msg.id,
|
|
190
|
+
data: transferBuffer,
|
|
191
|
+
shape: chunk.shape,
|
|
192
|
+
stride: chunk.stride,
|
|
193
|
+
accumulators,
|
|
194
|
+
}, [transferBuffer]);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
// Send error back to main thread
|
|
199
|
+
const errorType = msg.type === "decode"
|
|
200
|
+
? "decoded"
|
|
201
|
+
: msg.type === "encode"
|
|
202
|
+
? "encoded"
|
|
203
|
+
: msg.type === "decode_into"
|
|
204
|
+
? "decode_into_ok"
|
|
205
|
+
: msg.type === "decode_and_stats"
|
|
206
|
+
? "decoded_and_stats"
|
|
207
|
+
: "init_ok";
|
|
208
|
+
ctx.postMessage({
|
|
209
|
+
type: errorType,
|
|
210
|
+
id: msg.id,
|
|
211
|
+
error: error instanceof Error ? error.message : String(error),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=omero_codec_worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omero_codec_worker.js","sourceRoot":"","sources":["../../src/workers/omero_codec_worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fideus-labs/ngff-zarr",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "TypeScript implementation of ngff-zarr for reading and writing OME-Zarr files",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -69,10 +69,9 @@
|
|
|
69
69
|
"LICENSE.txt"
|
|
70
70
|
],
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@fideus-labs/fizarrita": "^1.
|
|
72
|
+
"@fideus-labs/fizarrita": "^1.3.0",
|
|
73
73
|
"@fideus-labs/worker-pool": "^1.0.0",
|
|
74
74
|
"@itk-wasm/downsample": "^1.8.1",
|
|
75
|
-
"comlink": "^4.4.2",
|
|
76
75
|
"itk-wasm": "^1.0.0-b.196",
|
|
77
76
|
"@zarrita/storage": "^0.1.4",
|
|
78
77
|
"zod": "^4.0.2",
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { NgffImage } from "../types/ngff_image.js";
|
|
2
|
-
import type { Multiscales } from "../types/multiscales.js";
|
|
3
|
-
import type { Omero } from "../types/zarr_metadata.js";
|
|
4
|
-
import { type ComputeOmeroFromMultiscalesOptions, type ComputeOmeroOptions } from "./compute_omero-shared.js";
|
|
5
|
-
export { type ComputeOmeroFromMultiscalesOptions, type ComputeOmeroOptions, getDefaultColors, GLASBEY_COLORS, } from "./compute_omero-shared.js";
|
|
6
|
-
/**
|
|
7
|
-
* Compute OMERO metadata from an NgffImage using WebWorker.
|
|
8
|
-
*
|
|
9
|
-
* This function computes visualization parameters (OMERO metadata) from image data:
|
|
10
|
-
* - min/max: The actual data range
|
|
11
|
-
* - start/end: Display window based on quantiles (default 2% and 98%)
|
|
12
|
-
*
|
|
13
|
-
* For multi-channel images (with 'c' dimension), statistics are computed
|
|
14
|
-
* separately for each channel, resulting in per-channel OMERO windows.
|
|
15
|
-
*
|
|
16
|
-
* The computation is performed in a WebWorker to avoid blocking the main thread.
|
|
17
|
-
* If WebWorkers are not available, falls back to main thread computation.
|
|
18
|
-
*
|
|
19
|
-
* @param image - The NgffImage to compute metadata for
|
|
20
|
-
* @param options - Optional configuration for quantiles, colors, and labels
|
|
21
|
-
* @returns Promise resolving to Omero metadata with computed window parameters
|
|
22
|
-
*/
|
|
23
|
-
export declare function computeOmeroFromNgffImage(image: NgffImage, options?: ComputeOmeroOptions): Promise<Omero>;
|
|
24
|
-
/**
|
|
25
|
-
* Compute OMERO metadata from a Multiscales object using WebWorker.
|
|
26
|
-
*
|
|
27
|
-
* This is a convenience function that computes OMERO metadata from the
|
|
28
|
-
* highest or lowest resolution image in a multiscales pyramid.
|
|
29
|
-
*
|
|
30
|
-
* @param multiscales - The Multiscales object to compute metadata for
|
|
31
|
-
* @param options - Optional configuration for quantiles, colors, labels, and resolution
|
|
32
|
-
* @returns Promise resolving to Omero metadata with computed window parameters
|
|
33
|
-
*/
|
|
34
|
-
export declare function computeOmeroFromMultiscales(multiscales: Multiscales, options?: ComputeOmeroFromMultiscalesOptions): Promise<Omero>;
|
|
35
|
-
/**
|
|
36
|
-
* Terminate the OMERO computation worker and release resources.
|
|
37
|
-
* Call this when you're done with OMERO computations to free memory.
|
|
38
|
-
*/
|
|
39
|
-
export declare function terminateOmeroWorker(): void;
|
|
40
|
-
/**
|
|
41
|
-
* Check if the OMERO computation will use a WebWorker.
|
|
42
|
-
* Useful for testing or conditional logic.
|
|
43
|
-
*/
|
|
44
|
-
export declare function isUsingWorker(): boolean;
|
|
45
|
-
//# sourceMappingURL=compute_omero-browser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compute_omero-browser.d.ts","sourceRoot":"","sources":["../../src/utils/compute_omero-browser.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAEL,KAAK,kCAAkC,EACvC,KAAK,mBAAmB,EAKzB,MAAM,2BAA2B,CAAC;AAInC,OAAO,EACL,KAAK,kCAAkC,EACvC,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,cAAc,GACf,MAAM,2BAA2B,CAAC;AAsHnC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,KAAK,CAAC,CA0FhB;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,kCAAuC,GAC/C,OAAO,CAAC,KAAK,CAAC,CAwBhB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAa3C;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC"}
|