gosling.js 0.13.1 → 0.13.2
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.
- package/README.md +1 -1
- package/dist/exported-utils-d4f1abea.js +10043 -0
- package/dist/exported-utils-d4f1abea.js.map +1 -0
- package/dist/gosling.js +308 -9847
- package/dist/gosling.js.map +1 -1
- package/dist/src/exported-utils.d.ts +2 -0
- package/dist/src/exported-utils.d.ts.map +1 -1
- package/dist/utils.js +13 -5
- package/dist/utils.js.map +1 -1
- package/package.json +1 -4
- package/dist/exported-utils-068d7b17.js +0 -438
- package/dist/exported-utils-068d7b17.js.map +0 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { getRelativeGenomicPosition, computeChromSizes, getChromInterval, getChromTotalSize, parseGenomicPosition } from './core/utils/assembly';
|
|
2
2
|
export { sanitizeChrName } from './data-fetchers/utils';
|
|
3
|
+
export { convertToFlatTracks as _convertToFlatTracks } from './compiler/spec-preprocess';
|
|
4
|
+
export { spreadTracksByData as _spreadTracksByData } from './core/utils/overlay';
|
|
3
5
|
//# sourceMappingURL=exported-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exported-utils.d.ts","sourceRoot":"","sources":["../../src/exported-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"exported-utils.d.ts","sourceRoot":"","sources":["../../src/exported-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,mBAAmB,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/utils.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
import { c,
|
|
1
|
+
import { ae, af, c, ab, ac, N, ad, s } from "./exported-utils-d4f1abea.js";
|
|
2
2
|
import "d3-array";
|
|
3
3
|
import "generic-filehandle";
|
|
4
|
+
import "pixi.js";
|
|
5
|
+
import "d3-color";
|
|
6
|
+
import "bezier-js";
|
|
7
|
+
import "d3-scale";
|
|
8
|
+
import "lodash-es";
|
|
9
|
+
import "d3-scale-chromatic";
|
|
4
10
|
export {
|
|
11
|
+
ae as _convertToFlatTracks,
|
|
12
|
+
af as _spreadTracksByData,
|
|
5
13
|
c as computeChromSizes,
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
14
|
+
ab as getChromInterval,
|
|
15
|
+
ac as getChromTotalSize,
|
|
16
|
+
N as getRelativeGenomicPosition,
|
|
17
|
+
ad as parseGenomicPosition,
|
|
10
18
|
s as sanitizeChrName
|
|
11
19
|
};
|
|
12
20
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gosling.js",
|
|
3
3
|
"author": "Sehi L'Yi",
|
|
4
|
-
"version": "0.13.
|
|
4
|
+
"version": "0.13.2",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -105,7 +105,6 @@
|
|
|
105
105
|
"eslint-plugin-prettier": "^4.2.1",
|
|
106
106
|
"eslint-plugin-react": "^7.30.1",
|
|
107
107
|
"fetch-jsonp": "^1.1.3",
|
|
108
|
-
"gh-pages": "^3.1.0",
|
|
109
108
|
"jsdom": "^19.0.0",
|
|
110
109
|
"jsoncrush": "^1.1.6",
|
|
111
110
|
"knip": "^2.30.0",
|
|
@@ -158,8 +157,6 @@
|
|
|
158
157
|
"coverage": "vitest run --coverage",
|
|
159
158
|
"format": "eslint src/ editor/ --fix && prettier 'editor/**/*.css' --write",
|
|
160
159
|
"schema": "node scripts/generate-schemas.mjs",
|
|
161
|
-
"predeploy": "pnpm build-editor; echo \"gosling.js.org\" >> build/CNAME",
|
|
162
|
-
"deploy": "gh-pages -d build",
|
|
163
160
|
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
|
|
164
161
|
"knip": "knip --config knip.config.json",
|
|
165
162
|
"e2e": "playwright test",
|
|
@@ -1,438 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => {
|
|
4
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
-
return value;
|
|
6
|
-
};
|
|
7
|
-
import { bisector } from "d3-array";
|
|
8
|
-
import { RemoteFile as RemoteFile$1 } from "generic-filehandle";
|
|
9
|
-
const CHROM_SIZE_HG38 = {
|
|
10
|
-
chr1: 248956422,
|
|
11
|
-
chr2: 242193529,
|
|
12
|
-
chr3: 198295559,
|
|
13
|
-
chr4: 190214555,
|
|
14
|
-
chr5: 181538259,
|
|
15
|
-
chr6: 170805979,
|
|
16
|
-
chr7: 159345973,
|
|
17
|
-
chr8: 145138636,
|
|
18
|
-
chr9: 138394717,
|
|
19
|
-
chr10: 133797422,
|
|
20
|
-
chr11: 135086622,
|
|
21
|
-
chr12: 133275309,
|
|
22
|
-
chr13: 114364328,
|
|
23
|
-
chr14: 107043718,
|
|
24
|
-
chr15: 101991189,
|
|
25
|
-
chr16: 90338345,
|
|
26
|
-
chr17: 83257441,
|
|
27
|
-
chr18: 80373285,
|
|
28
|
-
chr19: 58617616,
|
|
29
|
-
chr20: 64444167,
|
|
30
|
-
chr21: 46709983,
|
|
31
|
-
chr22: 50818468,
|
|
32
|
-
chrX: 156040895,
|
|
33
|
-
chrY: 57227415
|
|
34
|
-
};
|
|
35
|
-
const CHROM_SIZE_HG19 = {
|
|
36
|
-
chr1: 249250621,
|
|
37
|
-
chr2: 243199373,
|
|
38
|
-
chr3: 198022430,
|
|
39
|
-
chr4: 191154276,
|
|
40
|
-
chr5: 180915260,
|
|
41
|
-
chr6: 171115067,
|
|
42
|
-
chr7: 159138663,
|
|
43
|
-
chr8: 146364022,
|
|
44
|
-
chr9: 141213431,
|
|
45
|
-
chr10: 135534747,
|
|
46
|
-
chr11: 135006516,
|
|
47
|
-
chr12: 133851895,
|
|
48
|
-
chr13: 115169878,
|
|
49
|
-
chr14: 107349540,
|
|
50
|
-
chr15: 102531392,
|
|
51
|
-
chr16: 90354753,
|
|
52
|
-
chr17: 81195210,
|
|
53
|
-
chr18: 78077248,
|
|
54
|
-
chr19: 59128983,
|
|
55
|
-
chr20: 63025520,
|
|
56
|
-
chr21: 48129895,
|
|
57
|
-
chr22: 51304566,
|
|
58
|
-
chrX: 155270560,
|
|
59
|
-
chrY: 59373566,
|
|
60
|
-
chrM: 16571
|
|
61
|
-
};
|
|
62
|
-
const CHROM_SIZE_HG18 = {
|
|
63
|
-
chr1: 247249719,
|
|
64
|
-
chr2: 242951149,
|
|
65
|
-
chr3: 199501827,
|
|
66
|
-
chr4: 191273063,
|
|
67
|
-
chr5: 180857866,
|
|
68
|
-
chr6: 170899992,
|
|
69
|
-
chr7: 158821424,
|
|
70
|
-
chr8: 146274826,
|
|
71
|
-
chr9: 140273252,
|
|
72
|
-
chr10: 135374737,
|
|
73
|
-
chr11: 134452384,
|
|
74
|
-
chr12: 132349534,
|
|
75
|
-
chr13: 114142980,
|
|
76
|
-
chr14: 106368585,
|
|
77
|
-
chr15: 100338915,
|
|
78
|
-
chr16: 88827254,
|
|
79
|
-
chr17: 78774742,
|
|
80
|
-
chr18: 76117153,
|
|
81
|
-
chr19: 63811651,
|
|
82
|
-
chr20: 62435964,
|
|
83
|
-
chr21: 46944323,
|
|
84
|
-
chr22: 49691432,
|
|
85
|
-
chrX: 154913754,
|
|
86
|
-
chrY: 57772954,
|
|
87
|
-
chrM: 16571
|
|
88
|
-
};
|
|
89
|
-
const CHROM_SIZE_HG17 = {
|
|
90
|
-
chr1: 245522847,
|
|
91
|
-
chr2: 243018229,
|
|
92
|
-
chr3: 199505740,
|
|
93
|
-
chr4: 191411218,
|
|
94
|
-
chr5: 180857866,
|
|
95
|
-
chr6: 170975699,
|
|
96
|
-
chr7: 158628139,
|
|
97
|
-
chr8: 146274826,
|
|
98
|
-
chr9: 138429268,
|
|
99
|
-
chr10: 135413628,
|
|
100
|
-
chr11: 134452384,
|
|
101
|
-
chr12: 132449811,
|
|
102
|
-
chr13: 114142980,
|
|
103
|
-
chr14: 106368585,
|
|
104
|
-
chr15: 100338915,
|
|
105
|
-
chr16: 88827254,
|
|
106
|
-
chr17: 78774742,
|
|
107
|
-
chr18: 76117153,
|
|
108
|
-
chr19: 63811651,
|
|
109
|
-
chr20: 62435964,
|
|
110
|
-
chr21: 46944323,
|
|
111
|
-
chr22: 49554710,
|
|
112
|
-
chrX: 154824264,
|
|
113
|
-
chrY: 57701691,
|
|
114
|
-
chrM: 16571
|
|
115
|
-
};
|
|
116
|
-
const CHROM_SIZE_HG16 = {
|
|
117
|
-
chr1: 246127941,
|
|
118
|
-
chr2: 243615958,
|
|
119
|
-
chr3: 199344050,
|
|
120
|
-
chr4: 191731959,
|
|
121
|
-
chr5: 181034922,
|
|
122
|
-
chr6: 170914576,
|
|
123
|
-
chr7: 158545518,
|
|
124
|
-
chr8: 146308819,
|
|
125
|
-
chr9: 136372045,
|
|
126
|
-
chr10: 135037215,
|
|
127
|
-
chr11: 134482954,
|
|
128
|
-
chr12: 132078379,
|
|
129
|
-
chr13: 113042980,
|
|
130
|
-
chr14: 105311216,
|
|
131
|
-
chr15: 100256656,
|
|
132
|
-
chr16: 90041932,
|
|
133
|
-
chr17: 81860266,
|
|
134
|
-
chr18: 76115139,
|
|
135
|
-
chr19: 63811651,
|
|
136
|
-
chr20: 63741868,
|
|
137
|
-
chr21: 46976097,
|
|
138
|
-
chr22: 49396972,
|
|
139
|
-
chrX: 153692391,
|
|
140
|
-
chrY: 50286555,
|
|
141
|
-
chrM: 16571
|
|
142
|
-
};
|
|
143
|
-
const CHROM_SIZE_MM10 = {
|
|
144
|
-
chr1: 195471971,
|
|
145
|
-
chr2: 182113224,
|
|
146
|
-
chr3: 160039680,
|
|
147
|
-
chr4: 156508116,
|
|
148
|
-
chr5: 151834684,
|
|
149
|
-
chr6: 149736546,
|
|
150
|
-
chr7: 145441459,
|
|
151
|
-
chr8: 129401213,
|
|
152
|
-
chr9: 124595110,
|
|
153
|
-
chr10: 130694993,
|
|
154
|
-
chr11: 122082543,
|
|
155
|
-
chr12: 120129022,
|
|
156
|
-
chr13: 120421639,
|
|
157
|
-
chr14: 124902244,
|
|
158
|
-
chr15: 104043685,
|
|
159
|
-
chr16: 98207768,
|
|
160
|
-
chr17: 94987271,
|
|
161
|
-
chr18: 90702639,
|
|
162
|
-
chr19: 61431566,
|
|
163
|
-
chrX: 171031299,
|
|
164
|
-
chrY: 91744698,
|
|
165
|
-
chrM: 16299
|
|
166
|
-
};
|
|
167
|
-
const CHROM_SIZE_MM9 = {
|
|
168
|
-
chr1: 197195432,
|
|
169
|
-
chr2: 181748087,
|
|
170
|
-
chr3: 159599783,
|
|
171
|
-
chr4: 155630120,
|
|
172
|
-
chr5: 152537259,
|
|
173
|
-
chr6: 149517037,
|
|
174
|
-
chr7: 152524553,
|
|
175
|
-
chr8: 131738871,
|
|
176
|
-
chr9: 124076172,
|
|
177
|
-
chr10: 129993255,
|
|
178
|
-
chr11: 121843856,
|
|
179
|
-
chr12: 121257530,
|
|
180
|
-
chr13: 120284312,
|
|
181
|
-
chr14: 125194864,
|
|
182
|
-
chr15: 103494974,
|
|
183
|
-
chr16: 98319150,
|
|
184
|
-
chr17: 95272651,
|
|
185
|
-
chr18: 90772031,
|
|
186
|
-
chr19: 61342430,
|
|
187
|
-
chrX: 166650296,
|
|
188
|
-
chrY: 15902555,
|
|
189
|
-
chrM: 16299
|
|
190
|
-
};
|
|
191
|
-
function getRelativeGenomicPosition(absPos, assembly, returnWithinAssembly = false) {
|
|
192
|
-
const chrSizes = Object.entries(computeChromSizes(assembly).interval);
|
|
193
|
-
const minPosChr = { chromosome: "unknown", position: Infinity };
|
|
194
|
-
const maxPosChr = { chromosome: "unknown", position: 0 };
|
|
195
|
-
for (const chrSize of chrSizes) {
|
|
196
|
-
const [chromosome, absInterval] = chrSize;
|
|
197
|
-
const [start, end] = absInterval;
|
|
198
|
-
if (start <= absPos && absPos < end) {
|
|
199
|
-
return { chromosome, position: absPos - start };
|
|
200
|
-
}
|
|
201
|
-
if (start < minPosChr.position) {
|
|
202
|
-
minPosChr.chromosome = chromosome;
|
|
203
|
-
minPosChr.position = start;
|
|
204
|
-
}
|
|
205
|
-
if (end > maxPosChr.position) {
|
|
206
|
-
maxPosChr.chromosome = chromosome;
|
|
207
|
-
maxPosChr.position = end;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
if (returnWithinAssembly) {
|
|
211
|
-
if (absPos < minPosChr.position) {
|
|
212
|
-
return minPosChr;
|
|
213
|
-
} else {
|
|
214
|
-
return maxPosChr;
|
|
215
|
-
}
|
|
216
|
-
} else {
|
|
217
|
-
return { chromosome: "unknown", position: absPos };
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
function createChromSizesUrl(chromSizes) {
|
|
221
|
-
const text = chromSizes.map((d) => d.join(" ")).join("\n");
|
|
222
|
-
const tsv = new Blob([text], { type: "text/tsv" });
|
|
223
|
-
return URL.createObjectURL(tsv);
|
|
224
|
-
}
|
|
225
|
-
function computeChromSizes(assembly) {
|
|
226
|
-
if (assembly && typeof assembly === "string" && assembly in CRHOM_SIZES) {
|
|
227
|
-
return CRHOM_SIZES[assembly];
|
|
228
|
-
} else if (Array.isArray(assembly) && assembly.length !== 0) {
|
|
229
|
-
const size = Object.fromEntries(assembly);
|
|
230
|
-
return {
|
|
231
|
-
size,
|
|
232
|
-
interval: getChromInterval(size),
|
|
233
|
-
total: getChromTotalSize(size),
|
|
234
|
-
path: createChromSizesUrl(assembly)
|
|
235
|
-
};
|
|
236
|
-
} else {
|
|
237
|
-
return CRHOM_SIZES.hg38;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
const basePath = (assembly) => `https://s3.amazonaws.com/gosling-lang.org/data/${assembly}.chrom.sizes`;
|
|
241
|
-
const CRHOM_SIZES = Object.freeze({
|
|
242
|
-
hg38: {
|
|
243
|
-
size: CHROM_SIZE_HG38,
|
|
244
|
-
interval: getChromInterval(CHROM_SIZE_HG38),
|
|
245
|
-
total: getChromTotalSize(CHROM_SIZE_HG38),
|
|
246
|
-
path: basePath("hg38")
|
|
247
|
-
},
|
|
248
|
-
hg19: {
|
|
249
|
-
size: CHROM_SIZE_HG19,
|
|
250
|
-
interval: getChromInterval(CHROM_SIZE_HG19),
|
|
251
|
-
total: getChromTotalSize(CHROM_SIZE_HG19),
|
|
252
|
-
path: basePath("hg19")
|
|
253
|
-
},
|
|
254
|
-
hg18: {
|
|
255
|
-
size: CHROM_SIZE_HG18,
|
|
256
|
-
interval: getChromInterval(CHROM_SIZE_HG18),
|
|
257
|
-
total: getChromTotalSize(CHROM_SIZE_HG18),
|
|
258
|
-
path: basePath("hg18")
|
|
259
|
-
},
|
|
260
|
-
hg17: {
|
|
261
|
-
size: CHROM_SIZE_HG17,
|
|
262
|
-
interval: getChromInterval(CHROM_SIZE_HG17),
|
|
263
|
-
total: getChromTotalSize(CHROM_SIZE_HG17),
|
|
264
|
-
path: basePath("hg17")
|
|
265
|
-
},
|
|
266
|
-
hg16: {
|
|
267
|
-
size: CHROM_SIZE_HG16,
|
|
268
|
-
interval: getChromInterval(CHROM_SIZE_HG16),
|
|
269
|
-
total: getChromTotalSize(CHROM_SIZE_HG16),
|
|
270
|
-
path: basePath("hg16")
|
|
271
|
-
},
|
|
272
|
-
mm10: {
|
|
273
|
-
size: CHROM_SIZE_MM10,
|
|
274
|
-
interval: getChromInterval(CHROM_SIZE_MM10),
|
|
275
|
-
total: getChromTotalSize(CHROM_SIZE_MM10),
|
|
276
|
-
path: basePath("mm10")
|
|
277
|
-
},
|
|
278
|
-
mm9: {
|
|
279
|
-
size: CHROM_SIZE_MM9,
|
|
280
|
-
interval: getChromInterval(CHROM_SIZE_MM9),
|
|
281
|
-
total: getChromTotalSize(CHROM_SIZE_MM9),
|
|
282
|
-
path: basePath("mm9")
|
|
283
|
-
},
|
|
284
|
-
// `unknown` assembly contains only one chromosome with max length
|
|
285
|
-
unknown: {
|
|
286
|
-
size: { chr: Number.MAX_VALUE },
|
|
287
|
-
interval: { chr: [0, Number.MAX_VALUE] },
|
|
288
|
-
total: Number.MAX_VALUE,
|
|
289
|
-
path: basePath("hg38")
|
|
290
|
-
// just to ensure this does not make crash
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
function getAutoCompleteId(assembly) {
|
|
294
|
-
switch (assembly) {
|
|
295
|
-
case "hg19":
|
|
296
|
-
return "OHJakQICQD6gTD7skx4EWA";
|
|
297
|
-
case "mm10":
|
|
298
|
-
return "QDutvmyiSrec5nX4pA5WGQ";
|
|
299
|
-
case "mm9":
|
|
300
|
-
return "GUm5aBiLRCyz2PsBea7Yzg";
|
|
301
|
-
case "hg38":
|
|
302
|
-
default:
|
|
303
|
-
return "P0PLbQMwTYGy-5uPIQid7A";
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
function getChromInterval(chromSize) {
|
|
307
|
-
const interval = {};
|
|
308
|
-
Object.keys(chromSize).reduce((sum, k) => {
|
|
309
|
-
interval[k] = [sum, sum + chromSize[k]];
|
|
310
|
-
return sum + chromSize[k];
|
|
311
|
-
}, 0);
|
|
312
|
-
return interval;
|
|
313
|
-
}
|
|
314
|
-
function getChromTotalSize(chromSize) {
|
|
315
|
-
return Object.values(chromSize).reduce((sum, current) => sum + current, 0);
|
|
316
|
-
}
|
|
317
|
-
function parseGenomicPosition(position) {
|
|
318
|
-
const [chromosome, intervalString] = position.split(":");
|
|
319
|
-
if (intervalString) {
|
|
320
|
-
const [start, end] = intervalString.split("-").map((s) => +s.replace(/,/g, ""));
|
|
321
|
-
if (!Number.isNaN(start) && !Number.isNaN(end)) {
|
|
322
|
-
return { chromosome, start, end };
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return { chromosome };
|
|
326
|
-
}
|
|
327
|
-
class GenomicPositionHelper {
|
|
328
|
-
constructor(chromosome, start, end) {
|
|
329
|
-
this.chromosome = chromosome;
|
|
330
|
-
this.start = start;
|
|
331
|
-
this.end = end;
|
|
332
|
-
}
|
|
333
|
-
static fromString(str) {
|
|
334
|
-
const result = parseGenomicPosition(str);
|
|
335
|
-
return new GenomicPositionHelper(result.chromosome, result.start, result.end);
|
|
336
|
-
}
|
|
337
|
-
toAbsoluteCoordinates(assembly, padding = 0) {
|
|
338
|
-
const info = computeChromSizes(assembly);
|
|
339
|
-
const size = info.size[this.chromosome];
|
|
340
|
-
const interval = info.interval[this.chromosome];
|
|
341
|
-
if (size === void 0 || interval === void 0) {
|
|
342
|
-
throw new Error(`Chromosome name ${this.chromosome} is not valid`);
|
|
343
|
-
}
|
|
344
|
-
let { start, end } = this;
|
|
345
|
-
if (start === void 0 || end === void 0) {
|
|
346
|
-
[start, end] = [1, size];
|
|
347
|
-
}
|
|
348
|
-
const offset = interval[0];
|
|
349
|
-
return [start + offset - padding, end + offset + padding];
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
function filterUsingGenoPos(data, [minX, maxX], config) {
|
|
353
|
-
const { x, xe, x1, x1e } = config;
|
|
354
|
-
const definedXFields = [x, xe, x1, x1e].filter((f) => f);
|
|
355
|
-
return data.filter((d) => {
|
|
356
|
-
if (definedXFields.length === 0) {
|
|
357
|
-
return true;
|
|
358
|
-
} else if (definedXFields.length === 1) {
|
|
359
|
-
const value = +d[definedXFields[0]];
|
|
360
|
-
return typeof value === "number" && minX < value && value <= maxX;
|
|
361
|
-
} else {
|
|
362
|
-
const values = definedXFields.map((f) => +d[f]).filter((v) => !isNaN(v));
|
|
363
|
-
const minValue = Math.min(...values);
|
|
364
|
-
const maxValue = Math.max(...values);
|
|
365
|
-
return minX <= maxValue && minValue <= maxX;
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
bisector((d) => d.pos).left;
|
|
370
|
-
function sanitizeChrName(chrName, assembly, chromosomePrefix) {
|
|
371
|
-
if (Array.isArray(assembly)) {
|
|
372
|
-
return chrName;
|
|
373
|
-
}
|
|
374
|
-
if (chromosomePrefix) {
|
|
375
|
-
chrName = chrName.replace(chromosomePrefix, "chr");
|
|
376
|
-
} else if (!chrName.includes("chr")) {
|
|
377
|
-
chrName = `chr${chrName}`;
|
|
378
|
-
}
|
|
379
|
-
return chrName;
|
|
380
|
-
}
|
|
381
|
-
class RemoteFile extends RemoteFile$1 {
|
|
382
|
-
constructor() {
|
|
383
|
-
super(...arguments);
|
|
384
|
-
// Overrides `read` to eagerly read 200 or 206 response
|
|
385
|
-
// from https://github.com/GMOD/generic-filehandle/blob/0e8209be25e3097307bd15e964edd8c017e808d7/src/remoteFile.ts#L100-L162
|
|
386
|
-
__publicField(this, "read", async (buffer, offset = 0, length, position = 0, opts = {}) => {
|
|
387
|
-
const { headers = {}, signal, overrides = {} } = opts;
|
|
388
|
-
if (length < Infinity) {
|
|
389
|
-
headers.range = `bytes=${position}-${position + length}`;
|
|
390
|
-
} else if (length === Infinity && position !== 0) {
|
|
391
|
-
headers.range = `bytes=${position}-`;
|
|
392
|
-
}
|
|
393
|
-
const args = {
|
|
394
|
-
// @ts-expect-error private property
|
|
395
|
-
...this.baseOverrides,
|
|
396
|
-
...overrides,
|
|
397
|
-
headers: {
|
|
398
|
-
...headers,
|
|
399
|
-
...overrides.headers,
|
|
400
|
-
// @ts-expect-error private property
|
|
401
|
-
...this.baseOverrides.headers
|
|
402
|
-
},
|
|
403
|
-
method: "GET",
|
|
404
|
-
redirect: "follow",
|
|
405
|
-
mode: "cors",
|
|
406
|
-
signal
|
|
407
|
-
};
|
|
408
|
-
const response = await this.fetch(this.url, args);
|
|
409
|
-
if (!response.ok) {
|
|
410
|
-
throw new Error(`HTTP ${response.status} ${response.statusText} ${this.url}`);
|
|
411
|
-
}
|
|
412
|
-
if (response.status === 200 || response.status === 206) {
|
|
413
|
-
const responseData = await this.getBufferFromResponse(response);
|
|
414
|
-
const bytesCopied = responseData.copy(buffer, offset, 0, Math.min(length, responseData.length));
|
|
415
|
-
const res = response.headers.get("content-range");
|
|
416
|
-
const sizeMatch = /\/(\d+)$/.exec(res || "");
|
|
417
|
-
if (sizeMatch && sizeMatch[1]) {
|
|
418
|
-
this._stat = { size: parseInt(sizeMatch[1], 10) };
|
|
419
|
-
}
|
|
420
|
-
return { bytesRead: bytesCopied, buffer };
|
|
421
|
-
}
|
|
422
|
-
throw new Error(`HTTP ${response.status} fetching ${this.url}`);
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
export {
|
|
427
|
-
GenomicPositionHelper as G,
|
|
428
|
-
RemoteFile as R,
|
|
429
|
-
getRelativeGenomicPosition as a,
|
|
430
|
-
getChromInterval as b,
|
|
431
|
-
computeChromSizes as c,
|
|
432
|
-
getChromTotalSize as d,
|
|
433
|
-
filterUsingGenoPos as f,
|
|
434
|
-
getAutoCompleteId as g,
|
|
435
|
-
parseGenomicPosition as p,
|
|
436
|
-
sanitizeChrName as s
|
|
437
|
-
};
|
|
438
|
-
//# sourceMappingURL=exported-utils-068d7b17.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exported-utils-068d7b17.js","sources":["../src/core/utils/chrom-size.ts","../src/core/utils/assembly.ts","../src/data-fetchers/utils.ts"],"sourcesContent":["export const CHROM_SIZE_HG38 = {\n chr1: 248956422,\n chr2: 242193529,\n chr3: 198295559,\n chr4: 190214555,\n chr5: 181538259,\n chr6: 170805979,\n chr7: 159345973,\n chr8: 145138636,\n chr9: 138394717,\n chr10: 133797422,\n chr11: 135086622,\n chr12: 133275309,\n chr13: 114364328,\n chr14: 107043718,\n chr15: 101991189,\n chr16: 90338345,\n chr17: 83257441,\n chr18: 80373285,\n chr19: 58617616,\n chr20: 64444167,\n chr21: 46709983,\n chr22: 50818468,\n chrX: 156040895,\n chrY: 57227415\n};\n\nexport const CHROM_SIZE_HG19 = {\n chr1: 249250621,\n chr2: 243199373,\n chr3: 198022430,\n chr4: 191154276,\n chr5: 180915260,\n chr6: 171115067,\n chr7: 159138663,\n chr8: 146364022,\n chr9: 141213431,\n chr10: 135534747,\n chr11: 135006516,\n chr12: 133851895,\n chr13: 115169878,\n chr14: 107349540,\n chr15: 102531392,\n chr16: 90354753,\n chr17: 81195210,\n chr18: 78077248,\n chr19: 59128983,\n chr20: 63025520,\n chr21: 48129895,\n chr22: 51304566,\n chrX: 155270560,\n chrY: 59373566,\n chrM: 16571\n};\n\nexport const CHROM_SIZE_HG18 = {\n chr1: 247249719,\n chr2: 242951149,\n chr3: 199501827,\n chr4: 191273063,\n chr5: 180857866,\n chr6: 170899992,\n chr7: 158821424,\n chr8: 146274826,\n chr9: 140273252,\n chr10: 135374737,\n chr11: 134452384,\n chr12: 132349534,\n chr13: 114142980,\n chr14: 106368585,\n chr15: 100338915,\n chr16: 88827254,\n chr17: 78774742,\n chr18: 76117153,\n chr19: 63811651,\n chr20: 62435964,\n chr21: 46944323,\n chr22: 49691432,\n chrX: 154913754,\n chrY: 57772954,\n chrM: 16571\n};\n\nexport const CHROM_SIZE_HG17 = {\n chr1: 245522847,\n chr2: 243018229,\n chr3: 199505740,\n chr4: 191411218,\n chr5: 180857866,\n chr6: 170975699,\n chr7: 158628139,\n chr8: 146274826,\n chr9: 138429268,\n chr10: 135413628,\n chr11: 134452384,\n chr12: 132449811,\n chr13: 114142980,\n chr14: 106368585,\n chr15: 100338915,\n chr16: 88827254,\n chr17: 78774742,\n chr18: 76117153,\n chr19: 63811651,\n chr20: 62435964,\n chr21: 46944323,\n chr22: 49554710,\n chrX: 154824264,\n chrY: 57701691,\n chrM: 16571\n};\n\nexport const CHROM_SIZE_HG16 = {\n chr1: 246127941,\n chr2: 243615958,\n chr3: 199344050,\n chr4: 191731959,\n chr5: 181034922,\n chr6: 170914576,\n chr7: 158545518,\n chr8: 146308819,\n chr9: 136372045,\n chr10: 135037215,\n chr11: 134482954,\n chr12: 132078379,\n chr13: 113042980,\n chr14: 105311216,\n chr15: 100256656,\n chr16: 90041932,\n chr17: 81860266,\n chr18: 76115139,\n chr19: 63811651,\n chr20: 63741868,\n chr21: 46976097,\n chr22: 49396972,\n chrX: 153692391,\n chrY: 50286555,\n chrM: 16571\n};\n\nexport const CHROM_SIZE_MM10 = {\n chr1: 195471971,\n chr2: 182113224,\n chr3: 160039680,\n chr4: 156508116,\n chr5: 151834684,\n chr6: 149736546,\n chr7: 145441459,\n chr8: 129401213,\n chr9: 124595110,\n chr10: 130694993,\n chr11: 122082543,\n chr12: 120129022,\n chr13: 120421639,\n chr14: 124902244,\n chr15: 104043685,\n chr16: 98207768,\n chr17: 94987271,\n chr18: 90702639,\n chr19: 61431566,\n chrX: 171031299,\n chrY: 91744698,\n chrM: 16299\n};\n\nexport const CHROM_SIZE_MM9 = {\n chr1: 197195432,\n chr2: 181748087,\n chr3: 159599783,\n chr4: 155630120,\n chr5: 152537259,\n chr6: 149517037,\n chr7: 152524553,\n chr8: 131738871,\n chr9: 124076172,\n chr10: 129993255,\n chr11: 121843856,\n chr12: 121257530,\n chr13: 120284312,\n chr14: 125194864,\n chr15: 103494974,\n chr16: 98319150,\n chr17: 95272651,\n chr18: 90772031,\n chr19: 61342430,\n chrX: 166650296,\n chrY: 15902555,\n chrM: 16299\n};\n\nexport type Chromosome =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | '10'\n | '11'\n | '12'\n | '13'\n | '14'\n | '15'\n | '16'\n | '17'\n | '18'\n | '19'\n | '20'\n | '21'\n | '22'\n | 'X'\n | 'Y'\n | 'M'\n | 'chr1'\n | 'chr2'\n | 'chr3'\n | 'chr4'\n | 'chr5'\n | 'chr6'\n | 'chr7'\n | 'chr8'\n | 'chr9'\n | 'chr10'\n | 'chr11'\n | 'chr12'\n | 'chr13'\n | 'chr14'\n | 'chr15'\n | 'chr16'\n | 'chr17'\n | 'chr18'\n | 'chr19'\n | 'chr20'\n | 'chr21'\n | 'chr22'\n | 'chrX'\n | 'chrY'\n | 'chrM';\n","import type { Assembly, ChromSizes, GenomicPosition } from '@gosling-lang/gosling-schema';\nimport {\n CHROM_SIZE_HG16,\n CHROM_SIZE_HG17,\n CHROM_SIZE_HG18,\n CHROM_SIZE_HG19,\n CHROM_SIZE_HG38,\n CHROM_SIZE_MM10,\n CHROM_SIZE_MM9\n} from './chrom-size';\n\nexport interface ChromSize {\n size: { [chr: string]: number };\n interval: { [chr: string]: [number, number] };\n total: number;\n path: string;\n}\n\n/**\n * Get relative chromosome position (e.g., `100` => `{ chromosome: 'chr1', position: 100 }`)\n * @param absPos number which is the absolute chromosome position\n * @param assembly the assembly used to calculate which chromosome position\n * @param returnWithinAssembly If true, then if the absolute position is before the first chromosome, it returns the\n * first position of the first chromosome. If the absolute position is after the last chromosome, it returns the last\n * position of the last chromosome\n * @returns the genomic position of the absPos\n */\nexport function getRelativeGenomicPosition(\n absPos: number,\n assembly?: Assembly,\n returnWithinAssembly = false\n): GenomicPosition {\n const chrSizes = Object.entries(computeChromSizes(assembly).interval);\n const minPosChr = { chromosome: 'unknown', position: Infinity } as GenomicPosition;\n const maxPosChr = { chromosome: 'unknown', position: 0 } as GenomicPosition;\n for (const chrSize of chrSizes) {\n const [chromosome, absInterval] = chrSize;\n const [start, end] = absInterval;\n // absPos was found within this chromosome\n if (start <= absPos && absPos < end) {\n return { chromosome, position: absPos - start } as GenomicPosition;\n }\n // Update the min and max chromosomes found\n if (start < minPosChr.position) {\n minPosChr.chromosome = chromosome;\n minPosChr.position = start;\n }\n if (end > maxPosChr.position) {\n maxPosChr.chromosome = chromosome;\n maxPosChr.position = end;\n }\n }\n if (returnWithinAssembly) {\n // Return either the min or max chromosome position\n if (absPos < minPosChr.position) {\n return minPosChr;\n } else {\n return maxPosChr;\n }\n } else {\n return { chromosome: 'unknown', position: absPos };\n }\n}\n\n/**\n * Generate a URL for custom chrom sizes\n * @param chromSizes A custom assembly that specifies chromosomes and their sizes\n */\nfunction createChromSizesUrl(chromSizes: ChromSizes): string {\n const text = chromSizes.map(d => d.join('\\t')).join('\\n');\n const tsv = new Blob([text], { type: 'text/tsv' });\n return URL.createObjectURL(tsv);\n}\n\n/**\n * Get chromosome sizes.\n * @param assembly (default: 'hg38')\n */\nexport function computeChromSizes(assembly?: Assembly): ChromSize {\n if (assembly && typeof assembly === 'string' && assembly in CRHOM_SIZES) {\n return CRHOM_SIZES[assembly];\n } else if (Array.isArray(assembly) && assembly.length !== 0) {\n // custom assembly\n const size = Object.fromEntries(assembly);\n return {\n size,\n interval: getChromInterval(size),\n total: getChromTotalSize(size),\n path: createChromSizesUrl(assembly)\n };\n } else {\n // We do not have that assembly prepared, so return a default one.\n return CRHOM_SIZES.hg38;\n }\n}\n\nconst basePath = (assembly: string) => `https://s3.amazonaws.com/gosling-lang.org/data/${assembly}.chrom.sizes`;\nconst CRHOM_SIZES: { [assembly: string]: ChromSize } = Object.freeze({\n hg38: {\n size: CHROM_SIZE_HG38,\n interval: getChromInterval(CHROM_SIZE_HG38),\n total: getChromTotalSize(CHROM_SIZE_HG38),\n path: basePath('hg38')\n },\n hg19: {\n size: CHROM_SIZE_HG19,\n interval: getChromInterval(CHROM_SIZE_HG19),\n total: getChromTotalSize(CHROM_SIZE_HG19),\n path: basePath('hg19')\n },\n hg18: {\n size: CHROM_SIZE_HG18,\n interval: getChromInterval(CHROM_SIZE_HG18),\n total: getChromTotalSize(CHROM_SIZE_HG18),\n path: basePath('hg18')\n },\n hg17: {\n size: CHROM_SIZE_HG17,\n interval: getChromInterval(CHROM_SIZE_HG17),\n total: getChromTotalSize(CHROM_SIZE_HG17),\n path: basePath('hg17')\n },\n hg16: {\n size: CHROM_SIZE_HG16,\n interval: getChromInterval(CHROM_SIZE_HG16),\n total: getChromTotalSize(CHROM_SIZE_HG16),\n path: basePath('hg16')\n },\n mm10: {\n size: CHROM_SIZE_MM10,\n interval: getChromInterval(CHROM_SIZE_MM10),\n total: getChromTotalSize(CHROM_SIZE_MM10),\n path: basePath('mm10')\n },\n mm9: {\n size: CHROM_SIZE_MM9,\n interval: getChromInterval(CHROM_SIZE_MM9),\n total: getChromTotalSize(CHROM_SIZE_MM9),\n path: basePath('mm9')\n },\n // `unknown` assembly contains only one chromosome with max length\n unknown: {\n size: { chr: Number.MAX_VALUE },\n interval: { chr: [0, Number.MAX_VALUE] },\n total: Number.MAX_VALUE,\n path: basePath('hg38') // just to ensure this does not make crash\n }\n});\n\n/**\n * Some presets of auto-complete IDs (`autocompleteId`) to search for genes using the HiGlass server.\n */\nexport function getAutoCompleteId(assembly?: Assembly) {\n switch (assembly) {\n case 'hg19':\n return 'OHJakQICQD6gTD7skx4EWA';\n case 'mm10':\n return 'QDutvmyiSrec5nX4pA5WGQ';\n case 'mm9':\n return 'GUm5aBiLRCyz2PsBea7Yzg';\n case 'hg38':\n default:\n return 'P0PLbQMwTYGy-5uPIQid7A';\n }\n}\n\n/**\n * Calculate cumulative interval of each chromosome.\n */\nexport function getChromInterval(chromSize: { [k: string]: number }) {\n const interval: { [k: string]: [number, number] } = {};\n\n Object.keys(chromSize).reduce((sum, k) => {\n interval[k] = [sum, sum + chromSize[k]];\n return sum + chromSize[k];\n }, 0);\n\n return interval;\n}\n\n/**\n * Calculate total size of entire chromosomes.\n */\nexport function getChromTotalSize(chromSize: { [k: string]: number }) {\n return Object.values(chromSize).reduce((sum, current) => sum + current, 0);\n}\n\nexport function parseGenomicPosition(position: string): { chromosome: string; start?: number; end?: number } {\n const [chromosome, intervalString] = position.split(':');\n if (intervalString) {\n const [start, end] = intervalString.split('-').map(s => +s.replace(/,/g, ''));\n // only return if both are valid\n if (!Number.isNaN(start) && !Number.isNaN(end)) {\n return { chromosome, start, end };\n }\n }\n return { chromosome };\n}\n\n/**\n * A class that consistently manage and convert genomics positions.\n */\nexport class GenomicPositionHelper {\n constructor(public chromosome: string, public start?: number, public end?: number) {}\n static fromString(str: string) {\n const result = parseGenomicPosition(str);\n return new GenomicPositionHelper(result.chromosome, result.start, result.end);\n }\n toAbsoluteCoordinates(assembly?: Assembly, padding = 0): [number, number] {\n const info = computeChromSizes(assembly);\n const size = info.size[this.chromosome];\n const interval = info.interval[this.chromosome];\n if (size === undefined || interval === undefined) {\n throw new Error(`Chromosome name ${this.chromosome} is not valid`);\n }\n let { start, end } = this;\n if (start === undefined || end === undefined) {\n // if only a chromosome name is specified, set to the extent of the chromosome\n [start, end] = [1, size];\n }\n const offset = interval[0];\n return [start + offset - padding, end + offset + padding];\n }\n}\n","import { bisector } from 'd3-array';\nimport { RemoteFile as _RemoteFile } from 'generic-filehandle';\n\nimport type * as HiGlass from '@higlass/types';\nimport type { Assembly, ChromSizes, Datum } from '@gosling-lang/gosling-schema';\n\nexport type CommonDataConfig = {\n assembly: Assembly;\n x?: string;\n xe?: string;\n x1?: string;\n x1e?: string;\n urlFetchOptions?: RequestInit;\n};\n\nexport class DataSource<File, Options> {\n chromInfo: ExtendedChromInfo;\n tilesetInfo: ReturnType<typeof tilesetInfoFromChromInfo>;\n\n constructor(public file: File, chromSizes: ChromSizes, public options: Options) {\n this.chromInfo = sizesToChromInfo(chromSizes);\n this.tilesetInfo = tilesetInfoFromChromInfo(this.chromInfo);\n }\n}\n\n/**\n * Filter data before sending to a track considering the visible genomic area in the track.\n * TODO(2022-Jul-13): Consider genomic `y` channels as well.\n */\nexport function filterUsingGenoPos(\n data: Datum[],\n [minX, maxX]: [number, number],\n config: Omit<CommonDataConfig, 'assembly'>\n) {\n const { x, xe, x1, x1e } = config;\n const definedXFields = [x, xe, x1, x1e].filter(f => f) as string[];\n return data.filter((d: Datum) => {\n if (definedXFields.length === 0) {\n // no filter applies\n return true;\n } else if (definedXFields.length === 1) {\n // filter based on one genomic position\n const value = +d[definedXFields[0]];\n return typeof value === 'number' && minX < value && value <= maxX;\n } else {\n // filter based on two genomic positions, i.e., check overlaps\n const values = definedXFields.map(f => +d[f]).filter(v => !isNaN(v));\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n return minX <= maxValue && minValue <= maxX;\n }\n });\n}\n\nconst chromInfoBisector = bisector((d: { pos: number }) => d.pos).left;\n\nconst chrToAbs = (chrom: string, chromPos: number, chromInfo: HiGlass.ChromInfo) =>\n chromInfo.chrPositions[chrom].pos + chromPos;\n\nconst absToChr = (absPosition: number, chromInfo: HiGlass.ChromInfo) => {\n if (!chromInfo || !chromInfo.cumPositions || !chromInfo.cumPositions.length) {\n return null;\n }\n\n let insertPoint = chromInfoBisector(chromInfo.cumPositions, absPosition);\n const lastChr = chromInfo.cumPositions[chromInfo.cumPositions.length - 1].chr;\n const lastLength = chromInfo.chromLengths[lastChr];\n\n // @ts-expect-error\n insertPoint -= insertPoint > 0 && 1;\n\n let chrPosition = Math.floor(absPosition - chromInfo.cumPositions[insertPoint].pos);\n let offset = 0;\n\n if (chrPosition < 0) {\n // before the start of the genome\n offset = chrPosition - 1;\n chrPosition = 1;\n }\n\n if (insertPoint === chromInfo.cumPositions.length - 1 && chrPosition > lastLength) {\n // beyond the last chromosome\n offset = chrPosition - lastLength;\n chrPosition = lastLength;\n }\n\n return [chromInfo.cumPositions[insertPoint].chr, chrPosition, offset, insertPoint] as const;\n};\n\n/**\n * Get a chromosome name for the consistentcy, e.g., `1` --> `chr1`.\n * @param chrName A chromosome name to be sanitized\n * @param assembly A genome assembly of the data\n * @param chromosomePrefix A prefix string that can be replaced to 'chr'\n * @returns\n */\nexport function sanitizeChrName(chrName: string, assembly: Assembly, chromosomePrefix?: string) {\n if (Array.isArray(assembly)) {\n // this is a custom assembly, so use this as is\n return chrName;\n }\n\n // For assemblies in Gosling, we use the `chr` prefix consistently\n if (chromosomePrefix) {\n // `hs1` --> `chr1`\n chrName = chrName.replace(chromosomePrefix, 'chr');\n } else if (!chrName.includes('chr')) {\n // `1` --> `chr1`\n chrName = `chr${chrName}`;\n }\n return chrName;\n}\n\nexport type ExtendedChromInfo = HiGlass.ChromInfo & {\n absToChr(absPos: number): ReturnType<typeof absToChr> | null;\n chrToAbs(chr: [name: string, pos: number]): number | null;\n};\n\nexport function tilesetInfoFromChromInfo(chromInfo: ExtendedChromInfo, tileSize = 1024) {\n return {\n tile_size: tileSize,\n bins_per_dimension: tileSize,\n max_zoom: Math.ceil(Math.log(chromInfo.totalLength / tileSize) / Math.log(2)),\n max_width: chromInfo.totalLength,\n min_pos: [0],\n max_pos: [chromInfo.totalLength]\n };\n}\n\nexport function sizesToChromInfo(sizes: [string, number][]): ExtendedChromInfo {\n const info: HiGlass.ChromInfo = {\n cumPositions: [],\n chromLengths: {},\n chrPositions: {},\n totalLength: 0\n };\n\n sizes.forEach(([chr, length], i) => {\n const chrPosition = { id: i, chr, pos: info.totalLength };\n info.chrPositions[chr] = chrPosition;\n info.chromLengths[chr] = length;\n info.cumPositions.push(chrPosition);\n info.totalLength += length;\n });\n\n return {\n ...info,\n absToChr: absPos => (info.chrPositions ? absToChr(absPos, info) : null),\n chrToAbs: ([chrName, chrPos]) => (info.chrPositions ? chrToAbs(chrName, chrPos, info) : null)\n };\n}\n\nexport class RemoteFile extends _RemoteFile {\n // Overrides `read` to eagerly read 200 or 206 response\n // from https://github.com/GMOD/generic-filehandle/blob/0e8209be25e3097307bd15e964edd8c017e808d7/src/remoteFile.ts#L100-L162\n public read: _RemoteFile['read'] = async (\n buffer,\n offset = 0,\n length,\n position = 0,\n opts = {}\n ): Promise<{ bytesRead: number; buffer: Buffer }> => {\n const { headers = {}, signal, overrides = {} } = opts;\n\n if (length < Infinity) {\n headers.range = `bytes=${position}-${position + length}`;\n } else if (length === Infinity && position !== 0) {\n headers.range = `bytes=${position}-`;\n }\n const args = {\n // @ts-expect-error private property\n ...this.baseOverrides,\n ...overrides,\n headers: {\n ...headers,\n ...overrides.headers,\n // @ts-expect-error private property\n ...this.baseOverrides.headers\n },\n method: 'GET',\n redirect: 'follow',\n mode: 'cors',\n signal\n };\n const response = await this.fetch(this.url, args);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText} ${this.url}`);\n }\n\n // Just read the response if it was successful.\n if (response.status === 200 || response.status === 206) {\n // @ts-expect-error private method\n const responseData = await this.getBufferFromResponse(response);\n const bytesCopied = responseData.copy(buffer, offset, 0, Math.min(length, responseData.length));\n\n // try to parse out the size of the remote file\n const res = response.headers.get('content-range');\n const sizeMatch = /\\/(\\d+)$/.exec(res || '');\n if (sizeMatch && sizeMatch[1]) {\n // @ts-expect-error private property\n this._stat = { size: parseInt(sizeMatch[1], 10) };\n }\n\n return { bytesRead: bytesCopied, buffer };\n }\n\n // TODO: try harder here to gather more information about what the problem is\n throw new Error(`HTTP ${response.status} fetching ${this.url}`);\n };\n}\n\nexport interface TabularDataFetcher<Tile> {\n getTabularData(tileIds: string[]): Promise<Tile[]>;\n MAX_TILE_WIDTH?: number;\n}\n"],"names":["_RemoteFile"],"mappings":"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"}
|