From 7e845a63e2367d313d4986bb754f1bc8cba23858 Mon Sep 17 00:00:00 2001 From: erickson Date: Wed, 18 Aug 2010 20:11:18 +0000 Subject: [PATCH] Due to the async nature of xmllhttprequest, processing http responses (which often lead to further async-request laden callbacks) at receive time can result in out-of-order message handling. To bring order to this chaos, push all inbound message onto a queue, then go back to processing the older messages in order of oldest to newest. git-svn-id: svn://svn.open-ils.org/OpenSRF/trunk@2008 9efc2488-bf62-4759-914b-345cdb29e865 --- src/javascript/opensrf.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/javascript/opensrf.js b/src/javascript/opensrf.js index 7718d92..c014cd7 100644 --- a/src/javascript/opensrf.js +++ b/src/javascript/opensrf.js @@ -245,13 +245,24 @@ OpenSRF.NetMessage = function(to, from, thread, body) { OpenSRF.Stack = function() { } +// global inbound message queue +OpenSRF.Stack.queue = []; + OpenSRF.Stack.push = function(net_msg, callbacks) { var ses = OpenSRF.Session.find_session(net_msg.thread); if(!ses) return; ses.remote_id = net_msg.from; osrf_msgs = JSON2js(net_msg.body); - for(var i = 0; i < osrf_msgs.length; i++) - OpenSRF.Stack.handle_message(ses, osrf_msgs[i], callbacks); + + // push the latest responses onto the end of the inbound message queue + for(var i = 0; i < osrf_msgs.length; i++) + OpenSRF.Stack.queue.push({msg : osrf_msgs[i], callbacks : callbacks}); + + // continue processing responses, oldest to newest + while(OpenSRF.Stack.queue.length) { + var data = OpenSRF.Stack.queue.shift(); + OpenSRF.Stack.handle_message(ses, data.msg, data.callbacks); + } } OpenSRF.Stack.handle_message = function(ses, osrf_msg, callbacks) { -- 2.43.2