[Addon] Handle exceptions and errors thrown from add-ons code 30/217030/5
authorsurya.kumar7 <surya.kumar7@samsung.com>
Tue, 5 Nov 2019 12:53:04 +0000 (18:23 +0530)
committerSurya Kumar <surya.kumar7@samsung.com>
Thu, 14 Nov 2019 10:17:07 +0000 (10:17 +0000)
1. Node's event emitter doesn't execute listener code in
a safe environment which means if an add-on code encounters
an unhandled exception, all the other add-ons which registered
later than this, will be deprived of execution
2. A mapping relationship between an event we emit & a dedicated
add-on callback function is established
3. Limit a listener to be added as callback only once

Change-Id: I42c989cbe5bac753e875aa74e42afc5c5e35bd90
Signed-off-by: surya.kumar7 <surya.kumar7@samsung.com>
wrt_app/src/addon_manager.js

index a156fa7f4dee187bb77571f154c6cf15bdd61f8a..caef34a21cc3d6bd5d3c3f432712fe995c654bf3 100644 (file)
@@ -45,6 +45,7 @@ class AddonManager {
         this.addons_list_ = null;
         this.addons_ = null;
         this.evt_emitter_ = null;
+        this.addons_listeners = {};
     }
 
     registerAPIModule() {
@@ -192,19 +193,34 @@ class AddonManager {
     }
 
     initEventListener() {
+        const getSafeFunction = function(fn) {
+            return function() {
+                try {
+                    fn.apply(this, arguments);
+                } catch (err) {
+                    console.log(`Exception from add-on: ${err.name} - ${err.message}`);
+                }
+            }
+        }
         this.evt_emitter_ = new EventEmitter();
         this.wrappedEventEmitter = {
             on: (eventName, listener) => {
-                if (EventList.indexOf(eventName) !== -1) {
+                if (EventList.indexOf(eventName) === -1) {
+                    console.log(`Invalid Event: ${eventName}`);
+                } else if (!this.addons_listeners[listener]) {
                     console.log(`A new listener for ${eventName} is added`);
-                    this.evt_emitter_.on(eventName, listener);
-                } else console.log(`Invalid Event: ${eventName}`);
+                    this.addons_listeners[listener] = getSafeFunction(listener);
+                    this.evt_emitter_.on(eventName, this.addons_listeners[listener]);
+                } else console.log('Listener is already registered');
             },
             off: (eventName, listener) => {
-                if (EventList.indexOf(eventName) !== -1) {
+                if (EventList.indexOf(eventName) === -1) {
+                    console.log(`Invalid Event: ${eventName}`);
+                } else if (this.addons_listeners[listener]) {
                     console.log(`A listener for ${eventName} is removed`);
-                    this.evt_emitter_.off(eventName, listener);
-                } else console.log(`Invalid Event: ${eventName}`);
+                    this.evt_emitter_.off(eventName, this.addons_listeners[listener]);
+                    delete this.addons_listeners[listener];
+                } else console.log('Listener is not registered');
             }
         }
     }