@gorangajic/storage-emitter
Version:
Emit events between browser tabs
93 lines (73 loc) • 2.04 kB
JavaScript
;
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;