{"version":3,"file":"broadcast-channel-C7KUBKyD.js","sources":["../../Vue/node_modules/broadcast-channel/dist/esbrowser/util.js","../../Vue/node_modules/broadcast-channel/dist/esbrowser/methods/native.js","../../Vue/node_modules/oblivious-set/dist/esm/src/index.js","../../Vue/node_modules/broadcast-channel/dist/esbrowser/options.js","../../Vue/node_modules/broadcast-channel/dist/esbrowser/methods/indexed-db.js","../../Vue/node_modules/broadcast-channel/dist/esbrowser/methods/localstorage.js","../../Vue/node_modules/broadcast-channel/dist/esbrowser/methods/simulate.js","../../Vue/node_modules/broadcast-channel/dist/esbrowser/method-chooser.js","../../Vue/node_modules/broadcast-channel/dist/esbrowser/broadcast-channel.js"],"sourcesContent":["/**\n * returns true if the given object is a promise\n */\nexport function isPromise(obj) {\n return obj && typeof obj.then === 'function';\n}\nexport var PROMISE_RESOLVED_FALSE = Promise.resolve(false);\nexport var PROMISE_RESOLVED_TRUE = Promise.resolve(true);\nexport var PROMISE_RESOLVED_VOID = Promise.resolve();\nexport function sleep(time, resolveWith) {\n if (!time) time = 0;\n return new Promise(function (res) {\n return setTimeout(function () {\n return res(resolveWith);\n }, time);\n });\n}\nexport function randomInt(min, max) {\n return Math.floor(Math.random() * (max - min + 1) + min);\n}\n\n/**\n * https://stackoverflow.com/a/8084248\n */\nexport function randomToken() {\n return Math.random().toString(36).substring(2);\n}\nvar lastMs = 0;\n\n/**\n * Returns the current unix time in micro-seconds,\n * WARNING: This is a pseudo-function\n * Performance.now is not reliable in webworkers, so we just make sure to never return the same time.\n * This is enough in browsers, and this function will not be used in nodejs.\n * The main reason for this hack is to ensure that BroadcastChannel behaves equal to production when it is used in fast-running unit tests.\n */\nexport function microSeconds() {\n var ret = Date.now() * 1000; // milliseconds to microseconds\n if (ret <= lastMs) {\n ret = lastMs + 1;\n }\n lastMs = ret;\n return ret;\n}\n\n/**\n * Check if WebLock API is supported.\n * @link https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API\n */\nexport function supportsWebLockAPI() {\n if (typeof navigator !== 'undefined' && typeof navigator.locks !== 'undefined' && typeof navigator.locks.request === 'function') {\n return true;\n } else {\n return false;\n }\n}","import { microSeconds as micro, PROMISE_RESOLVED_VOID } from '../util.js';\nexport var microSeconds = micro;\nexport var type = 'native';\nexport function create(channelName) {\n var state = {\n time: micro(),\n messagesCallback: null,\n bc: new BroadcastChannel(channelName),\n subFns: [] // subscriberFunctions\n };\n\n state.bc.onmessage = function (msgEvent) {\n if (state.messagesCallback) {\n state.messagesCallback(msgEvent.data);\n }\n };\n return state;\n}\nexport function close(channelState) {\n channelState.bc.close();\n channelState.subFns = [];\n}\nexport function postMessage(channelState, messageJson) {\n try {\n channelState.bc.postMessage(messageJson, false);\n return PROMISE_RESOLVED_VOID;\n } catch (err) {\n return Promise.reject(err);\n }\n}\nexport function onMessage(channelState, fn) {\n channelState.messagesCallback = fn;\n}\nexport function canBeUsed() {\n // Deno runtime\n // eslint-disable-next-line\n if (typeof globalThis !== 'undefined' && globalThis.Deno && globalThis.Deno.args) {\n return true;\n }\n\n // Browser runtime\n if ((typeof window !== 'undefined' || typeof self !== 'undefined') && typeof BroadcastChannel === 'function') {\n if (BroadcastChannel._pubkey) {\n throw new Error('BroadcastChannel: Do not overwrite window.BroadcastChannel with this module, this is not a polyfill');\n }\n return true;\n } else {\n return false;\n }\n}\nexport function averageResponseTime() {\n return 150;\n}\nexport var NativeMethod = {\n create: create,\n close: close,\n onMessage: onMessage,\n postMessage: postMessage,\n canBeUsed: canBeUsed,\n type: type,\n averageResponseTime: averageResponseTime,\n microSeconds: microSeconds\n};","/**\n * this is a set which automatically forgets\n * a given entry when a new entry is set and the ttl\n * of the old one is over\n */\nexport class ObliviousSet {\n ttl;\n map = new Map();\n /**\n * Creating calls to setTimeout() is expensive,\n * so we only do that if there is not timeout already open.\n */\n _to = false;\n constructor(ttl) {\n this.ttl = ttl;\n }\n has(value) {\n return this.map.has(value);\n }\n add(value) {\n this.map.set(value, now());\n /**\n * When a new value is added,\n * start the cleanup at the next tick\n * to not block the cpu for more important stuff\n * that might happen.\n */\n if (!this._to) {\n this._to = true;\n setTimeout(() => {\n this._to = false;\n removeTooOldValues(this);\n }, 0);\n }\n }\n clear() {\n this.map.clear();\n }\n}\n/**\n * Removes all entries from the set\n * where the TTL has expired\n */\nexport function removeTooOldValues(obliviousSet) {\n const olderThen = now() - obliviousSet.ttl;\n const iterator = obliviousSet.map[Symbol.iterator]();\n /**\n * Because we can assume the new values are added at the bottom,\n * we start from the top and stop as soon as we reach a non-too-old value.\n */\n while (true) {\n const next = iterator.next().value;\n if (!next) {\n return; // no more elements\n }\n const value = next[0];\n const time = next[1];\n if (time < olderThen) {\n obliviousSet.map.delete(value);\n }\n else {\n // We reached a value that is not old enough\n return;\n }\n }\n}\nexport function now() {\n return Date.now();\n}\n//# sourceMappingURL=index.js.map","export function fillOptionsWithDefaults() {\n var originalOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var options = JSON.parse(JSON.stringify(originalOptions));\n\n // main\n if (typeof options.webWorkerSupport === 'undefined') options.webWorkerSupport = true;\n\n // indexed-db\n if (!options.idb) options.idb = {};\n // after this time the messages get deleted\n if (!options.idb.ttl) options.idb.ttl = 1000 * 45;\n if (!options.idb.fallbackInterval) options.idb.fallbackInterval = 150;\n // handles abrupt db onclose events.\n if (originalOptions.idb && typeof originalOptions.idb.onclose === 'function') options.idb.onclose = originalOptions.idb.onclose;\n\n // localstorage\n if (!options.localstorage) options.localstorage = {};\n if (!options.localstorage.removeTimeout) options.localstorage.removeTimeout = 1000 * 60;\n\n // custom methods\n if (originalOptions.methods) options.methods = originalOptions.methods;\n\n // node\n if (!options.node) options.node = {};\n if (!options.node.ttl) options.node.ttl = 1000 * 60 * 2; // 2 minutes;\n /**\n * On linux use 'ulimit -Hn' to get the limit of open files.\n * On ubuntu this was 4096 for me, so we use half of that as maxParallelWrites default.\n */\n if (!options.node.maxParallelWrites) options.node.maxParallelWrites = 2048;\n if (typeof options.node.useFastPath === 'undefined') options.node.useFastPath = true;\n return options;\n}","/**\n * this method uses indexeddb to store the messages\n * There is currently no observerAPI for idb\n * @link https://github.com/w3c/IndexedDB/issues/51\n * \n * When working on this, ensure to use these performance optimizations:\n * @link https://rxdb.info/slow-indexeddb.html\n */\n\nimport { sleep, randomInt, randomToken, microSeconds as micro, PROMISE_RESOLVED_VOID } from '../util.js';\nexport var microSeconds = micro;\nimport { ObliviousSet } from 'oblivious-set';\nimport { fillOptionsWithDefaults } from '../options.js';\nvar DB_PREFIX = 'pubkey.broadcast-channel-0-';\nvar OBJECT_STORE_ID = 'messages';\n\n/**\n * Use relaxed durability for faster performance on all transactions.\n * @link https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/\n */\nexport var TRANSACTION_SETTINGS = {\n durability: 'relaxed'\n};\nexport var type = 'idb';\nexport function getIdb() {\n if (typeof indexedDB !== 'undefined') return indexedDB;\n if (typeof window !== 'undefined') {\n if (typeof window.mozIndexedDB !== 'undefined') return window.mozIndexedDB;\n if (typeof window.webkitIndexedDB !== 'undefined') return window.webkitIndexedDB;\n if (typeof window.msIndexedDB !== 'undefined') return window.msIndexedDB;\n }\n return false;\n}\n\n/**\n * If possible, we should explicitly commit IndexedDB transactions\n * for better performance.\n * @link https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/\n */\nexport function commitIndexedDBTransaction(tx) {\n if (tx.commit) {\n tx.commit();\n }\n}\nexport function createDatabase(channelName) {\n var IndexedDB = getIdb();\n\n // create table\n var dbName = DB_PREFIX + channelName;\n\n /**\n * All IndexedDB databases are opened without version\n * because it is a bit faster, especially on firefox\n * @link http://nparashuram.com/IndexedDB/perf/#Open%20Database%20with%20version\n */\n var openRequest = IndexedDB.open(dbName);\n openRequest.onupgradeneeded = function (ev) {\n var db = ev.target.result;\n db.createObjectStore(OBJECT_STORE_ID, {\n keyPath: 'id',\n autoIncrement: true\n });\n };\n return new Promise(function (res, rej) {\n openRequest.onerror = function (ev) {\n return rej(ev);\n };\n openRequest.onsuccess = function () {\n res(openRequest.result);\n };\n });\n}\n\n/**\n * writes the new message to the database\n * so other readers can find it\n */\nexport function writeMessage(db, readerUuid, messageJson) {\n var time = Date.now();\n var writeObject = {\n uuid: readerUuid,\n time: time,\n data: messageJson\n };\n var tx = db.transaction([OBJECT_STORE_ID], 'readwrite', TRANSACTION_SETTINGS);\n return new Promise(function (res, rej) {\n tx.oncomplete = function () {\n return res();\n };\n tx.onerror = function (ev) {\n return rej(ev);\n };\n var objectStore = tx.objectStore(OBJECT_STORE_ID);\n objectStore.add(writeObject);\n commitIndexedDBTransaction(tx);\n });\n}\nexport function getAllMessages(db) {\n var tx = db.transaction(OBJECT_STORE_ID, 'readonly', TRANSACTION_SETTINGS);\n var objectStore = tx.objectStore(OBJECT_STORE_ID);\n var ret = [];\n return new Promise(function (res) {\n objectStore.openCursor().onsuccess = function (ev) {\n var cursor = ev.target.result;\n if (cursor) {\n ret.push(cursor.value);\n //alert(\"Name for SSN \" + cursor.key + \" is \" + cursor.value.name);\n cursor[\"continue\"]();\n } else {\n commitIndexedDBTransaction(tx);\n res(ret);\n }\n };\n });\n}\nexport function getMessagesHigherThan(db, lastCursorId) {\n var tx = db.transaction(OBJECT_STORE_ID, 'readonly', TRANSACTION_SETTINGS);\n var objectStore = tx.objectStore(OBJECT_STORE_ID);\n var ret = [];\n var keyRangeValue = IDBKeyRange.bound(lastCursorId + 1, Infinity);\n\n /**\n * Optimization shortcut,\n * if getAll() can be used, do not use a cursor.\n * @link https://rxdb.info/slow-indexeddb.html\n */\n if (objectStore.getAll) {\n var getAllRequest = objectStore.getAll(keyRangeValue);\n return new Promise(function (res, rej) {\n getAllRequest.onerror = function (err) {\n return rej(err);\n };\n getAllRequest.onsuccess = function (e) {\n res(e.target.result);\n };\n });\n }\n function openCursor() {\n // Occasionally Safari will fail on IDBKeyRange.bound, this\n // catches that error, having it open the cursor to the first\n // item. When it gets data it will advance to the desired key.\n try {\n keyRangeValue = IDBKeyRange.bound(lastCursorId + 1, Infinity);\n return objectStore.openCursor(keyRangeValue);\n } catch (e) {\n return objectStore.openCursor();\n }\n }\n return new Promise(function (res, rej) {\n var openCursorRequest = openCursor();\n openCursorRequest.onerror = function (err) {\n return rej(err);\n };\n openCursorRequest.onsuccess = function (ev) {\n var cursor = ev.target.result;\n if (cursor) {\n if (cursor.value.id < lastCursorId + 1) {\n cursor[\"continue\"](lastCursorId + 1);\n } else {\n ret.push(cursor.value);\n cursor[\"continue\"]();\n }\n } else {\n commitIndexedDBTransaction(tx);\n res(ret);\n }\n };\n });\n}\nexport function removeMessagesById(channelState, ids) {\n if (channelState.closed) {\n return Promise.resolve([]);\n }\n var tx = channelState.db.transaction(OBJECT_STORE_ID, 'readwrite', TRANSACTION_SETTINGS);\n var objectStore = tx.objectStore(OBJECT_STORE_ID);\n return Promise.all(ids.map(function (id) {\n var deleteRequest = objectStore[\"delete\"](id);\n return new Promise(function (res) {\n deleteRequest.onsuccess = function () {\n return res();\n };\n });\n }));\n}\nexport function getOldMessages(db, ttl) {\n var olderThen = Date.now() - ttl;\n var tx = db.transaction(OBJECT_STORE_ID, 'readonly', TRANSACTION_SETTINGS);\n var objectStore = tx.objectStore(OBJECT_STORE_ID);\n var ret = [];\n return new Promise(function (res) {\n objectStore.openCursor().onsuccess = function (ev) {\n var cursor = ev.target.result;\n if (cursor) {\n var msgObk = cursor.value;\n if (msgObk.time < olderThen) {\n ret.push(msgObk);\n //alert(\"Name for SSN \" + cursor.key + \" is \" + cursor.value.name);\n cursor[\"continue\"]();\n } else {\n // no more old messages,\n commitIndexedDBTransaction(tx);\n res(ret);\n }\n } else {\n res(ret);\n }\n };\n });\n}\nexport function cleanOldMessages(channelState) {\n return getOldMessages(channelState.db, channelState.options.idb.ttl).then(function (tooOld) {\n return removeMessagesById(channelState, tooOld.map(function (msg) {\n return msg.id;\n }));\n });\n}\nexport function create(channelName, options) {\n options = fillOptionsWithDefaults(options);\n return createDatabase(channelName).then(function (db) {\n var state = {\n closed: false,\n lastCursorId: 0,\n channelName: channelName,\n options: options,\n uuid: randomToken(),\n /**\n * emittedMessagesIds\n * contains all messages that have been emitted before\n * @type {ObliviousSet}\n */\n eMIs: new ObliviousSet(options.idb.ttl * 2),\n // ensures we do not read messages in parallel\n writeBlockPromise: PROMISE_RESOLVED_VOID,\n messagesCallback: null,\n readQueuePromises: [],\n db: db\n };\n\n /**\n * Handle abrupt closes that do not originate from db.close().\n * This could happen, for example, if the underlying storage is\n * removed or if the user clears the database in the browser's\n * history preferences.\n */\n db.onclose = function () {\n state.closed = true;\n if (options.idb.onclose) options.idb.onclose();\n };\n\n /**\n * if service-workers are used,\n * we have no 'storage'-event if they post a message,\n * therefore we also have to set an interval\n */\n _readLoop(state);\n return state;\n });\n}\nfunction _readLoop(state) {\n if (state.closed) return;\n readNewMessages(state).then(function () {\n return sleep(state.options.idb.fallbackInterval);\n }).then(function () {\n return _readLoop(state);\n });\n}\nfunction _filterMessage(msgObj, state) {\n if (msgObj.uuid === state.uuid) return false; // send by own\n if (state.eMIs.has(msgObj.id)) return false; // already emitted\n if (msgObj.data.time < state.messagesCallbackTime) return false; // older then onMessageCallback\n return true;\n}\n\n/**\n * reads all new messages from the database and emits them\n */\nfunction readNewMessages(state) {\n // channel already closed\n if (state.closed) return PROMISE_RESOLVED_VOID;\n\n // if no one is listening, we do not need to scan for new messages\n if (!state.messagesCallback) return PROMISE_RESOLVED_VOID;\n return getMessagesHigherThan(state.db, state.lastCursorId).then(function (newerMessages) {\n var useMessages = newerMessages\n /**\n * there is a bug in iOS where the msgObj can be undefined sometimes\n * so we filter them out\n * @link https://github.com/pubkey/broadcast-channel/issues/19\n */.filter(function (msgObj) {\n return !!msgObj;\n }).map(function (msgObj) {\n if (msgObj.id > state.lastCursorId) {\n state.lastCursorId = msgObj.id;\n }\n return msgObj;\n }).filter(function (msgObj) {\n return _filterMessage(msgObj, state);\n }).sort(function (msgObjA, msgObjB) {\n return msgObjA.time - msgObjB.time;\n }); // sort by time\n useMessages.forEach(function (msgObj) {\n if (state.messagesCallback) {\n state.eMIs.add(msgObj.id);\n state.messagesCallback(msgObj.data);\n }\n });\n return PROMISE_RESOLVED_VOID;\n });\n}\nexport function close(channelState) {\n channelState.closed = true;\n channelState.db.close();\n}\nexport function postMessage(channelState, messageJson) {\n channelState.writeBlockPromise = channelState.writeBlockPromise.then(function () {\n return writeMessage(channelState.db, channelState.uuid, messageJson);\n }).then(function () {\n if (randomInt(0, 10) === 0) {\n /* await (do not await) */\n cleanOldMessages(channelState);\n }\n });\n return channelState.writeBlockPromise;\n}\nexport function onMessage(channelState, fn, time) {\n channelState.messagesCallbackTime = time;\n channelState.messagesCallback = fn;\n readNewMessages(channelState);\n}\nexport function canBeUsed() {\n return !!getIdb();\n}\nexport function averageResponseTime(options) {\n return options.idb.fallbackInterval * 2;\n}\nexport var IndexedDBMethod = {\n create: create,\n close: close,\n onMessage: onMessage,\n postMessage: postMessage,\n canBeUsed: canBeUsed,\n type: type,\n averageResponseTime: averageResponseTime,\n microSeconds: microSeconds\n};","/**\n * A localStorage-only method which uses localstorage and its 'storage'-event\n * This does not work inside webworkers because they have no access to localstorage\n * This is basically implemented to support IE9 or your grandmother's toaster.\n * @link https://caniuse.com/#feat=namevalue-storage\n * @link https://caniuse.com/#feat=indexeddb\n */\n\nimport { ObliviousSet } from 'oblivious-set';\nimport { fillOptionsWithDefaults } from '../options.js';\nimport { sleep, randomToken, microSeconds as micro } from '../util.js';\nexport var microSeconds = micro;\nvar KEY_PREFIX = 'pubkey.broadcastChannel-';\nexport var type = 'localstorage';\n\n/**\n * copied from crosstab\n * @link https://github.com/tejacques/crosstab/blob/master/src/crosstab.js#L32\n */\nexport function getLocalStorage() {\n var localStorage;\n if (typeof window === 'undefined') return null;\n try {\n localStorage = window.localStorage;\n localStorage = window['ie8-eventlistener/storage'] || window.localStorage;\n } catch (e) {\n // New versions of Firefox throw a Security exception\n // if cookies are disabled. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1028153\n }\n return localStorage;\n}\nexport function storageKey(channelName) {\n return KEY_PREFIX + channelName;\n}\n\n/**\n* writes the new message to the storage\n* and fires the storage-event so other readers can find it\n*/\nexport function postMessage(channelState, messageJson) {\n return new Promise(function (res) {\n sleep().then(function () {\n var key = storageKey(channelState.channelName);\n var writeObj = {\n token: randomToken(),\n time: Date.now(),\n data: messageJson,\n uuid: channelState.uuid\n };\n var value = JSON.stringify(writeObj);\n getLocalStorage().setItem(key, value);\n\n /**\n * StorageEvent does not fire the 'storage' event\n * in the window that changes the state of the local storage.\n * So we fire it manually\n */\n var ev = document.createEvent('Event');\n ev.initEvent('storage', true, true);\n ev.key = key;\n ev.newValue = value;\n window.dispatchEvent(ev);\n res();\n });\n });\n}\nexport function addStorageEventListener(channelName, fn) {\n var key = storageKey(channelName);\n var listener = function listener(ev) {\n if (ev.key === key) {\n fn(JSON.parse(ev.newValue));\n }\n };\n window.addEventListener('storage', listener);\n return listener;\n}\nexport function removeStorageEventListener(listener) {\n window.removeEventListener('storage', listener);\n}\nexport function create(channelName, options) {\n options = fillOptionsWithDefaults(options);\n if (!canBeUsed()) {\n throw new Error('BroadcastChannel: localstorage cannot be used');\n }\n var uuid = randomToken();\n\n /**\n * eMIs\n * contains all messages that have been emitted before\n * @type {ObliviousSet}\n */\n var eMIs = new ObliviousSet(options.localstorage.removeTimeout);\n var state = {\n channelName: channelName,\n uuid: uuid,\n eMIs: eMIs // emittedMessagesIds\n };\n\n state.listener = addStorageEventListener(channelName, function (msgObj) {\n if (!state.messagesCallback) return; // no listener\n if (msgObj.uuid === uuid) return; // own message\n if (!msgObj.token || eMIs.has(msgObj.token)) return; // already emitted\n if (msgObj.data.time && msgObj.data.time < state.messagesCallbackTime) return; // too old\n\n eMIs.add(msgObj.token);\n state.messagesCallback(msgObj.data);\n });\n return state;\n}\nexport function close(channelState) {\n removeStorageEventListener(channelState.listener);\n}\nexport function onMessage(channelState, fn, time) {\n channelState.messagesCallbackTime = time;\n channelState.messagesCallback = fn;\n}\nexport function canBeUsed() {\n var ls = getLocalStorage();\n if (!ls) return false;\n try {\n var key = '__broadcastchannel_check';\n ls.setItem(key, 'works');\n ls.removeItem(key);\n } catch (e) {\n // Safari 10 in private mode will not allow write access to local\n // storage and fail with a QuotaExceededError. See\n // https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API#Private_Browsing_Incognito_modes\n return false;\n }\n return true;\n}\nexport function averageResponseTime() {\n var defaultTime = 120;\n var userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('safari') && !userAgent.includes('chrome')) {\n // safari is much slower so this time is higher\n return defaultTime * 2;\n }\n return defaultTime;\n}\nexport var LocalstorageMethod = {\n create: create,\n close: close,\n onMessage: onMessage,\n postMessage: postMessage,\n canBeUsed: canBeUsed,\n type: type,\n averageResponseTime: averageResponseTime,\n microSeconds: microSeconds\n};","import { microSeconds as micro } from '../util.js';\nexport var microSeconds = micro;\nexport var type = 'simulate';\nvar SIMULATE_CHANNELS = new Set();\nexport function create(channelName) {\n var state = {\n time: microSeconds(),\n name: channelName,\n messagesCallback: null\n };\n SIMULATE_CHANNELS.add(state);\n return state;\n}\nexport function close(channelState) {\n SIMULATE_CHANNELS[\"delete\"](channelState);\n}\nexport var SIMULATE_DELAY_TIME = 5;\nexport function postMessage(channelState, messageJson) {\n return new Promise(function (res) {\n return setTimeout(function () {\n var channelArray = Array.from(SIMULATE_CHANNELS);\n channelArray.forEach(function (channel) {\n if (channel.name === channelState.name &&\n // has same name\n channel !== channelState &&\n // not own channel\n !!channel.messagesCallback &&\n // has subscribers\n channel.time < messageJson.time // channel not created after postMessage() call\n ) {\n channel.messagesCallback(messageJson);\n }\n });\n res();\n }, SIMULATE_DELAY_TIME);\n });\n}\nexport function onMessage(channelState, fn) {\n channelState.messagesCallback = fn;\n}\nexport function canBeUsed() {\n return true;\n}\nexport function averageResponseTime() {\n return SIMULATE_DELAY_TIME;\n}\nexport var SimulateMethod = {\n create: create,\n close: close,\n onMessage: onMessage,\n postMessage: postMessage,\n canBeUsed: canBeUsed,\n type: type,\n averageResponseTime: averageResponseTime,\n microSeconds: microSeconds\n};","import { NativeMethod } from './methods/native.js';\nimport { IndexedDBMethod } from './methods/indexed-db.js';\nimport { LocalstorageMethod } from './methods/localstorage.js';\nimport { SimulateMethod } from './methods/simulate.js';\n// the line below will be removed from es5/browser builds\n\n// order is important\nvar METHODS = [NativeMethod,\n// fastest\nIndexedDBMethod, LocalstorageMethod];\nexport function chooseMethod(options) {\n var chooseMethods = [].concat(options.methods, METHODS).filter(Boolean);\n\n // the line below will be removed from es5/browser builds\n\n // directly chosen\n if (options.type) {\n if (options.type === 'simulate') {\n // only use simulate-method if directly chosen\n return SimulateMethod;\n }\n var ret = chooseMethods.find(function (m) {\n return m.type === options.type;\n });\n if (!ret) throw new Error('method-type ' + options.type + ' not found');else return ret;\n }\n\n /**\n * if no webworker support is needed,\n * remove idb from the list so that localstorage will be chosen\n */\n if (!options.webWorkerSupport) {\n chooseMethods = chooseMethods.filter(function (m) {\n return m.type !== 'idb';\n });\n }\n var useMethod = chooseMethods.find(function (method) {\n return method.canBeUsed();\n });\n if (!useMethod) {\n throw new Error(\"No usable method found in \" + JSON.stringify(METHODS.map(function (m) {\n return m.type;\n })));\n } else {\n return useMethod;\n }\n}","import { isPromise, PROMISE_RESOLVED_FALSE, PROMISE_RESOLVED_VOID } from './util.js';\nimport { chooseMethod } from './method-chooser.js';\nimport { fillOptionsWithDefaults } from './options.js';\n\n/**\n * Contains all open channels,\n * used in tests to ensure everything is closed.\n */\nexport var OPEN_BROADCAST_CHANNELS = new Set();\nvar lastId = 0;\nexport var BroadcastChannel = function BroadcastChannel(name, options) {\n // identifier of the channel to debug stuff\n this.id = lastId++;\n OPEN_BROADCAST_CHANNELS.add(this);\n this.name = name;\n if (ENFORCED_OPTIONS) {\n options = ENFORCED_OPTIONS;\n }\n this.options = fillOptionsWithDefaults(options);\n this.method = chooseMethod(this.options);\n\n // isListening\n this._iL = false;\n\n /**\n * _onMessageListener\n * setting onmessage twice,\n * will overwrite the first listener\n */\n this._onML = null;\n\n /**\n * _addEventListeners\n */\n this._addEL = {\n message: [],\n internal: []\n };\n\n /**\n * Unsent message promises\n * where the sending is still in progress\n * @type {Set}\n */\n this._uMP = new Set();\n\n /**\n * _beforeClose\n * array of promises that will be awaited\n * before the channel is closed\n */\n this._befC = [];\n\n /**\n * _preparePromise\n */\n this._prepP = null;\n _prepareChannel(this);\n};\n\n// STATICS\n\n/**\n * used to identify if someone overwrites\n * window.BroadcastChannel with this\n * See methods/native.js\n */\nBroadcastChannel._pubkey = true;\n\n/**\n * clears the tmp-folder if is node\n * @return {Promise} true if has run, false if not node\n */\nexport function clearNodeFolder(options) {\n options = fillOptionsWithDefaults(options);\n var method = chooseMethod(options);\n if (method.type === 'node') {\n return method.clearNodeFolder().then(function () {\n return true;\n });\n } else {\n return PROMISE_RESOLVED_FALSE;\n }\n}\n\n/**\n * if set, this method is enforced,\n * no mather what the options are\n */\nvar ENFORCED_OPTIONS;\nexport function enforceOptions(options) {\n ENFORCED_OPTIONS = options;\n}\n\n// PROTOTYPE\nBroadcastChannel.prototype = {\n postMessage: function postMessage(msg) {\n if (this.closed) {\n throw new Error('BroadcastChannel.postMessage(): ' + 'Cannot post message after channel has closed ' +\n /**\n * In the past when this error appeared, it was really hard to debug.\n * So now we log the msg together with the error so it at least\n * gives some clue about where in your application this happens.\n */\n JSON.stringify(msg));\n }\n return _post(this, 'message', msg);\n },\n postInternal: function postInternal(msg) {\n return _post(this, 'internal', msg);\n },\n set onmessage(fn) {\n var time = this.method.microSeconds();\n var listenObj = {\n time: time,\n fn: fn\n };\n _removeListenerObject(this, 'message', this._onML);\n if (fn && typeof fn === 'function') {\n this._onML = listenObj;\n _addListenerObject(this, 'message', listenObj);\n } else {\n this._onML = null;\n }\n },\n addEventListener: function addEventListener(type, fn) {\n var time = this.method.microSeconds();\n var listenObj = {\n time: time,\n fn: fn\n };\n _addListenerObject(this, type, listenObj);\n },\n removeEventListener: function removeEventListener(type, fn) {\n var obj = this._addEL[type].find(function (obj) {\n return obj.fn === fn;\n });\n _removeListenerObject(this, type, obj);\n },\n close: function close() {\n var _this = this;\n if (this.closed) {\n return;\n }\n OPEN_BROADCAST_CHANNELS[\"delete\"](this);\n this.closed = true;\n var awaitPrepare = this._prepP ? this._prepP : PROMISE_RESOLVED_VOID;\n this._onML = null;\n this._addEL.message = [];\n return awaitPrepare\n // wait until all current sending are processed\n .then(function () {\n return Promise.all(Array.from(_this._uMP));\n })\n // run before-close hooks\n .then(function () {\n return Promise.all(_this._befC.map(function (fn) {\n return fn();\n }));\n })\n // close the channel\n .then(function () {\n return _this.method.close(_this._state);\n });\n },\n get type() {\n return this.method.type;\n },\n get isClosed() {\n return this.closed;\n }\n};\n\n/**\n * Post a message over the channel\n * @returns {Promise} that resolved when the message sending is done\n */\nfunction _post(broadcastChannel, type, msg) {\n var time = broadcastChannel.method.microSeconds();\n var msgObj = {\n time: time,\n type: type,\n data: msg\n };\n var awaitPrepare = broadcastChannel._prepP ? broadcastChannel._prepP : PROMISE_RESOLVED_VOID;\n return awaitPrepare.then(function () {\n var sendPromise = broadcastChannel.method.postMessage(broadcastChannel._state, msgObj);\n\n // add/remove to unsent messages list\n broadcastChannel._uMP.add(sendPromise);\n sendPromise[\"catch\"]().then(function () {\n return broadcastChannel._uMP[\"delete\"](sendPromise);\n });\n return sendPromise;\n });\n}\nfunction _prepareChannel(channel) {\n var maybePromise = channel.method.create(channel.name, channel.options);\n if (isPromise(maybePromise)) {\n channel._prepP = maybePromise;\n maybePromise.then(function (s) {\n // used in tests to simulate slow runtime\n /*if (channel.options.prepareDelay) {\n await new Promise(res => setTimeout(res, this.options.prepareDelay));\n }*/\n channel._state = s;\n });\n } else {\n channel._state = maybePromise;\n }\n}\nfunction _hasMessageListeners(channel) {\n if (channel._addEL.message.length > 0) return true;\n if (channel._addEL.internal.length > 0) return true;\n return false;\n}\nfunction _addListenerObject(channel, type, obj) {\n channel._addEL[type].push(obj);\n _startListening(channel);\n}\nfunction _removeListenerObject(channel, type, obj) {\n channel._addEL[type] = channel._addEL[type].filter(function (o) {\n return o !== obj;\n });\n _stopListening(channel);\n}\nfunction _startListening(channel) {\n if (!channel._iL && _hasMessageListeners(channel)) {\n // someone is listening, start subscribing\n\n var listenerFn = function listenerFn(msgObj) {\n channel._addEL[msgObj.type].forEach(function (listenerObject) {\n if (msgObj.time >= listenerObject.time) {\n listenerObject.fn(msgObj.data);\n }\n });\n };\n var time = channel.method.microSeconds();\n if (channel._prepP) {\n channel._prepP.then(function () {\n channel._iL = true;\n channel.method.onMessage(channel._state, listenerFn, time);\n });\n } else {\n channel._iL = true;\n channel.method.onMessage(channel._state, listenerFn, time);\n }\n }\n}\nfunction _stopListening(channel) {\n if (channel._iL && !_hasMessageListeners(channel)) {\n // no one is listening, stop subscribing\n channel._iL = false;\n var time = channel.method.microSeconds();\n channel.method.onMessage(channel._state, null, time);\n }\n}"],"names":["isPromise","obj","PROMISE_RESOLVED_VOID","sleep","time","resolveWith","res","randomInt","min","max","randomToken","lastMs","microSeconds","ret","micro","type","create","channelName","state","msgEvent","close","channelState","postMessage","messageJson","err","onMessage","fn","canBeUsed","averageResponseTime","NativeMethod","ObliviousSet","ttl","__publicField","value","now","removeTooOldValues","obliviousSet","olderThen","iterator","next","fillOptionsWithDefaults","originalOptions","options","DB_PREFIX","OBJECT_STORE_ID","TRANSACTION_SETTINGS","getIdb","commitIndexedDBTransaction","tx","createDatabase","IndexedDB","dbName","openRequest","ev","db","rej","writeMessage","readerUuid","writeObject","objectStore","getMessagesHigherThan","lastCursorId","keyRangeValue","getAllRequest","e","openCursor","openCursorRequest","cursor","removeMessagesById","ids","id","deleteRequest","getOldMessages","msgObk","cleanOldMessages","tooOld","msg","_readLoop","readNewMessages","_filterMessage","msgObj","newerMessages","useMessages","msgObjA","msgObjB","IndexedDBMethod","KEY_PREFIX","getLocalStorage","localStorage","storageKey","key","writeObj","addStorageEventListener","listener","removeStorageEventListener","uuid","eMIs","ls","defaultTime","userAgent","LocalstorageMethod","SIMULATE_CHANNELS","SIMULATE_DELAY_TIME","channelArray","channel","SimulateMethod","METHODS","chooseMethod","chooseMethods","m","useMethod","method","OPEN_BROADCAST_CHANNELS","lastId","BroadcastChannel","name","ENFORCED_OPTIONS","_prepareChannel","_post","listenObj","_removeListenerObject","_addListenerObject","_this","awaitPrepare","broadcastChannel","sendPromise","maybePromise","s","_hasMessageListeners","_startListening","o","_stopListening","listenerFn","listenerObject"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8]}