@gmod/bbi 7.0.5 → 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 +8 -0
  2. package/README.md +59 -0
  3. package/dist/bbi.d.ts +13 -3
  4. package/dist/bbi.js +81 -18
  5. package/dist/bbi.js.map +1 -1
  6. package/dist/bigbed.d.ts +14 -2
  7. package/dist/bigbed.js +127 -86
  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 +332 -150
  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 +12 -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 +7 -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 +81 -18
  40. package/esm/bbi.js.map +1 -1
  41. package/esm/bigbed.d.ts +14 -2
  42. package/esm/bigbed.js +127 -86
  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 +334 -152
  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 +12 -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 +7 -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 +21 -17
  74. package/src/bbi.ts +101 -21
  75. package/src/bigbed.ts +165 -83
  76. package/src/bigwig.ts +1 -2
  77. package/src/block-view.ts +415 -158
  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,11 @@
1
+ # [8.0.0](https://github.com/GMOD/bbi-js/compare/v7.1.0...v8.0.0) (2025-12-11)
2
+
3
+
4
+
5
+ # [7.1.0](https://github.com/GMOD/bbi-js/compare/v7.0.5...v7.1.0) (2025-11-09)
6
+
7
+
8
+
1
9
  ## [7.0.5](https://github.com/GMOD/bbi-js/compare/v7.0.4...v7.0.5) (2025-06-10)
2
10
 
3
11
 
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,10 +7,14 @@ 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
  }
