@storybook/channels
Version:
Storybook Channel is similar to an EventEmitter. Channels are used with Storybook implementations to send/receive events between the Storybook Manager and the Storybook Renderer.
191 lines (165 loc) • 5.83 kB
JavaScript
import "core-js/modules/es.object.freeze.js";
var _templateObject;
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
import "core-js/modules/es.array.slice.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.to-string.js";
import "core-js/modules/web.immediate.js";
import "core-js/modules/es.object.keys.js";
import "core-js/modules/es.array.filter.js";
import "core-js/modules/web.dom-collections.for-each.js";
import deprecate from 'util-deprecate';
import dedent from 'ts-dedent';
var generateRandomId = function generateRandomId() {
// generates a random 13 character string
return Math.random().toString(16).slice(2);
};
export var Channel = /*#__PURE__*/function () {
function Channel() {
var _this = this;
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
transport = _ref.transport,
_ref$async = _ref.async,
async = _ref$async === void 0 ? false : _ref$async;
_classCallCheck(this, Channel);
this.isAsync = void 0;
this.sender = generateRandomId();
this.events = {};
this.data = {};
this.transport = void 0;
this.addPeerListener = deprecate(function (eventName, listener) {
_this.addListener(eventName, listener);
}, dedent(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n channel.addPeerListener is deprecated\n "]))));
this.isAsync = async;
if (transport) {
this.transport = transport;
this.transport.setHandler(function (event) {
return _this.handleEvent(event);
});
}
}
_createClass(Channel, [{
key: "hasTransport",
get: function get() {
return !!this.transport;
}
}, {
key: "addListener",
value: function addListener(eventName, listener) {
this.events[eventName] = this.events[eventName] || [];
this.events[eventName].push(listener);
}
}, {
key: "emit",
value: function emit(eventName) {
var _this2 = this;
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
var event = {
type: eventName,
args: args,
from: this.sender
};
var options = {};
if (args.length >= 1 && args[0] && args[0].options) {
options = args[0].options;
}
var handler = function handler() {
if (_this2.transport) {
_this2.transport.send(event, options);
}
_this2.handleEvent(event);
};
if (this.isAsync) {
// todo I'm not sure how to test this
setImmediate(handler);
} else {
handler();
}
}
}, {
key: "last",
value: function last(eventName) {
return this.data[eventName];
}
}, {
key: "eventNames",
value: function eventNames() {
return Object.keys(this.events);
}
}, {
key: "listenerCount",
value: function listenerCount(eventName) {
var listeners = this.listeners(eventName);
return listeners ? listeners.length : 0;
}
}, {
key: "listeners",
value: function listeners(eventName) {
var listeners = this.events[eventName];
return listeners || undefined;
}
}, {
key: "once",
value: function once(eventName, listener) {
var onceListener = this.onceListener(eventName, listener);
this.addListener(eventName, onceListener);
}
}, {
key: "removeAllListeners",
value: function removeAllListeners(eventName) {
if (!eventName) {
this.events = {};
} else if (this.events[eventName]) {
delete this.events[eventName];
}
}
}, {
key: "removeListener",
value: function removeListener(eventName, listener) {
var listeners = this.listeners(eventName);
if (listeners) {
this.events[eventName] = listeners.filter(function (l) {
return l !== listener;
});
}
}
}, {
key: "on",
value: function on(eventName, listener) {
this.addListener(eventName, listener);
}
}, {
key: "off",
value: function off(eventName, listener) {
this.removeListener(eventName, listener);
}
}, {
key: "handleEvent",
value: function handleEvent(event) {
var listeners = this.listeners(event.type);
if (listeners && listeners.length) {
listeners.forEach(function (fn) {
fn.apply(event, event.args);
});
}
this.data[event.type] = event.args;
}
}, {
key: "onceListener",
value: function onceListener(eventName, listener) {
var _this3 = this;
var onceListener = function onceListener() {
_this3.removeListener(eventName, onceListener);
return listener.apply(void 0, arguments);
};
return onceListener;
}
}]);
return Channel;
}();
export default Channel;