Merge pull request #16004 from Snuffleupagus/WorkerTransport-cacheSimpleMethod

Improve how we cache Promises in `WorkerTransport`
This commit is contained in:
Tim van der Meij 2023-02-04 15:13:12 +01:00 committed by GitHub
commit e698664927
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2337,12 +2337,12 @@ class PDFWorker {
* @ignore * @ignore
*/ */
class WorkerTransport { class WorkerTransport {
#methodPromises = new Map();
#pageCache = new Map(); #pageCache = new Map();
#pagePromises = new Map(); #pagePromises = new Map();
#metadataPromise = null;
constructor(messageHandler, loadingTask, networkStream, params) { constructor(messageHandler, loadingTask, networkStream, params) {
this.messageHandler = messageHandler; this.messageHandler = messageHandler;
this.loadingTask = loadingTask; this.loadingTask = loadingTask;
@ -2376,6 +2376,17 @@ class WorkerTransport {
this.setupMessageHandler(); this.setupMessageHandler();
} }
#cacheSimpleMethod(name, data = null) {
const cachedPromise = this.#methodPromises.get(name);
if (cachedPromise) {
return cachedPromise;
}
const promise = this.messageHandler.sendWithPromise(name, data);
this.#methodPromises.set(name, promise);
return promise;
}
get annotationStorage() { get annotationStorage() {
return shadow(this, "annotationStorage", new AnnotationStorage()); return shadow(this, "annotationStorage", new AnnotationStorage());
} }
@ -2472,9 +2483,7 @@ class WorkerTransport {
Promise.all(waitOn).then(() => { Promise.all(waitOn).then(() => {
this.commonObjs.clear(); this.commonObjs.clear();
this.fontLoader.clear(); this.fontLoader.clear();
this.#metadataPromise = null; this.#methodPromises.clear();
this._getFieldObjectsPromise = null;
this._hasJSActionsPromise = null;
if (this._networkStream) { if (this._networkStream) {
this._networkStream.cancelAllRequests( this._networkStream.cancelAllRequests(
@ -2939,15 +2948,11 @@ class WorkerTransport {
} }
getFieldObjects() { getFieldObjects() {
return (this._getFieldObjectsPromise ||= return this.#cacheSimpleMethod("GetFieldObjects");
this.messageHandler.sendWithPromise("GetFieldObjects", null));
} }
hasJSActions() { hasJSActions() {
return (this._hasJSActionsPromise ||= this.messageHandler.sendWithPromise( return this.#cacheSimpleMethod("HasJSActions");
"HasJSActions",
null
));
} }
getCalculationOrderIds() { getCalculationOrderIds() {
@ -3028,8 +3033,13 @@ class WorkerTransport {
} }
getMetadata() { getMetadata() {
return (this.#metadataPromise ||= this.messageHandler const name = "GetMetadata",
.sendWithPromise("GetMetadata", null) cachedPromise = this.#methodPromises.get(name);
if (cachedPromise) {
return cachedPromise;
}
const promise = this.messageHandler
.sendWithPromise(name, null)
.then(results => { .then(results => {
return { return {
info: results[0], info: results[0],
@ -3037,7 +3047,9 @@ class WorkerTransport {
contentDispositionFilename: this._fullReader?.filename ?? null, contentDispositionFilename: this._fullReader?.filename ?? null,
contentLength: this._fullReader?.contentLength ?? null, contentLength: this._fullReader?.contentLength ?? null,
}; };
})); });
this.#methodPromises.set(name, promise);
return promise;
} }
getMarkInfo() { getMarkInfo() {
@ -3063,9 +3075,7 @@ class WorkerTransport {
if (!keepLoadedFonts) { if (!keepLoadedFonts) {
this.fontLoader.clear(); this.fontLoader.clear();
} }
this.#metadataPromise = null; this.#methodPromises.clear();
this._getFieldObjectsPromise = null;
this._hasJSActionsPromise = null;
} }
get loadingParams() { get loadingParams() {