Cleaned up how messages are passed and replies work.

This commit is contained in:
Brendan Dahl 2011-12-08 14:51:26 -08:00
parent f7207a51f8
commit d1c823efce
2 changed files with 57 additions and 44 deletions

View File

@ -509,7 +509,8 @@ var PDFDoc = (function pdfDoc() {
// Tell the worker the file it was created from. // Tell the worker the file it was created from.
messageHandler.send('workerSrc', workerSrc); messageHandler.send('workerSrc', workerSrc);
messageHandler.on('test', function pdfDocTest(supportTypedArray) { messageHandler.on('test', function pdfDocTest(message) {
var supportTypedArray = message.data;
if (supportTypedArray) { if (supportTypedArray) {
this.worker = worker; this.worker = worker;
this.setupMessageHandler(messageHandler); this.setupMessageHandler(messageHandler);
@ -547,7 +548,8 @@ var PDFDoc = (function pdfDoc() {
setupMessageHandler: function(messageHandler) { setupMessageHandler: function(messageHandler) {
this.messageHandler = 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 pageNum = data.pageNum;
var page = this.pageCache[pageNum]; var page = this.pageCache[pageNum];
var depFonts = data.depFonts; var depFonts = data.depFonts;
@ -555,7 +557,8 @@ var PDFDoc = (function pdfDoc() {
page.startRenderingFromIRQueue(data.IRQueue, depFonts); page.startRenderingFromIRQueue(data.IRQueue, depFonts);
}, this); }, this);
messageHandler.on('obj', function pdfDocObj(data) { messageHandler.on('obj', function pdfDocObj(message) {
var data = message.data;
var id = data[0]; var id = data[0];
var type = data[1]; var type = data[1];
@ -588,7 +591,8 @@ var PDFDoc = (function pdfDoc() {
} }
}, this); }, this);
messageHandler.on('font_ready', function pdfDocFontReady(data) { messageHandler.on('font_ready', function pdfDocFontReady(message) {
var data = message.data;
var id = data[0]; var id = data[0];
var font = new FontShape(data[1]); var font = new FontShape(data[1]);
@ -600,7 +604,8 @@ var PDFDoc = (function pdfDoc() {
} }
}.bind(this)); }.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]; var page = this.pageCache[data.pageNum];
if (page.callback) if (page.callback)
page.callback(data.error); page.callback(data.error);
@ -637,7 +642,7 @@ var PDFDoc = (function pdfDoc() {
buf[j] = data[i]; buf[j] = data[i];
} }
} }
message.resolve({ data: buf, width: width, height: height}); message.reply({ data: buf, width: width, height: height});
}).bind(this); }).bind(this);
var src = 'data:image/jpeg;base64,' + window.btoa(imageData); var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
img.src = src; img.src = src;

View File

@ -3,11 +3,35 @@
'use strict'; '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) { function MessageHandler(name, comObj) {
this.name = name; this.name = name;
this.comObj = comObj; this.comObj = comObj;
this.callbackIndex = 1; this.callbackIndex = 1;
this.callbacks = {}; var callbacks = this.callbacks = {};
var ah = this.actionHandler = {}; var ah = this.actionHandler = {};
ah['console_log'] = [function ahConsoleLog(data) { ah['console_log'] = [function ahConsoleLog(data) {
@ -16,38 +40,25 @@ function MessageHandler(name, comObj) {
ah['console_error'] = [function ahConsoleError(data) { ah['console_error'] = [function ahConsoleError(data) {
console.error.apply(console, 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; var callbackId = data.callbackId;
if (data.callbackId in this.callbacks) { if (data.callbackId in callbacks) {
var callback = this.callbacks[callbackId]; var callback = callbacks[callbackId];
delete this.callbacks[callbackId]; delete callbacks[callbackId];
callback(data.data); callback(data.data);
} else { } else {
throw 'Cannot resolve callback ' + callbackId; throw 'Cannot resolve callback ' + callbackId;
} }
}, this]; } else if (data.action in ah) {
comObj.onmessage = function messageHandlerComObjOnMessage(event) {
var data = event.data;
if (data.action in ah) {
var action = ah[data.action]; var action = ah[data.action];
if (data.callbackId) { var message = new Message(data.data);
action[0].call(action[1], { if (data.callbackId)
data: data.data, message.setupReply(this.postMessage, data.callbackId);
resolve: (function(callbackId) {
return function(resolvedData) { action[0].call(action[1], message);
comObj.postMessage({
action: '__resolve__',
data: {
data: resolvedData,
callbackId: data.callbackId
}
});
}})(data.callbackId)
});
} else {
action[0].call(action[1], data.data);
}
} else { } else {
throw 'Unkown action from worker: ' + data.action; throw 'Unkown action from worker: ' + data.action;
} }
@ -81,7 +92,8 @@ var WorkerMessageHandler = {
setup: function wphSetup(handler) { setup: function wphSetup(handler) {
var pdfDoc = null; 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); handler.send('test', data instanceof Uint8Array);
}); });
@ -92,13 +104,15 @@ var WorkerMessageHandler = {
// undefined action `workerSrc`. // 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 // Create only the model of the PDFDoc, which is enough for
// processing the content of the pdf. // processing the content of the pdf.
pdfDoc = new PDFDocModel(new Stream(data)); 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); pageNum = parseInt(pageNum);
@ -147,7 +161,8 @@ var WorkerMessageHandler = {
}); });
}, this); }, this);
handler.on('font', function wphSetupFont(data) { handler.on('font', function wphSetupFont(message) {
var data = message.data;
var objId = data[0]; var objId = data[0];
var name = data[1]; var name = data[1];
var file = data[2]; var file = data[2];
@ -195,13 +210,6 @@ var WorkerMessageHandler = {
handler.send('font_ready', [objId, obj]); 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);
} }
}; };