js-broadcast-channel
Version:
157 lines (154 loc) • 5.6 kB
JavaScript
;
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
});