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