@gmod/bbi 4.0.6 → 5.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 (50) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/dist/bbi.d.ts +20 -4
  3. package/dist/bbi.js +124 -104
  4. package/dist/bbi.js.map +1 -1
  5. package/dist/bigbed.js +88 -69
  6. package/dist/bigbed.js.map +1 -1
  7. package/dist/bigint-polyfill/polyfill.js +0 -10
  8. package/dist/bigint-polyfill/polyfill.js.map +1 -1
  9. package/dist/bigint-polyfill/pure.d.ts +0 -2
  10. package/dist/bigint-polyfill/pure.js +0 -26
  11. package/dist/bigint-polyfill/pure.js.map +1 -1
  12. package/dist/bigwig.js +3 -8
  13. package/dist/bigwig.js.map +1 -1
  14. package/dist/block-view.d.ts +4 -6
  15. package/dist/block-view.js +122 -131
  16. package/dist/block-view.js.map +1 -1
  17. package/dist/range.js +1 -1
  18. package/dist/range.js.map +1 -1
  19. package/dist/util.d.ts +12 -14
  20. package/dist/util.js +8 -14
  21. package/dist/util.js.map +1 -1
  22. package/esm/bbi.d.ts +20 -4
  23. package/esm/bbi.js +124 -104
  24. package/esm/bbi.js.map +1 -1
  25. package/esm/bigbed.js +88 -69
  26. package/esm/bigbed.js.map +1 -1
  27. package/esm/bigint-polyfill/polyfill.js +1 -11
  28. package/esm/bigint-polyfill/polyfill.js.map +1 -1
  29. package/esm/bigint-polyfill/pure.d.ts +0 -2
  30. package/esm/bigint-polyfill/pure.js +0 -24
  31. package/esm/bigint-polyfill/pure.js.map +1 -1
  32. package/esm/bigwig.js +3 -8
  33. package/esm/bigwig.js.map +1 -1
  34. package/esm/block-view.d.ts +4 -6
  35. package/esm/block-view.js +122 -131
  36. package/esm/block-view.js.map +1 -1
  37. package/esm/range.js +1 -1
  38. package/esm/range.js.map +1 -1
  39. package/esm/util.d.ts +12 -14
  40. package/esm/util.js +8 -14
  41. package/esm/util.js.map +1 -1
  42. package/package.json +4 -5
  43. package/src/bbi.ts +151 -115
  44. package/src/bigbed.ts +99 -80
  45. package/src/bigint-polyfill/polyfill.ts +1 -13
  46. package/src/bigint-polyfill/pure.ts +0 -36
  47. package/src/bigwig.ts +3 -9
  48. package/src/block-view.ts +133 -168
  49. package/src/range.ts +1 -1
  50. package/src/util.ts +16 -21
package/CHANGELOG.md CHANGED
@@ -1,9 +1,14 @@
1
- ## [4.0.6](https://github.com/GMOD/bbi-js/compare/v4.0.5...v4.0.6) (2024-07-23)
1
+ # [5.0.0](https://github.com/GMOD/bbi-js/compare/v4.0.6...v5.0.0) (2024-08-09)
2
+
2
3
 
3
4
 
5
+ ## [4.0.6](https://github.com/GMOD/bbi-js/compare/v4.0.5...v4.0.6) (2024-07-23)
6
+
7
+ - Use renamed abortable-promise-cache -> @gmod/abortable-promise-cache
4
8
 
5
9
  ## [4.0.5](https://github.com/GMOD/bbi-js/compare/v4.0.4...v4.0.5) (2024-06-19)
6
10
 
11
+ - Improved linting
7
12
 
8
13
 
9
14
  ## [4.0.4](https://github.com/GMOD/bbi-js/compare/v4.0.3...v4.0.4) (2024-3-5)
package/dist/bbi.d.ts CHANGED
@@ -1,10 +1,18 @@
1
1
  import { GenericFilehandle } from 'generic-filehandle';
2
2
  import { Observable } from 'rxjs';
3
3
  import { BlockView } from './block-view';
