@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.
- package/CHANGELOG.md +10 -1
- package/dist/bbi.d.ts +20 -4
- package/dist/bbi.js +123 -106
- package/dist/bbi.js.map +1 -1
- package/dist/bigbed.js +88 -69
- package/dist/bigbed.js.map +1 -1
- package/dist/bigint-polyfill/polyfill.js +0 -10
- package/dist/bigint-polyfill/polyfill.js.map +1 -1
- package/dist/bigint-polyfill/pure.d.ts +0 -2
- package/dist/bigint-polyfill/pure.js +0 -26
- package/dist/bigint-polyfill/pure.js.map +1 -1
- package/dist/bigwig.js +3 -8
- package/dist/bigwig.js.map +1 -1
- package/dist/block-view.d.ts +4 -6
- package/dist/block-view.js +122 -131
- package/dist/block-view.js.map +1 -1
- package/dist/range.js +1 -1
- package/dist/range.js.map +1 -1
- package/dist/util.d.ts +12 -14
- package/dist/util.js +8 -14
- package/dist/util.js.map +1 -1
- package/esm/bbi.d.ts +20 -4
- package/esm/bbi.js +123 -106
- package/esm/bbi.js.map +1 -1
- package/esm/bigbed.js +88 -69
- package/esm/bigbed.js.map +1 -1
- package/esm/bigint-polyfill/polyfill.js +1 -11
- package/esm/bigint-polyfill/polyfill.js.map +1 -1
- package/esm/bigint-polyfill/pure.d.ts +0 -2
- package/esm/bigint-polyfill/pure.js +0 -24
- package/esm/bigint-polyfill/pure.js.map +1 -1
- package/esm/bigwig.js +3 -8
- package/esm/bigwig.js.map +1 -1
- package/esm/block-view.d.ts +4 -6
- package/esm/block-view.js +122 -131
- package/esm/block-view.js.map +1 -1
- package/esm/range.js +1 -1
- package/esm/range.js.map +1 -1
- package/esm/util.d.ts +12 -14
- package/esm/util.js +8 -14
- package/esm/util.js.map +1 -1
- package/package.json +4 -5
- package/src/bbi.ts +149 -116
- package/src/bigbed.ts +99 -80
- package/src/bigint-polyfill/polyfill.ts +1 -13
- package/src/bigint-polyfill/pure.ts +0 -36
- package/src/bigwig.ts +3 -9
- package/src/block-view.ts +133 -168
- package/src/range.ts +1 -1
- package/src/util.ts +16 -21
package/dist/util.d.ts
CHANGED
|
@@ -2,22 +2,19 @@ export declare class AbortError extends Error {
|
|
|
2
2
|
code: string;
|
|
3
3
|
constructor(message: string);
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
offset:
|
|
7
|
-
length:
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
length: bigint;
|
|
14
|
-
offset: bigint;
|
|
5
|
+
interface Block {
|
|
6
|
+
offset: number;
|
|
7
|
+
length: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function groupBlocks(blocks: Block[]): {
|
|
10
|
+
blocks: Block[];
|
|
11
|
+
length: number;
|
|
12
|
+
offset: number;
|
|
15
13
|
}[];
|
|
16
14
|
/**
|
|
17
|
-
* Properly check if the given AbortSignal is aborted.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* with a `code` attribute set to `ERR_ABORTED`.
|
|
15
|
+
* Properly check if the given AbortSignal is aborted. Per the standard, if the
|
|
16
|
+
* signal reads as aborted, this function throws either a DOMException
|
|
17
|
+
* AbortError, or a regular error with a `code` attribute set to `ERR_ABORTED`.
|
|
21
18
|
*
|
|
22
19
|
* For convenience, passing `undefined` is a no-op
|
|
23
20
|
*
|
|
@@ -32,3 +29,4 @@ export declare function checkAbortSignal(signal?: AbortSignal): void;
|
|
|
32
29
|
* @param {AbortSignal} signal
|
|
33
30
|
*/
|
|
34
31
|
export declare function abortBreakPoint(signal?: AbortSignal): Promise<void>;
|
|
32
|
+
export {};
|
package/dist/util.js
CHANGED
|
@@ -23,18 +23,14 @@ exports.AbortError = AbortError;
|
|
|
23
23
|
// sort blocks by file offset and
|
|
24
24
|
// group blocks that are within 2KB of eachother
|
|
25
25
|
function groupBlocks(blocks) {
|
|
26
|
-
blocks.sort((b0, b1) =>
|
|
26
|
+
blocks.sort((b0, b1) => b0.offset - b1.offset);
|
|
27
27
|
const blockGroups = [];
|
|
28
28
|
let lastBlock;
|
|
29
29
|
let lastBlockEnd;
|
|
30
30
|
for (const block of blocks) {
|
|
31
|
-
if (lastBlock &&
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
lastBlock.length = BigInt(Number(lastBlock.length) +
|
|
35
|
-
Number(block.length) -
|
|
36
|
-
lastBlockEnd +
|
|
37
|
-
Number(block.offset));
|
|
31
|
+
if (lastBlock && lastBlockEnd && block.offset - lastBlockEnd <= 2000) {
|
|
32
|
+
lastBlock.length =
|
|
33
|
+
lastBlock.length + block.length - lastBlockEnd + block.offset;
|
|
38
34
|
lastBlock.blocks.push(block);
|
|
39
35
|
}
|
|
40
36
|
else {
|
|
@@ -44,15 +40,14 @@ function groupBlocks(blocks) {
|
|
|
44
40
|
offset: block.offset,
|
|
45
41
|
}));
|
|
46
42
|
}
|
|
47
|
-
lastBlockEnd =
|
|
43
|
+
lastBlockEnd = lastBlock.offset + lastBlock.length;
|
|
48
44
|
}
|
|
49
45
|
return blockGroups;
|
|
50
46
|
}
|
|
51
47
|
/**
|
|
52
|
-
* Properly check if the given AbortSignal is aborted.
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* with a `code` attribute set to `ERR_ABORTED`.
|
|
48
|
+
* Properly check if the given AbortSignal is aborted. Per the standard, if the
|
|
49
|
+
* signal reads as aborted, this function throws either a DOMException
|
|
50
|
+
* AbortError, or a regular error with a `code` attribute set to `ERR_ABORTED`.
|
|
56
51
|
*
|
|
57
52
|
* For convenience, passing `undefined` is a no-op
|
|
58
53
|
*
|
|
@@ -64,7 +59,6 @@ function checkAbortSignal(signal) {
|
|
|
64
59
|
return;
|
|
65
60
|
}
|
|
66
61
|
if (signal.aborted) {
|
|
67
|
-
// console.log('bam aborted!')
|
|
68
62
|
if (typeof DOMException === 'undefined') {
|
|
69
63
|
const e = new AbortError('aborted');
|
|
70
64
|
e.code = 'ERR_ABORTED';
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;;;;;;;;;;AAeA,kCAwBC;AAYD,4CAcC;AAQD,0CAGC;AA5ED,MAAa,UAAW,SAAQ,KAAK;IAGnC,YAAmB,OAAe;QAChC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF;AAPD,gCAOC;AAMD,iCAAiC;AACjC,gDAAgD;AAChD,SAAgB,WAAW,CAAC,MAAe;IACzC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,CAAA;IAE9C,MAAM,WAAW,GAAG,EAAE,CAAA;IACtB,IAAI,SAAoD,CAAA;IACxD,IAAI,YAAgC,CAAA;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,SAAS,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,IAAI,IAAI,EAAE,CAAC;YACrE,SAAS,CAAC,MAAM;gBACd,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY,GAAG,KAAK,CAAC,MAAM,CAAA;YAC/D,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CACd,CAAC,SAAS,GAAG;gBACX,MAAM,EAAE,CAAC,KAAK,CAAC;gBACf,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC,CACH,CAAA;QACH,CAAC;QACD,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;IACpD,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;YACnC,CAAC,CAAC,IAAI,GAAG,aAAa,CAAA;YACtB,MAAM,CAAC,CAAA;QACT,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAsB,eAAe,CAAC,MAAoB;;QACxD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QACvB,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC1B,CAAC;CAAA"}
|
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
|
|
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
|
|
35
|
+
export interface MainHeader {
|
|
36
|
+
magic: number;
|
|
26
37
|
version: number;
|
|
27
38
|
autoSql: string;
|
|
28
39
|
totalSummary: Statistics;
|
|
29
|
-
|
|
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,10 @@
|
|
|
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) {
|
|
10
|
-
return new TextDecoder().decode(arr);
|
|
11
|
-
}
|
|
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
8
|
export class BBI {
|
|
71
9
|
getHeader(opts) {
|
|
72
10
|
if (!this.headerP) {
|
|
@@ -78,7 +16,8 @@ export class BBI {
|
|
|
78
16
|
return this.headerP;
|
|
79
17
|
}
|
|
80
18
|
/*
|
|
81
|
-
* @param filehandle - a filehandle from generic-filehandle or implementing
|
|
19
|
+
* @param filehandle - a filehandle from generic-filehandle or implementing
|
|
20
|
+
* something similar to the node10 fs.promises API
|
|
82
21
|
*
|
|
83
22
|
* @param path - a Local file path as a string
|
|
84
23
|
*
|
|
@@ -109,30 +48,101 @@ export class BBI {
|
|
|
109
48
|
return { ...header, ...chroms };
|
|
110
49
|
}
|
|
111
50
|
async _getMainHeader(opts, requestSize = 2000) {
|
|
51
|
+
const le = true;
|
|
112
52
|
const { buffer } = await this.bbi.read(Buffer.alloc(requestSize), 0, requestSize, 0, opts);
|
|
113
53
|
const isBigEndian = this._isBigEndian(buffer);
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
54
|
+
const b = buffer;
|
|
55
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
56
|
+
let offset = 0;
|
|
57
|
+
const magic = dataView.getInt32(offset, le);
|
|
58
|
+
offset += 4;
|
|
59
|
+
const version = dataView.getUint16(offset, le);
|
|
60
|
+
offset += 2;
|
|
61
|
+
const numZoomLevels = dataView.getUint16(offset, le);
|
|
62
|
+
offset += 2;
|
|
63
|
+
const chromTreeOffset = Number(dataView.getBigUint64(offset, le));
|
|
64
|
+
offset += 8;
|
|
65
|
+
const unzoomedDataOffset = Number(dataView.getBigUint64(offset, le));
|
|
66
|
+
offset += 8;
|
|
67
|
+
const unzoomedIndexOffset = Number(dataView.getBigUint64(offset, le));
|
|
68
|
+
offset += 8;
|
|
69
|
+
const fieldCount = dataView.getUint16(offset, le);
|
|
70
|
+
offset += 2;
|
|
71
|
+
const definedFieldCount = dataView.getUint16(offset, le);
|
|
72
|
+
offset += 2;
|
|
73
|
+
const asOffset = Number(dataView.getBigUint64(offset, le));
|
|
74
|
+
offset += 8;
|
|
75
|
+
const totalSummaryOffset = Number(dataView.getBigUint64(offset, le));
|
|
76
|
+
offset += 8;
|
|
77
|
+
const uncompressBufSize = dataView.getUint32(offset, le);
|
|
78
|
+
offset += 4;
|
|
79
|
+
const extHeaderOffset = Number(dataView.getBigUint64(offset, le));
|
|
80
|
+
offset += 8;
|
|
81
|
+
const zoomLevels = [];
|
|
82
|
+
for (let i = 0; i < numZoomLevels; i++) {
|
|
83
|
+
const reductionLevel = dataView.getUint32(offset, le);
|
|
84
|
+
offset += 4;
|
|
85
|
+
const reserved = dataView.getUint32(offset, le);
|
|
86
|
+
offset += 4;
|
|
87
|
+
const dataOffset = Number(dataView.getBigUint64(offset, le));
|
|
88
|
+
offset += 8;
|
|
89
|
+
const indexOffset = Number(dataView.getBigUint64(offset, le));
|
|
90
|
+
offset += 8;
|
|
91
|
+
zoomLevels.push({ reductionLevel, reserved, dataOffset, indexOffset });
|
|
124
92
|
}
|
|
93
|
+
const fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig';
|
|
125
94
|
// refetch header if it is too large on first pass,
|
|
126
95
|
// 8*5 is the sizeof the totalSummary struct
|
|
127
|
-
if (
|
|
96
|
+
if (asOffset > requestSize || totalSummaryOffset > requestSize - 8 * 5) {
|
|
128
97
|
return this._getMainHeader(opts, requestSize * 2);
|
|
129
98
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
99
|
+
let totalSummary;
|
|
100
|
+
if (totalSummaryOffset) {
|
|
101
|
+
const b = buffer.subarray(Number(totalSummaryOffset));
|
|
102
|
+
let offset = 0;
|
|
103
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
104
|
+
const basesCovered = Number(dataView.getBigUint64(offset, le));
|
|
105
|
+
offset += 8;
|
|
106
|
+
const scoreMin = dataView.getFloat64(offset, le);
|
|
107
|
+
offset += 8;
|
|
108
|
+
const scoreMax = dataView.getFloat64(offset, le);
|
|
109
|
+
offset += 8;
|
|
110
|
+
const scoreSum = dataView.getFloat64(offset, le);
|
|
111
|
+
offset += 8;
|
|
112
|
+
const scoreSumSquares = dataView.getFloat64(offset, le);
|
|
113
|
+
offset += 8;
|
|
114
|
+
totalSummary = {
|
|
115
|
+
scoreMin,
|
|
116
|
+
scoreMax,
|
|
117
|
+
scoreSum,
|
|
118
|
+
scoreSumSquares,
|
|
119
|
+
basesCovered,
|
|
120
|
+
};
|
|
134
121
|
}
|
|
135
|
-
|
|
122
|
+
else {
|
|
123
|
+
throw new Error('no stats');
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
zoomLevels,
|
|
127
|
+
magic,
|
|
128
|
+
extHeaderOffset,
|
|
129
|
+
numZoomLevels,
|
|
130
|
+
fieldCount,
|
|
131
|
+
totalSummary,
|
|
132
|
+
definedFieldCount,
|
|
133
|
+
uncompressBufSize,
|
|
134
|
+
asOffset,
|
|
135
|
+
chromTreeOffset,
|
|
136
|
+
totalSummaryOffset,
|
|
137
|
+
unzoomedDataOffset,
|
|
138
|
+
unzoomedIndexOffset,
|
|
139
|
+
fileType,
|
|
140
|
+
version,
|
|
141
|
+
isBigEndian,
|
|
142
|
+
autoSql: asOffset
|
|
143
|
+
? buffer.subarray(asOffset, buffer.indexOf(0, asOffset)).toString()
|
|
144
|
+
: '',
|
|
145
|
+
};
|
|
136
146
|
}
|
|
137
147
|
_isBigEndian(buffer) {
|
|
138
148
|
let ret = buffer.readInt32LE(0);
|
|
@@ -148,43 +158,50 @@ export class BBI {
|
|
|
148
158
|
// todo: add progress if long running
|
|
149
159
|
async _readChromTree(header, opts) {
|
|
150
160
|
const isBE = header.isBigEndian;
|
|
151
|
-
const le = isBE
|
|
161
|
+
const le = !isBE;
|
|
152
162
|
const refsByNumber = [];
|
|
153
163
|
const refsByName = {};
|
|
154
|
-
let unzoomedDataOffset =
|
|
155
|
-
const chromTreeOffset =
|
|
164
|
+
let unzoomedDataOffset = header.unzoomedDataOffset;
|
|
165
|
+
const chromTreeOffset = header.chromTreeOffset;
|
|
156
166
|
while (unzoomedDataOffset % 4 !== 0) {
|
|
157
167
|
unzoomedDataOffset += 1;
|
|
158
168
|
}
|
|
159
169
|
const off = unzoomedDataOffset - chromTreeOffset;
|
|
160
170
|
const { buffer } = await this.bbi.read(Buffer.alloc(off), 0, off, Number(chromTreeOffset), opts);
|
|
161
|
-
const
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
const b = buffer;
|
|
172
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
173
|
+
let offset = 0;
|
|
174
|
+
// const magic = dataView.getUint32(offset, le)
|
|
175
|
+
offset += 4;
|
|
176
|
+
// const blockSize = dataView.getUint32(offset, le)
|
|
177
|
+
offset += 4;
|
|
178
|
+
const keySize = dataView.getUint32(offset, le);
|
|
179
|
+
offset += 4;
|
|
180
|
+
// const valSize = dataView.getUint32(offset, le)
|
|
181
|
+
offset += 4;
|
|
182
|
+
// const itemCount = dataView.getBigUint64(offset, le)
|
|
183
|
+
offset += 8;
|
|
174
184
|
const rootNodeOffset = 32;
|
|
175
185
|
const bptReadNode = async (currentOffset) => {
|
|
176
186
|
let offset = currentOffset;
|
|
177
187
|
if (offset >= buffer.length) {
|
|
178
188
|
throw new Error('reading beyond end of buffer');
|
|
179
189
|
}
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
|
|
190
|
+
const isLeafNode = dataView.getUint8(offset);
|
|
191
|
+
offset += 2; //skip 1
|
|
192
|
+
const cnt = dataView.getUint16(offset, le);
|
|
193
|
+
offset += 2;
|
|
183
194
|
if (isLeafNode) {
|
|
184
|
-
for (let n = 0; n < cnt; n
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
195
|
+
for (let n = 0; n < cnt; n++) {
|
|
196
|
+
const key = buffer
|
|
197
|
+
.subarray(offset, offset + keySize)
|
|
198
|
+
.toString()
|
|
199
|
+
.replaceAll('\0', '');
|
|
200
|
+
offset += keySize;
|
|
201
|
+
const refId = dataView.getUint32(offset, le);
|
|
202
|
+
offset += 4;
|
|
203
|
+
const refSize = dataView.getUint32(offset, le);
|
|
204
|
+
offset += 4;
|
|
188
205
|
const refRec = { name: key, id: refId, length: refSize };
|
|
189
206
|
refsByName[this.renameRefSeqs(key)] = refId;
|
|
190
207
|
refsByNumber[refId] = refRec;
|
|
@@ -193,10 +210,10 @@ export class BBI {
|
|
|
193
210
|
else {
|
|
194
211
|
// parse index node
|
|
195
212
|
const nextNodes = [];
|
|
196
|
-
for (let n = 0; n < cnt; n
|
|
197
|
-
|
|
198
|
-
const
|
|
199
|
-
offset +=
|
|
213
|
+
for (let n = 0; n < cnt; n++) {
|
|
214
|
+
offset += keySize;
|
|
215
|
+
const childOffset = Number(dataView.getBigUint64(offset, le));
|
|
216
|
+
offset += 8;
|
|
200
217
|
nextNodes.push(bptReadNode(Number(childOffset) - Number(chromTreeOffset)));
|
|
201
218
|
}
|
|
202
219
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":"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"}
|