diff options
Diffstat (limited to 'toolkit/components/promiseworker/worker')
-rw-r--r-- | toolkit/components/promiseworker/worker/PromiseWorker.template.worker.js | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/toolkit/components/promiseworker/worker/PromiseWorker.template.worker.js b/toolkit/components/promiseworker/worker/PromiseWorker.template.worker.js index c8203db48f..9ea26df9f5 100644 --- a/toolkit/components/promiseworker/worker/PromiseWorker.template.worker.js +++ b/toolkit/components/promiseworker/worker/PromiseWorker.template.worker.js @@ -102,19 +102,57 @@ function Meta(data, meta) { */ function AbstractWorker(agent) { this._agent = agent; + this._deferredJobs = new Map(); + this._deferredJobId = 0; } + AbstractWorker.prototype = { // Default logger: discard all messages log() {}, + _generateDeferredJobId() { + this._deferredJobId += 1; + return "WorkerToThread-" + this._deferredJobId; + }, + + /** + * Post and wait for an answer from the thread. + */ + callMainThread(funcName, args) { + const messageId = this._generateDeferredJobId(); + + const message = { + id: messageId, + fun: funcName, + args, + }; + + return new Promise((resolve, reject) => { + this._deferredJobs.set(messageId, { resolve, reject }); + this.postMessage(message); + }); + }, + /** * Handle a message. */ async handleMessage(msg) { let data = msg.data; - this.log("Received message", data); let id = data.id; + // if the id is found in _deferredJobs, we proceed with the message + if (this._deferredJobs.has(id)) { + const { resolve, reject } = this._deferredJobs.get(id); + + if ("ok" in data) { + resolve(data); + } else if ("fail" in data) { + reject(data); + } + this._deferredJobs.delete(id); + return; + } + let start; let options; if (data.args) { |