@nhtio/swarm 1.20250424.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/lib/common.ts","../src/lib/symbols.ts","../src/lib/logger.ts","../node_modules/.pnpm/tiny-emitter@2.1.0/node_modules/tiny-emitter/index.js","../src/lib/emitter.ts","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/util.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/methods/native.js","../node_modules/.pnpm/oblivious-set@1.4.0/node_modules/oblivious-set/dist/esm/src/index.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/options.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/methods/indexed-db.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/methods/localstorage.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/methods/simulate.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/method-chooser.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/broadcast-channel.js","../node_modules/.pnpm/unload@2.4.1/node_modules/unload/dist/es/browser.js","../node_modules/.pnpm/unload@2.4.1/node_modules/unload/dist/es/node.js","../node_modules/.pnpm/unload@2.4.1/node_modules/unload/dist/es/index.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/leader-election-util.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/leader-election-web-lock.js","../node_modules/.pnpm/broadcast-channel@7.1.0/node_modules/broadcast-channel/dist/esbrowser/leader-election.js","../node_modules/.pnpm/@ungap+structured-clone@1.3.0/node_modules/@ungap/structured-clone/esm/types.js","../node_modules/.pnpm/@ungap+structured-clone@1.3.0/node_modules/@ungap/structured-clone/esm/deserialize.js","../node_modules/.pnpm/@ungap+structured-clone@1.3.0/node_modules/@ungap/structured-clone/esm/serialize.js","../src/lib/class_swarm.ts","../src/index.ts"],"sourcesContent":["/// <reference lib=\"webworker\" />\n/**\n * Returns true if the environment is a browser tab\n * @returns {boolean} - true if the environment is a browser tab\n */\nexport const isTabEnvironment = (): boolean => {\n return (\n 'undefined' !== typeof window &&\n 'undefined' !== typeof window.navigator &&\n 'undefined' !== typeof window.navigator.userAgent\n )\n}\n\n/**\n * Returns true if the environment is a service worker\n * @returns {boolean} - true if the environment is a service worker\n */\nexport const isWorkerEnvironment = (): boolean => {\n return 'undefined' !== typeof ServiceWorkerGlobalScope && self instanceof ServiceWorkerGlobalScope\n}\n\n/**\n * Returns true if the environment is an SSR (Server-Side Rendering) environment\n * @returns {boolean} - true if the environment is an SSR environment\n */\nexport const isSsrEnvironment = (): boolean => {\n return (\n 'undefined' !== typeof process &&\n 'undefined' !== typeof process.versions &&\n !!process.versions.node\n )\n}\n\n/**\n * Return true if the environment is a Safari browser\n * @returns {boolean} - true if the environment is a Safari browser\n */\nexport const isSafari = (): boolean => {\n return (\n 'undefined' !== typeof window &&\n 'undefined' !== typeof window.navigator &&\n window.navigator.userAgent.includes('Safari') &&\n !window.navigator.userAgent.includes('Chrome')\n )\n}\n\nfunction isGlobalObject(obj: unknown): obj is Window | WorkerGlobalScope {\n return 'object' === typeof obj && obj !== null && 'Math' in obj\n}\n\n/**\n * Return the global object for the current environment\n * @returns An object representing the global scope\n */\nexport const getGlobal = (): Window | WorkerGlobalScope => {\n const potential = [\n 'undefined' !== typeof window ? window : undefined,\n 'undefined' !== typeof self ? self : undefined,\n 'undefined' !== typeof global ? global : undefined,\n ]\n const possible = potential.filter((o) => isGlobalObject(o))\n if (possible.length === 0) {\n throw new Error('No global object found')\n }\n return possible[0]\n}\n\nexport const makeRandomId = (length: number): string => {\n const global = getGlobal()\n const array = new Uint8Array(length)\n if ('undefined' !== typeof global.crypto && 'function' === typeof global.crypto.getRandomValues) {\n global.crypto.getRandomValues(array)\n } else {\n // Fallback for environments without crypto.getRandomValues\n for (let i = 0; i < length; i++) {\n array[i] = Math.floor(Math.random() * 256)\n }\n }\n return Array.from(array)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('')\n}\n","export const FOR_BROWSER: unique symbol = Symbol('nhtio.swarm.browser')\nexport const FOR_WORKER: unique symbol = Symbol('nhtio.swarm.worker')\nexport const FOR_SWARM: unique symbol = Symbol('nhtio.swarm')\nexport const FOR_LOGGER: unique symbol = Symbol('nhtio.swarm.logger')\nexport const CAPTURE_REJECTION_SYMBOL: unique symbol = Symbol('nhtio.swarm.emitter.rejection')\n","import * as common from './common'\nimport { FOR_LOGGER } from './symbols'\n\nconst LogLevelStyles = {\n EMERG: (text: string) => [\n `%c${text}`,\n 'color: white; background: #FF0000; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n ALERT: (text: string) => [\n `%c${text}`,\n 'color: white; background: #FF5555; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n CRIT: (text: string) => [\n `%c${text}`,\n 'color: white; background: #FF6F00; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n ERROR: (text: string) => [\n `%c${text}`,\n 'color: black; background: #FFA500; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n WARNING: (text: string) => [\n `%c${text}`,\n 'color: black; background: #FFD700; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n NOTICE: (text: string) => [\n `%c${text}`,\n 'color: black; background: #00CED1; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n INFO: (text: string) => [\n `%c${text}`,\n 'color: white; background: #1E90FF; font-weight: normal; padding: 2px 6px; border-radius: 2px',\n ],\n DEBUG: (text: string) => [`%c${text}`, 'color: #AAAAAA; font-style: italic; padding: 2px 6px'],\n}\n\nexport enum LogLevelValues {\n EMERG = 0,\n ALERT = 1,\n CRIT = 2,\n ERROR = 3,\n WARNING = 4,\n NOTICE = 5,\n INFO = 6,\n DEBUG = 7,\n}\n\nexport type LogLevel = keyof typeof LogLevelStyles | Lowercase<keyof typeof LogLevelStyles>\n\nconst EnvironmentStyles = {\n BROWSER: (text: string) => [\n `%c${text}`,\n 'color: white; background: #3949AB; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n WORKER: (text: string) => [\n `%c${text}`,\n 'color: white; background: #5E35B1; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n SSR: (text: string) => [\n `%c${text}`,\n 'color: white; background: #607D8B; font-weight: bold; padding: 2px 6px; border-radius: 2px',\n ],\n UNKNOWN: (text: string) => [\n `%c${text}`,\n 'color: black; background: #E0E0E0; font-weight: bold; font-style: italic; padding: 2px 6px; border-radius: 2px',\n ],\n}\n\nexport type Environment = keyof typeof EnvironmentStyles | Lowercase<keyof typeof EnvironmentStyles>\n\ntype ConsoleMethod = 'info' | 'warn' | 'error' | 'debug'\n\nenum LogLevelConsoleMethods {\n EMERG = 'error',\n ALERT = 'error',\n CRIT = 'error',\n ERROR = 'error',\n WARNING = 'warn',\n NOTICE = 'info',\n INFO = 'info',\n DEBUG = 'debug',\n}\n\nexport class Logger {\n readonly #isBrowser: boolean\n readonly #isWorker: boolean\n readonly #isSsr: boolean\n readonly #isSafari: boolean\n readonly #prefix?: string\n #level: LogLevelValues\n\n constructor(level: LogLevelValues = LogLevelValues.ERROR) {\n this.#level = level\n this.#isBrowser = common.isTabEnvironment()\n this.#isWorker = common.isWorkerEnvironment()\n this.#isSsr = common.isSsrEnvironment()\n this.#isSafari = common.isSafari()\n }\n\n #getEnvironmentArgs(): [string, string] {\n let env: Environment\n if (this.#isBrowser) {\n env = 'BROWSER'\n } else if (this.#isWorker) {\n env = 'WORKER'\n } else if (this.#isSsr) {\n env = 'SSR'\n } else {\n env = 'UNKNOWN'\n }\n return EnvironmentStyles[env](env) as [string, string]\n }\n\n #output(level: LogLevel, ...args: any[]) {\n level = level.toUpperCase() as LogLevel\n const levelValue = LogLevelValues[level as keyof typeof LogLevelValues]\n const currentLevelValue = LogLevelValues[this.#level as unknown as keyof typeof LogLevelValues]\n if (levelValue > currentLevelValue) return\n\n const [envText, envStyle] = this.#getEnvironmentArgs()\n const [levelText, levelStyle] = LogLevelStyles[level as keyof typeof LogLevelStyles](level)\n\n const formattedArgs = [\n `${envText}${levelText}${this.#prefix ? `%c ${this.#prefix}` : ''}`,\n envStyle,\n levelStyle,\n ]\n if (this.#prefix) formattedArgs.push('color: inherit')\n formattedArgs.push(...args)\n while (formattedArgs[formattedArgs.length - 1] === undefined) formattedArgs.pop()\n\n if (this.#isSafari || this.#isSsr) {\n console[\n LogLevelConsoleMethods[level as keyof typeof LogLevelConsoleMethods] as ConsoleMethod\n ](...formattedArgs)\n } else {\n console.groupCollapsed(...formattedArgs)\n console.debug(new Error('stack').stack!.split('\\n').slice(3).join('\\n'))\n console.groupEnd()\n }\n }\n\n get level() {\n return LogLevelValues[this.#level] as keyof typeof LogLevelValues\n }\n\n set level(level: LogLevel) {\n this.#level = LogLevelValues[level.toUpperCase() as keyof typeof LogLevelValues]\n }\n\n EMERG(...args: any[]) {\n this.#output('EMERG', ...args)\n }\n ALERT(...args: any[]) {\n this.#output('ALERT', ...args)\n }\n CRIT(...args: any[]) {\n this.#output('CRIT', ...args)\n }\n ERROR(...args: any[]) {\n this.#output('ERROR', ...args)\n }\n WARNING(...args: any[]) {\n this.#output('WARNING', ...args)\n }\n NOTICE(...args: any[]) {\n this.#output('NOTICE', ...args)\n }\n INFO(...args: any[]) {\n this.#output('INFO', ...args)\n }\n DEBUG(...args: any[]) {\n this.#output('DEBUG', ...args)\n }\n\n emerg(...args: any[]) {\n this.#output('EMERG', ...args)\n }\n alert(...args: any[]) {\n this.#output('ALERT', ...args)\n }\n crit(...args: any[]) {\n this.#output('CRIT', ...args)\n }\n error(...args: any[]) {\n this.#output('ERROR', ...args)\n }\n warning(...args: any[]) {\n this.#output('WARNING', ...args)\n }\n notice(...args: any[]) {\n this.#output('NOTICE', ...args)\n }\n info(...args: any[]) {\n this.#output('INFO', ...args)\n }\n debug(...args: any[]) {\n this.#output('DEBUG', ...args)\n }\n}\n\nconst getLogLevel = () => {\n const glbl = common.getGlobal()\n const lvl =\n 'string' === typeof glbl.SWARM_LOG_LEVEL &&\n (glbl.SWARM_LOG_LEVEL.toUpperCase() as LogLevel) in LogLevelValues\n ? glbl.SWARM_LOG_LEVEL\n : LogLevelValues.ERROR\n return lvl\n}\n\nexport const getLogger = () => {\n const glbl = common.getGlobal()\n if ('undefined' !== typeof glbl[FOR_LOGGER] && glbl[FOR_LOGGER] instanceof Logger) {\n return glbl[FOR_LOGGER]\n }\n const lvlName = getLogLevel()\n const lvl = LogLevelValues[lvlName as keyof typeof LogLevelValues]\n const logger = new Logger(lvl)\n glbl[FOR_LOGGER] = logger\n return logger\n}\n\n/**\n * Sets the log level for the logger.\n * @param level - The log level to set. Can be one of the following:\n * - `EMERG` or `emerg`\n * - `ALERT` or `alert`\n * - `CRIT` or `crit`\n * - `ERROR` or `error`\n * - `WARNING` or `warning`\n * - `NOTICE` or `notice`\n * - `INFO` or `info`\n * - `DEBUG` or `debug`\n *\n * @remarks You can also set `window.SWARM_LOG_LEVEL` or `globalThis.SWARM_LOG_LEVEL` to the same values to set the log level globally before initializing any of the Swarm modules.\n */\nexport const setLogLevel = (level: LogLevel) => {\n const glbl = common.getGlobal()\n const logger = getLogger()\n glbl.SWARM_LOG_LEVEL = level.toUpperCase() as LogLevel\n logger.level = level\n}\n","function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","import { TinyEmitter } from 'tiny-emitter'\n\n/**\n * A map from event-names to the tuple of arguments\n * that listeners for that event will receive.\n */\nexport interface TypedEventMap {\n [event: string]: any[]\n}\n\n/**\n * A strongly-typed Tiny Event Emitter.\n *\n * @template Events\n * key = event name,\n * value = tuple type of that event’s arguments\n */\nexport class TypedEventEmitter<Events extends TypedEventMap = TypedEventMap> extends TinyEmitter {\n /**\n * Subscribe to an event with a typed listener.\n */\n on<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void, ctx?: any): this {\n super.on(event as string, listener as any, ctx)\n return this\n }\n\n /**\n * Subscribe once to an event.\n */\n once<E extends keyof Events>(event: E, listener: (...args: Events[E]) => void, ctx?: any): this {\n super.once(event as string, listener as any, ctx)\n return this\n }\n\n /**\n * Emit an event, enforcing that the args match Events[E].\n */\n emit<E extends keyof Events>(event: E, ...args: Events[E]): this {\n super.emit(event as string, ...(args as any))\n return this\n }\n\n /**\n * Remove a listener.\n */\n off<E extends keyof Events>(event: E, listener?: (...args: Events[E]) => void): this {\n super.off(event as string, listener as any)\n return this\n }\n}\n","/**\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 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 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<Promise>}\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<boolean>} 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}","/* global WorkerGlobalScope */\n\nexport function addBrowser(fn) {\n if (typeof WorkerGlobalScope === 'function' && self instanceof WorkerGlobalScope) {\n /**\n * Because killing a worker does directly stop the excution\n * of the code, our only chance is to overwrite the close function\n * which could work some times.\n * @link https://stackoverflow.com/q/72903255/3443137\n */\n var oldClose = self.close.bind(self);\n self.close = function () {\n fn();\n return oldClose();\n };\n } else {\n /**\n * if we are on react-native, there is no window.addEventListener\n * @link https://github.com/pubkey/unload/issues/6\n */\n if (typeof window.addEventListener !== 'function') {\n return;\n }\n\n /**\n * for normal browser-windows, we use the beforeunload-event\n */\n window.addEventListener('beforeunload', function () {\n fn();\n }, true);\n\n /**\n * for iframes, we have to use the unload-event\n * @link https://stackoverflow.com/q/47533670/3443137\n */\n window.addEventListener('unload', function () {\n fn();\n }, true);\n }\n\n /**\n * TODO add fallback for safari-mobile\n * @link https://stackoverflow.com/a/26193516/3443137\n */\n}","export function addNode(fn) {\n process.on('exit', function () {\n return fn();\n });\n\n /**\n * on the following events,\n * the process will not end if there are\n * event-handlers attached,\n * therefore we have to call process.exit()\n */\n process.on('beforeExit', function () {\n return fn().then(function () {\n return process.exit();\n });\n });\n // catches ctrl+c event\n process.on('SIGINT', function () {\n return fn().then(function () {\n return process.exit();\n });\n });\n // catches uncaught exceptions\n process.on('uncaughtException', function (err) {\n return fn().then(function () {\n console.trace(err);\n process.exit(101);\n });\n });\n}","import { addBrowser } from './browser.js';\nimport { addNode } from './node.js';\n\n/**\n * Use the code directly to prevent import problems\n * with the detect-node package.\n * @link https://github.com/iliakan/detect-node/blob/master/index.js\n */\nvar isNode = Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\nvar USE_METHOD = isNode ? addNode : addBrowser;\nvar LISTENERS = new Set();\nvar startedListening = false;\nfunction startListening() {\n if (startedListening) {\n return;\n }\n startedListening = true;\n USE_METHOD(runAll);\n}\nexport function add(fn) {\n startListening();\n if (typeof fn !== 'function') {\n throw new Error('Listener is no function');\n }\n LISTENERS.add(fn);\n var addReturn = {\n remove: function remove() {\n return LISTENERS[\"delete\"](fn);\n },\n run: function run() {\n LISTENERS[\"delete\"](fn);\n return fn();\n }\n };\n return addReturn;\n}\nexport function runAll() {\n var promises = [];\n LISTENERS.forEach(function (fn) {\n promises.push(fn());\n LISTENERS[\"delete\"](fn);\n });\n return Promise.all(promises);\n}\nexport function removeAll() {\n LISTENERS.clear();\n}\nexport function getSize() {\n return LISTENERS.size;\n}","import { add as unloadAdd } from 'unload';\n\n/**\n * sends and internal message over the broadcast-channel\n */\nexport function sendLeaderMessage(leaderElector, action) {\n var msgJson = {\n context: 'leader',\n action: action,\n token: leaderElector.token\n };\n return leaderElector.broadcastChannel.postInternal(msgJson);\n}\nexport function beLeader(leaderElector) {\n leaderElector.isLeader = true;\n leaderElector._hasLeader = true;\n var unloadFn = unloadAdd(function () {\n return leaderElector.die();\n });\n leaderElector._unl.push(unloadFn);\n var isLeaderListener = function isLeaderListener(msg) {\n if (msg.context === 'leader' && msg.action === 'apply') {\n sendLeaderMessage(leaderElector, 'tell');\n }\n if (msg.context === 'leader' && msg.action === 'tell' && !leaderElector._dpLC) {\n /**\n * another instance is also leader!\n * This can happen on rare events\n * like when the CPU is at 100% for long time\n * or the tabs are open very long and the browser throttles them.\n * @link https://github.com/pubkey/broadcast-channel/issues/414\n * @link https://github.com/pubkey/broadcast-channel/issues/385\n */\n leaderElector._dpLC = true;\n leaderElector._dpL(); // message the lib user so the app can handle the problem\n sendLeaderMessage(leaderElector, 'tell'); // ensure other leader also knows the problem\n }\n };\n leaderElector.broadcastChannel.addEventListener('internal', isLeaderListener);\n leaderElector._lstns.push(isLeaderListener);\n return sendLeaderMessage(leaderElector, 'tell');\n}","import { randomToken } from './util.js';\nimport { sendLeaderMessage, beLeader } from './leader-election-util.js';\n\n/**\n * A faster version of the leader elector that uses the WebLock API\n * @link https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API\n */\nexport var LeaderElectionWebLock = function LeaderElectionWebLock(broadcastChannel, options) {\n var _this = this;\n this.broadcastChannel = broadcastChannel;\n broadcastChannel._befC.push(function () {\n return _this.die();\n });\n this._options = options;\n this.isLeader = false;\n this.isDead = false;\n this.token = randomToken();\n this._lstns = [];\n this._unl = [];\n this._dpL = function () {}; // onduplicate listener\n this._dpLC = false; // true when onduplicate called\n\n this._wKMC = {}; // stuff for cleanup\n\n // lock name\n this.lN = 'pubkey-bc||' + broadcastChannel.method.type + '||' + broadcastChannel.name;\n};\nLeaderElectionWebLock.prototype = {\n hasLeader: function hasLeader() {\n var _this2 = this;\n return navigator.locks.query().then(function (locks) {\n var relevantLocks = locks.held ? locks.held.filter(function (lock) {\n return lock.name === _this2.lN;\n }) : [];\n if (relevantLocks && relevantLocks.length > 0) {\n return true;\n } else {\n return false;\n }\n });\n },\n awaitLeadership: function awaitLeadership() {\n var _this3 = this;\n if (!this._wLMP) {\n this._wKMC.c = new AbortController();\n var returnPromise = new Promise(function (res, rej) {\n _this3._wKMC.res = res;\n _this3._wKMC.rej = rej;\n });\n this._wLMP = new Promise(function (res) {\n navigator.locks.request(_this3.lN, {\n signal: _this3._wKMC.c.signal\n }, function () {\n // if the lock resolved, we can drop the abort controller\n _this3._wKMC.c = undefined;\n beLeader(_this3);\n res();\n return returnPromise;\n })[\"catch\"](function () {});\n });\n }\n return this._wLMP;\n },\n set onduplicate(_fn) {\n // Do nothing because there are no duplicates in the WebLock version\n },\n die: function die() {\n var _this4 = this;\n this._lstns.forEach(function (listener) {\n return _this4.broadcastChannel.removeEventListener('internal', listener);\n });\n this._lstns = [];\n this._unl.forEach(function (uFn) {\n return uFn.remove();\n });\n this._unl = [];\n if (this.isLeader) {\n this.isLeader = false;\n }\n this.isDead = true;\n if (this._wKMC.res) {\n this._wKMC.res();\n }\n if (this._wKMC.c) {\n this._wKMC.c.abort('LeaderElectionWebLock.die() called');\n }\n return sendLeaderMessage(this, 'death');\n }\n};","import { sleep, randomToken, PROMISE_RESOLVED_VOID, PROMISE_RESOLVED_TRUE, supportsWebLockAPI } from './util.js';\nimport { sendLeaderMessage, beLeader } from './leader-election-util.js';\nimport { LeaderElectionWebLock } from './leader-election-web-lock.js';\nvar LeaderElection = function LeaderElection(broadcastChannel, options) {\n var _this = this;\n this.broadcastChannel = broadcastChannel;\n this._options = options;\n this.isLeader = false;\n this._hasLeader = false;\n this.isDead = false;\n this.token = randomToken();\n\n /**\n * Apply Queue,\n * used to ensure we do not run applyOnce()\n * in parallel.\n */\n this._aplQ = PROMISE_RESOLVED_VOID;\n // amount of unfinished applyOnce() calls\n this._aplQC = 0;\n\n // things to clean up\n this._unl = []; // _unloads\n this._lstns = []; // _listeners\n this._dpL = function () {}; // onduplicate listener\n this._dpLC = false; // true when onduplicate called\n\n /**\n * Even when the own instance is not applying,\n * we still listen to messages to ensure the hasLeader flag\n * is set correctly.\n */\n var hasLeaderListener = function hasLeaderListener(msg) {\n if (msg.context === 'leader') {\n if (msg.action === 'death') {\n _this._hasLeader = false;\n }\n if (msg.action === 'tell') {\n _this._hasLeader = true;\n }\n }\n };\n this.broadcastChannel.addEventListener('internal', hasLeaderListener);\n this._lstns.push(hasLeaderListener);\n};\nLeaderElection.prototype = {\n hasLeader: function hasLeader() {\n return Promise.resolve(this._hasLeader);\n },\n /**\n * Returns true if the instance is leader,\n * false if not.\n * @async\n */\n applyOnce: function applyOnce(\n // true if the applyOnce() call came from the fallbackInterval cycle\n isFromFallbackInterval) {\n var _this2 = this;\n if (this.isLeader) {\n return sleep(0, true);\n }\n if (this.isDead) {\n return sleep(0, false);\n }\n\n /**\n * Already applying more than once,\n * -> wait for the apply queue to be finished.\n */\n if (this._aplQC > 1) {\n return this._aplQ;\n }\n\n /**\n * Add a new apply-run\n */\n var applyRun = function applyRun() {\n /**\n * Optimization shortcuts.\n * Directly return if a previous run\n * has already elected a leader.\n */\n if (_this2.isLeader) {\n return PROMISE_RESOLVED_TRUE;\n }\n var stopCriteria = false;\n var stopCriteriaPromiseResolve;\n /**\n * Resolves when a stop criteria is reached.\n * Uses as a performance shortcut so we do not\n * have to await the responseTime when it is already clear\n * that the election failed.\n */\n var stopCriteriaPromise = new Promise(function (res) {\n stopCriteriaPromiseResolve = function stopCriteriaPromiseResolve() {\n stopCriteria = true;\n res();\n };\n });\n var handleMessage = function handleMessage(msg) {\n if (msg.context === 'leader' && msg.token != _this2.token) {\n if (msg.action === 'apply') {\n // other is applying\n if (msg.token > _this2.token) {\n /**\n * other has higher token\n * -> stop applying and let other become leader.\n */\n stopCriteriaPromiseResolve();\n }\n }\n if (msg.action === 'tell') {\n // other is already leader\n stopCriteriaPromiseResolve();\n _this2._hasLeader = true;\n }\n }\n };\n _this2.broadcastChannel.addEventListener('internal', handleMessage);\n\n /**\n * If the applyOnce() call came from the fallbackInterval,\n * we can assume that the election runs in the background and\n * not critical process is waiting for it.\n * When this is true, we give the other instances\n * more time to answer to messages in the election cycle.\n * This makes it less likely to elect duplicate leaders.\n * But also it takes longer which is not a problem because we anyway\n * run in the background.\n */\n var waitForAnswerTime = isFromFallbackInterval ? _this2._options.responseTime * 4 : _this2._options.responseTime;\n return sendLeaderMessage(_this2, 'apply') // send out that this one is applying\n .then(function () {\n return Promise.race([sleep(waitForAnswerTime), stopCriteriaPromise.then(function () {\n return Promise.reject(new Error());\n })]);\n })\n // send again in case another instance was just created\n .then(function () {\n return sendLeaderMessage(_this2, 'apply');\n })\n // let others time to respond\n .then(function () {\n return Promise.race([sleep(waitForAnswerTime), stopCriteriaPromise.then(function () {\n return Promise.reject(new Error());\n })]);\n })[\"catch\"](function () {}).then(function () {\n _this2.broadcastChannel.removeEventListener('internal', handleMessage);\n if (!stopCriteria) {\n // no stop criteria -> own is leader\n return beLeader(_this2).then(function () {\n return true;\n });\n } else {\n // other is leader\n return false;\n }\n });\n };\n this._aplQC = this._aplQC + 1;\n this._aplQ = this._aplQ.then(function () {\n return applyRun();\n }).then(function () {\n _this2._aplQC = _this2._aplQC - 1;\n });\n return this._aplQ.then(function () {\n return _this2.isLeader;\n });\n },\n awaitLeadership: function awaitLeadership() {\n if (/* _awaitLeadershipPromise */\n !this._aLP) {\n this._aLP = _awaitLeadershipOnce(this);\n }\n return this._aLP;\n },\n set onduplicate(fn) {\n this._dpL = fn;\n },\n die: function die() {\n var _this3 = this;\n this._lstns.forEach(function (listener) {\n return _this3.broadcastChannel.removeEventListener('internal', listener);\n });\n this._lstns = [];\n this._unl.forEach(function (uFn) {\n return uFn.remove();\n });\n this._unl = [];\n if (this.isLeader) {\n this._hasLeader = false;\n this.isLeader = false;\n }\n this.isDead = true;\n return sendLeaderMessage(this, 'death');\n }\n};\n\n/**\n * @param leaderElector {LeaderElector}\n */\nfunction _awaitLeadershipOnce(leaderElector) {\n if (leaderElector.isLeader) {\n return PROMISE_RESOLVED_VOID;\n }\n return new Promise(function (res) {\n var resolved = false;\n function finish() {\n if (resolved) {\n return;\n }\n resolved = true;\n leaderElector.broadcastChannel.removeEventListener('internal', whenDeathListener);\n res(true);\n }\n\n // try once now\n leaderElector.applyOnce().then(function () {\n if (leaderElector.isLeader) {\n finish();\n }\n });\n\n /**\n * Try on fallbackInterval\n * @recursive\n */\n var _tryOnFallBack = function tryOnFallBack() {\n return sleep(leaderElector._options.fallbackInterval).then(function () {\n if (leaderElector.isDead || resolved) {\n return;\n }\n if (leaderElector.isLeader) {\n finish();\n } else {\n return leaderElector.applyOnce(true).then(function () {\n if (leaderElector.isLeader) {\n finish();\n } else {\n _tryOnFallBack();\n }\n });\n }\n });\n };\n _tryOnFallBack();\n\n // try when other leader dies\n var whenDeathListener = function whenDeathListener(msg) {\n if (msg.context === 'leader' && msg.action === 'death') {\n leaderElector._hasLeader = false;\n leaderElector.applyOnce().then(function () {\n if (leaderElector.isLeader) {\n finish();\n }\n });\n }\n };\n leaderElector.broadcastChannel.addEventListener('internal', whenDeathListener);\n leaderElector._lstns.push(whenDeathListener);\n });\n}\nfunction fillOptionsWithDefaults(options, channel) {\n if (!options) options = {};\n options = JSON.parse(JSON.stringify(options));\n if (!options.fallbackInterval) {\n options.fallbackInterval = 3000;\n }\n if (!options.responseTime) {\n options.responseTime = channel.method.averageResponseTime(channel.options);\n }\n return options;\n}\nexport function createLeaderElection(channel, options) {\n if (channel._leaderElector) {\n throw new Error('BroadcastChannel already has a leader-elector');\n }\n options = fillOptionsWithDefaults(options, channel);\n var elector = supportsWebLockAPI() ? new LeaderElectionWebLock(channel, options) : new LeaderElection(channel, options);\n channel._befC.push(function () {\n return elector.die();\n });\n channel._leaderElector = elector;\n return elector;\n}","export const VOID = -1;\nexport const PRIMITIVE = 0;\nexport const ARRAY = 1;\nexport const OBJECT = 2;\nexport const DATE = 3;\nexport const REGEXP = 4;\nexport const MAP = 5;\nexport const SET = 6;\nexport const ERROR = 7;\nexport const BIGINT = 8;\n// export const SYMBOL = 9;\n","import {\n VOID, PRIMITIVE,\n ARRAY, OBJECT,\n DATE, REGEXP, MAP, SET,\n ERROR, BIGINT\n} from './types.js';\n\nconst env = typeof self === 'object' ? self : globalThis;\n\nconst deserializer = ($, _) => {\n const as = (out, index) => {\n $.set(index, out);\n return out;\n };\n\n const unpair = index => {\n if ($.has(index))\n return $.get(index);\n\n const [type, value] = _[index];\n switch (type) {\n case PRIMITIVE:\n case VOID:\n return as(value, index);\n case ARRAY: {\n const arr = as([], index);\n for (const index of value)\n arr.push(unpair(index));\n return arr;\n }\n case OBJECT: {\n const object = as({}, index);\n for (const [key, index] of value)\n object[unpair(key)] = unpair(index);\n return object;\n }\n case DATE:\n return as(new Date(value), index);\n case REGEXP: {\n const {source, flags} = value;\n return as(new RegExp(source, flags), index);\n }\n case MAP: {\n const map = as(new Map, index);\n for (const [key, index] of value)\n map.set(unpair(key), unpair(index));\n return map;\n }\n case SET: {\n const set = as(new Set, index);\n for (const index of value)\n set.add(unpair(index));\n return set;\n }\n case ERROR: {\n const {name, message} = value;\n return as(new env[name](message), index);\n }\n case BIGINT:\n return as(BigInt(value), index);\n case 'BigInt':\n return as(Object(BigInt(value)), index);\n case 'ArrayBuffer':\n return as(new Uint8Array(value).buffer, value);\n case 'DataView': {\n const { buffer } = new Uint8Array(value);\n return as(new DataView(buffer), value);\n }\n }\n return as(new env[type](value), index);\n };\n\n return unpair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns a deserialized value from a serialized array of Records.\n * @param {Record[]} serialized a previously serialized value.\n * @returns {any}\n */\nexport const deserialize = serialized => deserializer(new Map, serialized)(0);\n","import {\n VOID, PRIMITIVE,\n ARRAY, OBJECT,\n DATE, REGEXP, MAP, SET,\n ERROR, BIGINT\n} from './types.js';\n\nconst EMPTY = '';\n\nconst {toString} = {};\nconst {keys} = Object;\n\nconst typeOf = value => {\n const type = typeof value;\n if (type !== 'object' || !value)\n return [PRIMITIVE, type];\n\n const asString = toString.call(value).slice(8, -1);\n switch (asString) {\n case 'Array':\n return [ARRAY, EMPTY];\n case 'Object':\n return [OBJECT, EMPTY];\n case 'Date':\n return [DATE, EMPTY];\n case 'RegExp':\n return [REGEXP, EMPTY];\n case 'Map':\n return [MAP, EMPTY];\n case 'Set':\n return [SET, EMPTY];\n case 'DataView':\n return [ARRAY, asString];\n }\n\n if (asString.includes('Array'))\n return [ARRAY, asString];\n\n if (asString.includes('Error'))\n return [ERROR, asString];\n\n return [OBJECT, asString];\n};\n\nconst shouldSkip = ([TYPE, type]) => (\n TYPE === PRIMITIVE &&\n (type === 'function' || type === 'symbol')\n);\n\nconst serializer = (strict, json, $, _) => {\n\n const as = (out, value) => {\n const index = _.push(out) - 1;\n $.set(value, index);\n return index;\n };\n\n const pair = value => {\n if ($.has(value))\n return $.get(value);\n\n let [TYPE, type] = typeOf(value);\n switch (TYPE) {\n case PRIMITIVE: {\n let entry = value;\n switch (type) {\n case 'bigint':\n TYPE = BIGINT;\n entry = value.toString();\n break;\n case 'function':\n case 'symbol':\n if (strict)\n throw new TypeError('unable to serialize ' + type);\n entry = null;\n break;\n case 'undefined':\n return as([VOID], value);\n }\n return as([TYPE, entry], value);\n }\n case ARRAY: {\n if (type) {\n let spread = value;\n if (type === 'DataView') {\n spread = new Uint8Array(value.buffer);\n }\n else if (type === 'ArrayBuffer') {\n spread = new Uint8Array(value);\n }\n return as([type, [...spread]], value);\n }\n\n const arr = [];\n const index = as([TYPE, arr], value);\n for (const entry of value)\n arr.push(pair(entry));\n return index;\n }\n case OBJECT: {\n if (type) {\n switch (type) {\n case 'BigInt':\n return as([type, value.toString()], value);\n case 'Boolean':\n case 'Number':\n case 'String':\n return as([type, value.valueOf()], value);\n }\n }\n\n if (json && ('toJSON' in value))\n return pair(value.toJSON());\n\n const entries = [];\n const index = as([TYPE, entries], value);\n for (const key of keys(value)) {\n if (strict || !shouldSkip(typeOf(value[key])))\n entries.push([pair(key), pair(value[key])]);\n }\n return index;\n }\n case DATE:\n return as([TYPE, value.toISOString()], value);\n case REGEXP: {\n const {source, flags} = value;\n return as([TYPE, {source, flags}], value);\n }\n case MAP: {\n const entries = [];\n const index = as([TYPE, entries], value);\n for (const [key, entry] of value) {\n if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))\n entries.push([pair(key), pair(entry)]);\n }\n return index;\n }\n case SET: {\n const entries = [];\n const index = as([TYPE, entries], value);\n for (const entry of value) {\n if (strict || !shouldSkip(typeOf(entry)))\n entries.push(pair(entry));\n }\n return index;\n }\n }\n\n const {message} = value;\n return as([TYPE, {name: type, message}], value);\n };\n\n return pair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns an array of serialized Records.\n * @param {any} value a serializable value.\n * @param {{json?: boolean, lossy?: boolean}?} options an object with a `lossy` or `json` property that,\n * if `true`, will not throw errors on incompatible types, and behave more\n * like JSON stringify would behave. Symbol and Function will be discarded.\n * @returns {Record[]}\n */\n export const serialize = (value, {json, lossy} = {}) => {\n const _ = [];\n return serializer(!(json || lossy), !!json, new Map, _)(value), _;\n};\n","import { FOR_SWARM } from './symbols'\nimport { getGlobal, makeRandomId, isTabEnvironment } from '../lib/common'\nimport {\n AlreadyInitializedInContextError,\n UnsupportedEnvironmentError,\n RequestTimeoutError,\n} from '@nhtio/swarm/errors'\nimport { getLogger } from '../lib/logger'\nimport { TypedEventEmitter } from '../lib/emitter'\nimport { BroadcastChannel, createLeaderElection } from 'broadcast-channel'\nimport { serialize, deserialize } from '@ungap/structured-clone'\nimport type { TypedEventMap } from '../lib/emitter'\nimport type { LeaderElector } from 'broadcast-channel'\nimport type { SerializedRecord } from '@ungap/structured-clone'\n\nconst logger = getLogger()\n\ninterface InternalTypedEventMap extends TypedEventMap {\n leadership: [boolean]\n}\n\ninterface SwarmBroadcastMessage<Events extends TypedEventMap = TypedEventMap> {\n id: string\n event: keyof Events\n args: Events[keyof Events]\n needsAck?: boolean\n isAck?: boolean\n needsCollect?: boolean\n isCollectResponse?: boolean\n replyTo?: string\n result?: any\n error?: string\n}\n\nexport type RequestHandlerMap<Events extends TypedEventMap> = {\n [K in keyof Events]: (...args: Events[K]) => any\n}\n\n/**\n * The class that provides peer communication between browser tabs and service workers\n * @typeParam Events - The map of events and their arguments that can be emitted and listened to.\n */\nexport class Swarm<Events extends TypedEventMap = TypedEventMap> extends TypedEventEmitter<Events> {\n private static readonly INTERNAL_HEARTBEAT = '__swarm_heartbeat'\n private static readonly INTERNAL_OBITUARY = '__swarm_obituary'\n\n readonly #id: string\n readonly #bus: TypedEventEmitter<InternalTypedEventMap>\n readonly #requestHandlers: Map<keyof Events, (...args: any[]) => any>\n readonly #pending: Map<\n string,\n { resolve: (v: any) => void; reject: (e: any) => void; timer: ReturnType<typeof setTimeout> }\n >\n readonly #pendingCollects: Map<\n string,\n { resolve: (values: any[]) => void; timer: ReturnType<typeof setTimeout>; responses: any[] }\n >\n readonly #collectHandlers: Map<keyof Events, (...args: any[]) => any>\n readonly #peerLastSeen: Map<string, number>\n #channel: BroadcastChannel\n #elector: LeaderElector\n #leader: boolean\n #awaitResponseTimeout: number\n\n /** @private */\n constructor() {\n const global = getGlobal()\n if ('undefined' !== typeof global[FOR_SWARM] && global[FOR_SWARM] instanceof Swarm) {\n throw new AlreadyInitializedInContextError()\n }\n if ('undefined' === typeof navigator || !('serviceWorker' in navigator)) {\n throw new UnsupportedEnvironmentError()\n }\n super()\n global[FOR_SWARM] = this\n this.#id = makeRandomId(8)\n this.#bus = new TypedEventEmitter<InternalTypedEventMap>()\n this.#requestHandlers = new Map()\n this.#pending = new Map()\n this.#pendingCollects = new Map()\n this.#collectHandlers = new Map()\n this.#peerLastSeen = new Map()\n this.#awaitResponseTimeout = 1_000\n logger.debug(`Swarm instance initialized with ID \"${this.#id}\"`)\n this.#leader = false\n this.#channel = new BroadcastChannel('nhtio-swarm', {\n webWorkerSupport: true,\n idb: {\n onclose: () => {\n logger.WARNING(`Swarm channel closed, reinitializing...`)\n this.#channel.close()\n this.#initBroadcastChannel(true)\n },\n },\n })\n this.#elector = createLeaderElection(this.#channel)\n this.#checkForLeader()\n this.#hookChannelEvents()\n logger.debug(`Swarm instance is ready`)\n this.#startHeartbeat()\n if (isTabEnvironment()) {\n global.addEventListener('beforeunload', () => {\n this.#emitInternal(Swarm.INTERNAL_OBITUARY, this.#id)\n })\n }\n }\n\n #initBroadcastChannel(restarting = false) {\n if (this.#channel && !restarting) return\n this.#channel = new BroadcastChannel('nhtio-swarm', {\n webWorkerSupport: true,\n idb: {\n onclose: () => {\n this.#channel.close()\n this.#initBroadcastChannel(true)\n },\n },\n })\n this.#elector = createLeaderElection(this.#channel)\n this.#hookChannelEvents()\n }\n\n #hookChannelEvents() {\n logger.debug(`Hooking swarm channel events`)\n this.#channel.onmessage = (msg) => this.#onIncomingMessage(msg)\n logger.debug(`Swarm channel events hooked`)\n }\n\n #setLeader(leader: boolean) {\n if (this.#leader !== leader) {\n this.#leader = leader\n this.#bus.emit('leadership', leader)\n logger.debug(`Swarm instance is now ${leader ? 'the' : 'not the'} leader`)\n }\n }\n\n #checkForLeader() {\n new Promise(async (resolve) => {\n const has = await this.#elector.hasLeader()\n if (!has) {\n logger.debug(`No leader found, trying to elect one`)\n await this.#elector.awaitLeadership()\n logger.debug('Leader elected')\n this.#setLeader(this.#elector.isLeader)\n }\n resolve(void 0)\n })\n .catch((err) => {\n logger.error('Got error while checking for leader', err)\n })\n .finally(() => {\n setTimeout(() => this.#checkForLeader(), 500)\n })\n }\n\n #sendReply(msg: Partial<SwarmBroadcastMessage>) {\n this.#channel\n .postMessage(\n serialize({\n id: makeRandomId(16),\n ...msg,\n })\n )\n .catch((e) => logger.error(e))\n }\n\n #onIncomingMessage(serialized: SerializedRecord) {\n const message = deserialize(serialized) as SwarmBroadcastMessage<Events>\n if (\n typeof message !== 'object' ||\n message === null ||\n (typeof message.event !== 'string' && typeof message.event !== 'number') ||\n !Array.isArray(message.args)\n ) {\n return\n }\n\n const {\n id,\n event,\n args,\n needsAck,\n isAck,\n needsCollect,\n isCollectResponse,\n replyTo,\n result,\n error,\n } = message\n\n // heartbeat from some peer\n if (event === Swarm.INTERNAL_HEARTBEAT) {\n const [peerId] = args as unknown as [string]\n const isNew = !this.#peerLastSeen.has(peerId)\n this.#peerLastSeen.set(peerId, Date.now())\n this.#bus.emit(isNew ? 'peerJoined' : 'peerHeartbeat', peerId)\n return\n }\n\n // obituary from some peer\n if (event === Swarm.INTERNAL_OBITUARY) {\n const [peerId] = args as unknown as [string]\n if (this.#peerLastSeen.delete(peerId)) {\n this.#bus.emit('peerLeft', peerId)\n }\n return\n }\n\n if (isAck && replyTo) {\n const pending = this.#pending.get(replyTo)\n if (pending) {\n clearTimeout(pending.timer)\n this.#pending.delete(replyTo)\n if (typeof error === 'string') pending.reject(new Error(String(error)))\n else pending.resolve(result)\n }\n return\n }\n if (needsAck) {\n this.#elector.hasLeader().then(async (has) => {\n if (!has) {\n await this.#elector.awaitLeadership()\n this.#setLeader(this.#elector.isLeader)\n }\n if (this.#leader) {\n const handler = this.#requestHandlers.get(event)\n if (handler) {\n Promise.resolve(handler(...args))\n .then((res) => {\n this.#sendReply({\n event,\n args: [],\n isAck: true,\n replyTo: id,\n result: res,\n })\n })\n .catch((err) => {\n this.#sendReply({\n event,\n args: [],\n isAck: true,\n replyTo: id,\n error: err.message,\n })\n })\n }\n }\n })\n return\n }\n if (isCollectResponse && replyTo) {\n const bucket = this.#pendingCollects.get(replyTo)\n if (bucket) {\n bucket.responses.push(result)\n this.#maybeResolveCollect(replyTo)\n }\n return\n }\n if (needsCollect) {\n const handler = this.#collectHandlers.get(event)\n if (handler) {\n Promise.resolve(handler(...args))\n .then((res) => {\n this.#sendReply({\n event,\n args: [],\n isCollectResponse: true,\n replyTo: id,\n result: res,\n })\n })\n .catch((err) => {\n this.#sendReply({\n event,\n args: [],\n isCollectResponse: true,\n replyTo: id,\n error: err.message,\n })\n })\n }\n return\n }\n super.emit(event, ...args)\n }\n\n #emitInternal(event: string, ...args: any[]) {\n const msg = { id: makeRandomId(16), event, args }\n this.#channel.postMessage(serialize(msg as any)).catch((e) => logger.error(e))\n }\n\n #startHeartbeat() {\n this.#emitInternal(Swarm.INTERNAL_HEARTBEAT, this.id)\n setInterval(() => {\n this.#emitInternal(Swarm.INTERNAL_HEARTBEAT, this.id)\n }, 2_000)\n setInterval(() => {\n const now = Date.now()\n for (const [peerId, last] of this.#peerLastSeen) {\n if (now - last > 6_000) {\n this.#peerLastSeen.delete(peerId)\n this.#bus.emit('peerLeft', peerId)\n }\n }\n }, 2_000)\n }\n\n #maybeResolveCollect(id: string) {\n const bucket = this.#pendingCollects.get(id)\n if (!bucket) return\n\n // how many should we expect? (all peers we’ve heard from, plus ourselves)\n const expected = this.#peerLastSeen.size + 1\n\n if (bucket.responses.length >= expected) {\n // stop the old 1 s timer\n clearTimeout(bucket.timer)\n\n // give 100 ms for any straggler heartbeats, then resolve\n setTimeout(() => {\n if (this.#pendingCollects.delete(id)) {\n bucket.resolve(bucket.responses)\n }\n }, 100)\n }\n }\n\n /**\n * The ID of the current instance.\n */\n get id() {\n return this.#id\n }\n\n /**\n * Whether this instance is the leader or not.\n */\n get leader() {\n return this.#leader\n }\n\n /**\n * Emit an event to all connected peers.\n * @param event - The name of the event to emit.\n * @param args - The arguments to pass to the event listeners.\n * @typeParam E - The name of the event to emit.\n */\n emit<E extends keyof Events>(event: E, ...args: Events[E]): this {\n const toSerialize: SwarmBroadcastMessage<Events> = {\n id: makeRandomId(16),\n event,\n args,\n needsAck: false,\n isAck: false,\n }\n const serialized = serialize(toSerialize)\n this.#channel.postMessage(serialized).catch((err) => {\n logger.error('Got error while sending message', err)\n })\n super.emit(event, ...args)\n return this\n }\n\n /**\n * Subscribe to the leadership change event.\n * @param cb - The callback function to be called when the leadership status changes.\n */\n onLeadershipChange(cb: (is: boolean) => void) {\n this.#bus.on('leadership', cb)\n return this\n }\n\n /**\n * Remove the leadership change event listener.\n * @param cb - The callback function to be removed from the leadership change event.\n */\n offLeadershipChange(cb: (is: boolean) => void) {\n this.#bus.off('leadership', cb)\n return this\n }\n\n /**\n * Subscribe to the next occurance of a leadership change event.\n * @param cb - The callback function to be called when the leadership status changes.\n */\n onceLeadershipChange(cb: (is: boolean) => void) {\n this.#bus.once('leadership', cb)\n return this\n }\n\n /**\n * Collect responses from all peers for a specific event.\n * @param event The name of the event to collect responses for.\n * @param args The arguments which will be passed to the event handler.\n * @returns A promise that resolves with an array of responses from all peers.\n * @typeParam R - The type of the response.\n * @typeParam E - The name of the event to collect responses for.\n */\n collect<R, E extends keyof Events = keyof Events>(event: E, ...args: Events[E]): Promise<R[]> {\n const id = makeRandomId(16)\n // start local collection if you have a handler\n const local = this.#collectHandlers.get(event)\n // prepare the pending bucket\n const bucket = { responses: [] as R[], timer: null as any, resolve: (_: R[]) => {} }\n const p = new Promise<R[]>((resolve) => {\n bucket.resolve = resolve\n bucket.timer = setTimeout(() => {\n this.#pendingCollects.delete(id)\n resolve(bucket.responses)\n }, this.#awaitResponseTimeout)\n })\n this.#pendingCollects.set(id, bucket)\n\n // run local handler right away (so you collect your own tab)\n if (local) {\n Promise.resolve(local(...args)).then((r) => {\n bucket.responses.push(r)\n this.#maybeResolveCollect(id)\n })\n }\n\n // broadcast the collect request\n const msg: SwarmBroadcastMessage<Events> = { id, event, args, needsCollect: true }\n this.#channel.postMessage(serialize(msg)).catch((err) => logger.error(err))\n\n return p\n }\n\n /**\n * Register a handler for a specific event which will respond to incoming messages which require a general response\n * @param event The name of the event to listen for.\n * @param handler The function to call when the event is emitted.\n * @typeParam E - The name of the event to listen for.\n */\n onCollect<E extends keyof Events>(\n event: E,\n handler: (...args: Events[E]) => ReturnType<RequestHandlerMap<Events>[E]>\n ) {\n this.#collectHandlers.set(event, handler as any)\n return this\n }\n\n /**\n * De-register a handler for a specific event which will respond to incoming messages which require a general response\n * @param event The name of the event to listen for.\n * @param handler The function to call when the event is emitted.\n * @typeParam E - The name of the event to listen for.\n */\n offCollect<E extends keyof Events>(event: E) {\n this.#collectHandlers.delete(event)\n return this\n }\n\n /**\n * Request feedback from the leader for a specific event.\n * @param event The name of the event to request feedback for.\n * @param args The arguments to pass to the event handler.\n * @returns A promise that resolves with the response from the event handler.\n * @typeParam R - The type of the response.\n * @typeParam E - The name of the event to request feedback for.\n */\n request<R = any, E extends keyof Events = keyof Events>(\n event: E,\n ...args: Events[E]\n ): Promise<R> {\n const id = makeRandomId(16)\n const msg: SwarmBroadcastMessage<Events> = {\n id,\n event,\n args,\n needsAck: true,\n }\n const serialized = serialize(msg)\n this.#channel.postMessage(serialized).catch((err) => {\n logger.error('Error sending request:', err)\n })\n\n return new Promise<R>((resolve, reject) => {\n // auto‐timeout in 5s\n const timer = setTimeout(() => {\n this.#pending.delete(id)\n reject(new RequestTimeoutError(event))\n }, this.#awaitResponseTimeout)\n this.#pending.set(id, { resolve, reject, timer })\n })\n }\n\n /**\n * Register a handler for a specific event which will respond to incoming messages which require a response from the leader\n * @param event The name of the event to listen for.\n * @param handler The function to call when the event is emitted.\n * @typeParam E - The name of the event to listen for.\n */\n onRequest<E extends keyof Events>(\n event: E,\n handler: (...args: Events[E]) => ReturnType<RequestHandlerMap<Events>[E]>\n ) {\n this.#requestHandlers.set(event, handler as any)\n return this\n }\n\n /**\n * De-register a handler for a specific event which will respond to incoming messages which require a response from the leader\n * @param event The name of the event to listen for.\n * @param handler The function to call when the event is emitted.\n * @typeParam E - The name of the event to listen for.\n */\n offRequest<E extends keyof Events>(event: E) {\n this.#requestHandlers.delete(event)\n return this\n }\n\n /**\n * Set the timeout for waiting for a response from `request()` or `collect()`.\n * @param timeout The timeout in milliseconds to wait for a response.\n * @returns The current instance of the Swarm class for the current context.\n */\n setAwaitResponseTimeout(timeout: number) {\n this.#awaitResponseTimeout = timeout\n return this\n }\n\n /**\n * Retreive the current instance of the Swarm class for the current context.\n * @typeParam Events - The map of events and their arguments that can be emitted and listened to.\n * @returns The current instance of the Swarm class for the current context.\n */\n static instance<Events extends TypedEventMap = TypedEventMap>() {\n const global = getGlobal()\n if ('undefined' !== typeof global[FOR_SWARM] && global[FOR_SWARM] instanceof Swarm) {\n return global[FOR_SWARM] as Swarm<Events>\n }\n const instance = new Swarm<Events>()\n return instance\n }\n}\n","/**\n * The module which contains types and utilities for using the library.\n * @module @nhtio/swarm\n */\n\n/**\n * The current version of the package.\n */\nexport const version = __VERSION__\n\nexport * as types from './types'\nexport * as errors from './errors'\n\nexport { setLogLevel } from './lib/logger'\n\nexport { Swarm } from './lib/class_swarm'\n"],"names":["isTabEnvironment","isWorkerEnvironment","isSsrEnvironment","isSafari","isGlobalObject","obj","getGlobal","possible","o","makeRandomId","length","global","array","i","byte","FOR_SWARM","FOR_LOGGER","LogLevelStyles","text","LogLevelValues","EnvironmentStyles","LogLevelConsoleMethods","Logger","level","__privateAdd","_Logger_instances","_isBrowser","_isWorker","_isSsr","_isSafari","_prefix","_level","__privateSet","common.isTabEnvironment","common.isWorkerEnvironment","common.isSsrEnvironment","common.isSafari","__privateGet","args","__privateMethod","output_fn","getEnvironmentArgs_fn","env","levelValue","currentLevelValue","envText","envStyle","levelText","levelStyle","formattedArgs","getLogLevel","glbl","common.getGlobal","getLogger","lvlName","lvl","logger","setLogLevel","E","name","callback","ctx","e","self","listener","data","evtArr","len","evts","liveEvents","tinyEmitterModule","TinyEmitter","TypedEventEmitter","event","isPromise","PROMISE_RESOLVED_TRUE","PROMISE_RESOLVED_VOID","sleep","time","resolveWith","res","randomInt","min","max","randomToken","lastMs","microSeconds","ret","supportsWebLockAPI","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","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","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","ENFORCED_OPTIONS","_prepareChannel","_post","listenObj","_removeListenerObject","_addListenerObject","_this","awaitPrepare","broadcastChannel","sendPromise","maybePromise","s","_hasMessageListeners","_startListening","_stopListening","listenerFn","listenerObject","addBrowser","oldClose","addNode","isNode","USE_METHOD","LISTENERS","startedListening","startListening","runAll","add","addReturn","promises","sendLeaderMessage","leaderElector","action","msgJson","beLeader","unloadFn","unloadAdd","isLeaderListener","LeaderElectionWebLock","_this2","locks","relevantLocks","lock","_this3","returnPromise","_fn","_this4","uFn","LeaderElection","hasLeaderListener","isFromFallbackInterval","applyRun","stopCriteria","stopCriteriaPromiseResolve","stopCriteriaPromise","handleMessage","waitForAnswerTime","_awaitLeadershipOnce","resolved","finish","whenDeathListener","_tryOnFallBack","createLeaderElection","elector","VOID","PRIMITIVE","ARRAY","OBJECT","DATE","REGEXP","MAP","SET","ERROR","BIGINT","deserializer","$","_","as","out","index","unpair","arr","object","source","flags","map","set","message","buffer","deserialize","serialized","EMPTY","toString","keys","typeOf","asString","shouldSkip","TYPE","serializer","strict","json","pair","entry","spread","entries","serialize","lossy","_Swarm","AlreadyInitializedInContextError","UnsupportedEnvironmentError","_Swarm_instances","_id","_bus","_requestHandlers","_pending","_pendingCollects","_collectHandlers","_peerLastSeen","_channel","_elector","_leader","_awaitResponseTimeout","initBroadcastChannel_fn","checkForLeader_fn","hookChannelEvents_fn","startHeartbeat_fn","emitInternal_fn","toSerialize","cb","local","bucket","p","resolve","r","maybeResolveCollect_fn","handler","reject","timer","RequestTimeoutError","timeout","restarting","onIncomingMessage_fn","setLeader_fn","leader","sendReply_fn","needsAck","isAck","needsCollect","isCollectResponse","replyTo","result","error","peerId","isNew","pending","has","__superGet","last","expected","Swarm","version"],"mappings":"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","x_google_ignoreList":[3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]}
package/index.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The module which contains types and utilities for using the library.
3
+ * @module @nhtio/swarm
4
+ */
5
+ /**
6
+ * The current version of the package.
7
+ */
8
+ export declare const version: string;
9
+ export * as types from './types';
10
+ export * as errors from './errors';
11
+ export { setLogLevel } from './lib/logger';
12
+ export { Swarm } from './lib/class_swarm';