4
+ interface ZoomLevel {
5
+ reductionLevel: number;
6
+ reserved: number;
7
+ dataOffset: number;
8
+ indexOffset: number;
9
+ }
4
10
  export interface Feature {
11
+ offset?: number;
12
+ chromId: number;
5
13
  start: number;
6
14
  end: number;
7
- score: number;
15
+ score?: number;
8
16
  rest?: string;
9
17
  minScore?: number;
10
18
  maxScore?: number;
@@ -16,26 +24,34 @@ interface Statistics {
16
24
  scoreSum: number;
17
25
  basesCovered: number;
18
26
  scoreSumSquares: number;
27
+ scoreMin: number;
28
+ scoreMax: number;
19
29
  }
20
30
  interface RefInfo {
21
31
  name: string;
22
32
  id: number;
23
33
  length: number;
24
34
  }
25
- export interface Header {
35
+ export interface MainHeader {
36
+ magic: number;
26
37
  version: number;
27
38
  autoSql: string;
28
39
  totalSummary: Statistics;
29
- zoomLevels: any;
40
+ asOffset: number;
41
+ zoomLevels: ZoomLevel[];
42
+ fieldCount: number;
43
+ numZoomLevels: number;
30
44
  unzoomedIndexOffset: number;
45
+ totalSummaryOffset: number;
31
46
  unzoomedDataOffset: number;
32
47
  definedFieldCount: number;
33
48
  uncompressBufSize: number;
34
49
  chromTreeOffset: number;
35
- fileSize: number;
36
50
  extHeaderOffset: number;
37
51
  isBigEndian: boolean;
38
52
  fileType: string;
53
+ }
54
+ export interface Header extends MainHeader {
39
55
  refsByName: Record<string, number>;
40
56
  refsByNumber: Record<number, RefInfo>;
41
57
  }
package/dist/bbi.js CHANGED
@@ -11,74 +11,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.BBI = void 0;
13
13
  const buffer_1 = require("buffer");
14
- const binary_parser_1 = require("binary-parser");
15
14
  const generic_filehandle_1 = require("generic-filehandle");
16
15
  const rxjs_1 = require("rxjs");
17
16
  const operators_1 = require("rxjs/operators");
18
17
  const block_view_1 = require("./block-view");
19
18
  const BIG_WIG_MAGIC = -2003829722;
20
19
  const BIG_BED_MAGIC = -2021002517;
21
- function toString(arr) {
20
+ function myToString(arr) {
22
21
  return new TextDecoder().decode(arr);
23
22
  }
24
- /**
25
- * get the compiled parsers for different sections of the bigwig file
26
- *
27
- * @param isBE - is big endian, typically false
28
- * @return an object with compiled parsers
29
- */
30
- function getParsers(isBE) {
31
- const le = isBE ? 'big' : 'little';
32
- const headerParser = new binary_parser_1.Parser()
33
- .endianess(le)
34
- .int32('magic')
35
- .uint16('version')
36
- .uint16('numZoomLevels')
37
- .uint64('chromTreeOffset')
38
- .uint64('unzoomedDataOffset')
39
- .uint64('unzoomedIndexOffset')
40
- .uint16('fieldCount')
41
- .uint16('definedFieldCount')
42
- .uint64('asOffset') // autoSql offset, used in bigbed
43
- .uint64('totalSummaryOffset')
44
- .uint32('uncompressBufSize')
45
- .uint64('extHeaderOffset') // name index offset, used in bigbed
46
- .array('zoomLevels', {
47
- length: 'numZoomLevels',
48
- type: new binary_parser_1.Parser()
49
- .endianess(le)
50
- .uint32('reductionLevel')
51
- .uint32('reserved')
52
- .uint64('dataOffset')
53
- .uint64('indexOffset'),
54
- });
55
- const totalSummaryParser = new binary_parser_1.Parser()
56
- .endianess(le)
57
- .uint64('basesCovered')
58
- .doublele('scoreMin')
59
- .doublele('scoreMax')
60
- .doublele('scoreSum')
61
- .doublele('scoreSumSquares');
62
- const chromTreeParser = new binary_parser_1.Parser()
63
- .endianess(le)
64
- .uint32('magic')
65
- .uint32('blockSize')
66
- .uint32('keySize')
67
- .uint32('valSize')
68
- .uint64('itemCount');
69
- const isLeafNode = new binary_parser_1.Parser()
70
- .endianess(le)
71
- .uint8('isLeafNode')
72
- .skip(1)
73
- .uint16('cnt')
74
- .saveOffset('offset');
75
- return {
76
- chromTreeParser,
77
- totalSummaryParser,
78
- headerParser,
79
- isLeafNode,
80
- };
81
- }
82
23
  class BBI {
83
24
  getHeader(opts) {
84
25
  if (!this.headerP) {
@@ -90,7 +31,8 @@ class BBI {
90
31
  return this.headerP;
91
32
  }
92
33
  /*
93
- * @param filehandle - a filehandle from generic-filehandle or implementing something similar to the node10 fs.promises API
34
+ * @param filehandle - a filehandle from generic-filehandle or implementing
35
+ * something similar to the node10 fs.promises API
94
36
  *
95
37
  * @param path - a Local file path as a string
96
38
  *
@@ -124,30 +66,101 @@ class BBI {
124
66
  }
125
67
  _getMainHeader(opts_1) {
126
68
  return __awaiter(this, arguments, void 0, function* (opts, requestSize = 2000) {
69
+ const le = true;
127
70
  const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(requestSize), 0, requestSize, 0, opts);
128
71
  const isBigEndian = this._isBigEndian(buffer);
129
- const ret = getParsers(isBigEndian);
130
- const header = ret.headerParser.parse(buffer);
131
- const { magic, asOffset, totalSummaryOffset } = header;
132
- header.fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig';
133
- if (asOffset > requestSize || totalSummaryOffset > requestSize) {
134
- return this._getMainHeader(opts, requestSize * 2);
135
- }
136
- if (asOffset) {
137
- const off = Number(header.asOffset);
138
- header.autoSql = toString(buffer.subarray(off, buffer.indexOf(0, off)));
72
+ const b = buffer;
73
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
74
+ let offset = 0;
75
+ const magic = dataView.getInt32(offset, le);
76
+ offset += 4;
77
+ const version = dataView.getUint16(offset, le);
78
+ offset += 2;
79
+ const numZoomLevels = dataView.getUint16(offset, le);
80
+ offset += 2;
81
+ const chromTreeOffset = Number(dataView.getBigUint64(offset, le));
82
+ offset += 8;
83
+ const unzoomedDataOffset = Number(dataView.getBigUint64(offset, le));
84
+ offset += 8;
85
+ const unzoomedIndexOffset = Number(dataView.getBigUint64(offset, le));
86
+ offset += 8;
87
+ const fieldCount = dataView.getUint16(offset, le);
88
+ offset += 2;
89
+ const definedFieldCount = dataView.getUint16(offset, le);
90
+ offset += 2;
91
+ const asOffset = Number(dataView.getBigUint64(offset, le));
92
+ offset += 8;
93
+ const totalSummaryOffset = Number(dataView.getBigUint64(offset, le));
94
+ offset += 8;
95
+ const uncompressBufSize = dataView.getUint32(offset, le);
96
+ offset += 4;
97
+ const extHeaderOffset = Number(dataView.getBigUint64(offset, le));
98
+ offset += 8;
99
+ const zoomLevels = [];
100
+ for (let i = 0; i < numZoomLevels; i++) {
101
+ const reductionLevel = dataView.getUint32(offset, le);
102
+ offset += 4;
103
+ const reserved = dataView.getUint32(offset, le);
104
+ offset += 4;
105
+ const dataOffset = Number(dataView.getBigUint64(offset, le));
106
+ offset += 8;
107
+ const indexOffset = Number(dataView.getBigUint64(offset, le));
108
+ offset += 8;
109
+ zoomLevels.push({ reductionLevel, reserved, dataOffset, indexOffset });
139
110
  }
111
+ const fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig';
140
112
  // refetch header if it is too large on first pass,
141
113
  // 8*5 is the sizeof the totalSummary struct
142
- if (header.totalSummaryOffset > requestSize - 8 * 5) {
114
+ if (asOffset > requestSize || totalSummaryOffset > requestSize - 8 * 5) {
143
115
  return this._getMainHeader(opts, requestSize * 2);
144
116
  }
145
- if (header.totalSummaryOffset) {
146
- const tail = buffer.subarray(Number(header.totalSummaryOffset));
147
- const sum = ret.totalSummaryParser.parse(tail);
148
- header.totalSummary = Object.assign(Object.assign({}, sum), { basesCovered: Number(sum.basesCovered) });
117
+ let totalSummary;
118
+ if (totalSummaryOffset) {
119
+ const b = buffer.subarray(Number(totalSummaryOffset));
120
+ let offset = 0;
121
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
122
+ const basesCovered = Number(dataView.getBigUint64(offset, le));
123
+ offset += 8;
124
+ const scoreMin = dataView.getFloat64(offset, le);
125
+ offset += 8;
126
+ const scoreMax = dataView.getFloat64(offset, le);
127
+ offset += 8;
128
+ const scoreSum = dataView.getFloat64(offset, le);
129
+ offset += 8;
130
+ const scoreSumSquares = dataView.getFloat64(offset, le);
131
+ offset += 8;
132
+ totalSummary = {
133
+ scoreMin,
134
+ scoreMax,
135
+ scoreSum,
136
+ scoreSumSquares,
137
+ basesCovered,
138
+ };
149
139
  }
150
- return Object.assign(Object.assign({}, header), { isBigEndian });
140
+ else {
141
+ throw new Error('no stats');
142
+ }
143
+ return {
144
+ zoomLevels,
145
+ magic,
146
+ extHeaderOffset,
147
+ numZoomLevels,
148
+ fieldCount,
149
+ totalSummary,
150
+ definedFieldCount,
151
+ uncompressBufSize,
152
+ asOffset,
153
+ chromTreeOffset,
154
+ totalSummaryOffset,
155
+ unzoomedDataOffset,
156
+ unzoomedIndexOffset,
157
+ fileType,
158
+ version,
159
+ isBigEndian,
160
+ autoSql: asOffset
161
+ ? myToString(buffer.subarray(asOffset, buffer.indexOf(0, asOffset)))
162
+ : '',
163
+ };
151
164
  });
152
165
  }
153
166
  _isBigEndian(buffer) {
@@ -165,43 +178,50 @@ class BBI {
165
178
  _readChromTree(header, opts) {
166
179
  return __awaiter(this, void 0, void 0, function* () {
167
180
  const isBE = header.isBigEndian;
168
- const le = isBE ? 'big' : 'little';
181
+ const le = !isBE;
169
182
  const refsByNumber = [];
170
183
  const refsByName = {};
171
- let unzoomedDataOffset = Number(header.unzoomedDataOffset);
172
- const chromTreeOffset = Number(header.chromTreeOffset);
184
+ let unzoomedDataOffset = header.unzoomedDataOffset;
185
+ const chromTreeOffset = header.chromTreeOffset;
173
186
  while (unzoomedDataOffset % 4 !== 0) {
174
187
  unzoomedDataOffset += 1;
175
188
  }
176
189
  const off = unzoomedDataOffset - chromTreeOffset;
177
190
  const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(off), 0, off, Number(chromTreeOffset), opts);
178
- const p = getParsers(isBE);
179
- const { keySize } = p.chromTreeParser.parse(buffer);
180
- const leafNodeParser = new binary_parser_1.Parser()
181
- .endianess(le)
182
- .string('key', { stripNull: true, length: keySize })
183
- .uint32('refId')
184
- .uint32('refSize')
185
- .saveOffset('offset');
186
- const nonleafNodeParser = new binary_parser_1.Parser()
187
- .endianess(le)
188
- .skip(keySize)
189
- .uint64('childOffset')
190
- .saveOffset('offset');
191
+ const b = buffer;
192
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
193
+ let offset = 0;
194
+ // const magic = dataView.getUint32(offset, le)
195
+ offset += 4;
196
+ // const blockSize = dataView.getUint32(offset, le)
197
+ offset += 4;
198
+ const keySize = dataView.getUint32(offset, le);
199
+ offset += 4;
200
+ // const valSize = dataView.getUint32(offset, le)
201
+ offset += 4;
202
+ // const itemCount = dataView.getBigUint64(offset, le)
203
+ offset += 8;
191
204
  const rootNodeOffset = 32;
192
205
  const bptReadNode = (currentOffset) => __awaiter(this, void 0, void 0, function* () {
193
206
  let offset = currentOffset;
194
207
  if (offset >= buffer.length) {
195
208
  throw new Error('reading beyond end of buffer');
196
209
  }
197
- const ret = p.isLeafNode.parse(buffer.subarray(offset));
198
- const { isLeafNode, cnt } = ret;
199
- offset += ret.offset;
210
+ const isLeafNode = dataView.getUint8(offset);
211
+ offset += 2; //skip 1
212
+ const cnt = dataView.getUint16(offset, le);
213
+ offset += 2;
200
214
  if (isLeafNode) {
201
- for (let n = 0; n < cnt; n += 1) {
202
- const leafRet = leafNodeParser.parse(buffer.subarray(offset));
203
- offset += leafRet.offset;
204
- const { key, refId, refSize } = leafRet;
215
+ for (let n = 0; n < cnt; n++) {
216
+ const key = buffer
217
+ .subarray(offset, offset + keySize)
218
+ .toString()
219
+ .replaceAll('\0', '');
220
+ offset += keySize;
221
+ const refId = dataView.getUint32(offset, le);
222
+ offset += 4;
223
+ const refSize = dataView.getUint32(offset, le);
224
+ offset += 4;
205
225
  const refRec = { name: key, id: refId, length: refSize };
206
226
  refsByName[this.renameRefSeqs(key)] = refId;
207
227
  refsByNumber[refId] = refRec;
@@ -210,10 +230,10 @@ class BBI {
210
230
  else {
211
231
  // parse index node
212
232
  const nextNodes = [];
213
- for (let n = 0; n < cnt; n += 1) {
214
- const nonleafRet = nonleafNodeParser.parse(buffer.subarray(offset));
215
- const { childOffset } = nonleafRet;
216
- offset += nonleafRet.offset;
233
+ for (let n = 0; n < cnt; n++) {
234
+ offset += keySize;
235
+ const childOffset = Number(dataView.getBigUint64(offset, le));
236
+ offset += 8;
217
237
  nextNodes.push(bptReadNode(Number(childOffset) - Number(chromTreeOffset)));
218
238
  }
219
239
  yield Promise.all(nextNodes);
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.js CHANGED
@@ -26,11 +26,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.BigBed = void 0;
27
27
  exports.filterUndef = filterUndef;
28
28
  const buffer_1 = require("buffer");
29
- const binary_parser_1 = require("binary-parser");
30
29
  const rxjs_1 = require("rxjs");
31
30
  const operators_1 = require("rxjs/operators");
32
31
  const abortable_promise_cache_1 = __importDefault(require("@gmod/abortable-promise-cache"));
33
32
  const quick_lru_1 = __importDefault(require("quick-lru"));
33
+ // locals
34
34
  const bbi_1 = require("./bbi");
35
35
  function filterUndef(ts) {
36
36
  return ts.filter((t) => !!t);
@@ -57,45 +57,52 @@ class BigBed extends bbi_1.BBI {
57
57
  }
58
58
  /*
59
59
  * parse the bigbed extraIndex fields
60
- * @param abortSignal to abort operation
61
- * @return a Promise for an array of Index data structure since there can be multiple extraIndexes in a bigbed, see bedToBigBed documentation
60
+ *
61
+ *
62
+ * @return a Promise for an array of Index data structure since there can be
63
+ * multiple extraIndexes in a bigbed, see bedToBigBed documentation
62
64
  */
63
65
  _readIndices(opts) {
64
66
  return __awaiter(this, void 0, void 0, function* () {
65
67
  const { extHeaderOffset, isBigEndian } = yield this.getHeader(opts);
66
68
  const { buffer: data } = yield this.bbi.read(buffer_1.Buffer.alloc(64), 0, 64, Number(extHeaderOffset));
67
- const le = isBigEndian ? 'big' : 'little';
68
- const ret = new binary_parser_1.Parser()
69
- .endianess(le)
70
- .uint16('size')
71
- .uint16('count')
72
- .uint64('offset')
73
- .parse(data);
74
- const { count, offset } = ret;
69
+ const le = !isBigEndian;
70
+ const b = data;
71
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
72
+ let offset = 0;
73
+ // const _size = dataView.getUint16(offset, le)
74
+ offset += 2;
75
+ const count = dataView.getUint16(offset, le);
76
+ offset += 2;
77
+ const dataOffset = Number(dataView.getBigUint64(offset, le));
78
+ offset += 8;
75
79
  // no extra index is defined if count==0
76
80
  if (count === 0) {
77
81
  return [];
78
82
  }
79
83
  const blocklen = 20;
80
84
  const len = blocklen * count;
81
- const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(len), 0, len, Number(offset));
82
- const extParser = new binary_parser_1.Parser()
83
- .endianess(le)
84
- .int16('type')
85
- .int16('fieldcount')
86
- .uint64('offset')
87
- .skip(4)
88
- .int16('field');
85
+ const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(len), 0, len, Number(dataOffset));
89
86
  const indices = [];
90
87
  for (let i = 0; i < count; i += 1) {
91
- indices.push(extParser.parse(buffer.subarray(i * blocklen)));
88
+ const b = buffer.subarray(i * blocklen);
89
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
90
+ let offset = 0;
91
+ const type = dataView.getInt16(offset, le);
92
+ offset += 2;
93
+ const fieldcount = dataView.getInt16(offset, le);
94
+ offset += 2;
95
+ const dataOffset = Number(dataView.getBigUint64(offset, le));
96
+ offset += 8 + 4; //4 skip
97
+ const field = dataView.getInt16(offset, le);
98
+ indices.push({ type, fieldcount, offset: Number(dataOffset), field });
92
99
  }
93
100
  return indices;
94
101
  });
95
102
  }
96
103
  /*
97
- * perform a search in the bigbed extraIndex to find which blocks in the bigbed data to look for the
98
- * actual feature data
104
+ * perform a search in the bigbed extraIndex to find which blocks in the
105
+ * bigbed data to look for the actual feature data
99
106
  *
100
107
  * @param name - the name to search for
101
108
  * @param opts - a SearchOptions argument with optional signal
@@ -109,52 +116,48 @@ class BigBed extends bbi_1.BBI {
109
116
  return [];
110
117
  }
111
118
  const locs = indices.map((index) => __awaiter(this, void 0, void 0, function* () {
112
- const { offset, field } = index;
113
- const { buffer: data } = yield this.bbi.read(buffer_1.Buffer.alloc(32), 0, 32, Number(offset), opts);
114
- const le = isBigEndian ? 'big' : 'little';
115
- const p = new binary_parser_1.Parser()
116
- .endianess(le)
117
- .int32('magic')
118
- .int32('blockSize')
119
- .int32('keySize')
120
- .int32('valSize')
121
- .uint64('itemCount');
122
- const { blockSize, keySize, valSize } = p.parse(data);
123
- // console.log({blockSize,keySize,valSize})
124
- const bpt = new binary_parser_1.Parser()
125
- .endianess(le)
126
- .int8('nodeType')
127
- .skip(1)
128
- .int16('cnt')
129
- .choice({
130
- tag: 'nodeType',
131
- choices: {
132
- 0: new binary_parser_1.Parser().array('leafkeys', {
133
- length: 'cnt',
134
- type: new binary_parser_1.Parser()
135
- .endianess(le)
136
- .string('key', { length: keySize, stripNull: true })
137
- .uint64('offset'),
138
- }),
139
- 1: new binary_parser_1.Parser().array('keys', {
140
- length: 'cnt',
141
- type: new binary_parser_1.Parser()
142
- .endianess(le)
143
- .string('key', { length: keySize, stripNull: true })
144
- .uint64('offset')
145
- .uint32('length')
146
- .uint32('reserved'),
147
- }),
148
- },
149
- });
119
+ const { offset: offset2, field } = index;
120
+ const { buffer: data } = yield this.bbi.read(buffer_1.Buffer.alloc(32), 0, 32, offset2, opts);
121
+ const le = !isBigEndian;
122
+ const b = data;
123
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
124
+ let offset = 0;
125
+ // const _magic = dataView.getInt32(offset, le)
126
+ offset += 4;
127
+ const blockSize = dataView.getInt32(offset, le);
128
+ offset += 4;
129
+ const keySize = dataView.getInt32(offset, le);
130
+ offset += 4;
131
+ const valSize = dataView.getInt32(offset, le);
132
+ offset += 4;
133
+ // const _itemCount = Number(dataView.getBigUint64(offset, le))
134
+ offset += 8;
150
135
  const bptReadNode = (nodeOffset) => __awaiter(this, void 0, void 0, function* () {
151
136
  const val = Number(nodeOffset);
152
137
  const len = 4 + blockSize * (keySize + valSize);
153
138
  const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(len), 0, len, val, opts);
154
- const node = bpt.parse(buffer);
155
- if (node.leafkeys) {
156
- let lastOffset;
157
- for (const { key, offset } of node.leafkeys) {
139
+ const b = buffer;
140
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
141
+ let offset = 0;
142
+ const nodeType = dataView.getInt8(offset);
143
+ offset += 2; //skip 1
144
+ const cnt = dataView.getInt16(offset, le);
145
+ offset += 2;
146
+ const keys = [];
147
+ if (nodeType === 0) {
148
+ const leafkeys = [];
149
+ for (let i = 0; i < cnt; i++) {
150
+ const key = b
151
+ .subarray(offset, offset + keySize)
152
+ .toString()
153
+ .replaceAll('\0', '');
154
+ offset += keySize;
155
+ const dataOffset = Number(dataView.getBigUint64(offset, le));
156
+ offset += 8;
157
+ leafkeys.push({ key, offset: dataOffset });
158
+ }
159
+ let lastOffset = 0;
160
+ for (const { key, offset } of leafkeys) {
158
161
  if (name.localeCompare(key) < 0 && lastOffset) {
159
162
  return bptReadNode(lastOffset);
160
163
  }
@@ -162,15 +165,31 @@ class BigBed extends bbi_1.BBI {
162
165
  }
163
166
  return bptReadNode(lastOffset);
164
167
  }
165
- for (const n of node.keys) {
166
- if (n.key === name) {
167
- return Object.assign(Object.assign({}, n), { field });
168
+ else if (nodeType === 1) {
169
+ for (let i = 0; i < cnt; i++) {
170
+ const key = b
171
+ .subarray(offset, offset + keySize)
172
+ .toString()
173
+ .replaceAll('\0', '');
174
+ offset += keySize;
175
+ const dataOffset = Number(dataView.getBigUint64(offset, le));
176
+ offset += 8;
177
+ const length = dataView.getUint32(offset, le);
178
+ offset += 4;
179
+ const reserved = dataView.getUint32(offset, le);
180
+ offset += 4;
181
+ keys.push({ key, offset: dataOffset, length, reserved });
182
+ }
183
+ for (const n of keys) {
184
+ if (n.key === name) {
185
+ return Object.assign(Object.assign({}, n), { field });
186
+ }
168
187
  }
188
+ return undefined;
169
189
  }
170
- return undefined;
171
190
  });
172
191
  const rootNodeOffset = 32;
173
- return bptReadNode(Number(offset) + rootNodeOffset);
192
+ return bptReadNode(offset2 + rootNodeOffset);
174
193
  }));
175
194
  return filterUndef(yield Promise.all(locs));
176
195
  });