From d1c823efcec0abe1e43dbc571242250db486b297 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Thu, 8 Dec 2011 14:51:26 -0800 Subject: [PATCH] Cleaned up how messages are passed and replies work. --- src/core.js | 17 +++++++---- src/worker.js | 84 ++++++++++++++++++++++++++++----------------------- 2 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/core.js b/src/core.js index 8063841f2..29bc56e32 100644 --- a/src/core.js +++ b/src/core.js @@ -509,7 +509,8 @@ var PDFDoc = (function pdfDoc() { // Tell the worker the file it was created from. messageHandler.send('workerSrc', workerSrc); - messageHandler.on('test', function pdfDocTest(supportTypedArray) { + messageHandler.on('test', function pdfDocTest(message) { + var supportTypedArray = message.data; if (supportTypedArray) { this.worker = worker; this.setupMessageHandler(messageHandler); @@ -547,7 +548,8 @@ var PDFDoc = (function pdfDoc() { setupMessageHandler: function(messageHandler) { this.messageHandler = messageHandler; - messageHandler.on('page', function pdfDocPage(data) { + messageHandler.on('page', function pdfDocPage(message) { + var data = message.data; var pageNum = data.pageNum; var page = this.pageCache[pageNum]; var depFonts = data.depFonts; @@ -555,7 +557,8 @@ var PDFDoc = (function pdfDoc() { page.startRenderingFromIRQueue(data.IRQueue, depFonts); }, this); - messageHandler.on('obj', function pdfDocObj(data) { + messageHandler.on('obj', function pdfDocObj(message) { + var data = message.data; var id = data[0]; var type = data[1]; @@ -588,7 +591,8 @@ var PDFDoc = (function pdfDoc() { } }, this); - messageHandler.on('font_ready', function pdfDocFontReady(data) { + messageHandler.on('font_ready', function pdfDocFontReady(message) { + var data = message.data; var id = data[0]; var font = new FontShape(data[1]); @@ -600,7 +604,8 @@ var PDFDoc = (function pdfDoc() { } }.bind(this)); - messageHandler.on('page_error', function pdfDocError(data) { + messageHandler.on('page_error', function pdfDocError(message) { + var data = message.data; var page = this.pageCache[data.pageNum]; if (page.callback) page.callback(data.error); @@ -637,7 +642,7 @@ var PDFDoc = (function pdfDoc() { buf[j] = data[i]; } } - message.resolve({ data: buf, width: width, height: height}); + message.reply({ data: buf, width: width, height: height}); }).bind(this); var src = 'data:image/jpeg;base64,' + window.btoa(imageData); img.src = src; diff --git a/src/worker.js b/src/worker.js index ea314744f..a3a539894 100644 --- a/src/worker.js +++ b/src/worker.js @@ -3,11 +3,35 @@ 'use strict'; +function Message(data) { + this.data = data; + this.allowsReply = false; + this.messager; + this.id; +} +Message.prototype = { + reply: function messageReply(data) { + if (!this.allowsReply) + error('This message does not accept replies.'); + + this.messager({ + isReply: true, + callbackId: this.id, + data: data + }); + }, + setupReply: function setupReply(messager, id) { + this.allowsReply = true; + this.messager = messager; + this.id = id; + } +} + function MessageHandler(name, comObj) { this.name = name; this.comObj = comObj; this.callbackIndex = 1; - this.callbacks = {}; + var callbacks = this.callbacks = {}; var ah = this.actionHandler = {}; ah['console_log'] = [function ahConsoleLog(data) { @@ -16,38 +40,25 @@ function MessageHandler(name, comObj) { ah['console_error'] = [function ahConsoleError(data) { console.error.apply(console, data); }]; - ah['__resolve__'] = [ function(data) { + + comObj.onmessage = function messageHandlerComObjOnMessage(event) { + var data = event.data; + if (data.isReply) { var callbackId = data.callbackId; - if (data.callbackId in this.callbacks) { - var callback = this.callbacks[callbackId]; - delete this.callbacks[callbackId]; + if (data.callbackId in callbacks) { + var callback = callbacks[callbackId]; + delete callbacks[callbackId]; callback(data.data); } else { throw 'Cannot resolve callback ' + callbackId; } - }, this]; - - comObj.onmessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.action in ah) { + } else if (data.action in ah) { var action = ah[data.action]; - if (data.callbackId) { - action[0].call(action[1], { - data: data.data, - resolve: (function(callbackId) { - return function(resolvedData) { - comObj.postMessage({ - action: '__resolve__', - data: { - data: resolvedData, - callbackId: data.callbackId - } - }); - }})(data.callbackId) - }); - } else { - action[0].call(action[1], data.data); - } + var message = new Message(data.data); + if (data.callbackId) + message.setupReply(this.postMessage, data.callbackId); + + action[0].call(action[1], message); } else { throw 'Unkown action from worker: ' + data.action; } @@ -81,7 +92,8 @@ var WorkerMessageHandler = { setup: function wphSetup(handler) { var pdfDoc = null; - handler.on('test', function wphSetupTest(data) { + handler.on('test', function wphSetupTest(message) { + var data = message.data; handler.send('test', data instanceof Uint8Array); }); @@ -92,13 +104,15 @@ var WorkerMessageHandler = { // undefined action `workerSrc`. }); - handler.on('doc', function wphSetupDoc(data) { + handler.on('doc', function wphSetupDoc(message) { + var data = message.data; // Create only the model of the PDFDoc, which is enough for // processing the content of the pdf. pdfDoc = new PDFDocModel(new Stream(data)); }); - handler.on('page_request', function wphSetupPageRequest(pageNum) { + handler.on('page_request', function wphSetupPageRequest(message) { + var pageNum = message.data; pageNum = parseInt(pageNum); @@ -147,7 +161,8 @@ var WorkerMessageHandler = { }); }, this); - handler.on('font', function wphSetupFont(data) { + handler.on('font', function wphSetupFont(message) { + var data = message.data; var objId = data[0]; var name = data[1]; var file = data[2]; @@ -195,13 +210,6 @@ var WorkerMessageHandler = { handler.send('font_ready', [objId, obj]); }); - - handler.on('jpeg_decoded', function jpegDecoded(data) { - var objId = data[0]; - var imageData = data[1]; - console.log('worker recieved decoded jpeg'); - debugger; - }, this); } };