diff --git a/stacktrace-gps.js b/stacktrace-gps.js index f7c7346..bd66053 100644 --- a/stacktrace-gps.js +++ b/stacktrace-gps.js @@ -133,10 +133,8 @@ } } - function _extractLocationInfoFromSourceMap(stackframe, rawSourceMap, sourceCache) { + function _extractLocationInfoFromSourceMap(stackframe, rawSourceMap, sourceCache, mapConsumer) { return new Promise(function(resolve, reject) { - var mapConsumer = new SourceMap.SourceMapConsumer(rawSourceMap); - var loc = mapConsumer.originalPositionFor({ line: stackframe.lineNumber, column: stackframe.columnNumber @@ -180,6 +178,12 @@ this._atob = opts.atob || _atob; + this.processedSourceMapCache = {}; + + this.sourceMapConsumerCache = {}; + + var that = this; + this._get = function _get(location) { return new Promise(function(resolve, reject) { var isDataUrl = location.substr(0, 5) === 'data:'; @@ -282,16 +286,29 @@ if (sourceMappingURL[0] !== '/' && !isDataUrl && !(/^https?:\/\/|^\/\//i).test(sourceMappingURL)) { sourceMappingURL = base + sourceMappingURL; } - this._get(sourceMappingURL).then(function(sourceMap) { - if (typeof sourceMap === 'string') { - sourceMap = _parseJson(sourceMap.replace(/^\)\]\}'/, '')); + if(that.processedSourceMapCache[sourceMappingURL]) { + sourceMap = that.processedSourceMapCache[sourceMappingURL]; + } + else { + if (typeof sourceMap === 'string') { + sourceMap = _parseJson(sourceMap.replace(/^\)\]\}'/, '')); + } + if (typeof sourceMap.sourceRoot === 'undefined') { + sourceMap.sourceRoot = base; + } + that.processedSourceMapCache[sourceMappingURL] = sourceMap; + } + var sourceMapConsumer; + if(that.sourceMapConsumerCache[sourceMappingURL]) { + sourceMapConsumer = that.sourceMapConsumerCache[sourceMappingURL]; } - if (typeof sourceMap.sourceRoot === 'undefined') { - sourceMap.sourceRoot = base; + else { + sourceMapConsumer = new SourceMap.SourceMapConsumer(sourceMap); + that.sourceMapConsumerCache[sourceMappingURL] = sourceMapConsumer; } - _extractLocationInfoFromSourceMap(stackframe, sourceMap, sourceCache) + _extractLocationInfoFromSourceMap(stackframe, sourceMap, sourceCache, sourceMapConsumer) .then(resolve)['catch'](function() { resolve(stackframe); });