@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.
- package/CHANGELOG.md +6 -1
- package/dist/bbi.d.ts +20 -4
- package/dist/bbi.js +124 -104
- 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 +124 -104
- 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 +151 -115
- 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,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
|
|
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
|
|
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
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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 (
|
|
99
|
+
if (asOffset > requestSize || totalSummaryOffset > requestSize - 8 * 5) {
|
|
128
100
|
return this._getMainHeader(opts, requestSize * 2);
|
|
129
101
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
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
|
-
|
|
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
|
|
164
|
+
const le = !isBE;
|
|
152
165
|
const refsByNumber = [];
|
|
153
166
|
const refsByName = {};
|
|
154
|
-
let unzoomedDataOffset =
|
|
155
|
-
const 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
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
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
|
|
197
|
-
|
|
198
|
-
const
|
|
199
|
-
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":"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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"}
|