@gmod/cram 1.5.6 → 1.6.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 (209) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +126 -154
  3. package/dist/craiIndex.d.ts +37 -0
  4. package/dist/craiIndex.js +198 -365
  5. package/dist/craiIndex.js.map +1 -0
  6. package/dist/cram-bundle.js +8 -6
  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 -735
  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/errors.js +66 -103
  107. package/esm/craiIndex.d.ts +37 -0
  108. package/esm/craiIndex.js +160 -0
  109. package/esm/craiIndex.js.map +1 -0
  110. package/esm/cramFile/codecs/_base.d.ts +6 -0
  111. package/esm/cramFile/codecs/_base.js +42 -0
  112. package/esm/cramFile/codecs/_base.js.map +1 -0
  113. package/esm/cramFile/codecs/beta.d.ts +4 -0
  114. package/esm/cramFile/codecs/beta.js +15 -0
  115. package/esm/cramFile/codecs/beta.js.map +1 -0
  116. package/esm/cramFile/codecs/byteArrayLength.d.ts +8 -0
  117. package/esm/cramFile/codecs/byteArrayLength.js +35 -0
  118. package/esm/cramFile/codecs/byteArrayLength.js.map +1 -0
  119. package/esm/cramFile/codecs/byteArrayStop.d.ts +6 -0
  120. package/esm/cramFile/codecs/byteArrayStop.js +40 -0
  121. package/esm/cramFile/codecs/byteArrayStop.js.map +1 -0
  122. package/esm/cramFile/codecs/external.d.ts +7 -0
  123. package/esm/cramFile/codecs/external.js +40 -0
  124. package/esm/cramFile/codecs/external.js.map +1 -0
  125. package/esm/cramFile/codecs/gamma.d.ts +4 -0
  126. package/esm/cramFile/codecs/gamma.js +20 -0
  127. package/esm/cramFile/codecs/gamma.js.map +1 -0
  128. package/esm/cramFile/codecs/huffman.d.ts +17 -0
  129. package/esm/cramFile/codecs/huffman.js +107 -0
  130. package/esm/cramFile/codecs/huffman.js.map +1 -0
  131. package/esm/cramFile/codecs/index.d.ts +2 -0
  132. package/esm/cramFile/codecs/index.js +30 -0
  133. package/esm/cramFile/codecs/index.js.map +1 -0
  134. package/esm/cramFile/codecs/subexp.d.ts +4 -0
  135. package/esm/cramFile/codecs/subexp.js +28 -0
  136. package/esm/cramFile/codecs/subexp.js.map +1 -0
  137. package/esm/cramFile/constants.d.ts +36 -0
  138. package/esm/cramFile/constants.js +51 -0
  139. package/esm/cramFile/constants.js.map +1 -0
  140. package/esm/cramFile/container/compressionScheme.d.ts +23 -0
  141. package/esm/cramFile/container/compressionScheme.js +123 -0
  142. package/esm/cramFile/container/compressionScheme.js.map +1 -0
  143. package/esm/cramFile/container/index.d.ts +13 -0
  144. package/esm/cramFile/container/index.js +84 -0
  145. package/esm/cramFile/container/index.js.map +1 -0
  146. package/esm/cramFile/file.d.ts +63 -0
  147. package/esm/cramFile/file.js +281 -0
  148. package/esm/cramFile/file.js.map +1 -0
  149. package/esm/cramFile/index.d.ts +2 -0
  150. package/esm/cramFile/index.js +3 -0
  151. package/esm/cramFile/index.js.map +1 -0
  152. package/esm/cramFile/record.d.ts +79 -0
  153. package/esm/cramFile/record.js +297 -0
  154. package/esm/cramFile/record.js.map +1 -0
  155. package/esm/cramFile/sectionParsers.d.ts +18 -0
  156. package/esm/cramFile/sectionParsers.js +347 -0
  157. package/esm/cramFile/sectionParsers.js.map +1 -0
  158. package/esm/cramFile/slice/decodeRecord.d.ts +2 -0
  159. package/esm/cramFile/slice/decodeRecord.js +299 -0
  160. package/esm/cramFile/slice/decodeRecord.js.map +1 -0
  161. package/esm/cramFile/slice/index.d.ts +20 -0
  162. package/esm/cramFile/slice/index.js +364 -0
  163. package/esm/cramFile/slice/index.js.map +1 -0
  164. package/esm/cramFile/util.d.ts +5 -0
  165. package/esm/cramFile/util.js +161 -0
  166. package/esm/cramFile/util.js.map +1 -0
  167. package/esm/errors.d.ts +23 -0
  168. package/esm/errors.js +24 -0
  169. package/esm/errors.js.map +1 -0
  170. package/esm/index.d.ts +4 -0
  171. package/esm/index.js +5 -0
  172. package/esm/index.js.map +1 -0
  173. package/esm/indexedCramFile.d.ts +39 -0
  174. package/esm/indexedCramFile.js +155 -0
  175. package/esm/indexedCramFile.js.map +1 -0
  176. package/esm/io/bufferCache.d.ts +12 -0
  177. package/esm/io/bufferCache.js +54 -0
  178. package/esm/io/bufferCache.js.map +1 -0
  179. package/esm/io/index.d.ts +5 -0
  180. package/esm/io/index.js +24 -0
  181. package/esm/io/index.js.map +1 -0
  182. package/esm/io/localFile.d.ts +10 -0
  183. package/esm/io/localFile.js +31 -0
  184. package/esm/io/localFile.js.map +1 -0
  185. package/esm/io/remoteFile.d.ts +16 -0
  186. package/esm/io/remoteFile.js +64 -0
  187. package/esm/io/remoteFile.js.map +1 -0
  188. package/esm/rans/constants.d.ts +3 -0
  189. package/esm/rans/constants.js +5 -0
  190. package/esm/rans/constants.js.map +1 -0
  191. package/esm/rans/d04.d.ts +1 -0
  192. package/esm/rans/d04.js +67 -0
  193. package/esm/rans/d04.js.map +1 -0
  194. package/esm/rans/d14.d.ts +1 -0
  195. package/esm/rans/d14.js +52 -0
  196. package/esm/rans/d14.js.map +1 -0
  197. package/esm/rans/decoding.d.ts +30 -0
  198. package/esm/rans/decoding.js +118 -0
  199. package/esm/rans/decoding.js.map +1 -0
  200. package/esm/rans/frequencies.d.ts +2 -0
  201. package/esm/rans/frequencies.js +110 -0
  202. package/esm/rans/frequencies.js.map +1 -0
  203. package/esm/rans/index.d.ts +1 -0
  204. package/esm/rans/index.js +195 -0
  205. package/esm/rans/index.js.map +1 -0
  206. package/esm/sam.d.ts +1 -0
  207. package/esm/sam.js +16 -0
  208. package/esm/sam.js.map +1 -0
  209. package/package.json +34 -35
