forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 | |
|  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| /* globals catcher, log */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| this.communication = (function () {
 | |
|   const exports = {};
 | |
| 
 | |
|   const registeredFunctions = {};
 | |
| 
 | |
|   exports.onMessage = catcher.watchFunction((req, sender, sendResponse) => {
 | |
|     if (!(req.funcName in registeredFunctions)) {
 | |
|       log.error(`Received unknown internal message type ${req.funcName}`);
 | |
|       sendResponse({ type: "error", name: "Unknown message type" });
 | |
|       return;
 | |
|     }
 | |
|     if (!Array.isArray(req.args)) {
 | |
|       log.error("Received message with no .args list");
 | |
|       sendResponse({ type: "error", name: "No .args" });
 | |
|       return;
 | |
|     }
 | |
|     const func = registeredFunctions[req.funcName];
 | |
|     let result;
 | |
|     try {
 | |
|       req.args.unshift(sender);
 | |
|       result = func.apply(null, req.args);
 | |
|     } catch (e) {
 | |
|       log.error(`Error in ${req.funcName}:`, e, e.stack);
 | |
|       // FIXME: should consider using makeError from catcher here:
 | |
|       sendResponse({
 | |
|         type: "error",
 | |
|         message: e + "",
 | |
|         errorCode: e.errorCode,
 | |
|         popupMessage: e.popupMessage,
 | |
|       });
 | |
|       return;
 | |
|     }
 | |
|     if (result && result.then) {
 | |
|       result
 | |
|         .then(concreteResult => {
 | |
|           sendResponse({ type: "success", value: concreteResult });
 | |
|         })
 | |
|         .catch(errorResult => {
 | |
|           log.error(
 | |
|             `Promise error in ${req.funcName}:`,
 | |
|             errorResult,
 | |
|             errorResult && errorResult.stack
 | |
|           );
 | |
|           sendResponse({
 | |
|             type: "error",
 | |
|             message: errorResult + "",
 | |
|             errorCode: errorResult.errorCode,
 | |
|             popupMessage: errorResult.popupMessage,
 | |
|           });
 | |
|         });
 | |
|       return;
 | |
|     }
 | |
|     sendResponse({ type: "success", value: result });
 | |
|   });
 | |
| 
 | |
|   exports.register = function (name, func) {
 | |
|     registeredFunctions[name] = func;
 | |
|   };
 | |
| 
 | |
|   return exports;
 | |
| })();
 | 
