@gmod/cram 1.5.7 → 1.6.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.
Files changed (221) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +184 -174
  3. package/dist/craiIndex.d.ts +37 -0
  4. package/dist/craiIndex.js +196 -365
  5. package/dist/craiIndex.js.map +1 -0
  6. package/dist/cram-bundle.js +6 -15
  7. package/dist/cramFile/codecs/_base.d.ts +6 -0
  8. package/dist/cramFile/codecs/_base.js +44 -53
  9. package/dist/cramFile/codecs/_base.js.map +1 -0
  10. package/dist/cramFile/codecs/beta.d.ts +4 -0
  11. package/dist/cramFile/codecs/beta.js +38 -48
  12. package/dist/cramFile/codecs/beta.js.map +1 -0
  13. package/dist/cramFile/codecs/byteArrayLength.d.ts +8 -0
  14. package/dist/cramFile/codecs/byteArrayLength.js +58 -78
  15. package/dist/cramFile/codecs/byteArrayLength.js.map +1 -0
  16. package/dist/cramFile/codecs/byteArrayStop.d.ts +6 -0
  17. package/dist/cramFile/codecs/byteArrayStop.js +62 -76
  18. package/dist/cramFile/codecs/byteArrayStop.js.map +1 -0
  19. package/dist/cramFile/codecs/external.d.ts +7 -0
  20. package/dist/cramFile/codecs/external.js +63 -81
  21. package/dist/cramFile/codecs/external.js.map +1 -0
  22. package/dist/cramFile/codecs/gamma.d.ts +4 -0
  23. package/dist/cramFile/codecs/gamma.js +43 -56
  24. package/dist/cramFile/codecs/gamma.js.map +1 -0
  25. package/dist/cramFile/codecs/huffman.d.ts +17 -0
  26. package/dist/cramFile/codecs/huffman.js +126 -199
  27. package/dist/cramFile/codecs/huffman.js.map +1 -0
  28. package/dist/cramFile/codecs/index.d.ts +2 -0
  29. package/dist/cramFile/codecs/index.js +31 -38
  30. package/dist/cramFile/codecs/index.js.map +1 -0
  31. package/dist/cramFile/codecs/subexp.d.ts +4 -0
  32. package/dist/cramFile/codecs/subexp.js +51 -64
  33. package/dist/cramFile/codecs/subexp.js.map +1 -0
  34. package/dist/cramFile/constants.d.ts +36 -0
  35. package/dist/cramFile/constants.js +52 -50
  36. package/dist/cramFile/constants.js.map +1 -0
  37. package/dist/cramFile/container/compressionScheme.d.ts +23 -0
  38. package/dist/cramFile/container/compressionScheme.js +115 -153
  39. package/dist/cramFile/container/compressionScheme.js.map +1 -0
  40. package/dist/cramFile/container/index.d.ts +13 -0
  41. package/dist/cramFile/container/index.js +169 -283
  42. package/dist/cramFile/container/index.js.map +1 -0
  43. package/dist/cramFile/file.d.ts +63 -0
  44. package/dist/cramFile/file.js +440 -766
  45. package/dist/cramFile/file.js.map +1 -0
  46. package/dist/cramFile/index.d.ts +2 -0
  47. package/dist/cramFile/index.js +7 -4
  48. package/dist/cramFile/index.js.map +1 -0
  49. package/dist/cramFile/record.d.ts +79 -0
  50. package/dist/cramFile/record.js +253 -308
  51. package/dist/cramFile/record.js.map +1 -0
  52. package/dist/cramFile/sectionParsers.d.ts +18 -0
  53. package/dist/cramFile/sectionParsers.js +324 -362
  54. package/dist/cramFile/sectionParsers.js.map +1 -0
  55. package/dist/cramFile/slice/decodeRecord.d.ts +2 -0
  56. package/dist/cramFile/slice/decodeRecord.js +278 -298
  57. package/dist/cramFile/slice/decodeRecord.js.map +1 -0
  58. package/dist/cramFile/slice/index.d.ts +20 -0
  59. package/dist/cramFile/slice/index.js +488 -789
  60. package/dist/cramFile/slice/index.js.map +1 -0
  61. package/dist/cramFile/util.d.ts +5 -0
  62. package/dist/cramFile/util.js +158 -144
  63. package/dist/cramFile/util.js.map +1 -0
  64. package/dist/errors.d.ts +23 -0
  65. package/dist/errors.js +66 -103
  66. package/dist/errors.js.map +1 -0
  67. package/dist/index.d.ts +4 -0
  68. package/dist/index.js +12 -12
  69. package/dist/index.js.map +1 -0
  70. package/dist/indexedCramFile.d.ts +39 -0
  71. package/dist/indexedCramFile.js +213 -315
  72. package/dist/indexedCramFile.js.map +1 -0
  73. package/dist/io/bufferCache.d.ts +12 -0
  74. package/dist/io/bufferCache.js +108 -128
  75. package/dist/io/bufferCache.js.map +1 -0
  76. package/dist/io/index.d.ts +5 -0
  77. package/dist/io/index.js +29 -27
  78. package/dist/io/index.js.map +1 -0
  79. package/dist/io/localFile.d.ts +10 -0
  80. package/dist/io/localFile.js +105 -162
  81. package/dist/io/localFile.js.map +1 -0
  82. package/dist/io/remoteFile.d.ts +16 -0
  83. package/dist/io/remoteFile.js +137 -206
  84. package/dist/io/remoteFile.js.map +1 -0
  85. package/dist/rans/constants.d.ts +3 -0
  86. package/dist/rans/constants.js +6 -6
  87. package/dist/rans/constants.js.map +1 -0
  88. package/dist/rans/d04.d.ts +1 -0
  89. package/dist/rans/d04.js +70 -99
  90. package/dist/rans/d04.js.map +1 -0
  91. package/dist/rans/d14.d.ts +1 -0
  92. package/dist/rans/d14.js +55 -93
  93. package/dist/rans/d14.js.map +1 -0
  94. package/dist/rans/decoding.d.ts +30 -0
  95. package/dist/rans/decoding.js +112 -159
  96. package/dist/rans/decoding.js.map +1 -0
  97. package/dist/rans/frequencies.d.ts +2 -0
  98. package/dist/rans/frequencies.js +110 -119
  99. package/dist/rans/frequencies.js.map +1 -0
  100. package/dist/rans/index.d.ts +1 -0
  101. package/dist/rans/index.js +111 -174
  102. package/dist/rans/index.js.map +1 -0
  103. package/dist/sam.d.ts +1 -0
  104. package/dist/sam.js +16 -41
  105. package/dist/sam.js.map +1 -0
  106. package/dist/unzip-pako.d.ts +2 -0
  107. package/dist/unzip-pako.js +9 -0
  108. package/dist/unzip-pako.js.map +1 -0
  109. package/dist/unzip.d.ts +2 -0
  110. package/dist/unzip.js +6 -0
  111. package/dist/unzip.js.map +1 -0
  112. package/errors.js +66 -103
  113. package/esm/craiIndex.d.ts +37 -0
  114. package/esm/craiIndex.js +158 -0
  115. package/esm/craiIndex.js.map +1 -0
  116. package/esm/cramFile/codecs/_base.d.ts +6 -0
  117. package/esm/cramFile/codecs/_base.js +42 -0
  118. package/esm/cramFile/codecs/_base.js.map +1 -0
  119. package/esm/cramFile/codecs/beta.d.ts +4 -0
  120. package/esm/cramFile/codecs/beta.js +15 -0
  121. package/esm/cramFile/codecs/beta.js.map +1 -0
  122. package/esm/cramFile/codecs/byteArrayLength.d.ts +8 -0
  123. package/esm/cramFile/codecs/byteArrayLength.js +35 -0
  124. package/esm/cramFile/codecs/byteArrayLength.js.map +1 -0
  125. package/esm/cramFile/codecs/byteArrayStop.d.ts +6 -0
  126. package/esm/cramFile/codecs/byteArrayStop.js +40 -0
  127. package/esm/cramFile/codecs/byteArrayStop.js.map +1 -0
  128. package/esm/cramFile/codecs/external.d.ts +7 -0
  129. package/esm/cramFile/codecs/external.js +40 -0
  130. package/esm/cramFile/codecs/external.js.map +1 -0
  131. package/esm/cramFile/codecs/gamma.d.ts +4 -0
  132. package/esm/cramFile/codecs/gamma.js +20 -0
  133. package/esm/cramFile/codecs/gamma.js.map +1 -0
  134. package/esm/cramFile/codecs/huffman.d.ts +17 -0
  135. package/esm/cramFile/codecs/huffman.js +107 -0
  136. package/esm/cramFile/codecs/huffman.js.map +1 -0
  137. package/esm/cramFile/codecs/index.d.ts +2 -0
  138. package/esm/cramFile/codecs/index.js +30 -0
  139. package/esm/cramFile/codecs/index.js.map +1 -0
  140. package/esm/cramFile/codecs/subexp.d.ts +4 -0
  141. package/esm/cramFile/codecs/subexp.js +28 -0
  142. package/esm/cramFile/codecs/subexp.js.map +1 -0
  143. package/esm/cramFile/constants.d.ts +36 -0
  144. package/esm/cramFile/constants.js +51 -0
  145. package/esm/cramFile/constants.js.map +1 -0
  146. package/esm/cramFile/container/compressionScheme.d.ts +23 -0
  147. package/esm/cramFile/container/compressionScheme.js +123 -0
  148. package/esm/cramFile/container/compressionScheme.js.map +1 -0
  149. package/esm/cramFile/container/index.d.ts +13 -0
  150. package/esm/cramFile/container/index.js +84 -0
  151. package/esm/cramFile/container/index.js.map +1 -0
  152. package/esm/cramFile/file.d.ts +63 -0
  153. package/esm/cramFile/file.js +281 -0
  154. package/esm/cramFile/file.js.map +1 -0
  155. package/esm/cramFile/index.d.ts +2 -0
  156. package/esm/cramFile/index.js +3 -0
  157. package/esm/cramFile/index.js.map +1 -0
  158. package/esm/cramFile/record.d.ts +79 -0
  159. package/esm/cramFile/record.js +297 -0
  160. package/esm/cramFile/record.js.map +1 -0
  161. package/esm/cramFile/sectionParsers.d.ts +18 -0
  162. package/esm/cramFile/sectionParsers.js +347 -0
  163. package/esm/cramFile/sectionParsers.js.map +1 -0
  164. package/esm/cramFile/slice/decodeRecord.d.ts +2 -0
  165. package/esm/cramFile/slice/decodeRecord.js +299 -0
  166. package/esm/cramFile/slice/decodeRecord.js.map +1 -0
  167. package/esm/cramFile/slice/index.d.ts +20 -0
  168. package/esm/cramFile/slice/index.js +364 -0
  169. package/esm/cramFile/slice/index.js.map +1 -0
  170. package/esm/cramFile/util.d.ts +5 -0
  171. package/esm/cramFile/util.js +161 -0
  172. package/esm/cramFile/util.js.map +1 -0
  173. package/esm/errors.d.ts +23 -0
  174. package/esm/errors.js +24 -0
  175. package/esm/errors.js.map +1 -0
  176. package/esm/index.d.ts +4 -0
  177. package/esm/index.js +5 -0
  178. package/esm/index.js.map +1 -0
  179. package/esm/indexedCramFile.d.ts +39 -0
  180. package/esm/indexedCramFile.js +155 -0
  181. package/esm/indexedCramFile.js.map +1 -0
  182. package/esm/io/bufferCache.d.ts +12 -0
  183. package/esm/io/bufferCache.js +54 -0
  184. package/esm/io/bufferCache.js.map +1 -0
  185. package/esm/io/index.d.ts +5 -0
  186. package/esm/io/index.js +24 -0
  187. package/esm/io/index.js.map +1 -0
  188. package/esm/io/localFile.d.ts +10 -0
  189. package/esm/io/localFile.js +31 -0
  190. package/esm/io/localFile.js.map +1 -0
  191. package/esm/io/remoteFile.d.ts +16 -0
  192. package/esm/io/remoteFile.js +64 -0
  193. package/esm/io/remoteFile.js.map +1 -0
  194. package/esm/rans/constants.d.ts +3 -0
  195. package/esm/rans/constants.js +5 -0
  196. package/esm/rans/constants.js.map +1 -0
  197. package/esm/rans/d04.d.ts +1 -0
  198. package/esm/rans/d04.js +67 -0
  199. package/esm/rans/d04.js.map +1 -0
  200. package/esm/rans/d14.d.ts +1 -0
  201. package/esm/rans/d14.js +52 -0
  202. package/esm/rans/d14.js.map +1 -0
  203. package/esm/rans/decoding.d.ts +30 -0
  204. package/esm/rans/decoding.js +118 -0
  205. package/esm/rans/decoding.js.map +1 -0
  206. package/esm/rans/frequencies.d.ts +2 -0
  207. package/esm/rans/frequencies.js +110 -0
  208. package/esm/rans/frequencies.js.map +1 -0
  209. package/esm/rans/index.d.ts +1 -0
  210. package/esm/rans/index.js +195 -0
  211. package/esm/rans/index.js.map +1 -0
  212. package/esm/sam.d.ts +1 -0
  213. package/esm/sam.js +16 -0
  214. package/esm/sam.js.map +1 -0
  215. package/esm/unzip-pako.d.ts +2 -0
  216. package/esm/unzip-pako.js +5 -0
  217. package/esm/unzip-pako.js.map +1 -0
  218. package/esm/unzip.d.ts +2 -0
  219. package/esm/unzip.js +3 -0
  220. package/esm/unzip.js.map +1 -0
  221. package/package.json +37 -35
