@gmod/bbi 8.1.1 → 9.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 (77) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +49 -53
  3. package/dist/array-feature-view.d.ts +4 -1
  4. package/dist/array-feature-view.js.map +1 -1
  5. package/dist/bbi.d.ts +5 -25
  6. package/dist/bbi.js +31 -133
  7. package/dist/bbi.js.map +1 -1
  8. package/dist/bigbed.d.ts +0 -1
  9. package/dist/bigbed.js +19 -51
  10. package/dist/bigbed.js.map +1 -1
  11. package/dist/bigwig.d.ts +1 -2
  12. package/dist/bigwig.js +1 -2
  13. package/dist/bigwig.js.map +1 -1
  14. package/dist/block-view.d.ts +7 -16
  15. package/dist/block-view.js +370 -440
  16. package/dist/block-view.js.map +1 -1
  17. package/dist/parse-bigwig.d.ts +2 -2
  18. package/dist/parse-bigwig.js +5 -5
  19. package/dist/parse-bigwig.js.map +1 -1
  20. package/dist/range.d.ts +1 -15
  21. package/dist/range.js +16 -49
  22. package/dist/range.js.map +1 -1
  23. package/dist/util.d.ts +0 -22
  24. package/dist/util.js +0 -46
  25. package/dist/util.js.map +1 -1
  26. package/dist/wasm/inflate-wasm-inlined.js +85 -86
  27. package/dist/wasm/inflate-wasm-inlined.js.map +1 -1
  28. package/dist/wasm/inflate_wasm.d.ts +1 -1
  29. package/dist/wasm/inflate_wasm.js +10 -4
  30. package/dist/wasm/inflate_wasm.js.map +1 -1
  31. package/dist/wasm/inflate_wasm_bg.d.ts +2 -2
  32. package/dist/wasm/inflate_wasm_bg.js +85 -86
  33. package/dist/wasm/inflate_wasm_bg.js.map +1 -1
  34. package/esm/array-feature-view.d.ts +4 -1
  35. package/esm/array-feature-view.js.map +1 -1
  36. package/esm/bbi.d.ts +5 -25
  37. package/esm/bbi.js +31 -133
  38. package/esm/bbi.js.map +1 -1
  39. package/esm/bigbed.d.ts +0 -1
  40. package/esm/bigbed.js +19 -50
  41. package/esm/bigbed.js.map +1 -1
  42. package/esm/bigwig.d.ts +1 -2
  43. package/esm/bigwig.js +1 -2
  44. package/esm/bigwig.js.map +1 -1
  45. package/esm/block-view.d.ts +7 -16
  46. package/esm/block-view.js +370 -440
  47. package/esm/block-view.js.map +1 -1
  48. package/esm/parse-bigwig.d.ts +2 -2
  49. package/esm/parse-bigwig.js +5 -5
  50. package/esm/parse-bigwig.js.map +1 -1
  51. package/esm/range.d.ts +1 -15
  52. package/esm/range.js +15 -48
  53. package/esm/range.js.map +1 -1
  54. package/esm/util.d.ts +0 -22
  55. package/esm/util.js +0 -42
  56. package/esm/util.js.map +1 -1
  57. package/esm/wasm/inflate-wasm-inlined.js +85 -86
  58. package/esm/wasm/inflate-wasm-inlined.js.map +1 -1
  59. package/esm/wasm/inflate_wasm.d.ts +1 -1
  60. package/esm/wasm/inflate_wasm.js +2 -1
  61. package/esm/wasm/inflate_wasm.js.map +1 -1
  62. package/esm/wasm/inflate_wasm_bg.d.ts +2 -2
  63. package/esm/wasm/inflate_wasm_bg.js +83 -84
  64. package/esm/wasm/inflate_wasm_bg.js.map +1 -1
  65. package/package.json +14 -16
  66. package/src/array-feature-view.ts +8 -0
  67. package/src/bbi.ts +50 -153
  68. package/src/bigbed.ts +22 -55
  69. package/src/bigwig.ts +1 -3
  70. package/src/block-view.ts +526 -634
  71. package/src/parse-bigwig.ts +7 -9
  72. package/src/range.ts +19 -58
  73. package/src/util.ts +0 -46
  74. package/src/wasm/inflate-wasm-inlined.js +101 -102
  75. package/src/wasm/inflate_wasm.js +7 -2
  76. package/src/wasm/inflate_wasm_bg.js +99 -100
  77. package/src/wasm/inflate_wasm_bg.wasm +0 -0
package/src/bigbed.ts CHANGED
@@ -1,11 +1,9 @@
1
1
  import AbortablePromiseCache from '@gmod/abortable-promise-cache'
2
2
  import QuickLRU from '@jbrowse/quick-lru'
3
- import { Observable, firstValueFrom, merge } from 'rxjs'
4
- import { map, reduce } from 'rxjs/operators'
5
3
 
6
4
  import { BBI } from './bbi.ts'
7
5
 
8
- import type { Feature, RequestOptions } from './types.ts'
6
+ import type { RequestOptions } from './types.ts'
9
7
  import type { GenericFilehandle } from 'generic-filehandle2'
10
8
 
11
9
  const decoder = new TextDecoder('utf8')
@@ -24,10 +22,6 @@ interface Index {
24
22
  field: number
25
23
  }
26
24
 
