From bf7233a2ef62836b9bd75f4ee00f53651feb44ec Mon Sep 17 00:00:00 2001
From: Darren <darren@darrenwhitlen.com>
Date: Sat, 18 Oct 2014 02:30:48 +0100
Subject: [PATCH] Updating client-side PluginInterface to its server-side
 version

---
 client/src/helpers/plugininterface.js | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/client/src/helpers/plugininterface.js b/client/src/helpers/plugininterface.js
index ee025d9..0c2782a 100644
--- a/client/src/helpers/plugininterface.js
+++ b/client/src/helpers/plugininterface.js
@@ -52,31 +52,46 @@ PluginInterface.prototype.off = PluginInterface.prototype.removeListener = funct
 
 PluginInterface.prototype.emit = function emit(type, data) {
     var that = this;
+
     return new Promise(function (emit_resolve, emit_reject) {
         var rejected = false,
-            rejected_reasons = [];
+            rejected_reasons = [],
+            listeners_promise;
 
         if (!that.listeners[type]) {
             return emit_resolve(data);
         }
 
-        (that.listeners[type].reduce(function (listener_promise, listener) {
+        // Add each listener as a promise .then()
+        listeners_promise = that.listeners[type].reduce(function (listener_promise, listener) {
             return listener_promise.then(function (data) {
                 return new Promise(function (resolve) {
-                    listener({
+                    var event_data = {
                         callback: function () {
                             resolve(data);
+                            event_data.callback = null;
                         },
                         preventDefault: function (reason) {
                             rejected = true;
                             if (reason) {
                                 rejected_reasons.push(reason);
                             }
-                        }
-                    }, data);
+                        },
+                        wait: false
+                    };
+
+                    listener(event_data, data);
+
+                    // If the module has not specified that we should wait, callback now
+                    if (!event_data.wait && event_data.callback) {
+                        event_data.callback();
+                    }
                 });
             });
-        }, Promise.resolve(data))).then(function (data) {
+        }, Promise.resolve(data));
+
+        // After all the listeners have been called, resolve back with any modified data
+        listeners_promise.then(function (data) {
             if (rejected) {
                 emit_reject({data: data, reasons: rejected_reasons});
             } else {
-- 
2.25.1