@gmod/bam 7.8.2 → 7.9.1
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/README.md +2 -2
- package/dist/bai.js +42 -17
- package/dist/bai.js.map +1 -1
- package/dist/bamFile.d.ts +5 -1
- package/dist/bamFile.js +155 -35
- package/dist/bamFile.js.map +1 -1
- package/dist/csi.js +20 -0
- package/dist/csi.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/indexFile.d.ts +32 -1
- package/dist/indexFile.js +70 -8
- package/dist/indexFile.js.map +1 -1
- package/dist/record.d.ts +16 -5
- package/dist/record.js +151 -13
- package/dist/record.js.map +1 -1
- package/dist/util.d.ts +30 -0
- package/dist/util.js +46 -13
- package/dist/util.js.map +1 -1
- package/esm/bai.js +42 -17
- package/esm/bai.js.map +1 -1
- package/esm/bamFile.d.ts +5 -1
- package/esm/bamFile.js +156 -36
- package/esm/bamFile.js.map +1 -1
- package/esm/csi.js +20 -0
- package/esm/csi.js.map +1 -1
- package/esm/index.d.ts +3 -1
- package/esm/indexFile.d.ts +32 -1
- package/esm/indexFile.js +71 -9
- package/esm/indexFile.js.map +1 -1
- package/esm/record.d.ts +16 -5
- package/esm/record.js +151 -13
- package/esm/record.js.map +1 -1
- package/esm/util.d.ts +30 -0
- package/esm/util.js +45 -13
- package/esm/util.js.map +1 -1
- package/package.json +4 -2
- package/src/bai.ts +43 -17
- package/src/bamFile.ts +177 -45
- package/src/csi.ts +20 -0
- package/src/index.ts +6 -1
- package/src/indexFile.ts +75 -9
- package/src/record.ts +152 -20
- package/src/util.ts +46 -13
package/dist/util.js
CHANGED
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.throwIfAborted = throwIfAborted;
|
|
6
7
|
exports.optimizeChunks = optimizeChunks;
|
|
7
8
|
exports.parsePseudoBin = parsePseudoBin;
|
|
8
9
|
exports.clampChunkEnds = clampChunkEnds;
|
|
@@ -13,6 +14,43 @@ exports.concatUint8Array = concatUint8Array;
|
|
|
13
14
|
exports.appendInRange = appendInRange;
|
|
14
15
|
const chunk_ts_1 = __importDefault(require("./chunk.js"));
|
|
15
16
|
const virtualOffset_ts_1 = require("./virtualOffset.js");
|
|
17
|
+
/**
|
|
18
|
+
* Merge and order the chunks a query resolved to.
|
|
19
|
+
*
|
|
20
|
+
* Takes ownership of `chunks`: with no `lowest` to pre-filter against it sorts
|
|
21
|
+
* the array IN PLACE rather than copying. Every caller builds a fresh array to
|
|
22
|
+
* hand over, which is what makes that safe — passing something you still hold,
|
|
23
|
+
* or anything reachable from the index's per-refId cache, would reorder it
|
|
24
|
+
* underneath you. (The Chunk objects themselves are never mutated; a merged
|
|
25
|
+
* span produces a new instance.)
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* `signal.throwIfAborted()`, without requiring either that method or `reason`.
|
|
29
|
+
*
|
|
30
|
+
* Two reasons not to call the built-in directly. It assumes a *real*
|
|
31
|
+
* `AbortSignal`, and callers pass duck-typed ones — `test/csi.test.ts` casts a
|
|
32
|
+
* bare `{ aborted }` through `as AbortSignal`, which is a fair model of what
|
|
33
|
+
* consumers do; calling a missing method there is a `TypeError` rather than the
|
|
34
|
+
* cancellation the caller asked for, which is a strictly worse failure.
|
|
35
|
+
*
|
|
36
|
+
* And it sets a browser floor. `AbortSignal.prototype.throwIfAborted` and
|
|
37
|
+
* `AbortSignal.reason` are Safari 15.4 / Chrome 100 / Firefox 97 (March 2022) —
|
|
38
|
+
* higher than anything else in this dependency tree needs, since
|
|
39
|
+
* `generic-filehandle2` only ever forwards a signal to `fetch`, and higher than
|
|
40
|
+
* every sibling gmod library, which use plain `.aborted`. Three lines here
|
|
41
|
+
* keeps that floor where it was.
|
|
42
|
+
*
|
|
43
|
+
* Faithful to the spec otherwise: an aborted signal throws its `reason`
|
|
44
|
+
* whatever that is, and only synthesizes an `AbortError` when there is none.
|
|
45
|
+
*/
|
|
46
|
+
function throwIfAborted(signal) {
|
|
47
|
+
if (signal?.aborted) {
|
|
48
|
+
const { reason } = signal;
|
|
49
|
+
throw reason === undefined
|
|
50
|
+
? new DOMException('This operation was aborted', 'AbortError')
|
|
51
|
+
: reason;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
16
54
|
function optimizeChunks(chunks, lowest) {
|
|
17
55
|
const n = chunks.length;
|
|
18
56
|
if (n === 0) {
|
|
@@ -147,19 +185,14 @@ function clampChunkEnds(chunks, extraBoundaries = []) {
|
|
|
147
185
|
if (chunks.length === 0) {
|
|
148
186
|
return;
|
|
149
187
|
}
|
|
150
|
-
// A plain array, sized
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
// real .bai shapes (min of 21, interleaved, sign-stable over 3 runs):
|
|
159
|
-
// building with push instead is 5-8% slower here, and a Float64Array is
|
|
160
|
-
// faster to sort but allocates per reference, which costs 1.7x on an
|
|
161
|
-
// assembly with 28751 scaffolds. Filling by index also avoids the
|
|
162
|
-
// intermediate array that mapping the linear index used to build.
|
|
188
|
+
// A plain array, pre-sized and filled by index. Measured against both
|
|
189
|
+
// alternatives on five real .bai shapes (min of 21, interleaved, sign-stable
|
|
190
|
+
// over 3 runs): building with push instead is 5-8% slower, and a
|
|
191
|
+
// Float64Array is faster to sort but allocates per reference, which costs
|
|
192
|
+
// 1.7x on an assembly with tens of thousands of unplaced scaffolds
|
|
193
|
+
// (cho.bam.bai has 28751 references, each with a handful of boundaries).
|
|
194
|
+
// Filling by index also avoids the intermediate array that mapping the
|
|
195
|
+
// linear index to block positions used to build.
|
|
163
196
|
const boundaries = new Array(extraBoundaries.length + chunks.length * 2);
|
|
164
197
|
let n = 0;
|
|
165
198
|
for (let i = 0, l = extraBoundaries.length; i < l; i++) {
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/esm/bai.js
CHANGED
|
@@ -9,15 +9,36 @@ const BAI_MAGIC = 21578050; // BAI\1
|
|
|
9
9
|
// https://github.com/samtools/hts-specs/blob/master/SAMv1.pdf
|
|
10
10
|
const BAI_LINEAR_SHIFT = 14;
|
|
11
11
|
const BAI_LINEAR_INTERVAL = 1 << BAI_LINEAR_SHIFT; // 16384
|
|
12
|
+
const BAI_DEPTH = 5;
|
|
13
|
+
// Highest coordinate the scheme addresses: the deepest level's bins are
|
|
14
|
+
// BAI_LINEAR_INTERVAL wide and there are 8^BAI_DEPTH of them.
|
|
15
|
+
const BAI_MAX_POS = 2 ** (BAI_LINEAR_SHIFT + BAI_DEPTH * 3); // 2^29
|
|
12
16
|
function roundDown(n, multiple) {
|
|
13
17
|
return n - (n % multiple);
|
|
14
18
|
}
|
|
19
|
+
// Note the `rem === 0` case: without it a coordinate already on a window
|
|
20
|
+
// boundary rounds up a whole extra window, which is enough to push indexCov's
|
|
21
|
+
// range past the end of the linear index.
|
|
15
22
|
function roundUp(n, multiple) {
|
|
16
|
-
|
|
23
|
+
const rem = n % multiple;
|
|
24
|
+
return rem === 0 ? n : n - rem + multiple;
|
|
17
25
|
}
|
|
18
26
|
// Compute bin ranges that overlap [beg, end). Each level's first-bin offset
|
|
19
27
|
// is (8^L - 1) / 7. See SAMv1.pdf §5.1.1 for the binning derivation.
|
|
20
28
|
function reg2bins(beg, end) {
|
|
29
|
+
// Clamp to what the scheme can address, the way CSI's reg2bins clamps to
|
|
30
|
+
// its own. The shifts below are the `>>` operator, so a coordinate past
|
|
31
|
+
// 2^31 wraps to a negative bin number and every level yields an empty
|
|
32
|
+
// range: `getRecordsForRange(chr, 0, 2**32)` — a caller asking for a whole
|
|
33
|
+
// reference without knowing its length — came back with NO records at all
|
|
34
|
+
// rather than all of them. Clamping is also what keeps a merely-large end
|
|
35
|
+
// from walking ~130k absent bin numbers before finding the same chunks.
|
|
36
|
+
if (beg > BAI_MAX_POS) {
|
|
37
|
+
beg = BAI_MAX_POS;
|
|
38
|
+
}
|
|
39
|
+
if (end > BAI_MAX_POS) {
|
|
40
|
+
end = BAI_MAX_POS;
|
|
41
|
+
}
|
|
21
42
|
end -= 1;
|
|
22
43
|
return [
|
|
23
44
|
[0, 0],
|
|
@@ -37,8 +58,7 @@ export default class BAI extends IndexFile {
|
|
|
37
58
|
throw new Error('Not a BAI file');
|
|
38
59
|
}
|
|
39
60
|
const refCount = dataView.getInt32(4, true);
|
|
40
|
-
const
|
|
41
|
-
const binLimit = ((1 << ((depth + 1) * 3)) - 1) / 7;
|
|
61
|
+
const binLimit = ((1 << ((BAI_DEPTH + 1) * 3)) - 1) / 7;
|
|
42
62
|
// read the indexes for each reference sequence
|
|
43
63
|
let curr = 8;
|
|
44
64
|
let firstDataLine;
|
|
@@ -59,11 +79,9 @@ export default class BAI extends IndexFile {
|
|
|
59
79
|
}
|
|
60
80
|
else {
|
|
61
81
|
const chunkCount = dataView.getInt32(curr, true);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
curr += 8;
|
|
66
|
-
}
|
|
82
|
+
// 16 bytes per chunk (two virtual offsets); the first pass only
|
|
83
|
+
// needs to step over them. Same shape as csi.ts's first pass.
|
|
84
|
+
curr += 4 + 16 * chunkCount;
|
|
67
85
|
}
|
|
68
86
|
}
|
|
69
87
|
// walk the linear index to find the smallest virtual offset, which
|
|
@@ -145,7 +163,6 @@ export default class BAI extends IndexFile {
|
|
|
145
163
|
}
|
|
146
164
|
async indexCov(seqId, start, end, opts) {
|
|
147
165
|
const v = BAI_LINEAR_INTERVAL;
|
|
148
|
-
const range = start !== undefined;
|
|
149
166
|
const indexData = await this.parse(opts);
|
|
150
167
|
const seqIdx = indexData.indices(seqId);
|
|
151
168
|
if (!seqIdx) {
|
|
@@ -156,15 +173,23 @@ export default class BAI extends IndexFile {
|
|
|
156
173
|
if (nintv === 0) {
|
|
157
174
|
return [];
|
|
158
175
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
176
|
+
// The linear index describes [0, indexEnd): each window's score is the gap
|
|
177
|
+
// to the NEXT entry, so the final entry is a boundary rather than a window
|
|
178
|
+
// of its own. Both ends are clamped to it instead of throwing, so a range
|
|
179
|
+
// query returns the part of the reference the index covers — asking for the
|
|
180
|
+
// whole reference by its length (`indexCov(ref, 0, ctgLength)`, the obvious
|
|
181
|
+
// call, and one where end lands in the last window) used to throw "query
|
|
182
|
+
// outside of range of linear index" while `indexCov(ref)` answered fine.
|
|
183
|
+
const indexEnd = (nintv - 1) * v;
|
|
184
|
+
const s = start === undefined
|
|
185
|
+
? 0
|
|
186
|
+
: Math.min(Math.max(roundDown(start, v), 0), indexEnd);
|
|
187
|
+
const e = end === undefined ? indexEnd : Math.min(roundUp(end, v), indexEnd);
|
|
188
|
+
if (e <= s) {
|
|
189
|
+
return [];
|
|
167
190
|
}
|
|
191
|
+
const depths = new Array((e - s) / v);
|
|
192
|
+
const totalSize = linearBlockPositions[nintv - 1];
|
|
168
193
|
// Scale the block-delta into a read count as we go, rather than building the
|
|
169
194
|
// entries and then rebuilding every one of them to apply the scale. Keep the
|
|
170
195
|
// multiply-then-divide order: hoisting lineCount/totalSize into a factor
|
package/esm/bai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bai.js","sourceRoot":"","sources":["../src/bai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,SAAS,EAAE,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAmB9C,MAAM,eAAe,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAA;AAM3C,MAAM,SAAS,GAAG,QAAQ,CAAA,CAAC,QAAQ;AAEnC,4EAA4E;AAC5E,gDAAgD;AAChD,8DAA8D;AAC9D,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAC3B,MAAM,mBAAmB,GAAG,CAAC,IAAI,gBAAgB,CAAA,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"bai.js","sourceRoot":"","sources":["../src/bai.ts"],"names":[],"mappings":"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"}
|
package/esm/bamFile.d.ts
CHANGED
|
@@ -23,14 +23,17 @@ interface ChunkEntry<T> {
|
|
|
23
23
|
}
|
|
24
24
|
export declare const DEFAULT_MAX_CACHE_BYTES: number;
|
|
25
25
|
declare class ChunkFeatureCache<T> {
|
|
26
|
-
|
|
26
|
+
private _maxBytes;
|
|
27
27
|
private entries;
|
|
28
28
|
private bytes;
|
|
29
29
|
constructor(maxBytes: number);
|
|
30
|
+
get maxBytes(): number;
|
|
31
|
+
set maxBytes(maxBytes: number);
|
|
30
32
|
get size(): number;
|
|
31
33
|
get byteSize(): number;
|
|
32
34
|
get(key: string): ChunkEntry<T> | undefined;
|
|
33
35
|
set(key: string, entry: ChunkEntry<T>): void;
|
|
36
|
+
private evict;
|
|
34
37
|
delete(key: string): void;
|
|
35
38
|
clear(): void;
|
|
36
39
|
[Symbol.iterator](): MapIterator<[string, ChunkEntry<T>]>;
|
|
@@ -106,6 +109,7 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
106
109
|
*/
|
|
107
110
|
getRecordsForRange(chr: string, min: number, max: number, opts?: BamOpts): Promise<T[]>;
|
|
108
111
|
private _startChunkRead;
|
|
112
|
+
private joinChunkRead;
|
|
109
113
|
private _cachedChunkFeatures;
|
|
110
114
|
private _fetchChunkFeatures;
|
|
111
115
|
fetchPairs(chrId: number, records: T[], opts: BamOpts): Promise<T[]>;
|
package/esm/bamFile.js
CHANGED
|
@@ -6,13 +6,16 @@ import CSI from "./csi.js";
|
|
|
6
6
|
import NullFilehandle from "./nullFilehandle.js";
|
|
7
7
|
import BAMFeature from "./record.js";
|
|
8
8
|
import { parseHeaderText } from "./sam.js";
|
|
9
|
-
import { appendInRange, parseRefSeqs } from "./util.js";
|
|
9
|
+
import { appendInRange, parseRefSeqs, throwIfAborted } from "./util.js";
|
|
10
10
|
export const BAM_MAGIC = 21840194;
|
|
11
11
|
const blockLen = 1 << 16;
|
|
12
|
-
// Ceiling on the header read. A million contigs is roughly 10MB of
|
|
13
|
-
// @SQ lines and ref-seq table, so
|
|
14
|
-
// claiming a huge n_ref rather than a real one, and
|
|
15
|
-
// just downloads the file.
|
|
12
|
+
// Ceiling on GROWING the header read. A million contigs is roughly 10MB of
|
|
13
|
+
// compressed @SQ lines and ref-seq table, so a read that has doubled past this
|
|
14
|
+
// is chasing a corrupt header claiming a huge n_ref rather than a real one, and
|
|
15
|
+
// growing further just downloads the file. It does not cap the FIRST read: that
|
|
16
|
+
// length comes from the index's firstDataLine, which is a real offset rather
|
|
17
|
+
// than a guess, so a header that genuinely runs past this still gets its one
|
|
18
|
+
// exact read. See getHeaderPre.
|
|
16
19
|
const maxHeaderReadLen = 32 * 1024 * 1024;
|
|
17
20
|
function resolveFilehandle(filehandle, path, url) {
|
|
18
21
|
return (filehandle ??
|
|
@@ -59,11 +62,21 @@ export const DEFAULT_MAX_CACHE_BYTES = 100 * 1024 * 1024;
|
|
|
59
62
|
// nothing on the transport that matters and only widens peak memory.
|
|
60
63
|
const MAX_CONCURRENT_CHUNK_READS = 6;
|
|
61
64
|
class ChunkFeatureCache {
|
|
62
|
-
|
|
65
|
+
_maxBytes;
|
|
63
66
|
entries = new Map();
|
|
64
67
|
bytes = 0;
|
|
65
68
|
constructor(maxBytes) {
|
|
66
|
-
this.
|
|
69
|
+
this._maxBytes = maxBytes;
|
|
70
|
+
}
|
|
71
|
+
get maxBytes() {
|
|
72
|
+
return this._maxBytes;
|
|
73
|
+
}
|
|
74
|
+
// Accessor rather than a plain field so lowering the budget frees memory now.
|
|
75
|
+
// As a field, a caller trimming the cache under memory pressure got nothing
|
|
76
|
+
// back until the next chunk read happened to call set().
|
|
77
|
+
set maxBytes(maxBytes) {
|
|
78
|
+
this._maxBytes = maxBytes;
|
|
79
|
+
this.evict();
|
|
67
80
|
}
|
|
68
81
|
get size() {
|
|
69
82
|
return this.entries.size;
|
|
@@ -84,11 +97,14 @@ class ChunkFeatureCache {
|
|
|
84
97
|
this.delete(key);
|
|
85
98
|
this.entries.set(key, entry);
|
|
86
99
|
this.bytes += entry.bytes;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
100
|
+
this.evict();
|
|
101
|
+
}
|
|
102
|
+
// Evict from the least-recently-used end. The size > 1 guard means a single
|
|
103
|
+
// chunk larger than the whole budget is still kept: the caller needs it for
|
|
104
|
+
// the query in flight, and dropping it would only force a re-decompress.
|
|
105
|
+
evict() {
|
|
90
106
|
const lru = this.entries.keys();
|
|
91
|
-
while (this.bytes > this.
|
|
107
|
+
while (this.bytes > this._maxBytes && this.entries.size > 1) {
|
|
92
108
|
this.delete(lru.next().value);
|
|
93
109
|
}
|
|
94
110
|
}
|
|
@@ -171,16 +187,21 @@ export default class BamFile {
|
|
|
171
187
|
let readLen = indexData.firstDataLine === undefined
|
|
172
188
|
? blockLen
|
|
173
189
|
: indexData.firstDataLine.blockPosition + blockLen;
|
|
190
|
+
// do/while, so the index-derived length is always read once and only the
|
|
191
|
+
// doubling is bounded. Testing readLen before the first read instead meant
|
|
192
|
+
// a BAM whose header genuinely exceeds maxHeaderReadLen — millions of
|
|
193
|
+
// contigs — was rejected without a single byte being fetched, and reported
|
|
194
|
+
// as 'Insufficient data for reference sequences' when the data was there.
|
|
174
195
|
let samHeader;
|
|
175
|
-
let atEof
|
|
176
|
-
|
|
196
|
+
let atEof;
|
|
197
|
+
do {
|
|
177
198
|
const buffer = await this.bam.read(readLen, 0, { signal: opts.signal });
|
|
178
199
|
// a short read means readLen ran past the end of the file, so there are
|
|
179
200
|
// no more bytes to grow into
|
|
180
201
|
atEof = buffer.length < readLen;
|
|
181
202
|
samHeader = this.applyHeader(await unzip(buffer));
|
|
182
203
|
readLen *= 2;
|
|
183
|
-
}
|
|
204
|
+
} while (samHeader === undefined && !atEof && readLen <= maxHeaderReadLen);
|
|
184
205
|
if (samHeader === undefined) {
|
|
185
206
|
throw new Error('Insufficient data for reference sequences');
|
|
186
207
|
}
|
|
@@ -238,6 +259,7 @@ export default class BamFile {
|
|
|
238
259
|
* it for every other query still holding that read. See ADR 0006.
|
|
239
260
|
*/
|
|
240
261
|
async getRecordsForRange(chr, min, max, opts) {
|
|
262
|
+
throwIfAborted(opts?.signal);
|
|
241
263
|
const chrId = await this.getSeqId(chr, opts);
|
|
242
264
|
if (chrId === undefined || !this.index) {
|
|
243
265
|
return [];
|
|
@@ -247,23 +269,83 @@ export default class BamFile {
|
|
|
247
269
|
}
|
|
248
270
|
// Read a chunk, publish it to the cache, and keep the in-flight promise
|
|
249
271
|
// discoverable while it runs.
|
|
250
|
-
|
|
251
|
-
|
|
272
|
+
//
|
|
273
|
+
// The read runs under this entry's own controller rather than any one
|
|
274
|
+
// caller's signal, because the read is shared: it must survive until every
|
|
275
|
+
// caller waiting on it has given up. joinChunkRead is what registers them.
|
|
276
|
+
_startChunkRead(cacheKey, chunk) {
|
|
277
|
+
const controller = new AbortController();
|
|
278
|
+
const promise = this._readChunkFeatures(chunk, {
|
|
279
|
+
signal: controller.signal,
|
|
280
|
+
}).then(entry => {
|
|
252
281
|
this.chunkFeatureCache.set(cacheKey, entry);
|
|
253
282
|
return entry;
|
|
254
283
|
});
|
|
255
|
-
const inFlight = {
|
|
284
|
+
const inFlight = {
|
|
285
|
+
promise,
|
|
286
|
+
signals: new Set(),
|
|
287
|
+
pinned: false,
|
|
288
|
+
controller,
|
|
289
|
+
dispose: new AbortController(),
|
|
290
|
+
settled: false,
|
|
291
|
+
};
|
|
256
292
|
this.inFlightChunks.set(cacheKey, inFlight);
|
|
257
|
-
//
|
|
258
|
-
//
|
|
259
|
-
// an unhandled rejection.
|
|
293
|
+
// `.then(f, f)` rather than `.finally(f)` so the handler's own promise never
|
|
294
|
+
// carries an unhandled rejection.
|
|
260
295
|
const clear = () => {
|
|
296
|
+
inFlight.settled = true;
|
|
297
|
+
// nothing reads these once the read has settled, and holding them would
|
|
298
|
+
// pin each caller's AbortController behind this entry
|
|
299
|
+
inFlight.dispose.abort();
|
|
300
|
+
inFlight.signals.clear();
|
|
301
|
+
// only clear our own entry: a later read for this chunk may have replaced it
|
|
261
302
|
if (this.inFlightChunks.get(cacheKey) === inFlight) {
|
|
262
303
|
this.inFlightChunks.delete(cacheKey);
|
|
263
304
|
}
|
|
264
305
|
};
|
|
265
306
|
promise.then(clear, clear);
|
|
266
|
-
return
|
|
307
|
+
return inFlight;
|
|
308
|
+
}
|
|
309
|
+
// Register a caller's interest, so the read survives until that caller has
|
|
310
|
+
// given up too.
|
|
311
|
+
//
|
|
312
|
+
// A caller with no signal cannot give up, so it pins the read: there is no
|
|
313
|
+
// longer any set of aborts that should stop it. That is the honest reading of
|
|
314
|
+
// a caller that never asked to be cancellable, and it means one signal-free
|
|
315
|
+
// query makes that chunk's read uncancellable for everyone joined to it.
|
|
316
|
+
joinChunkRead(inFlight, signal) {
|
|
317
|
+
if (signal === undefined) {
|
|
318
|
+
inFlight.pinned = true;
|
|
319
|
+
}
|
|
320
|
+
else if (signal.aborted) {
|
|
321
|
+
// A caller that has already given up is not a waiter, and must not be
|
|
322
|
+
// counted as one: an `abort` listener never fires on a signal that
|
|
323
|
+
// aborted before it was added, so nothing would ever take this signal
|
|
324
|
+
// back out of the set. The count would never reach zero and the read
|
|
325
|
+
// would be uncancellable for everyone joined to it, silently.
|
|
326
|
+
//
|
|
327
|
+
// `_cachedChunkFeatures` rejects such a caller before it reaches here,
|
|
328
|
+
// with no `await` in between, so this is unreachable today. It is here
|
|
329
|
+
// because this is the bug that shipped, and an invariant that fails this
|
|
330
|
+
// quietly should not rest on a check twenty lines away. `@gmod/cram`
|
|
331
|
+
// guards the same spot for the same reason; see its ADR 0003.
|
|
332
|
+
if (!inFlight.pinned && inFlight.signals.size === 0) {
|
|
333
|
+
inFlight.controller.abort(signal.reason);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else if (!inFlight.signals.has(signal)) {
|
|
337
|
+
// guarded so one signal joining twice — a viewAsPairs query reaching the
|
|
338
|
+
// same chunk for a read and for its mate — does not add two listeners
|
|
339
|
+
inFlight.signals.add(signal);
|
|
340
|
+
signal.addEventListener('abort', () => {
|
|
341
|
+
inFlight.signals.delete(signal);
|
|
342
|
+
if (!inFlight.pinned && inFlight.signals.size === 0) {
|
|
343
|
+
inFlight.controller.abort(signal.reason);
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
// `once` covers the abort firing; `dispose` covers it never firing
|
|
347
|
+
{ once: true, signal: inFlight.dispose.signal });
|
|
348
|
+
}
|
|
267
349
|
}
|
|
268
350
|
// Parsed records for a chunk, reading and decompressing it only on a miss.
|
|
269
351
|
// Every path that wants a chunk's features goes through here — mate lookups
|
|
@@ -276,6 +358,14 @@ export default class BamFile {
|
|
|
276
358
|
// each caller its own objects, but roughly doubles a warm query on dense data
|
|
277
359
|
// — measured, and rejected, in that ADR.
|
|
278
360
|
async _cachedChunkFeatures(chunk, opts) {
|
|
361
|
+
// Before anything else, including the cache hit. A caller reaches here with
|
|
362
|
+
// a signal that has already fired on the ordinary pan — the abort lands
|
|
363
|
+
// while blocksForRange is still reading the index, and nothing between
|
|
364
|
+
// there and here looks at it, since bai.ts and csi.ts never read the
|
|
365
|
+
// signal. Such a caller must not start a read it has no interest in, and
|
|
366
|
+
// must not be registered as a waiter on someone else's: see joinChunkRead.
|
|
367
|
+
// @gmod/cram checks in exactly this position, in SliceRecordCache.getOrFill.
|
|
368
|
+
throwIfAborted(opts.signal);
|
|
279
369
|
const cacheKey = chunkCacheKey(chunk);
|
|
280
370
|
const cached = this.chunkFeatureCache.get(cacheKey);
|
|
281
371
|
if (cached) {
|
|
@@ -286,23 +376,35 @@ export default class BamFile {
|
|
|
286
376
|
// they collapse onto very few chunk keys, so without this a query pays for
|
|
287
377
|
// the same inflate several times over — the dominant cost of a cold query
|
|
288
378
|
// (ADR 0003).
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
379
|
+
let pending = this.inFlightChunks.get(cacheKey);
|
|
380
|
+
// A read every caller has abandoned is on its way out but may not have
|
|
381
|
+
// noticed yet. Start a fresh one rather than joining one already doomed.
|
|
382
|
+
if (pending?.controller.signal.aborted && !pending.settled) {
|
|
383
|
+
if (this.inFlightChunks.get(cacheKey) === pending) {
|
|
384
|
+
this.inFlightChunks.delete(cacheKey);
|
|
385
|
+
}
|
|
386
|
+
pending = undefined;
|
|
387
|
+
}
|
|
388
|
+
pending ??= this._startChunkRead(cacheKey, chunk);
|
|
389
|
+
// Only a read still running has anything to cancel. Joining a settled one
|
|
390
|
+
// would add this caller to a set nothing will ever take it out of, since
|
|
391
|
+
// the entry drops its abort listeners when it settles.
|
|
392
|
+
if (!pending.settled) {
|
|
393
|
+
this.joinChunkRead(pending, opts.signal);
|
|
292
394
|
}
|
|
293
395
|
try {
|
|
294
|
-
|
|
396
|
+
const entry = await pending.promise;
|
|
397
|
+
// the read finished, but this caller gave up while waiting for it
|
|
398
|
+
throwIfAborted(opts.signal);
|
|
399
|
+
return entry.features;
|
|
295
400
|
}
|
|
296
401
|
catch (e) {
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
throw e;
|
|
304
|
-
}
|
|
305
|
-
return this._cachedChunkFeatures(chunk, opts);
|
|
402
|
+
// Prefer this caller's own cancellation to whatever the shared read
|
|
403
|
+
// reported. If we asked to stop, that is the answer we want — and when
|
|
404
|
+
// the read itself was cancelled it is because we, and everyone else,
|
|
405
|
+
// asked it to.
|
|
406
|
+
throwIfAborted(opts.signal);
|
|
407
|
+
throw e;
|
|
306
408
|
}
|
|
307
409
|
}
|
|
308
410
|
async _fetchChunkFeatures(chunks, chrId, min, max, opts = {}) {
|
|
@@ -447,8 +549,12 @@ export default class BamFile {
|
|
|
447
549
|
const mateRecs = [];
|
|
448
550
|
for (let i = 0, l = features.length; i < l; i++) {
|
|
449
551
|
const feature = features[i];
|
|
450
|
-
|
|
451
|
-
|
|
552
|
+
// fileOffset first: it is a number already on the record, where
|
|
553
|
+
// `name` decodes a string per record. A mate chunk usually overlaps
|
|
554
|
+
// the query region, so this skips the decode for every record the
|
|
555
|
+
// caller is already holding.
|
|
556
|
+
if (!readIds.has(feature.fileOffset) &&
|
|
557
|
+
readNameCounts.get(feature.name) === 1) {
|
|
452
558
|
mateRecs.push(feature);
|
|
453
559
|
}
|
|
454
560
|
}
|
|
@@ -468,6 +574,20 @@ export default class BamFile {
|
|
|
468
574
|
const buf = await this.bam.read(chunk.fetchedSize(), chunk.minv.blockPosition, {
|
|
469
575
|
signal: opts.signal,
|
|
470
576
|
});
|
|
577
|
+
// The last chance to bail before the expensive part, and the reason it is
|
|
578
|
+
// worth having: honouring the signal is optional in the filehandle.
|
|
579
|
+
// `RemoteFile` hands it to `fetch`, but `LocalFile.read(length, position)`
|
|
580
|
+
// does not even take an options argument, so every read under it runs to
|
|
581
|
+
// completion and arrives here with the cancellation unnoticed. Without this
|
|
582
|
+
// a fully abandoned chunk still gets inflated and decoded — measured at 6
|
|
583
|
+
// chunks for one 20kb query on out.bam — which is the dominant cost of a
|
|
584
|
+
// cold query (ADR 0003), spent on records nobody will ever look at.
|
|
585
|
+
//
|
|
586
|
+
// Safe precisely because this is the SHARED signal, not a caller's: it
|
|
587
|
+
// fires only once every waiter has given up, so there is never a live
|
|
588
|
+
// caller left to be denied the result. @gmod/cram checks in the same place
|
|
589
|
+
// and for the same reason, before the decode loop in `_fetchRecords`.
|
|
590
|
+
throwIfAborted(opts.signal);
|
|
471
591
|
const { buffer: data, cpositions, dpositions, } = await unzipChunkSlice(buf, chunk);
|
|
472
592
|
return {
|
|
473
593
|
features: this.readBamFeatures(data, cpositions, dpositions, chunk),
|