@gmod/jbrowse
Version:
JBrowse - client-side genome browser
88 lines (75 loc) • 3.06 kB
JavaScript
const LRU = cjsRequire('quick-lru')
const { BgzipIndexedFasta } = cjsRequire('@gmod/indexedfasta')
const { Buffer } = cjsRequire('buffer')
const fastaIndexedFilesCache = new LRU({ maxSize: 5 })
const BlobFilehandleWrapper = cjsRequire('../../Model/BlobFilehandleWrapper')
define( [ 'dojo/_base/declare',
'dojo/_base/lang',
'JBrowse/Model/XHRBlob',
'JBrowse/Store/SeqFeature/IndexedFasta'
],
function(
declare,
lang,
XHRBlob,
IndexedFasta
) {
return declare( IndexedFasta,
{
/**
* Storage backend for sequences in indexed fasta files
* served as static text files.
* @constructs
*/
constructor: function(args) {
let dataBlob
if (args.bgzfa)
dataBlob = new BlobFilehandleWrapper(args.bgzfa)
else if (args.urlTemplate)
dataBlob = new BlobFilehandleWrapper(new XHRBlob(this.resolveUrl(args.urlTemplate), { expectRanges: true }))
else
dataBlob = new BlobFilehandleWrapper(new XHRBlob('data.fa', { expectRanges: true }))
let indexBlob
if (args.fai)
indexBlob = new BlobFilehandleWrapper(args.fai)
else if (args.faiUrlTemplate)
indexBlob = new BlobFilehandleWrapper(new XHRBlob(this.resolveUrl(args.faiUrlTemplate)))
else if (args.urlTemplate)
indexBlob = new BlobFilehandleWrapper(new XHRBlob(this.resolveUrl(args.urlTemplate+'.fai')))
else throw new Error('no index provided, must provide a FASTA index')
let gziBlob
if(args.gzi)
gziBlob = new BlobFilehandleWrapper(args.gzi)
else if(args.gziUrlTemplate)
gziBlob = new BlobFilehandleWrapper(new XHRBlob(this.resolveUrl(args.gziUrlTemplate)))
else if (args.urlTemplate)
gziBlob = new BlobFilehandleWrapper(new XHRBlob(this.resolveUrl(args.urlTemplate+'.gzi')))
else throw new Error('no gzi index provided, must provide a GZI index')
this.source = dataBlob.toString()
// LRU-cache the CRAM object so we don't have to re-download the
// index when we switch chromosomes
const cacheKey = `data: ${dataBlob}, index: ${indexBlob}, gzi: ${gziBlob}`
this.fasta = fastaIndexedFilesCache.get(cacheKey)
if (!this.fasta) {
this.fasta = new BgzipIndexedFasta({
fasta: dataBlob,
fai: indexBlob,
gzi: gziBlob,
chunkSizeLimit: args.chunkSizeLimit || 1000000
})
fastaIndexedFilesCache.set(cacheKey, this.fasta)
}
this.fasta.getSequenceList().then(
() => this._deferred.features.resolve({success:true}),
() => this._failAllDeferred()
)
},
saveStore: function() {
return {
urlTemplate: (this.config.file||this.config.blob).url,
faiUrlTemplate: this.config.fai.url,
gziUrlTemplate: this.config.gzi.url
};
}
});
});