@automerge/automerge-repo-react-hooks 2.6.0-alpha.2 → 2.6.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -57,15 +57,15 @@ function useRepo() {
57
57
  return repo;
58
58
  }
59
59
  //#endregion
60
- //#region ../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/regex.js
60
+ //#region ../../node_modules/.pnpm/uuid@14.0.1/node_modules/uuid/dist/regex.js
61
61
  var regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;
62
62
  //#endregion
63
- //#region ../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/validate.js
63
+ //#region ../../node_modules/.pnpm/uuid@14.0.1/node_modules/uuid/dist/validate.js
64
64
  function validate(uuid) {
65
65
  return typeof uuid === "string" && regex_default.test(uuid);
66
66
  }
67
67
  //#endregion
68
- //#region ../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/parse.js
68
+ //#region ../../node_modules/.pnpm/uuid@14.0.1/node_modules/uuid/dist/parse.js
69
69
  function parse(uuid) {
70
70
  if (!validate(uuid)) throw TypeError("Invalid UUID");
71
71
  let v;
@@ -438,7 +438,7 @@ var sha256 = /* @__PURE__ */ createHasher(() => new SHA256());
438
438
  //#region ../../node_modules/.pnpm/base-x@5.0.1/node_modules/base-x/src/esm/index.js
439
439
  function base(ALPHABET) {
440
440
  if (ALPHABET.length >= 255) throw new TypeError("Alphabet too long");
441
- const BASE_MAP = new Uint8Array(256);
441
+ const BASE_MAP = /* @__PURE__ */ new Uint8Array(256);
442
442
  for (let j = 0; j < BASE_MAP.length; j++) BASE_MAP[j] = 255;
443
443
  for (let i = 0; i < ALPHABET.length; i++) {
444
444
  const x = ALPHABET.charAt(i);
@@ -485,7 +485,7 @@ function base(ALPHABET) {
485
485
  }
486
486
  function decodeUnsafe(source) {
487
487
  if (typeof source !== "string") throw new TypeError("Expected String");
488
- if (source.length === 0) return new Uint8Array();
488
+ if (source.length === 0) return /* @__PURE__ */ new Uint8Array();
489
489
  let psz = 0;
490
490
  let zeroes = 0;
491
491
  let length = 0;
@@ -1391,15 +1391,21 @@ function useDocHandle(id, { suspense } = { suspense: false }) {
1391
1391
  }
1392
1392
  useEffect(() => {
1393
1393
  if (currentHandle || suspense || !wrapper) return;
1394
+ let active = true;
1394
1395
  wrapper.promise.then((handle) => {
1395
- setHandle(handle);
1396
+ if (active) setHandle(handle);
1396
1397
  }).catch(() => {
1397
- setHandle(void 0);
1398
+ if (id && wrapperCache.get(id) === wrapper) wrapperCache.delete(id);
1399
+ if (active) setHandle(void 0);
1398
1400
  });
1401
+ return () => {
1402
+ active = false;
1403
+ };
1399
1404
  }, [
1400
1405
  currentHandle,
1401
1406
  suspense,
1402
- wrapper
1407
+ wrapper,
1408
+ id
1403
1409
  ]);
1404
1410
  if (currentHandle || !suspense || !wrapper) return currentHandle;
1405
1411
  return wrapper.read();
@@ -1488,7 +1494,9 @@ function useDocHandles(ids, { suspense = false } = {}) {
1488
1494
  }
1489
1495
  }
1490
1496
  useEffect(() => {
1497
+ let active = true;
1491
1498
  if (pendingPromises.length > 0) Promise.allSettled(pendingPromises.map((p) => p.promise)).then((handles) => {
1499
+ if (!active) return;
1492
1500
  handles.forEach((r) => {
1493
1501
  if (r.status === "fulfilled") {
1494
1502
  const h = r.value;
@@ -1498,6 +1506,9 @@ function useDocHandles(ids, { suspense = false } = {}) {
1498
1506
  setHandleMap(nextHandleMap);
1499
1507
  });
1500
1508
  else setHandleMap(nextHandleMap);
1509
+ return () => {
1510
+ active = false;
1511
+ };
1501
1512
  }, [suspense, idSet]);
1502
1513
  if (suspense && pendingPromises.length > 0) throw Promise.all(pendingPromises.map((p) => p.promise));
1503
1514
  return handleMap;
@@ -1987,7 +1998,8 @@ function usePresence({ handle, initialState, heartbeatMs, peerTtlMs }) {
1987
1998
  localState,
1988
1999
  update: useCallback((channel, msg) => {
1989
2000
  presence.broadcast(channel, msg);
1990
- setLocalState(presence.getLocalState());
2001
+ const updated = presence.getLocalState();
2002
+ setLocalState(updated);
1991
2003
  }, [presence]),
1992
2004
  start,
1993
2005
  stop
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["REGEX","sha256","sha256n","basex","base58","bs58checkBase"],"sources":["../src/wrapPromise.ts","../src/useRepo.ts","../../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/regex.js","../../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/validate.js","../../../node_modules/.pnpm/uuid@14.0.0/node_modules/uuid/dist/parse.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js","../../../node_modules/.pnpm/base-x@5.0.1/node_modules/base-x/src/esm/index.js","../../../node_modules/.pnpm/bs58@6.0.0/node_modules/bs58/src/esm/index.js","../../../node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/base.js","../../../node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/index.js","../../automerge-repo/dist/helpers/bufferFromHex.js","../../automerge-repo/dist/subdoc-handles/types.js","../../automerge-repo/dist/subdoc-handles/parser.js","../../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/common.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/browser.js","../../automerge-repo/dist/Logger.js","../../automerge-repo/dist/AutomergeUrl.js","../src/useDocHandle.ts","../src/useDocument.ts","../src/helpers/useSet.ts","../src/useDocHandles.ts","../src/useDocuments.ts","../src/useStateRef.ts","../../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.js","../../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.mjs","../src/useRemoteAwareness.ts","../src/useLocalAwareness.ts","../src/usePresence.ts"],"sourcesContent":["type Status = \"pending\" | \"success\" | \"error\"\n\nexport type PromiseWrapper<T> = {\n promise: Promise<T>\n read(): T\n}\n\nexport function wrapPromise<T>(promise: Promise<T>): PromiseWrapper<T> {\n let status: Status = \"pending\"\n let result: T\n let error: Error\n\n const suspender = promise.then(\n data => {\n status = \"success\"\n result = data\n },\n err => {\n status = \"error\"\n error = err\n }\n )\n\n return {\n promise,\n read(): T {\n switch (status) {\n case \"pending\":\n throw suspender\n case \"error\":\n throw error\n case \"success\":\n return result\n }\n },\n }\n}\n","import { Repo } from \"@automerge/automerge-repo/slim\"\nimport { createContext, useContext } from \"react\"\n\n/** A [React context](https://react.dev/learn/passing-data-deeply-with-context) which provides access to an Automerge repo. */\nexport const RepoContext = createContext<Repo | null>(null)\n\n/** A [React hook](https://reactjs.org/docs/hooks-intro.html) which returns the Automerge repo from {@link RepoContext}. */\nexport function useRepo(): Repo {\n const repo = useContext(RepoContext)\n if (!repo) throw new Error(\"Repo was not found on RepoContext.\")\n return repo\n}\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n","import REGEX from './regex.js';\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\nexport default validate;\n","import validate from './validate.js';\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n let v;\n return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexport default parse;\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 * 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 * 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","// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\nfunction base (ALPHABET) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n const BASE_MAP = new Uint8Array(256)\n for (let j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255\n }\n for (let i = 0; i < ALPHABET.length; i++) {\n const x = ALPHABET.charAt(i)\n const xc = x.charCodeAt(0)\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i\n }\n const BASE = ALPHABET.length\n const LEADER = ALPHABET.charAt(0)\n const FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\n const iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\n function encode (source) {\n // eslint-disable-next-line no-empty\n if (source instanceof Uint8Array) { } else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength)\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source)\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n let zeroes = 0\n let length = 0\n let pbegin = 0\n const pend = source.length\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++\n zeroes++\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0\n const b58 = new Uint8Array(size)\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin]\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0\n for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0\n b58[it1] = (carry % BASE) >>> 0\n carry = (carry / BASE) >>> 0\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i\n pbegin++\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length\n while (it2 !== size && b58[it2] === 0) {\n it2++\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes)\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) }\n return str\n }\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n let psz = 0\n // Skip and count leading '1's.\n let zeroes = 0\n let length = 0\n while (source[psz] === LEADER) {\n zeroes++\n psz++\n }\n // Allocate enough space in big-endian base256 representation.\n const size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up.\n const b256 = new Uint8Array(size)\n // Process the characters.\n while (psz < source.length) {\n // Find code of next character\n const charCode = source.charCodeAt(psz)\n // Base map can not be indexed using char code\n if (charCode > 255) { return }\n // Decode character\n let carry = BASE_MAP[charCode]\n // Invalid character\n if (carry === 255) { return }\n let i = 0\n for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0\n b256[it3] = (carry % 256) >>> 0\n carry = (carry / 256) >>> 0\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i\n psz++\n }\n // Skip leading zeroes in b256.\n let it4 = size - length\n while (it4 !== size && b256[it4] === 0) {\n it4++\n }\n const vch = new Uint8Array(zeroes + (size - it4))\n let j = zeroes\n while (it4 !== size) {\n vch[j++] = b256[it4++]\n }\n return vch\n }\n function decode (string) {\n const buffer = decodeUnsafe(string)\n if (buffer) { return buffer }\n throw new Error('Non-base' + BASE + ' character')\n }\n return {\n encode,\n decodeUnsafe,\n decode\n }\n}\nexport default base\n","import basex from 'base-x';\nvar ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nexport default basex(ALPHABET);\n","'use strict';\nimport base58 from 'bs58';\nexport default function (checksumFn) {\n // Encode a buffer as a base58-check encoded string\n function encode(payload) {\n var payloadU8 = Uint8Array.from(payload);\n var checksum = checksumFn(payloadU8);\n var length = payloadU8.length + 4;\n var both = new Uint8Array(length);\n both.set(payloadU8, 0);\n both.set(checksum.subarray(0, 4), payloadU8.length);\n return base58.encode(both);\n }\n function decodeRaw(buffer) {\n var payload = buffer.slice(0, -4);\n var checksum = buffer.slice(-4);\n var newChecksum = checksumFn(payload);\n // eslint-disable-next-line\n if (checksum[0] ^ newChecksum[0] |\n checksum[1] ^ newChecksum[1] |\n checksum[2] ^ newChecksum[2] |\n checksum[3] ^ newChecksum[3])\n return;\n return payload;\n }\n // Decode a base58-check encoded string to a buffer, no result if checksum is wrong\n function decodeUnsafe(str) {\n var buffer = base58.decodeUnsafe(str);\n if (buffer == null)\n return;\n return decodeRaw(buffer);\n }\n function decode(str) {\n var buffer = base58.decode(str);\n var payload = decodeRaw(buffer);\n if (payload == null)\n throw new Error('Invalid checksum');\n return payload;\n }\n return {\n encode: encode,\n decode: decode,\n decodeUnsafe: decodeUnsafe\n };\n}\n","'use strict';\nimport { sha256 } from '@noble/hashes/sha256';\nimport bs58checkBase from './base.js';\n// SHA256(SHA256(buffer))\nfunction sha256x2(buffer) {\n return sha256(sha256(buffer));\n}\nexport default bs58checkBase(sha256x2);\n","export const uint8ArrayFromHexString = (hexString) => {\n if (hexString.length % 2 !== 0) {\n throw new Error(\"Hex string must have an even length\");\n }\n const bytes = new Uint8Array(hexString.length / 2);\n for (let i = 0; i < hexString.length; i += 2) {\n bytes[i >> 1] = parseInt(hexString.slice(i, i + 2), 16);\n }\n return bytes;\n};\nexport const uint8ArrayToHexString = (data) => {\n return Array.from(data, byte => byte.toString(16).padStart(2, \"0\")).join(\"\");\n};\n//# sourceMappingURL=bufferFromHex.js.map","/**\n * Symbol used as discriminator for segments to avoid collision with user data.\n * Users might have objects with a 'kind' property in id patterns.\n */\nexport const KIND = \"AUTOMERGE_REF_KIND\";\n/**\n * Symbol to mark a cursor request for stabilization during sub-handle creation.\n */\nexport const CURSOR_MARKER = \"AUTOMERGE_REF_CURSOR_MARKER\";\n//# sourceMappingURL=types.js.map","import { KIND } from \"./types.js\";\n/**\n * # Path Segment Encoding Scheme\n *\n * | Type | Format | Example | Notes |\n * |---------|---------------------|----------------------------|---------------------------------|\n * | Key | string | `foo`, `my%2Fkey` | Default, URL-encoded |\n * | Index | `@` + number | `@0`, `@42` | Array index |\n * | Match | `{...}` | `{\"id\":\"alice\"}` | JSON object pattern (URL-encoded) |\n * | Cursors | `[start-end]` | `[2@abc-5@def]` | Cursor range |\n * | Cursors | `[cursor]` | `[2@abc]` | Collapsed (start === end) |\n *\n * ## Escape Rule\n * If a key starts with `@`, `{`, `[`, or `\\`, prefix with `\\` (URL-encoded as `%5C`):\n * - `\\@at` → key \"@at\" (appears as `%5C%40at` in URL)\n * - `\\{brace` → key \"{brace\" (appears as `%5C%7Bbrace` in URL)\n * - `\\\\backslash` → key \"\\backslash\" (appears as `%5C%5Cbackslash` in URL)\n *\n * ## Parsing Priority (first match wins)\n * 1. Index: `@` + digits\n * 2. Match: `{...}` or URL-encoded `%7B...`\n * 3. Cursors: `[...]`\n * 4. Key: `\\...` (escaped, URL-encoded as `%5C...`) or anything else\n */\n/** The escape character (backslash) */\nconst ESCAPE_CHAR = \"\\\\\";\n/** URL-encoded form of the escape character for matching in URLs */\nconst ESCAPE_PREFIX = \"%5C\";\nconst INDEX_PREFIX = \"@\";\nconst CURSOR_OPEN = \"[\";\nconst CURSOR_CLOSE = \"]\";\nconst CURSOR_SEPARATOR = \"-\";\n/** Characters that trigger escaping when at the start of a key */\nconst ESCAPE_TRIGGERS = [ESCAPE_CHAR, INDEX_PREFIX, \"{\", CURSOR_OPEN];\nconst INDEX_PATTERN = /^@(\\d+)$/;\nconst indexCodec = {\n kind: \"index\",\n match: s => INDEX_PATTERN.test(s),\n parse: s => {\n const m = s.match(INDEX_PATTERN);\n if (!m)\n throw new Error(`Invalid index: ${s}`);\n return { [KIND]: \"index\", index: parseInt(m[1], 10) };\n },\n serialize: seg => `${INDEX_PREFIX}${seg.index}`,\n};\nconst matchCodec = {\n kind: \"match\",\n // Match both raw JSON and URL-encoded JSON\n match: s => s.startsWith(\"{\") || s.startsWith(\"%7B\"),\n parse: s => {\n try {\n // Decode URL encoding first, then parse JSON\n // This handles both URL-encoded and raw JSON formats\n const decoded = decodeURIComponent(s);\n const parsed = JSON.parse(decoded);\n if (typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)) {\n throw new Error(\"Match pattern must be a plain object\");\n }\n return { [KIND]: \"match\", match: parsed };\n }\n catch (e) {\n throw new Error(`Invalid match pattern: ${s}. ${e instanceof Error ? e.message : \"\"}`);\n }\n },\n // Serialize with sorted keys so `{a:1,b:2}` and `{b:2,a:1}` produce\n // identical URLs (they're semantically the same pattern). Also URL-\n // encode the JSON to protect `/` and other path-significant chars.\n serialize: seg => encodeURIComponent(JSON.stringify(Object.fromEntries(Object.keys(seg.match)\n .sort()\n .map(k => [k, seg.match[k]])))),\n};\nconst cursorsCodec = {\n kind: \"cursors\",\n match: s => s.startsWith(CURSOR_OPEN) && s.endsWith(CURSOR_CLOSE),\n parse: s => {\n const inner = s.slice(1, -1);\n if (!inner) {\n throw new Error(\"Invalid cursor range: empty brackets\");\n }\n const sepIndex = inner.indexOf(CURSOR_SEPARATOR);\n if (sepIndex === -1) {\n const cursor = inner;\n return { [KIND]: \"cursors\", start: cursor, end: cursor };\n }\n const start = inner.slice(0, sepIndex);\n const end = inner.slice(sepIndex + 1);\n if (!start || !end) {\n throw new Error(`Invalid cursor range: ${s}. Expected format: [cursor] or [start-end]`);\n }\n return { [KIND]: \"cursors\", start, end };\n },\n serialize: seg => {\n if (seg.start === seg.end) {\n return `${CURSOR_OPEN}${seg.start}${CURSOR_CLOSE}`;\n }\n return `${CURSOR_OPEN}${seg.start}${CURSOR_SEPARATOR}${seg.end}${CURSOR_CLOSE}`;\n },\n};\nconst keyCodec = {\n kind: \"key\",\n match: s => {\n // Escaped keys start with backslash (URL-encoded as %5C)\n if (s.startsWith(ESCAPE_PREFIX) || s.startsWith(ESCAPE_CHAR)) {\n return true;\n }\n // Regular keys don't start with special prefixes\n // We need to check both raw and URL-decoded forms\n const decoded = safeDecodeURIComponent(s);\n return !ESCAPE_TRIGGERS.some(p => s.startsWith(p) || decoded.startsWith(p));\n },\n parse: s => {\n // Check for URL-encoded escape prefix (%5C) or literal backslash\n if (s.startsWith(ESCAPE_PREFIX)) {\n return {\n [KIND]: \"key\",\n key: decodeURIComponent(s.slice(ESCAPE_PREFIX.length)),\n };\n }\n if (s.startsWith(ESCAPE_CHAR)) {\n return {\n [KIND]: \"key\",\n key: decodeURIComponent(s.slice(ESCAPE_CHAR.length)),\n };\n }\n return { [KIND]: \"key\", key: decodeURIComponent(s) };\n },\n serialize: seg => {\n // Empty keys don't round-trip through a slash-delimited URL path.\n if (seg.key === \"\") {\n throw new Error(\"Path keys cannot be empty strings\");\n }\n // Check if key starts with any character that needs escaping\n const needsEscape = ESCAPE_TRIGGERS.some(p => seg.key.startsWith(p));\n const encoded = encodeURIComponent(seg.key);\n // Prefix with URL-encoded backslash (%5C) if escape needed\n return needsEscape ? `${ESCAPE_PREFIX}${encoded}` : encoded;\n },\n};\n/** Safely decode URI component, returning original string on error */\nfunction safeDecodeURIComponent(s) {\n try {\n return decodeURIComponent(s);\n }\n catch {\n return s;\n }\n}\n/**\n * Codecs in priority order. First matching codec wins for parsing.\n * Order: index → match → cursors → key (key is catch-all, must be last)\n */\nconst SEGMENT_CODECS = [indexCodec, matchCodec, cursorsCodec, keyCodec];\nexport function parseSegment(segment) {\n for (const codec of SEGMENT_CODECS) {\n if (codec.match(segment)) {\n return codec.parse(segment);\n }\n }\n throw new Error(`Invalid segment: \"${segment}\"`);\n}\n// ⇧ Parse --- Serialize ⇩\nexport function serializeSegment(segment) {\n for (const codec of SEGMENT_CODECS) {\n if (segment[KIND] === codec.kind) {\n return codec.serialize(segment);\n }\n }\n throw new Error(`No codec found for segment kind: ${segment[KIND]}`);\n}\nexport function parsePath(path) {\n if (!path)\n return [];\n const trimmed = path.replace(/^\\/+|\\/+$/g, \"\");\n if (!trimmed) {\n throw new Error(\"Invalid path: path cannot be empty or consist only of slashes\");\n }\n if (trimmed.includes(\"//\")) {\n throw new Error(\"Invalid path: contains empty segment (double slash)\");\n }\n return trimmed.split(\"/\").map(parseSegment);\n}\n// ⇧ Parse --- Serialize ⇩\nexport function serializePath(segments) {\n return segments.map(serializeSegment).join(\"/\");\n}\n//# sourceMappingURL=parser.js.map","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","import debug from \"debug\";\n// `.debug` is routed through the `debug` package for namespace-based filtering\n// via `DEBUG=automerge-repo:*`; the rest go straight to `console`.\nconst defaultFactory = namespace => {\n const trace = debug(namespace);\n const prefix = `[${namespace}]`;\n return {\n debug: (message, ...args) => trace(message, ...args),\n info: (message, ...args) => console.info(prefix, message, ...args),\n warn: (message, ...args) => console.warn(prefix, message, ...args),\n error: (message, ...args) => console.error(prefix, message, ...args),\n };\n};\nlet factory = defaultFactory;\n/**\n * Replace the global logger factory. All subsequent {@link makeLogger} calls use it.\n *\n * Call once at startup to route automerge-repo output through your own logger.\n * The factory receives a namespace such as `automerge-repo:repo` or\n * `automerge-repo:docsync:abc12` for each subsystem instance.\n *\n * @example\n * ```ts\n * import { setLoggerFactory } from \"@automerge/automerge-repo\"\n * import winston from \"winston\"\n *\n * const logger = winston.createLogger({ ... })\n *\n * setLoggerFactory(namespace => ({\n * debug: (msg, ...args) => logger.debug(msg, { namespace, args }),\n * info: (msg, ...args) => logger.info(msg, { namespace, args }),\n * warn: (msg, ...args) => logger.warn(msg, { namespace, args }),\n * error: (msg, ...args) => logger.error(msg, { namespace, args }),\n * }))\n * ```\n */\nexport function setLoggerFactory(f) {\n factory = f;\n}\n/**\n * Returns a {@link Logger} for `namespace` that delegates to whichever factory\n * is current at the time each method is called. The factory is consulted on\n * every call so that consumers can replace it (via {@link setLoggerFactory})\n * after the library's modules have already been imported.\n */\nexport function makeLogger(namespace) {\n return {\n debug: (message, ...args) => factory(namespace).debug(message, ...args),\n info: (message, ...args) => factory(namespace).info(message, ...args),\n warn: (message, ...args) => factory(namespace).warn(message, ...args),\n error: (message, ...args) => factory(namespace).error(message, ...args),\n };\n}\n//# sourceMappingURL=Logger.js.map","import * as Uuid from \"uuid\";\nimport bs58check from \"bs58check\";\nimport { uint8ArrayFromHexString, uint8ArrayToHexString, } from \"./helpers/bufferFromHex.js\";\nimport { parsePath, serializePath } from \"./subdoc-handles/parser.js\";\nimport { makeLogger } from \"./Logger.js\";\nconst log = makeLogger(\"automerge-repo:url\");\nexport const urlPrefix = \"automerge:\";\n/**\n * Parse an Automerge URL.\n *\n * Supported shapes:\n * - `automerge:<docId>`\n * - `automerge:<docId>#<heads>` (heads `|`-joined)\n * - `automerge:<docId>/<path>` (path `/`-joined segments)\n * - `automerge:<docId>/<path>#<heads>`\n *\n * `segments` is undefined when no path is present; otherwise it's the\n * parsed `Segment[]`.\n */\nexport const parseAutomergeUrl = (url) => {\n const [baseUrl, headsSection, ...rest] = url.split(\"#\");\n if (rest.length > 0) {\n throw new Error(\"Invalid URL: contains multiple heads sections\");\n }\n const match = baseUrl.match(new RegExp(`^${urlPrefix}([^/]+)(?:\\\\/(.*))?$`));\n if (!match)\n throw new Error(\"Invalid document URL: \" + url);\n const [, docMatch, pathStr] = match;\n const documentId = docMatch;\n const binaryDocumentId = documentIdToBinary(documentId);\n if (!binaryDocumentId)\n throw new Error(\"Invalid document URL: \" + url);\n const segments = pathStr !== undefined && pathStr.length > 0 ? parsePath(pathStr) : undefined;\n if (headsSection === undefined) {\n return segments\n ? { binaryDocumentId, documentId, segments }\n : { binaryDocumentId, documentId };\n }\n const heads = (headsSection === \"\" ? [] : headsSection.split(\"|\"));\n const hexHeads = heads.map(head => {\n try {\n return uint8ArrayToHexString(bs58check.decode(head));\n }\n catch (e) {\n throw new Error(`Invalid head in URL: ${head}`);\n }\n });\n return segments\n ? { binaryDocumentId, hexHeads, documentId, heads, segments }\n : { binaryDocumentId, hexHeads, documentId, heads };\n};\n/**\n * Given a documentId in either binary or base58check-encoded form, returns\n * an Automerge URL. Optionally accepts `segments` to construct a sub-tree\n * URL (`automerge:<docId>/seg/seg/...`) and `heads` to pin the URL to a\n * point in time. Throws on invalid input.\n */\nexport const stringifyAutomergeUrl = (arg) => {\n if (arg instanceof Uint8Array || typeof arg === \"string\") {\n return (urlPrefix +\n (arg instanceof Uint8Array\n ? binaryToDocumentId(arg)\n : arg));\n }\n const { documentId, heads = undefined, segments = undefined } = arg;\n if (documentId === undefined)\n throw new Error(\"Invalid documentId: \" + documentId);\n const encodedDocumentId = documentId instanceof Uint8Array\n ? binaryToDocumentId(documentId)\n : documentId;\n let url = `${urlPrefix}${encodedDocumentId}`;\n if (segments !== undefined && segments.length > 0) {\n url += \"/\" + serializePath(segments);\n }\n if (heads !== undefined) {\n heads.forEach(head => {\n try {\n bs58check.decode(head);\n }\n catch (e) {\n throw new Error(`Invalid head: ${head}`);\n }\n });\n // Sort so two heads arrays with the same content in different\n // orders produce identical URLs.\n url += \"#\" + [...heads].sort().join(\"|\");\n }\n return url;\n};\n/** Helper to extract just the heads from a URL if they exist */\nexport const getHeadsFromUrl = (url) => {\n const { heads } = parseAutomergeUrl(url);\n return heads;\n};\nexport const anyDocumentIdToAutomergeUrl = (id) => isValidAutomergeUrl(id)\n ? id\n : isValidDocumentId(id)\n ? stringifyAutomergeUrl({ documentId: id })\n : isValidUuid(id)\n ? parseLegacyUUID(id)\n : undefined;\n/**\n * Given a string, returns true if it is a valid Automerge URL. This function also acts as a type\n * discriminator in Typescript.\n */\nexport const isValidAutomergeUrl = (str) => {\n if (typeof str !== \"string\" || !str || !str.startsWith(urlPrefix))\n return false;\n try {\n const { documentId, heads } = parseAutomergeUrl(str);\n if (!isValidDocumentId(documentId))\n return false;\n if (heads &&\n !heads.every(head => {\n try {\n bs58check.decode(head);\n return true;\n }\n catch {\n return false;\n }\n }))\n return false;\n return true;\n }\n catch {\n return false;\n }\n};\nexport const isValidDocumentId = (str) => {\n if (typeof str !== \"string\")\n return false;\n // try to decode from base58\n const binaryDocumentID = documentIdToBinary(str);\n return binaryDocumentID !== undefined;\n};\nexport const isValidUuid = (str) => typeof str === \"string\" && Uuid.validate(str);\n/**\n * Returns a new Automerge URL with a random UUID documentId. Called by Repo.create(), and also used by tests.\n */\nexport const generateAutomergeUrl = () => {\n const documentId = Uuid.v4(undefined, new Uint8Array(16));\n return stringifyAutomergeUrl({ documentId });\n};\nexport const documentIdToBinary = (docId) => bs58check.decodeUnsafe(docId);\nexport const binaryToDocumentId = (docId) => bs58check.encode(docId);\nexport const encodeHeads = (heads) => heads.map(h => bs58check.encode(uint8ArrayFromHexString(h)));\nexport const decodeHeads = (heads) => heads.map(h => uint8ArrayToHexString(bs58check.decode(h)));\nexport const parseLegacyUUID = (str) => {\n if (!Uuid.validate(str))\n return undefined;\n const documentId = Uuid.parse(str);\n return stringifyAutomergeUrl({ documentId });\n};\n/**\n * Given any valid expression of a document ID, returns a DocumentId in base58check-encoded form.\n *\n * Currently supports:\n * - base58check-encoded DocumentId\n * - Automerge URL\n * - legacy UUID\n * - binary DocumentId\n *\n * Throws on invalid input.\n */\nexport const interpretAsDocumentId = (id) => {\n // binary\n if (id instanceof Uint8Array)\n return binaryToDocumentId(id);\n // url\n if (isValidAutomergeUrl(id))\n return parseAutomergeUrl(id).documentId;\n // base58check\n if (isValidDocumentId(id))\n return id;\n // legacy UUID\n if (isValidUuid(id)) {\n log.warn(\"Future versions will not support UUIDs as document IDs; use Automerge URLs instead.\");\n const binaryDocumentID = Uuid.parse(id);\n return binaryToDocumentId(binaryDocumentID);\n }\n // none of the above\n throw new Error(`Invalid AutomergeUrl: '${id}'`);\n};\n//# sourceMappingURL=AutomergeUrl.js.map","import { AnyDocumentId, DocHandle } from \"@automerge/automerge-repo/slim\"\nimport { PromiseWrapper, wrapPromise } from \"./wrapPromise.js\"\nimport { useRepo } from \"./useRepo.js\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { anyDocumentIdToAutomergeUrl } from \"../../automerge-repo/dist/AutomergeUrl.js\"\n\n// Shared with useDocHandles\nexport const wrapperCache = new Map<\n AnyDocumentId,\n PromiseWrapper<DocHandle<unknown>>\n>()\n// NB: this is a global cache that isn't keyed on the Repo\n// so if your app uses the same documents in two Repos\n// this could cause problems. please let me know if you do.\n\nexport interface UseDocHandleSuspendingParams {\n suspense: true\n}\nexport interface UseDocHandleSynchronousParams {\n suspense: false\n}\n\ntype UseDocHandleParams =\n | UseDocHandleSuspendingParams\n | UseDocHandleSynchronousParams\n\nexport function useDocHandle<T>(\n id: AnyDocumentId,\n params: UseDocHandleSuspendingParams\n): DocHandle<T>\nexport function useDocHandle<T>(\n id: AnyDocumentId | undefined,\n params?: UseDocHandleSynchronousParams\n): DocHandle<T> | undefined\nexport function useDocHandle<T>(\n id: AnyDocumentId | undefined,\n { suspense }: UseDocHandleParams = { suspense: false }\n): DocHandle<T> | undefined {\n const repo = useRepo()\n const controllerRef = useRef<AbortController | undefined>(undefined)\n const [handle, setHandle] = useState<DocHandle<T> | undefined>()\n\n let currentHandle: DocHandle<T> | undefined =\n // make sure the handle matches the id\n id && handle && handle.url === anyDocumentIdToAutomergeUrl(id)\n ? handle\n : undefined\n\n if (id && !currentHandle) {\n // if we haven't saved a handle yet, check if one is immediately available\n const progress = repo.findWithProgress<T>(id)\n const state = progress.peek()\n if (state.state === \"ready\") {\n currentHandle = state.handle\n }\n }\n\n let wrapper = id ? wrapperCache.get(id) : undefined\n if (!wrapper && id) {\n controllerRef.current?.abort()\n controllerRef.current = new AbortController()\n\n const promise = repo.find<T>(id, { signal: controllerRef.current.signal })\n wrapper = wrapPromise(promise)\n wrapperCache.set(id, wrapper)\n }\n\n /* From here we split into two paths: suspense and not.\n * In the suspense path, we return the wrapper directly.\n * In the non-suspense path, we wait for the promise to resolve\n * and then set the handle via setState. Suspense relies on\n * re-running this function until it succeeds, whereas the synchronous\n * form uses a setState to track the value. */\n useEffect(() => {\n if (currentHandle || suspense || !wrapper) {\n return\n }\n wrapper.promise\n .then(handle => {\n setHandle(handle as DocHandle<T>)\n })\n .catch(() => {\n setHandle(undefined)\n })\n }, [currentHandle, suspense, wrapper])\n\n if (currentHandle || !suspense || !wrapper) {\n return currentHandle\n }\n\n return wrapper.read() as DocHandle<T>\n}\n","import { AnyDocumentId } from \"@automerge/automerge-repo/slim\"\nimport { ChangeFn, ChangeOptions, Doc } from \"@automerge/automerge/slim\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useDocHandle } from \"./useDocHandle.js\"\n\n/**\n * A hook which returns a document and a function to change it.\n * Uses React Suspense for loading states, returning a tuple matching useState pattern.\n *\n * @example\n * ```tsx\n * function Counter() {\n * const [doc, changeDoc] = useDocument<{ count: number }>(docUrl)\n * return (\n * <button onClick={() => changeDoc(d => d.count++)}>\n * Count: {doc.count}\n * </button>\n * )\n * }\n *\n * // Must be wrapped in Suspense boundary\n * <Suspense fallback={<Loading />}>\n * <Counter />\n * </Suspense>\n * ```\n */\n\nexport interface UseDocumentSuspendingParams {\n suspense: true\n}\nexport interface UseDocumentSynchronousParams {\n suspense: false\n}\n\ntype UseDocumentParams =\n | UseDocumentSuspendingParams\n | UseDocumentSynchronousParams\n\nexport type UseDocumentReturn<T> = [\n Doc<T>,\n (changeFn: ChangeFn<T>, options?: ChangeOptions<T>) => void,\n]\n\nexport function useDocument<T>(\n id: AnyDocumentId,\n params: UseDocumentSuspendingParams\n): UseDocumentReturn<T>\nexport function useDocument<T>(\n id: AnyDocumentId | undefined,\n params?: UseDocumentSynchronousParams\n): UseDocumentReturn<T> | [undefined, () => void]\nexport function useDocument<T>(\n id: AnyDocumentId | undefined,\n params: UseDocumentParams = { suspense: false }\n): UseDocumentReturn<T> | [undefined, () => void] {\n // @ts-expect-error -- typescript doesn't realize we're discriminating these types the same way in both functions\n const handle = useDocHandle<T>(id, params)\n // Initialize with current doc state\n const [doc, setDoc] = useState<Doc<T> | undefined>(() => handle?.doc())\n const [deleteError, setDeleteError] = useState<Error>()\n\n // Reinitialize doc when handle changes\n useEffect(() => {\n setDoc(handle?.doc())\n }, [handle])\n\n useEffect(() => {\n if (!handle) {\n return\n }\n const onChange = () => setDoc(handle.doc())\n const onDelete = () => {\n setDeleteError(new Error(`Document ${id} was deleted`))\n }\n\n handle.on(\"change\", onChange)\n handle.on(\"delete\", onDelete)\n\n return () => {\n handle.removeListener(\"change\", onChange)\n handle.removeListener(\"delete\", onDelete)\n }\n }, [handle, id])\n\n const changeDoc = useCallback(\n (changeFn: ChangeFn<T>, options?: ChangeOptions<T>) => {\n handle!.change(changeFn, options)\n },\n [handle]\n )\n\n if (deleteError) {\n throw deleteError\n }\n\n if (!doc) {\n return [undefined, () => {}]\n }\n return [doc, changeDoc]\n}\n","import { useEffect, useState } from \"react\"\n\nexport function useSet<T>(items: T[]): Set<T> {\n const [set, setSet] = useState<Set<T>>(() => {\n return new Set<T>(items)\n })\n useEffect(() => {\n const newSet = new Set(items)\n if (identical(set, newSet)) {\n return\n }\n setSet(newSet)\n }, [set, items])\n return set\n}\n\nfunction identical<T>(s1: Set<T>, s2: Set<T>) {\n return s1.size === s2.size && Array.from(s1).every(v => s2.has(v))\n}\n","import { AutomergeUrl, DocHandle } from \"@automerge/automerge-repo/slim\"\nimport { useState, useEffect } from \"react\"\nimport { useRepo } from \"./useRepo.js\"\nimport { PromiseWrapper, wrapPromise } from \"./wrapPromise.js\"\nimport { wrapperCache } from \"./useDocHandle.js\"\nimport { useSet } from \"./helpers/useSet.js\"\n\nexport interface UseDocHandlesParams {\n suspense?: boolean\n}\n\nexport type DocHandleMap<T> = Map<AutomergeUrl, DocHandle<T> | undefined>\n\nexport function useDocHandles<T>(\n ids: AutomergeUrl[],\n { suspense = false }: UseDocHandlesParams = {}\n): DocHandleMap<T> {\n const idSet = useSet(ids)\n const repo = useRepo()\n const [handleMap, setHandleMap] = useState<DocHandleMap<T>>(() => {\n const map = new Map()\n\n // Initialize the map with any handles that are ready\n for (const id of idSet.values()) {\n let progress\n try {\n progress = repo.findWithProgress<T>(id)\n } catch (e) {\n continue\n }\n\n const state = progress.peek()\n if (state.state === \"ready\") {\n map.set(id, state.handle)\n }\n }\n\n return map\n })\n\n const pendingPromises: PromiseWrapper<DocHandle<T>>[] = []\n const nextHandleMap = new Map<AutomergeUrl, DocHandle<T> | undefined>()\n\n // Check if we need any new wrappers\n for (const id of idSet.values()) {\n let handle = handleMap.get(id)\n let wrapper = wrapperCache.get(id)\n if (!wrapper) {\n try {\n const promise = repo.find<T>(id)\n wrapper = wrapPromise(promise)\n wrapperCache.set(id, wrapper)\n } catch (e) {\n continue\n }\n }\n\n // Try to read each wrapper.\n // Update handleMap with any available handles,\n // and collect any pending promises\n try {\n handle ??= wrapper.read() as DocHandle<T>\n nextHandleMap.set(id, handle)\n } catch (e) {\n if (e instanceof Promise) {\n pendingPromises.push(wrapper as PromiseWrapper<DocHandle<T>>)\n } else {\n nextHandleMap.set(id, undefined)\n }\n }\n }\n\n // Suspense is handled quasi-synchronously below by throwing if we still have\n // unresolved promises.\n useEffect(() => {\n if (pendingPromises.length > 0) {\n void Promise.allSettled(pendingPromises.map(p => p.promise)).then(\n handles => {\n handles.forEach(r => {\n if (r.status === \"fulfilled\") {\n const h = r.value as DocHandle<T>\n nextHandleMap.set(h.url, h)\n }\n })\n setHandleMap(nextHandleMap)\n }\n )\n } else {\n setHandleMap(nextHandleMap)\n }\n }, [suspense, idSet])\n\n // If any promises are pending, suspend with Promise.all\n // Note that this behaviour is different from the synchronous\n // form where we get gradual load-in of child documents.\n // I couldn't find an obvious way of incremental loading with\n // a single hook for suspense.\n // (But maybe with suspense this hook is less useful?)\n if (suspense && pendingPromises.length > 0) {\n throw Promise.all(pendingPromises.map(p => p.promise))\n }\n\n return handleMap\n}\n","import { AutomergeUrl } from \"@automerge/automerge-repo/slim\"\nimport { ChangeFn, ChangeOptions, Doc } from \"@automerge/automerge/slim\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useDocHandles } from \"./useDocHandles.js\"\n\nexport type DocMap<T> = Map<AutomergeUrl, Doc<T>>\nexport type ChangeDocFn<T> = (\n id: AutomergeUrl,\n changeFn: ChangeFn<T>,\n options?: ChangeOptions<T>\n) => void\n\nexport interface UseDocumentsOptions {\n suspense?: boolean\n}\n\nexport function useDocuments<T>(\n ids: AutomergeUrl[],\n { suspense = true }: UseDocumentsOptions = {}\n): [DocMap<T>, ChangeDocFn<T>] {\n const handleMap = useDocHandles<T>(ids, { suspense })\n const [docMap, setDocMap] = useState<DocMap<T>>(() => {\n const docs: DocMap<T> = new Map()\n handleMap.forEach(handle => {\n const url = handle?.url\n if (url) {\n docs.set(url, handle?.doc() as Doc<T>)\n }\n })\n return docs\n })\n\n useEffect(() => {\n const listeners = new Map<AutomergeUrl, () => void>()\n\n handleMap.forEach((handle, id) => {\n if (handle) {\n const onChange = () => {\n setDocMap(prev => {\n const next = new Map(prev)\n next.set(id, handle.doc() as Doc<T>)\n return next\n })\n }\n\n // Initial state\n setDocMap(prev => {\n const next = new Map(prev)\n next.set(id, handle.doc() as Doc<T>)\n return next\n })\n\n handle.on(\"change\", onChange)\n listeners.set(id, onChange)\n }\n })\n\n // Clear docs that are no longer in handleMap\n setDocMap(prev => {\n const next = new Map(prev)\n for (const [id] of next) {\n if (!handleMap.has(id)) {\n next.delete(id)\n }\n }\n return next\n })\n\n return () => {\n handleMap.forEach((handle, id) => {\n const listener = listeners.get(id)\n if (handle && listener) {\n handle.removeListener(\"change\", listener)\n }\n })\n }\n }, [handleMap])\n\n const changeDoc = useCallback(\n (id: AutomergeUrl, changeFn: ChangeFn<T>, options?: ChangeOptions<T>) => {\n const handle = handleMap.get(id)\n if (handle) {\n handle.change(changeFn, options)\n }\n },\n [handleMap]\n )\n\n return [docMap, changeDoc]\n}\n","import {\n type Dispatch,\n type MutableRefObject,\n type SetStateAction,\n useCallback,\n useRef,\n useState,\n} from \"react\"\n\n/**\n * Like `useState`, but also returns a ref whose `.current` is updated\n * synchronously inside the setter — so callbacks can read the latest value\n * without waiting for a re-render.\n *\n * @privateRemarks\n * Not idiomatic — a stale-closure workaround, inlined (ESM) to replace the\n * CommonJS `react-usestateref` dependency, which does not bundle cleanly for\n * ESM/browser consumers. Used only by the two `@deprecated` awareness hooks\n * (`useLocalAwareness`/`useRemoteAwareness`); the replacement `usePresence` hook\n * does not use it. Prefer eliminating it: rewrite those hooks to use functional\n * state updaters for read-modify-write updates, and a plain ref synced in an\n * effect (or `useEffectEvent`) for reads inside long-lived callbacks — then\n * delete this helper.\n */\nexport function useStateRef<S>(\n initialState: S | (() => S)\n): [S, Dispatch<SetStateAction<S>>, MutableRefObject<S>] {\n const [state, setState] = useState(initialState)\n const ref = useRef(state)\n const dispatch = useCallback<Dispatch<SetStateAction<S>>>(setStateAction => {\n ref.current =\n typeof setStateAction === \"function\"\n ? (setStateAction as (prev: S) => S)(ref.current)\n : setStateAction\n setState(ref.current)\n }, [])\n return [state, dispatch, ref]\n}\n\nexport default useStateRef\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","import {\n DocHandle,\n DocHandleEphemeralMessagePayload,\n} from \"@automerge/automerge-repo/slim\"\nimport { useEffect } from \"react\"\nimport useStateRef from \"./useStateRef.js\"\nimport { EventEmitter } from \"eventemitter3\"\n\n// Emits new_peer event when a new peer is seen\nexport const peerEvents = new EventEmitter()\n\nexport interface UseRemoteAwarenessProps<T> {\n /** The handle to receive ephemeral state on */\n handle?: DocHandle<T>\n /** Our user ID */\n localUserId?: string\n /** How long to wait (in ms) before marking a peer as offline */\n offlineTimeout?: number\n /** Function to provide current epoch time */\n getTime?: () => number\n}\n\n/** A map from peer ID to their state */\nexport type PeerStates = Record<string, any>\n/** A map from peer ID to their last heartbeat timestamp */\nexport type Heartbeats = Record<string, number>\n\n/**\n * @deprecated use the usePresence hook instead\n *\n * This hook returns read-only state for remote clients.\n * It also returns their heartbeat status.\n * It is intended to be used alongside useLocalAwareness.\n *\n * @returns [ peerStates: { [userId]: state, ... }, { [userId]: heartbeatEpochTime, ...} ]\n */\nexport const useRemoteAwareness = <T>({\n handle,\n localUserId,\n offlineTimeout = 30000,\n getTime = () => new Date().getTime(),\n}: UseRemoteAwarenessProps<T>): [PeerStates, Heartbeats] => {\n // TODO: You should be able to use multiple instances of this hook on the same handle (write test)\n // TODO: This should support some kind of caching or memoization when switching between channelIDs\n const [peerStates, setPeerStates, peerStatesRef] = useStateRef<PeerStates>({})\n const [heartbeats, setHeartbeats, heartbeatsRef] = useStateRef<Heartbeats>({})\n useEffect(() => {\n if (!handle) {\n return\n }\n\n // Receive incoming message\n const handleIncomingUpdate = (\n event: DocHandleEphemeralMessagePayload<T>\n ) => {\n const [userId, state] = event.message as [string, unknown]\n if (userId === localUserId) return\n if (!heartbeatsRef.current[userId]) peerEvents.emit(\"new_peer\", event) // Let useLocalAwareness know we've seen a new peer\n setPeerStates({\n ...peerStatesRef.current,\n [userId]: state,\n })\n setHeartbeats({\n ...heartbeatsRef.current,\n [userId]: getTime(),\n })\n }\n // Remove peers we haven't seen recently\n const pruneOfflinePeers = () => {\n const peerStates = { ...peerStatesRef.current }\n const heartbeats = { ...heartbeatsRef.current }\n const time = getTime()\n let hasChanges = false\n for (const key in heartbeats) {\n if (time - heartbeats[key] > offlineTimeout) {\n delete peerStates[key]\n delete heartbeats[key]\n hasChanges = true\n }\n }\n if (hasChanges) {\n setPeerStates(peerStates)\n setHeartbeats(heartbeats)\n }\n }\n handle.on(\"ephemeral-message\", handleIncomingUpdate)\n // Check for offline peers every `offlineTimeout` ms\n const pruneOfflinePeersIntervalId = setInterval(\n pruneOfflinePeers,\n offlineTimeout\n )\n return () => {\n handle.removeListener(\"ephemeral-message\", handleIncomingUpdate)\n clearInterval(pruneOfflinePeersIntervalId)\n }\n }, [handle, localUserId, offlineTimeout, getTime])\n\n return [peerStates, heartbeats]\n}\n","import { useEffect } from \"react\"\nimport useStateRef from \"./useStateRef.js\"\nimport { peerEvents } from \"./useRemoteAwareness.js\"\nimport { DocHandle } from \"@automerge/automerge-repo/slim\"\n\nexport interface UseLocalAwarenessProps {\n /** The document handle to send ephemeral state on */\n handle?: DocHandle<unknown>\n /** Our user ID **/\n userId: string\n /** The initial state object/primitive we should advertise */\n initialState: any\n /** How frequently to send heartbeats */\n heartbeatTime?: number\n}\n/**\n * @deprecated use the usePresence hook instead\n *\n * This hook maintains state for the local client.\n * Like React.useState, it returns a [state, setState] array.\n * It is intended to be used alongside useRemoteAwareness.\n *\n * When state is changed it is broadcast to all clients.\n * It also broadcasts a heartbeat to let other clients know it is online.\n *\n * Note that userIds aren't secure (yet). Any client can lie about theirs.\n *\n * @returns [state, setState]\n */\nexport const useLocalAwareness = ({\n handle,\n userId,\n initialState,\n heartbeatTime = 15000,\n}: UseLocalAwarenessProps) => {\n const [localState, setLocalState, localStateRef] = useStateRef(initialState)\n\n const setState = (stateOrUpdater: any) => {\n const state =\n typeof stateOrUpdater === \"function\"\n ? stateOrUpdater(localStateRef.current)\n : stateOrUpdater\n setLocalState(state)\n // TODO: Send deltas instead of entire state\n if (handle) {\n handle.broadcast([userId, state])\n }\n }\n\n useEffect(() => {\n // Don't broadcast if userId or handle isn't set: this avoids bogus broadcasts\n // during the loading of a userId document or handle.\n if (!userId || !handle) {\n return\n }\n\n // Send periodic heartbeats\n const heartbeat = () =>\n void handle.broadcast([userId, localStateRef.current])\n heartbeat() // Initial heartbeat\n // TODO: we don't need to send a heartbeat if we've changed state recently; use recursive setTimeout instead of setInterval\n const heartbeatIntervalId = setInterval(heartbeat, heartbeatTime)\n return () => void clearInterval(heartbeatIntervalId)\n }, [handle, userId, heartbeatTime])\n\n useEffect(() => {\n // Send entire state to new peers\n if (!handle || !userId) {\n return\n }\n\n let broadcastTimeoutId: ReturnType<typeof setTimeout>\n const newPeerEvents = peerEvents.on(\"new_peer\", () => {\n broadcastTimeoutId = setTimeout(\n () => handle.broadcast([userId, localStateRef.current]),\n 500 // Wait for the peer to be ready\n )\n })\n return () => {\n newPeerEvents.off(\"new_peer\")\n broadcastTimeoutId && clearTimeout(broadcastTimeoutId)\n }\n }, [handle, userId, peerEvents])\n\n // TODO: Send an \"offline\" message on unmount\n // useEffect(\n // () => () => void handle.broadcast(null), // Same as Yjs awareness\n // []\n // );\n\n return [localState, setState]\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport {\n Presence,\n PresenceConfig,\n DocHandle,\n PeerStateView,\n PresenceState,\n} from \"@automerge/automerge-repo/slim\"\n\nexport type UsePresenceConfig<State extends PresenceState> =\n PresenceConfig<State> & {\n handle: DocHandle<unknown>\n }\n\nexport type UsePresenceResult<State extends PresenceState> = {\n /**\n * Presence view of our peers.\n */\n peerStates: PeerStateView<State>\n /**\n * Our own presence state, as last set by `update` or the initial value.\n */\n localState: State | undefined\n /**\n * Update our presence state for the given channel and broadcast\n * it to our peers.\n *\n * @param channel\n * @param value\n */\n update: <Channel extends keyof State>(\n channel: Channel,\n value: State[Channel]\n ) => void\n /**\n * Resume presence broadcasting and listening to peer presence.\n *\n * Note that this only needs to be called after `stop` has been called:\n * usePresence starts running immediately.\n */\n start: (config?: Partial<PresenceConfig<State>>) => void\n /**\n * Stop broadcasting presence state and listening to peer presence.\n */\n stop: () => void\n}\n\n/**\n * This hook encapsulates ephemeral state communication for a specific doc\n * handle. It tracks caller-provided local state and broadcasts that state to\n * all peers. It sends periodic heartbeats when there are no state updates.\n *\n * It also tracks ephemeral state broadcast by peers and forces a re-render when\n * the state of a peer changes.\n *\n * It cleans up (stops sending heartbeats and processing ephemeral messages)\n * when it unmounts.\n *\n * It is implemented using {@link Presence}.\n *\n * @param config - see {@link UsePresenceConfig}. Note that initialState only\n * determines the initial value. Updates to this param will not trigger a\n * re-render of the hook.\n *\n * @returns see {@link UsePresenceResult}\n */\nexport function usePresence<State extends PresenceState>({\n handle,\n initialState,\n heartbeatMs,\n peerTtlMs,\n}: UsePresenceConfig<State>): UsePresenceResult<State> {\n const [localState, setLocalState] = useState<State>(initialState)\n const [peerStates, setPeerStates] = useState(new PeerStateView<State>({}))\n // Don't re-render based on changes to these: they are not expected to\n // change but may be passed in as object literals\n const firstOpts = useRef({\n heartbeatMs,\n peerTtlMs,\n })\n const firstInitialState = useRef(initialState)\n const [presence] = useState(() => new Presence<State>({ handle }))\n\n useEffect(() => {\n presence.start({\n initialState: firstInitialState.current,\n ...firstOpts.current,\n })\n presence.on(\"heartbeat\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"snapshot\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"update\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"goodbye\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"pruning\", () => setPeerStates(presence.getPeerStates()))\n\n return () => {\n presence.stop()\n }\n }, [presence, firstInitialState, firstOpts])\n\n const start = useCallback(\n (config?: Partial<PresenceConfig<State>>) => {\n // Fall back to the last state if not provided when restarting\n const initialState = config?.initialState ?? presence.getLocalState()\n const opts = {\n ...firstOpts.current,\n ...config,\n initialState,\n }\n presence.start(opts)\n },\n [presence, firstOpts]\n )\n const stop = useCallback(() => {\n presence.stop()\n }, [presence])\n\n const update = useCallback(\n <Channel extends keyof State>(channel: Channel, msg: State[Channel]) => {\n presence.broadcast(channel, msg)\n const updated = presence.getLocalState()\n setLocalState(updated)\n },\n [presence]\n )\n\n return {\n peerStates,\n localState,\n update,\n start,\n stop,\n }\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,16,17,18,27,28],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["REGEX","sha256","sha256n","basex","base58","bs58checkBase"],"sources":["../src/wrapPromise.ts","../src/useRepo.ts","../../../node_modules/.pnpm/uuid@14.0.1/node_modules/uuid/dist/regex.js","../../../node_modules/.pnpm/uuid@14.0.1/node_modules/uuid/dist/validate.js","../../../node_modules/.pnpm/uuid@14.0.1/node_modules/uuid/dist/parse.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js","../../../node_modules/.pnpm/base-x@5.0.1/node_modules/base-x/src/esm/index.js","../../../node_modules/.pnpm/bs58@6.0.0/node_modules/bs58/src/esm/index.js","../../../node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/base.js","../../../node_modules/.pnpm/bs58check@4.0.0/node_modules/bs58check/src/esm/index.js","../../automerge-repo/dist/helpers/bufferFromHex.js","../../automerge-repo/dist/subdoc-handles/types.js","../../automerge-repo/dist/subdoc-handles/parser.js","../../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/common.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/browser.js","../../automerge-repo/dist/Logger.js","../../automerge-repo/dist/AutomergeUrl.js","../src/useDocHandle.ts","../src/useDocument.ts","../src/helpers/useSet.ts","../src/useDocHandles.ts","../src/useDocuments.ts","../src/useStateRef.ts","../../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.js","../../../node_modules/.pnpm/eventemitter3@5.0.4/node_modules/eventemitter3/index.mjs","../src/useRemoteAwareness.ts","../src/useLocalAwareness.ts","../src/usePresence.ts"],"sourcesContent":["type Status = \"pending\" | \"success\" | \"error\"\n\nexport type PromiseWrapper<T> = {\n promise: Promise<T>\n read(): T\n}\n\nexport function wrapPromise<T>(promise: Promise<T>): PromiseWrapper<T> {\n let status: Status = \"pending\"\n let result: T\n let error: Error\n\n const suspender = promise.then(\n data => {\n status = \"success\"\n result = data\n },\n err => {\n status = \"error\"\n error = err\n }\n )\n\n return {\n promise,\n read(): T {\n switch (status) {\n case \"pending\":\n throw suspender\n case \"error\":\n throw error\n case \"success\":\n return result\n }\n },\n }\n}\n","import { Repo } from \"@automerge/automerge-repo/slim\"\nimport { createContext, useContext } from \"react\"\n\n/** A [React context](https://react.dev/learn/passing-data-deeply-with-context) which provides access to an Automerge repo. */\nexport const RepoContext = createContext<Repo | null>(null)\n\n/** A [React hook](https://reactjs.org/docs/hooks-intro.html) which returns the Automerge repo from {@link RepoContext}. */\nexport function useRepo(): Repo {\n const repo = useContext(RepoContext)\n if (!repo) throw new Error(\"Repo was not found on RepoContext.\")\n return repo\n}\n","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;\n","import REGEX from './regex.js';\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\nexport default validate;\n","import validate from './validate.js';\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n let v;\n return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff);\n}\nexport default parse;\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 * 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 * 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","// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\nfunction base (ALPHABET) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n const BASE_MAP = new Uint8Array(256)\n for (let j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255\n }\n for (let i = 0; i < ALPHABET.length; i++) {\n const x = ALPHABET.charAt(i)\n const xc = x.charCodeAt(0)\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i\n }\n const BASE = ALPHABET.length\n const LEADER = ALPHABET.charAt(0)\n const FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\n const iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\n function encode (source) {\n // eslint-disable-next-line no-empty\n if (source instanceof Uint8Array) { } else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength)\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source)\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n let zeroes = 0\n let length = 0\n let pbegin = 0\n const pend = source.length\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++\n zeroes++\n }\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0\n const b58 = new Uint8Array(size)\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = source[pbegin]\n // Apply \"b58 = b58 * 256 + ch\".\n let i = 0\n for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0\n b58[it1] = (carry % BASE) >>> 0\n carry = (carry / BASE) >>> 0\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i\n pbegin++\n }\n // Skip leading zeroes in base58 result.\n let it2 = size - length\n while (it2 !== size && b58[it2] === 0) {\n it2++\n }\n // Translate the result into a string.\n let str = LEADER.repeat(zeroes)\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) }\n return str\n }\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n let psz = 0\n // Skip and count leading '1's.\n let zeroes = 0\n let length = 0\n while (source[psz] === LEADER) {\n zeroes++\n psz++\n }\n // Allocate enough space in big-endian base256 representation.\n const size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up.\n const b256 = new Uint8Array(size)\n // Process the characters.\n while (psz < source.length) {\n // Find code of next character\n const charCode = source.charCodeAt(psz)\n // Base map can not be indexed using char code\n if (charCode > 255) { return }\n // Decode character\n let carry = BASE_MAP[charCode]\n // Invalid character\n if (carry === 255) { return }\n let i = 0\n for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0\n b256[it3] = (carry % 256) >>> 0\n carry = (carry / 256) >>> 0\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i\n psz++\n }\n // Skip leading zeroes in b256.\n let it4 = size - length\n while (it4 !== size && b256[it4] === 0) {\n it4++\n }\n const vch = new Uint8Array(zeroes + (size - it4))\n let j = zeroes\n while (it4 !== size) {\n vch[j++] = b256[it4++]\n }\n return vch\n }\n function decode (string) {\n const buffer = decodeUnsafe(string)\n if (buffer) { return buffer }\n throw new Error('Non-base' + BASE + ' character')\n }\n return {\n encode,\n decodeUnsafe,\n decode\n }\n}\nexport default base\n","import basex from 'base-x';\nvar ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\nexport default basex(ALPHABET);\n","'use strict';\nimport base58 from 'bs58';\nexport default function (checksumFn) {\n // Encode a buffer as a base58-check encoded string\n function encode(payload) {\n var payloadU8 = Uint8Array.from(payload);\n var checksum = checksumFn(payloadU8);\n var length = payloadU8.length + 4;\n var both = new Uint8Array(length);\n both.set(payloadU8, 0);\n both.set(checksum.subarray(0, 4), payloadU8.length);\n return base58.encode(both);\n }\n function decodeRaw(buffer) {\n var payload = buffer.slice(0, -4);\n var checksum = buffer.slice(-4);\n var newChecksum = checksumFn(payload);\n // eslint-disable-next-line\n if (checksum[0] ^ newChecksum[0] |\n checksum[1] ^ newChecksum[1] |\n checksum[2] ^ newChecksum[2] |\n checksum[3] ^ newChecksum[3])\n return;\n return payload;\n }\n // Decode a base58-check encoded string to a buffer, no result if checksum is wrong\n function decodeUnsafe(str) {\n var buffer = base58.decodeUnsafe(str);\n if (buffer == null)\n return;\n return decodeRaw(buffer);\n }\n function decode(str) {\n var buffer = base58.decode(str);\n var payload = decodeRaw(buffer);\n if (payload == null)\n throw new Error('Invalid checksum');\n return payload;\n }\n return {\n encode: encode,\n decode: decode,\n decodeUnsafe: decodeUnsafe\n };\n}\n","'use strict';\nimport { sha256 } from '@noble/hashes/sha256';\nimport bs58checkBase from './base.js';\n// SHA256(SHA256(buffer))\nfunction sha256x2(buffer) {\n return sha256(sha256(buffer));\n}\nexport default bs58checkBase(sha256x2);\n","export const uint8ArrayFromHexString = (hexString) => {\n if (hexString.length % 2 !== 0) {\n throw new Error(\"Hex string must have an even length\");\n }\n const bytes = new Uint8Array(hexString.length / 2);\n for (let i = 0; i < hexString.length; i += 2) {\n bytes[i >> 1] = parseInt(hexString.slice(i, i + 2), 16);\n }\n return bytes;\n};\nexport const uint8ArrayToHexString = (data) => {\n return Array.from(data, byte => byte.toString(16).padStart(2, \"0\")).join(\"\");\n};\n//# sourceMappingURL=bufferFromHex.js.map","/**\n * Symbol used as discriminator for segments to avoid collision with user data.\n * Users might have objects with a 'kind' property in id patterns.\n */\nexport const KIND = \"AUTOMERGE_REF_KIND\";\n/**\n * Symbol to mark a cursor request for stabilization during sub-handle creation.\n */\nexport const CURSOR_MARKER = \"AUTOMERGE_REF_CURSOR_MARKER\";\n//# sourceMappingURL=types.js.map","import { KIND } from \"./types.js\";\n/**\n * # Path Segment Encoding Scheme\n *\n * | Type | Format | Example | Notes |\n * |---------|---------------------|----------------------------|---------------------------------|\n * | Key | string | `foo`, `my%2Fkey` | Default, URL-encoded |\n * | Index | `@` + number | `@0`, `@42` | Array index |\n * | Match | `{...}` | `{\"id\":\"alice\"}` | JSON object pattern (URL-encoded) |\n * | Cursors | `[start-end]` | `[2@abc-5@def]` | Cursor range |\n * | Cursors | `[cursor]` | `[2@abc]` | Collapsed (start === end) |\n *\n * ## Escape Rule\n * If a key starts with `@`, `{`, `[`, or `\\`, prefix with `\\` (URL-encoded as `%5C`):\n * - `\\@at` → key \"@at\" (appears as `%5C%40at` in URL)\n * - `\\{brace` → key \"{brace\" (appears as `%5C%7Bbrace` in URL)\n * - `\\\\backslash` → key \"\\backslash\" (appears as `%5C%5Cbackslash` in URL)\n *\n * ## Parsing Priority (first match wins)\n * 1. Index: `@` + digits\n * 2. Match: `{...}` or URL-encoded `%7B...`\n * 3. Cursors: `[...]`\n * 4. Key: `\\...` (escaped, URL-encoded as `%5C...`) or anything else\n */\n/** The escape character (backslash) */\nconst ESCAPE_CHAR = \"\\\\\";\n/** URL-encoded form of the escape character for matching in URLs */\nconst ESCAPE_PREFIX = \"%5C\";\nconst INDEX_PREFIX = \"@\";\nconst CURSOR_OPEN = \"[\";\nconst CURSOR_CLOSE = \"]\";\nconst CURSOR_SEPARATOR = \"-\";\n/** Characters that trigger escaping when at the start of a key */\nconst ESCAPE_TRIGGERS = [ESCAPE_CHAR, INDEX_PREFIX, \"{\", CURSOR_OPEN];\nconst INDEX_PATTERN = /^@(\\d+)$/;\nconst indexCodec = {\n kind: \"index\",\n match: s => INDEX_PATTERN.test(s),\n parse: s => {\n const m = s.match(INDEX_PATTERN);\n if (!m)\n throw new Error(`Invalid index: ${s}`);\n return { [KIND]: \"index\", index: parseInt(m[1], 10) };\n },\n serialize: seg => `${INDEX_PREFIX}${seg.index}`,\n};\nconst matchCodec = {\n kind: \"match\",\n // Match both raw JSON and URL-encoded JSON\n match: s => s.startsWith(\"{\") || s.startsWith(\"%7B\"),\n parse: s => {\n try {\n // Decode URL encoding first, then parse JSON\n // This handles both URL-encoded and raw JSON formats\n const decoded = decodeURIComponent(s);\n const parsed = JSON.parse(decoded);\n if (typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)) {\n throw new Error(\"Match pattern must be a plain object\");\n }\n return { [KIND]: \"match\", match: parsed };\n }\n catch (e) {\n throw new Error(`Invalid match pattern: ${s}. ${e instanceof Error ? e.message : \"\"}`);\n }\n },\n // Serialize with sorted keys so `{a:1,b:2}` and `{b:2,a:1}` produce\n // identical URLs (they're semantically the same pattern). Also URL-\n // encode the JSON to protect `/` and other path-significant chars.\n serialize: seg => encodeURIComponent(JSON.stringify(Object.fromEntries(Object.keys(seg.match)\n .sort()\n .map(k => [k, seg.match[k]])))),\n};\nconst cursorsCodec = {\n kind: \"cursors\",\n match: s => s.startsWith(CURSOR_OPEN) && s.endsWith(CURSOR_CLOSE),\n parse: s => {\n const inner = s.slice(1, -1);\n if (!inner) {\n throw new Error(\"Invalid cursor range: empty brackets\");\n }\n const sepIndex = inner.indexOf(CURSOR_SEPARATOR);\n if (sepIndex === -1) {\n const cursor = inner;\n return { [KIND]: \"cursors\", start: cursor, end: cursor };\n }\n const start = inner.slice(0, sepIndex);\n const end = inner.slice(sepIndex + 1);\n if (!start || !end) {\n throw new Error(`Invalid cursor range: ${s}. Expected format: [cursor] or [start-end]`);\n }\n return { [KIND]: \"cursors\", start, end };\n },\n serialize: seg => {\n if (seg.start === seg.end) {\n return `${CURSOR_OPEN}${seg.start}${CURSOR_CLOSE}`;\n }\n return `${CURSOR_OPEN}${seg.start}${CURSOR_SEPARATOR}${seg.end}${CURSOR_CLOSE}`;\n },\n};\nconst keyCodec = {\n kind: \"key\",\n match: s => {\n // Escaped keys start with backslash (URL-encoded as %5C)\n if (s.startsWith(ESCAPE_PREFIX) || s.startsWith(ESCAPE_CHAR)) {\n return true;\n }\n // Regular keys don't start with special prefixes\n // We need to check both raw and URL-decoded forms\n const decoded = safeDecodeURIComponent(s);\n return !ESCAPE_TRIGGERS.some(p => s.startsWith(p) || decoded.startsWith(p));\n },\n parse: s => {\n // Check for URL-encoded escape prefix (%5C) or literal backslash\n if (s.startsWith(ESCAPE_PREFIX)) {\n return {\n [KIND]: \"key\",\n key: decodeURIComponent(s.slice(ESCAPE_PREFIX.length)),\n };\n }\n if (s.startsWith(ESCAPE_CHAR)) {\n return {\n [KIND]: \"key\",\n key: decodeURIComponent(s.slice(ESCAPE_CHAR.length)),\n };\n }\n return { [KIND]: \"key\", key: decodeURIComponent(s) };\n },\n serialize: seg => {\n // Empty keys don't round-trip through a slash-delimited URL path.\n if (seg.key === \"\") {\n throw new Error(\"Path keys cannot be empty strings\");\n }\n // Check if key starts with any character that needs escaping\n const needsEscape = ESCAPE_TRIGGERS.some(p => seg.key.startsWith(p));\n const encoded = encodeURIComponent(seg.key);\n // Prefix with URL-encoded backslash (%5C) if escape needed\n return needsEscape ? `${ESCAPE_PREFIX}${encoded}` : encoded;\n },\n};\n/** Safely decode URI component, returning original string on error */\nfunction safeDecodeURIComponent(s) {\n try {\n return decodeURIComponent(s);\n }\n catch {\n return s;\n }\n}\n/**\n * Codecs in priority order. First matching codec wins for parsing.\n * Order: index → match → cursors → key (key is catch-all, must be last)\n */\nconst SEGMENT_CODECS = [indexCodec, matchCodec, cursorsCodec, keyCodec];\nexport function parseSegment(segment) {\n for (const codec of SEGMENT_CODECS) {\n if (codec.match(segment)) {\n return codec.parse(segment);\n }\n }\n throw new Error(`Invalid segment: \"${segment}\"`);\n}\n// ⇧ Parse --- Serialize ⇩\nexport function serializeSegment(segment) {\n for (const codec of SEGMENT_CODECS) {\n if (segment[KIND] === codec.kind) {\n return codec.serialize(segment);\n }\n }\n throw new Error(`No codec found for segment kind: ${segment[KIND]}`);\n}\nexport function parsePath(path) {\n if (!path)\n return [];\n const trimmed = path.replace(/^\\/+|\\/+$/g, \"\");\n if (!trimmed) {\n throw new Error(\"Invalid path: path cannot be empty or consist only of slashes\");\n }\n if (trimmed.includes(\"//\")) {\n throw new Error(\"Invalid path: contains empty segment (double slash)\");\n }\n return trimmed.split(\"/\").map(parseSegment);\n}\n// ⇧ Parse --- Serialize ⇩\nexport function serializePath(segments) {\n return segments.map(serializeSegment).join(\"/\");\n}\n//# sourceMappingURL=parser.js.map","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","import debug from \"debug\";\n// `.debug` is routed through the `debug` package for namespace-based filtering\n// via `DEBUG=automerge-repo:*`; the rest go straight to `console`.\nconst defaultFactory = namespace => {\n const trace = debug(namespace);\n const prefix = `[${namespace}]`;\n return {\n debug: (message, ...args) => trace(message, ...args),\n info: (message, ...args) => console.info(prefix, message, ...args),\n warn: (message, ...args) => console.warn(prefix, message, ...args),\n error: (message, ...args) => console.error(prefix, message, ...args),\n };\n};\nlet factory = defaultFactory;\n/**\n * Replace the global logger factory. All subsequent {@link makeLogger} calls use it.\n *\n * Call once at startup to route automerge-repo output through your own logger.\n * The factory receives a namespace such as `automerge-repo:repo` or\n * `automerge-repo:docsync:abc12` for each subsystem instance.\n *\n * @example\n * ```ts\n * import { setLoggerFactory } from \"@automerge/automerge-repo\"\n * import winston from \"winston\"\n *\n * const logger = winston.createLogger({ ... })\n *\n * setLoggerFactory(namespace => ({\n * debug: (msg, ...args) => logger.debug(msg, { namespace, args }),\n * info: (msg, ...args) => logger.info(msg, { namespace, args }),\n * warn: (msg, ...args) => logger.warn(msg, { namespace, args }),\n * error: (msg, ...args) => logger.error(msg, { namespace, args }),\n * }))\n * ```\n */\nexport function setLoggerFactory(f) {\n factory = f;\n}\n/**\n * Returns a {@link Logger} for `namespace` that delegates to whichever factory\n * is current at the time each method is called. The factory is consulted on\n * every call so that consumers can replace it (via {@link setLoggerFactory})\n * after the library's modules have already been imported.\n */\nexport function makeLogger(namespace) {\n return {\n debug: (message, ...args) => factory(namespace).debug(message, ...args),\n info: (message, ...args) => factory(namespace).info(message, ...args),\n warn: (message, ...args) => factory(namespace).warn(message, ...args),\n error: (message, ...args) => factory(namespace).error(message, ...args),\n };\n}\n//# sourceMappingURL=Logger.js.map","import * as Uuid from \"uuid\";\nimport bs58check from \"bs58check\";\nimport { uint8ArrayFromHexString, uint8ArrayToHexString, } from \"./helpers/bufferFromHex.js\";\nimport { parsePath, serializePath } from \"./subdoc-handles/parser.js\";\nimport { makeLogger } from \"./Logger.js\";\nconst log = makeLogger(\"automerge-repo:url\");\nexport const urlPrefix = \"automerge:\";\n/**\n * Parse an Automerge URL.\n *\n * Supported shapes:\n * - `automerge:<docId>`\n * - `automerge:<docId>#<heads>` (heads `|`-joined)\n * - `automerge:<docId>/<path>` (path `/`-joined segments)\n * - `automerge:<docId>/<path>#<heads>`\n *\n * `segments` is undefined when no path is present; otherwise it's the\n * parsed `Segment[]`.\n */\nexport const parseAutomergeUrl = (url) => {\n const [baseUrl, headsSection, ...rest] = url.split(\"#\");\n if (rest.length > 0) {\n throw new Error(\"Invalid URL: contains multiple heads sections\");\n }\n const match = baseUrl.match(new RegExp(`^${urlPrefix}([^/]+)(?:\\\\/(.*))?$`));\n if (!match)\n throw new Error(\"Invalid document URL: \" + url);\n const [, docMatch, pathStr] = match;\n const documentId = docMatch;\n const binaryDocumentId = documentIdToBinary(documentId);\n if (!binaryDocumentId)\n throw new Error(\"Invalid document URL: \" + url);\n const segments = pathStr !== undefined && pathStr.length > 0 ? parsePath(pathStr) : undefined;\n if (headsSection === undefined) {\n return segments\n ? { binaryDocumentId, documentId, segments }\n : { binaryDocumentId, documentId };\n }\n const heads = (headsSection === \"\" ? [] : headsSection.split(\"|\"));\n const hexHeads = heads.map(head => {\n try {\n return uint8ArrayToHexString(bs58check.decode(head));\n }\n catch (e) {\n throw new Error(`Invalid head in URL: ${head}`);\n }\n });\n return segments\n ? { binaryDocumentId, hexHeads, documentId, heads, segments }\n : { binaryDocumentId, hexHeads, documentId, heads };\n};\n/**\n * Given a documentId in either binary or base58check-encoded form, returns\n * an Automerge URL. Optionally accepts `segments` to construct a sub-tree\n * URL (`automerge:<docId>/seg/seg/...`) and `heads` to pin the URL to a\n * point in time. Throws on invalid input.\n */\nexport const stringifyAutomergeUrl = (arg) => {\n if (arg instanceof Uint8Array || typeof arg === \"string\") {\n return (urlPrefix +\n (arg instanceof Uint8Array\n ? binaryToDocumentId(arg)\n : arg));\n }\n const { documentId, heads = undefined, segments = undefined } = arg;\n if (documentId === undefined)\n throw new Error(\"Invalid documentId: \" + documentId);\n const encodedDocumentId = documentId instanceof Uint8Array\n ? binaryToDocumentId(documentId)\n : documentId;\n let url = `${urlPrefix}${encodedDocumentId}`;\n if (segments !== undefined && segments.length > 0) {\n url += \"/\" + serializePath(segments);\n }\n if (heads !== undefined) {\n heads.forEach(head => {\n try {\n bs58check.decode(head);\n }\n catch (e) {\n throw new Error(`Invalid head: ${head}`);\n }\n });\n // Sort so two heads arrays with the same content in different\n // orders produce identical URLs.\n url += \"#\" + [...heads].sort().join(\"|\");\n }\n return url;\n};\n/** Helper to extract just the heads from a URL if they exist */\nexport const getHeadsFromUrl = (url) => {\n const { heads } = parseAutomergeUrl(url);\n return heads;\n};\nexport const anyDocumentIdToAutomergeUrl = (id) => isValidAutomergeUrl(id)\n ? id\n : isValidDocumentId(id)\n ? stringifyAutomergeUrl({ documentId: id })\n : isValidUuid(id)\n ? parseLegacyUUID(id)\n : undefined;\n/**\n * Given a string, returns true if it is a valid Automerge URL. This function also acts as a type\n * discriminator in Typescript.\n */\nexport const isValidAutomergeUrl = (str) => {\n if (typeof str !== \"string\" || !str || !str.startsWith(urlPrefix))\n return false;\n try {\n const { documentId, heads } = parseAutomergeUrl(str);\n if (!isValidDocumentId(documentId))\n return false;\n if (heads &&\n !heads.every(head => {\n try {\n bs58check.decode(head);\n return true;\n }\n catch {\n return false;\n }\n }))\n return false;\n return true;\n }\n catch {\n return false;\n }\n};\nexport const isValidDocumentId = (str) => {\n if (typeof str !== \"string\")\n return false;\n // try to decode from base58\n const binaryDocumentID = documentIdToBinary(str);\n return binaryDocumentID !== undefined;\n};\nexport const isValidUuid = (str) => typeof str === \"string\" && Uuid.validate(str);\n/**\n * Returns a new Automerge URL with a random UUID documentId. Called by Repo.create(), and also used by tests.\n */\nexport const generateAutomergeUrl = () => {\n const documentId = Uuid.v4(undefined, new Uint8Array(16));\n return stringifyAutomergeUrl({ documentId });\n};\nexport const documentIdToBinary = (docId) => bs58check.decodeUnsafe(docId);\nexport const binaryToDocumentId = (docId) => bs58check.encode(docId);\nexport const encodeHeads = (heads) => heads.map(h => bs58check.encode(uint8ArrayFromHexString(h)));\nexport const decodeHeads = (heads) => heads.map(h => uint8ArrayToHexString(bs58check.decode(h)));\nexport const parseLegacyUUID = (str) => {\n if (!Uuid.validate(str))\n return undefined;\n const documentId = Uuid.parse(str);\n return stringifyAutomergeUrl({ documentId });\n};\n/**\n * Given any valid expression of a document ID, returns a DocumentId in base58check-encoded form.\n *\n * Currently supports:\n * - base58check-encoded DocumentId\n * - Automerge URL\n * - legacy UUID\n * - binary DocumentId\n *\n * Throws on invalid input.\n */\nexport const interpretAsDocumentId = (id) => {\n // binary\n if (id instanceof Uint8Array)\n return binaryToDocumentId(id);\n // url\n if (isValidAutomergeUrl(id))\n return parseAutomergeUrl(id).documentId;\n // base58check\n if (isValidDocumentId(id))\n return id;\n // legacy UUID\n if (isValidUuid(id)) {\n log.warn(\"Future versions will not support UUIDs as document IDs; use Automerge URLs instead.\");\n const binaryDocumentID = Uuid.parse(id);\n return binaryToDocumentId(binaryDocumentID);\n }\n // none of the above\n throw new Error(`Invalid AutomergeUrl: '${id}'`);\n};\n//# sourceMappingURL=AutomergeUrl.js.map","import { AnyDocumentId, DocHandle } from \"@automerge/automerge-repo/slim\"\nimport { PromiseWrapper, wrapPromise } from \"./wrapPromise.js\"\nimport { useRepo } from \"./useRepo.js\"\nimport { useEffect, useRef, useState } from \"react\"\nimport { anyDocumentIdToAutomergeUrl } from \"../../automerge-repo/dist/AutomergeUrl.js\"\n\n// Shared with useDocHandles\nexport const wrapperCache = new Map<\n AnyDocumentId,\n PromiseWrapper<DocHandle<unknown>>\n>()\n// NB: this is a global cache that isn't keyed on the Repo\n// so if your app uses the same documents in two Repos\n// this could cause problems. please let me know if you do.\n\nexport interface UseDocHandleSuspendingParams {\n suspense: true\n}\nexport interface UseDocHandleSynchronousParams {\n suspense: false\n}\n\ntype UseDocHandleParams =\n | UseDocHandleSuspendingParams\n | UseDocHandleSynchronousParams\n\nexport function useDocHandle<T>(\n id: AnyDocumentId,\n params: UseDocHandleSuspendingParams\n): DocHandle<T>\nexport function useDocHandle<T>(\n id: AnyDocumentId | undefined,\n params?: UseDocHandleSynchronousParams\n): DocHandle<T> | undefined\nexport function useDocHandle<T>(\n id: AnyDocumentId | undefined,\n { suspense }: UseDocHandleParams = { suspense: false }\n): DocHandle<T> | undefined {\n const repo = useRepo()\n const controllerRef = useRef<AbortController | undefined>(undefined)\n const [handle, setHandle] = useState<DocHandle<T> | undefined>()\n\n let currentHandle: DocHandle<T> | undefined =\n // make sure the handle matches the id\n id && handle && handle.url === anyDocumentIdToAutomergeUrl(id)\n ? handle\n : undefined\n\n if (id && !currentHandle) {\n // if we haven't saved a handle yet, check if one is immediately available\n const progress = repo.findWithProgress<T>(id)\n const state = progress.peek()\n if (state.state === \"ready\") {\n currentHandle = state.handle\n }\n }\n\n let wrapper = id ? wrapperCache.get(id) : undefined\n if (!wrapper && id) {\n controllerRef.current?.abort()\n controllerRef.current = new AbortController()\n\n const promise = repo.find<T>(id, { signal: controllerRef.current.signal })\n wrapper = wrapPromise(promise)\n wrapperCache.set(id, wrapper)\n }\n\n /* From here we split into two paths: suspense and not.\n * In the suspense path, we return the wrapper directly.\n * In the non-suspense path, we wait for the promise to resolve\n * and then set the handle via setState. Suspense relies on\n * re-running this function until it succeeds, whereas the synchronous\n * form uses a setState to track the value. */\n useEffect(() => {\n if (currentHandle || suspense || !wrapper) {\n return\n }\n // Stays true until this effect run is torn down (unmount or id change); a\n // result that arrives after that must not setState for a stale id.\n let active = true\n wrapper.promise\n .then(handle => {\n if (active) setHandle(handle as DocHandle<T>)\n })\n .catch(() => {\n // Drop the failed wrapper so a later render retries instead of reusing\n // the rejection.\n if (id && wrapperCache.get(id) === wrapper) {\n wrapperCache.delete(id)\n }\n if (active) setHandle(undefined)\n })\n return () => {\n active = false\n }\n }, [currentHandle, suspense, wrapper, id])\n\n if (currentHandle || !suspense || !wrapper) {\n return currentHandle\n }\n\n return wrapper.read() as DocHandle<T>\n}\n","import { AnyDocumentId } from \"@automerge/automerge-repo/slim\"\nimport { ChangeFn, ChangeOptions, Doc } from \"@automerge/automerge/slim\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useDocHandle } from \"./useDocHandle.js\"\n\n/**\n * A hook which returns a document and a function to change it.\n * Uses React Suspense for loading states, returning a tuple matching useState pattern.\n *\n * @example\n * ```tsx\n * function Counter() {\n * const [doc, changeDoc] = useDocument<{ count: number }>(docUrl)\n * return (\n * <button onClick={() => changeDoc(d => d.count++)}>\n * Count: {doc.count}\n * </button>\n * )\n * }\n *\n * // Must be wrapped in Suspense boundary\n * <Suspense fallback={<Loading />}>\n * <Counter />\n * </Suspense>\n * ```\n */\n\nexport interface UseDocumentSuspendingParams {\n suspense: true\n}\nexport interface UseDocumentSynchronousParams {\n suspense: false\n}\n\ntype UseDocumentParams =\n | UseDocumentSuspendingParams\n | UseDocumentSynchronousParams\n\nexport type UseDocumentReturn<T> = [\n Doc<T>,\n (changeFn: ChangeFn<T>, options?: ChangeOptions<T>) => void,\n]\n\nexport function useDocument<T>(\n id: AnyDocumentId,\n params: UseDocumentSuspendingParams\n): UseDocumentReturn<T>\nexport function useDocument<T>(\n id: AnyDocumentId | undefined,\n params?: UseDocumentSynchronousParams\n): UseDocumentReturn<T> | [undefined, () => void]\nexport function useDocument<T>(\n id: AnyDocumentId | undefined,\n params: UseDocumentParams = { suspense: false }\n): UseDocumentReturn<T> | [undefined, () => void] {\n // @ts-expect-error -- typescript doesn't realize we're discriminating these types the same way in both functions\n const handle = useDocHandle<T>(id, params)\n // Initialize with current doc state\n const [doc, setDoc] = useState<Doc<T> | undefined>(() => handle?.doc())\n const [deleteError, setDeleteError] = useState<Error>()\n\n // Reinitialize doc when handle changes\n useEffect(() => {\n setDoc(handle?.doc())\n }, [handle])\n\n useEffect(() => {\n if (!handle) {\n return\n }\n const onChange = () => setDoc(handle.doc())\n const onDelete = () => {\n setDeleteError(new Error(`Document ${id} was deleted`))\n }\n\n handle.on(\"change\", onChange)\n handle.on(\"delete\", onDelete)\n\n return () => {\n handle.removeListener(\"change\", onChange)\n handle.removeListener(\"delete\", onDelete)\n }\n }, [handle, id])\n\n const changeDoc = useCallback(\n (changeFn: ChangeFn<T>, options?: ChangeOptions<T>) => {\n handle!.change(changeFn, options)\n },\n [handle]\n )\n\n if (deleteError) {\n throw deleteError\n }\n\n if (!doc) {\n return [undefined, () => {}]\n }\n return [doc, changeDoc]\n}\n","import { useEffect, useState } from \"react\"\n\nexport function useSet<T>(items: T[]): Set<T> {\n const [set, setSet] = useState<Set<T>>(() => {\n return new Set<T>(items)\n })\n useEffect(() => {\n const newSet = new Set(items)\n if (identical(set, newSet)) {\n return\n }\n setSet(newSet)\n }, [set, items])\n return set\n}\n\nfunction identical<T>(s1: Set<T>, s2: Set<T>) {\n return s1.size === s2.size && Array.from(s1).every(v => s2.has(v))\n}\n","import { AutomergeUrl, DocHandle } from \"@automerge/automerge-repo/slim\"\nimport { useState, useEffect } from \"react\"\nimport { useRepo } from \"./useRepo.js\"\nimport { PromiseWrapper, wrapPromise } from \"./wrapPromise.js\"\nimport { wrapperCache } from \"./useDocHandle.js\"\nimport { useSet } from \"./helpers/useSet.js\"\n\nexport interface UseDocHandlesParams {\n suspense?: boolean\n}\n\nexport type DocHandleMap<T> = Map<AutomergeUrl, DocHandle<T> | undefined>\n\nexport function useDocHandles<T>(\n ids: AutomergeUrl[],\n { suspense = false }: UseDocHandlesParams = {}\n): DocHandleMap<T> {\n const idSet = useSet(ids)\n const repo = useRepo()\n const [handleMap, setHandleMap] = useState<DocHandleMap<T>>(() => {\n const map = new Map()\n\n // Initialize the map with any handles that are ready\n for (const id of idSet.values()) {\n let progress\n try {\n progress = repo.findWithProgress<T>(id)\n } catch (e) {\n continue\n }\n\n const state = progress.peek()\n if (state.state === \"ready\") {\n map.set(id, state.handle)\n }\n }\n\n return map\n })\n\n const pendingPromises: PromiseWrapper<DocHandle<T>>[] = []\n const nextHandleMap = new Map<AutomergeUrl, DocHandle<T> | undefined>()\n\n // Check if we need any new wrappers\n for (const id of idSet.values()) {\n let handle = handleMap.get(id)\n let wrapper = wrapperCache.get(id)\n if (!wrapper) {\n try {\n const promise = repo.find<T>(id)\n wrapper = wrapPromise(promise)\n wrapperCache.set(id, wrapper)\n } catch (e) {\n continue\n }\n }\n\n // Try to read each wrapper.\n // Update handleMap with any available handles,\n // and collect any pending promises\n try {\n handle ??= wrapper.read() as DocHandle<T>\n nextHandleMap.set(id, handle)\n } catch (e) {\n if (e instanceof Promise) {\n pendingPromises.push(wrapper as PromiseWrapper<DocHandle<T>>)\n } else {\n nextHandleMap.set(id, undefined)\n }\n }\n }\n\n // Suspense is handled quasi-synchronously below by throwing if we still have\n // unresolved promises.\n useEffect(() => {\n // Stays true until this effect run is torn down; if idSet changes (or we\n // unmount) before these finds settle, the now-stale map must not overwrite\n // a newer one.\n let active = true\n if (pendingPromises.length > 0) {\n void Promise.allSettled(pendingPromises.map(p => p.promise)).then(\n handles => {\n if (!active) return\n handles.forEach(r => {\n if (r.status === \"fulfilled\") {\n const h = r.value as DocHandle<T>\n nextHandleMap.set(h.url, h)\n }\n })\n setHandleMap(nextHandleMap)\n }\n )\n } else {\n setHandleMap(nextHandleMap)\n }\n return () => {\n active = false\n }\n }, [suspense, idSet])\n\n // If any promises are pending, suspend with Promise.all\n // Note that this behaviour is different from the synchronous\n // form where we get gradual load-in of child documents.\n // I couldn't find an obvious way of incremental loading with\n // a single hook for suspense.\n // (But maybe with suspense this hook is less useful?)\n if (suspense && pendingPromises.length > 0) {\n throw Promise.all(pendingPromises.map(p => p.promise))\n }\n\n return handleMap\n}\n","import { AutomergeUrl } from \"@automerge/automerge-repo/slim\"\nimport { ChangeFn, ChangeOptions, Doc } from \"@automerge/automerge/slim\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useDocHandles } from \"./useDocHandles.js\"\n\nexport type DocMap<T> = Map<AutomergeUrl, Doc<T>>\nexport type ChangeDocFn<T> = (\n id: AutomergeUrl,\n changeFn: ChangeFn<T>,\n options?: ChangeOptions<T>\n) => void\n\nexport interface UseDocumentsOptions {\n suspense?: boolean\n}\n\nexport function useDocuments<T>(\n ids: AutomergeUrl[],\n { suspense = true }: UseDocumentsOptions = {}\n): [DocMap<T>, ChangeDocFn<T>] {\n const handleMap = useDocHandles<T>(ids, { suspense })\n const [docMap, setDocMap] = useState<DocMap<T>>(() => {\n const docs: DocMap<T> = new Map()\n handleMap.forEach(handle => {\n const url = handle?.url\n if (url) {\n docs.set(url, handle?.doc() as Doc<T>)\n }\n })\n return docs\n })\n\n useEffect(() => {\n const listeners = new Map<AutomergeUrl, () => void>()\n\n handleMap.forEach((handle, id) => {\n if (handle) {\n const onChange = () => {\n setDocMap(prev => {\n const next = new Map(prev)\n next.set(id, handle.doc() as Doc<T>)\n return next\n })\n }\n\n // Initial state\n setDocMap(prev => {\n const next = new Map(prev)\n next.set(id, handle.doc() as Doc<T>)\n return next\n })\n\n handle.on(\"change\", onChange)\n listeners.set(id, onChange)\n }\n })\n\n // Clear docs that are no longer in handleMap\n setDocMap(prev => {\n const next = new Map(prev)\n for (const [id] of next) {\n if (!handleMap.has(id)) {\n next.delete(id)\n }\n }\n return next\n })\n\n return () => {\n handleMap.forEach((handle, id) => {\n const listener = listeners.get(id)\n if (handle && listener) {\n handle.removeListener(\"change\", listener)\n }\n })\n }\n }, [handleMap])\n\n const changeDoc = useCallback(\n (id: AutomergeUrl, changeFn: ChangeFn<T>, options?: ChangeOptions<T>) => {\n const handle = handleMap.get(id)\n if (handle) {\n handle.change(changeFn, options)\n }\n },\n [handleMap]\n )\n\n return [docMap, changeDoc]\n}\n","import {\n type Dispatch,\n type MutableRefObject,\n type SetStateAction,\n useCallback,\n useRef,\n useState,\n} from \"react\"\n\n/**\n * Like `useState`, but also returns a ref whose `.current` is updated\n * synchronously inside the setter — so callbacks can read the latest value\n * without waiting for a re-render.\n *\n * @privateRemarks\n * Not idiomatic — a stale-closure workaround, inlined (ESM) to replace the\n * CommonJS `react-usestateref` dependency, which does not bundle cleanly for\n * ESM/browser consumers. Used only by the two `@deprecated` awareness hooks\n * (`useLocalAwareness`/`useRemoteAwareness`); the replacement `usePresence` hook\n * does not use it. Prefer eliminating it: rewrite those hooks to use functional\n * state updaters for read-modify-write updates, and a plain ref synced in an\n * effect (or `useEffectEvent`) for reads inside long-lived callbacks — then\n * delete this helper.\n */\nexport function useStateRef<S>(\n initialState: S | (() => S)\n): [S, Dispatch<SetStateAction<S>>, MutableRefObject<S>] {\n const [state, setState] = useState(initialState)\n const ref = useRef(state)\n const dispatch = useCallback<Dispatch<SetStateAction<S>>>(setStateAction => {\n ref.current =\n typeof setStateAction === \"function\"\n ? (setStateAction as (prev: S) => S)(ref.current)\n : setStateAction\n setState(ref.current)\n }, [])\n return [state, dispatch, ref]\n}\n\nexport default useStateRef\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","import {\n DocHandle,\n DocHandleEphemeralMessagePayload,\n} from \"@automerge/automerge-repo/slim\"\nimport { useEffect } from \"react\"\nimport useStateRef from \"./useStateRef.js\"\nimport { EventEmitter } from \"eventemitter3\"\n\n// Emits new_peer event when a new peer is seen\nexport const peerEvents = new EventEmitter()\n\nexport interface UseRemoteAwarenessProps<T> {\n /** The handle to receive ephemeral state on */\n handle?: DocHandle<T>\n /** Our user ID */\n localUserId?: string\n /** How long to wait (in ms) before marking a peer as offline */\n offlineTimeout?: number\n /** Function to provide current epoch time */\n getTime?: () => number\n}\n\n/** A map from peer ID to their state */\nexport type PeerStates = Record<string, any>\n/** A map from peer ID to their last heartbeat timestamp */\nexport type Heartbeats = Record<string, number>\n\n/**\n * @deprecated use the usePresence hook instead\n *\n * This hook returns read-only state for remote clients.\n * It also returns their heartbeat status.\n * It is intended to be used alongside useLocalAwareness.\n *\n * @returns [ peerStates: { [userId]: state, ... }, { [userId]: heartbeatEpochTime, ...} ]\n */\nexport const useRemoteAwareness = <T>({\n handle,\n localUserId,\n offlineTimeout = 30000,\n getTime = () => new Date().getTime(),\n}: UseRemoteAwarenessProps<T>): [PeerStates, Heartbeats] => {\n // TODO: You should be able to use multiple instances of this hook on the same handle (write test)\n // TODO: This should support some kind of caching or memoization when switching between channelIDs\n const [peerStates, setPeerStates, peerStatesRef] = useStateRef<PeerStates>({})\n const [heartbeats, setHeartbeats, heartbeatsRef] = useStateRef<Heartbeats>({})\n useEffect(() => {\n if (!handle) {\n return\n }\n\n // Receive incoming message\n const handleIncomingUpdate = (\n event: DocHandleEphemeralMessagePayload<T>\n ) => {\n const [userId, state] = event.message as [string, unknown]\n if (userId === localUserId) return\n if (!heartbeatsRef.current[userId]) peerEvents.emit(\"new_peer\", event) // Let useLocalAwareness know we've seen a new peer\n setPeerStates({\n ...peerStatesRef.current,\n [userId]: state,\n })\n setHeartbeats({\n ...heartbeatsRef.current,\n [userId]: getTime(),\n })\n }\n // Remove peers we haven't seen recently\n const pruneOfflinePeers = () => {\n const peerStates = { ...peerStatesRef.current }\n const heartbeats = { ...heartbeatsRef.current }\n const time = getTime()\n let hasChanges = false\n for (const key in heartbeats) {\n if (time - heartbeats[key] > offlineTimeout) {\n delete peerStates[key]\n delete heartbeats[key]\n hasChanges = true\n }\n }\n if (hasChanges) {\n setPeerStates(peerStates)\n setHeartbeats(heartbeats)\n }\n }\n handle.on(\"ephemeral-message\", handleIncomingUpdate)\n // Check for offline peers every `offlineTimeout` ms\n const pruneOfflinePeersIntervalId = setInterval(\n pruneOfflinePeers,\n offlineTimeout\n )\n return () => {\n handle.removeListener(\"ephemeral-message\", handleIncomingUpdate)\n clearInterval(pruneOfflinePeersIntervalId)\n }\n }, [handle, localUserId, offlineTimeout, getTime])\n\n return [peerStates, heartbeats]\n}\n","import { useEffect } from \"react\"\nimport useStateRef from \"./useStateRef.js\"\nimport { peerEvents } from \"./useRemoteAwareness.js\"\nimport { DocHandle } from \"@automerge/automerge-repo/slim\"\n\nexport interface UseLocalAwarenessProps {\n /** The document handle to send ephemeral state on */\n handle?: DocHandle<unknown>\n /** Our user ID **/\n userId: string\n /** The initial state object/primitive we should advertise */\n initialState: any\n /** How frequently to send heartbeats */\n heartbeatTime?: number\n}\n/**\n * @deprecated use the usePresence hook instead\n *\n * This hook maintains state for the local client.\n * Like React.useState, it returns a [state, setState] array.\n * It is intended to be used alongside useRemoteAwareness.\n *\n * When state is changed it is broadcast to all clients.\n * It also broadcasts a heartbeat to let other clients know it is online.\n *\n * Note that userIds aren't secure (yet). Any client can lie about theirs.\n *\n * @returns [state, setState]\n */\nexport const useLocalAwareness = ({\n handle,\n userId,\n initialState,\n heartbeatTime = 15000,\n}: UseLocalAwarenessProps) => {\n const [localState, setLocalState, localStateRef] = useStateRef(initialState)\n\n const setState = (stateOrUpdater: any) => {\n const state =\n typeof stateOrUpdater === \"function\"\n ? stateOrUpdater(localStateRef.current)\n : stateOrUpdater\n setLocalState(state)\n // TODO: Send deltas instead of entire state\n if (handle) {\n handle.broadcast([userId, state])\n }\n }\n\n useEffect(() => {\n // Don't broadcast if userId or handle isn't set: this avoids bogus broadcasts\n // during the loading of a userId document or handle.\n if (!userId || !handle) {\n return\n }\n\n // Send periodic heartbeats\n const heartbeat = () =>\n void handle.broadcast([userId, localStateRef.current])\n heartbeat() // Initial heartbeat\n // TODO: we don't need to send a heartbeat if we've changed state recently; use recursive setTimeout instead of setInterval\n const heartbeatIntervalId = setInterval(heartbeat, heartbeatTime)\n return () => void clearInterval(heartbeatIntervalId)\n }, [handle, userId, heartbeatTime])\n\n useEffect(() => {\n // Send entire state to new peers\n if (!handle || !userId) {\n return\n }\n\n let broadcastTimeoutId: ReturnType<typeof setTimeout>\n const newPeerEvents = peerEvents.on(\"new_peer\", () => {\n broadcastTimeoutId = setTimeout(\n () => handle.broadcast([userId, localStateRef.current]),\n 500 // Wait for the peer to be ready\n )\n })\n return () => {\n newPeerEvents.off(\"new_peer\")\n broadcastTimeoutId && clearTimeout(broadcastTimeoutId)\n }\n }, [handle, userId, peerEvents])\n\n // TODO: Send an \"offline\" message on unmount\n // useEffect(\n // () => () => void handle.broadcast(null), // Same as Yjs awareness\n // []\n // );\n\n return [localState, setState]\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport {\n Presence,\n PresenceConfig,\n DocHandle,\n PeerStateView,\n PresenceState,\n} from \"@automerge/automerge-repo/slim\"\n\nexport type UsePresenceConfig<State extends PresenceState> =\n PresenceConfig<State> & {\n handle: DocHandle<unknown>\n }\n\nexport type UsePresenceResult<State extends PresenceState> = {\n /**\n * Presence view of our peers.\n */\n peerStates: PeerStateView<State>\n /**\n * Our own presence state, as last set by `update` or the initial value.\n */\n localState: State | undefined\n /**\n * Update our presence state for the given channel and broadcast\n * it to our peers.\n *\n * @param channel\n * @param value\n */\n update: <Channel extends keyof State>(\n channel: Channel,\n value: State[Channel]\n ) => void\n /**\n * Resume presence broadcasting and listening to peer presence.\n *\n * Note that this only needs to be called after `stop` has been called:\n * usePresence starts running immediately.\n */\n start: (config?: Partial<PresenceConfig<State>>) => void\n /**\n * Stop broadcasting presence state and listening to peer presence.\n */\n stop: () => void\n}\n\n/**\n * This hook encapsulates ephemeral state communication for a specific doc\n * handle. It tracks caller-provided local state and broadcasts that state to\n * all peers. It sends periodic heartbeats when there are no state updates.\n *\n * It also tracks ephemeral state broadcast by peers and forces a re-render when\n * the state of a peer changes.\n *\n * It cleans up (stops sending heartbeats and processing ephemeral messages)\n * when it unmounts.\n *\n * It is implemented using {@link Presence}.\n *\n * @param config - see {@link UsePresenceConfig}. Note that initialState only\n * determines the initial value. Updates to this param will not trigger a\n * re-render of the hook.\n *\n * @returns see {@link UsePresenceResult}\n */\nexport function usePresence<State extends PresenceState>({\n handle,\n initialState,\n heartbeatMs,\n peerTtlMs,\n}: UsePresenceConfig<State>): UsePresenceResult<State> {\n const [localState, setLocalState] = useState<State>(initialState)\n const [peerStates, setPeerStates] = useState(new PeerStateView<State>({}))\n // Don't re-render based on changes to these: they are not expected to\n // change but may be passed in as object literals\n const firstOpts = useRef({\n heartbeatMs,\n peerTtlMs,\n })\n const firstInitialState = useRef(initialState)\n const [presence] = useState(() => new Presence<State>({ handle }))\n\n useEffect(() => {\n presence.start({\n initialState: firstInitialState.current,\n ...firstOpts.current,\n })\n presence.on(\"heartbeat\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"snapshot\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"update\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"goodbye\", () => setPeerStates(presence.getPeerStates()))\n presence.on(\"pruning\", () => setPeerStates(presence.getPeerStates()))\n\n return () => {\n presence.stop()\n }\n }, [presence, firstInitialState, firstOpts])\n\n const start = useCallback(\n (config?: Partial<PresenceConfig<State>>) => {\n // Fall back to the last state if not provided when restarting\n const initialState = config?.initialState ?? presence.getLocalState()\n const opts = {\n ...firstOpts.current,\n ...config,\n initialState,\n }\n presence.start(opts)\n },\n [presence, firstOpts]\n )\n const stop = useCallback(() => {\n presence.stop()\n }, [presence])\n\n const update = useCallback(\n <Channel extends keyof State>(channel: Channel, msg: State[Channel]) => {\n presence.broadcast(channel, msg)\n const updated = presence.getLocalState()\n setLocalState(updated)\n },\n [presence]\n )\n\n return {\n peerStates,\n localState,\n update,\n start,\n stop,\n }\n}\n"],"x_google_ignoreList":[2,3,4,5,6,7,8,9,10,11,12,16,17,18,27,28],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDocHandles.d.ts","sourceRoot":"","sources":["../src/useDocHandles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAOxE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;AAEzE,wBAAgB,aAAa,CAAC,CAAC,EAC7B,GAAG,EAAE,YAAY,EAAE,EACnB,EAAE,QAAgB,EAAE,GAAE,mBAAwB,GAC7C,YAAY,CAAC,CAAC,CAAC,CAuFjB"}
1
+ {"version":3,"file":"useDocHandles.d.ts","sourceRoot":"","sources":["../src/useDocHandles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAOxE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;AAEzE,wBAAgB,aAAa,CAAC,CAAC,EAC7B,GAAG,EAAE,YAAY,EAAE,EACnB,EAAE,QAAgB,EAAE,GAAE,mBAAwB,GAC7C,YAAY,CAAC,CAAC,CAAC,CA+FjB"}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@automerge/automerge-repo-react-hooks",
3
- "version": "2.6.0-alpha.2",
3
+ "version": "2.6.0-alpha.3",
4
4
  "description": "Hooks to access an Automerge Repo from your react app.",
5
- "repository": "https://github.com/automerge/automerge-repo/tree/main/packages/automerge-repo-react-hooks",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/automerge/automerge-repo/tree/main/packages/automerge-repo-react-hooks"
8
+ },
6
9
  "author": "Peter van Hardenberg <pvh@pvh.ca>",
7
10
  "license": "MIT",
8
11
  "type": "module",
@@ -10,20 +13,20 @@
10
13
  "dependencies": {
11
14
  "@automerge/automerge": "^3.2.6",
12
15
  "eventemitter3": "^5.0.4",
13
- "@automerge/automerge-repo": "2.6.0-alpha.2"
16
+ "@automerge/automerge-repo": "2.6.0-alpha.3"
14
17
  },
15
18
  "devDependencies": {
16
19
  "@testing-library/dom": "^10.0.0",
17
20
  "@testing-library/jest-dom": "^6.9.1",
18
21
  "@testing-library/react": "^16.3.0",
19
- "react": "^19.2.6",
20
- "react-dom": "^19.2.6",
22
+ "react": "^19.2.7",
23
+ "react-dom": "^19.2.7",
21
24
  "react-error-boundary": "^6.1.2",
22
25
  "rollup-plugin-visualizer": "^7.0.1",
23
26
  "typescript": "^6.0.3",
24
- "vite": "^8.0.14",
25
- "vite-plugin-dts": "^5.0.1",
26
- "vitest": "^4.1.7"
27
+ "vite": "^8.1.3",
28
+ "vite-plugin-dts": "^5.0.3",
29
+ "vitest": "^4.1.10"
27
30
  },
28
31
  "peerDependencies": {
29
32
  "react": "^18.0.0 || ^19.0.0",
@@ -75,14 +75,25 @@ export function useDocHandle<T>(
75
75
  if (currentHandle || suspense || !wrapper) {
76
76
  return
77
77
  }
78
+ // Stays true until this effect run is torn down (unmount or id change); a
79
+ // result that arrives after that must not setState for a stale id.
80
+ let active = true
78
81
  wrapper.promise
79
82
  .then(handle => {
80
- setHandle(handle as DocHandle<T>)
83
+ if (active) setHandle(handle as DocHandle<T>)
81
84
  })
82
85
  .catch(() => {
83
- setHandle(undefined)
86
+ // Drop the failed wrapper so a later render retries instead of reusing
87
+ // the rejection.
88
+ if (id && wrapperCache.get(id) === wrapper) {
89
+ wrapperCache.delete(id)
90
+ }
91
+ if (active) setHandle(undefined)
84
92
  })
85
- }, [currentHandle, suspense, wrapper])
93
+ return () => {
94
+ active = false
95
+ }
96
+ }, [currentHandle, suspense, wrapper, id])
86
97
 
87
98
  if (currentHandle || !suspense || !wrapper) {
88
99
  return currentHandle
@@ -73,9 +73,14 @@ export function useDocHandles<T>(
73
73
  // Suspense is handled quasi-synchronously below by throwing if we still have
74
74
  // unresolved promises.
75
75
  useEffect(() => {
76
+ // Stays true until this effect run is torn down; if idSet changes (or we
77
+ // unmount) before these finds settle, the now-stale map must not overwrite
78
+ // a newer one.
79
+ let active = true
76
80
  if (pendingPromises.length > 0) {
77
81
  void Promise.allSettled(pendingPromises.map(p => p.promise)).then(
78
82
  handles => {
83
+ if (!active) return
79
84
  handles.forEach(r => {
80
85
  if (r.status === "fulfilled") {
81
86
  const h = r.value as DocHandle<T>
@@ -88,6 +93,9 @@ export function useDocHandles<T>(
88
93
  } else {
89
94
  setHandleMap(nextHandleMap)
90
95
  }
96
+ return () => {
97
+ active = false
98
+ }
91
99
  }, [suspense, idSet])
92
100
 
93
101
  // If any promises are pending, suspend with Promise.all