UNPKG

@gorangajic/storage-emitter

Version:
93 lines (73 loc) 2.04 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _componentEmitter = require('component-emitter'); var _componentEmitter2 = _interopRequireDefault(_componentEmitter); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var emit = _componentEmitter2.default.prototype.emit; /** * Use communication `KEY` to ignore other localStorage changes. */ /* eslint-env browser */ var KEY = '!!storage-emitter-key'; /** * Use `TEST_KEY` to detect private browsing mode */ var TEST_KEY = '!!storage-emitter-key-test'; /** * Initialize an `Emitter` instance. */ var sEmitter = new _componentEmitter2.default(); var isLocalStorageAvailable = !isPrivateBrowsingMode(); /** * Register `storage` event listener to DefaultView<window> target. * https://developer.mozilla.org/en-US/docs/Web/Events/storage * * @param {StorageEvent} e { key, newValue } */ window.addEventListener('storage', function onStorage(e) { if (e.key !== KEY) return; // ignore other keys if (!e.newValue) return; // removeItem try { var cmd = JSON.parse(e.newValue); sEmitter.listeners(cmd.event).forEach(function (callback) { callback.call(sEmitter, cmd.args); }); } catch (err) { console.error('unexpected value: ' + err.newValue); } }, false); /** * Emit `event` with the given args. * * @param {String} event * @param {Mixed} args * @return {StorageEmitter} */ sEmitter.emit = function (event, args) { if (isLocalStorageAvailable) { var cmd = JSON.stringify({ event: event, args: args }); localStorage.setItem(KEY, cmd); localStorage.removeItem(KEY); } return emit.apply(this, arguments); }; /** * Check browser is in private browsing mode or not * * @return {Boolean} */ function isPrivateBrowsingMode() { try { localStorage.setItem(TEST_KEY, '1'); localStorage.removeItem(TEST_KEY); return false; } catch (error) { return true; } } /** * Expose `sEmitter`. */ exports.default = sEmitter;