@gmod/cram 3.0.7 → 4.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 (268) hide show
  1. package/dist/craiIndex.js +70 -87
  2. package/dist/craiIndex.js.map +1 -1
  3. package/dist/cram-bundle.js +1 -1
  4. package/dist/cramFile/codecs/_base.d.ts +1 -1
  5. package/dist/cramFile/codecs/beta.d.ts +2 -2
  6. package/dist/cramFile/codecs/beta.js +1 -1
  7. package/dist/cramFile/codecs/beta.js.map +1 -1
  8. package/dist/cramFile/codecs/byteArrayLength.d.ts +2 -2
  9. package/dist/cramFile/codecs/byteArrayStop.d.ts +4 -4
  10. package/dist/cramFile/codecs/byteArrayStop.js +1 -1
  11. package/dist/cramFile/codecs/byteArrayStop.js.map +1 -1
  12. package/dist/cramFile/codecs/external.d.ts +1 -1
  13. package/dist/cramFile/codecs/external.js +1 -1
  14. package/dist/cramFile/codecs/external.js.map +1 -1
  15. package/dist/cramFile/codecs/gamma.d.ts +1 -1
  16. package/dist/cramFile/codecs/gamma.js +1 -1
  17. package/dist/cramFile/codecs/gamma.js.map +1 -1
  18. package/dist/cramFile/codecs/getBits.d.ts +1 -1
  19. package/dist/cramFile/codecs/getBits.js.map +1 -1
  20. package/dist/cramFile/codecs/huffman.d.ts +1 -1
  21. package/dist/cramFile/codecs/huffman.js +1 -1
  22. package/dist/cramFile/codecs/huffman.js.map +1 -1
  23. package/dist/cramFile/codecs/index.d.ts +1 -1
  24. package/dist/cramFile/codecs/index.js +5 -5
  25. package/dist/cramFile/codecs/index.js.map +1 -1
  26. package/dist/cramFile/codecs/subexp.d.ts +2 -2
  27. package/dist/cramFile/codecs/subexp.js +1 -1
  28. package/dist/cramFile/codecs/subexp.js.map +1 -1
  29. package/dist/cramFile/container/compressionScheme.d.ts +2 -2
  30. package/dist/cramFile/container/compressionScheme.js +1 -1
  31. package/dist/cramFile/container/compressionScheme.js.map +1 -1
  32. package/dist/cramFile/container/index.d.ts +1 -2
  33. package/dist/cramFile/container/index.js +62 -79
  34. package/dist/cramFile/container/index.js.map +1 -1
  35. package/dist/cramFile/file.d.ts +9 -13
  36. package/dist/cramFile/file.js +218 -247
  37. package/dist/cramFile/file.js.map +1 -1
  38. package/dist/cramFile/record.js +2 -2
  39. package/dist/cramFile/record.js.map +1 -1
  40. package/dist/cramFile/sectionParsers.d.ts +16 -16
  41. package/dist/cramFile/sectionParsers.js +12 -9
  42. package/dist/cramFile/sectionParsers.js.map +1 -1
  43. package/dist/cramFile/slice/decodeRecord.d.ts +3 -3
  44. package/dist/cramFile/slice/decodeRecord.js +11 -11
  45. package/dist/cramFile/slice/decodeRecord.js.map +1 -1
  46. package/dist/cramFile/slice/index.d.ts +2 -2
  47. package/dist/cramFile/slice/index.js +241 -262
  48. package/dist/cramFile/slice/index.js.map +1 -1
  49. package/dist/cramFile/util.d.ts +4 -2
  50. package/dist/cramFile/util.js +29 -6
  51. package/dist/cramFile/util.js.map +1 -1
  52. package/dist/htscodecs/arith_gen.d.ts +9 -17
  53. package/dist/htscodecs/arith_gen.js +32 -272
  54. package/dist/htscodecs/arith_gen.js.map +1 -1
  55. package/dist/htscodecs/fqzcomp.d.ts +1 -2
  56. package/dist/htscodecs/fqzcomp.js +2 -421
  57. package/dist/htscodecs/fqzcomp.js.map +1 -1
  58. package/dist/htscodecs/index.d.ts +5 -5
  59. package/dist/htscodecs/index.js +10 -10
  60. package/dist/htscodecs/index.js.map +1 -1
  61. package/dist/htscodecs/iostream.d.ts +2 -1
  62. package/dist/htscodecs/iostream.js +3 -2
  63. package/dist/htscodecs/iostream.js.map +1 -1
  64. package/dist/htscodecs/rans.d.ts +1 -2
  65. package/dist/htscodecs/rans.js +3 -270
  66. package/dist/htscodecs/rans.js.map +1 -1
  67. package/dist/htscodecs/rans4x16.d.ts +0 -1
  68. package/dist/htscodecs/rans4x16.js +6 -497
  69. package/dist/htscodecs/rans4x16.js.map +1 -1
  70. package/dist/htscodecs/tok3.js +17 -1
  71. package/dist/htscodecs/tok3.js.map +1 -1
  72. package/dist/index.d.ts +1 -1
  73. package/dist/index.js +2 -2
  74. package/dist/index.js.map +1 -1
  75. package/dist/indexedCramFile.d.ts +4 -4
  76. package/dist/indexedCramFile.js +97 -108
  77. package/dist/indexedCramFile.js.map +1 -1
  78. package/dist/io/index.d.ts +2 -2
  79. package/dist/io/index.js +6 -6
  80. package/dist/io/index.js.map +1 -1
  81. package/dist/rans/constants.d.ts +1 -1
  82. package/dist/rans/constants.js +1 -1
  83. package/dist/rans/constants.js.map +1 -1
  84. package/dist/rans/d04.js.map +1 -1
  85. package/dist/rans/decoding.js.map +1 -1
  86. package/dist/rans/frequencies.js.map +1 -1
  87. package/dist/rans/index.js +5 -5
  88. package/dist/rans/index.js.map +1 -1
  89. package/dist/unzip.d.ts +1 -1
  90. package/dist/unzip.js +5 -3
  91. package/dist/unzip.js.map +1 -1
  92. package/esm/craiIndex.js +10 -12
  93. package/esm/craiIndex.js.map +1 -1
  94. package/esm/cramFile/codecs/_base.d.ts +1 -1
  95. package/esm/cramFile/codecs/beta.d.ts +2 -2
  96. package/esm/cramFile/codecs/beta.js +1 -1
  97. package/esm/cramFile/codecs/beta.js.map +1 -1
  98. package/esm/cramFile/codecs/byteArrayLength.d.ts +2 -2
  99. package/esm/cramFile/codecs/byteArrayStop.d.ts +4 -4
  100. package/esm/cramFile/codecs/byteArrayStop.js +1 -1
  101. package/esm/cramFile/codecs/byteArrayStop.js.map +1 -1
  102. package/esm/cramFile/codecs/external.d.ts +1 -1
  103. package/esm/cramFile/codecs/external.js +1 -1
  104. package/esm/cramFile/codecs/external.js.map +1 -1
  105. package/esm/cramFile/codecs/gamma.d.ts +1 -1
  106. package/esm/cramFile/codecs/gamma.js +1 -1
  107. package/esm/cramFile/codecs/gamma.js.map +1 -1
  108. package/esm/cramFile/codecs/getBits.d.ts +1 -1
  109. package/esm/cramFile/codecs/getBits.js.map +1 -1
  110. package/esm/cramFile/codecs/huffman.d.ts +1 -1
  111. package/esm/cramFile/codecs/huffman.js +1 -1
  112. package/esm/cramFile/codecs/huffman.js.map +1 -1
  113. package/esm/cramFile/codecs/index.d.ts +1 -1
  114. package/esm/cramFile/codecs/index.js +5 -5
  115. package/esm/cramFile/codecs/index.js.map +1 -1
  116. package/esm/cramFile/codecs/subexp.d.ts +2 -2
  117. package/esm/cramFile/codecs/subexp.js +1 -1
  118. package/esm/cramFile/codecs/subexp.js.map +1 -1
  119. package/esm/cramFile/container/compressionScheme.d.ts +2 -2
  120. package/esm/cramFile/container/compressionScheme.js +1 -1
  121. package/esm/cramFile/container/compressionScheme.js.map +1 -1
  122. package/esm/cramFile/container/index.d.ts +1 -2
  123. package/esm/cramFile/container/index.js +4 -7
  124. package/esm/cramFile/container/index.js.map +1 -1
  125. package/esm/cramFile/file.d.ts +9 -13
  126. package/esm/cramFile/file.js +47 -52
  127. package/esm/cramFile/file.js.map +1 -1
  128. package/esm/cramFile/record.js +2 -2
  129. package/esm/cramFile/record.js.map +1 -1
  130. package/esm/cramFile/sectionParsers.d.ts +16 -16
  131. package/esm/cramFile/sectionParsers.js +7 -7
  132. package/esm/cramFile/sectionParsers.js.map +1 -1
  133. package/esm/cramFile/slice/decodeRecord.d.ts +3 -3
  134. package/esm/cramFile/slice/decodeRecord.js +11 -11
  135. package/esm/cramFile/slice/decodeRecord.js.map +1 -1
  136. package/esm/cramFile/slice/index.d.ts +2 -2
  137. package/esm/cramFile/slice/index.js +7 -6
  138. package/esm/cramFile/slice/index.js.map +1 -1
  139. package/esm/cramFile/util.d.ts +4 -2
  140. package/esm/cramFile/util.js +19 -2
  141. package/esm/cramFile/util.js.map +1 -1
  142. package/esm/htscodecs/arith_gen.d.ts +9 -17
  143. package/esm/htscodecs/arith_gen.js +32 -272
  144. package/esm/htscodecs/arith_gen.js.map +1 -1
  145. package/esm/htscodecs/fqzcomp.d.ts +1 -2
  146. package/esm/htscodecs/fqzcomp.js +2 -421
  147. package/esm/htscodecs/fqzcomp.js.map +1 -1
  148. package/esm/htscodecs/index.d.ts +5 -5
  149. package/esm/htscodecs/index.js +10 -10
  150. package/esm/htscodecs/index.js.map +1 -1
  151. package/esm/htscodecs/iostream.d.ts +2 -1
  152. package/esm/htscodecs/iostream.js +3 -2
  153. package/esm/htscodecs/iostream.js.map +1 -1
  154. package/esm/htscodecs/rans.d.ts +1 -2
  155. package/esm/htscodecs/rans.js +3 -270
  156. package/esm/htscodecs/rans.js.map +1 -1
  157. package/esm/htscodecs/rans4x16.d.ts +0 -1
  158. package/esm/htscodecs/rans4x16.js +6 -497
  159. package/esm/htscodecs/rans4x16.js.map +1 -1
  160. package/esm/htscodecs/tok3.js +17 -1
  161. package/esm/htscodecs/tok3.js.map +1 -1
  162. package/esm/index.d.ts +1 -1
  163. package/esm/index.js +1 -1
  164. package/esm/index.js.map +1 -1
  165. package/esm/indexedCramFile.d.ts +4 -4
  166. package/esm/indexedCramFile.js +10 -10
  167. package/esm/indexedCramFile.js.map +1 -1
  168. package/esm/io/index.d.ts +2 -2
  169. package/esm/io/index.js +1 -1
  170. package/esm/io/index.js.map +1 -1
  171. package/esm/rans/constants.d.ts +1 -1
  172. package/esm/rans/constants.js +1 -1
  173. package/esm/rans/constants.js.map +1 -1
  174. package/esm/rans/d04.js.map +1 -1
  175. package/esm/rans/decoding.js.map +1 -1
  176. package/esm/rans/frequencies.js.map +1 -1
  177. package/esm/rans/index.js +5 -5
  178. package/esm/rans/index.js.map +1 -1
  179. package/esm/unzip.d.ts +1 -1
  180. package/esm/unzip.js +4 -1
  181. package/esm/unzip.js.map +1 -1
  182. package/package.json +7 -9
  183. package/src/craiIndex.ts +17 -16
  184. package/src/cramFile/codecs/_base.ts +1 -1
  185. package/src/cramFile/codecs/beta.ts +3 -3
  186. package/src/cramFile/codecs/byteArrayLength.ts +1 -1
  187. package/src/cramFile/codecs/byteArrayStop.ts +3 -4
  188. package/src/cramFile/codecs/external.ts +3 -3
  189. package/src/cramFile/codecs/gamma.ts +2 -2
  190. package/src/cramFile/codecs/getBits.ts +1 -1
  191. package/src/cramFile/codecs/huffman.ts +2 -3
  192. package/src/cramFile/codecs/index.ts +7 -8
  193. package/src/cramFile/codecs/subexp.ts +3 -3
  194. package/src/cramFile/container/compressionScheme.ts +3 -3
  195. package/src/cramFile/container/index.ts +7 -10
  196. package/src/cramFile/file.ts +71 -77
  197. package/src/cramFile/record.ts +3 -3
  198. package/src/cramFile/sectionParsers.ts +27 -22
  199. package/src/cramFile/slice/decodeRecord.ts +17 -17
  200. package/src/cramFile/slice/index.ts +8 -9
  201. package/src/cramFile/util.ts +24 -5
  202. package/src/htscodecs/arith_gen.js +33 -296
  203. package/src/htscodecs/fqzcomp.js +2 -476
  204. package/src/htscodecs/index.js +9 -11
  205. package/src/htscodecs/iostream.js +3 -2
  206. package/src/htscodecs/rans.js +3 -315
  207. package/src/htscodecs/rans4x16.js +6 -557
  208. package/src/htscodecs/tok3.js +18 -1
  209. package/src/index.ts +1 -1
  210. package/src/indexedCramFile.ts +6 -5
  211. package/src/io/index.ts +5 -4
  212. package/src/rans/constants.ts +1 -1
  213. package/src/rans/d04.ts +0 -1
  214. package/src/rans/decoding.ts +0 -1
  215. package/src/rans/frequencies.ts +0 -1
  216. package/src/rans/index.ts +5 -7
  217. package/src/unzip.ts +5 -1
  218. package/dist/cramFile/filehandle.d.ts +0 -1
  219. package/dist/cramFile/filehandle.js +0 -3
  220. package/dist/cramFile/filehandle.js.map +0 -1
  221. package/dist/htscodecs/main_arith_gen.d.ts +0 -1
  222. package/dist/htscodecs/main_arith_gen.js +0 -86
  223. package/dist/htscodecs/main_arith_gen.js.map +0 -1
  224. package/dist/htscodecs/main_fqzcomp.d.ts +0 -1
  225. package/dist/htscodecs/main_fqzcomp.js +0 -112
  226. package/dist/htscodecs/main_fqzcomp.js.map +0 -1
  227. package/dist/htscodecs/main_rans.d.ts +0 -1
  228. package/dist/htscodecs/main_rans.js +0 -83
  229. package/dist/htscodecs/main_rans.js.map +0 -1
  230. package/dist/htscodecs/main_rans4x16.d.ts +0 -1
  231. package/dist/htscodecs/main_rans4x16.js +0 -82
  232. package/dist/htscodecs/main_rans4x16.js.map +0 -1
  233. package/dist/htscodecs/main_tok3.d.ts +0 -1
  234. package/dist/htscodecs/main_tok3.js +0 -84
  235. package/dist/htscodecs/main_tok3.js.map +0 -1
  236. package/dist/unzip-pako.d.ts +0 -2
  237. package/dist/unzip-pako.js +0 -9
  238. package/dist/unzip-pako.js.map +0 -1
  239. package/esm/cramFile/filehandle.d.ts +0 -1
  240. package/esm/cramFile/filehandle.js +0 -2
  241. package/esm/cramFile/filehandle.js.map +0 -1
  242. package/esm/htscodecs/main_arith_gen.d.ts +0 -1
  243. package/esm/htscodecs/main_arith_gen.js +0 -86
  244. package/esm/htscodecs/main_arith_gen.js.map +0 -1
  245. package/esm/htscodecs/main_fqzcomp.d.ts +0 -1
  246. package/esm/htscodecs/main_fqzcomp.js +0 -112
  247. package/esm/htscodecs/main_fqzcomp.js.map +0 -1
  248. package/esm/htscodecs/main_rans.d.ts +0 -1
  249. package/esm/htscodecs/main_rans.js +0 -83
  250. package/esm/htscodecs/main_rans.js.map +0 -1
  251. package/esm/htscodecs/main_rans4x16.d.ts +0 -1
  252. package/esm/htscodecs/main_rans4x16.js +0 -82
  253. package/esm/htscodecs/main_rans4x16.js.map +0 -1
  254. package/esm/htscodecs/main_tok3.d.ts +0 -1
  255. package/esm/htscodecs/main_tok3.js +0 -84
  256. package/esm/htscodecs/main_tok3.js.map +0 -1
  257. package/esm/unzip-pako.d.ts +0 -2
  258. package/esm/unzip-pako.js +0 -6
  259. package/esm/unzip-pako.js.map +0 -1
  260. package/src/cramFile/filehandle.ts +0 -1
  261. package/src/htscodecs/Makefile +0 -142
  262. package/src/htscodecs/README.md +0 -64
  263. package/src/htscodecs/main_arith_gen.js +0 -96
  264. package/src/htscodecs/main_fqzcomp.js +0 -113
  265. package/src/htscodecs/main_rans.js +0 -88
  266. package/src/htscodecs/main_rans4x16.js +0 -87
  267. package/src/htscodecs/main_tok3.js +0 -86
  268. package/src/unzip-pako.ts +0 -6
