UNPKG

js-broadcast-channel

Version:
157 lines (154 loc) 5.6 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { BroadcastJS: () => BroadcastJS }); module.exports = __toCommonJS(index_exports); // src/broadcast.ts var _BroadcastJS = class _BroadcastJS { constructor(name, handlers) { if (!this.canBrowserSupportBroadcastJS()) { throw new Error("BroadcastChannel API is not supported in this browser"); } if (_BroadcastJS.bcJSInstance) { return _BroadcastJS.bcJSInstance; } if (!_BroadcastJS.bcInstance) { const broadcast = new BroadcastChannel(name); _BroadcastJS.bcInstance = broadcast; } _BroadcastJS.handlers = handlers || {}; _BroadcastJS.bcJSInstance = this; return _BroadcastJS.bcJSInstance; } /** * Closes the broadcast channel. * * @returns {void} * * @example * const broadcast = new BroadcastJS("channelName"); * broadcast.close(); */ close() { var _a, _b, _c, _d; (_b = (_a = _BroadcastJS.handlers).onBeforeClose) == null ? void 0 : _b.call(_a); _BroadcastJS.bcInstance.close(); _BroadcastJS.messageCallbacks.clear(); _BroadcastJS.handlers = {}; (_d = (_c = _BroadcastJS.handlers).onAfterClose) == null ? void 0 : _d.call(_c); } /** * Posts a message to the broadcast channel. * * @param {Message} message - The message to post. * @returns {void} * * @example * const broadcast = new BroadcastJS("channelName"); * broadcast.postMessage({ message: "message", data: { count: 0 } }); */ postMessage(message) { var _a, _b, _c, _d; const serializedMessage = this.createSerializedMessage(message.message, message.data, false); (_b = (_a = _BroadcastJS.handlers).onBeforePostMessage) == null ? void 0 : _b.call(_a, message); _BroadcastJS.bcInstance.postMessage(serializedMessage); (_d = (_c = _BroadcastJS.handlers).onAfterPostMessage) == null ? void 0 : _d.call(_c, message); } /** * Calls a callback when a message is received. * * @param {string} messageName - The name of the message to call the callback for. * @param {function} onRecieve - The callback to call when a message is received. * @returns {void} * * @example * const broadcast = new BroadcastJS("channelName"); * broadcast.onMessage("name", (message) => { * console.log(message); * }); */ onMessage(messageName, onRecieve) { _BroadcastJS.messageCallbacks.set(messageName, onRecieve); _BroadcastJS.bcInstance.onmessage = (event) => { var _a, _b, _c, _d, _e, _f, _g; const receivedMessage = JSON.parse(event.data); const message = this.createMessage(receivedMessage.message, receivedMessage.data, (_a = receivedMessage.isInternal) != null ? _a : false); if (message.isInternal) { _BroadcastJS.internalMessage(message.message, message); return; } const callback = _BroadcastJS.messageCallbacks.get(receivedMessage.message); if (callback) { (_c = (_b = _BroadcastJS.handlers).onBeforeSendMessage) == null ? void 0 : _c.call(_b, message); callback(message); (_e = (_d = _BroadcastJS.handlers).onAfterSendMessage) == null ? void 0 : _e.call(_d, message); } else { (_g = (_f = _BroadcastJS.handlers).onError) == null ? void 0 : _g.call(_f, message); console.error("No callback found for message with name: ", receivedMessage.message); } }; } removeMessage(messageName) { const serializedMessage = this.createSerializedMessage("removeMessage" /* RemoveMessage */, messageName, true); _BroadcastJS.bcInstance.postMessage(serializedMessage); _BroadcastJS.messageCallbacks.delete(messageName); } canBrowserSupportBroadcastJS() { return typeof BroadcastChannel !== "undefined"; } hasListeners(messageName) { return _BroadcastJS.messageCallbacks.has(messageName); } static internalMessage(messageName, message) { let isInternalMessage = false; switch (messageName) { case "removeMessage" /* RemoveMessage */: _BroadcastJS.messageCallbacks.delete(message.data); isInternalMessage = true; break; default: isInternalMessage = false; break; } return isInternalMessage; } // manual serialization to make it predictable createMessage(name, data, isInternal) { const message = { message: name, data, isInternal }; return message; } createSerializedMessage(name, data, isInternal) { const message = this.createMessage(name, data, isInternal); return JSON.stringify(message); } }; _BroadcastJS.messageCallbacks = /* @__PURE__ */ new Map(); _BroadcastJS.handlers = {}; var BroadcastJS = _BroadcastJS; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BroadcastJS });