package/dist/craiIndex.js CHANGED
@@ -1,254 +1,176 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
-
5
- var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
6
-
7
- var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs3/regenerator"));
8
-
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
10
-
11
- var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
12
-
13
- var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/entries"));
14
-
15
- var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
16
-
17
- var _parseInt = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/number/parse-int"));
18
-
19
- var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));
20
-
21
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
22
-
23
- var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some"));
24
-
25
- var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
26
-
27
- var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
28
-
29
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
30
-
31
- var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
32
-
33
- var AbortablePromiseCache = require('abortable-promise-cache').default;
34
-
35
- var QuickLRU = require('quick-lru');
36
-
37
- var _require = require('es6-promisify'),
38
- promisify = _require.promisify;
39
-
40
- var zlib = require('zlib');
41
-
42
- var gunzip = promisify(zlib.gunzip);
43
-
44
- var _require2 = require('./io'),
45
- open = _require2.open;
46
-
47
- var _require3 = require('./errors'),
48
- CramMalformedError = _require3.CramMalformedError;
49
-
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
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var abortable_promise_cache_1 = __importDefault(require("abortable-promise-cache"));
43
+ var quick_lru_1 = __importDefault(require("quick-lru"));
44
+ var unzip_1 = require("./unzip");
45
+ var io_1 = require("./io");
46
+ var errors_1 = require("./errors");
50
47
  var BAI_MAGIC = 21578050; // BAI\1
