@gmod/bbi 7.1.0 → 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.
Files changed (90) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +59 -0
  3. package/dist/bbi.d.ts +13 -3
  4. package/dist/bbi.js +77 -17
  5. package/dist/bbi.js.map +1 -1
  6. package/dist/bigbed.d.ts +14 -2
  7. package/dist/bigbed.js +115 -76
  8. package/dist/bigbed.js.map +1 -1
  9. package/dist/bigwig.js +1 -2
  10. package/dist/bigwig.js.map +1 -1
  11. package/dist/block-view.d.ts +13 -4
  12. package/dist/block-view.js +324 -148
  13. package/dist/block-view.js.map +1 -1
  14. package/dist/index.d.ts +2 -1
  15. package/dist/index.js +3 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/parse-bigwig.d.ts +3 -0
  18. package/dist/parse-bigwig.js +15 -0
  19. package/dist/parse-bigwig.js.map +1 -0
  20. package/dist/range.js +11 -24
  21. package/dist/range.js.map +1 -1
  22. package/dist/types.d.ts +14 -2
  23. package/dist/unzip.d.ts +18 -1
  24. package/dist/unzip.js +33 -4
  25. package/dist/unzip.js.map +1 -1
  26. package/dist/util.d.ts +2 -4
  27. package/dist/util.js +6 -5
  28. package/dist/util.js.map +1 -1
  29. package/dist/wasm/inflate-wasm-inlined.d.ts +19 -0
  30. package/dist/wasm/inflate-wasm-inlined.js +117 -0
  31. package/dist/wasm/inflate-wasm-inlined.js.map +1 -0
  32. package/dist/wasm/inflate_wasm.d.ts +1 -0
  33. package/dist/wasm/inflate_wasm.js +43 -0
  34. package/dist/wasm/inflate_wasm.js.map +1 -0
  35. package/dist/wasm/inflate_wasm_bg.d.ts +68 -0
  36. package/dist/wasm/inflate_wasm_bg.js +307 -0
  37. package/dist/wasm/inflate_wasm_bg.js.map +1 -0
  38. package/esm/bbi.d.ts +13 -3
  39. package/esm/bbi.js +77 -17
  40. package/esm/bbi.js.map +1 -1
  41. package/esm/bigbed.d.ts +14 -2
  42. package/esm/bigbed.js +115 -76
  43. package/esm/bigbed.js.map +1 -1
  44. package/esm/bigwig.js +1 -2
  45. package/esm/bigwig.js.map +1 -1
  46. package/esm/block-view.d.ts +13 -4
  47. package/esm/block-view.js +326 -150
  48. package/esm/block-view.js.map +1 -1
  49. package/esm/index.d.ts +2 -1
  50. package/esm/index.js +1 -0
  51. package/esm/index.js.map +1 -1
  52. package/esm/parse-bigwig.d.ts +3 -0
  53. package/esm/parse-bigwig.js +12 -0
  54. package/esm/parse-bigwig.js.map +1 -0
  55. package/esm/range.js +11 -24
  56. package/esm/range.js.map +1 -1
  57. package/esm/types.d.ts +14 -2
  58. package/esm/unzip.d.ts +18 -1
  59. package/esm/unzip.js +30 -3
  60. package/esm/unzip.js.map +1 -1
  61. package/esm/util.d.ts +2 -4
  62. package/esm/util.js +6 -5
  63. package/esm/util.js.map +1 -1
  64. package/esm/wasm/inflate-wasm-inlined.d.ts +19 -0
  65. package/esm/wasm/inflate-wasm-inlined.js +111 -0
  66. package/esm/wasm/inflate-wasm-inlined.js.map +1 -0
  67. package/esm/wasm/inflate_wasm.d.ts +1 -0
  68. package/esm/wasm/inflate_wasm.js +5 -0
  69. package/esm/wasm/inflate_wasm.js.map +1 -0
  70. package/esm/wasm/inflate_wasm_bg.d.ts +68 -0
  71. package/esm/wasm/inflate_wasm_bg.js +296 -0
  72. package/esm/wasm/inflate_wasm_bg.js.map +1 -0
  73. package/package.json +15 -10
  74. package/src/bbi.ts +100 -20
  75. package/src/bigbed.ts +157 -80
  76. package/src/bigwig.ts +1 -2
  77. package/src/block-view.ts +415 -156
  78. package/src/index.ts +8 -1
  79. package/src/parse-bigwig.ts +19 -0
  80. package/src/range.ts +13 -21
  81. package/src/types.ts +19 -2
  82. package/src/unzip.ts +88 -3
  83. package/src/util.ts +9 -10
  84. package/src/wasm/inflate-wasm-inlined.d.ts +49 -0
  85. package/src/wasm/inflate-wasm-inlined.js +1 -0
  86. package/src/wasm/inflate_wasm.d.ts +35 -0
  87. package/src/wasm/inflate_wasm.js +4 -0
  88. package/src/wasm/inflate_wasm_bg.js +309 -0
  89. package/src/wasm/inflate_wasm_bg.wasm +0 -0
  90. package/src/wasm/inflate_wasm_bg.wasm.d.ts +13 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # [8.0.0](https://github.com/GMOD/bbi-js/compare/v7.1.0...v8.0.0) (2025-12-11)
