@gmod/bbi 4.0.6 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/dist/bbi.d.ts +20 -4
  3. package/dist/bbi.js +123 -106
  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 +123 -106
  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 +149 -116
  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,18 @@
1
- ## [4.0.6](https://github.com/GMOD/bbi-js/compare/v4.0.5...v4.0.6) (2024-07-23)
1
+ ## [5.0.1](https://github.com/GMOD/bbi-js/compare/v5.0.0...v5.0.1) (2024-08-09)
2
+
3
+
4
+
5
+ # [5.0.0](https://github.com/GMOD/bbi-js/compare/v4.0.6...v5.0.0) (2024-08-09)
2
6
 
3
7
 
4
8
 
9
+ ## [4.0.6](https://github.com/GMOD/bbi-js/compare/v4.0.5...v4.0.6) (2024-07-23)
10
+
11
+ - Use renamed abortable-promise-cache -> @gmod/abortable-promise-cache
12
+
5
13
  ## [4.0.5](https://github.com/GMOD/bbi-js/compare/v4.0.4...v4.0.5) (2024-06-19)
6
14
 
15
+ - Improved linting
7
16
 
8
17
 
9
18
  ## [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,12 @@ 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) {
22
- return new TextDecoder().decode(arr);
23
- }
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
20
  class BBI {
83
21
  getHeader(opts) {
84
22
  if (!this.headerP) {
@@ -90,7 +28,8 @@ class BBI {
90
28
  return this.headerP;
91
29
  }
92
30
  /*
93
- * @param filehandle - a filehandle from generic-filehandle or implementing something similar to the node10 fs.promises API
31
+ * @param filehandle - a filehandle from generic-filehandle or implementing
32
+ * something similar to the node10 fs.promises API
94
33
  *
95
34
  * @param path - a Local file path as a string
96
35
  *
@@ -124,30 +63,101 @@ class BBI {
124
63
  }
125
64
  _getMainHeader(opts_1) {
126
65
  return __awaiter(this, arguments, void 0, function* (opts, requestSize = 2000) {
66
+ const le = true;
127
67
  const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(requestSize), 0, requestSize, 0, opts);
128
68
  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)));
69
+ const b = buffer;
70
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
71
+ let offset = 0;
72
+ const magic = dataView.getInt32(offset, le);
73
+ offset += 4;
74
+ const version = dataView.getUint16(offset, le);
75
+ offset += 2;
76
+ const numZoomLevels = dataView.getUint16(offset, le);
77
+ offset += 2;
78
+ const chromTreeOffset = Number(dataView.getBigUint64(offset, le));
79
+ offset += 8;
80
+ const unzoomedDataOffset = Number(dataView.getBigUint64(offset, le));
81
+ offset += 8;
82
+ const unzoomedIndexOffset = Number(dataView.getBigUint64(offset, le));
83
+ offset += 8;
84
+ const fieldCount = dataView.getUint16(offset, le);
85
+ offset += 2;
86
+ const definedFieldCount = dataView.getUint16(offset, le);
87
+ offset += 2;
88
+ const asOffset = Number(dataView.getBigUint64(offset, le));
89
+ offset += 8;
90
+ const totalSummaryOffset = Number(dataView.getBigUint64(offset, le));
91
+ offset += 8;
92
+ const uncompressBufSize = dataView.getUint32(offset, le);
93
+ offset += 4;
94
+ const extHeaderOffset = Number(dataView.getBigUint64(offset, le));
95
+ offset += 8;
96
+ const zoomLevels = [];
97
+ for (let i = 0; i < numZoomLevels; i++) {
98
+ const reductionLevel = dataView.getUint32(offset, le);
99
+ offset += 4;
100
+ const reserved = dataView.getUint32(offset, le);
101
+ offset += 4;
102
+ const dataOffset = Number(dataView.getBigUint64(offset, le));
103
+ offset += 8;
104
+ const indexOffset = Number(dataView.getBigUint64(offset, le));
105
+ offset += 8;
106
+ zoomLevels.push({ reductionLevel, reserved, dataOffset, indexOffset });
139
107
  }
108
+ const fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig';
140
109
  // refetch header if it is too large on first pass,
141
110
  // 8*5 is the sizeof the totalSummary struct
142
- if (header.totalSummaryOffset > requestSize - 8 * 5) {
111
+ if (asOffset > requestSize || totalSummaryOffset > requestSize - 8 * 5) {
143
112
  return this._getMainHeader(opts, requestSize * 2);
144
113
  }
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) });
114
+ let totalSummary;
115
+ if (totalSummaryOffset) {
116
+ const b = buffer.subarray(Number(totalSummaryOffset));
117
+ let offset = 0;
118
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
119
+ const basesCovered = Number(dataView.getBigUint64(offset, le));
120
+ offset += 8;
121
+ const scoreMin = dataView.getFloat64(offset, le);
122
+ offset += 8;
123
+ const scoreMax = dataView.getFloat64(offset, le);
124
+ offset += 8;
125
+ const scoreSum = dataView.getFloat64(offset, le);
126
+ offset += 8;
127
+ const scoreSumSquares = dataView.getFloat64(offset, le);
128
+ offset += 8;
129
+ totalSummary = {
130
+ scoreMin,
131
+ scoreMax,
132
+ scoreSum,
133
+ scoreSumSquares,
134
+ basesCovered,
135
+ };
149
136
  }
150
- return Object.assign(Object.assign({}, header), { isBigEndian });
137
+ else {
138
+ throw new Error('no stats');
139
+ }
140
+ return {
141
+ zoomLevels,
142
+ magic,
143
+ extHeaderOffset,
144
+ numZoomLevels,
145
+ fieldCount,
146
+ totalSummary,
147
+ definedFieldCount,
148
+ uncompressBufSize,
149
+ asOffset,
150
+ chromTreeOffset,
151
+ totalSummaryOffset,
152
+ unzoomedDataOffset,
153
+ unzoomedIndexOffset,
154
+ fileType,
155
+ version,
156
+ isBigEndian,
157
+ autoSql: asOffset
158
+ ? buffer.subarray(asOffset, buffer.indexOf(0, asOffset)).toString()
159
+ : '',
160
+ };
151
161
  });
152
162
  }
153
163
  _isBigEndian(buffer) {
@@ -165,43 +175,50 @@ class BBI {
165
175
  _readChromTree(header, opts) {
166
176
  return __awaiter(this, void 0, void 0, function* () {
167
177
  const isBE = header.isBigEndian;
168
- const le = isBE ? 'big' : 'little';
178
+ const le = !isBE;
169
179
  const refsByNumber = [];
170
180
  const refsByName = {};
171
- let unzoomedDataOffset = Number(header.unzoomedDataOffset);
172
- const chromTreeOffset = Number(header.chromTreeOffset);
181
+ let unzoomedDataOffset = header.unzoomedDataOffset;
182
+ const chromTreeOffset = header.chromTreeOffset;
173
183
  while (unzoomedDataOffset % 4 !== 0) {
174
184
  unzoomedDataOffset += 1;
175
185
  }
176
186
  const off = unzoomedDataOffset - chromTreeOffset;
177
187
  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');
188
+ const b = buffer;
189
+ const dataView = new DataView(b.buffer, b.byteOffset, b.length);
190
+ let offset = 0;
191
+ // const magic = dataView.getUint32(offset, le)
192
+ offset += 4;
193
+ // const blockSize = dataView.getUint32(offset, le)
194
+ offset += 4;
195
+ const keySize = dataView.getUint32(offset, le);
196
+ offset += 4;
197
+ // const valSize = dataView.getUint32(offset, le)
198
+ offset += 4;
199
+ // const itemCount = dataView.getBigUint64(offset, le)
200
+ offset += 8;
191
201
  const rootNodeOffset = 32;
192
202
  const bptReadNode = (currentOffset) => __awaiter(this, void 0, void 0, function* () {
193
203
  let offset = currentOffset;
194
204
  if (offset >= buffer.length) {
195
205
  throw new Error('reading beyond end of buffer');
196
206
  }
197
- const ret = p.isLeafNode.parse(buffer.subarray(offset));
198
- const { isLeafNode, cnt } = ret;
199
- offset += ret.offset;
207
+ const isLeafNode = dataView.getUint8(offset);
208
+ offset += 2; //skip 1
209
+ const cnt = dataView.getUint16(offset, le);
210
+ offset += 2;
200
211
  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;
212
+ for (let n = 0; n < cnt; n++) {
213
+ const key = buffer
214
+ .subarray(offset, offset + keySize)
215
+ .toString()
216
+ .replaceAll('\0', '');
217
+ offset += keySize;
218
+ const refId = dataView.getUint32(offset, le);
219
+ offset += 4;
220
+ const refSize = dataView.getUint32(offset, le);
221
+ offset += 4;
205
222
  const refRec = { name: key, id: refId, length: refSize };
206
223
  refsByName[this.renameRefSeqs(key)] = refId;
207
224
  refsByNumber[refId] = refRec;
@@ -210,10 +227,10 @@ class BBI {
210
227
  else {
211
228
  // parse index node
212
229
  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;
230
+ for (let n = 0; n < cnt; n++) {
231
+ offset += keySize;
232
+ const childOffset = Number(dataView.getBigUint64(offset, le));
233
+ offset += 8;
217
234
  nextNodes.push(bptReadNode(Number(childOffset) - Number(chromTreeOffset)));
218
235
  }
219
236
  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
  });