package/dist/craiIndex.js CHANGED
@@ -1,254 +1,178 @@
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 es6_promisify_1 = require("es6-promisify");
45
+ var zlib_1 = __importDefault(require("zlib"));
46
+ var io_1 = require("./io");
47
+ var errors_1 = require("./errors");
48
+ var gunzip = (0, es6_promisify_1.promisify)(zlib_1.default.gunzip);
50
49
  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);
50
+ var Slice = /** @class */ (function () {
51
+ function Slice(args) {
52
+ Object.assign(this, args);
66
53
  }
67
- }]);
68
- return Slice;
69
- }();
70
-
54
+ Slice.prototype.toString = function () {
55
+ return "".concat(this.start, ":").concat(this.span, ":").concat(this.containerStart, ":").concat(this.sliceStart, ":").concat(this.sliceBytes);
56
+ };
57
+ return Slice;
58
+ }());
71
59
  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
- }));
60
+ if (record.some(function (el) { return el === undefined; })) {
61
+ throw new errors_1.CramMalformedError('invalid .crai index file');
62
+ }
63
+ var seqId = record[0], start = record[1], span = record[2], containerStart = record[3], sliceStart = record[4], sliceBytes = record[5];
64
+ if (!index[seqId]) {
65
+ index[seqId] = [];
66
+ }
67
+ index[seqId].push(new Slice({
68
+ start: start,
69
+ span: span,
70
+ containerStart: containerStart,
71
+ sliceStart: sliceStart,
72
+ sliceBytes: sliceBytes,
73
+ }));
94
74
  }
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
75
+ var CraiIndex = /** @class */ (function () {
76
+ // A CRAM index (.crai) is a gzipped tab delimited file containing the following columns:
77
+ // 1. Sequence id
78
+ // 2. Alignment start
79
+ // 3. Alignment span
80
+ // 4. Container start byte position in the file
81
+ // 5. Slice start byte position in the container data (‘blocks’)
82
+ // 6. Slice size in bytes
83
+ // Each line represents a slice in the CRAM file. Please note that all slices must be listed in index file.
84
+ /**
85
+ *
86
+ * @param {object} args
87
+ * @param {string} [args.path]
88
+ * @param {string} [args.url]
89
+ * @param {FileHandle} [args.filehandle]
90
+ */
91
+ function CraiIndex(args) {
92
+ var _this = this;
93
+ var filehandle = (0, io_1.open)(args.url, args.path, args.filehandle);
94
+ this._parseCache = new abortable_promise_cache_1.default({
95
+ cache: new quick_lru_1.default({ maxSize: 1 }),
96
+ fill: function (data, signal) { return _this.parseIndex({ signal: signal }); },
128
97
  });
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');
98
+ this.readFile = filehandle.readFile.bind(filehandle);
99
+ }
100
+ CraiIndex.prototype.parseIndex = function () {
101
+ var index = {};
102
+ return this.readFile()
103
+ .then(function (data) {
104
+ if (data[0] === 31 && data[1] === 139) {
105
+ return gunzip(data);
106
+ }
107
+ return data;
108
+ })
109
+ .then(function (uncompressedBuffer) {
110
+ if (uncompressedBuffer.length > 4 &&
111
+ uncompressedBuffer.readUInt32LE(0) === BAI_MAGIC) {
112
+ 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');
113
+ }
114
+ // interpret the text as regular ascii, since it is
115
+ // supposed to be only digits and whitespace characters
116
+ // this is written in a deliberately low-level fashion for performance,
117
+ // because some .crai files can be pretty large.
118
+ var currentRecord = [];
119
+ var currentString = '';
120
+ for (var i = 0; i < uncompressedBuffer.length; i += 1) {
121
+ var charCode = uncompressedBuffer[i];
122
+ if ((charCode >= 48 && charCode <= 57) /* 0-9 */ ||
123
+ (!currentString && charCode === 45) /* leading - */) {
124
+ currentString += String.fromCharCode(charCode);
125
+ }
126
+ else if (charCode === 9 /* \t */) {
127
+ currentRecord.push(Number.parseInt(currentString, 10));
128
+ currentString = '';
129
+ }
130
+ else if (charCode === 10 /* \n */) {
131
+ currentRecord.push(Number.parseInt(currentString, 10));
132
+ currentString = '';
133
+ addRecordToIndex(index, currentRecord);
134
+ currentRecord = [];
135
+ }
136
+ else if (charCode !== 13 /* \r */ && charCode !== 32 /* space */) {
137
+ // if there are other characters in the file besides
138
+ // space and \r, something is wrong.
139
+ throw new errors_1.CramMalformedError('invalid .crai index file');
140
+ }
141
+ }
142
+ // if the file ends without a \n, we need to flush our buffers
143
+ if (currentString) {
144
+ currentRecord.push(Number.parseInt(currentString, 10));
184
145
  }
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
- });
146
+ if (currentRecord.length === 6) {
147
+ addRecordToIndex(index, currentRecord);
148
+ }
149
+ // sort each of them by start
150
+ Object.entries(index).forEach(function (_a) {
151
+ var seqId = _a[0], ent = _a[1];
152
+ index[seqId] = ent.sort(function (a, b) { return a.start - b.start || a.span - b.span; });
153
+ });
154
+ return index;
205
155
  });
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
- }
156
+ };
157
+ CraiIndex.prototype.getIndex = function (opts) {
158
+ if (opts === void 0) { opts = {}; }
159
+ return this._parseCache.get('index', null, opts.signal);
160
+ };
215
161
  /**
216
162
  * @param {number} seqId
217
163
  * @returns {Promise} true if the index contains entries for
218
164
  * the given reference sequence ID, false otherwise
219
165
  */
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
- }()
166
+ CraiIndex.prototype.hasDataForReferenceSequence = function (seqId) {
167
+ return __awaiter(this, void 0, void 0, function () {
168
+ return __generator(this, function (_a) {
169
+ switch (_a.label) {
170
+ case 0: return [4 /*yield*/, this.getIndex()];
171
+ case 1: return [2 /*return*/, !!(_a.sent())[seqId]];
172
+ }
173
+ });
174
+ });
175
+ };
252
176
  /**
253
177
  * fetch index entries for the given range
254
178
  *
@@ -260,131 +184,40 @@ function () {
260
184
  * an array of objects of the form
261
185
  * `{start, span, containerStart, sliceStart, sliceBytes }`
262
186
  */
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;
187
+ CraiIndex.prototype.getEntriesForRange = function (seqId, queryStart, queryEnd) {
188
+ return __awaiter(this, void 0, void 0, function () {
189
+ var seqEntries, compare, bins, i;
190
+ return __generator(this, function (_a) {
191
+ switch (_a.label) {
192
+ case 0: return [4 /*yield*/, this.getIndex()];
193
+ case 1:
194
+ seqEntries = (_a.sent())[seqId];
195
+ if (!seqEntries) {
196
+ return [2 /*return*/, []];
197
+ }
198
+ compare = function (entry) {
199
+ var entryStart = entry.start;
200
+ var entryEnd = entry.start + entry.span;
201
+ if (entryStart >= queryEnd) {
202
+ return -1;
203
+ } // entry is ahead of query
204
+ if (entryEnd <= queryStart) {
205
+ return 1;
206
+ } // entry is behind query
207
+ return 0; // entry overlaps query
208
+ };
209
+ bins = [];
210
+ for (i = 0; i < seqEntries.length; i += 1) {
211
+ if (compare(seqEntries[i]) === 0) {
212
+ bins.push(seqEntries[i]);
213
+ }
214
+ }
215
+ return [2 /*return*/, bins];
285
216
  }
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;
217
+ });
218
+ });
219
+ };
220
+ return CraiIndex;
221
+ }());
222
+ exports.default = CraiIndex;
223
+ //# sourceMappingURL=craiIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"craiIndex.js","sourceRoot":"","sources":["../src/craiIndex.js"],"names":[],"mappings":"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"}