@toruslabs/broadcast-channel
Version:
A BroadcastChannel that works in New Browsers, Old Browsers, WebWorkers
60 lines (56 loc) • 1.56 kB
JavaScript
;
var util = require('../util.js');
const microSeconds = util.microSeconds;
const type = "simulate";
const SIMULATE_CHANNELS = new Set();
const SIMULATE_DELAY_TIME = 5;
function create(channelName) {
const state = {
time: util.microSeconds(),
name: channelName,
messagesCallback: null
};
SIMULATE_CHANNELS.add(state);
return state;
}
function close(channelState) {
SIMULATE_CHANNELS.delete(channelState);
}
function postMessage(channelState, messageJson) {
return new Promise(resolve => {
setTimeout(() => {
const channelArray = Array.from(SIMULATE_CHANNELS);
channelArray.forEach(channel => {
if (channel.name === channelState.name &&
// has same name
channel !== channelState &&
// not own channel
!!channel.messagesCallback &&
// has subscribers
channel.time < messageJson.time // channel not created after postMessage() call
) {
channel.messagesCallback(messageJson);
}
});
resolve();
}, SIMULATE_DELAY_TIME);
});
}
function onMessage(channelState, fn) {
channelState.messagesCallback = fn;
}
function canBeUsed() {
return true;
}
function averageResponseTime() {
return SIMULATE_DELAY_TIME;
}
exports.SIMULATE_DELAY_TIME = SIMULATE_DELAY_TIME;
exports.averageResponseTime = averageResponseTime;
exports.canBeUsed = canBeUsed;
exports.close = close;
exports.create = create;
exports.microSeconds = microSeconds;
exports.onMessage = onMessage;
exports.postMessage = postMessage;
exports.type = type;