2
+
3
+
4
+
1
5
  # [7.1.0](https://github.com/GMOD/bbi-js/compare/v7.0.5...v7.1.0) (2025-11-09)
2
6
 
3
7
 
package/README.md CHANGED
@@ -123,6 +123,65 @@ observer.subscribe(
123
123
  )
124
124
  ```
125
125
 
126
+ #### getFeaturesAsArrays(refName, start, end, opts)
127
+
128
+ Same parameters as getFeatures, but returns typed arrays instead of an array of
129
+ objects. This is more memory-efficient and reduces garbage collection pressure
130
+ for large datasets.
131
+
132
+ ```typescript
133
+ const result = await bigwig.getFeaturesAsArrays('chr1', 0, 100000)
134
+ // For regular BigWig data:
135
+ // { starts: Int32Array, ends: Int32Array, scores: Float32Array }
136
+
137
+ // For summary/zoomed data (when using scale parameter):
138
+ // { starts: Int32Array, ends: Int32Array, scores: Float32Array,
139
+ // minScores: Float32Array, maxScores: Float32Array }
140
+ ```
141
+
142
+ Example usage:
143
+
144
+ ```typescript
145
+ const { starts, ends, scores } = await bigwig.getFeaturesAsArrays(
146
+ 'chr1',
147
+ 0,
148
+ 100000,
149
+ )
150
+ for (let i = 0; i < starts.length; i++) {
151
+ console.log(`Feature at ${starts[i]}-${ends[i]} with score ${scores[i]}`)
152
+ }
153
+
154
+ // Check if it's summary data
155
+ const result = await bigwig.getFeaturesAsArrays('chr1', 0, 100000, {
156
+ scale: 0.01,
157
+ })
158
+ if ('minScores' in result) {
159
+ // Summary data with min/max scores
160
+ const { minScores, maxScores } = result
161
+ for (let i = 0; i < starts.length; i++) {
162
+ console.log(`Range: ${minScores[i]} - ${maxScores[i]}`)
163
+ }
164
+ }
165
+ ```
166
+
167
+ TypeScript types:
168
+
169
+ ```typescript
170
+ interface BigWigFeatureArrays {
171
+ starts: Int32Array
172
+ ends: Int32Array
173
+ scores: Float32Array
174
+ }
175
+
176
+ interface SummaryFeatureArrays {
177
+ starts: Int32Array
178
+ ends: Int32Array
179
+ scores: Float32Array
180
+ minScores: Float32Array
181
+ maxScores: Float32Array
182
+ }
183
+ ```
184
+
126
185
  ### BigBed
127
186
 
128
187
  #### getFeatures(refName, start, end, opts)
package/dist/bbi.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { BlockView } from './block-view.ts';
3
- import type { BigWigHeaderWithRefNames, Feature, RequestOptions2, RequestOptions } from './types.ts';
3
+ import type { BigWigFeatureArrays, BigWigHeaderWithRefNames, Feature, RequestOptions2, RequestOptions, SummaryFeatureArrays } from './types.ts';
4
4
  import type { GenericFilehandle } from 'generic-filehandle2';
5
5
  export declare abstract class BBI {
6
6
  protected bbi: GenericFilehandle;
@@ -15,7 +15,7 @@ export declare abstract class BBI {
15
15
  });
16
16
  private _getHeader;
17
17
  private _getMainHeader;
18
- private _readChromTree;
18
+ private _readChromosomeTree;
19
19
  protected getUnzoomedView(opts?: RequestOptions): Promise<BlockView>;
20
20
  protected abstract getView(scale: number, opts?: RequestOptions): Promise<BlockView>;
21
21
  /**
@@ -31,5 +31,15 @@ export declare abstract class BBI {
31
31
  * or scale used to infer the zoomLevel to use
32
32
  */
33
33
  getFeatureStream(refName: string, start: number, end: number, opts?: RequestOptions2): Promise<Observable<Feature[]>>;
34
- getFeatures(refName: string, start: number, end: number, opts?: RequestOptions2): Promise<Feature[]>;
34
+ getFeatures(refName: string, start: number, end: number, opts?: RequestOptions2): Promise<any[]>;
35
+ /**
36
+ * Gets features from a BigWig file as typed arrays (more efficient than getFeatures)
37
+ *
38
+ * @param refName - The chromosome name
39
+ * @param start - The start of a region
40
+ * @param end - The end of a region
41
+ * @param opts - Options including basesPerSpan or scale
42
+ * @returns Promise with typed arrays: starts, ends, scores (and minScores/maxScores for summary data)
43
+ */
44
+ getFeaturesAsArrays(refName: string, start: number, end: number, opts?: RequestOptions2): Promise<BigWigFeatureArrays | SummaryFeatureArrays>;
35
45
  }
package/dist/bbi.js CHANGED
@@ -7,6 +7,7 @@ const operators_1 = require("rxjs/operators");
7
7
  const block_view_ts_1 = require("./block-view.js");
8
8
  const BIG_WIG_MAGIC = -2003829722;
9
9
  const BIG_BED_MAGIC = -2021002517;
10
+ const decoder = new TextDecoder('utf8');
10
11
  function getDataView(buffer) {
11
12
  return new DataView(buffer.buffer, buffer.byteOffset, buffer.length);
12
13
  }
@@ -51,7 +52,7 @@ class BBI {
51
52
  }
52
53
  async _getHeader(opts) {
53
54
  const header = await this._getMainHeader(opts);
54
- const chroms = await this._readChromTree(header, opts);
55
+ const chroms = await this._readChromosomeTree(header, opts);
55
56
  return {
56
57
  ...header,
57
58
  ...chroms,
@@ -71,7 +72,8 @@ class BBI {
71
72
  offset += 2;
72
73
  const numZoomLevels = dataView.getUint16(offset, true);
73
74
  offset += 2;
74
- const chromTreeOffset = Number(dataView.getBigUint64(offset, true));
75
+ // Offset to the B+ tree that maps chromosome names to integer IDs
76
+ const chromosomeTreeOffset = Number(dataView.getBigUint64(offset, true));
75
77
  offset += 8;
76
78
  const unzoomedDataOffset = Number(dataView.getBigUint64(offset, true));
77
79
  offset += 8;
@@ -138,7 +140,6 @@ class BBI {
138
140
  else {
139
141
  throw new Error('no stats');
140
142
  }
141
- const decoder = new TextDecoder('utf8');
142
143
  return {
143
144
  zoomLevels,
144
145
  magic,
@@ -149,7 +150,7 @@ class BBI {
149
150
  definedFieldCount,
150
151
  uncompressBufSize,
151
152
  asOffset,
152
- chromTreeOffset,
153
+ chromosomeTreeOffset,
153
154
  totalSummaryOffset,
154
155
  unzoomedDataOffset,
155
156
  unzoomedIndexOffset,
@@ -160,11 +161,14 @@ class BBI {
160
161
  : '',
161
162
  };
162
163
  }
163
- async _readChromTree(header, opts) {
164
+ // Reads the B+ tree that maps chromosome names to integer IDs
165
+ // This is part of the "cirTree" (combined ID R-tree) structure, which uses
166
+ // integer chromosome IDs instead of strings for more efficient spatial indexing
167
+ async _readChromosomeTree(header, opts) {
164
168
  const refsByNumber = [];
165
169
  const refsByName = {};
166
- const chromTreeOffset = header.chromTreeOffset;
167
- const dataView = getDataView(await this.bbi.read(32, chromTreeOffset, opts));
170
+ const chromosomeTreeOffset = header.chromosomeTreeOffset;
171
+ const dataView = getDataView(await this.bbi.read(32, chromosomeTreeOffset, opts));
168
172
  let offset = 0;
169
173
  // const magic = dataView.getUint32(offset, true) // unused
170
174
  offset += 4;
@@ -176,8 +180,8 @@ class BBI {
176
180
  offset += 4;
177
181
  // const itemCount = dataView.getBigUint64(offset, true) // unused
178
182
  offset += 8;
179
- const decoder = new TextDecoder('utf8');
180
- const bptReadNode = async (currentOffset) => {
183
+ // Recursively traverses the B+ tree to populate chromosome name-to-ID mappings
184
+ const readBPlusTreeNode = async (currentOffset) => {
181
185
  const b = await this.bbi.read(4, currentOffset);
182
186
  const dataView = getDataView(b);
183
187
  let offset = 0;
@@ -187,14 +191,14 @@ class BBI {
187
191
  offset += 1;
188
192
  const count = dataView.getUint16(offset, true);
189
193
  offset += 2;
194
+ // Leaf nodes contain the actual chromosome name-to-ID mappings
190
195
  if (isLeafNode) {
191
196
  const b = await this.bbi.read(count * (keySize + valSize), currentOffset + offset);
192
197
  const dataView = getDataView(b);
193
198
  offset = 0;
194
199
  for (let n = 0; n < count; n++) {
195
- const key = decoder
196
- .decode(b.subarray(offset, offset + keySize))
197
- .replaceAll('\0', '');
200
+ const keyEnd = b.indexOf(0, offset);
201
+ const key = decoder.decode(b.subarray(offset, keyEnd !== -1 ? keyEnd : offset + keySize));
198
202
  offset += keySize;
199
203
  const refId = dataView.getUint32(offset, true);
200
204
  offset += 4;
@@ -209,6 +213,7 @@ class BBI {
209
213
  }
210
214
  }
211
215
  else {
216
+ // Non-leaf nodes contain pointers to child nodes
212
217
  const nextNodes = [];
213
218
  const dataView = getDataView(await this.bbi.read(count * (keySize + 8), currentOffset + offset));
214
219
  offset = 0;
@@ -216,12 +221,12 @@ class BBI {
216
221
  offset += keySize;
217
222
  const childOffset = Number(dataView.getBigUint64(offset, true));
218
223
  offset += 8;
219
- nextNodes.push(bptReadNode(childOffset));
224
+ nextNodes.push(readBPlusTreeNode(childOffset));
220
225
  }
221
226
  await Promise.all(nextNodes);
222
227
  }
223
228
  };
224
- await bptReadNode(chromTreeOffset + 32);
229
+ await readBPlusTreeNode(chromosomeTreeOffset + 32);
225
230
  return {
226
231
  refsByName,
227
232
  refsByNumber,
@@ -233,7 +238,7 @@ class BBI {
233
238
  */
234
239
  async getUnzoomedView(opts) {
235
240
  const { unzoomedIndexOffset, refsByName, uncompressBufSize, fileType } = await this.getHeader(opts);
236
- return new block_view_ts_1.BlockView(this.bbi, refsByName, unzoomedIndexOffset, uncompressBufSize > 0, fileType);
241
+ return new block_view_ts_1.BlockView(this.bbi, refsByName, unzoomedIndexOffset, uncompressBufSize, fileType);
237
242
  }
238
243
  /**
239
244
  * Gets features from a BigWig file
@@ -271,8 +276,63 @@ class BBI {
271
276
  }
272
277
  async getFeatures(refName, start, end, opts) {
273
278
  const ob = await this.getFeatureStream(refName, start, end, opts);
274
- const ret = await (0, rxjs_1.firstValueFrom)(ob.pipe((0, operators_1.toArray)()));
275
- return ret.flat();
279
+ const arrays = await (0, rxjs_1.firstValueFrom)(ob.pipe((0, operators_1.toArray)()));
280
+ const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
281
+ const result = new Array(totalLength);
282
+ let index = 0;
283
+ for (const arr of arrays) {
284
+ for (const item of arr) {
285
+ result[index++] = item;
286
+ }
287
+ }
288
+ return result;
289
+ }
290
+ /**
291
+ * Gets features from a BigWig file as typed arrays (more efficient than getFeatures)
292
+ *
293
+ * @param refName - The chromosome name
294
+ * @param start - The start of a region
295
+ * @param end - The end of a region
296
+ * @param opts - Options including basesPerSpan or scale
297
+ * @returns Promise with typed arrays: starts, ends, scores (and minScores/maxScores for summary data)
298
+ */
299
+ async getFeaturesAsArrays(refName, start, end, opts) {
300
+ const features = await this.getFeatures(refName, start, end, opts);
301
+ const count = features.length;
302
+ if (count === 0) {
303
+ return {
304
+ starts: new Int32Array(0),
305
+ ends: new Int32Array(0),
306
+ scores: new Float32Array(0),
307
+ };
308
+ }
309
+ const hasSummary = features[0]?.summary === true;
310
+ if (hasSummary) {
311
+ const starts = new Int32Array(count);
312
+ const ends = new Int32Array(count);
313
+ const scores = new Float32Array(count);
314
+ const minScores = new Float32Array(count);
315
+ const maxScores = new Float32Array(count);
316
+ for (let i = 0; i < count; i++) {
317
+ const f = features[i];
318
+ starts[i] = f.start;
319
+ ends[i] = f.end;
320
+ scores[i] = f.score ?? 0;
321
+ minScores[i] = f.minScore ?? 0;
322
+ maxScores[i] = f.maxScore ?? 0;
323
+ }
324
+ return { starts, ends, scores, minScores, maxScores };
325
+ }
326
+ const starts = new Int32Array(count);
327
+ const ends = new Int32Array(count);
328
+ const scores = new Float32Array(count);
329
+ for (let i = 0; i < count; i++) {
330
+ const f = features[i];
331
+ starts[i] = f.start;
332
+ ends[i] = f.end;
333
+ scores[i] = f.score ?? 0;
334
+ }
335
+ return { starts, ends, scores };
276
336
  }
277
337
  }
278
338
  exports.BBI = BBI;
package/dist/bbi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":"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"}
package/dist/bigbed.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import AbortablePromiseCache from '@gmod/abortable-promise-cache';
2
2
  import { BBI } from './bbi.ts';
3
- import type { Feature, RequestOptions } from './types.ts';
3
+ import type { RequestOptions } from './types.ts';
4
4
  interface Index {
5
5
  type: number;
6
6
  fieldcount: number;
@@ -14,6 +14,18 @@ export declare class BigBed extends BBI {
14
14
  protected getView(_scale: number, opts?: RequestOptions): Promise<import("./block-view.ts").BlockView>;
15
15
  private _readIndices;
16
16
  private searchExtraIndexBlocks;
17
- searchExtraIndex(name: string, opts?: RequestOptions): Promise<Feature[]>;
17
+ searchExtraIndex(name: string, opts?: RequestOptions): Promise<{
18
+ field: number | undefined;
19
+ offset?: number;
20
+ chromId?: number;
21
+ start: number;
22
+ end: number;
23
+ score?: number;
24
+ rest?: string;
25
+ minScore?: number;
26
+ maxScore?: number;
27
+ summary?: boolean;
28
+ uniqueId?: string;
29
+ }[]>;
18
30
  }
19
31
  export {};
package/dist/bigbed.js CHANGED
@@ -10,9 +10,108 @@ const quick_lru_1 = __importDefault(require("quick-lru"));
10
10
  const rxjs_1 = require("rxjs");
11
11
  const operators_1 = require("rxjs/operators");
12
12
  const bbi_ts_1 = require("./bbi.js");
13
+ const decoder = new TextDecoder('utf8');
13
14
  function filterUndef(ts) {
14
15
  return ts.filter((t) => !!t);
15
16
  }
17
+ function getTabField(str, fieldIndex) {
18
+ if (fieldIndex < 0) {
19
+ return undefined;
20
+ }
21
+ let start = 0;
22
+ for (let i = 0; i < fieldIndex; i++) {
23
+ start = str.indexOf('\t', start);
24
+ if (start === -1) {
25
+ return undefined;
26
+ }
27
+ start++;
28
+ }
29
+ const end = str.indexOf('\t', start);
30
+ return end === -1 ? str.slice(start) : str.slice(start, end);
31
+ }
32
+ // Parses a null-terminated string key from a B+ tree node
33
+ function parseKey(buffer, offset, keySize) {
34
+ const keyEnd = buffer.indexOf(0, offset);
35
+ return decoder.decode(buffer.subarray(offset, keyEnd !== -1 ? keyEnd : offset + keySize));
36
+ }
37
+ // Recursively traverses a B+ tree to search for a specific name in the BigBed extraIndex
38
+ // B+ trees are balanced tree structures optimized for disk-based searches
39
+ async function readBPlusTreeNode(bbi, nodeOffset, blockSize, keySize, valSize, name, field, opts) {
40
+ const len = 4 + blockSize * (keySize + valSize);
41
+ const buffer = await bbi.read(len, nodeOffset, opts);
42
+ const dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length);
43
+ let offset = 0;
44
+ const nodeType = dataView.getInt8(offset);
45
+ offset += 2; // skip nodeType byte + 1 reserved byte
46
+ const cnt = dataView.getInt16(offset, true);
47
+ offset += 2;
48
+ // Non-leaf node (nodeType === 0): contains keys and child node pointers for navigation
49
+ if (nodeType === 0) {
50
+ const leafkeys = [];
51
+ for (let i = 0; i < cnt; i++) {
52
+ const key = parseKey(buffer, offset, keySize);
53
+ offset += keySize;
54
+ const dataOffset = Number(dataView.getBigUint64(offset, true));
55
+ offset += 8;
56
+ leafkeys.push({
57
+ key,
58
+ offset: dataOffset,
59
+ });
60
+ }
61
+ // Binary search to find the appropriate child node
62
+ let left = 0;
63
+ let right = leafkeys.length - 1;
64
+ let targetIndex = leafkeys.length - 1;
65
+ while (left <= right) {
66
+ const mid = Math.floor((left + right) / 2);
67
+ const cmp = name.localeCompare(leafkeys[mid].key);
68
+ if (cmp < 0) {
69
+ targetIndex = mid - 1;
70
+ right = mid - 1;
71
+ }
72
+ else {
73
+ left = mid + 1;
74
+ }
75
+ }
76
+ const childOffset = targetIndex >= 0 ? leafkeys[targetIndex].offset : leafkeys[0].offset;
77
+ return readBPlusTreeNode(bbi, childOffset, blockSize, keySize, valSize, name, field, opts);
78
+ }
79
+ else if (nodeType === 1) {
80
+ // Leaf node (nodeType === 1): contains actual key-value data
81
+ const keys = [];
82
+ for (let i = 0; i < cnt; i++) {
83
+ const key = parseKey(buffer, offset, keySize);
84
+ offset += keySize;
85
+ const dataOffset = Number(dataView.getBigUint64(offset, true));
86
+ offset += 8;
87
+ const length = dataView.getUint32(offset, true);
88
+ offset += 4;
89
+ offset += 4; // skip reserved
90
+ keys.push({
91
+ key,
92
+ offset: dataOffset,
93
+ length,
94
+ });
95
+ }
96
+ // Binary search for exact key match in sorted leaf node
97
+ let left = 0;
98
+ let right = keys.length - 1;
99
+ while (left <= right) {
100
+ const mid = Math.floor((left + right) / 2);
101
+ const cmp = name.localeCompare(keys[mid].key);
102
+ if (cmp === 0) {
103
+ return { ...keys[mid], field };
104
+ }
105
+ else if (cmp < 0) {
106
+ right = mid - 1;
107
+ }
108
+ else {
109
+ left = mid + 1;
110
+ }
111
+ }
112
+ return undefined;
113
+ }
114
+ }
16
115
  class BigBed extends bbi_ts_1.BBI {
17
116
  readIndicesCache = new abortable_promise_cache_1.default({
18
117
  cache: new quick_lru_1.default({ maxSize: 1 }),
@@ -63,7 +162,7 @@ class BigBed extends bbi_ts_1.BBI {
63
162
  const fieldcount = dataView.getInt16(offset, true);
64
163
  offset += 2;
65
164
  const dataOffset = Number(dataView.getBigUint64(offset, true));
66
- offset += 8 + 4; //4 skip
165
+ offset += 8 + 4; // skip 8-byte offset + 4 reserved bytes
67
166
  const field = dataView.getInt16(offset, true);
68
167
  indices.push({
69
168
  type,
@@ -89,7 +188,6 @@ class BigBed extends bbi_ts_1.BBI {
89
188
  if (indices.length === 0) {
90
189
  return [];
91
190
  }
92
- const decoder = new TextDecoder('utf8');
93
191
  const locs = indices.map(async (index) => {
94
192
  const { offset: offset2, field } = index;
95
193
  const b = await this.bbi.read(32, offset2, opts);
@@ -105,72 +203,7 @@ class BigBed extends bbi_ts_1.BBI {
105
203
  offset += 4;
106
204
  // const _itemCount = Number(dataView.getBigUint64(offset, true))
107
205
  offset += 8;
108
- const bptReadNode = async (nodeOffset) => {
109
- const val = nodeOffset;
110
- const len = 4 + blockSize * (keySize + valSize);
111
- const buffer = await this.bbi.read(len, val, opts);
112
- const b = buffer;
113
- const dataView = new DataView(b.buffer, b.byteOffset, b.length);
114
- let offset = 0;
115
- const nodeType = dataView.getInt8(offset);
116
- offset += 2; //skip 1
117
- const cnt = dataView.getInt16(offset, true);
118
- offset += 2;
119
- const keys = [];
120
- if (nodeType === 0) {
121
- const leafkeys = [];
122
- for (let i = 0; i < cnt; i++) {
123
- const key = decoder
124
- .decode(b.subarray(offset, offset + keySize))
125
- .replaceAll('\0', '');
126
- offset += keySize;
127
- const dataOffset = Number(dataView.getBigUint64(offset, true));
128
- offset += 8;
129
- leafkeys.push({
130
- key,
131
- offset: dataOffset,
132
- });
133
- }
134
- let lastOffset = 0;
135
- for (const { key, offset } of leafkeys) {
136
- if (name.localeCompare(key) < 0 && lastOffset) {
137
- return bptReadNode(lastOffset);
138
- }
139
- lastOffset = offset;
140
- }
141
- return bptReadNode(lastOffset);
142
- }
143
- else if (nodeType === 1) {
144
- for (let i = 0; i < cnt; i++) {
145
- const key = decoder
146
- .decode(b.subarray(offset, offset + keySize))
147
- .replaceAll('\0', '');
148
- offset += keySize;
149
- const dataOffset = Number(dataView.getBigUint64(offset, true));
150
- offset += 8;
151
- const length = dataView.getUint32(offset, true);
152
- offset += 4;
153
- const reserved = dataView.getUint32(offset, true);
154
- offset += 4;
155
- keys.push({
156
- key,
157
- offset: dataOffset,
158
- length,
159
- reserved,
160
- });
161
- }
162
- for (const n of keys) {
163
- if (n.key === name) {
164
- return {
165
- ...n,
166
- field,
167
- };
168
- }
169
- }
170
- return undefined;
171
- }
172
- };
173
- return bptReadNode(offset2 + 32);
206
+ return readBPlusTreeNode(this.bbi, offset2 + 32, blockSize, keySize, valSize, name, field, opts);
174
207
  });
175
208
  return filterUndef(await Promise.all(locs));
176
209
  }
@@ -181,7 +214,7 @@ class BigBed extends bbi_ts_1.BBI {
181
214
  *
182
215
  * @param name - the name to search for
183
216
  *
184
- * @param opts - options object with optional AboutSignal
217
+ * @param opts - options object with optional AbortSignal
185
218
  *
186
219
  * @return array of Feature
187
220
  */
@@ -196,15 +229,21 @@ class BigBed extends bbi_ts_1.BBI {
196
229
  view.readFeatures(observer, [block], opts).catch((e) => {
197
230
  observer.error(e);
198
231
  });
199
- }).pipe((0, operators_1.reduce)((acc, curr) => acc.concat(curr)), (0, operators_1.map)(x => {
200
- for (const element of x) {
201
- element.field = block.field;
202
- }
203
- return x;
204
- }));
232
+ }).pipe((0, operators_1.reduce)((acc, curr) => {
233
+ acc.push(...curr);
234
+ return acc;
235
+ }, []), (0, operators_1.map)(features => features.map(f => ({ ...f, field: block.field }))));
205
236
  });
206
237
  const ret = await (0, rxjs_1.firstValueFrom)((0, rxjs_1.merge)(...res));
207
- return ret.filter(f => f.rest?.split('\t')[(f.field || 0) - 3] === name);
238
+ // Filter to features where the indexed field matches the search name
239
+ // field offset is adjusted by -3 to account for chrom, chromStart, chromEnd columns
240
+ return ret.filter(f => {
241
+ if (!f.rest) {
242
+ return false;
243
+ }
244
+ const fieldIndex = (f.field || 0) - 3;
245
+ return getTabField(f.rest, fieldIndex) === name;
246
+ });
208
247
  }
209
248
  }
210
249
  exports.BigBed = BigBed;