Source: scripts/msg.js

/*
 * Copyright (c) 2016-2017, Michael A. Updike All rights reserved.
 * Licensed under Apache 2.0
 * https://opensource.org/licenses/Apache-2.0
 * https://github.com/opus1269/chrome-extension-utils/blob/master/LICENSE.md
 */
window.Chrome = window.Chrome || {};

/**
 * Wrapper for chrome messages
 * @see https://developer.chrome.com/extensions/messaging
 * @namespace
 */
Chrome.Msg = (function() {
  'use strict';

  new ExceptionHandler();

  /**
   * A Chrome message
   * @typedef {{}} Chrome.Msg.Message
   * @property {string} message - Unique name
   * @property {Error} error - an error
   * @property {string|Object} item - a message specific item
   * @property {boolean} updated - item is new or updated
   * @property {string} key - key name
   * @property {?Object} value - value of key
   * @memberOf Chrome.Msg
   */

  /**
   * Chrome Messages
   * @type {{}}
   * @property {Chrome.Msg.Message} HIGHLIGHT - highlight a tab
   * @property {Chrome.Msg.Message} RESTORE_DEFAULTS - restore default settings
   * @property {Chrome.Msg.Message} STORAGE_EXCEEDED - local storage save failed
   * @property {Chrome.Msg.Message} STORE - save value to storage
   * @const
   * @private
   * @memberOf Chrome.Msg
   */
  const _MSG = {
    HIGHLIGHT: {
      message: 'highlightTab',
    },
    RESTORE_DEFAULTS: {
      message: 'restoreDefaults',
    },
    STORAGE_EXCEEDED: {
      message: 'storageExceeded',
    },
    STORE: {
      message: 'store',
      key: '',
      value: '',
    },
  };

  return {
    HIGHLIGHT: _MSG.HIGHLIGHT,
    RESTORE_DEFAULTS: _MSG.RESTORE_DEFAULTS,
    STORAGE_EXCEEDED: _MSG.STORAGE_EXCEEDED,
    STORE: _MSG.STORE,

    /**
     * Send a chrome message
     * @param {Chrome.Msg.Message} type - type of message
     * @returns {Promise<JSON>} response JSON
     * @memberOf Chrome.Msg
     */
    send: function(type) {
      const chromep = new ChromePromise();
      return chromep.runtime.sendMessage(type, null).then((response) => {
        return Promise.resolve(response);
      }).catch((err) => {
        if (err.message &&
            !err.message.includes('port closed') &&
            !err.message.includes('Receiving end does not exist')) {
          const msg = `type: ${type.message}, ${err.message}`;
          Chrome.GA.error(msg, 'Msg.send');
        }
        return Promise.reject(err);
      });
    },

    /**
     * Add a listener for chrome messages
     * @param {Function} listener - function to receive messages
     * @memberOf Chrome.Msg
     */
    listen: function(listener) {
      chrome.runtime.onMessage.addListener(listener);
    },
  };
})();