51
-
52
- var Slice =
53
- /*#__PURE__*/
54
- function () {
55
- function Slice(args) {
56
- (0, _classCallCheck2.default)(this, Slice);
57
- (0, _assign.default)(this, args);
58
- }
59
-
60
- (0, _createClass2.default)(Slice, [{
61
- key: "toString",
62
- value: function toString() {
63
- var _context, _context2, _context3, _context4;
64
-
65
- return (0, _concat.default)(_context = (0, _concat.default)(_context2 = (0, _concat.default)(_context3 = (0, _concat.default)(_context4 = "".concat(this.start, ":")).call(_context4, this.span, ":")).call(_context3, this.containerStart, ":")).call(_context2, this.sliceStart, ":")).call(_context, this.sliceBytes);
48
+ var Slice = /** @class */ (function () {
49
+ function Slice(args) {
50
+ Object.assign(this, args);
66
51
  }
67
- }]);
68
- return Slice;
69
- }();
70
-
52
+ Slice.prototype.toString = function () {
53
+ return "".concat(this.start, ":").concat(this.span, ":").concat(this.containerStart, ":").concat(this.sliceStart, ":").concat(this.sliceBytes);
54
+ };
55
+ return Slice;
56
+ }());
71
57
  function addRecordToIndex(index, record) {
72
- if ((0, _some.default)(record).call(record, function (el) {
73
- return el === undefined;
74
- })) {
75
- throw new CramMalformedError('invalid .crai index file');
76
- }
77
-
78
- var _record = (0, _slicedToArray2.default)(record, 6),
79
- seqId = _record[0],
80
- start = _record[1],
81
- span = _record[2],
82
- containerStart = _record[3],
83
- sliceStart = _record[4],
84
- sliceBytes = _record[5];
85
-
86
- if (!index[seqId]) index[seqId] = [];
87
- index[seqId].push(new Slice({
88
- start: start,
89
- span: span,
90
- containerStart: containerStart,
91
- sliceStart: sliceStart,
92
- sliceBytes: sliceBytes
93
- }));
58
+ if (record.some(function (el) { return el === undefined; })) {
59
+ throw new errors_1.CramMalformedError('invalid .crai index file');
60
+ }
61
+ var seqId = record[0], start = record[1], span = record[2], containerStart = record[3], sliceStart = record[4], sliceBytes = record[5];
62
+ if (!index[seqId]) {
63
+ index[seqId] = [];
64
+ }
65
+ index[seqId].push(new Slice({
66
+ start: start,
67
+ span: span,
68
+ containerStart: containerStart,
69
+ sliceStart: sliceStart,
70
+ sliceBytes: sliceBytes,
71
+ }));
94
72
  }
95
-
96
- var CraiIndex =
97
- /*#__PURE__*/
98
- function () {
99
- // A CRAM index (.crai) is a gzipped tab delimited file containing the following columns:
100
- // 1. Sequence id
101
- // 2. Alignment start
102
- // 3. Alignment span
103
- // 4. Container start byte position in the file
104
- // 5. Slice start byte position in the container data (‘blocks’)
105
- // 6. Slice size in bytes
106
- // Each line represents a slice in the CRAM file. Please note that all slices must be listed in index file.
107
-
108
- /**
109
- *
110
- * @param {object} args
111
- * @param {string} [args.path]
112
- * @param {string} [args.url]
113
- * @param {FileHandle} [args.filehandle]
114
- */
115
- function CraiIndex(args) {
116
- var _this = this,
117
- _context5;
118
-
119
- (0, _classCallCheck2.default)(this, CraiIndex);
120
- var filehandle = open(args.url, args.path, args.filehandle);
121
- this._parseCache = new AbortablePromiseCache({
122
- cache: new QuickLRU({
123
- maxSize: 1
124
- }),
125
- fill: function fill(data, signal) {
126
- return _this.parseIndex({
127
- signal: signal
73
+ var CraiIndex = /** @class */ (function () {
74
+ // A CRAM index (.crai) is a gzipped tab delimited file containing the following columns:
75
+ // 1. Sequence id
76
+ // 2. Alignment start
77
+ // 3. Alignment span
78
+ // 4. Container start byte position in the file
79
+ // 5. Slice start byte position in the container data (‘blocks’)
80
+ // 6. Slice size in bytes
81
+ // Each line represents a slice in the CRAM file. Please note that all slices must be listed in index file.
82
+ /**
83
+ *
84
+ * @param {object} args
85
+ * @param {string} [args.path]
86
+ * @param {string} [args.url]
87
+ * @param {FileHandle} [args.filehandle]
88
+ */
89
+ function CraiIndex(args) {
90
+ var _this = this;
91
+ var filehandle = (0, io_1.open)(args.url, args.path, args.filehandle);
92
+ this._parseCache = new abortable_promise_cache_1.default({
93
+ cache: new quick_lru_1.default({ maxSize: 1 }),
94
+ fill: function (data, signal) { return _this.parseIndex({ signal: signal }); },
128
95
  });
129
- }
130
- });
131
- this.readFile = (0, _bind.default)(_context5 = filehandle.readFile).call(_context5, filehandle);
132
- }
133
-
134
- (0, _createClass2.default)(CraiIndex, [{
135
- key: "parseIndex",
136
- value: function parseIndex() {
137
- var index = {};
138
- return this.readFile().then(function (data) {
139
- if (data[0] === 31 && data[1] === 139) return gunzip(data);
140
- return data;
141
- }).then(function (uncompressedBuffer) {
142
- var _context6;
143
-
144
- if (uncompressedBuffer.length > 4 && uncompressedBuffer.readUInt32LE(0) === BAI_MAGIC) {
145
- throw new CramMalformedError('invalid .crai index file. note: file appears to be a .bai index. this is technically legal but please open a github issue if you need support');
146
- } // interpret the text as regular ascii, since it is
147
- // supposed to be only digits and whitespace characters
148
- // this is written in a deliberately low-level fashion for performance,
149
- // because some .crai files can be pretty large.
150
-
151
-
152
- var currentRecord = [];
153
- var currentString = '';
154
-
155
- for (var i = 0; i < uncompressedBuffer.length; i += 1) {
156
- var charCode = uncompressedBuffer[i];
157
-
158
- if (charCode >= 48 && charCode <= 57 ||
159
- /* 0-9 */
160
- !currentString && charCode === 45
161
- /* leading - */
162
- ) {
163
- currentString += String.fromCharCode(charCode);
164
- } else if (charCode === 9
165
- /* \t */
166
- ) {
167
- currentRecord.push((0, _parseInt.default)(currentString, 10));
168
- currentString = '';
169
- } else if (charCode === 10
170
- /* \n */
171
- ) {
172
- currentRecord.push((0, _parseInt.default)(currentString, 10));
173
- currentString = '';
174
- addRecordToIndex(index, currentRecord);
175
- currentRecord = [];
176
- } else if (charCode !== 13
177
- /* \r */
178
- && charCode !== 32
179
- /* space */
180
- ) {
181
- // if there are other characters in the file besides
182
- // space and \r, something is wrong.
183
- throw new CramMalformedError('invalid .crai index file');
96
+ this.readFile = filehandle.readFile.bind(filehandle);
97
+ }
98
+ CraiIndex.prototype.parseIndex = function () {
99
+ var index = {};
100
+ return this.readFile()
101
+ .then(function (data) {
102
+ if (data[0] === 31 && data[1] === 139) {
103
+ return (0, unzip_1.unzip)(data);
104
+ }
105
+ return data;
106
+ })
107
+ .then(function (uncompressedBuffer) {
108
+ if (uncompressedBuffer.length > 4 &&
109
+ uncompressedBuffer.readUInt32LE(0) === BAI_MAGIC) {
110
+ throw new errors_1.CramMalformedError('invalid .crai index file. note: file appears to be a .bai index. this is technically legal but please open a github issue if you need support');
111
+ }
112
+ // interpret the text as regular ascii, since it is
113
+ // supposed to be only digits and whitespace characters
114
+ // this is written in a deliberately low-level fashion for performance,
115
+ // because some .crai files can be pretty large.
116
+ var currentRecord = [];
117
+ var currentString = '';
118
+ for (var i = 0; i < uncompressedBuffer.length; i += 1) {
119
+ var charCode = uncompressedBuffer[i];
120
+ if ((charCode >= 48 && charCode <= 57) /* 0-9 */ ||
121
+ (!currentString && charCode === 45) /* leading - */) {
122
+ currentString += String.fromCharCode(charCode);
123
+ }
124
+ else if (charCode === 9 /* \t */) {
125
+ currentRecord.push(Number.parseInt(currentString, 10));
126
+ currentString = '';
127
+ }
128
+ else if (charCode === 10 /* \n */) {
129
+ currentRecord.push(Number.parseInt(currentString, 10));
130
+ currentString = '';
131
+ addRecordToIndex(index, currentRecord);
132
+ currentRecord = [];
133
+ }
134
+ else if (charCode !== 13 /* \r */ && charCode !== 32 /* space */) {
135
+ // if there are other characters in the file besides
136
+ // space and \r, something is wrong.
137
+ throw new errors_1.CramMalformedError('invalid .crai index file');
138
+ }
139
+ }
140
+ // if the file ends without a \n, we need to flush our buffers
141
+ if (currentString) {
142
+ currentRecord.push(Number.parseInt(currentString, 10));
184
143
  }
185
- } // if the file ends without a \n, we need to flush our buffers
186
-
187
-
188
- if (currentString) {
189
- currentRecord.push((0, _parseInt.default)(currentString, 10));
190
- }
191
-
192
- if (currentRecord.length === 6) {
193
- addRecordToIndex(index, currentRecord);
194
- } // sort each of them by start
195
-
196
-
197
- (0, _forEach.default)(_context6 = (0, _entries.default)(index)).call(_context6, function (_ref) {
198
- var _ref2 = (0, _slicedToArray2.default)(_ref, 2),
199
- seqId = _ref2[0],
200
- ent = _ref2[1];
201
-
202
- index[seqId] = (0, _sort.default)(ent).call(ent, function (a, b) {
203
- return a.start - b.start || a.span - b.span;
204
- });
144
+ if (currentRecord.length === 6) {
145
+ addRecordToIndex(index, currentRecord);
146
+ }
147
+ // sort each of them by start
148
+ Object.entries(index).forEach(function (_a) {
149
+ var seqId = _a[0], ent = _a[1];
150
+ index[seqId] = ent.sort(function (a, b) { return a.start - b.start || a.span - b.span; });
151
+ });
152
+ return index;
205
153
  });
206
- return index;
207
- });
208
- }
209
- }, {
210
- key: "getIndex",
211
- value: function getIndex() {
212
- var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
213
- return this._parseCache.get('index', null, opts.signal);
214
- }
154
+ };
155
+ CraiIndex.prototype.getIndex = function (opts) {
156
+ if (opts === void 0) { opts = {}; }
157
+ return this._parseCache.get('index', null, opts.signal);
158
+ };
215
159
  /**
216
160
  * @param {number} seqId
217
161
  * @returns {Promise} true if the index contains entries for
218
162
  * the given reference sequence ID, false otherwise
219
163
  */
220
-
221
- }, {
222
- key: "hasDataForReferenceSequence",
223
- value: function () {
224
- var _hasDataForReferenceSequence = (0, _asyncToGenerator2.default)(
225
- /*#__PURE__*/
226
- _regenerator.default.mark(function _callee(seqId) {
227
- return _regenerator.default.wrap(function _callee$(_context7) {
228
- while (1) {
229
- switch (_context7.prev = _context7.next) {
230
- case 0:
231
- _context7.next = 2;
232
- return this.getIndex();
233
-
234
- case 2:
235
- _context7.t0 = seqId;
236
- return _context7.abrupt("return", !!_context7.sent[_context7.t0]);
237
-
238
- case 4:
239
- case "end":
240
- return _context7.stop();
241
- }
242
- }
243
- }, _callee, this);
244
- }));
245
-
246
- function hasDataForReferenceSequence(_x) {
247
- return _hasDataForReferenceSequence.apply(this, arguments);
248
- }
249
-
250
- return hasDataForReferenceSequence;
251
- }()
164
+ CraiIndex.prototype.hasDataForReferenceSequence = function (seqId) {
165
+ return __awaiter(this, void 0, void 0, function () {
166
+ return __generator(this, function (_a) {
167
+ switch (_a.label) {
168
+ case 0: return [4 /*yield*/, this.getIndex()];
169
+ case 1: return [2 /*return*/, !!(_a.sent())[seqId]];
170
+ }
171
+ });
172
+ });
173
+ };
252
174
  /**
253
175
  * fetch index entries for the given range
254
176
  *
@@ -260,131 +182,40 @@ function () {
260
182
  * an array of objects of the form
261
183
  * `{start, span, containerStart, sliceStart, sliceBytes }`
262
184
  */
263
-
264
- }, {
265
- key: "getEntriesForRange",
266
- value: function () {
267
- var _getEntriesForRange = (0, _asyncToGenerator2.default)(
268
- /*#__PURE__*/
269
- _regenerator.default.mark(function _callee2(seqId, queryStart, queryEnd) {
270
- var seqEntries, len, compare, lowerBound, upperBound, searchPosition, nextSearchDirection, overlapStart, overlapEnd, x1, x2, y1, y2;
271
- return _regenerator.default.wrap(function _callee2$(_context8) {
272
- while (1) {
273
- switch (_context8.prev = _context8.next) {
274
- case 0:
275
- _context8.next = 2;
276
- return this.getIndex();
277
-
278
- case 2:
279
- _context8.t0 = seqId;
280
- seqEntries = _context8.sent[_context8.t0];
281
-
282
- if (seqEntries) {
283
- _context8.next = 6;
284
- break;
185
+ CraiIndex.prototype.getEntriesForRange = function (seqId, queryStart, queryEnd) {
186
+ return __awaiter(this, void 0, void 0, function () {
187
+ var seqEntries, compare, bins, i;
188
+ return __generator(this, function (_a) {
189
+ switch (_a.label) {
190
+ case 0: return [4 /*yield*/, this.getIndex()];
191
+ case 1:
192
+ seqEntries = (_a.sent())[seqId];
193
+ if (!seqEntries) {
194
+ return [2 /*return*/, []];
195
+ }
196
+ compare = function (entry) {
197
+ var entryStart = entry.start;
198
+ var entryEnd = entry.start + entry.span;
199
+ if (entryStart >= queryEnd) {
200
+ return -1;
201
+ } // entry is ahead of query
202
+ if (entryEnd <= queryStart) {
203
+ return 1;
204
+ } // entry is behind query
205
+ return 0; // entry overlaps query
206
+ };
207
+ bins = [];
208
+ for (i = 0; i < seqEntries.length; i += 1) {
209
+ if (compare(seqEntries[i]) === 0) {
210
+ bins.push(seqEntries[i]);
211
+ }
212
+ }
213
+ return [2 /*return*/, bins];
285
214
  }
286
-
287
- return _context8.abrupt("return", []);
288
-
289
- case 6:
290
- len = seqEntries.length; // binary search to find an entry that
291
- // overlaps the range, then extend backward
292
- // and forward from that
293
-
294
- compare = function compare(entry) {
295
- var entryStart = entry.start;
296
- var entryEnd = entry.start + entry.span;
297
- if (entryStart >= queryEnd) return -1; // entry is ahead of query
298
-
299
- if (entryEnd <= queryStart) return 1; // entry is behind query
300
-
301
- return 0; // entry overlaps query
302
- };
303
-
304
- lowerBound = 0;
305
- upperBound = len - 1;
306
-
307
- case 10:
308
- if (!(lowerBound <= upperBound)) {
309
- _context8.next = 24;
310
- break;
311
- }
312
-
313
- searchPosition = Math.round((upperBound + lowerBound) / 2);
314
- nextSearchDirection = compare(seqEntries[searchPosition]);
315
-
316
- if (!(nextSearchDirection > 0)) {
317
- _context8.next = 17;
318
- break;
319
- }
320
-
321
- lowerBound = searchPosition + 1;
322
- _context8.next = 22;
323
- break;
324
-
325
- case 17:
326
- if (!(nextSearchDirection < 0)) {
327
- _context8.next = 21;
328
- break;
329
- }
330
-
331
- upperBound = searchPosition - 1;
332
- _context8.next = 22;
333
- break;
334
-
335
- case 21:
336
- return _context8.abrupt("break", 24);
337
-
338
- case 22:
339
- _context8.next = 10;
340
- break;
341
-
342
- case 24:
343
- // now extend backward
344
- overlapStart = searchPosition;
345
-
346
- while (overlapStart && !compare(seqEntries[overlapStart - 1])) {
347
- overlapStart -= 1;
348
- } // and then extend forward
349
-
350
-
351
- overlapEnd = searchPosition;
352
-
353
- while (overlapEnd < len - 1 && !compare(seqEntries[overlapEnd + 1])) {
354
- overlapEnd += 1;
355
- }
356
-
357
- x1 = seqEntries[overlapStart].start;
358
- x2 = seqEntries[overlapEnd].start + seqEntries[overlapEnd].span;
359
- y1 = queryStart;
360
- y2 = queryEnd;
361
-
362
- if (!(x2 >= y1 && y2 >= x1)) {
363
- _context8.next = 34;
364
- break;
365
- }
366
-
367
- return _context8.abrupt("return", (0, _slice.default)(seqEntries).call(seqEntries, overlapStart, overlapEnd + 1));
368
-
369
- case 34:
370
- return _context8.abrupt("return", []);
371
-
372
- case 35:
373
- case "end":
374
- return _context8.stop();
375
- }
376
- }
377
- }, _callee2, this);
378
- }));
379
-
380
- function getEntriesForRange(_x2, _x3, _x4) {
381
- return _getEntriesForRange.apply(this, arguments);
382
- }
383
-
384
- return getEntriesForRange;
385
- }()
386
- }]);
387
- return CraiIndex;
388
- }();
389
-
390
- module.exports = CraiIndex;
215
+ });
216
+ });
217
+ };
218
+ return CraiIndex;
219
+ }());
220
+ exports.default = CraiIndex;
221
+ //# sourceMappingURL=craiIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craiIndex.js","sourceRoot":"","sources":["../src/craiIndex.js"],"names":[],"mappings":"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"}