diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 27c7256a3..2c3c80964 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -78,8 +78,24 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { if (this.builtInCMapCache.has(name)) { return this.builtInCMapCache.get(name); } - const data = await this.handler.sendWithPromise('FetchBuiltInCMap', - { name, }); + const readableStream = this.handler.sendWithStream('FetchBuiltInCMap', { + name, + }); + const reader = readableStream.getReader(); + + const data = await new Promise(function(resolve, reject) { + function pump() { + reader.read().then(function({ value, done, }) { + if (done) { + return; + } + resolve(value); + pump(); + }, reject); + } + pump(); + }); + if (data.compressionType !== CMapCompressionType.NONE) { // Given the size of uncompressed CMaps, only cache compressed ones. this.builtInCMapCache.set(name, data); diff --git a/src/display/api.js b/src/display/api.js index a964d52ff..1be287ac6 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -2230,11 +2230,26 @@ class WorkerTransport { }); }); - messageHandler.on('FetchBuiltInCMap', (data) => { + messageHandler.on('FetchBuiltInCMap', (data, sink) => { if (this.destroyed) { - return Promise.reject(new Error('Worker was destroyed')); + sink.error(new Error('Worker was destroyed')); + return; } - return this.CMapReaderFactory.fetch(data); + let fetched = false; + + sink.onPull = () => { + if (fetched) { + sink.close(); + return; + } + fetched = true; + + this.CMapReaderFactory.fetch(data).then(function(builtInCMap) { + sink.enqueue(builtInCMap, 1, [builtInCMap.cMapData.buffer]); + }).catch(function(reason) { + sink.error(reason); + }); + }; }); }