@@ -1,24 +1,15 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
14
5
  Object.defineProperty(exports, "__esModule", { value: true });
15
6
  const errors_1 = require("../../errors");
16
- const util_1 = require("../util");
7
+ const getBits_1 = require("../codecs/getBits");
17
8
  const constants_1 = __importDefault(require("../constants"));
18
9
  const decodeRecord_1 = __importDefault(require("./decodeRecord"));
19
10
  const record_1 = __importDefault(require("../record"));
20
11
  const sectionParsers_1 = require("../sectionParsers");
21
- const getBits_1 = require("../codecs/getBits");
12
+ const util_1 = require("../util");
22
13
  /**
23
14
  * @private
24
15
  * Try to estimate the template length from a bunch of interrelated multi-segment reads.
@@ -143,287 +134,275 @@ class CramSlice {
143
134
  this.file = container.file;
144
135
  }
145
136
  // memoize
146
- getHeader() {
147
- return __awaiter(this, void 0, void 0, function* () {
148
- // fetch and parse the slice header
149
- const { majorVersion } = yield this.file.getDefinition();
150
- const sectionParsers = (0, sectionParsers_1.getSectionParsers)(majorVersion);
151
- const containerHeader = yield this.container.getHeader();
152
- if (!containerHeader) {
153
- throw new Error('no container header detected');
154
- }
155
- const header = yield this.file.readBlock(containerHeader._endPosition + this.containerPosition);
156
- if (header === undefined) {
157
- throw new Error('block header undefined');
158
- }
159
- if (header.contentType === 'MAPPED_SLICE_HEADER') {
160
- const content = (0, util_1.parseItem)(header.content, sectionParsers.cramMappedSliceHeader.parser, 0, containerHeader._endPosition);
161
- return Object.assign(Object.assign({}, header), { parsedContent: content });
162
- }
163
- else if (header.contentType === 'UNMAPPED_SLICE_HEADER') {
164
- const content = (0, util_1.parseItem)(header.content, sectionParsers.cramUnmappedSliceHeader.parser, 0, containerHeader._endPosition);
165
- return Object.assign(Object.assign({}, header), { parsedContent: content });
166
- }
167
- else {
168
- throw new errors_1.CramMalformedError(`error reading slice header block, invalid content type ${header.contentType}`);
169
- }
170
- });
137
+ async getHeader() {
138
+ // fetch and parse the slice header
139
+ const { majorVersion } = await this.file.getDefinition();
140
+ const sectionParsers = (0, sectionParsers_1.getSectionParsers)(majorVersion);
141
+ const containerHeader = await this.container.getHeader();
142
+ if (!containerHeader) {
143
+ throw new Error('no container header detected');
144
+ }
145
+ const header = await this.file.readBlock(containerHeader._endPosition + this.containerPosition);
146
+ if (header === undefined) {
147
+ throw new Error('block header undefined');
148
+ }
149
+ if (header.contentType === 'MAPPED_SLICE_HEADER') {
150
+ const content = (0, util_1.parseItem)(header.content, sectionParsers.cramMappedSliceHeader.parser, 0, containerHeader._endPosition);
151
+ return { ...header, parsedContent: content };
152
+ }
153
+ else if (header.contentType === 'UNMAPPED_SLICE_HEADER') {
154
+ const content = (0, util_1.parseItem)(header.content, sectionParsers.cramUnmappedSliceHeader.parser, 0, containerHeader._endPosition);
155
+ return { ...header, parsedContent: content };
156
+ }
157
+ else {
158
+ throw new errors_1.CramMalformedError(`error reading slice header block, invalid content type ${header.contentType}`);
159
+ }
171
160
  }
172
161
  // memoize
173
- getBlocks() {
174
- return __awaiter(this, void 0, void 0, function* () {
175
- const header = yield this.getHeader();
176
- // read all the blocks into memory and store them
177
- let blockPosition = header._endPosition;
178
- const blocks = new Array(header.parsedContent.numBlocks);
179
- for (let i = 0; i < blocks.length; i++) {
180
- const block = yield this.file.readBlock(blockPosition);
181
- if (block === undefined) {
182
- throw new Error('block undefined');
183
- }
184
- blocks[i] = block;
185
- blockPosition = blocks[i]._endPosition;
162
+ async getBlocks() {
163
+ const header = await this.getHeader();
164
+ // read all the blocks into memory and store them
165
+ let blockPosition = header._endPosition;
166
+ const blocks = new Array(header.parsedContent.numBlocks);
167
+ for (let i = 0; i < blocks.length; i++) {
168
+ const block = await this.file.readBlock(blockPosition);
169
+ if (block === undefined) {
170
+ throw new Error('block undefined');
186
171
  }
187
- return blocks;
188
- });
172
+ blocks[i] = block;
173
+ blockPosition = blocks[i]._endPosition;
174
+ }
175
+ return blocks;
189
176
  }
190
177
  // no memoize
191
- getCoreDataBlock() {
192
- return __awaiter(this, void 0, void 0, function* () {
193
- const blocks = yield this.getBlocks();
194
- return blocks[0];
195
- });
178
+ async getCoreDataBlock() {
179
+ const blocks = await this.getBlocks();
180
+ return blocks[0];
196
181
  }
197
182
  // memoize
198
- _getBlocksContentIdIndex() {
199
- return __awaiter(this, void 0, void 0, function* () {
200
- const blocks = yield this.getBlocks();
201
- const blocksByContentId = {};
202
- blocks.forEach(block => {
203
- if (block.contentType === 'EXTERNAL_DATA') {
204
- blocksByContentId[block.contentId] = block;
205
- }
206
- });
207
- return blocksByContentId;
183
+ async _getBlocksContentIdIndex() {
184
+ const blocks = await this.getBlocks();
185
+ const blocksByContentId = {};
186
+ blocks.forEach(block => {
187
+ if (block.contentType === 'EXTERNAL_DATA') {
188
+ blocksByContentId[block.contentId] = block;
189
+ }
208
190
  });
191
+ return blocksByContentId;
209
192
  }
210
- getBlockByContentId(id) {
211
- return __awaiter(this, void 0, void 0, function* () {
212
- const blocksByContentId = yield this._getBlocksContentIdIndex();
213
- return blocksByContentId[id];
214
- });
193
+ async getBlockByContentId(id) {
194
+ const blocksByContentId = await this._getBlocksContentIdIndex();
195
+ return blocksByContentId[id];
215
196
  }
216
- getReferenceRegion() {
217
- return __awaiter(this, void 0, void 0, function* () {
218
- // read the slice header
219
- const sliceHeader = (yield this.getHeader()).parsedContent;
220
- if (!(0, sectionParsers_1.isMappedSliceHeader)(sliceHeader)) {
221
- throw new Error('slice header not mapped');
222
- }
223
- if (sliceHeader.refSeqId < 0) {
224
- return undefined;
197
+ async getReferenceRegion() {
198
+ // read the slice header
199
+ const sliceHeader = (await this.getHeader()).parsedContent;
200
+ if (!(0, sectionParsers_1.isMappedSliceHeader)(sliceHeader)) {
201
+ throw new Error('slice header not mapped');
202
+ }
203
+ if (sliceHeader.refSeqId < 0) {
204
+ return undefined;
205
+ }
206
+ const compressionScheme = await this.container.getCompressionScheme();
207
+ if (compressionScheme === undefined) {
208
+ throw new Error('compression scheme undefined');
209
+ }
210
+ if (sliceHeader.refBaseBlockId >= 0) {
211
+ const refBlock = await this.getBlockByContentId(sliceHeader.refBaseBlockId);
212
+ if (!refBlock) {
213
+ throw new errors_1.CramMalformedError('embedded reference specified, but reference block does not exist');
225
214
  }
226
- const compressionScheme = yield this.container.getCompressionScheme();
227
- if (compressionScheme === undefined) {
228
- throw new Error('compression scheme undefined');
215
+ // TODO: we do not read anything named 'span'
216
+ // if (sliceHeader.span > refBlock.uncompressedSize) {
217
+ // throw new CramMalformedError('Embedded reference is too small')
218
+ // }
219
+ // TODO verify
220
+ return {
221
+ seq: refBlock.data.toString('utf8'),
222
+ start: sliceHeader.refSeqStart,
223
+ end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
224
+ span: sliceHeader.refSeqSpan,
225
+ };
226
+ }
227
+ if (compressionScheme.referenceRequired ||
228
+ this.file.fetchReferenceSequenceCallback) {
229
+ if (!this.file.fetchReferenceSequenceCallback) {
230
+ throw new Error('reference sequence not embedded, and seqFetch callback not provided, cannot fetch reference sequence');
229
231
  }
230
- if (sliceHeader.refBaseBlockId >= 0) {
231
- const refBlock = yield this.getBlockByContentId(sliceHeader.refBaseBlockId);
232
- if (!refBlock) {
233
- throw new errors_1.CramMalformedError('embedded reference specified, but reference block does not exist');
234
- }
235
- // TODO: we do not read anything named 'span'
236
- // if (sliceHeader.span > refBlock.uncompressedSize) {
237
- // throw new CramMalformedError('Embedded reference is too small')
238
- // }
239
- // TODO verify
240
- return {
241
- seq: refBlock.data.toString('utf8'),
242
- start: sliceHeader.refSeqStart,
243
- end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
244
- span: sliceHeader.refSeqSpan,
245
- };
232
+ const seq = await this.file.fetchReferenceSequenceCallback(sliceHeader.refSeqId, sliceHeader.refSeqStart, sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1);
233
+ if (seq.length !== sliceHeader.refSeqSpan) {
234
+ throw new errors_1.CramArgumentError('seqFetch callback returned a reference sequence of the wrong length');
246
235
  }
247
- if (compressionScheme.referenceRequired ||
248
- this.file.fetchReferenceSequenceCallback) {
249
- if (!this.file.fetchReferenceSequenceCallback) {
250
- throw new Error('reference sequence not embedded, and seqFetch callback not provided, cannot fetch reference sequence');
251
- }
252
- const seq = yield this.file.fetchReferenceSequenceCallback(sliceHeader.refSeqId, sliceHeader.refSeqStart, sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1);
253
- if (seq.length !== sliceHeader.refSeqSpan) {
254
- throw new errors_1.CramArgumentError('seqFetch callback returned a reference sequence of the wrong length');
255
- }
256
- return {
257
- seq,
258
- start: sliceHeader.refSeqStart,
259
- end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
260
- span: sliceHeader.refSeqSpan,
261
- };
262
- }
263
- return undefined;
264
- });
236
+ return {
237
+ seq,
238
+ start: sliceHeader.refSeqStart,
239
+ end: sliceHeader.refSeqStart + sliceHeader.refSeqSpan - 1,
240
+ span: sliceHeader.refSeqSpan,
241
+ };
242
+ }
243
+ return undefined;
265
244
  }
266
245
  getAllRecords() {
267
246
  return this.getRecords(() => true);
268
247
  }
269
- _fetchRecords() {
270
- return __awaiter(this, void 0, void 0, function* () {
271
- var _a, _b;
272
- const { majorVersion } = yield this.file.getDefinition();
273
- const compressionScheme = yield this.container.getCompressionScheme();
274
- if (compressionScheme === undefined) {
275
- throw new Error('compression scheme undefined');
276
- }
277
- const sliceHeader = yield this.getHeader();
278
- const blocksByContentId = yield this._getBlocksContentIdIndex();
279
- // check MD5 of reference if available
280
- if (majorVersion > 1 &&
281
- this.file.options.checkSequenceMD5 &&
282
- (0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent) &&
283
- sliceHeader.parsedContent.refSeqId >= 0 &&
284
- ((_a = sliceHeader.parsedContent.md5) === null || _a === void 0 ? void 0 : _a.join('')) !== '0000000000000000') {
285
- const refRegion = yield this.getReferenceRegion();
286
- if (refRegion) {
287
- const { seq, start, end } = refRegion;
288
- const seqMd5 = (0, util_1.sequenceMD5)(seq);
289
- const storedMd5 = (_b = sliceHeader.parsedContent.md5) === null || _b === void 0 ? void 0 : _b.map(byte => (byte < 16 ? '0' : '') + byte.toString(16)).join('');
290
- if (seqMd5 !== storedMd5) {
291
- throw new errors_1.CramMalformedError(`MD5 checksum reference mismatch for ref ${sliceHeader.parsedContent.refSeqId} pos ${start}..${end}. recorded MD5: ${storedMd5}, calculated MD5: ${seqMd5}`);
292
- }
248
+ async _fetchRecords() {
249
+ const { majorVersion } = await this.file.getDefinition();
250
+ const compressionScheme = await this.container.getCompressionScheme();
251
+ if (compressionScheme === undefined) {
252
+ throw new Error('compression scheme undefined');
253
+ }
254
+ const sliceHeader = await this.getHeader();
255
+ const blocksByContentId = await this._getBlocksContentIdIndex();
256
+ // check MD5 of reference if available
257
+ if (majorVersion > 1 &&
258
+ this.file.options.checkSequenceMD5 &&
259
+ (0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent) &&
260
+ sliceHeader.parsedContent.refSeqId >= 0 &&
261
+ sliceHeader.parsedContent.md5?.join('') !== '0000000000000000') {
262
+ const refRegion = await this.getReferenceRegion();
263
+ if (refRegion) {
264
+ const { seq, start, end } = refRegion;
265
+ const seqMd5 = (0, util_1.sequenceMD5)(seq);
266
+ const storedMd5 = sliceHeader.parsedContent.md5
267
+ ?.map(byte => (byte < 16 ? '0' : '') + byte.toString(16))
268
+ .join('');
269
+ if (seqMd5 !== storedMd5) {
270
+ throw new errors_1.CramMalformedError(`MD5 checksum reference mismatch for ref ${sliceHeader.parsedContent.refSeqId} pos ${start}..${end}. recorded MD5: ${storedMd5}, calculated MD5: ${seqMd5}`);
293
271
  }
294
272
  }
295
- // tracks the read position within the block. codec.decode() methods
296
- // advance the byte and bit positions in the cursor as they decode
297
- // data note that we are only decoding a single block here, the core
298
- // data block
299
- const coreDataBlock = yield this.getCoreDataBlock();
300
- const cursors = {
301
- lastAlignmentStart: (0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent)
302
- ? sliceHeader.parsedContent.refSeqStart
303
- : 0,
304
- coreBlock: { bitPosition: 7, bytePosition: 0 },
305
- externalBlocks: {
306
- map: new Map(),
307
- getCursor(contentId) {
308
- let r = this.map.get(contentId);
309
- if (r === undefined) {
310
- r = { bitPosition: 7, bytePosition: 0 };
311
- this.map.set(contentId, r);
312
- }
313
- return r;
314
- },
273
+ }
274
+ // tracks the read position within the block. codec.decode() methods
275
+ // advance the byte and bit positions in the cursor as they decode
276
+ // data note that we are only decoding a single block here, the core
277
+ // data block
278
+ const coreDataBlock = await this.getCoreDataBlock();
279
+ const cursors = {
280
+ lastAlignmentStart: (0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent)
281
+ ? sliceHeader.parsedContent.refSeqStart
282
+ : 0,
283
+ coreBlock: { bitPosition: 7, bytePosition: 0 },
284
+ externalBlocks: {
285
+ map: new Map(),
286
+ getCursor(contentId) {
287
+ let r = this.map.get(contentId);
288
+ if (r === undefined) {
289
+ r = { bitPosition: 7, bytePosition: 0 };
290
+ this.map.set(contentId, r);
291
+ }
292
+ return r;
315
293
  },
316
- };
317
- const decodeDataSeries = (dataSeriesName) => {
318
- const codec = compressionScheme.getCodecForDataSeries(dataSeriesName);
319
- if (!codec) {
320
- throw new errors_1.CramMalformedError(`no codec defined for ${dataSeriesName} data series`);
294
+ },
295
+ };
296
+ const decodeDataSeries = (dataSeriesName) => {
297
+ const codec = compressionScheme.getCodecForDataSeries(dataSeriesName);
298
+ if (!codec) {
299
+ throw new errors_1.CramMalformedError(`no codec defined for ${dataSeriesName} data series`);
300
+ }
301
+ // console.log(dataSeriesName, Object.getPrototypeOf(codec))
302
+ const decoded = codec.decode(this, coreDataBlock, blocksByContentId, cursors);
303
+ return decoded;
304
+ };
305
+ const records = new Array(sliceHeader.parsedContent.numRecords);
306
+ for (let i = 0; i < records.length; i += 1) {
307
+ try {
308
+ const init = (0, decodeRecord_1.default)(this, decodeDataSeries, compressionScheme, sliceHeader, coreDataBlock, blocksByContentId, cursors, majorVersion, i);
309
+ records[i] = new record_1.default({
310
+ ...init,
311
+ uniqueId: sliceHeader.contentPosition +
312
+ sliceHeader.parsedContent.recordCounter +
313
+ i +
314
+ 1,
315
+ });
316
+ }
317
+ catch (e) {
318
+ if (e instanceof getBits_1.CramBufferOverrunError) {
319
+ console.warn('read attempted beyond end of buffer, file seems truncated.');
320
+ break;
321
321
  }
322
- // console.log(dataSeriesName, Object.getPrototypeOf(codec))
323
- const decoded = codec.decode(this, coreDataBlock, blocksByContentId, cursors);
324
- return decoded;
325
- };
326
- const records = new Array(sliceHeader.parsedContent.numRecords);
327
- for (let i = 0; i < records.length; i += 1) {
328
- try {
329
- const init = (0, decodeRecord_1.default)(this, decodeDataSeries, compressionScheme, sliceHeader, coreDataBlock, blocksByContentId, cursors, majorVersion, i);
330
- records[i] = new record_1.default(Object.assign(Object.assign({}, init), { uniqueId: sliceHeader.contentPosition +
331
- sliceHeader.parsedContent.recordCounter +
332
- i +
333
- 1 }));
334
- }
335
- catch (e) {
336
- if (e instanceof getBits_1.CramBufferOverrunError) {
337
- console.warn('read attempted beyond end of buffer, file seems truncated.');
338
- break;
339
- }
340
- else {
341
- throw e;
342
- }
322
+ else {
323
+ throw e;
343
324
  }
344
325
  }
345
- // interpret `recordsToNextFragment` attributes to make standard `mate`
346
- // objects Resolve mate pair cross-references between records in this slice
347
- for (let i = 0; i < records.length; i += 1) {
348
- const { mateRecordNumber } = records[i];
349
- if (mateRecordNumber !== undefined && mateRecordNumber >= 0) {
350
- associateIntraSliceMate(records, i, records[i], records[mateRecordNumber]);
351
- }
326
+ }
327
+ // interpret `recordsToNextFragment` attributes to make standard `mate`
328
+ // objects Resolve mate pair cross-references between records in this slice
329
+ for (let i = 0; i < records.length; i += 1) {
330
+ const { mateRecordNumber } = records[i];
331
+ if (mateRecordNumber !== undefined && mateRecordNumber >= 0) {
332
+ associateIntraSliceMate(records, i, records[i], records[mateRecordNumber]);
352
333
  }
353
- return records;
354
- });
334
+ }
335
+ return records;
355
336
  }
356
- getRecords(filterFunction) {
357
- return __awaiter(this, void 0, void 0, function* () {
358
- // fetch the features if necessary, using the file-level feature cache
359
- const cacheKey = this.container.filePosition + this.containerPosition;
360
- let recordsPromise = this.file.featureCache.get(cacheKey.toString());
361
- if (!recordsPromise) {
362
- recordsPromise = this._fetchRecords();
363
- this.file.featureCache.set(cacheKey.toString(), recordsPromise);
364
- }
365
- const unfiltered = yield recordsPromise;
366
- const records = unfiltered.filter(filterFunction);
367
- // if we can fetch reference sequence, add the reference sequence to the records
368
- if (records.length && this.file.fetchReferenceSequenceCallback) {
369
- const sliceHeader = yield this.getHeader();
370
- if ((0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent) &&
371
- (sliceHeader.parsedContent.refSeqId >= 0 || // single-ref slice
372
- sliceHeader.parsedContent.refSeqId === -2) // multi-ref slice
373
- ) {
374
- const singleRefId = sliceHeader.parsedContent.refSeqId >= 0
375
- ? sliceHeader.parsedContent.refSeqId
376
- : undefined;
377
- const compressionScheme = yield this.container.getCompressionScheme();
378
- if (compressionScheme === undefined) {
379
- throw new Error('compression scheme undefined');
337
+ async getRecords(filterFunction) {
338
+ // fetch the features if necessary, using the file-level feature cache
339
+ const cacheKey = this.container.filePosition + this.containerPosition;
340
+ let recordsPromise = this.file.featureCache.get(cacheKey.toString());
341
+ if (!recordsPromise) {
342
+ recordsPromise = this._fetchRecords();
343
+ this.file.featureCache.set(cacheKey.toString(), recordsPromise);
344
+ }
345
+ const unfiltered = await recordsPromise;
346
+ const records = unfiltered.filter(filterFunction);
347
+ // if we can fetch reference sequence, add the reference sequence to the records
348
+ if (records.length && this.file.fetchReferenceSequenceCallback) {
349
+ const sliceHeader = await this.getHeader();
350
+ if ((0, sectionParsers_1.isMappedSliceHeader)(sliceHeader.parsedContent) &&
351
+ (sliceHeader.parsedContent.refSeqId >= 0 || // single-ref slice
352
+ sliceHeader.parsedContent.refSeqId === -2) // multi-ref slice
353
+ ) {
354
+ const singleRefId = sliceHeader.parsedContent.refSeqId >= 0
355
+ ? sliceHeader.parsedContent.refSeqId
356
+ : undefined;
357
+ const compressionScheme = await this.container.getCompressionScheme();
358
+ if (compressionScheme === undefined) {
359
+ throw new Error('compression scheme undefined');
360
+ }
361
+ const refRegions = {};
362
+ // iterate over the records to find the spans of the reference
363
+ // sequences we need to fetch
364
+ for (const record of records) {
365
+ const seqId = singleRefId !== undefined ? singleRefId : record.sequenceId;
366
+ let refRegion = refRegions[seqId];
367
+ if (!refRegion) {
368
+ refRegion = {
369
+ id: seqId,
370
+ start: record.alignmentStart,
371
+ end: Number.NEGATIVE_INFINITY,
372
+ seq: null,
373
+ };
374
+ refRegions[seqId] = refRegion;
375
+ }
376
+ const end = record.alignmentStart +
377
+ (record.lengthOnRef || record.readLength) -
378
+ 1;
379
+ if (end > refRegion.end) {
380
+ refRegion.end = end;
381
+ }
382
+ if (record.alignmentStart < refRegion.start) {
383
+ refRegion.start = record.alignmentStart;
380
384
  }
381
- const refRegions = {};
382
- // iterate over the records to find the spans of the reference
383
- // sequences we need to fetch
384
- for (const record of records) {
385
- const seqId = singleRefId !== undefined ? singleRefId : record.sequenceId;
386
- let refRegion = refRegions[seqId];
387
- if (!refRegion) {
388
- refRegion = {
389
- id: seqId,
390
- start: record.alignmentStart,
391
- end: Number.NEGATIVE_INFINITY,
392
- seq: null,
393
- };
394
- refRegions[seqId] = refRegion;
395
- }
396
- const end = record.alignmentStart +
397
- (record.lengthOnRef || record.readLength) -
398
- 1;
399
- if (end > refRegion.end) {
400
- refRegion.end = end;
401
- }
402
- if (record.alignmentStart < refRegion.start) {
403
- refRegion.start = record.alignmentStart;
404
- }
385
+ }
386
+ // fetch the `seq` for all of the ref regions
387
+ await Promise.all(Object.values(refRegions).map(async (refRegion) => {
388
+ if (refRegion.id !== -1 &&
389
+ refRegion.start <= refRegion.end &&
390
+ this.file.fetchReferenceSequenceCallback) {
391
+ refRegion.seq = await this.file.fetchReferenceSequenceCallback(refRegion.id, refRegion.start, refRegion.end);
405
392
  }
406
- // fetch the `seq` for all of the ref regions
407
- yield Promise.all(Object.values(refRegions).map((refRegion) => __awaiter(this, void 0, void 0, function* () {
408
- if (refRegion.id !== -1 &&
409
- refRegion.start <= refRegion.end &&
410
- this.file.fetchReferenceSequenceCallback) {
411
- refRegion.seq = yield this.file.fetchReferenceSequenceCallback(refRegion.id, refRegion.start, refRegion.end);
412
- }
413
- })));
414
- // now decorate all the records with them
415
- for (const record of records) {
416
- const seqId = singleRefId !== undefined ? singleRefId : record.sequenceId;
417
- const refRegion = refRegions[seqId];
418
- if (refRegion === null || refRegion === void 0 ? void 0 : refRegion.seq) {
419
- const seq = refRegion.seq;
420
- record.addReferenceSequence(Object.assign(Object.assign({}, refRegion), { seq }), compressionScheme);
421
- }
393
+ }));
394
+ // now decorate all the records with them
395
+ for (const record of records) {
396
+ const seqId = singleRefId !== undefined ? singleRefId : record.sequenceId;
397
+ const refRegion = refRegions[seqId];
398
+ if (refRegion?.seq) {
399
+ const seq = refRegion.seq;
400
+ record.addReferenceSequence({ ...refRegion, seq }, compressionScheme);
422
401
  }
423
402
  }
424
403
  }
425
- return records;
426
- });
404
+ }
405
+ return records;
427
406
  }
428
407
  }
429
408
  exports.default = CramSlice;