13
14
  class BBI {
15
+ bbi;
16
+ headerP;
17
+ renameRefSeqs;
14
18
  getHeader(opts) {
15
19
  if (!this.headerP) {
16
20
  this.headerP = this._getHeader(opts).catch((e) => {
@@ -48,7 +52,7 @@ class BBI {
48
52
  }
49
53
  async _getHeader(opts) {
50
54
  const header = await this._getMainHeader(opts);
51
- const chroms = await this._readChromTree(header, opts);
55
+ const chroms = await this._readChromosomeTree(header, opts);
52
56
  return {
53
57
  ...header,
54
58
  ...chroms,
@@ -68,7 +72,8 @@ class BBI {
68
72
  offset += 2;
69
73
  const numZoomLevels = dataView.getUint16(offset, true);
70
74
  offset += 2;
71
- 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));
72
77
  offset += 8;
73
78
  const unzoomedDataOffset = Number(dataView.getBigUint64(offset, true));
74
79
  offset += 8;
@@ -111,7 +116,7 @@ class BBI {
111
116
  }
112
117
  let totalSummary;
113
118
  if (totalSummaryOffset) {
114
- const b2 = b.subarray(Number(totalSummaryOffset));
119
+ const b2 = b.subarray(totalSummaryOffset);
115
120
  let offset = 0;
116
121
  const dataView = getDataView(b2);
117
122
  const basesCovered = Number(dataView.getBigUint64(offset, true));
@@ -135,7 +140,6 @@ class BBI {
135
140
  else {
136
141
  throw new Error('no stats');
137
142
  }
138
- const decoder = new TextDecoder('utf8');
139
143
  return {
140
144
  zoomLevels,
141
145
  magic,
@@ -146,7 +150,7 @@ class BBI {
146
150
  definedFieldCount,
147
151
  uncompressBufSize,
148
152
  asOffset,
149
- chromTreeOffset,
153
+ chromosomeTreeOffset,
150
154
  totalSummaryOffset,
151
155
  unzoomedDataOffset,
152
156
  unzoomedIndexOffset,
@@ -157,11 +161,14 @@ class BBI {
157
161
  : '',
158
162
  };
159
163
  }
160
- 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) {
161
168
  const refsByNumber = [];
162
169
  const refsByName = {};
163
- const chromTreeOffset = Number(header.chromTreeOffset);
164
- 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));
165
172
  let offset = 0;
166
173
  // const magic = dataView.getUint32(offset, true) // unused
167
174
  offset += 4;
@@ -173,8 +180,8 @@ class BBI {
173
180
  offset += 4;
174
181
  // const itemCount = dataView.getBigUint64(offset, true) // unused
175
182
  offset += 8;
176
- const decoder = new TextDecoder('utf8');
177
- const bptReadNode = async (currentOffset) => {
183
+ // Recursively traverses the B+ tree to populate chromosome name-to-ID mappings
184
+ const readBPlusTreeNode = async (currentOffset) => {
178
185
  const b = await this.bbi.read(4, currentOffset);
179
186
  const dataView = getDataView(b);
180
187
  let offset = 0;
@@ -184,14 +191,14 @@ class BBI {
184
191
  offset += 1;
185
192
  const count = dataView.getUint16(offset, true);
186
193
  offset += 2;
194
+ // Leaf nodes contain the actual chromosome name-to-ID mappings
187
195
  if (isLeafNode) {
188
196
  const b = await this.bbi.read(count * (keySize + valSize), currentOffset + offset);
189
197
  const dataView = getDataView(b);
190
198
  offset = 0;
191
199
  for (let n = 0; n < count; n++) {
192
- const key = decoder
193
- .decode(b.subarray(offset, offset + keySize))
194
- .replaceAll('\0', '');
200
+ const keyEnd = b.indexOf(0, offset);
201
+ const key = decoder.decode(b.subarray(offset, keyEnd !== -1 ? keyEnd : offset + keySize));
195
202
  offset += keySize;
196
203
  const refId = dataView.getUint32(offset, true);
197
204
  offset += 4;
@@ -206,6 +213,7 @@ class BBI {
206
213
  }
207
214
  }
208
215
  else {
216
+ // Non-leaf nodes contain pointers to child nodes
209
217
  const nextNodes = [];
210
218
  const dataView = getDataView(await this.bbi.read(count * (keySize + 8), currentOffset + offset));
211
219
  offset = 0;
@@ -213,12 +221,12 @@ class BBI {
213
221
  offset += keySize;
214
222
  const childOffset = Number(dataView.getBigUint64(offset, true));
215
223
  offset += 8;
216
- nextNodes.push(bptReadNode(childOffset));
224
+ nextNodes.push(readBPlusTreeNode(childOffset));
217
225
  }
218
226
  await Promise.all(nextNodes);
219
227
  }
220
228
  };
221
- await bptReadNode(chromTreeOffset + 32);
229
+ await readBPlusTreeNode(chromosomeTreeOffset + 32);
222
230
  return {
223
231
  refsByName,
224
232
  refsByNumber,
@@ -230,7 +238,7 @@ class BBI {
230
238
  */
231
239
  async getUnzoomedView(opts) {
232
240
  const { unzoomedIndexOffset, refsByName, uncompressBufSize, fileType } = await this.getHeader(opts);
233
- 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);
234
242
  }
235
243
  /**
236
244
  * Gets features from a BigWig file
@@ -268,8 +276,63 @@ class BBI {
268
276
  }
269
277
  async getFeatures(refName, start, end, opts) {
270
278
  const ob = await this.getFeatureStream(refName, start, end, opts);
271
- const ret = await (0, rxjs_1.firstValueFrom)(ob.pipe((0, operators_1.toArray)()));
272
- 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 };
273
336
  }
274
337
  }
275
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":";;;AAAA,6DAA2D;AAC3D,+BAAiD;AACjD,8CAAwC;AAExC,mDAA2C;AAc3C,MAAM,aAAa,GAAG,CAAC,UAAU,CAAA;AACjC,MAAM,aAAa,GAAG,CAAC,UAAU,CAAA;AAEjC,SAAS,WAAW,CAAC,MAAkB;IACrC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AACtE,CAAC;AAED,MAAsB,GAAG;IAOhB,SAAS,CAAC,IAAqB;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;gBACxD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;gBACxB,MAAM,CAAC,CAAA;YACT,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED;;;;;;;;;OASG;IACH,YAAmB,IAKlB;QACC,MAAM,EAAE,UAAU,EAAE,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QAC9D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,GAAG,UAAU,CAAA;QACvB,CAAC;aAAM,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,GAAG,IAAI,gCAAU,CAAC,GAAG,CAAC,CAAA;QAChC,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,GAAG,IAAI,+BAAS,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAqB;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACtD,OAAO;YACL,GAAG,MAAM;YACT,GAAG,MAAM;SACV,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,IAAqB,EACrB,WAAW,GAAG,IAAI;QAElB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAE/B,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACrC,IAAI,EAAE,KAAK,aAAa,IAAI,EAAE,KAAK,aAAa,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC7C,CAAC;QACD,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC7C,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAChD,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACtD,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;QACnE,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;QACtE,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;QACvE,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACnD,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC1D,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;QAC5D,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;QACtE,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC1D,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;QACnE,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,UAAU,GAAG,EAAiB,CAAA;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACvD,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACjD,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;YAC9D,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;YAC/D,MAAM,IAAI,CAAC,CAAA;YACX,UAAU,CAAC,IAAI,CAAC;gBACd,cAAc;gBACd,QAAQ;gBACR,UAAU;gBACV,WAAW;aACZ,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;QAE9D,mDAAmD;QACnD,4CAA4C;QAC5C,IAAI,QAAQ,GAAG,WAAW,IAAI,kBAAkB,GAAG,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,YAAwB,CAAA;QAC5B,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAA;YACjD,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;YAChC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;YAChE,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAClD,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAClD,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAClD,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACzD,MAAM,IAAI,CAAC,CAAA;YAEX,YAAY,GAAG;gBACb,QAAQ;gBACR,QAAQ;gBACR,QAAQ;gBACR,eAAe;gBACf,YAAY;aACb,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;QAC7B,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QAEvC,OAAO;YACL,UAAU;YACV,KAAK;YACL,eAAe;YACf,aAAa;YACb,UAAU;YACV,YAAY;YACZ,iBAAiB;YACjB,iBAAiB;YACjB,QAAQ;YACR,eAAe;YACf,kBAAkB;YAClB,kBAAkB;YAClB,mBAAmB;YACnB,QAAQ;YACR,OAAO;YACP,OAAO,EAAE,QAAQ;gBACf,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,EAAE;SACP,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,MAAoB,EACpB,IAA+B;QAE/B,MAAM,YAAY,GAA4B,EAAE,CAAA;QAChD,MAAM,UAAU,GAA2B,EAAE,CAAA;QAE7C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;QAEtD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC,CAAA;QAC5E,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,2DAA2D;QAC3D,MAAM,IAAI,CAAC,CAAA;QACX,+DAA+D;QAC/D,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAChD,MAAM,IAAI,CAAC,CAAA;QACX,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAChD,MAAM,IAAI,CAAC,CAAA;QACX,kEAAkE;QAClE,MAAM,IAAI,CAAC,CAAA;QAEX,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QAEvC,MAAM,WAAW,GAAG,KAAK,EAAE,aAAqB,EAAE,EAAE;YAClD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;YAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;YAC/B,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC5C,MAAM,IAAI,CAAC,CAAA;YACX,uDAAuD;YACvD,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC9C,MAAM,IAAI,CAAC,CAAA;YAEX,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAC3B,KAAK,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,EAC3B,aAAa,GAAG,MAAM,CACvB,CAAA;gBACD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;gBAC/B,MAAM,GAAG,CAAC,CAAA;gBAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/B,MAAM,GAAG,GAAG,OAAO;yBAChB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;yBAC5C,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACvB,MAAM,IAAI,OAAO,CAAA;oBACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;oBAC9C,MAAM,IAAI,CAAC,CAAA;oBACX,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;oBAChD,MAAM,IAAI,CAAC,CAAA;oBAEX,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA;oBAC3C,YAAY,CAAC,KAAK,CAAC,GAAG;wBACpB,IAAI,EAAE,GAAG;wBACT,EAAE,EAAE,KAAK;wBACT,MAAM,EAAE,OAAO;qBAChB,CAAA;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,EAAE,CAAA;gBACpB,MAAM,QAAQ,GAAG,WAAW,CAC1B,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC,CACnE,CAAA;gBACD,MAAM,GAAG,CAAC,CAAA;gBAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/B,MAAM,IAAI,OAAO,CAAA;oBACjB,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;oBAC/D,MAAM,IAAI,CAAC,CAAA;oBACX,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAA;gBAC1C,CAAC;gBACD,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC,CAAA;QACD,MAAM,WAAW,CAAC,eAAe,GAAG,EAAE,CAAC,CAAA;QACvC,OAAO;YACL,UAAU;YACV,YAAY;SACb,CAAA;IACH,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,eAAe,CAAC,IAAqB;QACnD,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GACpE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC5B,OAAO,IAAI,yBAAS,CAClB,IAAI,CAAC,GAAG,EACR,UAAU,EACV,mBAAmB,EACnB,iBAAiB,GAAG,CAAC,EACrB,QAAQ,CACT,CAAA;IACH,CAAC;IAUD;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,gBAAgB,CAC3B,OAAe,EACf,KAAa,EACb,GAAW,EACX,IAAsB;QAEtB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,IAAe,CAAA;QACnB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,CAAA;QAE1C,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAA;QACnD,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YACjB,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACxC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QACpC,CAAC;QAED,OAAO,IAAI,iBAAU,CAAY,QAAQ,CAAC,EAAE;YAC1C,IAAI;iBACD,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC;iBAChD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;gBACpB,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACnB,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,OAAe,EACf,KAAa,EACb,GAAW,EACX,IAAsB;QAEtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAEjE,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAc,EAAC,EAAE,CAAC,IAAI,CAAC,IAAA,mBAAO,GAAE,CAAC,CAAC,CAAA;QACpD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;CACF;AArUD,kBAqUC"}
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,17 +10,113 @@ 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
  }
16
- class BigBed extends bbi_ts_1.BBI {
17
- constructor() {
18
- super(...arguments);
19
- this.readIndicesCache = new abortable_promise_cache_1.default({
20
- cache: new quick_lru_1.default({ maxSize: 1 }),
21
- fill: (args, signal) => this._readIndices({ ...args, signal }),
22
- });
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;
23
113
  }
114
+ }
115
+ class BigBed extends bbi_ts_1.BBI {
116
+ readIndicesCache = new abortable_promise_cache_1.default({
117
+ cache: new quick_lru_1.default({ maxSize: 1 }),
118
+ fill: (args, signal) => this._readIndices({ ...args, signal }),
119
+ });
24
120
  readIndices(opts = {}) {
25
121
  const { signal, ...rest } = opts;
26
122
  return this.readIndicesCache.get(JSON.stringify(rest), opts, signal);
@@ -40,7 +136,7 @@ class BigBed extends bbi_ts_1.BBI {
40
136
  */
41
137
  async _readIndices(opts) {
42
138
  const { extHeaderOffset } = await this.getHeader(opts);
43
- const b = await this.bbi.read(64, Number(extHeaderOffset));
139
+ const b = await this.bbi.read(64, extHeaderOffset);
44
140
  const dataView = new DataView(b.buffer, b.byteOffset, b.length);
45
141
  let offset = 0;
46
142
  // const _size = dataView.getUint16(offset, true)
@@ -55,7 +151,7 @@ class BigBed extends bbi_ts_1.BBI {
55
151
  }
56
152
  const blocklen = 20;
57
153
  const len = blocklen * count;
58
- const buffer = await this.bbi.read(len, Number(dataOffset));
154
+ const buffer = await this.bbi.read(len, dataOffset);
59
155
  const indices = [];
60
156
  for (let i = 0; i < count; i += 1) {
61
157
  const b = buffer.subarray(i * blocklen);
@@ -66,9 +162,14 @@ class BigBed extends bbi_ts_1.BBI {
66
162
  const fieldcount = dataView.getInt16(offset, true);
67
163
  offset += 2;
68
164
  const dataOffset = Number(dataView.getBigUint64(offset, true));
69
- offset += 8 + 4; //4 skip
165
+ offset += 8 + 4; // skip 8-byte offset + 4 reserved bytes
70
166
  const field = dataView.getInt16(offset, true);
71
- indices.push({ type, fieldcount, offset: Number(dataOffset), field });
167
+ indices.push({
168
+ type,
169
+ fieldcount,
170
+ offset: dataOffset,
171
+ field,
172
+ });
72
173
  }
73
174
  return indices;
74
175
  }
@@ -87,7 +188,6 @@ class BigBed extends bbi_ts_1.BBI {
87
188
  if (indices.length === 0) {
88
189
  return [];
89
190
  }
90
- const decoder = new TextDecoder('utf8');
91
191
  const locs = indices.map(async (index) => {
92
192
  const { offset: offset2, field } = index;
93
193
  const b = await this.bbi.read(32, offset2, opts);
@@ -103,72 +203,7 @@ class BigBed extends bbi_ts_1.BBI {
103
203
  offset += 4;
104
204
  // const _itemCount = Number(dataView.getBigUint64(offset, true))
105
205
  offset += 8;
106
- const bptReadNode = async (nodeOffset) => {
107
- const val = Number(nodeOffset);
108
- const len = 4 + blockSize * (keySize + valSize);
109
- const buffer = await this.bbi.read(len, val, opts);
110
- const b = buffer;
111
- const dataView = new DataView(b.buffer, b.byteOffset, b.length);
112
- let offset = 0;
113
- const nodeType = dataView.getInt8(offset);
114
- offset += 2; //skip 1
115
- const cnt = dataView.getInt16(offset, true);
116
- offset += 2;
117
- const keys = [];
118
- if (nodeType === 0) {
119
- const leafkeys = [];
120
- for (let i = 0; i < cnt; i++) {
121
- const key = decoder
122
- .decode(b.subarray(offset, offset + keySize))
123
- .replaceAll('\0', '');
124
- offset += keySize;
125
- const dataOffset = Number(dataView.getBigUint64(offset, true));
126
- offset += 8;
127
- leafkeys.push({
128
- key,
129
- offset: dataOffset,
130
- });
131
- }
132
- let lastOffset = 0;
133
- for (const { key, offset } of leafkeys) {
134
- if (name.localeCompare(key) < 0 && lastOffset) {
135
- return bptReadNode(lastOffset);
136
- }
137
- lastOffset = offset;
138
- }
139
- return bptReadNode(lastOffset);
140
- }
141
- else if (nodeType === 1) {
142
- for (let i = 0; i < cnt; i++) {
143
- const key = decoder
144
- .decode(b.subarray(offset, offset + keySize))
145
- .replaceAll('\0', '');
146
- offset += keySize;
147
- const dataOffset = Number(dataView.getBigUint64(offset, true));
148
- offset += 8;
149
- const length = dataView.getUint32(offset, true);
150
- offset += 4;
151
- const reserved = dataView.getUint32(offset, true);
152
- offset += 4;
153
- keys.push({
154
- key,
155
- offset: dataOffset,
156
- length,
157
- reserved,
158
- });
159
- }
160
- for (const n of keys) {
161
- if (n.key === name) {
162
- return {
163
- ...n,
164
- field,
165
- };
166
- }
167
- }
168
- return undefined;
169
- }
170
- };
171
- return bptReadNode(offset2 + 32);
206
+ return readBPlusTreeNode(this.bbi, offset2 + 32, blockSize, keySize, valSize, name, field, opts);
172
207
  });
173
208
  return filterUndef(await Promise.all(locs));
174
209
  }
@@ -179,7 +214,7 @@ class BigBed extends bbi_ts_1.BBI {
179
214
  *
180
215
  * @param name - the name to search for
181
216
  *
182
- * @param opts - options object with optional AboutSignal
217
+ * @param opts - options object with optional AbortSignal
183
218
  *
184
219
  * @return array of Feature
185
220
  */
@@ -194,15 +229,21 @@ class BigBed extends bbi_ts_1.BBI {
194
229
  view.readFeatures(observer, [block], opts).catch((e) => {
195
230
  observer.error(e);
196
231
  });
197
- }).pipe((0, operators_1.reduce)((acc, curr) => acc.concat(curr)), (0, operators_1.map)(x => {
198
- for (const element of x) {
199
- element.field = block.field;
200
- }
201
- return x;
202
- }));
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 }))));
203
236
  });
204
237
  const ret = await (0, rxjs_1.firstValueFrom)((0, rxjs_1.merge)(...res));
205
- 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
+ });
206
247
  }
207
248
  }
208
249
  exports.BigBed = BigBed;