@gmod/bbi 6.0.1 → 6.0.3

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 (54) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/bbi.d.ts +3 -64
  3. package/dist/bbi.js +13 -2
  4. package/dist/bbi.js.map +1 -1
  5. package/dist/bigbed.d.ts +2 -1
  6. package/dist/bigbed.js +7 -6
  7. package/dist/bigbed.js.map +1 -1
  8. package/dist/bigint-polyfill/polyfill.js +3 -0
  9. package/dist/bigint-polyfill/polyfill.js.map +1 -1
  10. package/dist/bigint-polyfill/pure.js +3 -0
  11. package/dist/bigint-polyfill/pure.js.map +1 -1
  12. package/dist/bigwig.d.ts +2 -1
  13. package/dist/bigwig.js +1 -1
  14. package/dist/bigwig.js.map +1 -1
  15. package/dist/block-view.d.ts +3 -4
  16. package/dist/block-view.js +4 -11
  17. package/dist/block-view.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +0 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/types.d.ts +61 -0
  22. package/dist/types.js +3 -0
  23. package/dist/types.js.map +1 -0
  24. package/esm/bbi.d.ts +3 -64
  25. package/esm/bbi.js +14 -3
  26. package/esm/bbi.js.map +1 -1
  27. package/esm/bigbed.d.ts +2 -1
  28. package/esm/bigbed.js +7 -6
  29. package/esm/bigbed.js.map +1 -1
  30. package/esm/bigint-polyfill/polyfill.js +3 -0
  31. package/esm/bigint-polyfill/polyfill.js.map +1 -1
  32. package/esm/bigint-polyfill/pure.js +3 -0
  33. package/esm/bigint-polyfill/pure.js.map +1 -1
  34. package/esm/bigwig.d.ts +2 -1
  35. package/esm/bigwig.js +1 -1
  36. package/esm/bigwig.js.map +1 -1
  37. package/esm/block-view.d.ts +3 -4
  38. package/esm/block-view.js +5 -12
  39. package/esm/block-view.js.map +1 -1
  40. package/esm/index.d.ts +1 -1
  41. package/esm/index.js +0 -3
  42. package/esm/index.js.map +1 -1
  43. package/esm/types.d.ts +61 -0
  44. package/esm/types.js +2 -0
  45. package/esm/types.js.map +1 -0
  46. package/package.json +6 -5
  47. package/src/bbi.ts +32 -75
  48. package/src/bigbed.ts +11 -8
  49. package/src/bigint-polyfill/polyfill.ts +3 -0
  50. package/src/bigint-polyfill/pure.ts +4 -0
  51. package/src/bigwig.ts +3 -1
  52. package/src/block-view.ts +10 -15
  53. package/src/index.ts +1 -4
  54. package/src/types.ts +66 -0
package/src/bbi.ts CHANGED
@@ -1,83 +1,28 @@
1
- import { LocalFile, RemoteFile, GenericFilehandle } from 'generic-filehandle2'
2
- import { firstValueFrom, Observable } from 'rxjs'
1
+ import { LocalFile, RemoteFile } from 'generic-filehandle2'
2
+ import { Observable, firstValueFrom } from 'rxjs'
3
3
  import { toArray } from 'rxjs/operators'
4
+
4
5
  import { BlockView } from './block-view'
5
6
 
7
+ import type {
8
+ BigWigHeader,
9
+ BigWigHeaderWithRefNames,
10
+ Feature,
11
+ RefInfo,
12
+ RequestOptions2,
13
+ RequestOptions,
14
+ Statistics,
15
+ ZoomLevel,
16
+ } from './types'
17
+ import type { GenericFilehandle } from 'generic-filehandle2'
18
+
6
19
  const BIG_WIG_MAGIC = -2003829722
7
20
  const BIG_BED_MAGIC = -2021002517
8
21
 
