@gmod/bam 7.9.1 → 8.0.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/dist/bamFile.d.ts +31 -27
- package/dist/bamFile.js +80 -202
- package/dist/bamFile.js.map +1 -1
- package/dist/indexFile.d.ts +3 -3
- package/dist/indexFile.js +14 -12
- package/dist/indexFile.js.map +1 -1
- package/dist/util.d.ts +1 -21
- package/dist/util.js +6 -28
- package/dist/util.js.map +1 -1
- package/esm/bamFile.d.ts +31 -27
- package/esm/bamFile.js +80 -202
- package/esm/bamFile.js.map +1 -1
- package/esm/indexFile.d.ts +3 -3
- package/esm/indexFile.js +14 -12
- package/esm/indexFile.js.map +1 -1
- package/esm/util.d.ts +1 -21
- package/esm/util.js +4 -27
- package/esm/util.js.map +1 -1
- package/package.json +12 -11
- package/src/bamFile.ts +88 -235
- package/src/indexFile.ts +14 -12
- package/src/util.ts +4 -27
package/esm/indexFile.js
CHANGED
|
@@ -22,14 +22,14 @@ export function memoizeByRefId(getIndices, maxSize = 5) {
|
|
|
22
22
|
export default class IndexFile {
|
|
23
23
|
filehandle;
|
|
24
24
|
renameRefSeq;
|
|
25
|
-
|
|
25
|
+
parseP;
|
|
26
26
|
/**
|
|
27
|
-
* The signal `
|
|
27
|
+
* The signal `parseP` was started under, while it is still in flight. The
|
|
28
28
|
* index is parsed once and shared by every query against the file, so without
|
|
29
29
|
* this the first query to arrive would own a read all the others depend on —
|
|
30
30
|
* see {@link parse}.
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
parseSignal;
|
|
33
33
|
constructor({ filehandle, renameRefSeq = (n) => n, }) {
|
|
34
34
|
this.filehandle = filehandle;
|
|
35
35
|
this.renameRefSeq = renameRefSeq;
|
|
@@ -61,6 +61,8 @@ export default class IndexFile {
|
|
|
61
61
|
}
|
|
62
62
|
return optimizeChunks(chunks, this.getLowestChunk(ba, min));
|
|
63
63
|
}
|
|
64
|
+
// SYNC: ~/src/gmod/tabix-js/src/indexFile.ts parse — same owner-signal
|
|
65
|
+
// tracking and one-attempt retry, and the same reasoning below.
|
|
64
66
|
/**
|
|
65
67
|
* Parse the index, or join the parse already running.
|
|
66
68
|
*
|
|
@@ -86,12 +88,12 @@ export default class IndexFile {
|
|
|
86
88
|
*/
|
|
87
89
|
async parse(opts = {}, retried = false) {
|
|
88
90
|
throwIfAborted(opts.signal);
|
|
89
|
-
const pending = this.
|
|
91
|
+
const pending = this.parseP;
|
|
90
92
|
if (!pending) {
|
|
91
93
|
return this.startParse(opts);
|
|
92
94
|
}
|
|
93
95
|
// read before awaiting: the owner is forgotten as soon as the parse settles
|
|
94
|
-
const ownerSignal = this.
|
|
96
|
+
const ownerSignal = this.parseSignal;
|
|
95
97
|
try {
|
|
96
98
|
return await pending;
|
|
97
99
|
}
|
|
@@ -104,20 +106,20 @@ export default class IndexFile {
|
|
|
104
106
|
}
|
|
105
107
|
startParse(opts) {
|
|
106
108
|
const pending = this._parse(opts);
|
|
107
|
-
this.
|
|
108
|
-
this.
|
|
109
|
+
this.parseP = pending;
|
|
110
|
+
this.parseSignal = opts.signal;
|
|
109
111
|
// Drop a rejection rather than keeping it, so one transient failure does not
|
|
110
112
|
// poison the index for the lifetime of the file. Both branches are
|
|
111
113
|
// identity-checked so a retry started after this settles is not cleared by
|
|
112
114
|
// the attempt it already replaced.
|
|
113
115
|
pending.then(() => {
|
|
114
|
-
if (this.
|
|
115
|
-
this.
|
|
116
|
+
if (this.parseP === pending) {
|
|
117
|
+
this.parseSignal = undefined;
|
|
116
118
|
}
|
|
117
119
|
}, () => {
|
|
118
|
-
if (this.
|
|
119
|
-
this.
|
|
120
|
-
this.
|
|
120
|
+
if (this.parseP === pending) {
|
|
121
|
+
this.parseP = undefined;
|
|
122
|
+
this.parseSignal = undefined;
|
|
121
123
|
}
|
|
122
124
|
});
|
|
123
125
|
return pending;
|
package/esm/indexFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexFile.js","sourceRoot":"","sources":["../src/indexFile.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"indexFile.js","sourceRoot":"","sources":["../src/indexFile.ts"],"names":[],"mappings":"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"}
|
package/esm/util.d.ts
CHANGED
|
@@ -35,26 +35,7 @@ export interface BaseOpts {
|
|
|
35
35
|
* underneath you. (The Chunk objects themselves are never mutated; a merged
|
|
36
36
|
* span produces a new instance.)
|
|
37
37
|
*/
|
|
38
|
-
|
|
39
|
-
* `signal.throwIfAborted()`, without requiring either that method or `reason`.
|
|
40
|
-
*
|
|
41
|
-
* Two reasons not to call the built-in directly. It assumes a *real*
|
|
42
|
-
* `AbortSignal`, and callers pass duck-typed ones — `test/csi.test.ts` casts a
|
|
43
|
-
* bare `{ aborted }` through `as AbortSignal`, which is a fair model of what
|
|
44
|
-
* consumers do; calling a missing method there is a `TypeError` rather than the
|
|
45
|
-
* cancellation the caller asked for, which is a strictly worse failure.
|
|
46
|
-
*
|
|
47
|
-
* And it sets a browser floor. `AbortSignal.prototype.throwIfAborted` and
|
|
48
|
-
* `AbortSignal.reason` are Safari 15.4 / Chrome 100 / Firefox 97 (March 2022) —
|
|
49
|
-
* higher than anything else in this dependency tree needs, since
|
|
50
|
-
* `generic-filehandle2` only ever forwards a signal to `fetch`, and higher than
|
|
51
|
-
* every sibling gmod library, which use plain `.aborted`. Three lines here
|
|
52
|
-
* keeps that floor where it was.
|
|
53
|
-
*
|
|
54
|
-
* Faithful to the spec otherwise: an aborted signal throws its `reason`
|
|
55
|
-
* whatever that is, and only synthesizes an `AbortError` when there is none.
|
|
56
|
-
*/
|
|
57
|
-
export declare function throwIfAborted(signal?: AbortSignal): void;
|
|
38
|
+
export { throwIfAborted } from '@gmod/shared-read-cache';
|
|
58
39
|
export declare function optimizeChunks(chunks: Chunk[], lowest?: OffsetCoords): Chunk[];
|
|
59
40
|
export declare function parsePseudoBin(bytes: Uint8Array, offset: number): {
|
|
60
41
|
lineCount: number;
|
|
@@ -95,4 +76,3 @@ interface Positioned {
|
|
|
95
76
|
end: number;
|
|
96
77
|
}
|
|
97
78
|
export declare function appendInRange<T extends Positioned>(records: T[], chrId: number, min: number, max: number, out?: T[]): T[];
|
|
98
|
-
export {};
|
package/esm/util.js
CHANGED
|
@@ -10,33 +10,10 @@ import { VirtualOffset } from "./virtualOffset.js";
|
|
|
10
10
|
* underneath you. (The Chunk objects themselves are never mutated; a merged
|
|
11
11
|
* span produces a new instance.)
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
* `AbortSignal`, and callers pass duck-typed ones — `test/csi.test.ts` casts a
|
|
18
|
-
* bare `{ aborted }` through `as AbortSignal`, which is a fair model of what
|
|
19
|
-
* consumers do; calling a missing method there is a `TypeError` rather than the
|
|
20
|
-
* cancellation the caller asked for, which is a strictly worse failure.
|
|
21
|
-
*
|
|
22
|
-
* And it sets a browser floor. `AbortSignal.prototype.throwIfAborted` and
|
|
23
|
-
* `AbortSignal.reason` are Safari 15.4 / Chrome 100 / Firefox 97 (March 2022) —
|
|
24
|
-
* higher than anything else in this dependency tree needs, since
|
|
25
|
-
* `generic-filehandle2` only ever forwards a signal to `fetch`, and higher than
|
|
26
|
-
* every sibling gmod library, which use plain `.aborted`. Three lines here
|
|
27
|
-
* keeps that floor where it was.
|
|
28
|
-
*
|
|
29
|
-
* Faithful to the spec otherwise: an aborted signal throws its `reason`
|
|
30
|
-
* whatever that is, and only synthesizes an `AbortError` when there is none.
|
|
31
|
-
*/
|
|
32
|
-
export function throwIfAborted(signal) {
|
|
33
|
-
if (signal?.aborted) {
|
|
34
|
-
const { reason } = signal;
|
|
35
|
-
throw reason === undefined
|
|
36
|
-
? new DOMException('This operation was aborted', 'AbortError')
|
|
37
|
-
: reason;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
13
|
+
// Re-exported so the internal import path stays './util.ts'. The
|
|
14
|
+
// implementation moved to @gmod/shared-read-cache, which needs it anyway --
|
|
15
|
+
// every consumer of that package was carrying an identical copy.
|
|
16
|
+
export { throwIfAborted } from '@gmod/shared-read-cache';
|
|
40
17
|
export function optimizeChunks(chunks, lowest) {
|
|
41
18
|
const n = chunks.length;
|
|
42
19
|
if (n === 0) {
|
package/esm/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/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gmod/bam",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0",
|
|
4
4
|
"packageManager": "pnpm@11.15.1",
|
|
5
5
|
"description": "Parser for BAM and BAM index (bai) files",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "https://github.com/GMOD/bam-js.git"
|
|
9
|
+
"url": "git+https://github.com/GMOD/bam-js.git"
|
|
10
10
|
},
|
|
11
11
|
"type": "module",
|
|
12
12
|
"sideEffects": false,
|
|
@@ -51,23 +51,24 @@
|
|
|
51
51
|
"genomics"
|
|
52
52
|
],
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@gmod/bgzf-filehandle": "^6.2
|
|
54
|
+
"@gmod/bgzf-filehandle": "^6.3.2",
|
|
55
|
+
"@gmod/shared-read-cache": "^1.3.0",
|
|
55
56
|
"@jbrowse/quick-lru": "^7.3.5",
|
|
56
57
|
"crc": "^4.3.2",
|
|
57
|
-
"generic-filehandle2": "^2.2.
|
|
58
|
+
"generic-filehandle2": "^2.2.1"
|
|
58
59
|
},
|
|
59
60
|
"devDependencies": {
|
|
60
61
|
"@eslint/js": "^10.0.1",
|
|
61
|
-
"@types/node": "^25.9.
|
|
62
|
-
"@vitest/coverage-v8": "^4.1.
|
|
63
|
-
"eslint": "^10.
|
|
64
|
-
"eslint-plugin-import-x": "^4.
|
|
62
|
+
"@types/node": "^25.9.5",
|
|
63
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
64
|
+
"eslint": "^10.8.0",
|
|
65
|
+
"eslint-plugin-import-x": "^4.17.1",
|
|
65
66
|
"git-cliff": "^2.13.1",
|
|
66
|
-
"prettier": "^3.
|
|
67
|
+
"prettier": "^3.9.6",
|
|
67
68
|
"rimraf": "^6.1.3",
|
|
68
69
|
"typescript": "^6.0.3",
|
|
69
|
-
"typescript-eslint": "^8.
|
|
70
|
-
"vitest": "^4.1.
|
|
70
|
+
"typescript-eslint": "^8.65.0",
|
|
71
|
+
"vitest": "^4.1.10"
|
|
71
72
|
},
|
|
72
73
|
"publishConfig": {
|
|
73
74
|
"access": "public"
|
package/src/bamFile.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { unzip, unzipChunkSlice } from '@gmod/bgzf-filehandle'
|
|
2
|
+
import { SharedReadCache } from '@gmod/shared-read-cache'
|
|
2
3
|
import crc32 from 'crc/calculators/crc32'
|
|
3
4
|
import { LocalFile, RemoteFile } from 'generic-filehandle2'
|
|
4
5
|
|
|
@@ -63,20 +64,6 @@ interface ChunkEntry<T> {
|
|
|
63
64
|
features: T[]
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
interface InFlightChunk<T> {
|
|
67
|
-
promise: Promise<ChunkEntry<T>>
|
|
68
|
-
// Signals of the callers still waiting on this read. The read is cancelled
|
|
69
|
-
// only once every one of them has given up — see joinChunkRead and ADR 0007.
|
|
70
|
-
signals: Set<AbortSignal>
|
|
71
|
-
// true once a caller joins without a signal, which pins the read
|
|
72
|
-
pinned: boolean
|
|
73
|
-
// aborts when every caller has given up. what the read actually runs under
|
|
74
|
-
controller: AbortController
|
|
75
|
-
// aborted to take this read's listeners back off its callers' signals
|
|
76
|
-
dispose: AbortController
|
|
77
|
-
settled: boolean
|
|
78
|
-
}
|
|
79
|
-
|
|
80
67
|
/**
|
|
81
68
|
* Whether a chunk's first record already lies past `chrId:..-max`, which means
|
|
82
69
|
* every later chunk does too and none of them need to be read.
|
|
@@ -127,80 +114,6 @@ export const DEFAULT_MAX_CACHE_BYTES = 100 * 1024 * 1024
|
|
|
127
114
|
// nothing on the transport that matters and only widens peak memory.
|
|
128
115
|
const MAX_CONCURRENT_CHUNK_READS = 6
|
|
129
116
|
|
|
130
|
-
class ChunkFeatureCache<T> {
|
|
131
|
-
private _maxBytes: number
|
|
132
|
-
private entries = new Map<string, ChunkEntry<T>>()
|
|
133
|
-
private bytes = 0
|
|
134
|
-
|
|
135
|
-
constructor(maxBytes: number) {
|
|
136
|
-
this._maxBytes = maxBytes
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
get maxBytes() {
|
|
140
|
-
return this._maxBytes
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Accessor rather than a plain field so lowering the budget frees memory now.
|
|
144
|
-
// As a field, a caller trimming the cache under memory pressure got nothing
|
|
145
|
-
// back until the next chunk read happened to call set().
|
|
146
|
-
set maxBytes(maxBytes: number) {
|
|
147
|
-
this._maxBytes = maxBytes
|
|
148
|
-
this.evict()
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
get size() {
|
|
152
|
-
return this.entries.size
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
get byteSize() {
|
|
156
|
-
return this.bytes
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
get(key: string) {
|
|
160
|
-
const entry = this.entries.get(key)
|
|
161
|
-
if (entry) {
|
|
162
|
-
// re-insert so Map iteration order stays least-recently-used first
|
|
163
|
-
this.entries.delete(key)
|
|
164
|
-
this.entries.set(key, entry)
|
|
165
|
-
}
|
|
166
|
-
return entry
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
set(key: string, entry: ChunkEntry<T>) {
|
|
170
|
-
this.delete(key)
|
|
171
|
-
this.entries.set(key, entry)
|
|
172
|
-
this.bytes += entry.bytes
|
|
173
|
-
this.evict()
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Evict from the least-recently-used end. The size > 1 guard means a single
|
|
177
|
-
// chunk larger than the whole budget is still kept: the caller needs it for
|
|
178
|
-
// the query in flight, and dropping it would only force a re-decompress.
|
|
179
|
-
private evict() {
|
|
180
|
-
const lru = this.entries.keys()
|
|
181
|
-
while (this.bytes > this._maxBytes && this.entries.size > 1) {
|
|
182
|
-
this.delete(lru.next().value!)
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
delete(key: string) {
|
|
187
|
-
const entry = this.entries.get(key)
|
|
188
|
-
if (entry) {
|
|
189
|
-
this.entries.delete(key)
|
|
190
|
-
this.bytes -= entry.bytes
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
clear() {
|
|
195
|
-
this.entries.clear()
|
|
196
|
-
this.bytes = 0
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
[Symbol.iterator]() {
|
|
200
|
-
return this.entries[Symbol.iterator]()
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
117
|
export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
205
118
|
public renameRefSeq: (a: string) => string
|
|
206
119
|
public bam: GenericFilehandle
|
|
@@ -210,14 +123,18 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
210
123
|
public index?: BAI | CSI
|
|
211
124
|
public htsget = false
|
|
212
125
|
public headerP?: ReturnType<BamFile<T>['getHeaderPre']>
|
|
126
|
+
/**
|
|
127
|
+
* The signal `headerP` was started under, while it is still in flight. The
|
|
128
|
+
* header is parsed once and every query awaits it, so without this the first
|
|
129
|
+
* query to arrive would own a read all the others depend on — see
|
|
130
|
+
* {@link getHeader}.
|
|
131
|
+
*/
|
|
132
|
+
private headerSignal?: AbortSignal
|
|
213
133
|
|
|
214
|
-
//
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
// instead of racing. Entries live only until the read settles; the resolved
|
|
219
|
-
// features land in chunkFeatureCache.
|
|
220
|
-
private inFlightChunks = new Map<string, InFlightChunk<T>>()
|
|
134
|
+
// Parsed features by chunk, bounded by decompressed bytes. Also the
|
|
135
|
+
// in-flight map: concurrent queries for the same chunk share one read rather
|
|
136
|
+
// than racing to decompress it twice.
|
|
137
|
+
public chunkFeatureCache: SharedReadCache<Chunk, ChunkEntry<T>>
|
|
221
138
|
|
|
222
139
|
private RecordClass: BamRecordClass<T>
|
|
223
140
|
|
|
@@ -253,7 +170,15 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
253
170
|
}) {
|
|
254
171
|
this.renameRefSeq = renameRefSeqs
|
|
255
172
|
this.RecordClass = (recordClass ?? BAMFeature) as BamRecordClass<T>
|
|
256
|
-
this.chunkFeatureCache = new
|
|
173
|
+
this.chunkFeatureCache = new SharedReadCache<Chunk, ChunkEntry<T>>({
|
|
174
|
+
maxSize: maxCacheBytes,
|
|
175
|
+
// decompressed bytes, not entry count: parsed records are views into
|
|
176
|
+
// their chunk's decompressed buffer, so a cached entry pins that whole
|
|
177
|
+
// buffer and entry count says nothing about memory
|
|
178
|
+
sizeOf: entry => entry.bytes,
|
|
179
|
+
cacheKey: chunkCacheKey,
|
|
180
|
+
fill: (chunk, signal) => this._readChunkFeatures(chunk, { signal }),
|
|
181
|
+
})
|
|
257
182
|
|
|
258
183
|
const bamFh = resolveFilehandle(bamFilehandle, bamPath, bamUrl)
|
|
259
184
|
if (bamFh) {
|
|
@@ -362,14 +287,70 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
362
287
|
return samHeader
|
|
363
288
|
}
|
|
364
289
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
290
|
+
/**
|
|
291
|
+
* Parse the header, or join the parse already running.
|
|
292
|
+
*
|
|
293
|
+
* The header is parsed once for the life of this object and every query goes
|
|
294
|
+
* through it — `getSeqId` awaits it before anything else — so it is a read
|
|
295
|
+
* shared between queries, and the third place in this file where a
|
|
296
|
+
* cancellation could leak from the query that asked for it to a query that
|
|
297
|
+
* did not. `getHeaderPre` threads `opts` into both the index parse and the
|
|
298
|
+
* BAM read, so without this the first query to arrive owns a read every other
|
|
299
|
+
* query depends on: when it pans away, every concurrent query fails with its
|
|
300
|
+
* abort even though its own signal is untouched.
|
|
301
|
+
*
|
|
302
|
+
* Same bounded retry as `IndexFile.parse`, for the same reason — the header
|
|
303
|
+
* is parsed once, so there is no repeated waste to recover — and bounded at
|
|
304
|
+
* one attempt so the pathological case is a duplicate parse rather than a
|
|
305
|
+
* recursion whose depth depends on how the aborts interleave.
|
|
306
|
+
*
|
|
307
|
+
* SYNC: ~/src/gmod/tabix-js/src/tabixIndexedFile.ts getParsedHeader — same
|
|
308
|
+
* shape for the same reason.
|
|
309
|
+
*/
|
|
310
|
+
async getHeader(
|
|
311
|
+
opts?: BaseOpts,
|
|
312
|
+
retried = false,
|
|
313
|
+
): Promise<Awaited<ReturnType<BamFile<T>['getHeaderPre']>>> {
|
|
314
|
+
throwIfAborted(opts?.signal)
|
|
315
|
+
const pending = this.headerP
|
|
316
|
+
if (!pending) {
|
|
317
|
+
return this.startHeaderParse(opts)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// read before awaiting: the owner is forgotten as soon as the parse settles
|
|
321
|
+
const ownerSignal = this.headerSignal
|
|
322
|
+
try {
|
|
323
|
+
return await pending
|
|
324
|
+
} catch (e) {
|
|
325
|
+
if (retried || !ownerSignal?.aborted || opts?.signal?.aborted) {
|
|
369
326
|
throw e
|
|
370
|
-
}
|
|
327
|
+
}
|
|
328
|
+
return this.getHeader(opts, true)
|
|
371
329
|
}
|
|
372
|
-
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
private startHeaderParse(opts?: BaseOpts) {
|
|
333
|
+
const pending = this.getHeaderPre(opts)
|
|
334
|
+
this.headerP = pending
|
|
335
|
+
this.headerSignal = opts?.signal
|
|
336
|
+
// Drop a rejection rather than keeping it, so one transient failure does not
|
|
337
|
+
// poison the header for the lifetime of the file. Both branches are
|
|
338
|
+
// identity-checked so a retry started after this settles is not cleared by
|
|
339
|
+
// the attempt it already replaced.
|
|
340
|
+
pending.then(
|
|
341
|
+
() => {
|
|
342
|
+
if (this.headerP === pending) {
|
|
343
|
+
this.headerSignal = undefined
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
() => {
|
|
347
|
+
if (this.headerP === pending) {
|
|
348
|
+
this.headerP = undefined
|
|
349
|
+
this.headerSignal = undefined
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
)
|
|
353
|
+
return pending
|
|
373
354
|
}
|
|
374
355
|
|
|
375
356
|
async getHeaderText(opts: BaseOpts = {}) {
|
|
@@ -408,89 +389,6 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
408
389
|
return this._fetchChunkFeatures(chunks, chrId, min, max, opts)
|
|
409
390
|
}
|
|
410
391
|
|
|
411
|
-
// Read a chunk, publish it to the cache, and keep the in-flight promise
|
|
412
|
-
// discoverable while it runs.
|
|
413
|
-
//
|
|
414
|
-
// The read runs under this entry's own controller rather than any one
|
|
415
|
-
// caller's signal, because the read is shared: it must survive until every
|
|
416
|
-
// caller waiting on it has given up. joinChunkRead is what registers them.
|
|
417
|
-
private _startChunkRead(cacheKey: string, chunk: Chunk) {
|
|
418
|
-
const controller = new AbortController()
|
|
419
|
-
const promise = this._readChunkFeatures(chunk, {
|
|
420
|
-
signal: controller.signal,
|
|
421
|
-
}).then(entry => {
|
|
422
|
-
this.chunkFeatureCache.set(cacheKey, entry)
|
|
423
|
-
return entry
|
|
424
|
-
})
|
|
425
|
-
const inFlight: InFlightChunk<T> = {
|
|
426
|
-
promise,
|
|
427
|
-
signals: new Set(),
|
|
428
|
-
pinned: false,
|
|
429
|
-
controller,
|
|
430
|
-
dispose: new AbortController(),
|
|
431
|
-
settled: false,
|
|
432
|
-
}
|
|
433
|
-
this.inFlightChunks.set(cacheKey, inFlight)
|
|
434
|
-
// `.then(f, f)` rather than `.finally(f)` so the handler's own promise never
|
|
435
|
-
// carries an unhandled rejection.
|
|
436
|
-
const clear = () => {
|
|
437
|
-
inFlight.settled = true
|
|
438
|
-
// nothing reads these once the read has settled, and holding them would
|
|
439
|
-
// pin each caller's AbortController behind this entry
|
|
440
|
-
inFlight.dispose.abort()
|
|
441
|
-
inFlight.signals.clear()
|
|
442
|
-
// only clear our own entry: a later read for this chunk may have replaced it
|
|
443
|
-
if (this.inFlightChunks.get(cacheKey) === inFlight) {
|
|
444
|
-
this.inFlightChunks.delete(cacheKey)
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
promise.then(clear, clear)
|
|
448
|
-
return inFlight
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Register a caller's interest, so the read survives until that caller has
|
|
452
|
-
// given up too.
|
|
453
|
-
//
|
|
454
|
-
// A caller with no signal cannot give up, so it pins the read: there is no
|
|
455
|
-
// longer any set of aborts that should stop it. That is the honest reading of
|
|
456
|
-
// a caller that never asked to be cancellable, and it means one signal-free
|
|
457
|
-
// query makes that chunk's read uncancellable for everyone joined to it.
|
|
458
|
-
private joinChunkRead(inFlight: InFlightChunk<T>, signal?: AbortSignal) {
|
|
459
|
-
if (signal === undefined) {
|
|
460
|
-
inFlight.pinned = true
|
|
461
|
-
} else if (signal.aborted) {
|
|
462
|
-
// A caller that has already given up is not a waiter, and must not be
|
|
463
|
-
// counted as one: an `abort` listener never fires on a signal that
|
|
464
|
-
// aborted before it was added, so nothing would ever take this signal
|
|
465
|
-
// back out of the set. The count would never reach zero and the read
|
|
466
|
-
// would be uncancellable for everyone joined to it, silently.
|
|
467
|
-
//
|
|
468
|
-
// `_cachedChunkFeatures` rejects such a caller before it reaches here,
|
|
469
|
-
// with no `await` in between, so this is unreachable today. It is here
|
|
470
|
-
// because this is the bug that shipped, and an invariant that fails this
|
|
471
|
-
// quietly should not rest on a check twenty lines away. `@gmod/cram`
|
|
472
|
-
// guards the same spot for the same reason; see its ADR 0003.
|
|
473
|
-
if (!inFlight.pinned && inFlight.signals.size === 0) {
|
|
474
|
-
inFlight.controller.abort(signal.reason)
|
|
475
|
-
}
|
|
476
|
-
} else if (!inFlight.signals.has(signal)) {
|
|
477
|
-
// guarded so one signal joining twice — a viewAsPairs query reaching the
|
|
478
|
-
// same chunk for a read and for its mate — does not add two listeners
|
|
479
|
-
inFlight.signals.add(signal)
|
|
480
|
-
signal.addEventListener(
|
|
481
|
-
'abort',
|
|
482
|
-
() => {
|
|
483
|
-
inFlight.signals.delete(signal)
|
|
484
|
-
if (!inFlight.pinned && inFlight.signals.size === 0) {
|
|
485
|
-
inFlight.controller.abort(signal.reason)
|
|
486
|
-
}
|
|
487
|
-
},
|
|
488
|
-
// `once` covers the abort firing; `dispose` covers it never firing
|
|
489
|
-
{ once: true, signal: inFlight.dispose.signal },
|
|
490
|
-
)
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
|
|
494
392
|
// Parsed records for a chunk, reading and decompressing it only on a miss.
|
|
495
393
|
// Every path that wants a chunk's features goes through here — mate lookups
|
|
496
394
|
// included, since a viewAsPairs query revisits the same mate chunks each time
|
|
@@ -505,56 +403,11 @@ export default class BamFile<T extends BamRecordLike = BAMFeature> {
|
|
|
505
403
|
chunk: Chunk,
|
|
506
404
|
opts: BaseOpts,
|
|
507
405
|
): Promise<T[]> {
|
|
508
|
-
//
|
|
509
|
-
//
|
|
510
|
-
//
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
// must not be registered as a waiter on someone else's: see joinChunkRead.
|
|
514
|
-
// @gmod/cram checks in exactly this position, in SliceRecordCache.getOrFill.
|
|
515
|
-
throwIfAborted(opts.signal)
|
|
516
|
-
|
|
517
|
-
const cacheKey = chunkCacheKey(chunk)
|
|
518
|
-
const cached = this.chunkFeatureCache.get(cacheKey)
|
|
519
|
-
if (cached) {
|
|
520
|
-
return cached.features
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
// Join a read already running for this chunk rather than decompressing it a
|
|
524
|
-
// second time. jbrowse fetches a row of adjacent blocks concurrently and
|
|
525
|
-
// they collapse onto very few chunk keys, so without this a query pays for
|
|
526
|
-
// the same inflate several times over — the dominant cost of a cold query
|
|
527
|
-
// (ADR 0003).
|
|
528
|
-
let pending = this.inFlightChunks.get(cacheKey)
|
|
529
|
-
// A read every caller has abandoned is on its way out but may not have
|
|
530
|
-
// noticed yet. Start a fresh one rather than joining one already doomed.
|
|
531
|
-
if (pending?.controller.signal.aborted && !pending.settled) {
|
|
532
|
-
if (this.inFlightChunks.get(cacheKey) === pending) {
|
|
533
|
-
this.inFlightChunks.delete(cacheKey)
|
|
534
|
-
}
|
|
535
|
-
pending = undefined
|
|
536
|
-
}
|
|
537
|
-
pending ??= this._startChunkRead(cacheKey, chunk)
|
|
538
|
-
// Only a read still running has anything to cancel. Joining a settled one
|
|
539
|
-
// would add this caller to a set nothing will ever take it out of, since
|
|
540
|
-
// the entry drops its abort listeners when it settles.
|
|
541
|
-
if (!pending.settled) {
|
|
542
|
-
this.joinChunkRead(pending, opts.signal)
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
try {
|
|
546
|
-
const entry = await pending.promise
|
|
547
|
-
// the read finished, but this caller gave up while waiting for it
|
|
548
|
-
throwIfAborted(opts.signal)
|
|
549
|
-
return entry.features
|
|
550
|
-
} catch (e) {
|
|
551
|
-
// Prefer this caller's own cancellation to whatever the shared read
|
|
552
|
-
// reported. If we asked to stop, that is the answer we want — and when
|
|
553
|
-
// the read itself was cancelled it is because we, and everyone else,
|
|
554
|
-
// asked it to.
|
|
555
|
-
throwIfAborted(opts.signal)
|
|
556
|
-
throw e
|
|
557
|
-
}
|
|
406
|
+
// The cache does the rest: one read per chunk shared by every caller that
|
|
407
|
+
// asks for it while it is in flight, cancelled only once every one of them
|
|
408
|
+
// has given up (ADR 0007), and bounded by decompressed bytes.
|
|
409
|
+
const entry = await this.chunkFeatureCache.get(chunk, opts.signal)
|
|
410
|
+
return entry.features
|
|
558
411
|
}
|
|
559
412
|
|
|
560
413
|
private async _fetchChunkFeatures(
|