27
- export function filterUndef<T>(ts: (T | undefined)[]): T[] {
28
- return ts.filter((t: T | undefined): t is T => !!t)
29
- }
30
-
31
25
  function getTabField(str: string, fieldIndex: number) {
32
26
  if (fieldIndex < 0) {
33
27
  return undefined
@@ -67,11 +61,9 @@ async function readBPlusTreeNode(
67
61
  const len = 4 + blockSize * (keySize + valSize)
68
62
  const buffer = await bbi.read(len, nodeOffset, opts)
69
63
  const dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length)
70
- let offset = 0
71
- const nodeType = dataView.getInt8(offset)
72
- offset += 2 // skip nodeType byte + 1 reserved byte
73
- const cnt = dataView.getInt16(offset, true)
74
- offset += 2
64
+ const nodeType = dataView.getInt8(0)
65
+ const cnt = dataView.getInt16(2, true)
66
+ let offset = 4
75
67
 
76
68
  // Non-leaf node (nodeType === 0): contains keys and child node pointers for navigation
77
69
  if (nodeType === 0) {
@@ -186,13 +178,8 @@ export class BigBed extends BBI {
186
178
  const b = await this.bbi.read(64, extHeaderOffset)
187
179
 
188
180
  const dataView = new DataView(b.buffer, b.byteOffset, b.length)
189
- let offset = 0
190
- // const _size = dataView.getUint16(offset, true)
191
- offset += 2
192
- const count = dataView.getUint16(offset, true)
193
- offset += 2
194
- const dataOffset = Number(dataView.getBigUint64(offset, true))
195
- offset += 8
181
+ const count = dataView.getUint16(2, true)
182
+ const dataOffset = Number(dataView.getBigUint64(4, true))
196
183
 
197
184
  // no extra index is defined if count==0
198
185
  if (count === 0) {
@@ -208,14 +195,10 @@ export class BigBed extends BBI {
208
195
  for (let i = 0; i < count; i += 1) {
209
196
  const b = buffer.subarray(i * blocklen)
210
197
  const dataView = new DataView(b.buffer, b.byteOffset, b.length)
211
- let offset = 0
212
- const type = dataView.getInt16(offset, true)
213
- offset += 2
214
- const fieldcount = dataView.getInt16(offset, true)
215
- offset += 2
216
- const dataOffset = Number(dataView.getBigUint64(offset, true))
217
- offset += 8 + 4 // skip 8-byte offset + 4 reserved bytes
218
- const field = dataView.getInt16(offset, true)
198
+ const type = dataView.getInt16(0, true)
199
+ const fieldcount = dataView.getInt16(2, true)
200
+ const dataOffset = Number(dataView.getBigUint64(4, true))
201
+ const field = dataView.getInt16(16, true)
219
202
  indices.push({
220
203
  type,
221
204
  fieldcount,
@@ -249,17 +232,9 @@ export class BigBed extends BBI {
249
232
  const b = await this.bbi.read(32, offset2, opts)
250
233
 
251
234
  const dataView = new DataView(b.buffer, b.byteOffset, b.length)
252
- let offset = 0
253
- // const _magic = dataView.getInt32(offset, true)
254
- offset += 4
255
- const blockSize = dataView.getInt32(offset, true)
256
- offset += 4
257
- const keySize = dataView.getInt32(offset, true)
258
- offset += 4
259
- const valSize = dataView.getInt32(offset, true)
260
- offset += 4
261
- // const _itemCount = Number(dataView.getBigUint64(offset, true))
262
- offset += 8
235
+ const blockSize = dataView.getInt32(4, true)
236
+ const keySize = dataView.getInt32(8, true)
237
+ const valSize = dataView.getInt32(12, true)
263
238
 
264
239
  return readBPlusTreeNode(
265
240
  this.bbi,
@@ -272,7 +247,8 @@ export class BigBed extends BBI {
272
247
  opts,
273
248
  )
274
249
  })
275
- return filterUndef(await Promise.all(locs))
250
+ const results = await Promise.all(locs)
251
+ return results.filter((l): l is Loc => l !== undefined)
276
252
  }
277
253
 
278
254
  /*
@@ -292,23 +268,14 @@ export class BigBed extends BBI {
292
268
  return []
293
269
  }
294
270
  const view = await this.getUnzoomedView(opts)
295
- const res = blocks.map(block => {
296
- return new Observable<Feature[]>(observer => {
297
- view.readFeatures(observer, [block], opts).catch((e: unknown) => {
298
- observer.error(e)
299
- })
300
- }).pipe(
301
- reduce((acc, curr) => {
302
- acc.push(...curr)
303
- return acc
304
- }, [] as Feature[]),
305
- map(features => features.map(f => ({ ...f, field: block.field }))),
306
- )
307
- })
308
- const ret = await firstValueFrom(merge(...res))
309
- // Filter to features where the indexed field matches the search name
271
+ const results = await Promise.all(
272
+ blocks.map(async block => {
273
+ const features = await view.readFeatures([block], opts)
274
+ return features.map(f => ({ ...f, field: block.field }))
275
+ }),
276
+ )
310
277
  // field offset is adjusted by -3 to account for chrom, chromStart, chromEnd columns
311
- return ret.filter(f => {
278
+ return results.flat().filter(f => {
312
279
  if (!f.rest) {
313
280
  return false
314
281
  }
package/src/bigwig.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { BBI } from './bbi.ts'
2
- import { BlockView } from './block-view.ts'
3
2
 
4
3
  import type { RequestOptions } from './types.ts'
5
4
 
@@ -21,8 +20,7 @@ export class BigWig extends BBI {
21
20
  for (let i = maxLevel; i >= 0; i -= 1) {
22
21
  const zh = zoomLevels[i]
23
22
  if (zh && zh.reductionLevel <= 2 * basesPerPx) {
24
- return new BlockView(
25
- this.bbi,
23
+ return this.getOrCreateBlockView(
26
24
  refsByName,
27
25
  zh.indexOffset,
28
26
  uncompressBufSize,