@abraca/dabra 0.1.3 → 0.1.5
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abracadabra-provider.cjs","names":["isNaN","binary.BITS31","binary.BITS32","math.floor","create","isArray","binary.BITS7","binary.BIT8","math.floor","string.encodeUtf8","string.utf8TextEncoder","math.min","math.max","create","error.create","binary.BITS7","binary.BIT8","number.MAX_SAFE_INTEGER","binary.BITS6","binary.BIT7","string.utf8TextDecoder","map.create","set.create","array.from","equalityTrait.EqualityTraitSymbol","object.size","object.hasProperty","array.isArray","time.getUnixTime","math.floor","f.equalityDeep","encoding.createEncoder","encoding.toUint8Array","decoding.createDecoder","decoding.readVarUint","decoding.readVarString","time.getUnixTime","WsReadyStates","Y","decoding.readVarUint8Array","decoding.readVarUint","awarenessProtocol.encodeAwarenessUpdate","Y","openDb","Y","u64.split","sha256","sha256n","ed"],"sources":["../../../node_modules/lib0/math.js","../../../node_modules/lib0/binary.js","../../../node_modules/lib0/number.js","../../../node_modules/lib0/set.js","../../../node_modules/lib0/array.js","../../../node_modules/lib0/string.js","../../../node_modules/lib0/encoding.js","../../../node_modules/lib0/error.js","../../../node_modules/lib0/decoding.js","../../../node_modules/lib0/time.js","../../../node_modules/lib0/map.js","../../../node_modules/lib0/observable.js","../../../node_modules/lib0/trait/equality.js","../../../node_modules/lib0/object.js","../../../node_modules/lib0/function.js","../../../node_modules/y-protocols/awareness.js","../src/EventEmitter.ts","../src/IncomingMessage.ts","../src/types.ts","../src/OutgoingMessage.ts","../src/OutgoingMessages/CloseMessage.ts","../src/HocuspocusProviderWebsocket.ts","../../../node_modules/y-protocols/sync.js","../src/MessageReceiver.ts","../src/MessageSender.ts","../src/OutgoingMessages/AuthenticationMessage.ts","../src/OutgoingMessages/AwarenessMessage.ts","../src/OutgoingMessages/StatelessMessage.ts","../src/OutgoingMessages/SyncStepOneMessage.ts","../src/OutgoingMessages/UpdateMessage.ts","../src/HocuspocusProvider.ts","../src/OfflineStore.ts","../src/OutgoingMessages/SubdocMessage.ts","../src/AbracadabraProvider.ts","../src/AbracadabraClient.ts","../../../node_modules/@noble/hashes/esm/utils.js","../../../node_modules/@noble/hashes/esm/hmac.js","../../../node_modules/@noble/hashes/esm/hkdf.js","../../../node_modules/@noble/hashes/esm/_md.js","../../../node_modules/@noble/hashes/esm/_u64.js","../../../node_modules/@noble/hashes/esm/sha2.js","../../../node_modules/@noble/hashes/esm/sha256.js","../src/CryptoIdentityKeystore.ts"],"sourcesContent":["/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * Check whether n is negative, while considering the -0 edge case. While `-0 < 0` is false, this\n * function returns true for -0,-1,,.. and returns false for 0,1,2,...\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also distinguishes between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/* eslint-env browser */\n\n/**\n * Binary data constants.\n *\n * @module binary\n */\n\n/**\n * n-th bit activated.\n *\n * @type {number}\n */\nexport const BIT1 = 1\nexport const BIT2 = 2\nexport const BIT3 = 4\nexport const BIT4 = 8\nexport const BIT5 = 16\nexport const BIT6 = 32\nexport const BIT7 = 64\nexport const BIT8 = 128\nexport const BIT9 = 256\nexport const BIT10 = 512\nexport const BIT11 = 1024\nexport const BIT12 = 2048\nexport const BIT13 = 4096\nexport const BIT14 = 8192\nexport const BIT15 = 16384\nexport const BIT16 = 32768\nexport const BIT17 = 65536\nexport const BIT18 = 1 << 17\nexport const BIT19 = 1 << 18\nexport const BIT20 = 1 << 19\nexport const BIT21 = 1 << 20\nexport const BIT22 = 1 << 21\nexport const BIT23 = 1 << 22\nexport const BIT24 = 1 << 23\nexport const BIT25 = 1 << 24\nexport const BIT26 = 1 << 25\nexport const BIT27 = 1 << 26\nexport const BIT28 = 1 << 27\nexport const BIT29 = 1 << 28\nexport const BIT30 = 1 << 29\nexport const BIT31 = 1 << 30\nexport const BIT32 = 1 << 31\n\n/**\n * First n bits activated.\n *\n * @type {number}\n */\nexport const BITS0 = 0\nexport const BITS1 = 1\nexport const BITS2 = 3\nexport const BITS3 = 7\nexport const BITS4 = 15\nexport const BITS5 = 31\nexport const BITS6 = 63\nexport const BITS7 = 127\nexport const BITS8 = 255\nexport const BITS9 = 511\nexport const BITS10 = 1023\nexport const BITS11 = 2047\nexport const BITS12 = 4095\nexport const BITS13 = 8191\nexport const BITS14 = 16383\nexport const BITS15 = 32767\nexport const BITS16 = 65535\nexport const BITS17 = BIT18 - 1\nexport const BITS18 = BIT19 - 1\nexport const BITS19 = BIT20 - 1\nexport const BITS20 = BIT21 - 1\nexport const BITS21 = BIT22 - 1\nexport const BITS22 = BIT23 - 1\nexport const BITS23 = BIT24 - 1\nexport const BITS24 = BIT25 - 1\nexport const BITS25 = BIT26 - 1\nexport const BITS26 = BIT27 - 1\nexport const BITS27 = BIT28 - 1\nexport const BITS28 = BIT29 - 1\nexport const BITS29 = BIT30 - 1\nexport const BITS30 = BIT31 - 1\n/**\n * @type {number}\n */\nexport const BITS31 = 0x7FFFFFFF\n/**\n * @type {number}\n */\nexport const BITS32 = 0xFFFFFFFF\n","/**\n * Utility helpers for working with numbers.\n *\n * @module number\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER\n\nexport const LOWEST_INT32 = 1 << 31\nexport const HIGHEST_INT32 = binary.BITS31\nexport const HIGHEST_UINT32 = binary.BITS32\n\n/* c8 ignore next */\nexport const isInteger = Number.isInteger || (num => typeof num === 'number' && isFinite(num) && math.floor(num) === num)\nexport const isNaN = Number.isNaN\nexport const parseInt = Number.parseInt\n\n/**\n * Count the number of \"1\" bits in an unsigned 32bit number.\n *\n * Super fun bitcount algorithm by Brian Kernighan.\n *\n * @param {number} n\n */\nexport const countBits = n => {\n n &= binary.BITS32\n let count = 0\n while (n) {\n n &= (n - 1)\n count++\n }\n return count\n}\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T|undefined}\n */\nexport const first = set => set.values().next().value\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n for (let i = 0; i < src.length; i++) {\n dest.push(src[i])\n }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template {ArrayLike<any>} ARR\n *\n * @param {ARR} arr\n * @param {ARR extends ArrayLike<infer S> ? ((value:S, index:number, arr:ARR) => boolean) : any} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (!f(arr[i], i, arr)) {\n return false\n }\n }\n return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template {ArrayLike<any>} ARR\n *\n * @param {ARR} arr\n * @param {ARR extends ArrayLike<infer S> ? ((value:S, index:number, arr:ARR) => boolean) : never} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (f(arr[i], i, arr)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n const array = new Array(len)\n for (let i = 0; i < len; i++) {\n array[i] = f(i, array)\n }\n return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n /**\n * @type {Set<M>}\n */\n const happened = set.create()\n /**\n * @type {Array<T>}\n */\n const result = []\n for (let i = 0; i < arr.length; i++) {\n const el = arr[i]\n const mapped = mapper(el)\n if (!happened.has(mapped)) {\n happened.add(mapped)\n result.push(el)\n }\n }\n return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n /**\n * @type {Array<any>}\n */\n const res = Array(arr.length)\n for (let i = 0; i < arr.length; i++) {\n res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n }\n return /** @type {any} */ (res)\n}\n\n/**\n * This function bubble-sorts a single item to the correct position. The sort happens in-place and\n * might be useful to ensure that a single item is at the correct position in an otherwise sorted\n * array.\n *\n * @example\n * const arr = [3, 2, 5]\n * arr.sort((a, b) => a - b)\n * arr // => [2, 3, 5]\n * arr.splice(1, 0, 7)\n * array.bubbleSortItem(arr, 1, (a, b) => a - b)\n * arr // => [2, 3, 5, 7]\n *\n * @template T\n * @param {Array<T>} arr\n * @param {number} i\n * @param {(a:T,b:T) => number} compareFn\n */\nexport const bubblesortItem = (arr, i, compareFn) => {\n const n = arr[i]\n let j = i\n // try to sort to the right\n while (j + 1 < arr.length && compareFn(n, arr[j + 1]) > 0) {\n arr[j] = arr[j + 1]\n arr[++j] = n\n }\n if (i === j && j > 0) { // no change yet\n // sort to the left\n while (j > 0 && compareFn(arr[j - 1], n) > 0) {\n arr[j] = arr[j - 1]\n arr[--j] = n\n }\n }\n return j\n}\n","import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array<ArrayBuffer>}\n */\nexport const _encodeUtf8Polyfill = str => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n }\n return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array<ArrayBuffer>}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n // Safari doesn't handle BOM correctly.\n // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n // Another issue is that from then on no BOM chars are recognized anymore\n /* c8 ignore next */\n utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n\n/**\n * Escape HTML characters &,<,>,',\" to their respective HTML entities &,<,>,',"\n *\n * @param {string} str\n */\nexport const escapeHTML = str =>\n str.replace(/[&<>'\"]/g, r => /** @type {string} */ ({\n '&': '&',\n '<': '<',\n '>': '>',\n \"'\": ''',\n '\"': '"'\n }[r]))\n\n/**\n * Reverse of `escapeHTML`\n *\n * @param {string} str\n */\nexport const unescapeHTML = str =>\n str.replace(/&|<|>|'|"/g, r => /** @type {string} */ ({\n '&': '&',\n '<': '<',\n '>': '>',\n ''': \"'\",\n '"': '\"'\n }[r]))\n","/**\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module encoding\n */\n\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as binary from './binary.js'\nimport * as string from './string.js'\nimport * as array from './array.js'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n constructor () {\n this.cpos = 0\n this.cbuf = new Uint8Array(100)\n /**\n * @type {Array<Uint8Array>}\n */\n this.bufs = []\n }\n}\n\n/**\n * @function\n * @return {Encoder}\n */\nexport const createEncoder = () => new Encoder()\n\n/**\n * @param {function(Encoder):void} f\n */\nexport const encode = (f) => {\n const encoder = createEncoder()\n f(encoder)\n return toUint8Array(encoder)\n}\n\n/**\n * The current length of the encoded data.\n *\n * @function\n * @param {Encoder} encoder\n * @return {number}\n */\nexport const length = encoder => {\n let len = encoder.cpos\n for (let i = 0; i < encoder.bufs.length; i++) {\n len += encoder.bufs[i].length\n }\n return len\n}\n\n/**\n * Check whether encoder is empty.\n *\n * @function\n * @param {Encoder} encoder\n * @return {boolean}\n */\nexport const hasContent = encoder => encoder.cpos > 0 || encoder.bufs.length > 0\n\n/**\n * Transform to Uint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @return {Uint8Array<ArrayBuffer>} The created ArrayBuffer.\n */\nexport const toUint8Array = encoder => {\n const uint8arr = new Uint8Array(length(encoder))\n let curPos = 0\n for (let i = 0; i < encoder.bufs.length; i++) {\n const d = encoder.bufs[i]\n uint8arr.set(d, curPos)\n curPos += d.length\n }\n uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n *\n * @param {Encoder} encoder\n * @param {number} len\n */\nexport const verifyLen = (encoder, len) => {\n const bufferLen = encoder.cbuf.length\n if (bufferLen - encoder.cpos < len) {\n encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos))\n encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)\n encoder.cpos = 0\n }\n}\n\n/**\n * Write one byte to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The byte that is to be encoded.\n */\nexport const write = (encoder, num) => {\n const bufferLen = encoder.cbuf.length\n if (encoder.cpos === bufferLen) {\n encoder.bufs.push(encoder.cbuf)\n encoder.cbuf = new Uint8Array(bufferLen * 2)\n encoder.cpos = 0\n }\n encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos Position to which to write data\n * @param {number} num Unsigned 8-bit integer\n */\nexport const set = (encoder, pos, num) => {\n let buffer = null\n // iterate all buffers and adjust position\n for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n const b = encoder.bufs[i]\n if (pos < b.length) {\n buffer = b // found buffer\n } else {\n pos -= b.length\n }\n }\n if (buffer === null) {\n // use current buffer\n buffer = encoder.cbuf\n }\n buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint16 = (encoder, num) => {\n write(encoder, num & binary.BITS8)\n write(encoder, (num >>> 8) & binary.BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint16 = (encoder, pos, num) => {\n set(encoder, pos, num & binary.BITS8)\n set(encoder, pos + 1, (num >>> 8) & binary.BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32 = (encoder, num) => {\n for (let i = 0; i < 4; i++) {\n write(encoder, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32BigEndian = (encoder, num) => {\n for (let i = 3; i >= 0; i--) {\n write(encoder, (num >>> (8 * i)) & binary.BITS8)\n }\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint32 = (encoder, pos, num) => {\n for (let i = 0; i < 4; i++) {\n set(encoder, pos + i, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarUint = (encoder, num) => {\n while (num > binary.BITS7) {\n write(encoder, binary.BIT8 | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n write(encoder, binary.BITS7 & num)\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarInt = (encoder, num) => {\n const isNegative = math.isNegativeZero(num)\n if (isNegative) {\n num = -num\n }\n // |- whether to continue reading |- whether is negative |- number\n write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))\n num = math.floor(num / 64) // shift >>> 6\n // We don't need to consider the case of num === 0 so we can use a different\n // pattern here than above.\n while (num > 0) {\n write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n}\n\n/**\n * A cache to store strings temporarily\n */\nconst _strBuffer = new Uint8Array(30000)\nconst _maxStrBSize = _strBuffer.length / 3\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringNative = (encoder, str) => {\n if (str.length < _maxStrBSize) {\n // We can encode the string into the existing buffer\n /* c8 ignore next */\n const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0\n writeVarUint(encoder, written)\n for (let i = 0; i < written; i++) {\n write(encoder, _strBuffer[i])\n }\n } else {\n writeVarUint8Array(encoder, string.encodeUtf8(str))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringPolyfill = (encoder, str) => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n write(encoder, /** @type {number} */ (encodedString.codePointAt(i)))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\n/* c8 ignore next */\nexport const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill\n\n/**\n * Write a string terminated by a special byte sequence. This is not very performant and is\n * generally discouraged. However, the resulting byte arrays are lexiographically ordered which\n * makes this a nice feature for databases.\n *\n * The string will be encoded using utf8 and then terminated and escaped using writeTerminatingUint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const writeTerminatedString = (encoder, str) =>\n writeTerminatedUint8Array(encoder, string.encodeUtf8(str))\n\n/**\n * Write a terminating Uint8Array. Note that this is not performant and is generally\n * discouraged. There are few situations when this is needed.\n *\n * We use 0x0 as a terminating character. 0x1 serves as an escape character for 0x0 and 0x1.\n *\n * Example: [0,1,2] is encoded to [1,0,1,1,2,0]. 0x0, and 0x1 needed to be escaped using 0x1. Then\n * the result is terminated using the 0x0 character.\n *\n * This is basically how many systems implement null terminated strings. However, we use an escape\n * character 0x1 to avoid issues and potenial attacks on our database (if this is used as a key\n * encoder for NoSql databases).\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} buf The string that is to be encoded.\n */\nexport const writeTerminatedUint8Array = (encoder, buf) => {\n for (let i = 0; i < buf.length; i++) {\n const b = buf[i]\n if (b === 0 || b === 1) {\n write(encoder, 1)\n }\n write(encoder, buf[i])\n }\n write(encoder, 0)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n * - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n * Encoders start with a rather big initial buffer.\n *\n * @function\n * @param {Encoder} encoder The enUint8Arr\n * @param {Encoder} append The BinaryEncoder to be written.\n */\nexport const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append))\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeUint8Array = (encoder, uint8Array) => {\n const bufferLen = encoder.cbuf.length\n const cpos = encoder.cpos\n const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length)\n const rightCopyLen = uint8Array.length - leftCopyLen\n encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n encoder.cpos += leftCopyLen\n if (rightCopyLen > 0) {\n // Still something to write, write right half..\n // Append new buffer\n encoder.bufs.push(encoder.cbuf)\n // must have at least size of remaining buffer\n encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen))\n // copy array\n encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n encoder.cpos = rightCopyLen\n }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeVarUint8Array = (encoder, uint8Array) => {\n writeVarUint(encoder, uint8Array.byteLength)\n writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n *\n * @param {Encoder} encoder\n * @param {number} len\n * @return {DataView}\n */\nexport const writeOnDataView = (encoder, len) => {\n verifyLen(encoder, len)\n const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n encoder.cpos += len\n return dview\n}\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigUint64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n\nconst floatTestBed = new DataView(new ArrayBuffer(4))\n/**\n * Check if a number can be encoded as a 32 bit float.\n *\n * @param {number} num\n * @return {boolean}\n */\nconst isFloat32 = num => {\n floatTestBed.setFloat32(0, num)\n return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * @typedef {Array<AnyEncodable>} AnyEncodableArray\n */\n\n/**\n * @typedef {undefined|null|number|bigint|boolean|string|{[k:string]:AnyEncodable}|AnyEncodableArray|Uint8Array} AnyEncodable\n */\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * • Transforms data to a binary format (not to a string)\n * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * • Numbers are efficiently encoded either as a variable length integer, as a\n * 32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type | Prefix | Encoding Method | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined | 127 | | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null | 126 | | |\n * | integer | 125 | writeVarInt | Only encodes 32 bit signed integers |\n * | float32 | 124 | writeFloat32 | |\n * | float64 | 123 | writeFloat64 | |\n * | bigint | 122 | writeBigInt64 | |\n * | boolean (false) | 121 | | True and false are different data types so we save the following byte |\n * | boolean (true) | 120 | | - 0b01111000 so the last bit determines whether true or false |\n * | string | 119 | writeVarString | |\n * | object<string,any> | 118 | custom | Writes {length} then {length} key-value pairs |\n * | array<any> | 117 | custom | Writes {length} then {length} json values |\n * | Uint8Array | 116 | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30] the beginning of the data range is used for custom purposes\n * (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n * lib0/encoding.js\n *\n * @param {Encoder} encoder\n * @param {AnyEncodable} data\n */\nexport const writeAny = (encoder, data) => {\n switch (typeof data) {\n case 'string':\n // TYPE 119: STRING\n write(encoder, 119)\n writeVarString(encoder, data)\n break\n case 'number':\n if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {\n // TYPE 125: INTEGER\n write(encoder, 125)\n writeVarInt(encoder, data)\n } else if (isFloat32(data)) {\n // TYPE 124: FLOAT32\n write(encoder, 124)\n writeFloat32(encoder, data)\n } else {\n // TYPE 123: FLOAT64\n write(encoder, 123)\n writeFloat64(encoder, data)\n }\n break\n case 'bigint':\n // TYPE 122: BigInt\n write(encoder, 122)\n writeBigInt64(encoder, data)\n break\n case 'object':\n if (data === null) {\n // TYPE 126: null\n write(encoder, 126)\n } else if (array.isArray(data)) {\n // TYPE 117: Array\n write(encoder, 117)\n writeVarUint(encoder, data.length)\n for (let i = 0; i < data.length; i++) {\n writeAny(encoder, data[i])\n }\n } else if (data instanceof Uint8Array) {\n // TYPE 116: ArrayBuffer\n write(encoder, 116)\n writeVarUint8Array(encoder, data)\n } else {\n // TYPE 118: Object\n write(encoder, 118)\n const keys = Object.keys(data)\n writeVarUint(encoder, keys.length)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n writeVarString(encoder, key)\n writeAny(encoder, data[key])\n }\n }\n break\n case 'boolean':\n // TYPE 120/121: boolean (true/false)\n write(encoder, data ? 120 : 121)\n break\n default:\n // TYPE 127: undefined\n write(encoder, 127)\n }\n}\n\n/**\n * Now come a few stateful encoder that have their own classes.\n */\n\n/**\n * Basic Run Length Encoder - a basic compression implementation.\n *\n * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.\n *\n * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf\n *\n * @note T must not be null!\n *\n * @template T\n */\nexport class RleEncoder extends Encoder {\n /**\n * @param {function(Encoder, T):void} writer\n */\n constructor (writer) {\n super()\n /**\n * The writer\n */\n this.w = writer\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n /**\n * @param {T} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n this.w(this, v)\n this.s = v\n }\n }\n}\n\n/**\n * Basic diff decoder using variable length encoding.\n *\n * Encodes the values [3, 1100, 1101, 1050, 0] to [3, 1097, 1, -51, -1050] using writeVarInt.\n */\nexport class IntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n writeVarInt(this, v - this.s)\n this.s = v\n }\n}\n\n/**\n * A combination of IntDiffEncoder and RleEncoder.\n *\n * Basically first writes the IntDiffEncoder and then counts duplicate diffs using RleEncoding.\n *\n * Encodes the values [1,1,1,2,3,4,5,6] as [1,1,0,2,1,5] (RLE([1,0,0,1,1,1,1,1]) ⇒ RleIntDiff[1,1,0,2,1,5])\n */\nexport class RleIntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v && this.count > 0) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n writeVarInt(this, v - this.s)\n this.s = v\n }\n }\n}\n\n/**\n * @param {UintOptRleEncoder} encoder\n */\nconst flushUintOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set sign to positive\n // case 2: write several values. set sign to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.\n *\n * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write\n * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.\n *\n * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)\n */\nexport class UintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Increasing Uint Optimized RLE Encoder\n *\n * The RLE encoder counts the number of same occurences of the same value.\n * The IncUintOptRle encoder counts if the value increases.\n * I.e. 7, 8, 9, 10 will be encoded as [-7, 4]. 1, 3, 5 will be encoded\n * as [1, 3, 5].\n */\nexport class IncUintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s + this.count === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * @param {IntDiffOptRleEncoder} encoder\n */\nconst flushIntDiffOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // 31 bit making up the diff | wether to write the counter\n // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)\n const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set first bit to positive\n // case 2: write several values. set first bit to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encodedDiff)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * A combination of the IntDiffEncoder and the UintOptRleEncoder.\n *\n * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes\n * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!\n *\n * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])\n *\n * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:\n * * 1 bit that denotes whether the next value is a count (LSB)\n * * 1 bit that denotes whether this value is negative (MSB - 1)\n * * 1 bit that denotes whether to continue reading the variable length integer (MSB)\n *\n * Therefore, only five bits remain to encode diff ranges.\n *\n * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.\n */\nexport class IntDiffOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.diff === v - this.s) {\n this.s = v\n this.count++\n } else {\n flushIntDiffOptRleEncoder(this)\n this.count = 1\n this.diff = v - this.s\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushIntDiffOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Optimized String Encoder.\n *\n * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.\n * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).\n *\n * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.\n *\n * The lengths are encoded using a UintOptRleEncoder.\n */\nexport class StringEncoder {\n constructor () {\n /**\n * @type {Array<string>}\n */\n this.sarr = []\n this.s = ''\n this.lensE = new UintOptRleEncoder()\n }\n\n /**\n * @param {string} string\n */\n write (string) {\n this.s += string\n if (this.s.length > 19) {\n this.sarr.push(this.s)\n this.s = ''\n }\n this.lensE.write(string.length)\n }\n\n toUint8Array () {\n const encoder = new Encoder()\n this.sarr.push(this.s)\n this.s = ''\n writeVarString(encoder, this.sarr.join(''))\n writeUint8Array(encoder, this.lensE.toUint8Array())\n return toUint8Array(encoder)\n }\n}\n","/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n throw create('Unexpected case')\n}\n\n/**\n * @param {boolean} property\n * @return {asserts property is true}\n */\nexport const assert = property => { if (!property) throw create('Assert failed') }\n","/**\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module decoding\n */\n\nimport * as binary from './binary.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as string from './string.js'\nimport * as error from './error.js'\nimport * as encoding from './encoding.js'\n\nconst errorUnexpectedEndOfArray = error.create('Unexpected end of array')\nconst errorIntegerOutOfRange = error.create('Integer out of Range')\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n * @template {ArrayBufferLike} [Buf=ArrayBufferLike]\n */\nexport class Decoder {\n /**\n * @param {Uint8Array<Buf>} uint8Array Binary data to decode\n */\n constructor (uint8Array) {\n /**\n * Decoding target.\n *\n * @type {Uint8Array<Buf>}\n */\n this.arr = uint8Array\n /**\n * Current decoding position.\n *\n * @type {number}\n */\n this.pos = 0\n }\n}\n\n/**\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Uint8Array<Buf>} uint8Array\n * @return {Decoder<Buf>}\n */\nexport const createDecoder = uint8Array => new Decoder(uint8Array)\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {boolean}\n */\nexport const hasContent = decoder => decoder.pos !== decoder.arr.length\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} [newPos] Defaults to current position\n * @return {Decoder} A clone of `decoder`\n */\nexport const clone = (decoder, newPos = decoder.pos) => {\n const _decoder = createDecoder(decoder.arr)\n _decoder.pos = newPos\n return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Decoder<Buf>} decoder The decoder instance\n * @param {number} len The length of bytes to read\n * @return {Uint8Array<Buf>}\n */\nexport const readUint8Array = (decoder, len) => {\n const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n decoder.pos += len\n return view\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Decoder<Buf>} decoder\n * @return {Uint8Array<Buf>}\n */\nexport const readVarUint8Array = decoder => readUint8Array(decoder, readVarUint(decoder))\n\n/**\n * Read the rest of the content as an ArrayBuffer\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTailAsUint8Array = decoder => readUint8Array(decoder, decoder.arr.length - decoder.pos)\n\n/**\n * Skip one byte, jump to the next position.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} The next position\n */\nexport const skip8 = decoder => decoder.pos++\n\n/**\n * Read one byte as unsigned integer.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} Unsigned 8-bit integer\n */\nexport const readUint8 = decoder => decoder.arr[decoder.pos++]\n\n/**\n * Read 2 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint16 = decoder => {\n const uint =\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n decoder.pos += 2\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32 = decoder => {\n const uint =\n (decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32BigEndian = decoder => {\n const uint =\n (decoder.arr[decoder.pos + 3] +\n (decoder.arr[decoder.pos + 2] << 8) +\n (decoder.arr[decoder.pos + 1] << 16) +\n (decoder.arr[decoder.pos] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint8 = decoder => decoder.arr[decoder.pos]\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint16 = decoder =>\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint32 = decoder => (\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)\n) >>> 0\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarUint = decoder => {\n let num = 0\n let mult = 1\n const len = decoder.arr.length\n while (decoder.pos < len) {\n const r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult // shift $r << (7*#iterations) and add it to num\n mult *= 128 // next iteration, shift 7 \"more\" to the left\n if (r < binary.BIT8) {\n return num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarInt = decoder => {\n let r = decoder.arr[decoder.pos++]\n let num = r & binary.BITS6\n let mult = 64\n const sign = (r & binary.BIT7) > 0 ? -1 : 1\n if ((r & binary.BIT8) === 0) {\n // don't continue reading\n return sign * num\n }\n const len = decoder.arr.length\n while (decoder.pos < len) {\n r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult\n mult *= 128\n if (r < binary.BIT8) {\n return sign * num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarUint = decoder => {\n const pos = decoder.pos\n const s = readVarUint(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarInt = decoder => {\n const pos = decoder.pos\n const s = readVarInt(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String.\n */\n/* c8 ignore start */\nexport const _readVarStringPolyfill = decoder => {\n let remainingLen = readVarUint(decoder)\n if (remainingLen === 0) {\n return ''\n } else {\n let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n while (remainingLen--) {\n encodedString += String.fromCodePoint(readUint8(decoder))\n }\n } else {\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n // this is dangerous, we create a fresh array view from the existing buffer\n const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n decoder.pos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n }\n return decodeURIComponent(escape(encodedString))\n }\n}\n/* c8 ignore stop */\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n */\nexport const _readVarStringNative = decoder =>\n /** @type any */ (string.utf8TextDecoder).decode(readVarUint8Array(decoder))\n\n/**\n * Read string of variable length\n * * varUint is used to store the length of the string\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n *\n */\n/* c8 ignore next */\nexport const readVarString = string.utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill\n\n/**\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTerminatedUint8Array = decoder => {\n const encoder = encoding.createEncoder()\n let b\n while (true) {\n b = readUint8(decoder)\n if (b === 0) {\n return encoding.toUint8Array(encoder)\n }\n if (b === 1) {\n b = readUint8(decoder)\n }\n encoding.write(encoder, b)\n }\n}\n\n/**\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const readTerminatedString = decoder => string.decodeUtf8(readTerminatedUint8Array(decoder))\n\n/**\n * Look ahead and read varString without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const peekVarString = decoder => {\n const pos = decoder.pos\n const s = readVarString(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * @param {Decoder} decoder\n * @param {number} len\n * @return {DataView}\n */\nexport const readFromDataView = (decoder, len) => {\n const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n decoder.pos += len\n return dv\n}\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat32 = decoder => readFromDataView(decoder, 4).getFloat32(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat64 = decoder => readFromDataView(decoder, 8).getFloat64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigInt64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigInt64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigUint64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigUint64(0, false)\n\n/**\n * @type {Array<function(Decoder):any>}\n */\nconst readAnyLookupTable = [\n decoder => undefined, // CASE 127: undefined\n decoder => null, // CASE 126: null\n readVarInt, // CASE 125: integer\n readFloat32, // CASE 124: float32\n readFloat64, // CASE 123: float64\n readBigInt64, // CASE 122: bigint\n decoder => false, // CASE 121: boolean (false)\n decoder => true, // CASE 120: boolean (true)\n readVarString, // CASE 119: string\n decoder => { // CASE 118: object<string,any>\n const len = readVarUint(decoder)\n /**\n * @type {Object<string,any>}\n */\n const obj = {}\n for (let i = 0; i < len; i++) {\n const key = readVarString(decoder)\n obj[key] = readAny(decoder)\n }\n return obj\n },\n decoder => { // CASE 117: array<any>\n const len = readVarUint(decoder)\n const arr = []\n for (let i = 0; i < len; i++) {\n arr.push(readAny(decoder))\n }\n return arr\n },\n readVarUint8Array // CASE 116: Uint8Array\n]\n\n/**\n * @param {Decoder} decoder\n */\nexport const readAny = decoder => readAnyLookupTable[127 - readUint8(decoder)](decoder)\n\n/**\n * T must not be null.\n *\n * @template T\n */\nexport class RleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {function(Decoder):T} reader\n */\n constructor (uint8Array, reader) {\n super(uint8Array)\n /**\n * The reader\n */\n this.reader = reader\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = this.reader(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {T} */ (this.s)\n }\n}\n\nexport class IntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @return {number}\n */\n read () {\n this.s += readVarInt(this)\n return this.s\n }\n}\n\nexport class RleIntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n this.s += readVarInt(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class UintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class IncUintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s++)\n }\n}\n\nexport class IntDiffOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n const diff = readVarInt(this)\n // if the first bit is set, we read more data\n const hasCount = diff & 1\n this.diff = math.floor(diff / 2) // shift >> 1\n this.count = 1\n if (hasCount) {\n this.count = readVarUint(this) + 2\n }\n }\n this.s += this.diff\n this.count--\n return this.s\n }\n}\n\nexport class StringDecoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n this.decoder = new UintOptRleDecoder(uint8Array)\n this.str = readVarString(this.decoder)\n /**\n * @type {number}\n */\n this.spos = 0\n }\n\n /**\n * @return {string}\n */\n read () {\n const end = this.spos + this.decoder.read()\n const res = this.str.slice(this.spos, end)\n this.spos = end\n return res\n }\n}\n","/**\n * Utility module to work with time.\n *\n * @module time\n */\n\nimport * as metric from './metric.js'\nimport * as math from './math.js'\n\n/**\n * Return current time.\n *\n * @return {Date}\n */\nexport const getDate = () => new Date()\n\n/**\n * Return current unix time.\n *\n * @return {number}\n */\nexport const getUnixTime = Date.now\n\n/**\n * Transform time (in ms) to a human readable format. E.g. 1100 => 1.1s. 60s => 1min. .001 => 10μs.\n *\n * @param {number} d duration in milliseconds\n * @return {string} humanized approximation of time\n */\nexport const humanizeDuration = d => {\n if (d < 60000) {\n const p = metric.prefix(d, -1)\n return math.round(p.n * 100) / 100 + p.prefix + 's'\n }\n d = math.floor(d / 1000)\n const seconds = d % 60\n const minutes = math.floor(d / 60) % 60\n const hours = math.floor(d / 3600) % 24\n const days = math.floor(d / 86400)\n if (days > 0) {\n return days + 'd' + ((hours > 0 || minutes > 30) ? ' ' + (minutes > 30 ? hours + 1 : hours) + 'h' : '')\n }\n if (hours > 0) {\n /* c8 ignore next */\n return hours + 'h' + ((minutes > 0 || seconds > 30) ? ' ' + (seconds > 30 ? minutes + 1 : minutes) + 'min' : '')\n }\n return minutes + 'min' + (seconds > 0 ? ' ' + seconds + 's' : '')\n}\n","/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * @template K\n * @template V\n * @typedef {Map<K,V>} GlobalMap\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n const r = create()\n m.forEach((v, k) => { r.set(k, v) })\n return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n let set = map.get(key)\n if (set === undefined) {\n map.set(key, set = createT())\n }\n return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n const res = []\n for (const [key, value] of m) {\n res.push(f(value, key))\n }\n return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n for (const [key, value] of m) {\n if (f(value, key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n for (const [key, value] of m) {\n if (!f(value, key)) {\n return false\n }\n }\n return true\n}\n","/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n * @experimental\n *\n * This is basically a (better typed) duplicate of Observable, which will replace Observable in the\n * next release.\n *\n * @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS\n */\nexport class ObservableV2 {\n constructor () {\n /**\n * Some desc.\n * @type {Map<string, Set<any>>}\n */\n this._observers = map.create()\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, /** @type {string} */ (name), set.create).add(f)\n return f\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, /** @type {any} */ (_f))\n f(...args)\n }\n this.on(name, /** @type {any} */ (_f))\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name The event name.\n * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n\n/* c8 ignore start */\n/**\n * Handles named events.\n *\n * @deprecated\n * @template N\n */\nexport class Observable {\n constructor () {\n /**\n * Some desc.\n * @type {Map<N, any>}\n */\n this._observers = map.create()\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, name, set.create).add(f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, _f)\n f(...args)\n }\n this.on(name, _f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @param {N} name The event name.\n * @param {Array<any>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n/* c8 ignore end */\n","export const EqualityTraitSymbol = Symbol('Equality')\n\n/**\n * @typedef {{ [EqualityTraitSymbol]:(other:EqualityTrait)=>boolean }} EqualityTrait\n */\n\n/**\n *\n * Utility function to compare any two objects.\n *\n * Note that it is expected that the first parameter is more specific than the latter one.\n *\n * @example js\n * class X { [traits.EqualityTraitSymbol] (other) { return other === this } }\n * class X2 { [traits.EqualityTraitSymbol] (other) { return other === this }, x2 () { return 2 } }\n * // this is fine\n * traits.equals(new X2(), new X())\n * // this is not, because the left type is less specific than the right one\n * traits.equals(new X(), new X2())\n *\n * @template {EqualityTrait} T\n * @param {NoInfer<T>} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equals = (a, b) => a === b || !!a?.[EqualityTraitSymbol]?.(b) || false\n","import * as equalityTrait from './trait/equality.js'\n\n/**\n * Utility functions for working with EcmaScript objects.\n *\n * @module object\n */\n\n/**\n * @return {Object<string,any>} obj\n */\nexport const create = () => Object.create(null)\n\n/**\n * @param {any} o\n * @return {o is { [k:string]:any }}\n */\nexport const isObject = o => typeof o === 'object'\n\n/**\n * Object.assign\n */\nexport const assign = Object.assign\n\n/**\n * @param {Object<string,any>} obj\n */\nexport const keys = Object.keys\n\n/**\n * @template V\n * @param {{[key:string]: V}} obj\n * @return {Array<V>}\n */\nexport const values = Object.values\n\n/**\n * @template V\n * @param {{[k:string]:V}} obj\n * @param {function(V,string):any} f\n */\nexport const forEach = (obj, f) => {\n for (const key in obj) {\n f(obj[key], key)\n }\n}\n\n/**\n * @todo implement mapToArray & map\n *\n * @template R\n * @param {Object<string,any>} obj\n * @param {function(any,string):R} f\n * @return {Array<R>}\n */\nexport const map = (obj, f) => {\n const results = []\n for (const key in obj) {\n results.push(f(obj[key], key))\n }\n return results\n}\n\n/**\n * @deprecated use object.size instead\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const length = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const size = obj => keys(obj).length\n\n/**\n * @template {{ [key:string|number|symbol]: any }} T\n * @param {T} obj\n * @param {(v:T[keyof T],k:keyof T)=>boolean} f\n * @return {boolean}\n */\nexport const some = (obj, f) => {\n for (const key in obj) {\n if (f(obj[key], key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @param {Object|null|undefined} obj\n */\nexport const isEmpty = obj => {\n // eslint-disable-next-line no-unreachable-loop\n for (const _k in obj) {\n return false\n }\n return true\n}\n\n/**\n * @template {{ [key:string|number|symbol]: any }} T\n * @param {T} obj\n * @param {(v:T[keyof T],k:keyof T)=>boolean} f\n * @return {boolean}\n */\nexport const every = (obj, f) => {\n for (const key in obj) {\n if (!f(obj[key], key)) {\n return false\n }\n }\n return true\n}\n\n/**\n * Calls `Object.prototype.hasOwnProperty`.\n *\n * @param {any} obj\n * @param {string|number|symbol} key\n * @return {boolean}\n */\nexport const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * @param {Object<string,any>} a\n * @param {Object<string,any>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a === b || (size(a) === size(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && equalityTrait.equals(b[key], val)))\n\n/**\n * Make an object immutable. This hurts performance and is usually not needed if you perform good\n * coding practices.\n */\nexport const freeze = Object.freeze\n\n/**\n * Make an object and all its children immutable.\n * This *really* hurts performance and is usually not needed if you perform good coding practices.\n *\n * @template {any} T\n * @param {T} o\n * @return {Readonly<T>}\n */\nexport const deepFreeze = (o) => {\n for (const key in o) {\n const c = o[key]\n if (typeof c === 'object' || typeof c === 'function') {\n deepFreeze(o[key])\n }\n }\n return freeze(o)\n}\n\n/**\n * Get object property. Create T if property is undefined and set T on object.\n *\n * @function\n * @template {object} KV\n * @template {keyof KV} [K=keyof KV]\n * @param {KV} o\n * @param {K} key\n * @param {() => KV[K]} createT\n * @return {KV[K]}\n */\nexport const setIfUndefined = (o, key, createT) => hasProperty(o, key) ? o[key] : (o[key] = createT())\n","/**\n * Common functions and function call helpers.\n *\n * @module function\n */\n\nimport * as array from './array.js'\nimport * as object from './object.js'\nimport * as equalityTrait from './trait/equality.js'\n\n/**\n * Calls all functions in `fs` with args. Only throws after all functions were called.\n *\n * @param {Array<function>} fs\n * @param {Array<any>} args\n */\nexport const callAll = (fs, args, i = 0) => {\n try {\n for (; i < fs.length; i++) {\n fs[i](...args)\n }\n } finally {\n if (i < fs.length) {\n callAll(fs, args, i + 1)\n }\n }\n}\n\nexport const nop = () => {}\n\n/**\n * @template T\n * @param {function():T} f\n * @return {T}\n */\nexport const apply = f => f()\n\n/**\n * @template A\n *\n * @param {A} a\n * @return {A}\n */\nexport const id = a => a\n\n/**\n * @template T\n *\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equalityStrict = (a, b) => a === b\n\n/**\n * @template T\n *\n * @param {Array<T>|object} a\n * @param {Array<T>|object} b\n * @return {boolean}\n */\nexport const equalityFlat = (a, b) => a === b || (a != null && b != null && a.constructor === b.constructor && ((array.isArray(a) && array.equalFlat(a, /** @type {Array<T>} */ (b))) || (typeof a === 'object' && object.equalFlat(a, b))))\n\n/* c8 ignore start */\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nexport const equalityDeep = (a, b) => {\n if (a === b) {\n return true\n }\n if (a == null || b == null || (a.constructor !== b.constructor && (a.constructor || Object) !== (b.constructor || Object))) {\n return false\n }\n if (a[equalityTrait.EqualityTraitSymbol] != null) {\n return a[equalityTrait.EqualityTraitSymbol](b)\n }\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n return false\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false\n }\n }\n break\n }\n case Map: {\n if (a.size !== b.size) {\n return false\n }\n for (const key of a.keys()) {\n if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {\n return false\n }\n }\n break\n }\n case undefined:\n case Object:\n if (object.size(a) !== object.size(b)) {\n return false\n }\n for (const key in a) {\n if (!object.hasProperty(a, key) || !equalityDeep(a[key], b[key])) {\n return false\n }\n }\n break\n case Array:\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (!equalityDeep(a[i], b[i])) {\n return false\n }\n }\n break\n default:\n return false\n }\n return true\n}\n\n/**\n * @template V\n * @template {V} OPTS\n *\n * @param {V} value\n * @param {Array<OPTS>} options\n */\n// @ts-ignore\nexport const isOneOf = (value, options) => options.includes(value)\n/* c8 ignore stop */\n\nexport const isArray = array.isArray\n\n/**\n * @param {any} s\n * @return {s is String}\n */\nexport const isString = (s) => s && s.constructor === String\n\n/**\n * @param {any} n\n * @return {n is Number}\n */\nexport const isNumber = n => n != null && n.constructor === Number\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {any} n\n * @param {TYPE} T\n * @return {n is InstanceType<TYPE>}\n */\nexport const is = (n, T) => n && n.constructor === T\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {TYPE} T\n */\nexport const isTemplate = (T) =>\n /**\n * @param {any} n\n * @return {n is InstanceType<TYPE>}\n **/\n n => n && n.constructor === T\n","/**\n * @module awareness-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as time from 'lib0/time'\nimport * as math from 'lib0/math'\nimport { Observable } from 'lib0/observable'\nimport * as f from 'lib0/function'\nimport * as Y from 'yjs' // eslint-disable-line\n\nexport const outdatedTimeout = 30000\n\n/**\n * @typedef {Object} MetaClientState\n * @property {number} MetaClientState.clock\n * @property {number} MetaClientState.lastUpdated unix timestamp\n */\n\n/**\n * The Awareness class implements a simple shared state protocol that can be used for non-persistent data like awareness information\n * (cursor, username, status, ..). Each client can update its own local state and listen to state changes of\n * remote clients. Every client may set a state of a remote peer to `null` to mark the client as offline.\n *\n * Each client is identified by a unique client id (something we borrow from `doc.clientID`). A client can override\n * its own state by propagating a message with an increasing timestamp (`clock`). If such a message is received, it is\n * applied if the known state of that client is older than the new state (`clock < newClock`). If a client thinks that\n * a remote client is offline, it may propagate a message with\n * `{ clock: currentClientClock, state: null, client: remoteClient }`. If such a\n * message is received, and the known clock of that client equals the received clock, it will override the state with `null`.\n *\n * Before a client disconnects, it should propagate a `null` state with an updated clock.\n *\n * Awareness states must be updated every 30 seconds. Otherwise the Awareness instance will delete the client state.\n *\n * @extends {Observable<string>}\n */\nexport class Awareness extends Observable {\n /**\n * @param {Y.Doc} doc\n */\n constructor (doc) {\n super()\n this.doc = doc\n /**\n * @type {number}\n */\n this.clientID = doc.clientID\n /**\n * Maps from client id to client state\n * @type {Map<number, Object<string, any>>}\n */\n this.states = new Map()\n /**\n * @type {Map<number, MetaClientState>}\n */\n this.meta = new Map()\n this._checkInterval = /** @type {any} */ (setInterval(() => {\n const now = time.getUnixTime()\n if (this.getLocalState() !== null && (outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ (this.meta.get(this.clientID)).lastUpdated)) {\n // renew local clock\n this.setLocalState(this.getLocalState())\n }\n /**\n * @type {Array<number>}\n */\n const remove = []\n this.meta.forEach((meta, clientid) => {\n if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) {\n remove.push(clientid)\n }\n })\n if (remove.length > 0) {\n removeAwarenessStates(this, remove, 'timeout')\n }\n }, math.floor(outdatedTimeout / 10)))\n doc.on('destroy', () => {\n this.destroy()\n })\n this.setLocalState({})\n }\n\n destroy () {\n this.emit('destroy', [this])\n this.setLocalState(null)\n super.destroy()\n clearInterval(this._checkInterval)\n }\n\n /**\n * @return {Object<string,any>|null}\n */\n getLocalState () {\n return this.states.get(this.clientID) || null\n }\n\n /**\n * @param {Object<string,any>|null} state\n */\n setLocalState (state) {\n const clientID = this.clientID\n const currLocalMeta = this.meta.get(clientID)\n const clock = currLocalMeta === undefined ? 0 : currLocalMeta.clock + 1\n const prevState = this.states.get(clientID)\n if (state === null) {\n this.states.delete(clientID)\n } else {\n this.states.set(clientID, state)\n }\n this.meta.set(clientID, {\n clock,\n lastUpdated: time.getUnixTime()\n })\n const added = []\n const updated = []\n const filteredUpdated = []\n const removed = []\n if (state === null) {\n removed.push(clientID)\n } else if (prevState == null) {\n if (state != null) {\n added.push(clientID)\n }\n } else {\n updated.push(clientID)\n if (!f.equalityDeep(prevState, state)) {\n filteredUpdated.push(clientID)\n }\n }\n if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n this.emit('change', [{ added, updated: filteredUpdated, removed }, 'local'])\n }\n this.emit('update', [{ added, updated, removed }, 'local'])\n }\n\n /**\n * @param {string} field\n * @param {any} value\n */\n setLocalStateField (field, value) {\n const state = this.getLocalState()\n if (state !== null) {\n this.setLocalState({\n ...state,\n [field]: value\n })\n }\n }\n\n /**\n * @return {Map<number,Object<string,any>>}\n */\n getStates () {\n return this.states\n }\n}\n\n/**\n * Mark (remote) clients as inactive and remove them from the list of active peers.\n * This change will be propagated to remote clients.\n *\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @param {any} origin\n */\nexport const removeAwarenessStates = (awareness, clients, origin) => {\n const removed = []\n for (let i = 0; i < clients.length; i++) {\n const clientID = clients[i]\n if (awareness.states.has(clientID)) {\n awareness.states.delete(clientID)\n if (clientID === awareness.clientID) {\n const curMeta = /** @type {MetaClientState} */ (awareness.meta.get(clientID))\n awareness.meta.set(clientID, {\n clock: curMeta.clock + 1,\n lastUpdated: time.getUnixTime()\n })\n }\n removed.push(clientID)\n }\n }\n if (removed.length > 0) {\n awareness.emit('change', [{ added: [], updated: [], removed }, origin])\n awareness.emit('update', [{ added: [], updated: [], removed }, origin])\n }\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @return {Uint8Array}\n */\nexport const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => {\n const len = clients.length\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n const clientID = clients[i]\n const state = states.get(clientID) || null\n const clock = /** @type {MetaClientState} */ (awareness.meta.get(clientID)).clock\n encoding.writeVarUint(encoder, clientID)\n encoding.writeVarUint(encoder, clock)\n encoding.writeVarString(encoder, JSON.stringify(state))\n }\n return encoding.toUint8Array(encoder)\n}\n\n/**\n * Modify the content of an awareness update before re-encoding it to an awareness update.\n *\n * This might be useful when you have a central server that wants to ensure that clients\n * cant hijack somebody elses identity.\n *\n * @param {Uint8Array} update\n * @param {function(any):any} modify\n * @return {Uint8Array}\n */\nexport const modifyAwarenessUpdate = (update, modify) => {\n const decoder = decoding.createDecoder(update)\n const encoder = encoding.createEncoder()\n const len = decoding.readVarUint(decoder)\n encoding.writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n const clientID = decoding.readVarUint(decoder)\n const clock = decoding.readVarUint(decoder)\n const state = JSON.parse(decoding.readVarString(decoder))\n const modifiedState = modify(state)\n encoding.writeVarUint(encoder, clientID)\n encoding.writeVarUint(encoder, clock)\n encoding.writeVarString(encoder, JSON.stringify(modifiedState))\n }\n return encoding.toUint8Array(encoder)\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Uint8Array} update\n * @param {any} origin This will be added to the emitted change event\n */\nexport const applyAwarenessUpdate = (awareness, update, origin) => {\n const decoder = decoding.createDecoder(update)\n const timestamp = time.getUnixTime()\n const added = []\n const updated = []\n const filteredUpdated = []\n const removed = []\n const len = decoding.readVarUint(decoder)\n for (let i = 0; i < len; i++) {\n const clientID = decoding.readVarUint(decoder)\n let clock = decoding.readVarUint(decoder)\n const state = JSON.parse(decoding.readVarString(decoder))\n const clientMeta = awareness.meta.get(clientID)\n const prevState = awareness.states.get(clientID)\n const currClock = clientMeta === undefined ? 0 : clientMeta.clock\n if (currClock < clock || (currClock === clock && state === null && awareness.states.has(clientID))) {\n if (state === null) {\n // never let a remote client remove this local state\n if (clientID === awareness.clientID && awareness.getLocalState() != null) {\n // remote client removed the local state. Do not remote state. Broadcast a message indicating\n // that this client still exists by increasing the clock\n clock++\n } else {\n awareness.states.delete(clientID)\n }\n } else {\n awareness.states.set(clientID, state)\n }\n awareness.meta.set(clientID, {\n clock,\n lastUpdated: timestamp\n })\n if (clientMeta === undefined && state !== null) {\n added.push(clientID)\n } else if (clientMeta !== undefined && state === null) {\n removed.push(clientID)\n } else if (state !== null) {\n if (!f.equalityDeep(state, prevState)) {\n filteredUpdated.push(clientID)\n }\n updated.push(clientID)\n }\n }\n }\n if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n awareness.emit('change', [{\n added, updated: filteredUpdated, removed\n }, origin])\n }\n if (added.length > 0 || updated.length > 0 || removed.length > 0) {\n awareness.emit('update', [{\n added, updated, removed\n }, origin])\n }\n}\n","export default class EventEmitter {\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tpublic callbacks: { [key: string]: Function[] } = {};\n\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tpublic on(event: string, fn: Function): this {\n\t\tif (!this.callbacks[event]) {\n\t\t\tthis.callbacks[event] = [];\n\t\t}\n\n\t\tthis.callbacks[event].push(fn);\n\n\t\treturn this;\n\t}\n\n\tprotected emit(event: string, ...args: any): this {\n\t\tconst callbacks = this.callbacks[event];\n\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => callback.apply(this, args));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tpublic off(event: string, fn?: Function): this {\n\t\tconst callbacks = this.callbacks[event];\n\n\t\tif (callbacks) {\n\t\t\tif (fn) {\n\t\t\t\tthis.callbacks[event] = callbacks.filter((callback) => callback !== fn);\n\t\t\t} else {\n\t\t\t\tdelete this.callbacks[event];\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tremoveAllListeners(): void {\n\t\tthis.callbacks = {};\n\t}\n}\n","import type { Decoder } from \"lib0/decoding\";\nimport {\n\tcreateDecoder,\n\tpeekVarString,\n\treadVarUint,\n\treadVarUint8Array,\n\treadVarString,\n} from \"lib0/decoding\";\nimport type { Encoder } from \"lib0/encoding\";\nimport {\n\tcreateEncoder,\n\twriteVarUint,\n\twriteVarUint8Array,\n\twriteVarString,\n\tlength,\n} from \"lib0/encoding\";\nimport type { MessageType } from \"./types.ts\";\n\nexport class IncomingMessage {\n\tdata: any;\n\n\tencoder: Encoder;\n\n\tdecoder: Decoder;\n\n\tconstructor(data: any) {\n\t\tthis.data = data;\n\t\tthis.encoder = createEncoder();\n\t\tthis.decoder = createDecoder(new Uint8Array(this.data));\n\t}\n\n\tpeekVarString(): string {\n\t\treturn peekVarString(this.decoder);\n\t}\n\n\treadVarUint(): MessageType {\n\t\treturn readVarUint(this.decoder);\n\t}\n\n\treadVarString(): string {\n\t\treturn readVarString(this.decoder);\n\t}\n\n\treadVarUint8Array() {\n\t\treturn readVarUint8Array(this.decoder);\n\t}\n\n\twriteVarUint(type: MessageType) {\n\t\treturn writeVarUint(this.encoder, type);\n\t}\n\n\twriteVarString(string: string) {\n\t\treturn writeVarString(this.encoder, string);\n\t}\n\n\twriteVarUint8Array(data: Uint8Array) {\n\t\treturn writeVarUint8Array(this.encoder, data);\n\t}\n\n\tlength() {\n\t\treturn length(this.encoder);\n\t}\n}\n","import type { Encoder } from \"lib0/encoding\";\nimport type { Event, MessageEvent } from \"ws\";\nimport type { Awareness } from \"y-protocols/awareness\";\nimport type * as Y from \"yjs\";\nimport type { CloseEvent } from \"@abraca/dabra-common\";\nimport type { IncomingMessage } from \"./IncomingMessage.ts\";\nimport type { OutgoingMessage } from \"./OutgoingMessage.ts\";\nimport type { AuthenticationMessage } from \"./OutgoingMessages/AuthenticationMessage.ts\";\nimport type { AwarenessMessage } from \"./OutgoingMessages/AwarenessMessage.ts\";\nimport type { QueryAwarenessMessage } from \"./OutgoingMessages/QueryAwarenessMessage.ts\";\nimport type { SyncStepOneMessage } from \"./OutgoingMessages/SyncStepOneMessage.ts\";\nimport type { SyncStepTwoMessage } from \"./OutgoingMessages/SyncStepTwoMessage.ts\";\nimport type { UpdateMessage } from \"./OutgoingMessages/UpdateMessage.ts\";\n\nexport enum MessageType {\n Sync = 0,\n Awareness = 1,\n Auth = 2,\n QueryAwareness = 3,\n Subdoc = 4,\n Stateless = 5,\n CLOSE = 7,\n SyncStatus = 8,\n}\n\nexport enum WebSocketStatus {\n Connecting = \"connecting\",\n Connected = \"connected\",\n Disconnected = \"disconnected\",\n}\n\nexport type AuthorizedScope = \"read-write\" | \"readonly\";\n\nexport interface OutgoingMessageInterface {\n encoder: Encoder;\n type?: MessageType;\n}\n\nexport interface OutgoingMessageArguments {\n documentName: string;\n token: string;\n document: Y.Doc;\n awareness: Awareness;\n clients: number[];\n states: Map<number, { [key: string]: any }>;\n update: any;\n payload: string;\n encoder: Encoder;\n}\n\nexport interface Constructable<T> {\n new (...args: any): T;\n}\n\nexport type ConstructableOutgoingMessage =\n | Constructable<AuthenticationMessage>\n | Constructable<AwarenessMessage>\n | Constructable<QueryAwarenessMessage>\n | Constructable<SyncStepOneMessage>\n | Constructable<SyncStepTwoMessage>\n | Constructable<UpdateMessage>;\n\nexport type onAuthenticationFailedParameters = {\n reason: string;\n};\n\nexport type onAuthenticatedParameters = {\n scope: AuthorizedScope;\n};\n\nexport type onOpenParameters = {\n event: Event;\n};\n\nexport type onMessageParameters = {\n event: MessageEvent;\n message: IncomingMessage;\n};\n\nexport type onOutgoingMessageParameters = {\n message: OutgoingMessage;\n};\n\nexport type onStatusParameters = {\n status: WebSocketStatus;\n};\n\nexport type onSyncedParameters = {\n state: boolean;\n};\n\nexport type onUnsyncedChangesParameters = {\n number: number;\n};\n\nexport type onDisconnectParameters = {\n event: CloseEvent;\n};\n\nexport type onCloseParameters = {\n event: CloseEvent;\n};\n\nexport type onAwarenessUpdateParameters = {\n states: StatesArray;\n};\n\nexport type onAwarenessChangeParameters = {\n states: StatesArray;\n};\n\nexport type onStatelessParameters = {\n payload: string;\n};\n\nexport type StatesArray = { clientId: number; [key: string | number]: any }[];\n\n// ── Abracadabra extensions ────────────────────────────────────────────────────\n\nexport type EffectiveRole = \"owner\" | \"editor\" | \"viewer\" | null;\n\n/**\n * Ed25519 identity for passwordless crypto auth.\n *\n * The public key is the sole identifier sent to the server during the\n * challenge-response handshake. Username is decoupled from auth and is\n * managed separately as a mutable display name (see PATCH /users/me).\n */\nexport interface CryptoIdentity {\n /** base64url-encoded Ed25519 public key (32 bytes). Primary auth identifier. */\n publicKey: string;\n}\n\nexport interface SubdocRegisteredEvent {\n childId: string;\n parentId: string;\n}\n\nexport type onSubdocRegisteredParameters = SubdocRegisteredEvent;\n\nexport type onSubdocLoadedParameters = {\n childId: string;\n provider: import(\"./AbracadabraProvider.ts\").AbracadabraProvider;\n};\n\nexport interface AbracadabraOutgoingMessageArguments extends OutgoingMessageArguments {\n childDocumentName: string;\n}\n\n// ── REST API response types ──────────────────────────────────────────────────\n\nexport interface UserProfile {\n id: string;\n username: string;\n email: string | null;\n displayName: string | null;\n}\n\nexport interface DocumentMeta {\n id: string;\n parent_id: string | null;\n}\n\nexport interface UploadMeta {\n id: string;\n doc_id: string;\n filename: string;\n}\n\nexport interface UploadInfo {\n id: string;\n filename: string;\n mime_type: string;\n size: number;\n}\n\nexport interface PublicKeyInfo {\n id: string;\n publicKey: string;\n deviceName: string | null;\n revoked: boolean;\n}\n\nexport interface HealthStatus {\n status: string;\n version: string;\n active_documents: number;\n}\n","import type { Encoder } from \"lib0/encoding\";\nimport { createEncoder, toUint8Array } from \"lib0/encoding\";\nimport type {\n\tMessageType,\n\tOutgoingMessageArguments,\n\tOutgoingMessageInterface,\n} from \"./types.ts\";\n\nexport class OutgoingMessage implements OutgoingMessageInterface {\n\tencoder: Encoder;\n\n\ttype?: MessageType;\n\n\tconstructor() {\n\t\tthis.encoder = createEncoder();\n\t}\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\treturn args.encoder;\n\t}\n\n\ttoUint8Array() {\n\t\treturn toUint8Array(this.encoder);\n\t}\n}\n","import * as encoding from \"lib0/encoding\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class CloseMessage extends OutgoingMessage {\n\ttype = MessageType.CLOSE;\n\n\tdescription = \"Ask the server to close the connection\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tencoding.writeVarString(this.encoder, args.documentName!);\n\t\tencoding.writeVarUint(this.encoder, this.type);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { WsReadyStates } from \"@abraca/dabra-common\";\nimport { retry } from \"@lifeomic/attempt\";\nimport * as time from \"lib0/time\";\nimport type { Event, MessageEvent } from \"ws\";\nimport EventEmitter from \"./EventEmitter.ts\";\nimport type { HocuspocusProvider } from \"./HocuspocusProvider.ts\";\nimport { IncomingMessage } from \"./IncomingMessage.ts\";\nimport { CloseMessage } from \"./OutgoingMessages/CloseMessage.ts\";\nimport {\n WebSocketStatus,\n type onAwarenessChangeParameters,\n type onAwarenessUpdateParameters,\n type onCloseParameters,\n type onDisconnectParameters,\n type onMessageParameters,\n type onOpenParameters,\n type onOutgoingMessageParameters,\n type onStatusParameters,\n} from \"./types.ts\";\n\nexport type HocuspocusWebSocket = WebSocket & { identifier: string };\nexport type HocusPocusWebSocket = HocuspocusWebSocket;\n\nexport type HocuspocusProviderWebsocketConfiguration = Required<\n Pick<CompleteHocuspocusProviderWebsocketConfiguration, \"url\">\n> &\n Partial<CompleteHocuspocusProviderWebsocketConfiguration>;\n\nexport interface CompleteHocuspocusProviderWebsocketConfiguration {\n /**\n * Whether to connect automatically when creating the provider instance. Default=true\n */\n autoConnect: boolean;\n\n /**\n * URL of your @hocuspocus/server instance\n */\n url: string;\n\n /**\n * By default, trailing slashes are removed from the URL. Set this to true\n * to preserve trailing slashes if your server configuration requires them.\n */\n preserveTrailingSlash: boolean;\n\n /**\n * An optional WebSocket polyfill, for example for Node.js\n */\n WebSocketPolyfill: any;\n\n /**\n * Disconnect when no message is received for the defined amount of milliseconds.\n */\n messageReconnectTimeout: number;\n /**\n * The delay between each attempt in milliseconds. You can provide a factor to have the delay grow exponentially.\n */\n delay: number;\n /**\n * The initialDelay is the amount of time to wait before making the first attempt. This option should typically be 0 since you typically want the first attempt to happen immediately.\n */\n initialDelay: number;\n /**\n * The factor option is used to grow the delay exponentially.\n */\n factor: number;\n /**\n * The maximum number of attempts or 0 if there is no limit on number of attempts.\n */\n maxAttempts: number;\n /**\n * minDelay is used to set a lower bound of delay when jitter is enabled. This property has no effect if jitter is disabled.\n */\n minDelay: number;\n /**\n * The maxDelay option is used to set an upper bound for the delay when factor is enabled. A value of 0 can be provided if there should be no upper bound when calculating delay.\n */\n maxDelay: number;\n /**\n * If jitter is true then the calculated delay will be a random integer value between minDelay and the calculated delay for the current iteration.\n */\n jitter: boolean;\n /**\n * A timeout in milliseconds. If timeout is non-zero then a timer is set using setTimeout. If the timeout is triggered then future attempts will be aborted.\n */\n timeout: number;\n handleTimeout: (() => Promise<unknown>) | null;\n onOpen: (data: onOpenParameters) => void;\n onConnect: () => void;\n onMessage: (data: onMessageParameters) => void;\n onOutgoingMessage: (data: onOutgoingMessageParameters) => void;\n onStatus: (data: onStatusParameters) => void;\n onDisconnect: (data: onDisconnectParameters) => void;\n onClose: (data: onCloseParameters) => void;\n onDestroy: () => void;\n onAwarenessUpdate: (data: onAwarenessUpdateParameters) => void;\n onAwarenessChange: (data: onAwarenessChangeParameters) => void;\n\n /**\n * Map of attached providers keyed by documentName.\n */\n providerMap: Map<string, HocuspocusProvider>;\n}\n\nexport class HocuspocusProviderWebsocket extends EventEmitter {\n private messageQueue: any[] = [];\n\n public configuration: CompleteHocuspocusProviderWebsocketConfiguration = {\n url: \"\",\n autoConnect: true,\n preserveTrailingSlash: false,\n // @ts-ignore\n document: undefined,\n WebSocketPolyfill: undefined,\n // TODO: this should depend on awareness.outdatedTime\n messageReconnectTimeout: 30000,\n // 1 second\n delay: 1000,\n // instant\n initialDelay: 0,\n // double the delay each time\n factor: 2,\n // unlimited retries\n maxAttempts: 0,\n // wait at least 1 second\n minDelay: 1000,\n // at least every 30 seconds\n maxDelay: 30000,\n // randomize\n jitter: true,\n // retry forever\n timeout: 0,\n onOpen: () => null,\n onConnect: () => null,\n onMessage: () => null,\n onOutgoingMessage: () => null,\n onStatus: () => null,\n onDisconnect: () => null,\n onClose: () => null,\n onDestroy: () => null,\n onAwarenessUpdate: () => null,\n onAwarenessChange: () => null,\n handleTimeout: null,\n providerMap: new Map(),\n };\n\n webSocket: HocusPocusWebSocket | null = null;\n\n webSocketHandlers: { [key: string]: any } = {};\n\n shouldConnect = true;\n\n status = WebSocketStatus.Disconnected;\n\n lastMessageReceived = 0;\n\n identifier = 0;\n\n intervals: any = {\n connectionChecker: null,\n };\n\n connectionAttempt: {\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n } | null = null;\n\n constructor(configuration: HocuspocusProviderWebsocketConfiguration) {\n super();\n this.setConfiguration(configuration);\n\n this.configuration.WebSocketPolyfill = configuration.WebSocketPolyfill\n ? configuration.WebSocketPolyfill\n : WebSocket;\n\n this.on(\"open\", this.configuration.onOpen);\n this.on(\"open\", this.onOpen.bind(this));\n this.on(\"connect\", this.configuration.onConnect);\n this.on(\"message\", this.configuration.onMessage);\n this.on(\"outgoingMessage\", this.configuration.onOutgoingMessage);\n this.on(\"status\", this.configuration.onStatus);\n this.on(\"disconnect\", this.configuration.onDisconnect);\n this.on(\"close\", this.configuration.onClose);\n this.on(\"destroy\", this.configuration.onDestroy);\n this.on(\"awarenessUpdate\", this.configuration.onAwarenessUpdate);\n this.on(\"awarenessChange\", this.configuration.onAwarenessChange);\n\n this.on(\"close\", this.onClose.bind(this));\n this.on(\"message\", this.onMessage.bind(this));\n\n this.intervals.connectionChecker = setInterval(\n this.checkConnection.bind(this),\n this.configuration.messageReconnectTimeout / 10,\n );\n\n if (this.shouldConnect) {\n this.connect();\n }\n }\n\n receivedOnOpenPayload?: Event | undefined = undefined;\n\n async onOpen(event: Event) {\n this.status = WebSocketStatus.Connected;\n this.emit(\"status\", { status: WebSocketStatus.Connected });\n\n this.cancelWebsocketRetry = undefined;\n this.receivedOnOpenPayload = event;\n }\n\n attach(provider: HocuspocusProvider) {\n this.configuration.providerMap.set(provider.configuration.name, provider);\n\n if (this.status === WebSocketStatus.Disconnected && this.shouldConnect) {\n this.connect();\n }\n\n if (this.receivedOnOpenPayload && this.status === WebSocketStatus.Connected) {\n provider.onOpen(this.receivedOnOpenPayload);\n }\n }\n\n detach(provider: HocuspocusProvider) {\n if (this.configuration.providerMap.has(provider.configuration.name)) {\n provider.send(CloseMessage, {\n documentName: provider.configuration.name,\n });\n this.configuration.providerMap.delete(provider.configuration.name);\n }\n }\n\n public setConfiguration(\n configuration: Partial<HocuspocusProviderWebsocketConfiguration> = {},\n ): void {\n this.configuration = { ...this.configuration, ...configuration };\n\n if (!this.configuration.autoConnect) {\n this.shouldConnect = false;\n }\n }\n\n cancelWebsocketRetry?: () => void;\n\n async connect() {\n if (this.status === WebSocketStatus.Connected) {\n return;\n }\n\n // Always cancel any previously initiated connection retryer instances\n if (this.cancelWebsocketRetry) {\n this.cancelWebsocketRetry();\n this.cancelWebsocketRetry = undefined;\n }\n\n this.receivedOnOpenPayload = undefined;\n this.shouldConnect = true;\n\n const abortableRetry = () => {\n let cancelAttempt = false;\n\n const retryPromise = retry(this.createWebSocketConnection.bind(this), {\n delay: this.configuration.delay,\n initialDelay: this.configuration.initialDelay,\n factor: this.configuration.factor,\n maxAttempts: this.configuration.maxAttempts,\n minDelay: this.configuration.minDelay,\n maxDelay: this.configuration.maxDelay,\n jitter: this.configuration.jitter,\n timeout: this.configuration.timeout,\n handleTimeout: this.configuration.handleTimeout,\n beforeAttempt: (context) => {\n if (!this.shouldConnect || cancelAttempt) {\n context.abort();\n }\n },\n }).catch((error: any) => {\n // If we aborted the connection attempt then don’t throw an error\n // ref: https://github.com/lifeomic/attempt/blob/master/src/index.ts#L136\n if (error && error.code !== \"ATTEMPT_ABORTED\") {\n throw error;\n }\n });\n\n return {\n retryPromise,\n cancelFunc: () => {\n cancelAttempt = true;\n },\n };\n };\n\n const { retryPromise, cancelFunc } = abortableRetry();\n this.cancelWebsocketRetry = cancelFunc;\n\n return retryPromise;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n attachWebSocketListeners(ws: HocusPocusWebSocket, reject: Function) {\n const { identifier } = ws;\n const onMessageHandler = (payload: any) => this.emit(\"message\", payload);\n const onCloseHandler = (payload: any) => this.emit(\"close\", { event: payload });\n const onOpenHandler = (payload: any) => this.emit(\"open\", payload);\n const onErrorHandler = (err: any) => {\n reject(err);\n };\n\n this.webSocketHandlers[identifier] = {\n message: onMessageHandler,\n close: onCloseHandler,\n open: onOpenHandler,\n error: onErrorHandler,\n };\n\n const handlers = this.webSocketHandlers[ws.identifier];\n\n Object.keys(handlers).forEach((name) => {\n ws.addEventListener(name, handlers[name]);\n });\n }\n\n cleanupWebSocket() {\n if (!this.webSocket) {\n return;\n }\n const { identifier } = this.webSocket;\n const handlers = this.webSocketHandlers[identifier];\n\n Object.keys(handlers).forEach((name) => {\n this.webSocket?.removeEventListener(name, handlers[name]);\n delete this.webSocketHandlers[identifier];\n });\n\n try {\n // Check if the WebSocket is still in CONNECTING state (0)\n // If so, calling close() might throw in some environments or be race-prone\n if (this.webSocket.readyState !== 0 && this.webSocket.readyState !== 3) {\n this.webSocket.close();\n }\n } catch (e) {\n // Ignore errors during close\n }\n\n this.webSocket = null;\n }\n\n createWebSocketConnection() {\n return new Promise((resolve, reject) => {\n if (this.webSocket) {\n this.messageQueue = [];\n this.cleanupWebSocket();\n }\n this.lastMessageReceived = 0;\n this.identifier += 1;\n\n // Init the WebSocket connection\n const ws = new this.configuration.WebSocketPolyfill(this.url);\n ws.binaryType = \"arraybuffer\";\n ws.identifier = this.identifier;\n\n this.attachWebSocketListeners(ws, reject);\n\n this.webSocket = ws;\n\n // Reset the status\n this.status = WebSocketStatus.Connecting;\n this.emit(\"status\", { status: WebSocketStatus.Connecting });\n\n // Store resolve/reject for later use\n this.connectionAttempt = {\n resolve,\n reject,\n };\n });\n }\n\n onMessage(event: MessageEvent) {\n this.resolveConnectionAttempt();\n\n this.lastMessageReceived = time.getUnixTime();\n\n const message = new IncomingMessage(event.data);\n const documentName = message.peekVarString();\n\n this.configuration.providerMap.get(documentName)?.onMessage(event);\n }\n\n resolveConnectionAttempt() {\n if (this.connectionAttempt) {\n this.connectionAttempt.resolve();\n this.connectionAttempt = null;\n\n this.status = WebSocketStatus.Connected;\n this.emit(\"status\", { status: WebSocketStatus.Connected });\n this.emit(\"connect\");\n this.messageQueue.forEach((message) => this.send(message));\n this.messageQueue = [];\n }\n }\n\n stopConnectionAttempt() {\n this.connectionAttempt = null;\n }\n\n rejectConnectionAttempt() {\n this.connectionAttempt?.reject();\n this.connectionAttempt = null;\n }\n\n closeTries = 0;\n\n checkConnection() {\n // Don’t check the connection when it’s not even established\n if (this.status !== WebSocketStatus.Connected) {\n return;\n }\n\n // Don’t close the connection while waiting for the first message\n if (!this.lastMessageReceived) {\n return;\n }\n\n // Don’t close the connection when a message was received recently\n if (\n this.configuration.messageReconnectTimeout >=\n time.getUnixTime() - this.lastMessageReceived\n ) {\n return;\n }\n\n // No message received in a long time, not even your own\n // Awareness updates, which are updated every 15 seconds\n // if awareness is enabled.\n this.closeTries += 1;\n // https://bugs.webkit.org/show_bug.cgi?id=247943\n if (this.closeTries > 2) {\n this.onClose({\n event: {\n code: 4408,\n reason: \"forced\",\n },\n });\n this.closeTries = 0;\n } else {\n this.webSocket?.close();\n this.messageQueue = [];\n }\n }\n\n get serverUrl() {\n if (this.configuration.preserveTrailingSlash) {\n return this.configuration.url;\n }\n\n // By default, ensure that the URL never ends with /\n let url = this.configuration.url;\n while (url[url.length - 1] === \"/\") {\n url = url.slice(0, url.length - 1);\n }\n\n return url;\n }\n\n get url() {\n return this.serverUrl;\n }\n\n disconnect() {\n this.shouldConnect = false;\n\n if (this.webSocket === null) {\n return;\n }\n\n try {\n this.webSocket.close();\n this.messageQueue = [];\n } catch (e) {\n console.error(e);\n }\n }\n\n send(message: any) {\n if (this.webSocket?.readyState === WsReadyStates.Open) {\n this.webSocket.send(message);\n } else {\n this.messageQueue.push(message);\n }\n }\n\n onClose({ event }: onCloseParameters) {\n this.closeTries = 0;\n this.cleanupWebSocket();\n\n if (this.connectionAttempt) {\n // That connection attempt failed.\n this.rejectConnectionAttempt();\n }\n\n // Let’s update the connection status.\n this.status = WebSocketStatus.Disconnected;\n this.emit(\"status\", { status: WebSocketStatus.Disconnected });\n this.emit(\"disconnect\", { event });\n\n // trigger connect if no retry is running and we want to have a connection\n if (!this.cancelWebsocketRetry && this.shouldConnect) {\n setTimeout(() => {\n this.connect();\n }, this.configuration.delay);\n }\n }\n\n destroy() {\n this.emit(\"destroy\");\n\n clearInterval(this.intervals.connectionChecker);\n\n // If there is still a connection attempt outstanding then we should stop\n // it before calling disconnect, otherwise it will be rejected in the onClose\n // handler and trigger a retry\n this.stopConnectionAttempt();\n\n this.disconnect();\n\n this.removeAllListeners();\n\n this.cleanupWebSocket();\n }\n}\n","/**\n * @module sync-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as Y from 'yjs'\n\n/**\n * @typedef {Map<number, number>} StateMap\n */\n\n/**\n * Core Yjs defines two message types:\n * • YjsSyncStep1: Includes the State Set of the sending client. When received, the client should reply with YjsSyncStep2.\n * • YjsSyncStep2: Includes all missing structs and the complete delete set. When received, the client is assured that it\n * received all information from the remote client.\n *\n * In a peer-to-peer network, you may want to introduce a SyncDone message type. Both parties should initiate the connection\n * with SyncStep1. When a client received SyncStep2, it should reply with SyncDone. When the local client received both\n * SyncStep2 and SyncDone, it is assured that it is synced to the remote client.\n *\n * In a client-server model, you want to handle this differently: The client should initiate the connection with SyncStep1.\n * When the server receives SyncStep1, it should reply with SyncStep2 immediately followed by SyncStep1. The client replies\n * with SyncStep2 when it receives SyncStep1. Optionally the server may send a SyncDone after it received SyncStep2, so the\n * client knows that the sync is finished. There are two reasons for this more elaborated sync model: 1. This protocol can\n * easily be implemented on top of http and websockets. 2. The server should only reply to requests, and not initiate them.\n * Therefore it is necessary that the client initiates the sync.\n *\n * Construction of a message:\n * [messageType : varUint, message definition..]\n *\n * Note: A message does not include information about the room name. This must to be handled by the upper layer protocol!\n *\n * stringify[messageType] stringifies a message definition (messageType is already read from the bufffer)\n */\n\nexport const messageYjsSyncStep1 = 0\nexport const messageYjsSyncStep2 = 1\nexport const messageYjsUpdate = 2\n\n/**\n * Create a sync step 1 message based on the state of the current shared document.\n *\n * @param {encoding.Encoder} encoder\n * @param {Y.Doc} doc\n */\nexport const writeSyncStep1 = (encoder, doc) => {\n encoding.writeVarUint(encoder, messageYjsSyncStep1)\n const sv = Y.encodeStateVector(doc)\n encoding.writeVarUint8Array(encoder, sv)\n}\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {Y.Doc} doc\n * @param {Uint8Array} [encodedStateVector]\n */\nexport const writeSyncStep2 = (encoder, doc, encodedStateVector) => {\n encoding.writeVarUint(encoder, messageYjsSyncStep2)\n encoding.writeVarUint8Array(encoder, Y.encodeStateAsUpdate(doc, encodedStateVector))\n}\n\n/**\n * Read SyncStep1 message and reply with SyncStep2.\n *\n * @param {decoding.Decoder} decoder The reply to the received message\n * @param {encoding.Encoder} encoder The received message\n * @param {Y.Doc} doc\n */\nexport const readSyncStep1 = (decoder, encoder, doc) =>\n writeSyncStep2(encoder, doc, decoding.readVarUint8Array(decoder))\n\n/**\n * Read and apply Structs and then DeleteStore to a y instance.\n *\n * @param {decoding.Decoder} decoder\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n * @param {(error:Error)=>any} [errorHandler]\n */\nexport const readSyncStep2 = (decoder, doc, transactionOrigin, errorHandler) => {\n try {\n Y.applyUpdate(doc, decoding.readVarUint8Array(decoder), transactionOrigin)\n } catch (error) {\n if (errorHandler != null) errorHandler(/** @type {Error} */ (error))\n // This catches errors that are thrown by event handlers\n console.error('Caught error while handling a Yjs update', error)\n }\n}\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {Uint8Array} update\n */\nexport const writeUpdate = (encoder, update) => {\n encoding.writeVarUint(encoder, messageYjsUpdate)\n encoding.writeVarUint8Array(encoder, update)\n}\n\n/**\n * Read and apply Structs and then DeleteStore to a y instance.\n *\n * @param {decoding.Decoder} decoder\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n * @param {(error:Error)=>any} [errorHandler]\n */\nexport const readUpdate = readSyncStep2\n\n/**\n * @param {decoding.Decoder} decoder A message received from another client\n * @param {encoding.Encoder} encoder The reply message. Does not need to be sent if empty.\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n * @param {(error:Error)=>any} [errorHandler] Optional error handler that catches errors when reading Yjs messages.\n */\nexport const readSyncMessage = (decoder, encoder, doc, transactionOrigin, errorHandler) => {\n const messageType = decoding.readVarUint(decoder)\n switch (messageType) {\n case messageYjsSyncStep1:\n readSyncStep1(decoder, encoder, doc)\n break\n case messageYjsSyncStep2:\n readSyncStep2(decoder, doc, transactionOrigin, errorHandler)\n break\n case messageYjsUpdate:\n readUpdate(decoder, doc, transactionOrigin, errorHandler)\n break\n default:\n throw new Error('Unknown message type')\n }\n return messageType\n}\n","import { readAuthMessage } from \"@abraca/dabra-common\";\nimport { readVarInt, readVarString } from \"lib0/decoding\";\nimport type { CloseEvent } from \"ws\";\nimport * as awarenessProtocol from \"y-protocols/awareness\";\nimport { messageYjsSyncStep2, readSyncMessage } from \"y-protocols/sync\";\nimport type { HocuspocusProvider } from \"./HocuspocusProvider.ts\";\nimport type { IncomingMessage } from \"./IncomingMessage.ts\";\nimport { OutgoingMessage } from \"./OutgoingMessage.ts\";\nimport { MessageType } from \"./types.ts\";\n\nexport class MessageReceiver {\n message: IncomingMessage;\n\n constructor(message: IncomingMessage) {\n this.message = message;\n }\n\n public apply(provider: HocuspocusProvider, emitSynced: boolean) {\n const { message } = this;\n const type = message.readVarUint();\n\n const emptyMessageLength = message.length();\n\n switch (type) {\n case MessageType.Sync:\n this.applySyncMessage(provider, emitSynced);\n break;\n\n case MessageType.Awareness:\n this.applyAwarenessMessage(provider);\n break;\n\n case MessageType.Auth:\n this.applyAuthMessage(provider);\n break;\n\n case MessageType.QueryAwareness:\n this.applyQueryAwarenessMessage(provider);\n break;\n\n case MessageType.Stateless:\n provider.receiveStateless(readVarString(message.decoder));\n break;\n\n case MessageType.SyncStatus:\n this.applySyncStatusMessage(provider, readVarInt(message.decoder) === 1);\n break;\n\n case MessageType.CLOSE:\n // eslint-disable-next-line no-case-declarations\n const event: CloseEvent = {\n code: 1000,\n reason: readVarString(message.decoder),\n // @ts-ignore\n target: provider.configuration.websocketProvider.webSocket!,\n type: \"close\",\n };\n provider.onClose();\n provider.configuration.onClose({ event });\n provider.forwardClose({ event });\n break;\n\n default:\n throw new Error(`Can’t apply message of unknown type: ${type}`);\n }\n\n // Reply\n if (message.length() > emptyMessageLength + 1) {\n // length of documentName (considered in emptyMessageLength plus length of yjs sync type, set in applySyncMessage)\n // @ts-ignore\n provider.send(OutgoingMessage, { encoder: message.encoder });\n }\n }\n\n private applySyncMessage(provider: HocuspocusProvider, emitSynced: boolean) {\n const { message } = this;\n\n message.writeVarUint(MessageType.Sync);\n\n // Apply update\n const syncMessageType = readSyncMessage(\n message.decoder,\n message.encoder,\n provider.document,\n provider,\n );\n\n // Synced once we receive Step2\n if (emitSynced && syncMessageType === messageYjsSyncStep2) {\n provider.synced = true;\n }\n }\n\n applySyncStatusMessage(provider: HocuspocusProvider, applied: boolean) {\n if (applied) {\n provider.decrementUnsyncedChanges();\n }\n }\n\n private applyAwarenessMessage(provider: HocuspocusProvider) {\n if (!provider.awareness) return;\n\n const { message } = this;\n\n awarenessProtocol.applyAwarenessUpdate(\n provider.awareness,\n message.readVarUint8Array(),\n provider,\n );\n }\n\n private applyAuthMessage(provider: HocuspocusProvider) {\n const { message } = this;\n\n readAuthMessage(\n message.decoder,\n provider.sendToken.bind(provider),\n provider.permissionDeniedHandler.bind(provider),\n provider.authenticatedHandler.bind(provider),\n );\n }\n\n private applyQueryAwarenessMessage(provider: HocuspocusProvider) {\n if (!provider.awareness) return;\n\n const { message } = this;\n\n message.writeVarUint(MessageType.Awareness);\n message.writeVarUint8Array(\n awarenessProtocol.encodeAwarenessUpdate(\n provider.awareness,\n Array.from(provider.awareness.getStates().keys()),\n ),\n );\n }\n}\n","import type { Encoder } from \"lib0/encoding\";\nimport { toUint8Array } from \"lib0/encoding\";\nimport type { ConstructableOutgoingMessage } from \"./types.ts\";\n\nexport class MessageSender {\n\tencoder: Encoder;\n\n\tmessage: any;\n\n\tconstructor(Message: ConstructableOutgoingMessage, args: any = {}) {\n\t\tthis.message = new Message();\n\t\tthis.encoder = this.message.get(args);\n\t}\n\n\tcreate() {\n\t\treturn toUint8Array(this.encoder);\n\t}\n\n\tsend(webSocket: any) {\n\t\twebSocket?.send(this.create());\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport { writeAuthentication } from \"@abraca/dabra-common\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class AuthenticationMessage extends OutgoingMessage {\n type = MessageType.Auth;\n\n description = \"Authentication\";\n\n get(args: Partial<OutgoingMessageArguments>) {\n if (typeof args.token === \"undefined\") {\n throw new Error(\"The authentication message requires `token` as an argument.\");\n }\n\n writeVarString(this.encoder, args.documentName!);\n writeVarUint(this.encoder, this.type);\n writeAuthentication(this.encoder, args.token);\n\n return this.encoder;\n }\n}\n","import * as encoding from \"lib0/encoding\";\nimport { encodeAwarenessUpdate } from \"y-protocols/awareness\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class AwarenessMessage extends OutgoingMessage {\n\ttype = MessageType.Awareness;\n\n\tdescription = \"Awareness states update\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tif (typeof args.awareness === \"undefined\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"The awareness message requires awareness as an argument\",\n\t\t\t);\n\t\t}\n\n\t\tif (typeof args.clients === \"undefined\") {\n\t\t\tthrow new Error(\"The awareness message requires clients as an argument\");\n\t\t}\n\n\t\tencoding.writeVarString(this.encoder, args.documentName!);\n\t\tencoding.writeVarUint(this.encoder, this.type);\n\n\t\tlet awarenessUpdate;\n\t\tif (args.states === undefined) {\n\t\t\tawarenessUpdate = encodeAwarenessUpdate(args.awareness, args.clients);\n\t\t} else {\n\t\t\tawarenessUpdate = encodeAwarenessUpdate(\n\t\t\t\targs.awareness,\n\t\t\t\targs.clients,\n\t\t\t\targs.states,\n\t\t\t);\n\t\t}\n\n\t\tencoding.writeVarUint8Array(this.encoder, awarenessUpdate);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class StatelessMessage extends OutgoingMessage {\n\ttype = MessageType.Stateless;\n\n\tdescription = \"A stateless message\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\twriteVarString(this.encoder, args.documentName!);\n\t\twriteVarUint(this.encoder, this.type);\n\t\twriteVarString(this.encoder, args.payload ?? \"\");\n\n\t\treturn this.encoder;\n\t}\n}\n","import * as encoding from \"lib0/encoding\";\nimport * as syncProtocol from \"y-protocols/sync\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class SyncStepOneMessage extends OutgoingMessage {\n\ttype = MessageType.Sync;\n\n\tdescription = \"First sync step\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tif (typeof args.document === \"undefined\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"The sync step one message requires document as an argument\",\n\t\t\t);\n\t\t}\n\n\t\tencoding.writeVarString(this.encoder, args.documentName!);\n\t\tencoding.writeVarUint(this.encoder, this.type);\n\t\tsyncProtocol.writeSyncStep1(this.encoder, args.document);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport { writeUpdate } from \"y-protocols/sync\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class UpdateMessage extends OutgoingMessage {\n\ttype = MessageType.Sync;\n\n\tdescription = \"A document update\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\twriteVarString(this.encoder, args.documentName!);\n\t\twriteVarUint(this.encoder, this.type);\n\n\t\twriteUpdate(this.encoder, args.update);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { awarenessStatesToArray } from \"@abraca/dabra-common\";\nimport type { Event, MessageEvent } from \"ws\";\nimport { Awareness, removeAwarenessStates } from \"y-protocols/awareness\";\nimport * as Y from \"yjs\";\nimport EventEmitter from \"./EventEmitter.ts\";\nimport type { CompleteHocuspocusProviderWebsocketConfiguration } from \"./HocuspocusProviderWebsocket.ts\";\nimport { HocuspocusProviderWebsocket } from \"./HocuspocusProviderWebsocket.ts\";\nimport { IncomingMessage } from \"./IncomingMessage.ts\";\nimport { MessageReceiver } from \"./MessageReceiver.ts\";\nimport { MessageSender } from \"./MessageSender.ts\";\nimport { AuthenticationMessage } from \"./OutgoingMessages/AuthenticationMessage.ts\";\nimport { AwarenessMessage } from \"./OutgoingMessages/AwarenessMessage.ts\";\nimport { StatelessMessage } from \"./OutgoingMessages/StatelessMessage.ts\";\nimport { SyncStepOneMessage } from \"./OutgoingMessages/SyncStepOneMessage.ts\";\nimport { UpdateMessage } from \"./OutgoingMessages/UpdateMessage.ts\";\nimport type {\n AuthorizedScope,\n ConstructableOutgoingMessage,\n onAuthenticatedParameters,\n onAuthenticationFailedParameters,\n onAwarenessChangeParameters,\n onAwarenessUpdateParameters,\n onCloseParameters,\n onDisconnectParameters,\n onMessageParameters,\n onOpenParameters,\n onOutgoingMessageParameters,\n onStatelessParameters,\n onStatusParameters,\n onSyncedParameters,\n onUnsyncedChangesParameters,\n} from \"./types.ts\";\n\nexport type HocuspocusProviderConfiguration = Required<\n Pick<CompleteHocuspocusProviderConfiguration, \"name\">\n> &\n Partial<CompleteHocuspocusProviderConfiguration> &\n (\n | (Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, \"url\">> &\n Partial<Pick<CompleteHocuspocusProviderWebsocketConfiguration, \"preserveTrailingSlash\">>)\n | Required<Pick<CompleteHocuspocusProviderConfiguration, \"websocketProvider\">>\n );\n\nexport interface CompleteHocuspocusProviderConfiguration {\n /**\n * The identifier/name of your document\n */\n name: string;\n /**\n * The actual Y.js document\n */\n document: Y.Doc;\n\n /**\n * An Awareness instance to keep the presence state of all clients.\n *\n * You can disable sharing awareness information by passing `null`.\n * Note that having no awareness information shared across all connections will break our ping checks\n * and thus trigger reconnects. You should always have at least one Provider with enabled awareness per\n * socket connection, or ensure that the Provider receives messages before running into `HocuspocusProviderWebsocket.messageReconnectTimeout`.\n */\n awareness: Awareness | null;\n\n /**\n * A token that’s sent to the backend for authentication purposes.\n */\n token: string | (() => string) | (() => Promise<string>) | null;\n\n /**\n * Hocuspocus websocket provider\n */\n websocketProvider: HocuspocusProviderWebsocket;\n\n /**\n * Force syncing the document in the defined interval.\n */\n forceSyncInterval: false | number;\n\n onAuthenticated: (data: onAuthenticatedParameters) => void;\n onAuthenticationFailed: (data: onAuthenticationFailedParameters) => void;\n onOpen: (data: onOpenParameters) => void;\n onConnect: () => void;\n onStatus: (data: onStatusParameters) => void;\n onMessage: (data: onMessageParameters) => void;\n onOutgoingMessage: (data: onOutgoingMessageParameters) => void;\n onSynced: (data: onSyncedParameters) => void;\n onDisconnect: (data: onDisconnectParameters) => void;\n onClose: (data: onCloseParameters) => void;\n onDestroy: () => void;\n onAwarenessUpdate: (data: onAwarenessUpdateParameters) => void;\n onAwarenessChange: (data: onAwarenessChangeParameters) => void;\n onStateless: (data: onStatelessParameters) => void;\n onUnsyncedChanges: (data: onUnsyncedChangesParameters) => void;\n}\n\nexport class AwarenessError extends Error {\n code = 1001;\n}\n\nexport class HocuspocusProvider extends EventEmitter {\n public configuration: CompleteHocuspocusProviderConfiguration = {\n name: \"\",\n // @ts-ignore\n document: undefined,\n // @ts-ignore\n awareness: undefined,\n token: null,\n forceSyncInterval: false,\n onAuthenticated: () => null,\n onAuthenticationFailed: () => null,\n onOpen: () => null,\n onConnect: () => null,\n onMessage: () => null,\n onOutgoingMessage: () => null,\n onSynced: () => null,\n onStatus: () => null,\n onDisconnect: () => null,\n onClose: () => null,\n onDestroy: () => null,\n onAwarenessUpdate: () => null,\n onAwarenessChange: () => null,\n onStateless: () => null,\n onUnsyncedChanges: () => null,\n };\n\n isSynced = false;\n\n unsyncedChanges = 0;\n\n isAuthenticated = false;\n\n authorizedScope: AuthorizedScope | undefined = undefined;\n\n // @internal\n manageSocket = false;\n\n private _isAttached = false;\n\n intervals: any = {\n forceSync: null,\n };\n\n constructor(configuration: HocuspocusProviderConfiguration) {\n super();\n this.setConfiguration(configuration);\n\n this.configuration.document = configuration.document ? configuration.document : new Y.Doc();\n this.configuration.awareness =\n configuration.awareness !== undefined\n ? configuration.awareness\n : new Awareness(this.document);\n\n this.on(\"open\", this.configuration.onOpen);\n this.on(\"message\", this.configuration.onMessage);\n this.on(\"outgoingMessage\", this.configuration.onOutgoingMessage);\n this.on(\"synced\", this.configuration.onSynced);\n this.on(\"destroy\", this.configuration.onDestroy);\n this.on(\"awarenessUpdate\", this.configuration.onAwarenessUpdate);\n this.on(\"awarenessChange\", this.configuration.onAwarenessChange);\n this.on(\"stateless\", this.configuration.onStateless);\n this.on(\"unsyncedChanges\", this.configuration.onUnsyncedChanges);\n\n this.on(\"authenticated\", this.configuration.onAuthenticated);\n this.on(\"authenticationFailed\", this.configuration.onAuthenticationFailed);\n\n this.awareness?.on(\"update\", () => {\n this.emit(\"awarenessUpdate\", {\n states: awarenessStatesToArray(this.awareness!.getStates()),\n });\n });\n\n this.awareness?.on(\"change\", () => {\n this.emit(\"awarenessChange\", {\n states: awarenessStatesToArray(this.awareness!.getStates()),\n });\n });\n\n this.document.on(\"update\", this.boundDocumentUpdateHandler);\n this.awareness?.on(\"update\", this.boundAwarenessUpdateHandler);\n\n this.registerEventListeners();\n\n if (\n this.configuration.forceSyncInterval &&\n typeof this.configuration.forceSyncInterval === \"number\"\n ) {\n this.intervals.forceSync = setInterval(\n this.forceSync.bind(this),\n this.configuration.forceSyncInterval,\n );\n }\n\n if (this.manageSocket) {\n this.attach();\n }\n }\n\n boundDocumentUpdateHandler = this.documentUpdateHandler.bind(this);\n\n boundAwarenessUpdateHandler = this.awarenessUpdateHandler.bind(this);\n\n boundPageHide = this.pageHide.bind(this);\n\n boundOnOpen = this.onOpen.bind(this);\n\n boundOnClose = this.onClose.bind(this);\n\n forwardConnect = () => this.emit(\"connect\");\n\n forwardStatus = (e: onStatusParameters) => this.emit(\"status\", e);\n\n forwardClose = (e: onCloseParameters) => this.emit(\"close\", e);\n\n forwardDisconnect = (e: onDisconnectParameters) => this.emit(\"disconnect\", e);\n\n forwardDestroy = () => this.emit(\"destroy\");\n\n public setConfiguration(configuration: Partial<HocuspocusProviderConfiguration> = {}): void {\n if (!configuration.websocketProvider) {\n this.manageSocket = true;\n this.configuration.websocketProvider = new HocuspocusProviderWebsocket(\n configuration as CompleteHocuspocusProviderWebsocketConfiguration,\n );\n }\n\n this.configuration = { ...this.configuration, ...configuration };\n }\n\n get document() {\n return this.configuration.document;\n }\n\n public get isAttached() {\n return this._isAttached;\n }\n\n get awareness() {\n return this.configuration.awareness;\n }\n\n get hasUnsyncedChanges(): boolean {\n return this.unsyncedChanges > 0;\n }\n\n private resetUnsyncedChanges() {\n this.unsyncedChanges = 1;\n this.emit(\"unsyncedChanges\", { number: this.unsyncedChanges });\n }\n\n incrementUnsyncedChanges() {\n this.unsyncedChanges += 1;\n this.emit(\"unsyncedChanges\", { number: this.unsyncedChanges });\n }\n\n decrementUnsyncedChanges() {\n if (this.unsyncedChanges > 0) {\n this.unsyncedChanges -= 1;\n }\n\n if (this.unsyncedChanges === 0) {\n this.synced = true;\n }\n\n this.emit(\"unsyncedChanges\", { number: this.unsyncedChanges });\n }\n\n forceSync() {\n this.resetUnsyncedChanges();\n\n this.send(SyncStepOneMessage, {\n document: this.document,\n documentName: this.configuration.name,\n });\n }\n\n pageHide() {\n if (this.awareness) {\n removeAwarenessStates(this.awareness, [this.document.clientID], \"page hide\");\n }\n }\n\n registerEventListeners() {\n if (typeof window === \"undefined\" || !(\"addEventListener\" in window)) {\n return;\n }\n\n window.addEventListener(\"pagehide\", this.boundPageHide);\n }\n\n sendStateless(payload: string) {\n this.send(StatelessMessage, {\n documentName: this.configuration.name,\n payload,\n });\n }\n\n async sendToken() {\n let token: string | null;\n try {\n token = await this.getToken();\n } catch (error) {\n this.permissionDeniedHandler(`Failed to get token during sendToken(): ${error}`);\n return;\n }\n\n this.send(AuthenticationMessage, {\n token: token ?? \"\",\n documentName: this.configuration.name,\n });\n }\n\n documentUpdateHandler(update: Uint8Array, origin: any) {\n if (origin === this) {\n return;\n }\n\n this.incrementUnsyncedChanges();\n this.send(UpdateMessage, { update, documentName: this.configuration.name });\n }\n\n awarenessUpdateHandler({ added, updated, removed }: any, origin: any) {\n const changedClients = added.concat(updated).concat(removed);\n\n this.send(AwarenessMessage, {\n awareness: this.awareness,\n clients: changedClients,\n documentName: this.configuration.name,\n });\n }\n\n /**\n * Indicates whether a first handshake with the server has been established\n *\n * Note: this does not mean all updates from the client have been persisted to the backend. For this,\n * use `hasUnsyncedChanges`.\n */\n get synced(): boolean {\n return this.isSynced;\n }\n\n set synced(state) {\n if (this.isSynced === state) {\n return;\n }\n\n this.isSynced = state;\n\n if (state) {\n this.emit(\"synced\", { state });\n }\n }\n\n receiveStateless(payload: string) {\n this.emit(\"stateless\", { payload });\n }\n\n // not needed, but provides backward compatibility with e.g. lexical/yjs\n async connect() {\n if (this.manageSocket) {\n return this.configuration.websocketProvider.connect();\n }\n\n console.warn(\n \"HocuspocusProvider::connect() is deprecated and does not do anything. Please connect/disconnect on the websocketProvider, or attach/deattach providers.\",\n );\n }\n\n disconnect() {\n if (this.manageSocket) {\n return this.configuration.websocketProvider.disconnect();\n }\n\n console.warn(\n \"HocuspocusProvider::disconnect() is deprecated and does not do anything. Please connect/disconnect on the websocketProvider, or attach/deattach providers.\",\n );\n }\n\n async onOpen(event: Event) {\n this.isAuthenticated = false;\n\n this.emit(\"open\", { event });\n await this.sendToken();\n this.startSync();\n }\n\n async getToken() {\n if (typeof this.configuration.token === \"function\") {\n const token = await this.configuration.token();\n return token;\n }\n\n return this.configuration.token;\n }\n\n startSync() {\n this.resetUnsyncedChanges();\n\n this.send(SyncStepOneMessage, {\n document: this.document,\n documentName: this.configuration.name,\n });\n\n if (this.awareness && this.awareness.getLocalState() !== null) {\n this.send(AwarenessMessage, {\n awareness: this.awareness,\n clients: [this.document.clientID],\n documentName: this.configuration.name,\n });\n }\n }\n\n send(message: ConstructableOutgoingMessage, args: any) {\n if (!this._isAttached) return;\n\n const messageSender = new MessageSender(message, args);\n\n this.emit(\"outgoingMessage\", { message: messageSender.message });\n messageSender.send(this.configuration.websocketProvider);\n }\n\n onMessage(event: MessageEvent) {\n const message = new IncomingMessage(event.data);\n\n const documentName = message.readVarString();\n\n message.writeVarString(documentName);\n\n this.emit(\"message\", { event, message: new IncomingMessage(event.data) });\n\n new MessageReceiver(message).apply(this, true);\n }\n\n onClose() {\n this.isAuthenticated = false;\n this.synced = false;\n\n // update awareness (all users except local left)\n if (this.awareness) {\n removeAwarenessStates(\n this.awareness,\n Array.from(this.awareness.getStates().keys()).filter(\n (client) => client !== this.document.clientID,\n ),\n this,\n );\n }\n }\n\n destroy() {\n this.emit(\"destroy\");\n\n if (this.intervals.forceSync) {\n clearInterval(this.intervals.forceSync);\n }\n\n if (this.awareness) {\n removeAwarenessStates(this.awareness, [this.document.clientID], \"provider destroy\");\n this.awareness.off(\"update\", this.boundAwarenessUpdateHandler);\n this.awareness.destroy();\n }\n\n this.document.off(\"update\", this.boundDocumentUpdateHandler);\n\n this.removeAllListeners();\n\n this.detach();\n\n if (this.manageSocket) {\n this.configuration.websocketProvider.destroy();\n }\n\n if (typeof window === \"undefined\" || !(\"removeEventListener\" in window)) {\n return;\n }\n\n window.removeEventListener(\"pagehide\", this.boundPageHide);\n }\n\n detach() {\n this.configuration.websocketProvider.off(\"connect\", this.configuration.onConnect);\n this.configuration.websocketProvider.off(\"connect\", this.forwardConnect);\n\n this.configuration.websocketProvider.off(\"status\", this.forwardStatus);\n this.configuration.websocketProvider.off(\"status\", this.configuration.onStatus);\n\n this.configuration.websocketProvider.off(\"open\", this.boundOnOpen);\n this.configuration.websocketProvider.off(\"close\", this.boundOnClose);\n this.configuration.websocketProvider.off(\"close\", this.configuration.onClose);\n this.configuration.websocketProvider.off(\"close\", this.forwardClose);\n this.configuration.websocketProvider.off(\"disconnect\", this.configuration.onDisconnect);\n this.configuration.websocketProvider.off(\"disconnect\", this.forwardDisconnect);\n this.configuration.websocketProvider.off(\"destroy\", this.configuration.onDestroy);\n this.configuration.websocketProvider.off(\"destroy\", this.forwardDestroy);\n\n this.configuration.websocketProvider.detach(this);\n\n this._isAttached = false;\n }\n\n attach() {\n if (this._isAttached) return;\n\n this.configuration.websocketProvider.on(\"connect\", this.configuration.onConnect);\n this.configuration.websocketProvider.on(\"connect\", this.forwardConnect);\n\n this.configuration.websocketProvider.on(\"status\", this.configuration.onStatus);\n this.configuration.websocketProvider.on(\"status\", this.forwardStatus);\n\n this.configuration.websocketProvider.on(\"open\", this.boundOnOpen);\n\n this.configuration.websocketProvider.on(\"close\", this.boundOnClose);\n this.configuration.websocketProvider.on(\"close\", this.configuration.onClose);\n this.configuration.websocketProvider.on(\"close\", this.forwardClose);\n\n this.configuration.websocketProvider.on(\"disconnect\", this.configuration.onDisconnect);\n this.configuration.websocketProvider.on(\"disconnect\", this.forwardDisconnect);\n\n this.configuration.websocketProvider.on(\"destroy\", this.configuration.onDestroy);\n this.configuration.websocketProvider.on(\"destroy\", this.forwardDestroy);\n\n this.configuration.websocketProvider.attach(this);\n\n this._isAttached = true;\n }\n\n permissionDeniedHandler(reason: string) {\n this.emit(\"authenticationFailed\", { reason });\n this.isAuthenticated = false;\n }\n\n authenticatedHandler(scope: string) {\n this.isAuthenticated = true;\n this.authorizedScope = scope as AuthorizedScope;\n\n this.emit(\"authenticated\", { scope });\n }\n\n setAwarenessField(key: string, value: any) {\n if (!this.awareness) {\n throw new AwarenessError(\n `Cannot set awareness field \"${key}\" to ${JSON.stringify(value)}. You have disabled Awareness for this provider by explicitly passing awareness: null in the provider configuration.`,\n );\n }\n this.awareness.setLocalStateField(key, value);\n }\n}\n","/**\n * IndexedDB-backed offline store for a single Abracadabra document.\n *\n * Responsibilities:\n * - Persist CRDT updates locally so they survive page refreshes / network loss.\n * - Store the last-known state vector for fast reconnect diffs.\n * - Store a permission snapshot so the UI can gate writes without a network round-trip.\n * - Queue subdoc registration events created while offline.\n *\n * Falls back to a silent no-op when IndexedDB is unavailable (e.g. SSR / Node.js).\n */\n\nexport interface PendingSubdoc {\n\tchildId: string;\n\tparentId: string;\n\tcreatedAt: number;\n}\n\nconst DB_VERSION = 1;\n\nfunction idbAvailable(): boolean {\n\treturn typeof globalThis !== \"undefined\" && \"indexedDB\" in globalThis;\n}\n\nfunction openDb(docId: string): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = globalThis.indexedDB.open(`abracadabra:${docId}`, DB_VERSION);\n\n\t\treq.onupgradeneeded = (event) => {\n\t\t\tconst db = (event.target as IDBOpenDBRequest).result;\n\n\t\t\tif (!db.objectStoreNames.contains(\"updates\")) {\n\t\t\t\tdb.createObjectStore(\"updates\", { autoIncrement: true });\n\t\t\t}\n\t\t\tif (!db.objectStoreNames.contains(\"meta\")) {\n\t\t\t\tdb.createObjectStore(\"meta\");\n\t\t\t}\n\t\t\tif (!db.objectStoreNames.contains(\"subdoc_queue\")) {\n\t\t\t\tdb.createObjectStore(\"subdoc_queue\", { keyPath: \"childId\" });\n\t\t\t}\n\t\t};\n\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction txPromise<T>(\n\tstore: IDBObjectStore,\n\trequest: IDBRequest<T>,\n): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () => reject(request.error);\n\t});\n}\n\nexport class OfflineStore {\n\tprivate docId: string;\n\tprivate db: IDBDatabase | null = null;\n\n\tconstructor(docId: string) {\n\t\tthis.docId = docId;\n\t}\n\n\tprivate async getDb(): Promise<IDBDatabase | null> {\n\t\tif (!idbAvailable()) return null;\n\t\tif (!this.db) {\n\t\t\tthis.db = await openDb(this.docId).catch(() => null);\n\t\t}\n\t\treturn this.db;\n\t}\n\n\t// ── Updates ─────────────────────────────────────────────────────────────\n\n\tasync persistUpdate(update: Uint8Array): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"updates\", \"readwrite\");\n\t\tconst store = tx.objectStore(\"updates\");\n\t\tawait txPromise(store, store.add(update));\n\t}\n\n\tasync getPendingUpdates(): Promise<Uint8Array[]> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return [];\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(\"updates\", \"readonly\");\n\t\t\tconst store = tx.objectStore(\"updates\");\n\t\t\tconst req = store.getAll();\n\t\t\treq.onsuccess = () => resolve(req.result as Uint8Array[]);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\tasync clearPendingUpdates(): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"updates\", \"readwrite\");\n\t\tawait txPromise(tx.objectStore(\"updates\"), tx.objectStore(\"updates\").clear());\n\t}\n\n\t// ── State vector ─────────────────────────────────────────────────────────\n\n\tasync getStateVector(): Promise<Uint8Array | null> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return null;\n\t\tconst tx = db.transaction(\"meta\", \"readonly\");\n\t\tconst result = await txPromise<Uint8Array | undefined>(\n\t\t\ttx.objectStore(\"meta\"),\n\t\t\ttx.objectStore(\"meta\").get(\"sv\"),\n\t\t);\n\t\treturn result ?? null;\n\t}\n\n\tasync saveStateVector(sv: Uint8Array): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"meta\", \"readwrite\");\n\t\tawait txPromise(tx.objectStore(\"meta\"), tx.objectStore(\"meta\").put(sv, \"sv\"));\n\t}\n\n\t// ── Permission snapshot ──────────────────────────────────────────────────\n\n\tasync getPermissionSnapshot(): Promise<string | null> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return null;\n\t\tconst tx = db.transaction(\"meta\", \"readonly\");\n\t\tconst result = await txPromise<string | undefined>(\n\t\t\ttx.objectStore(\"meta\"),\n\t\t\ttx.objectStore(\"meta\").get(\"role\"),\n\t\t);\n\t\treturn result ?? null;\n\t}\n\n\tasync savePermissionSnapshot(role: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"meta\", \"readwrite\");\n\t\tawait txPromise(\n\t\t\ttx.objectStore(\"meta\"),\n\t\t\ttx.objectStore(\"meta\").put(role, \"role\"),\n\t\t);\n\t}\n\n\t// ── Subdoc registration queue ─────────────────────────────────────────────\n\n\tasync queueSubdoc(entry: PendingSubdoc): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"subdoc_queue\", \"readwrite\");\n\t\tawait txPromise(\n\t\t\ttx.objectStore(\"subdoc_queue\"),\n\t\t\ttx.objectStore(\"subdoc_queue\").put(entry),\n\t\t);\n\t}\n\n\tasync getPendingSubdocs(): Promise<PendingSubdoc[]> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return [];\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(\"subdoc_queue\", \"readonly\");\n\t\t\tconst req = tx.objectStore(\"subdoc_queue\").getAll();\n\t\t\treq.onsuccess = () => resolve(req.result as PendingSubdoc[]);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\tasync removeSubdocFromQueue(childId: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"subdoc_queue\", \"readwrite\");\n\t\tawait txPromise(\n\t\t\ttx.objectStore(\"subdoc_queue\"),\n\t\t\ttx.objectStore(\"subdoc_queue\").delete(childId),\n\t\t);\n\t}\n\n\t// ── Lifecycle ─────────────────────────────────────────────────────────────\n\n\tdestroy() {\n\t\tthis.db?.close();\n\t\tthis.db = null;\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\n/**\n * Registers a new subdocument with the Abracadabra server.\n *\n * Wire format (consumed by handle_subdoc in sync.rs):\n * [ParentDocName: VarString] [MSG_SUBDOC(4): VarUint] [childDocumentName: VarString]\n *\n * The server responds with a MSG_STATELESS JSON frame:\n * { type: \"subdoc_registered\", child_id, parent_id }\n * which AbracadabraProvider intercepts in receiveStateless().\n */\nexport class SubdocMessage extends OutgoingMessage {\n\ttype = MessageType.Subdoc;\n\n\tdescription = \"SubdocRegistration\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tif (!args.documentName) {\n\t\t\tthrow new Error(\"SubdocMessage requires `documentName` (parent id).\");\n\t\t}\n\t\tif (!args.childDocumentName) {\n\t\t\tthrow new Error(\"SubdocMessage requires `childDocumentName`.\");\n\t\t}\n\n\t\twriteVarString(this.encoder, args.documentName);\n\t\twriteVarUint(this.encoder, this.type);\n\t\twriteVarString(this.encoder, args.childDocumentName);\n\n\t\treturn this.encoder;\n\t}\n}\n","import * as Y from \"yjs\";\nimport { HocuspocusProvider } from \"./HocuspocusProvider.ts\";\nimport type { HocuspocusProviderConfiguration } from \"./HocuspocusProvider.ts\";\nimport type { HocuspocusProviderWebsocket } from \"./HocuspocusProviderWebsocket.ts\";\nimport { OfflineStore } from \"./OfflineStore.ts\";\nimport { SubdocMessage } from \"./OutgoingMessages/SubdocMessage.ts\";\nimport { UpdateMessage } from \"./OutgoingMessages/UpdateMessage.ts\";\nimport type {\n\tCryptoIdentity,\n\tEffectiveRole,\n\tonSubdocRegisteredParameters,\n\tonSubdocLoadedParameters,\n} from \"./types.ts\";\nimport { AuthenticationMessage } from \"./OutgoingMessages/AuthenticationMessage.ts\";\nimport type { AbracadabraClient } from \"./AbracadabraClient.ts\";\n\nexport interface AbracadabraProviderConfiguration\n\textends Omit<HocuspocusProviderConfiguration, \"url\" | \"websocketProvider\"> {\n\t/**\n\t * Subdocument loading strategy.\n\t * - \"lazy\" (default) – child providers are created only when explicitly requested.\n\t * - \"eager\" – all children returned by the server on connect are loaded automatically.\n\t */\n\tsubdocLoading?: \"lazy\" | \"eager\";\n\n\t/** Called when the server confirms a subdoc registration. */\n\tonSubdocRegistered?: (data: onSubdocRegisteredParameters) => void;\n\n\t/** Called when a child AbracadabraProvider has been created and attached. */\n\tonSubdocLoaded?: (data: onSubdocLoadedParameters) => void;\n\n\t/**\n\t * Disable the IndexedDB offline store. Useful for server-side rendering\n\t * or testing environments that lack IndexedDB.\n\t */\n\tdisableOfflineStore?: boolean;\n\n\t/**\n\t * Identity for passwordless crypto auth (Model B multi-key).\n\t * Mutually exclusive with token.\n\t */\n\tcryptoIdentity?: CryptoIdentity | (() => Promise<CryptoIdentity>);\n\n\t/**\n\t * Signs a base64url challenge and returns a base64url signature.\n\t * Required when cryptoIdentity is set.\n\t */\n\tsignChallenge?: (challenge: string) => Promise<string>;\n\n\t/**\n\t * AbracadabraClient instance for REST API access.\n\t * When provided, the provider automatically derives the WebSocket URL\n\t * and token from the client (unless explicitly overridden).\n\t */\n\tclient?: AbracadabraClient;\n\n\t/** WebSocket URL. Derived from client.wsUrl if client is provided. */\n\turl?: string;\n\n\t/** Shared WebSocket connection (use when multiplexing multiple root documents). */\n\twebsocketProvider?: HocuspocusProviderWebsocket;\n}\n\n/**\n * AbracadabraProvider extends HocuspocusProvider with:\n *\n * 1. Subdocument lifecycle – intercepts Y.Doc subdoc events and syncs them\n * with the server via MSG_SUBDOC (4) frames. Child documents get their\n * own AbracadabraProvider instances sharing the same WebSocket connection.\n *\n * 2. Offline-first – persists CRDT updates to IndexedDB so they survive\n * page reloads and network outages. On reconnect, pending updates are\n * flushed before resuming normal sync.\n *\n * 3. Permission snapshotting – stores the resolved role locally so the UI\n * can gate write operations without a network round-trip. Role is\n * refreshed from the server on every reconnect.\n */\nexport class AbracadabraProvider extends HocuspocusProvider {\n\tpublic effectiveRole: EffectiveRole = null;\n\n\tprivate _client: AbracadabraClient | null;\n\tprivate offlineStore: OfflineStore | null;\n\tprivate childProviders = new Map<string, AbracadabraProvider>();\n\tprivate subdocLoading: \"lazy\" | \"eager\";\n\n\tprivate abracadabraConfig: AbracadabraProviderConfiguration;\n\n\tprivate readonly boundHandleYSubdocsChange = this.handleYSubdocsChange.bind(this);\n\n\tconstructor(configuration: AbracadabraProviderConfiguration) {\n\t\t// Derive URL and token from client when not explicitly set.\n\t\tconst resolved = { ...configuration } as HocuspocusProviderConfiguration;\n\t\tconst client = configuration.client ?? null;\n\n\t\tif (client) {\n\t\t\tif (!resolved.url && !resolved.websocketProvider) {\n\t\t\t\t(resolved as any).url = client.wsUrl;\n\t\t\t}\n\t\t\tif (resolved.token === undefined && !configuration.cryptoIdentity) {\n\t\t\t\tresolved.token = () => client.token ?? \"\";\n\t\t\t}\n\t\t}\n\n\t\tsuper(resolved);\n\t\tthis._client = client;\n\t\tthis.abracadabraConfig = configuration;\n\t\tthis.subdocLoading = configuration.subdocLoading ?? \"lazy\";\n\n\t\tthis.offlineStore = configuration.disableOfflineStore\n\t\t\t? null\n\t\t\t: new OfflineStore(configuration.name);\n\n\t\tthis.on(\n\t\t\t\"subdocRegistered\",\n\t\t\tconfiguration.onSubdocRegistered ?? (() => null),\n\t\t);\n\t\tthis.on(\"subdocLoaded\", configuration.onSubdocLoaded ?? (() => null));\n\n\t\t// Intercept Y.Doc subdoc lifecycle events.\n\t\tthis.document.on(\"subdocs\", this.boundHandleYSubdocsChange);\n\n\t\t// Flush offline updates once we're back online and synced.\n\t\tthis.on(\"synced\", () => this.flushPendingUpdates());\n\n\t\t// Restore permission snapshot while offline.\n\t\tthis.restorePermissionSnapshot();\n\t}\n\n\t// ── Auth / permission snapshot ────────────────────────────────────────────\n\n\toverride authenticatedHandler(scope: string) {\n\t\tsuper.authenticatedHandler(scope);\n\n\t\tthis.effectiveRole =\n\t\t\tscope === \"read-write\" ? \"editor\" : \"viewer\";\n\n\t\tthis.offlineStore?.savePermissionSnapshot(this.effectiveRole);\n\t}\n\n\t/**\n\t * Override sendToken to send a pubkey-only identity declaration instead of a\n\t * JWT when cryptoIdentity is configured.\n\t *\n\t * The public key is the sole identifier in the crypto auth handshake.\n\t * Username is decoupled from auth; it lives on the server as an immutable\n\t * internal field and is never sent in the challenge-response frames.\n\t */\n\toverride async sendToken() {\n\t\tconst { cryptoIdentity } = this.abracadabraConfig;\n\t\tif (cryptoIdentity) {\n\t\t\tconst id =\n\t\t\t\ttypeof cryptoIdentity === \"function\"\n\t\t\t\t\t? await cryptoIdentity()\n\t\t\t\t\t: cryptoIdentity;\n\t\t\tconst json = JSON.stringify({\n\t\t\t\ttype: \"identity\",\n\t\t\t\tpublicKey: id.publicKey,\n\t\t\t});\n\t\t\tthis.send(AuthenticationMessage, {\n\t\t\t\ttoken: json,\n\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t});\n\t\t} else {\n\t\t\tawait super.sendToken();\n\t\t}\n\t}\n\n\t/** Handle an auth_challenge message from the server. */\n\tprivate async handleAuthChallenge(\n\t\tchallenge: string,\n\t\texpiresAt: number,\n\t): Promise<void> {\n\t\tconst { signChallenge, cryptoIdentity } = this.abracadabraConfig;\n\t\tif (!signChallenge || !cryptoIdentity) {\n\t\t\tthis.permissionDeniedHandler(\"No signChallenge callback configured\");\n\t\t\treturn;\n\t\t}\n\t\tif (Date.now() > expiresAt * 1000) {\n\t\t\tthis.permissionDeniedHandler(\"Challenge expired\");\n\t\t\treturn;\n\t\t}\n\t\tconst id =\n\t\t\ttypeof cryptoIdentity === \"function\"\n\t\t\t\t? await cryptoIdentity()\n\t\t\t\t: cryptoIdentity;\n\t\tconst signature = await signChallenge(challenge);\n\t\t// Proof frame sends only publicKey — username is fully decoupled from auth.\n\t\tconst proof = JSON.stringify({\n\t\t\ttype: \"proof\",\n\t\t\tpublicKey: id.publicKey,\n\t\t\tsignature,\n\t\t\tchallenge,\n\t\t});\n\t\tthis.send(AuthenticationMessage, {\n\t\t\ttoken: proof,\n\t\t\tdocumentName: this.configuration.name,\n\t\t});\n\t}\n\n\tprivate async restorePermissionSnapshot() {\n\t\tif (!this.offlineStore) return;\n\t\tconst role = await this.offlineStore.getPermissionSnapshot();\n\t\tif (role && !this.effectiveRole) {\n\t\t\tthis.effectiveRole = role as EffectiveRole;\n\t\t}\n\t}\n\n\tget canWrite(): boolean {\n\t\treturn this.effectiveRole === \"owner\" || this.effectiveRole === \"editor\";\n\t}\n\n\t/** The AbracadabraClient instance for REST API access, if configured. */\n\tget client(): AbracadabraClient | null {\n\t\treturn this._client;\n\t}\n\n\t// ── Stateless message interception ────────────────────────────────────────\n\n\t/**\n\t * Called when a MSG_STATELESS frame arrives from the server.\n\t * Abracadabra uses stateless frames to deliver subdoc confirmations\n\t * ({ type: \"subdoc_registered\", child_id, parent_id }).\n\t */\n\toverride receiveStateless(payload: string) {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(payload);\n\t\t} catch {\n\t\t\tsuper.receiveStateless(payload);\n\t\t\treturn;\n\t\t}\n\n\t\tconst msg = parsed as {\n\t\t\ttype?: string;\n\t\t\tchild_id?: string;\n\t\t\tparent_id?: string;\n\t\t\tchallenge?: string;\n\t\t\texpiresAt?: number;\n\t\t};\n\n\t\t// Intercept auth_challenge before subdoc handling.\n\t\tif (msg.type === \"auth_challenge\" && msg.challenge && msg.expiresAt) {\n\t\t\tthis.handleAuthChallenge(msg.challenge, msg.expiresAt).catch(() => null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (msg.type === \"subdoc_registered\" && msg.child_id && msg.parent_id) {\n\t\t\tconst event: onSubdocRegisteredParameters = {\n\t\t\t\tchildId: msg.child_id,\n\t\t\t\tparentId: msg.parent_id,\n\t\t\t};\n\t\t\tthis.emit(\"subdocRegistered\", event);\n\n\t\t\t// Remove from the offline queue now the server confirmed.\n\t\t\tthis.offlineStore?.removeSubdocFromQueue(msg.child_id);\n\n\t\t\t// Eager mode: auto-load the confirmed child.\n\t\t\tif (this.subdocLoading === \"eager\") {\n\t\t\t\tthis.loadChild(msg.child_id);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Unknown stateless payload – pass through to base class.\n\t\tsuper.receiveStateless(payload);\n\t}\n\n\t// ── Subdocument support ───────────────────────────────────────────────────\n\n\t/**\n\t * Y.Doc emits 'subdocs' whenever subdocuments are added, removed, or loaded.\n\t * We intercept additions to register them with the Abracadabra server.\n\t */\n\tprivate handleYSubdocsChange({\n\t\tadded,\n\t\tremoved,\n\t}: {\n\t\tadded: Set<Y.Doc>;\n\t\tremoved: Set<Y.Doc>;\n\t\tloaded: Set<Y.Doc>;\n\t}) {\n\t\tfor (const subdoc of added) {\n\t\t\tthis.registerSubdoc(subdoc);\n\t\t}\n\t\tfor (const subdoc of removed) {\n\t\t\tthis.unloadChild(subdoc.guid);\n\t\t}\n\t}\n\n\t/**\n\t * Send a subdoc registration frame to the server.\n\t * If offline the event is queued in IndexedDB and replayed on reconnect.\n\t */\n\tprivate registerSubdoc(subdoc: Y.Doc) {\n\t\tconst childId = subdoc.guid;\n\n\t\tif (this.isConnected) {\n\t\t\tthis.send(SubdocMessage, {\n\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t\tchildDocumentName: childId,\n\t\t\t} as any);\n\t\t} else {\n\t\t\t// Queue for later replay when we reconnect.\n\t\t\tthis.offlineStore?.queueSubdoc({\n\t\t\t\tchildId,\n\t\t\t\tparentId: this.configuration.name,\n\t\t\t\tcreatedAt: Date.now(),\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Create (or return cached) a child AbracadabraProvider for a given\n\t * child document id. The child shares the parent's WebSocket connection.\n\t */\n\tasync loadChild(childId: string): Promise<AbracadabraProvider> {\n\t\tif (this.childProviders.has(childId)) {\n\t\t\treturn this.childProviders.get(childId)!;\n\t\t}\n\n\t\tconst childDoc = new Y.Doc({ guid: childId });\n\n\t\tconst parentWsp = this.configuration.websocketProvider as HocuspocusProviderWebsocket;\n\t\tconst childProvider = new AbracadabraProvider({\n\t\t\tname: childId,\n\t\t\tdocument: childDoc,\n\t\t\turl: parentWsp.configuration.url,\n\t\t\tWebSocketPolyfill: parentWsp.configuration.WebSocketPolyfill,\n\t\t\ttoken: this.configuration.token,\n\t\t\tsubdocLoading: this.subdocLoading,\n\t\t\tdisableOfflineStore: this.abracadabraConfig.disableOfflineStore,\n\t\t\tclient: this._client ?? undefined,\n\t\t\tcryptoIdentity: this.abracadabraConfig.cryptoIdentity,\n\t\t\tsignChallenge: this.abracadabraConfig.signChallenge,\n\t\t});\n\t\tthis.childProviders.set(childId, childProvider);\n\n\t\tthis.emit(\"subdocLoaded\", { childId, provider: childProvider });\n\n\t\treturn childProvider;\n\t}\n\n\tprivate unloadChild(childId: string) {\n\t\tconst provider = this.childProviders.get(childId);\n\t\tif (provider) {\n\t\t\tprovider.destroy();\n\t\t\tthis.childProviders.delete(childId);\n\t\t}\n\t}\n\n\t/** Return all currently-loaded child providers. */\n\tget children(): Map<string, AbracadabraProvider> {\n\t\treturn this.childProviders;\n\t}\n\n\t// ── Offline-first update persistence ─────────────────────────────────────\n\n\t/**\n\t * Override to persist every local update to IndexedDB before sending it\n\t * over the wire, ensuring no work is lost during connection outages.\n\t */\n\toverride documentUpdateHandler(update: Uint8Array, origin: unknown) {\n\t\tif (origin === this) return;\n\n\t\t// Persist locally first (fire-and-forget; errors are non-fatal).\n\t\tthis.offlineStore?.persistUpdate(update).catch(() => null);\n\n\t\tsuper.documentUpdateHandler(update, origin);\n\t}\n\n\t/**\n\t * After reconnect + sync, flush any updates that were generated while\n\t * offline, then flush any queued subdoc registrations.\n\t */\n\tprivate async flushPendingUpdates() {\n\t\tif (!this.offlineStore) return;\n\n\t\tconst updates = await this.offlineStore.getPendingUpdates();\n\t\tif (updates.length > 0) {\n\t\t\tfor (const update of updates) {\n\t\t\t\tthis.send(UpdateMessage, {\n\t\t\t\t\tupdate,\n\t\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait this.offlineStore.clearPendingUpdates();\n\t\t}\n\n\t\tconst pendingSubdocs = await this.offlineStore.getPendingSubdocs();\n\t\tfor (const { childId } of pendingSubdocs) {\n\t\t\tthis.send(SubdocMessage, {\n\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t\tchildDocumentName: childId,\n\t\t\t} as any);\n\t\t}\n\t}\n\n\tget isConnected(): boolean {\n\t\treturn (\n\t\t\t(this.configuration.websocketProvider as HocuspocusProviderWebsocket)\n\t\t\t\t.status === \"connected\"\n\t\t);\n\t}\n\n\t// ── Lifecycle ─────────────────────────────────────────────────────────────\n\n\toverride destroy() {\n\t\tthis.document.off(\"subdocs\", this.boundHandleYSubdocsChange);\n\n\t\tfor (const provider of this.childProviders.values()) {\n\t\t\tprovider.destroy();\n\t\t}\n\t\tthis.childProviders.clear();\n\n\t\tthis.offlineStore?.destroy();\n\t\tthis.offlineStore = null;\n\n\t\tsuper.destroy();\n\t}\n}\n","import type {\n\tUserProfile,\n\tDocumentMeta,\n\tUploadMeta,\n\tUploadInfo,\n\tPublicKeyInfo,\n\tHealthStatus,\n} from \"./types.ts\";\n\nexport interface AbracadabraClientConfig {\n\t/** Server base URL (http or https). WebSocket URL is derived automatically. */\n\turl: string;\n\t/** Initial JWT token. If omitted and persistAuth is true, loads from storage. */\n\ttoken?: string;\n\t/** Persist JWT to localStorage for stay-logged-in. Default: true in browser. */\n\tpersistAuth?: boolean;\n\t/** localStorage key for token persistence. Default: \"abracadabra:auth\". */\n\tstorageKey?: string;\n\t/** Custom fetch implementation (useful for Node.js or testing). */\n\tfetch?: typeof globalThis.fetch;\n}\n\nexport class AbracadabraClient {\n\tprivate _token: string | null;\n\tprivate readonly baseUrl: string;\n\tprivate readonly persistAuth: boolean;\n\tprivate readonly storageKey: string;\n\tprivate readonly _fetch: typeof globalThis.fetch;\n\n\tconstructor(config: AbracadabraClientConfig) {\n\t\tthis.baseUrl = config.url.replace(/\\/+$/, \"\");\n\t\tthis.persistAuth = config.persistAuth ?? typeof localStorage !== \"undefined\";\n\t\tthis.storageKey = config.storageKey ?? \"abracadabra:auth\";\n\t\tthis._fetch = config.fetch ?? globalThis.fetch.bind(globalThis);\n\n\t\t// Load token: explicit > persisted > null\n\t\tthis._token = config.token ?? this.loadPersistedToken() ?? null;\n\t}\n\n\t// ── Token management ─────────────────────────────────────────────────────\n\n\tget token(): string | null {\n\t\treturn this._token;\n\t}\n\n\tset token(value: string | null) {\n\t\tthis._token = value;\n\t\tif (this.persistAuth) {\n\t\t\tif (value) {\n\t\t\t\tthis.persistToken(value);\n\t\t\t} else {\n\t\t\t\tthis.clearPersistedToken();\n\t\t\t}\n\t\t}\n\t}\n\n\tget isAuthenticated(): boolean {\n\t\treturn this._token !== null;\n\t}\n\n\t/** Derives ws:// or wss:// URL from the http(s) base URL. */\n\tget wsUrl(): string {\n\t\treturn this.baseUrl\n\t\t\t.replace(/^https:\\/\\//, \"wss://\")\n\t\t\t.replace(/^http:\\/\\//, \"ws://\") + \"/ws\";\n\t}\n\n\t// ── Auth ─────────────────────────────────────────────────────────────────\n\n\t/** Register a new user with password. */\n\tasync register(opts: {\n\t\tusername: string;\n\t\tpassword: string;\n\t\temail?: string;\n\t\tdisplayName?: string;\n\t}): Promise<UserProfile> {\n\t\treturn this.request<UserProfile>(\"POST\", \"/auth/register\", {\n\t\t\tbody: opts,\n\t\t\tauth: false,\n\t\t});\n\t}\n\n\t/**\n\t * Register a new user with an Ed25519 public key (crypto auth).\n\t * Username is optional — if omitted, a short identifier is derived from the key.\n\t */\n\tasync registerWithKey(opts: {\n\t\tpublicKey: string;\n\t\tusername?: string;\n\t\tdeviceName?: string;\n\t\tdisplayName?: string;\n\t\temail?: string;\n\t}): Promise<UserProfile> {\n\t\tconst username = opts.username ?? `user-${opts.publicKey.slice(0, 8)}`;\n\t\treturn this.request<UserProfile>(\"POST\", \"/auth/register\", {\n\t\t\tbody: {\n\t\t\t\tusername,\n\t\t\t\tidentityPublicKey: opts.publicKey,\n\t\t\t\tdeviceName: opts.deviceName,\n\t\t\t\tdisplayName: opts.displayName,\n\t\t\t\temail: opts.email,\n\t\t\t},\n\t\t\tauth: false,\n\t\t});\n\t}\n\n\t/** Login with username + password. Auto-persists returned token. */\n\tasync login(opts: { username: string; password: string }): Promise<string> {\n\t\tconst res = await this.request<{ token: string }>(\"POST\", \"/auth/login\", {\n\t\t\tbody: opts,\n\t\t\tauth: false,\n\t\t});\n\t\tthis.token = res.token;\n\t\treturn res.token;\n\t}\n\n\t/** Request an Ed25519 crypto auth challenge for the given public key. */\n\tasync challenge(publicKey: string): Promise<{ challenge: string; expiresAt: number }> {\n\t\treturn this.request(\"POST\", \"/auth/challenge\", {\n\t\t\tbody: { publicKey },\n\t\t\tauth: false,\n\t\t});\n\t}\n\n\t/** Verify an Ed25519 signature to complete crypto auth. Auto-persists token. */\n\tasync verify(opts: {\n\t\tpublicKey: string;\n\t\tsignature: string;\n\t\tchallenge: string;\n\t}): Promise<string> {\n\t\tconst res = await this.request<{ token: string }>(\"POST\", \"/auth/verify\", {\n\t\t\tbody: opts,\n\t\t\tauth: false,\n\t\t});\n\t\tthis.token = res.token;\n\t\treturn res.token;\n\t}\n\n\t/**\n\t * Full crypto auth flow: challenge → sign → verify.\n\t * Convenience method combining challenge() + external signing + verify().\n\t */\n\tasync loginWithKey(\n\t\tpublicKey: string,\n\t\tsignChallenge: (challenge: string) => Promise<string>,\n\t): Promise<string> {\n\t\tconst { challenge } = await this.challenge(publicKey);\n\t\tconst signature = await signChallenge(challenge);\n\t\treturn this.verify({ publicKey, signature, challenge });\n\t}\n\n\t/** Add a new Ed25519 public key to the current user (multi-device). */\n\tasync addKey(opts: { publicKey: string; deviceName?: string }): Promise<void> {\n\t\tawait this.request(\"POST\", \"/auth/keys\", { body: opts });\n\t}\n\n\t/** List all registered public keys for the current user. */\n\tasync listKeys(): Promise<PublicKeyInfo[]> {\n\t\tconst res = await this.request<{ keys: PublicKeyInfo[] }>(\"GET\", \"/auth/keys\");\n\t\treturn res.keys;\n\t}\n\n\t/** Revoke a public key by its ID. */\n\tasync revokeKey(keyId: string): Promise<void> {\n\t\tawait this.request(\"DELETE\", `/auth/keys/${encodeURIComponent(keyId)}`);\n\t}\n\n\t/** Clear token from memory and storage. */\n\tlogout(): void {\n\t\tthis.token = null;\n\t}\n\n\t// ── User ─────────────────────────────────────────────────────────────────\n\n\t/** Get the current user's profile. */\n\tasync getMe(): Promise<UserProfile> {\n\t\treturn this.request<UserProfile>(\"GET\", \"/users/me\");\n\t}\n\n\t/** Update the current user's display name. */\n\tasync updateMe(opts: { displayName?: string }): Promise<void> {\n\t\tawait this.request(\"PATCH\", \"/users/me\", { body: opts });\n\t}\n\n\t// ── Documents ────────────────────────────────────────────────────────────\n\n\t/** Create a new root document. Returns its metadata. */\n\tasync createDoc(opts?: { id?: string }): Promise<DocumentMeta> {\n\t\treturn this.request<DocumentMeta>(\"POST\", \"/docs\", { body: opts ?? {} });\n\t}\n\n\t/** Get document metadata. */\n\tasync getDoc(docId: string): Promise<DocumentMeta> {\n\t\treturn this.request<DocumentMeta>(\"GET\", `/docs/${encodeURIComponent(docId)}`);\n\t}\n\n\t/** Delete a document (requires Owner role). Cascades to children and uploads. */\n\tasync deleteDoc(docId: string): Promise<void> {\n\t\tawait this.request(\"DELETE\", `/docs/${encodeURIComponent(docId)}`);\n\t}\n\n\t/** List immediate child documents. */\n\tasync listChildren(docId: string): Promise<string[]> {\n\t\tconst res = await this.request<{ children: string[] }>(\n\t\t\t\"GET\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/children`,\n\t\t);\n\t\treturn res.children;\n\t}\n\n\t/** Create a child document under a parent (requires write permission). */\n\tasync createChild(docId: string, opts?: { child_id?: string }): Promise<DocumentMeta> {\n\t\treturn this.request<DocumentMeta>(\n\t\t\t\"POST\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/children`,\n\t\t\t{ body: opts ?? {} },\n\t\t);\n\t}\n\n\t// ── Permissions ──────────────────────────────────────────────────────────\n\n\t/** Grant or change a user's role on a document (requires Owner). */\n\tasync setPermission(\n\t\tdocId: string,\n\t\topts: { user_id: string; role: \"owner\" | \"editor\" | \"viewer\" | \"observer\" },\n\t): Promise<void> {\n\t\tawait this.request(\n\t\t\t\"POST\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/permissions`,\n\t\t\t{ body: opts },\n\t\t);\n\t}\n\n\t/** Revoke a user's permission on a document (requires Owner). */\n\tasync removePermission(docId: string, opts: { user_id: string }): Promise<void> {\n\t\tawait this.request(\n\t\t\t\"DELETE\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/permissions`,\n\t\t\t{ body: opts },\n\t\t);\n\t}\n\n\t// ── Uploads ──────────────────────────────────────────────────────────────\n\n\t/** Upload a file to a document (requires write permission). */\n\tasync upload(\n\t\tdocId: string,\n\t\tfile: File | Blob,\n\t\tfilename?: string,\n\t): Promise<UploadMeta> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", file, filename);\n\n\t\tconst headers: Record<string, string> = {};\n\t\tif (this._token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${this._token}`;\n\t\t}\n\n\t\tconst res = await this._fetch(\n\t\t\t`${this.baseUrl}/docs/${encodeURIComponent(docId)}/uploads`,\n\t\t\t{ method: \"POST\", headers, body: formData },\n\t\t);\n\t\tif (!res.ok) {\n\t\t\tthrow await this.toError(res);\n\t\t}\n\t\treturn res.json() as Promise<UploadMeta>;\n\t}\n\n\t/** List all uploads for a document. */\n\tasync listUploads(docId: string): Promise<UploadInfo[]> {\n\t\tconst res = await this.request<{ uploads: UploadInfo[] }>(\n\t\t\t\"GET\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/uploads`,\n\t\t);\n\t\treturn res.uploads;\n\t}\n\n\t/** Download an upload as a Blob. */\n\tasync getUpload(docId: string, uploadId: string): Promise<Blob> {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (this._token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${this._token}`;\n\t\t}\n\n\t\tconst res = await this._fetch(\n\t\t\t`${this.baseUrl}/docs/${encodeURIComponent(docId)}/uploads/${encodeURIComponent(uploadId)}`,\n\t\t\t{ method: \"GET\", headers },\n\t\t);\n\t\tif (!res.ok) {\n\t\t\tthrow await this.toError(res);\n\t\t}\n\t\treturn res.blob();\n\t}\n\n\t/** Delete an upload (requires uploader or document Owner). */\n\tasync deleteUpload(docId: string, uploadId: string): Promise<void> {\n\t\tawait this.request(\n\t\t\t\"DELETE\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/uploads/${encodeURIComponent(uploadId)}`,\n\t\t);\n\t}\n\n\t// ── System ───────────────────────────────────────────────────────────────\n\n\t/** Health check — no auth required. */\n\tasync health(): Promise<HealthStatus> {\n\t\treturn this.request<HealthStatus>(\"GET\", \"/health\", { auth: false });\n\t}\n\n\t// ── Internals ────────────────────────────────────────────────────────────\n\n\tprivate async request<T = void>(\n\t\tmethod: string,\n\t\tpath: string,\n\t\topts?: { body?: unknown; auth?: boolean },\n\t): Promise<T> {\n\t\tconst auth = opts?.auth ?? true;\n\t\tconst headers: Record<string, string> = {};\n\n\t\tif (auth && this._token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${this._token}`;\n\t\t}\n\n\t\tconst init: RequestInit = { method, headers };\n\n\t\tif (opts?.body !== undefined) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tinit.body = JSON.stringify(opts.body);\n\t\t}\n\n\t\tconst res = await this._fetch(`${this.baseUrl}${path}`, init);\n\n\t\tif (!res.ok) {\n\t\t\tthrow await this.toError(res);\n\t\t}\n\n\t\t// 204 No Content\n\t\tif (res.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\treturn res.json() as Promise<T>;\n\t}\n\n\tprivate async toError(res: Response): Promise<Error> {\n\t\tlet message: string;\n\t\ttry {\n\t\t\tconst body = await res.json() as { error?: string };\n\t\t\tmessage = body.error ?? res.statusText;\n\t\t} catch {\n\t\t\tmessage = res.statusText;\n\t\t}\n\t\tconst err = new Error(message);\n\t\t(err as any).status = res.status;\n\t\treturn err;\n\t}\n\n\tprivate loadPersistedToken(): string | null {\n\t\ttry {\n\t\t\treturn localStorage.getItem(this.storageKey);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate persistToken(token: string): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(this.storageKey, token);\n\t\t} catch {\n\t\t\t// localStorage unavailable (SSR / Node.js)\n\t\t}\n\t}\n\n\tprivate clearPersistedToken(): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(this.storageKey);\n\t\t} catch {\n\t\t\t// localStorage unavailable\n\t\t}\n\t}\n}\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** @deprecated */\nexport const byteSwapIfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** For runtime check if class implements interface */\nexport class Hash {\n}\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function createOptHasher(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function createXOFer(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor = createHasher;\nexport const wrapConstructorWithOpts = createOptHasher;\nexport const wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, Hash, toBytes } from \"./utils.js\";\nexport class HMAC extends Hash {\n constructor(hash, _key) {\n super();\n this.finished = false;\n this.destroyed = false;\n ahash(hash);\n const key = toBytes(_key);\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf) {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n aexists(this);\n abytes(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to || (to = Object.create(Object.getPrototypeOf(this), {}));\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();\nhmac.create = (hash, key) => new HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map","/**\n * HKDF (RFC 5869): extract + expand in one step.\n * See https://soatok.blog/2021/11/17/understanding-hkdf/.\n * @module\n */\nimport { hmac } from \"./hmac.js\";\nimport { ahash, anumber, clean, toBytes } from \"./utils.js\";\n/**\n * HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`\n * Arguments position differs from spec (IKM is first one, since it is not optional)\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n */\nexport function extract(hash, ikm, salt) {\n ahash(hash);\n // NOTE: some libraries treat zero-length array as 'not provided';\n // we don't, since we have undefined as 'not provided'\n // https://github.com/RustCrypto/KDFs/issues/15\n if (salt === undefined)\n salt = new Uint8Array(hash.outputLen);\n return hmac(hash, toBytes(salt), toBytes(ikm));\n}\nconst HKDF_COUNTER = /* @__PURE__ */ Uint8Array.from([0]);\nconst EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();\n/**\n * HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`\n * @param hash - hash function that would be used (e.g. sha256)\n * @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n */\nexport function expand(hash, prk, info, length = 32) {\n ahash(hash);\n anumber(length);\n const olen = hash.outputLen;\n if (length > 255 * olen)\n throw new Error('Length should be <= 255*HashLen');\n const blocks = Math.ceil(length / olen);\n if (info === undefined)\n info = EMPTY_BUFFER;\n // first L(ength) octets of T\n const okm = new Uint8Array(blocks * olen);\n // Re-use HMAC instance between blocks\n const HMAC = hmac.create(hash, prk);\n const HMACTmp = HMAC._cloneInto();\n const T = new Uint8Array(HMAC.outputLen);\n for (let counter = 0; counter < blocks; counter++) {\n HKDF_COUNTER[0] = counter + 1;\n // T(0) = empty string (zero length)\n // T(N) = HMAC-Hash(PRK, T(N-1) | info | N)\n HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)\n .update(info)\n .update(HKDF_COUNTER)\n .digestInto(T);\n okm.set(T, olen * counter);\n HMAC._cloneInto(HMACTmp);\n }\n HMAC.destroy();\n HMACTmp.destroy();\n clean(T, HKDF_COUNTER);\n return okm.slice(0, length);\n}\n/**\n * HKDF (RFC 5869): derive keys from an initial input.\n * Combines hkdf_extract + hkdf_expand in one step\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n * @example\n * import { hkdf } from '@noble/hashes/hkdf';\n * import { sha256 } from '@noble/hashes/sha2';\n * import { randomBytes } from '@noble/hashes/utils';\n * const inputKey = randomBytes(32);\n * const salt = randomBytes(32);\n * const info = 'application-key';\n * const hk1 = hkdf(sha256, inputKey, salt, info, 32);\n */\nexport const hkdf = (hash, ikm, salt, info, length) => expand(hash, extract(hash, ikm, salt), info, length);\n//# sourceMappingURL=hkdf.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { Hash, abytes, aexists, aoutput, clean, createView, toBytes } from \"./utils.js\";\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport class HashMD extends Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, rotr } from \"./utils.js\";\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD {\n constructor(outputLen = 32) {\n super(64, outputLen, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = SHA256_IV[0] | 0;\n this.B = SHA256_IV[1] | 0;\n this.C = SHA256_IV[2] | 0;\n this.D = SHA256_IV[3] | 0;\n this.E = SHA256_IV[4] | 0;\n this.F = SHA256_IV[5] | 0;\n this.G = SHA256_IV[6] | 0;\n this.H = SHA256_IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\nexport class SHA224 extends SHA256 {\n constructor() {\n super(28);\n this.A = SHA224_IV[0] | 0;\n this.B = SHA224_IV[1] | 0;\n this.C = SHA224_IV[2] | 0;\n this.D = SHA224_IV[3] | 0;\n this.E = SHA224_IV[4] | 0;\n this.F = SHA224_IV[5] | 0;\n this.G = SHA224_IV[6] | 0;\n this.H = SHA224_IV[7] | 0;\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nexport class SHA512 extends HashMD {\n constructor(outputLen = 64) {\n super(128, outputLen, 16, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = SHA512_IV[0] | 0;\n this.Al = SHA512_IV[1] | 0;\n this.Bh = SHA512_IV[2] | 0;\n this.Bl = SHA512_IV[3] | 0;\n this.Ch = SHA512_IV[4] | 0;\n this.Cl = SHA512_IV[5] | 0;\n this.Dh = SHA512_IV[6] | 0;\n this.Dl = SHA512_IV[7] | 0;\n this.Eh = SHA512_IV[8] | 0;\n this.El = SHA512_IV[9] | 0;\n this.Fh = SHA512_IV[10] | 0;\n this.Fl = SHA512_IV[11] | 0;\n this.Gh = SHA512_IV[12] | 0;\n this.Gl = SHA512_IV[13] | 0;\n this.Hh = SHA512_IV[14] | 0;\n this.Hl = SHA512_IV[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nexport class SHA384 extends SHA512 {\n constructor() {\n super(48);\n this.Ah = SHA384_IV[0] | 0;\n this.Al = SHA384_IV[1] | 0;\n this.Bh = SHA384_IV[2] | 0;\n this.Bl = SHA384_IV[3] | 0;\n this.Ch = SHA384_IV[4] | 0;\n this.Cl = SHA384_IV[5] | 0;\n this.Dh = SHA384_IV[6] | 0;\n this.Dl = SHA384_IV[7] | 0;\n this.Eh = SHA384_IV[8] | 0;\n this.El = SHA384_IV[9] | 0;\n this.Fh = SHA384_IV[10] | 0;\n this.Fl = SHA384_IV[11] | 0;\n this.Gh = SHA384_IV[12] | 0;\n this.Gl = SHA384_IV[13] | 0;\n this.Hh = SHA384_IV[14] | 0;\n this.Hl = SHA384_IV[15] | 0;\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nexport class SHA512_224 extends SHA512 {\n constructor() {\n super(28);\n this.Ah = T224_IV[0] | 0;\n this.Al = T224_IV[1] | 0;\n this.Bh = T224_IV[2] | 0;\n this.Bl = T224_IV[3] | 0;\n this.Ch = T224_IV[4] | 0;\n this.Cl = T224_IV[5] | 0;\n this.Dh = T224_IV[6] | 0;\n this.Dl = T224_IV[7] | 0;\n this.Eh = T224_IV[8] | 0;\n this.El = T224_IV[9] | 0;\n this.Fh = T224_IV[10] | 0;\n this.Fl = T224_IV[11] | 0;\n this.Gh = T224_IV[12] | 0;\n this.Gl = T224_IV[13] | 0;\n this.Hh = T224_IV[14] | 0;\n this.Hl = T224_IV[15] | 0;\n }\n}\nexport class SHA512_256 extends SHA512 {\n constructor() {\n super(32);\n this.Ah = T256_IV[0] | 0;\n this.Al = T256_IV[1] | 0;\n this.Bh = T256_IV[2] | 0;\n this.Bl = T256_IV[3] | 0;\n this.Ch = T256_IV[4] | 0;\n this.Cl = T256_IV[5] | 0;\n this.Dh = T256_IV[6] | 0;\n this.Dl = T256_IV[7] | 0;\n this.Eh = T256_IV[8] | 0;\n this.El = T256_IV[9] | 0;\n this.Fh = T256_IV[10] | 0;\n this.Fl = T256_IV[11] | 0;\n this.Gh = T256_IV[12] | 0;\n this.Gl = T256_IV[13] | 0;\n this.Hh = T256_IV[14] | 0;\n this.Hl = T256_IV[15] | 0;\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map","/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport { SHA224 as SHA224n, sha224 as sha224n, SHA256 as SHA256n, sha256 as sha256n, } from \"./sha2.js\";\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256 = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256 = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224 = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224 = sha224n;\n//# sourceMappingURL=sha256.js.map","/**\n * CryptoIdentityKeystore\n *\n * Per-device Ed25519 keypair, private key protected by WebAuthn PRF + AES-256-GCM.\n * Stored in IndexedDB under \"abracadabra:identity\" / \"identity\" / key \"current\".\n *\n * No private key is ever shared between devices. Each device generates its own\n * keypair, encrypts the private key with the PRF output from its own WebAuthn\n * credential, and stores the ciphertext in IndexedDB.\n *\n * Dependencies: @noble/ed25519, @noble/hashes (for HKDF)\n */\n\nimport * as ed from \"@noble/ed25519\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface StoredIdentity {\n\t/**\n\t * Internal label stored locally. NOT sent to the server during the\n\t * challenge-response handshake — the public key is the sole auth identifier.\n\t * This may be used as a hint when calling POST /auth/register (first device)\n\t * or displayed to the user before they set a real display name.\n\t */\n\tusername: string;\n\t/** base64url-encoded Ed25519 public key (32 bytes). Primary auth identifier. */\n\tpublicKey: string;\n\t/** AES-GCM ciphertext of the 32-byte private key */\n\tencryptedPrivateKey: ArrayBuffer;\n\t/** 12-byte AES-GCM nonce */\n\tiv: Uint8Array;\n\t/** 32-byte constant PRF input salt (per-enrollment) */\n\tsalt: Uint8Array;\n\t/** WebAuthn credential ID */\n\tcredentialId: ArrayBuffer;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction toBase64url(bytes: Uint8Array): string {\n\treturn btoa(String.fromCharCode(...bytes))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=/g, \"\");\n}\n\nfunction fromBase64url(b64: string): Uint8Array {\n\tconst padded = b64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\tconst padLen = (4 - (padded.length % 4)) % 4;\n\tconst padded2 = padded + \"=\".repeat(padLen);\n\treturn Uint8Array.from(atob(padded2), (c) => c.charCodeAt(0));\n}\n\nconst DB_NAME = \"abracadabra:identity\";\nconst STORE_NAME = \"identity\";\nconst RECORD_KEY = \"current\";\nconst HKDF_INFO = new TextEncoder().encode(\"abracadabra-identity-v1\");\n\n// ── IndexedDB helpers ─────────────────────────────────────────────────────────\n\nfunction openDb(): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(DB_NAME, 1);\n\t\treq.onupgradeneeded = () => {\n\t\t\treq.result.createObjectStore(STORE_NAME);\n\t\t};\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function dbGet(db: IDBDatabase): Promise<StoredIdentity | undefined> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readonly\");\n\t\tconst req = tx.objectStore(STORE_NAME).get(RECORD_KEY);\n\t\treq.onsuccess = () => resolve(req.result as StoredIdentity | undefined);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function dbPut(db: IDBDatabase, value: StoredIdentity): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readwrite\");\n\t\tconst req = tx.objectStore(STORE_NAME).put(value, RECORD_KEY);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function dbDelete(db: IDBDatabase): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readwrite\");\n\t\tconst req = tx.objectStore(STORE_NAME).delete(RECORD_KEY);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\n// ── Key derivation ────────────────────────────────────────────────────────────\n\nasync function deriveAesKey(prfOutput: ArrayBuffer, salt: Uint8Array): Promise<CryptoKey> {\n\tconst ikm = new Uint8Array(prfOutput);\n\tconst keyBytes = hkdf(sha256, ikm, salt, HKDF_INFO, 32);\n\treturn crypto.subtle.importKey(\"raw\", keyBytes, { name: \"AES-GCM\" }, false, [\n\t\t\"encrypt\",\n\t\t\"decrypt\",\n\t]);\n}\n\n// ── Main class ───────────────────────────────────────────────────────────────\n\nexport class CryptoIdentityKeystore {\n\t/**\n\t * One-time setup for a device: generates an Ed25519 keypair, creates a\n\t * WebAuthn credential with PRF extension, encrypts the private key, and\n\t * stores everything in IndexedDB.\n\t *\n\t * Returns the base64url-encoded public key. The caller must register this\n\t * key with the server via POST /auth/register (first device) or\n\t * POST /auth/keys (additional device).\n\t *\n\t * @param username - The user's account name.\n\t * @param rpId - WebAuthn relying party ID (e.g. \"example.com\").\n\t * @param rpName - Human-readable relying party name.\n\t */\n\tasync register(username: string, rpId: string, rpName: string): Promise<string> {\n\t\t// 1. Generate Ed25519 keypair\n\t\tconst privateKey = ed.utils.randomPrivateKey();\n\t\tconst publicKey = await ed.getPublicKeyAsync(privateKey);\n\n\t\t// 2. Generate per-enrollment salt\n\t\tconst salt = crypto.getRandomValues(new Uint8Array(32));\n\n\t\t// 3. Create WebAuthn credential with PRF extension\n\t\tconst credential = await navigator.credentials.create({\n\t\t\tpublicKey: {\n\t\t\t\tchallenge: crypto.getRandomValues(new Uint8Array(32)),\n\t\t\t\trp: { id: rpId, name: rpName },\n\t\t\t\tuser: {\n\t\t\t\t\tid: new TextEncoder().encode(username),\n\t\t\t\t\tname: username,\n\t\t\t\t\tdisplayName: username,\n\t\t\t\t},\n\t\t\t\tpubKeyCredParams: [\n\t\t\t\t\t{ alg: -7, type: \"public-key\" }, // ES256\n\t\t\t\t\t{ alg: -257, type: \"public-key\" }, // RS256\n\t\t\t\t],\n\t\t\t\tauthenticatorSelection: {\n\t\t\t\t\tuserVerification: \"required\",\n\t\t\t\t},\n\t\t\t\textensions: {\n\t\t\t\t\tprf: { eval: { first: salt.buffer } },\n\t\t\t\t} as AuthenticationExtensionsClientInputs,\n\t\t\t},\n\t\t}) as PublicKeyCredential | null;\n\n\t\tif (!credential) {\n\t\t\tthrow new Error(\"WebAuthn credential creation failed\");\n\t\t}\n\n\t\tconst extResults = credential.getClientExtensionResults() as {\n\t\t\tprf?: { results?: { first?: ArrayBuffer } };\n\t\t};\n\t\tconst prfOutput = extResults?.prf?.results?.first;\n\t\tif (!prfOutput) {\n\t\t\tthrow new Error(\n\t\t\t\t\"WebAuthn PRF extension not available on this authenticator. \" +\n\t\t\t\t\t\"A PRF-capable authenticator (e.g. platform authenticator with PRF support) is required.\",\n\t\t\t);\n\t\t}\n\n\t\t// 4. Derive AES key from PRF output via HKDF\n\t\tconst aesKey = await deriveAesKey(prfOutput, salt);\n\n\t\t// 5. Encrypt private key\n\t\tconst iv = crypto.getRandomValues(new Uint8Array(12));\n\t\tconst encryptedPrivateKey = await crypto.subtle.encrypt(\n\t\t\t{ name: \"AES-GCM\", iv },\n\t\t\taesKey,\n\t\t\tprivateKey,\n\t\t);\n\n\t\t// 6. Store in IndexedDB\n\t\tconst db = await openDb();\n\t\tawait dbPut(db, {\n\t\t\tusername,\n\t\t\tpublicKey: toBase64url(publicKey),\n\t\t\tencryptedPrivateKey,\n\t\t\tiv,\n\t\t\tsalt,\n\t\t\tcredentialId: credential.rawId,\n\t\t});\n\t\tdb.close();\n\n\t\treturn toBase64url(publicKey);\n\t}\n\n\t/**\n\t * Sign a base64url-encoded challenge using the stored Ed25519 private key.\n\t *\n\t * This triggers a WebAuthn assertion (biometric / PIN prompt) to unlock the\n\t * private key via PRF → HKDF → AES-GCM decryption. The private key is\n\t * wiped from memory after signing.\n\t *\n\t * @param challengeB64 - base64url-encoded challenge bytes from the server.\n\t * @returns base64url-encoded Ed25519 signature (64 bytes).\n\t */\n\tasync sign(challengeB64: string): Promise<string> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\n\t\tif (!stored) {\n\t\t\tthrow new Error(\"No identity stored. Call register() first.\");\n\t\t}\n\n\t\t// WebAuthn assertion with PRF\n\t\tconst assertion = await navigator.credentials.get({\n\t\t\tpublicKey: {\n\t\t\t\tchallenge: crypto.getRandomValues(new Uint8Array(32)),\n\t\t\t\tallowCredentials: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: stored.credentialId,\n\t\t\t\t\t\ttype: \"public-key\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tuserVerification: \"required\",\n\t\t\t\textensions: {\n\t\t\t\t\tprf: { eval: { first: stored.salt.buffer } },\n\t\t\t\t} as AuthenticationExtensionsClientInputs,\n\t\t\t},\n\t\t}) as PublicKeyCredential | null;\n\n\t\tif (!assertion) {\n\t\t\tthrow new Error(\"WebAuthn assertion failed\");\n\t\t}\n\n\t\tconst extResults = assertion.getClientExtensionResults() as {\n\t\t\tprf?: { results?: { first?: ArrayBuffer } };\n\t\t};\n\t\tconst prfOutput = extResults?.prf?.results?.first;\n\t\tif (!prfOutput) {\n\t\t\tthrow new Error(\"PRF output not available from authenticator\");\n\t\t}\n\n\t\t// Derive the same AES key\n\t\tconst aesKey = await deriveAesKey(prfOutput, stored.salt);\n\n\t\t// Decrypt private key\n\t\tconst privateKeyBytes = await crypto.subtle.decrypt(\n\t\t\t{ name: \"AES-GCM\", iv: stored.iv },\n\t\t\taesKey,\n\t\t\tstored.encryptedPrivateKey,\n\t\t);\n\n\t\tconst privateKey = new Uint8Array(privateKeyBytes);\n\n\t\t// Sign the challenge\n\t\tconst challengeBytes = fromBase64url(challengeB64);\n\t\tconst signature = await ed.signAsync(challengeBytes, privateKey);\n\n\t\t// Wipe private key from memory\n\t\tprivateKey.fill(0);\n\n\t\treturn toBase64url(signature);\n\t}\n\n\t/** Returns the stored base64url public key, or null if no identity exists. */\n\tasync getPublicKey(): Promise<string | null> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\t\treturn stored?.publicKey ?? null;\n\t}\n\n\t/**\n\t * Returns the locally-stored internal username label, or null if no identity exists.\n\t *\n\t * This is NOT the auth identifier (the public key is). It can be used as a\n\t * hint when calling POST /auth/register, or displayed before the user sets\n\t * a real display name via PATCH /users/me.\n\t */\n\tasync getUsername(): Promise<string | null> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\t\treturn stored?.username ?? null;\n\t}\n\n\t/** Returns true if an identity is stored in IndexedDB. */\n\tasync hasIdentity(): Promise<boolean> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\t\treturn stored !== undefined;\n\t}\n\n\t/** Remove the stored identity from IndexedDB. */\n\tasync clear(): Promise<void> {\n\t\tconst db = await openDb();\n\t\tawait dbDelete(db);\n\t\tdb.close();\n\t}\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,22,35,36,37,38,39,40,41],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abracadabra-provider.cjs","names":["isNaN","binary.BITS31","binary.BITS32","math.floor","create","isArray","binary.BITS7","binary.BIT8","math.floor","string.encodeUtf8","string.utf8TextEncoder","math.min","math.max","create","error.create","binary.BITS7","binary.BIT8","number.MAX_SAFE_INTEGER","binary.BITS6","binary.BIT7","string.utf8TextDecoder","map.create","set.create","array.from","equalityTrait.EqualityTraitSymbol","object.size","object.hasProperty","array.isArray","time.getUnixTime","math.floor","f.equalityDeep","encoding.createEncoder","encoding.toUint8Array","decoding.createDecoder","decoding.readVarUint","decoding.readVarString","time.getUnixTime","WsReadyStates","Y","decoding.readVarUint8Array","decoding.readVarUint","awarenessProtocol.encodeAwarenessUpdate","Y","openDb","Y","u64.split","sha256","sha256n","ed"],"sources":["../../../node_modules/lib0/math.js","../../../node_modules/lib0/binary.js","../../../node_modules/lib0/number.js","../../../node_modules/lib0/set.js","../../../node_modules/lib0/array.js","../../../node_modules/lib0/string.js","../../../node_modules/lib0/encoding.js","../../../node_modules/lib0/error.js","../../../node_modules/lib0/decoding.js","../../../node_modules/lib0/time.js","../../../node_modules/lib0/map.js","../../../node_modules/lib0/observable.js","../../../node_modules/lib0/trait/equality.js","../../../node_modules/lib0/object.js","../../../node_modules/lib0/function.js","../../../node_modules/y-protocols/awareness.js","../src/EventEmitter.ts","../src/IncomingMessage.ts","../src/types.ts","../src/OutgoingMessage.ts","../src/OutgoingMessages/CloseMessage.ts","../src/HocuspocusProviderWebsocket.ts","../../../node_modules/y-protocols/sync.js","../src/MessageReceiver.ts","../src/MessageSender.ts","../src/OutgoingMessages/AuthenticationMessage.ts","../src/OutgoingMessages/AwarenessMessage.ts","../src/OutgoingMessages/StatelessMessage.ts","../src/OutgoingMessages/SyncStepOneMessage.ts","../src/OutgoingMessages/UpdateMessage.ts","../src/HocuspocusProvider.ts","../src/OfflineStore.ts","../src/OutgoingMessages/SubdocMessage.ts","../src/AbracadabraProvider.ts","../src/AbracadabraClient.ts","../../../node_modules/@noble/hashes/esm/utils.js","../../../node_modules/@noble/hashes/esm/hmac.js","../../../node_modules/@noble/hashes/esm/hkdf.js","../../../node_modules/@noble/hashes/esm/_md.js","../../../node_modules/@noble/hashes/esm/_u64.js","../../../node_modules/@noble/hashes/esm/sha2.js","../../../node_modules/@noble/hashes/esm/sha256.js","../src/CryptoIdentityKeystore.ts"],"sourcesContent":["/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * Check whether n is negative, while considering the -0 edge case. While `-0 < 0` is false, this\n * function returns true for -0,-1,,.. and returns false for 0,1,2,...\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also distinguishes between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/* eslint-env browser */\n\n/**\n * Binary data constants.\n *\n * @module binary\n */\n\n/**\n * n-th bit activated.\n *\n * @type {number}\n */\nexport const BIT1 = 1\nexport const BIT2 = 2\nexport const BIT3 = 4\nexport const BIT4 = 8\nexport const BIT5 = 16\nexport const BIT6 = 32\nexport const BIT7 = 64\nexport const BIT8 = 128\nexport const BIT9 = 256\nexport const BIT10 = 512\nexport const BIT11 = 1024\nexport const BIT12 = 2048\nexport const BIT13 = 4096\nexport const BIT14 = 8192\nexport const BIT15 = 16384\nexport const BIT16 = 32768\nexport const BIT17 = 65536\nexport const BIT18 = 1 << 17\nexport const BIT19 = 1 << 18\nexport const BIT20 = 1 << 19\nexport const BIT21 = 1 << 20\nexport const BIT22 = 1 << 21\nexport const BIT23 = 1 << 22\nexport const BIT24 = 1 << 23\nexport const BIT25 = 1 << 24\nexport const BIT26 = 1 << 25\nexport const BIT27 = 1 << 26\nexport const BIT28 = 1 << 27\nexport const BIT29 = 1 << 28\nexport const BIT30 = 1 << 29\nexport const BIT31 = 1 << 30\nexport const BIT32 = 1 << 31\n\n/**\n * First n bits activated.\n *\n * @type {number}\n */\nexport const BITS0 = 0\nexport const BITS1 = 1\nexport const BITS2 = 3\nexport const BITS3 = 7\nexport const BITS4 = 15\nexport const BITS5 = 31\nexport const BITS6 = 63\nexport const BITS7 = 127\nexport const BITS8 = 255\nexport const BITS9 = 511\nexport const BITS10 = 1023\nexport const BITS11 = 2047\nexport const BITS12 = 4095\nexport const BITS13 = 8191\nexport const BITS14 = 16383\nexport const BITS15 = 32767\nexport const BITS16 = 65535\nexport const BITS17 = BIT18 - 1\nexport const BITS18 = BIT19 - 1\nexport const BITS19 = BIT20 - 1\nexport const BITS20 = BIT21 - 1\nexport const BITS21 = BIT22 - 1\nexport const BITS22 = BIT23 - 1\nexport const BITS23 = BIT24 - 1\nexport const BITS24 = BIT25 - 1\nexport const BITS25 = BIT26 - 1\nexport const BITS26 = BIT27 - 1\nexport const BITS27 = BIT28 - 1\nexport const BITS28 = BIT29 - 1\nexport const BITS29 = BIT30 - 1\nexport const BITS30 = BIT31 - 1\n/**\n * @type {number}\n */\nexport const BITS31 = 0x7FFFFFFF\n/**\n * @type {number}\n */\nexport const BITS32 = 0xFFFFFFFF\n","/**\n * Utility helpers for working with numbers.\n *\n * @module number\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER\n\nexport const LOWEST_INT32 = 1 << 31\nexport const HIGHEST_INT32 = binary.BITS31\nexport const HIGHEST_UINT32 = binary.BITS32\n\n/* c8 ignore next */\nexport const isInteger = Number.isInteger || (num => typeof num === 'number' && isFinite(num) && math.floor(num) === num)\nexport const isNaN = Number.isNaN\nexport const parseInt = Number.parseInt\n\n/**\n * Count the number of \"1\" bits in an unsigned 32bit number.\n *\n * Super fun bitcount algorithm by Brian Kernighan.\n *\n * @param {number} n\n */\nexport const countBits = n => {\n n &= binary.BITS32\n let count = 0\n while (n) {\n n &= (n - 1)\n count++\n }\n return count\n}\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T|undefined}\n */\nexport const first = set => set.values().next().value\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n for (let i = 0; i < src.length; i++) {\n dest.push(src[i])\n }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template {ArrayLike<any>} ARR\n *\n * @param {ARR} arr\n * @param {ARR extends ArrayLike<infer S> ? ((value:S, index:number, arr:ARR) => boolean) : any} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (!f(arr[i], i, arr)) {\n return false\n }\n }\n return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template {ArrayLike<any>} ARR\n *\n * @param {ARR} arr\n * @param {ARR extends ArrayLike<infer S> ? ((value:S, index:number, arr:ARR) => boolean) : never} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (f(arr[i], i, arr)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n const array = new Array(len)\n for (let i = 0; i < len; i++) {\n array[i] = f(i, array)\n }\n return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n /**\n * @type {Set<M>}\n */\n const happened = set.create()\n /**\n * @type {Array<T>}\n */\n const result = []\n for (let i = 0; i < arr.length; i++) {\n const el = arr[i]\n const mapped = mapper(el)\n if (!happened.has(mapped)) {\n happened.add(mapped)\n result.push(el)\n }\n }\n return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n /**\n * @type {Array<any>}\n */\n const res = Array(arr.length)\n for (let i = 0; i < arr.length; i++) {\n res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n }\n return /** @type {any} */ (res)\n}\n\n/**\n * This function bubble-sorts a single item to the correct position. The sort happens in-place and\n * might be useful to ensure that a single item is at the correct position in an otherwise sorted\n * array.\n *\n * @example\n * const arr = [3, 2, 5]\n * arr.sort((a, b) => a - b)\n * arr // => [2, 3, 5]\n * arr.splice(1, 0, 7)\n * array.bubbleSortItem(arr, 1, (a, b) => a - b)\n * arr // => [2, 3, 5, 7]\n *\n * @template T\n * @param {Array<T>} arr\n * @param {number} i\n * @param {(a:T,b:T) => number} compareFn\n */\nexport const bubblesortItem = (arr, i, compareFn) => {\n const n = arr[i]\n let j = i\n // try to sort to the right\n while (j + 1 < arr.length && compareFn(n, arr[j + 1]) > 0) {\n arr[j] = arr[j + 1]\n arr[++j] = n\n }\n if (i === j && j > 0) { // no change yet\n // sort to the left\n while (j > 0 && compareFn(arr[j - 1], n) > 0) {\n arr[j] = arr[j - 1]\n arr[--j] = n\n }\n }\n return j\n}\n","import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array<ArrayBuffer>}\n */\nexport const _encodeUtf8Polyfill = str => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n }\n return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array<ArrayBuffer>}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n // Safari doesn't handle BOM correctly.\n // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n // Another issue is that from then on no BOM chars are recognized anymore\n /* c8 ignore next */\n utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n\n/**\n * Escape HTML characters &,<,>,',\" to their respective HTML entities &,<,>,',"\n *\n * @param {string} str\n */\nexport const escapeHTML = str =>\n str.replace(/[&<>'\"]/g, r => /** @type {string} */ ({\n '&': '&',\n '<': '<',\n '>': '>',\n \"'\": ''',\n '\"': '"'\n }[r]))\n\n/**\n * Reverse of `escapeHTML`\n *\n * @param {string} str\n */\nexport const unescapeHTML = str =>\n str.replace(/&|<|>|'|"/g, r => /** @type {string} */ ({\n '&': '&',\n '<': '<',\n '>': '>',\n ''': \"'\",\n '"': '\"'\n }[r]))\n","/**\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module encoding\n */\n\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as binary from './binary.js'\nimport * as string from './string.js'\nimport * as array from './array.js'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n constructor () {\n this.cpos = 0\n this.cbuf = new Uint8Array(100)\n /**\n * @type {Array<Uint8Array>}\n */\n this.bufs = []\n }\n}\n\n/**\n * @function\n * @return {Encoder}\n */\nexport const createEncoder = () => new Encoder()\n\n/**\n * @param {function(Encoder):void} f\n */\nexport const encode = (f) => {\n const encoder = createEncoder()\n f(encoder)\n return toUint8Array(encoder)\n}\n\n/**\n * The current length of the encoded data.\n *\n * @function\n * @param {Encoder} encoder\n * @return {number}\n */\nexport const length = encoder => {\n let len = encoder.cpos\n for (let i = 0; i < encoder.bufs.length; i++) {\n len += encoder.bufs[i].length\n }\n return len\n}\n\n/**\n * Check whether encoder is empty.\n *\n * @function\n * @param {Encoder} encoder\n * @return {boolean}\n */\nexport const hasContent = encoder => encoder.cpos > 0 || encoder.bufs.length > 0\n\n/**\n * Transform to Uint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @return {Uint8Array<ArrayBuffer>} The created ArrayBuffer.\n */\nexport const toUint8Array = encoder => {\n const uint8arr = new Uint8Array(length(encoder))\n let curPos = 0\n for (let i = 0; i < encoder.bufs.length; i++) {\n const d = encoder.bufs[i]\n uint8arr.set(d, curPos)\n curPos += d.length\n }\n uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n *\n * @param {Encoder} encoder\n * @param {number} len\n */\nexport const verifyLen = (encoder, len) => {\n const bufferLen = encoder.cbuf.length\n if (bufferLen - encoder.cpos < len) {\n encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos))\n encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)\n encoder.cpos = 0\n }\n}\n\n/**\n * Write one byte to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The byte that is to be encoded.\n */\nexport const write = (encoder, num) => {\n const bufferLen = encoder.cbuf.length\n if (encoder.cpos === bufferLen) {\n encoder.bufs.push(encoder.cbuf)\n encoder.cbuf = new Uint8Array(bufferLen * 2)\n encoder.cpos = 0\n }\n encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos Position to which to write data\n * @param {number} num Unsigned 8-bit integer\n */\nexport const set = (encoder, pos, num) => {\n let buffer = null\n // iterate all buffers and adjust position\n for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n const b = encoder.bufs[i]\n if (pos < b.length) {\n buffer = b // found buffer\n } else {\n pos -= b.length\n }\n }\n if (buffer === null) {\n // use current buffer\n buffer = encoder.cbuf\n }\n buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint16 = (encoder, num) => {\n write(encoder, num & binary.BITS8)\n write(encoder, (num >>> 8) & binary.BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint16 = (encoder, pos, num) => {\n set(encoder, pos, num & binary.BITS8)\n set(encoder, pos + 1, (num >>> 8) & binary.BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32 = (encoder, num) => {\n for (let i = 0; i < 4; i++) {\n write(encoder, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32BigEndian = (encoder, num) => {\n for (let i = 3; i >= 0; i--) {\n write(encoder, (num >>> (8 * i)) & binary.BITS8)\n }\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint32 = (encoder, pos, num) => {\n for (let i = 0; i < 4; i++) {\n set(encoder, pos + i, num & binary.BITS8)\n num >>>= 8\n }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarUint = (encoder, num) => {\n while (num > binary.BITS7) {\n write(encoder, binary.BIT8 | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n write(encoder, binary.BITS7 & num)\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarInt = (encoder, num) => {\n const isNegative = math.isNegativeZero(num)\n if (isNegative) {\n num = -num\n }\n // |- whether to continue reading |- whether is negative |- number\n write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))\n num = math.floor(num / 64) // shift >>> 6\n // We don't need to consider the case of num === 0 so we can use a different\n // pattern here than above.\n while (num > 0) {\n write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))\n num = math.floor(num / 128) // shift >>> 7\n }\n}\n\n/**\n * A cache to store strings temporarily\n */\nconst _strBuffer = new Uint8Array(30000)\nconst _maxStrBSize = _strBuffer.length / 3\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringNative = (encoder, str) => {\n if (str.length < _maxStrBSize) {\n // We can encode the string into the existing buffer\n /* c8 ignore next */\n const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0\n writeVarUint(encoder, written)\n for (let i = 0; i < written; i++) {\n write(encoder, _strBuffer[i])\n }\n } else {\n writeVarUint8Array(encoder, string.encodeUtf8(str))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringPolyfill = (encoder, str) => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n write(encoder, /** @type {number} */ (encodedString.codePointAt(i)))\n }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\n/* c8 ignore next */\nexport const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill\n\n/**\n * Write a string terminated by a special byte sequence. This is not very performant and is\n * generally discouraged. However, the resulting byte arrays are lexiographically ordered which\n * makes this a nice feature for databases.\n *\n * The string will be encoded using utf8 and then terminated and escaped using writeTerminatingUint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const writeTerminatedString = (encoder, str) =>\n writeTerminatedUint8Array(encoder, string.encodeUtf8(str))\n\n/**\n * Write a terminating Uint8Array. Note that this is not performant and is generally\n * discouraged. There are few situations when this is needed.\n *\n * We use 0x0 as a terminating character. 0x1 serves as an escape character for 0x0 and 0x1.\n *\n * Example: [0,1,2] is encoded to [1,0,1,1,2,0]. 0x0, and 0x1 needed to be escaped using 0x1. Then\n * the result is terminated using the 0x0 character.\n *\n * This is basically how many systems implement null terminated strings. However, we use an escape\n * character 0x1 to avoid issues and potenial attacks on our database (if this is used as a key\n * encoder for NoSql databases).\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} buf The string that is to be encoded.\n */\nexport const writeTerminatedUint8Array = (encoder, buf) => {\n for (let i = 0; i < buf.length; i++) {\n const b = buf[i]\n if (b === 0 || b === 1) {\n write(encoder, 1)\n }\n write(encoder, buf[i])\n }\n write(encoder, 0)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n * - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n * Encoders start with a rather big initial buffer.\n *\n * @function\n * @param {Encoder} encoder The enUint8Arr\n * @param {Encoder} append The BinaryEncoder to be written.\n */\nexport const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append))\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeUint8Array = (encoder, uint8Array) => {\n const bufferLen = encoder.cbuf.length\n const cpos = encoder.cpos\n const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length)\n const rightCopyLen = uint8Array.length - leftCopyLen\n encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n encoder.cpos += leftCopyLen\n if (rightCopyLen > 0) {\n // Still something to write, write right half..\n // Append new buffer\n encoder.bufs.push(encoder.cbuf)\n // must have at least size of remaining buffer\n encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen))\n // copy array\n encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n encoder.cpos = rightCopyLen\n }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeVarUint8Array = (encoder, uint8Array) => {\n writeVarUint(encoder, uint8Array.byteLength)\n writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n *\n * @param {Encoder} encoder\n * @param {number} len\n * @return {DataView}\n */\nexport const writeOnDataView = (encoder, len) => {\n verifyLen(encoder, len)\n const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n encoder.cpos += len\n return dview\n}\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigUint64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n\nconst floatTestBed = new DataView(new ArrayBuffer(4))\n/**\n * Check if a number can be encoded as a 32 bit float.\n *\n * @param {number} num\n * @return {boolean}\n */\nconst isFloat32 = num => {\n floatTestBed.setFloat32(0, num)\n return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * @typedef {Array<AnyEncodable>} AnyEncodableArray\n */\n\n/**\n * @typedef {undefined|null|number|bigint|boolean|string|{[k:string]:AnyEncodable}|AnyEncodableArray|Uint8Array} AnyEncodable\n */\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * • Transforms data to a binary format (not to a string)\n * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * • Numbers are efficiently encoded either as a variable length integer, as a\n * 32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type | Prefix | Encoding Method | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined | 127 | | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null | 126 | | |\n * | integer | 125 | writeVarInt | Only encodes 32 bit signed integers |\n * | float32 | 124 | writeFloat32 | |\n * | float64 | 123 | writeFloat64 | |\n * | bigint | 122 | writeBigInt64 | |\n * | boolean (false) | 121 | | True and false are different data types so we save the following byte |\n * | boolean (true) | 120 | | - 0b01111000 so the last bit determines whether true or false |\n * | string | 119 | writeVarString | |\n * | object<string,any> | 118 | custom | Writes {length} then {length} key-value pairs |\n * | array<any> | 117 | custom | Writes {length} then {length} json values |\n * | Uint8Array | 116 | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30] the beginning of the data range is used for custom purposes\n * (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n * lib0/encoding.js\n *\n * @param {Encoder} encoder\n * @param {AnyEncodable} data\n */\nexport const writeAny = (encoder, data) => {\n switch (typeof data) {\n case 'string':\n // TYPE 119: STRING\n write(encoder, 119)\n writeVarString(encoder, data)\n break\n case 'number':\n if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {\n // TYPE 125: INTEGER\n write(encoder, 125)\n writeVarInt(encoder, data)\n } else if (isFloat32(data)) {\n // TYPE 124: FLOAT32\n write(encoder, 124)\n writeFloat32(encoder, data)\n } else {\n // TYPE 123: FLOAT64\n write(encoder, 123)\n writeFloat64(encoder, data)\n }\n break\n case 'bigint':\n // TYPE 122: BigInt\n write(encoder, 122)\n writeBigInt64(encoder, data)\n break\n case 'object':\n if (data === null) {\n // TYPE 126: null\n write(encoder, 126)\n } else if (array.isArray(data)) {\n // TYPE 117: Array\n write(encoder, 117)\n writeVarUint(encoder, data.length)\n for (let i = 0; i < data.length; i++) {\n writeAny(encoder, data[i])\n }\n } else if (data instanceof Uint8Array) {\n // TYPE 116: ArrayBuffer\n write(encoder, 116)\n writeVarUint8Array(encoder, data)\n } else {\n // TYPE 118: Object\n write(encoder, 118)\n const keys = Object.keys(data)\n writeVarUint(encoder, keys.length)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n writeVarString(encoder, key)\n writeAny(encoder, data[key])\n }\n }\n break\n case 'boolean':\n // TYPE 120/121: boolean (true/false)\n write(encoder, data ? 120 : 121)\n break\n default:\n // TYPE 127: undefined\n write(encoder, 127)\n }\n}\n\n/**\n * Now come a few stateful encoder that have their own classes.\n */\n\n/**\n * Basic Run Length Encoder - a basic compression implementation.\n *\n * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.\n *\n * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf\n *\n * @note T must not be null!\n *\n * @template T\n */\nexport class RleEncoder extends Encoder {\n /**\n * @param {function(Encoder, T):void} writer\n */\n constructor (writer) {\n super()\n /**\n * The writer\n */\n this.w = writer\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n /**\n * @param {T} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n this.w(this, v)\n this.s = v\n }\n }\n}\n\n/**\n * Basic diff decoder using variable length encoding.\n *\n * Encodes the values [3, 1100, 1101, 1050, 0] to [3, 1097, 1, -51, -1050] using writeVarInt.\n */\nexport class IntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n writeVarInt(this, v - this.s)\n this.s = v\n }\n}\n\n/**\n * A combination of IntDiffEncoder and RleEncoder.\n *\n * Basically first writes the IntDiffEncoder and then counts duplicate diffs using RleEncoding.\n *\n * Encodes the values [1,1,1,2,3,4,5,6] as [1,1,0,2,1,5] (RLE([1,0,0,1,1,1,1,1]) ⇒ RleIntDiff[1,1,0,2,1,5])\n */\nexport class RleIntDiffEncoder extends Encoder {\n /**\n * @param {number} start\n */\n constructor (start) {\n super()\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v && this.count > 0) {\n this.count++\n } else {\n if (this.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n }\n this.count = 1\n // write first value\n writeVarInt(this, v - this.s)\n this.s = v\n }\n }\n}\n\n/**\n * @param {UintOptRleEncoder} encoder\n */\nconst flushUintOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set sign to positive\n // case 2: write several values. set sign to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.\n *\n * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write\n * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.\n *\n * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)\n */\nexport class UintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Increasing Uint Optimized RLE Encoder\n *\n * The RLE encoder counts the number of same occurences of the same value.\n * The IncUintOptRle encoder counts if the value increases.\n * I.e. 7, 8, 9, 10 will be encoded as [-7, 4]. 1, 3, 5 will be encoded\n * as [1, 3, 5].\n */\nexport class IncUintOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.s + this.count === v) {\n this.count++\n } else {\n flushUintOptRleEncoder(this)\n this.count = 1\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushUintOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * @param {IntDiffOptRleEncoder} encoder\n */\nconst flushIntDiffOptRleEncoder = encoder => {\n if (encoder.count > 0) {\n // 31 bit making up the diff | wether to write the counter\n // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)\n const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)\n // flush counter, unless this is the first value (count = 0)\n // case 1: just a single value. set first bit to positive\n // case 2: write several values. set first bit to negative to indicate that there is a length coming\n writeVarInt(encoder.encoder, encodedDiff)\n if (encoder.count > 1) {\n writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n }\n }\n}\n\n/**\n * A combination of the IntDiffEncoder and the UintOptRleEncoder.\n *\n * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes\n * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!\n *\n * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])\n *\n * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:\n * * 1 bit that denotes whether the next value is a count (LSB)\n * * 1 bit that denotes whether this value is negative (MSB - 1)\n * * 1 bit that denotes whether to continue reading the variable length integer (MSB)\n *\n * Therefore, only five bits remain to encode diff ranges.\n *\n * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.\n */\nexport class IntDiffOptRleEncoder {\n constructor () {\n this.encoder = new Encoder()\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @param {number} v\n */\n write (v) {\n if (this.diff === v - this.s) {\n this.s = v\n this.count++\n } else {\n flushIntDiffOptRleEncoder(this)\n this.count = 1\n this.diff = v - this.s\n this.s = v\n }\n }\n\n /**\n * Flush the encoded state and transform this to a Uint8Array.\n *\n * Note that this should only be called once.\n */\n toUint8Array () {\n flushIntDiffOptRleEncoder(this)\n return toUint8Array(this.encoder)\n }\n}\n\n/**\n * Optimized String Encoder.\n *\n * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.\n * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).\n *\n * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.\n *\n * The lengths are encoded using a UintOptRleEncoder.\n */\nexport class StringEncoder {\n constructor () {\n /**\n * @type {Array<string>}\n */\n this.sarr = []\n this.s = ''\n this.lensE = new UintOptRleEncoder()\n }\n\n /**\n * @param {string} string\n */\n write (string) {\n this.s += string\n if (this.s.length > 19) {\n this.sarr.push(this.s)\n this.s = ''\n }\n this.lensE.write(string.length)\n }\n\n toUint8Array () {\n const encoder = new Encoder()\n this.sarr.push(this.s)\n this.s = ''\n writeVarString(encoder, this.sarr.join(''))\n writeUint8Array(encoder, this.lensE.toUint8Array())\n return toUint8Array(encoder)\n }\n}\n","/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n throw create('Unexpected case')\n}\n\n/**\n * @param {boolean} property\n * @return {asserts property is true}\n */\nexport const assert = property => { if (!property) throw create('Assert failed') }\n","/**\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module decoding\n */\n\nimport * as binary from './binary.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as string from './string.js'\nimport * as error from './error.js'\nimport * as encoding from './encoding.js'\n\nconst errorUnexpectedEndOfArray = error.create('Unexpected end of array')\nconst errorIntegerOutOfRange = error.create('Integer out of Range')\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n * @template {ArrayBufferLike} [Buf=ArrayBufferLike]\n */\nexport class Decoder {\n /**\n * @param {Uint8Array<Buf>} uint8Array Binary data to decode\n */\n constructor (uint8Array) {\n /**\n * Decoding target.\n *\n * @type {Uint8Array<Buf>}\n */\n this.arr = uint8Array\n /**\n * Current decoding position.\n *\n * @type {number}\n */\n this.pos = 0\n }\n}\n\n/**\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Uint8Array<Buf>} uint8Array\n * @return {Decoder<Buf>}\n */\nexport const createDecoder = uint8Array => new Decoder(uint8Array)\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {boolean}\n */\nexport const hasContent = decoder => decoder.pos !== decoder.arr.length\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} [newPos] Defaults to current position\n * @return {Decoder} A clone of `decoder`\n */\nexport const clone = (decoder, newPos = decoder.pos) => {\n const _decoder = createDecoder(decoder.arr)\n _decoder.pos = newPos\n return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Decoder<Buf>} decoder The decoder instance\n * @param {number} len The length of bytes to read\n * @return {Uint8Array<Buf>}\n */\nexport const readUint8Array = (decoder, len) => {\n const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n decoder.pos += len\n return view\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n * Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Decoder<Buf>} decoder\n * @return {Uint8Array<Buf>}\n */\nexport const readVarUint8Array = decoder => readUint8Array(decoder, readVarUint(decoder))\n\n/**\n * Read the rest of the content as an ArrayBuffer\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTailAsUint8Array = decoder => readUint8Array(decoder, decoder.arr.length - decoder.pos)\n\n/**\n * Skip one byte, jump to the next position.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} The next position\n */\nexport const skip8 = decoder => decoder.pos++\n\n/**\n * Read one byte as unsigned integer.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} Unsigned 8-bit integer\n */\nexport const readUint8 = decoder => decoder.arr[decoder.pos++]\n\n/**\n * Read 2 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint16 = decoder => {\n const uint =\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n decoder.pos += 2\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32 = decoder => {\n const uint =\n (decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32BigEndian = decoder => {\n const uint =\n (decoder.arr[decoder.pos + 3] +\n (decoder.arr[decoder.pos + 2] << 8) +\n (decoder.arr[decoder.pos + 1] << 16) +\n (decoder.arr[decoder.pos] << 24)) >>> 0\n decoder.pos += 4\n return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint8 = decoder => decoder.arr[decoder.pos]\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint16 = decoder =>\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8)\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint32 = decoder => (\n decoder.arr[decoder.pos] +\n (decoder.arr[decoder.pos + 1] << 8) +\n (decoder.arr[decoder.pos + 2] << 16) +\n (decoder.arr[decoder.pos + 3] << 24)\n) >>> 0\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarUint = decoder => {\n let num = 0\n let mult = 1\n const len = decoder.arr.length\n while (decoder.pos < len) {\n const r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult // shift $r << (7*#iterations) and add it to num\n mult *= 128 // next iteration, shift 7 \"more\" to the left\n if (r < binary.BIT8) {\n return num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n * * numbers < 2^7 is stored in one bytlength\n * * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarInt = decoder => {\n let r = decoder.arr[decoder.pos++]\n let num = r & binary.BITS6\n let mult = 64\n const sign = (r & binary.BIT7) > 0 ? -1 : 1\n if ((r & binary.BIT8) === 0) {\n // don't continue reading\n return sign * num\n }\n const len = decoder.arr.length\n while (decoder.pos < len) {\n r = decoder.arr[decoder.pos++]\n // num = num | ((r & binary.BITS7) << len)\n num = num + (r & binary.BITS7) * mult\n mult *= 128\n if (r < binary.BIT8) {\n return sign * num\n }\n /* c8 ignore start */\n if (num > number.MAX_SAFE_INTEGER) {\n throw errorIntegerOutOfRange\n }\n /* c8 ignore stop */\n }\n throw errorUnexpectedEndOfArray\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarUint = decoder => {\n const pos = decoder.pos\n const s = readVarUint(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarInt = decoder => {\n const pos = decoder.pos\n const s = readVarInt(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String.\n */\n/* c8 ignore start */\nexport const _readVarStringPolyfill = decoder => {\n let remainingLen = readVarUint(decoder)\n if (remainingLen === 0) {\n return ''\n } else {\n let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n while (remainingLen--) {\n encodedString += String.fromCodePoint(readUint8(decoder))\n }\n } else {\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n // this is dangerous, we create a fresh array view from the existing buffer\n const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n decoder.pos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n }\n return decodeURIComponent(escape(encodedString))\n }\n}\n/* c8 ignore stop */\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n */\nexport const _readVarStringNative = decoder =>\n /** @type any */ (string.utf8TextDecoder).decode(readVarUint8Array(decoder))\n\n/**\n * Read string of variable length\n * * varUint is used to store the length of the string\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n *\n */\n/* c8 ignore next */\nexport const readVarString = string.utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill\n\n/**\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTerminatedUint8Array = decoder => {\n const encoder = encoding.createEncoder()\n let b\n while (true) {\n b = readUint8(decoder)\n if (b === 0) {\n return encoding.toUint8Array(encoder)\n }\n if (b === 1) {\n b = readUint8(decoder)\n }\n encoding.write(encoder, b)\n }\n}\n\n/**\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const readTerminatedString = decoder => string.decodeUtf8(readTerminatedUint8Array(decoder))\n\n/**\n * Look ahead and read varString without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const peekVarString = decoder => {\n const pos = decoder.pos\n const s = readVarString(decoder)\n decoder.pos = pos\n return s\n}\n\n/**\n * @param {Decoder} decoder\n * @param {number} len\n * @return {DataView}\n */\nexport const readFromDataView = (decoder, len) => {\n const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n decoder.pos += len\n return dv\n}\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat32 = decoder => readFromDataView(decoder, 4).getFloat32(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat64 = decoder => readFromDataView(decoder, 8).getFloat64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigInt64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigInt64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigUint64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigUint64(0, false)\n\n/**\n * @type {Array<function(Decoder):any>}\n */\nconst readAnyLookupTable = [\n decoder => undefined, // CASE 127: undefined\n decoder => null, // CASE 126: null\n readVarInt, // CASE 125: integer\n readFloat32, // CASE 124: float32\n readFloat64, // CASE 123: float64\n readBigInt64, // CASE 122: bigint\n decoder => false, // CASE 121: boolean (false)\n decoder => true, // CASE 120: boolean (true)\n readVarString, // CASE 119: string\n decoder => { // CASE 118: object<string,any>\n const len = readVarUint(decoder)\n /**\n * @type {Object<string,any>}\n */\n const obj = {}\n for (let i = 0; i < len; i++) {\n const key = readVarString(decoder)\n obj[key] = readAny(decoder)\n }\n return obj\n },\n decoder => { // CASE 117: array<any>\n const len = readVarUint(decoder)\n const arr = []\n for (let i = 0; i < len; i++) {\n arr.push(readAny(decoder))\n }\n return arr\n },\n readVarUint8Array // CASE 116: Uint8Array\n]\n\n/**\n * @param {Decoder} decoder\n */\nexport const readAny = decoder => readAnyLookupTable[127 - readUint8(decoder)](decoder)\n\n/**\n * T must not be null.\n *\n * @template T\n */\nexport class RleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {function(Decoder):T} reader\n */\n constructor (uint8Array, reader) {\n super(uint8Array)\n /**\n * The reader\n */\n this.reader = reader\n /**\n * Current state\n * @type {T|null}\n */\n this.s = null\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = this.reader(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {T} */ (this.s)\n }\n}\n\nexport class IntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n }\n\n /**\n * @return {number}\n */\n read () {\n this.s += readVarInt(this)\n return this.s\n }\n}\n\nexport class RleIntDiffDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n * @param {number} start\n */\n constructor (uint8Array, start) {\n super(uint8Array)\n /**\n * Current state\n * @type {number}\n */\n this.s = start\n this.count = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n this.s += readVarInt(this)\n if (hasContent(this)) {\n this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n } else {\n this.count = -1 // read the current value forever\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class UintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s)\n }\n}\n\nexport class IncUintOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n }\n\n read () {\n if (this.count === 0) {\n this.s = readVarInt(this)\n // if the sign is negative, we read the count too, otherwise count is 1\n const isNegative = math.isNegativeZero(this.s)\n this.count = 1\n if (isNegative) {\n this.s = -this.s\n this.count = readVarUint(this) + 2\n }\n }\n this.count--\n return /** @type {number} */ (this.s++)\n }\n}\n\nexport class IntDiffOptRleDecoder extends Decoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n super(uint8Array)\n /**\n * @type {number}\n */\n this.s = 0\n this.count = 0\n this.diff = 0\n }\n\n /**\n * @return {number}\n */\n read () {\n if (this.count === 0) {\n const diff = readVarInt(this)\n // if the first bit is set, we read more data\n const hasCount = diff & 1\n this.diff = math.floor(diff / 2) // shift >> 1\n this.count = 1\n if (hasCount) {\n this.count = readVarUint(this) + 2\n }\n }\n this.s += this.diff\n this.count--\n return this.s\n }\n}\n\nexport class StringDecoder {\n /**\n * @param {Uint8Array} uint8Array\n */\n constructor (uint8Array) {\n this.decoder = new UintOptRleDecoder(uint8Array)\n this.str = readVarString(this.decoder)\n /**\n * @type {number}\n */\n this.spos = 0\n }\n\n /**\n * @return {string}\n */\n read () {\n const end = this.spos + this.decoder.read()\n const res = this.str.slice(this.spos, end)\n this.spos = end\n return res\n }\n}\n","/**\n * Utility module to work with time.\n *\n * @module time\n */\n\nimport * as metric from './metric.js'\nimport * as math from './math.js'\n\n/**\n * Return current time.\n *\n * @return {Date}\n */\nexport const getDate = () => new Date()\n\n/**\n * Return current unix time.\n *\n * @return {number}\n */\nexport const getUnixTime = Date.now\n\n/**\n * Transform time (in ms) to a human readable format. E.g. 1100 => 1.1s. 60s => 1min. .001 => 10μs.\n *\n * @param {number} d duration in milliseconds\n * @return {string} humanized approximation of time\n */\nexport const humanizeDuration = d => {\n if (d < 60000) {\n const p = metric.prefix(d, -1)\n return math.round(p.n * 100) / 100 + p.prefix + 's'\n }\n d = math.floor(d / 1000)\n const seconds = d % 60\n const minutes = math.floor(d / 60) % 60\n const hours = math.floor(d / 3600) % 24\n const days = math.floor(d / 86400)\n if (days > 0) {\n return days + 'd' + ((hours > 0 || minutes > 30) ? ' ' + (minutes > 30 ? hours + 1 : hours) + 'h' : '')\n }\n if (hours > 0) {\n /* c8 ignore next */\n return hours + 'h' + ((minutes > 0 || seconds > 30) ? ' ' + (seconds > 30 ? minutes + 1 : minutes) + 'min' : '')\n }\n return minutes + 'min' + (seconds > 0 ? ' ' + seconds + 's' : '')\n}\n","/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * @template K\n * @template V\n * @typedef {Map<K,V>} GlobalMap\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n const r = create()\n m.forEach((v, k) => { r.set(k, v) })\n return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n let set = map.get(key)\n if (set === undefined) {\n map.set(key, set = createT())\n }\n return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n const res = []\n for (const [key, value] of m) {\n res.push(f(value, key))\n }\n return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n for (const [key, value] of m) {\n if (f(value, key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n for (const [key, value] of m) {\n if (!f(value, key)) {\n return false\n }\n }\n return true\n}\n","/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n * @experimental\n *\n * This is basically a (better typed) duplicate of Observable, which will replace Observable in the\n * next release.\n *\n * @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS\n */\nexport class ObservableV2 {\n constructor () {\n /**\n * Some desc.\n * @type {Map<string, Set<any>>}\n */\n this._observers = map.create()\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, /** @type {string} */ (name), set.create).add(f)\n return f\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, /** @type {any} */ (_f))\n f(...args)\n }\n this.on(name, /** @type {any} */ (_f))\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name The event name.\n * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n\n/* c8 ignore start */\n/**\n * Handles named events.\n *\n * @deprecated\n * @template N\n */\nexport class Observable {\n constructor () {\n /**\n * Some desc.\n * @type {Map<N, any>}\n */\n this._observers = map.create()\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, name, set.create).add(f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, _f)\n f(...args)\n }\n this.on(name, _f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @param {N} name The event name.\n * @param {Array<any>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n/* c8 ignore end */\n","export const EqualityTraitSymbol = Symbol('Equality')\n\n/**\n * @typedef {{ [EqualityTraitSymbol]:(other:EqualityTrait)=>boolean }} EqualityTrait\n */\n\n/**\n *\n * Utility function to compare any two objects.\n *\n * Note that it is expected that the first parameter is more specific than the latter one.\n *\n * @example js\n * class X { [traits.EqualityTraitSymbol] (other) { return other === this } }\n * class X2 { [traits.EqualityTraitSymbol] (other) { return other === this }, x2 () { return 2 } }\n * // this is fine\n * traits.equals(new X2(), new X())\n * // this is not, because the left type is less specific than the right one\n * traits.equals(new X(), new X2())\n *\n * @template {EqualityTrait} T\n * @param {NoInfer<T>} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equals = (a, b) => a === b || !!a?.[EqualityTraitSymbol]?.(b) || false\n","import * as equalityTrait from './trait/equality.js'\n\n/**\n * Utility functions for working with EcmaScript objects.\n *\n * @module object\n */\n\n/**\n * @return {Object<string,any>} obj\n */\nexport const create = () => Object.create(null)\n\n/**\n * @param {any} o\n * @return {o is { [k:string]:any }}\n */\nexport const isObject = o => typeof o === 'object'\n\n/**\n * Object.assign\n */\nexport const assign = Object.assign\n\n/**\n * @param {Object<string,any>} obj\n */\nexport const keys = Object.keys\n\n/**\n * @template V\n * @param {{[key:string]: V}} obj\n * @return {Array<V>}\n */\nexport const values = Object.values\n\n/**\n * @template V\n * @param {{[k:string]:V}} obj\n * @param {function(V,string):any} f\n */\nexport const forEach = (obj, f) => {\n for (const key in obj) {\n f(obj[key], key)\n }\n}\n\n/**\n * @todo implement mapToArray & map\n *\n * @template R\n * @param {Object<string,any>} obj\n * @param {function(any,string):R} f\n * @return {Array<R>}\n */\nexport const map = (obj, f) => {\n const results = []\n for (const key in obj) {\n results.push(f(obj[key], key))\n }\n return results\n}\n\n/**\n * @deprecated use object.size instead\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const length = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const size = obj => keys(obj).length\n\n/**\n * @template {{ [key:string|number|symbol]: any }} T\n * @param {T} obj\n * @param {(v:T[keyof T],k:keyof T)=>boolean} f\n * @return {boolean}\n */\nexport const some = (obj, f) => {\n for (const key in obj) {\n if (f(obj[key], key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @param {Object|null|undefined} obj\n */\nexport const isEmpty = obj => {\n // eslint-disable-next-line no-unreachable-loop\n for (const _k in obj) {\n return false\n }\n return true\n}\n\n/**\n * @template {{ [key:string|number|symbol]: any }} T\n * @param {T} obj\n * @param {(v:T[keyof T],k:keyof T)=>boolean} f\n * @return {boolean}\n */\nexport const every = (obj, f) => {\n for (const key in obj) {\n if (!f(obj[key], key)) {\n return false\n }\n }\n return true\n}\n\n/**\n * Calls `Object.prototype.hasOwnProperty`.\n *\n * @param {any} obj\n * @param {string|number|symbol} key\n * @return {boolean}\n */\nexport const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * @param {Object<string,any>} a\n * @param {Object<string,any>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a === b || (size(a) === size(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && equalityTrait.equals(b[key], val)))\n\n/**\n * Make an object immutable. This hurts performance and is usually not needed if you perform good\n * coding practices.\n */\nexport const freeze = Object.freeze\n\n/**\n * Make an object and all its children immutable.\n * This *really* hurts performance and is usually not needed if you perform good coding practices.\n *\n * @template {any} T\n * @param {T} o\n * @return {Readonly<T>}\n */\nexport const deepFreeze = (o) => {\n for (const key in o) {\n const c = o[key]\n if (typeof c === 'object' || typeof c === 'function') {\n deepFreeze(o[key])\n }\n }\n return freeze(o)\n}\n\n/**\n * Get object property. Create T if property is undefined and set T on object.\n *\n * @function\n * @template {object} KV\n * @template {keyof KV} [K=keyof KV]\n * @param {KV} o\n * @param {K} key\n * @param {() => KV[K]} createT\n * @return {KV[K]}\n */\nexport const setIfUndefined = (o, key, createT) => hasProperty(o, key) ? o[key] : (o[key] = createT())\n","/**\n * Common functions and function call helpers.\n *\n * @module function\n */\n\nimport * as array from './array.js'\nimport * as object from './object.js'\nimport * as equalityTrait from './trait/equality.js'\n\n/**\n * Calls all functions in `fs` with args. Only throws after all functions were called.\n *\n * @param {Array<function>} fs\n * @param {Array<any>} args\n */\nexport const callAll = (fs, args, i = 0) => {\n try {\n for (; i < fs.length; i++) {\n fs[i](...args)\n }\n } finally {\n if (i < fs.length) {\n callAll(fs, args, i + 1)\n }\n }\n}\n\nexport const nop = () => {}\n\n/**\n * @template T\n * @param {function():T} f\n * @return {T}\n */\nexport const apply = f => f()\n\n/**\n * @template A\n *\n * @param {A} a\n * @return {A}\n */\nexport const id = a => a\n\n/**\n * @template T\n *\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equalityStrict = (a, b) => a === b\n\n/**\n * @template T\n *\n * @param {Array<T>|object} a\n * @param {Array<T>|object} b\n * @return {boolean}\n */\nexport const equalityFlat = (a, b) => a === b || (a != null && b != null && a.constructor === b.constructor && ((array.isArray(a) && array.equalFlat(a, /** @type {Array<T>} */ (b))) || (typeof a === 'object' && object.equalFlat(a, b))))\n\n/* c8 ignore start */\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nexport const equalityDeep = (a, b) => {\n if (a === b) {\n return true\n }\n if (a == null || b == null || (a.constructor !== b.constructor && (a.constructor || Object) !== (b.constructor || Object))) {\n return false\n }\n if (a[equalityTrait.EqualityTraitSymbol] != null) {\n return a[equalityTrait.EqualityTraitSymbol](b)\n }\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n return false\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false\n }\n }\n break\n }\n case Map: {\n if (a.size !== b.size) {\n return false\n }\n for (const key of a.keys()) {\n if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {\n return false\n }\n }\n break\n }\n case undefined:\n case Object:\n if (object.size(a) !== object.size(b)) {\n return false\n }\n for (const key in a) {\n if (!object.hasProperty(a, key) || !equalityDeep(a[key], b[key])) {\n return false\n }\n }\n break\n case Array:\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (!equalityDeep(a[i], b[i])) {\n return false\n }\n }\n break\n default:\n return false\n }\n return true\n}\n\n/**\n * @template V\n * @template {V} OPTS\n *\n * @param {V} value\n * @param {Array<OPTS>} options\n */\n// @ts-ignore\nexport const isOneOf = (value, options) => options.includes(value)\n/* c8 ignore stop */\n\nexport const isArray = array.isArray\n\n/**\n * @param {any} s\n * @return {s is String}\n */\nexport const isString = (s) => s && s.constructor === String\n\n/**\n * @param {any} n\n * @return {n is Number}\n */\nexport const isNumber = n => n != null && n.constructor === Number\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {any} n\n * @param {TYPE} T\n * @return {n is InstanceType<TYPE>}\n */\nexport const is = (n, T) => n && n.constructor === T\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {TYPE} T\n */\nexport const isTemplate = (T) =>\n /**\n * @param {any} n\n * @return {n is InstanceType<TYPE>}\n **/\n n => n && n.constructor === T\n","/**\n * @module awareness-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as time from 'lib0/time'\nimport * as math from 'lib0/math'\nimport { Observable } from 'lib0/observable'\nimport * as f from 'lib0/function'\nimport * as Y from 'yjs' // eslint-disable-line\n\nexport const outdatedTimeout = 30000\n\n/**\n * @typedef {Object} MetaClientState\n * @property {number} MetaClientState.clock\n * @property {number} MetaClientState.lastUpdated unix timestamp\n */\n\n/**\n * The Awareness class implements a simple shared state protocol that can be used for non-persistent data like awareness information\n * (cursor, username, status, ..). Each client can update its own local state and listen to state changes of\n * remote clients. Every client may set a state of a remote peer to `null` to mark the client as offline.\n *\n * Each client is identified by a unique client id (something we borrow from `doc.clientID`). A client can override\n * its own state by propagating a message with an increasing timestamp (`clock`). If such a message is received, it is\n * applied if the known state of that client is older than the new state (`clock < newClock`). If a client thinks that\n * a remote client is offline, it may propagate a message with\n * `{ clock: currentClientClock, state: null, client: remoteClient }`. If such a\n * message is received, and the known clock of that client equals the received clock, it will override the state with `null`.\n *\n * Before a client disconnects, it should propagate a `null` state with an updated clock.\n *\n * Awareness states must be updated every 30 seconds. Otherwise the Awareness instance will delete the client state.\n *\n * @extends {Observable<string>}\n */\nexport class Awareness extends Observable {\n /**\n * @param {Y.Doc} doc\n */\n constructor (doc) {\n super()\n this.doc = doc\n /**\n * @type {number}\n */\n this.clientID = doc.clientID\n /**\n * Maps from client id to client state\n * @type {Map<number, Object<string, any>>}\n */\n this.states = new Map()\n /**\n * @type {Map<number, MetaClientState>}\n */\n this.meta = new Map()\n this._checkInterval = /** @type {any} */ (setInterval(() => {\n const now = time.getUnixTime()\n if (this.getLocalState() !== null && (outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ (this.meta.get(this.clientID)).lastUpdated)) {\n // renew local clock\n this.setLocalState(this.getLocalState())\n }\n /**\n * @type {Array<number>}\n */\n const remove = []\n this.meta.forEach((meta, clientid) => {\n if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) {\n remove.push(clientid)\n }\n })\n if (remove.length > 0) {\n removeAwarenessStates(this, remove, 'timeout')\n }\n }, math.floor(outdatedTimeout / 10)))\n doc.on('destroy', () => {\n this.destroy()\n })\n this.setLocalState({})\n }\n\n destroy () {\n this.emit('destroy', [this])\n this.setLocalState(null)\n super.destroy()\n clearInterval(this._checkInterval)\n }\n\n /**\n * @return {Object<string,any>|null}\n */\n getLocalState () {\n return this.states.get(this.clientID) || null\n }\n\n /**\n * @param {Object<string,any>|null} state\n */\n setLocalState (state) {\n const clientID = this.clientID\n const currLocalMeta = this.meta.get(clientID)\n const clock = currLocalMeta === undefined ? 0 : currLocalMeta.clock + 1\n const prevState = this.states.get(clientID)\n if (state === null) {\n this.states.delete(clientID)\n } else {\n this.states.set(clientID, state)\n }\n this.meta.set(clientID, {\n clock,\n lastUpdated: time.getUnixTime()\n })\n const added = []\n const updated = []\n const filteredUpdated = []\n const removed = []\n if (state === null) {\n removed.push(clientID)\n } else if (prevState == null) {\n if (state != null) {\n added.push(clientID)\n }\n } else {\n updated.push(clientID)\n if (!f.equalityDeep(prevState, state)) {\n filteredUpdated.push(clientID)\n }\n }\n if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n this.emit('change', [{ added, updated: filteredUpdated, removed }, 'local'])\n }\n this.emit('update', [{ added, updated, removed }, 'local'])\n }\n\n /**\n * @param {string} field\n * @param {any} value\n */\n setLocalStateField (field, value) {\n const state = this.getLocalState()\n if (state !== null) {\n this.setLocalState({\n ...state,\n [field]: value\n })\n }\n }\n\n /**\n * @return {Map<number,Object<string,any>>}\n */\n getStates () {\n return this.states\n }\n}\n\n/**\n * Mark (remote) clients as inactive and remove them from the list of active peers.\n * This change will be propagated to remote clients.\n *\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @param {any} origin\n */\nexport const removeAwarenessStates = (awareness, clients, origin) => {\n const removed = []\n for (let i = 0; i < clients.length; i++) {\n const clientID = clients[i]\n if (awareness.states.has(clientID)) {\n awareness.states.delete(clientID)\n if (clientID === awareness.clientID) {\n const curMeta = /** @type {MetaClientState} */ (awareness.meta.get(clientID))\n awareness.meta.set(clientID, {\n clock: curMeta.clock + 1,\n lastUpdated: time.getUnixTime()\n })\n }\n removed.push(clientID)\n }\n }\n if (removed.length > 0) {\n awareness.emit('change', [{ added: [], updated: [], removed }, origin])\n awareness.emit('update', [{ added: [], updated: [], removed }, origin])\n }\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @return {Uint8Array}\n */\nexport const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => {\n const len = clients.length\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n const clientID = clients[i]\n const state = states.get(clientID) || null\n const clock = /** @type {MetaClientState} */ (awareness.meta.get(clientID)).clock\n encoding.writeVarUint(encoder, clientID)\n encoding.writeVarUint(encoder, clock)\n encoding.writeVarString(encoder, JSON.stringify(state))\n }\n return encoding.toUint8Array(encoder)\n}\n\n/**\n * Modify the content of an awareness update before re-encoding it to an awareness update.\n *\n * This might be useful when you have a central server that wants to ensure that clients\n * cant hijack somebody elses identity.\n *\n * @param {Uint8Array} update\n * @param {function(any):any} modify\n * @return {Uint8Array}\n */\nexport const modifyAwarenessUpdate = (update, modify) => {\n const decoder = decoding.createDecoder(update)\n const encoder = encoding.createEncoder()\n const len = decoding.readVarUint(decoder)\n encoding.writeVarUint(encoder, len)\n for (let i = 0; i < len; i++) {\n const clientID = decoding.readVarUint(decoder)\n const clock = decoding.readVarUint(decoder)\n const state = JSON.parse(decoding.readVarString(decoder))\n const modifiedState = modify(state)\n encoding.writeVarUint(encoder, clientID)\n encoding.writeVarUint(encoder, clock)\n encoding.writeVarString(encoder, JSON.stringify(modifiedState))\n }\n return encoding.toUint8Array(encoder)\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Uint8Array} update\n * @param {any} origin This will be added to the emitted change event\n */\nexport const applyAwarenessUpdate = (awareness, update, origin) => {\n const decoder = decoding.createDecoder(update)\n const timestamp = time.getUnixTime()\n const added = []\n const updated = []\n const filteredUpdated = []\n const removed = []\n const len = decoding.readVarUint(decoder)\n for (let i = 0; i < len; i++) {\n const clientID = decoding.readVarUint(decoder)\n let clock = decoding.readVarUint(decoder)\n const state = JSON.parse(decoding.readVarString(decoder))\n const clientMeta = awareness.meta.get(clientID)\n const prevState = awareness.states.get(clientID)\n const currClock = clientMeta === undefined ? 0 : clientMeta.clock\n if (currClock < clock || (currClock === clock && state === null && awareness.states.has(clientID))) {\n if (state === null) {\n // never let a remote client remove this local state\n if (clientID === awareness.clientID && awareness.getLocalState() != null) {\n // remote client removed the local state. Do not remote state. Broadcast a message indicating\n // that this client still exists by increasing the clock\n clock++\n } else {\n awareness.states.delete(clientID)\n }\n } else {\n awareness.states.set(clientID, state)\n }\n awareness.meta.set(clientID, {\n clock,\n lastUpdated: timestamp\n })\n if (clientMeta === undefined && state !== null) {\n added.push(clientID)\n } else if (clientMeta !== undefined && state === null) {\n removed.push(clientID)\n } else if (state !== null) {\n if (!f.equalityDeep(state, prevState)) {\n filteredUpdated.push(clientID)\n }\n updated.push(clientID)\n }\n }\n }\n if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n awareness.emit('change', [{\n added, updated: filteredUpdated, removed\n }, origin])\n }\n if (added.length > 0 || updated.length > 0 || removed.length > 0) {\n awareness.emit('update', [{\n added, updated, removed\n }, origin])\n }\n}\n","export default class EventEmitter {\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tpublic callbacks: { [key: string]: Function[] } = {};\n\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tpublic on(event: string, fn: Function): this {\n\t\tif (!this.callbacks[event]) {\n\t\t\tthis.callbacks[event] = [];\n\t\t}\n\n\t\tthis.callbacks[event].push(fn);\n\n\t\treturn this;\n\t}\n\n\tprotected emit(event: string, ...args: any): this {\n\t\tconst callbacks = this.callbacks[event];\n\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => callback.apply(this, args));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tpublic off(event: string, fn?: Function): this {\n\t\tconst callbacks = this.callbacks[event];\n\n\t\tif (callbacks) {\n\t\t\tif (fn) {\n\t\t\t\tthis.callbacks[event] = callbacks.filter((callback) => callback !== fn);\n\t\t\t} else {\n\t\t\t\tdelete this.callbacks[event];\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tremoveAllListeners(): void {\n\t\tthis.callbacks = {};\n\t}\n}\n","import type { Decoder } from \"lib0/decoding\";\nimport {\n\tcreateDecoder,\n\tpeekVarString,\n\treadVarUint,\n\treadVarUint8Array,\n\treadVarString,\n} from \"lib0/decoding\";\nimport type { Encoder } from \"lib0/encoding\";\nimport {\n\tcreateEncoder,\n\twriteVarUint,\n\twriteVarUint8Array,\n\twriteVarString,\n\tlength,\n} from \"lib0/encoding\";\nimport type { MessageType } from \"./types.ts\";\n\nexport class IncomingMessage {\n\tdata: any;\n\n\tencoder: Encoder;\n\n\tdecoder: Decoder;\n\n\tconstructor(data: any) {\n\t\tthis.data = data;\n\t\tthis.encoder = createEncoder();\n\t\tthis.decoder = createDecoder(new Uint8Array(this.data));\n\t}\n\n\tpeekVarString(): string {\n\t\treturn peekVarString(this.decoder);\n\t}\n\n\treadVarUint(): MessageType {\n\t\treturn readVarUint(this.decoder);\n\t}\n\n\treadVarString(): string {\n\t\treturn readVarString(this.decoder);\n\t}\n\n\treadVarUint8Array() {\n\t\treturn readVarUint8Array(this.decoder);\n\t}\n\n\twriteVarUint(type: MessageType) {\n\t\treturn writeVarUint(this.encoder, type);\n\t}\n\n\twriteVarString(string: string) {\n\t\treturn writeVarString(this.encoder, string);\n\t}\n\n\twriteVarUint8Array(data: Uint8Array) {\n\t\treturn writeVarUint8Array(this.encoder, data);\n\t}\n\n\tlength() {\n\t\treturn length(this.encoder);\n\t}\n}\n","import type { Encoder } from \"lib0/encoding\";\nimport type { Event, MessageEvent } from \"ws\";\nimport type { Awareness } from \"y-protocols/awareness\";\nimport type * as Y from \"yjs\";\nimport type { CloseEvent } from \"@abraca/dabra-common\";\nimport type { IncomingMessage } from \"./IncomingMessage.ts\";\nimport type { OutgoingMessage } from \"./OutgoingMessage.ts\";\nimport type { AuthenticationMessage } from \"./OutgoingMessages/AuthenticationMessage.ts\";\nimport type { AwarenessMessage } from \"./OutgoingMessages/AwarenessMessage.ts\";\nimport type { QueryAwarenessMessage } from \"./OutgoingMessages/QueryAwarenessMessage.ts\";\nimport type { SyncStepOneMessage } from \"./OutgoingMessages/SyncStepOneMessage.ts\";\nimport type { SyncStepTwoMessage } from \"./OutgoingMessages/SyncStepTwoMessage.ts\";\nimport type { UpdateMessage } from \"./OutgoingMessages/UpdateMessage.ts\";\n\nexport enum MessageType {\n Sync = 0,\n Awareness = 1,\n Auth = 2,\n QueryAwareness = 3,\n Subdoc = 4,\n Stateless = 5,\n CLOSE = 7,\n SyncStatus = 8,\n}\n\nexport enum WebSocketStatus {\n Connecting = \"connecting\",\n Connected = \"connected\",\n Disconnected = \"disconnected\",\n}\n\nexport type AuthorizedScope = \"read-write\" | \"readonly\";\n\nexport interface OutgoingMessageInterface {\n encoder: Encoder;\n type?: MessageType;\n}\n\nexport interface OutgoingMessageArguments {\n documentName: string;\n token: string;\n document: Y.Doc;\n awareness: Awareness;\n clients: number[];\n states: Map<number, { [key: string]: any }>;\n update: any;\n payload: string;\n encoder: Encoder;\n}\n\nexport interface Constructable<T> {\n new (...args: any): T;\n}\n\nexport type ConstructableOutgoingMessage =\n | Constructable<AuthenticationMessage>\n | Constructable<AwarenessMessage>\n | Constructable<QueryAwarenessMessage>\n | Constructable<SyncStepOneMessage>\n | Constructable<SyncStepTwoMessage>\n | Constructable<UpdateMessage>;\n\nexport type onAuthenticationFailedParameters = {\n reason: string;\n};\n\nexport type onAuthenticatedParameters = {\n scope: AuthorizedScope;\n};\n\nexport type onOpenParameters = {\n event: Event;\n};\n\nexport type onMessageParameters = {\n event: MessageEvent;\n message: IncomingMessage;\n};\n\nexport type onOutgoingMessageParameters = {\n message: OutgoingMessage;\n};\n\nexport type onStatusParameters = {\n status: WebSocketStatus;\n};\n\nexport type onSyncedParameters = {\n state: boolean;\n};\n\nexport type onUnsyncedChangesParameters = {\n number: number;\n};\n\nexport type onDisconnectParameters = {\n event: CloseEvent;\n};\n\nexport type onCloseParameters = {\n event: CloseEvent;\n};\n\nexport type onAwarenessUpdateParameters = {\n states: StatesArray;\n};\n\nexport type onAwarenessChangeParameters = {\n states: StatesArray;\n};\n\nexport type onStatelessParameters = {\n payload: string;\n};\n\nexport type StatesArray = { clientId: number; [key: string | number]: any }[];\n\n// ── Abracadabra extensions ────────────────────────────────────────────────────\n\nexport type EffectiveRole = \"owner\" | \"editor\" | \"viewer\" | null;\n\n/**\n * Ed25519 identity for passwordless crypto auth.\n *\n * The public key is the sole identifier sent to the server during the\n * challenge-response handshake. Username is decoupled from auth and is\n * managed separately as a mutable display name (see PATCH /users/me).\n */\nexport interface CryptoIdentity {\n /** base64url-encoded Ed25519 public key (32 bytes). Primary auth identifier. */\n publicKey: string;\n}\n\nexport interface SubdocRegisteredEvent {\n childId: string;\n parentId: string;\n}\n\nexport type onSubdocRegisteredParameters = SubdocRegisteredEvent;\n\nexport type onSubdocLoadedParameters = {\n childId: string;\n provider: import(\"./AbracadabraProvider.ts\").AbracadabraProvider;\n};\n\nexport interface AbracadabraOutgoingMessageArguments extends OutgoingMessageArguments {\n childDocumentName: string;\n}\n\n// ── REST API response types ──────────────────────────────────────────────────\n\nexport interface UserProfile {\n id: string;\n username: string;\n email: string | null;\n displayName: string | null;\n}\n\nexport interface DocumentMeta {\n id: string;\n parent_id: string | null;\n}\n\nexport interface UploadMeta {\n id: string;\n doc_id: string;\n filename: string;\n}\n\nexport interface UploadInfo {\n id: string;\n filename: string;\n mime_type: string;\n size: number;\n}\n\nexport interface PublicKeyInfo {\n id: string;\n publicKey: string;\n deviceName: string | null;\n revoked: boolean;\n}\n\nexport interface HealthStatus {\n status: string;\n version: string;\n active_documents: number;\n}\n","import type { Encoder } from \"lib0/encoding\";\nimport { createEncoder, toUint8Array } from \"lib0/encoding\";\nimport type {\n\tMessageType,\n\tOutgoingMessageArguments,\n\tOutgoingMessageInterface,\n} from \"./types.ts\";\n\nexport class OutgoingMessage implements OutgoingMessageInterface {\n\tencoder: Encoder;\n\n\ttype?: MessageType;\n\n\tconstructor() {\n\t\tthis.encoder = createEncoder();\n\t}\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\treturn args.encoder;\n\t}\n\n\ttoUint8Array() {\n\t\treturn toUint8Array(this.encoder);\n\t}\n}\n","import * as encoding from \"lib0/encoding\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class CloseMessage extends OutgoingMessage {\n\ttype = MessageType.CLOSE;\n\n\tdescription = \"Ask the server to close the connection\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tencoding.writeVarString(this.encoder, args.documentName!);\n\t\tencoding.writeVarUint(this.encoder, this.type);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { WsReadyStates } from \"@abraca/dabra-common\";\nimport { retry } from \"@lifeomic/attempt\";\nimport * as time from \"lib0/time\";\nimport type { Event, MessageEvent } from \"ws\";\nimport EventEmitter from \"./EventEmitter.ts\";\nimport type { HocuspocusProvider } from \"./HocuspocusProvider.ts\";\nimport { IncomingMessage } from \"./IncomingMessage.ts\";\nimport { CloseMessage } from \"./OutgoingMessages/CloseMessage.ts\";\nimport {\n WebSocketStatus,\n type onAwarenessChangeParameters,\n type onAwarenessUpdateParameters,\n type onCloseParameters,\n type onDisconnectParameters,\n type onMessageParameters,\n type onOpenParameters,\n type onOutgoingMessageParameters,\n type onStatusParameters,\n} from \"./types.ts\";\n\nexport type HocuspocusWebSocket = WebSocket & { identifier: string };\nexport type HocusPocusWebSocket = HocuspocusWebSocket;\n\nexport type HocuspocusProviderWebsocketConfiguration = Required<\n Pick<CompleteHocuspocusProviderWebsocketConfiguration, \"url\">\n> &\n Partial<CompleteHocuspocusProviderWebsocketConfiguration>;\n\nexport interface CompleteHocuspocusProviderWebsocketConfiguration {\n /**\n * Whether to connect automatically when creating the provider instance. Default=true\n */\n autoConnect: boolean;\n\n /**\n * URL of your @hocuspocus/server instance\n */\n url: string;\n\n /**\n * By default, trailing slashes are removed from the URL. Set this to true\n * to preserve trailing slashes if your server configuration requires them.\n */\n preserveTrailingSlash: boolean;\n\n /**\n * An optional WebSocket polyfill, for example for Node.js\n */\n WebSocketPolyfill: any;\n\n /**\n * Disconnect when no message is received for the defined amount of milliseconds.\n */\n messageReconnectTimeout: number;\n /**\n * The delay between each attempt in milliseconds. You can provide a factor to have the delay grow exponentially.\n */\n delay: number;\n /**\n * The initialDelay is the amount of time to wait before making the first attempt. This option should typically be 0 since you typically want the first attempt to happen immediately.\n */\n initialDelay: number;\n /**\n * The factor option is used to grow the delay exponentially.\n */\n factor: number;\n /**\n * The maximum number of attempts or 0 if there is no limit on number of attempts.\n */\n maxAttempts: number;\n /**\n * minDelay is used to set a lower bound of delay when jitter is enabled. This property has no effect if jitter is disabled.\n */\n minDelay: number;\n /**\n * The maxDelay option is used to set an upper bound for the delay when factor is enabled. A value of 0 can be provided if there should be no upper bound when calculating delay.\n */\n maxDelay: number;\n /**\n * If jitter is true then the calculated delay will be a random integer value between minDelay and the calculated delay for the current iteration.\n */\n jitter: boolean;\n /**\n * A timeout in milliseconds. If timeout is non-zero then a timer is set using setTimeout. If the timeout is triggered then future attempts will be aborted.\n */\n timeout: number;\n handleTimeout: (() => Promise<unknown>) | null;\n onOpen: (data: onOpenParameters) => void;\n onConnect: () => void;\n onMessage: (data: onMessageParameters) => void;\n onOutgoingMessage: (data: onOutgoingMessageParameters) => void;\n onStatus: (data: onStatusParameters) => void;\n onDisconnect: (data: onDisconnectParameters) => void;\n onClose: (data: onCloseParameters) => void;\n onDestroy: () => void;\n onAwarenessUpdate: (data: onAwarenessUpdateParameters) => void;\n onAwarenessChange: (data: onAwarenessChangeParameters) => void;\n\n /**\n * Map of attached providers keyed by documentName.\n */\n providerMap: Map<string, HocuspocusProvider>;\n}\n\nexport class HocuspocusProviderWebsocket extends EventEmitter {\n private messageQueue: any[] = [];\n\n public configuration: CompleteHocuspocusProviderWebsocketConfiguration = {\n url: \"\",\n autoConnect: true,\n preserveTrailingSlash: false,\n // @ts-ignore\n document: undefined,\n WebSocketPolyfill: undefined,\n // TODO: this should depend on awareness.outdatedTime\n messageReconnectTimeout: 30000,\n // 1 second\n delay: 1000,\n // instant\n initialDelay: 0,\n // double the delay each time\n factor: 2,\n // unlimited retries\n maxAttempts: 0,\n // wait at least 1 second\n minDelay: 1000,\n // at least every 30 seconds\n maxDelay: 30000,\n // randomize\n jitter: true,\n // retry forever\n timeout: 0,\n onOpen: () => null,\n onConnect: () => null,\n onMessage: () => null,\n onOutgoingMessage: () => null,\n onStatus: () => null,\n onDisconnect: () => null,\n onClose: () => null,\n onDestroy: () => null,\n onAwarenessUpdate: () => null,\n onAwarenessChange: () => null,\n handleTimeout: null,\n providerMap: new Map(),\n };\n\n webSocket: HocusPocusWebSocket | null = null;\n\n webSocketHandlers: { [key: string]: any } = {};\n\n shouldConnect = true;\n\n status = WebSocketStatus.Disconnected;\n\n lastMessageReceived = 0;\n\n identifier = 0;\n\n intervals: any = {\n connectionChecker: null,\n };\n\n connectionAttempt: {\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n } | null = null;\n\n constructor(configuration: HocuspocusProviderWebsocketConfiguration) {\n super();\n this.setConfiguration(configuration);\n\n this.configuration.WebSocketPolyfill = configuration.WebSocketPolyfill\n ? configuration.WebSocketPolyfill\n : WebSocket;\n\n this.on(\"open\", this.configuration.onOpen);\n this.on(\"open\", this.onOpen.bind(this));\n this.on(\"connect\", this.configuration.onConnect);\n this.on(\"message\", this.configuration.onMessage);\n this.on(\"outgoingMessage\", this.configuration.onOutgoingMessage);\n this.on(\"status\", this.configuration.onStatus);\n this.on(\"disconnect\", this.configuration.onDisconnect);\n this.on(\"close\", this.configuration.onClose);\n this.on(\"destroy\", this.configuration.onDestroy);\n this.on(\"awarenessUpdate\", this.configuration.onAwarenessUpdate);\n this.on(\"awarenessChange\", this.configuration.onAwarenessChange);\n\n this.on(\"close\", this.onClose.bind(this));\n this.on(\"message\", this.onMessage.bind(this));\n\n this.intervals.connectionChecker = setInterval(\n this.checkConnection.bind(this),\n this.configuration.messageReconnectTimeout / 10,\n );\n\n if (this.shouldConnect) {\n this.connect();\n }\n }\n\n receivedOnOpenPayload?: Event | undefined = undefined;\n\n async onOpen(event: Event) {\n this.status = WebSocketStatus.Connected;\n this.emit(\"status\", { status: WebSocketStatus.Connected });\n\n this.cancelWebsocketRetry = undefined;\n this.receivedOnOpenPayload = event;\n }\n\n attach(provider: HocuspocusProvider) {\n this.configuration.providerMap.set(provider.configuration.name, provider);\n\n if (this.status === WebSocketStatus.Disconnected && this.shouldConnect) {\n this.connect();\n }\n\n if (this.receivedOnOpenPayload && this.status === WebSocketStatus.Connected) {\n provider.onOpen(this.receivedOnOpenPayload);\n }\n }\n\n detach(provider: HocuspocusProvider) {\n if (this.configuration.providerMap.has(provider.configuration.name)) {\n provider.send(CloseMessage, {\n documentName: provider.configuration.name,\n });\n this.configuration.providerMap.delete(provider.configuration.name);\n }\n }\n\n public setConfiguration(\n configuration: Partial<HocuspocusProviderWebsocketConfiguration> = {},\n ): void {\n this.configuration = { ...this.configuration, ...configuration };\n\n if (!this.configuration.autoConnect) {\n this.shouldConnect = false;\n }\n }\n\n cancelWebsocketRetry?: () => void;\n\n async connect() {\n if (this.status === WebSocketStatus.Connected) {\n return;\n }\n\n // Always cancel any previously initiated connection retryer instances\n if (this.cancelWebsocketRetry) {\n this.cancelWebsocketRetry();\n this.cancelWebsocketRetry = undefined;\n }\n\n this.receivedOnOpenPayload = undefined;\n this.shouldConnect = true;\n\n const abortableRetry = () => {\n let cancelAttempt = false;\n\n const retryPromise = retry(this.createWebSocketConnection.bind(this), {\n delay: this.configuration.delay,\n initialDelay: this.configuration.initialDelay,\n factor: this.configuration.factor,\n maxAttempts: this.configuration.maxAttempts,\n minDelay: this.configuration.minDelay,\n maxDelay: this.configuration.maxDelay,\n jitter: this.configuration.jitter,\n timeout: this.configuration.timeout,\n handleTimeout: this.configuration.handleTimeout,\n beforeAttempt: (context) => {\n if (!this.shouldConnect || cancelAttempt) {\n context.abort();\n }\n },\n }).catch((error: any) => {\n // If we aborted the connection attempt then don’t throw an error\n // ref: https://github.com/lifeomic/attempt/blob/master/src/index.ts#L136\n if (error && error.code !== \"ATTEMPT_ABORTED\") {\n throw error;\n }\n });\n\n return {\n retryPromise,\n cancelFunc: () => {\n cancelAttempt = true;\n },\n };\n };\n\n const { retryPromise, cancelFunc } = abortableRetry();\n this.cancelWebsocketRetry = cancelFunc;\n\n return retryPromise;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n attachWebSocketListeners(ws: HocusPocusWebSocket, reject: Function) {\n const { identifier } = ws;\n const onMessageHandler = (payload: any) => this.emit(\"message\", payload);\n const onCloseHandler = (payload: any) => this.emit(\"close\", { event: payload });\n const onOpenHandler = (payload: any) => this.emit(\"open\", payload);\n const onErrorHandler = (err: any) => {\n reject(err);\n };\n\n this.webSocketHandlers[identifier] = {\n message: onMessageHandler,\n close: onCloseHandler,\n open: onOpenHandler,\n error: onErrorHandler,\n };\n\n const handlers = this.webSocketHandlers[ws.identifier];\n\n Object.keys(handlers).forEach((name) => {\n ws.addEventListener(name, handlers[name]);\n });\n }\n\n cleanupWebSocket() {\n if (!this.webSocket) {\n return;\n }\n const { identifier } = this.webSocket;\n const handlers = this.webSocketHandlers[identifier];\n\n Object.keys(handlers).forEach((name) => {\n this.webSocket?.removeEventListener(name, handlers[name]);\n delete this.webSocketHandlers[identifier];\n });\n\n try {\n // Check if the WebSocket is still in CONNECTING state (0)\n // If so, calling close() might throw in some environments or be race-prone\n if (this.webSocket.readyState !== 0 && this.webSocket.readyState !== 3) {\n this.webSocket.close();\n }\n } catch (e) {\n // Ignore errors during close\n }\n\n this.webSocket = null;\n }\n\n createWebSocketConnection() {\n return new Promise((resolve, reject) => {\n if (this.webSocket) {\n this.messageQueue = [];\n this.cleanupWebSocket();\n }\n this.lastMessageReceived = 0;\n this.identifier += 1;\n\n // Init the WebSocket connection\n const ws = new this.configuration.WebSocketPolyfill(this.url);\n ws.binaryType = \"arraybuffer\";\n ws.identifier = this.identifier;\n\n this.attachWebSocketListeners(ws, reject);\n\n this.webSocket = ws;\n\n // Reset the status\n this.status = WebSocketStatus.Connecting;\n this.emit(\"status\", { status: WebSocketStatus.Connecting });\n\n // Store resolve/reject for later use\n this.connectionAttempt = {\n resolve,\n reject,\n };\n });\n }\n\n onMessage(event: MessageEvent) {\n this.resolveConnectionAttempt();\n\n this.lastMessageReceived = time.getUnixTime();\n\n const message = new IncomingMessage(event.data);\n const documentName = message.peekVarString();\n\n this.configuration.providerMap.get(documentName)?.onMessage(event);\n }\n\n resolveConnectionAttempt() {\n if (this.connectionAttempt) {\n this.connectionAttempt.resolve();\n this.connectionAttempt = null;\n\n this.status = WebSocketStatus.Connected;\n this.emit(\"status\", { status: WebSocketStatus.Connected });\n this.emit(\"connect\");\n this.messageQueue.forEach((message) => this.send(message));\n this.messageQueue = [];\n }\n }\n\n stopConnectionAttempt() {\n this.connectionAttempt = null;\n }\n\n rejectConnectionAttempt() {\n this.connectionAttempt?.reject();\n this.connectionAttempt = null;\n }\n\n closeTries = 0;\n\n checkConnection() {\n // Don’t check the connection when it’s not even established\n if (this.status !== WebSocketStatus.Connected) {\n return;\n }\n\n // Don’t close the connection while waiting for the first message\n if (!this.lastMessageReceived) {\n return;\n }\n\n // Don’t close the connection when a message was received recently\n if (\n this.configuration.messageReconnectTimeout >=\n time.getUnixTime() - this.lastMessageReceived\n ) {\n return;\n }\n\n // No message received in a long time, not even your own\n // Awareness updates, which are updated every 15 seconds\n // if awareness is enabled.\n this.closeTries += 1;\n // https://bugs.webkit.org/show_bug.cgi?id=247943\n if (this.closeTries > 2) {\n this.onClose({\n event: {\n code: 4408,\n reason: \"forced\",\n },\n });\n this.closeTries = 0;\n } else {\n this.webSocket?.close();\n this.messageQueue = [];\n }\n }\n\n get serverUrl() {\n if (this.configuration.preserveTrailingSlash) {\n return this.configuration.url;\n }\n\n // By default, ensure that the URL never ends with /\n let url = this.configuration.url;\n while (url[url.length - 1] === \"/\") {\n url = url.slice(0, url.length - 1);\n }\n\n return url;\n }\n\n get url() {\n return this.serverUrl;\n }\n\n disconnect() {\n this.shouldConnect = false;\n\n if (this.webSocket === null) {\n return;\n }\n\n try {\n this.webSocket.close();\n this.messageQueue = [];\n } catch (e) {\n console.error(e);\n }\n }\n\n send(message: any) {\n if (this.webSocket?.readyState === WsReadyStates.Open) {\n this.webSocket.send(message);\n } else {\n this.messageQueue.push(message);\n }\n }\n\n onClose({ event }: onCloseParameters) {\n this.closeTries = 0;\n this.cleanupWebSocket();\n\n if (this.connectionAttempt) {\n // That connection attempt failed.\n this.rejectConnectionAttempt();\n }\n\n // Let’s update the connection status.\n this.status = WebSocketStatus.Disconnected;\n this.emit(\"status\", { status: WebSocketStatus.Disconnected });\n this.emit(\"disconnect\", { event });\n\n // trigger connect if no retry is running and we want to have a connection\n if (!this.cancelWebsocketRetry && this.shouldConnect) {\n setTimeout(() => {\n this.connect();\n }, this.configuration.delay);\n }\n }\n\n destroy() {\n this.emit(\"destroy\");\n\n clearInterval(this.intervals.connectionChecker);\n\n // If there is still a connection attempt outstanding then we should stop\n // it before calling disconnect, otherwise it will be rejected in the onClose\n // handler and trigger a retry\n this.stopConnectionAttempt();\n\n this.disconnect();\n\n this.removeAllListeners();\n\n this.cleanupWebSocket();\n }\n}\n","/**\n * @module sync-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as Y from 'yjs'\n\n/**\n * @typedef {Map<number, number>} StateMap\n */\n\n/**\n * Core Yjs defines two message types:\n * • YjsSyncStep1: Includes the State Set of the sending client. When received, the client should reply with YjsSyncStep2.\n * • YjsSyncStep2: Includes all missing structs and the complete delete set. When received, the client is assured that it\n * received all information from the remote client.\n *\n * In a peer-to-peer network, you may want to introduce a SyncDone message type. Both parties should initiate the connection\n * with SyncStep1. When a client received SyncStep2, it should reply with SyncDone. When the local client received both\n * SyncStep2 and SyncDone, it is assured that it is synced to the remote client.\n *\n * In a client-server model, you want to handle this differently: The client should initiate the connection with SyncStep1.\n * When the server receives SyncStep1, it should reply with SyncStep2 immediately followed by SyncStep1. The client replies\n * with SyncStep2 when it receives SyncStep1. Optionally the server may send a SyncDone after it received SyncStep2, so the\n * client knows that the sync is finished. There are two reasons for this more elaborated sync model: 1. This protocol can\n * easily be implemented on top of http and websockets. 2. The server should only reply to requests, and not initiate them.\n * Therefore it is necessary that the client initiates the sync.\n *\n * Construction of a message:\n * [messageType : varUint, message definition..]\n *\n * Note: A message does not include information about the room name. This must to be handled by the upper layer protocol!\n *\n * stringify[messageType] stringifies a message definition (messageType is already read from the bufffer)\n */\n\nexport const messageYjsSyncStep1 = 0\nexport const messageYjsSyncStep2 = 1\nexport const messageYjsUpdate = 2\n\n/**\n * Create a sync step 1 message based on the state of the current shared document.\n *\n * @param {encoding.Encoder} encoder\n * @param {Y.Doc} doc\n */\nexport const writeSyncStep1 = (encoder, doc) => {\n encoding.writeVarUint(encoder, messageYjsSyncStep1)\n const sv = Y.encodeStateVector(doc)\n encoding.writeVarUint8Array(encoder, sv)\n}\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {Y.Doc} doc\n * @param {Uint8Array} [encodedStateVector]\n */\nexport const writeSyncStep2 = (encoder, doc, encodedStateVector) => {\n encoding.writeVarUint(encoder, messageYjsSyncStep2)\n encoding.writeVarUint8Array(encoder, Y.encodeStateAsUpdate(doc, encodedStateVector))\n}\n\n/**\n * Read SyncStep1 message and reply with SyncStep2.\n *\n * @param {decoding.Decoder} decoder The reply to the received message\n * @param {encoding.Encoder} encoder The received message\n * @param {Y.Doc} doc\n */\nexport const readSyncStep1 = (decoder, encoder, doc) =>\n writeSyncStep2(encoder, doc, decoding.readVarUint8Array(decoder))\n\n/**\n * Read and apply Structs and then DeleteStore to a y instance.\n *\n * @param {decoding.Decoder} decoder\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n * @param {(error:Error)=>any} [errorHandler]\n */\nexport const readSyncStep2 = (decoder, doc, transactionOrigin, errorHandler) => {\n try {\n Y.applyUpdate(doc, decoding.readVarUint8Array(decoder), transactionOrigin)\n } catch (error) {\n if (errorHandler != null) errorHandler(/** @type {Error} */ (error))\n // This catches errors that are thrown by event handlers\n console.error('Caught error while handling a Yjs update', error)\n }\n}\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {Uint8Array} update\n */\nexport const writeUpdate = (encoder, update) => {\n encoding.writeVarUint(encoder, messageYjsUpdate)\n encoding.writeVarUint8Array(encoder, update)\n}\n\n/**\n * Read and apply Structs and then DeleteStore to a y instance.\n *\n * @param {decoding.Decoder} decoder\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n * @param {(error:Error)=>any} [errorHandler]\n */\nexport const readUpdate = readSyncStep2\n\n/**\n * @param {decoding.Decoder} decoder A message received from another client\n * @param {encoding.Encoder} encoder The reply message. Does not need to be sent if empty.\n * @param {Y.Doc} doc\n * @param {any} transactionOrigin\n * @param {(error:Error)=>any} [errorHandler] Optional error handler that catches errors when reading Yjs messages.\n */\nexport const readSyncMessage = (decoder, encoder, doc, transactionOrigin, errorHandler) => {\n const messageType = decoding.readVarUint(decoder)\n switch (messageType) {\n case messageYjsSyncStep1:\n readSyncStep1(decoder, encoder, doc)\n break\n case messageYjsSyncStep2:\n readSyncStep2(decoder, doc, transactionOrigin, errorHandler)\n break\n case messageYjsUpdate:\n readUpdate(decoder, doc, transactionOrigin, errorHandler)\n break\n default:\n throw new Error('Unknown message type')\n }\n return messageType\n}\n","import { readAuthMessage } from \"@abraca/dabra-common\";\nimport { readVarInt, readVarString } from \"lib0/decoding\";\nimport type { CloseEvent } from \"ws\";\nimport * as awarenessProtocol from \"y-protocols/awareness\";\nimport { messageYjsSyncStep2, readSyncMessage } from \"y-protocols/sync\";\nimport type { HocuspocusProvider } from \"./HocuspocusProvider.ts\";\nimport type { IncomingMessage } from \"./IncomingMessage.ts\";\nimport { OutgoingMessage } from \"./OutgoingMessage.ts\";\nimport { MessageType } from \"./types.ts\";\n\nexport class MessageReceiver {\n message: IncomingMessage;\n\n constructor(message: IncomingMessage) {\n this.message = message;\n }\n\n public apply(provider: HocuspocusProvider, emitSynced: boolean) {\n const { message } = this;\n const type = message.readVarUint();\n\n const emptyMessageLength = message.length();\n\n switch (type) {\n case MessageType.Sync:\n this.applySyncMessage(provider, emitSynced);\n break;\n\n case MessageType.Awareness:\n this.applyAwarenessMessage(provider);\n break;\n\n case MessageType.Auth:\n this.applyAuthMessage(provider);\n break;\n\n case MessageType.QueryAwareness:\n this.applyQueryAwarenessMessage(provider);\n break;\n\n case MessageType.Stateless:\n provider.receiveStateless(readVarString(message.decoder));\n break;\n\n case MessageType.SyncStatus:\n this.applySyncStatusMessage(provider, readVarInt(message.decoder) === 1);\n break;\n\n case MessageType.CLOSE:\n // eslint-disable-next-line no-case-declarations\n const event: CloseEvent = {\n code: 1000,\n reason: readVarString(message.decoder),\n // @ts-ignore\n target: provider.configuration.websocketProvider.webSocket!,\n type: \"close\",\n };\n provider.onClose();\n provider.configuration.onClose({ event });\n provider.forwardClose({ event });\n break;\n\n default:\n throw new Error(`Can’t apply message of unknown type: ${type}`);\n }\n\n // Reply\n if (message.length() > emptyMessageLength + 1) {\n // length of documentName (considered in emptyMessageLength plus length of yjs sync type, set in applySyncMessage)\n // @ts-ignore\n provider.send(OutgoingMessage, { encoder: message.encoder });\n }\n }\n\n private applySyncMessage(provider: HocuspocusProvider, emitSynced: boolean) {\n const { message } = this;\n\n message.writeVarUint(MessageType.Sync);\n\n // Apply update\n const syncMessageType = readSyncMessage(\n message.decoder,\n message.encoder,\n provider.document,\n provider,\n );\n\n // Synced once we receive Step2\n if (emitSynced && syncMessageType === messageYjsSyncStep2) {\n provider.synced = true;\n }\n }\n\n applySyncStatusMessage(provider: HocuspocusProvider, applied: boolean) {\n if (applied) {\n provider.decrementUnsyncedChanges();\n }\n }\n\n private applyAwarenessMessage(provider: HocuspocusProvider) {\n if (!provider.awareness) return;\n\n const { message } = this;\n\n awarenessProtocol.applyAwarenessUpdate(\n provider.awareness,\n message.readVarUint8Array(),\n provider,\n );\n }\n\n private applyAuthMessage(provider: HocuspocusProvider) {\n const { message } = this;\n\n readAuthMessage(\n message.decoder,\n provider.sendToken.bind(provider),\n provider.permissionDeniedHandler.bind(provider),\n provider.authenticatedHandler.bind(provider),\n );\n }\n\n private applyQueryAwarenessMessage(provider: HocuspocusProvider) {\n if (!provider.awareness) return;\n\n const { message } = this;\n\n message.writeVarUint(MessageType.Awareness);\n message.writeVarUint8Array(\n awarenessProtocol.encodeAwarenessUpdate(\n provider.awareness,\n Array.from(provider.awareness.getStates().keys()),\n ),\n );\n }\n}\n","import type { Encoder } from \"lib0/encoding\";\nimport { toUint8Array } from \"lib0/encoding\";\nimport type { ConstructableOutgoingMessage } from \"./types.ts\";\n\nexport class MessageSender {\n\tencoder: Encoder;\n\n\tmessage: any;\n\n\tconstructor(Message: ConstructableOutgoingMessage, args: any = {}) {\n\t\tthis.message = new Message();\n\t\tthis.encoder = this.message.get(args);\n\t}\n\n\tcreate() {\n\t\treturn toUint8Array(this.encoder);\n\t}\n\n\tsend(webSocket: any) {\n\t\twebSocket?.send(this.create());\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport { writeAuthentication } from \"@abraca/dabra-common\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class AuthenticationMessage extends OutgoingMessage {\n type = MessageType.Auth;\n\n description = \"Authentication\";\n\n get(args: Partial<OutgoingMessageArguments>) {\n if (typeof args.token === \"undefined\") {\n throw new Error(\"The authentication message requires `token` as an argument.\");\n }\n\n writeVarString(this.encoder, args.documentName!);\n writeVarUint(this.encoder, this.type);\n writeAuthentication(this.encoder, args.token);\n\n return this.encoder;\n }\n}\n","import * as encoding from \"lib0/encoding\";\nimport { encodeAwarenessUpdate } from \"y-protocols/awareness\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class AwarenessMessage extends OutgoingMessage {\n\ttype = MessageType.Awareness;\n\n\tdescription = \"Awareness states update\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tif (typeof args.awareness === \"undefined\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"The awareness message requires awareness as an argument\",\n\t\t\t);\n\t\t}\n\n\t\tif (typeof args.clients === \"undefined\") {\n\t\t\tthrow new Error(\"The awareness message requires clients as an argument\");\n\t\t}\n\n\t\tencoding.writeVarString(this.encoder, args.documentName!);\n\t\tencoding.writeVarUint(this.encoder, this.type);\n\n\t\tlet awarenessUpdate;\n\t\tif (args.states === undefined) {\n\t\t\tawarenessUpdate = encodeAwarenessUpdate(args.awareness, args.clients);\n\t\t} else {\n\t\t\tawarenessUpdate = encodeAwarenessUpdate(\n\t\t\t\targs.awareness,\n\t\t\t\targs.clients,\n\t\t\t\targs.states,\n\t\t\t);\n\t\t}\n\n\t\tencoding.writeVarUint8Array(this.encoder, awarenessUpdate);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class StatelessMessage extends OutgoingMessage {\n\ttype = MessageType.Stateless;\n\n\tdescription = \"A stateless message\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\twriteVarString(this.encoder, args.documentName!);\n\t\twriteVarUint(this.encoder, this.type);\n\t\twriteVarString(this.encoder, args.payload ?? \"\");\n\n\t\treturn this.encoder;\n\t}\n}\n","import * as encoding from \"lib0/encoding\";\nimport * as syncProtocol from \"y-protocols/sync\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class SyncStepOneMessage extends OutgoingMessage {\n\ttype = MessageType.Sync;\n\n\tdescription = \"First sync step\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tif (typeof args.document === \"undefined\") {\n\t\t\tthrow new Error(\n\t\t\t\t\"The sync step one message requires document as an argument\",\n\t\t\t);\n\t\t}\n\n\t\tencoding.writeVarString(this.encoder, args.documentName!);\n\t\tencoding.writeVarUint(this.encoder, this.type);\n\t\tsyncProtocol.writeSyncStep1(this.encoder, args.document);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport { writeUpdate } from \"y-protocols/sync\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\nexport class UpdateMessage extends OutgoingMessage {\n\ttype = MessageType.Sync;\n\n\tdescription = \"A document update\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\twriteVarString(this.encoder, args.documentName!);\n\t\twriteVarUint(this.encoder, this.type);\n\n\t\twriteUpdate(this.encoder, args.update);\n\n\t\treturn this.encoder;\n\t}\n}\n","import { awarenessStatesToArray } from \"@abraca/dabra-common\";\nimport type { Event, MessageEvent } from \"ws\";\nimport { Awareness, removeAwarenessStates } from \"y-protocols/awareness\";\nimport * as Y from \"yjs\";\nimport EventEmitter from \"./EventEmitter.ts\";\nimport type { CompleteHocuspocusProviderWebsocketConfiguration } from \"./HocuspocusProviderWebsocket.ts\";\nimport { HocuspocusProviderWebsocket } from \"./HocuspocusProviderWebsocket.ts\";\nimport { IncomingMessage } from \"./IncomingMessage.ts\";\nimport { MessageReceiver } from \"./MessageReceiver.ts\";\nimport { MessageSender } from \"./MessageSender.ts\";\nimport { AuthenticationMessage } from \"./OutgoingMessages/AuthenticationMessage.ts\";\nimport { AwarenessMessage } from \"./OutgoingMessages/AwarenessMessage.ts\";\nimport { StatelessMessage } from \"./OutgoingMessages/StatelessMessage.ts\";\nimport { SyncStepOneMessage } from \"./OutgoingMessages/SyncStepOneMessage.ts\";\nimport { UpdateMessage } from \"./OutgoingMessages/UpdateMessage.ts\";\nimport type {\n AuthorizedScope,\n ConstructableOutgoingMessage,\n onAuthenticatedParameters,\n onAuthenticationFailedParameters,\n onAwarenessChangeParameters,\n onAwarenessUpdateParameters,\n onCloseParameters,\n onDisconnectParameters,\n onMessageParameters,\n onOpenParameters,\n onOutgoingMessageParameters,\n onStatelessParameters,\n onStatusParameters,\n onSyncedParameters,\n onUnsyncedChangesParameters,\n} from \"./types.ts\";\n\nexport type HocuspocusProviderConfiguration = Required<\n Pick<CompleteHocuspocusProviderConfiguration, \"name\">\n> &\n Partial<CompleteHocuspocusProviderConfiguration> &\n (\n | (Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, \"url\">> &\n Partial<Pick<CompleteHocuspocusProviderWebsocketConfiguration, \"preserveTrailingSlash\">>)\n | Required<Pick<CompleteHocuspocusProviderConfiguration, \"websocketProvider\">>\n );\n\nexport interface CompleteHocuspocusProviderConfiguration {\n /**\n * The identifier/name of your document\n */\n name: string;\n /**\n * The actual Y.js document\n */\n document: Y.Doc;\n\n /**\n * An Awareness instance to keep the presence state of all clients.\n *\n * You can disable sharing awareness information by passing `null`.\n * Note that having no awareness information shared across all connections will break our ping checks\n * and thus trigger reconnects. You should always have at least one Provider with enabled awareness per\n * socket connection, or ensure that the Provider receives messages before running into `HocuspocusProviderWebsocket.messageReconnectTimeout`.\n */\n awareness: Awareness | null;\n\n /**\n * A token that’s sent to the backend for authentication purposes.\n */\n token: string | (() => string) | (() => Promise<string>) | null;\n\n /**\n * Hocuspocus websocket provider\n */\n websocketProvider: HocuspocusProviderWebsocket;\n\n /**\n * Force syncing the document in the defined interval.\n */\n forceSyncInterval: false | number;\n\n onAuthenticated: (data: onAuthenticatedParameters) => void;\n onAuthenticationFailed: (data: onAuthenticationFailedParameters) => void;\n onOpen: (data: onOpenParameters) => void;\n onConnect: () => void;\n onStatus: (data: onStatusParameters) => void;\n onMessage: (data: onMessageParameters) => void;\n onOutgoingMessage: (data: onOutgoingMessageParameters) => void;\n onSynced: (data: onSyncedParameters) => void;\n onDisconnect: (data: onDisconnectParameters) => void;\n onClose: (data: onCloseParameters) => void;\n onDestroy: () => void;\n onAwarenessUpdate: (data: onAwarenessUpdateParameters) => void;\n onAwarenessChange: (data: onAwarenessChangeParameters) => void;\n onStateless: (data: onStatelessParameters) => void;\n onUnsyncedChanges: (data: onUnsyncedChangesParameters) => void;\n}\n\nexport class AwarenessError extends Error {\n code = 1001;\n}\n\nexport class HocuspocusProvider extends EventEmitter {\n public configuration: CompleteHocuspocusProviderConfiguration = {\n name: \"\",\n // @ts-ignore\n document: undefined,\n // @ts-ignore\n awareness: undefined,\n token: null,\n forceSyncInterval: false,\n onAuthenticated: () => null,\n onAuthenticationFailed: () => null,\n onOpen: () => null,\n onConnect: () => null,\n onMessage: () => null,\n onOutgoingMessage: () => null,\n onSynced: () => null,\n onStatus: () => null,\n onDisconnect: () => null,\n onClose: () => null,\n onDestroy: () => null,\n onAwarenessUpdate: () => null,\n onAwarenessChange: () => null,\n onStateless: () => null,\n onUnsyncedChanges: () => null,\n };\n\n isSynced = false;\n\n unsyncedChanges = 0;\n\n isAuthenticated = false;\n\n authorizedScope: AuthorizedScope | undefined = undefined;\n\n // @internal\n manageSocket = false;\n\n private _isAttached = false;\n\n intervals: any = {\n forceSync: null,\n };\n\n constructor(configuration: HocuspocusProviderConfiguration) {\n super();\n this.setConfiguration(configuration);\n\n this.configuration.document = configuration.document ? configuration.document : new Y.Doc();\n this.configuration.awareness =\n configuration.awareness !== undefined\n ? configuration.awareness\n : new Awareness(this.document);\n\n this.on(\"open\", this.configuration.onOpen);\n this.on(\"message\", this.configuration.onMessage);\n this.on(\"outgoingMessage\", this.configuration.onOutgoingMessage);\n this.on(\"synced\", this.configuration.onSynced);\n this.on(\"destroy\", this.configuration.onDestroy);\n this.on(\"awarenessUpdate\", this.configuration.onAwarenessUpdate);\n this.on(\"awarenessChange\", this.configuration.onAwarenessChange);\n this.on(\"stateless\", this.configuration.onStateless);\n this.on(\"unsyncedChanges\", this.configuration.onUnsyncedChanges);\n\n this.on(\"authenticated\", this.configuration.onAuthenticated);\n this.on(\"authenticationFailed\", this.configuration.onAuthenticationFailed);\n\n this.awareness?.on(\"update\", () => {\n this.emit(\"awarenessUpdate\", {\n states: awarenessStatesToArray(this.awareness!.getStates()),\n });\n });\n\n this.awareness?.on(\"change\", () => {\n this.emit(\"awarenessChange\", {\n states: awarenessStatesToArray(this.awareness!.getStates()),\n });\n });\n\n this.document.on(\"update\", this.boundDocumentUpdateHandler);\n this.awareness?.on(\"update\", this.boundAwarenessUpdateHandler);\n\n this.registerEventListeners();\n\n if (\n this.configuration.forceSyncInterval &&\n typeof this.configuration.forceSyncInterval === \"number\"\n ) {\n this.intervals.forceSync = setInterval(\n this.forceSync.bind(this),\n this.configuration.forceSyncInterval,\n );\n }\n\n if (this.manageSocket) {\n this.attach();\n }\n }\n\n boundDocumentUpdateHandler = this.documentUpdateHandler.bind(this);\n\n boundAwarenessUpdateHandler = this.awarenessUpdateHandler.bind(this);\n\n boundPageHide = this.pageHide.bind(this);\n\n boundOnOpen = this.onOpen.bind(this);\n\n boundOnClose = this.onClose.bind(this);\n\n forwardConnect = () => this.emit(\"connect\");\n\n forwardStatus = (e: onStatusParameters) => this.emit(\"status\", e);\n\n forwardClose = (e: onCloseParameters) => this.emit(\"close\", e);\n\n forwardDisconnect = (e: onDisconnectParameters) => this.emit(\"disconnect\", e);\n\n forwardDestroy = () => this.emit(\"destroy\");\n\n public setConfiguration(configuration: Partial<HocuspocusProviderConfiguration> = {}): void {\n if (!configuration.websocketProvider) {\n this.manageSocket = true;\n this.configuration.websocketProvider = new HocuspocusProviderWebsocket(\n configuration as CompleteHocuspocusProviderWebsocketConfiguration,\n );\n }\n\n this.configuration = { ...this.configuration, ...configuration };\n }\n\n get document() {\n return this.configuration.document;\n }\n\n public get isAttached() {\n return this._isAttached;\n }\n\n get awareness() {\n return this.configuration.awareness;\n }\n\n get hasUnsyncedChanges(): boolean {\n return this.unsyncedChanges > 0;\n }\n\n private resetUnsyncedChanges() {\n this.unsyncedChanges = 1;\n this.emit(\"unsyncedChanges\", { number: this.unsyncedChanges });\n }\n\n incrementUnsyncedChanges() {\n this.unsyncedChanges += 1;\n this.emit(\"unsyncedChanges\", { number: this.unsyncedChanges });\n }\n\n decrementUnsyncedChanges() {\n if (this.unsyncedChanges > 0) {\n this.unsyncedChanges -= 1;\n }\n\n if (this.unsyncedChanges === 0) {\n this.synced = true;\n }\n\n this.emit(\"unsyncedChanges\", { number: this.unsyncedChanges });\n }\n\n forceSync() {\n this.resetUnsyncedChanges();\n\n this.send(SyncStepOneMessage, {\n document: this.document,\n documentName: this.configuration.name,\n });\n }\n\n pageHide() {\n if (this.awareness) {\n removeAwarenessStates(this.awareness, [this.document.clientID], \"page hide\");\n }\n }\n\n registerEventListeners() {\n if (typeof window === \"undefined\" || !(\"addEventListener\" in window)) {\n return;\n }\n\n window.addEventListener(\"pagehide\", this.boundPageHide);\n }\n\n sendStateless(payload: string) {\n this.send(StatelessMessage, {\n documentName: this.configuration.name,\n payload,\n });\n }\n\n async sendToken() {\n let token: string | null;\n try {\n token = await this.getToken();\n } catch (error) {\n this.permissionDeniedHandler(`Failed to get token during sendToken(): ${error}`);\n return;\n }\n\n this.send(AuthenticationMessage, {\n token: token ?? \"\",\n documentName: this.configuration.name,\n });\n }\n\n documentUpdateHandler(update: Uint8Array, origin: any) {\n if (origin === this) {\n return;\n }\n\n this.incrementUnsyncedChanges();\n this.send(UpdateMessage, { update, documentName: this.configuration.name });\n }\n\n awarenessUpdateHandler({ added, updated, removed }: any, origin: any) {\n const changedClients = added.concat(updated).concat(removed);\n\n this.send(AwarenessMessage, {\n awareness: this.awareness,\n clients: changedClients,\n documentName: this.configuration.name,\n });\n }\n\n /**\n * Indicates whether a first handshake with the server has been established\n *\n * Note: this does not mean all updates from the client have been persisted to the backend. For this,\n * use `hasUnsyncedChanges`.\n */\n get synced(): boolean {\n return this.isSynced;\n }\n\n set synced(state) {\n if (this.isSynced === state) {\n return;\n }\n\n this.isSynced = state;\n\n if (state) {\n this.emit(\"synced\", { state });\n }\n }\n\n receiveStateless(payload: string) {\n this.emit(\"stateless\", { payload });\n }\n\n // not needed, but provides backward compatibility with e.g. lexical/yjs\n async connect() {\n if (this.manageSocket) {\n return this.configuration.websocketProvider.connect();\n }\n\n console.warn(\n \"HocuspocusProvider::connect() is deprecated and does not do anything. Please connect/disconnect on the websocketProvider, or attach/deattach providers.\",\n );\n }\n\n disconnect() {\n if (this.manageSocket) {\n return this.configuration.websocketProvider.disconnect();\n }\n\n console.warn(\n \"HocuspocusProvider::disconnect() is deprecated and does not do anything. Please connect/disconnect on the websocketProvider, or attach/deattach providers.\",\n );\n }\n\n async onOpen(event: Event) {\n this.isAuthenticated = false;\n\n this.emit(\"open\", { event });\n await this.sendToken();\n this.startSync();\n }\n\n async getToken() {\n if (typeof this.configuration.token === \"function\") {\n const token = await this.configuration.token();\n return token;\n }\n\n return this.configuration.token;\n }\n\n startSync() {\n this.resetUnsyncedChanges();\n\n this.send(SyncStepOneMessage, {\n document: this.document,\n documentName: this.configuration.name,\n });\n\n if (this.awareness && this.awareness.getLocalState() !== null) {\n this.send(AwarenessMessage, {\n awareness: this.awareness,\n clients: [this.document.clientID],\n documentName: this.configuration.name,\n });\n }\n }\n\n send(message: ConstructableOutgoingMessage, args: any) {\n if (!this._isAttached) return;\n\n const messageSender = new MessageSender(message, args);\n\n this.emit(\"outgoingMessage\", { message: messageSender.message });\n messageSender.send(this.configuration.websocketProvider);\n }\n\n onMessage(event: MessageEvent) {\n const message = new IncomingMessage(event.data);\n\n const documentName = message.readVarString();\n\n message.writeVarString(documentName);\n\n this.emit(\"message\", { event, message: new IncomingMessage(event.data) });\n\n new MessageReceiver(message).apply(this, true);\n }\n\n onClose() {\n this.isAuthenticated = false;\n this.synced = false;\n\n // update awareness (all users except local left)\n if (this.awareness) {\n removeAwarenessStates(\n this.awareness,\n Array.from(this.awareness.getStates().keys()).filter(\n (client) => client !== this.document.clientID,\n ),\n this,\n );\n }\n }\n\n destroy() {\n this.emit(\"destroy\");\n\n if (this.intervals.forceSync) {\n clearInterval(this.intervals.forceSync);\n }\n\n if (this.awareness) {\n removeAwarenessStates(this.awareness, [this.document.clientID], \"provider destroy\");\n this.awareness.off(\"update\", this.boundAwarenessUpdateHandler);\n this.awareness.destroy();\n }\n\n this.document.off(\"update\", this.boundDocumentUpdateHandler);\n\n this.removeAllListeners();\n\n this.detach();\n\n if (this.manageSocket) {\n this.configuration.websocketProvider.destroy();\n }\n\n if (typeof window === \"undefined\" || !(\"removeEventListener\" in window)) {\n return;\n }\n\n window.removeEventListener(\"pagehide\", this.boundPageHide);\n }\n\n detach() {\n this.configuration.websocketProvider.off(\"connect\", this.configuration.onConnect);\n this.configuration.websocketProvider.off(\"connect\", this.forwardConnect);\n\n this.configuration.websocketProvider.off(\"status\", this.forwardStatus);\n this.configuration.websocketProvider.off(\"status\", this.configuration.onStatus);\n\n this.configuration.websocketProvider.off(\"open\", this.boundOnOpen);\n this.configuration.websocketProvider.off(\"close\", this.boundOnClose);\n this.configuration.websocketProvider.off(\"close\", this.configuration.onClose);\n this.configuration.websocketProvider.off(\"close\", this.forwardClose);\n this.configuration.websocketProvider.off(\"disconnect\", this.configuration.onDisconnect);\n this.configuration.websocketProvider.off(\"disconnect\", this.forwardDisconnect);\n this.configuration.websocketProvider.off(\"destroy\", this.configuration.onDestroy);\n this.configuration.websocketProvider.off(\"destroy\", this.forwardDestroy);\n\n this.configuration.websocketProvider.detach(this);\n\n this._isAttached = false;\n }\n\n attach() {\n if (this._isAttached) return;\n\n this.configuration.websocketProvider.on(\"connect\", this.configuration.onConnect);\n this.configuration.websocketProvider.on(\"connect\", this.forwardConnect);\n\n this.configuration.websocketProvider.on(\"status\", this.configuration.onStatus);\n this.configuration.websocketProvider.on(\"status\", this.forwardStatus);\n\n this.configuration.websocketProvider.on(\"open\", this.boundOnOpen);\n\n this.configuration.websocketProvider.on(\"close\", this.boundOnClose);\n this.configuration.websocketProvider.on(\"close\", this.configuration.onClose);\n this.configuration.websocketProvider.on(\"close\", this.forwardClose);\n\n this.configuration.websocketProvider.on(\"disconnect\", this.configuration.onDisconnect);\n this.configuration.websocketProvider.on(\"disconnect\", this.forwardDisconnect);\n\n this.configuration.websocketProvider.on(\"destroy\", this.configuration.onDestroy);\n this.configuration.websocketProvider.on(\"destroy\", this.forwardDestroy);\n\n this.configuration.websocketProvider.attach(this);\n\n this._isAttached = true;\n }\n\n permissionDeniedHandler(reason: string) {\n this.emit(\"authenticationFailed\", { reason });\n this.isAuthenticated = false;\n }\n\n authenticatedHandler(scope: string) {\n this.isAuthenticated = true;\n this.authorizedScope = scope as AuthorizedScope;\n\n this.emit(\"authenticated\", { scope });\n }\n\n setAwarenessField(key: string, value: any) {\n if (!this.awareness) {\n throw new AwarenessError(\n `Cannot set awareness field \"${key}\" to ${JSON.stringify(value)}. You have disabled Awareness for this provider by explicitly passing awareness: null in the provider configuration.`,\n );\n }\n this.awareness.setLocalStateField(key, value);\n }\n}\n","/**\n * IndexedDB-backed offline store for a single Abracadabra document.\n *\n * Responsibilities:\n * - Persist CRDT updates locally so they survive page refreshes / network loss.\n * - Store the last-known state vector for fast reconnect diffs.\n * - Store a permission snapshot so the UI can gate writes without a network round-trip.\n * - Queue subdoc registration events created while offline.\n *\n * Falls back to a silent no-op when IndexedDB is unavailable (e.g. SSR / Node.js).\n */\n\nexport interface PendingSubdoc {\n\tchildId: string;\n\tparentId: string;\n\tcreatedAt: number;\n}\n\nconst DB_VERSION = 1;\n\nfunction idbAvailable(): boolean {\n\treturn typeof globalThis !== \"undefined\" && \"indexedDB\" in globalThis;\n}\n\nfunction openDb(docId: string): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = globalThis.indexedDB.open(`abracadabra:${docId}`, DB_VERSION);\n\n\t\treq.onupgradeneeded = (event) => {\n\t\t\tconst db = (event.target as IDBOpenDBRequest).result;\n\n\t\t\tif (!db.objectStoreNames.contains(\"updates\")) {\n\t\t\t\tdb.createObjectStore(\"updates\", { autoIncrement: true });\n\t\t\t}\n\t\t\tif (!db.objectStoreNames.contains(\"meta\")) {\n\t\t\t\tdb.createObjectStore(\"meta\");\n\t\t\t}\n\t\t\tif (!db.objectStoreNames.contains(\"subdoc_queue\")) {\n\t\t\t\tdb.createObjectStore(\"subdoc_queue\", { keyPath: \"childId\" });\n\t\t\t}\n\t\t};\n\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nfunction txPromise<T>(\n\tstore: IDBObjectStore,\n\trequest: IDBRequest<T>,\n): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () => reject(request.error);\n\t});\n}\n\nexport class OfflineStore {\n\tprivate docId: string;\n\tprivate db: IDBDatabase | null = null;\n\n\tconstructor(docId: string) {\n\t\tthis.docId = docId;\n\t}\n\n\tprivate async getDb(): Promise<IDBDatabase | null> {\n\t\tif (!idbAvailable()) return null;\n\t\tif (!this.db) {\n\t\t\tthis.db = await openDb(this.docId).catch(() => null);\n\t\t}\n\t\treturn this.db;\n\t}\n\n\t// ── Updates ─────────────────────────────────────────────────────────────\n\n\tasync persistUpdate(update: Uint8Array): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"updates\", \"readwrite\");\n\t\tconst store = tx.objectStore(\"updates\");\n\t\tawait txPromise(store, store.add(update));\n\t}\n\n\tasync getPendingUpdates(): Promise<Uint8Array[]> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return [];\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(\"updates\", \"readonly\");\n\t\t\tconst store = tx.objectStore(\"updates\");\n\t\t\tconst req = store.getAll();\n\t\t\treq.onsuccess = () => resolve(req.result as Uint8Array[]);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\tasync clearPendingUpdates(): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"updates\", \"readwrite\");\n\t\tawait txPromise(tx.objectStore(\"updates\"), tx.objectStore(\"updates\").clear());\n\t}\n\n\t// ── State vector ─────────────────────────────────────────────────────────\n\n\tasync getStateVector(): Promise<Uint8Array | null> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return null;\n\t\tconst tx = db.transaction(\"meta\", \"readonly\");\n\t\tconst result = await txPromise<Uint8Array | undefined>(\n\t\t\ttx.objectStore(\"meta\"),\n\t\t\ttx.objectStore(\"meta\").get(\"sv\"),\n\t\t);\n\t\treturn result ?? null;\n\t}\n\n\tasync saveStateVector(sv: Uint8Array): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"meta\", \"readwrite\");\n\t\tawait txPromise(tx.objectStore(\"meta\"), tx.objectStore(\"meta\").put(sv, \"sv\"));\n\t}\n\n\t// ── Permission snapshot ──────────────────────────────────────────────────\n\n\tasync getPermissionSnapshot(): Promise<string | null> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return null;\n\t\tconst tx = db.transaction(\"meta\", \"readonly\");\n\t\tconst result = await txPromise<string | undefined>(\n\t\t\ttx.objectStore(\"meta\"),\n\t\t\ttx.objectStore(\"meta\").get(\"role\"),\n\t\t);\n\t\treturn result ?? null;\n\t}\n\n\tasync savePermissionSnapshot(role: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"meta\", \"readwrite\");\n\t\tawait txPromise(\n\t\t\ttx.objectStore(\"meta\"),\n\t\t\ttx.objectStore(\"meta\").put(role, \"role\"),\n\t\t);\n\t}\n\n\t// ── Subdoc registration queue ─────────────────────────────────────────────\n\n\tasync queueSubdoc(entry: PendingSubdoc): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"subdoc_queue\", \"readwrite\");\n\t\tawait txPromise(\n\t\t\ttx.objectStore(\"subdoc_queue\"),\n\t\t\ttx.objectStore(\"subdoc_queue\").put(entry),\n\t\t);\n\t}\n\n\tasync getPendingSubdocs(): Promise<PendingSubdoc[]> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return [];\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(\"subdoc_queue\", \"readonly\");\n\t\t\tconst req = tx.objectStore(\"subdoc_queue\").getAll();\n\t\t\treq.onsuccess = () => resolve(req.result as PendingSubdoc[]);\n\t\t\treq.onerror = () => reject(req.error);\n\t\t});\n\t}\n\n\tasync removeSubdocFromQueue(childId: string): Promise<void> {\n\t\tconst db = await this.getDb();\n\t\tif (!db) return;\n\t\tconst tx = db.transaction(\"subdoc_queue\", \"readwrite\");\n\t\tawait txPromise(\n\t\t\ttx.objectStore(\"subdoc_queue\"),\n\t\t\ttx.objectStore(\"subdoc_queue\").delete(childId),\n\t\t);\n\t}\n\n\t// ── Lifecycle ─────────────────────────────────────────────────────────────\n\n\tdestroy() {\n\t\tthis.db?.close();\n\t\tthis.db = null;\n\t}\n}\n","import { writeVarString, writeVarUint } from \"lib0/encoding\";\nimport type { OutgoingMessageArguments } from \"../types.ts\";\nimport { MessageType } from \"../types.ts\";\nimport { OutgoingMessage } from \"../OutgoingMessage.ts\";\n\n/**\n * Registers a new subdocument with the Abracadabra server.\n *\n * Wire format (consumed by handle_subdoc in sync.rs):\n * [ParentDocName: VarString] [MSG_SUBDOC(4): VarUint] [childDocumentName: VarString]\n *\n * The server responds with a MSG_STATELESS JSON frame:\n * { type: \"subdoc_registered\", child_id, parent_id }\n * which AbracadabraProvider intercepts in receiveStateless().\n */\nexport class SubdocMessage extends OutgoingMessage {\n\ttype = MessageType.Subdoc;\n\n\tdescription = \"SubdocRegistration\";\n\n\tget(args: Partial<OutgoingMessageArguments>) {\n\t\tif (!args.documentName) {\n\t\t\tthrow new Error(\"SubdocMessage requires `documentName` (parent id).\");\n\t\t}\n\t\tif (!args.childDocumentName) {\n\t\t\tthrow new Error(\"SubdocMessage requires `childDocumentName`.\");\n\t\t}\n\n\t\twriteVarString(this.encoder, args.documentName);\n\t\twriteVarUint(this.encoder, this.type);\n\t\twriteVarString(this.encoder, args.childDocumentName);\n\n\t\treturn this.encoder;\n\t}\n}\n","import * as Y from \"yjs\";\nimport { HocuspocusProvider } from \"./HocuspocusProvider.ts\";\nimport type { HocuspocusProviderConfiguration } from \"./HocuspocusProvider.ts\";\nimport type { HocuspocusProviderWebsocket } from \"./HocuspocusProviderWebsocket.ts\";\nimport { OfflineStore } from \"./OfflineStore.ts\";\nimport { SubdocMessage } from \"./OutgoingMessages/SubdocMessage.ts\";\nimport { UpdateMessage } from \"./OutgoingMessages/UpdateMessage.ts\";\nimport type {\n\tCryptoIdentity,\n\tEffectiveRole,\n\tonSubdocRegisteredParameters,\n\tonSubdocLoadedParameters,\n} from \"./types.ts\";\nimport { AuthenticationMessage } from \"./OutgoingMessages/AuthenticationMessage.ts\";\nimport type { AbracadabraClient } from \"./AbracadabraClient.ts\";\n\nexport interface AbracadabraProviderConfiguration\n\textends Omit<HocuspocusProviderConfiguration, \"url\" | \"websocketProvider\"> {\n\t/**\n\t * Subdocument loading strategy.\n\t * - \"lazy\" (default) – child providers are created only when explicitly requested.\n\t * - \"eager\" – all children returned by the server on connect are loaded automatically.\n\t */\n\tsubdocLoading?: \"lazy\" | \"eager\";\n\n\t/** Called when the server confirms a subdoc registration. */\n\tonSubdocRegistered?: (data: onSubdocRegisteredParameters) => void;\n\n\t/** Called when a child AbracadabraProvider has been created and attached. */\n\tonSubdocLoaded?: (data: onSubdocLoadedParameters) => void;\n\n\t/**\n\t * Disable the IndexedDB offline store. Useful for server-side rendering\n\t * or testing environments that lack IndexedDB.\n\t */\n\tdisableOfflineStore?: boolean;\n\n\t/**\n\t * Identity for passwordless crypto auth (Model B multi-key).\n\t * Mutually exclusive with token.\n\t */\n\tcryptoIdentity?: CryptoIdentity | (() => Promise<CryptoIdentity>);\n\n\t/**\n\t * Signs a base64url challenge and returns a base64url signature.\n\t * Required when cryptoIdentity is set.\n\t */\n\tsignChallenge?: (challenge: string) => Promise<string>;\n\n\t/**\n\t * AbracadabraClient instance for REST API access.\n\t * When provided, the provider automatically derives the WebSocket URL\n\t * and token from the client (unless explicitly overridden).\n\t */\n\tclient?: AbracadabraClient;\n\n\t/** WebSocket URL. Derived from client.wsUrl if client is provided. */\n\turl?: string;\n\n\t/** Shared WebSocket connection (use when multiplexing multiple root documents). */\n\twebsocketProvider?: HocuspocusProviderWebsocket;\n}\n\n/**\n * AbracadabraProvider extends HocuspocusProvider with:\n *\n * 1. Subdocument lifecycle – intercepts Y.Doc subdoc events and syncs them\n * with the server via MSG_SUBDOC (4) frames. Child documents get their\n * own AbracadabraProvider instances sharing the same WebSocket connection.\n *\n * 2. Offline-first – persists CRDT updates to IndexedDB so they survive\n * page reloads and network outages. On reconnect, pending updates are\n * flushed before resuming normal sync.\n *\n * 3. Permission snapshotting – stores the resolved role locally so the UI\n * can gate write operations without a network round-trip. Role is\n * refreshed from the server on every reconnect.\n */\nexport class AbracadabraProvider extends HocuspocusProvider {\n\tpublic effectiveRole: EffectiveRole = null;\n\n\tprivate _client: AbracadabraClient | null;\n\tprivate offlineStore: OfflineStore | null;\n\tprivate childProviders = new Map<string, AbracadabraProvider>();\n\tprivate subdocLoading: \"lazy\" | \"eager\";\n\n\tprivate abracadabraConfig: AbracadabraProviderConfiguration;\n\n\tprivate readonly boundHandleYSubdocsChange = this.handleYSubdocsChange.bind(this);\n\n\tconstructor(configuration: AbracadabraProviderConfiguration) {\n\t\t// Derive URL and token from client when not explicitly set.\n\t\tconst resolved = { ...configuration } as HocuspocusProviderConfiguration;\n\t\tconst client = configuration.client ?? null;\n\n\t\tif (client) {\n\t\t\tif (!resolved.url && !resolved.websocketProvider) {\n\t\t\t\t(resolved as any).url = client.wsUrl;\n\t\t\t}\n\t\t\tif (resolved.token === undefined && !configuration.cryptoIdentity) {\n\t\t\t\tresolved.token = () => client.token ?? \"\";\n\t\t\t}\n\t\t}\n\n\t\tsuper(resolved);\n\t\tthis._client = client;\n\t\tthis.abracadabraConfig = configuration;\n\t\tthis.subdocLoading = configuration.subdocLoading ?? \"lazy\";\n\n\t\tthis.offlineStore = configuration.disableOfflineStore\n\t\t\t? null\n\t\t\t: new OfflineStore(configuration.name);\n\n\t\tthis.on(\n\t\t\t\"subdocRegistered\",\n\t\t\tconfiguration.onSubdocRegistered ?? (() => null),\n\t\t);\n\t\tthis.on(\"subdocLoaded\", configuration.onSubdocLoaded ?? (() => null));\n\n\t\t// Intercept Y.Doc subdoc lifecycle events.\n\t\tthis.document.on(\"subdocs\", this.boundHandleYSubdocsChange);\n\n\t\t// Flush offline updates once we're back online and synced.\n\t\tthis.on(\"synced\", () => this.flushPendingUpdates());\n\n\t\t// Restore permission snapshot while offline.\n\t\tthis.restorePermissionSnapshot();\n\t}\n\n\t// ── Auth / permission snapshot ────────────────────────────────────────────\n\n\toverride authenticatedHandler(scope: string) {\n\t\tsuper.authenticatedHandler(scope);\n\n\t\tthis.effectiveRole =\n\t\t\tscope === \"read-write\" ? \"editor\" : \"viewer\";\n\n\t\tthis.offlineStore?.savePermissionSnapshot(this.effectiveRole);\n\t}\n\n\t/**\n\t * Override sendToken to send a pubkey-only identity declaration instead of a\n\t * JWT when cryptoIdentity is configured.\n\t *\n\t * The public key is the sole identifier in the crypto auth handshake.\n\t * Username is decoupled from auth; it lives on the server as an immutable\n\t * internal field and is never sent in the challenge-response frames.\n\t */\n\toverride async sendToken() {\n\t\tconst { cryptoIdentity } = this.abracadabraConfig;\n\t\tif (cryptoIdentity) {\n\t\t\tconst id =\n\t\t\t\ttypeof cryptoIdentity === \"function\"\n\t\t\t\t\t? await cryptoIdentity()\n\t\t\t\t\t: cryptoIdentity;\n\t\t\tconst json = JSON.stringify({\n\t\t\t\ttype: \"identity\",\n\t\t\t\tpublicKey: id.publicKey,\n\t\t\t});\n\t\t\tthis.send(AuthenticationMessage, {\n\t\t\t\ttoken: json,\n\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t});\n\t\t} else {\n\t\t\tawait super.sendToken();\n\t\t}\n\t}\n\n\t/** Handle an auth_challenge message from the server. */\n\tprivate async handleAuthChallenge(\n\t\tchallenge: string,\n\t\texpiresAt: number,\n\t): Promise<void> {\n\t\tconst { signChallenge, cryptoIdentity } = this.abracadabraConfig;\n\t\tif (!signChallenge || !cryptoIdentity) {\n\t\t\tthis.permissionDeniedHandler(\"No signChallenge callback configured\");\n\t\t\treturn;\n\t\t}\n\t\tif (Date.now() > expiresAt * 1000) {\n\t\t\tthis.permissionDeniedHandler(\"Challenge expired\");\n\t\t\treturn;\n\t\t}\n\t\tconst id =\n\t\t\ttypeof cryptoIdentity === \"function\"\n\t\t\t\t? await cryptoIdentity()\n\t\t\t\t: cryptoIdentity;\n\t\tconst signature = await signChallenge(challenge);\n\t\t// Proof frame sends only publicKey — username is fully decoupled from auth.\n\t\tconst proof = JSON.stringify({\n\t\t\ttype: \"proof\",\n\t\t\tpublicKey: id.publicKey,\n\t\t\tsignature,\n\t\t\tchallenge,\n\t\t});\n\t\tthis.send(AuthenticationMessage, {\n\t\t\ttoken: proof,\n\t\t\tdocumentName: this.configuration.name,\n\t\t});\n\t}\n\n\tprivate async restorePermissionSnapshot() {\n\t\tif (!this.offlineStore) return;\n\t\tconst role = await this.offlineStore.getPermissionSnapshot();\n\t\tif (role && !this.effectiveRole) {\n\t\t\tthis.effectiveRole = role as EffectiveRole;\n\t\t}\n\t}\n\n\tget canWrite(): boolean {\n\t\treturn this.effectiveRole === \"owner\" || this.effectiveRole === \"editor\";\n\t}\n\n\t/** The AbracadabraClient instance for REST API access, if configured. */\n\tget client(): AbracadabraClient | null {\n\t\treturn this._client;\n\t}\n\n\t// ── Stateless message interception ────────────────────────────────────────\n\n\t/**\n\t * Called when a MSG_STATELESS frame arrives from the server.\n\t * Abracadabra uses stateless frames to deliver subdoc confirmations\n\t * ({ type: \"subdoc_registered\", child_id, parent_id }).\n\t */\n\toverride receiveStateless(payload: string) {\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(payload);\n\t\t} catch {\n\t\t\tsuper.receiveStateless(payload);\n\t\t\treturn;\n\t\t}\n\n\t\tconst msg = parsed as {\n\t\t\ttype?: string;\n\t\t\tchild_id?: string;\n\t\t\tparent_id?: string;\n\t\t\tchallenge?: string;\n\t\t\texpiresAt?: number;\n\t\t};\n\n\t\t// Intercept auth_challenge before subdoc handling.\n\t\tif (msg.type === \"auth_challenge\" && msg.challenge && msg.expiresAt) {\n\t\t\tthis.handleAuthChallenge(msg.challenge, msg.expiresAt).catch(() => null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (msg.type === \"subdoc_registered\" && msg.child_id && msg.parent_id) {\n\t\t\tconst event: onSubdocRegisteredParameters = {\n\t\t\t\tchildId: msg.child_id,\n\t\t\t\tparentId: msg.parent_id,\n\t\t\t};\n\t\t\tthis.emit(\"subdocRegistered\", event);\n\n\t\t\t// Remove from the offline queue now the server confirmed.\n\t\t\tthis.offlineStore?.removeSubdocFromQueue(msg.child_id);\n\n\t\t\t// Eager mode: auto-load the confirmed child.\n\t\t\tif (this.subdocLoading === \"eager\") {\n\t\t\t\tthis.loadChild(msg.child_id);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Unknown stateless payload – pass through to base class.\n\t\tsuper.receiveStateless(payload);\n\t}\n\n\t// ── Subdocument support ───────────────────────────────────────────────────\n\n\t/**\n\t * Y.Doc emits 'subdocs' whenever subdocuments are added, removed, or loaded.\n\t * We intercept additions to register them with the Abracadabra server.\n\t */\n\tprivate handleYSubdocsChange({\n\t\tadded,\n\t\tremoved,\n\t}: {\n\t\tadded: Set<Y.Doc>;\n\t\tremoved: Set<Y.Doc>;\n\t\tloaded: Set<Y.Doc>;\n\t}) {\n\t\tfor (const subdoc of added) {\n\t\t\tthis.registerSubdoc(subdoc);\n\t\t}\n\t\tfor (const subdoc of removed) {\n\t\t\tthis.unloadChild(subdoc.guid);\n\t\t}\n\t}\n\n\t/**\n\t * Send a subdoc registration frame to the server.\n\t * If offline the event is queued in IndexedDB and replayed on reconnect.\n\t */\n\tprivate registerSubdoc(subdoc: Y.Doc) {\n\t\tconst childId = subdoc.guid;\n\n\t\tif (this.isConnected) {\n\t\t\tthis.send(SubdocMessage, {\n\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t\tchildDocumentName: childId,\n\t\t\t} as any);\n\t\t} else {\n\t\t\t// Queue for later replay when we reconnect.\n\t\t\tthis.offlineStore?.queueSubdoc({\n\t\t\t\tchildId,\n\t\t\t\tparentId: this.configuration.name,\n\t\t\t\tcreatedAt: Date.now(),\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Create (or return cached) a child AbracadabraProvider for a given\n\t * child document id. The child shares the parent's WebSocket connection.\n\t */\n\tasync loadChild(childId: string): Promise<AbracadabraProvider> {\n\t\tif (this.childProviders.has(childId)) {\n\t\t\treturn this.childProviders.get(childId)!;\n\t\t}\n\n\t\tconst childDoc = new Y.Doc({ guid: childId });\n\n\t\tconst parentWsp = this.configuration.websocketProvider as HocuspocusProviderWebsocket;\n\t\tconst childProvider = new AbracadabraProvider({\n\t\t\tname: childId,\n\t\t\tdocument: childDoc,\n\t\t\turl: parentWsp.configuration.url,\n\t\t\tWebSocketPolyfill: parentWsp.configuration.WebSocketPolyfill,\n\t\t\ttoken: this.configuration.token,\n\t\t\tsubdocLoading: this.subdocLoading,\n\t\t\tdisableOfflineStore: this.abracadabraConfig.disableOfflineStore,\n\t\t\tclient: this._client ?? undefined,\n\t\t\tcryptoIdentity: this.abracadabraConfig.cryptoIdentity,\n\t\t\tsignChallenge: this.abracadabraConfig.signChallenge,\n\t\t});\n\t\tthis.childProviders.set(childId, childProvider);\n\n\t\tthis.emit(\"subdocLoaded\", { childId, provider: childProvider });\n\n\t\treturn childProvider;\n\t}\n\n\tprivate unloadChild(childId: string) {\n\t\tconst provider = this.childProviders.get(childId);\n\t\tif (provider) {\n\t\t\tprovider.destroy();\n\t\t\tthis.childProviders.delete(childId);\n\t\t}\n\t}\n\n\t/** Return all currently-loaded child providers. */\n\tget children(): Map<string, AbracadabraProvider> {\n\t\treturn this.childProviders;\n\t}\n\n\t// ── Offline-first update persistence ─────────────────────────────────────\n\n\t/**\n\t * Override to persist every local update to IndexedDB before sending it\n\t * over the wire, ensuring no work is lost during connection outages.\n\t */\n\toverride documentUpdateHandler(update: Uint8Array, origin: unknown) {\n\t\tif (origin === this) return;\n\n\t\t// Persist locally first (fire-and-forget; errors are non-fatal).\n\t\tthis.offlineStore?.persistUpdate(update).catch(() => null);\n\n\t\tsuper.documentUpdateHandler(update, origin);\n\t}\n\n\t/**\n\t * After reconnect + sync, flush any updates that were generated while\n\t * offline, then flush any queued subdoc registrations.\n\t */\n\tprivate async flushPendingUpdates() {\n\t\tif (!this.offlineStore) return;\n\n\t\tconst updates = await this.offlineStore.getPendingUpdates();\n\t\tif (updates.length > 0) {\n\t\t\tfor (const update of updates) {\n\t\t\t\tthis.send(UpdateMessage, {\n\t\t\t\t\tupdate,\n\t\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait this.offlineStore.clearPendingUpdates();\n\t\t}\n\n\t\tconst pendingSubdocs = await this.offlineStore.getPendingSubdocs();\n\t\tfor (const { childId } of pendingSubdocs) {\n\t\t\tthis.send(SubdocMessage, {\n\t\t\t\tdocumentName: this.configuration.name,\n\t\t\t\tchildDocumentName: childId,\n\t\t\t} as any);\n\t\t}\n\t}\n\n\tget isConnected(): boolean {\n\t\treturn (\n\t\t\t(this.configuration.websocketProvider as HocuspocusProviderWebsocket)\n\t\t\t\t.status === \"connected\"\n\t\t);\n\t}\n\n\t// ── Lifecycle ─────────────────────────────────────────────────────────────\n\n\toverride destroy() {\n\t\tthis.document.off(\"subdocs\", this.boundHandleYSubdocsChange);\n\n\t\tfor (const provider of this.childProviders.values()) {\n\t\t\tprovider.destroy();\n\t\t}\n\t\tthis.childProviders.clear();\n\n\t\tthis.offlineStore?.destroy();\n\t\tthis.offlineStore = null;\n\n\t\tsuper.destroy();\n\t}\n}\n","import type {\n\tUserProfile,\n\tDocumentMeta,\n\tUploadMeta,\n\tUploadInfo,\n\tPublicKeyInfo,\n\tHealthStatus,\n} from \"./types.ts\";\n\nexport interface AbracadabraClientConfig {\n\t/** Server base URL (http or https). WebSocket URL is derived automatically. */\n\turl: string;\n\t/** Initial JWT token. If omitted and persistAuth is true, loads from storage. */\n\ttoken?: string;\n\t/** Persist JWT to localStorage for stay-logged-in. Default: true in browser. */\n\tpersistAuth?: boolean;\n\t/** localStorage key for token persistence. Default: \"abracadabra:auth\". */\n\tstorageKey?: string;\n\t/** Custom fetch implementation (useful for Node.js or testing). */\n\tfetch?: typeof globalThis.fetch;\n}\n\nexport class AbracadabraClient {\n\tprivate _token: string | null;\n\tprivate readonly baseUrl: string;\n\tprivate readonly persistAuth: boolean;\n\tprivate readonly storageKey: string;\n\tprivate readonly _fetch: typeof globalThis.fetch;\n\n\tconstructor(config: AbracadabraClientConfig) {\n\t\tthis.baseUrl = config.url.replace(/\\/+$/, \"\");\n\t\tthis.persistAuth = config.persistAuth ?? typeof localStorage !== \"undefined\";\n\t\tthis.storageKey = config.storageKey ?? \"abracadabra:auth\";\n\t\tthis._fetch = config.fetch ?? globalThis.fetch.bind(globalThis);\n\n\t\t// Load token: explicit > persisted > null\n\t\tthis._token = config.token ?? this.loadPersistedToken() ?? null;\n\t}\n\n\t// ── Token management ─────────────────────────────────────────────────────\n\n\tget token(): string | null {\n\t\treturn this._token;\n\t}\n\n\tset token(value: string | null) {\n\t\tthis._token = value;\n\t\tif (this.persistAuth) {\n\t\t\tif (value) {\n\t\t\t\tthis.persistToken(value);\n\t\t\t} else {\n\t\t\t\tthis.clearPersistedToken();\n\t\t\t}\n\t\t}\n\t}\n\n\tget isAuthenticated(): boolean {\n\t\treturn this._token !== null;\n\t}\n\n\t/** Derives ws:// or wss:// URL from the http(s) base URL. */\n\tget wsUrl(): string {\n\t\treturn this.baseUrl\n\t\t\t.replace(/^https:\\/\\//, \"wss://\")\n\t\t\t.replace(/^http:\\/\\//, \"ws://\") + \"/ws\";\n\t}\n\n\t// ── Auth ─────────────────────────────────────────────────────────────────\n\n\t/** Register a new user with password. */\n\tasync register(opts: {\n\t\tusername: string;\n\t\tpassword: string;\n\t\temail?: string;\n\t\tdisplayName?: string;\n\t}): Promise<UserProfile> {\n\t\treturn this.request<UserProfile>(\"POST\", \"/auth/register\", {\n\t\t\tbody: opts,\n\t\t\tauth: false,\n\t\t});\n\t}\n\n\t/**\n\t * Register a new user with an Ed25519 public key (crypto auth).\n\t * Username is optional — if omitted, a short identifier is derived from the key.\n\t */\n\tasync registerWithKey(opts: {\n\t\tpublicKey: string;\n\t\tusername?: string;\n\t\tdeviceName?: string;\n\t\tdisplayName?: string;\n\t\temail?: string;\n\t}): Promise<UserProfile> {\n\t\tconst username = opts.username ?? `user-${opts.publicKey.slice(0, 8)}`;\n\t\treturn this.request<UserProfile>(\"POST\", \"/auth/register\", {\n\t\t\tbody: {\n\t\t\t\tusername,\n\t\t\t\tidentityPublicKey: opts.publicKey,\n\t\t\t\tdeviceName: opts.deviceName,\n\t\t\t\tdisplayName: opts.displayName,\n\t\t\t\temail: opts.email,\n\t\t\t},\n\t\t\tauth: false,\n\t\t});\n\t}\n\n\t/** Login with username + password. Auto-persists returned token. */\n\tasync login(opts: { username: string; password: string }): Promise<string> {\n\t\tconst res = await this.request<{ token: string }>(\"POST\", \"/auth/login\", {\n\t\t\tbody: opts,\n\t\t\tauth: false,\n\t\t});\n\t\tthis.token = res.token;\n\t\treturn res.token;\n\t}\n\n\t/** Request an Ed25519 crypto auth challenge for the given public key. */\n\tasync challenge(publicKey: string): Promise<{ challenge: string; expiresAt: number }> {\n\t\treturn this.request(\"POST\", \"/auth/challenge\", {\n\t\t\tbody: { publicKey },\n\t\t\tauth: false,\n\t\t});\n\t}\n\n\t/** Verify an Ed25519 signature to complete crypto auth. Auto-persists token. */\n\tasync verify(opts: {\n\t\tpublicKey: string;\n\t\tsignature: string;\n\t\tchallenge: string;\n\t}): Promise<string> {\n\t\tconst res = await this.request<{ token: string }>(\"POST\", \"/auth/verify\", {\n\t\t\tbody: opts,\n\t\t\tauth: false,\n\t\t});\n\t\tthis.token = res.token;\n\t\treturn res.token;\n\t}\n\n\t/**\n\t * Full crypto auth flow: challenge → sign → verify.\n\t * Convenience method combining challenge() + external signing + verify().\n\t */\n\tasync loginWithKey(\n\t\tpublicKey: string,\n\t\tsignChallenge: (challenge: string) => Promise<string>,\n\t): Promise<string> {\n\t\tconst { challenge } = await this.challenge(publicKey);\n\t\tconst signature = await signChallenge(challenge);\n\t\treturn this.verify({ publicKey, signature, challenge });\n\t}\n\n\t/** Add a new Ed25519 public key to the current user (multi-device). */\n\tasync addKey(opts: { publicKey: string; deviceName?: string }): Promise<void> {\n\t\tawait this.request(\"POST\", \"/auth/keys\", { body: opts });\n\t}\n\n\t/** List all registered public keys for the current user. */\n\tasync listKeys(): Promise<PublicKeyInfo[]> {\n\t\tconst res = await this.request<{ keys: PublicKeyInfo[] }>(\"GET\", \"/auth/keys\");\n\t\treturn res.keys;\n\t}\n\n\t/** Revoke a public key by its ID. */\n\tasync revokeKey(keyId: string): Promise<void> {\n\t\tawait this.request(\"DELETE\", `/auth/keys/${encodeURIComponent(keyId)}`);\n\t}\n\n\t/** Clear token from memory and storage. */\n\tlogout(): void {\n\t\tthis.token = null;\n\t}\n\n\t// ── User ─────────────────────────────────────────────────────────────────\n\n\t/** Get the current user's profile. */\n\tasync getMe(): Promise<UserProfile> {\n\t\treturn this.request<UserProfile>(\"GET\", \"/users/me\");\n\t}\n\n\t/** Update the current user's display name. */\n\tasync updateMe(opts: { displayName?: string }): Promise<void> {\n\t\tawait this.request(\"PATCH\", \"/users/me\", { body: opts });\n\t}\n\n\t// ── Documents ────────────────────────────────────────────────────────────\n\n\t/** Create a new root document. Returns its metadata. */\n\tasync createDoc(opts?: { id?: string }): Promise<DocumentMeta> {\n\t\treturn this.request<DocumentMeta>(\"POST\", \"/docs\", { body: opts ?? {} });\n\t}\n\n\t/** Get document metadata. */\n\tasync getDoc(docId: string): Promise<DocumentMeta> {\n\t\treturn this.request<DocumentMeta>(\"GET\", `/docs/${encodeURIComponent(docId)}`);\n\t}\n\n\t/** Delete a document (requires Owner role). Cascades to children and uploads. */\n\tasync deleteDoc(docId: string): Promise<void> {\n\t\tawait this.request(\"DELETE\", `/docs/${encodeURIComponent(docId)}`);\n\t}\n\n\t/** List immediate child documents. */\n\tasync listChildren(docId: string): Promise<string[]> {\n\t\tconst res = await this.request<{ children: string[] }>(\n\t\t\t\"GET\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/children`,\n\t\t);\n\t\treturn res.children;\n\t}\n\n\t/** Create a child document under a parent (requires write permission). */\n\tasync createChild(docId: string, opts?: { child_id?: string }): Promise<DocumentMeta> {\n\t\treturn this.request<DocumentMeta>(\n\t\t\t\"POST\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/children`,\n\t\t\t{ body: opts ?? {} },\n\t\t);\n\t}\n\n\t// ── Permissions ──────────────────────────────────────────────────────────\n\n\t/** Grant or change a user's role on a document (requires Owner). */\n\tasync setPermission(\n\t\tdocId: string,\n\t\topts: { user_id: string; role: \"owner\" | \"editor\" | \"viewer\" | \"observer\" },\n\t): Promise<void> {\n\t\tawait this.request(\n\t\t\t\"POST\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/permissions`,\n\t\t\t{ body: opts },\n\t\t);\n\t}\n\n\t/** Revoke a user's permission on a document (requires Owner). */\n\tasync removePermission(docId: string, opts: { user_id: string }): Promise<void> {\n\t\tawait this.request(\n\t\t\t\"DELETE\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/permissions`,\n\t\t\t{ body: opts },\n\t\t);\n\t}\n\n\t// ── Uploads ──────────────────────────────────────────────────────────────\n\n\t/** Upload a file to a document (requires write permission). */\n\tasync upload(\n\t\tdocId: string,\n\t\tfile: File | Blob,\n\t\tfilename?: string,\n\t): Promise<UploadMeta> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", file, filename);\n\n\t\tconst headers: Record<string, string> = {};\n\t\tif (this._token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${this._token}`;\n\t\t}\n\n\t\tconst res = await this._fetch(\n\t\t\t`${this.baseUrl}/docs/${encodeURIComponent(docId)}/uploads`,\n\t\t\t{ method: \"POST\", headers, body: formData },\n\t\t);\n\t\tif (!res.ok) {\n\t\t\tthrow await this.toError(res);\n\t\t}\n\t\treturn res.json() as Promise<UploadMeta>;\n\t}\n\n\t/** List all uploads for a document. */\n\tasync listUploads(docId: string): Promise<UploadInfo[]> {\n\t\tconst res = await this.request<{ uploads: UploadInfo[] }>(\n\t\t\t\"GET\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/uploads`,\n\t\t);\n\t\treturn res.uploads;\n\t}\n\n\t/** Download an upload as a Blob. */\n\tasync getUpload(docId: string, uploadId: string): Promise<Blob> {\n\t\tconst headers: Record<string, string> = {};\n\t\tif (this._token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${this._token}`;\n\t\t}\n\n\t\tconst res = await this._fetch(\n\t\t\t`${this.baseUrl}/docs/${encodeURIComponent(docId)}/uploads/${encodeURIComponent(uploadId)}`,\n\t\t\t{ method: \"GET\", headers },\n\t\t);\n\t\tif (!res.ok) {\n\t\t\tthrow await this.toError(res);\n\t\t}\n\t\treturn res.blob();\n\t}\n\n\t/** Delete an upload (requires uploader or document Owner). */\n\tasync deleteUpload(docId: string, uploadId: string): Promise<void> {\n\t\tawait this.request(\n\t\t\t\"DELETE\",\n\t\t\t`/docs/${encodeURIComponent(docId)}/uploads/${encodeURIComponent(uploadId)}`,\n\t\t);\n\t}\n\n\t// ── System ───────────────────────────────────────────────────────────────\n\n\t/** Health check — no auth required. */\n\tasync health(): Promise<HealthStatus> {\n\t\treturn this.request<HealthStatus>(\"GET\", \"/health\", { auth: false });\n\t}\n\n\t// ── Internals ────────────────────────────────────────────────────────────\n\n\tprivate async request<T = void>(\n\t\tmethod: string,\n\t\tpath: string,\n\t\topts?: { body?: unknown; auth?: boolean },\n\t): Promise<T> {\n\t\tconst auth = opts?.auth ?? true;\n\t\tconst headers: Record<string, string> = {};\n\n\t\tif (auth && this._token) {\n\t\t\theaders[\"Authorization\"] = `Bearer ${this._token}`;\n\t\t}\n\n\t\tconst init: RequestInit = { method, headers };\n\n\t\tif (opts?.body !== undefined) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tinit.body = JSON.stringify(opts.body);\n\t\t}\n\n\t\tconst res = await this._fetch(`${this.baseUrl}${path}`, init);\n\n\t\tif (!res.ok) {\n\t\t\tthrow await this.toError(res);\n\t\t}\n\n\t\t// 204 No Content\n\t\tif (res.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\treturn res.json() as Promise<T>;\n\t}\n\n\tprivate async toError(res: Response): Promise<Error> {\n\t\tlet message: string;\n\t\ttry {\n\t\t\tconst body = await res.json() as { error?: string };\n\t\t\tmessage = body.error ?? res.statusText;\n\t\t} catch {\n\t\t\tmessage = res.statusText;\n\t\t}\n\t\tconst err = new Error(message);\n\t\t(err as any).status = res.status;\n\t\treturn err;\n\t}\n\n\tprivate loadPersistedToken(): string | null {\n\t\ttry {\n\t\t\treturn localStorage.getItem(this.storageKey);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate persistToken(token: string): void {\n\t\ttry {\n\t\t\tlocalStorage.setItem(this.storageKey, token);\n\t\t} catch {\n\t\t\t// localStorage unavailable (SSR / Node.js)\n\t\t}\n\t}\n\n\tprivate clearPersistedToken(): void {\n\t\ttry {\n\t\t\tlocalStorage.removeItem(this.storageKey);\n\t\t} catch {\n\t\t\t// localStorage unavailable\n\t\t}\n\t}\n}\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** @deprecated */\nexport const byteSwapIfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** For runtime check if class implements interface */\nexport class Hash {\n}\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function createOptHasher(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function createXOFer(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor = createHasher;\nexport const wrapConstructorWithOpts = createOptHasher;\nexport const wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, Hash, toBytes } from \"./utils.js\";\nexport class HMAC extends Hash {\n constructor(hash, _key) {\n super();\n this.finished = false;\n this.destroyed = false;\n ahash(hash);\n const key = toBytes(_key);\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n clean(pad);\n }\n update(buf) {\n aexists(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n aexists(this);\n abytes(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to || (to = Object.create(Object.getPrototypeOf(this), {}));\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();\nhmac.create = (hash, key) => new HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map","/**\n * HKDF (RFC 5869): extract + expand in one step.\n * See https://soatok.blog/2021/11/17/understanding-hkdf/.\n * @module\n */\nimport { hmac } from \"./hmac.js\";\nimport { ahash, anumber, clean, toBytes } from \"./utils.js\";\n/**\n * HKDF-extract from spec. Less important part. `HKDF-Extract(IKM, salt) -> PRK`\n * Arguments position differs from spec (IKM is first one, since it is not optional)\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n */\nexport function extract(hash, ikm, salt) {\n ahash(hash);\n // NOTE: some libraries treat zero-length array as 'not provided';\n // we don't, since we have undefined as 'not provided'\n // https://github.com/RustCrypto/KDFs/issues/15\n if (salt === undefined)\n salt = new Uint8Array(hash.outputLen);\n return hmac(hash, toBytes(salt), toBytes(ikm));\n}\nconst HKDF_COUNTER = /* @__PURE__ */ Uint8Array.from([0]);\nconst EMPTY_BUFFER = /* @__PURE__ */ Uint8Array.of();\n/**\n * HKDF-expand from the spec. The most important part. `HKDF-Expand(PRK, info, L) -> OKM`\n * @param hash - hash function that would be used (e.g. sha256)\n * @param prk - a pseudorandom key of at least HashLen octets (usually, the output from the extract step)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n */\nexport function expand(hash, prk, info, length = 32) {\n ahash(hash);\n anumber(length);\n const olen = hash.outputLen;\n if (length > 255 * olen)\n throw new Error('Length should be <= 255*HashLen');\n const blocks = Math.ceil(length / olen);\n if (info === undefined)\n info = EMPTY_BUFFER;\n // first L(ength) octets of T\n const okm = new Uint8Array(blocks * olen);\n // Re-use HMAC instance between blocks\n const HMAC = hmac.create(hash, prk);\n const HMACTmp = HMAC._cloneInto();\n const T = new Uint8Array(HMAC.outputLen);\n for (let counter = 0; counter < blocks; counter++) {\n HKDF_COUNTER[0] = counter + 1;\n // T(0) = empty string (zero length)\n // T(N) = HMAC-Hash(PRK, T(N-1) | info | N)\n HMACTmp.update(counter === 0 ? EMPTY_BUFFER : T)\n .update(info)\n .update(HKDF_COUNTER)\n .digestInto(T);\n okm.set(T, olen * counter);\n HMAC._cloneInto(HMACTmp);\n }\n HMAC.destroy();\n HMACTmp.destroy();\n clean(T, HKDF_COUNTER);\n return okm.slice(0, length);\n}\n/**\n * HKDF (RFC 5869): derive keys from an initial input.\n * Combines hkdf_extract + hkdf_expand in one step\n * @param hash - hash function that would be used (e.g. sha256)\n * @param ikm - input keying material, the initial key\n * @param salt - optional salt value (a non-secret random value)\n * @param info - optional context and application specific information (can be a zero-length string)\n * @param length - length of output keying material in bytes\n * @example\n * import { hkdf } from '@noble/hashes/hkdf';\n * import { sha256 } from '@noble/hashes/sha2';\n * import { randomBytes } from '@noble/hashes/utils';\n * const inputKey = randomBytes(32);\n * const salt = randomBytes(32);\n * const info = 'application-key';\n * const hk1 = hkdf(sha256, inputKey, salt, info, 32);\n */\nexport const hkdf = (hash, ikm, salt, info, length) => expand(hash, extract(hash, ikm, salt), info, length);\n//# sourceMappingURL=hkdf.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { Hash, abytes, aexists, aoutput, clean, createView, toBytes } from \"./utils.js\";\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport class HashMD extends Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, rotr } from \"./utils.js\";\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD {\n constructor(outputLen = 32) {\n super(64, outputLen, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = SHA256_IV[0] | 0;\n this.B = SHA256_IV[1] | 0;\n this.C = SHA256_IV[2] | 0;\n this.D = SHA256_IV[3] | 0;\n this.E = SHA256_IV[4] | 0;\n this.F = SHA256_IV[5] | 0;\n this.G = SHA256_IV[6] | 0;\n this.H = SHA256_IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\nexport class SHA224 extends SHA256 {\n constructor() {\n super(28);\n this.A = SHA224_IV[0] | 0;\n this.B = SHA224_IV[1] | 0;\n this.C = SHA224_IV[2] | 0;\n this.D = SHA224_IV[3] | 0;\n this.E = SHA224_IV[4] | 0;\n this.F = SHA224_IV[5] | 0;\n this.G = SHA224_IV[6] | 0;\n this.H = SHA224_IV[7] | 0;\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nexport class SHA512 extends HashMD {\n constructor(outputLen = 64) {\n super(128, outputLen, 16, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = SHA512_IV[0] | 0;\n this.Al = SHA512_IV[1] | 0;\n this.Bh = SHA512_IV[2] | 0;\n this.Bl = SHA512_IV[3] | 0;\n this.Ch = SHA512_IV[4] | 0;\n this.Cl = SHA512_IV[5] | 0;\n this.Dh = SHA512_IV[6] | 0;\n this.Dl = SHA512_IV[7] | 0;\n this.Eh = SHA512_IV[8] | 0;\n this.El = SHA512_IV[9] | 0;\n this.Fh = SHA512_IV[10] | 0;\n this.Fl = SHA512_IV[11] | 0;\n this.Gh = SHA512_IV[12] | 0;\n this.Gl = SHA512_IV[13] | 0;\n this.Hh = SHA512_IV[14] | 0;\n this.Hl = SHA512_IV[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nexport class SHA384 extends SHA512 {\n constructor() {\n super(48);\n this.Ah = SHA384_IV[0] | 0;\n this.Al = SHA384_IV[1] | 0;\n this.Bh = SHA384_IV[2] | 0;\n this.Bl = SHA384_IV[3] | 0;\n this.Ch = SHA384_IV[4] | 0;\n this.Cl = SHA384_IV[5] | 0;\n this.Dh = SHA384_IV[6] | 0;\n this.Dl = SHA384_IV[7] | 0;\n this.Eh = SHA384_IV[8] | 0;\n this.El = SHA384_IV[9] | 0;\n this.Fh = SHA384_IV[10] | 0;\n this.Fl = SHA384_IV[11] | 0;\n this.Gh = SHA384_IV[12] | 0;\n this.Gl = SHA384_IV[13] | 0;\n this.Hh = SHA384_IV[14] | 0;\n this.Hl = SHA384_IV[15] | 0;\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nexport class SHA512_224 extends SHA512 {\n constructor() {\n super(28);\n this.Ah = T224_IV[0] | 0;\n this.Al = T224_IV[1] | 0;\n this.Bh = T224_IV[2] | 0;\n this.Bl = T224_IV[3] | 0;\n this.Ch = T224_IV[4] | 0;\n this.Cl = T224_IV[5] | 0;\n this.Dh = T224_IV[6] | 0;\n this.Dl = T224_IV[7] | 0;\n this.Eh = T224_IV[8] | 0;\n this.El = T224_IV[9] | 0;\n this.Fh = T224_IV[10] | 0;\n this.Fl = T224_IV[11] | 0;\n this.Gh = T224_IV[12] | 0;\n this.Gl = T224_IV[13] | 0;\n this.Hh = T224_IV[14] | 0;\n this.Hl = T224_IV[15] | 0;\n }\n}\nexport class SHA512_256 extends SHA512 {\n constructor() {\n super(32);\n this.Ah = T256_IV[0] | 0;\n this.Al = T256_IV[1] | 0;\n this.Bh = T256_IV[2] | 0;\n this.Bl = T256_IV[3] | 0;\n this.Ch = T256_IV[4] | 0;\n this.Cl = T256_IV[5] | 0;\n this.Dh = T256_IV[6] | 0;\n this.Dl = T256_IV[7] | 0;\n this.Eh = T256_IV[8] | 0;\n this.El = T256_IV[9] | 0;\n this.Fh = T256_IV[10] | 0;\n this.Fl = T256_IV[11] | 0;\n this.Gh = T256_IV[12] | 0;\n this.Gl = T256_IV[13] | 0;\n this.Hh = T256_IV[14] | 0;\n this.Hl = T256_IV[15] | 0;\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map","/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport { SHA224 as SHA224n, sha224 as sha224n, SHA256 as SHA256n, sha256 as sha256n, } from \"./sha2.js\";\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256 = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256 = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224 = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224 = sha224n;\n//# sourceMappingURL=sha256.js.map","/**\n * CryptoIdentityKeystore\n *\n * Per-device Ed25519 keypair, private key protected by WebAuthn PRF + AES-256-GCM.\n * Stored in IndexedDB under \"abracadabra:identity\" / \"identity\" / key \"current\".\n *\n * No private key is ever shared between devices. Each device generates its own\n * keypair, encrypts the private key with the PRF output from its own WebAuthn\n * credential, and stores the ciphertext in IndexedDB.\n *\n * Dependencies: @noble/ed25519, @noble/hashes (for HKDF)\n */\n\nimport * as ed from \"@noble/ed25519\";\nimport { hkdf } from \"@noble/hashes/hkdf\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface StoredIdentity {\n\t/**\n\t * Internal label stored locally. NOT sent to the server during the\n\t * challenge-response handshake — the public key is the sole auth identifier.\n\t * This may be used as a hint when calling POST /auth/register (first device)\n\t * or displayed to the user before they set a real display name.\n\t */\n\tusername: string;\n\t/** base64url-encoded Ed25519 public key (32 bytes). Primary auth identifier. */\n\tpublicKey: string;\n\t/** AES-GCM ciphertext of the 32-byte private key */\n\tencryptedPrivateKey: ArrayBuffer;\n\t/** 12-byte AES-GCM nonce */\n\tiv: Uint8Array;\n\t/** 32-byte constant PRF input salt (per-enrollment) */\n\tsalt: Uint8Array;\n\t/** WebAuthn credential ID */\n\tcredentialId: ArrayBuffer;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction toBase64url(bytes: Uint8Array): string {\n\treturn btoa(String.fromCharCode(...bytes))\n\t\t.replace(/\\+/g, \"-\")\n\t\t.replace(/\\//g, \"_\")\n\t\t.replace(/=/g, \"\");\n}\n\nfunction fromBase64url(b64: string): Uint8Array {\n\tconst padded = b64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\tconst padLen = (4 - (padded.length % 4)) % 4;\n\tconst padded2 = padded + \"=\".repeat(padLen);\n\treturn Uint8Array.from(atob(padded2), (c) => c.charCodeAt(0));\n}\n\nconst DB_NAME = \"abracadabra:identity\";\nconst STORE_NAME = \"identity\";\nconst RECORD_KEY = \"current\";\nconst HKDF_INFO = new TextEncoder().encode(\"abracadabra-identity-v1\");\n\n// ── IndexedDB helpers ─────────────────────────────────────────────────────────\n\nfunction openDb(): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(DB_NAME, 1);\n\t\treq.onupgradeneeded = () => {\n\t\t\treq.result.createObjectStore(STORE_NAME);\n\t\t};\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function dbGet(db: IDBDatabase): Promise<StoredIdentity | undefined> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readonly\");\n\t\tconst req = tx.objectStore(STORE_NAME).get(RECORD_KEY);\n\t\treq.onsuccess = () => resolve(req.result as StoredIdentity | undefined);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function dbPut(db: IDBDatabase, value: StoredIdentity): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readwrite\");\n\t\tconst req = tx.objectStore(STORE_NAME).put(value, RECORD_KEY);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function dbDelete(db: IDBDatabase): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readwrite\");\n\t\tconst req = tx.objectStore(STORE_NAME).delete(RECORD_KEY);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\n// ── Key derivation ────────────────────────────────────────────────────────────\n\nasync function deriveAesKey(prfOutput: ArrayBuffer, salt: Uint8Array): Promise<CryptoKey> {\n\tconst ikm = new Uint8Array(prfOutput);\n\tconst keyBytes = hkdf(sha256, ikm, salt, HKDF_INFO, 32);\n\treturn crypto.subtle.importKey(\"raw\", keyBytes, { name: \"AES-GCM\" }, false, [\n\t\t\"encrypt\",\n\t\t\"decrypt\",\n\t]);\n}\n\n// ── Main class ───────────────────────────────────────────────────────────────\n\nexport class CryptoIdentityKeystore {\n\t/**\n\t * One-time setup for a device: generates an Ed25519 keypair, creates a\n\t * WebAuthn credential with PRF extension, encrypts the private key, and\n\t * stores everything in IndexedDB.\n\t *\n\t * Returns the base64url-encoded public key. The caller must register this\n\t * key with the server via POST /auth/register (first device) or\n\t * POST /auth/keys (additional device).\n\t *\n\t * @param username - The user's account name.\n\t * @param rpId - WebAuthn relying party ID (e.g. \"example.com\").\n\t * @param rpName - Human-readable relying party name.\n\t */\n\tasync register(username: string, rpId: string, rpName: string): Promise<string> {\n\t\t// 1. Generate Ed25519 keypair\n\t\tconst privateKey = ed.utils.randomPrivateKey();\n\t\tconst publicKey = await ed.getPublicKeyAsync(privateKey);\n\n\t\t// 2. Generate per-enrollment salt\n\t\tconst salt = crypto.getRandomValues(new Uint8Array(32));\n\n\t\t// 3. Create WebAuthn credential with PRF extension\n\t\tconst credential = await navigator.credentials.create({\n\t\t\tpublicKey: {\n\t\t\t\tchallenge: crypto.getRandomValues(new Uint8Array(32)),\n\t\t\t\trp: { id: rpId, name: rpName },\n\t\t\t\tuser: {\n\t\t\t\t\tid: new TextEncoder().encode(username),\n\t\t\t\t\tname: username,\n\t\t\t\t\tdisplayName: username,\n\t\t\t\t},\n\t\t\t\tpubKeyCredParams: [\n\t\t\t\t\t{ alg: -7, type: \"public-key\" }, // ES256\n\t\t\t\t\t{ alg: -257, type: \"public-key\" }, // RS256\n\t\t\t\t],\n\t\t\t\tauthenticatorSelection: {\n\t\t\t\t\tuserVerification: \"required\",\n\t\t\t\t},\n\t\t\t\textensions: {\n\t\t\t\t\tprf: { eval: { first: salt.buffer } },\n\t\t\t\t} as AuthenticationExtensionsClientInputs,\n\t\t\t},\n\t\t}) as PublicKeyCredential | null;\n\n\t\tif (!credential) {\n\t\t\tthrow new Error(\"WebAuthn credential creation failed\");\n\t\t}\n\n\t\tconst extResults = credential.getClientExtensionResults() as {\n\t\t\tprf?: { results?: { first?: ArrayBuffer } };\n\t\t};\n\t\tconst prfOutput = extResults?.prf?.results?.first;\n\t\tif (!prfOutput) {\n\t\t\tthrow new Error(\n\t\t\t\t\"WebAuthn PRF extension not available on this authenticator. \" +\n\t\t\t\t\t\"A PRF-capable authenticator (e.g. platform authenticator with PRF support) is required.\",\n\t\t\t);\n\t\t}\n\n\t\t// 4. Derive AES key from PRF output via HKDF\n\t\tconst aesKey = await deriveAesKey(prfOutput, salt);\n\n\t\t// 5. Encrypt private key\n\t\tconst iv = crypto.getRandomValues(new Uint8Array(12));\n\t\tconst encryptedPrivateKey = await crypto.subtle.encrypt(\n\t\t\t{ name: \"AES-GCM\", iv },\n\t\t\taesKey,\n\t\t\tprivateKey,\n\t\t);\n\n\t\t// 6. Store in IndexedDB\n\t\tconst db = await openDb();\n\t\tawait dbPut(db, {\n\t\t\tusername,\n\t\t\tpublicKey: toBase64url(publicKey),\n\t\t\tencryptedPrivateKey,\n\t\t\tiv,\n\t\t\tsalt,\n\t\t\tcredentialId: credential.rawId,\n\t\t});\n\t\tdb.close();\n\n\t\treturn toBase64url(publicKey);\n\t}\n\n\t/**\n\t * Sign a base64url-encoded challenge using the stored Ed25519 private key.\n\t *\n\t * This triggers a WebAuthn assertion (biometric / PIN prompt) to unlock the\n\t * private key via PRF → HKDF → AES-GCM decryption. The private key is\n\t * wiped from memory after signing.\n\t *\n\t * @param challengeB64 - base64url-encoded challenge bytes from the server.\n\t * @returns base64url-encoded Ed25519 signature (64 bytes).\n\t */\n\tasync sign(challengeB64: string): Promise<string> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\n\t\tif (!stored) {\n\t\t\tthrow new Error(\"No identity stored. Call register() first.\");\n\t\t}\n\n\t\t// WebAuthn assertion with PRF\n\t\tconst assertion = await navigator.credentials.get({\n\t\t\tpublicKey: {\n\t\t\t\tchallenge: crypto.getRandomValues(new Uint8Array(32)),\n\t\t\t\tallowCredentials: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: stored.credentialId,\n\t\t\t\t\t\ttype: \"public-key\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tuserVerification: \"required\",\n\t\t\t\textensions: {\n\t\t\t\t\tprf: { eval: { first: stored.salt.buffer } },\n\t\t\t\t} as AuthenticationExtensionsClientInputs,\n\t\t\t},\n\t\t}) as PublicKeyCredential | null;\n\n\t\tif (!assertion) {\n\t\t\tthrow new Error(\"WebAuthn assertion failed\");\n\t\t}\n\n\t\tconst extResults = assertion.getClientExtensionResults() as {\n\t\t\tprf?: { results?: { first?: ArrayBuffer } };\n\t\t};\n\t\tconst prfOutput = extResults?.prf?.results?.first;\n\t\tif (!prfOutput) {\n\t\t\tthrow new Error(\"PRF output not available from authenticator\");\n\t\t}\n\n\t\t// Derive the same AES key\n\t\tconst aesKey = await deriveAesKey(prfOutput, stored.salt);\n\n\t\t// Decrypt private key\n\t\tconst privateKeyBytes = await crypto.subtle.decrypt(\n\t\t\t{ name: \"AES-GCM\", iv: stored.iv },\n\t\t\taesKey,\n\t\t\tstored.encryptedPrivateKey,\n\t\t);\n\n\t\tconst privateKey = new Uint8Array(privateKeyBytes);\n\n\t\t// Sign the challenge\n\t\tconst challengeBytes = fromBase64url(challengeB64);\n\t\tconst signature = await ed.signAsync(challengeBytes, privateKey);\n\n\t\t// Wipe private key from memory\n\t\tprivateKey.fill(0);\n\n\t\treturn toBase64url(signature);\n\t}\n\n\t/** Returns the stored base64url public key, or null if no identity exists. */\n\tasync getPublicKey(): Promise<string | null> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\t\treturn stored?.publicKey ?? null;\n\t}\n\n\t/**\n\t * Returns the locally-stored internal username label, or null if no identity exists.\n\t *\n\t * This is NOT the auth identifier (the public key is). It can be used as a\n\t * hint when calling POST /auth/register, or displayed before the user sets\n\t * a real display name via PATCH /users/me.\n\t */\n\tasync getUsername(): Promise<string | null> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\t\treturn stored?.username ?? null;\n\t}\n\n\t/** Returns true if an identity is stored in IndexedDB. */\n\tasync hasIdentity(): Promise<boolean> {\n\t\tconst db = await openDb();\n\t\tconst stored = await dbGet(db);\n\t\tdb.close();\n\t\treturn stored !== undefined;\n\t}\n\n\t/** Remove the stored identity from IndexedDB. */\n\tasync clear(): Promise<void> {\n\t\tconst db = await openDb();\n\t\tawait dbDelete(db);\n\t\tdb.close();\n\t}\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,22,35,36,37,38,39,40,41],"mappings":"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"}
|