9
- export interface ZoomLevel {
10
- reductionLevel: number
11
- reserved: number
12
- dataOffset: number
13
- indexOffset: number
14
- }
15
-
16
- export interface Feature {
17
- offset?: number
18
- chromId: number
19
- start: number
20
- end: number
21
- score?: number
22
- rest?: string // for bigbed line
23
- minScore?: number // for summary line
24
- maxScore?: number // for summary line
25
- summary?: boolean // is summary line
26
- uniqueId?: string // for bigbed contains uniqueId calculated from file offset
27
- field?: number // used in bigbed searching
28
- }
29
- export interface Statistics {
30
- scoreSum: number
31
- basesCovered: number
32
- scoreSumSquares: number
33
- scoreMin: number
34
- scoreMax: number
35
- }
36
-
37
- export interface RefInfo {
38
- name: string
39
- id: number
40
- length: number
41
- }
42
-
43
- export interface MainHeader {
44
- magic: number
45
- version: number
46
- autoSql: string
47
- totalSummary: Statistics
48
- asOffset: number
49
- zoomLevels: ZoomLevel[]
50
- fieldCount: number
51
- numZoomLevels: number
52
- unzoomedIndexOffset: number
53
- totalSummaryOffset: number
54
- unzoomedDataOffset: number
55
- definedFieldCount: number
56
- uncompressBufSize: number
57
- chromTreeOffset: number
58
- extHeaderOffset: number
59
- fileType: string
60
- }
61
- export interface Header extends MainHeader {
62
- refsByName: Record<string, number>
63
- refsByNumber: Record<number, RefInfo>
64
- }
65
-
66
- export interface RequestOptions {
67
- signal?: AbortSignal
68
- headers?: Record<string, string>
69
- [key: string]: unknown
70
- }
71
-
72
- export interface RequestOptions2 extends RequestOptions {
73
- scale?: number
74
- basesPerSpan?: number
75
- }
76
-
77
22
  export abstract class BBI {
78
23
  protected bbi: GenericFilehandle
79
24
 
80
- private headerP?: Promise<Header>
25
+ private headerP?: Promise<BigWigHeaderWithRefNames>
81
26
 
82
27
  protected renameRefSeqs: (a: string) => string
83
28
 
@@ -132,7 +77,7 @@ export abstract class BBI {
132
77
  private async _getMainHeader(
133
78
  opts?: RequestOptions,
134
79
  requestSize = 2000,
135
- ): Promise<MainHeader> {
80
+ ): Promise<BigWigHeader> {
136
81
  const b = await this.bbi.read(requestSize, 0, opts)
137
82
  const dataView = new DataView(b.buffer, b.byteOffset, b.length)
138
83
 
@@ -175,7 +120,12 @@ export abstract class BBI {
175
120
  offset += 8
176
121
  const indexOffset = Number(dataView.getBigUint64(offset, true))
177
122
  offset += 8
178
- zoomLevels.push({ reductionLevel, reserved, dataOffset, indexOffset })
123
+ zoomLevels.push({
124
+ reductionLevel,
125
+ reserved,
126
+ dataOffset,
127
+ indexOffset,
128
+ })
179
129
  }
180
130
 
181
131
  const fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig'
@@ -237,7 +187,7 @@ export abstract class BBI {
237
187
  }
238
188
 
239
189
  private async _readChromTree(
240
- header: MainHeader,
190
+ header: BigWigHeader,
241
191
  opts?: { signal?: AbortSignal },
242
192
  ) {
243
193
  const refsByNumber: Record<number, RefInfo> = []
@@ -253,14 +203,18 @@ export abstract class BBI {
253
203
 
254
204
  const dataView = new DataView(b.buffer, b.byteOffset, b.length)
255
205
  let offset = 0
206
+ // unused:
256
207
  // const magic = dataView.getUint32(offset, true)
257
208
  offset += 4
209
+ // unused:
258
210
  // const blockSize = dataView.getUint32(offset, true)
259
211
  offset += 4
260
212
  const keySize = dataView.getUint32(offset, true)
261
213
  offset += 4
214
+ // unused:
262
215
  // const valSize = dataView.getUint32(offset, true)
263
216
  offset += 4
217
+ // unused:
264
218
  // const itemCount = dataView.getBigUint64(offset, true)
265
219
  offset += 8
266
220
 
@@ -273,6 +227,10 @@ export abstract class BBI {
273
227
  }
274
228
  const isLeafNode = dataView.getUint8(offset)
275
229
  offset += 2 //skip 1
230
+
231
+ if (offset >= b.length) {
232
+ return
233
+ }
276
234
  const cnt = dataView.getUint16(offset, true)
277
235
  offset += 2
278
236
  if (isLeafNode) {
@@ -294,7 +252,6 @@ export abstract class BBI {
294
252
  }
295
253
  }
296
254
  } else {
297
- // parse index node
298
255
  const nextNodes = []
299
256
  for (let n = 0; n < cnt; n++) {
300
257
  offset += keySize
package/src/bigbed.ts CHANGED
@@ -1,10 +1,11 @@
1
- import { Observable, merge, firstValueFrom } from 'rxjs'
2
- import { map, reduce } from 'rxjs/operators'
3
1
  import AbortablePromiseCache from '@gmod/abortable-promise-cache'
4
2
  import QuickLRU from 'quick-lru'
3
+ import { Observable, firstValueFrom, merge } from 'rxjs'
4
+ import { map, reduce } from 'rxjs/operators'
5
+
6
+ import { BBI } from './bbi'
5
7
 
6
- // locals
7
- import { BBI, Feature, RequestOptions } from './bbi'
8
+ import type { Feature, RequestOptions } from './types'
8
9
 
9
10
  interface Loc {
10
11
  key: string
@@ -109,7 +110,7 @@ export class BigBed extends BBI {
109
110
  return []
110
111
  }
111
112
  const decoder = new TextDecoder('utf8')
112
- const locs = indices.map(async (index): Promise<Loc | undefined> => {
113
+ const locs = indices.map(async index => {
113
114
  const { offset: offset2, field } = index
114
115
  const b = await this.bbi.read(32, offset2, opts)
115
116
 
@@ -183,15 +184,17 @@ export class BigBed extends BBI {
183
184
 
184
185
  for (const n of keys) {
185
186
  if (n.key === name) {
186
- return { ...n, field }
187
+ return {
188
+ ...n,
189
+ field,
190
+ }
187
191
  }
188
192
  }
189
193
 
190
194
  return undefined
191
195
  }
192
196
  }
193
- const rootNodeOffset = 32
194
- return bptReadNode(offset2 + rootNodeOffset)
197
+ return bptReadNode(offset2 + 32)
195
198
  })
196
199
  return filterUndef(await Promise.all(locs))
197
200
  }
@@ -1,3 +1,6 @@
1
+ // from https://github.com/yume-chan/ya-webadb/blob/main/libraries/dataview-bigint-polyfill
2
+ // license:MIT
3
+ // needed for browsers including safari 14
1
4
  import { getBigInt64, getBigUint64 } from './pure'
2
5
 
3
6
  if (!('getBigInt64' in DataView)) {
@@ -1,3 +1,7 @@
1
+ // from https://github.com/yume-chan/ya-webadb/blob/main/libraries/dataview-bigint-polyfill
2
+ // license:MIT
3
+ // needed for browsers including safari 14
4
+
1
5
  const BigInt32 = BigInt(32)
2
6
 
3
7
  export function getBigInt64(
package/src/bigwig.ts CHANGED
@@ -1,5 +1,7 @@
1
+ import { BBI } from './bbi'
1
2
  import { BlockView } from './block-view'
2
- import { BBI, RequestOptions } from './bbi'
3
+
4
+ import type { RequestOptions } from './types'
3
5
 
4
6
  export class BigWig extends BBI {
5
7
  /**
package/src/block-view.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { Observer } from 'rxjs'
2
1
  import AbortablePromiseCache from '@gmod/abortable-promise-cache'
3
- import { GenericFilehandle } from 'generic-filehandle2'
4
2
  import QuickLRU from 'quick-lru'
5
3
 
6
- // locals
7
4
  import Range from './range'
8
5
  import { unzip } from './unzip'
9
- import { Feature } from './bbi'
10
- import { groupBlocks, checkAbortSignal } from './util'
6
+ import { checkAbortSignal, groupBlocks } from './util'
7
+
8
+ import type { Feature } from './types'
9
+ import type { GenericFilehandle } from 'generic-filehandle2'
10
+ import type { Observer } from 'rxjs'
11
11
 
12
12
  const decoder =
13
13
  typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined
@@ -37,7 +37,6 @@ function coordFilter(s1: number, e1: number, s2: number, e2: number): boolean {
37
37
  *
38
38
  * Adapted by Robert Buels and Colin Diesh from bigwig.js in the Dalliance
39
39
  * Genome Explorer by Thomas Down.
40
- * @constructs
41
40
  */
42
41
 
43
42
  export class BlockView {
@@ -46,11 +45,8 @@ export class BlockView {
46
45
  private featureCache = new AbortablePromiseCache<ReadData, Uint8Array>({
47
46
  cache: new QuickLRU({ maxSize: 1000 }),
48
47
 
49
- fill: async (requestData, signal) => {
50
- return this.bbi.read(requestData.length, requestData.offset, {
51
- signal,
52
- })
53
- },
48
+ fill: async ({ length, offset }, signal) =>
49
+ this.bbi.read(length, offset, { signal }),
54
50
  })
55
51
 
56
52
  public constructor(
@@ -73,14 +69,13 @@ export class BlockView {
73
69
  opts?: Options,
74
70
  ) {
75
71
  try {
76
- const { refsByName, bbi, cirTreeOffset } = this
77
- const chrId = refsByName[chrName]
72
+ const chrId = this.refsByName[chrName]
78
73
  if (chrId === undefined) {
79
74
  observer.complete()
80
75
  }
81
76
  const request = { chrId, start, end }
82
77
  if (!this.cirTreePromise) {
83
- this.cirTreePromise = bbi.read(48, cirTreeOffset, opts)
78
+ this.cirTreePromise = this.bbi.read(48, this.cirTreeOffset, opts)
84
79
  }
85
80
  const buffer = await this.cirTreePromise
86
81
  const dataView = new DataView(buffer.buffer)
@@ -243,7 +238,7 @@ export class BlockView {
243
238
  }
244
239
  }
245
240
 
246
- cirFobRecur([Number(cirTreeOffset) + 48], 1)
241
+ cirFobRecur([Number(this.cirTreeOffset) + 48], 1)
247
242
  return
248
243
  } catch (e) {
249
244
  observer.error(e)
package/src/index.ts CHANGED
@@ -1,7 +1,4 @@
1
- // from https://github.com/yume-chan/ya-webadb/blob/main/libraries/dataview-bigint-polyfill
2
- // license:MIT
3
- // needed for browsers including safari 14
4
1
  import './bigint-polyfill/polyfill'
5
2
  export { BigWig } from './bigwig'
6
3
  export { BigBed } from './bigbed'
7
- export { Feature, Header, RequestOptions } from './bbi'
4
+ export type { BigWigHeader, Feature, RequestOptions } from './types'
package/src/types.ts ADDED
@@ -0,0 +1,66 @@
1
+ export interface ZoomLevel {
2
+ reductionLevel: number
3
+ reserved: number
4
+ dataOffset: number
5
+ indexOffset: number
6
+ }
7
+
8
+ export interface Feature {
9
+ offset?: number
10
+ chromId: number
11
+ start: number
12
+ end: number
13
+ score?: number
14
+ rest?: string // for bigbed line
15
+ minScore?: number // for summary line
16
+ maxScore?: number // for summary line
17
+ summary?: boolean // is summary line
18
+ uniqueId?: string // for bigbed contains uniqueId calculated from file offset
19
+ field?: number // used in bigbed searching
20
+ }
21
+ export interface Statistics {
22
+ scoreSum: number
23
+ basesCovered: number
24
+ scoreSumSquares: number
25
+ scoreMin: number
26
+ scoreMax: number
27
+ }
28
+
29
+ export interface RefInfo {
30
+ name: string
31
+ id: number
32
+ length: number
33
+ }
34
+
35
+ export interface BigWigHeader {
36
+ magic: number
37
+ version: number
38
+ autoSql: string
39
+ totalSummary: Statistics
40
+ asOffset: number
41
+ zoomLevels: ZoomLevel[]
42
+ fieldCount: number
43
+ numZoomLevels: number
44
+ unzoomedIndexOffset: number
45
+ totalSummaryOffset: number
46
+ unzoomedDataOffset: number
47
+ definedFieldCount: number
48
+ uncompressBufSize: number
49
+ chromTreeOffset: number
50
+ extHeaderOffset: number
51
+ fileType: string
52
+ }
53
+ export interface BigWigHeaderWithRefNames extends BigWigHeader {
54
+ refsByName: Record<string, number>
55
+ refsByNumber: Record<number, RefInfo>
56
+ }
57
+
58
+ export interface RequestOptions {
59
+ signal?: AbortSignal
60
+ headers?: Record<string, string>
61
+ }
62
+
63
+ export interface RequestOptions2 extends RequestOptions {
64
+ scale?: number
65
+ basesPerSpan?: number
66
+ }